Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoQml0bWFwLmgKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCi8vIE1vZGlmaWVkIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgLSBodHRwOi8vcG9wcGxlci5mcmVlZGVza3RvcC5vcmcKLy8KLy8gQWxsIGNoYW5nZXMgbWFkZSB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IHRvIHRoaXMgZmlsZSBhcmUgbGljZW5zZWQKLy8gdW5kZXIgR1BMIHZlcnNpb24gMiBvciBsYXRlcgovLwovLyBDb3B5cmlnaHQgKEMpIDIwMDcgSWxtYXJpIEhlaWtraW5lbiA8aWxtYXJpLmhlaWtraW5lbkBnbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAwOSBTaGVuIExpYW5nIDxzaGVuemh1eGlAZ21haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTIgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAwOSBTdGVmYW4gVGhvbWFzIDx0aG9tYXNAZWxvYWQyNC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMCBBZHJpYW4gSm9obnNvbiA8YWpvaG5zb25AcmVkbmVvbi5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMCBIYXJyeSBSb2JlcnRzIDxoYXJyeS5yb2JlcnRzQG1pZG5pZ2h0LWxhYnMub3JnPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgQ2hyaXN0aWFuIEZldWVyc+RuZ2VyIDxjZmV1ZXJzYWVuZ2VyQGdvb2dsZW1haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgV2lsbGlhbSBCYWRlciA8d2lsbGlhbWJhZGVyQGhvdG1haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhvbWFzIEZyZWl0YWcgPFRob21hcy5GcmVpdGFnQGFsZmEuZGU+Ci8vIENvcHlyaWdodCAoQykgMjAxNSBBZGFtIFJlaWNob2xkIDxhZGFtcmVpY2hvbGRAbXlvcGVyYS5jb20+Ci8vCi8vIFRvIHNlZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGFuZ2VzIHBsZWFzZSBzZWUgdGhlIENoYW5nZWxvZyBmaWxlIHRoYXQKLy8gY2FtZSB3aXRoIHlvdXIgdGFyYmFsbCBvciB0eXBlIG1ha2UgQ2hhbmdlTG9nIGlmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSBnaXQKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpZm5kZWYgU1BMQVNIQklUTUFQX0gKI2RlZmluZSBTUExBU0hCSVRNQVBfSAoKI2lmZGVmIFVTRV9HQ0NfUFJBR01BUwojcHJhZ21hIGludGVyZmFjZQojZW5kaWYKCiNpbmNsdWRlICJTcGxhc2hUeXBlcy5oIgojaW5jbHVkZSAicG9wcGxlci9HZnhTdGF0ZS5oIgojaW5jbHVkZSA8c3RkaW8uaD4KCmNsYXNzIEltZ1dyaXRlcjsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNwbGFzaEJpdG1hcAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY2xhc3MgU3BsYXNoQml0bWFwIHsKcHVibGljOgoKICAvLyBDcmVhdGUgYSBuZXcgYml0bWFwLiAgSXQgd2lsbCBoYXZlIDx3aWR0aEE+IHggPGhlaWdodEE+IHBpeGVscyBpbgogIC8vIGNvbG9yIG1vZGUgPG1vZGVBPi4gIFJvd3Mgd2lsbCBiZSBwYWRkZWQgb3V0IHRvIGEgbXVsdGlwbGUgb2YKICAvLyA8cm93UGFkPiBieXRlcy4gIElmIDx0b3BEb3duPiBpcyBmYWxzZSwgdGhlIGJpdG1hcCB3aWxsIGJlIHN0b3JlZAogIC8vIHVwc2lkZS1kb3duLCBpLmUuLCB3aXRoIHRoZSBsYXN0IHJvdyBmaXJzdCBpbiBtZW1vcnkuCiAgU3BsYXNoQml0bWFwKGludCB3aWR0aEEsIGludCBoZWlnaHRBLCBpbnQgcm93UGFkLAoJICAgICAgIFNwbGFzaENvbG9yTW9kZSBtb2RlQSwgR0Jvb2wgYWxwaGFBLAoJICAgICAgIEdCb29sIHRvcERvd24gPSBnVHJ1ZSwgR29vTGlzdCAqc2VwYXJhdGlvbkxpc3QgPSBOVUxMKTsKICBzdGF0aWMgU3BsYXNoQml0bWFwICpjb3B5KFNwbGFzaEJpdG1hcCAqc3JjKTsKCiAgflNwbGFzaEJpdG1hcCgpOwoKICBpbnQgZ2V0V2lkdGgoKSB7IHJldHVybiB3aWR0aDsgfQogIGludCBnZXRIZWlnaHQoKSB7IHJldHVybiBoZWlnaHQ7IH0KICBpbnQgZ2V0Um93U2l6ZSgpIHsgcmV0dXJuIHJvd1NpemU7IH0KICBpbnQgZ2V0QWxwaGFSb3dTaXplKCkgeyByZXR1cm4gd2lkdGg7IH0KICBpbnQgZ2V0Um93UGFkKCkgeyByZXR1cm4gcm93UGFkOyB9CiAgU3BsYXNoQ29sb3JNb2RlIGdldE1vZGUoKSB7IHJldHVybiBtb2RlOyB9CiAgU3BsYXNoQ29sb3JQdHIgZ2V0RGF0YVB0cigpIHsgcmV0dXJuIGRhdGE7IH0KICBHdWNoYXIgKmdldEFscGhhUHRyKCkgeyByZXR1cm4gYWxwaGE7IH0KICBHb29MaXN0ICpnZXRTZXBhcmF0aW9uTGlzdCgpIHsgcmV0dXJuIHNlcGFyYXRpb25MaXN0OyB9CgogIFNwbGFzaEVycm9yIHdyaXRlUE5NRmlsZShjaGFyICpmaWxlTmFtZSk7CiAgU3BsYXNoRXJyb3Igd3JpdGVQTk1GaWxlKEZJTEUgKmYpOwogIFNwbGFzaEVycm9yIHdyaXRlQWxwaGFQR01GaWxlKGNoYXIgKmZpbGVOYW1lKTsKICAKICBTcGxhc2hFcnJvciB3cml0ZUltZ0ZpbGUoU3BsYXNoSW1hZ2VGaWxlRm9ybWF0IGZvcm1hdCwgY2hhciAqZmlsZU5hbWUsIGludCBoRFBJLCBpbnQgdkRQSSwgY29uc3QgY2hhciAqY29tcHJlc3Npb25TdHJpbmcgPSAiIik7CiAgU3BsYXNoRXJyb3Igd3JpdGVJbWdGaWxlKFNwbGFzaEltYWdlRmlsZUZvcm1hdCBmb3JtYXQsIEZJTEUgKmYsIGludCBoRFBJLCBpbnQgdkRQSSwgY29uc3QgY2hhciAqY29tcHJlc3Npb25TdHJpbmcgPSAiIik7CiAgU3BsYXNoRXJyb3Igd3JpdGVJbWdGaWxlKEltZ1dyaXRlciAqd3JpdGVyLCBGSUxFICpmLCBpbnQgaERQSSwgaW50IHZEUEkpOwoKICBlbnVtIENvbnZlcnNpb25Nb2RlCiAgewogICAgICBjb252ZXJzaW9uT3BhcXVlLAogICAgICBjb252ZXJzaW9uQWxwaGEsCiAgICAgIGNvbnZlcnNpb25BbHBoYVByZW11bHRpcGxpZWQKICB9OwoKICBHQm9vbCBjb252ZXJ0VG9YQkdSKENvbnZlcnNpb25Nb2RlIGNvbnZlcnNpb25Nb2RlID0gY29udmVyc2lvbk9wYXF1ZSk7CgogIHZvaWQgZ2V0UGl4ZWwoaW50IHgsIGludCB5LCBTcGxhc2hDb2xvclB0ciBwaXhlbCk7CiAgdm9pZCBnZXRSR0JMaW5lKGludCB5LCBTcGxhc2hDb2xvclB0ciBsaW5lKTsKICB2b2lkIGdldFhCR1JMaW5lKGludCB5LCBTcGxhc2hDb2xvclB0ciBsaW5lLCBDb252ZXJzaW9uTW9kZSBjb252ZXJzaW9uTW9kZSA9IGNvbnZlcnNpb25PcGFxdWUpOwojaWYgU1BMQVNIX0NNWUsKICB2b2lkIGdldENNWUtMaW5lKGludCB5LCBTcGxhc2hDb2xvclB0ciBsaW5lKTsKI2VuZGlmCiAgR3VjaGFyIGdldEFscGhhKGludCB4LCBpbnQgeSk7CgogIC8vIENhbGxlciB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGJpdG1hcCBkYXRhLiAgVGhlIFNwbGFzaEJpdG1hcAogIC8vIG9iamVjdCBpcyBubyBsb25nZXIgdmFsaWQgLS0gdGhlIG5leHQgY2FsbCBzaG91bGQgYmUgdG8gdGhlCiAgLy8gZGVzdHJ1Y3Rvci4KICBTcGxhc2hDb2xvclB0ciB0YWtlRGF0YSgpOwoKcHJpdmF0ZToKCiAgaW50IHdpZHRoLCBoZWlnaHQ7CQkvLyBzaXplIG9mIGJpdG1hcAogIGludCByb3dQYWQ7CiAgaW50IHJvd1NpemU7CQkJLy8gc2l6ZSBvZiBvbmUgcm93IG9mIGRhdGEsIGluIGJ5dGVzCgkJCQkvLyAgIC0gbmVnYXRpdmUgZm9yIGJvdHRvbS11cCBiaXRtYXBzCiAgU3BsYXNoQ29sb3JNb2RlIG1vZGU7CQkvLyBjb2xvciBtb2RlCiAgU3BsYXNoQ29sb3JQdHIgZGF0YTsJCS8vIHBvaW50ZXIgdG8gcm93IHplcm8gb2YgdGhlIGNvbG9yIGRhdGEKICBHdWNoYXIgKmFscGhhOwkJLy8gcG9pbnRlciB0byByb3cgemVybyBvZiB0aGUgYWxwaGEgZGF0YQoJCQkJLy8gICAoYWx3YXlzIHRvcC1kb3duKQogIEdvb0xpc3QgKnNlcGFyYXRpb25MaXN0OyAvLyBsaXN0IG9mIHNwb3QgY29sb3JhbnRzIGFuZCB0aGVpciBtYXBwaW5nIGZ1bmN0aW9ucwoKICBmcmllbmQgY2xhc3MgU3BsYXNoOwp9OwoKI2VuZGlmCg==