LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqCioqICAgSVRVLVQgRy43MjIuMSAoMjAwNS0wNSkgLSBGaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiBmb3IgbWFpbiBib2R5IGFuZCBBbm5leCBDCioqICAgPiBTb2Z0d2FyZSBSZWxlYXNlIDIuMSAoMjAwOC0wNikKKiogICAgIChTaW1wbGUgcmVwYWNrYWdpbmc7IG5vIGNoYW5nZSBmcm9tIDIwMDUtMDUgUmVsZWFzZSAyLjAgY29kZSkKKioKKiogICCpIDIwMDQgUG9seWNvbSwgSW5jLgoqKgoqKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCioqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogRmlsZW5hbWU6IGRjdF90eXBlX2l2X3MuYwoqCiogUHVycG9zZTogIERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0sIFR5cGUgSVYgdXNlZCBmb3IgaW52ZXJzZSBNTFQKKgoqIFRoZSBiYXNpcyBmdW5jdGlvbnMgYXJlCioKKgkgY29zKFBJKih0KzAuNSkqKGsrMC41KS9ibG9ja19sZW5ndGgpCioKKiBmb3IgdGltZSB0IGFuZCBiYXNpcyBmdW5jdGlvbiBudW1iZXIgay4gIER1ZSB0byB0aGUgc3ltbWV0cnkgb2YgdGhlIGV4cHJlc3Npb24KKiBpbiB0IGFuZCBrLCBpdCBpcyBjbGVhciB0aGF0IHRoZSBmb3J3YXJkIGFuZCBpbnZlcnNlIHRyYW5zZm9ybXMgYXJlIHRoZSBzYW1lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEluY2x1ZGUgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlICJkZWZzLmgiCiNpbmNsdWRlICJjb3VudC5oIgojaW5jbHVkZSAiZGN0NF9zLmgiCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBFeHRlcm5hbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpleHRlcm4gV29yZDE2ICAgIHN5bl9iaWFzXzdraHpbRENUX0xFTkdUSF07CmV4dGVybiBXb3JkMTYgICAgZGl0aGVyW0RDVF9MRU5HVEhdOwpleHRlcm4gV29yZDE2ICAgIG1heF9kaXRoZXJbTUFYX0RDVF9MRU5HVEhdOwoKZXh0ZXJuIFdvcmQxNiAgICAgICBkY3RfY29yZV9zW0RDVF9MRU5HVEhfRElWXzMyXVtEQ1RfTEVOR1RIX0RJVl8zMl07CmV4dGVybiBjb3NfbXNpbl90CXNfY29zX21zaW5fMltEQ1RfTEVOR1RIX0RJVl8zMl07CmV4dGVybiBjb3NfbXNpbl90CXNfY29zX21zaW5fNFtEQ1RfTEVOR1RIX0RJVl8xNl07CmV4dGVybiBjb3NfbXNpbl90CXNfY29zX21zaW5fOFtEQ1RfTEVOR1RIX0RJVl84XTsKZXh0ZXJuIGNvc19tc2luX3QJc19jb3NfbXNpbl8xNltEQ1RfTEVOR1RIX0RJVl80XTsKZXh0ZXJuIGNvc19tc2luX3QJc19jb3NfbXNpbl8zMltEQ1RfTEVOR1RIX0RJVl8yXTsKZXh0ZXJuIGNvc19tc2luX3QJc19jb3NfbXNpbl82NFtEQ1RfTEVOR1RIXTsKZXh0ZXJuIGNvc19tc2luX3QJKnNfY29zX21zaW5fdGFibGVbXTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb246ICAgIGRjdF90eXBlX2l2X3MKCiBTeW50YXg6ICAgICAgdm9pZCBkY3RfdHlwZV9pdl9zIChXb3JkMTYgKmlucHV0LFdvcmQxNiAqb3V0cHV0LFdvcmQxNiBkY3RfbGVuZ3RoKQogICAgICAgICAgICAgIAoKIERlc2NyaXB0aW9uOiBEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtLCBUeXBlIElWIHVzZWQgZm9yIGludmVyc2UgTUxUCgogRGVzaWduIE5vdGVzOgogCiBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgIDEuNzQgICAgIHwgICAgIDEuNzQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCiAgICAgICAgICAgIE1BWCAgfCAgICAgMS43NCAgICAgfCAgICAgMS43NAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAoJCQkJCiAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQgICAgICB8ICAgICA0OGtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAgMy42MiAgICAgfCAgICAgMy42MiAgICAgICB8ICAgICAgMy42MiAgIAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgTUFYICB8ICAgICAzLjYyICAgICB8ICAgICAzLjYyICAgICAgIHwgICAgICAzLjYyICAgCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp2b2lkIGRjdF90eXBlX2l2X3MgKFdvcmQxNiAqaW5wdXQsV29yZDE2ICpvdXRwdXQsV29yZDE2IGRjdF9sZW5ndGgpCnsKICAgIFdvcmQxNiAgIGJ1ZmZlcl9hW01BWF9EQ1RfTEVOR1RIXSwgYnVmZmVyX2JbTUFYX0RDVF9MRU5HVEhdLCBidWZmZXJfY1tNQVhfRENUX0xFTkdUSF07CiAgICBXb3JkMTYgICAqaW5fcHRyLCAqaW5fcHRyX2xvdywgKmluX3B0cl9oaWdoLCAqbmV4dF9pbl9iYXNlOwogICAgV29yZDE2ICAgKm91dF9wdHJfbG93LCAqb3V0X3B0cl9oaWdoLCAqbmV4dF9vdXRfYmFzZTsKICAgIFdvcmQxNiAgICpvdXRfYnVmZmVyLCAqaW5fYnVmZmVyLCAqYnVmZmVyX3N3YXA7CiAgICBXb3JkMTYgICBpbl92YWxfbG93LCBpbl92YWxfaGlnaDsKICAgIFdvcmQxNiAgIG91dF92YWxfbG93LCBvdXRfdmFsX2hpZ2g7CiAgICBXb3JkMTYgICBpbl9sb3dfZXZlbiwgaW5fbG93X29kZDsKICAgIFdvcmQxNiAgIGluX2hpZ2hfZXZlbiwgaW5faGlnaF9vZGQ7CiAgICBXb3JkMTYgICBvdXRfbG93X2V2ZW4sIG91dF9sb3dfb2RkOwogICAgV29yZDE2ICAgb3V0X2hpZ2hfZXZlbiwgb3V0X2hpZ2hfb2RkOwogICAgV29yZDE2ICAgKnBhaXJfcHRyOwogICAgV29yZDE2ICAgY29zX2V2ZW4sIGNvc19vZGQsIG1zaW5fZXZlbiwgbXNpbl9vZGQ7CiAgICBXb3JkMTYgICBzZXRfc3Bhbiwgc2V0X2NvdW50LCBzZXRfY291bnRfbG9nLCBwYWlyc19sZWZ0LCBzZXRzX2xlZnQ7CiAgICBXb3JkMTYgICBpLGs7CiAgICBXb3JkMTYgICBpbmRleDsKICAgIFdvcmQxNiAgIGR1bW15OwogICAgV29yZDMyIAkgc3VtOwogICAgY29zX21zaW5fdAkqKnRhYmxlX3B0cl9wdHIsICpjb3NfbXNpbl9wdHI7CgogICAgV29yZDMyIGFjY2E7CiAgICBXb3JkMTYgdGVtcDsKCiAgICBXb3JkMTYgICBkY3RfbGVuZ3RoX2xvZzsKICAgIFdvcmQxNiAgICpkaXRoZXJfcHRyOwogICAgCiAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCiAgICAvKiBEbyB0aGUgc3VtL2RpZmZlcmVuY2UgYnV0dGVyZmxpZXMsIHRoZSBmaXJzdCBwYXJ0IG9mICovCiAgICAvKiBjb252ZXJ0aW5nIG9uZSBOLXBvaW50IHRyYW5zZm9ybSBpbnRvIDMyIC0gMTAgcG9pbnQgdHJhbnNmb3JtcyAgKi8KICAgIC8qIHRyYW5zZm9ybXMsIHdoZXJlIE4gPSAxIDw8IERDVF9MRU5HVEhfTE9HLiAgICAgICAgICAgKi8KICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KICAgIHRlc3QoKTsKICAgIGlmIChkY3RfbGVuZ3RoPT1EQ1RfTEVOR1RIKQogICAgewogICAgICAgIGRjdF9sZW5ndGhfbG9nID0gRENUX0xFTkdUSF9MT0c7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgZGl0aGVyX3B0ciA9IGRpdGhlcjsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBkY3RfbGVuZ3RoX2xvZyA9IE1BWF9EQ1RfTEVOR1RIX0xPRzsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICBkaXRoZXJfcHRyID0gbWF4X2RpdGhlcjsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KICAgIAogICAgaW5fYnVmZmVyICA9IGlucHV0OwogICAgbW92ZTE2KCk7CiAgICBvdXRfYnVmZmVyID0gYnVmZmVyX2E7CiAgICBtb3ZlMTYoKTsKICAgIAogICAgaW5kZXg9MDsKICAgIG1vdmUxNigpOwogICAgCiAgICBpPTA7CiAgICBtb3ZlMTYoKTsKCiAgICBmb3IgKHNldF9jb3VudF9sb2cgPSAwOyAgICBzZXRfY291bnRfbG9nIDw9IGRjdF9sZW5ndGhfbG9nIC0gMjsgICAgc2V0X2NvdW50X2xvZysrKSAKICAgIHsKCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgLyogSW5pdGlhbGl6YXRpb24gZm9yIHRoZSBsb29wIG92ZXIgc2V0cyBhdCB0aGUgY3VycmVudCBzaXplICovCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgCiAgICAgICAgLyogICAgc2V0X3NwYW4gICAgICA9IDEgPDwgKERDVF9MRU5HVEhfTE9HIC0gc2V0X2NvdW50X2xvZyk7ICovCiAgICAgICAgc2V0X3NwYW4gPSBzaHIoZGN0X2xlbmd0aCxzZXRfY291bnRfbG9nKTsKICAgICAgICAgICAKICAgICAgICBzZXRfY291bnQgICAgID0gc2hsKDEsc2V0X2NvdW50X2xvZyk7CiAgICAgICAgaW5fcHRyICAgICAgICA9IGluX2J1ZmZlcjsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICBuZXh0X291dF9iYXNlID0gb3V0X2J1ZmZlcjsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAKICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgICAgIC8qIExvb3Agb3ZlciBhbGwgdGhlIHNldHMgb2YgdGhpcyBzaXplICovCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgICAgICB0ZW1wID0gc3ViKGluZGV4LDEpOwogICAgICAgIHRlc3QoKTsKICAgICAgICBpZih0ZW1wIDwgMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAoc2V0c19sZWZ0ID0gc2V0X2NvdW50O3NldHNfbGVmdCA+IDA7c2V0c19sZWZ0LS0pIAogICAgICAgICAgICB7CiAgICAKICAgICAgICAgICAgICAgIC8qfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwqLwogICAgICAgICAgICAgICAgLyogU2V0IHVwIG91dHB1dCBwb2ludGVycyBmb3IgdGhlIGN1cnJlbnQgc2V0ICovCiAgICAgICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8Ki8KICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgYXJpdGhtZXRpYyAqLwogICAgICAgICAgICAgICAgb3V0X3B0cl9sb3cgICAgPSBuZXh0X291dF9iYXNlOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICBuZXh0X291dF9iYXNlICs9IHNldF9zcGFuOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICBvdXRfcHRyX2hpZ2ggICA9IG5leHRfb3V0X2Jhc2U7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKCiAgICAgICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8Ki8KICAgICAgICAgICAgICAgIC8qIExvb3Agb3ZlciBhbGwgdGhlIGJ1dHRlcmZsaWVzIGluIHRoZSBjdXJyZW50IHNldCAqLwogICAgICAgICAgICAgICAgLyp8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBkbyAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbl92YWxfbG93ICAgICAgPSAqaW5fcHRyKys7CiAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICAgICAgaW5fdmFsX2hpZ2ggICAgID0gKmluX3B0cisrOwogICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOwoKICAgICAgICAgICAgICAgICAgICAvKiBCRVNUIE1FVEhPRCBPRiBHRVRUSU5HIFJJRCBPRiBCSUFTLCBCVVQgQ09NUFVUQVRJT05BTExZIFVOUExFQVNBTlQgKi8KICAgICAgICAgICAgICAgICAgICAvKiBBTFRFUk5BVElWRSBNRVRIT0QsIFNNRUFSUyBCSUFTIE9WRVIgVEhFIEVOVElSRSBGUkFNRSwgQ09NUFVUQVRJT05BTExZIFNJTVBMRVNULiAqLwogICAgICAgICAgICAgICAgICAgIC8qIElGIFRISVMgV09SS1MsIElUJ1MgUFJFRkVSQUJMRSAqLwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBkdW1teSA9IGFkZChpbl92YWxfbG93LGRpdGhlcl9wdHJbaSsrXSk7CiAgICAgICAgICAgICAgICAgICAgYWNjYSA9IExfYWRkKGR1bW15LGluX3ZhbF9oaWdoKTsKICAgICAgICAgICAgICAgICAgICBvdXRfdmFsX2xvdyA9IGV4dHJhY3RfbChMX3NocihhY2NhLDEpKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBkdW1teSA9IGFkZChpbl92YWxfbG93LGRpdGhlcl9wdHJbaSsrXSk7CiAgICAgICAgICAgICAgICAgICAgYWNjYSA9IExfYWRkKGR1bW15LC1pbl92YWxfaGlnaCk7CiAgICAgICAgICAgICAgICAgICAgb3V0X3ZhbF9oaWdoID0gZXh0cmFjdF9sKExfc2hyKGFjY2EsMSkpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICpvdXRfcHRyX2xvdysrICA9IG91dF92YWxfbG93OwogICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgICAgICotLW91dF9wdHJfaGlnaCA9IG91dF92YWxfaGlnaDsKICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKCiAgICAgICAgICAgICAgICAgICAgdGVzdCgpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgaW52b2x2ZXMgY29tcGFyaXNvbiBvZiBwb2ludGVycyAqLwogICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgYXJpdGhtZXRpYyAqLwoKICAgICAgICAgICAgICAgIH0gd2hpbGUgKG91dF9wdHJfbG93IDwgb3V0X3B0cl9oaWdoKTsKICAgIAogICAgICAgICAgICB9IC8qIEVuZCBvZiBsb29wIG92ZXIgc2V0cyBvZiB0aGUgY3VycmVudCBzaXplICovCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGZvciAoc2V0c19sZWZ0ID0gc2V0X2NvdW50OyAgICBzZXRzX2xlZnQgPiAwOyAgICBzZXRzX2xlZnQtLSkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwqLwogICAgICAgICAgICAgICAgLyogU2V0IHVwIG91dHB1dCBwb2ludGVycyBmb3IgdGhlIGN1cnJlbnQgc2V0ICovCiAgICAgICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8Ki8KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgb3V0X3B0cl9sb3cgICAgPSBuZXh0X291dF9iYXNlOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICBuZXh0X291dF9iYXNlICs9IHNldF9zcGFuOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICBvdXRfcHRyX2hpZ2ggICA9IG5leHRfb3V0X2Jhc2U7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKCiAgICAgICAgICAgIAkvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8Ki8KICAgICAgICAgICAgCS8qIExvb3Agb3ZlciBhbGwgdGhlIGJ1dHRlcmZsaWVzIGluIHRoZSBjdXJyZW50IHNldCAqLwogICAgICAgICAgICAJLyp8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGRvIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGluX3ZhbF9sb3cgICAgICA9ICppbl9wdHIrKzsKICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgICAgICBpbl92YWxfaGlnaCAgICAgPSAqaW5fcHRyKys7CiAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CgogICAgICAgICAgICAgICAgICAgIG91dF92YWxfbG93ICAgICA9IGFkZChpbl92YWxfbG93LGluX3ZhbF9oaWdoKTsKICAgICAgICAgICAgICAgICAgICBvdXRfdmFsX2hpZ2ggICAgPSBhZGQoaW5fdmFsX2xvdyxuZWdhdGUoaW5fdmFsX2hpZ2gpKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAqb3V0X3B0cl9sb3crKyAgPSBvdXRfdmFsX2xvdzsKICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgICAgICAqLS1vdXRfcHRyX2hpZ2ggPSBvdXRfdmFsX2hpZ2g7CiAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CgogICAgICAgICAgICAgICAgICAgIHRlc3QoKTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKG91dF9wdHJfbG93IDwgb3V0X3B0cl9oaWdoKTsKICAgIAogICAgICAgICAgICB9IC8qIEVuZCBvZiBsb29wIG92ZXIgc2V0cyBvZiB0aGUgY3VycmVudCBzaXplICovCiAgICAgICAgfQoKICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgLyogRGVjaWRlIHdoaWNoIGJ1ZmZlcnMgdG8gdXNlIGFzIGlucHV0IGFuZCBvdXRwdXQgbmV4dCB0aW1lLiAqLwogICAgICAgIC8qIEV4Y2VwdCBmb3IgdGhlIGZpcnN0IHRpbWUgKHdoZW4gdGhlIGlucHV0IGJ1ZmZlciBpcyB0aGUgICAgKi8KICAgICAgICAvKiBzdWJyb3V0aW5lIGlucHV0KSB3ZSBqdXN0IGFsdGVybmF0ZSB0aGUgbG9jYWwgYnVmZmVycy4gICAgICovCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgICAgIAogICAgICAgIGluX2J1ZmZlciA9IG91dF9idWZmZXI7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgCiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmIChvdXRfYnVmZmVyID09IGJ1ZmZlcl9hKQogICAgICAgIHsKICAgICAgICAgICAgb3V0X2J1ZmZlciA9IGJ1ZmZlcl9iOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgb3V0X2J1ZmZlciA9IGJ1ZmZlcl9hOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaW5kZXggPSBhZGQoaW5kZXgsMSk7CiAgICB9IC8qIEVuZCBvZiBsb29wIG92ZXIgc2V0IHNpemVzICovCgoKICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwogICAgLyogRG8gMzIgLSAxMCBwb2ludCB0cmFuc2Zvcm1zICovCiAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KICAgIAogICAgcGFpcl9wdHIgPSBpbl9idWZmZXI7CiAgICBtb3ZlMTYoKTsKICAgIGJ1ZmZlcl9zd2FwID0gYnVmZmVyX2M7CiAgICBtb3ZlMTYoKTsKCiAgICBmb3IgKHBhaXJzX2xlZnQgPSAxIDw8IChkY3RfbGVuZ3RoX2xvZyAtIDEpOyAgICBwYWlyc19sZWZ0ID4gMDsgICAgcGFpcnNfbGVmdC0tKSAKICAgIHsKICAgICAgICBmb3IgKCBrPTA7IGs8Q09SRV9TSVpFOyBrKysgKQogICAgICAgIHsKICAgICAgICAgICAgc3VtPTBMOwogICAgICAgICAgICBtb3ZlMzIoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAoIGk9MDsgaTxDT1JFX1NJWkU7IGkrKyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN1bSA9IExfbWFjKHN1bSwgcGFpcl9wdHJbaV0sZGN0X2NvcmVfc1tpXVtrXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnVmZmVyX3N3YXBba10gPSByb3VuZChzdW0pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBwYWlyX3B0ciAgICs9IENPUkVfU0laRTsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICBidWZmZXJfc3dhcCArPSBDT1JFX1NJWkU7CiAgICAgICAgbW92ZTE2KCk7CiAgICB9CiAgICAKICAgIGZvciAoaT0wO2k8ZGN0X2xlbmd0aDtpKyspCiAgICB7CiAgICAgICAgaW5fYnVmZmVyW2ldID0gYnVmZmVyX2NbaV07CiAgICAgICAgbW92ZTE2KCk7CiAgICB9CgogICAgdGFibGVfcHRyX3B0ciA9IHNfY29zX21zaW5fdGFibGU7CiAgICBtb3ZlMTYoKTsKCiAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCiAgICAvKiBQZXJmb3JtIHJvdGF0aW9uIGJ1dHRlcmZsaWVzICovCiAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCiAgICBpbmRleD0wOwogICAgbW92ZTE2KCk7CiAgICAKICAgIGZvciAoc2V0X2NvdW50X2xvZyA9IGRjdF9sZW5ndGhfbG9nIC0gMiA7ICAgIHNldF9jb3VudF9sb2cgPj0gMDsgICAgc2V0X2NvdW50X2xvZy0tKSAKICAgIHsKCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgLyogSW5pdGlhbGl6YXRpb24gZm9yIHRoZSBsb29wIG92ZXIgc2V0cyBhdCB0aGUgY3VycmVudCBzaXplICovCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgCiAgICAgICAgLyogICAgc2V0X3NwYW4gICAgICA9IDEgPDwgKERDVF9MRU5HVEhfTE9HIC0gc2V0X2NvdW50X2xvZyk7ICovCiAgICAgICAgc2V0X3NwYW4gPSBzaHIoZGN0X2xlbmd0aCxzZXRfY291bnRfbG9nKTsKICAgICAgICAKICAgICAgICBzZXRfY291bnQgICAgID0gc2hsKDEsc2V0X2NvdW50X2xvZyk7CiAgICAgICAgbmV4dF9pbl9iYXNlICA9IGluX2J1ZmZlcjsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICB0ZXN0KCk7CiAgICAgICAgaWYgKHNldF9jb3VudF9sb2cgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIG5leHRfb3V0X2Jhc2UgPSBvdXRwdXQ7CiAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBuZXh0X291dF9iYXNlID0gb3V0X2J1ZmZlcjsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgLyogTG9vcCBvdmVyIGFsbCB0aGUgc2V0cyBvZiB0aGlzIHNpemUgKi8KICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKICAgICAgICBmb3IgKHNldHNfbGVmdCA9IHNldF9jb3VudDsgICAgc2V0c19sZWZ0ID4gMDsgICAgc2V0c19sZWZ0LS0pIAogICAgICAgIHsKCiAgICAgICAgICAgIC8qfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwqLwogICAgICAgICAgICAvKiBTZXQgdXAgdGhlIHBvaW50ZXJzIGZvciB0aGUgY3VycmVudCBzZXQgKi8KICAgICAgICAgICAgLyp8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCiAgICAgICAgICAgIAogICAgICAgICAgICBpbl9wdHJfbG93ICAgICA9IG5leHRfaW5fYmFzZTsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgIAogICAgICAgICAgICB0ZW1wID0gc2hyKHNldF9zcGFuLDEpOwogICAgICAgICAgICBpbl9wdHJfaGlnaCAgICA9IGluX3B0cl9sb3cgKyB0ZW1wOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIG5leHRfaW5fYmFzZSAgKz0gc2V0X3NwYW47CiAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAKICAgICAgICAgICAgb3V0X3B0cl9sb3cgICAgPSBuZXh0X291dF9iYXNlOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIG5leHRfb3V0X2Jhc2UgKz0gc2V0X3NwYW47CiAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICBvdXRfcHRyX2hpZ2ggICA9IG5leHRfb3V0X2Jhc2U7CiAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAKICAgICAgICAgICAgY29zX21zaW5fcHRyICAgPSAqdGFibGVfcHRyX3B0cjsKICAgICAgICAgICAgbW92ZTE2KCk7CgogICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCiAgICAgICAgICAgIC8qIExvb3Agb3ZlciBhbGwgdGhlIGJ1dHRlcmZseSBwYWlycyBpbiB0aGUgY3VycmVudCBzZXQgKi8KICAgICAgICAgICAgLyp8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwqLwoKCSAgICAgICAgZG8gCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGluX2xvd19ldmVuICAgICA9ICppbl9wdHJfbG93Kys7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgIGluX2xvd19vZGQgICAgICA9ICppbl9wdHJfbG93Kys7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgIGluX2hpZ2hfZXZlbiAgICA9ICppbl9wdHJfaGlnaCsrOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICBpbl9oaWdoX29kZCAgICAgPSAqaW5fcHRyX2hpZ2grKzsKICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgY29zX2V2ZW4gICAgICAgID0gY29zX21zaW5fcHRyWzBdLmNvc2luZTsKICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgbXNpbl9ldmVuICAgICAgID0gY29zX21zaW5fcHRyWzBdLm1pbnVzX3NpbmU7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgIGNvc19vZGQgICAgICAgICA9IGNvc19tc2luX3B0clsxXS5jb3NpbmU7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgIG1zaW5fb2RkICAgICAgICA9IGNvc19tc2luX3B0clsxXS5taW51c19zaW5lOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICBjb3NfbXNpbl9wdHIgICArPSAyOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzdW0gPSAwTDsKICAgICAgICAgICAgICAgIG1vdmUzMigpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzdW0gPSBMX21hYyhzdW0sY29zX2V2ZW4saW5fbG93X2V2ZW4pOwogICAgICAgICAgICAgICAgc3VtID0gTF9tYWMoc3VtLG5lZ2F0ZShtc2luX2V2ZW4pLGluX2hpZ2hfZXZlbik7CiAgICAgICAgICAgICAgICBvdXRfbG93X2V2ZW4gPSByb3VuZChMX3NobChzdW0sMSkpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzdW0gPSAwTDsKICAgICAgICAgICAgICAgIG1vdmUzMigpOwogICAgICAgICAgICAgICAgc3VtID0gTF9tYWMoc3VtLG1zaW5fZXZlbixpbl9sb3dfZXZlbik7CiAgICAgICAgICAgICAgICBzdW0gPSBMX21hYyhzdW0sY29zX2V2ZW4saW5faGlnaF9ldmVuKTsKICAgICAgICAgICAgICAgIG91dF9oaWdoX2V2ZW4gPSByb3VuZChMX3NobChzdW0sMSkpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzdW0gPSAwTDsKICAgICAgICAgICAgICAgIG1vdmUzMigpOwogICAgICAgICAgICAgICAgc3VtID0gTF9tYWMoc3VtLGNvc19vZGQsaW5fbG93X29kZCk7CiAgICAgICAgICAgICAgICBzdW0gPSBMX21hYyhzdW0sbXNpbl9vZGQsaW5faGlnaF9vZGQpOwogICAgICAgICAgICAgICAgb3V0X2xvd19vZGQgPSByb3VuZChMX3NobChzdW0sMSkpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzdW0gPSAwTDsKICAgICAgICAgICAgICAgIG1vdmUzMigpOwogICAgICAgICAgICAgICAgc3VtID0gTF9tYWMoc3VtLG1zaW5fb2RkLGluX2xvd19vZGQpOwogICAgICAgICAgICAgICAgc3VtID0gTF9tYWMoc3VtLG5lZ2F0ZShjb3Nfb2RkKSxpbl9oaWdoX29kZCk7CiAgICAgICAgICAgICAgICBvdXRfaGlnaF9vZGQgPSByb3VuZChMX3NobChzdW0sMSkpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAqb3V0X3B0cl9sb3crKyAgPSBvdXRfbG93X2V2ZW47CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgICotLW91dF9wdHJfaGlnaCA9IG91dF9oaWdoX2V2ZW47CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgICpvdXRfcHRyX2xvdysrICA9IG91dF9sb3dfb2RkOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICAqLS1vdXRfcHRyX2hpZ2ggPSBvdXRfaGlnaF9vZGQ7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgIH0gd2hpbGUgKG91dF9wdHJfbG93IDwgb3V0X3B0cl9oaWdoKTsKCgkgICAgfSAvKiBFbmQgb2YgbG9vcCBvdmVyIHNldHMgb2YgdGhlIGN1cnJlbnQgc2l6ZSAqLwoKICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgLyogU3dhcCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgZm9yIG5leHQgdGltZSAqLwogICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgICAgICAKICAgICAgICBidWZmZXJfc3dhcCA9IGluX2J1ZmZlcjsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICBpbl9idWZmZXIgICA9IG91dF9idWZmZXI7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgb3V0X2J1ZmZlciAgPSBidWZmZXJfc3dhcDsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAKICAgICAgICBpbmRleCA9IGFkZChpbmRleCwxKTsKICAgICAgICB0YWJsZV9wdHJfcHRyKys7CiAgICB9CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAgICAgIEFERCBJTiBCSUFTIEZPUiBPVVRQVVQKICAgICAgICAgCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAoZGN0X2xlbmd0aD09RENUX0xFTkdUSCkKICAgIHsKICAgICAgICBmb3IoaT0wO2k8MzIwO2krKykgCiAgICAgICAgewogICAgICAgICAgIHN1bSA9IExfYWRkKG91dHB1dFtpXSxzeW5fYmlhc183a2h6W2ldKTsKICAgICAgICAgICBhY2NhID0gTF9zdWIoc3VtLDMyNzY3KTsKICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgaWYgKGFjY2EgPiAwKSAKICAgICAgICAgICB7CiAgICAgICAgICAgICAgIHN1bSA9IDMyNzY3TDsKICAgICAgICAgICAgICAgbW92ZTMyKCk7CiAgICAgICAgICAgfQogICAgICAgICAgIGFjY2EgPSBMX2FkZChzdW0sMzI3NjhMKTsKICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgaWYgKGFjY2EgPCAwKSAKICAgICAgICAgICB7CiAgICAgICAgICAgICAgIHN1bSA9IC0zMjc2OEw7CiAgICAgICAgICAgICAgIG1vdmUzMigpOwogICAgICAgICAgIH0KICAgICAgICAgICBvdXRwdXRbaV0gPSBleHRyYWN0X2woc3VtKTsKICAgICAgICB9CiAgICB9Cn0KCg==