LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBDb3B5cmlnaHQgKGMpIDIwMjEgQ2VudHJhbGVTdXBlbGVjLCBDRUEtTElTVAoqCiogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwoqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wCiogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLwoqCiogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKgoqIENvbnRyaWJ1dG9yczoKKiBFcndhbiBNYWjpIChDZW50cmFsZVN1cGVsZWMpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwdWIgc3RhdGljIFNZTlRBWF9QT1NJVElPTl9MRUZUOiAmJ3N0YXRpYyBzdHIgPSAiMSI7CnB1YiBzdGF0aWMgU1lOVEFYX1BPU0lUSU9OX1JJR0hUOiAmJ3N0YXRpYyBzdHIgPSAiMiI7CnB1YiBzdGF0aWMgU1lOVEFYX1BPU0lUSU9OX0VQU0lMT046ICYnc3RhdGljIHN0ciA9ICLOtSI7CgojW2Rlcml2ZShDbG9uZSwgUGFydGlhbEVxLCBFcSwgSGFzaCwgRGVidWcpXQpwdWIgZW51bSBQb3NpdGlvbiB7CiAgICBMZWZ0KEJveDxQb3NpdGlvbj4pLAogICAgUmlnaHQoQm94PFBvc2l0aW9uPiksCiAgICBFcHNpbG9uCn0KCgppbXBsIFBvc2l0aW9uIHsKCiAgICBwdWIgZm4gZnJvbV92ZWMocG9zX3ZlYyA6ICZtdXQgVmVjPHUzMj4pIC0+IFBvc2l0aW9uIHsKICAgICAgICBpZiBwb3NfdmVjLmxlbigpID09IDAgewogICAgICAgICAgICByZXR1cm4gUG9zaXRpb246OkVwc2lsb247CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGV0IGZpcnN0ID0gcG9zX3ZlYy5yZW1vdmUoMCk7CiAgICAgICAgICAgIGxldCBjb250aW51YXRpb24gPSBQb3NpdGlvbjo6ZnJvbV92ZWMocG9zX3ZlYyk7CiAgICAgICAgICAgIGlmIGZpcnN0ID09IDEgewogICAgICAgICAgICAgICAgcmV0dXJuIFBvc2l0aW9uOjpMZWZ0KCBCb3g6Om5ldyhjb250aW51YXRpb24pICk7CiAgICAgICAgICAgIH0gZWxzZSBpZiBmaXJzdCA9PSAyIHsKICAgICAgICAgICAgICAgIHJldHVybiBQb3NpdGlvbjo6UmlnaHQoIEJveDo6bmV3KGNvbnRpbnVhdGlvbikgKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBhbmljISgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKfQoKdXNlIGNvcmU6OmNtcDo6T3JkZXJpbmc7CgppbXBsIFBhcnRpYWxPcmQgZm9yIFBvc2l0aW9uIHsKICAgIGZuIHBhcnRpYWxfY21wKCZzZWxmLCBvdGhlcjogJlNlbGYpIC0+IE9wdGlvbjxPcmRlcmluZz4gewogICAgICAgIFNvbWUoc2VsZi5jbXAob3RoZXIpKQogICAgfQp9CgppbXBsIE9yZCBmb3IgUG9zaXRpb24gewogICAgZm4gY21wKCZzZWxmLCBvdGhlcjogJlNlbGYpIC0+IE9yZGVyaW5nIHsKICAgICAgICBtYXRjaCBzZWxmIHsKICAgICAgICAgICAgJlBvc2l0aW9uOjpFcHNpbG9uID0+IHsKICAgICAgICAgICAgICAgIG1hdGNoIG90aGVyIHsKICAgICAgICAgICAgICAgICAgICAmUG9zaXRpb246OkVwc2lsb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3JkZXJpbmc6OkVxdWFsOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcmRlcmluZzo6TGVzczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICZQb3NpdGlvbjo6TGVmdChyZWYgaW5fc2VsZikgPT4gewogICAgICAgICAgICAgICAgbWF0Y2ggb3RoZXIgewogICAgICAgICAgICAgICAgICAgICZQb3NpdGlvbjo6TGVmdChyZWYgaW5fb3RoZXIpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgqKmluX3NlbGYpLmNtcCggJioqaW5fb3RoZXIgKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICZQb3NpdGlvbjo6UmlnaHQocmVmIGluX290aGVyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcmRlcmluZzo6TGVzczsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICZQb3NpdGlvbjo6RXBzaWxvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcmRlcmluZzo6R3JlYXRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICZQb3NpdGlvbjo6UmlnaHQocmVmIGluX3NlbGYpID0+IHsKICAgICAgICAgICAgICAgIG1hdGNoIG90aGVyIHsKICAgICAgICAgICAgICAgICAgICAmUG9zaXRpb246OkxlZnQocmVmIGluX290aGVyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcmRlcmluZzo6R3JlYXRlcjsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICZQb3NpdGlvbjo6UmlnaHQocmVmIGluX290aGVyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKippbl9zZWxmKS5jbXAoICYqKmluX290aGVyICk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAmUG9zaXRpb246OkVwc2lsb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3JkZXJpbmc6OkdyZWF0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovKgppbXBsIFBvc2l0aW9uIHsKCiAgICBwdWIgZm4gYXNfdGV4dCgmc2VsZikgLT4gU3RyaW5nIHsKICAgICAgICBtYXRjaCBzZWxmIHsKICAgICAgICAgICAgUG9zaXRpb246OkxlZnQocmVmIGluX3NlbGYpID0+IHsKICAgICAgICAgICAgICAgIGxldCBtdXQgbXlfc3RyaW5nID0gU1lOVEFYX1BPU0lUSU9OX0xFRlQudG9fc3RyaW5nKCk7CiAgICAgICAgICAgICAgICBteV9zdHJpbmcucHVzaF9zdHIoICYoKmluX3NlbGYpLmFzX3RleHQoKSApOwogICAgICAgICAgICAgICAgcmV0dXJuIG15X3N0cmluZzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUG9zaXRpb246OlJpZ2h0KHJlZiBpbl9zZWxmKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgbXV0IG15X3N0cmluZyA9IFNZTlRBWF9QT1NJVElPTl9SSUdIVC50b19zdHJpbmcoKTsKICAgICAgICAgICAgICAgIG15X3N0cmluZy5wdXNoX3N0ciggJigqaW5fc2VsZikuYXNfdGV4dCgpICk7CiAgICAgICAgICAgICAgICByZXR1cm4gbXlfc3RyaW5nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBQb3NpdGlvbjo6RXBzaWxvbiA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gU1lOVEFYX1BPU0lUSU9OX0VQU0lMT04udG9fc3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cgp9CgoKCgoKCiovCg==