Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoQml0bWFwLmgKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCi8vIE1vZGlmaWVkIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgLSBodHRwOi8vcG9wcGxlci5mcmVlZGVza3RvcC5vcmcKLy8KLy8gQWxsIGNoYW5nZXMgbWFkZSB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IHRvIHRoaXMgZmlsZSBhcmUgbGljZW5zZWQKLy8gdW5kZXIgR1BMIHZlcnNpb24gMiBvciBsYXRlcgovLwovLyBDb3B5cmlnaHQgKEMpIDIwMDcgSWxtYXJpIEhlaWtraW5lbiA8aWxtYXJpLmhlaWtraW5lbkBnbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAwOSBTaGVuIExpYW5nIDxzaGVuemh1eGlAZ21haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTIgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAwOSBTdGVmYW4gVGhvbWFzIDx0aG9tYXNAZWxvYWQyNC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMCwgMjAxNyBBZHJpYW4gSm9obnNvbiA8YWpvaG5zb25AcmVkbmVvbi5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMCBIYXJyeSBSb2JlcnRzIDxoYXJyeS5yb2JlcnRzQG1pZG5pZ2h0LWxhYnMub3JnPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgQ2hyaXN0aWFuIEZldWVyc+RuZ2VyIDxjZmV1ZXJzYWVuZ2VyQGdvb2dsZW1haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgV2lsbGlhbSBCYWRlciA8d2lsbGlhbWJhZGVyQGhvdG1haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhvbWFzIEZyZWl0YWcgPFRob21hcy5GcmVpdGFnQGFsZmEuZGU+Ci8vIENvcHlyaWdodCAoQykgMjAxNSBBZGFtIFJlaWNob2xkIDxhZGFtcmVpY2hvbGRAbXlvcGVyYS5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxNiBLZW5qaSBVbm8gPGt1QGRpZ2l0YWxkb2xwaGlucy5qcD4KLy8KLy8gVG8gc2VlIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNoYW5nZXMgcGxlYXNlIHNlZSB0aGUgQ2hhbmdlbG9nIGZpbGUgdGhhdAovLyBjYW1lIHdpdGggeW91ciB0YXJiYWxsIG9yIHR5cGUgbWFrZSBDaGFuZ2VMb2cgaWYgeW91IGFyZSBidWlsZGluZyBmcm9tIGdpdAovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2lmbmRlZiBTUExBU0hCSVRNQVBfSAojZGVmaW5lIFNQTEFTSEJJVE1BUF9ICgojaWZkZWYgVVNFX0dDQ19QUkFHTUFTCiNwcmFnbWEgaW50ZXJmYWNlCiNlbmRpZgoKI2luY2x1ZGUgIlNwbGFzaFR5cGVzLmgiCiNpbmNsdWRlICJwb3BwbGVyL0dmeFN0YXRlLmgiCiNpbmNsdWRlIDxzdGRpby5oPgoKY2xhc3MgSW1nV3JpdGVyOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoQml0bWFwCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBTcGxhc2hCaXRtYXAgewpwdWJsaWM6CgogIC8vIENyZWF0ZSBhIG5ldyBiaXRtYXAuICBJdCB3aWxsIGhhdmUgPHdpZHRoQT4geCA8aGVpZ2h0QT4gcGl4ZWxzIGluCiAgLy8gY29sb3IgbW9kZSA8bW9kZUE+LiAgUm93cyB3aWxsIGJlIHBhZGRlZCBvdXQgdG8gYSBtdWx0aXBsZSBvZgogIC8vIDxyb3dQYWQ+IGJ5dGVzLiAgSWYgPHRvcERvd24+IGlzIGZhbHNlLCB0aGUgYml0bWFwIHdpbGwgYmUgc3RvcmVkCiAgLy8gdXBzaWRlLWRvd24sIGkuZS4sIHdpdGggdGhlIGxhc3Qgcm93IGZpcnN0IGluIG1lbW9yeS4KICBTcGxhc2hCaXRtYXAoaW50IHdpZHRoQSwgaW50IGhlaWdodEEsIGludCByb3dQYWQsCgkgICAgICAgU3BsYXNoQ29sb3JNb2RlIG1vZGVBLCBHQm9vbCBhbHBoYUEsCgkgICAgICAgR0Jvb2wgdG9wRG93biA9IGdUcnVlLCBHb29MaXN0ICpzZXBhcmF0aW9uTGlzdCA9IE5VTEwpOwogIHN0YXRpYyBTcGxhc2hCaXRtYXAgKmNvcHkoU3BsYXNoQml0bWFwICpzcmMpOwoKICB+U3BsYXNoQml0bWFwKCk7CgogIGludCBnZXRXaWR0aCgpIHsgcmV0dXJuIHdpZHRoOyB9CiAgaW50IGdldEhlaWdodCgpIHsgcmV0dXJuIGhlaWdodDsgfQogIGludCBnZXRSb3dTaXplKCkgeyByZXR1cm4gcm93U2l6ZTsgfQogIGludCBnZXRBbHBoYVJvd1NpemUoKSB7IHJldHVybiB3aWR0aDsgfQogIGludCBnZXRSb3dQYWQoKSB7IHJldHVybiByb3dQYWQ7IH0KICBTcGxhc2hDb2xvck1vZGUgZ2V0TW9kZSgpIHsgcmV0dXJuIG1vZGU7IH0KICBTcGxhc2hDb2xvclB0ciBnZXREYXRhUHRyKCkgeyByZXR1cm4gZGF0YTsgfQogIEd1Y2hhciAqZ2V0QWxwaGFQdHIoKSB7IHJldHVybiBhbHBoYTsgfQogIEdvb0xpc3QgKmdldFNlcGFyYXRpb25MaXN0KCkgeyByZXR1cm4gc2VwYXJhdGlvbkxpc3Q7IH0KCiAgU3BsYXNoRXJyb3Igd3JpdGVQTk1GaWxlKGNoYXIgKmZpbGVOYW1lKTsKICBTcGxhc2hFcnJvciB3cml0ZVBOTUZpbGUoRklMRSAqZik7CiAgU3BsYXNoRXJyb3Igd3JpdGVBbHBoYVBHTUZpbGUoY2hhciAqZmlsZU5hbWUpOwoKICBzdHJ1Y3QgV3JpdGVJbWdQYXJhbXMKICB7CiAgICBpbnQganBlZ1F1YWxpdHkgPSAtMTsKICAgIEdCb29sIGpwZWdQcm9ncmVzc2l2ZSA9IGdGYWxzZTsKICAgIEdvb1N0cmluZyB0aWZmQ29tcHJlc3Npb247CiAgfTsKCiAgU3BsYXNoRXJyb3Igd3JpdGVJbWdGaWxlKFNwbGFzaEltYWdlRmlsZUZvcm1hdCBmb3JtYXQsIGNoYXIgKmZpbGVOYW1lLCBpbnQgaERQSSwgaW50IHZEUEksIFdyaXRlSW1nUGFyYW1zKiBwYXJhbXMgPSBudWxscHRyKTsKICBTcGxhc2hFcnJvciB3cml0ZUltZ0ZpbGUoU3BsYXNoSW1hZ2VGaWxlRm9ybWF0IGZvcm1hdCwgRklMRSAqZiwgaW50IGhEUEksIGludCB2RFBJLCBXcml0ZUltZ1BhcmFtcyogcGFyYW1zID0gbnVsbHB0cik7CiAgU3BsYXNoRXJyb3Igd3JpdGVJbWdGaWxlKEltZ1dyaXRlciAqd3JpdGVyLCBGSUxFICpmLCBpbnQgaERQSSwgaW50IHZEUEksIFNwbGFzaENvbG9yTW9kZSBpbWFnZVdyaXRlckZvcm1hdCk7CgogIGVudW0gQ29udmVyc2lvbk1vZGUKICB7CiAgICAgIGNvbnZlcnNpb25PcGFxdWUsCiAgICAgIGNvbnZlcnNpb25BbHBoYSwKICAgICAgY29udmVyc2lvbkFscGhhUHJlbXVsdGlwbGllZAogIH07CgogIEdCb29sIGNvbnZlcnRUb1hCR1IoQ29udmVyc2lvbk1vZGUgY29udmVyc2lvbk1vZGUgPSBjb252ZXJzaW9uT3BhcXVlKTsKCiAgdm9pZCBnZXRQaXhlbChpbnQgeCwgaW50IHksIFNwbGFzaENvbG9yUHRyIHBpeGVsKTsKICB2b2lkIGdldFJHQkxpbmUoaW50IHksIFNwbGFzaENvbG9yUHRyIGxpbmUpOwogIHZvaWQgZ2V0WEJHUkxpbmUoaW50IHksIFNwbGFzaENvbG9yUHRyIGxpbmUsIENvbnZlcnNpb25Nb2RlIGNvbnZlcnNpb25Nb2RlID0gY29udmVyc2lvbk9wYXF1ZSk7CiNpZiBTUExBU0hfQ01ZSwogIHZvaWQgZ2V0Q01ZS0xpbmUoaW50IHksIFNwbGFzaENvbG9yUHRyIGxpbmUpOwojZW5kaWYKICBHdWNoYXIgZ2V0QWxwaGEoaW50IHgsIGludCB5KTsKCiAgLy8gQ2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgYml0bWFwIGRhdGEuICBUaGUgU3BsYXNoQml0bWFwCiAgLy8gb2JqZWN0IGlzIG5vIGxvbmdlciB2YWxpZCAtLSB0aGUgbmV4dCBjYWxsIHNob3VsZCBiZSB0byB0aGUKICAvLyBkZXN0cnVjdG9yLgogIFNwbGFzaENvbG9yUHRyIHRha2VEYXRhKCk7Cgpwcml2YXRlOgoKICBpbnQgd2lkdGgsIGhlaWdodDsJCS8vIHNpemUgb2YgYml0bWFwCiAgaW50IHJvd1BhZDsKICBpbnQgcm93U2l6ZTsJCQkvLyBzaXplIG9mIG9uZSByb3cgb2YgZGF0YSwgaW4gYnl0ZXMKCQkJCS8vICAgLSBuZWdhdGl2ZSBmb3IgYm90dG9tLXVwIGJpdG1hcHMKICBTcGxhc2hDb2xvck1vZGUgbW9kZTsJCS8vIGNvbG9yIG1vZGUKICBTcGxhc2hDb2xvclB0ciBkYXRhOwkJLy8gcG9pbnRlciB0byByb3cgemVybyBvZiB0aGUgY29sb3IgZGF0YQogIEd1Y2hhciAqYWxwaGE7CQkvLyBwb2ludGVyIHRvIHJvdyB6ZXJvIG9mIHRoZSBhbHBoYSBkYXRhCgkJCQkvLyAgIChhbHdheXMgdG9wLWRvd24pCiAgR29vTGlzdCAqc2VwYXJhdGlvbkxpc3Q7IC8vIGxpc3Qgb2Ygc3BvdCBjb2xvcmFudHMgYW5kIHRoZWlyIG1hcHBpbmcgZnVuY3Rpb25zCgogIGZyaWVuZCBjbGFzcyBTcGxhc2g7CgogIHZvaWQgc2V0SnBlZ1BhcmFtcyhJbWdXcml0ZXIgKndyaXRlciwgV3JpdGVJbWdQYXJhbXMqIHBhcmFtcyk7Cn07CgojZW5kaWYK