LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBDb3B5cmlnaHQgKGMpIDIwMjEgQ2VudHJhbGVTdXBlbGVjLCBDRUEtTElTVAoqCiogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwoqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wCiogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLwoqCiogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKgoqIENvbnRyaWJ1dG9yczoKKiBFcndhbiBNYWjpIChDZW50cmFsZVN1cGVsZWMpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp1c2UgaW1hZ2U6OntSZ2IsIFJnYkltYWdlfTsKdXNlIHJ1c3R0eXBlOjp7Rm9udENvbGxlY3Rpb24sIFNjYWxlfTsKdXNlIGltYWdlcHJvYzo6ZHJhd2luZzo6ZHJhd190ZXh0X211dDsKCnVzZSBjcmF0ZTo6cmVuZGVyaW5nOjp0ZXh0dWFsOjpjb252ZW50aW9uOjoqOwp1c2UgY3JhdGU6OnJlbmRlcmluZzo6c2RfZHJhd2luZ19jb25mOjoqOwp1c2UgY3JhdGU6OnJlbmRlcmluZzo6dGV4dHVhbDo6Y29sb3JlZDo6Y29sb3JlZF90ZXh0OjoqOwoKcHViIGZuIGRyYXdfY29sb3JlZF90ZXh0KGltYWdlIDogJm11dCBSZ2JJbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3ByaW50IDogJlZlYzxUZXh0VG9QcmludD4sCiAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfeF9wb3MgOiBmMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfeV9wb3MgOiBmMzIpIHsKICAgIGxldCBmb250ID0gRm9udENvbGxlY3Rpb246OmZyb21fYnl0ZXMoSElCT1VfR1JBUEhJQ19GT05UKS51bndyYXAoKS5pbnRvX2ZvbnQoKS51bndyYXAoKTsKICAgIGxldCBzY2FsZSA9IFNjYWxlIHsgeDogRk9OVF9XSURUSCwgeTogRk9OVF9IRUlHSFQgfTsKCiAgICAvLyAqKioKICAgIGxldCBtdXQgY2hhcl9jb3VudCA6IHUzMiA9IDA7CiAgICBmb3IgdHh0X3RvX3ByaW50IGluIHRvX3ByaW50IHsKICAgICAgICBsZXQgbXV0IG15X3RleHQgOiBTdHJpbmcgPSAoMC4uY2hhcl9jb3VudCkubWFwKHxffCAiICIpLmNvbGxlY3Q6OjxTdHJpbmc+KCk7CiAgICAgICAgbXlfdGV4dC5wdXNoX3N0ciggJnR4dF90b19wcmludC50ZXh0ICk7CiAgICAgICAgZHJhd190ZXh0X211dChpbWFnZSwKICAgICAgICAgICAgICAgICAgICAgIHR4dF90b19wcmludC5jb2xvciwKICAgICAgICAgICAgICAgICAgICAgIG1zZ194X3BvcyBhcyB1MzIsCiAgICAgICAgICAgICAgICAgICAgICAobXNnX3lfcG9zIC0gKFZFUlRJQ0FMX1NJWkUgYXMgZjMyKS8yLjApIGFzIHUzMiwKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgJmZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAmbXlfdGV4dAogICAgICAgICk7CiAgICAgICAgY2hhcl9jb3VudCA9IGNoYXJfY291bnQgKyB0eHRfdG9fcHJpbnQudGV4dC5jaGFycygpLmNvdW50KCkgYXMgdTMyOwogICAgfQp9