LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKgogKiBDb250cmlidXRvcnM6CiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucmVncmVzc2lvbjsKCmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS51dGlsLk1hcDsKCmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKCmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Ub29sRmFjdG9yeTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWwuVXRpbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CgpwdWJsaWMgY2xhc3MgR2VuZXJpY1R5cGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJhYmxlVGVzdCB7CgkKCXB1YmxpYyBHZW5lcmljVHlwZVRlc3QoU3RyaW5nIG5hbWUpIHsKCQlzdXBlcihuYW1lKTsKCX0KCgkvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgdG8gc3BlY2lmeSB0ZXN0cyBzdWJzZXQgdXNpbmcgVEVTVFNfKiBzdGF0aWMgdmFyaWFibGVzCgkvLyBBbGwgc3BlY2lmaWVkIHRlc3RzIHdoaWNoIGRvZXMgbm90IGJlbG9uZyB0byB0aGUgY2xhc3MgYXJlIHNraXBwZWQuLi4KCXN0YXRpYyB7Ci8vCQlURVNUU19OQU1FUyA9IG5ldyBTdHJpbmdbXSB7ICJ0ZXN0MDAwIiB9OwovLwkJVEVTVFNfTlVNQkVSUyA9IG5ldyBpbnRbXSB7IDcxMSB9OwovLwkJVEVTVFNfUkFOR0UgPSBuZXcgaW50W10geyA1MTQsIC0xIH07Cgl9CglwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CgkJVGVzdCBzdWl0ZSA9IGJ1aWxkVGVzdFN1aXRlKHRlc3RDbGFzcygpKTsKCQlURVNUU19DT1VOVEVSUy5wdXQodGVzdENsYXNzKCkuZ2V0TmFtZSgpLCBuZXcgSW50ZWdlcihzdWl0ZS5jb3VudFRlc3RDYXNlcygpKSk7CgkJcmV0dXJuIHN1aXRlOwoJfQoKCXB1YmxpYyBzdGF0aWMgQ2xhc3MgdGVzdENsYXNzKCkgeyAgCgkJcmV0dXJuIEdlbmVyaWNUeXBlVGVzdC5jbGFzczsKCX0KCglwdWJsaWMgdm9pZCB0ZXN0MDAxKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUeDEgZXh0ZW5kcyBTdHJpbmcsIFR4MiBleHRlbmRzIENvbXBhcmFibGU+ICBleHRlbmRzIFhTPFR4Mj4ge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBJbnRlZ2VyIHcgPSBuZXcgWDxTdHJpbmcsSW50ZWdlcj4oKS5nZXQobmV3IEludGVnZXIoMTIpKTtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWFMgPFR4cz4ge1xuIiArIAoJCQkJIiAgICBUeHMgZ2V0KFR4cyB0KSB7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gdDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwMigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8WHAxIGV4dGVuZHMgU3RyaW5nLCBYcDIgZXh0ZW5kcyBDb21wYXJhYmxlPiAgZXh0ZW5kcyBYUzxYcDI+IHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgSW50ZWdlciB3ID0gbmV3IFg8U3RyaW5nLEludGVnZXI+KCkuZ2V0KG5ldyBJbnRlZ2VyKDEyKSk7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIFhwMiBnZXQoWHAyIHQpe1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludChcIntYOjpnZXR9XCIpO1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIHN1cGVyLmdldCh0KTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBYUyA8WFNwMT4ge1xuIiArIAoJCQkJIiAgICBYU3AxIGdldChYU3AxIHQpIHtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoXCJ7WFM6OmdldH1cIik7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gdDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIntYOjpnZXR9e1hTOjpnZXR9U1VDQ0VTUyIpOwoJfQoJCgkvLyBjaGVjayBjYW5ub3QgYmluZCBzdXBlcmNsYXNzIHRvIHR5cGUgdmFyaWFibGUKCXB1YmxpYyB2b2lkIHRlc3QwMDMoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8WD4gZXh0ZW5kcyBYIHtcbiIgKyAKCQkJCSJ9XG4iLCAKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFggPFg+IGV4dGVuZHMgWCB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlRoZSB0eXBlIHBhcmFtZXRlciBYIGlzIGhpZGluZyB0aGUgdHlwZSBYPFg+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMSlcbiIgKyAKCQkJIglwdWJsaWMgY2xhc3MgWCA8WD4gZXh0ZW5kcyBYIHtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICBeXG4iICsgCgkJCSJDYW5ub3QgcmVmZXIgdG8gdGhlIHR5cGUgcGFyYW1ldGVyIFggYXMgYSBzdXBlcnR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJCgkvLyBjaGVjayBjYW5ub3QgYmluZCBzdXBlcmludGVyZmFjZSB0byB0eXBlIHZhcmlhYmxlCglwdWJsaWMgdm9pZCB0ZXN0MDA0KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFg+IGltcGxlbWVudHMgWCB7XG4iICsgCgkJCQkifVxuIiwgCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYIDxYPiBpbXBsZW1lbnRzIFgge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICBeXG4iICsgCgkJCSJUaGUgdHlwZSBwYXJhbWV0ZXIgWCBpcyBoaWRpbmcgdGhlIHR5cGUgWDxYPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFggPFg+IGltcGxlbWVudHMgWCB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXlxuIiArIAoJCQkiQ2Fubm90IHJlZmVyIHRvIHRoZSB0eXBlIHBhcmFtZXRlciBYIGFzIGEgc3VwZXJ0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCQoJLy8gY2hlY2sgY2Fubm90IGJpbmQgdHlwZSB2YXJpYWJsZSBpbiBzdGF0aWMgY29udGV4dAoJcHVibGljIHZvaWQgdGVzdDAwNSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPiB7XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBUIHQ7XG4iICsgCgkJCQkiICAgIHN0YXRpYyB7XG4iICsgCgkJCQkiICAgICAgICBUIHM7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJCSIJVCBzO1xuIiArIAoJCQkiCV5cbiIgKyAKCQkJIkNhbm5vdCBtYWtlIGEgc3RhdGljIHJlZmVyZW5jZSB0byB0aGUgbm9uLXN0YXRpYyB0eXBlIFRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJCQkJCgkvLyBjaGVjayBzdGF0aWMgcmVmZXJlbmNlcyB0byB0eXBlIHZhcmlhYmxlcwoJcHVibGljIHZvaWQgdGVzdDAwNigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPiB7XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBUIG9rMTtcbiIgKyAKCQkJCSIgICAgc3RhdGljIHtcbiIgKyAKCQkJCSIgICAgICAgIFQgd3JvbmcxO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHN0YXRpYyB2b2lkIGZvbyhUIHdyb25nMikge1xuIiArIAoJCQkJIgkJVCB3cm9uZzM7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgY2xhc3MgTVggZXh0ZW5kcyBUIHtcbiIgKyAKCQkJCSIgICAgICAgIFQgb2syO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHN0YXRpYyBjbGFzcyBTTVggZXh0ZW5kcyBUIHtcbiIgKyAKCQkJCSIgICAgICAgIFQgd3Jvbmc0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCVQgd3JvbmcxO1xuIiArIAoJCQkiCV5cbiIgKyAKCQkJIkNhbm5vdCBtYWtlIGEgc3RhdGljIHJlZmVyZW5jZSB0byB0aGUgbm9uLXN0YXRpYyB0eXBlIFRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCXN0YXRpYyB2b2lkIGZvbyhUIHdyb25nMikge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICBeXG4iICsgCgkJCSJDYW5ub3QgbWFrZSBhIHN0YXRpYyByZWZlcmVuY2UgdG8gdGhlIG5vbi1zdGF0aWMgdHlwZSBUXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIglUIHdyb25nMztcbiIgKyAKCQkJIgleXG4iICsgCgkJCSJDYW5ub3QgbWFrZSBhIHN0YXRpYyByZWZlcmVuY2UgdG8gdGhlIG5vbi1zdGF0aWMgdHlwZSBUXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI0LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTApXG4iICsgCgkJCSIJY2xhc3MgTVggZXh0ZW5kcyBUIHtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIkNhbm5vdCByZWZlciB0byB0aGUgdHlwZSBwYXJhbWV0ZXIgVCBhcyBhIHN1cGVydHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEzKVxuIiArIAoJCQkiCXN0YXRpYyBjbGFzcyBTTVggZXh0ZW5kcyBUIHtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgXlxuIiArIAoJCQkiQ2Fubm90IG1ha2UgYSBzdGF0aWMgcmVmZXJlbmNlIHRvIHRoZSBub24tc3RhdGljIHR5cGUgVFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDE0KVxuIiArIAoJCQkiCVQgd3Jvbmc0O1xuIiArIAoJCQkiCV5cbiIgKyAKCQkJIkNhbm5vdCBtYWtlIGEgc3RhdGljIHJlZmVyZW5jZSB0byB0aGUgbm9uLXN0YXRpYyB0eXBlIFRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJCgkvLyBjaGVjayBzdGF0aWMgcmVmZXJlbmNlcyB0byB0eXBlIHZhcmlhYmxlcwoJcHVibGljIHZvaWQgdGVzdDAwNygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPiB7XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBUIG9rMTtcbiIgKyAKCQkJCSIgICAgc3RhdGljIGNsYXNzIFNNWCB7XG4iICsgCgkJCQkiICAgICAgICBUIHdyb25nNDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIglUIHdyb25nNDtcbiIgKyAKCQkJIgleXG4iICsgCgkJCSJDYW5ub3QgbWFrZSBhIHN0YXRpYyByZWZlcmVuY2UgdG8gdGhlIG5vbi1zdGF0aWMgdHlwZSBUXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCQoJLy8gY2hlY2sgc3RhdGljIHJlZmVyZW5jZXMgdG8gdHlwZSB2YXJpYWJsZXMKCXB1YmxpYyB2b2lkIHRlc3QwMDgoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VD4ge1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgIFQgb2s7XG4iICsgCgkJCQkiICAgIHN0YXRpYyBUIHdyb25nO1xuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkJIglzdGF0aWMgVCB3cm9uZztcbiIgKyAKCQkJIgkgICAgICAgXlxuIiArIAoJCQkiQ2Fubm90IG1ha2UgYSBzdGF0aWMgcmVmZXJlbmNlIHRvIHRoZSBub24tc3RhdGljIHR5cGUgVFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkKCS8vIE9iamVjdCBjYW5ub3QgYmUgZ2VuZXJpYwoJcHVibGljIHZvaWQgdGVzdDAwOSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJPYmplY3QuamF2YSIsCgkJCQkicGFja2FnZSBqYXZhLmxhbmc7XG4iICsKCQkJCSJwdWJsaWMgY2xhc3MgT2JqZWN0IDxUPiB7XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIE9iamVjdC5qYXZhIChhdCBsaW5lIDIpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIE9iamVjdCA8VD4ge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlRoZSB0eXBlIGphdmEubGFuZy5PYmplY3QgY2Fubm90IGJlIGRlY2xhcmVkIGFzIGEgZ2VuZXJpY1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMTAoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJjbGFzcyBGb28ge30gXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFg8VCBleHRlbmRzIE9iamVjdCAmIENvbXBhcmFibGU8PyBzdXBlciBUPj4ge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBuZXcgWDxGb28+KCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJbmV3IFg8Rm9vPigpO1xuIiArIAoJCQkiCSAgICAgIF5eXlxuIiArIAoJCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlIEZvbyBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFQgZXh0ZW5kcyBPYmplY3QgJiBDb21wYXJhYmxlPD8gc3VwZXIgVD4+IG9mIHRoZSB0eXBlIFg8VD5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDExKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VCBleHRlbmRzIE9iamVjdCAmIENvbXBhcmFibGU8PyBzdXBlciBUPj4ge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBuZXcgWDxGb28+KCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJbmV3IFg8Rm9vPigpO1xuIiArIAoJCQkiCSAgICAgIF5eXlxuIiArIAoJCQkiRm9vIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDEyKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VCBleHRlbmRzIFN0cmluZz4ge1xuIiArIAoJCQkJIiAgICBUIGZvbyhUIHQpIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiB0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBTdHJpbmcgcyA9IG5ldyBYPFN0cmluZz4oKS5mb28oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHMpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAxMygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBTdHJpbmc+IHtcbiIgKyAKCQkJCSIgICAgVCBmb28oVCB0KSB7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gdDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBuZXcgWDxTdHJpbmc+KCkuYmF6KFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICB2b2lkIGJheihmaW5hbCBUIHQpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBPYmplY3QoKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgdm9pZCBwcmludCgpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGZvbyh0KSk7XG4iICsgCgkJCQkiICAgICAgICAgICAgfVxuIiArIAoJCQkJIiAgICAgICAgfS5wcmludCgpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAxNCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUIGV4dGVuZHMgRXhjZXB0aW9uPiB7XG4iICsgCgkJCQkiICAgIFQgZm9vKFQgdCkgdGhyb3dzIFQge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIHQ7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgbmV3IFg8RVg+KCkuYmF6KG5ldyBFWCgpKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICB2b2lkIGJheihmaW5hbCBUIHQpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBPYmplY3QoKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgdm9pZCBwcmludCgpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGZvbyh0KSk7XG4iICsgCgkJCQkiICAgICAgICAgICAgfVxuIiArIAoJCQkJIiAgICAgICAgfS5wcmludCgpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEVYIGV4dGVuZHMgRXhjZXB0aW9uIHtcbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDExKVxuIiArIAoJCQkiCVN5c3RlbS5vdXQucHJpbnRsbihmb28odCkpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICBeXl5eXl5cbiIgKyAKCQkJIlVuaGFuZGxlZCBleGNlcHRpb24gdHlwZSBUXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxNilcbiIgKyAKCQkJIgljbGFzcyBFWCBleHRlbmRzIEV4Y2VwdGlvbiB7XG4iICsgCgkJCSIJICAgICAgXl5cbiIgKyAKCQkJIlRoZSBzZXJpYWxpemFibGUgY2xhc3MgRVggZG9lcyBub3QgZGVjbGFyZSBhIHN0YXRpYyBmaW5hbCBzZXJpYWxWZXJzaW9uVUlEIGZpZWxkIG9mIHR5cGUgbG9uZ1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MDE1KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VCBleHRlbmRzIEV4Y2VwdGlvbj4ge1xuIiArIAoJCQkJIiAgICBTdHJpbmcgZm9vKCkgdGhyb3dzIFQge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIFwiU1VDQ0VTU1wiO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBYPEVYPigpLmJheihuZXcgRVgoKSk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgdm9pZCBiYXooZmluYWwgVCB0KSB7XG4iICsgCgkJCQkiICAgICAgICBuZXcgT2JqZWN0KCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgIHZvaWQgcHJpbnQoKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIHRyeSB7XG4iICsgCgkJCQkiCSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZm9vKCkpO1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gdCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICB9XG4iICsgCgkJCQkiICAgICAgICAgICAgfVxuIiArIAoJCQkJIiAgICAgICAgfS5wcmludCgpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEVYIGV4dGVuZHMgRXhjZXB0aW9uIHtcbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkKCQoJcHVibGljIHZvaWQgdGVzdDAxNigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPEUgZXh0ZW5kcyBFeGNlcHRpb24+IHtcbiIgKyAKCQkJCSIgICAgdm9pZCBmb28oRSBlKSB0aHJvd3MgRSB7XG4iICsgCgkJCQkiICAgICAgICB0aHJvdyBlO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHZvaWQgYmFyKEUgZSkge1xuIiArIAoJCQkJIiAgICAgICAgdHJ5IHtcbiIgKyAKCQkJCSIgICAgICAgICAgICBmb28oZSk7XG4iICsgCgkJCQkiICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkge1xuIiArIAoJCQkJIgkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgICAgICB9XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgbmV3IFg8RXhjZXB0aW9uPigpLmJhcihuZXcgRXhjZXB0aW9uKCkpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0KCXB1YmxpYyB2b2lkIHRlc3QwMTcoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCA8RSBleHRlbmRzIEV4Y2VwdGlvbj4ge1xuIiArIAoJCQkJIiAgICB2b2lkIGZvbyhFIGUpIHRocm93cyBFIHtcbiIgKyAKCQkJCSIgICAgICAgIHRocm93IGU7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgdm9pZCBiYXIoRSBlKSB7XG4iICsgCgkJCQkiICAgICAgICB0cnkge1xuIiArIAoJCQkJIiAgICAgICAgICAgIGZvbyhlKTtcbiIgKyAKCQkJCSIgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7XG4iICsgCgkJCQkiCSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgICAgIH1cbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBuZXcgWDxJT0V4Y2VwdGlvbj4oKS5iYXIobmV3IEV4Y2VwdGlvbigpKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDE0KVxuIiArIAoJCQkiCW5ldyBYPElPRXhjZXB0aW9uPigpLmJhcihuZXcgRXhjZXB0aW9uKCkpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgIF5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCBiYXIoSU9FeGNlcHRpb24pIGluIHRoZSB0eXBlIFg8SU9FeGNlcHRpb24+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChFeGNlcHRpb24pXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCXB1YmxpYyB2b2lkIHRlc3QwMTgoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPiB7XG4iICsgCgkJCQkiICAgIFQgZm9vKFQgdCkge1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHQpO1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIHQ7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgbmV3IFg8WFk+KCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgIHZvaWQgcnVuKCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICBmb28obmV3IFhZKCkpO1xuIiArIAoJCQkJIiAgICAgICAgICAgIH1cbiIgKyAKCQkJCSIgICAgICAgIH0ucnVuKCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWFkge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIFwiU1VDQ0VTU1wiO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0KCXB1YmxpYyB2b2lkIHRlc3QwMTkoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VD4ge1xuIiArIAoJCQkJIiAgICAgcHJpdmF0ZSBUIGZvbyhUIHQpIHtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0KTtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiB0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBYPFhZPigpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICB2b2lkIHJ1bigpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgZm9vKG5ldyBYWSgpKTtcbiIgKyAKCQkJCSIgICAgICAgICAgICB9XG4iICsgCgkJCQkiICAgICAgICB9LnJ1bigpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIFhZIHtcbiIgKyAKCQkJCSIgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiBcIlNVQ0NFU1NcIjtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn0iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJCSIJZm9vKG5ldyBYWSgpKTtcbiIgKyAKCQkJIgleXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgZm9vKFQpIGluIHRoZSB0eXBlIFg8VD4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKFhZKVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTUpXG4iICsgCgkJCSIJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgIF5eXl5eXl5eXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgdG9TdHJpbmcoKSBvZiB0eXBlIFhZIHNob3VsZCBiZSB0YWdnZWQgd2l0aCBAT3ZlcnJpZGUgc2luY2UgaXQgYWN0dWFsbHkgb3ZlcnJpZGVzIGEgc3VwZXJjbGFzcyBtZXRob2RcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJcHVibGljIHZvaWQgdGVzdDAyMCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPiB7XG4iICsgCgkJCQkiICAgICB2b2lkIGZvbyhZPFQ+IHkpIHtcbiIgKyAKCQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoXCJTVUNDXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBYPFN0cmluZz4oKS5iYXIoKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICB2b2lkIGJhcigpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBZPFQ+KCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgIEBPdmVycmlkZVxuIiArCgkJCQkiICAgICAgICAgICAgcHVibGljIHZvaWQgcHJlKCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICBmb28odGhpcyk7XG4iICsgCgkJCQkiICAgICAgICAgICAgfVxuIiArIAoJCQkJIiAgICAgICAgfS5wcmludChcIkVTU1wiKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBZIDxQPiB7XG4iICsgCgkJCQkiCXB1YmxpYyB2b2lkIHByaW50KFAgcCkge1xuIiArIAoJCQkJIgkJcHJlKCk7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4ocCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgcHJlKCkge1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifSIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTQpXG4iICsgCgkJCSIJfS5wcmludChcIkVTU1wiKTtcbiIgKyAKCQkJIgkgIF5eXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIHByaW50KFQpIGluIHRoZSB0eXBlIFk8VD4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKFN0cmluZylcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJcHVibGljIHZvaWQgdGVzdDAyMSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUIGV4dGVuZHMgU3RyaW5nPiB7XG4iICsgCgkJCQkiICAgIHZvaWQgZm9vKFQgdCkge1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHZvaWQgYmFyKFN0cmluZyB4KSB7XG4iICsgCgkJCQkiICAgICAgICBmb28oeCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgbmV3IFg8U3RyaW5nPigpLmZvbyhuZXcgT2JqZWN0KCkpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBTdHJpbmc+IHtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXlxuIiArIAoJCQkiVGhlIHR5cGUgcGFyYW1ldGVyIFQgc2hvdWxkIG5vdCBiZSBib3VuZGVkIGJ5IHRoZSBmaW5hbCB0eXBlIFN0cmluZy4gRmluYWwgdHlwZXMgY2Fubm90IGJlIGZ1cnRoZXIgZXh0ZW5kZWRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCWZvbyh4KTtcbiIgKyAKCQkJIgleXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgZm9vKFQpIGluIHRoZSB0eXBlIFg8VD4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKFN0cmluZylcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCW5ldyBYPFN0cmluZz4oKS5mb28obmV3IE9iamVjdCgpKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGZvbyhTdHJpbmcpIGluIHRoZSB0eXBlIFg8U3RyaW5nPiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoT2JqZWN0KVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMjIoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUIGV4dGVuZHMgU3RyaW5nPiB7XG4iICsgCgkJCQkiICAgIFgoVCB0KSB7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgbmV3IFg8U3RyaW5nPihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDIzKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VCBleHRlbmRzIFN0cmluZz4ge1xuIiArIAoJCQkJIiAgICBYKGZpbmFsIFQgdCkge1xuIiArIAoJCQkJIiAgICAgICAgbmV3IE9iamVjdCgpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICB2b2lkIHByaW50KCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odCk7XG4iICsgCgkJCQkiICAgICAgICAgICAgfVxuIiArIAoJCQkJIiAgICAgICAgfS5wcmludCgpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBYPFN0cmluZz4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAyNCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUIGV4dGVuZHMgRXhjZXB0aW9uPiB7XG4iICsgCgkJCQkiICAgIFgoZmluYWwgVCB0KSB0aHJvd3MgVCB7XG4iICsgCgkJCQkiICAgICAgICBuZXcgT2JqZWN0KCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgIHZvaWQgcHJpbnQoKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0KTtcbiIgKyAKCQkJCSIgICAgICAgICAgICB9XG4iICsgCgkJCQkiICAgICAgICB9LnByaW50KCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgbmV3IFg8RVg+KG5ldyBFWCgpKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBFWCBleHRlbmRzIEV4Y2VwdGlvbiB7XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMClcbiIgKyAKCQkJIgluZXcgWDxFWD4obmV3IEVYKCkpO1xuIiArIAoJCQkiCV5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlVuaGFuZGxlZCBleGNlcHRpb24gdHlwZSBFWFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTMpXG4iICsgCgkJCSIJY2xhc3MgRVggZXh0ZW5kcyBFeGNlcHRpb24ge1xuIiArIAoJCQkiCSAgICAgIF5eXG4iICsgCgkJCSJUaGUgc2VyaWFsaXphYmxlIGNsYXNzIEVYIGRvZXMgbm90IGRlY2xhcmUgYSBzdGF0aWMgZmluYWwgc2VyaWFsVmVyc2lvblVJRCBmaWVsZCBvZiB0eXBlIGxvbmdcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDI1KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VCBleHRlbmRzIEV4Y2VwdGlvbj4ge1xuIiArIAoJCQkJIiAgICBTdHJpbmcgZm9vKCkgdGhyb3dzIFQge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIFwiU1VDQ0VTU1wiO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBYPEVYPihuZXcgRVgoKSk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgWChmaW5hbCBUIHQpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBPYmplY3QoKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgdm9pZCBwcmludCgpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgdHJ5IHtcbiIgKyAKCQkJCSIJICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihmb28oKSk7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB0KSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIH1cbiIgKyAKCQkJCSIgICAgICAgICAgICB9XG4iICsgCgkJCQkiICAgICAgICB9LnByaW50KCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgRVggZXh0ZW5kcyBFeGNlcHRpb24ge1xuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMjYoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxFIGV4dGVuZHMgRXhjZXB0aW9uPiB7XG4iICsgCgkJCQkiICAgIHZvaWQgZm9vKEUgZSkgdGhyb3dzIEUge1xuIiArIAoJCQkJIiAgICAgICAgdGhyb3cgZTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBYKEUgZSkge1xuIiArIAoJCQkJIiAgICAgICAgdHJ5IHtcbiIgKyAKCQkJCSIgICAgICAgICAgICBmb28oZSk7XG4iICsgCgkJCQkiICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkge1xuIiArIAoJCQkJIgkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgICAgICB9XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgbmV3IFg8RXhjZXB0aW9uPihuZXcgRXhjZXB0aW9uKCkpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0KCXB1YmxpYyB2b2lkIHRlc3QwMjcoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCA8RSBleHRlbmRzIEV4Y2VwdGlvbj4ge1xuIiArIAoJCQkJIiAgICB2b2lkIGZvbyhFIGUpIHRocm93cyBFIHtcbiIgKyAKCQkJCSIgICAgICAgIHRocm93IGU7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgWChFIGUpIHtcbiIgKyAKCQkJCSIgICAgICAgIHRyeSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgZm9vKGUpO1xuIiArIAoJCQkJIiAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHtcbiIgKyAKCQkJCSIJICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICAgICAgfVxuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBYPElPRXhjZXB0aW9uPihuZXcgRXhjZXB0aW9uKCkpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiAsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTQpXG4iICsgCgkJCSIJbmV3IFg8SU9FeGNlcHRpb24+KG5ldyBFeGNlcHRpb24oKSk7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlRoZSBjb25zdHJ1Y3RvciBYPElPRXhjZXB0aW9uPihFeGNlcHRpb24pIGlzIHVuZGVmaW5lZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMjgoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPiB7XG4iICsgCgkJCQkiICAgIFQgdDtcbiIgKyAKCQkJCSIgICAgWChUIHQpIHtcbiIgKyAKCQkJCSIgICAgICAgIHRoaXMudCA9IHQ7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgU3RyaW5nIHMgPSBuZXcgWDxTdHJpbmc+KFwiU1VcIikudDtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnQocyk7XG4iICsgCgkJCQkiICAgICAgICBzID0gbmV3IFg8U3RyaW5nPihcImZhaWxlZFwiKS50ID0gXCJDQ1wiO1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludChzKTtcbiIgKyAKCQkJCSIgICAgICAgIHMgPSBuZXcgWDxTdHJpbmc+KFwiXCIpLnQgKz0gXCJFU1NcIjtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMjkoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VD4ge1xuIiArIAoJCQkJIiAgICBUIHQ7XG4iICsgCgkJCQkiICAgIFgoKSB7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgVCBmb28oVCBhLCBUIGIpIHtcbiIgKyAKCQkJCSIgICAgICAgIFQgcztcbiIgKyAKCQkJCSIgICAgICAgIHMgPSB0ID0gYTtcbiIgKyAKCQkJCSIJCXMgPSB0ICs9IGI7XG4iICsgCgkJCQkiCQlyZXR1cm4gdDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmV3IFg8U3RyaW5nPigpLmZvbyhcIlNVQ1wiLCBcIkNFU1NcIikpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCXMgPSB0ICs9IGI7XG4iICsgCgkJCSIJICAgIF5eXl5eXlxuIiArIAoJCQkiVGhlIG9wZXJhdG9yICs9IGlzIHVuZGVmaW5lZCBmb3IgdGhlIGFyZ3VtZW50IHR5cGUocykgVCwgVFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMzAoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPiB7XG4iICsgCgkJCQkiICAgIFQgdDtcbiIgKyAKCQkJCSIgICAgWCgpIHtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBUIGZvbyhUIGEpIHtcbiIgKyAKCQkJCSIgICAgICAgIFQgcztcbiIgKyAKCQkJCSIgICAgICAgIHMgPSB0ID0gYTtcbiIgKyAKCQkJCSIJCXJldHVybiB0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgWDxTdHJpbmc+KCkuZm9vKFwiU1VDQ0VTU1wiKSk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAzMSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQ+IHtcbiIgKyAKCQkJCSIgICAgVCB0O1xuIiArIAoJCQkJIiAgICBYKFQgdCkge1xuIiArIAoJCQkJIiAgICAgICAgdGhpcy50ID0gdDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBuZXcgWDxTdHJpbmc+KFwiT1VURVJcIikuYmFyKCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgdm9pZCBiYXIoKSB7XG4iICsgCgkJCQkiICAgICAgICBuZXcgWDxTdHJpbmc+KFwiSU5ORVJcIikge1xuIiArIAoJCQkJIiAgICAgICAgICAgIHZvaWQgcnVuKCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICBcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgbmV3IE9iamVjdCgpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgICAgIHZvaWQgcnVuKCkge1xuIiArIAoJCQkJIgkJICAgICAgICAgICAgICAgIFN0cmluZyBzID0gdCA9IFwiU1VDXCI7XG4iICsgCgkJCQkiCQkgICAgICAgICAgICAgICAgcyA9IHQrPSBcIkNFU1NcIjtcbiIgKyAKCQkJCSIJCQkJICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odCk7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgICAgICB9XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIH0ucnVuKCk7XG4iICsgCgkJCQkiICAgICAgICAgICAgfVxuIiArIAoJCQkJIiAgICAgICAgfS5ydW4oKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgLAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDMyKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VD4ge1xuIiArIAoJCQkJIiAgICBUIHQ7XG4iICsgCgkJCQkiICAgIFgoVCB0KSB7XG4iICsgCgkJCQkiICAgICAgICB0aGlzLnQgPSB0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBYPFN0cmluZz4oXCJPVVRFUlwiKS5iYXIoKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICB2b2lkIGJhcigpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBYPFN0cmluZz4oXCJJTk5FUlwiKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgdm9pZCBydW4oKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIFN0cmluZyBzID0gdCA9IFwiU1VDXCI7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIHMgPSB0Kz0gXCJDRVNTXCI7XG4iICsgCgkJCQkiCQkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0KTtcbiIgKyAKCQkJCSIgICAgICAgICAgICB9XG4iICsgCgkJCQkiICAgICAgICB9LnJ1bigpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiAsCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMzMoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8RSwgVD4ge1xuIiArIAoJCQkJIgl2b2lkIGZvbyhFIGUpe31cbiIgKyAKCQkJCSIJdm9pZCBmb28oVCB0KXt9XG4iICsgCgkJCQkifVxuIiAsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKCQkJIgl2b2lkIGZvbyhFIGUpe31cbiIgKyAKCQkJIgkgICAgIF5eXl5eXl5eXG4iICsgCgkJCSJNZXRob2QgZm9vKEUpIGhhcyB0aGUgc2FtZSBlcmFzdXJlIGZvbyhPYmplY3QpIGFzIGFub3RoZXIgbWV0aG9kIGluIHR5cGUgWDxFLFQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkJIgl2b2lkIGZvbyhUIHQpe31cbiIgKyAKCQkJIgkgICAgIF5eXl5eXl5eXG4iICsgCgkJCSJNZXRob2QgZm9vKFQpIGhhcyB0aGUgc2FtZSBlcmFzdXJlIGZvbyhPYmplY3QpIGFzIGFub3RoZXIgbWV0aG9kIGluIHR5cGUgWDxFLFQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJCglwdWJsaWMgdm9pZCB0ZXN0MDM0KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPEUgZXh0ZW5kcyBFeGNlcHRpb24sIFQgZXh0ZW5kcyBFeGNlcHRpb24+IHtcbiIgKyAKCQkJCSIJdm9pZCBmb28oRSBlKXt9XG4iICsgCgkJCQkiCXZvaWQgZm9vKFQgdCl7fVxuIiArIAoJCQkJIn1cbiIgLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDIpXG4iICsgCgkJCSIJdm9pZCBmb28oRSBlKXt9XG4iICsgCgkJCSIJICAgICBeXl5eXl5eXlxuIiArIAoJCQkiTWV0aG9kIGZvbyhFKSBoYXMgdGhlIHNhbWUgZXJhc3VyZSBmb28oRXhjZXB0aW9uKSBhcyBhbm90aGVyIG1ldGhvZCBpbiB0eXBlIFg8RSxUPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJdm9pZCBmb28oVCB0KXt9XG4iICsgCgkJCSIJICAgICBeXl5eXl5eXlxuIiArIAoJCQkiTWV0aG9kIGZvbyhUKSBoYXMgdGhlIHNhbWUgZXJhc3VyZSBmb28oRXhjZXB0aW9uKSBhcyBhbm90aGVyIG1ldGhvZCBpbiB0eXBlIFg8RSxUPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQoJCglwdWJsaWMgdm9pZCB0ZXN0MDM1KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPEUgZXh0ZW5kcyBFeGNlcHRpb24sIFQgZXh0ZW5kcyBUaHJlYWQ+IHtcbiIgKyAKCQkJCSIJdm9pZCBmb28oRSBlLCBUaHJlYWQgdCl7fVxuIiArIAoJCQkJIgl2b2lkIGZvbyhFeGNlcHRpb24gZSwgVCB0KXt9XG4iICsgCgkJCQkifVxuIiAsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKCQkJIgl2b2lkIGZvbyhFIGUsIFRocmVhZCB0KXt9XG4iICsgCgkJCSIJICAgICBeXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIk1ldGhvZCBmb28oRSwgVGhyZWFkKSBoYXMgdGhlIHNhbWUgZXJhc3VyZSBmb28oRXhjZXB0aW9uLCBUaHJlYWQpIGFzIGFub3RoZXIgbWV0aG9kIGluIHR5cGUgWDxFLFQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkJIgl2b2lkIGZvbyhFeGNlcHRpb24gZSwgVCB0KXt9XG4iICsgCgkJCSIJICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIk1ldGhvZCBmb28oRXhjZXB0aW9uLCBUKSBoYXMgdGhlIHNhbWUgZXJhc3VyZSBmb28oRXhjZXB0aW9uLCBUaHJlYWQpIGFzIGFub3RoZXIgbWV0aG9kIGluIHR5cGUgWDxFLFQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCgkKCXB1YmxpYyB2b2lkIHRlc3QwMzYoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxFIGV4dGVuZHMgRXhjZXB0aW9uLCBUIGV4dGVuZHMgVGhyZWFkPiB7XG4iICsgCgkJCQkiCXZvaWQgZm9vKEUgZSl7fVxuIiArIAoJCQkJIgl2b2lkIGZvbyhUIHQpe31cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCQkKCQkJCQoJcHVibGljIHZvaWQgdGVzdDAzNygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPEUgZXh0ZW5kcyBDbG9uZWFibGUsIFQgZXh0ZW5kcyBUaHJlYWQgJiBDbG9uZWFibGU+IHtcbiIgKyAKCQkJCSIJdm9pZCBmb28oRSBlKXt9XG4iICsgCgkJCQkiCXZvaWQgZm9vKFQgdCl7fVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQkgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgLAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkKCQoJcHVibGljIHZvaWQgdGVzdDAzOCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxFIGV4dGVuZHMgQ2xvbmVhYmxlLCBUIGV4dGVuZHMgVGhyZWFkICYgQ2xvbmVhYmxlPiB7XG4iICsgCgkJCQkiCXZvaWQgZm9vKEUgZSl7fVxuIiArIAoJCQkJIgl2b2lkIGZvbyhUIHQpe31cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJWDxYWSxYWT4geCA9IG5ldyBYPFhZLCBYWT4oKTtcbiIgKyAKCQkJCSIJCXguZm9vKG5ldyBYWSgpKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBYWSBleHRlbmRzIFRocmVhZCBpbXBsZW1lbnRzIENsb25lYWJsZSB7XG4iICsgCgkJCQkifVxuIiAsCgkJCX0sCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJeC5mb28obmV3IFhZKCkpO1xuIiArIAoJCQkiCSAgXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGZvbyhYWSkgaXMgYW1iaWd1b3VzIGZvciB0aGUgdHlwZSBYPFhZLFhZPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgoJcHVibGljIHZvaWQgdGVzdDAzOSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxFIGV4dGVuZHMgQ2xvbmVhYmxlLCBUIGV4dGVuZHMgVGhyZWFkPiB7XG4iICsgCgkJCQkiCXZvaWQgZm9vKEw8RT4gbDEpe31cbiIgKyAKCQkJCSIJdm9pZCBmb28oTDxUPiBsMil7fVxuIiArIAoJCQkJIgl2b2lkIGZvbyhMIGwpe31cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgTDxFPiB7XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyKVxuIiArIAoJCQkiCXZvaWQgZm9vKEw8RT4gbDEpe31cbiIgKyAKCQkJIgkgICAgIF5eXl5eXl5eXl5eXlxuIiArIAoJCQkiTWV0aG9kIGZvbyhMPEU+KSBoYXMgdGhlIHNhbWUgZXJhc3VyZSBmb28oTDxFPikgYXMgYW5vdGhlciBtZXRob2QgaW4gdHlwZSBYPEUsVD5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCXZvaWQgZm9vKEw8VD4gbDIpe31cbiIgKyAKCQkJIgkgICAgIF5eXl5eXl5eXl5eXlxuIiArIAoJCQkiTWV0aG9kIGZvbyhMPFQ+KSBoYXMgdGhlIHNhbWUgZXJhc3VyZSBmb28oTDxFPikgYXMgYW5vdGhlciBtZXRob2QgaW4gdHlwZSBYPEUsVD5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCXZvaWQgZm9vKEwgbCl7fVxuIiArIAoJCQkiCSAgICAgXl5eXl5eXl5cbiIgKyAKCQkJIkR1cGxpY2F0ZSBtZXRob2QgZm9vKEwpIGluIHR5cGUgWDxFLFQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDA0MCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBYPiB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH0gICAgXG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCgkKCXB1YmxpYyB2b2lkIHRlc3QwNDEoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxULCBVIGV4dGVuZHMgVD4ge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9ICAgIFxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CQoJCglwdWJsaWMgdm9pZCB0ZXN0MDQyKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBVLCBVPiB7XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYIDxUIGV4dGVuZHMgVSwgVT4ge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICBeXG4iICsgCgkJCSJJbGxlZ2FsIGZvcndhcmQgcmVmZXJlbmNlIHRvIHR5cGUgcGFyYW1ldGVyIFVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkKCQoJcHVibGljIHZvaWQgdGVzdDA0MygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBMPFQ+ICwgVSBleHRlbmRzIFQ+IHtcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKwoJCQkJImNsYXNzIEw8RT57fVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCgkKCXB1YmxpYyB2b2lkIHRlc3QwNDQoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgTDxYPiB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH0gICAgXG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEw8RT4ge31cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CQoJCglwdWJsaWMgdm9pZCB0ZXN0MDQ1KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgWjxUPiB2YXI7XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyKVxuIiArIAoJCQkiCXB1YmxpYyBaPFQ+IHZhcjtcbiIgKyAKCQkJIgkgICAgICAgXlxuIiArIAoJCQkiWiBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCXB1YmxpYyB2b2lkIHRlc3QwNDYoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBPYmplY3Q8VD4gdmFyO1xuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKCQkJIglwdWJsaWMgT2JqZWN0PFQ+IHZhcjtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlQgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MDQ3KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQ+IHtcbiIgKyAKCQkJCSIgICAgcHJpdmF0ZSBUIHQ7XG4iICsgCgkJCQkiICAgIFgoVCB0KSB7XG4iICsgCgkJCQkiICAgICAgICB0aGlzLnQgPSB0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBYPFN0cmluZz4oXCJPVVRFUlwiKS5iYXIoKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICB2b2lkIGJhcigpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBNWDxTdHJpbmc+KFwiSU5ORVJcIikge1xuIiArIAoJCQkJIiAgICAgICAgICAgIHZvaWQgcnVuKCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICBcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgbmV3IE9iamVjdCgpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgICAgIHZvaWQgcnVuKCkge1xuIiArIAoJCQkJIgkJICAgICAgICAgICAgICAgIFN0cmluZyBzID0gdCA9IFwiU1VDXCI7XG4iICsgCgkJCQkiCQkgICAgICAgICAgICAgICAgcyA9IHQrPSBcIkNFU1NcIjtcbiIgKyAKCQkJCSIJCQkJICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odCk7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgICAgICB9XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIH0ucnVuKCk7XG4iICsgCgkJCQkiICAgICAgICAgICAgfVxuIiArIAoJCQkJIiAgICAgICAgfS5ydW4oKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBNWDxVPiB7XG4iICsgCgkJCQkiICAgIE1YKFUgdSl7fVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTUpXG4iICsgCgkJCSIJU3RyaW5nIHMgPSB0ID0gXCJTVUNcIjtcbiIgKyAKCQkJIgkgICAgICAgXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBUIHRvIFN0cmluZ1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDE1KVxuIiArIAoJCQkiCVN0cmluZyBzID0gdCA9IFwiU1VDXCI7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgXl5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gU3RyaW5nIHRvIFRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxNilcbiIgKyAKCQkJIglzID0gdCs9IFwiQ0VTU1wiO1xuIiArIAoJCQkiCSAgICBeXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgb3BlcmF0b3IgKz0gaXMgdW5kZWZpbmVkIGZvciB0aGUgYXJndW1lbnQgdHlwZShzKSBULCBTdHJpbmdcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy8gQWNjZXNzIHRvIGVuY2xvc2luZyAndCcgb2YgdHlwZSAnVCcgKG5vdCBzdWJzdGl0dXRlZCBmcm9tIFg8WD4gYXMgcHJpdmF0ZSB0aHVzIG5vbiBpbmhlcml0ZWQpCgkvLyBqYXZhYyBmaW5kcyBubyBlcnJvci93YXJuaW5nIG9uIHRoaXMgdGVzdCBidXQgaXQgc2hvdWxkCglwdWJsaWMgdm9pZCB0ZXN0MDQ4KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQ+IHtcbiIgKyAKCQkJCSIgICAgcHJpdmF0ZSBUIHQ7XG4iICsgCgkJCQkiICAgIFgoVCB0KSB7XG4iICsgCgkJCQkiICAgICAgICB0aGlzLnQgPSB0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBYPFN0cmluZz4oXCJPVVRFUlwiKS5iYXIoKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICB2b2lkIGJhcigpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBYPFg+KHRoaXMpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICB2b2lkIHJ1bigpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgbmV3IE9iamVjdCgpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgICAgIHZvaWQgcnVuKCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICAgICAgICAgIFggeCA9IHQ7XG4iICsgCgkJCQkiCQkJCSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHgpO1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICAgICAgfVxuIiArIAoJCQkJIiAgICAgICAgICAgICAgICB9LnJ1bigpO1xuIiArIAoJCQkJIiAgICAgICAgICAgIH1cbiIgKyAKCQkJCSIgICAgICAgIH0ucnVuKCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDE0KVxuIiArIAoJCQkiCVggeCA9IHQ7XG4iICsgCgkJCSIJICBeXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFQgdG8gWFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MDQ5KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VD4ge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgVCB0O1xuIiArIAoJCQkJIiAgICBYKFQgdCkge1xuIiArIAoJCQkJIiAgICAgICAgdGhpcy50ID0gdDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBuZXcgWDxTdHJpbmc+KFwiT1VURVJcIikuYmFyKCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgdm9pZCBiYXIoKSB7XG4iICsgCgkJCQkiICAgICAgICBuZXcgWDxYPih0aGlzKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgdm9pZCBydW4oKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIG5ldyBPYmplY3QoKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgICAgICB2b2lkIHJ1bigpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgICAgICAgICBYIHggPSB0O1xuIiArIAoJCQkJIgkJCQkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgICAgICB9XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIH0ucnVuKCk7XG4iICsgCgkJCQkiICAgICAgICAgICAgfVxuIiArIAoJCQkJIiAgICAgICAgfS5ydW4oKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MDUwKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBOPiB7XG4iICsKCQkJCSIJc3RhdGljIGNsYXNzIE4ge30iICsKCQkJCSJ9XG4iICsKCQkJCSJjbGFzcyBZIDxUIGV4dGVuZHMgWS5OPiB7XG4iICsKCQkJCSIJc3RhdGljIGNsYXNzIE4ge30iICsKCQkJCSJ9XG4iIAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBOPiB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICBeXG4iICsgCgkJCSJOIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiY2xhc3MgU3VwZXIge2NsYXNzIE0ge319XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBNPiBleHRlbmRzIFN1cGVyIHt9XG4iICsKCQkJCSJjbGFzcyBZIDxUIGV4dGVuZHMgWS5NPiBleHRlbmRzIFN1cGVyIHt9XG4iLCAKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYIDxUIGV4dGVuZHMgTT4gZXh0ZW5kcyBTdXBlciB7fVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgXlxuIiArIAoJCQkiTSBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk4NTA0CglwdWJsaWMgdm9pZCB0ZXN0MDUwYSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIgljbGFzcyBNIGV4dGVuZHMgWSBpbXBsZW1lbnRzIEkge31cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWSB7XG4iICsgCgkJCQkiCXN0YXRpYyBpbnRlcmZhY2UgSSB7IHZvaWQgZm9vKCk7IH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiaW50ZXJmYWNlIEkge31cbiIKCQkJfSwKCQkJIiIpOwoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiVGVzdC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgVGVzdDxUIGV4dGVuZHMgVGVzdC5Jbm5lclRlc3Q+IGltcGxlbWVudHMgQmFzZTxUPiB7XG4iICsKCQkJCSIJc3RhdGljIGNsYXNzIElubmVyVGVzdCBpbXBsZW1lbnRzIElubmVyIHt9XG4iICsgCgkJCQkifVxuIisKCQkJCSJpbnRlcmZhY2UgQmFzZTxUPiB7XG4iICsgCgkJCQkiCWludGVyZmFjZSBJbm5lciB7fVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIiIpOwoJfQoJcHVibGljIHZvaWQgdGVzdDA1MSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiY2xhc3MgU3VwZXIge2NsYXNzIE0ge319XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBTdXBlciB7XG4iICsgCgkJCQkiCWNsYXNzIE4gPFQgZXh0ZW5kcyBNPiB7fVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwgCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MDUyKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VD4gZXh0ZW5kcyBwLkE8VD4ge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwgCgkJCQkicC9BLmphdmEiLAoJCQkJInBhY2thZ2UgcDsgXG4iICsKCQkJCSJwdWJsaWMgY2xhc3MgQTxQPiB7XG4iICsgCgkJCQkifVxuIiwgCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MDUzKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VD4gZXh0ZW5kcyBwLkE8VD4ge1xuIiArIAoJCQkJIiAgICBwcm90ZWN0ZWQgVCB0O1xuIiArIAoJCQkJIiAgICBYKFQgdCkge1xuIiArIAoJCQkJIiAgICAgICAgdGhpcy50ID0gdDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBuZXcgWDxTdHJpbmc+KFwiT1VURVJcIikuYmFyKCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgdm9pZCBiYXIoKSB7XG4iICsgCgkJCQkiICAgICAgICBuZXcgWDxYPih0aGlzKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgdm9pZCBydW4oKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIG5ldyBPYmplY3QoKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgICAgICB2b2lkIHJ1bigpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgICAgICAgICBwcmludCh0KTtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgICAgIH1cbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgfS5ydW4oKTtcbiIgKyAKCQkJCSIgICAgICAgICAgICB9XG4iICsgCgkJCQkiICAgICAgICB9LnJ1bigpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwgCgkJCQkicC9BLmphdmEiLAoJCQkJInBhY2thZ2UgcDsgXG4iICsKCQkJCSJwdWJsaWMgY2xhc3MgQTxQPiB7XG4iICsgCgkJCQkiICAgIHByb3RlY3RlZCB2b2lkIHByaW50KFAgcCkge1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQoJcHVibGljIHZvaWQgdGVzdDA1NCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPiBleHRlbmRzIHAuQTxUPiB7XG4iICsgCgkJCQkiICAgIHByb3RlY3RlZCBUIHQ7XG4iICsgCgkJCQkiICAgIFgoVCB0KSB7XG4iICsgCgkJCQkiICAgICAgICB0aGlzLnQgPSB0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBYPFN0cmluZz4oXCJPVVRFUlwiKS5iYXIoKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICB2b2lkIGJhcigpIHtcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBYPFg+KHRoaXMpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICB2b2lkIHJ1bigpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgbmV3IE9iamVjdCgpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgICAgIHZvaWQgcnVuKCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KFgudGhpcy50KTtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgICAgIH1cbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgfS5ydW4oKTtcbiIgKyAKCQkJCSIgICAgICAgICAgICB9XG4iICsgCgkJCQkiICAgICAgICB9LnJ1bigpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwgCgkJCQkicC9BLmphdmEiLAoJCQkJInBhY2thZ2UgcDsgXG4iICsKCQkJCSJwdWJsaWMgY2xhc3MgQTxQPiB7XG4iICsgCgkJCQkiICAgIHByb3RlY3RlZCB2b2lkIHByaW50KFAgcCkge1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDE0KVxuIiArIAoJCQkiCXByaW50KFgudGhpcy50KTtcbiIgKyAKCQkJIgleXl5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCBwcmludChYKSBpbiB0aGUgdHlwZSBBPFg+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChUKVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgoJcHVibGljIHZvaWQgdGVzdDA1NSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQ+IGV4dGVuZHMgcC5BPFQ+IHtcbiIgKyAKCQkJCSIgICAgcHJvdGVjdGVkIFQgdDtcbiIgKyAKCQkJCSIgICAgWChUIHQpIHtcbiIgKyAKCQkJCSIgICAgICAgIHN1cGVyKHQpO1xuIiArIAoJCQkJIiAgICAgICAgdGhpcy50ID0gdDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCSAgWDxTdHJpbmc+IHhzID0gbmV3IFg8U3RyaW5nPihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiCSAgU3lzdGVtLm91dC5wcmludGxuKHhzLnQpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwgCgkJCQkicC9BLmphdmEiLAoJCQkJInBhY2thZ2UgcDsgXG4iICsKCQkJCSJwdWJsaWMgY2xhc3MgQTxQPiB7XG4iICsgCgkJCQkiCSBwcm90ZWN0ZWQgUCBwO1xuIiArCgkJCQkiICAgIHByb3RlY3RlZCBBKFAgcCkge1xuIiArCgkJCQkiICAgICAgIHRoaXMucCA9IHA7IFxuIiArCgkJCQkiICAgIH0gXG4iICsKCQkJCSIgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnQoUCBwKSB7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwgCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwNTYoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VD4gZXh0ZW5kcyBwLkE8VD4ge1xuIiArIAoJCQkJIiAgICBwcm90ZWN0ZWQgVCB0O1xuIiArIAoJCQkJIiAgICBYKFQgdCkge1xuIiArIAoJCQkJIiAgICAgICAgc3VwZXIodCk7XG4iICsgCgkJCQkiICAgICAgICB0aGlzLnQgPSB0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJICBYPFN0cmluZz4geHMgPSBuZXcgWDxTdHJpbmc+KFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIJICBTeXN0ZW0ub3V0LnByaW50bG4oKFgpeHMudCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iLCAKCQkJCSJwL0EuamF2YSIsCgkJCQkicGFja2FnZSBwOyBcbiIgKwoJCQkJInB1YmxpYyBjbGFzcyBBPFA+IHtcbiIgKyAKCQkJCSIJIHByb3RlY3RlZCBQIHA7XG4iICsKCQkJCSIgICAgcHJvdGVjdGVkIEEoUCBwKSB7XG4iICsKCQkJCSIgICAgICAgdGhpcy5wID0gcDsgXG4iICsKCQkJCSIgICAgfSBcbiIgKwoJCQkJIiAgICBwcm90ZWN0ZWQgdm9pZCBwcmludChQIHApIHtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iLCAKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA5KVxuIiArIAoJCQkiCVN5c3RlbS5vdXQucHJpbnRsbigoWCl4cy50KTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgXl5eXl5eXlxuIiArIAoJCQkiQ2Fubm90IGNhc3QgZnJvbSBTdHJpbmcgdG8gWFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBwXFxBLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglwcm90ZWN0ZWQgdm9pZCBwcmludChQIHApIHtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlRoZSBwYXJhbWV0ZXIgcCBpcyBoaWRpbmcgYSBmaWVsZCBmcm9tIHR5cGUgQTxQPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwNTcoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPiBleHRlbmRzIHAuQTxUPiB7XG4iICsgCgkJCQkiICAgIHByb3RlY3RlZCBUIHQ7XG4iICsgCgkJCQkiICAgIFgoVCB0KSB7XG4iICsgCgkJCQkiICAgICAgICBzdXBlcih0KTtcbiIgKyAKCQkJCSIgICAgICAgIHRoaXMudCA9IHQ7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkgIFg8WDxTdHJpbmc+PiB4cyA9IG5ldyBYPFg8U3RyaW5nPj4obmV3IFg8U3RyaW5nPihcIlNVQ0NFU1NcIikpO1xuIiArIAoJCQkJIgkgIFN5c3RlbS5vdXQucHJpbnRsbih4cy50LnQpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwgCgkJCQkicC9BLmphdmEiLAoJCQkJInBhY2thZ2UgcDsgXG4iICsKCQkJCSJwdWJsaWMgY2xhc3MgQTxQPiB7XG4iICsgCgkJCQkiCSBwcm90ZWN0ZWQgUCBwO1xuIiArCgkJCQkiICAgIHByb3RlY3RlZCBBKFAgcCkge1xuIiArCgkJCQkiICAgICAgIHRoaXMucCA9IHA7IFxuIiArCgkJCQkiICAgIH0gXG4iICsKCQkJCSIgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnQoUCBwKSB7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwgCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CgoJLy8gSlNSMTQtdjEwWzIuMSwyLjJdOiBWYWxpZCBtdWx0aXBsZSBwYXJhbWV0ZXIgdHlwZXMKCXB1YmxpYyB2b2lkIHRlc3QwNTgoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJ0ZXN0L1guamF2YSIsCgkJCQkicGFja2FnZSB0ZXN0O1xuIiArCgkJCQkJIi8vIFZhbGlkIFBhcmFtZXRlcml6ZWQgVHlwZSBEZWNsYXJhdGlvblxuIiArIAoJCQkJCSJwdWJsaWMgY2xhc3MgWDxBMSwgQTIsIEEzPiB7XG4iICsgCgkJCQkJIn1cbiIgKyAKCQkJCQkiLy8gVmFsaWQgVHlwZSBTeW50YXhcbiIgKyAKCQkJCQkiY2xhc3MgWSB7XG4iICsgCgkJCQkJIglYPFN0cmluZywgTnVtYmVyLCBJbnRlZ2VyPiB4O1xuIiArIAoJCQkJCSJ9XG4iCgkJCX0KCQkpOwoJfQoJLy8gSlNSMTQtdjEwWzIuMSwyLjJdOiBJbnZhbGlkIG11bHRpcGxlIHBhcmFtZXRlciB0eXBlczogbW9yZSBkZWNsYXJlZCB0aGFuIHJlZmVyZW5jZWQKCXB1YmxpYyB2b2lkIHRlc3QwNTkoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkidGVzdC9YLmphdmEiLAoJCQkJInBhY2thZ2UgdGVzdDtcbiIgKwoJCQkJCSIvLyBWYWxpZCBQYXJhbWV0ZXJpemVkIFR5cGUgRGVjbGFyYXRpb25cbiIgKyAKCQkJCQkicHVibGljIGNsYXNzIFg8QTEsIEEyLCBBMywgQTQ+IHtcbiIgKyAKCQkJCQkifVxuIiArIAoJCQkJCSIvLyBJbnZhbGlkIFZhbGlkIFR5cGUgU3ludGF4IChub3QgZW5vdWdoIHBhcmFtZXRlcnMpXG4iICsgCgkJCQkJImNsYXNzIFkge1xuIiArIAoJCQkJCSIJWDxTdHJpbmcsIE51bWJlciwgSW50ZWdlcj4geDtcbiIgKyAKCQkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkJIjEuIEVSUk9SIGluIHRlc3RcXFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkJIglYPFN0cmluZywgTnVtYmVyLCBJbnRlZ2VyPiB4O1xuIiArIAoJCQkJIgleXG4iICsgCgkJCQkiSW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMgZm9yIHR5cGUgWDxBMSxBMixBMyxBND47IGl0IGNhbm5vdCBiZSBwYXJhbWV0ZXJpemVkIHdpdGggYXJndW1lbnRzIDxTdHJpbmcsIE51bWJlciwgSW50ZWdlcj5cbiIgKyAKCQkJCSItLS0tLS0tLS0tXG4iCgkJKTsKCX0KCS8vIEpTUjE0LXYxMFsyLjEsMi4yXTogSW52YWxpZCBtdWx0aXBsZSBwYXJhbWV0ZXIgdHlwZXM6IG1vcmUgcmVmZXJlbmNlZCB0aGFuIGRlY2xhcmVkCglwdWJsaWMgdm9pZCB0ZXN0MDYwKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJInRlc3QvWC5qYXZhIiwKCQkJCSJwYWNrYWdlIHRlc3Q7XG4iICsKCQkJCQkiLy8gVmFsaWQgUGFyYW1ldGVyaXplZCBUeXBlIERlY2xhcmF0aW9uXG4iICsgCgkJCQkJInB1YmxpYyBjbGFzcyBYPEExLCBBMj4ge1xuIiArIAoJCQkJCSJ9XG4iICsgCgkJCQkJIi8vIEludmFsaWQgVmFsaWQgVHlwZSBTeW50YXggKHRvbyBtYW55IHBhcmFtZXRlcnMpXG4iICsgCgkJCQkJImNsYXNzIFkge1xuIiArIAoJCQkJCSIJWDxTdHJpbmcsIE51bWJlciwgSW50ZWdlcj4geDtcbiIgKyAKCQkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkJIjEuIEVSUk9SIGluIHRlc3RcXFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkJIglYPFN0cmluZywgTnVtYmVyLCBJbnRlZ2VyPiB4O1xuIiArIAoJCQkJIgleXG4iICsgCgkJCQkiSW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMgZm9yIHR5cGUgWDxBMSxBMj47IGl0IGNhbm5vdCBiZSBwYXJhbWV0ZXJpemVkIHdpdGggYXJndW1lbnRzIDxTdHJpbmcsIE51bWJlciwgSW50ZWdlcj5cbiIgKyAKCQkJCSItLS0tLS0tLS0tXG4iCgkJKTsKCX0KCS8vIEpTUjE0LXYxMFsyLjEsMi4yXTogSW52YWxpZCBtdWx0aXBsZSBwYXJhbWV0ZXIgdHlwZXM6IHByaW1pdGl2ZSB0eXBlcwoJcHVibGljIHZvaWQgdGVzdDA2MSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJ0ZXN0L1guamF2YSIsCgkJCQkicGFja2FnZSB0ZXN0O1xuIiArCgkJCQkJIi8vIFZhbGlkIFBhcmFtZXRlcml6ZWQgVHlwZSBEZWNsYXJhdGlvblxuIiArIAoJCQkJCSJwdWJsaWMgY2xhc3MgWDxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNz4ge1xuIiArIAoJCQkJCSJ9XG4iICsgCgkJCQkJIi8vIEludmFsaWQgVmFsaWQgVHlwZSBTeW50YXggKHByaW1pdGl2ZSBjYW5ub3QgYmUgcGFyYW1ldGVycylcbiIgKyAKCQkJCQkiY2xhc3MgWSB7XG4iICsgCgkJCQkJIglYPGludCwgc2hvcnQsIGxvbmcsIGZsb2F0LCBkb3VibGUsIGJvb2xlYW4sIGNoYXI+IHg7XG4iICsgCgkJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJCSIxLiBFUlJPUiBpbiB0ZXN0XFxYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJCSIJWDxpbnQsIHNob3J0LCBsb25nLCBmbG9hdCwgZG91YmxlLCBib29sZWFuLCBjaGFyPiB4O1xuIiArIAoJCQkJIgkgIF5eXlxuIiArIAoJCQkJIlN5bnRheCBlcnJvciBvbiB0b2tlbiBcImludFwiLCBEaW1lbnNpb25zIGV4cGVjdGVkIGFmdGVyIHRoaXMgdG9rZW5cbiIgKyAKCQkJCSItLS0tLS0tLS0tXG4iICsgCgkJCQkiMi4gRVJST1IgaW4gdGVzdFxcWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJCQkiCVg8aW50LCBzaG9ydCwgbG9uZywgZmxvYXQsIGRvdWJsZSwgYm9vbGVhbiwgY2hhcj4geDtcbiIgKyAKCQkJCSIJICAgICAgIF5eXl5eXG4iICsgCgkJCQkiU3ludGF4IGVycm9yIG9uIHRva2VuIFwic2hvcnRcIiwgRGltZW5zaW9ucyBleHBlY3RlZCBhZnRlciB0aGlzIHRva2VuXG4iICsgCgkJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkJIjMuIEVSUk9SIGluIHRlc3RcXFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkJIglYPGludCwgc2hvcnQsIGxvbmcsIGZsb2F0LCBkb3VibGUsIGJvb2xlYW4sIGNoYXI+IHg7XG4iICsgCgkJCQkiCSAgICAgICAgICAgICAgXl5eXlxuIiArIAoJCQkJIlN5bnRheCBlcnJvciBvbiB0b2tlbiBcImxvbmdcIiwgRGltZW5zaW9ucyBleHBlY3RlZCBhZnRlciB0aGlzIHRva2VuXG4iICsgCgkJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkJIjQuIEVSUk9SIGluIHRlc3RcXFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkJIglYPGludCwgc2hvcnQsIGxvbmcsIGZsb2F0LCBkb3VibGUsIGJvb2xlYW4sIGNoYXI+IHg7XG4iICsgCgkJCQkiCSAgICAgICAgICAgICAgICAgICAgXl5eXl5cbiIgKyAKCQkJCSJTeW50YXggZXJyb3Igb24gdG9rZW4gXCJmbG9hdFwiLCBEaW1lbnNpb25zIGV4cGVjdGVkIGFmdGVyIHRoaXMgdG9rZW5cbiIgKyAKCQkJCSItLS0tLS0tLS0tXG4iICsgCgkJCQkiNS4gRVJST1IgaW4gdGVzdFxcWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJCQkiCVg8aW50LCBzaG9ydCwgbG9uZywgZmxvYXQsIGRvdWJsZSwgYm9vbGVhbiwgY2hhcj4geDtcbiIgKyAKCQkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXG4iICsgCgkJCQkiU3ludGF4IGVycm9yIG9uIHRva2VuIFwiZG91YmxlXCIsIERpbWVuc2lvbnMgZXhwZWN0ZWQgYWZ0ZXIgdGhpcyB0b2tlblxuIiArIAoJCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJCSI2LiBFUlJPUiBpbiB0ZXN0XFxYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJCSIJWDxpbnQsIHNob3J0LCBsb25nLCBmbG9hdCwgZG91YmxlLCBib29sZWFuLCBjaGFyPiB4O1xuIiArIAoJCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5cbiIgKyAKCQkJCSJTeW50YXggZXJyb3Igb24gdG9rZW4gXCJib29sZWFuXCIsIERpbWVuc2lvbnMgZXhwZWN0ZWQgYWZ0ZXIgdGhpcyB0b2tlblxuIiArIAoJCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJCSI3LiBFUlJPUiBpbiB0ZXN0XFxYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJCSIJWDxpbnQsIHNob3J0LCBsb25nLCBmbG9hdCwgZG91YmxlLCBib29sZWFuLCBjaGFyPiB4O1xuIiArIAoJCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5cbiIgKyAKCQkJCSJTeW50YXggZXJyb3Igb24gdG9rZW4gXCJjaGFyXCIsIERpbWVuc2lvbnMgZXhwZWN0ZWQgYWZ0ZXIgdGhpcyB0b2tlblxuIiArIAoJCQkJIi0tLS0tLS0tLS1cbiIKCQkpOwoJfQoJLy8gSlNSMTQtdjEwWzIuMSwyLjJdOiBWYWxpZCBtdWx0aXBsZSBwYXJhbWV0ZXIgdHlwZXM6IHByaW1pdGl2ZSB0eXBlIGFycmF5cwoJcHVibGljIHZvaWQgdGVzdDA2MigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJInRlc3QvWC5qYXZhIiwKCQkJCSJwYWNrYWdlIHRlc3Q7XG4iICsKCQkJCQkiLy8gVmFsaWQgUGFyYW1ldGVyaXplZCBUeXBlIERlY2xhcmF0aW9uXG4iICsgCgkJCQkJInB1YmxpYyBjbGFzcyBYPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOD4ge1xuIiArIAoJCQkJCSJ9XG4iICsgCgkJCQkJIi8vIFZhbGlkIFR5cGUgU3ludGF4XG4iICsgCgkJCQkJImNsYXNzIFkge1xuIiArIAoJCQkJCSIJWDxpbnRbXSwgc2hvcnRbXVtdLCBsb25nW11bXVtdLCBmbG9hdFtdW11bXVtdLCBkb3VibGVbXVtdW11bXVtdLCBib29sZWFuW11bXVtdW11bXVtdLCBjaGFyW11bXVtdW11bXVtdW10sIE9iamVjdFtdW11bXVtdW11bXVtdW11bXT4geDtcbiIgKyAKCQkJCQkifVxuIgoJCQl9LAoJCQkiIgoJCSk7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MDYzKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD4gZXh0ZW5kcyBwLkE8VD4ge1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgWChUIHQpIHtcbiIgKyAKCQkJCSIgICAgICAgIHN1cGVyKHQpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIFggeCA9IG5ldyBYKGFyZ3MpO1xuIiArIAoJCQkJIiAgICAgICAgWDxTdHJpbmc+IHhzID0gbmV3IFg8U3RyaW5nPihhcmdzKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsIAoJCQkJInAvQS5qYXZhIiwKCQkJCSJwYWNrYWdlIHA7IFxuIiArCgkJCQkicHVibGljIGNsYXNzIEE8UD4ge1xuIiArIAoJCQkJIgkgcHJvdGVjdGVkIFAgcDtcbiIgKwoJCQkJIiAgICBwcm90ZWN0ZWQgQShQIHApIHtcbiIgKwoJCQkJIiAgICAgICB0aGlzLnAgPSBwOyBcbiIgKwoJCQkJIiAgICB9IFxuIiArCgkJCQkiICAgIHByb3RlY3RlZCB2b2lkIHByaW50KFAgcCkge1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiK3ApO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwgCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCVggeCA9IG5ldyBYKGFyZ3MpO1xuIiArIAoJCQkiCSAgICAgIF5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNvbnN0cnVjdG9yIFgoT2JqZWN0KSBiZWxvbmdzIHRvIHRoZSByYXcgdHlwZSBYLiBSZWZlcmVuY2VzIHRvIGdlbmVyaWMgdHlwZSBYPFQ+IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIglYPFN0cmluZz4geHMgPSBuZXcgWDxTdHJpbmc+KGFyZ3MpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlRoZSBjb25zdHJ1Y3RvciBYPFN0cmluZz4oU3RyaW5nW10pIGlzIHVuZGVmaW5lZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBwXFxBLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglwcm90ZWN0ZWQgdm9pZCBwcmludChQIHApIHtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlRoZSBwYXJhbWV0ZXIgcCBpcyBoaWRpbmcgYSBmaWVsZCBmcm9tIHR5cGUgQTxQPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvLyByYXcgdHlwZTogdmFyaWFibGUgbWFwIHRvIGl0cyBzdHJpY3QgZXJhc3VyZSAKCXB1YmxpYyB2b2lkIHRlc3QwNjQoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUIGV4dGVuZHMgRXhjZXB0aW9uICYgSVg+IHtcbiIgKyAKCQkJCSIgICAgVCB0O1xuIiArIAoJCQkJIiAgICB2b2lkIGJhcihUIHQpIHtcbiIgKyAKCQkJCSIgICAgICAgIHQuZ2V0TWVzc2FnZSgpO1xuIiArIAoJCQkJIiAgICAgICAgdC5mb28oKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlYIHggPSBuZXcgWCgpO1xuIiArIC8vIHJhdyB0eXBlCgkJCQkiCQl4LnQuZ2V0TWVzc2FnZSgpO1xuIiArIC8vIFQgaXMgc3RyaWN0bHkgZXhjZXB0aW9uICEKCQkJCSIJCXgudC5mb28oKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJpbnRlcmZhY2UgSVgge1xuIiArIAoJCQkJIiAgICB2b2lkIGZvbygpO1xuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJIgl2b2lkIGJhcihUIHQpIHtcbiIgKyAKCQkiCSAgICAgICAgICAgXlxuIiArIAoJCSJUaGUgcGFyYW1ldGVyIHQgaXMgaGlkaW5nIGEgZmllbGQgZnJvbSB0eXBlIFg8VD5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTApXG4iICsgCgkJIgl4LnQuZm9vKCk7XG4iICsgCgkJIgkgICAgXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgZm9vKCkgaXMgdW5kZWZpbmVkIGZvciB0aGUgdHlwZSBFeGNlcHRpb25cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvLyByYXcgdHlwZTogYXNzaWdubWVudHMgCglwdWJsaWMgdm9pZCB0ZXN0MDY1KCkgewoJCU1hcCBjdXN0b21PcHRpb25zID0gZ2V0Q29tcGlsZXJPcHRpb25zKCk7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWDxUIGV4dGVuZHMgRXhjZXB0aW9uPiB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCVggeCA9IG5ldyBYKCk7XG4iICsgCgkJCQkiCQlYPElPRXhjZXB0aW9uPiB4aW9lID0gbmV3IFg8SU9FeGNlcHRpb24+KCk7IC8vIG9rXG4iICsgCgkJCQkiCQlcbiIgKyAKCQkJCSIJCVggeDIgPSB4aW9lO1xuIiArIAoJCQkJIgkJWDxJT0V4Y2VwdGlvbj4geGlvZTIgPSB4OyAvLyB1bnNhZmVcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTApXG4iICsgCgkJCSIJWDxJT0V4Y2VwdGlvbj4geGlvZTIgPSB4OyAvLyB1bnNhZmVcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIFggbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBYPElPRXhjZXB0aW9uPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiwKCQkJbnVsbCwKCQkJdHJ1ZSwKCQkJY3VzdG9tT3B0aW9ucyk7Cgl9CgoJLy8gSlNSMTQtdjEwWzIuMSwyLjJdOiBJbnZhbGlkIFBUIGRlY2xhcmF0aW9uIChtaXggd2l0aCByZWZlcmVuY2UpCglwdWJsaWMgdm9pZCB0ZXN0MDY2KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJInRlc3QvWDEuamF2YSIsCgkJCQkicGFja2FnZSB0ZXN0O1xuIiArCgkJCQkiLy8gVmFsaWQgQ29uc2VjdXRpdmUgUGFyYW1ldGVyaXplZCBUeXBlIERlY2xhcmF0aW9uXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgxPEExIGV4dGVuZHMgWDI8QTI+PiB7XG4iICsgCgkJCQkiCUExIGExO1xuIiArCgkJCQkifVxuIiArIAoJCQkJIi8vIFZhbGlkIFBhcmFtZXRlcml6ZWQgVHlwZSBEZWNsYXJhdGlvblxuIiArIAoJCQkJImNsYXNzIFgyPEEyPntcbiIgKyAKCQkJCSIJQTIgYTI7XG4iICsKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiB0ZXN0XFxYMS5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFgxPEExIGV4dGVuZHMgWDI8QTI+PiB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5cbiIgKyAKCQkJIkEyIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIKCQkpOwoJfQoKCS8vIEpTUjE0LXYxMFsyLjEsMi4yXTogSW52YWxpZCBQVCBkZWNsYXJhdGlvbiAobWl4IHdpdGggcmVmZXJlbmNlKQoJcHVibGljIHZvaWQgdGVzdDA2NygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJ0ZXN0L1gxLmphdmEiLAoJCQkJInBhY2thZ2UgdGVzdDtcbiIgKwoJCQkJIi8vIFZhbGlkIENvbnNlY3V0aXZlIFBhcmFtZXRlcml6ZWQgVHlwZSBEZWNsYXJhdGlvblxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYMTwgQTEgZXh0ZW5kcyBYMgk8CUEyCT4gICAgIAkJCT4ge1xuIiArIAoJCQkJIglBMSBhMTtcbiIgKwoJCQkJIn1cbiIgKyAKCQkJCSIvLyBWYWxpZCBQYXJhbWV0ZXJpemVkIFR5cGUgRGVjbGFyYXRpb25cbiIgKyAKCQkJCSJjbGFzcyBYMjxBMj57XG4iICsgCgkJCQkiCUEyIGEyO1xuIiArCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gdGVzdFxcWDEuamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYMTwgQTEgZXh0ZW5kcyBYMgk8CUEyCT4gICAgIAkJCT4ge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgCV5eXG4iICsgCgkJCSJBMiBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iCgkJKTsKCX0KCgkvLyBKU1IxNC1WMTBbMi40XTogTm90IHRlcm1pbmF0ZWQgY29uc2VjdXRpdmUgZGVjbGFyYXRpb24KCS8vIFRPRE8gKGRhdmlkKSBkaWFnbm9zaXMgbWVzc2FnZSBvbiBlcnJvciAzIHNvdW5kcyBzdHJhbmdlLCBkb2Vzbid0IGl0PwoJcHVibGljIHZvaWQgdGVzdDA2OCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJ0ZXN0L1gxLmphdmEiLAoJCQkJInBhY2thZ2UgdGVzdDtcbiIgKwoJCQkJIi8vIEludmFsaWQgQ29uc2VjdXRpdmUgUGFyYW1ldGVyaXplZCBUeXBlIERlY2xhcmF0aW9uXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgxPEExIGV4dGVuZHMgWDI8QTI+IHtcbiIgKyAKCQkJCSIJQTEgYTE7XG4iICsKCQkJCSJ9XG4iICsgCgkJCQkiLy8gSW52YWxpZCBQYXJhbWV0ZXJpemVkIFR5cGUgRGVjbGFyYXRpb25cbiIgKyAKCQkJCSJjbGFzcyBYMjxBMiB7XG4iICsgCgkJCQkiCUEyIGEyO1xuIiArCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gdGVzdFxcWDEuamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYMTxBMSBleHRlbmRzIFgyPEEyPiB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5cbiIgKyAKCQkJIkEyIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIHRlc3RcXFgxLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkJIglwdWJsaWMgY2xhc3MgWDE8QTEgZXh0ZW5kcyBYMjxBMj4ge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXlxuIiArIAoJCQkiU3ludGF4IGVycm9yLCBpbnNlcnQgXCI+XCIgdG8gY29tcGxldGUgUmVmZXJlbmNlVHlwZTFcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIHRlc3RcXFgxLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIgljbGFzcyBYMjxBMiB7XG4iICsgCgkJCSIJICAgICAgICAgXl5cbiIgKyAKCQkJIlN5bnRheCBlcnJvciBvbiB0b2tlbiBcIkEyXCIsID4gZXhwZWN0ZWQgYWZ0ZXIgdGhpcyB0b2tlblxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIgoJCSk7Cgl9CgoJLy8gSlNSMTQtVjEwWzIuNF06IE5vdCB0ZXJtaW5hdGVkIGNvbnNlY3V0aXZlIGRlY2xhcmF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0MDY5KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJInRlc3QvWDEuamF2YSIsCgkJCQkicGFja2FnZSB0ZXN0O1xuIiArCgkJCQkiLy8gSW52YWxpZCBDb25zZWN1dGl2ZSBQYXJhbWV0ZXJpemVkIFR5cGUgRGVjbGFyYXRpb25cbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWDE8QTEgZXh0ZW5kcyBYMjxBMiB7XG4iICsgCgkJCQkiCUExIGExO1xuIiArCgkJCQkifVxuIiArIAoJCQkJIi8vIEludmFsaWQgUGFyYW1ldGVyaXplZCBUeXBlIERlY2xhcmF0aW9uXG4iICsgCgkJCQkiY2xhc3MgWDI8QTI+IHtcbiIgKyAKCQkJCSIJQTIgYTI7XG4iICsKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiB0ZXN0XFxYMS5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFgxPEExIGV4dGVuZHMgWDI8QTIge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXG4iICsgCgkJCSJTeW50YXggZXJyb3IsIGluc2VydCBcIj4+XCIgdG8gY29tcGxldGUgUmVmZXJlbmNlVHlwZTJcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIKCQkpOwoJfQoKCS8vIEpTUjE0LXYxMFsyLjRdOiBVbmV4cGVjdGVkIGNvbnNlY3V0aXZlIFBUIGRlY2xhcmF0aW9uIChyaWdodC1zaGlmdCBzeW1ib2wpCgkvLyBUT0RPIChkYXZpZCkgc3Vycm91bmQgZXhwZWN0ZWQgdG9rZW4gd2l0aCAoZG91YmxlLSlxdW90ZXMKCXB1YmxpYyB2b2lkIHRlc3QwNzAoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkidGVzdC9YMS5qYXZhIiwKCQkJCSJwYWNrYWdlIHRlc3Q7XG4iICsKCQkJCSIvLyBJbnZhbGlkIENvbnNlY3V0aXZlIFBhcmFtZXRlcml6ZWQgVHlwZSBEZWNsYXJhdGlvblxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYMTxBMT4+IHtcbiIgKyAKCQkJCSIJQTEgYTE7XG4iICsKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiB0ZXN0XFxYMS5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFgxPEExPj4ge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgIF5eXG4iICsgCgkJCSJTeW50YXggZXJyb3Igb24gdG9rZW4gXCI+PlwiLCA+IGV4cGVjdGVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iCgkJKTsKCX0KCgkvLyBKU1IxNC12MTBbMi4xLDIuMl06IFVuZXhwZWN0ZWQgY29uc2VjdXRpdmUgUFQgZGVjbGFyYXRpb24gKHdpdGggc3BhY2VzKQoJcHVibGljIHZvaWQgdGVzdDA3MSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJ0ZXN0L1gxLmphdmEiLAoJCQkJInBhY2thZ2UgdGVzdDtcbiIgKwoJCQkJIi8vIEludmFsaWQgQ29uc2VjdXRpdmUgUGFyYW1ldGVyaXplZCBUeXBlIERlY2xhcmF0aW9uXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgxIDwgQTEgPiA+IHtcbiIgKyAKCQkJCSIJQTEgYTE7XG4iICsKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiB0ZXN0XFxYMS5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFgxIDwgQTEgPiA+IHtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlN5bnRheCBlcnJvciBvbiB0b2tlbiBcIj5cIiwgZGVsZXRlIHRoaXMgdG9rZW5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIKCQkpOwoJfQoKCS8vIEpTUjE0LXYxMFsyLjRdOiBVbmV4cGVjdGVkIGNvbnNlY3V0aXZlIFBUIGRlY2xhcmF0aW9uICh1bmFyeSByaWdodC1zaGlmdCBzeW1ib2wpCgkvLyBUT0RPIChkYXZpZCkgc3Vycm91bmQgZXhwZWN0ZWQgdG9rZW4gd2l0aCAoZG91YmxlLSlxdW90ZXMKCXB1YmxpYyB2b2lkIHRlc3QwNzIoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkidGVzdC9YMS5qYXZhIiwKCQkJCSJwYWNrYWdlIHRlc3Q7XG4iICsKCQkJCSIvLyBJbnZhbGlkIENvbnNlY3V0aXZlIFBhcmFtZXRlcml6ZWQgVHlwZSBEZWNsYXJhdGlvblxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYMTxBMT4+PiB7XG4iICsgCgkJCQkiCUExIGExO1xuIiArCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gdGVzdFxcWDEuamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYMTxBMT4+PiB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgXl5eXG4iICsgCgkJCSJTeW50YXggZXJyb3Igb24gdG9rZW4gXCI+Pj5cIiwgPiBleHBlY3RlZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIgoJCSk7Cgl9CgoJLy8gSlNSMTQtdjEwWzIuNF06IFVuZXhwZWN0ZWQgY29uc2VjdXRpdmUgUFQgZGVjbGFyYXRpb24gKHJpZ2h0LXNoaWZ0IHN5bWJvbCkKCS8vIFRPRE8gKGRhdmlkKSBzdXJyb3VuZCBleHBlY3RlZCB0b2tlbiB3aXRoIChkb3VibGUtKXF1b3RlcwoJcHVibGljIHZvaWQgdGVzdDA3MygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJ0ZXN0L1gxLmphdmEiLAoJCQkJInBhY2thZ2UgdGVzdDtcbiIgKwoJCQkJIi8vIEludmFsaWQgQ29uc2VjdXRpdmUgUGFyYW1ldGVyaXplZCBUeXBlIERlY2xhcmF0aW9uXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgxPEExIGV4dGVuZHMgWDI8QTE+Pj4ge1xuIiArIAoJCQkJIglBMSBhMTtcbiIgKwoJCQkJIn1cbiIgKyAKCQkJCSIvLyBWYWxpZCBQYXJhbWV0ZXJpemVkIFR5cGUgRGVjbGFyYXRpb25cbiIgKyAKCQkJCSJjbGFzcyBYMjxBMj4ge1xuIiArIAoJCQkJIglBMiBhMjtcbiIgKwoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIHRlc3RcXFgxLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkJIglwdWJsaWMgY2xhc3MgWDE8QTEgZXh0ZW5kcyBYMjxBMT4+PiB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5cbiIgKyAKCQkJIlN5bnRheCBlcnJvciBvbiB0b2tlbiBcIj4+PlwiLCA+PiBleHBlY3RlZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIgoJCSk7Cgl9CgoJLy8gSlNSMTQtdjEwWzIuMSwyLjJdOiBVbmV4cGVjdGVkIGNvbnNlY3V0aXZlIFBUIGRlY2xhcmF0aW9uICh3aXRoIHNwYWNlcykKCXB1YmxpYyB2b2lkIHRlc3QwNzQoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkidGVzdC9YMS5qYXZhIiwKCQkJCSJwYWNrYWdlIHRlc3Q7XG4iICsKCQkJCSIvLyBJbnZhbGlkIENvbnNlY3V0aXZlIFBhcmFtZXRlcml6ZWQgVHlwZSBEZWNsYXJhdGlvblxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYMSA8IEExID4gPiA+IHtcbiIgKyAKCQkJCSIJQTEgYTE7XG4iICsKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiB0ZXN0XFxYMS5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFgxIDwgQTEgPiA+ID4ge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgXl5eXG4iICsgCgkJCSJTeW50YXggZXJyb3Igb24gdG9rZW5zLCBkZWxldGUgdGhlc2UgdG9rZW5zXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iCgkJKTsKCX0KCQoJLy8gQSBpcyBub3QgYW4gaW50ZXJmYWNlCglwdWJsaWMgdm9pZCB0ZXN0MDc1KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBPYmplY3QgJiBwLkE8PyBzdXBlciBUPj4gZXh0ZW5kcyBwLkE8VD4ge1xuIiArIAoJCQkJIiAgICBwcm90ZWN0ZWQgVCB0O1xuIiArIAoJCQkJIiAgICBYKFQgdCkge1xuIiArIAoJCQkJIiAgICAgICAgc3VwZXIodCk7XG4iICsgCgkJCQkiICAgICAgICB0aGlzLnQgPSB0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifSIsCgkJCQkicC9BLmphdmEiLAoJCQkJInBhY2thZ2UgcDtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgQTxQPiB7XG4iICsgCgkJCQkiICAgIHByb3RlY3RlZCBQIHA7XG4iICsgCgkJCQkiICAgIHByb3RlY3RlZCBBKFAgcCkge1xuIiArIAoJCQkJIiAgICAgICAgdGhpcy5wID0gcDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn0iCgkJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJIglwdWJsaWMgY2xhc3MgWCA8VCBleHRlbmRzIE9iamVjdCAmIHAuQTw/IHN1cGVyIFQ+PiBleHRlbmRzIHAuQTxUPiB7XG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXlxuIiArIAoJCSJUaGUgdHlwZSBBPD8gc3VwZXIgVD4gaXMgbm90IGFuIGludGVyZmFjZTsgaXQgY2Fubm90IGJlIHNwZWNpZmllZCBhcyBhIGJvdW5kZWQgcGFyYW1ldGVyXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIKCQkpOwoJfQoKCS8vIEEgaXMgbm90IGFuIGludGVyZmFjZQoJcHVibGljIHZvaWQgdGVzdDA3NigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUIGV4dGVuZHMgT2JqZWN0ICYgcC5BPiBleHRlbmRzIHAuQTxUPiB7XG4iICsgCgkJCQkiICAgIHByb3RlY3RlZCBUIHQ7XG4iICsgCgkJCQkiICAgIFgoVCB0KSB7XG4iICsgCgkJCQkiICAgICAgICBzdXBlcih0KTtcbiIgKyAKCQkJCSIgICAgICAgIHRoaXMudCA9IHQ7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9IiwKCQkJCSJwL0EuamF2YSIsCgkJCQkicGFja2FnZSBwO1xuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBBPFA+IHtcbiIgKyAKCQkJCSIgICAgcHJvdGVjdGVkIFAgcDtcbiIgKyAKCQkJCSIgICAgcHJvdGVjdGVkIEEoUCBwKSB7XG4iICsgCgkJCQkiICAgICAgICB0aGlzLnAgPSBwO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifSIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYIDxUIGV4dGVuZHMgT2JqZWN0ICYgcC5BPiBleHRlbmRzIHAuQTxUPiB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5cbiIgKyAKCQkJIlRoZSB0eXBlIEEgaXMgbm90IGFuIGludGVyZmFjZTsgaXQgY2Fubm90IGJlIHNwZWNpZmllZCBhcyBhIGJvdW5kZWQgcGFyYW1ldGVyXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iCgkJKTsKCX0KCS8vIHVuc2FmZSB0eXBlIG9wZXJhdGlvbjogb25seSBmb3IgY29uc3RydWN0b3JzIHdpdGggc2lnbmF0dXJlIGNoYW5nZQoJcHVibGljIHZvaWQgdGVzdDA3NygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQ+IGV4dGVuZHMgcC5BPFQ+IHtcbiIgKyAKCQkJCSIJIFgoKSB7XG4iICsKCQkJCSIJCXN1cGVyKG51bGwpO1xuIiArCgkJCQkiCX1cbiIrCgkJCQkiICAgIFgoVCB0KSB7XG4iICsgCgkJCQkiICAgICAgICBzdXBlcih0KTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBYKFg8VD4geHQpIHtcbiIgKyAKCQkJCSIgICAgICAgIHN1cGVyKHh0LnQpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIFggeCA9IG5ldyBYKCk7XG4iICsgCgkJCQkiICAgICAgICBYIHgxID0gbmV3IFgoYXJncyk7XG4iICsgCgkJCQkiICAgICAgICBYIHgyID0gbmV3IFgoeCk7XG4iICsgCgkJCQkiICAgICAgICBYPFN0cmluZz4geHMgPSBuZXcgWDxTdHJpbmc+KGFyZ3MpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJCSJwL0EuamF2YSIsCgkJCQkicGFja2FnZSBwO1xuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBBPFA+IHtcbiIgKyAKCQkJCSIgICAgcHJvdGVjdGVkIFAgcDtcbiIgKyAKCQkJCSIgICAgcHJvdGVjdGVkIEEoUCBwKSB7XG4iICsgCgkJCQkiICAgICAgICB0aGlzLnAgPSBwO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifSIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA5KVxuIiArIAoJCQkiCXN1cGVyKHh0LnQpO1xuIiArIAoJCQkiCSAgICAgIF5eXl5cbiIgKyAKCQkJInh0LnQgY2Fubm90IGJlIHJlc29sdmVkIG9yIGlzIG5vdCBhIGZpZWxkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxMylcbiIgKyAKCQkJIglYIHgxID0gbmV3IFgoYXJncyk7XG4iICsgCgkJCSIJICAgICAgIF5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNvbnN0cnVjdG9yIFgoT2JqZWN0KSBiZWxvbmdzIHRvIHRoZSByYXcgdHlwZSBYLiBSZWZlcmVuY2VzIHRvIGdlbmVyaWMgdHlwZSBYPFQ+IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxNClcbiIgKyAKCQkJIglYIHgyID0gbmV3IFgoeCk7XG4iICsgCgkJCSIJICAgICAgIF5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNvbnN0cnVjdG9yIFgoWCkgYmVsb25ncyB0byB0aGUgcmF3IHR5cGUgWC4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgWDxUPiBzaG91bGQgYmUgcGFyYW1ldGVyaXplZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNC4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDE1KVxuIiArIAoJCQkiCVg8U3RyaW5nPiB4cyA9IG5ldyBYPFN0cmluZz4oYXJncyk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVGhlIGNvbnN0cnVjdG9yIFg8U3RyaW5nPihTdHJpbmdbXSkgaXMgdW5kZWZpbmVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCglwdWJsaWMgdm9pZCB0ZXN0MDc4KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IHAuQTtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIFgoQTxTdHJpbmc+IGEsIEE8U3RyaW5nPiBiKSB7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgdm9pZCBmb28oQTxTdHJpbmc+IGEpIHtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBYIHggPSBuZXcgWCgoQSludWxsLCAoQSludWxsKTtcbiIgKyAKCQkJCSIgICAgICAgIEEgYSA9IG5ldyBBKChBKW51bGwpO1xuIiArIAoJCQkJIgkJeC5mb28oYSk7XG4iICsgCgkJCQkiCQlhLnByaW50KHgpO1xuIiArIAoJCQkJIgkJQTxTdHJpbmc+IGFzID0gbmV3IEE8U3RyaW5nPihudWxsKTtcbiIgKyAKCQkJCSIJCWFzLnByaW50KFwiaGVsbG9cIik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJCQkJInAvQS5qYXZhIiwKCQkJCSJwYWNrYWdlIHA7XG4iICsKCQkJCSJwdWJsaWMgY2xhc3MgQTxQPiB7XG4iICsgCgkJCQkiICAgIHByb3RlY3RlZCBQIHA7XG4iICsgCgkJCQkiICAgIHByb3RlY3RlZCBBKFAgcCkge1xuIiArIAoJCQkJIiAgICAgICAgdGhpcy5wID0gcDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwcm90ZWN0ZWQgdm9pZCBwcmludChQIHApIHtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIitwKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwcm90ZWN0ZWQgdm9pZCBwcmludChBPFA+IGEpIHtcbiIgKyAKCQkJCSIgICAgICAgIHByaW50KGEucCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIglYIHggPSBuZXcgWCgoQSludWxsLCAoQSludWxsKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICBeXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGV4cHJlc3Npb24gb2YgdHlwZSBBIG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG8gQTxTdHJpbmc+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCVggeCA9IG5ldyBYKChBKW51bGwsIChBKW51bGwpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIEEgbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBBPFN0cmluZz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA5KVxuIiArIAoJCQkiCUEgYSA9IG5ldyBBKChBKW51bGwpO1xuIiArIAoJCQkiCSAgICAgIF5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgY29uc3RydWN0b3IgQShQKSBpcyBub3QgdmlzaWJsZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNC4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTApXG4iICsgCgkJCSIJeC5mb28oYSk7XG4iICsgCgkJCSIJICAgICAgXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBleHByZXNzaW9uIG9mIHR5cGUgQSBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIEE8U3RyaW5nPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDExKVxuIiArIAoJCQkiCWEucHJpbnQoeCk7XG4iICsgCgkJCSIJICBeXl5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCBwcmludChQKSBmcm9tIHRoZSB0eXBlIEEgaXMgbm90IHZpc2libGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjYuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMilcbiIgKyAKCQkJIglBPFN0cmluZz4gYXMgPSBuZXcgQTxTdHJpbmc+KG51bGwpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlRoZSBjb25zdHJ1Y3RvciBBPFN0cmluZz4oUCkgaXMgbm90IHZpc2libGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjcuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMylcbiIgKyAKCQkJIglhcy5wcmludChcImhlbGxvXCIpO1xuIiArIAoJCQkiCSAgIF5eXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIHByaW50KFApIGZyb20gdGhlIHR5cGUgQTxTdHJpbmc+IGlzIG5vdCB2aXNpYmxlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIHBcXEEuamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCXByb3RlY3RlZCB2b2lkIHByaW50KFAgcCkge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgXlxuIiArIAoJCQkiVGhlIHBhcmFtZXRlciBwIGlzIGhpZGluZyBhIGZpZWxkIGZyb20gdHlwZSBBPFA+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCgoJLy8gSlNSMTQtdjEwWzIuNF06IFZhbGlkIGNvbnNlY3V0aXZlIFR5cGUgUGFyYW1ldGVycyBCcmFja2V0cwoJcHVibGljIHZvaWQgdGVzdDA3OSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJInRlc3QvWC5qYXZhIiwKCQkJCSJwYWNrYWdlIHRlc3Q7XG4iICsKCQkJCQkicHVibGljIGNsYXNzIFg8QSBleHRlbmRzIFgxPFgyPFgzPFN0cmluZz4+Pj4ge1xuIiArIAoJCQkJCSIJQSBhO1xuIiArCgkJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkJIgkJWDxYMTxYMjxYMzxTdHJpbmc+Pj4+IHggPSBuZXcgWDxYMTxYMjxYMzxTdHJpbmc+Pj4+KCk7XG4iICsgCgkJCQkJIgkJeC5hID0gbmV3IFgxPFgyPFgzPFN0cmluZz4+PigpO1xuIiArIAoJCQkJCSIJCXguYS5hMSA9IG5ldyBYMjxYMzxTdHJpbmc+PigpO1xuIiArIAoJCQkJCSIJCXguYS5hMS5hMiA9IG5ldyBYMzxTdHJpbmc+KCk7XG4iICsgCgkJCQkJIgkJeC5hLmExLmEyLmEzID0gXCJTVUNDRVNTXCI7XG4iICsgCgkJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKHguYS5hMS5hMi5hMyk7XG4iICsgCgkJCQkJIgl9XG4iICsgCgkJCQkJIn1cbiIgKyAKCQkJCQkiY2xhc3MgWDE8QSBleHRlbmRzIFgyPFgzPFN0cmluZz4+PiB7XG4iICsgCgkJCQkJIglBIGExO1xuIiArCgkJCQkJIn1cbiIgKyAKCQkJCQkiY2xhc3MgWDI8QSBleHRlbmRzIFgzPFN0cmluZz4+IHtcbiIgKyAKCQkJCQkiCUEgYTI7XG4iICsKCQkJCQkifVxuIiArIAoJCQkJCSJjbGFzcyBYMzxBPiB7XG4iICsgCgkJCQkJIglBIGEzO1xuIiArCgkJCQkJIn1cbiIKCQkJfSwKCQkJIlNVQ0NFU1MiIAoJCSk7Cgl9CgkvLyBUT0RPIChkYXZpZCkgcmVtb3ZlIGVycm9yczogaW5zZXJ0IGRpbWVuc2lvbiB0byBjb21wbGV0ZSBhcnJheSB0eXBlCglwdWJsaWMgdm9pZCB0ZXN0MDgwKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJInRlc3QvWC5qYXZhIiwKCQkJCSJwYWNrYWdlIHRlc3Q7XG4iICsKCQkJCQkicHVibGljIGNsYXNzIFg8QSBleHRlbmRzIFgxPFgyPFgzPFN0cmluZz4+PiB7fVxuIiArIAoJCQkJCSJjbGFzcyBYMTxBIGV4dGVuZHMgWDI8WDM8U3RyaW5nPj4ge31cbiIgKyAKCQkJCQkiY2xhc3MgWDI8QSBleHRlbmRzIFgzPFN0cmluZz4ge31cbiIgKyAKCQkJCQkiY2xhc3MgWDM8QSB7fVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gdGVzdFxcWC5qYXZhIChhdCBsaW5lIDIpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFg8QSBleHRlbmRzIFgxPFgyPFgzPFN0cmluZz4+PiB7fVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5cbiIgKyAKCQkJIlN5bnRheCBlcnJvciwgaW5zZXJ0IFwiPlwiIHRvIGNvbXBsZXRlIFJlZmVyZW5jZVR5cGUxXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiB0ZXN0XFxYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkJIgljbGFzcyBYMTxBIGV4dGVuZHMgWDI8WDM8U3RyaW5nPj4ge31cbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5cbiIgKyAKCQkJIlN5bnRheCBlcnJvciwgaW5zZXJ0IFwiPlwiIHRvIGNvbXBsZXRlIFJlZmVyZW5jZVR5cGUxXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBFUlJPUiBpbiB0ZXN0XFxYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkJIgljbGFzcyBYMjxBIGV4dGVuZHMgWDM8U3RyaW5nPiB7fVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXG4iICsgCgkJCSJTeW50YXggZXJyb3IsIGluc2VydCBcIj5cIiB0byBjb21wbGV0ZSBSZWZlcmVuY2VUeXBlMVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNC4gRVJST1IgaW4gdGVzdFxcWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJCSIJY2xhc3MgWDM8QSB7fVxuIiArIAoJCQkiCSAgICAgICAgIF5cbiIgKyAKCQkJIlN5bnRheCBlcnJvciBvbiB0b2tlbiBcIkFcIiwgPiBleHBlY3RlZCBhZnRlciB0aGlzIHRva2VuXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iCgkJKTsKCX0KCS8vIFRPRE8gKGRhdmlkKSByZW1vdmUgZXJyb3JzOiBpbnNlcnQgZGltZW5zaW9uIHRvIGNvbXBsZXRlIGFycmF5IHR5cGUKCXB1YmxpYyB2b2lkIHRlc3QwODEoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkidGVzdC9YLmphdmEiLAoJCQkJInBhY2thZ2UgdGVzdDtcbiIgKwoJCQkJCSJwdWJsaWMgY2xhc3MgWDxBIGV4dGVuZHMgWDE8WDI8WDM8U3RyaW5nPj4ge31cbiIgKyAKCQkJCQkiY2xhc3MgWDE8QSBleHRlbmRzIFgyPFgzPFN0cmluZz4ge31cbiIgKyAKCQkJCQkiY2xhc3MgWDI8QSBleHRlbmRzIFgzPFN0cmluZyB7fVxuIiArIAoJCQkJCSJjbGFzcyBYMzxBPiB7fVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gdGVzdFxcWC5qYXZhIChhdCBsaW5lIDIpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFg8QSBleHRlbmRzIFgxPFgyPFgzPFN0cmluZz4+IHt9XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXG4iICsgCgkJCSJTeW50YXggZXJyb3IsIGluc2VydCBcIj4+XCIgdG8gY29tcGxldGUgUmVmZXJlbmNlVHlwZTJcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIHRlc3RcXFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCWNsYXNzIFgxPEEgZXh0ZW5kcyBYMjxYMzxTdHJpbmc+IHt9XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlN5bnRheCBlcnJvciwgaW5zZXJ0IFwiPj5cIiB0byBjb21wbGV0ZSBSZWZlcmVuY2VUeXBlMlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gRVJST1IgaW4gdGVzdFxcWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJY2xhc3MgWDI8QSBleHRlbmRzIFgzPFN0cmluZyB7fVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5cbiIgKyAKCQkJIlN5bnRheCBlcnJvciwgaW5zZXJ0IFwiPj5cIiB0byBjb21wbGV0ZSBSZWZlcmVuY2VUeXBlMlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIgoJCSk7Cgl9CgkvLyBUT0RPIChkYXZpZCkgcmVtb3ZlIGVycm9yOiBpbnNlcnQgZGltZW5zaW9uIHRvIGNvbXBsZXRlIGFycmF5IHR5cGUKCXB1YmxpYyB2b2lkIHRlc3QwODIoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkidGVzdC9YLmphdmEiLAoJCQkJInBhY2thZ2UgdGVzdDtcbiIgKwoJCQkJCSJwdWJsaWMgY2xhc3MgWDxBIGV4dGVuZHMgWDE8WDI8WDM8U3RyaW5nPiB7fVxuIiArIAoJCQkJCSJjbGFzcyBYMTxBIGV4dGVuZHMgWDI8WDM8U3RyaW5nIHt9XG4iICsgCgkJCQkJImNsYXNzIFgyPEEgZXh0ZW5kcyBYMzxTdHJpbmc+PiB7fVxuIiArIAoJCQkJCSJjbGFzcyBYMzxBPiB7fVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gdGVzdFxcWC5qYXZhIChhdCBsaW5lIDIpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFg8QSBleHRlbmRzIFgxPFgyPFgzPFN0cmluZz4ge31cbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXlxuIiArIAoJCQkiU3ludGF4IGVycm9yLCBpbnNlcnQgXCI+Pj5cIiB0byBjb21wbGV0ZSBSZWZlcmVuY2VUeXBlM1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gdGVzdFxcWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJY2xhc3MgWDE8QSBleHRlbmRzIFgyPFgzPFN0cmluZyB7fVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5cbiIgKyAKCQkJIlN5bnRheCBlcnJvciwgaW5zZXJ0IFwiPj4+XCIgdG8gY29tcGxldGUgUmVmZXJlbmNlVHlwZTNcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIKCQkpOwoJfQoJLy8gVE9ETyAoZGF2aWQpIHJlbW92ZSBlcnJvcjogaW5zZXJ0IGRpbWVuc2lvbiB0byBjb21wbGV0ZSBhcnJheSB0eXBlCglwdWJsaWMgdm9pZCB0ZXN0MDgzKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJInRlc3QvWC5qYXZhIiwKCQkJCSJwYWNrYWdlIHRlc3Q7XG4iICsKCQkJCQkicHVibGljIGNsYXNzIFg8QSBleHRlbmRzIFgxPFgyPFgzPFN0cmluZyB7fVxuIiArIAoJCQkJCSJjbGFzcyBYMTxBIGV4dGVuZHMgWDI8WDM8U3RyaW5nPj4+IHt9XG4iICsgCgkJCQkJImNsYXNzIFgyPEEgZXh0ZW5kcyBYMzxTdHJpbmc+PiB7fVxuIiArIAoJCQkJCSJjbGFzcyBYMzxBPiB7fVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gdGVzdFxcWC5qYXZhIChhdCBsaW5lIDIpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFg8QSBleHRlbmRzIFgxPFgyPFgzPFN0cmluZyB7fVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5cbiIgKyAKCQkJIlN5bnRheCBlcnJvciwgaW5zZXJ0IFwiPlwiIHRvIGNvbXBsZXRlIFJlZmVyZW5jZVR5cGUxXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiB0ZXN0XFxYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKCQkJIglwdWJsaWMgY2xhc3MgWDxBIGV4dGVuZHMgWDE8WDI8WDM8U3RyaW5nIHt9XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXlxuIiArIAoJCQkiU3ludGF4IGVycm9yLCBpbnNlcnQgXCI+Pj5cIiB0byBjb21wbGV0ZSBSZWZlcmVuY2VUeXBlM1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIgoJCSk7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MDg0KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBYKEFYPFN0cmluZz4gYSwgQVg8U3RyaW5nPiBiKSB7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgdm9pZCBmb28oQVg8U3RyaW5nPiBhKSB7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgWCB4ID0gbmV3IFgoKEFYKW51bGwsIChBWCludWxsKTtcbiIgKyAKCQkJCSIgICAgICAgIEFYIGEgPSBuZXcgQVgoKEFYKW51bGwpO1xuIiArIAoJCQkJIiAgICAgICAgQVggYTIgPSBuZXcgQVgobnVsbCk7XG4iICsgCgkJCQkiCQl4LmZvbyhhKTtcbiIgKyAKCQkJCSIJCWEuZm9vKGEpO1xuIiArIAoJCQkJIgkJYS5iYXIoYSk7XG4iICsgCgkJCQkiCQlBWDxTdHJpbmc+IGFzID0gbmV3IEFYPFN0cmluZz4obnVsbCk7XG4iICsgCgkJCQkiCQlhcy5wcmludChhKTtcbiIgKyAKCQkJCSIJCWFzLmJhcihhKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBBWCA8UD4ge1xuIiArIAoJCQkJIiAgICBBWChBWDxQPiBheCl7fVxuIiArIAoJCQkJIiAgICBBWChQIHApe31cbiIgKyAKCQkJCSIgICAgdm9pZCBwcmludChQIHApe31cbiIgKyAKCQkJCSIgICAgdm9pZCBmb28oQVggcmF3QXgpe31cbiIgKyAKCQkJCSIgICAgdm9pZCBiYXIoQVg8UD4gYXgpe31cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglYIHggPSBuZXcgWCgoQVgpbnVsbCwgKEFYKW51bGwpO1xuIiArIAoJCQkiCSAgICAgICAgICAgIF5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGV4cHJlc3Npb24gb2YgdHlwZSBBWCBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIEFYPFN0cmluZz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJCSIJWCB4ID0gbmV3IFgoKEFYKW51bGwsIChBWCludWxsKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIEFYIG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG8gQVg8U3RyaW5nPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIglBWCBhID0gbmV3IEFYKChBWCludWxsKTtcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBjb25zdHJ1Y3RvciBBWChBWCkgYmVsb25ncyB0byB0aGUgcmF3IHR5cGUgQVguIFJlZmVyZW5jZXMgdG8gZ2VuZXJpYyB0eXBlIEFYPFA+IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI0LiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA5KVxuIiArIAoJCQkiCUFYIGEyID0gbmV3IEFYKG51bGwpO1xuIiArIAoJCQkiCSAgICAgICAgXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNvbnN0cnVjdG9yIEFYKEFYKSBiZWxvbmdzIHRvIHRoZSByYXcgdHlwZSBBWC4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgQVg8UD4gc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjUuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEwKVxuIiArIAoJCQkiCXguZm9vKGEpO1xuIiArIAoJCQkiCSAgICAgIF5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIEFYIG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG8gQVg8U3RyaW5nPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTIpXG4iICsgCgkJCSIJYS5iYXIoYSk7XG4iICsgCgkJCSIJXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgbWV0aG9kIGJhcihBWCkgYmVsb25ncyB0byB0aGUgcmF3IHR5cGUgQVguIFJlZmVyZW5jZXMgdG8gZ2VuZXJpYyB0eXBlIEFYPFA+IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI3LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTMpXG4iICsgCgkJCSIJQVg8U3RyaW5nPiBhcyA9IG5ldyBBWDxTdHJpbmc+KG51bGwpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVGhlIGNvbnN0cnVjdG9yIEFYPFN0cmluZz4oQVg8U3RyaW5nPikgaXMgYW1iaWd1b3VzXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI4LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTQpXG4iICsgCgkJCSIJYXMucHJpbnQoYSk7XG4iICsgCgkJCSIJICAgXl5eXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgcHJpbnQoU3RyaW5nKSBpbiB0aGUgdHlwZSBBWDxTdHJpbmc+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChBWClcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjkuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDE1KVxuIiArIAoJCQkiCWFzLmJhcihhKTtcbiIgKyAKCQkJIgkgICAgICAgXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBleHByZXNzaW9uIG9mIHR5cGUgQVggbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBBWDxTdHJpbmc+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoKCXB1YmxpYyB2b2lkIHRlc3QwODUoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJCSIgICAgXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIEFYIGF4ID0gbmV3IEFYKCk7XG4iICsgCgkJCQkiICAgICAgICBYIHggPSAoWClheC5wO1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHgpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIEFYIDxQPiB7XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBQIHA7XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkibnVsbCIpOwoJfQkJCgoJcHVibGljIHZvaWQgdGVzdDA4NigpIHsKCQlNYXAgY3VzdG9tT3B0aW9ucyA9IGdldENvbXBpbGVyT3B0aW9ucygpOwoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgQVggYXggPSBuZXcgQVgoKTtcbiIgKyAKCQkJCSIgICAgICAgIEFYIGF4MiA9IGF4LnA7XG4iICsgCgkJCQkiICAgICAgICBheC5wID0gbmV3IEFYPFN0cmluZz4oKTtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihheDIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIEFYIDxQPiB7XG4iICsgCgkJCQkiICAgIEFYPFA+IHA7XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJYXgucCA9IG5ldyBBWDxTdHJpbmc+KCk7XG4iICsgCgkJCSIJXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBmaWVsZCBwIGZyb20gdGhlIHJhdyB0eXBlIEFYIGlzIGFzc2lnbmVkIGEgdmFsdWUgb2YgdHlwZSBBWDxTdHJpbmc+LiBSZWZlcmVuY2VzIHRvIGdlbmVyaWMgdHlwZSBBWDxQPiBzaG91bGQgYmUgcGFyYW1ldGVyaXplZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiwKCQludWxsLAoJCXRydWUsCgkJY3VzdG9tT3B0aW9ucyk7CQkKCX0JCQoJCglwdWJsaWMgdm9pZCB0ZXN0MDg3KCkgewoJCU1hcCBjdXN0b21PcHRpb25zID0gZ2V0Q29tcGlsZXJPcHRpb25zKCk7CgkJLy8gY2hlY2sgbm8gdW5zYWZlIHR5cGUgb3BlcmF0aW9uIHByb2JsZW0gaXMgaXNzdWVkCgkJY3VzdG9tT3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbmNoZWNrZWRUeXBlT3BlcmF0aW9uLCBDb21waWxlck9wdGlvbnMuRVJST1IpOwkJCSAgICAKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgQVggYXggPSBuZXcgQVgoKTtcbiIgKyAKCQkJCSIgICAgICAgIEFYIGF4MiA9IGF4LnA7XG4iICsgCgkJCQkiICAgICAgICBBWCBheDMgPSBuZXcgQVg8U3RyaW5nPigpO1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBBWCA8UD4ge1xuIiArIAoJCQkJIiAgICBBWDxQPiBwO1xuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJIlNVQ0NFU1MiLAoJCW51bGwsCgkJdHJ1ZSwKCQludWxsLAoJCWN1c3RvbU9wdGlvbnMsCgkJbnVsbC8qbm8gY3VzdG9tIHJlcXVlc3RvciovKTsJCQoJfQkJCQoJCglwdWJsaWMgdm9pZCB0ZXN0MDg4KCkgewoJCU1hcCBjdXN0b21PcHRpb25zID0gZ2V0Q29tcGlsZXJPcHRpb25zKCk7CgkJLy8gY2hlY2sgbm8gdW5zYWZlIHR5cGUgb3BlcmF0aW9uIHByb2JsZW0gaXMgaXNzdWVkCgkJY3VzdG9tT3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbmNoZWNrZWRUeXBlT3BlcmF0aW9uLCBDb21waWxlck9wdGlvbnMuRVJST1IpOwkJCSAgICAKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIiAgICAgQVggYXggPSBuZXcgQVgoKTtcbiIgKyAKCQkJCSIgICAgIEFYIGF4MiA9IGF4LnA7XG4iICsgCgkJCQkiICAgICBBWCBheDMgPSBuZXcgQVg8U3RyaW5nPigpO1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBBWCA8UD4ge1xuIiArIAoJCQkJIiAgICBBWDxQPiBwO1xuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJIiIsCgkJbnVsbCwKCQl0cnVlLAoJCW51bGwsCgkJY3VzdG9tT3B0aW9ucywKCQludWxsLypubyBjdXN0b20gcmVxdWVzdG9yKi8pOwkJCgl9CQkJCQoKCXB1YmxpYyB2b2lkIHRlc3QwODkoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJCSIgICAgVCBxO1xuIiArIAoJCQkJIiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgIFg8U3RyaW5nW10+IHhzcyA9IG5ldyBYPFN0cmluZ1tdPigpO1xuIiArIAoJCQkJIiAgICAgICAgIFg8WDxTdHJpbmdbXT4+IHh4cyA9IG5ldyBYPFg8U3RyaW5nW10+PigpO1xuIiArIAoJCQkJIiAgICAgICAgIHh4cy5xID0geHNzO1xuIiArIAoJCQkJIiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkiU1VDQ0VTUyIpOwoJfQkJCQkKCglwdWJsaWMgdm9pZCB0ZXN0MDkwKCkgewoJCU1hcCBjdXN0b21PcHRpb25zID0gZ2V0Q29tcGlsZXJPcHRpb25zKCk7CgkJLy8gY2hlY2sgbm8gdW5zYWZlIHR5cGUgb3BlcmF0aW9uIHByb2JsZW0gaXMgaXNzdWVkCgkJY3VzdG9tT3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbmNoZWNrZWRUeXBlT3BlcmF0aW9uLCBDb21waWxlck9wdGlvbnMuRVJST1IpOwkJCSAgICAKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIiAgICBUIHE7XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgIFg8U3RyaW5nW10+IHhzcyA9IG5ldyBYPFN0cmluZ1tdPigpO1xuIiArIAoJCQkJIiAgICAgICAgIFg8WDxTdHJpbmdbXT4+IHh4cyA9IG5ldyBYPFg8U3RyaW5nW10+PigpO1xuIiArIAoJCQkJIiAgICAgICAgIHh4cy5xID0geHNzO1xuIiArIAoJCQkJIiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgICB9XG4iICsgCgkJCQkiICAgICAgdm9pZCBmb28oWFtdIHhzKSB7XG4iICsgCgkJCQkiICAgICAgICAgIHhzWzBdID0gbmV3IFg8U3RyaW5nPigpO1xuIiArIAoJCQkJIiAgICAgfVxuIiArCgkJCQkifVxuIiwKCQkJfSwKCQkiU1VDQ0VTUyIsCgkJbnVsbCwKCQl0cnVlLAoJCW51bGwsCgkJY3VzdG9tT3B0aW9ucywKCQludWxsLypubyBjdXN0b20gcmVxdWVzdG9yKi8pOwkJCgl9CQkJCQoKCXB1YmxpYyB2b2lkIHRlc3QwOTEoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJCSIgICAgICB2b2lkIGZvbyhYPFN0cmluZz5bXSB4cykge1xuIiArIAoJCQkJIiAgICAgfVxuIiArCgkJCQkifVxuIiwKCQkJfSwKCQkJIiIpOwkJCgl9CQkJCQoKCXB1YmxpYyB2b2lkIHRlc3QwOTIoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPiB7XG4iICsgCgkJCQkiICAgIFQgdDtcbiIgKyAKCQkJCSIgICAgWChUIHQpIHtcbiIgKyAKCQkJCSIgICAgICAgIHRoaXMudCA9IHQ7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgIHZvaWQgZm9vKCkge1xuIiArIAoJCQkJIiAgICAgICAgIFg8U3RyaW5nPiB4cyA9IG5ldyBYPFN0cmluZz4oXCJcIik7XG4iICsgCgkJCQkiICAgICAgICAgWDxTdHJpbmc+IHhzMiA9IChYPFN0cmluZz4pIHhzO1xuIiArIAoJCQkJIiAgICAgICAgIFxuIiArIAoJCQkJIiAgICAgICAgICgoWCl4cykudCA9IHRoaXM7XG4iICsgCgkJCQkiICAgICAgICAgXG4iICsgCgkJCQkiICAgICAgICAgU3lzdGVtLm91dC5wcmlubG4oKFQpIHRoaXMudCk7XG4iICsgCgkJCQkiICAgICB9XG4iICsgCgkJCQkiICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQluZXcgWDxTdHJpbmc+KFwiU1VDQ0VTU1wiKS5mb28oKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCVg8U3RyaW5nPiB4czIgPSAoWDxTdHJpbmc+KSB4cztcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlVubmVjZXNzYXJ5IGNhc3QgZnJvbSBYPFN0cmluZz4gdG8gWDxTdHJpbmc+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxMClcbiIgKyAKCQkJIgkoKFgpeHMpLnQgPSB0aGlzO1xuIiArIAoJCQkiCSAgICAgICAgXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBmaWVsZCB0IGZyb20gdGhlIHJhdyB0eXBlIFggaXMgYXNzaWduZWQgYSB2YWx1ZSBvZiB0eXBlIFg8VD4uIFJlZmVyZW5jZXMgdG8gZ2VuZXJpYyB0eXBlIFg8VD4gc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMilcbiIgKyAKCQkJIglTeXN0ZW0ub3V0LnByaW5sbigoVCkgdGhpcy50KTtcbiIgKyAKCQkJIgkgICAgICAgICAgIF5eXl5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCBwcmlubG4oVCkgaXMgdW5kZWZpbmVkIGZvciB0aGUgdHlwZSBQcmludFN0cmVhbVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCglwdWJsaWMgdm9pZCB0ZXN0MDkzKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPiB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIEFYIGF4ID0gbmV3IEFYKCk7XG4iICsgCgkJCQkiICAgICAgICBBWCBheDIgPSBuZXcgQVgoKTtcbiIgKyAKCQkJCSIgICAgICAgIGF4LnAgPSBheDIucDtcbiIgKyAvLyBqYXZhYyByZXBvcnRzIHVuY2hlY2tlZCB3YXJuaW5nLCB3aGljaCBzZWVtcyBhIGJ1ZyBhcyBubyBkaWZmZXJlbmNlIGluIGJldHdlZW4gbGhzIGFuZCByaHMgdHlwZXMKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQVggPFA+IHtcbiIgKyAKCQkJCSIgICAgQVg8UD4gcDtcbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCSJTVUNDRVNTIik7CQkKCX0JCQoJCgkvLyBzYW1lIGFzIHRlc3QwMDEsIGJ1dCBldmVyeSB0eXBlIGlzIG5vdyBhIFNvdXJjZVR5cGVCaW5kaW5nCglwdWJsaWMgdm9pZCB0ZXN0MDk0KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUeDEgZXh0ZW5kcyBTLCBUeDIgZXh0ZW5kcyBDPiAgZXh0ZW5kcyBYUzxUeDI+IHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgSSB3ID0gbmV3IFg8UyxJPigpLmdldChuZXcgSSgpKTtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgUyB7fVxuIiArCgkJCQkiY2xhc3MgSSBpbXBsZW1lbnRzIEM8ST4ge31cbiIgKyAKCQkJCSJpbnRlcmZhY2UgQzxUYz4ge31cbiIgKwoJCQkJImNsYXNzIFhTIDxUeHM+IHtcbiIgKyAKCQkJCSIgICAgVHhzIGdldChUeHMgdCkge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIHQ7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MDk1KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUeDEgZXh0ZW5kcyBTLCBUeDIgZXh0ZW5kcyBDPiAgZXh0ZW5kcyBYUzxUeDI+IHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgSSB3ID0gbmV3IFg8UyxJPigpLmdldChuZXcgSSgpKTtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgUyB7fVxuIiArCgkJCQkiY2xhc3MgSSBpbXBsZW1lbnRzIEMge31cbiIgKyAKCQkJCSJpbnRlcmZhY2UgQzxUYz4ge31cbiIgKwoJCQkJImNsYXNzIFhTIDxUeHM+IHtcbiIgKyAKCQkJCSIgICAgVHhzIGdldChUeHMgdCkge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIHQ7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CQoJcHVibGljIHZvaWQgdGVzdDA5NigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQ+IGV4dGVuZHMgWCB7fVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFg8VD4gZXh0ZW5kcyBYIHt9XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICBeXG4iICsgCgkJCSJDeWNsZSBkZXRlY3RlZDogdGhlIHR5cGUgWDxUPiBjYW5ub3QgZXh0ZW5kL2ltcGxlbWVudCBpdHNlbGYgb3Igb25lIG9mIGl0cyBvd24gbWVtYmVyIHR5cGVzXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCXB1YmxpYyB2b2lkIHRlc3QwOTcoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPiBleHRlbmRzIFg8U3RyaW5nPiB7fVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFg8VD4gZXh0ZW5kcyBYPFN0cmluZz4ge31cbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIkN5Y2xlIGRldGVjdGVkOiB0aGUgdHlwZSBYPFQ+IGNhbm5vdCBleHRlbmQvaW1wbGVtZW50IGl0c2VsZiBvciBvbmUgb2YgaXRzIG93biBtZW1iZXIgdHlwZXNcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkKCXB1YmxpYyB2b2lkIHRlc3QwOTgoKSB7CgkJTWFwIGN1c3RvbU9wdGlvbnMgPSBnZXRDb21waWxlck9wdGlvbnMoKTsKCQljdXN0b21PcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVuY2hlY2tlZFR5cGVPcGVyYXRpb24sIENvbXBpbGVyT3B0aW9ucy5FUlJPUik7CQkJICAgIAoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgQVggYXggPSBuZXcgQVgoKTtcbiIgKyAKCQkJCSIgICAgICAgIEFYIGF4MiA9IGF4LnA7XG4iICsgCgkJCQkiICAgICAgICBheC5wID0gbmV3IEFYPFN0cmluZz4oKTtcbiIgKyAKCQkJCSIgICAgICAgIGF4LnEgPSBuZXcgQVg8U3RyaW5nPigpO1xuIiArIAoJCQkJIiAgICAgICAgYXguciA9IG5ldyBBWDxPYmplY3Q+KCk7XG4iICsgCgkJCQkiICAgICAgICBheC5zID0gbmV3IEFYPFN0cmluZz4oKTtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihheDIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIEFYIDxQPiB7XG4iICsgCgkJCQkiICAgIEFYPFA+IHA7XG4iICsgCgkJCQkiICAgIEFYPE9iamVjdD4gcTtcbiIgKyAKCQkJCSIgICAgQVg8U3RyaW5nPiByO1xuIiArIAoJCQkJIiAgICBCWDxTdHJpbmc+IHM7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIEJYPFE+IHtcbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCSIJYXgucCA9IG5ldyBBWDxTdHJpbmc+KCk7XG4iICsgCgkJIgleXl5eXG4iICsgCgkJIlR5cGUgc2FmZXR5OiBUaGUgZmllbGQgcCBmcm9tIHRoZSByYXcgdHlwZSBBWCBpcyBhc3NpZ25lZCBhIHZhbHVlIG9mIHR5cGUgQVg8U3RyaW5nPi4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgQVg8UD4gc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWRcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkiCWF4LnEgPSBuZXcgQVg8U3RyaW5nPigpO1xuIiArIAoJCSIJXl5eXlxuIiArIAoJCSJUeXBlIHNhZmV0eTogVGhlIGZpZWxkIHEgZnJvbSB0aGUgcmF3IHR5cGUgQVggaXMgYXNzaWduZWQgYSB2YWx1ZSBvZiB0eXBlIEFYPFN0cmluZz4uIFJlZmVyZW5jZXMgdG8gZ2VuZXJpYyB0eXBlIEFYPFA+IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJIglheC5yID0gbmV3IEFYPE9iamVjdD4oKTtcbiIgKyAKCQkiCV5eXl5cbiIgKyAKCQkiVHlwZSBzYWZldHk6IFRoZSBmaWVsZCByIGZyb20gdGhlIHJhdyB0eXBlIEFYIGlzIGFzc2lnbmVkIGEgdmFsdWUgb2YgdHlwZSBBWDxPYmplY3Q+LiBSZWZlcmVuY2VzIHRvIGdlbmVyaWMgdHlwZSBBWDxQPiBzaG91bGQgYmUgcGFyYW1ldGVyaXplZFxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjQuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA5KVxuIiArIAoJCSIJYXgucyA9IG5ldyBBWDxTdHJpbmc+KCk7XG4iICsgCgkJIgkgICAgICAgXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIEFYPFN0cmluZz4gdG8gQlhcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiwKCQludWxsLAoJCXRydWUsCgkJY3VzdG9tT3B0aW9ucyk7CQkKCX0JCQkJCgkvLyB3aWxkY2FyZCBib3VuZCBjYW5ub3QgYmUgYmFzZSB0eXBlCgkvLyBUT0RPIChkYXZpZCkgb25seSBzeW50YXggZXJyb3Igc2hvdWxkIGJlIHJlbGF0ZWQgdG8gd2lsY2FyZCBib3VuZCBiZWluZyBhIGJhc2UgdHlwZS4gUmlwcGxlIGVmZmVjdCBpcyBzZXZlcmUgaGVyZS4KCXB1YmxpYyB2b2lkIHRlc3QwOTkoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCAgPFQgZXh0ZW5kcyBBWDw/IHN1cGVyIGludD4+IHtcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJQVg8U3RyaW5nPiBheDtcbiIgKyAKCQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBmb28oWDw/PiB4KSB7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgQVg8UD4ge1xuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJIglwdWJsaWMgY2xhc3MgWCAgPFQgZXh0ZW5kcyBBWDw/IHN1cGVyIGludD4+IHtcbiIgKyAKCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXG4iICsgCgkJIlN5bnRheCBlcnJvciBvbiB0b2tlbiBcImludFwiLCBEaW1lbnNpb25zIGV4cGVjdGVkIGFmdGVyIHRoaXMgdG9rZW5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7CQkKCX0JCQoKCS8vIHR5cGUgcGFyYW1ldGVyaXplZCB3aXRoIHdpbGRjYXJkIGNhbm5vdCBhcHBlYXIgaW4gYWxsb2NhdGlvbgoJcHVibGljIHZvaWQgdGVzdDEwMCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPiB7XG4iICsgCgkJCQkiICAgIFQgdDtcbiIgKyAKCQkJCSIgICAgWChUIHQpe1xuIiArIAoJCQkJIiAgICAgICAgdGhpcy50ID0gdDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlYPD8gZXh0ZW5kcyBBWD4geCA9IG5ldyBYPD8gZXh0ZW5kcyBBWD4obmV3IEFYPFN0cmluZz4oKSk7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIEFYPFA+IHtcbiIgKyAKCQkJCSIgICAgUCBmb28oKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCVg8PyBleHRlbmRzIEFYPiB4ID0gbmV3IFg8PyBleHRlbmRzIEFYPihuZXcgQVg8U3RyaW5nPigpKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICBeXG4iICsgCgkJCSJDYW5ub3QgaW5zdGFudGlhdGUgdGhlIHR5cGUgWDw/IGV4dGVuZHMgQVg+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsJCgl9CQkKCgkvLyB3aWxjYXJkIG1heSBub3QgcGFzcyBwYXJhbWV0ZXIgYm91bmQgY2hlY2sKCXB1YmxpYyB2b2lkIHRlc3QxMDEoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VCBleHRlbmRzIFN0cmluZz4ge1xuIiArIAoJCQkJIiAgICBUIHQ7XG4iICsgCgkJCQkiICAgIFgoVCB0KXtcbiIgKyAKCQkJCSIgICAgICAgIHRoaXMudCA9IHQ7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJWDw/IGV4dGVuZHMgQVg+IHggPSBuZXcgWDxBWDxTdHJpbmc+PihuZXcgQVg8U3RyaW5nPigpKTtcbiIgKyAKCQkJCSIJCXgudC5mb28oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIEFYPFA+IHtcbiIgKyAKCQkJCSIgICB2b2lkIGZvbyhQIHApIHsgXG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4ocCk7XG4iICsgCgkJCQkiICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIsCgkJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMSlcbiIgKyAKCQkiCXB1YmxpYyBjbGFzcyBYIDxUIGV4dGVuZHMgU3RyaW5nPiB7XG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXlxuIiArIAoJCSJUaGUgdHlwZSBwYXJhbWV0ZXIgVCBzaG91bGQgbm90IGJlIGJvdW5kZWQgYnkgdGhlIGZpbmFsIHR5cGUgU3RyaW5nLiBGaW5hbCB0eXBlcyBjYW5ub3QgYmUgZnVydGhlciBleHRlbmRlZFxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCSIJWDw/IGV4dGVuZHMgQVg+IHggPSBuZXcgWDxBWDxTdHJpbmc+PihuZXcgQVg8U3RyaW5nPigpKTtcbiIgKyAKCQkiCSAgXl5eXl5eXl5eXl5eXG4iICsgCgkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSA/IGV4dGVuZHMgQVggaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgU3RyaW5nPiBvZiB0aGUgdHlwZSBYPFQ+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJIglYPD8gZXh0ZW5kcyBBWD4geCA9IG5ldyBYPEFYPFN0cmluZz4+KG5ldyBBWDxTdHJpbmc+KCkpO1xuIiArIAoJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICBeXlxuIiArIAoJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgQVg8U3RyaW5nPiBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFQgZXh0ZW5kcyBTdHJpbmc+IG9mIHRoZSB0eXBlIFg8VD5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSI0LiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCSIJeC50LmZvbyhcIlNVQ0NFU1NcIik7XG4iICsgCgkJIgleXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiVHlwZSBzYWZldHk6IFRoZSBtZXRob2QgZm9vKE9iamVjdCkgYmVsb25ncyB0byB0aGUgcmF3IHR5cGUgQVguIFJlZmVyZW5jZXMgdG8gZ2VuZXJpYyB0eXBlIEFYPFA+IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwkJCgl9CQkKCS8vIHVuYm91bmQgd2lsZGNhcmQgaW1wbGljaXRseSBib3VuZCBieSBtYXRjaGluZyBwYXJhbWV0ZXIgYm91bmRzCglwdWJsaWMgdm9pZCB0ZXN0MTAyKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBBWD4ge1xuIiArIAoJCQkJIiAgICBUIHQ7XG4iICsgCgkJCQkiICAgIFgoVCB0KXtcbiIgKyAKCQkJCSIgICAgICAgIHRoaXMudCA9IHQ7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJWDw/PiB4ID0gbmV3IFg8Qlg8U3RyaW5nPj4obmV3IEJYPFN0cmluZz4oKSk7XG4iICsgCgkJCQkiCQl4LnQuZm9vKFwiU1VDQ1wiKTtcbiIgKyAKCQkJCSIJCXgudC5iYXIoXCJFU1NcIik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgQVg8UD4ge1xuIiArIAoJCQkJIiAgIHZvaWQgZm9vKFAgcCkgeyBcbiIgKyAKCQkJCSIJCVN5c3RlbS5vdXQucHJpbnQocCk7XG4iICsgCgkJCQkiICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBCWDxRPiBleHRlbmRzIEFYPFE+IHtcbiIgKyAKCQkJCSIgICB2b2lkIGJhcihRIHEpIHsgXG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4ocSk7XG4iICsgCgkJCQkiICAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCXgudC5mb28oXCJTVUNDXCIpO1xuIiArIAoJCQkiCV5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBtZXRob2QgZm9vKE9iamVjdCkgYmVsb25ncyB0byB0aGUgcmF3IHR5cGUgQVguIFJlZmVyZW5jZXMgdG8gZ2VuZXJpYyB0eXBlIEFYPFA+IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkJIgl4LnQuYmFyKFwiRVNTXCIpO1xuIiArIAoJCQkiCSAgICBeXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgYmFyKFN0cmluZykgaXMgdW5kZWZpbmVkIGZvciB0aGUgdHlwZSBjYXB0dXJlLW9mID9cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwkJCgl9CQkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg1MzAzCglwdWJsaWMgdm9pZCB0ZXN0MTAzKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VCBleHRlbmRzIEFYPiB7XG4iICsgCgkJCQkiICAgIFQgdDtcbiIgKyAKCQkJCSIgICAgWChUIHQpe1xuIiArIAoJCQkJIiAgICAgICAgdGhpcy50ID0gdDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlYPD8gZXh0ZW5kcyBCWD4geCA9IG5ldyBYPEJYPFN0cmluZz4+KG5ldyBCWDxTdHJpbmc+KCkpO1xuIiArIAoJCQkJIgkJeC50LmZvbyhcIlNVQ0NcIik7XG4iICsgCgkJCQkiCQl4LnQuYmFyKFwiRVNTXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIEFYPFA+IHtcbiIgKyAKCQkJCSIgICB2b2lkIGZvbyhQIHApIHsgXG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50KHApO1xuIiArIAoJCQkJIiAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgQlg8UT4gZXh0ZW5kcyBBWDxRPiB7XG4iICsgCgkJCQkiICAgdm9pZCBiYXIoUSBxKSB7IFxuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKHEpO1xuIiArIAoJCQkJIiAgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwkJCgkJU3RyaW5nIGV4cGVjdGVkT3V0cHV0ID0KCQkJIiAgLy8gTWV0aG9kIGRlc2NyaXB0b3IgIzI1IChbTGphdmEvbGFuZy9TdHJpbmc7KVZcbiIgKyAKCQkJIiAgLy8gU3RhY2s6IDQsIExvY2FsczogMlxuIiArIAoJCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKTtcbiIgKyAKCQkJIiAgICAgMCAgbmV3IFggWzJdXG4iICsgCgkJCSIgICAgIDMgIGR1cFxuIiArIAoJCQkiICAgICA0ICBuZXcgQlggWzI3XVxuIiArIAoJCQkiICAgICA3ICBkdXBcbiIgKyAKCQkJIiAgICAgOCAgaW52b2tlc3BlY2lhbCBCWCgpIFsyOF1cbiIgKyAKCQkJIiAgICAxMSAgaW52b2tlc3BlY2lhbCBYKEFYKSBbMzBdXG4iICsgCgkJCSIgICAgMTQgIGFzdG9yZV8xIFt4XVxuIiArIAoJCQkiICAgIDE1ICBhbG9hZF8xIFt4XVxuIiArIAoJCQkiICAgIDE2ICBnZXRmaWVsZCBYLnQgOiBBWCBbMTddXG4iICsgCgkJCSIgICAgMTkgIGNoZWNrY2FzdCBCWCBbMjddXG4iICsgCgkJCSIgICAgMjIgIGxkYyA8U3RyaW5nIFwiU1VDQ1wiPiBbMzJdXG4iICsgCgkJCSIgICAgMjQgIGludm9rZXZpcnR1YWwgQlguZm9vKGphdmEubGFuZy5PYmplY3QpIDogdm9pZCAgWzM2XVxuIiArIAoJCQkiICAgIDI3ICBhbG9hZF8xIFt4XVxuIiArIAoJCQkiICAgIDI4ICBnZXRmaWVsZCBYLnQgOiBBWCBbMTddXG4iICsgCgkJCSIgICAgMzEgIGNoZWNrY2FzdCBCWCBbMjddXG4iICsgCgkJCSIgICAgMzQgIGxkYyA8U3RyaW5nIFwiRVNTXCI+IFszOF1cbiIgKyAKCQkJIiAgICAzNiAgaW52b2tldmlydHVhbCBCWC5iYXIoamF2YS5sYW5nLk9iamVjdCkgOiB2b2lkICBbNDFdXG4iICsgCgkJCSIgICAgMzkgIHJldHVyblxuIiArIAoJCQkiICAgICAgTGluZSBudW1iZXJzOlxuIiArIAoJCQkiICAgICAgICBbcGM6IDAsIGxpbmU6IDddXG4iICsgCgkJCSIgICAgICAgIFtwYzogMTUsIGxpbmU6IDhdXG4iICsgCgkJCSIgICAgICAgIFtwYzogMjcsIGxpbmU6IDldXG4iICsgCgkJCSIgICAgICAgIFtwYzogMzksIGxpbmU6IDEwXVxuIiArIAoJCQkiICAgICAgTG9jYWwgdmFyaWFibGUgdGFibGU6XG4iICsgCgkJCSIgICAgICAgIFtwYzogMCwgcGM6IDQwXSBsb2NhbDogYXJncyBpbmRleDogMCB0eXBlOiBqYXZhLmxhbmcuU3RyaW5nW11cbiIgKyAKCQkJIiAgICAgICAgW3BjOiAxNSwgcGM6IDQwXSBsb2NhbDogeCBpbmRleDogMSB0eXBlOiBYXG4iICsgCgkJCSIgICAgICBMb2NhbCB2YXJpYWJsZSB0eXBlIHRhYmxlOlxuIiArIAoJCQkiICAgICAgICBbcGM6IDE1LCBwYzogNDBdIGxvY2FsOiB4IGluZGV4OiAxIHR5cGU6IFg8PyBleHRlbmRzIEJYPlxuIjsKCQkKCQl0cnkgewoJCQlGaWxlIGYgPSBuZXcgRmlsZShPVVRQVVRfRElSICsgRmlsZS5zZXBhcmF0b3IgKyAiWC5jbGFzcyIpOwoJCQlieXRlW10gY2xhc3NGaWxlQnl0ZXMgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldEZpbGVCeXRlQ29udGVudChmKTsKCQkJQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIgZGlzYXNzZW1ibGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyKCk7CgkJCVN0cmluZyByZXN1bHQgPSBkaXNhc3NlbWJsZXIuZGlzYXNzZW1ibGUoY2xhc3NGaWxlQnl0ZXMsICJcbiIsIENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyLkRFVEFJTEVEKTsKCQkJaW50IGluZGV4ID0gcmVzdWx0LmluZGV4T2YoZXhwZWN0ZWRPdXRwdXQpOwoJCQlpZiAoaW5kZXggPT0gLTEgfHwgZXhwZWN0ZWRPdXRwdXQubGVuZ3RoKCkgPT0gMCkgewoJCQkJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuZGlzcGxheVN0cmluZyhyZXN1bHQsIDMpKTsKCQkJfQoJCQlpZiAoaW5kZXggPT0gLTEpIHsKCQkJCWFzc2VydEVxdWFscygiV3JvbmcgY29udGVudHMiLCBleHBlY3RlZE91dHB1dCwgcmVzdWx0KTsKCQkJfQoJCX0gY2F0Y2ggKG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb24gZSkgewoJCQlhc3NlcnRUcnVlKGZhbHNlKTsKCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CgkJCWFzc2VydFRydWUoZmFsc2UpOwoJCX0KCX0KCgkvLyB3aWxkY2FyZCBib3VuZCBjaGVjawoJcHVibGljIHZvaWQgdGVzdDEwNCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUIGV4dGVuZHMgQVg+IHtcbiIgKyAKCQkJCSIgICAgVCB0O1xuIiArIAoJCQkJIiAgICBYKFQgdCl7XG4iICsgCgkJCQkiICAgICAgICB0aGlzLnQgPSB0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCVg8PyBleHRlbmRzIEJYPiB4ID0gbmV3IFg8QVg8U3RyaW5nPj4obmV3IEFYPFN0cmluZz4oKSk7XG4iICsgCgkJCQkiCQl4LnQuZm9vKFwiU1VDQ1wiKTtcbiIgKyAKCQkJCSIJCXgudC5iYXIoXCJFU1NcIik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgQVg8UD4ge1xuIiArIAoJCQkJIiAgIHZvaWQgZm9vKFAgcCkgeyBcbiIgKyAKCQkJCSIJCVN5c3RlbS5vdXQucHJpbnQocCk7XG4iICsgCgkJCQkiICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBCWDxRPiBleHRlbmRzIEFYPFE+IHtcbiIgKyAKCQkJCSIgICB2b2lkIGJhcihRIHEpIHsgXG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4ocSk7XG4iICsgCgkJCQkiICAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJIglYPD8gZXh0ZW5kcyBCWD4geCA9IG5ldyBYPEFYPFN0cmluZz4+KG5ldyBBWDxTdHJpbmc+KCkpO1xuIiArIAoJCSIJICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBYPEFYPFN0cmluZz4+IHRvIFg8PyBleHRlbmRzIEJYPlxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJIgl4LnQuZm9vKFwiU1VDQ1wiKTtcbiIgKyAKCQkiCV5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJUeXBlIHNhZmV0eTogVGhlIG1ldGhvZCBmb28oT2JqZWN0KSBiZWxvbmdzIHRvIHRoZSByYXcgdHlwZSBBWC4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgQVg8UD4gc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWRcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIzLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA5KVxuIiArIAoJCSIJeC50LmJhcihcIkVTU1wiKTtcbiIgKyAKCQkiCV5eXl5eXl5eXl5eXl5eXG4iICsgCgkJIlR5cGUgc2FmZXR5OiBUaGUgbWV0aG9kIGJhcihPYmplY3QpIGJlbG9uZ3MgdG8gdGhlIHJhdyB0eXBlIEJYLiBSZWZlcmVuY2VzIHRvIGdlbmVyaWMgdHlwZSBCWDxRPiBzaG91bGQgYmUgcGFyYW1ldGVyaXplZFxuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsJCQoJfQkJCQoJcHVibGljIHZvaWQgdGVzdDEwNSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBBWD4ge1xuIiArIAoJCQkJIiAgICBUIHQ7XG4iICsgCgkJCQkiICAgIFgoVCB0KXtcbiIgKyAKCQkJCSIgICAgICAgIHRoaXMudCA9IHQ7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJWDw/IGV4dGVuZHMgQVg+IHggPSBuZXcgWDxBWDxTdHJpbmc+PihuZXcgQVg8U3RyaW5nPigpKTtcbiIgKyAKCQkJCSIJCXgudC5mb28oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIEFYPFA+IHtcbiIgKyAKCQkJCSIgICB2b2lkIGZvbyhQIHApIHsgXG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4ocCk7XG4iICsgCgkJCQkiICAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIik7CQkKCX0JCQkKCXB1YmxpYyB2b2lkIHRlc3QxMDYoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUIGV4dGVuZHMgQVg+IHtcbiIgKyAKCQkJCSIgICAgVCB0O1xuIiArIAoJCQkJIiAgICBYKFQgdCl7XG4iICsgCgkJCQkiICAgICAgICB0aGlzLnQgPSB0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIFg8Qlg8U3RyaW5nPj4geCA9IG5ldyBYPEJYPFN0cmluZz4+KG5ldyBCWDxTdHJpbmc+KCkpO1xuIiArIAoJCQkJIgkJeC50LmZvbyhcIlNVQ0NcIik7XG4iICsgCgkJCQkiCQl4LnQuYmFyKFwiRVNTXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIEFYPFA+IHtcbiIgKyAKCQkJCSIgICB2b2lkIGZvbyhQIHApIHsgXG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50KHApO1xuIiArIAoJCQkJIiAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgQlg8UT4gZXh0ZW5kcyBBWDxRPiB7XG4iICsgCgkJCQkiICAgdm9pZCBiYXIoUSBxKSB7IFxuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKHEpO1xuIiArIAoJCQkJIiAgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwkJCgl9CQkJCgkvLyB1bnNhZmUgYXNzaWdubWVudCB0aHJ1IGJpbmFyaWVzCglwdWJsaWMgdm9pZCB0ZXN0MTA3KCkgewoJCU1hcCBjdXN0b21PcHRpb25zID0gZ2V0Q29tcGlsZXJPcHRpb25zKCk7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCAge1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgXG4iICsgCgkJCQkiICAgICAgICBJdGVyYWJsZTxTdHJpbmc+IGlzID0gbmV3IEFycmF5TGlzdCgpO1xuIiArIAoJCQkJIgkJaXMuaXRlcmF0b3IoKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCUl0ZXJhYmxlPFN0cmluZz4gaXMgPSBuZXcgQXJyYXlMaXN0KCk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBleHByZXNzaW9uIG9mIHR5cGUgQXJyYXlMaXN0IG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG8gSXRlcmFibGU8U3RyaW5nPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiwKCQkJbnVsbCwKCQkJdHJ1ZSwKCQkJY3VzdG9tT3B0aW9ucyk7CQkKCX0JCQkKCS8vIGNsYXNzIGxpdGVyYWw6IEludGVnZXIuY2xhc3Mgb2YgdHlwZSBDbGFzczxJbnRlZ2VyPgoJcHVibGljIHZvaWQgdGVzdDEwOCgpIHsKCSAgICAvLyBhbHNvIGVuc3VyZSBubyB1bnNhZmUgdHlwZSBvcGVyYXRpb24gcHJvYmxlbSBpcyBpc3N1ZWQgKGFzc2lnbm1lbnQgdG8gdmFyaWFibGUgb2YgdHlwZSByYXcpCgkJTWFwIGN1c3RvbU9wdGlvbnMgPSBnZXRDb21waWxlck9wdGlvbnMoKTsKCQljdXN0b21PcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVuY2hlY2tlZFR5cGVPcGVyYXRpb24sIENvbXBpbGVyT3B0aW9ucy5FUlJPUik7CQkJICAgIAoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIiAgICBDbGFzcyBrO1xuIiArIAoJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHtcbiIgKyAKCQkJIiAgICAgICAgbmV3IFgoKS5mb28oKTtcbiIgKyAKCQkJIiAgICB9XG4iICsgCgkJCSIgICAgdm9pZCBmb28oKSB7XG4iICsgCgkJCSIgICAgICAgIENsYXNzIGMgPSB0aGlzLmdldENsYXNzKCk7XG4iICsgCgkJCSIgICAgICAgIHRoaXMuayA9IHRoaXMuZ2V0Q2xhc3MoKTtcbiIgKyAKCQkJIiAgICAgICAgdGhpcy5rID0gSW50ZWdlci5jbGFzcztcbiIgKyAKCQkJIiAgICAgICAgdHJ5IHtcbiIgKyAKCQkJIiAgICAgICAgICAgIEludGVnZXIgaSA9IEludGVnZXIuY2xhc3MubmV3SW5zdGFuY2UoKTtcbiIgKyAKCQkJIiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHtcbiIgKyAKCQkJIiAgICAgICAgfVxuIiArIAoJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkiICAgIH1cbiIgKyAKCQkJIn1cbiIsCgkJCX0sCgkJIlNVQ0NFU1MiLAoJCW51bGwsCgkJdHJ1ZSwKCQludWxsLAoJCWN1c3RvbU9wdGlvbnMsCgkJbnVsbC8qbm8gY3VzdG9tIHJlcXVlc3RvciovKTsJCQoJfQkKCS8vIHBhcmFtZXRlcml6ZWQgaW50ZXJmYWNlIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCBzaW11bHRhbmVvdXNseSB3aXRoIGRpc3RpbmN0IGFyZ3VtZW50cwoJcHVibGljIHZvaWQgdGVzdDEwOSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIGltcGxlbWVudHMgQVg8U3RyaW5nPiB7fVxuIiArIAoJCQkJImNsYXNzIFkgZXh0ZW5kcyBYIGltcGxlbWVudHMgQVg8VGhyZWFkPiB7fVxuIiArIAoJCQkJImludGVyZmFjZSBBWDxQPiB7fVxuIiArIAoJCQkJIlxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyKVxuIiArIAoJCQkiCWNsYXNzIFkgZXh0ZW5kcyBYIGltcGxlbWVudHMgQVg8VGhyZWFkPiB7fVxuIiArIAoJCQkiCSAgICAgIF5cbiIgKyAKCQkJIlRoZSBpbnRlcmZhY2UgQVggY2Fubm90IGJlIGltcGxlbWVudGVkIG1vcmUgdGhhbiBvbmNlIHdpdGggZGlmZmVyZW50IGFyZ3VtZW50czogQVg8VGhyZWFkPiBhbmQgQVg8U3RyaW5nPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCXB1YmxpYyB2b2lkIHRlc3QxMTAoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCBpbXBsZW1lbnRzIEFYIHt9XG4iICsgCgkJCQkiY2xhc3MgWSBleHRlbmRzIFggaW1wbGVtZW50cyBBWDxUaHJlYWQ+IHt9XG4iICsgCgkJCQkiaW50ZXJmYWNlIEFYPFA+IHt9XG4iICsgCgkJCQkiXG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDIpXG4iICsgCgkJCSIJY2xhc3MgWSBleHRlbmRzIFggaW1wbGVtZW50cyBBWDxUaHJlYWQ+IHt9XG4iICsgCgkJCSIJICAgICAgXlxuIiArIAoJCQkiVGhlIGludGVyZmFjZSBBWCBjYW5ub3QgYmUgaW1wbGVtZW50ZWQgbW9yZSB0aGFuIG9uY2Ugd2l0aCBkaWZmZXJlbnQgYXJndW1lbnRzOiBBWDxUaHJlYWQ+IGFuZCBBWFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7CQkKCX0JCQoJcHVibGljIHZvaWQgdGVzdDExMSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIGltcGxlbWVudHMgQVg8T2JqZWN0PiB7fVxuIiArIAoJCQkJImNsYXNzIFkgZXh0ZW5kcyBYIGltcGxlbWVudHMgQVgge31cbiIgKyAKCQkJCSJpbnRlcmZhY2UgQVg8UD4ge31cbiIgKyAKCQkJCSJcbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKCQkJIgljbGFzcyBZIGV4dGVuZHMgWCBpbXBsZW1lbnRzIEFYIHt9XG4iICsgCgkJCSIJICAgICAgXlxuIiArIAoJCQkiVGhlIGludGVyZmFjZSBBWCBjYW5ub3QgYmUgaW1wbGVtZW50ZWQgbW9yZSB0aGFuIG9uY2Ugd2l0aCBkaWZmZXJlbnQgYXJndW1lbnRzOiBBWCBhbmQgQVg8T2JqZWN0PlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7CQkKCX0JCQoJLy8gdGVzdCBtZW1iZXIgdHlwZXMKCXB1YmxpYyB2b2lkIHRlc3QxMTIoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VCBleHRlbmRzIFg8WC5NWC5NTVg+Lk1YPFJ1bm5hYmxlPi5NTVg8SXRlcmFibGU8U3RyaW5nPj4+e1xuIiArIAoJCQkJIiAgICB2b2lkIGZvbyhYPFRocmVhZD4uTVg8U3RyaW5nPi5NTVg8WD4gbXgpIHt9XG4iICsgCgkJCQkiICAgIGNsYXNzIE1YIDxNVD4ge1xuIiArIAoJCQkJIiAgICAgICAgY2xhc3MgTU1YIDxNTVQ+IHt9XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBYPFguTVguTU1YPi5NWDxSdW5uYWJsZT4uTU1YPEl0ZXJhYmxlPFN0cmluZz4+PntcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5cbiIgKyAKCQkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSBYLk1YLk1NWCBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFQgZXh0ZW5kcyBYPFguTVguTU1YPi5NWDxSdW5uYWJsZT4uTU1YPEl0ZXJhYmxlPFN0cmluZz4+PiBvZiB0aGUgdHlwZSBYPFQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKCQkJIgl2b2lkIGZvbyhYPFRocmVhZD4uTVg8U3RyaW5nPi5NTVg8WD4gbXgpIHt9XG4iICsgCgkJCSIJICAgICAgICAgICBeXl5eXl5cbiIgKyAKCQkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSBUaHJlYWQgaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgWDxYLk1YLk1NWD4uTVg8UnVubmFibGU+Lk1NWDxJdGVyYWJsZTxTdHJpbmc+Pj4gb2YgdGhlIHR5cGUgWDxUPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7CQkKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUIGV4dGVuZHMgWDxYLk1YLk1NWD4uTVg8UnVubmFibGU+Lk1NWDxJdGVyYWJsZTxTdHJpbmc+Pj57XG4iICsgCgkJCQkiICAgIGNsYXNzIE1YIDxNVCBleHRlbmRzIENvbXBhcmFibGU+IHtcbiIgKyAKCQkJCSIgICAgICAgIGNsYXNzIE1NWCA8TU1UPiB7fVxuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYIDxUIGV4dGVuZHMgWDxYLk1YLk1NWD4uTVg8UnVubmFibGU+Lk1NWDxJdGVyYWJsZTxTdHJpbmc+Pj57XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXG4iICsgCgkJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgWC5NWC5NTVggaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgWDxYLk1YLk1NWD4uTVg8UnVubmFibGU+Lk1NWDxJdGVyYWJsZTxTdHJpbmc+Pj4gb2YgdGhlIHR5cGUgWDxUPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBYPFguTVguTU1YPi5NWDxSdW5uYWJsZT4uTU1YPEl0ZXJhYmxlPFN0cmluZz4+PntcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXG4iICsgCgkJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgUnVubmFibGUgaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxNVCBleHRlbmRzIENvbXBhcmFibGU+IG9mIHRoZSB0eXBlIFg8VD4uTVg8TVQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUIGV4dGVuZHMgWDxYLk1YLk1NWD4uTVg8UnVubmFibGU+Lk1NWDxJdGVyYWJsZTxTdHJpbmc+Pj57XG4iICsgCgkJCQkiICAgIGNsYXNzIE1YIDxNVD4ge1xuIiArIAoJCQkJIiAgICAgICAgY2xhc3MgTU1YIDxNTVQgZXh0ZW5kcyBDb21wYXJhYmxlPiB7fVxuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYIDxUIGV4dGVuZHMgWDxYLk1YLk1NWD4uTVg8UnVubmFibGU+Lk1NWDxJdGVyYWJsZTxTdHJpbmc+Pj57XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXG4iICsgCgkJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgWC5NWC5NTVggaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgWDxYLk1YLk1NWD4uTVg8UnVubmFibGU+Lk1NWDxJdGVyYWJsZTxTdHJpbmc+Pj4gb2YgdGhlIHR5cGUgWDxUPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBYPFguTVguTU1YPi5NWDxSdW5uYWJsZT4uTU1YPEl0ZXJhYmxlPFN0cmluZz4+PntcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5cbiIgKyAKCQkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSBJdGVyYWJsZTxTdHJpbmc+IGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8TU1UIGV4dGVuZHMgQ29tcGFyYWJsZT4gb2YgdGhlIHR5cGUgWDxUPi5NWDxNVD4uTU1YPE1NVD5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQoJcHVibGljIHZvaWQgdGVzdDExMygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIiAgY2xhc3MgTVg8VT4ge1xuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICBuZXcgWDxUaHJlYWQ+KCkuZm9vKCk7XG4iICsgCgkJCQkiCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKCQkJCSIJCW5ldyBYPFN0cmluZz4oKS5uZXcgTVg8VD4oKTtcbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwkJCgl9CQkKCXB1YmxpYyB2b2lkIHRlc3QxMTQoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJCSIgIGNsYXNzIE1YPFU+IHtcbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgbmV3IFg8VGhyZWFkPigpLmZvbyhuZXcgWDxTdHJpbmc+KCkubmV3IE1YPFRocmVhZD4oKSk7XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkiICB2b2lkIGZvbyhYPFN0cmluZz4uTVg8VGhyZWFkPiBteCkge1xuIiArIAoJCQkJIglTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIik7CQkKCX0JCQkKCXB1YmxpYyB2b2lkIHRlc3QxMTUoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJCSIgIGNsYXNzIE1YPFU+IHtcbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgbmV3IFg8VGhyZWFkPigpLmZvbyhuZXcgWDxTdHJpbmc+KCkubmV3IE1YPFRocmVhZD4oKSk7XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkiICB2b2lkIGZvbyhYLk1YIG14KSB7XG4iICsgCgkJCQkiCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsJCQoJfQkJCglwdWJsaWMgdm9pZCB0ZXN0MTE2KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPiB7XG4iICsgCgkJCQkiICBjbGFzcyBNWDxVPiB7XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgIG5ldyBYPFRocmVhZD4oKS5mb28obmV3IFg8U3RyaW5nPigpLm5ldyBNWDxUaHJlYWQ+KCkpO1xuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIiAgdm9pZCBmb28oWDw/Pi5NWDw/PiBteCkge1xuIiArIAoJCQkJIglTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIik7CQkKCX0JCQkKCS8vIHRlc3QgbWVtYmVyIHR5cGVzCglwdWJsaWMgdm9pZCB0ZXN0MTE3KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBYPFguTVguTU1YPi5NWDxSdW5uYWJsZT4uTU1YPEl0ZXJhYmxlPFN0cmluZz4+PntcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIFxuIiArIAoJCQkJIiAgICAgICAgbmV3IFg8WDxYLk1YLk1NWD4uTVg8UnVubmFibGU+Lk1NWDxJdGVyYWJsZTxTdHJpbmc+Pj4oKS5uZXcgTVg8RXhjZXB0aW9uPigpO1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICB2b2lkIGZvbyhYPFguTVguTU1YPi5NWDxYPi5NTVg8WD4gbXgpIHtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgY2xhc3MgTVggPE1UPiB7XG4iICsgCgkJCQkiICAgICAgICBjbGFzcyBNTVggPE1NVD4ge1xuIiArIAoJCQkJIiAgICAgICAgfVxuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxKVxyXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBYPFguTVguTU1YPi5NWDxSdW5uYWJsZT4uTU1YPEl0ZXJhYmxlPFN0cmluZz4+PntcclxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXlxuIiArIAoJCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlIFguTVguTU1YIGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VCBleHRlbmRzIFg8WC5NWC5NTVg+Lk1YPFJ1bm5hYmxlPi5NTVg8SXRlcmFibGU8U3RyaW5nPj4+IG9mIHRoZSB0eXBlIFg8VD5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxyXG4iICsgCgkJCSIJbmV3IFg8WDxYLk1YLk1NWD4uTVg8UnVubmFibGU+Lk1NWDxJdGVyYWJsZTxTdHJpbmc+Pj4oKS5uZXcgTVg8RXhjZXB0aW9uPigpO1xyXG4iICsgCgkJCSIJICAgICAgICBeXl5eXl5eXlxuIiArIAoJCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlIFguTVguTU1YIGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VCBleHRlbmRzIFg8WC5NWC5NTVg+Lk1YPFJ1bm5hYmxlPi5NTVg8SXRlcmFibGU8U3RyaW5nPj4+IG9mIHRoZSB0eXBlIFg8VD5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3KVxyXG4iICsgCgkJCSIJdm9pZCBmb28oWDxYLk1YLk1NWD4uTVg8WD4uTU1YPFg+IG14KSB7XHJcbiIgKyAKCQkJIgkgICAgICAgICAgIF5eXl5eXl5eXG4iICsgCgkJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgWC5NWC5NTVggaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgWDxYLk1YLk1NWD4uTVg8UnVubmFibGU+Lk1NWDxJdGVyYWJsZTxTdHJpbmc+Pj4gb2YgdGhlIHR5cGUgWDxUPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7CQkKCX0JCQkJCgkvLyB0ZXN0IGdlbmVyaWMgbWV0aG9kIHdpdGggcmVjdXJzaXZlIHBhcmFtZXRlciBib3VuZCA8VCBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBUPj4KCXB1YmxpYyB2b2lkIHRlc3QxMTgoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNvcnQobmV3IGphdmEudXRpbC5MaW5rZWRMaXN0PFN0cmluZz4oKSk7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQoJLy8gdGVzdCBiaW5hcnkgbWVtYmVyIHR5cGVzCglwdWJsaWMgdm9pZCBfdGVzdDExOSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBYPFguTVguTU1YPi5NWDxSdW5uYWJsZT4uTU1YPEl0ZXJhYmxlPFN0cmluZz4+PntcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIFxuIiArIAoJCQkJIiAgICAgICAgbmV3IFg8WDxYLk1YLk1NWD4uTVg8UnVubmFibGU+Lk1NWDxJdGVyYWJsZTxTdHJpbmc+Pj4oKS5uZXcgTVg8RXhjZXB0aW9uPigpO1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICB2b2lkIGZvbyhYPFguTVguTU1YPi5NWDxPYmplY3Q+Lk1NWDxYPiBteCkge1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHZvaWQgZm9vMihYPFguTVguTU1YPi5NWDxJdGVyYWJsZT4uTU1YPFg+IG14KSB7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgdm9pZCBmb28zKFg8WDxYLk1YLk1NWD4uTVg8UnVubmFibGU+Lk1NWDxJdGVyYWJsZTxTdHJpbmc+Pj4gbXgpIHtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgY2xhc3MgTVggPE1UPiB7XG4iICsgCgkJCQkiICAgICAgICBjbGFzcyBNTVggPE1NVD4ge1xuIiArIAoJCQkJIiAgICAgICAgfVxuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiCgkJCS8vIGphdmFjIGZhaWxzIHdpdGggNiBlcnJvcnMgdGhhdCBjb21wbGFpbiB0aGF0IHR5cGUgcGFyYW1ldGVycyBhcmUgbm90IHdpdGhpbiB0aGVpciBib3VuZHMKCQkpOwoKCQkvLyBUT0RPIChwaGlsaXBwZSkgYm91bmRzIGNoZWNrcyBhcmUgZG9uZSBiZWZvcmUgYmluYXJ5VHlwZSBYIGlzIGZpbmlzaGVkIGNyZWF0aW5nIGl0cyB0eXBlIHZhcmlhYmxlcwoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWS5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWSBleHRlbmRzIFgge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIiwKCQkJbnVsbCwKCQkJZmFsc2UsIC8vIGRvIG5vdCBmbHVzaCBvdXRwdXQKCQkJbnVsbCk7CQkKCX0KCS8vIHRlc3QgZ2VuZXJpYyBtZXRob2QKCXB1YmxpYyB2b2lkIHRlc3QxMjAoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPntcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgXG4iICsgCgkJCQkiICAgICAgICBTdHJpbmcgcyA9IG5ldyBYPFN0cmluZz4oKS5mb28oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiICAgIDxVIGV4dGVuZHMgU3RyaW5nPiBUIGZvbyAoVSB1KSB7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odSk7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CQkJCgkvLyBzdWJzdGl0dXRlIGFycmF5IHR5cGVzCglwdWJsaWMgdm9pZCB0ZXN0MTIxKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VD4ge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQluZXcgWDxTdHJpbmc+KCkuZm9vKGFyZ3MpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICB2b2lkIGZvbyhUW10gdHMpIHtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkJCQoJLy8gZ2VuZXJpYyBtZXRob2Qgd2l0aCBtb3N0IHNwZWNpZmljIGNvbW1vbiBzdXBlcnR5cGU6IFUgLS0+IFN0cmluZwoJcHVibGljIHZvaWQgdGVzdDEyMigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQ+IHtcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJbmV3IFg8U3RyaW5nPigpLmZvbyhhcmdzLCBuZXcgWDxYPFN0cmluZz4+KCkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiICAgIDxVPiB2b2lkIGZvbyhVW10gdXMsIFg8WDxVPj4geHh1KSB7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCQkKCS8vIGludmFsaWQgcGFyYW1ldGVyaXplZCB0eXBlCglwdWJsaWMgdm9pZCB0ZXN0MTIzKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQ+IHtcbiIgKyAKCQkJCSIgICAgVDxTdHJpbmc+IHRzO1xuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKCQkJIglUPFN0cmluZz4gdHM7XG4iICsgCgkJCSIJXlxuIiArIAoJCQkiVGhlIHR5cGUgVCBpcyBub3QgZ2VuZXJpYzsgaXQgY2Fubm90IGJlIHBhcmFtZXRlcml6ZWQgd2l0aCBhcmd1bWVudHMgPFN0cmluZz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgkvLyBnZW5lcmljIG1ldGhvZCB3aXRoIGluZGlyZWN0IHR5cGUgaW5mZXJlbmNlOiBCWDxTdHJpbmcsIFRocmVhZD4gLS0+IEFYPFc+CglwdWJsaWMgdm9pZCB0ZXN0MTI0KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICA8Vz4gdm9pZCBmb28oQVg8Vz4gYXcpIHtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgICB9XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQluZXcgWCgpLmZvbyhuZXcgQlg8U3RyaW5nLFRocmVhZD4oKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgQVg8VD4ge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBCWDxVLCBWPiBleHRlbmRzIEFYPFY+IHtcbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkJCgkvLyBnZW5lcmljIG1ldGhvZCB3aXRoIGluZGlyZWN0IHR5cGUgaW5mZXJlbmNlOiBDWCAgLS0+IEFYPFc+CglwdWJsaWMgdm9pZCB0ZXN0MTI1KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICA8Vz4gdm9pZCBmb28oQVg8Vz4gYXcpIHtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgICB9XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQluZXcgWCgpLmZvbyhuZXcgQ1goKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgQVg8VD4ge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBCWDxVLCBWPiBleHRlbmRzIEFYPFY+IHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQ1ggZXh0ZW5kcyBCWDxTdHJpbmcsIFRocmVhZD4ge1xuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CQkJCgkvLyB2YXJpYXRpb24gb24gdGVzdDEyNSB3aXRoIHR5cG86IENYIGV4dGVuZHMgQiBpbnN0ZWFkIG9mIEJYLgoJcHVibGljIHZvaWQgdGVzdDEyNigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgXG4iICsgCgkJCQkiICAgIDxXPiB2b2lkIGZvbyhBWDxXPiBhdykge1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgIH1cbiIgKyAKCQkJCSIgICAgXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCW5ldyBYKCkuZm9vKG5ldyBDWCgpKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBBWDxUPiB7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEJYPFUsIFY+IGV4dGVuZHMgQVg8Vj4ge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBDWCBleHRlbmRzIEI8U3RyaW5nLCBUaHJlYWQ+IHtcbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJCSIJbmV3IFgoKS5mb28obmV3IENYKCkpO1xuIiArIAoJCQkiCSAgICAgICAgXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGZvbyhBWDxXPikgaW4gdGhlIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoQ1gpXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTYpXG4iICsgCgkJCSIJY2xhc3MgQ1ggZXh0ZW5kcyBCPFN0cmluZywgVGhyZWFkPiB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICBeXG4iICsgCgkJCSJCIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQoJLy8gNTc3ODQ6IHRlc3QgZ2VuZXJpYyBtZXRob2QKCXB1YmxpYyB2b2lkIHRlc3QxMjcoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgamF2YS51dGlsLkFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHtcIjFcIn0pO1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCgkvLyA1ODY2Njogc3BlY2lhbCB0cmVhdG1lbnQgZm9yIE9iamVjdCNnZXRDbGFzcyBkZWNsYXJlZCBvZiB0eXBlOiBDbGFzczw/IGV4dGVuZHMgT2JqZWN0PgoJLy8gYnV0IGltcGxpY2l0bHkgY29udmVydGVkIHRvIENsYXNzPD8gZXh0ZW5kcyBYPiBmb3IgZnJlZS4KCXB1YmxpYyB2b2lkIHRlc3QxMjgoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7IFxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlYIHggPSBuZXcgWCgpO1xuIiArIAoJCQkJIgkJQ2xhc3MgYzEgPSB4LmdldENsYXNzKCk7XG4iICsgCgkJCQkiCQlDbGFzczw/IGV4dGVuZHMgWD4gYzIgPSB4LmdldENsYXNzKCk7XG4iICsgCgkJCQkiCQlTdHJpbmcgcyA9IFwiaGVsbG9cIjtcbiIgKyAKCQkJCSIJCUNsYXNzPD8gZXh0ZW5kcyBYPiBjMyA9IHMuZ2V0Q2xhc3MoKTtcbiIgKyAKCQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglDbGFzczw/IGV4dGVuZHMgWD4gYzMgPSBzLmdldENsYXNzKCk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgIF5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIENsYXNzPGNhcHR1cmUtb2YgPyBleHRlbmRzIFN0cmluZz4gdG8gQ2xhc3M8PyBleHRlbmRzIFg+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJLy8gdmFyaWF0aW9uIG9uIHRlc3QxMjgKCXB1YmxpYyB2b2lkIHRlc3QxMjkoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7IFxuIiArIAoJCQkJIlxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlYWSB4eSA9IG5ldyBYWSgpO1xuIiArIAoJCQkJIgkJQ2xhc3MgYzEgPSB4eS5nZXRDbGFzcygpO1xuIiArIAoJCQkJIgkJQ2xhc3M8PyBleHRlbmRzIFhZPiBjMiA9IHh5LmdldENsYXNzKCk7XG4iICsgCgkJCQkiCQlTdHJpbmcgcyA9IFwiaGVsbG9cIjtcbiIgKyAKCQkJCSIJCUNsYXNzPD8gZXh0ZW5kcyBYWT4gYzMgPSBzLmdldENsYXNzKCk7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIFhZIGV4dGVuZHMgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBDbGFzcyA8PyBleHRlbmRzIE9iamVjdD4gZ2V0Q2xhc3MoKSB7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Q2xhc3MoKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCUNsYXNzPD8gZXh0ZW5kcyBYWT4gYzMgPSBzLmdldENsYXNzKCk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICBeXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBDbGFzczxjYXB0dXJlLW9mID8gZXh0ZW5kcyBTdHJpbmc+IHRvIENsYXNzPD8gZXh0ZW5kcyBYWT5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDE0KVxuIiArIAoJCQkiCXB1YmxpYyBDbGFzcyA8PyBleHRlbmRzIE9iamVjdD4gZ2V0Q2xhc3MoKSB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGdldENsYXNzKCkgb2YgdHlwZSBYWSBzaG91bGQgYmUgdGFnZ2VkIHdpdGggQE92ZXJyaWRlIHNpbmNlIGl0IGFjdHVhbGx5IG92ZXJyaWRlcyBhIHN1cGVyY2xhc3MgbWV0aG9kXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTQpXG4iICsgCgkJCSIJcHVibGljIENsYXNzIDw/IGV4dGVuZHMgT2JqZWN0PiBnZXRDbGFzcygpIHtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5cbiIgKyAKCQkJIkNhbm5vdCBvdmVycmlkZSB0aGUgZmluYWwgbWV0aG9kIGZyb20gT2JqZWN0XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKCS8vIGdldENsYXNzIG9uIGFycmF5IHR5cGUKCXB1YmxpYyB2b2lkIHRlc3QxMzAoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHsgXG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCVhbXSB4ID0gbmV3IFhbMF07XG4iICsgCgkJCQkiCQlDbGFzczw/IGV4dGVuZHMgWFtdPiBjID0geC5nZXRDbGFzcygpO1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCQkKCS8vIDU4OTc5CglwdWJsaWMgdm9pZCB0ZXN0MTMxKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIkFycmF5TGlzdC5qYXZhIiwKCQkJCSIgaW50ZXJmYWNlIExpc3Q8VD4ge1xuIiArIAoJCQkJIgkgTGlzdDxUPiBmb28oKTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiIGNsYXNzIEFycmF5TGlzdDxUPiBpbXBsZW1lbnRzIExpc3Q8VD4ge1xuIiArIAoJCQkJIglwdWJsaWMgTGlzdDxUPiBmb28oKSB7XG4iICsgCgkJCQkiCQlMaXN0PFQ+IGx0ID0gdGhpcztcbiIgKyAKCQkJCSIJCWx0LmJhcigpO1xuIiArIAoJCQkJIgkJcmV0dXJuIHRoaXM7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gQXJyYXlMaXN0LmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIglsdC5iYXIoKTtcbiIgKyAKCQkJIgkgICBeXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgYmFyKCkgaXMgdW5kZWZpbmVkIGZvciB0aGUgdHlwZSBMaXN0PFQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCXB1YmxpYyB2b2lkIHRlc3QxMzIoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKCQkJCSIgIDxUIGV4dGVuZHMgWDxXPi5aPiBmb28oKSB7fVxuIiArCgkJCQkifSIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyKVxuIiArIAoJCQkiCTxUIGV4dGVuZHMgWDxXPi5aPiBmb28oKSB7fVxuIiArIAoJCQkiCSAgICAgICAgICAgICBeXG4iICsgCgkJCSJXIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyKVxuIiArIAoJCQkiCTxUIGV4dGVuZHMgWDxXPi5aPiBmb28oKSB7fVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICBeXl5eXlxuIiArIAoJCQkiUmV0dXJuIHR5cGUgZm9yIHRoZSBtZXRob2QgaXMgbWlzc2luZ1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvLyBicmlkZ2UgbWV0aG9kCglwdWJsaWMgdm9pZCB0ZXN0MTMzKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPiB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIFggeCA9IG5ldyBZKCk7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oeC5mb28oKSk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICBUIGZvbygpIHtyZXR1cm4gbnVsbDt9XG4iICsgCgkJCQkiICAgdm9pZCBmb28oVCB0KSB7fVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBZIGV4dGVuZHMgWDxPYmplY3Q+IHtcbiIgKyAKCQkJCSIgICAgU3RyaW5nIGZvbygpIHtyZXR1cm4gXCJTVUNDRVNTXCI7fVxuIiArIAoJCQkJIiAgICB2b2lkIGZvbyhTdHJpbmcgcykge31cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MTM0KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWi5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDtcbiIgKyAKCQkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFogPFQgZXh0ZW5kcyBMaXN0PiB7IFxuIiArIAoJCQkJIiAgICBUIHQ7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIGZvbyhuZXcgWjxBcnJheUxpc3Q+KCkuc2V0KG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKSk7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIFo8VD4gc2V0KFQgdCkge1xuIiArIAoJCQkJIiAgICAgICAgdGhpcy50ID0gdDtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiB0aGlzO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIFQgZ2V0KCkgeyBcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiB0aGlzLnQ7IFxuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBzdGF0aWMgdm9pZCBmb28oWjw/IHN1cGVyIEFycmF5TGlzdD4gemEpIHtcbiIgKyAKCQkJCSIgICAgICAgIHphLmdldCgpLmlzRW1wdHkoKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCglwdWJsaWMgdm9pZCB0ZXN0MTM1KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlouamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFogPFQgZXh0ZW5kcyBaQT4geyBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgZm9vKG5ldyBaPFpBPigpKTtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgc3RhdGljIHZvaWQgZm9vKFo8PyBzdXBlciBTdHJpbmc+IHpzKSB7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgWkEge1xuIiArIAoJCQkJIiAgICB2b2lkIGZvbygpIHt9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIFpCIGV4dGVuZHMgWkEge1xuIiArIAoJCQkJIn0iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBaLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkJIglmb28obmV3IFo8WkE+KCkpO1xuIiArIAoJCQkiCV5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCBmb28oWjw/IHN1cGVyIFN0cmluZz4pIGluIHRoZSB0eXBlIFo8VD4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKFo8WkE+KVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWi5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJc3RhdGljIHZvaWQgZm9vKFo8PyBzdXBlciBTdHJpbmc+IHpzKSB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSA/IHN1cGVyIFN0cmluZyBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFQgZXh0ZW5kcyBaQT4gb2YgdGhlIHR5cGUgWjxUPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MTM2KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlouamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFogPFQgZXh0ZW5kcyBaQj4geyBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgZm9vKG5ldyBaPFpCPigpKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBzdGF0aWMgdm9pZCBmb28oWjw/IHN1cGVyIFpBPiB6cykge1xuIiArIAoJCQkJIiAgICAgICAgenMuZm9vKCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWkEge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBaQiBleHRlbmRzIFpBIHtcbiIgKyAKCQkJCSIgICAgdm9pZCBmb28oKSB7fVxuIiArIAoJCQkJIn0iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBaLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkJIglmb28obmV3IFo8WkI+KCkpO1xuIiArIAoJCQkiCV5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCBmb28oWjw/IHN1cGVyIFpBPikgaW4gdGhlIHR5cGUgWjxUPiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoWjxaQj4pXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBaLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIglzdGF0aWMgdm9pZCBmb28oWjw/IHN1cGVyIFpBPiB6cykge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5cbiIgKyAKCQkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSA/IHN1cGVyIFpBIGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VCBleHRlbmRzIFpCPiBvZiB0aGUgdHlwZSBaPFQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBFUlJPUiBpbiBaLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkJIgl6cy5mb28oKTtcbiIgKyAKCQkJIgkgICBeXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgZm9vKFo8PyBzdXBlciBaQT4pIGluIHRoZSB0eXBlIFo8Y2FwdHVyZS1vZiA/IHN1cGVyIFpBPiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoKVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MTM3KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWi5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDtcbiIgKyAKCQkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFogPFQgZXh0ZW5kcyBMaXN0PiB7IFxuIiArIAoJCQkJIiAgICBUIHQ7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIGZvbyhuZXcgWjxBcnJheUxpc3Q+KCkuc2V0KG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKSk7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIFo8VD4gc2V0KFQgdCkge1xuIiArIAoJCQkJIiAgICAgICAgdGhpcy50ID0gdDtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiB0aGlzO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIFQgZ2V0KCkgeyBcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiB0aGlzLnQ7IFxuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBzdGF0aWMgdm9pZCBmb28oWjw/IGV4dGVuZHMgQXJyYXlMaXN0PiB6YSkge1xuIiArIAoJCQkJIiAgICAgICAgemEuZ2V0KCkuaXNFbXB0eSgpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkJCgkvLyB1bmJvdW5kIHdpbGRjYXJkIHN0aWxsIHJlbWVtYmVycyBpdHMgdmFyaWFibGUgYm91bmQ6IFo8Pz4gYmVoYXZlcyBsaWtlIFo8QVg+CglwdWJsaWMgdm9pZCB0ZXN0MTM4KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWi5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWiA8VCBleHRlbmRzIEFYPiB7XG4iICsgCgkJCQkiICAgIFQgdDtcbiIgKyAKCQkJCSIgICAgWihUIHQpe1xuIiArIAoJCQkJIiAgICAgICAgdGhpcy50ID0gdDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQkgWjxBWDxTdHJpbmc+PiB6YXggPSBuZXcgWjxBWDxTdHJpbmc+PihuZXcgQVg8U3RyaW5nPigpKTtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIgICAgdm9pZCBiYXooWjw/PiB6dSl7XG4iICsgCgkJCQkiICAgICAgICB6dS50LmZvbyhudWxsKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBBWDxQPiB7XG4iICsgCgkJCQkiICAgdm9pZCBmb28oUCBwKSB7IFxuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludChwKTtcbiIgKyAKCQkJCSIgICB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkJCgkvLyBleHRlbmRpbmcgd2lsZGNhcmQgY29uc2lkZXJzIGl0cyBib3VuZCBwcmlvciB0byBpdHMgY29ycmVzcG9uZGluZyB2YXJpYWJsZQoJcHVibGljIHZvaWQgdGVzdDEzOSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQgZXh0ZW5kcyBBWD4ge1xuIiArIAoJCQkJIiAgICBUIHQ7XG4iICsgCgkJCQkiICAgIFgoVCB0KSB7XG4iICsgCgkJCQkiICAgICAgICB0aGlzLnQgPSB0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIFQgZ2V0KCkge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIHRoaXMudDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICB2b2lkIGJhcihYPD8gZXh0ZW5kcyBCWD4geCkge1xuIiArIAoJCQkJIiAgICAgICAgeC5nZXQoKS5hZm9vKCk7XG4iICsgCgkJCQkiICAgICAgICB4LmdldCgpLmJmb28oKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBBWCB7XG4iICsgCgkJCQkiICAgIHZvaWQgYWZvbygpIHt9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEJYIHtcbiIgKyAKCQkJCSIgICAgdm9pZCBiZm9vKCkge31cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJCSIJdm9pZCBiYXIoWDw/IGV4dGVuZHMgQlg+IHgpIHtcbiIgKyAKCQkJIgkgICAgICAgICAgIF5eXl5eXl5eXl5eXlxuIiArIAoJCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlID8gZXh0ZW5kcyBCWCBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFQgZXh0ZW5kcyBBWD4gb2YgdGhlIHR5cGUgWDxUPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEwKVxuIiArIAoJCQkiCXguZ2V0KCkuYWZvbygpO1xuIiArIAoJCQkiCSAgICAgICAgXl5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCBhZm9vKCkgaXMgdW5kZWZpbmVkIGZvciB0aGUgdHlwZSBjYXB0dXJlLW9mID8gZXh0ZW5kcyBCWFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCS8vIGV4dGVuZGluZyB3aWxkY2FyZCBjb25zaWRlcnMgaXRzIGJvdW5kIHByaW9yIHRvIGl0cyBjb3JyZXNwb25kaW5nIHZhcmlhYmxlCglwdWJsaWMgdm9pZCB0ZXN0MTQwKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUIGV4dGVuZHMgQVg+IHtcbiIgKyAKCQkJCSIgICAgVCB0O1xuIiArIAoJCQkJIiAgICBYKFQgdCkge1xuIiArIAoJCQkJIiAgICAgICAgdGhpcy50ID0gdDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBUIGdldCgpIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiB0aGlzLnQ7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgdm9pZCBiYXIoWDw/IGV4dGVuZHMgQlg+IHgpIHtcbiIgKyAKCQkJCSIgICAgICAgIHguZ2V0KCkuYWZvbygpO1xuIiArIAoJCQkJIiAgICAgICAgeC5nZXQoKS5iZm9vKCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBBWCB7XG4iICsgCgkJCQkiICAgIHZvaWQgYWZvbygpIHt9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEJYIGV4dGVuZHMgQVgge1xuIiArIAoJCQkJIiAgICB2b2lkIGJmb28oKSB7fVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CQkKCS8vIHN1cGVyIHdpbGRjYXJkIGNvbnNpZGVycyBpdHMgdmFyaWFibGUgZm9yIGxvb2t1cHMKCXB1YmxpYyB2b2lkIHRlc3QxNDEoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUIGV4dGVuZHMgQVg+IHtcbiIgKyAKCQkJCSIgICAgVCB0O1xuIiArIAoJCQkJIiAgICBYKFQgdCkge1xuIiArIAoJCQkJIiAgICAgICAgdGhpcy50ID0gdDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBUIGdldCgpIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiB0aGlzLnQ7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgdm9pZCBiYXIoWDw/IHN1cGVyIEJYPiB4KSB7XG4iICsgCgkJCQkiICAgICAgICB4LmdldCgpLmFmb28oKTtcbiIgKyAKCQkJCSIgICAgICAgIHguZ2V0KCkuYmZvbygpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEFYIHtcbiIgKyAKCQkJCSIgICAgdm9pZCBhZm9vKCkge31cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQlggZXh0ZW5kcyBBWCB7XG4iICsgCgkJCQkiICAgIHZvaWQgYmZvbygpIHt9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMSlcbiIgKyAKCQkJIgl4LmdldCgpLmJmb28oKTtcbiIgKyAKCQkJIgkgICAgICAgIF5eXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgYmZvbygpIGlzIHVuZGVmaW5lZCBmb3IgdGhlIHR5cGUgY2FwdHVyZS1vZiA/IHN1cGVyIEJYXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDE0MigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQgZXh0ZW5kcyBBWD4ge1xuIiArIAoJCQkJIiAgICBUIHQ7XG4iICsgCgkJCQkiICAgIFgoVCB0KSB7XG4iICsgCgkJCQkiICAgICAgICB0aGlzLnQgPSB0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIFQgZ2V0KCkge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIHRoaXMudDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICB2b2lkIGJhcihYPD8gZXh0ZW5kcyBYPiB4KSB7XG4iICsgCgkJCQkiICAgICAgICB4ID0gaWRlbnRpdHkoeCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgPFAgZXh0ZW5kcyBBWD4gWDxQPiBpZGVudGl0eShYPFA+IHgpIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiB4O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBBWCB7XG4iICsgCgkJCQkiICAgIHZvaWQgYWZvbygpIHt9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEJYIGV4dGVuZHMgQVgge1xuIiArIAoJCQkJIiAgICB2b2lkIGJmb28oKSB7fVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkJIgl2b2lkIGJhcihYPD8gZXh0ZW5kcyBYPiB4KSB7XG4iICsgCgkJCSIJICAgICAgICAgICBeXl5eXl5eXl5eXlxuIiArIAoJCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlID8gZXh0ZW5kcyBYIGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VCBleHRlbmRzIEFYPiBvZiB0aGUgdHlwZSBYPFQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTApXG4iICsgCgkJCSIJeCA9IGlkZW50aXR5KHgpO1xuIiArIAoJCQkiCSAgICBeXl5eXl5eXlxuIiArIAoJCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSBnZW5lcmljIG1ldGhvZCBpZGVudGl0eShYPFA+KSBvZiB0eXBlIFg8VD4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKFg8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgWD4pIHNpbmNlIHRoZSB0eXBlIGNhcHR1cmUtb2YgPyBleHRlbmRzIFggaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxQIGV4dGVuZHMgQVg+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKCXB1YmxpYyB2b2lkIHRlc3QxNDMoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBYPiB4eCA9IG51bGw7XG4iICsgCgkJCQkiICAgICAgICBDbGFzczw/IGV4dGVuZHMgT2JqZWN0PiB4byA9IHh4O1xuIiArIAoJCQkJIiAgICAgICAgQ2xhc3M8T2JqZWN0PiB4bzIgPSB4eDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIglDbGFzczxPYmplY3Q+IHhvMiA9IHh4O1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIENsYXNzPGNhcHR1cmUtb2YgPyBleHRlbmRzIFg+IHRvIENsYXNzPE9iamVjdD5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQoJcHVibGljIHZvaWQgdGVzdDE0NCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBDbGFzczw/IGV4dGVuZHMgWD4geHggPSBudWxsO1xuIiArIAoJCQkJIiAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE9iamVjdD4geG8gPSB4eDtcbiIgKyAKCQkJCSIgICAgICAgIFggeCA9IGdldCh4eCk7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHN0YXRpYyA8UD4gUCBnZXQoQ2xhc3M8UD4gY3ApIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiBudWxsO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0KCS8vIDU5NjQxOiBjaGVjayBhc3NpZ24vaW52b2tlIHdpdGggd2lsZGNhcmRzCglwdWJsaWMgdm9pZCB0ZXN0MTQ1KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlYTGlzdDw/PiBseCA9IG5ldyBYTGlzdDxYPigpO1xuIiArIAoJCQkJIgkJWCB4ID0gbHguZ2V0KCk7XG4iICsgCgkJCQkiCQlseC5hZGQobnVsbCk7XG4iICsgCgkJCQkiCQlseC5hZGQoeCk7XG4iICsgCgkJCQkiCQlseC5zbG90ID0geDtcbiIgKyAKCQkJCSIJCWx4LmFkZEFsbChseCk7XG4iICsgCgkJCQkiICAgIH0gICAgCVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBYTGlzdDxFIGV4dGVuZHMgWD4ge1xuIiArIAoJCQkJIiAgICBFIHNsb3Q7XG4iICsgCgkJCQkiICAgIHZvaWQgYWRkKEUgZSkge31cbiIgKyAKCQkJCSIgICAgRSBnZXQoKSB7IHJldHVybiBudWxsOyBcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICB2b2lkIGFkZEFsbChYTGlzdDxFPiBsZSkge31cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJbHguYWRkKHgpO1xuIiArIAoJCQkiCSAgIF5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCBhZGQoY2FwdHVyZS1vZiA/KSBpbiB0aGUgdHlwZSBYTGlzdDxjYXB0dXJlLW9mID8+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChYKVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJCSIJbHguc2xvdCA9IHg7XG4iICsgCgkJCSIJICAgICAgICAgIF5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gWCB0byBjYXB0dXJlLW9mID9cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCWx4LmFkZEFsbChseCk7XG4iICsgCgkJCSIJICAgXl5eXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGFkZEFsbChYTGlzdDxjYXB0dXJlLW9mID8+KSBpbiB0aGUgdHlwZSBYTGlzdDxjYXB0dXJlLW9mID8+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChYTGlzdDxjYXB0dXJlLW9mID8+KVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvLyA1OTYyOAoJcHVibGljIHZvaWQgdGVzdDE0NigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBBYnN0cmFjdExpc3Qge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsgcmV0dXJuIDA7IH1cbiIgKyAKCQkJCSIgICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQoJLy8gNTk3MjMKCXB1YmxpYyB2b2lkIHRlc3QxNDcoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkgICAgY2hhcltdW10gdG9rZW5zID0gbmV3IGNoYXJbMF1bXTtcbiIgKyAKCQkJCSIJICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpO1xuIiArIAoJCQkJIgkJbGlzdC50b0FycmF5KHRva2Vucyk7XG4iICsgCgkJCQkiICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgfSAgICAJXG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkKCS8vIGJyaWRnZSBtZXRob2QKCXB1YmxpYyB2b2lkIHRlc3QxNDgoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgQVg8U3RyaW5nPntcbiIgKyAKCQkJCSIgICAgXG4iICsgCgkJCQkiICAgIFN0cmluZyBmb28oU3RyaW5nIHMpIHtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzKTtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiBzO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJICAgbmV3IFgoKS5iYXIoXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9ICAgIAlcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQVg8VD4ge1xuIiArIAoJCQkJIiAgICBUIGZvbyhUIHQpIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiBudWxsO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHZvaWQgYmFyKFQgdCkge1xuIiArIAoJCQkJIiAgICAgICAgZm9vKHQpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkJCgkvLyBtZXRob2QgY29tcGF0aWJpbGl0eQoJcHVibGljIHZvaWQgdGVzdDE0OSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGFic3RyYWN0IGNsYXNzIFggaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29sbGVjdGlvbiB7XG4iICsgCgkJCQkiCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdFtdIGEpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBhO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYIGltcGxlbWVudHMgamF2YS51dGlsLkNvbGxlY3Rpb248T2JqZWN0PiB7XG4iICsgCgkJCQkiCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdFtdIGEpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBhO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKCQkJIglwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhKSB7XG4iICsgCgkJCSIJICAgICAgIF5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIHJldHVybiB0eXBlIE9iamVjdFtdIGZvciB0b0FycmF5KE9iamVjdFtdKSBmcm9tIHRoZSB0eXBlIFggbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBUW10gZnJvbSB0aGUgdHlwZSBDb2xsZWN0aW9uPEU+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKCXB1YmxpYyB2b2lkIHRlc3QxNTAoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgPFQgZXh0ZW5kcyBYPiB2b2lkIGZvbyhUW10gdGEsIExpc3Q8VD4gbHQpIHtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJbmV3IFgoKS5mb28oYXJncywgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJCSIJbmV3IFgoKS5mb28oYXJncywgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpO1xuIiArIAoJCQkiCSAgICAgICAgXl5eXG4iICsgCgkJCSJCb3VuZCBtaXNtYXRjaDogVGhlIGdlbmVyaWMgbWV0aG9kIGZvbyhUW10sIExpc3Q8VD4pIG9mIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoU3RyaW5nW10sIExpc3Q8U3RyaW5nPikgc2luY2UgdGhlIHR5cGUgU3RyaW5nIGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VCBleHRlbmRzIFg+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKCXB1YmxpYyB2b2lkIHRlc3QxNTEoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFggPEU+e1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgPFQgZXh0ZW5kcyBYPiBYKFRbXSB0YSwgTGlzdDxUPiBsdCkge1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQluZXcgWDxPYmplY3Q+KGFyZ3MsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCW5ldyBYPE9iamVjdD4oYXJncywgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpO1xuIiArIAoJCQkiCV5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJCb3VuZCBtaXNtYXRjaDogVGhlIGdlbmVyaWMgY29uc3RydWN0b3IgWChUW10sIExpc3Q8VD4pIG9mIHR5cGUgWDxFPiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoU3RyaW5nW10sIExpc3Q8U3RyaW5nPikgc2luY2UgdGhlIHR5cGUgU3RyaW5nIGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VCBleHRlbmRzIFg+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vIDYwNTU2CglwdWJsaWMgdm9pZCB0ZXN0MTUyKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIiAgICBMaXN0PFg+IHgoTGlzdDxYPiBsaXN0KSB7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChsaXN0KTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDE1MygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgQVg8WD4gYXggPSBuZXcgQVg8WD4oKTtcbiIgKyAKCQkJCSIgICAgICAgIEFYPFg+IGEgPSBiYXIoYXgpO1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIDxUPiBBWDxUPiBiYXIoQVg8PyBleHRlbmRzIFQ+IGEpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBudWxsO1xuIiArIAoJCQkJIiAgICB9ICAgIFxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBBWDxFPiB7XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkJCglwdWJsaWMgdm9pZCB0ZXN0MTU0KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBBWDxYPiBheCA9IG5ldyBBWDxYPigpO1xuIiArIAoJCQkJIiAgICAgICAgQVg8WD4gYSA9IGJhcihheCk7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEFYPFQ+IGJhcihBWDw/IHN1cGVyIFQ+IGEpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBudWxsO1xuIiArIAoJCQkJIiAgICB9ICAgIFxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBBWDxFPiB7XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkJCglwdWJsaWMgdm9pZCB0ZXN0MTU1KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBBWDxYPiBheCA9IG5ldyBBWDxYPigpO1xuIiArIAoJCQkJIiAgICAgICAgQVg8WD4gYSA9IGJhcihheCk7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEFYPFQ+IGJhcihBWDw/PiBhKSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIgICAgfSAgICBcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQVg8RT4ge1xuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDE1NigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIEFYPFg+IGF4ID0gbmV3IEFYPFg+KCk7XG4iICsgCgkJCQkiICAgICAgICBBWDxYPiBhID0gYmFyKGF4KTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIDxUPiBBWDxUPiBiYXIoQVg8Pz4gYSkge1xuIiArIAoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiICAgIH0gICAgXG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEFYPEUgZXh0ZW5kcyBYPiB7XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJCSIJcHVibGljIHN0YXRpYyA8VD4gQVg8VD4gYmFyKEFYPD8+IGEpIHtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICBeXG4iICsgCgkJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgVCBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPEUgZXh0ZW5kcyBYPiBvZiB0aGUgdHlwZSBBWDxFPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCglwdWJsaWMgdm9pZCB0ZXN0MTU3KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgQVg8WD4gYXggPSBuZXcgQVg8WD4oKTtcbiIgKyAKCQkJCSIgICAgICAgIEFYPFN0cmluZz4gYXMgPSBuZXcgQVg8U3RyaW5nPigpO1xuIiArIAoJCQkJIiAgICAgICAgQVg8WD4gYSA9IGJhcihheCwgYXMpO1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIDxULFU+IEFYPFQ+IGJhcihBWDw/IGV4dGVuZHMgVT4gYSwgQVg8PyBzdXBlciBVPiBiKSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIgICAgfSAgICBcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQVg8RT4ge1xuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCQkiCUFYPFg+IGEgPSBiYXIoYXgsIGFzKTtcbiIgKyAKCQkJIgkgICAgICAgICAgXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGJhcihBWDw/IGV4dGVuZHMgVT4sIEFYPD8gc3VwZXIgVT4pIGluIHRoZSB0eXBlIFggaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKEFYPFg+LCBBWDxTdHJpbmc+KVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MTU4KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBBWDxYPiBheCA9IG5ldyBBWDxYPigpO1xuIiArIAoJCQkJIiAgICAgICAgQVg8U3RyaW5nPiBhcyA9IG5ldyBBWDxTdHJpbmc+KCk7XG4iICsgCgkJCQkiICAgICAgICBBWDxYPiBhID0gYmFyKGF4LCBhcyk7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgPFQsVT4gQVg8VD4gYmFyKEFYPD8+IGEsIEFYPD8gc3VwZXIgVT4gYikge1xuIiArIAoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiICAgIH0gICAgXG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEFYPEU+IHtcbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MTU5KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgQVg8WD4gYXggPSBuZXcgQVg8WD4obmV3IFgoKSk7XG4iICsgCgkJCQkiICAgICAgICBBWDxTdHJpbmc+IGFzID0gbmV3IEFYPFN0cmluZz4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICAgICAgQVg8WD4gYSA9IGJhcihheCwgYXMpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgPFQsVT4gVCBiYXIoQVg8Pz4gYSwgQVg8PyBzdXBlciBVPiBiKSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gYS5nZXQoKTtcbiIgKyAKCQkJCSIgICAgfSAgICBcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQVg8RT4ge1xuIiArIAoJCQkJIgkgRSBlO1xuIiArCgkJCQkiICAgIEFYKEUgZSkgeyB0aGlzLmUgPSBlOyB9XG4iICsgCgkJCQkiICAgIEUgZ2V0KCkgeyByZXR1cm4gdGhpcy5lOyB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJCSIJcmV0dXJuIGEuZ2V0KCk7XG4iICsgCgkJCSIJICAgICAgIF5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gY2FwdHVyZS1vZiA/IHRvIFRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCglwdWJsaWMgdm9pZCB0ZXN0MTYwKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgU3RyaW5nIHMgPSBmb28obmV3IEFYPFN0cmluZz4oXCJhYWFcIikpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiICAgIHN0YXRpYyA8Vj4gViBmb28oQVg8U3RyaW5nPiBhKSB7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gYS5nZXQoKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBBWDxFPiB7XG4iICsgCgkJCQkiICAgIEUgZTtcbiIgKyAKCQkJCSIgICAgQVgoRSBlKSB7IHRoaXMuZSA9IGU7IH1cbiIgKyAKCQkJCSIgICAgRSBnZXQoKSB7IHJldHVybiB0aGlzLmU7IH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglyZXR1cm4gYS5nZXQoKTtcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBTdHJpbmcgdG8gVlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCXB1YmxpYyB2b2lkIHRlc3QxNjEoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBib29sZWFuIGIgPSBmb28obmV3IEFYPFN0cmluZz4oXCJhYWFcIikpLmVxdWFscyhhcmdzKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIiAgICBzdGF0aWMgPFY+IFYgZm9vKEFYPFN0cmluZz4gYSkge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIGEuZ2V0KCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgU3RyaW5nIGJhcigpIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiBcImJiYlwiO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEFYPEU+IHtcbiIgKyAKCQkJCSIgICAgRSBlO1xuIiArIAoJCQkJIiAgICBBWChFIGUpIHsgdGhpcy5lID0gZTsgfVxuIiArIAoJCQkJIiAgICBFIGdldCgpIHsgcmV0dXJuIHRoaXMuZTsgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCXJldHVybiBhLmdldCgpO1xuIiArIAoJCQkiCSAgICAgICBeXl5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFN0cmluZyB0byBWXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDE2MigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIFN0cmluZyBzID0gZm9vKG5ldyBBWDxTdHJpbmc+KFwiYWFhXCIpKS5iYXIoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIiAgICBzdGF0aWMgPFY+IFYgZm9vKEFYPFN0cmluZz4gYSkge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIGEuZ2V0KCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgU3RyaW5nIGJhcigpIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiBcImJiYlwiO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEFYPEU+IHtcbiIgKyAKCQkJCSIgICAgRSBlO1xuIiArIAoJCQkJIiAgICBBWChFIGUpIHsgdGhpcy5lID0gZTsgfVxuIiArIAoJCQkJIiAgICBFIGdldCgpIHsgcmV0dXJuIHRoaXMuZTsgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCVN0cmluZyBzID0gZm9vKG5ldyBBWDxTdHJpbmc+KFwiYWFhXCIpKS5iYXIoKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCBiYXIoKSBpcyB1bmRlZmluZWQgZm9yIHRoZSB0eXBlIE9iamVjdFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJCSIJcmV0dXJuIGEuZ2V0KCk7XG4iICsgCgkJCSIJICAgICAgIF5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gU3RyaW5nIHRvIFZcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCglwdWJsaWMgdm9pZCB0ZXN0MTYzKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgU3RyaW5nIHMgPSBmb28obmV3IEFYPFN0cmluZz4oXCJhYWFcIikpLmJhcigpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiICAgIHN0YXRpYyA8Vj4gViBmb28oQVg8U3RyaW5nPiBhKSB7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gYS5nZXQoKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBTdHJpbmcgYmFyKCkge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIFwiYmJiXCI7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQVg8RT4ge1xuIiArIAoJCQkJIiAgICBFIGU7XG4iICsgCgkJCQkiICAgIEFYKEUgZSkgeyB0aGlzLmUgPSBlOyB9XG4iICsgCgkJCQkiICAgIEUgZ2V0KCkgeyByZXR1cm4gdGhpcy5lOyB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJU3RyaW5nIHMgPSBmb28obmV3IEFYPFN0cmluZz4oXCJhYWFcIikpLmJhcigpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGJhcigpIGlzIHVuZGVmaW5lZCBmb3IgdGhlIHR5cGUgT2JqZWN0XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglyZXR1cm4gYS5nZXQoKTtcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBTdHJpbmcgdG8gVlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCXB1YmxpYyB2b2lkIHRlc3QxNjQoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIGZvbyhuZXcgQVg8U3RyaW5nPihcIlNVQ0NFU1NcIikpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiICAgIHN0YXRpYyA8Vj4gTGlzdDxWPiBmb28oQVg8U3RyaW5nPiBhKSB7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYS5nZXQoKSk7XG4iICsgCgkJCQkiICAgICAgICBMaXN0PFY+IHYgPSBudWxsO1xuIiArIAoJCQkJIiAgICAgICAgaWYgKGEgPT0gbnVsbCkgdiA9IGZvbyhhKTsgXG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gdjtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBBWDxFPiB7XG4iICsgCgkJCQkiICAgIEUgZTtcbiIgKyAKCQkJCSIgICAgQVgoRSBlKSB7IHRoaXMuZSA9IGU7IH1cbiIgKyAKCQkJCSIgICAgRSBnZXQoKSB7IHJldHVybiB0aGlzLmU7IH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CQkKCXB1YmxpYyB2b2lkIHRlc3QxNjUoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIEFYPFg+IGF4ID0gbmV3IEFYPFg+KCk7XG4iICsgCgkJCQkiICAgICAgICBBWDxTdHJpbmc+IGEgPSBiYXIoYXgpO1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIDxUPiBBWDxUPiBiYXIoQVg8Pz4gYSkge1xuIiArIAoJCQkJIgkJIGlmIChhID09IG51bGwpIHtcbiIgKwoJCQkJIiAgICAgICAgCUFYPFN0cmluZz4gYXMgPSBiYXIoYSk7XG4iICsgCgkJCQkiICAgICAgICAJU3RyaW5nIHMgPSBhcy5nZXQoKTtcbiIgKyAKCQkJCSIJCX1cbiIgKwoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiICAgIH0gICAgXG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEFYPEU+IHtcbiIgKyAKCQkJCSIgICAgRSBnZXQoKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQoJcHVibGljIHZvaWQgdGVzdDE2NigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgQVg8WD4gYXggPSBuZXcgQVg8WD4obmV3IFgoKSk7XG4iICsgCgkJCQkiICAgICAgICBBWDxTdHJpbmc+IGEgPSBiYXIoYXgsIHRydWUpO1xuIiArIAoJCQkJIiAgICAgICAgU3RyaW5nIHMgPSBhLmdldCgpO1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHMpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEFYPFQ+IGJhcihBWDw/PiBhLCBib29sZWFuIHJlY3Vyc2UpIHtcbiIgKyAKCQkJCSIgICAgICAgIGlmIChyZWN1cnNlKSB7XG4iICsgCgkJCQkiCSAgICAgICAgQVg8U3RyaW5nPiBhcyA9IGJhcihhLCBmYWxzZSk7XG4iICsgCgkJCQkiCQkJU3RyaW5nIHMgPSBhcy5nZXQoKTtcbiIgKyAKCQkJCSIgICAgICAgIH1cbiIgKyAKCQkJCSIJCXJldHVybiBuZXcgQVgoXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9ICAgIFxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBBWDxFPiB7XG4iICsgCgkJCQkiICAgIEUgZTtcbiIgKyAKCQkJCSIgICAgQVgoRSBlKSB7IHRoaXMuZSA9IGU7IH1cbiIgKyAKCQkJCSIgICAgRSBnZXQoKSB7IHJldHVybiB0aGlzLmU7IH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CQoJcHVibGljIHZvaWQgdGVzdDE2NygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgQVg8U3RyaW5nLCBUaHJlYWQ+IGEgPSBiYXIoKTtcbiIgKyAKCQkJCSIgICAgICAgIFN0cmluZyBzID0gYS5nZXQoKTtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIDxULCBVPiBBWDxULCBVPiBiYXIoKSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gbmV3IEFYKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgfSAgICBcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQVg8RSwgRj4ge1xuIiArIAoJCQkJIiAgICBFIGU7XG4iICsgCgkJCQkiICAgIEFYKEUgZSkgeyB0aGlzLmUgPSBlOyB9XG4iICsgCgkJCQkiICAgIEUgZ2V0KCkgeyByZXR1cm4gdGhpcy5lOyB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkJCglwdWJsaWMgdm9pZCB0ZXN0MTY4KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgQVg8U3RyaW5nLCBUaHJlYWQ+IGEgPSBiYXIoKTtcbiIgKyAKCQkJCSIgICAgICAgIFN0cmluZyBzID0gYS5nZXQoKTtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIDxULCBVPiBBWDxBWDxULCBUPiwgVT4gYmFyKCkge1xuIiArIAoJCQkJIgkJcmV0dXJuIG5ldyBBWChcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH0gICAgXG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEFYPEUsIEY+IHtcbiIgKyAKCQkJCSIgICAgRSBlO1xuIiArIAoJCQkJIiAgICBBWChFIGUpIHsgdGhpcy5lID0gZTsgfVxuIiArIAoJCQkJIiAgICBFIGdldCgpIHsgcmV0dXJuIHRoaXMuZTsgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCUFYPFN0cmluZywgVGhyZWFkPiBhID0gYmFyKCk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gQVg8QVg8T2JqZWN0LE9iamVjdD4sVGhyZWFkPiB0byBBWDxTdHJpbmcsVGhyZWFkPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkJIglyZXR1cm4gbmV3IEFYKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY29uc3RydWN0b3IgQVgoT2JqZWN0KSBiZWxvbmdzIHRvIHRoZSByYXcgdHlwZSBBWC4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgQVg8RSxGPiBzaG91bGQgYmUgcGFyYW1ldGVyaXplZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkJIglyZXR1cm4gbmV3IEFYKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIEFYIG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG8gQVg8QVg8VCxUPixVPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCXB1YmxpYyB2b2lkIHRlc3QxNjkoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBBWDxTdHJpbmc+IGEgPSBiYXIobmV3IFgoKSk7XG4iICsgCgkJCQkiICAgICAgICBTdHJpbmcgcyA9IGEuZ2V0KCk7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocyk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyA8VD4gQVg8VD4gYmFyKFQgdCkge1xuIiArIAoJCQkJIgkJcmV0dXJuIG5ldyBBWChcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH0gICAgXG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEFYPEU+IHtcbiIgKyAKCQkJCSIgICAgRSBlO1xuIiArIAoJCQkJIiAgICBBWChFIGUpIHsgdGhpcy5lID0gZTsgfVxuIiArIAoJCQkJIiAgICBFIGdldCgpIHsgcmV0dXJuIHRoaXMuZTsgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCUFYPFN0cmluZz4gYSA9IGJhcihuZXcgWCgpKTtcbiIgKyAKCQkJIgkgICAgICAgICAgIF5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gQVg8WD4gdG8gQVg8U3RyaW5nPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkJIglyZXR1cm4gbmV3IEFYKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY29uc3RydWN0b3IgQVgoT2JqZWN0KSBiZWxvbmdzIHRvIHRoZSByYXcgdHlwZSBBWC4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgQVg8RT4gc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJCSIJcmV0dXJuIG5ldyBBWChcIlNVQ0NFU1NcIik7XG4iICsgCgkJCSIJICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGV4cHJlc3Npb24gb2YgdHlwZSBBWCBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIEFYPFQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vIEV4cGVjdGVkIHR5cGUgaW5mZXJlbmNlIGZvciBjYXN0IG9wZXJhdGlvbgoJcHVibGljIHZvaWQgdGVzdDE3MCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIEFYPFg+IGF4ID0gbmV3IEFYPFg+KG5ldyBYKCkpO1xuIiArIAoJCQkJIiAgICAgICAgQVg8U3RyaW5nPiBhcyA9IG5ldyBBWDxTdHJpbmc+KFwiXCIpO1xuIiArIAoJCQkJIiAgICAgICAgYXggPSAoQVgpYmFyKGF4KTtcbiIgKyAvLyBzaG91bGRuJ3QgY29tcGxhaW4gYWJvdXQgdW5uZWNlc3NhcnkgY2FzdAoJCQkJIgl9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgYmFyKEFYPD8+IGEpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBhLmdldCgpO1xuIiArIAoJCQkJIiAgICB9ICAgIFxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBBWDxFPiB7XG4iICsgCgkJCQkiCSBFIGU7XG4iICsgCgkJCQkiICAgIEFYKEUgZSkgeyB0aGlzLmUgPSBlOyB9XG4iICsgCgkJCQkiICAgIEUgZ2V0KCkgeyByZXR1cm4gdGhpcy5lOyB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkJIglheCA9IChBWCliYXIoYXgpO1xuIiArIAoJCQkiCSAgICAgXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIEFYIG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG8gQVg8WD5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA5KVxuIiArIAoJCQkiCXJldHVybiBhLmdldCgpO1xuIiArIAoJCQkiCSAgICAgICBeXl5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIGNhcHR1cmUtb2YgPyB0byBUXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vIEV4cGVjdGVkIHR5cGUgaW5mZXJlbmNlIGZvciBjYXN0IG9wZXJhdGlvbgoJcHVibGljIHZvaWQgdGVzdDE3MSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIEFYPFg+IGF4ID0gbmV3IEFYPFg+KG5ldyBYKCkpO1xuIiArIAoJCQkJIiAgICAgICAgQVg8U3RyaW5nPiBhcyA9IG5ldyBBWDxTdHJpbmc+KFwiXCIpO1xuIiArIAoJCQkJIiAgICAgICAgYXggPSAoQVg8WD4pYmFyKGF4KTtcbiIgKyAvLyBzaG91bGRuJ3QgY29tcGxhaW4gYWJvdXQgdW5uZWNlc3NhcnkgY2FzdCBhcyByZXR1cm4gdHlwZSBpbmZlcmVuY2UgZG8gbm90CgkJCQkiCX1cbiIgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29yayBvbiBjYXN0IGNvbnZlcnNpb24KCQkJCSIgICAgcHVibGljIHN0YXRpYyA8VD4gVCBiYXIoQVg8Pz4gYSkge1xuIiArIAoJCQkJIgkJcmV0dXJuIGEuZ2V0KCk7XG4iICsgCgkJCQkiICAgIH0gICAgXG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEFYPEU+IHtcbiIgKyAKCQkJCSIJIEUgZTtcbiIgKyAKCQkJCSIgICAgQVgoRSBlKSB7IHRoaXMuZSA9IGU7IH1cbiIgKyAKCQkJCSIgICAgRSBnZXQoKSB7IHJldHVybiB0aGlzLmU7IH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCQkiCWF4ID0gKEFYPFg+KWJhcihheCk7XG4iICsgCgkJCSIJICAgICBeXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBjYXN0IGZyb20gT2JqZWN0IHRvIEFYPFg+IGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIEFYXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkJIglyZXR1cm4gYS5nZXQoKTtcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBjYXB0dXJlLW9mID8gdG8gVFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvLyBFeHBlY3RlZCB0eXBlIGluZmVyZW5jZSBmb3IgY2FzdCBvcGVyYXRpb24KCXB1YmxpYyB2b2lkIHRlc3QxNzIoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBBWDxYPiBheCA9IG5ldyBBWDxYPihuZXcgWCgpKTtcbiIgKyAKCQkJCSIgICAgICAgIEFYPFN0cmluZz4gYXMgPSBuZXcgQVg8U3RyaW5nPihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgICAgICBheCA9IChBWDxYPiliYXIoYXgpO1xuIiArIC8vIG5vIHdhcm4gZm9yIHVuc2FmZSBjYXN0LCBzaW5jZSBmb3JiaWRkZW4gY2FzdAoJCQkJIgl9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFN0cmluZyBiYXIoQVg8Pz4gYSkge1xuIiArIAoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiICAgIH0gICAgXG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEFYPEU+IHtcbiIgKyAKCQkJCSIJIEUgZTtcbiIgKyAKCQkJCSIgICAgQVgoRSBlKSB7IHRoaXMuZSA9IGU7IH1cbiIgKyAKCQkJCSIgICAgRSBnZXQoKSB7IHJldHVybiB0aGlzLmU7IH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkJIglheCA9IChBWDxYPiliYXIoYXgpO1xuIiArIAoJCQkiCSAgICAgXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIkNhbm5vdCBjYXN0IGZyb20gU3RyaW5nIHRvIEFYPFg+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vIEV4cGVjdGVkIHR5cGUgaW5mZXJlbmNlIGZvciByZXR1cm4gc3RhdGVtZW50CglwdWJsaWMgdm9pZCB0ZXN0MTczKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgIAlmb28oKTtcbiIgKyAKCQkJCSIgICAgCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyA8VD4gVCBiYXIoQVg8Pz4gYSkge1xuIiArIAoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiICAgIH0gICAgXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgQVg8WD4gZm9vKCkge1xuIiArIAoJCQkJIiAgICAgICAgQVg8WD4gYXggPSBuZXcgQVg8WD4obmV3IFgoKSk7XG4iICsgCgkJCQkiICAgICAgIHJldHVybiBiYXIoYXgpO1xuIiArIC8vIHVzZSByZXR1cm4gdHlwZSBvZiBlbmNsb3NpbmcgbWV0aG9kIGZvciB0eXBlIGluZmVyZW5jZQoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEFYPEU+IHtcbiIgKyAKCQkJCSIJIEUgZTtcbiIgKyAKCQkJCSIgICAgQVgoRSBlKSB7IHRoaXMuZSA9IGU7IH1cbiIgKyAKCQkJCSIgICAgRSBnZXQoKSB7IHJldHVybiB0aGlzLmU7IH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CQoJLy8gRXhwZWN0ZWQgdHlwZSBpbmZlcmVuY2UgZm9yIGZpZWxkIGRlY2xhcmF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0MTc0KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgIAlPYmplY3QgbyA9IGZvbztcbiIgKyAKCQkJCSIgICAgCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyA8VD4gVCBiYXIoQVg8Pz4gYSkge1xuIiArIAoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiICAgIH0gICAgXG4iICsgCgkJCQkiICAgIHN0YXRpYyBBWDxYPiBmb28gPSBiYXIobmV3IEFYPFg+KG5ldyBYKCkpKTtcbiIgKyAvLyB1c2UgZmllbGQgdHlwZSBmb3IgdHlwZSBpbmZlcmVuY2UKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQVg8RT4ge1xuIiArIAoJCQkJIgkgRSBlO1xuIiArIAoJCQkJIiAgICBBWChFIGUpIHsgdGhpcy5lID0gZTsgfVxuIiArIAoJCQkJIiAgICBFIGdldCgpIHsgcmV0dXJuIHRoaXMuZTsgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCQoJLy8gNjA1NjMKCXB1YmxpYyB2b2lkIHRlc3QxNzUoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJIiAgICBpbnRlcmZhY2UgQTxUPiB7XG4iICsgCgkJCQkiICAgICAgICBUW10gbTEoVCB4KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBjbGFzcyBYIHsgXG4iICsgCgkJCQkiICAgIAlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQkJbmV3IFgoKS5tMihuZXcgQTxYPigpeyBcbiIgKyAKCQkJCSIJCQkJcHVibGljIFhbXSBtMShYIHgpIHsgXG4iICsgCgkJCQkiCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgkJCQkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiCQkJCX1cbiIgKyAKCQkJCSIJCQl9KTtcbiIgKyAKCQkJCSIJCX1cbiIgKyAKCQkJCSIgICAgICAgIHZvaWQgbTIoQTxYPiB4KSB7IFxuIiArIAoJCQkJIiAgICAgICAgICAgIG0zKHgubTEobmV3IFgoKSkpOyBcbiIgKyAKCQkJCSIgICAgICAgIH1cbiIgKyAKCQkJCSIgICAgICAgIHZvaWQgbTMoWFtdIHgpIHtcbiIgKyAKCQkJCSIgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIFxuIiArIAoJCQkJIiAgICB9XG4iCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CgkvLyB1bnNhZmUgcmF3IHJldHVybiB2YWx1ZQoJcHVibGljIHZvaWQgdGVzdDE3NigpIHsKCQlNYXAgY3VzdG9tT3B0aW9ucyA9IGdldENvbXBpbGVyT3B0aW9ucygpOwoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgPFQ+IFZlY3RvcjxUPiB2YWx1ZXNPZihIYXNodGFibGU8PywgVD4gaCkge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IoKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBWZWN0b3I8T2JqZWN0PiBkYXRhO1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgcHVibGljIHZvaWQgdCgpIHtcbiIgKyAKCQkJCSIgICAgICAgIFZlY3RvcjxPYmplY3Q+IHYgPSAoVmVjdG9yPE9iamVjdD4pIGRhdGEuZWxlbWVudEF0KDApO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwgCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCXJldHVybiBuZXcgVmVjdG9yKCk7XG4iICsgCgkJCSIJICAgICAgIF5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBleHByZXNzaW9uIG9mIHR5cGUgVmVjdG9yIG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG8gVmVjdG9yPFQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxMClcbiIgKyAKCQkJIglWZWN0b3I8T2JqZWN0PiB2ID0gKFZlY3RvcjxPYmplY3Q+KSBkYXRhLmVsZW1lbnRBdCgwKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBjYXN0IGZyb20gT2JqZWN0IHRvIFZlY3RvcjxPYmplY3Q+IGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIFZlY3RvclxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiwKCQkJbnVsbCwKCQkJdHJ1ZSwKCQkJY3VzdG9tT3B0aW9ucyk7Cgl9CgkvLyBjYXN0IHRvIHR5cGUgdmFyaWFibGUgYWxsb3dlZCwgY2FuIGJlIGRpYWdub3NlZCBhcyB1bm5lY2Vzc2FyeQoJcHVibGljIHZvaWQgdGVzdDE3NygpIHsKCQlNYXAgY3VzdG9tT3B0aW9ucyA9IGdldENvbXBpbGVyT3B0aW9ucygpOwoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQ+IHtcbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCVQgZm9vKFQgdCkge1xuIiArIAoJCQkJIgkJcmV0dXJuIChUKSB0O1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwgCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCXJldHVybiAoVCkgdDtcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5cbiIgKyAKCQkJIlVubmVjZXNzYXJ5IGNhc3QgZnJvbSBUIHRvIFRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIsCgkJCW51bGwsCgkJCXRydWUsCgkJCWN1c3RvbU9wdGlvbnMpOwoJfQoJLy8gcmVqZWN0IGluc3RhbmNlb2YgdHlwZSB2YXJpYWJsZSBvciBwYXJhbWV0ZXJpemVkIHR5cGUKCXB1YmxpYyB2b2lkIHRlc3QxNzgoKSB7CgkJTWFwIGN1c3RvbU9wdGlvbnMgPSBnZXRDb21waWxlck9wdGlvbnMoKTsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPiB7XG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIglUIGZvbyhUIHQpIHtcbiIgKyAKCQkJCSIJCWlmICh0IGluc3RhbmNlb2YgWDxUPikge1xuIiArIAoJCQkJIgkJCXJldHVybiB0O1xuIiArIAoJCQkJIgkJfSBlbHNlIGlmICh0IGluc3RhbmNlb2YgWDxTdHJpbmc+KSB7XG4iICsgCgkJCQkiCQkJcmV0dXJuIHQ7XG4iICsgCgkJCQkiCQl9IGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBYPD8+KSB7XG4iICsgIC8vIG9rCgkJCQkiCQkJcmV0dXJuIHQ7XG4iICsgCgkJCQkiCQl9IGVsc2UgCWlmICh0IGluc3RhbmNlb2YgVCkge1xuIiArIAoJCQkJIgkJCXJldHVybiB0O1xuIiArIAoJCQkJIgkJfSBlbHNlIGlmICh0IGluc3RhbmNlb2YgWCkge1xuIiArIAoJCQkJIgkJCXJldHVybiB0O1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLCAKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCWlmICh0IGluc3RhbmNlb2YgWDxUPikge1xuIiArIAoJCQkiCSAgICBeXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiQ2Fubm90IHBlcmZvcm0gaW5zdGFuY2VvZiBjaGVjayBhZ2FpbnN0IHBhcmFtZXRlcml6ZWQgdHlwZSBYPFQ+LiBVc2UgaW5zdGVhZCBpdHMgcmF3IGZvcm0gWCBzaW5jZSBnZW5lcmljIHR5cGUgaW5mb3JtYXRpb24gd2lsbCBiZSBlcmFzZWQgYXQgcnVudGltZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJfSBlbHNlIGlmICh0IGluc3RhbmNlb2YgWDxTdHJpbmc+KSB7XG4iICsgCgkJCSIJICAgICAgICAgICBeXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiQ2Fubm90IHBlcmZvcm0gaW5zdGFuY2VvZiBjaGVjayBhZ2FpbnN0IHBhcmFtZXRlcml6ZWQgdHlwZSBYPFN0cmluZz4uIFVzZSBpbnN0ZWFkIGl0cyByYXcgZm9ybSBYIHNpbmNlIGdlbmVyaWMgdHlwZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGVyYXNlZCBhdCBydW50aW1lXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTApXG4iICsgCgkJCSIJfSBlbHNlIAlpZiAodCBpbnN0YW5jZW9mIFQpIHtcbiIgKyAKCQkJIgkgICAgICAgCSAgICBeXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiQ2Fubm90IHBlcmZvcm0gaW5zdGFuY2VvZiBjaGVjayBhZ2FpbnN0IHR5cGUgcGFyYW1ldGVyIFQuIFVzZSBpbnN0ZWFkIGl0cyBlcmFzdXJlIE9iamVjdCBzaW5jZSBnZW5lcmljIHR5cGUgaW5mb3JtYXRpb24gd2lsbCBiZSBlcmFzZWQgYXQgcnVudGltZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiwKCQkJbnVsbCwKCQkJdHJ1ZSwKCQkJY3VzdG9tT3B0aW9ucyk7Cgl9CgkvLyA2MTUwNwoJcHVibGljIHZvaWQgdGVzdDE3OSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiY2xhc3MgVSB7XG4iICsgCgkJCQkiIHN0YXRpYyA8VD4gVCBub3ROdWxsKFQgdCkgeyByZXR1cm4gdDsgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiIHZvaWQgdCgpIHtcbiIgKyAKCQkJCSIgIFN0cmluZyBzID0gVS5ub3ROdWxsKG51bGwpO1xuIiArIAoJCQkJIiB9XG4iICsgCgkJCQkiIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJbmV3IFgoKS50KCk7XG4iICsgCgkJCQkiCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkKCXB1YmxpYyB2b2lkIHRlc3QxODAoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImNsYXNzIFUge1xuIiArIAoJCQkJIiBzdGF0aWMgPFQ+IFQgbm90TnVsbChUIHQpIHsgcmV0dXJuIHQ7IH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiB2b2lkIHQoKSB7XG4iICsgCgkJCQkiICBTdHJpbmcgcyA9IFUubm90TnVsbChcIlwiKTtcbiIgKyAKCQkJCSIgfVxuIiArIAoJCQkJIiBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCW5ldyBYKCkudCgpO1xuIiArIAoJCQkJIglTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJ9XG4iLCAKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE1MDcgLSB2YXJpYXRpb24gY29tcHV0aW5nIG1vc3Qgc3BlY2lmaWMgdHlwZSB3aXRoICdudWxsJwoJcHVibGljIHZvaWQgdGVzdDE4MSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiY2xhc3MgVSB7XG4iICsgCgkJCQkiIHN0YXRpYyA8VD4gVCBub3ROdWxsKFQgdCwgVjxUPiB2dCkgeyByZXR1cm4gdDsgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBWPFQ+IHt9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiB2b2lkIHQoKSB7XG4iICsgCgkJCQkiICBTdHJpbmcgcyA9IFUubm90TnVsbChudWxsLCBuZXcgVjxTdHJpbmc+KCkpO1xuIiArIAoJCQkJIiB9XG4iICsgCgkJCQkiIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJbmV3IFgoKS50KCk7XG4iICsgCgkJCQkiCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQoJcHVibGljIHZvaWQgdGVzdDE4MigpIHsKCQlNYXAgY3VzdG9tT3B0aW9ucyA9IGdldENvbXBpbGVyT3B0aW9ucygpOwoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8RT4ge1xuIiArIAoJCQkJIiAgICBYPEU+IGZvbygpIHtcbiIgKyAKCQkJCSIgICAgCXJldHVybiAoWDxFPikgdGhpcztcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBYPFN0cmluZz4gYmFyKCkge1xuIiArIAoJCQkJIiAgICAJcmV0dXJuIChBWDxTdHJpbmc+KSBuZXcgWDxTdHJpbmc+KCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgWDxTdHJpbmc+IGJhcihPYmplY3Qgbykge1xuIiArIAoJCQkJIiAgICAJcmV0dXJuIChBWDxTdHJpbmc+KSBvO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIFg8RT4gZm9vKE9iamVjdCBvKSB7XG4iICsgCgkJCQkiICAgIAlyZXR1cm4gKEFYPEU+KSBvO1xuIiArIAoJCQkJIiAgICB9ICAgIFxuIiArIAoJCQkJIiAgICBYPEU+IGJheihPYmplY3Qgbykge1xuIiArIAoJCQkJIiAgICAJcmV0dXJuIChBWDxFPikgbnVsbDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBYPFN0cmluZz4gYmF6MihCWCBieCkge1xuIiArIAoJCQkJIiAgICAJcmV0dXJuIChYPFN0cmluZz4pIGJ4O1xuIiArIAoJCQkJIiAgICB9ICAgIFxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBBWDxGPiBleHRlbmRzIFg8Rj4ge31cbiIgKyAKCQkJCSJjbGFzcyBCWCBleHRlbmRzIEFYPFN0cmluZz4ge31cbiIsIAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkJIglyZXR1cm4gKFg8RT4pIHRoaXM7XG4iICsgCgkJCSIJICAgICAgIF5eXl5eXl5eXl5eXG4iICsgCgkJCSJVbm5lY2Vzc2FyeSBjYXN0IGZyb20gWDxFPiB0byBYPEU+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA5KVxuIiArIAoJCQkiCXJldHVybiAoQVg8U3RyaW5nPikgbztcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIE9iamVjdCB0byBBWDxTdHJpbmc+IGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIEFYXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxMilcbiIgKyAKCQkJIglyZXR1cm4gKEFYPEU+KSBvO1xuIiArIAoJCQkiCSAgICAgICBeXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIE9iamVjdCB0byBBWDxFPiBpcyBhY3R1YWxseSBjaGVja2luZyBhZ2FpbnN0IHRoZSBlcmFzZWQgdHlwZSBBWFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNC4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTUpXG4iICsgCgkJCSIJcmV0dXJuIChBWDxFPikgbnVsbDtcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJVbm5lY2Vzc2FyeSBjYXN0IGZyb20gbnVsbCB0byBBWDxFPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTgpXG4iICsgCgkJCSIJcmV0dXJuIChYPFN0cmluZz4pIGJ4O1xuIiArIAoJCQkiCSAgICAgICBeXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVW5uZWNlc3NhcnkgY2FzdCBmcm9tIEJYIHRvIFg8U3RyaW5nPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiwKCQkJbnVsbCwKCQkJdHJ1ZSwKCQkJY3VzdG9tT3B0aW9ucyk7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MTgzKCkgewoJCU1hcCBjdXN0b21PcHRpb25zID0gZ2V0Q29tcGlsZXJPcHRpb25zKCk7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJe1xuIiArIAoJCQkJIgkJRGljdGlvbmFyeTxTdHJpbmcsIEludGVnZXI+IGQ7XG4iICsgCgkJCQkiCQlPYmplY3QgbztcbiIgKyAKCQkJCSIJCVxuIiArIAoJCQkJIgkJT2JqZWN0IGExID0gKEhhc2h0YWJsZTxTdHJpbmcsSW50ZWdlcj4pIGQ7XG4iICsgCgkJCQkiCQlPYmplY3QgYTIgPSAoSGFzaHRhYmxlKSBvO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgkJT2JqZWN0IGEzID0gKEhhc2h0YWJsZTxGbG9hdCwgRG91YmxlPikgZDtcbiIgKyAKCQkJCSIJCU9iamVjdCBhNCA9IChIYXNodGFibGU8U3RyaW5nLEludGVnZXI+KSBvO1xuIiArIAoJCQkJIgkJXG4iICsgCgkJCQkiCQlhYnN0cmFjdCBjbGFzcyBaMSBleHRlbmRzIEhhc2h0YWJsZTxTdHJpbmcsSW50ZWdlcj4ge1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgkJWjEgejE7XG4iICsgCgkJCQkiCQlPYmplY3QgYTUgPSAoSGFzaHRhYmxlPFN0cmluZyxJbnRlZ2VyPikgejE7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCQlhYnN0cmFjdCBjbGFzcyBaMiBleHRlbmRzIFoxIHtcbiIgKyAKCQkJCSIJCX1cbiIgKyAKCQkJCSIJCU9iamVjdCBhNiA9IChaMikgejE7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCQlhYnN0cmFjdCBjbGFzcyBaMyBleHRlbmRzIEhhc2h0YWJsZSB7XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCQlaMyB6MztcbiIgKyAKCQkJCSIJCU9iamVjdCBhNyA9IChIYXNodGFibGU8U3RyaW5nLEludGVnZXI+KSB6MztcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEyKVxuIiArIAoJCQkiCU9iamVjdCBhMyA9IChIYXNodGFibGU8RmxvYXQsIERvdWJsZT4pIGQ7XG4iICsgCgkJCSIJICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiQ2Fubm90IGNhc3QgZnJvbSBEaWN0aW9uYXJ5PFN0cmluZyxJbnRlZ2VyPiB0byBIYXNodGFibGU8RmxvYXQsRG91YmxlPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTMpXG4iICsgCgkJCSIJT2JqZWN0IGE0ID0gKEhhc2h0YWJsZTxTdHJpbmcsSW50ZWdlcj4pIG87XG4iICsgCgkJCSIJICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIE9iamVjdCB0byBIYXNodGFibGU8U3RyaW5nLEludGVnZXI+IGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIEhhc2h0YWJsZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTgpXG4iICsgCgkJCSIJT2JqZWN0IGE1ID0gKEhhc2h0YWJsZTxTdHJpbmcsSW50ZWdlcj4pIHoxO1xuIiArIAoJCQkiCSAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVW5uZWNlc3NhcnkgY2FzdCBmcm9tIFoxIHRvIEhhc2h0YWJsZTxTdHJpbmcsSW50ZWdlcj5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjQuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDI3KVxuIiArIAoJCQkiCU9iamVjdCBhNyA9IChIYXNodGFibGU8U3RyaW5nLEludGVnZXI+KSB6MztcbiIgKyAKCQkJIgkgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIFozIHRvIEhhc2h0YWJsZTxTdHJpbmcsSW50ZWdlcj4gaXMgYWN0dWFsbHkgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZXJhc2VkIHR5cGUgSGFzaHRhYmxlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iLAoJCQludWxsLAoJCQl0cnVlLAoJCQljdXN0b21PcHRpb25zKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjI5MiAtIHBhcmFtZXRlcml6ZWQgbWVzc2FnZSBzZW5kCglwdWJsaWMgdm9pZCB0ZXN0MTg0KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXN0YXRpYyA8VCwgVT4gVCBmb28oVCB0LCBVIHUpIHtcbiIgKyAKCQkJCSIJCXJldHVybiB0O1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihYLjxTdHJpbmcsWD5mb28oXCJTVUNDRVNTXCIsIG51bGwpKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQoJLy8gcGFyYW1ldGVyaXplZCBtZXNzYWdlIHNlbmQgLSB2YXJpYXRpb24gb24gMTg0IHdpdGggbm9uLXN0YXRpYyBnZW5lcmljIG1ldGhvZAoJcHVibGljIHZvaWQgdGVzdDE4NSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgk8VCwgVT4gVCBmb28oVCB0LCBVIHUpIHtcbiIgKyAKCQkJCSIJCXJldHVybiB0O1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgWCgpLjxTdHJpbmcsWD5mb28oXCJTVUNDRVNTXCIsIG51bGwpKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkJCQoJLy8gbWVzc2FnZSBzZW5kIHBhcmFtZXRlcml6ZWQgd2l0aCB0eXBlIG5vdCBtYXRjaGluZyBwYXJhbWV0ZXIgYm91bmRzCglwdWJsaWMgdm9pZCB0ZXN0MTg2KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgk8VCwgVSBleHRlbmRzIFN0cmluZz4gVCBmb28oVCB0LCBVIHUpIHtcbiIgKyAKCQkJCSIJCXJldHVybiB0O1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgWCgpLjxTdHJpbmcsIFg+Zm9vKFwiU1VDQ0VTU1wiLCBudWxsKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLCAKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJPFQsIFUgZXh0ZW5kcyBTdHJpbmc+IFQgZm9vKFQgdCwgVSB1KSB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICBeXl5eXl5cbiIgKyAKCQkJIlRoZSB0eXBlIHBhcmFtZXRlciBVIHNob3VsZCBub3QgYmUgYm91bmRlZCBieSB0aGUgZmluYWwgdHlwZSBTdHJpbmcuIEZpbmFsIHR5cGVzIGNhbm5vdCBiZSBmdXJ0aGVyIGV4dGVuZGVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglTeXN0ZW0ub3V0LnByaW50bG4obmV3IFgoKS48U3RyaW5nLCBYPmZvbyhcIlNVQ0NFU1NcIiwgbnVsbCkpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXG4iICsgCgkJCSJCb3VuZCBtaXNtYXRjaDogVGhlIGdlbmVyaWMgbWV0aG9kIGZvbyhULCBVKSBvZiB0eXBlIFggaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKFN0cmluZywgWCkgc2luY2UgdGhlIHR5cGUgWCBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFUgZXh0ZW5kcyBTdHJpbmc+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKCS8vIGludmFsaWQgdHlwZSBhcmd1bWVudCBhcml0eSBmb3IgcGFyYW1ldGVyaXplZCBtZXNzYWdlIHNlbmQKCXB1YmxpYyB2b2lkIHRlc3QxODcoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCTxULCBVIGV4dGVuZHMgU3RyaW5nPiBUIGZvbyhUIHQsIFUgdSkge1xuIiArIAoJCQkJIgkJcmV0dXJuIHQ7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBYKCkuPFN0cmluZz5mb28oXCJTVUNDRVNTXCIsIG51bGwpKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkJIgk8VCwgVSBleHRlbmRzIFN0cmluZz4gVCBmb28oVCB0LCBVIHUpIHtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgIF5eXl5eXlxuIiArIAoJCQkiVGhlIHR5cGUgcGFyYW1ldGVyIFUgc2hvdWxkIG5vdCBiZSBib3VuZGVkIGJ5IHRoZSBmaW5hbCB0eXBlIFN0cmluZy4gRmluYWwgdHlwZXMgY2Fubm90IGJlIGZ1cnRoZXIgZXh0ZW5kZWRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgWCgpLjxTdHJpbmc+Zm9vKFwiU1VDQ0VTU1wiLCBudWxsKSk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5cbiIgKyAKCQkJIkluY29ycmVjdCBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgZm9yIGdlbmVyaWMgbWV0aG9kIDxULCBVPmZvbyhULCBVKSBvZiB0eXBlIFg7IGl0IGNhbm5vdCBiZSBwYXJhbWV0ZXJpemVkIHdpdGggYXJndW1lbnRzIDxTdHJpbmc+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkJCgkvLyBwYXJhbWV0ZXJpemVkIGludm9jYXRpb24gb2Ygbm9uIGdlbmVyaWMgbWV0aG9kIHdpdGggaW5jb3JyZWN0IGFyZ3VtZW50IGNvdW50CglwdWJsaWMgdm9pZCB0ZXN0MTg4KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKCQkJCSIJCXJldHVybjtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4obmV3IFgoKS48U3RyaW5nPmZvbyhcIlNVQ0NFU1NcIiwgbnVsbCkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwgCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglTeXN0ZW0ub3V0LnByaW50bG4obmV3IFgoKS48U3RyaW5nPmZvbyhcIlNVQ0NFU1NcIiwgbnVsbCkpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGZvbygpIGluIHRoZSB0eXBlIFggaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKFN0cmluZywgbnVsbClcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy8gcGFyYW1ldGVyaXplZCBpbnZvY2F0aW9uIG9mIG5vbiBnZW5lcmljIG1ldGhvZAoJcHVibGljIHZvaWQgdGVzdDE4OSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCgkJCQkiCQlyZXR1cm47XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBYKCkuPFN0cmluZz5mb28oKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLCAKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgWCgpLjxTdHJpbmc+Zm9vKCkpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGZvbygpIG9mIHR5cGUgWCBpcyBub3QgZ2VuZXJpYzsgaXQgY2Fubm90IGJlIHBhcmFtZXRlcml6ZWQgd2l0aCBhcmd1bWVudHMgPFN0cmluZz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgkvLyBwYXJhbWV0ZXJpemVkIGFsbG9jYXRpb24KCXB1YmxpYyB2b2lkIHRlc3QxOTAoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJcHVibGljIDxUPiBYKFQgdCl7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4odCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJbmV3IDxTdHJpbmc+WChcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLCAKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCQoJLy8gcGFyYW1ldGVyaXplZCBhbGxvY2F0aW9uIC0gd3JvbmcgYXJpdHkKCXB1YmxpYyB2b2lkIHRlc3QxOTEoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyA8VD4gWChUIHQpe1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKHQpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCW5ldyA8U3RyaW5nLCBTdHJpbmc+WChcIkZBSUxFRFwiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJbmV3IDxTdHJpbmcsIFN0cmluZz5YKFwiRkFJTEVEXCIpO1xuIiArIAoJCQkiCV5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIkluY29ycmVjdCBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgZm9yIGdlbmVyaWMgY29uc3RydWN0b3IgPFQ+WChUKSBvZiB0eXBlIFg7IGl0IGNhbm5vdCBiZSBwYXJhbWV0ZXJpemVkIHdpdGggYXJndW1lbnRzIDxTdHJpbmcsIFN0cmluZz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQoJLy8gcGFyYW1ldGVyaXplZCBhbGxvY2F0aW9uIC0gbm9uIGdlbmVyaWMgdGFyZ2V0IGNvbnN0cnVjdG9yCglwdWJsaWMgdm9pZCB0ZXN0MTkyKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgWChTdHJpbmcgdCl7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4odCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJbmV3IDxTdHJpbmc+WChcIkZBSUxFRFwiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJbmV3IDxTdHJpbmc+WChcIkZBSUxFRFwiKTtcbiIgKyAKCQkJIgleXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVGhlIGNvbnN0cnVjdG9yIFgoU3RyaW5nKSBvZiB0eXBlIFggaXMgbm90IGdlbmVyaWM7IGl0IGNhbm5vdCBiZSBwYXJhbWV0ZXJpemVkIHdpdGggYXJndW1lbnRzIDxTdHJpbmc+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKCS8vIHBhcmFtZXRlcml6ZWQgYWxsb2NhdGlvbiAtIGFyZ3VtZW50IHR5cGUgbWlzbWF0Y2gKCXB1YmxpYyB2b2lkIHRlc3QxOTMoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyA8VD4gWChUIHQpe1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKHQpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCW5ldyA8U3RyaW5nPlgobmV3IFgobnVsbCkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwgCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkJIgluZXcgPFN0cmluZz5YKG5ldyBYKG51bGwpKTtcbiIgKyAKCQkJIgleXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVGhlIHBhcmFtZXRlcml6ZWQgY29uc3RydWN0b3IgPFN0cmluZz5YKFN0cmluZykgb2YgdHlwZSBYIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChYKVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCgkvLyBwYXJhbWV0ZXJpemVkIGludm9jYXRpb24gLSBhcmd1bWVudCB0eXBlIG1pc21hdGNoCglwdWJsaWMgdm9pZCB0ZXN0MTk0KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgk8VD4gdm9pZCBmb28oVCB0KSB7XG4iICsgCgkJCQkiCQlyZXR1cm47XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBYKCkuPFN0cmluZz5mb28obmV3IFgoKSkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwgCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglTeXN0ZW0ub3V0LnByaW50bG4obmV3IFgoKS48U3RyaW5nPmZvbyhuZXcgWCgpKSk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5cbiIgKyAKCQkJIlRoZSBwYXJhbWV0ZXJpemVkIG1ldGhvZCA8U3RyaW5nPmZvbyhTdHJpbmcpIG9mIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoWClcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy8gcGFyYW1ldGVyaXplZCBxdWFsaWZpZWQgYWxsb2NhdGlvbgoJcHVibGljIHZvaWQgdGVzdDE5NSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgY2xhc3MgTVgge1xuIiArCgkJCQkiCQlwdWJsaWMgPFQ+IE1YKFQgdCl7XG4iICsgCgkJCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKHQpO1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCW5ldyBYKCkubmV3IDxTdHJpbmc+TVgoXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwgCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CQkKCS8vIHBhcmFtZXRlcml6ZWQgcXVhbGlmaWVkIGFsbG9jYXRpb24gLSB3cm9uZyBhcml0eQoJcHVibGljIHZvaWQgdGVzdDE5NigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJcHVibGljIGNsYXNzIE1YIHtcbiIgKwoJCQkJIgkJcHVibGljIDxUPiBNWChUIHQpe1xuIiArIAoJCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbih0KTtcbiIgKyAKCQkJCSIJCX1cbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQluZXcgWCgpLm5ldyA8U3RyaW5nLFN0cmluZz5NWChcIkZBSUxFRFwiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJCSIJbmV3IFgoKS5uZXcgPFN0cmluZyxTdHJpbmc+TVgoXCJGQUlMRURcIik7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJJbmNvcnJlY3QgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIGZvciBnZW5lcmljIGNvbnN0cnVjdG9yIDxUPk1YKFQpIG9mIHR5cGUgWC5NWDsgaXQgY2Fubm90IGJlIHBhcmFtZXRlcml6ZWQgd2l0aCBhcmd1bWVudHMgPFN0cmluZywgU3RyaW5nPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCgkvLyBwYXJhbWV0ZXJpemVkIHF1YWxpZmllZCBhbGxvY2F0aW9uIC0gbm9uIGdlbmVyaWMgdGFyZ2V0IGNvbnN0cnVjdG9yCglwdWJsaWMgdm9pZCB0ZXN0MTk3KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgY2xhc3MgTVgge1xuIiArCgkJCQkiCQlwdWJsaWMgTVgoU3RyaW5nIHQpe1xuIiArIAoJCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbih0KTtcbiIgKyAKCQkJCSIJCX1cbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQluZXcgWCgpLm5ldyA8U3RyaW5nPk1YKFwiRkFJTEVEXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwgCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIgluZXcgWCgpLm5ldyA8U3RyaW5nPk1YKFwiRkFJTEVEXCIpO1xuIiArIAoJCQkiCV5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgY29uc3RydWN0b3IgTVgoU3RyaW5nKSBvZiB0eXBlIFguTVggaXMgbm90IGdlbmVyaWM7IGl0IGNhbm5vdCBiZSBwYXJhbWV0ZXJpemVkIHdpdGggYXJndW1lbnRzIDxTdHJpbmc+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKCS8vIHBhcmFtZXRlcml6ZWQgcXVhbGlmaWVkIGFsbG9jYXRpb24gLSBhcmd1bWVudCB0eXBlIG1pc21hdGNoCglwdWJsaWMgdm9pZCB0ZXN0MTk4KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgY2xhc3MgTVgge1xuIiArCgkJCQkiCQlwdWJsaWMgPFQ+TVgoVCB0KXtcbiIgKyAKCQkJCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4odCk7XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJbmV3IFgoKS5uZXcgPFN0cmluZz5NWChuZXcgWCgpKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJCSIJbmV3IFgoKS5uZXcgPFN0cmluZz5NWChuZXcgWCgpKTtcbiIgKyAKCQkJIgleXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgcGFyYW1ldGVyaXplZCBjb25zdHJ1Y3RvciA8U3RyaW5nPk1YKFN0cmluZykgb2YgdHlwZSBYLk1YIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChYKVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCgkvLyBwYXJhbWV0ZXJpemVkIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwKCXB1YmxpYyB2b2lkIHRlc3QxOTkoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJcHVibGljIDxUPiBYKFQgdCl7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4odCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJY2xhc3MgTG9jYWwgZXh0ZW5kcyBYIHtcbiIgKyAKCQkJCSIJCQlMb2NhbCgpIHtcbiIgKwoJCQkJIgkJCQk8U3RyaW5nPnN1cGVyKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIJCQl9XG4iICsgCgkJCQkiCQl9O1xuIiArIAoJCQkJIgkJbmV3IExvY2FsKCk7XG4iICsJCQkJCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLCAKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCQoJLy8gcGFyYW1ldGVyaXplZCBleHBsaWNpdCBjb25zdHJ1Y3RvciBjYWxsIC0gd3JvbmcgYXJpdHkKCXB1YmxpYyB2b2lkIHRlc3QyMDAoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyA8VD4gWChUIHQpe1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKHQpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCWNsYXNzIExvY2FsIGV4dGVuZHMgWCB7XG4iICsgCgkJCQkiCQkJTG9jYWwoKSB7XG4iICsKCQkJCSIJCQkJPFN0cmluZyxTdHJpbmc+c3VwZXIoXCJGQUlMRURcIik7XG4iICsgCgkJCQkiCQkJfVxuIiArIAoJCQkJIgkJfTtcbiIgKyAKCQkJCSIJCW5ldyBMb2NhbCgpO1xuIiArCQkJCQoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwgCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIgk8U3RyaW5nLFN0cmluZz5zdXBlcihcIkZBSUxFRFwiKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIkluY29ycmVjdCBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgZm9yIGdlbmVyaWMgY29uc3RydWN0b3IgPFQ+WChUKSBvZiB0eXBlIFg7IGl0IGNhbm5vdCBiZSBwYXJhbWV0ZXJpemVkIHdpdGggYXJndW1lbnRzIDxTdHJpbmcsIFN0cmluZz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQoJLy8gcGFyYW1ldGVyaXplZCBleHBsaWNpdCBjb25zdHJ1Y3RvciBjYWxsIC0gbm9uIGdlbmVyaWMgdGFyZ2V0IGNvbnN0cnVjdG9yCglwdWJsaWMgdm9pZCB0ZXN0MjAxKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgWChTdHJpbmcgdCl7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4odCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJY2xhc3MgTG9jYWwgZXh0ZW5kcyBYIHtcbiIgKyAKCQkJCSIJCQlMb2NhbCgpIHtcbiIgKwoJCQkJIgkJCQk8U3RyaW5nPnN1cGVyKFwiRkFJTEVEXCIpO1xuIiArIAoJCQkJIgkJCX1cbiIgKyAKCQkJCSIJCX07XG4iICsgCgkJCQkiCQluZXcgTG9jYWwoKTtcbiIgKwkJCQkKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJCSIJPFN0cmluZz5zdXBlcihcIkZBSUxFRFwiKTtcbiIgKyAKCQkJIgkgICAgICAgIF5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVGhlIGNvbnN0cnVjdG9yIFgoU3RyaW5nKSBvZiB0eXBlIFggaXMgbm90IGdlbmVyaWM7IGl0IGNhbm5vdCBiZSBwYXJhbWV0ZXJpemVkIHdpdGggYXJndW1lbnRzIDxTdHJpbmc+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKCS8vIHBhcmFtZXRlcml6ZWQgZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbCAtIGFyZ3VtZW50IHR5cGUgbWlzbWF0Y2gKCXB1YmxpYyB2b2lkIHRlc3QyMDIoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyA8VD4gWChUIHQpe1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKHQpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCWNsYXNzIExvY2FsIGV4dGVuZHMgWCB7XG4iICsgCgkJCQkiCQkJTG9jYWwoKSB7XG4iICsKCQkJCSIJCQkJPFN0cmluZz5zdXBlcihuZXcgWChudWxsKSk7XG4iICsgCgkJCQkiCQkJfVxuIiArIAoJCQkJIgkJfTtcbiIgKyAKCQkJCSIJCW5ldyBMb2NhbCgpO1xuIiArCQkJCQoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwgCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCTxTdHJpbmc+c3VwZXIobmV3IFgobnVsbCkpO1xuIiArIAoJCQkiCSAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgcGFyYW1ldGVyaXplZCBjb25zdHJ1Y3RvciA8U3RyaW5nPlgoU3RyaW5nKSBvZiB0eXBlIFggaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKFgpXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjgyMiAtIHN1cGVydHlwZXMgcGFydGlhbGx5IHJlc29sdmVkIGR1cmluZyBib3VuZCBjaGVjawoJcHVibGljIHZvaWQgdGVzdDIwMygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlkZW1vLkFEIGFkO1xuIiArCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwgCQkJCgkJCQkiZGVtby9BRC5qYXZhIiwKCQkJCSJwYWNrYWdlIGRlbW87XG4iICsKCQkJCSJwdWJsaWMgaW50ZXJmYWNlIEFEIGV4dGVuZHMgTElTVDxBRFhQPiB7fVxuIiwKCQkJCSJkZW1vL0FEWFAuamF2YSIsCgkJCQkicGFja2FnZSBkZW1vO1xuIiArCgkJCQkicHVibGljIGludGVyZmFjZSBBRFhQIGV4dGVuZHMgQklOIHt9XG4iLAoJCQkJImRlbW8vQU5ZLmphdmEiLAoJCQkJInBhY2thZ2UgZGVtbztcbiIgKwoJCQkJInB1YmxpYyBpbnRlcmZhY2UgQU5ZIHt9XG4iLAoJCQkJImRlbW8vQkwuamF2YSIsCgkJCQkicGFja2FnZSBkZW1vO1xuIiArCgkJCQkicHVibGljIGludGVyZmFjZSBCTCBleHRlbmRzIEFOWSB7fVxuIiwKCQkJCSJkZW1vL0xJU1QuamF2YSIsCgkJCQkicGFja2FnZSBkZW1vO1xuIiArCgkJCQkicHVibGljIGludGVyZmFjZSBMSVNUPFQgZXh0ZW5kcyBBTlk+IGV4dGVuZHMgQU5ZIHt9XG4iLAoJCQkJImRlbW8vQklOLmphdmEiLAoJCQkJInBhY2thZ2UgZGVtbztcbiIgKwoJCQkJInB1YmxpYyBpbnRlcmZhY2UgQklOIGV4dGVuZHMgTElTVDxCTD4ge31cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjI4MDYKCXB1YmxpYyB2b2lkIHRlc3QyMDQoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJGdW5jdGlvbi5qYXZhIiwKCQkJCSJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRnVuY3Rpb248WSxYPiB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBhYnN0cmFjdCBZIGV2YWwoWCB4KTtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJ9XG4iLAoJCQkJIkZ1bmN0aW9uTWFwcGVkQ29tcGFyYXRvci5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIEZ1bmN0aW9uTWFwcGVkQ29tcGFyYXRvcjxZLFg+IGltcGxlbWVudHMgQ29tcGFyYXRvcjxYPiB7XG4iICsgCgkJCQkiCS8qXG4iICsgCgkJCQkiCSAqIFwnRnVuY3Rpb25cJyBpcyBoaWdobGlnaHRlZCBhcyBhbiBlcnJvciBoZXJlIC0gdGhlIG1lc3NhZ2UgaXM6XG4iICsgCgkJCQkiCSAqIFRoZSB0eXBlIEZ1bmN0aW9uIGlzIG5vdCBnZW5lcmljOyBpdCBjYW5ub3QgYmUgcGFyYW1ldGVyaXplZCB3aXRoIGFyZ3VtZW50cyA8WSwgWD5cbiIgKyAKCQkJCSIJICovXG4iICsgCgkJCQkiICAgIHByb3RlY3RlZCBGdW5jdGlvbjxZLFg+IGZ1bmN0aW9uO1xuIiArIAoJCQkJIiAgICBwcm90ZWN0ZWQgQ29tcGFyYXRvcjxZPiBjb21wYXJhdG9yO1xuIiArIAoJCQkJIiAgICBwdWJsaWMgRnVuY3Rpb25NYXBwZWRDb21wYXJhdG9yKEZ1bmN0aW9uPFksWD4gZnVuY3Rpb24sQ29tcGFyYXRvcjxZPiBjb21wYXJhdG9yICkge1xuIiArIAoJCQkJIiAgICAgICAgdGhpcy5mdW5jdGlvbj1mdW5jdGlvbjtcbiIgKyAKCQkJCSIgICAgICAgIHRoaXMuY29tcGFyYXRvcj1jb21wYXJhdG9yO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICAgIHB1YmxpYyBpbnQgY29tcGFyZShYIHgxLCBYIHgyKSB7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gY29tcGFyYXRvci5jb21wYXJlKGZ1bmN0aW9uLmV2YWwoeDEpLGZ1bmN0aW9uLmV2YWwoeDIpKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsIAkJCQoJCQl9LAoJCQkiIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjM1NTUgLSByZWZlcmVuY2UgdG8gc3RhdGljIHR5cGUgcGFyYW1ldGVyIGFsbG93ZWQgaW5zaWRlIHR5cGUgaXRzZWxmCglwdWJsaWMgdm9pZCB0ZXN0MjA1KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiQWxwaGEuamF2YSIsCgkJCQkicHVibGljIGNsYXNzIEFscGhhIHtcbiIgKyAKCQkJCSIJc3RhdGljIGNsYXNzIEJldGE8VD4ge1xuIiArIAoJCQkJIgkJVCBvYmo7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLCAJCQkKCQkJfSwKCQkJIiIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYzNTU1IC0gdmFyaWF0aW9uIG9uIHN0YXRpYyBtZXRob2QgdHlwZSBwYXJhbWV0ZXIKCXB1YmxpYyB2b2lkIHRlc3QyMDYoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJBbHBoYS5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgQWxwaGEge1xuIiArIAoJCQkJIglzdGF0aWMgPFQ+IHZvaWQgQmV0YShUIHQpIHtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsIAkJCQoJCQl9LAoJCQkiIik7Cgl9CQkJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjM1OTAgLSBkaXNhbGxvdyBwYXJhbWV0ZXJpemVkIHR5cGUgaW4gY2F0Y2gvdGhyb3dzIGNsYXVzZQoJcHVibGljIHZvaWQgdGVzdDIwNygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJBbHBoYS5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgQWxwaGE8VD4gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHtcbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJbmV3IE9iamVjdCgpIHtcbiIgKyAKCQkJCSIJCQlwdWJsaWMgdm9pZCBtKCkgdGhyb3dzIEFscGhhPFN0cmluZz4ge1xuIiArIAoJCQkJIgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgkJCX1cbiIgKyAKCQkJCSIJCX0ubSgpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwgCQkJCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIEFscGhhLmphdmEgKGF0IGxpbmUgMSlcbiIgKyAKCQkJIglwdWJsaWMgY2xhc3MgQWxwaGE8VD4gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgXl5eXl5cbiIgKyAKCQkJIlRoZSBzZXJpYWxpemFibGUgY2xhc3MgQWxwaGEgZG9lcyBub3QgZGVjbGFyZSBhIHN0YXRpYyBmaW5hbCBzZXJpYWxWZXJzaW9uVUlEIGZpZWxkIG9mIHR5cGUgbG9uZ1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gQWxwaGEuamF2YSAoYXQgbGluZSAxKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBBbHBoYTxUPiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24ge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlRoZSBnZW5lcmljIGNsYXNzIEFscGhhPFQ+IG1heSBub3Qgc3ViY2xhc3MgamF2YS5sYW5nLlRocm93YWJsZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gRVJST1IgaW4gQWxwaGEuamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCXB1YmxpYyB2b2lkIG0oKSB0aHJvd3MgQWxwaGE8U3RyaW5nPiB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICBeXl5eXlxuIiArIAoJCQkiQ2Fubm90IHVzZSB0aGUgcGFyYW1ldGVyaXplZCB0eXBlIEFscGhhPFN0cmluZz4gZWl0aGVyIGluIGNhdGNoIGJsb2NrIG9yIHRocm93cyBjbGF1c2VcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYzNTkwIC0gZGlzYWxsb3cgcGFyYW1ldGVyaXplZCB0eXBlIGluIGNhdGNoL3Rocm93cyBjbGF1c2UKCXB1YmxpYyB2b2lkIHRlc3QyMDgoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24ge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQl0cnkge1xuIiArIAoJCQkJIgkJCXRocm93IG5ldyBYPFN0cmluZz4oKTtcbiIgKyAKCQkJCSIJCX0gY2F0Y2goWDxTdHJpbmc+IGUpIHtcbiIgKyAKCQkJCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJYPFN0cmluZz5cIik7XG4iICsgCgkJCQkiCQl9IGNhdGNoKFg8WDxTdHJpbmc+PiBlKSB7XG4iICsgCgkJCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKFwiWDxYPFN0cmluZz4+XCIpO1xuIiArIAoJCQkJIgkJfSBjYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIHtcbiIgKyAKCQkJCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJSdW50aW1lRXhjZXB0aW9uXCIpO1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwgCQkJCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYPFQ+IGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7XG4iICsgCgkJCSIJICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlRoZSBzZXJpYWxpemFibGUgY2xhc3MgWCBkb2VzIG5vdCBkZWNsYXJlIGEgc3RhdGljIGZpbmFsIHNlcmlhbFZlcnNpb25VSUQgZmllbGQgb2YgdHlwZSBsb25nXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMSlcbiIgKyAKCQkJIglwdWJsaWMgY2xhc3MgWDxUPiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24ge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVGhlIGdlbmVyaWMgY2xhc3MgWDxUPiBtYXkgbm90IHN1YmNsYXNzIGphdmEubGFuZy5UaHJvd2FibGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCX0gY2F0Y2goWDxTdHJpbmc+IGUpIHtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICBeXG4iICsgCgkJCSJDYW5ub3QgdXNlIHRoZSBwYXJhbWV0ZXJpemVkIHR5cGUgWDxTdHJpbmc+IGVpdGhlciBpbiBjYXRjaCBibG9jayBvciB0aHJvd3MgY2xhdXNlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI0LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIgl9IGNhdGNoKFg8WDxTdHJpbmc+PiBlKSB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgXlxuIiArIAoJCQkiQ2Fubm90IHVzZSB0aGUgcGFyYW1ldGVyaXplZCB0eXBlIFg8WDxTdHJpbmc+PiBlaXRoZXIgaW4gY2F0Y2ggYmxvY2sgb3IgdGhyb3dzIGNsYXVzZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjM1NTYgLSBzaG91bGQgcmVzb2x2ZSBhbGwgb2NjdXJyZW5jZXMgb2YgQSB0byB0eXBlIHZhcmlhYmxlCglwdWJsaWMgdm9pZCB0ZXN0MjA5KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxBLEIsQyBleHRlbmRzIGphdmEudXRpbC5MaXN0PEE+PiB7fVxuIiArIAoJCQkJImNsYXNzIFgyPEEsQyBleHRlbmRzIGphdmEudXRpbC5MaXN0PEE+LCBCPiB7fVxuIiArIAoJCQkJImNsYXNzIFgzPEIsIEEsQyBleHRlbmRzIGphdmEudXRpbC5MaXN0PEE+PiB7fVxuIiwgCQkJCgkJCX0sCgkJCSIiKTsKCX0JCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjgwMDYgLSBJbnZhbGlkIG1vZGlmaWVyIGFmdGVyIHBhcnNlCglwdWJsaWMgdm9pZCB0ZXN0MjEwKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIgl2b2lkIGZvbyhNYXA8PyBzdXBlciBPYmplY3QsID8gZXh0ZW5kcyBTdHJpbmc+IG0pe1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwgCQkJCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKCQkJIgl2b2lkIGZvbyhNYXA8PyBzdXBlciBPYmplY3QsID8gZXh0ZW5kcyBTdHJpbmc+IG0pe1xuIiArIAoJCQkiCSAgICAgICAgIF5eXlxuIiArIAoJCQkiTWFwIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy8gdGVzdCBjb21waWxhdGlvbiBhZ2FpbnN0IGJpbmFyaWVzCglwdWJsaWMgdm9pZCB0ZXN0MjExKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkicC9Ub3AuamF2YSIsCgkJCQkicGFja2FnZSBwO1xuIiArCgkJCQkicHVibGljIGludGVyZmFjZSBUb3A8VD4ge31cbiIsCgkJCX0sCgkJCSIiKTsKCgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJwL1N1cGVyLmphdmEiLAoJCQkJInBhY2thZ2UgcDtcbiIgKwoJCQkJInB1YmxpYyBjbGFzcyBTdXBlcjxUPiBpbXBsZW1lbnRzIFRvcDxUPntcbiIgKwoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIiwKCQkJbnVsbCwKCQkJZmFsc2UsIC8vIGRvIG5vdCBmbHVzaCBvdXRwdXQKCQkJbnVsbCk7CQkKCX0JCQkKCS8vIGNoZWNrIHR5cGUgdmFyaWFibGUgZXF1aXZhbGVuY2UKCXB1YmxpYyB2b2lkIHRlc3QyMTIoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPntcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIJWDxUPiBfcmVjdXJzZTsgXG4iICsgCgkJCQkiCXB1YmxpYyBMaXN0PFQ+IHRvTGlzdCgpe1xuIiArIAoJCQkJIgkJTGlzdDxUPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7XG4iICsgCgkJCQkiCQlyZXN1bHQuYWRkQWxsKF9yZWN1cnNlLnRvTGlzdCgpKTsgLy8gc2hvdWxkIGJlIGFwcGxpY2FibGVcbiIgKyAKCQkJCSIJCXJldHVybiByZXN1bHQ7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MjEzKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxSLFQgZXh0ZW5kcyBDb21wYXJhYmxlPFQ+PntcbiIgKyAKCQkJCSIJVCB0ZXN0O1xuIiArIAoJCQkJIglwdWJsaWMgQ29tcGFyYWJsZTw/IGV4dGVuZHMgVD4gZ2V0VGhpcygpe1xuIiArIAoJCQkJIgkJcmV0dXJuIHRlc3Q7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjgxMzMgLSB2ZXJpZnkgZXJyb3IKCXB1YmxpYyB2b2lkIHRlc3QyMTQoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0O1xuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgQXJyYXlMaXN0PE9iamVjdD4gbDtcbiIgKyAKCQkJCSIgICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiIgKyAKCQkJCSIgICAgICAgIGNhc2UgMTpcbiIgKyAKCQkJCSIgICAgICAgICAgICBsID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7XG4iICsgCgkJCQkiICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGwpO1xuIiArIAoJCQkJIiAgICAgICAgICAgIGJyZWFrO1xuIiArIAoJCQkJIiAgICAgICAgZGVmYXVsdDpcbiIgKyAKCQkJCSIgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICAgICAgICAgIHJldHVybjtcbiIgKyAKCQkJCSIgICAgICAgIH1cbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjgxMzMgdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0MjE1KCkgeyAKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlqYXZhLnV0aWwuQXJyYXlMaXN0PE9iamVjdD4gaTsJXG4iICsgCgkJCQkiCQlvdXRlcjoge1xuIiArIAoJCQkJIgkJCWlmIChhcmdzID09IG51bGwpIHtcbiIgKyAKCQkJCSIJCQkJaSA9IG51bGw7XG4iICsgCgkJCQkiCQkJCWJyZWFrIG91dGVyO1xuIiArIAoJCQkJIgkJCX1cbiIgKyAKCQkJCSIJCQlyZXR1cm47XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oaSk7CVxuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTsJXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiIik7CgkJCQoJCVN0cmluZyBleHBlY3RlZE91dHB1dCA9CgkJCSIgIC8vIE1ldGhvZCBkZXNjcmlwdG9yICMxNSAoW0xqYXZhL2xhbmcvU3RyaW5nOylWXG4iICsgCgkJCSIgIC8vIFN0YWNrOiAyLCBMb2NhbHM6IDJcbiIgKyAKCQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncyk7XG4iICsgCgkJCSIgICAgIDAgIGFsb2FkXzAgW2FyZ3NdXG4iICsgCgkJCSIgICAgIDEgIGlmbm9ubnVsbCA5XG4iICsgCgkJCSIgICAgIDQgIGFjb25zdF9udWxsXG4iICsgCgkJCSIgICAgIDUgIGFzdG9yZV8xIFtpXVxuIiArIAoJCQkiICAgICA2ICBnb3RvIDEwXG4iICsgCgkJCSIgICAgIDkgIHJldHVyblxuIiArIAoJCQkiICAgIDEwICBnZXRzdGF0aWMgamF2YS5sYW5nLlN5c3RlbS5vdXQgOiBqYXZhLmlvLlByaW50U3RyZWFtIFsyMV1cbiIgKyAKCQkJIiAgICAxMyAgYWxvYWRfMSBbaV1cbiIgKyAKCQkJIiAgICAxNCAgaW52b2tldmlydHVhbCBqYXZhLmlvLlByaW50U3RyZWFtLnByaW50bG4oamF2YS5sYW5nLk9iamVjdCkgOiB2b2lkICBbMjddXG4iICsgCgkJCSIgICAgMTcgIGdldHN0YXRpYyBqYXZhLmxhbmcuU3lzdGVtLm91dCA6IGphdmEuaW8uUHJpbnRTdHJlYW0gWzIxXVxuIiArIAoJCQkiICAgIDIwICBsZGMgPFN0cmluZyBcIlNVQ0NFU1NcIj4gWzI5XVxuIiArIAoJCQkiICAgIDIyICBpbnZva2V2aXJ0dWFsIGphdmEuaW8uUHJpbnRTdHJlYW0ucHJpbnRsbihqYXZhLmxhbmcuU3RyaW5nKSA6IHZvaWQgIFszMl1cbiIgKyAKCQkJIiAgICAyNSAgcmV0dXJuXG4iICsgCgkJCSIgICAgICBMaW5lIG51bWJlcnM6XG4iICsgCgkJCSIgICAgICAgIFtwYzogMCwgbGluZTogNV1cbiIgKyAKCQkJIiAgICAgICAgW3BjOiA0LCBsaW5lOiA2XVxuIiArIAoJCQkiICAgICAgICBbcGM6IDYsIGxpbmU6IDddXG4iICsgCgkJCSIgICAgICAgIFtwYzogOSwgbGluZTogOV1cbiIgKyAKCQkJIiAgICAgICAgW3BjOiAxMCwgbGluZTogMTFdXG4iICsgCgkJCSIgICAgICAgIFtwYzogMTcsIGxpbmU6IDEyXVxuIiArIAoJCQkiICAgICAgICBbcGM6IDI1LCBsaW5lOiAxM11cbiIgKyAKCQkJIiAgICAgIExvY2FsIHZhcmlhYmxlIHRhYmxlOlxuIiArIAoJCQkiICAgICAgICBbcGM6IDAsIHBjOiAyNl0gbG9jYWw6IGFyZ3MgaW5kZXg6IDAgdHlwZTogamF2YS5sYW5nLlN0cmluZ1tdXG4iICsgCgkJCSIgICAgICAgIFtwYzogNiwgcGM6IDldIGxvY2FsOiBpIGluZGV4OiAxIHR5cGU6IGphdmEudXRpbC5BcnJheUxpc3RcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAxMCwgcGM6IDI2XSBsb2NhbDogaSBpbmRleDogMSB0eXBlOiBqYXZhLnV0aWwuQXJyYXlMaXN0XG4iICsgCgkJCSIgICAgICBMb2NhbCB2YXJpYWJsZSB0eXBlIHRhYmxlOlxuIiArIAoJCQkiICAgICAgICBbcGM6IDYsIHBjOiA5XSBsb2NhbDogaSBpbmRleDogMSB0eXBlOiBqYXZhLnV0aWwuQXJyYXlMaXN0PGphdmEubGFuZy5PYmplY3Q+XG4iICsgCgkJCSIgICAgICAgIFtwYzogMTAsIHBjOiAyNl0gbG9jYWw6IGkgaW5kZXg6IDEgdHlwZTogamF2YS51dGlsLkFycmF5TGlzdDxqYXZhLmxhbmcuT2JqZWN0PlxuIjsKCQkKCQl0cnkgewoJCQlGaWxlIGYgPSBuZXcgRmlsZShPVVRQVVRfRElSICsgRmlsZS5zZXBhcmF0b3IgKyAiWC5jbGFzcyIpOwoJCQlieXRlW10gY2xhc3NGaWxlQnl0ZXMgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldEZpbGVCeXRlQ29udGVudChmKTsKCQkJQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIgZGlzYXNzZW1ibGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyKCk7CgkJCVN0cmluZyByZXN1bHQgPSBkaXNhc3NlbWJsZXIuZGlzYXNzZW1ibGUoY2xhc3NGaWxlQnl0ZXMsICJcbiIsIENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyLkRFVEFJTEVEKTsKCQkJaW50IGluZGV4ID0gcmVzdWx0LmluZGV4T2YoZXhwZWN0ZWRPdXRwdXQpOwoJCQlpZiAoaW5kZXggPT0gLTEgfHwgZXhwZWN0ZWRPdXRwdXQubGVuZ3RoKCkgPT0gMCkgewoJCQkJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuZGlzcGxheVN0cmluZyhyZXN1bHQsIDMpKTsKCQkJfQoJCQlpZiAoaW5kZXggPT0gLTEpIHsKCQkJCWFzc2VydEVxdWFscygiV3JvbmcgY29udGVudHMiLCBleHBlY3RlZE91dHB1dCwgcmVzdWx0KTsKCQkJfQoJCX0gY2F0Y2ggKG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb24gZSkgewoJCQlhc3NlcnRUcnVlKGZhbHNlKTsKCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CgkJCWFzc2VydFRydWUoZmFsc2UpOwoJCX0KCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODk5OCBwYXJhbWV0ZXJpemVkIGZpZWxkIGNvbnN0YW50cwoJcHVibGljIHZvaWQgdGVzdDIxNigpIHsgCgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJ0ZXN0L2NoZWV0YWgvTkcuamF2YSIsCgkJCQkicGFja2FnZSB0ZXN0LmNoZWV0YWg7XG4iICsKCQkJCSJwdWJsaWMgY2xhc3MgTkcgZXh0ZW5kcyBHIHtcbiIgKwoJCQkJIgkJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7CVxuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0KCkge1xuIiArCgkJCQkiICAgICAgICByZXR1cm4gbyA9PSBudWxsO1xuIiArCgkJCQkiICAgIH1cbiIgKwoJCQkJIn1cbiIsCgkJCQkidGVzdC9jaGVldGFoL0cuamF2YSIsCgkJCQkicGFja2FnZSB0ZXN0LmNoZWV0YWg7XG4iICsKCQkJCSJwdWJsaWMgY2xhc3MgRzxFPiB7XG4iICsKCQkJCSIgICAgcHJvdGVjdGVkIE9iamVjdCBvO1xuIiArCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTEzNSAtIHVubmVjZXNzYXJ5IGNhc3Qgb3BlcmF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0MjE3KCkgewoJCU1hcCBjdXN0b21PcHRpb25zID0gZ2V0Q29tcGlsZXJPcHRpb25zKCk7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlBcnJheUxpc3Q8U3RyaW5nPiBsPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTtcbiIgKyAKCQkJCSIJCVN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKSBsLmdldCgwKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIglTdHJpbmcgc3RyaW5nID0gKFN0cmluZykgbC5nZXQoMCk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJVbm5lY2Vzc2FyeSBjYXN0IGZyb20gU3RyaW5nIHRvIFN0cmluZ1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiwKCQkJbnVsbCwKCQkJdHJ1ZSwKCQkJY3VzdG9tT3B0aW9ucyk7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQxNTQgdmlzaWJpbGl0eSBpc3N1ZSBkdWUgdG8gaW52YWxpZCB1c2Ugb2YgcGFyYW1ldGVyaXplZCBiaW5kaW5nCglwdWJsaWMgdm9pZCB0ZXN0MjE4KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPntcbiIgKyAKCQkJCSIJcHJpdmF0ZSBmaW5hbCBUIF9kYXRhO1xuIiArIAoJCQkJIglwcml2YXRlIFgoVCBkYXRhKXtcbiIgKyAKCQkJCSIJCV9kYXRhID0gZGF0YTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgVCBnZXREYXRhKCl7XG4iICsgCgkJCQkiCQlyZXR1cm4gX2RhdGE7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyA8RT4gWDxFPiBjcmVhdGUoRSBkYXRhKSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gbmV3IFg8RT4oZGF0YSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJY3JlYXRlKG5ldyBPYmplY3QoKSk7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwgCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY0MTU0IHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDIxOSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD57XG4iICsgCgkJCQkiCXByaXZhdGUgZmluYWwgVCBfZGF0YTtcbiIgKyAKCQkJCSIJcHJpdmF0ZSBYKFQgZGF0YSl7XG4iICsgCgkJCQkiCQlfZGF0YSA9IGRhdGE7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIFQgZ2V0RGF0YSgpe1xuIiArIAoJCQkJIgkJcmV0dXJuIF9kYXRhO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgPEU+IEUgY3JlYXRlKEUgZGF0YSkge1xuIiArIAoJCQkJIgkJcmV0dXJuIG5ldyBYPEU+KGRhdGEpLl9kYXRhO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCWNyZWF0ZShuZXcgT2JqZWN0KCkpO1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTE0MSB1bnNhZmUgd2lsZGNhcmQgb3BlcmF0aW9uIHRvbGVyYXRlcyB3aWxkY2FyZCB3aXRoIGxvd2VyIGJvdW5kcwoJcHVibGljIHZvaWQgdGVzdDIyMCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCgkJCQkiCQlBcnJheUxpc3Q8PyBzdXBlciBJbnRlZ2VyPiBhbCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpO1xuIiArIAoJCQkJIgkJYWwuYWRkKG5ldyBJbnRlZ2VyKDEpKTsgLy8gKDEpXG4iICsgCgkJCQkiCQlJbnRlZ2VyIGkgPSBhbC5nZXQoMCk7ICAvLyAoMilcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJCSIJSW50ZWdlciBpID0gYWwuZ2V0KDApOyAgLy8gKDIpXG4iICsgCgkJCSIJICAgICAgICBeXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIGNhcHR1cmUtb2YgPyBzdXBlciBJbnRlZ2VyIHRvIEludGVnZXJcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjkxNDEgdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0MjIxKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKCQkJCSIJCUFycmF5TGlzdDw/IGV4dGVuZHMgSW50ZWdlcj4gYWwgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7XG4iICsgCgkJCQkiCQlhbC5hZGQobmV3IEludGVnZXIoMSkpOyAvLyAoMSlcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsIAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJYWwuYWRkKG5ldyBJbnRlZ2VyKDEpKTsgLy8gKDEpXG4iICsgCgkJCSIJICAgXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8gZXh0ZW5kcyBJbnRlZ2VyKSBpbiB0aGUgdHlwZSBBcnJheUxpc3Q8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgSW50ZWdlcj4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKEludGVnZXIpXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTE0MTogdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0MjIyKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlYTGlzdDw/IHN1cGVyIEludGVnZXI+IGx4ID0gbmV3IFhMaXN0PEludGVnZXI+KCk7XG4iICsgCgkJCQkiCQlseC5zbG90ID0gbmV3IEludGVnZXIoMSk7XG4iICsgCgkJCQkiCQlJbnRlZ2VyIGkgPSBseC5zbG90O1xuIiArCgkJCQkiICAgIH0gICAgCVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBYTGlzdDxFPiB7XG4iICsgCgkJCQkiICAgIEUgc2xvdDtcbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJCSIJSW50ZWdlciBpID0gbHguc2xvdDtcbiIgKyAKCQkJIgkgICAgICAgIF5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gY2FwdHVyZS1vZiA/IHN1cGVyIEludGVnZXIgdG8gSW50ZWdlclxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQoJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjkyNTEtIGluc3RhbnRpYXRpbmcgd2lsZGNhcmRzCglwdWJsaWMgdm9pZCB0ZXN0MjIzKCkgewoJCU1hcCBjdXN0b21PcHRpb25zID0gZ2V0Q29tcGlsZXJPcHRpb25zKCk7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7XG4iICsgCgkJCQkiaW1wb3J0IGphdmEudXRpbC5NYXA7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M8PyBleHRlbmRzIE9iamVjdD4+IGNsYXNzZXMgXG4iICsgCgkJCQkiICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+PigpO1xuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+PiBjbGFzc2VzMiBcbiIgKyAKCQkJCSIgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBjbGFzcyBNWDxFPiB7XG4iICsgCgkJCQkiICAgIAlFIGdldCgpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSIgICAgCXZvaWQgZm9vKEUgZSkge31cbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgdm9pZCBmb28oKSB7XG4iICsgCgkJCQkiICAgIAlNWDxDbGFzczw/IGV4dGVuZHMgT2JqZWN0Pj4gbXgxID0gbmV3IE1YPENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+PigpO1xuIiArIAoJCQkJIiAgICAJTVg8Q2xhc3M+IG14MiA9IG5ldyBNWDxDbGFzcz4oKTtcbiIgKyAKCQkJCSIgICAgCW14MS5mb28obXgyLmdldCgpKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIJLCAKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCXN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzczw/IGV4dGVuZHMgT2JqZWN0Pj4gY2xhc3NlczIgXG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBIYXNoTWFwPFN0cmluZyxDbGFzcz4gdG8gTWFwPFN0cmluZyxDbGFzczw/IGV4dGVuZHMgT2JqZWN0Pj5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDE4KVxuIiArIAoJCQkiCW14MS5mb28obXgyLmdldCgpKTtcbiIgKyAKCQkJIgkgICAgICAgIF5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBleHByZXNzaW9uIG9mIHR5cGUgQ2xhc3MgbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBDbGFzczw/IGV4dGVuZHMgT2JqZWN0PlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiwKCQkJbnVsbCwKCQkJdHJ1ZSwKCQkJY3VzdG9tT3B0aW9ucyk7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njg5OTggdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0MjI0KCkgeyAKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJ0ZXN0L2NoZWV0YWgvTkcuamF2YSIsCgkJCQkicGFja2FnZSB0ZXN0LmNoZWV0YWg7XG4iICsKCQkJCSJwdWJsaWMgY2xhc3MgTkcgZXh0ZW5kcyBHIHtcbiIgKwoJCQkJIgkJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7CVxuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0KCkge1xuIiArCgkJCQkiICAgICAgICByZXR1cm4gbyA9PSBudWxsO1xuIiArCgkJCQkiICAgIH1cbiIgKwoJCQkJIn1cbiIsCgkJCQkidGVzdC9jaGVldGFoL0cuamF2YSIsCgkJCQkicGFja2FnZSB0ZXN0LmNoZWV0YWg7XG4iICsKCQkJCSJwdWJsaWMgY2xhc3MgRzxFPiB7XG4iICsKCQkJCSIgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBvO1xuIiArCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIHRlc3RcXGNoZWV0YWhcXEcuamF2YSAoYXQgbGluZSAyKVxyXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIEc8RT4ge1xyXG4iICsgCgkJCSIJICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlRoZSBibGFuayBmaW5hbCBmaWVsZCBvIG1heSBub3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjkzNTMgLSBwcmV2ZW50IHVzaW5nIHR5cGUgcGFyYW1ldGVyIGluIGNhdGNoIGJsb2NrCglwdWJsaWMgdm9pZCB0ZXN0MjI1KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBFeGNlcHRpb24+IHtcbiIgKyAKCQkJCSIgICAgU3RyaW5nIGZvbygpIHRocm93cyBUIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiBcIlNVQ0NFU1NcIjtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBuZXcgWDxFWD4oKS5iYXoobmV3IEVYKCkpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHZvaWQgYmF6KGZpbmFsIFQgdCkge1xuIiArIAoJCQkJIiAgICAgICAgbmV3IE9iamVjdCgpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICB2b2lkIHByaW50KCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICB0cnkge1xuIiArIAoJCQkJIgkgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGZvbygpKTtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgfSBjYXRjaCAoVCB0KSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIH1cbiIgKyAKCQkJCSIgICAgICAgICAgICB9XG4iICsgCgkJCQkiICAgICAgICB9LnByaW50KCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgRVggZXh0ZW5kcyBFeGNlcHRpb24ge1xuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTMpXG4iICsgCgkJCSIJfSBjYXRjaCAoVCB0KSB7XG4iICsgCgkJCSIJICAgICAgICAgICBeXG4iICsgCgkJCSJDYW5ub3QgdXNlIHRoZSB0eXBlIHBhcmFtZXRlciBUIGluIGEgY2F0Y2ggYmxvY2tcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDE5KVxuIiArIAoJCQkiCWNsYXNzIEVYIGV4dGVuZHMgRXhjZXB0aW9uIHtcbiIgKyAKCQkJIgkgICAgICBeXlxuIiArIAoJCQkiVGhlIHNlcmlhbGl6YWJsZSBjbGFzcyBFWCBkb2VzIG5vdCBkZWNsYXJlIGEgc3RhdGljIGZpbmFsIHNlcmlhbFZlcnNpb25VSUQgZmllbGQgb2YgdHlwZSBsb25nXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTE3MCAtIGludmFsaWQgZ2VuZXJpYyBhcnJheSBjcmVhdGlvbgoJcHVibGljIHZvaWQgdGVzdDIyNigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQ+e1xuIiArIAoJCQkJIgkgT2JqZWN0IHgxPSBuZXcgVFswXTtcbiIgKyAKCQkJCSIJIE9iamVjdCB4Mj0gbmV3IFg8U3RyaW5nPlswXTsJIFxuIiArIAoJCQkJIgkgT2JqZWN0IHgzPSBuZXcgWDxUPlswXTsJIFxuIiArIAoJCQkJIgkgT2JqZWN0IHg0PSBuZXcgWFswXTsJIFxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKCQkJIglPYmplY3QgeDE9IG5ldyBUWzBdO1xuIiArIAoJCQkiCSAgICAgICAgICAgXl5eXl5eXl5cbiIgKyAKCQkJIkNhbm5vdCBjcmVhdGUgYSBnZW5lcmljIGFycmF5IG9mIFRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCU9iamVjdCB4Mj0gbmV3IFg8U3RyaW5nPlswXTsJIFxuIiArIAoJCQkiCSAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiQ2Fubm90IGNyZWF0ZSBhIGdlbmVyaWMgYXJyYXkgb2YgWDxTdHJpbmc+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkJIglPYmplY3QgeDM9IG5ldyBYPFQ+WzBdOwkgXG4iICsgCgkJCSIJICAgICAgICAgICBeXl5eXl5eXl5eXlxuIiArIAoJCQkiQ2Fubm90IGNyZWF0ZSBhIGdlbmVyaWMgYXJyYXkgb2YgWDxUPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjkzNTkgLSB1bnNhZmUgY2FzdCBkaWFnbm9zaXMKCXB1YmxpYyB2b2lkIHRlc3QyMjcoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSIgaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAoJCQkJIiBwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICBMaXN0IGxpc3QoKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkiICB2b2lkIG0oKSB7IExpc3Q8WD4gbCA9IChMaXN0PFg+KWxpc3QoKTsgfSAvLyB1bnNhZmUgY2FzdFxuIiArIAoJCQkJIiAgdm9pZCBtMCgpIHsgTGlzdDxYPiBsID0gbGlzdCgpOyB9IC8vIHVuc2FmZSBjb252ZXJzaW9uXG4iICsgCgkJCQkiICB2b2lkIG0xKCkgeyBmb3IgKFggYSA6IGxpc3QoKSk7IH0gLy8gdHlwZSBtaXNtYXRjaFxuIiArIAoJCQkJIiAgdm9pZCBtMigpIHsgZm9yIChJdGVyYXRvcjxYPiBpID0gbGlzdCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyk7IH0gIC8vIHVuc2FmZSBjb252ZXJzaW9uXG4iICsgCgkJCQkiICB2b2lkIG0zKCkgeyBDb2xsZWN0aW9uIGMgPSBudWxsOyBMaXN0IGwgPSAoTGlzdDxYPiljOyB9IC8vIHVuc2FmZSBjYXN0XG4iICsgCgkJCQkiICB2b2lkIG00KCkgeyBDb2xsZWN0aW9uIGMgPSBudWxsOyBMaXN0IGwgPSAoTGlzdDw/PiljOyB9IC8vIG9rXG4iICsgCgkJCQkiICB2b2lkIG01KCkgeyBMaXN0IGMgPSBudWxsOyBMaXN0IGwgPSAoQ29sbGVjdGlvbjxYPiljOyB9IC8vIHR5cGUgbWlzbWF0Y2hcbiIgKyAKCQkJCSIgIHZvaWQgbTYoKSB7IExpc3QgYyA9IG51bGw7IExpc3QgbCA9IChDb2xsZWN0aW9uPD8+KWM7IH0gLy8gdHlwZSBtaXNtYXRjaFxuIiArIAoJCQkJIn1cbiIJLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkJIgl2b2lkIG0oKSB7IExpc3Q8WD4gbCA9IChMaXN0PFg+KWxpc3QoKTsgfSAvLyB1bnNhZmUgY2FzdFxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNhc3QgZnJvbSBMaXN0IHRvIExpc3Q8WD4gaXMgYWN0dWFsbHkgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZXJhc2VkIHR5cGUgTGlzdFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIgl2b2lkIG0wKCkgeyBMaXN0PFg+IGwgPSBsaXN0KCk7IH0gLy8gdW5zYWZlIGNvbnZlcnNpb25cbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIExpc3QgbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBMaXN0PFg+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkJIgl2b2lkIG0xKCkgeyBmb3IgKFggYSA6IGxpc3QoKSk7IH0gLy8gdHlwZSBtaXNtYXRjaFxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIGVsZW1lbnQgdHlwZSBPYmplY3QgdG8gWFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNC4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIgl2b2lkIG0yKCkgeyBmb3IgKEl0ZXJhdG9yPFg+IGkgPSBsaXN0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KTsgfSAgLy8gdW5zYWZlIGNvbnZlcnNpb25cbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBleHByZXNzaW9uIG9mIHR5cGUgSXRlcmF0b3IgbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBJdGVyYXRvcjxYPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIgl2b2lkIG0zKCkgeyBDb2xsZWN0aW9uIGMgPSBudWxsOyBMaXN0IGwgPSAoTGlzdDxYPiljOyB9IC8vIHVuc2FmZSBjYXN0XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBjYXN0IGZyb20gQ29sbGVjdGlvbiB0byBMaXN0PFg+IGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIExpc3RcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjYuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMClcbiIgKyAKCQkJIgl2b2lkIG01KCkgeyBMaXN0IGMgPSBudWxsOyBMaXN0IGwgPSAoQ29sbGVjdGlvbjxYPiljOyB9IC8vIHR5cGUgbWlzbWF0Y2hcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gQ29sbGVjdGlvbjxYPiB0byBMaXN0XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI3LiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxMClcbiIgKyAKCQkJIgl2b2lkIG01KCkgeyBMaXN0IGMgPSBudWxsOyBMaXN0IGwgPSAoQ29sbGVjdGlvbjxYPiljOyB9IC8vIHR5cGUgbWlzbWF0Y2hcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNhc3QgZnJvbSBMaXN0IHRvIENvbGxlY3Rpb248WD4gaXMgYWN0dWFsbHkgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZXJhc2VkIHR5cGUgQ29sbGVjdGlvblxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiOC4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDExKVxuIiArIAoJCQkiCXZvaWQgbTYoKSB7IExpc3QgYyA9IG51bGw7IExpc3QgbCA9IChDb2xsZWN0aW9uPD8+KWM7IH0gLy8gdHlwZSBtaXNtYXRjaFxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBDb2xsZWN0aW9uPGNhcHR1cmUtb2YgPz4gdG8gTGlzdFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiOS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTEpXG4iICsgCgkJCSIJdm9pZCBtNigpIHsgTGlzdCBjID0gbnVsbDsgTGlzdCBsID0gKENvbGxlY3Rpb248Pz4pYzsgfSAvLyB0eXBlIG1pc21hdGNoXG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVW5uZWNlc3NhcnkgY2FzdCBmcm9tIExpc3QgdG8gQ29sbGVjdGlvbjw/PlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQoJLy8gY29udmVyc2lvbiBmcm9tIHJhdyB0byBYPD8+IGlzIHNhZmUgKG5vIHVuc2FmZSB3YXJuaW5nKQoJcHVibGljIHZvaWQgdGVzdDIyOCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiIGltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSIgcHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAJTGlzdDw/PiBsaXN0ID0gbmV3IEFycmF5TGlzdCgpO1xuIiArIAoJCQkJIiB9XG4iLAoJCQl9LAoJCQkiIik7Cgl9CgkvLyBjYW4gcmVzb2x2ZSBtZW1iZXIgdGhyb3VnaCB0eXBlIHZhcmlhYmxlCglwdWJsaWMgdm9pZCB0ZXN0MjI5KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSIgcHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBYQz4ge1xuIiArIAoJCQkJIiAJVC5NWEMgZjtcbiIgKyAKCQkJCSIgCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIgfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIiBjbGFzcyBYQyB7XG4iICsgCgkJCQkiIAljbGFzcyBNWEMge31cbiIgKyAKCQkJCSIgfVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTM3NSAtIGVxdWl2YWxlbmNlIG9mIHdpbGRjYXJkcwoJcHVibGljIHZvaWQgdGVzdDIzMCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXZvaWQgZm9vKCkge1xuIiArIAoJCQkJIgkJTGlzdDw/IGV4dGVuZHMgSW50ZWdlcj4gbGk9IG51bGw7XG4iICsgCgkJCQkiCQlMaXN0PD8gZXh0ZW5kcyBOdW1iZXI+IGxuPSBudWxsO1xuIiArIAoJCQkJIgkJbG4gPSBsaTtcbiIgKyAKCQkJCSIJCWxpPSBsbjtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIglsaT0gbG47XG4iICsgCgkJCSIJICAgIF5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIExpc3Q8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgTnVtYmVyPiB0byBMaXN0PD8gZXh0ZW5kcyBJbnRlZ2VyPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjkxNzAgLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3QyMzEoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPntcbiIgKyAKCQkJCSIJIE9iamVjdCB4MT0gbmV3IFg8Pz5bMF07CSBcbiIgKyAKCQkJCSIJIE9iamVjdCB4Mj0gbmV3IFg8PyBzdXBlciBTdHJpbmc+WzBdOwkgXG4iICsgCgkJCQkiCSBPYmplY3QgeDM9IG5ldyBYPD8gZXh0ZW5kcyBUaHJlYWQ+WzBdOwkgXG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCU9iamVjdCB4Mj0gbmV3IFg8PyBzdXBlciBTdHJpbmc+WzBdOwkgXG4iICsgCgkJCSIJICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIkNhbm5vdCBjcmVhdGUgYSBnZW5lcmljIGFycmF5IG9mIFg8PyBzdXBlciBTdHJpbmc+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkJIglPYmplY3QgeDM9IG5ldyBYPD8gZXh0ZW5kcyBUaHJlYWQ+WzBdOwkgXG4iICsgCgkJCSIJICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiQ2Fubm90IGNyZWF0ZSBhIGdlbmVyaWMgYXJyYXkgb2YgWDw/IGV4dGVuZHMgVGhyZWFkPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5NTQyIC0gZ2VuZXJpYyBjYXN0IHNob3VsZCBiZSBsZXNzIHN0cmljdAoJcHVibGljIHZvaWQgdGVzdDIzMigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAJc3RhdGljIGNsYXNzIENvbnRhaW5lcjxUPntcbiIgKyAKCQkJCSIJICAgIHByaXZhdGUgVCB2YWw7XG4iICsgCgkJCQkiCSAgICBwdWJsaWMgVCBnZXRWYWwoKSB7XG4iICsgCgkJCQkiCSAgICAgICAgcmV0dXJuIHZhbDtcbiIgKyAKCQkJCSIJICAgIH1cbiIgKyAKCQkJCSIJICAgIHB1YmxpYyB2b2lkIHNldFZhbChUIHZhbCkge1xuIiArIAoJCQkJIgkgICAgICAgIHRoaXMudmFsID0gdmFsO1xuIiArIAoJCQkJIgkgICAgfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBiYWRNZXRob2QoQ29udGFpbmVyPD8+IHBhcmFtKXtcbiIgKyAKCQkJCSIJICAgIENvbnRhaW5lciB4PXBhcmFtO1xuIiArIAoJCQkJIgkgICAgeC5zZXRWYWwoXCJCQURcIik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkgICAgQ29udGFpbmVyPEludGVnZXI+IGNvbnQ9bmV3IENvbnRhaW5lcjxJbnRlZ2VyPigpO1xuIiArIAoJCQkJIgkgICAgY29udC5zZXRWYWwobmV3IEludGVnZXIoMCkpO1xuIiArIAoJCQkJIgkgICAgYmFkTWV0aG9kKGNvbnQpO1xuIiArIAoJCQkJIgkgICAgT2JqZWN0IHNvbWVWYWwgPSBjb250LmdldFZhbCgpOyAvLyBubyBjYXN0IFxuIiArIAoJCQkJIgkgICAgU3lzdGVtLm91dC5wcmludGxuKGNvbnQuZ2V0VmFsKCkpOyAvLyBubyBjYXN0IFxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIkJBRCIpOwoJfQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTU0MiAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDIzMygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAJc3RhdGljIGNsYXNzIENvbnRhaW5lcjxUPntcbiIgKyAKCQkJCSIJICAgIHByaXZhdGUgVCB2YWw7XG4iICsgCgkJCQkiCSAgICBwdWJsaWMgVCBnZXRWYWwoKSB7XG4iICsgCgkJCQkiCSAgICAgICAgcmV0dXJuIHZhbDtcbiIgKyAKCQkJCSIJICAgIH1cbiIgKyAKCQkJCSIJICAgIHB1YmxpYyB2b2lkIHNldFZhbChUIHZhbCkge1xuIiArIAoJCQkJIgkgICAgICAgIHRoaXMudmFsID0gdmFsO1xuIiArIAoJCQkJIgkgICAgfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBiYWRNZXRob2QoQ29udGFpbmVyPD8+IHBhcmFtKXtcbiIgKyAKCQkJCSIJICAgIENvbnRhaW5lciB4PXBhcmFtO1xuIiArIAoJCQkJIgkgICAgeC5zZXRWYWwobmV3IExvbmcoMCkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJICAgIENvbnRhaW5lcjxJbnRlZ2VyPiBjb250PW5ldyBDb250YWluZXI8SW50ZWdlcj4oKTtcbiIgKyAKCQkJCSIJICAgIGNvbnQuc2V0VmFsKG5ldyBJbnRlZ2VyKDApKTtcbiIgKyAKCQkJCSIJICAgIGJhZE1ldGhvZChjb250KTtcbiIgKyAKCQkJCSIJICAgIE51bWJlciBzb21lVmFsID0gY29udC5nZXRWYWwoKTsvLyBvbmx5IGNhc3QgdG8gTnVtYmVyIFxuIiArIAoJCQkJIgkgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTsgXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5NTQyIC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0MjM0KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiIAlzdGF0aWMgY2xhc3MgQ29udGFpbmVyPFQ+e1xuIiArIAoJCQkJIgkgICAgcHVibGljIFQgdmFsO1xuIiArIAoJCQkJIgkgICAgcHVibGljIFQgZ2V0VmFsKCkge1xuIiArIAoJCQkJIgkgICAgICAgIHJldHVybiB2YWw7XG4iICsgCgkJCQkiCSAgICB9XG4iICsgCgkJCQkiCSAgICBwdWJsaWMgdm9pZCBzZXRWYWwoVCB2YWwpIHtcbiIgKyAKCQkJCSIJICAgICAgICB0aGlzLnZhbCA9IHZhbDtcbiIgKyAKCQkJCSIJICAgIH1cbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgYmFkTWV0aG9kKENvbnRhaW5lcjw/PiBwYXJhbSl7XG4iICsgCgkJCQkiCSAgICBDb250YWluZXIgeD1wYXJhbTtcbiIgKyAKCQkJCSIJICAgIHguc2V0VmFsKFwiQkFEXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJICAgIENvbnRhaW5lcjxJbnRlZ2VyPiBjb250PW5ldyBDb250YWluZXI8SW50ZWdlcj4oKTtcbiIgKyAKCQkJCSIJICAgIGNvbnQuc2V0VmFsKG5ldyBJbnRlZ2VyKDApKTtcbiIgKyAKCQkJCSIJICAgIGJhZE1ldGhvZChjb250KTtcbiIgKyAKCQkJCSIJICAgIE9iamVjdCBzb21lVmFsID0gY29udC52YWw7IC8vIG5vIGNhc3QgXG4iICsgCgkJCQkiCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oY29udC52YWwpOyAvLyBubyBjYXN0IFxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIkJBRCIpOwoJfQkJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDIgLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3QyMzUoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgCXN0YXRpYyBjbGFzcyBDb250YWluZXI8VD57XG4iICsgCgkJCQkiCSAgICBwdWJsaWMgVCB2YWw7XG4iICsgCgkJCQkiCSAgICBwdWJsaWMgVCBnZXRWYWwoKSB7XG4iICsgCgkJCQkiCSAgICAgICAgcmV0dXJuIHZhbDtcbiIgKyAKCQkJCSIJICAgIH1cbiIgKyAKCQkJCSIJICAgIHB1YmxpYyB2b2lkIHNldFZhbChUIHZhbCkge1xuIiArIAoJCQkJIgkgICAgICAgIHRoaXMudmFsID0gdmFsO1xuIiArIAoJCQkJIgkgICAgfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBiYWRNZXRob2QoQ29udGFpbmVyPD8+IHBhcmFtKXtcbiIgKyAKCQkJCSIJICAgIENvbnRhaW5lciB4PXBhcmFtO1xuIiArIAoJCQkJIgkgICAgeC5zZXRWYWwobmV3IExvbmcoMCkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJICAgIENvbnRhaW5lcjxJbnRlZ2VyPiBjb250PW5ldyBDb250YWluZXI8SW50ZWdlcj4oKTtcbiIgKyAKCQkJCSIJICAgIGNvbnQuc2V0VmFsKG5ldyBJbnRlZ2VyKDApKTtcbiIgKyAKCQkJCSIJICAgIGJhZE1ldGhvZChjb250KTtcbiIgKyAKCQkJCSIJICAgIE51bWJlciBzb21lVmFsID0gY29udC52YWw7Ly8gb25seSBjYXN0IHRvIE51bWJlciBcbiIgKyAKCQkJCSIJICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7IFxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5NTQyIC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0MjM2KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiIAlzdGF0aWMgY2xhc3MgQ29udGFpbmVyPFQ+e1xuIiArIAoJCQkJIgkgICAgcHVibGljIFQgdmFsO1xuIiArIAoJCQkJIgkgICAgcHVibGljIFQgZ2V0VmFsKCkge1xuIiArIAoJCQkJIgkgICAgICAgIHJldHVybiB2YWw7XG4iICsgCgkJCQkiCSAgICB9XG4iICsgCgkJCQkiCSAgICBwdWJsaWMgdm9pZCBzZXRWYWwoVCB2YWwpIHtcbiIgKyAKCQkJCSIJICAgICAgICB0aGlzLnZhbCA9IHZhbDtcbiIgKyAKCQkJCSIJICAgIH1cbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgYmFkTWV0aG9kKENvbnRhaW5lcjw/PiBwYXJhbSl7XG4iICsgCgkJCQkiCSAgICBDb250YWluZXIgeD1wYXJhbTtcbiIgKyAKCQkJCSIJICAgIHguc2V0VmFsKFwiQkFEXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJICAgIENvbnRhaW5lcjxJbnRlZ2VyPiBjb250PW5ldyBDb250YWluZXI8SW50ZWdlcj4oKTtcbiIgKyAKCQkJCSIJICAgIGNvbnQuc2V0VmFsKG5ldyBJbnRlZ2VyKDApKTtcbiIgKyAKCQkJCSIJICAgIGJhZE1ldGhvZChjb250KTtcbiIgKyAKCQkJCSIJICAgIE9iamVjdCBzb21lVmFsID0gKGNvbnQpLnZhbDsgLy8gbm8gY2FzdCBcbiIgKyAKCQkJCSIJICAgIFN5c3RlbS5vdXQucHJpbnRsbigoY29udCkudmFsKTsgLy8gbm8gY2FzdCBcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJCQUQiKTsKCX0JCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5NTQyIC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0MjM3KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiIAlzdGF0aWMgY2xhc3MgQ29udGFpbmVyPFQ+e1xuIiArIAoJCQkJIgkgICAgcHVibGljIFQgdmFsO1xuIiArIAoJCQkJIgkgICAgcHVibGljIFQgZ2V0VmFsKCkge1xuIiArIAoJCQkJIgkgICAgICAgIHJldHVybiB2YWw7XG4iICsgCgkJCQkiCSAgICB9XG4iICsgCgkJCQkiCSAgICBwdWJsaWMgdm9pZCBzZXRWYWwoVCB2YWwpIHtcbiIgKyAKCQkJCSIJICAgICAgICB0aGlzLnZhbCA9IHZhbDtcbiIgKyAKCQkJCSIJICAgIH1cbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgYmFkTWV0aG9kKENvbnRhaW5lcjw/PiBwYXJhbSl7XG4iICsgCgkJCQkiCSAgICBDb250YWluZXIgeD1wYXJhbTtcbiIgKyAKCQkJCSIJICAgIHguc2V0VmFsKG5ldyBMb25nKDApKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCSAgICBDb250YWluZXI8SW50ZWdlcj4gY29udD1uZXcgQ29udGFpbmVyPEludGVnZXI+KCk7XG4iICsgCgkJCQkiCSAgICBjb250LnNldFZhbChuZXcgSW50ZWdlcigwKSk7XG4iICsgCgkJCQkiCSAgICBiYWRNZXRob2QoY29udCk7XG4iICsgCgkJCQkiCSAgICBOdW1iZXIgc29tZVZhbCA9IChjb250KS52YWw7Ly8gb25seSBjYXN0IHRvIE51bWJlciBcbiIgKyAKCQkJCSIJICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7IFxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTU0MiAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDIzOCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAJc3RhdGljIGNsYXNzIENvbnRhaW5lcjxUPntcbiIgKyAKCQkJCSIJICAgIHB1YmxpYyBUIHZhbDtcbiIgKyAKCQkJCSIJCUNvbnRhaW5lcjxUPiBuZXh0O1xuIiArCgkJCQkiCSAgICBwdWJsaWMgVCBnZXRWYWwoKSB7XG4iICsgCgkJCQkiCSAgICAgICAgcmV0dXJuIHZhbDtcbiIgKyAKCQkJCSIJICAgIH1cbiIgKyAKCQkJCSIJICAgIHB1YmxpYyB2b2lkIHNldFZhbChUIHZhbCkge1xuIiArIAoJCQkJIgkgICAgICAgIHRoaXMudmFsID0gdmFsO1xuIiArIAoJCQkJIgkgICAgfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBiYWRNZXRob2QoQ29udGFpbmVyPD8+IHBhcmFtKXtcbiIgKyAKCQkJCSIJICAgIENvbnRhaW5lciB4PXBhcmFtO1xuIiArIAoJCQkJIgkgICAgeC5zZXRWYWwoXCJCQURcIik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkgICAgQ29udGFpbmVyPEludGVnZXI+IGNvbnQgPSBuZXcgQ29udGFpbmVyPEludGVnZXI+KCk7XG4iICsgCgkJCQkiCQljb250Lm5leHQgPSBuZXcgQ29udGFpbmVyPEludGVnZXI+KCk7XG4iICsgCgkJCQkiCSAgICBjb250Lm5leHQuc2V0VmFsKG5ldyBJbnRlZ2VyKDApKTtcbiIgKyAKCQkJCSIJICAgIGJhZE1ldGhvZChjb250Lm5leHQpO1xuIiArIAoJCQkJIgkgICAgT2JqZWN0IHNvbWVWYWwgPSBjb250Lm5leHQudmFsOyAvLyBubyBjYXN0IFxuIiArIAoJCQkJIgkgICAgU3lzdGVtLm91dC5wcmludGxuKGNvbnQubmV4dC52YWwpOyAvLyBubyBjYXN0IFxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIkJBRCIpOwoJfQkJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDIgLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3QyMzkoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgCXN0YXRpYyBjbGFzcyBDb250YWluZXI8VD57XG4iICsgCgkJCQkiCSAgICBwdWJsaWMgVCB2YWw7XG4iICsgCgkJCQkiCQlDb250YWluZXI8VD4gbmV4dDtcbiIgKwoJCQkJIgkgICAgcHVibGljIFQgZ2V0VmFsKCkge1xuIiArIAoJCQkJIgkgICAgICAgIHJldHVybiB2YWw7XG4iICsgCgkJCQkiCSAgICB9XG4iICsgCgkJCQkiCSAgICBwdWJsaWMgdm9pZCBzZXRWYWwoVCB2YWwpIHtcbiIgKyAKCQkJCSIJICAgICAgICB0aGlzLnZhbCA9IHZhbDtcbiIgKyAKCQkJCSIJICAgIH1cbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgYmFkTWV0aG9kKENvbnRhaW5lcjw/PiBwYXJhbSl7XG4iICsgCgkJCQkiCSAgICBDb250YWluZXIgeD1wYXJhbTtcbiIgKyAKCQkJCSIJICAgIHguc2V0VmFsKG5ldyBMb25nKDApKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCSAgICBDb250YWluZXI8SW50ZWdlcj4gY29udCA9IG5ldyBDb250YWluZXI8SW50ZWdlcj4oKTtcbiIgKyAKCQkJCSIJCWNvbnQubmV4dCA9IG5ldyBDb250YWluZXI8SW50ZWdlcj4oKTtcbiIgKyAKCQkJCSIJICAgIGNvbnQubmV4dC5zZXRWYWwobmV3IEludGVnZXIoMCkpO1xuIiArIAoJCQkJIgkgICAgYmFkTWV0aG9kKGNvbnQubmV4dCk7XG4iICsgCgkJCQkiCSAgICBOdW1iZXIgc29tZVZhbCA9IGNvbnQubmV4dC52YWw7Ly8gb25seSBjYXN0IHRvIE51bWJlciBcbiIgKyAKCQkJCSIJICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7IFxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njk3MTMgTlBFIGR1ZSB0byBsZW5ndGggcHNldWRvIGZpZWxkCglwdWJsaWMgdm9pZCB0ZXN0MjQwKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIgICAgU3RyaW5nW10gZWxlbWVudHMgPSBudWxsO1xuIiArIAoJCQkiCVxuIiArIAoJCQkiICAgIHB1YmxpYyBYKCkge1xuIiArIAoJCQkiICAgICAgICBTdHJpbmcgcyA9IFwiYSwgYiwgYywgZFwiO1xuIiArIAoJCQkiICAgICAgICBlbGVtZW50cyA9IHMuc3BsaXQoXCIsXCIpO1xuIiArIAoJCQkiICAgICAgICBpZihlbGVtZW50cy5sZW5ndGggPSAzKSB7XG4iICsgCgkJCSIgICAgICAgIH1cbiIgKyAKCQkJIiAgICB9XG4iICsgCgkJCSJ9XG4iCQoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJCSIJaWYoZWxlbWVudHMubGVuZ3RoID0gMykge1xuIiArIAoJCQkiCSAgIF5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gaW50IHRvIGJvb2xlYW5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTc3NiAtIG1pc3NpbmcgY2hlY2tjYXN0IG9uIGNhc3Qgb3BlcmF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0MjQxKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7XG4iICsgCgkJCQkiaW1wb3J0IGphdmEudXRpbC5NYXA7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzcz4gY2xhc3NlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24ge1xuIiArIAoJCQkJIiAgICAJY2xhc3Nlcy5wdXQoXCJ0ZXN0XCIsIFguY2xhc3MpO1xuIiArIAoJCQkJIiAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIE9iamVjdD4gY2xhenogPSAoQ2xhc3M8PyBleHRlbmRzIE9iamVjdD4pIGNsYXNzZXMuZ2V0KFwidGVzdFwiKTtcbiIgKyAKCQkJCSIgICAgICAgIE9iamVjdCBvID0gY2xhenoubmV3SW5zdGFuY2UoKTtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkJCgkvLyA2OTc3NiAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDI0MigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDtcbiIgKyAKCQkJCSJpbXBvcnQgamF2YS51dGlsLk1hcDtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzPiBjbGFzc2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4oKTtcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7XG4iICsgCgkJCQkiICAgIAljbGFzc2VzLnB1dChcInRlc3RcIiwgWC5jbGFzcyk7XG4iICsgCgkJCQkiICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgT2JqZWN0PiBjbGF6eiA9IChDbGFzczw/IGV4dGVuZHMgT2JqZWN0PikgY2xhc3Nlcy5nZXQoXCJ0ZXN0XCIpO1xuIiArIAoJCQkJIiAgICAgICAgT2JqZWN0IG8gPSBjbGF6ei5uZXdJbnN0YW5jZSgpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJCSIJZmluYWwgQ2xhc3M8PyBleHRlbmRzIE9iamVjdD4gY2xhenogPSAoQ2xhc3M8PyBleHRlbmRzIE9iamVjdD4pIGNsYXNzZXMuZ2V0KFwidGVzdFwiKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVW5uZWNlc3NhcnkgY2FzdCBmcm9tIENsYXNzIHRvIENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDI0MygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArCgkJCQkiICAgIHB1YmxpYyBYIGZvbygpIHtcbiIgKwoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiRGlkIE5PVCBhZGQgYnJpZGdlIG1ldGhvZFwiKTtcbiIgKwoJCQkJIiAgICAgICAgcmV0dXJuIHRoaXM7XG4iICsKCQkJCSIgICAgfVxuIiArCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24ge1xuIiArCgkJCQkiICAgICAgICBYIHggPSBuZXcgQSgpO1xuIiArCgkJCQkiICAgICAgICB4LmZvbygpO1xuIiArCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50KFwiICsgXCIpO1xuIiArCgkJCQkiICAgICAgICBJIGkgPSBuZXcgQSgpO1xuIiArCgkJCQkiICAgICAgICBpLmZvbygpO1xuIiArCgkJCQkiICAgIH1cbiIgKwoJCQkJIn1cbiIgKwoJCQkJImludGVyZmFjZSBJIHtcbiIgKwoJCQkJIiAgICBwdWJsaWMgSSBmb28oKTtcbiIgKwoJCQkJIn1cbiIgKwoJCQkJImNsYXNzIEEgZXh0ZW5kcyBYIGltcGxlbWVudHMgSSB7XG4iICsKCQkJCSIgICAgcHVibGljIEEgZm9vKCkge1xuIiArCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50KFwiQWRkZWQgYnJpZGdlIG1ldGhvZFwiKTtcbiIgKwoJCQkJIiAgICAgICAgcmV0dXJuIHRoaXM7XG4iICsKCQkJCSIgICAgfVxuIiArCgkJCQkifVxuIgoJCQl9LAoJCQkiQWRkZWQgYnJpZGdlIG1ldGhvZCArIEFkZGVkIGJyaWRnZSBtZXRob2QiKTsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwoJCQkJIiAgICBwdWJsaWMgWCBmb28oKSB7IHJldHVybiB0aGlzOyB9XG4iICsKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7XG4iICsKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsKCQkJCSIgICAgfVxuIiArCgkJCQkifVxuIiwKCQkJCSJTdWJUeXBlcy5qYXZhIiwKCQkJCSJjbGFzcyBBIGV4dGVuZHMgWCB7XG4iICsKCQkJCSIgICAgcHVibGljIEEgZm9vKCkgeyByZXR1cm4gdGhpczsgfVxuIiArCgkJCQkifVxuIiArCgkJCQkiY2xhc3MgQiBleHRlbmRzIFgge1xuIiArCgkJCQkiICAgIHB1YmxpYyBYIGZvbygpIHsgcmV0dXJuIG5ldyBYKCk7IH1cbiIgKwoJCQkJIiAgICBwdWJsaWMgQiBmb28oKSB7IHJldHVybiB0aGlzOyB9XG4iICsKCQkJCSJ9XG4iICsKCQkJCSJjbGFzcyBDIGV4dGVuZHMgQSB7XG4iICsKCQkJCSIgICAgcHVibGljIFggZm9vKCkgeyByZXR1cm4gbmV3IFgoKTsgfVxuIiArCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBTdWJUeXBlcy5qYXZhIChhdCBsaW5lIDIpXG4iICsgCgkJCSIJcHVibGljIEEgZm9vKCkgeyByZXR1cm4gdGhpczsgfVxuIiArIAoJCQkiCSAgICAgICAgIF5eXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGZvbygpIG9mIHR5cGUgQSBzaG91bGQgYmUgdGFnZ2VkIHdpdGggQE92ZXJyaWRlIHNpbmNlIGl0IGFjdHVhbGx5IG92ZXJyaWRlcyBhIHN1cGVyY2xhc3MgbWV0aG9kXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBTdWJUeXBlcy5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJCSIJcHVibGljIFggZm9vKCkgeyByZXR1cm4gbmV3IFgoKTsgfVxuIiArIAoJCQkiCSAgICAgICAgIF5eXl5eXG4iICsgCgkJCSJEdXBsaWNhdGUgbWV0aG9kIGZvbygpIGluIHR5cGUgQlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gRVJST1IgaW4gU3ViVHlwZXMuamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCQkiCXB1YmxpYyBCIGZvbygpIHsgcmV0dXJuIHRoaXM7IH1cbiIgKyAKCQkJIgkgICAgICAgICBeXl5eXlxuIiArIAoJCQkiRHVwbGljYXRlIG1ldGhvZCBmb28oKSBpbiB0eXBlIEJcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjQuIEVSUk9SIGluIFN1YlR5cGVzLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkJIglwdWJsaWMgWCBmb28oKSB7IHJldHVybiBuZXcgWCgpOyB9XG4iICsgCgkJCSIJICAgICAgICAgXl5eXl5cbiIgKyAKCQkJIlRoZSByZXR1cm4gdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCBBLmZvbygpXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vIGdlbmVyaWMgbWV0aG9kIG9mIHJhdyB0eXBlCglwdWJsaWMgdm9pZCB0ZXN0MjQ0KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQ+IHsgXG4iICsgCgkJCQkiCTxHPiBUIGZvbyhHIGcpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBudWxsO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlYIHJ4ID0gbmV3IFgoKTtcbiIgKyAKCQkJCSIJCXJ4LmZvbyhcImhlbGxvXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIglyeC5mb28oXCJoZWxsb1wiKTtcbiIgKyAKCQkJIgleXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgbWV0aG9kIGZvbyhPYmplY3QpIGJlbG9uZ3MgdG8gdGhlIHJhdyB0eXBlIFguIFJlZmVyZW5jZXMgdG8gZ2VuZXJpYyB0eXBlIFg8VD4gc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy8gZ2VuZXJpYyBtZXRob2Qgb2YgcmF3IHR5cGUKCXB1YmxpYyB2b2lkIHRlc3QyNDUoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VD4geyBcbiIgKyAKCQkJCSIJPEc+IFQgZm9vKEcgZykge1xuIiArIAoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCVggcnggPSBuZXcgWCgpO1xuIiArIAoJCQkJIgkJcnguPFN0cmluZz5mb28oXCJoZWxsb1wiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkiCXJ4LjxTdHJpbmc+Zm9vKFwiaGVsbG9cIik7XG4iICsgCgkJIgkgICAgICAgICAgIF5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGZvbyhPYmplY3QpIG9mIHJhdyB0eXBlIFggaXMgbm8gbG9uZ2VyIGdlbmVyaWM7IGl0IGNhbm5vdCBiZSBwYXJhbWV0ZXJpemVkIHdpdGggYXJndW1lbnRzIDxTdHJpbmc+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjkzMjAgcGFyYW1ldGVyaXplZCB0eXBlIGNvbXBhdGliaWxpdHkKCXB1YmxpYyB2b2lkIHRlc3QyNDYoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7IFxuIiArIAoJCQkJIiAgICBjbGFzcyBNWDxFPiB7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgdm9pZCBmb28oKSB7XG4iICsgCgkJCQkiICAgICAgTVg8Q2xhc3M8PyBleHRlbmRzIE9iamVjdD4+IG14MiA9IG5ldyBNWDxDbGFzcz4oKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkiCU1YPENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+PiBteDIgPSBuZXcgTVg8Q2xhc3M+KCk7XG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXG4iICsgCgkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gWC5NWDxDbGFzcz4gdG8gWC5NWDxDbGFzczw/IGV4dGVuZHMgT2JqZWN0Pj5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTMyMCB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3QyNDcoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7IFxuIiArIAoJCQkJIiAgICB2b2lkIGZvbygpIHtcbiIgKyAKCQkJCSIgICAgICBNWDxDbGFzczw/IGV4dGVuZHMgT2JqZWN0Pj4gbXgyID0gbmV3IE1YPENsYXNzPigpOyAvLyB3cm9uZ1xuIiArIAoJCQkJIiAgICAgIE1YPENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+PiBteDMgPSBuZXcgTVg8Q2xhc3M8PyBleHRlbmRzIFN0cmluZz4+KCk7IC8vIHdyb25nXG4iICsgCgkJCQkiICAgICAgTVg8Q2xhc3M8PyBleHRlbmRzIE9iamVjdD4+IG14NCA9IG5ldyBNWDxDbGFzczxTdHJpbmc+PigpOyAvLyB3cm9uZ1xuIiArIAoJCQkJIiAgICAgIE1YPD8gZXh0ZW5kcyBDbGFzcz4gbXg1ID0gbmV3IE1YPENsYXNzPigpOyAvLyBva1xuIiArIAoJCQkJIiAgICAgIE1YPD8gc3VwZXIgQ2xhc3M+IG14NiA9IG5ldyBNWDxDbGFzcz4oKTsgLy8gb2tcbiIgKyAKCQkJCSIgICAgICBNWDxDbGFzczw/IGV4dGVuZHMgQ2xhc3M+PiBteDcgPSBuZXcgTVg8Q2xhc3M8Q2xhc3M+PigpOyAvLyB3cm9uZ1xuIiArIAoJCQkJIiAgICAgIE1YPE1YPD8gZXh0ZW5kcyBDbGFzcz4+IG14OCA9IG5ldyBNWDxNWDxDbGFzcz4+KCk7IC8vIHdyb25nXG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgTVg8RT4ge1xuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCU1YPENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+PiBteDIgPSBuZXcgTVg8Q2xhc3M+KCk7IC8vIHdyb25nXG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBNWDxDbGFzcz4gdG8gTVg8Q2xhc3M8PyBleHRlbmRzIE9iamVjdD4+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkJIglNWDxDbGFzczw/IGV4dGVuZHMgT2JqZWN0Pj4gbXgzID0gbmV3IE1YPENsYXNzPD8gZXh0ZW5kcyBTdHJpbmc+PigpOyAvLyB3cm9uZ1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gTVg8Q2xhc3M8PyBleHRlbmRzIFN0cmluZz4+IHRvIE1YPENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+PlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJCSIJTVg8Q2xhc3M8PyBleHRlbmRzIE9iamVjdD4+IG14NCA9IG5ldyBNWDxDbGFzczxTdHJpbmc+PigpOyAvLyB3cm9uZ1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gTVg8Q2xhc3M8U3RyaW5nPj4gdG8gTVg8Q2xhc3M8PyBleHRlbmRzIE9iamVjdD4+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI0LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIglNWDxDbGFzczw/IGV4dGVuZHMgQ2xhc3M+PiBteDcgPSBuZXcgTVg8Q2xhc3M8Q2xhc3M+PigpOyAvLyB3cm9uZ1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBNWDxDbGFzczxDbGFzcz4+IHRvIE1YPENsYXNzPD8gZXh0ZW5kcyBDbGFzcz4+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI1LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkJIglNWDxNWDw/IGV4dGVuZHMgQ2xhc3M+PiBteDggPSBuZXcgTVg8TVg8Q2xhc3M+PigpOyAvLyB3cm9uZ1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgIF5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBNWDxNWDxDbGFzcz4+IHRvIE1YPE1YPD8gZXh0ZW5kcyBDbGFzcz4+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDI0NyBjaGVjayB0eXBlIHZhcmlhYmxlIGlzIGJvdW5kIGR1cmluZyBzdXBlciB0eXBlIHJlc29sdXRpb24KCXB1YmxpYyB2b2lkIHRlc3QyNDgoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFg8VD4gZXh0ZW5kcyBWZWN0b3I8PyBzdXBlciBYPGludFtdPj57fVxuIgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKCQkJIglwdWJsaWMgY2xhc3MgWDxUPiBleHRlbmRzIFZlY3Rvcjw/IHN1cGVyIFg8aW50W10+Pnt9XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5cbiIgKyAKCQkJIlRoZSB0eXBlIFggY2Fubm90IGV4dGVuZCBvciBpbXBsZW1lbnQgVmVjdG9yPD8gc3VwZXIgWDxpbnRbXT4+LiBBIHN1cGVydHlwZSBtYXkgbm90IHNwZWNpZnkgYW55IHdpbGRjYXJkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDI0NyB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3QyNDkoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFg8VD4gaW1wbGVtZW50cyBMaXN0PD8gc3VwZXIgWDxpbnRbXT4+e31cbiIJCQkKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYPFQ+IGltcGxlbWVudHMgTGlzdDw/IHN1cGVyIFg8aW50W10+Pnt9XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXG4iICsgCgkJCSJUaGUgdHlwZSBYIGNhbm5vdCBleHRlbmQgb3IgaW1wbGVtZW50IExpc3Q8PyBzdXBlciBYPGludFtdPj4uIEEgc3VwZXJ0eXBlIG1heSBub3Qgc3BlY2lmeSBhbnkgd2lsZGNhcmRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwMjk1IENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+IGlzIGNvbXBhdGlibGUgd2l0aCBDbGFzczw/PgoJcHVibGljIHZvaWQgdGVzdDI1MCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICB2b2lkIHRlc3QoT2JqZWN0IG8pIHtcbiIgKyAKCQkJCSIgICAgICAgIFguY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvLmdldENsYXNzKCkpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiIik7Cgl9CQkJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njk4MDAgJz8gZXh0ZW5kcyBPYmplY3QnIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggQQoJcHVibGljIHZvaWQgdGVzdDI1MSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHsgXG4iICsgCgkJCQkiICAgIHN0YXRpYyBjbGFzcyBBIHtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBBIHRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHtcbiIgKyAKCQkJCSIgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+IGNsYXp6ID0gbnVsbDtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiBjbGF6ei5uZXdJbnN0YW5jZSgpOyAvLyA/IGV4dGVuZHMgT2JqZWN0XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iCQoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJcmV0dXJuIGNsYXp6Lm5ld0luc3RhbmNlKCk7IC8vID8gZXh0ZW5kcyBPYmplY3RcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBjYXB0dXJlLW9mID8gZXh0ZW5kcyBPYmplY3QgdG8gWC5BXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTc5OSBOUEUgaW4gZm9yZWFjaCBjaGVja2Nhc3QKCXB1YmxpYyB2b2lkIHRlc3QyNTIoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlTZXQ8WD4gY2hhbm5lbCA9IGNoYW5uZWxzLmdldCgwKTtcbiIgKyAKCQkJCSIJICAgIGZvciAoSXRlcmF0b3I8WD4gaXRlciA9IGNoYW5uZWwuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7XG4iICsgCgkJCQkiCSAgICAgICAgU2V0PFg+IGVsZW1lbnQ7XG4iICsgCgkJCQkiCSAgICAgICAgZWxlbWVudCA9IChTZXQ8WD4pIGl0ZXIubmV4dCgpO1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJU2V0PFg+IGNoYW5uZWwgPSBjaGFubmVscy5nZXQoMCk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICBeXl5eXl5eXlxuIiArIAoJCQkiY2hhbm5lbHMgY2Fubm90IGJlIHJlc29sdmVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDI0MyB1bnNhZmUgY2FzdCB3aGVuIHdpbGRjYXJkcwoJcHVibGljIHZvaWQgdGVzdDI1MygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIExpc3Q8SW50ZWdlcj4gbGk9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTtcbiIgKyAKCQkJCSIgICAgICAgIExpc3Q8PyBleHRlbmRzIE51bWJlcj4gbHM9IGxpOyAgICAgICBcbiIgKyAKCQkJCSIgICAgICAgIExpc3Q8TnVtYmVyPiB4Mj0gKExpc3Q8TnVtYmVyPilsczsvL3Vuc2FmZVxuIiArIAoJCQkJIiAgICAgICAgeDIuYWRkKG5ldyBGbG9hdCgxLjApKTtcbiIgKyAKCQkJCSIgICAgICAgIFxuIiArIAoJCQkJIiAgICAgICAgSW50ZWdlciBpPSBsaS5nZXQoMCk7Ly9DbGFzc0Nhc3RFeGNlcHRpb24hXG4iICsgCgkJCQkiICAgICAgICBcbiIgKyAKCQkJCSIgICAgICAgIExpc3Q8TnVtYmVyPiBsczIgPSAoTGlzdDw/IGV4dGVuZHMgTnVtYmVyPilscztcbiIgKyAKCQkJCSIgICAgICAgIExpc3Q8PyBleHRlbmRzIE51bWJlcj4gbHMzID0gKExpc3Q8PyBleHRlbmRzIE51bWJlcj4pIGxpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkJIglMaXN0PE51bWJlcj4geDI9IChMaXN0PE51bWJlcj4pbHM7Ly91bnNhZmVcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIExpc3Q8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgTnVtYmVyPiB0byBMaXN0PE51bWJlcj4gaXMgYWN0dWFsbHkgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZXJhc2VkIHR5cGUgTGlzdFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDExKVxuIiArIAoJCQkiCUxpc3Q8TnVtYmVyPiBsczIgPSAoTGlzdDw/IGV4dGVuZHMgTnVtYmVyPilscztcbiIgKyAKCQkJIgkgICAgICAgICAgICAgXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIExpc3Q8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgTnVtYmVyPiB0byBMaXN0PE51bWJlcj5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDExKVxuIiArIAoJCQkiCUxpc3Q8TnVtYmVyPiBsczIgPSAoTGlzdDw/IGV4dGVuZHMgTnVtYmVyPilscztcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlVubmVjZXNzYXJ5IGNhc3QgZnJvbSBMaXN0PGNhcHR1cmUtb2YgPyBleHRlbmRzIE51bWJlcj4gdG8gTGlzdDw/IGV4dGVuZHMgTnVtYmVyPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNC4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTIpXG4iICsgCgkJCSIJTGlzdDw/IGV4dGVuZHMgTnVtYmVyPiBsczMgPSAoTGlzdDw/IGV4dGVuZHMgTnVtYmVyPikgbGk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlVubmVjZXNzYXJ5IGNhc3QgZnJvbSBMaXN0PEludGVnZXI+IHRvIExpc3Q8PyBleHRlbmRzIE51bWJlcj5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwMDUzIG1pc3NpbmcgY2hlY2tjYXN0IGluIHN0cmluZyBjb25jYXRlbmF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0MjU0KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICBYIHggPSBuZXcgWCgpO1xuIiArIAoJCQkJIiAgU3lzdGVtLm91dC5wcmludChcIlNcIiArIHguYSgpICsgXCJVXCIgKyB4LmIoKS5nZXQoMCkgKyBcIkNcIiArIHguYSgpICsgXCJDXCIpO1xuIiArIAoJCQkJIiAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmdCdWlsZGVyKFwiRVwiKS5hcHBlbmQoeC5hKCkpLmFwcGVuZChcIlNcIikuYXBwZW5kKHguYigpLmdldCgwKSkuYXBwZW5kKFwiU1wiKS5hcHBlbmQoeC5hKCkpLmFwcGVuZChcIiFcIikpOyAgXG4iICsgCgkJCQkiIH1cbiIgKyAKCQkJCSIgU3RyaW5nIGEoKSB7IHJldHVybiBcIlwiOyB9XG4iICsgCgkJCQkiIExpc3Q8U3RyaW5nPiBiKCkgeyBcbiIgKyAKCQkJCSIgIEFycmF5TGlzdDxTdHJpbmc+IGFscyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigxKTtcbiIgKyAKCQkJCSIgIGFscy5hZGQoYSgpKTtcbiIgKyAKCQkJCSIgIHJldHVybiBhbHM7XG4iICsgCgkJCQkiIH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSJTVUNDRVNTISIpOwkJCgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjkzNTEgZ2VuZXJpYyB0eXBlIGNhbm5vdCBleHRlbmQgVGhyb3dhYmxlCglwdWJsaWMgdm9pZCB0ZXN0MjU1KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VCwgVT4gZXh0ZW5kcyBUaHJvd2FibGUge1xuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFg8VCwgVT4gZXh0ZW5kcyBUaHJvd2FibGUge1xuIiArIAoJCQkiCSAgICAgICAgICAgICBeXG4iICsgCgkJCSJUaGUgc2VyaWFsaXphYmxlIGNsYXNzIFggZG9lcyBub3QgZGVjbGFyZSBhIHN0YXRpYyBmaW5hbCBzZXJpYWxWZXJzaW9uVUlEIGZpZWxkIG9mIHR5cGUgbG9uZ1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFg8VCwgVT4gZXh0ZW5kcyBUaHJvd2FibGUge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgZ2VuZXJpYyBjbGFzcyBYPFQsVT4gbWF5IG5vdCBzdWJjbGFzcyBqYXZhLmxhbmcuVGhyb3dhYmxlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsJCQoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwNjE2IC0gcmVmZXJlbmNlIHRvIGJpbmFyeSBFbnVtCglwdWJsaWMgdm9pZCB0ZXN0MjU2KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgkJRW51bTxYPiBleCA9IG51bGw7XG4iICsgCgkJCQkiCQlTdHJpbmcgcyA9IGV4Lm5hbWUoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCUVudW08WD4gZXggPSBudWxsO1xuIiArIAoJCQkiCSAgICAgXlxuIiArIAoJCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlIFggaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxFIGV4dGVuZHMgRW51bTxFPj4gb2YgdGhlIHR5cGUgRW51bTxFPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7CQkKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDYxOCAtIHJlZmVyZW5jZSB0byB2YXJpYWJsZSBhbGxvd2VkIGluIHBhcmFtZXRlcml6ZWQgc3VwZXIgdHlwZQoJcHVibGljIHZvaWQgdGVzdDI1NygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJCSIgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIE0gZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0PFQ+IHt9XG4iICsgCgkJCQkifVxuIiArCgkJCQkiY2xhc3MgWTxUPiBleHRlbmRzIFQge31cbiIgKyAKCQkJCSJjbGFzcyBaPFQ+IHtcbiIgKyAKCQkJCSIgICAgY2xhc3MgTSBleHRlbmRzIFQge31cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkJIgljbGFzcyBZPFQ+IGV4dGVuZHMgVCB7fVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICBeXG4iICsgCgkJCSJDYW5ub3QgcmVmZXIgdG8gdGhlIHR5cGUgcGFyYW1ldGVyIFQgYXMgYSBzdXBlcnR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCQkiCWNsYXNzIE0gZXh0ZW5kcyBUIHt9XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIkNhbm5vdCByZWZlciB0byB0aGUgdHlwZSBwYXJhbWV0ZXIgVCBhcyBhIHN1cGVydHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MjU4KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJhYnN0cmFjdCBjbGFzcyBYPEssVj4gaW1wbGVtZW50cyBqYXZhLnV0aWwuTWFwPEssVj4ge1xuIiArIAoJCQkJIiAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgTTxLLFY+IGltcGxlbWVudHMgRW50cnk8SyxWPiB7fVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIiIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwNzY3IC0gTlBFIGNvbXBpbGluZyBjb2RlIHdpdGggZXhwbGljaXQgY29uc3RydWN0b3IgaW52b2NhdGlvbgoJcHVibGljIHZvaWQgdGVzdDI1OSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8RT4ge1xuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJPEU+IFgoRSBlKSB7XG4iICsgCgkJCQkiCQk8RT4gdGhpcygpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIgk8RT4gWCgpIHtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIiIpOwoJfQoJcHVibGljIHZvaWQgdGVzdDI2MCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPEU+IHtcbiIgKyAKCQkJCSIJY2xhc3MgTVggPEY+IHtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBYQzxHPiBleHRlbmRzIFg8Rz4ge1xuIiArIAoJCQkJIgljbGFzcyBNWEM8SD4gZXh0ZW5kcyBNWDxIPiB7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSIiKTsKCX0JCglwdWJsaWMgdm9pZCB0ZXN0MjYxKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPEU+IHtcbiIgKyAKCQkJCSIJdm9pZCBmb28oKXtcbiIgKyAKCQkJCSIJCVg8SW50ZWdlcj4geGkgPSAoWDxJbnRlZ2VyPikgbmV3IFg8U3RyaW5nPigpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJWDxJbnRlZ2VyPiB4aSA9IChYPEludGVnZXI+KSBuZXcgWDxTdHJpbmc+KCk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIkNhbm5vdCBjYXN0IGZyb20gWDxTdHJpbmc+IHRvIFg8SW50ZWdlcj5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCglwdWJsaWMgdm9pZCB0ZXN0MjYyKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPEUsRj4ge1xuIiArIAoJCQkJIgl2b2lkIGZvbygpe1xuIiArIAoJCQkJIgkJWDxFLFN0cmluZz4geGUgPSAoWDxFLFN0cmluZz4pIG5ldyBYPFN0cmluZyxTdHJpbmc+KCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCVg8RSxTdHJpbmc+IHhlID0gKFg8RSxTdHJpbmc+KSBuZXcgWDxTdHJpbmcsU3RyaW5nPigpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNhc3QgZnJvbSBYPFN0cmluZyxTdHJpbmc+IHRvIFg8RSxTdHJpbmc+IGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIFhcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQoJcHVibGljIHZvaWQgdGVzdDI2MygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxFLEY+IHtcbiIgKyAKCQkJCSIJdm9pZCBmb28oKXtcbiIgKyAKCQkJCSIJCVhDPEUsU3RyaW5nPiB4ZSA9IChYQzxFLFN0cmluZz4pIG5ldyBYPFN0cmluZyxTdHJpbmc+KCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWEM8RyxIPiBleHRlbmRzIFg8RyxIPiB7XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkJIglYQzxFLFN0cmluZz4geGUgPSAoWEM8RSxTdHJpbmc+KSBuZXcgWDxTdHJpbmcsU3RyaW5nPigpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIFg8U3RyaW5nLFN0cmluZz4gdG8gWEM8RSxTdHJpbmc+IGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIFhDXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCXB1YmxpYyB2b2lkIHRlc3QyNjQoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8RSxGPiB7XG4iICsgCgkJCQkiCXZvaWQgZm9vKCl7XG4iICsgCgkJCQkiCQlYQzxFLFN0cmluZz4geGUgPSAoWEM8RSxTdHJpbmc+KSBuZXcgWDxTdHJpbmcsSW50ZWdlcj4oKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBYQzxHLEg+IGV4dGVuZHMgWDxHLEg+IHtcbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkJIglYQzxFLFN0cmluZz4geGUgPSAoWEM8RSxTdHJpbmc+KSBuZXcgWDxTdHJpbmcsSW50ZWdlcj4oKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiQ2Fubm90IGNhc3QgZnJvbSBYPFN0cmluZyxJbnRlZ2VyPiB0byBYQzxFLFN0cmluZz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCglwdWJsaWMgdm9pZCB0ZXN0MjY1KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPEU+IHtcbiIgKyAKCQkJCSIJPFU+IHZvaWQgZm9vKCl7XG4iICsgCgkJCQkiCQkJWEM8VT4geGN1ID0gKFhDPFU+KSBuZXcgWDxFPigpO1xuIiArIAoJCQkJIgkJCVhDPFU+IHhjdTEgPSAoWEM8Pz4pIG5ldyBYPEU+KCk7CQkJXG4iICsgCgkJCQkiCQkJWEM8Pz4geGN1MiA9IChYQzw/IGV4dGVuZHMgWD4pIG5ldyBYPEU+KCk7CQkJCQkJXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWEM8Rz4gZXh0ZW5kcyBYPEc+IHtcbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCVhDPFU+IHhjdSA9IChYQzxVPikgbmV3IFg8RT4oKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIFg8RT4gdG8gWEM8VT4gaXMgYWN0dWFsbHkgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZXJhc2VkIHR5cGUgWENcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCVhDPFU+IHhjdTEgPSAoWEM8Pz4pIG5ldyBYPEU+KCk7CQkJXG4iICsgCgkJCSIJICAgICAgXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBYQzxjYXB0dXJlLW9mID8+IHRvIFhDPFU+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCVhDPD8+IHhjdTIgPSAoWEM8PyBleHRlbmRzIFg+KSBuZXcgWDxFPigpOwkJCQkJCVxuIiArIAoJCQkiCSAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNhc3QgZnJvbSBYPEU+IHRvIFhDPD8gZXh0ZW5kcyBYPiBpcyBhY3R1YWxseSBjaGVja2luZyBhZ2FpbnN0IHRoZSBlcmFzZWQgdHlwZSBYQ1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCXB1YmxpYyB2b2lkIHRlc3QyNjYoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxFPiB7XG4iICsgCgkJCQkiCXZvaWQgYmFyKCkge1xuIiArIAoJCQkJIgkJWDw/IGV4dGVuZHMgRT4geGUgPSBuZXcgWDxFPigpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiIik7Cgl9CQkKCXB1YmxpYyB2b2lkIHRlc3QyNjcoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPiB7XG4iICsgCgkJCQkiCXN0YXRpYyB2b2lkIGZvbyhYPD8+IHhhbnkpIHsgXG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCWZvbyhuZXcgWDxPYmplY3RbXT4oKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iCQoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkJCglwdWJsaWMgdm9pZCB0ZXN0MjY4KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFggPFQ+IHtcbiIgKyAKCQkJCSIJWFtdIGZvbygpIHtcbiIgKyAKCQkJCSIJCUFycmF5TGlzdDxYPiBsaXN0ID0gbmV3IEFycmF5TGlzdCgpO1xuIiArIAoJCQkJIgkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgWFtsaXN0LnNpemUoKV0pO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJQXJyYXlMaXN0PFg+IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIEFycmF5TGlzdCBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIEFycmF5TGlzdDxYPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzA5NzUgLSB0ZXN0IGNvbXBpbGF0aW9uIGFnYWluc3QgYmluYXJ5IGdlbmVyaWMgbWV0aG9kCglwdWJsaWMgdm9pZCB0ZXN0MjY5KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPiB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCTxVPiBVW10gYmFyKFVbXSB1KSAgeyBcbiIgKwoJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIJCXJldHVybiBudWxsOyB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXN0YXRpYyBTdHJpbmdbXSBmb28oKSB7XG4iICsgCgkJCQkiCQlYPFN0cmluZz4geHMgPSBuZXcgWDxTdHJpbmc+KCk7XG4iICsgCgkJCQkiCQlyZXR1cm4geHMuYmFyKG5ldyBTdHJpbmdbMF0pO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCWZvbygpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJZLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykge1xuIiArIAoJCQkJIgkJWDxTdHJpbmc+IHhzID0gbmV3IFg8U3RyaW5nPigpO1xuIiArIAoJCQkJIgkJU3RyaW5nW10gcyA9IHhzLmJhcihuZXcgU3RyaW5nWzBdKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIiwKCQkJbnVsbCwKCQkJZmFsc2UsIC8vIGRvIG5vdCBmbHVzaCBvdXRwdXQKCQkJbnVsbCk7CQkKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDk2OSAtIGx1YihMaXN0PFN0cmluZz4sIExpc3Q8T2JqZWN0PikgLS0+IExpc3Q8PyBleHRlbmRzIE9iamVjdD4KCXB1YmxpYyB2b2lkIHRlc3QyNzAoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyB2b2lkIHRlc3QoYm9vbGVhbiBwYXJhbSkge1xuIiArIAoJCQkJIiAgICAgICAgQXJyYXlMaXN0PD8+IGxzID0gKHBhcmFtKSBcbiIgKyAKCQkJCSIgICAgICAgIAkJPyBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKVxuIiArIAoJCQkJIiAgICAgICAgCQk6IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpO1xuIiArIAoJCQkJIiAgICAgICAgCQlcbiIgKyAKCQkJCSIgICAgICAgIFggeCA9IHBhcmFtID8gbmV3IFhZKCkgOiBuZXcgWFooKTtcbiIgKyAKCQkJCSIgICAgICAgIFhZIHkgPSAoWFkpIG5ldyBYWigpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIFhZIGV4dGVuZHMgWCB7fVxuIiArIAoJCQkJImNsYXNzIFhaIGV4dGVuZHMgWCB7fVxuIgoJCQl9LAoKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMClcbiIgKyAKCQkJIglYWSB5ID0gKFhZKSBuZXcgWFooKTtcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiQ2Fubm90IGNhc3QgZnJvbSBYWiB0byBYWVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzEwODAgLSBwYXJhbWV0ZXIgYm91bmQgPFQgZXh0ZW5kcyBFbnVtPFQ+PiBzaG91bGQgYmUgYWxsb3dlZAoJcHVibGljIHZvaWQgdGVzdDI3MSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VCBleHRlbmRzIEVudW08VD4+IHtcbiIgKyAKCQkJCSJ9XG4iIAoJCQl9LAoJCQkiIik7Cgl9CQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcxMDgwIC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0MjcyKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUIGV4dGVuZHMgWFk8VD4+IHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgWFk8VSBleHRlbmRzIENsb25lYWJsZT4gaW1wbGVtZW50cyBDbG9uZWFibGUge1xuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIiIpOwoJfQkJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzEwODAgLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3QyNzMoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQgZXh0ZW5kcyBYWTxUPiAmIENsb25lYWJsZT4ge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBYWTxVIGV4dGVuZHMgQ2xvbmVhYmxlPiB7XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzEyNDEKCXB1YmxpYyB2b2lkIHRlc3QyNzQoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBMaXN0IHVzZUxpc3QoTGlzdCBsKSB7XG4iICsgCgkJCQkiICAgICAgICBsLmFkZChcImFzZGZcIik7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gbDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBZIGV4dGVuZHMgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gdXNlTGlzdChMaXN0PFN0cmluZz4gbCkge1xuIiArIAoJCQkJIiAgICAgICAgbC5hZGQoXCJhc2RmXCIpO1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIGw7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCWwuYWRkKFwiYXNkZlwiKTtcbiIgKyAKCQkJIgleXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIG1ldGhvZCBhZGQoT2JqZWN0KSBiZWxvbmdzIHRvIHRoZSByYXcgdHlwZSBMaXN0LiBSZWZlcmVuY2VzIHRvIGdlbmVyaWMgdHlwZSBMaXN0PEU+IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkJIglwdWJsaWMgTGlzdDxTdHJpbmc+IHVzZUxpc3QoTGlzdDxTdHJpbmc+IGwpIHtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJOYW1lIGNsYXNoOiBUaGUgbWV0aG9kIHVzZUxpc3QoTGlzdDxTdHJpbmc+KSBvZiB0eXBlIFkgaGFzIHRoZSBzYW1lIGVyYXN1cmUgYXMgdXNlTGlzdChMaXN0KSBvZiB0eXBlIFggYnV0IGRvZXMgbm90IG92ZXJyaWRlIGl0XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MTI0MSAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDI3NSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKwoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgcHVibGljIExpc3Q8U3RyaW5nPiB1c2VMaXN0KExpc3Q8U3RyaW5nPiBsKSB7XG4iICsgCgkJCQkiICAgICAgICBsLmFkZChcImFzZGZcIik7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gbDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBZIGV4dGVuZHMgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBMaXN0IHVzZUxpc3QoTGlzdCBsKSB7XG4iICsgCgkJCQkiICAgICAgICBsLmFkZChcImFzZGZcIik7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gbDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJCSIJcHVibGljIExpc3QgdXNlTGlzdChMaXN0IGwpIHtcbiIgKyAKCQkJIgkgICAgICAgXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSByZXR1cm4gdHlwZSBMaXN0IGZvciB1c2VMaXN0KExpc3QpIGZyb20gdGhlIHR5cGUgWSBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIExpc3Q8U3RyaW5nPiBmcm9tIHRoZSB0eXBlIFhcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJCSIJcHVibGljIExpc3QgdXNlTGlzdChMaXN0IGwpIHtcbiIgKyAKCQkJIgkgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgdXNlTGlzdChMaXN0KSBvZiB0eXBlIFkgc2hvdWxkIGJlIHRhZ2dlZCB3aXRoIEBPdmVycmlkZSBzaW5jZSBpdCBhY3R1YWxseSBvdmVycmlkZXMgYSBzdXBlcmNsYXNzIG1ldGhvZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTApXG4iICsgCgkJCSIJbC5hZGQoXCJhc2RmXCIpO1xuIiArIAoJCQkiCV5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgbWV0aG9kIGFkZChPYmplY3QpIGJlbG9uZ3MgdG8gdGhlIHJhdyB0eXBlIExpc3QuIFJlZmVyZW5jZXMgdG8gZ2VuZXJpYyB0eXBlIExpc3Q8RT4gc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcxMjQxIC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0Mjc2KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgdm9pZCB1c2VMaXN0KExpc3QgbCkge31cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWSBleHRlbmRzIFgge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgdm9pZCB1c2VMaXN0KExpc3Q8U3RyaW5nPiBsKSB7XG4iICsgCgkJCQkiCQlzdXBlci51c2VMaXN0KGwpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJcHVibGljIHZvaWQgdXNlTGlzdChMaXN0PFN0cmluZz4gbCkge1xuIiArIAoJCQkiCSAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJOYW1lIGNsYXNoOiBUaGUgbWV0aG9kIHVzZUxpc3QoTGlzdDxTdHJpbmc+KSBvZiB0eXBlIFkgaGFzIHRoZSBzYW1lIGVyYXN1cmUgYXMgdXNlTGlzdChMaXN0KSBvZiB0eXBlIFggYnV0IGRvZXMgbm90IG92ZXJyaWRlIGl0XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MTI0MSAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDI3NygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKwoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgcHVibGljIHZvaWQgdXNlTGlzdChMaXN0PFN0cmluZz4gbCkge31cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWSBleHRlbmRzIFgge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgdm9pZCB1c2VMaXN0KExpc3QgbCkge1xuIiArIAoJCQkJIgkJc3VwZXIudXNlTGlzdChsKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJcHVibGljIHZvaWQgdXNlTGlzdChMaXN0IGwpIHtcbiIgKyAKCQkJIgkgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgdXNlTGlzdChMaXN0KSBvZiB0eXBlIFkgc2hvdWxkIGJlIHRhZ2dlZCB3aXRoIEBPdmVycmlkZSBzaW5jZSBpdCBhY3R1YWxseSBvdmVycmlkZXMgYSBzdXBlcmNsYXNzIG1ldGhvZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglzdXBlci51c2VMaXN0KGwpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBleHByZXNzaW9uIG9mIHR5cGUgTGlzdCBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIExpc3Q8U3RyaW5nPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzEyNDEgLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3QyNzgoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQ+IGltcGxlbWVudHMgSSB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBDbGFzczxUPiBnZXREZWNsYXJpbmdDbGFzcygpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSJ9XG4iICsKCQkJCSJjbGFzcyBZIGltcGxlbWVudHMgSSB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBDbGFzczw/PiBnZXREZWNsYXJpbmdDbGFzcygpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSJ9XG4iICsKCQkJCSJpbnRlcmZhY2UgSSB7XG4iICsgCgkJCQkiCXB1YmxpYyBDbGFzcyBnZXREZWNsYXJpbmdDbGFzcygpO1xuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIiIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5OTAxCglwdWJsaWMgdm9pZCB0ZXN0Mjc5KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggaW1wbGVtZW50cyBJU29tZXRoaW5nIHtcbiIgKyAKCQkJCSIgICAgcHVibGljIENsYXNzIGdldFNvbWV0aGluZygpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWSB7fVxuIiArIAoJCQkJImludGVyZmFjZSBJU29tZXRoaW5nIHtcbiIgKyAKCQkJCSIgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBZPiBnZXRTb21ldGhpbmcoKTtcbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAyKVxuIiArIAoJCQkiCXB1YmxpYyBDbGFzcyBnZXRTb21ldGhpbmcoKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCSIJICAgICAgIF5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIHJldHVybiB0eXBlIENsYXNzIGZvciBnZXRTb21ldGhpbmcoKSBmcm9tIHRoZSB0eXBlIFggbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBDbGFzczw/IGV4dGVuZHMgWT4gZnJvbSB0aGUgdHlwZSBJU29tZXRoaW5nXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjgyMgoJcHVibGljIHZvaWQgdGVzdDI4MCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW50ZXJmYWNlIFg8VDEgZXh0ZW5kcyBZPFQyPiwgVDIgZXh0ZW5kcyBaPiB7fVxuIiArCgkJCQkiaW50ZXJmYWNlIFk8VDMgZXh0ZW5kcyBaPiB7fVxuIiArCgkJCQkiaW50ZXJmYWNlIFoge31cbiIKCQkJfSwKCQkJIiIpOwoJfQkKCXB1YmxpYyB2b2lkIHRlc3QyODEoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbnRlcmZhY2UgWDxUMSBleHRlbmRzIFk8VDI+LCBUMiBleHRlbmRzIFo+IHt9XG4iICsKCQkJCSJpbnRlcmZhY2UgWTxUMyBleHRlbmRzIENvbXBhcmFibGU+IHt9XG4iICsKCQkJCSJpbnRlcmZhY2UgWiB7fVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJCSIJaW50ZXJmYWNlIFg8VDEgZXh0ZW5kcyBZPFQyPiwgVDIgZXh0ZW5kcyBaPiB7fVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICBeXlxuIiArCgkJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgVDIgaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUMyBleHRlbmRzIENvbXBhcmFibGU+IG9mIHRoZSB0eXBlIFk8VDM+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCglwdWJsaWMgdm9pZCB0ZXN0MjgyKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIFkuTWVtYmVyPFN0cmluZz4ge31cbiIgKwoJCQkJImNsYXNzIFkgeyBzdGF0aWMgY2xhc3MgTWVtYmVyPFQ+IHt9IH1cbiIKCQkJfSwKCQkJIiIpOwoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkicDEvWC5qYXZhIiwKCQkJCSJwYWNrYWdlIHAxO1xuIiArCgkJCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBwMS5ZLk1lbWJlcjxTdHJpbmc+IHt9XG4iICsKCQkJCSJjbGFzcyBZIHsgc3RhdGljIGNsYXNzIE1lbWJlcjxUPiB7fSB9XG4iCgkJCX0sCgkJCSIiKTsKCX0JCglwdWJsaWMgdm9pZCB0ZXN0MjgzKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBZLk1pc3Npbmc8U3RyaW5nPiB7fVxuIiArCgkJCQkiY2xhc3MgWSB7IHN0YXRpYyBjbGFzcyBNZW1iZXI8VD4ge30gfVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFggZXh0ZW5kcyBZLk1pc3Npbmc8U3RyaW5nPiB7fVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXG4iICsgCgkJCSJZLk1pc3NpbmcgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkicDEvWC5qYXZhIiwKCQkJCSJwYWNrYWdlIHAxO1xuIiArCgkJCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBZLk1pc3Npbmc8U3RyaW5nPiB7fVxuIiArCgkJCQkiY2xhc3MgWSB7IHN0YXRpYyBjbGFzcyBNZW1iZXI8VD4ge30gfVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gcDFcXFguamF2YSAoYXQgbGluZSAyKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgWS5NaXNzaW5nPFN0cmluZz4ge31cbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXlxuIiArIAoJCQkiWS5NaXNzaW5nIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcyMDgzCglwdWJsaWMgdm9pZCB0ZXN0Mjg0KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkicDEvQS5qYXZhIiwKCQkJCSJwYWNrYWdlIHAxO1xuIiArCgkJCQkicHVibGljIGNsYXNzIEEgPFQxIGV4dGVuZHMgQTxUMSwgVDI+LCBUMiBleHRlbmRzIEI8VDEsIFQyPj4ge1xuIiArCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJCSJwMS9CLmphdmEiLAoJCQkJInBhY2thZ2UgcDE7XG4iICsKCQkJCSJwdWJsaWMgY2xhc3MgQiA8VDMgZXh0ZW5kcyBBPFQzLCBUND4sIFQ0IGV4dGVuZHMgQjxUMywgVDQ+PiB7fVxuIgoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkicDEvQS5qYXZhIiwKCQkJCSJwYWNrYWdlIHAxO1xuIiArCgkJCQkicHVibGljIGNsYXNzIEEgPFQxIGV4dGVuZHMgQjxUMSwgVDI+LCBUMiBleHRlbmRzIEE8VDEsIFQyPj4ge1xuIiArCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJCSJwMS9CLmphdmEiLAoJCQkJInBhY2thZ2UgcDE7XG4iICsKCQkJCSJwdWJsaWMgY2xhc3MgQiA8VDMgZXh0ZW5kcyBCPFQzLCBUND4sIFQ0IGV4dGVuZHMgQTxUMywgVDQ+PiB7fVxuIgoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczNTMwCglwdWJsaWMgdm9pZCB0ZXN0Mjg1KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLlZlY3RvcjtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKXtcbiIgKyAKCQkJCSIgICAgVmVjdG9yPEludGVnZXJbXT4gdiA9IG5ldyBWZWN0b3I8SW50ZWdlcltdPigpO1xuIiArIAoJCQkJIiAgICBJbnRlZ2VyW10gYXJyYXkxID0gbmV3IEludGVnZXJbNV07XG4iICsgCgkJCQkiICAgIGFycmF5MVswXSA9IG5ldyBJbnRlZ2VyKDE3KTtcbiIgKyAKCQkJCSIgICAgYXJyYXkxWzFdID0gbmV3IEludGVnZXIoNDIpO1xuIiArIAoJCQkJIiAgICB2LmFkZChhcnJheTEpO1xuIiArIAoJCQkJIiAgICBJbnRlZ2VyIHR3ZW50eWZvdXIgPSB2LmdldCgwKVsxXTsgIC8vIHJlc3BvbnNpYmxlIGZvciB0aGUgY3Jhc2hcbiIgKyAKCQkJCSIgICAgU3lzdGVtLm91dC5wcmludGxuKHR3ZW50eWZvdXIpO1xuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIn0iCgkJCX0sCgkJCSI0MiIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcyNjQ0CgkvLyBUT0RPIChwaGlsaXBwZSkgd2UgbmVlZCBhIHdheSB0byB0ZXN0IHRoZXNlIDIgbWV0aG9kcyAmIGZpbmQgdGhlbSAnZXF1aXZhbGVudCcuLi4gcmlnaHQgaXNFcXVpdmFsZW50VG8gcmV0dXJuIGZhbHNlCglwdWJsaWMgdm9pZCB0ZXN0Mjg2KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCTxUIGV4dGVuZHMgT2JqZWN0PiBUIGZvbyhDbGFzczxUPiBjKSB7cmV0dXJuIG51bGw7fVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBZIGV4dGVuZHMgWCB7XG4iICsgCgkJCQkiCTxUIGV4dGVuZHMgT2JqZWN0PiBUIGZvbyhDbGFzczxUPiBjKSB7cmV0dXJuIG51bGw7fVxuIiArIAoJCQkJIn0iCgkJCX0sCgkJCSIiKTsKCX0JCglwdWJsaWMgdm9pZCB0ZXN0Mjg3KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgY2xhc3MgQSA8VT4ge1xuIiArIAoJCQkJIgkJXG4iICsgCgkJCQkiCQlwdWJsaWMgY2xhc3MgQiA8Vj4ge1xuIiArIAoJCQkJIgkJCVxuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCVxuIiArIAoJCQkJIgkJWC5BLkI8U3RyaW5nPiBicztcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTEpXG4iICsgCgkJCSIJWC5BLkI8U3RyaW5nPiBicztcbiIgKyAKCQkJIgleXl5eXlxuIiArIAoJCQkiVGhlIG1lbWJlciB0eXBlIFguQS5CPFN0cmluZz4gbXVzdCBiZSBxdWFsaWZpZWQgd2l0aCBhIHBhcmFtZXRlcml6ZWQgdHlwZSwgc2luY2UgaXQgaXMgbm90IHN0YXRpY1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQoJcHVibGljIHZvaWQgdGVzdDI4OCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIGNsYXNzIEEgPFU+IHtcbiIgKyAKCQkJCSIJCVxuIiArIAoJCQkJIgkJcHVibGljIHN0YXRpYyBjbGFzcyBCIDxWPiB7XG4iICsgCgkJCQkiCQkJXG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJXG4iICsgCgkJCQkiCQlYLkEuQjxTdHJpbmc+IGJzO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiAKCQkJfSwKCQkJIiIpOwoJfQkJCglwdWJsaWMgdm9pZCB0ZXN0Mjg5KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgY2xhc3MgQSA8VT4ge1xuIiArIAoJCQkJIgkJXG4iICsgCgkJCQkiCQlwdWJsaWMgY2xhc3MgQiA8Vj4ge1xuIiArIAoJCQkJIgkJCVxuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCVxuIiArIAoJCQkJIgkJWDxTdHJpbmc+LkEuQjxTdHJpbmc+IGJzO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiAKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMSlcbiIgKyAKCQkJIglYPFN0cmluZz4uQS5CPFN0cmluZz4gYnM7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVGhlIG1lbWJlciB0eXBlIFg8U3RyaW5nPi5BIG11c3QgYmUgcGFyYW1ldGVyaXplZCwgc2luY2UgaXQgaXMgcXVhbGlmaWVkIHdpdGggYSBwYXJhbWV0ZXJpemVkIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkKCXB1YmxpYyB2b2lkIHRlc3QyOTAoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPiB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgY2xhc3MgQSA8VT4ge1xuIiArIAoJCQkJIgkJXG4iICsgCgkJCQkiCQlwdWJsaWMgY2xhc3MgQiA8Vj4ge1xuIiArIAoJCQkJIgkJCVxuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCVxuIiArIAoJCQkJIgkJWDxTdHJpbmc+LkEuQjxTdHJpbmc+IGJzO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiAKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMSlcbiIgKyAKCQkJIglYPFN0cmluZz4uQS5CPFN0cmluZz4gYnM7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVGhlIG1lbWJlciB0eXBlIFg8U3RyaW5nPi5BIGNhbm5vdCBiZSBxdWFsaWZpZWQgd2l0aCBhIHBhcmFtZXRlcml6ZWQgdHlwZSwgc2luY2UgaXQgaXMgc3RhdGljLiBSZW1vdmUgYXJndW1lbnRzIGZyb20gcXVhbGlmeWluZyB0eXBlIFg8U3RyaW5nPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCS8vIGVuc3VyZSBib3VuZCBjaGVjayBkZWFscyB3aXRoIHN1cGVydHlwZSAoYW5kIHRoZWlyIGVuY2xvc2luZyB0eXBlKQoJcHVibGljIHZvaWQgdGVzdDI5MSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUIGV4dGVuZHMgSXRlcmFibGU+e1xuIiArIAoJCQkJIgljbGFzcyBNWDxVIGV4dGVuZHMgSXRlcmFibGU+IHtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBTWCBleHRlbmRzIFg8VGhyZWFkPi5NWDxPYmplY3Q+IHtcbiIgKyAKCQkJCSIJU1goWCB4KXtcbiIgKyAKCQkJCSIJCXguc3VwZXIoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCWNsYXNzIFNYIGV4dGVuZHMgWDxUaHJlYWQ+Lk1YPE9iamVjdD4ge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICBeXl5eXl5cbiIgKyAKCQkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSBUaHJlYWQgaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgSXRlcmFibGU+IG9mIHRoZSB0eXBlIFg8VD5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCWNsYXNzIFNYIGV4dGVuZHMgWDxUaHJlYWQ+Lk1YPE9iamVjdD4ge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXlxuIiArIAoJCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlIE9iamVjdCBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFUgZXh0ZW5kcyBJdGVyYWJsZT4gb2YgdGhlIHR5cGUgWDxUPi5NWDxVPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCXB1YmxpYyB2b2lkIHRlc3QyOTIoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPiB7XG4iICsgCgkJCQkiCWNsYXNzIFkge1xuIiArIAoJCQkJIgkJY2xhc3MgWjxVPiB7XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJWDxPYmplY3Q+LlkuWjxPYmplY3Q+IHpvO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgkKCQkJfSwKCQkJIiIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczODM3CglwdWJsaWMgdm9pZCB0ZXN0MjkzKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiQi5qYXZhIiwgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJCSJwdWJsaWMgY2xhc3MgQjxYPntcbiIrCgkJCQkiICAgIHB1YmxpYyBCKFggc3RyLEQgZFZhbHVlKXt9XG4iKwoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIJLAoJCQkJIkQuamF2YSIsIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCQkicHVibGljIGNsYXNzIEQ8WT57fVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJDLmphdmEiLCAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCQkJInB1YmxpYyBjbGFzcyBDPFosWT4ge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgQjxaPiB0ZXN0KFogelZhbHVlLEQ8WT4geVZhbHVlKXsgcmV0dXJuIG5ldyBCPFo+KHpWYWx1ZSx5VmFsdWUpOyB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiLAoJCQludWxsLAoJCQlmYWxzZSwgLy8gZG8gbm90IGZsdXNoIG91dHB1dAoJCQludWxsKTsJCQoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczODM3IHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDI5NCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIkIuamF2YSIsIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCQkicHVibGljIGNsYXNzIEI8WD57XG4iKwoJCQkJIiAgICBwdWJsaWMgQihYIHN0ciwgQjxEPiBkVmFsdWUpe31cbiIrCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIgksCgkJCQkiRC5qYXZhIiwgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJCSJwdWJsaWMgY2xhc3MgRDxZPnt9XG4iLAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJDLmphdmEiLCAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCQkJInB1YmxpYyBjbGFzcyBDPFosWT4ge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgQjxaPiB0ZXN0KFogelZhbHVlLEI8RDxZPj4geVZhbHVlKXsgcmV0dXJuIG5ldyBCPFo+KHpWYWx1ZSx5VmFsdWUpOyB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIEMuamF2YSAoYXQgbGluZSAyKVxyXG4iICsgCgkJCSIJcHVibGljIEI8Wj4gdGVzdChaIHpWYWx1ZSxCPEQ8WT4+IHlWYWx1ZSl7IHJldHVybiBuZXcgQjxaPih6VmFsdWUseVZhbHVlKTsgfVxyXG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVGhlIGNvbnN0cnVjdG9yIEI8Wj4oWiwgQjxEPFk+PikgaXMgdW5kZWZpbmVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iLAoJCQludWxsLAoJCQlmYWxzZSwgLy8gZG8gbm90IGZsdXNoIG91dHB1dAoJCQludWxsKTsJCQoJfQoJLy8gbm9uLXN0YXRpYyBtZXRob2QgI3N0YXJ0KCkgZ2V0cyBpdHMgdHlwZSBzdWJzdGl0dXRlZCB3aGVuIGFjY2Vzc2VkIHRocm91Z2ggcmF3IHR5cGUKCXB1YmxpYyB2b2lkIHRlc3QyOTUoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiQy5qYXZhIiwgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJCSJwdWJsaWMgY2xhc3MgQzxVPiB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXZvaWQgYmFyKCkge1xuIiArIAoJCQkJIgkJbmV3IEIoKS5zdGFydCgpLmdldChuZXcgQigpLnN0YXJ0KCkpLmdldChuZXcgQigpLnN0YXJ0KCkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJCSJCLmphdmEiLCAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCQkJInB1YmxpYyBjbGFzcyBCPFg+e1xuIiArIAoJCQkJIglYIGdldChCPFg+IGJ4KSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkiCUI8QjxEPj4gc3RhcnQoKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkifSIsCgkJCQkiRC5qYXZhIiwgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJCSJwdWJsaWMgY2xhc3MgRDxZPnt9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBDLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkJIgluZXcgQigpLnN0YXJ0KCkuZ2V0KG5ldyBCKCkuc3RhcnQoKSkuZ2V0KG5ldyBCKCkuc3RhcnQoKSk7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIG1ldGhvZCBnZXQoQikgYmVsb25ncyB0byB0aGUgcmF3IHR5cGUgQi4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgQjxYPiBzaG91bGQgYmUgcGFyYW1ldGVyaXplZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gQy5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJbmV3IEIoKS5zdGFydCgpLmdldChuZXcgQigpLnN0YXJ0KCkpLmdldChuZXcgQigpLnN0YXJ0KCkpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgZ2V0KEIpIGlzIHVuZGVmaW5lZCBmb3IgdGhlIHR5cGUgT2JqZWN0XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vIHN0YXRpYyBtZXRob2QgI3N0YXJ0KCkgZ2V0cyBpdHMgdHlwZSBkb2VzIG5vdCBnZXQgc3Vic3RpdHV0ZWQgd2hlbiBhY2Nlc3NlZCB0aHJvdWdoIHJhdyB0eXBlCglwdWJsaWMgdm9pZCB0ZXN0Mjk2KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIkMuamF2YSIsIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCQkicHVibGljIGNsYXNzIEM8VT4ge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgl2b2lkIGJhcigpIHtcbiIgKyAKCQkJCSIJCW5ldyBCKCkuc3RhcnQoKS5nZXQobmV3IEIoKS5zdGFydCgpKS5nZXQobmV3IEIoKS5zdGFydCgpKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCQkiQi5qYXZhIiwgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJCSJwdWJsaWMgY2xhc3MgQjxYPntcbiIgKyAKCQkJCSIJWCBnZXQoQjxYPiBieCkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkJIglzdGF0aWMgQjxCPEQ+PiBzdGFydCgpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSJ9IiwKCQkJCSJELmphdmEiLCAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCQkJInB1YmxpYyBjbGFzcyBEPFk+e31cbiIsCgkJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gV0FSTklORyBpbiBDLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkiCW5ldyBCKCkuc3RhcnQoKS5nZXQobmV3IEIoKS5zdGFydCgpKS5nZXQobmV3IEIoKS5zdGFydCgpKTtcbiIgKyAKCQkiCV5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJUaGUgc3RhdGljIG1ldGhvZCBzdGFydCgpIGZyb20gdGhlIHR5cGUgQiBzaG91bGQgYmUgYWNjZXNzZWQgaW4gYSBzdGF0aWMgd2F5XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMi4gV0FSTklORyBpbiBDLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkiCW5ldyBCKCkuc3RhcnQoKS5nZXQobmV3IEIoKS5zdGFydCgpKS5nZXQobmV3IEIoKS5zdGFydCgpKTtcbiIgKyAKCQkiCSAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJIlRoZSBzdGF0aWMgbWV0aG9kIHN0YXJ0KCkgZnJvbSB0aGUgdHlwZSBCIHNob3VsZCBiZSBhY2Nlc3NlZCBpbiBhIHN0YXRpYyB3YXlcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIzLiBFUlJPUiBpbiBDLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkiCW5ldyBCKCkuc3RhcnQoKS5nZXQobmV3IEIoKS5zdGFydCgpKS5nZXQobmV3IEIoKS5zdGFydCgpKTtcbiIgKyAKCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBnZXQoQjxEPikgaW4gdGhlIHR5cGUgQjxEPiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoQjxCPEQ+PilcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSI0LiBXQVJOSU5HIGluIEMuamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCSIJbmV3IEIoKS5zdGFydCgpLmdldChuZXcgQigpLnN0YXJ0KCkpLmdldChuZXcgQigpLnN0YXJ0KCkpO1xuIiArIAoJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiVGhlIHN0YXRpYyBtZXRob2Qgc3RhcnQoKSBmcm9tIHRoZSB0eXBlIEIgc2hvdWxkIGJlIGFjY2Vzc2VkIGluIGEgc3RhdGljIHdheVxuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKCX0KCXB1YmxpYyB2b2lkIHRlc3QyOTcoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLCAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCQkJImltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDtcbiIgKyAKCQkJCSJpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yO1xuIiArIAoJCQkJImltcG9ydCBqYXZhLnV0aWwuTWFwO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJCSBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQkgCQkgTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTtcbiIgKyAKCQkJCSIJCSAJCSBcbiIgKyAKCQkJCSIJCSAJCSBtYXAucHV0KFwiZm9vXCIsIFwiYmFyXCIpO1xuIiArIAoJCQkJIgkJIAkJIFxuIiArIAoJCQkJIgkJIAkJIC8vIEVycm9yIHJlcG9ydGVkIG9uIHRoZSBmb2xsb3dpbmcgbGluZVxuIiArIAoJCQkJIgkJIAkJIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsU3RyaW5nPj4gaSA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7XG4iICsgCgkJCQkiCQkgCQkgd2hpbGUgKGkuaGFzTmV4dCgpKSB7XG4iICsgCgkJCQkiCQkgCQkgCQkgTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA9IGkubmV4dCgpO1xuIiArIAoJCQkJIgkJIAkJIAkJIFN5c3RlbS5vdXQucHJpbnRsbihlbnRyeS5nZXRLZXkoKSArIFwiLCBcIiArIGVudHJ5LmdldFZhbHVlKCkpO1xuIiArIAoJCQkJIgkJIAkJIH1cbiIgKyAKCQkJCSIJCSB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJImZvbywgYmFyIik7CQoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcyNjQ0CglwdWJsaWMgdm9pZCB0ZXN0Mjk4KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCQkiaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uO1xuIiArIAoJCQkJImltcG9ydCBqYXZhLnV0aWwuTWFwO1xuIiArIAoJCQkJImltcG9ydCBqYXZhLnV0aWwuU2V0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYPFY+IGltcGxlbWVudHMgTWFwPFN0cmluZywgVj4ge1xuIiArIAoJCQkJIiAgIHByaXZhdGUgTWFwPFN0cmluZywgVj4gYmFja2luZ01hcDtcbiIgKyAKCQkJCSIgICBwdWJsaWMgaW50IHNpemUoKSB7IHJldHVybiAwOyB9XG4iICsgCgkJCQkiICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4iICsgCgkJCQkiICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgeyByZXR1cm4gZmFsc2U7IH1cbiIgKyAKCQkJCSIgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cbiIgKyAKCQkJCSIgICBwdWJsaWMgViBnZXQoT2JqZWN0IGtleSkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkJIiAgIHB1YmxpYyBWIHB1dChTdHJpbmcga2V5LCBWIHZhbHVlKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkiICAgcHVibGljIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSIgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsgfVxuIiArIAoJCQkJIiAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBrZXlTZXQoKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkiICAgcHVibGljIENvbGxlY3Rpb248Vj4gdmFsdWVzKCkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkJIiAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXA8U3RyaW5nLCA/IGV4dGVuZHMgVj4gdCkgeyB9XG4iICsgCgkJCQkiICAgcHVibGljIFNldDxNYXAuRW50cnk8U3RyaW5nLCBWPj4gZW50cnlTZXQoKSB7XG4iICsgCgkJCQkiICAgICAgcmV0dXJuIHRoaXMuYmFja2luZ01hcC5lbnRyeVNldCgpO1xuIiArIAoJCQkJIiAgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFg8Vj4gaW1wbGVtZW50cyBNYXA8U3RyaW5nLCBWPiB7XG4iICsgCgkJCSIJICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlRoZSB0eXBlIFg8Vj4gbXVzdCBpbXBsZW1lbnQgdGhlIGluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2QgTWFwPFN0cmluZyxWPi5wdXRBbGwoTWFwPD8gZXh0ZW5kcyBTdHJpbmcsPyBleHRlbmRzIFY+KVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDE3KVxuIiArIAoJCQkiCXB1YmxpYyB2b2lkIHB1dEFsbChNYXA8U3RyaW5nLCA/IGV4dGVuZHMgVj4gdCkgeyB9XG4iICsgCgkJCSIJICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiTmFtZSBjbGFzaDogVGhlIG1ldGhvZCBwdXRBbGwoTWFwPFN0cmluZyw/IGV4dGVuZHMgVj4pIG9mIHR5cGUgWDxWPiBoYXMgdGhlIHNhbWUgZXJhc3VyZSBhcyBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBLLD8gZXh0ZW5kcyBWPikgb2YgdHlwZSBNYXA8SyxWPiBidXQgZG9lcyBub3Qgb3ZlcnJpZGUgaXRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJCSJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWDxTLCBWPiBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXA8T2JqZWN0LCBPYmplY3Q+IHtcbiIgKyAKCQkJCSIgICBwdWJsaWMgdm9pZCBwdXRBbGwoamF2YS51dGlsLk1hcDw/LCA/PiB0KSB7IH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiIik7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJCSJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWDxTLCBWPiBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXA8UywgVj4ge1xuIiArIAoJCQkJIiAgIHB1YmxpYyB2b2lkIHB1dEFsbChqYXZhLnV0aWwuTWFwPD8gZXh0ZW5kcyBTdHJpbmcsID8gZXh0ZW5kcyBWPiB0KSB7IH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDIpXG4iICsgCgkJCSIJcHVibGljIHZvaWQgcHV0QWxsKGphdmEudXRpbC5NYXA8PyBleHRlbmRzIFN0cmluZywgPyBleHRlbmRzIFY+IHQpIHsgfVxuIiArIAoJCQkiCSAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiTmFtZSBjbGFzaDogVGhlIG1ldGhvZCBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBTdHJpbmcsPyBleHRlbmRzIFY+KSBvZiB0eXBlIFg8UyxWPiBoYXMgdGhlIHNhbWUgZXJhc3VyZSBhcyBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBLLD8gZXh0ZW5kcyBWPikgb2YgdHlwZSBNYXA8SyxWPiBidXQgZG9lcyBub3Qgb3ZlcnJpZGUgaXRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc0MjQ0CglwdWJsaWMgdm9pZCB0ZXN0Mjk5KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHtcbiIgKyAKCQkJCSIgCVN5c3RlbS5vdXQucHJpbnRsbihCb29sZWFuLmNsYXNzID09IGJvb2xlYW4uY2xhc3MgPyBcIkZBSUxFRFwiIDogXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsJCgl9CQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc0MTE5CglwdWJsaWMgdm9pZCB0ZXN0MzAwKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHN0YXRpYyBpbnRlcmZhY2UgSSBleHRlbmRzIFZpc2l0aWJsZTxJPiB7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgc3RhdGljIGludGVyZmFjZSBWaXNpdGlibGU8VD4ge1xuIiArIAoJCQkJIiAgICAgICAgdm9pZCBhY2NlcHRWaXNpdG9yKFZpc2l0b3I8PyBzdXBlciBUPiB2aXNpdG9yKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBzdGF0aWMgaW50ZXJmYWNlIFZpc2l0b3I8VD4ge1xuIiArIAoJCQkJIiAgICAgICAgdm9pZCB2aXNpdChUIHQpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHN0YXRpYyBjbGFzcyBDIGltcGxlbWVudHMgSSB7XG4iICsgCgkJCQkiICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdG9yKFZpc2l0b3I8PyBzdXBlciBJPiB2aXNpdG9yKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgdmlzaXRvci52aXNpdCh0aGlzKTsgLy8gc2hvdWxkIGJlIG9rXG4iICsgCgkJCQkiICAgICAgICAgICAgdmlzaXRvci52aXNpdCgoSSkgdGhpcyk7IC8vICgyKSBUaGlzIGlzIGEgd29ya2Fyb3VuZFxuIiArIAoJCQkJIiAgICAgICAgfVxuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsJCgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQzMjA6IGNoZWNrIG5vIGNvbXBsYWludCBmb3IgdW51c2VkIHByaXZhdGUgbWV0aG9kCglwdWJsaWMgdm9pZCB0ZXN0MzAxKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIHJldmVyc2UoTGlzdDw/PiBsaXN0KSB7IFxuIiArIAoJCQkJIgkJcmV2KGxpc3QpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXByaXZhdGUgc3RhdGljIDxUPiB2b2lkIHJldihMaXN0PFQ+IGxpc3QpIHtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglab3JrIGZvbygpIHtcbiIgKyAKCQkJCSIJfVxuIiArIAkJCQkKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJCSIJWm9yayBmb28oKSB7XG4iICsgCgkJCSIJXl5eXlxuIiArIAoJCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsJCgl9CQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NDUxNAoJcHVibGljIHZvaWQgdGVzdDMwMigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLCAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCQkJImltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0O1xuIiArIAoJCQkJImltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247XG4iICsgCgkJCQkiaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjtcbiIgKyAKCQkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgdm9pZCB0ZXN0MigpIHtcbiIgKyAKCQkJCSIJCUxpc3Q8U3RyaW5nPiBsPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTtcbiIgKyAKCQkJCSIJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpPSBsLml0ZXJhdG9yKCk7IGkubmV4dCgpOyApIHtcbiIgKyAKCQkJCSIJCX1cbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIglmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaT0gbC5pdGVyYXRvcigpOyBpLm5leHQoKTsgKSB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gU3RyaW5nIHRvIGJvb2xlYW5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwkKCX0JCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc0NTQ0CglwdWJsaWMgdm9pZCB0ZXN0MzAzKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJCSJwdWJsaWMgIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgIAkJWTxTdHJpbmc+IHlzID0gbmV3IFk8U3RyaW5nPigpO1xuIiArIAoJCQkJIgkgICAgWTxTdHJpbmc+Lk1lbWJlciBtID0geXMubmV3IE1lbWJlcigpO1xuIiArIAoJCQkJIgkgICAgbS5mb28oKTtcbiIgKyAKCQkJCSIgIAl9ICAgIFxuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIiAgY2xhc3MgWTxUPiB7XG4iICsgCgkJCQkiICAgIGNsYXNzIE1lbWJlciB7XG4iICsgCgkJCQkiICAgIAl2b2lkIGZvbygpe1xuIiArIAoJCQkJIiAgICAJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIAl9XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSJcbiIsCgkJCX0sCgkJCSJTVUNDRVNTIik7CQoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc0NTkyCglwdWJsaWMgdm9pZCB0ZXN0MzA0KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJCSJwdWJsaWMgY2xhc3MgWDxUIGV4dGVuZHMgWT4ge31cbiIgKyAKCQkJCSJjbGFzcyBZIGV4dGVuZHMgWCB7fSIKCQkJfSwKCQkJIiIpOwkKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NDQyMAoJcHVibGljIHZvaWQgdGVzdDMwNSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIiAgCVQgeDtcbiIgKyAKCQkJCSIgIAk8VSBleHRlbmRzIFQ+IFQgZm9vKFUgdSkgeyByZXR1cm4gdTsgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIiIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc0MDk2CglwdWJsaWMgdm9pZCB0ZXN0MzA2KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJCSJwdWJsaWMgY2xhc3MgWDxUIGV4dGVuZHMgWDxUPj4ge1xuIiArIAoJCQkJIiAgCXByaXZhdGUgaW50IGkgPSAxO1xuIiArIAoJCQkJIiAgCXByaXZhdGUgaW50IGkoKSB7cmV0dXJuIGk7fVxuIiArIAoJCQkJIiAgCXByaXZhdGUgc3RhdGljIGNsYXNzIE0geyBwcml2YXRlIHN0YXRpYyBpbnQgaiA9IDI7IH1cbiIgKyAKCQkJCSIgIAlwdWJsaWMgaW50IGZvbyhUIHQpIHsgcmV0dXJuIHQuaSArIHQuaSgpICsgVC5NLmo7IH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSIiKTsJCgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzI1ODMKCXB1YmxpYyB2b2lkIHRlc3QzMDcoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLCAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJc3RhdGljIDxUPiBUIGZvbyhUIHQxLCBUIHQyKXsgcmV0dXJuIHQxOyB9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCUlYIHMgPSBudWxsO1xuIiArIAoJCQkJIgkJIGZvbyhuZXcgT2JqZWN0KCksIHMpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArCgkJCQkiaW50ZXJmYWNlIElYIHt9XG4iCgkJCX0sCgkJCSIiKTsJCgl9CQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczNjk2CglwdWJsaWMgdm9pZCB0ZXN0MzA4KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkicC9YLmphdmEiLAoJCQkJInBhY2thZ2UgcDtcbiIgKyAKCQkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJCSIJY2xhc3MgTWVtYmVyIHt9XG4iICsgCgkJCQkJIn1cbiIsCgkJCQkicC9ZLmphdmEiLAoJCQkJInBhY2thZ2UgcDtcbiIgKyAKCQkJCQkicHVibGljIGNsYXNzIFkge1xuIiArIAoJCQkJCSIJcC5YLk1lbWJlciBtO1xuIiArIAoJCQkJCSIJcC5YPFN0cmluZz4uTWVtYmVyIG1zID0gbTtcbiIgKyAKCQkJCQkifVxuIgoJCQl9KTsJCgl9CQoJcHVibGljIHZvaWQgdGVzdDMwOSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJInAvWC5qYXZhIiwKCQkJCSJwYWNrYWdlIHA7XG4iICsgCgkJCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJCQkiCWNsYXNzIE1lbWJlciB7XG4iICsgCgkJCQkJIgkJY2xhc3MgU3ViIHt9XG4iICsgCgkJCQkJIgl9XG4iICsgCgkJCQkJIn1cbiIsCgkJCQkicC9ZLmphdmEiLAoJCQkJInBhY2thZ2UgcDtcbiIgKyAKCQkJCQkicHVibGljIGNsYXNzIFkge1xuIiArIAoJCQkJCSIJcC5YLk1lbWJlci5TdWIgcztcbiIgKyAKCQkJCQkiCXAuWDxFeGNlcHRpb24+Lk1lbWJlci5TdWIgZXMgPSBzO1xuIiArIAoJCQkJCSJ9XG4iCgkJCX0pOwkKCX0JCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzUxNTYgLSBzaG91bGQgcmVwb3J0IG5hbWUgY2xhc2gKCXB1YmxpYyB2b2lkIHRlc3QzMTAoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBYMiB7XG4iICsgCgkJCQkiCXZvaWQgZm9vKExpc3Q8WD4gbHgpIHsgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJhYnN0cmFjdCBjbGFzcyBYMiB7XG4iICsgCgkJCQkiCXZvaWQgZm9vKExpc3Q8T2JqZWN0PiBsbykgeyB9XG4iICsgCgkJCQkifSIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCXZvaWQgZm9vKExpc3Q8WD4gbHgpIHsgfVxuIiArIAoJCQkiCSAgICAgXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJOYW1lIGNsYXNoOiBUaGUgbWV0aG9kIGZvbyhMaXN0PFg+KSBvZiB0eXBlIFggaGFzIHRoZSBzYW1lIGVyYXN1cmUgYXMgZm9vKExpc3Q8T2JqZWN0Pikgb2YgdHlwZSBYMiBidXQgZG9lcyBub3Qgb3ZlcnJpZGUgaXRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwkKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NTE1NiB2YXJpYXRpb24gLSBzaG91bGQgcmVwb3J0IG5hbWUgY2xhc2ggYW5kIGFtYmlndWl0eQoJcHVibGljIHZvaWQgdGVzdDMxMSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIFgyIHtcbiIgKyAKCQkJCSIJdm9pZCBmb28oTGlzdDxYPiBseCkgeyB9XG4iICsgCgkJCQkiCXZvaWQgYmFyKCl7XG4iICsgCgkJCQkiCQl0aGlzLmZvbygoTGlzdCludWxsKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJhYnN0cmFjdCBjbGFzcyBYMiB7XG4iICsgCgkJCQkiCXZvaWQgZm9vKExpc3Q8T2JqZWN0PiBsbykgeyB9XG4iICsgCgkJCQkifSIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCXZvaWQgZm9vKExpc3Q8WD4gbHgpIHsgfVxuIiArIAoJCQkiCSAgICAgXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJOYW1lIGNsYXNoOiBUaGUgbWV0aG9kIGZvbyhMaXN0PFg+KSBvZiB0eXBlIFggaGFzIHRoZSBzYW1lIGVyYXN1cmUgYXMgZm9vKExpc3Q8T2JqZWN0Pikgb2YgdHlwZSBYMiBidXQgZG9lcyBub3Qgb3ZlcnJpZGUgaXRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCXRoaXMuZm9vKChMaXN0KW51bGwpO1xuIiArIAoJCQkiCSAgICAgXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGZvbyhMaXN0PFg+KSBpcyBhbWJpZ3VvdXMgZm9yIHRoZSB0eXBlIFhcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwkKCX0JCQoJLy8gNzUxNTYgdmFyaWF0aW9uIC0gc2hvdWxkIHJlcG9ydCBuYW1lIGNsYXNoIGluc3RlYWQgb2YgZmluYWwgbWV0aG9kIG92ZXJyaWRlCglwdWJsaWMgdm9pZCB0ZXN0MzEyKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgWDIge1xuIiArIAoJCQkJIgl2b2lkIGZvbyhMaXN0PFg+IGx4KSB7IH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiYWJzdHJhY3QgY2xhc3MgWDIge1xuIiArIAoJCQkJIglmaW5hbCB2b2lkIGZvbyhMaXN0PE9iamVjdD4gbG8pIHsgfVxuIiArIAoJCQkJIn0iCQoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJdm9pZCBmb28oTGlzdDxYPiBseCkgeyB9XG4iICsgCgkJCSIJICAgICBeXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIk5hbWUgY2xhc2g6IFRoZSBtZXRob2QgZm9vKExpc3Q8WD4pIG9mIHR5cGUgWCBoYXMgdGhlIHNhbWUgZXJhc3VyZSBhcyBmb28oTGlzdDxPYmplY3Q+KSBvZiB0eXBlIFgyIGJ1dCBkb2VzIG5vdCBvdmVycmlkZSBpdFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7CQoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczOTYzIAoJcHVibGljIHZvaWQgdGVzdDMxMygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEubmV0LkluZXQ2QWRkcmVzcztcbiIgKyAKCQkJCSJpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7XG4iICsgCgkJCQkiaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7XG4iICsgCgkJCQkiaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7XG4iICsgCgkJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSJ2b2lkIHRha2VBYnN0cmFjdChBYnN0cmFjdExpc3Q8PyBleHRlbmRzIEluZXRBZGRyZXNzPiBhcmcpIHsgfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJInZvaWQgdGFrZUxpc3QoTGlzdDw/IGV4dGVuZHMgSW5ldEFkZHJlc3M+IGFyZykgeyB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkidm9pZCBjb25zdHJ1Y3QoKSB7XG4iICsgCgkJCQkiCUFic3RyYWN0TGlzdDxJbmV0QWRkcmVzcz4gYT0gbmV3IEFycmF5TGlzdDxJbmV0QWRkcmVzcz4oKTtcbiIgKyAKCQkJCSIJdGFrZUFic3RyYWN0KGEpO1xuIiArIAoJCQkJIgl0YWtlQWJzdHJhY3QobmV3IEFycmF5TGlzdDxJbmV0QWRkcmVzcz4oKSk7IC8vIGEgaW5saW5lZDogZXJyb3IgMTpcbiIgKyAKCQkJCSIvL1RoZSBtZXRob2QgdGFrZUFic3RyYWN0KEFic3RyYWN0TGlzdDw/IGV4dGVuZHMgSW5ldEFkZHJlc3M+KSBpbiB0aGUgdHlwZSBBXG4iICsgCgkJCQkiLy8gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKEFycmF5TGlzdDxJbmV0QWRkcmVzcz4pXG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIglMaXN0PEluZXRBZGRyZXNzPiBsPSBuZXcgQXJyYXlMaXN0PEluZXRBZGRyZXNzPigpO1xuIiArIAoJCQkJIgl0YWtlTGlzdChsKTtcbiIgKyAKCQkJCSIJdGFrZUxpc3QobmV3IEFycmF5TGlzdDxJbmV0QWRkcmVzcz4oKSk7IC8vIGwgaW5saW5lZDogb2tcbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCUFycmF5TGlzdDw/IGV4dGVuZHMgSW5ldEFkZHJlc3M+IGF3PSBuZXcgQXJyYXlMaXN0PEluZXRBZGRyZXNzPigpO1xuIiArIAoJCQkJIgl0YWtlQWJzdHJhY3QoYXcpO1xuIiArIAoJCQkJIgl0YWtlQWJzdHJhY3QobmV3IEFycmF5TGlzdDxJbmV0NkFkZHJlc3M+KCkpOyAvLyBhdyBpbmxpbmVkOiBlcnJvciAyOlxuIiArIAoJCQkJIi8vVGhlIG1ldGhvZCB0YWtlQWJzdHJhY3QoQWJzdHJhY3RMaXN0PD8gZXh0ZW5kcyBJbmV0QWRkcmVzcz4pIGluIHRoZSB0eXBlIEFcbiIgKyAKCQkJCSIvLyBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoQXJyYXlMaXN0PEluZXQ2QWRkcmVzcz4pXG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXRha2VMaXN0KGF3KTtcbiIgKyAKCQkJCSIJdGFrZUxpc3QobmV3IEFycmF5TGlzdDxJbmV0NkFkZHJlc3M+KCkpOyAvL2F3IGlubGluZWQ6IG9rXG4iICsgCgkJCQkifVxuIiArIAoJCQkJIn0iCgkJCX0sCgkJCSIiKTsJCgl9CglwdWJsaWMgdm9pZCB0ZXN0MzE0KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwJCgkJCQkicHVibGljIGNsYXNzIFggPEU+IHtcbiIgKyAKCQkJCSIJc3RhdGljIGNsYXNzIFhNZW1iZXI8Rj4ge31cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJLy8gd2l0aCB0b3BsZXZlbCBlbGVtZW50IHR5cGVcbiIgKyAKCQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCgkJCQkiCQlYSXRlcjxYRWxlbWVudDxFPj4gaXRlciA9IGZvb1NldCgpLml0ZXJhdG9yKCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJWFNldDxYRWxlbWVudDxFPj4gZm9vU2V0KCkJIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJLy8gd2l0aCBtZW1iZXIgZWxlbWVudCB0eXBlXG4iICsgCgkJCQkiCXZvaWQgYmFyKCkge1xuIiArIAoJCQkJIgkJWEl0ZXI8WE1lbWJlcjxFPj4gaXRlciA9IGJhclNldCgpLml0ZXJhdG9yKCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJWFNldDxYTWVtYmVyPEU+PiBiYXJTZXQoKQkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIglcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgWFNldDxHPiB7XG4iICsgCgkJCQkiCVhJdGVyPEc+IGl0ZXJhdG9yKCkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBYSXRlcjxIPiB7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIFhFbGVtZW50PEk+IHtcbiIgKyAKCQkJCSJ9XG4iCQkJCQoJCQl9LAoJCQkiIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MzE1KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwJCgkJCQkicHVibGljIGNsYXNzIFggPEU+IHtcbiIgKyAKCQkJCSIJc3RhdGljIGNsYXNzIFhNZW1iZXI8Rj4ge31cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJLy8gd2l0aCBtZW1iZXIgZWxlbWVudCB0eXBlXG4iICsgCgkJCQkiCXZvaWQgYmFyKCkge1xuIiArIAoJCQkJIgkJWEl0ZXI8WC5YTWVtYmVyPEU+PiBpdGVyID0gYmFyU2V0KCkuaXRlcmF0b3IoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglYU2V0PFhNZW1iZXI8RT4+IGJhclNldCgpCSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBYU2V0PEc+IHtcbiIgKyAKCQkJCSIJWEl0ZXI8Rz4gaXRlcmF0b3IoKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIFhJdGVyPEg+IHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWEVsZW1lbnQ8ST4ge1xuIiArIAoJCQkJIn1cbiIJCQkKCQkJfSwKCQkJIiIpOwoJfQoJcHVibGljIHZvaWQgdGVzdDMxNigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAkKCQkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFggPEUgZXh0ZW5kcyBMaXN0ICYgUnVubmFibGU+IHtcbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCUUgZWxlbWVudCgpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCXZvaWQgYmFyKFg8RT4geGUpIHtcbiIgKyAKCQkJCSIJCXhlLmVsZW1lbnQoKS5hZGQodGhpcyk7XG4iICsgCgkJCQkiCQl4ZS5lbGVtZW50KCkucnVuKCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBmb28oWDw/PiB4ZSkge1xuIiArIAoJCQkJIgkJeGUuZWxlbWVudCgpLmFkZCh0aGlzKTtcbiIgKyAKCQkJCSIJCXhlLmVsZW1lbnQoKS5ydW4oKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgl2b2lkIGJheihYPD8gZXh0ZW5kcyBYTT4geGUpIHtcbiIgKyAKCQkJCSIJCXhlLmVsZW1lbnQoKS5hZGQodGhpcyk7XG4iICsgCgkJCQkiCQl4ZS5lbGVtZW50KCkucnVuKCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJYWJzdHJhY3QgY2xhc3MgWE0gaW1wbGVtZW50cyBMaXN0LCBSdW5uYWJsZSB7fVxuIiArIAoJCQkJIiAgWm9yayB6O1xuIiArCgkJCQkifVxuIgkJCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCXhlLmVsZW1lbnQoKS5hZGQodGhpcyk7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBtZXRob2QgYWRkKE9iamVjdCkgYmVsb25ncyB0byB0aGUgcmF3IHR5cGUgTGlzdC4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgTGlzdDxFPiBzaG91bGQgYmUgcGFyYW1ldGVyaXplZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTIpXG4iICsgCgkJCSIJeGUuZWxlbWVudCgpLmFkZCh0aGlzKTtcbiIgKyAKCQkJIgleXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIG1ldGhvZCBhZGQoT2JqZWN0KSBiZWxvbmdzIHRvIHRoZSByYXcgdHlwZSBMaXN0LiBSZWZlcmVuY2VzIHRvIGdlbmVyaWMgdHlwZSBMaXN0PEU+IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxNilcbiIgKyAKCQkJIgl4ZS5lbGVtZW50KCkuYWRkKHRoaXMpO1xuIiArIAoJCQkiCV5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgbWV0aG9kIGFkZChPYmplY3QpIGJlbG9uZ3MgdG8gdGhlIHJhdyB0eXBlIExpc3QuIFJlZmVyZW5jZXMgdG8gZ2VuZXJpYyB0eXBlIExpc3Q8RT4gc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjQuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyMClcbiIgKyAKCQkJIglab3JrIHo7XG4iICsgCgkJCSIJXl5eXlxuIiArIAoJCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCglwdWJsaWMgdm9pZCB0ZXN0MzE3KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCQoJCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCA8RSBleHRlbmRzIExpc3QgJiBSdW5uYWJsZT4ge1xuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJRSBlbGVtZW50KCkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJdm9pZCBmb28oWDw/IGV4dGVuZHMgWEk+IHhlKSB7XG4iICsgCgkJCQkiCQl4ZS5lbGVtZW50KCkuYWRkKHRoaXMpO1xuIiArIAoJCQkJIgkJeGUuZWxlbWVudCgpLnJ1bigpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXZvaWQgYmF6KFg8PyBleHRlbmRzIFhNPiB4ZSkge1xuIiArIAoJCQkJIgkJeGUuZWxlbWVudCgpLmFkZCh0aGlzKTtcbiIgKyAKCQkJCSIJCXhlLmVsZW1lbnQoKS5ydW4oKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglpbnRlcmZhY2UgWEkgZXh0ZW5kcyBSdW5uYWJsZSB7fVxuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJY2xhc3MgWE0ge1xuIiArIAoJCQkJIgkJdm9pZCBmb28oKSB7fVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiICBab3JrIHo7XG4iICsKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCXhlLmVsZW1lbnQoKS5hZGQodGhpcyk7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBtZXRob2QgYWRkKE9iamVjdCkgYmVsb25ncyB0byB0aGUgcmF3IHR5cGUgTGlzdC4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgTGlzdDxFPiBzaG91bGQgYmUgcGFyYW1ldGVyaXplZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTIpXG4iICsgCgkJCSIJeGUuZWxlbWVudCgpLmFkZCh0aGlzKTtcbiIgKyAKCQkJIgleXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIG1ldGhvZCBhZGQoT2JqZWN0KSBiZWxvbmdzIHRvIHRoZSByYXcgdHlwZSBMaXN0LiBSZWZlcmVuY2VzIHRvIGdlbmVyaWMgdHlwZSBMaXN0PEU+IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMjApXG4iICsgCgkJCSIJWm9yayB6O1xuIiArIAoJCQkiCV5eXl5cbiIgKyAKCQkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIgkpOwoJfQkKCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc1NTQ4CglwdWJsaWMgdm9pZCB0ZXN0MzE4KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiTXlDYWNoZS5qYXZhIiwJCgkJCQkiY2xhc3MgQ2FjaGU8SywgVj4ge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBJbmRleDxLLCBWPiB7XG4iICsgCgkJCQkiICBwdWJsaWMgSW5kZXgoQ2FjaGU8PywgVj4gcGFyZW50Q2FjaGUpIHtcbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIE15Q2FjaGUgZXh0ZW5kcyBDYWNoZTxJbnRlZ2VyLCBTdHJpbmc+IHtcbiIgKyAKCQkJCSIgIGNsYXNzIEFuSW5kZXggZXh0ZW5kcyBJbmRleDxTdHJpbmcsIFN0cmluZz4ge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgQW5JbmRleCgpIHtcbiIgKyAKCQkJCSIgICAgICBzdXBlcihNeUNhY2hlLnRoaXMpOyAvLyA8LS0gRWNsaXBzZSBjYW5ub3QgZmluZCB0aGUgY29uc3RydWN0b3IhXG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSJ9XG4iCQoJCQl9LAoJCQkiIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzY3MjkKCXB1YmxpYyB2b2lkIHRlc3QzMTkoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJ0ZXN0L1Rlc3QxLmphdmEiLAoJCQkJInBhY2thZ2UgdGVzdDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBBPEJCIGV4dGVuZHMgQj5cbiIgKyAKCQkJCSJ7fVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIEI8QUEgZXh0ZW5kcyBBPlxuIiArIAoJCQkJInt9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGludGVyZmFjZSBUZXN0MTxDIGV4dGVuZHMgQjw/PiwgRCBleHRlbmRzIEE8Pz4+XG4iICsgCgkJCQkie31cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBBYnN0cmFjdEEgZXh0ZW5kcyBBPEFic3RyYWN0Qj4ge307XG4iICsgCgkJCQkiY2xhc3MgQWJzdHJhY3RCIGV4dGVuZHMgQjxBYnN0cmFjdEE+IHt9O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIFRlc3QyPEUgZXh0ZW5kcyBBYnN0cmFjdEIsIEYgZXh0ZW5kcyBBYnN0cmFjdEE+IGltcGxlbWVudHMgVGVzdDE8RSwgRj5cbiIgKyAKCQkJCSJ7fSIKCQkJfSwKCQkJIiIpOwkKCX0JCQkJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQwMzIKCXB1YmxpYyB2b2lkIHRlc3QzMjAoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0O1xuIiArIAoJCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKyAKCQkJCSJjbGFzcyBUZXN0RWxlbWVudCBleHRlbmRzIEFycmF5TGlzdCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHtcbiIgKyAKCQkJCSIgIHB1YmxpYyB2b2lkIHJ1bigpIHtcbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFggPEUgZXh0ZW5kcyBMaXN0ICYgUnVubmFibGU+IHtcbiIgKyAKCQkJCSIgIHB1YmxpYyBYKEUgZWxlbWVudCkge1xuIiArIAoJCQkJIiAgICBlbGVtZW50LnJ1bigpO1xuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICBuZXcgWDxUZXN0RWxlbWVudD4obmV3IFRlc3RFbGVtZW50KCkpO1xuIiArIAoJCQkJIiAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIlNVQ0NFU1MiKTsJCgl9CQkJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQwMzIgLSB2YXJpYXRpb24gd2l0aCB3aWxkY2FyZAoJcHVibGljIHZvaWQgdGVzdDMyMSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7XG4iICsgCgkJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkJImNsYXNzIFRlc3RFbGVtZW50IGV4dGVuZHMgQXJyYXlMaXN0IGltcGxlbWVudHMgUnVubmFibGUge1xuIiArIAoJCQkJIiAgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFsO1xuIiArIAoJCQkJIiAgcHVibGljIHZvaWQgcnVuKCkge1xuIiArIAoJCQkJIiAgCS8vIGVtcHR5XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIDxFIGV4dGVuZHMgTGlzdCAmIFJ1bm5hYmxlPiB7XG4iICsgCgkJCQkiCUUgZWxlbWVudDtcbiIgKyAKCQkJCSIgIHB1YmxpYyBYKEUgZWxlbWVudCkge1xuIiArIAoJCQkJIiAgCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4iICsgCgkJCQkiICAgIGVsZW1lbnQucnVuKCk7XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkiICBwdWJsaWMgWChYPD8+IHgpIHtcbiIgKyAKCQkJCSIgICAgeC5lbGVtZW50LnJ1bigpO1xuIiArIC8vIHNob3VsZCBiZSBhYmxlIHRvIGJpbmQgdG8gI3J1bigpCgkJCQkiICB9XG4iICsgCgkJCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgIG5ldyBYPFRlc3RFbGVtZW50PihuZXcgVGVzdEVsZW1lbnQoKSk7XG4iICsgCgkJCQkiICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiU1VDQ0VTUyIpOwkKCX0JCQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NTEzNAoJcHVibGljIHZvaWQgdGVzdDMyMigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYPEE+IHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgIEEgdjI7XG4iICsgCgkJCQkiICBYKEEgYSkgeyB2MiA9IGE7IH1cbiIgKyAKCQkJCSIgIFxuIiArIAoJCQkJIiAgdm9pZCBmdW5jKCkge1xuIiArIAoJCQkJIiAgICBMaXN0PEI8QT4+IGwgPSBuZXcgQXJyYXlMaXN0PEI8QT4+KCk7XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICBjbGFzcyBCPFQ+IHtcbiIgKyAKCQkJCSIgICAgVCB2MTtcbiIgKyAKCQkJCSIgICAgQihUIGIpIHsgIHYxID0gYjsgfVxuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIiAgXG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiIik7CQoJfQkJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzYzNTkgLSBhbHNvIGNoZWNrIHdhcm5pbmdzIGZvciByYXcgY29udmVyc2lvbgoJcHVibGljIHZvaWQgdGVzdDMyMygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImNsYXNzIEc8VD4ge1xuIiArIAoJCQkJIgljbGFzcyBNZW1iZXIge31cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglHPFN0cmluZz4gZyA9IG5ldyBHKCk7XG4iICsgCgkJCQkiCUc8U3RyaW5nPi5NZW1iZXIgZ3NtID0gZy5uZXcgTWVtYmVyKCk7XG4iICsgCgkJCQkiCUcuTWVtYmVyIGdtID0gbnVsbDtcbiIgKyAKCQkJCSIJRzxUaHJlYWQ+Lk1lbWJlciBndG0gPSBnbTtcbiIgKyAKCQkJCSIJWm9yayB6O1xuIiArCgkJCQkifVxuIgkJCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCUc8U3RyaW5nPiBnID0gbmV3IEcoKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgIF5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIEcgbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBHPFN0cmluZz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJCSIJRzxUaHJlYWQ+Lk1lbWJlciBndG0gPSBnbTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgIF5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGV4cHJlc3Npb24gb2YgdHlwZSBHLk1lbWJlciBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIEc8VGhyZWFkPi5NZW1iZXJcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA5KVxuIiArIAoJCQkiCVpvcmsgejtcbiIgKyAKCQkJIgleXl5eXG4iICsgCgkJCSJab3JrIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwkKCX0JCQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03Mjk5OAoJcHVibGljIHZvaWQgdGVzdDMyNCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjtcbiIgKyAKCQkJCSJpbXBvcnQgamF2YS51dGlsLlNldDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWDxFPiB7XG4iICsgCgkJCQkiICAgcHJpdmF0ZSBUcmVlTm9kZTxFPiByb290O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIiAgIHB1YmxpYyB2b2lkIGRvU29tZXRoaW5nKCkge1xuIiArIAoJCQkJIiAgICAgIGZvciAoVHJlZU5vZGU8RT4gY2hpbGQgOiByb290LmNoaWxkcmVuKCkpIHtcbiIgKyAKCQkJCSIgICAgICAgICAvLyByb290LmNoaWxkcmVuKCkgc2hvdWxkIHdvcms/P1xuIiArIAoJCQkJIiAgICAgIH1cbiIgKyAKCQkJCSIgICB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICAgcHVibGljIHZvaWQgZG9Tb21ldGhpbmdFbHNlKCkge1xuIiArIAoJCQkJIiAgICAgIGZvciAoSXRlcmF0b3I8VHJlZU5vZGU8RT4+IGl0ID0gcm9vdC5jaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHtcbiIgKyAKCQkJCSIgICAgICAgICAvLyB0aGlzIGFsc28gc2hvdWxkIHdvcmtcbiIgKyAKCQkJCSIgICAgICB9XG4iICsgCgkJCQkiICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBUcmVlTm9kZTxFPiB7XG4iICsgCgkJCQkiICAgcHJpdmF0ZSBTZXQ8VHJlZU5vZGU8RT4+IGNoaWxkcmVuO1xuIiArIAoJCQkJIiAgIFxuIiArIAoJCQkJIiAgIHB1YmxpYyBTZXQ8VHJlZU5vZGU8RT4+IGNoaWxkcmVuKCkge1xuIiArIAoJCQkJIiAgICAgIHJldHVybiBjaGlsZHJlbjtcbiIgKyAKCQkJCSIgICB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiIik7CQoJfQoJcHVibGljIHZvaWQgdGVzdDMyNSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPiB7XG4iICsgCgkJCQkiCXZvaWQgZm9vMSgpIHtcbiIgKyAKCQkJCSIJCVg8U3RyaW5nPi5JdGVtPFRocmVhZD4gaSA9IG5ldyBYPEV4Y2VwdGlvbj4oKS5uZXcgSXRlbTxUaHJlYWQ+KCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBmb28yKCkge1xuIiArIAoJCQkJIgkJWDxFeGNlcHRpb24+Lkl0ZW08VGhyZWFkPiBqID0gbmV3IFg8RXhjZXB0aW9uPi5JdGVtPFRocmVhZD4oKTtcbiIgKyAvLyBhbGxvd2VkIHBlciBncmFtbWFyCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBmb28zKCkge1xuIiArIAoJCQkJIgkJWC5JdGVtIGsgPSBuZXcgWC5JdGVtKCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJc3RhdGljIHZvaWQgZm9vNCgpIHtcbiIgKyAKCQkJCSIJCVguSXRlbSBrID0gbmV3IFguSXRlbSgpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCWNsYXNzIEl0ZW0gPEU+IHt9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJWDxTdHJpbmc+Lkl0ZW08VGhyZWFkPiBpID0gbmV3IFg8RXhjZXB0aW9uPigpLm5ldyBJdGVtPFRocmVhZD4oKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gWDxFeGNlcHRpb24+Lkl0ZW08VGhyZWFkPiB0byBYPFN0cmluZz4uSXRlbTxUaHJlYWQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkJIglYPEV4Y2VwdGlvbj4uSXRlbTxUaHJlYWQ+IGogPSBuZXcgWDxFeGNlcHRpb24+Lkl0ZW08VGhyZWFkPigpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiQ2Fubm90IGFsbG9jYXRlIHRoZSBtZW1iZXIgdHlwZSBYPEV4Y2VwdGlvbj4uSXRlbTxUaHJlYWQ+IHVzaW5nIGEgcGFyYW1ldGVyaXplZCBjb21wb3VuZCBuYW1lOyB1c2UgaXRzIHNpbXBsZSBuYW1lIGFuZCBhbiBlbmNsb3NpbmcgaW5zdGFuY2Ugb2YgdHlwZSBYPEV4Y2VwdGlvbj5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMilcbiIgKyAKCQkJIglYLkl0ZW0gayA9IG5ldyBYLkl0ZW0oKTtcbiIgKyAKCQkJIgkgICAgICAgICAgIF5eXl5eXl5eXl5eXlxuIiArIAoJCQkiTm8gZW5jbG9zaW5nIGluc3RhbmNlIG9mIHR5cGUgWDxUPiBpcyBhY2Nlc3NpYmxlLiBNdXN0IHF1YWxpZnkgdGhlIGFsbG9jYXRpb24gd2l0aCBhbiBlbmNsb3NpbmcgaW5zdGFuY2Ugb2YgdHlwZSBYPFQ+IChlLmcuIHgubmV3IEEoKSB3aGVyZSB4IGlzIGFuIGluc3RhbmNlIG9mIFg8VD4pLlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzU0MDAKCXB1YmxpYyB2b2lkIHRlc3QzMjYoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQ+IGltcGxlbWVudHMgSTxUPiB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBJLkEgZm9vKCkge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIGE7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9ICAgIFxuIiArIAoJCQkJImludGVyZmFjZSBJPFQ+IHtcbiIgKyAKCQkJCSIgICAgQSBhID0gbmV3IEEoKTtcbiIgKyAKCQkJCSIgICAgY2xhc3MgQSB7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgWE08VD4ge1xuIiArIAoJCQkJIiAgICBBIGEgPSBuZXcgQSgpO1xuIiArIAoJCQkJIiAgICBjbGFzcyBBIHtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn0JXG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgWE1TdWI8VD4gZXh0ZW5kcyBYTTxUPiB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBYTS5BIGZvbygpIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiBhO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifSAgICBcbiIgKyAKCQkJCSJcbiIKCQkJfSwKCQkJIiIpOwoJfQoJLy8gd2lsZGNhcmQgY2FwdHVyZXMgYm91bmQgYW5kIHZhcmlhYmxlIHN1cGVyaW50ZXJmYWNlcwoJcHVibGljIHZvaWQgdGVzdDMyNygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VCBleHRlbmRzIElGb28+IHtcbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCVQgZWxlbWVudCgpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSIJdm9pZCBiYXooWDw/IGV4dGVuZHMgSUJhcj4geCkge1xuIiArIAoJCQkJIgkJeC5lbGVtZW50KCkuZm9vKCk7XG4iICsgCgkJCQkiCQl4LmVsZW1lbnQoKS5iYXIoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJpbnRlcmZhY2UgSUZvbyB7XG4iICsgCgkJCQkiCXZvaWQgZm9vKCk7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImludGVyZmFjZSBJQmFyIHtcbiIgKyAKCQkJCSIJdm9pZCBiYXIoKTtcbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSIiKTsKCX0KCS8vIHdpbGRjYXJkIGNhcHR1cmVzIGJvdW5kIGFuZCB2YXJpYWJsZSBzdXBlcmludGVyZmFjZXMKCXB1YmxpYyB2b2lkIHRlc3QzMjgoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUIGV4dGVuZHMgSUZvbz4ge1xuIiArIAoJCQkJIglUIGVsZW1lbnQ7XG4iICsgCgkJCQkiCVgoVCBlbGVtZW50KSB7IFxuIiArIAoJCQkJIgkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsgXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJc3RhdGljIHZvaWQgYmF6KFg8PyBleHRlbmRzIElCYXI+IHgpIHtcbiIgKyAKCQkJCSIJCXguZWxlbWVudC5mb28oKTtcbiIgKyAKCQkJCSIJCXguZWxlbWVudC5iYXIoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlYPEZvbz4geDEgPSBuZXcgWDxGb28+KG5ldyBGb28oKSk7XG4iICsgCgkJCQkiCQliYXooeDEpO1xuIiArIAoJCQkJIgkJWDxCYXI+IHgyID0gbmV3IFg8QmFyPihuZXcgQmFyKCkpO1xuIiArIAoJCQkJIgkJYmF6KHgyKTtcbiIgKyAKCQkJCSIJCVg8Rm9vQmFyPiB4MyA9IG5ldyBYPEZvb0Jhcj4obmV3IEZvb0JhcigpKTtcbiIgKyAKCQkJCSIJCWJheih4Myk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiaW50ZXJmYWNlIElGb28ge1xuIiArIAoJCQkJIgl2b2lkIGZvbygpO1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJpbnRlcmZhY2UgSUJhciB7XG4iICsgCgkJCQkiCXZvaWQgYmFyKCk7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEZvbyBpbXBsZW1lbnRzIElGb28ge1xuIiArIAoJCQkJIglwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiRk9PXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEJhciBpbXBsZW1lbnRzIElCYXIge1xuIiArIAoJCQkJIglwdWJsaWMgdm9pZCBiYXIoKSB7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiQkFSXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEZvb0JhciBleHRlbmRzIEZvbyBpbXBsZW1lbnRzIElCYXIge1xuIiArIAoJCQkJIglwdWJsaWMgdm9pZCBiYXIoKSB7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiQkFSXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEyKVxuIiArIAoJCQkiCWJheih4MSk7XG4iICsgCgkJCSIJXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGJheihYPD8gZXh0ZW5kcyBJQmFyPikgaW4gdGhlIHR5cGUgWDxUPiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoWDxGb28+KVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEzKVxuIiArIAoJCQkiCVg8QmFyPiB4MiA9IG5ldyBYPEJhcj4obmV3IEJhcigpKTtcbiIgKyAKCQkJIgkgIF5eXlxuIiArIAoJCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlIEJhciBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFQgZXh0ZW5kcyBJRm9vPiBvZiB0aGUgdHlwZSBYPFQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTMpXG4iICsgCgkJCSIJWDxCYXI+IHgyID0gbmV3IFg8QmFyPihuZXcgQmFyKCkpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgIF5eXlxuIiArIAoJCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlIEJhciBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFQgZXh0ZW5kcyBJRm9vPiBvZiB0aGUgdHlwZSBYPFQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCgkvLyB3aWxkY2FyZCBjYXB0dXJlcyBib3VuZCBhbmQgdmFyaWFibGUgc3VwZXJpbnRlcmZhY2VzCglwdWJsaWMgdm9pZCB0ZXN0MzI5KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUIGV4dGVuZHMgSUZvbz4ge1xuIiArIAoJCQkJIglUIGVsZW1lbnQ7XG4iICsgCgkJCQkiCVgoVCBlbGVtZW50KSB7IFxuIiArIAoJCQkJIgkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsgXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJc3RhdGljIHZvaWQgYmF6KFg8PyBleHRlbmRzIElCYXI+IHgpIHtcbiIgKyAKCQkJCSIJCXguZWxlbWVudC5mb28oKTtcbiIgKyAKCQkJCSIJCXguZWxlbWVudC5iYXIoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlYPEZvb0Jhcj4geDMgPSBuZXcgWDxGb29CYXI+KG5ldyBGb29CYXIoKSk7XG4iICsgCgkJCQkiCQliYXooeDMpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImludGVyZmFjZSBJRm9vIHtcbiIgKyAKCQkJCSIJdm9pZCBmb28oKTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiaW50ZXJmYWNlIElCYXIge1xuIiArIAoJCQkJIgl2b2lkIGJhcigpO1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBGb29CYXIgaW1wbGVtZW50cyBJRm9vLCBJQmFyIHtcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgZm9vKCkge1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludChcIkZPT1wiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgdm9pZCBiYXIoKSB7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiQkFSXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIkZPT0JBUiIpOwoJfQkKCS8vIHdpbGRjYXJkIGNhcHR1cmVzIGJvdW5kIHN1cGVyY2xhc3MgYW5kIHZhcmlhYmxlIHN1cGVyY2xhc3MKCXB1YmxpYyB2b2lkIHRlc3QzMzAoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQgZXh0ZW5kcyBGb28+IHtcbiIgKyAKCQkJCSIJVCBlbGVtZW50O1xuIiArIAoJCQkJIglYKFQgZWxlbWVudCkgeyBcbiIgKyAKCQkJCSIJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7IFxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXN0YXRpYyB2b2lkIGJheihYPD8gZXh0ZW5kcyBGb29CYXI+IHgpIHtcbiIgKyAKCQkJCSIJCXguZWxlbWVudC5mb28oKTtcbiIgKyAKCQkJCSIJCXguZWxlbWVudC5iYXIoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlYPEZvb0Jhcj4geDMgPSBuZXcgWDxGb29CYXI+KG5ldyBGb29CYXIoKSk7XG4iICsgCgkJCQkiCQliYXooeDMpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImludGVyZmFjZSBJQmFyIHtcbiIgKyAKCQkJCSIJdm9pZCBiYXIoKTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgRm9vIHtcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgZm9vKCkge1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludChcIkZPT1wiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBGb29CYXIgZXh0ZW5kcyBGb28gaW1wbGVtZW50cyBJQmFyIHtcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgYmFyKCkge1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludChcIkJBUlwiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJGT09CQVIiKTsKCX0JCQoJLy8gd2lsZGNhcmQgY2FwdHVyZXMgYm91bmQgc3VwZXJjbGFzcyBhbmQgdmFyaWFibGUgc3VwZXJjbGFzcwoJcHVibGljIHZvaWQgdGVzdDMzMSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VCBleHRlbmRzIEZvbz4ge1xuIiArIAoJCQkJIglUIGVsZW1lbnQ7XG4iICsgCgkJCQkiCVgoVCBlbGVtZW50KSB7IFxuIiArIAoJCQkJIgkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsgXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJc3RhdGljIHZvaWQgYmF6KFg8PyBleHRlbmRzIElCYXI+IHgpIHtcbiIgKyAKCQkJCSIJCXguZWxlbWVudC5mb28oKTtcbiIgKyAKCQkJCSIJCXguZWxlbWVudC5iYXIoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlYPEZvb0Jhcj4geDMgPSBuZXcgWDxGb29CYXI+KG5ldyBGb29CYXIoKSk7XG4iICsgCgkJCQkiCQliYXooeDMpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImludGVyZmFjZSBJQmFyIHtcbiIgKyAKCQkJCSIJdm9pZCBiYXIoKTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgRm9vIHtcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgZm9vKCkge1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludChcIkZPT1wiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBGb29CYXIgZXh0ZW5kcyBGb28gaW1wbGVtZW50cyBJQmFyIHtcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgYmFyKCkge1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludChcIkJBUlwiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJGT09CQVIiKTsKCX0JCQoJLy8gd2lsZGNhcmQgY29uc2lkZXJzIGJvdW5kIHN1cGVyY2xhc3Mgb3IgdmFyaWFibGUgc3VwZXJjbGFzcwoJcHVibGljIHZvaWQgdGVzdDMzMigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQgZXh0ZW5kcyBGb28+IHtcbiIgKyAKCQkJCSIJVCBlbGVtZW50O1xuIiArIAoJCQkJIglYKFQgZWxlbWVudCkgeyBcbiIgKyAKCQkJCSIJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7IFxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXN0YXRpYyB2b2lkIGJheihYPD8gZXh0ZW5kcyBJQmFyPiB4KSB7XG4iICsgLy8gY2FwdHVyZXMgRm9vICYgSUJhcgoJCQkJIgkJeC5lbGVtZW50LmZvbygpO1xuIiArIAoJCQkJIgkJeC5lbGVtZW50LmJhcigpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCWJheihuZXcgWDxGb29CYXI+KG5ldyBGb29CYXIoKSkpO1xuIiArIAoJCQkJIgkJYmF6KG5ldyBYPEJhcj4obmV3IEJhcigpKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiaW50ZXJmYWNlIElCYXIge1xuIiArIAoJCQkJIgl2b2lkIGJhcigpO1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBCYXIgaW1wbGVtZW50cyBJQmFyIHtcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgYmFyKCkge1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludChcIkJBUlwiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBGb28ge1xuIiArIAoJCQkJIglwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiRk9PXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIEZvb0JhciBleHRlbmRzIEZvbyBpbXBsZW1lbnRzIElCYXIge1xuIiArIAoJCQkJIglwdWJsaWMgdm9pZCBiYXIoKSB7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiQkFSXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgksCgkJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEyKVxuIiArIAoJCSIJYmF6KG5ldyBYPEJhcj4obmV3IEJhcigpKSk7XG4iICsgCgkJIgkgICAgICAgICAgXl5eXG4iICsgCgkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSBCYXIgaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgRm9vPiBvZiB0aGUgdHlwZSBYPFQ+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy8gcmVjZXZlaXIgZ2VuZXJpYyBjYXN0IG1hdGNoZXMgcmVjZWl2ZXIgdHlwZSAobm90IGRlY2xhcmluZyBjbGFzcykKCXB1YmxpYyB2b2lkIHRlc3QzMzMoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJCSIJVCBlbGVtZW50O1xuIiArIAoJCQkJIglYKFQgZWxlbWVudCkgeyB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OyB9XG4iICsgCgkJCQkiCVQgZWxlbWVudCgpIHsgcmV0dXJuIHRoaXMuZWxlbWVudDsgfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQluZXcgWDxYQj4obmV3IFhCKCkpLmVsZW1lbnQoKS5hZm9vKCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgWEEge1xuIiArIAoJCQkJIgl2b2lkIGFmb28oKSB7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWEIgZXh0ZW5kcyBYQSB7XG4iICsgCgkJCQkiCXZvaWQgYmZvbygpIHt9XG4iICsgCgkJCQkifVxuIgksCgkJCX0sCgkJIlNVQ0NFU1MiKTsKCX0KCS8vIGNoZWNrIGNhbm5vdCBhbGxvY2F0ZSB0eXBlIHBhcmFtZXRlcnMKCXB1YmxpYyB2b2lkIHRlc3QzMzQoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8RT4ge1xuIiArIAoJCQkJIiAgcHVibGljIFgoKSB7XG4iICsgCgkJCQkiICAJbmV3IEUoKTtcbiIgKyAKCQkJCSIgIAluZXcgRSgpIHtcbiIgKyAKCQkJCSIgIAkJdm9pZCBwZXJmb3JtKCkge1xuIiArIAoJCQkJIiAgCQkJcnVuKCk7XG4iICsgCgkJCQkiICAJCX1cbiIgKyAKCQkJCSIgIAl9LnBlcmZvcm0oKTtcbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJbmV3IEUoKTtcbiIgKyAKCQkJIgkgICAgXlxuIiArIAoJCQkiQ2Fubm90IGluc3RhbnRpYXRlIHRoZSB0eXBlIEVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCW5ldyBFKCkge1xuIiArIAoJCQkiICAJCXZvaWQgcGVyZm9ybSgpIHtcbiIgKyAKCQkJIiAgCQkJcnVuKCk7XG4iICsgCgkJCSIgIAkJfVxuIiArIAoJCQkiICAJfS5wZXJmb3JtKCk7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIkNhbm5vdCByZWZlciB0byB0aGUgdHlwZSBwYXJhbWV0ZXIgRSBhcyBhIHN1cGVydHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQoJLy8gdmFyaWF0aW9uIC0gY2hlY2sgY2Fubm90IGFsbG9jYXRlIHR5cGUgcGFyYW1ldGVycwoJcHVibGljIHZvaWQgdGVzdDMzNSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxFIGV4dGVuZHMgU3RyaW5nPiB7XG4iICsgLy8gZmlyc3RCb3VuZCBpcyBjbGFzcywgc3RpbGwgY2Fubm90IGJlIGluc3RhbnRpYXRlZAoJCQkJIiAgcHVibGljIFgoKSB7XG4iICsgCgkJCQkiICAJbmV3IEUoKTtcbiIgKyAKCQkJCSIgIAluZXcgRSgpIHtcbiIgKyAKCQkJCSIgIAkJdm9pZCBwZXJmb3JtKCkge1xuIiArIAoJCQkJIiAgCQkJcnVuKCk7XG4iICsgCgkJCQkiICAJCX1cbiIgKyAKCQkJCSIgIAl9LnBlcmZvcm0oKTtcbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMSlcbiIgKyAKCQkJIglwdWJsaWMgY2xhc3MgWCA8RSBleHRlbmRzIFN0cmluZz4ge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXG4iICsgCgkJCSJUaGUgdHlwZSBwYXJhbWV0ZXIgRSBzaG91bGQgbm90IGJlIGJvdW5kZWQgYnkgdGhlIGZpbmFsIHR5cGUgU3RyaW5nLiBGaW5hbCB0eXBlcyBjYW5ub3QgYmUgZnVydGhlciBleHRlbmRlZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJbmV3IEUoKTtcbiIgKyAKCQkJIgkgICAgXlxuIiArIAoJCQkiQ2Fubm90IGluc3RhbnRpYXRlIHRoZSB0eXBlIEVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCW5ldyBFKCkge1xuIiArIAoJCQkiICAJCXZvaWQgcGVyZm9ybSgpIHtcbiIgKyAKCQkJIiAgCQkJcnVuKCk7XG4iICsgCgkJCSIgIAkJfVxuIiArIAoJCQkiICAJfS5wZXJmb3JtKCk7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIkNhbm5vdCByZWZlciB0byB0aGUgdHlwZSBwYXJhbWV0ZXIgRSBhcyBhIHN1cGVydHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQ2NjkKCXB1YmxpYyB2b2lkIHRlc3QzMzYoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbnRlcmZhY2UgSU15SW50ZXJmYWNlIHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgTXlDbGFzcyA8VHlwZT4ge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgPFR5cGU+IFR5cGUgbXlNZXRob2QoT2JqZWN0IG9iaiwgQ2xhc3MgdHlwZSkge1xuIiArIAoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyA8VHlwZT4gVHlwZSBteVN0YXRpY01ldGhvZChPYmplY3Qgb2JqLCBDbGFzcyB0eXBlKSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBJTXlJbnRlcmZhY2UgZ2V0VGhpcygpIHtcbiIgKyAKCQkJCSIJCWlmICh0cnVlKVxuIiArIAoJCQkJIgkJCXJldHVybiBuZXcgTXlDbGFzcygpLm15TWV0aG9kKHRoaXMsIElNeUludGVyZmFjZS5jbGFzcyk7XG4iICsgCgkJCQkiCQllbHNlXG4iICsgCgkJCQkiCQkJcmV0dXJuIE15Q2xhc3MubXlTdGF0aWNNZXRob2QodGhpcywgSU15SW50ZXJmYWNlLmNsYXNzKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTUpXG4iICsgCgkJCSIJcmV0dXJuIG5ldyBNeUNsYXNzKCkubXlNZXRob2QodGhpcywgSU15SW50ZXJmYWNlLmNsYXNzKTtcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIE9iamVjdCB0byBJTXlJbnRlcmZhY2VcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc3MDc4CglwdWJsaWMgdm9pZCB0ZXN0MzM3KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLlZlY3RvcjtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKyAKCQkJCSIgICAgICAgIFZlY3RvcjxPYmplY3Q+IG9iamVjdFZlY3RvciA9IG5ldyBWZWN0b3I8T2JqZWN0PigpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBiYXIoKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIGJheih0aGlzKTsgLyogRVJST1IgKi9cbiIgKyAKCQkJCSIgICAgICAgICAgICB9XG4iICsgCgkJCQkiICAgICAgICB9O1xuIiArIAoJCQkJIiAgICAgICAgYmF6KG9iamVjdFZlY3Rvcik7XG4iICsgCgkJCQkiICAgICAgICBiYXoobmV3IFZlY3RvcjxPYmplY3Q+KCkpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyB2b2lkIGJheihWZWN0b3I8Pz4gbXlzdGVyeVZlY3RvcikgeyB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIiIpOwoJfQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NzA1MgoJcHVibGljIHZvaWQgdGVzdDMzOCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW50ZXJmYWNlIE08WD4geyB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgTjxDPiB7IFxuIiArIAoJCQkJIiAgTTxOPEM+PiBwbmkgPSBudWxsO1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWDxJPiB7XG4iICsgCgkJCQkiICBOPEk+IHZhcjEgPSBudWxsO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIiAgTTxOPEk+PiB2YXIyID0gdmFyMS5wbmk7XG4iICsgCgkJCQkiICAvLyBBYm92ZSBsaW5lIHJlcG9ydHMgYXMgZXJyb3IgaW4gRWNsaXBzZS4gXG4iICsgCgkJCQkiICAvLyBcInZhcjJcIiBpcyB1bmRlcmxpbmVkIGFuZCB0aGUgZXJyb3IgbWVzc2FnZSBpczogXG4iICsgCgkJCQkiICAvLyBUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIE08TjxDPj4gdG8gTTxOPEk+PlxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NzA1MiAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDMzOSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjtcbiIgKyAKCQkJCSJpbXBvcnQgamF2YS51dGlsLlNldDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBYIDxLLCBWPiB7XG4iICsgCgkJCQkiCXN0YXRpYyBjbGFzcyBFbnRyeTxLLCBWPiB7fVxuIiArIAoJCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKCQkJCSIJCUl0ZXJhdG9yPEVudHJ5PEssVj4+IGkgPSBlbnRyeVNldCgpLml0ZXJhdG9yKCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJU2V0PEVudHJ5PEssVj4+IGVudHJ5U2V0KCkJIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiIik7Cgl9CQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NjMxMwoJcHVibGljIHZvaWQgdGVzdDM0MCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIglwcml2YXRlIFQgZGF0YTtcbiIgKyAKCQkJCSIJcHJpdmF0ZSBYKFQgZGF0YSl7IHRoaXMuZGF0YT1kYXRhOyB9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgPFM+IFg8Uz4gY3JlYXRlT2JqZWN0KFMgZGF0YSl7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oZGF0YSk7XG4iICsgCgkJCQkiCQlyZXR1cm4gbmV3IFg8Uz4oZGF0YSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJWDxTdHJpbmc+IHJlcz1YLmNyZWF0ZU9iamVjdChcIkhhbGxvXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIkhhbGxvIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzcxMTgKCXB1YmxpYyB2b2lkIHRlc3QzNDEoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJcHVibGljIE9iamVjdCBnZXRJdGVtKCkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkJIn1cbiIsCgkJCQkiWS5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWSBleHRlbmRzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgU3RyaW5nIGdldEl0ZW0oKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkifVxuIiwKCQkJCSJaLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBaIGV4dGVuZHMgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyBDb21wYXJhYmxlIGdldEl0ZW0oKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIiIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc3MTQyIC0gY2hlY2sgbm8gcmF3IHVuc2FmZSB3YXJuaW5nIGlzIGlzc3VlZCB3aGVuIGFjY2Vzc2luZyBnZW5lcmljIG1ldGhvZCBmcm9tIHJhdyB0eXBlCglwdWJsaWMgdm9pZCB0ZXN0MzQyKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlRlc3QuamF2YSIsCgkJCQkiY2xhc3MgTXlDbGFzczxUPiB7XG4iICsgCgkJCQkiCQkgXG4iICsgCgkJCQkiCQkgcHJpdmF0ZSBUIHRoaW5nO1xuIiArIAoJCQkJIiAgICAgICB7IFpvcmsgejsgfVxuIiArCgkJCQkiCQkgXG4iICsgCgkJCQkiCQkgcHVibGljXG4iICsgCgkJCQkiCQkgTXlDbGFzcyhUIHRoaW5nKSB7XG4iICsgCgkJCQkiCQkgCQkgdGhpcy50aGluZyA9IHRoaW5nO1xuIiArIAoJCQkJIgkJIH1cbiIgKyAKCQkJCSIJCSBcbiIgKyAKCQkJCSIJCSBwdWJsaWMgc3RhdGljIDxVPiBNeUNsYXNzPFU+XG4iICsgCgkJCQkiCQkgZmFjdG9yeU1ha2VNeUNsYXNzKFUgdGhpbmcpCQkge1xuIiArIAoJCQkJIgkJIAkJIHJldHVybiBuZXcgTXlDbGFzczxVPih0aGluZyk7XG4iICsgCgkJCQkiCQkgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBFeHRlcm5hbCB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCQkgcHVibGljIHN0YXRpYyA8VT4gTXlDbGFzczxVPlxuIiArIAoJCQkJIgkJIGZhY3RvcnlNYWtlTXlDbGFzcyhVIHRoaW5nKQkJIHtcbiIgKyAKCQkJCSIJCSAJCSByZXR1cm4gbmV3IE15Q2xhc3M8VT4odGhpbmcpO1xuIiArIAoJCQkJIgkJIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFRlc3Qge1xuIiArIAoJCQkJIgkJIHB1YmxpYyBzdGF0aWMgdm9pZFxuIiArIAoJCQkJIgkJIHRlc3QoKVxuIiArIAoJCQkJIgkJIHtcbiIgKyAKCQkJCSIJCSAJCSAvLyBObyBwcm9ibGVtIHdpdGggdGhpcyBsaW5lOlxuIiArIAoJCQkJIgkJIAkJIE15Q2xhc3M8U3RyaW5nPiBmb28gPSBFeHRlcm5hbC5mYWN0b3J5TWFrZU15Q2xhc3MoXCJoaVwiKTtcbiIgKyAKCQkJCSIJCSAJCSBcbiIgKyAKCQkJCSIJCSAJCSAvLyBUaGlzIGxpbmUgZ2l2ZXMgbWUgYW4gZXJyb3I6XG4iICsgCgkJCQkiCQkgCQkgLy8gVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBNeUNsYXNzPE9iamVjdD4gdG8gTXlDbGFzczxTdHJpbmc+XG4iICsgCgkJCQkiCQkgCQkgTXlDbGFzczxTdHJpbmc+IGJhciA9IE15Q2xhc3MuZmFjdG9yeU1ha2VNeUNsYXNzKFwiaGlcIik7XG4iICsgCgkJCQkiCQkgCQkgTXlDbGFzczxTdHJpbmc+IGJhcjIgPSBNeUNsYXNzLjxTdHJpbmc+ZmFjdG9yeU1ha2VNeUNsYXNzKFwiaGlcIik7XG4iICsgCgkJCQkiCQkgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBUZXN0LmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkJIgl7IFpvcmsgejsgfVxuIiArIAoJCQkiCSAgXl5eXlxuIiArIAoJCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NDU4OAoJcHVibGljIHZvaWQgdGVzdDM0MygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VCBleHRlbmRzIE51bWJlcj4ge1xuIiArIAoJCQkJIiAgICBUIG07XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICAgIGNsYXNzIFk8VD4ge1xuIiArIAoJCQkJIiAgICAgICAgdm9pZCB0ZXN0KCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgIG5ldyBZPEludGVnZXI+KCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICB2b2lkIHRlc3QoKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWC50aGlzLm0pO1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICB9XG4iICsgCgkJCQkiICAgICAgICAgICAgfS50ZXN0KCk7XG4iICsgCgkJCQkiICAgICAgICB9XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iLAoJCQl9LAoJCQkiIik7Cgl9CgkvLyBjaGVja2luZyBzY2VuYXJpbyB3aGVyZSBnZW5lcmljIHR5cGUgYW5kIG1ldGhvZCBzaGFyZSB0aGUgc2FtZSB0eXBlIHBhcmFtZXRlciBuYW1lCglwdWJsaWMgdm9pZCB0ZXN0MzQ0KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewkKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYPFQgZXh0ZW5kcyBSdW5uYWJsZT4ge1xuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJcHVibGljIGFic3RyYWN0IDxUIGV4dGVuZHMgRXhjZXB0aW9uPiBUIGJhcihUIHQpO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIglzdGF0aWMgdm9pZCBmb28oWCB4KSB7XG4iICsgCgkJCQkiCQl4LjxFeGNlcHRpb24+YmFyKG51bGwpO1xuIiArIAoJCQkJIgkJXG4iICsgCgkJCQkiCQljbGFzcyBSIGltcGxlbWVudHMgUnVubmFibGUge1xuIiArIAoJCQkJIgkJCXB1YmxpYyB2b2lkIHJ1bigpIHtcbiIgKyAKCQkJCSIJCQl9XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCQlYPFI+IHhyID0gbmV3IFg8Uj4oKXsgIFxuIiArIAoJCQkJIgkJCXB1YmxpYyA8VD4gVCBiYXIoVCB0KSB7IFxuIiArIAoJCQkJIgkJCQlyZXR1cm4gdDsgXG4iICsgCgkJCQkiCQkJfVxuIiArIAoJCQkJIgkJfTtcbiIgKyAKCQkJCSIJCUlPRXhjZXB0aW9uIGUgPSB4ci5iYXIobmV3IElPRXhjZXB0aW9uKCkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgkJCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIgl4LjxFeGNlcHRpb24+YmFyKG51bGwpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICBeXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgYmFyKEV4Y2VwdGlvbikgb2YgcmF3IHR5cGUgWCBpcyBubyBsb25nZXIgZ2VuZXJpYzsgaXQgY2Fubm90IGJlIHBhcmFtZXRlcml6ZWQgd2l0aCBhcmd1bWVudHMgPEV4Y2VwdGlvbj5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxNClcbiIgKyAKCQkJIglYPFI+IHhyID0gbmV3IFg8Uj4oKXsgIFxuIiArIAoJCQkiCSAgICAgICAgICAgICAgXl5eXl5eXG4iICsgCgkJCSJUaGUgdHlwZSBuZXcgWDxSPigpe30gbXVzdCBpbXBsZW1lbnQgdGhlIGluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2QgWDxSPi5iYXIoVClcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc0NTk0CglwdWJsaWMgdm9pZCB0ZXN0MzQ1KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHtcbiIgKyAKCQkJCSIgICAgICAgWDE8SW50ZWdlcj4gbzEgPSBuZXcgWDE8SW50ZWdlcj4oKTtcbiIgKyAKCQkJCSIgICAgICAgICgoSjxJbnRlZ2VyPilvMSkuZ2V0KCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgWDE8VD4gaW1wbGVtZW50cyBJPFQ+IHtcbiIgKyAKCQkJCSIgICAgcHVibGljIFgxIGdldCgpIHtcbiIgKyAKCQkJCSIgICAgCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gdGhpcztcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJpbnRlcmZhY2UgSTxUPiBleHRlbmRzIEo8VD4ge1xuIiArIAoJCQkJIiAgICBJIGdldCgpO1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJpbnRlcmZhY2UgSjxUPiAge1xuIiArIAoJCQkJIiAgICBKIGdldCgpO1xuIiArIAoJCQkJIn0iLAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NDU5NAoJcHVibGljIHZvaWQgdGVzdDM0NigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7XG4iICsgCgkJCQkiICAgICAgIFgxPEludGVnZXI+IG8xID0gbmV3IFgxPEludGVnZXI+KG5ldyBJbnRlZ2VyKDQpKTtcbiIgKyAKCQkJCSIgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihvMS5nZXQoKS50KTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBYMTxUPiBpbXBsZW1lbnRzIEk8VD4ge1xuIiArIAoJCQkJIiAgICBUIHQ7XG4iICsgCgkJCQkiICAgIFgxKFQgYXJnKSB7XG4iICsgCgkJCQkiICAgICAgICB0ID0gYXJnO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBYMSBnZXQoKSB7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gdGhpcztcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJpbnRlcmZhY2UgSTxUPiBleHRlbmRzIEo8VD4ge1xuIiArIAoJCQkJIiAgICBJIGdldCgpO1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJpbnRlcmZhY2UgSjxUPiAge1xuIiArIAoJCQkJIiAgICBKIGdldCgpO1xuIiArIAoJCQkJIn0iCgksCgkJCX0sCgkJCSI0Iik7Cgl9CQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc0NTk0CglwdWJsaWMgdm9pZCB0ZXN0MzQ3KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHtcbiIgKyAKCQkJCSIgICAgICAgIFgxPEludGVnZXI+IG8gPSBuZXcgWDE8SW50ZWdlcj4obmV3IEludGVnZXIoNCkpO1xuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG8uZ2V0KCkudCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgWDE8VD4gaW1wbGVtZW50cyBJPFQ+IHtcbiIgKyAKCQkJCSIgICAgVCB0O1xuIiArIAoJCQkJIiAgICBYMShUIGFyZykge1xuIiArIAoJCQkJIiAgICAgICAgdCA9IGFyZztcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgWDEgZ2V0KCkge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIHRoaXM7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9ICAgIFxuIiArIAoJCQkJIlxuIiArIAoJCQkJImludGVyZmFjZSBJPFQ+IGV4dGVuZHMgSzxUPiwgTDxUPiB7XG4iICsgCgkJCQkiICAgIEkgZ2V0KCk7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImludGVyZmFjZSBKPFQ+ICB7XG4iICsgCgkJCQkiICAgIEogZ2V0KCk7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImludGVyZmFjZSBLPFQ+IGV4dGVuZHMgSjxUPiB7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImludGVyZmFjZSBMPFQ+ICB7XG4iICsgCgkJCQkiICAgIEsgZ2V0KCk7XG4iICsgCgkJCQkifSIsCgkJCX0sCgkJCSI0Iik7Cgl9CQoJLy8gY2hlY2tpbmcgc2NlbmFyaW8gd2hlcmUgZ2VuZXJpYyB0eXBlIGFuZCBtZXRob2Qgc2hhcmUgdGhlIHNhbWUgdHlwZSBwYXJhbWV0ZXIgbmFtZQoJcHVibGljIHZvaWQgdGVzdDM0OCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsJCgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjtcbiIgKyAKCQkJCSJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWDxUIGV4dGVuZHMgUnVubmFibGU+IHtcbiIgKyAKCQkJCSIJcHVibGljIGFic3RyYWN0IDxUIGV4dGVuZHMgRXhjZXB0aW9uPiBUIGJhcihUIHQpO1xuIiArIAoJCQkJIglzdGF0aWMgdm9pZCBmb28oWCB4KSB7XG4iICsgCgkJCQkiCQl4LjxFeGNlcHRpb24+YmFyKG51bGwpO1xuIiArIAoJCQkJIgkJY2xhc3MgUiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHtcbiIgKyAKCQkJCSIJCQlwdWJsaWMgdm9pZCBydW4oKSB7fVxuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgkJWDxSPiB4ciA9IG5ldyBYPFI+KCl7ICBcbiIgKyAKCQkJCSIJCQlwdWJsaWMgPFQgZXh0ZW5kcyBFeGNlcHRpb24+IFQgYmFyKFQgdCkgeyByZXR1cm4gdDsgfVxuIiArIAoJCQkJIgkJfTtcbiIgKyAKCQkJCSIJCUlPRXhjZXB0aW9uIGUgPSB4ci5iYXIobmV3IElPRXhjZXB0aW9uKCkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgkJCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIgl4LjxFeGNlcHRpb24+YmFyKG51bGwpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICBeXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgYmFyKEV4Y2VwdGlvbikgb2YgcmF3IHR5cGUgWCBpcyBubyBsb25nZXIgZ2VuZXJpYzsgaXQgY2Fubm90IGJlIHBhcmFtZXRlcml6ZWQgd2l0aCBhcmd1bWVudHMgPEV4Y2VwdGlvbj5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEwKVxuIiArIAoJCQkiCXB1YmxpYyA8VCBleHRlbmRzIEV4Y2VwdGlvbj4gVCBiYXIoVCB0KSB7IHJldHVybiB0OyB9XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGJhcihUKSBvZiB0eXBlIG5ldyBYPFI+KCl7fSBzaG91bGQgYmUgdGFnZ2VkIHdpdGggQE92ZXJyaWRlIHNpbmNlIGl0IGFjdHVhbGx5IG92ZXJyaWRlcyBhIHN1cGVyY2xhc3MgbWV0aG9kXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCgkvLyB0ZXN0IHdpbGRjYXJkIGNvbXBhdGliaWxpdGllcwoJcHVibGljIHZvaWQgdGVzdDM0OSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIglUIGVsZW1lbnQ7XG4iICsgCgkJCQkiCXN0YXRpYyB2b2lkIGZvbyhYPD8gc3VwZXIgRXhjZXB0aW9uPiBvdXQsIFgxPD8gZXh0ZW5kcyBFeGNlcHRpb24+IGluKSB7XG4iICsgCgkJCQkiCQlvdXQuZWxlbWVudCA9IGluLmVsZW1lbnQ7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAkJCQkKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWDE8VT57XG4iICsgCgkJCQkiCVUgZWxlbWVudDtcbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQoJLy8gdGVzdCB3aWxkY2FyZCBjb21wYXRpYmlsaXRpZXMKCXB1YmxpYyB2b2lkIHRlc3QzNTAoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPiB7XG4iICsgCgkJCQkiCVQgZWxlbWVudDtcbiIgKyAKCQkJCSIJc3RhdGljIHZvaWQgZm9vKFg8Pz4gb3V0LCBYMTw/PiBpbikge1xuIiArIAoJCQkJIgkJb3V0LmVsZW1lbnQgPSBpbi5lbGVtZW50O1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIFgxPFU+e1xuIiArIAoJCQkJIglVIGVsZW1lbnQ7XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCW91dC5lbGVtZW50ID0gaW4uZWxlbWVudDtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgIF5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gY2FwdHVyZS1vZiA/IHRvIGNhcHR1cmUtb2YgP1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzUzMjgKCXB1YmxpYyB2b2lkIHRlc3QzNTEoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImludGVyZmFjZSBJbnRmPEQgZXh0ZW5kcyBDb21wYXJhYmxlPEQ+LCBJIGV4dGVuZHMgQ29tcGFyYWJsZTxEPj4geyBcbiIgKyAKCQkJCSIgIHB1YmxpYyB2b2lkIGYoSW50ZjxELD8+IHZhbCk7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIDxNIGV4dGVuZHMgQ29tcGFyYWJsZTxNPiwgUCBleHRlbmRzIENvbXBhcmFibGU8TT4+ICBpbXBsZW1lbnRzIEludGY8TSxQPiB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICBwdWJsaWMgdm9pZCBmKEludGY8TSw/PiB2YWwpIHsgfSBcbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiIik7Cgl9CQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc3MDUxCglwdWJsaWMgdm9pZCB0ZXN0MzUyKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbnRlcmZhY2UgQzxBPiB7IH1cbiIgKyAKCQkJCSJpbnRlcmZhY2UgUEM8WD4gZXh0ZW5kcyBDPFg+IHsgfSBcbiIgKyAKCQkJCSJpbnRlcmZhY2UgUE88WT4gIHsgIFxuIiArIAoJCQkJIgkgIEM8WT4gcHJvYzEoKTtcbiIgKyAKCQkJCSIJICBDPD8gc3VwZXIgWT4gcHJvYzIoKTtcbiIgKyAKCQkJCSIJICBDPD8gZXh0ZW5kcyBZPiBwcm9jMygpO1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJhYnN0cmFjdCBjbGFzcyBYPFo+IGltcGxlbWVudHMgUE88Wj4ge1xuIiArIAoJCQkJIgkgIHB1YmxpYyBDPFo+IHByb2MxKCkgeyByZXR1cm4gcmVzdWx0MTsgfVxuIiArIAoJCQkJIgkgIHByaXZhdGUgZmluYWwgUEM8Wj4gcmVzdWx0MSA9IG51bGw7XG4iICsgCgkJCQkiCSAgcHVibGljIEM8PyBzdXBlciBaPiBwcm9jMigpIHsgcmV0dXJuIHJlc3VsdDI7IH1cbiIgKyAKCQkJCSIJICBwcml2YXRlIGZpbmFsIFBDPD8gc3VwZXIgWj4gcmVzdWx0MiA9IG51bGw7XG4iICsgCgkJCQkiCSAgcHVibGljIEM8PyBleHRlbmRzIFo+IHByb2MzKCkgeyByZXR1cm4gcmVzdWx0MzsgfVxuIiArIAoJCQkJIgkgIHByaXZhdGUgZmluYWwgUEM8PyBleHRlbmRzIFo+IHJlc3VsdDMgPSBudWxsO1xuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDM1MygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBZIHtcbiIgKyAKCQkJCSIJPFQ+IFQgZm9vKENsYXNzPFQ+IGMpIHsgcmV0dXJuIG51bGw7IH1cbiIgKwoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBZIHtcbiIgKyAKCQkJCSIJPFQ+IFQgZm9vKENsYXNzPFQ+IGMpIHsgcmV0dXJuIG51bGw7IH1cbiIgKwoJCQkJIn0iCgkJCX0sCgkJCSIiKTsJCgl9CQkKCXB1YmxpYyB2b2lkIHRlc3QzNTQoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgWSB7XG4iICsgCgkJCQkiCTxULCBTPiBTIGZvbyhDbGFzczxUPiBjKSB7IHJldHVybiBudWxsOyB9XG4iICsKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWSB7XG4iICsgCgkJCQkiCTxTLCBUPiBUIGZvbyhDbGFzczxTPiBjKSB7IHJldHVybiBudWxsOyB9XG4iICsKCQkJCSJ9IgoJCQl9LAoJCQkiIik7Cgl9CQkKCXB1YmxpYyB2b2lkIHRlc3QzNTUoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIFkge1xuIiArIAoJCQkJIgk8VCwgUz4gUyBmb28oQ2xhc3M8Uz4gYykgeyByZXR1cm4gbnVsbDsgfVxuIiArCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIFkge1xuIiArIAoJCQkJIgk8UywgVD4gUyBmb28oQ2xhc3M8Uz4gYykgeyByZXR1cm4gbnVsbDsgfVxuIiArCgkJCQkifSIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyKVxyXG4iICsgCgkJCSIJPFQsIFM+IFMgZm9vKENsYXNzPFM+IGMpIHsgcmV0dXJuIG51bGw7IH1cclxuIiArIAoJCQkiCSAgICAgICAgIF5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiTmFtZSBjbGFzaDogVGhlIG1ldGhvZCBmb28oQ2xhc3M8Uz4pIG9mIHR5cGUgWCBoYXMgdGhlIHNhbWUgZXJhc3VyZSBhcyBmb28oQ2xhc3M8Uz4pIG9mIHR5cGUgWSBidXQgZG9lcyBub3Qgb3ZlcnJpZGUgaXRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCglwdWJsaWMgdm9pZCB0ZXN0MzU2KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBZIHtcbiIgKyAKCQkJCSIJPFQsIFM+IFQgZm9vKENsYXNzPFQ+IGMpIHsgcmV0dXJuIG51bGw7IH1cbiIgKwoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBZIHtcbiIgKyAKCQkJCSIJPFQ+IFQgZm9vKENsYXNzPFQ+IGMpIHsgcmV0dXJuIG51bGw7IH1cbiIgKwoJCQkJIn0iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMilcclxuIiArIAoJCQkiCTxULCBTPiBUIGZvbyhDbGFzczxUPiBjKSB7IHJldHVybiBudWxsOyB9XHJcbiIgKyAKCQkJIgkgICAgICAgICBeXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIk5hbWUgY2xhc2g6IFRoZSBtZXRob2QgZm9vKENsYXNzPFQ+KSBvZiB0eXBlIFggaGFzIHRoZSBzYW1lIGVyYXN1cmUgYXMgZm9vKENsYXNzPFQ+KSBvZiB0eXBlIFkgYnV0IGRvZXMgbm90IG92ZXJyaWRlIGl0XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDM1NygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgWSB7XG4iICsgCgkJCQkiCTxUPiBUIGZvbyhDbGFzczxUPiBjKSB7IHJldHVybiBudWxsOyB9XG4iICsKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWSB7XG4iICsgCgkJCQkiCTxULCBTPiBUIGZvbyhDbGFzczxUPiBjKSB7IHJldHVybiBudWxsOyB9XG4iICsKCQkJCSJ9IgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDIpXHJcbiIgKyAKCQkJIgk8VD4gVCBmb28oQ2xhc3M8VD4gYykgeyByZXR1cm4gbnVsbDsgfVxyXG4iICsgCgkJCSIJICAgICAgXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJOYW1lIGNsYXNoOiBUaGUgbWV0aG9kIGZvbyhDbGFzczxUPikgb2YgdHlwZSBYIGhhcyB0aGUgc2FtZSBlcmFzdXJlIGFzIGZvbyhDbGFzczxUPikgb2YgdHlwZSBZIGJ1dCBkb2VzIG5vdCBvdmVycmlkZSBpdFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzY3MjAKCXB1YmxpYyB2b2lkIHRlc3QzNTgoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJNeUNsYXNzLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBNeUNsYXNzIHt9XG4iLAoJCQkJIkEuamF2YSIsCgkJCQkicHVibGljIGludGVyZmFjZSBBPE0gZXh0ZW5kcyBNeUNsYXNzPiB7fVxuIiwKCQkJCSJCLmphdmEiLAoJCQkJInB1YmxpYyBpbnRlcmZhY2UgQjxNIGV4dGVuZHMgTXlDbGFzcz4gZXh0ZW5kcyBBPE0+IHt9XG4iLAoJCQkJIkMuamF2YSIsCgkJCQkicHVibGljIGNsYXNzIEMgaW1wbGVtZW50cyBCPE15Q2xhc3M+IHt9XG4iLCAvLyBjb21waWxlIGFnYWluc3Qgc291cmNlcwoJCQkJIkQuamF2YSIsCgkJCQkicHVibGljIGNsYXNzIEQgaW1wbGVtZW50cyBBPE15Q2xhc3M+e31cbiIsIC8vIGNvbXBpbGUgYWdhaW5zdCBzb3VyY2VzCgkJCX0sCgkJCSIiKTsKCQkvLyBjb21waWxlIGFnYWluc3QgZ2VuZXJhdGVkIGJpbmFyaWVzCgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJDLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBDIGltcGxlbWVudHMgQjxNeUNsYXNzPiB7fVxuIiwKCQkJCSJELmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBEIGltcGxlbWVudHMgQTxNeUNsYXNzPnt9XG4iLAoJCQl9LAoJCQkiIiwKCQkJbnVsbCwKCQkJZmFsc2UsCgkJCW51bGwpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc2NzkwCglwdWJsaWMgdm9pZCB0ZXN0MzU5KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCQkiICAgIGNsYXNzIExpc3QxPEU+IGV4dGVuZHMgTGlua2VkTGlzdDxFPiB7fTtcbiIgKyAKCQkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkJIiAgICAgICAgTWFwPFN0cmluZywgTGlzdDxJbnRlZ2VyPj4geCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxJbnRlZ2VyPj4oKTtcbiIgKyAKCQkJCQkiICAgICAgICBNYXA8U3RyaW5nLCBMaXN0MTxJbnRlZ2VyPj4gbSA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDE8SW50ZWdlcj4+KCk7XG4iICsgCgkJCQkJIiAgICB9XG4iICsgCgkJCQkJIn0iCgkJCX0KCQkpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc2Nzg2CglwdWJsaWMgdm9pZCB0ZXN0MzYwKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiVGVzdC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS5sYW5nLkNvbXBhcmFibGU7XG4iICsgCgkJCQkJInB1YmxpYyBjbGFzcyBUZXN0IHtcbiIgKyAKCQkJCQkiICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFg8VDEsIFQyPiBpbXBsZW1lbnRzIENvbXBhcmFibGU8WDxUMSwgVDI+PiB7XG4iICsgCgkJCQkJIiAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oWDxUMSwgVDI+IGFyZzApIHsgcmV0dXJuIDA7IH1cbiIgKyAKCQkJCQkiICAgIH07XG4iICsgCgkJCQkJIiAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBZPFQxLCBUMj4ge307XG4iICsgCgkJCQkJIiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBaPFQxLCBUMj4gZXh0ZW5kcyBZPFQxLCBUMj4gaW1wbGVtZW50cyBDb21wYXJhYmxlPFo8VDEsIFQyPj4ge1xuIiArIAoJCQkJCSIgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKFo8VDEsIFQyPiBhcmcwKSB7IHJldHVybiAwOyB9XG4iICsgCgkJCQkJIiAgICB9O1xuIiArIAoJCQkJCSIgICAgcHVibGljIHN0YXRpYyA8VD4gdm9pZCBkb1NvbWV0aGluZyhDb21wYXJhYmxlPD8gc3VwZXIgVD4gYSwgQ29tcGFyYWJsZTw/IHN1cGVyIFQ+IGIpIHt9XG4iICsgCgkJCQkJIiAgICBwdWJsaWMgc3RhdGljIDxWMSwgVjI+IHZvaWQgZG9Tb21ldGhpbmdFbHNlKFo8VjEsIFYyPiBhLCBaPFYxLCBWMj4gYikge1xuIiArIAoJCQkJCSIgICAgICAgIGRvU29tZXRoaW5nKGEsIGIpO1xuIiArIAoJCQkJCSIgICAgfVxuIiArIAoJCQkJCSIgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVyB7IH07XG4iICsgCgkJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkJIiAgICAgICAgZG9Tb21ldGhpbmcobmV3IFg8SW50ZWdlciwgU3RyaW5nPigpLCBuZXcgWDxJbnRlZ2VyLCBTdHJpbmc+KCkpO1xuIiArIAoJCQkJCSIgICAgICAgIGRvU29tZXRoaW5nKG5ldyBaPEludGVnZXIsIFN0cmluZz4oKSwgbmV3IFo8SW50ZWdlciwgU3RyaW5nPigpKTtcbiIgKyAKCQkJCQkiICAgICAgICBkb1NvbWV0aGluZ0Vsc2UobmV3IFo8SW50ZWdlciwgU3RyaW5nPigpLCBuZXcgWjxJbnRlZ2VyLCBTdHJpbmc+KCkpO1xuIiArIAoJCQkJCSIgICAgICAgIGRvU29tZXRoaW5nRWxzZShuZXcgWjxXLCBTdHJpbmc+KCksIG5ldyBaPFcsIFN0cmluZz4oKSk7XG4iICsgCgkJCQkJIiAgICAgICAgLy8gVGhlIG5leHQgbGluZSB3b25cJ3QgY29tcGlsZS4gIEl0XCdzIHRoZSBnZW5lcmljPGdlbmVyaWMgd2hpY2ggc2VlbXNcbiIgKyAKCQkJCQkiICAgICAgICAvLyB0byBiZSB0aGUgcHJvYmxlbVxuIiArIAoJCQkJCSIgICAgICAgIGRvU29tZXRoaW5nRWxzZShuZXcgWjxYPFcsIFc+LCBTdHJpbmc+KCksIG5ldyBaPFg8VywgVz4sIFN0cmluZz4oKSk7XG4iICsgCgkJCQkJIiAgICB9XG4iICsgCgkJCQkJIn0iCgkJCX0KCQkpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc1NTI1CglwdWJsaWMgdm9pZCB0ZXN0MzYxKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiVGVzdC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0U2V0O1xuIiArIAoJCQkJCSJpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yO1xuIiArIAoJCQkJCSJpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTtcbiIgKyAKCQkJCQkicHVibGljIGNsYXNzIFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNldDxFbnRyeTxTdHJpbmcsSW50ZWdlcj4+IHtcbiIgKyAKCQkJCQkiCXB1YmxpYyBJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIEludGVnZXI+PiBpdGVyYXRvcigpIHtcbiIgKyAKCQkJCQkiCQlyZXR1cm4gbmV3IEl0ZXJhdG9yPEVudHJ5PFN0cmluZyxJbnRlZ2VyPj4oKSB7XG4iICsgCgkJCQkJIgkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7cmV0dXJuIGZhbHNlO31cbiIgKyAKCQkJCQkiCQkJcHVibGljIEVudHJ5PFN0cmluZywgSW50ZWdlcj4gbmV4dCgpIHtyZXR1cm4gbnVsbDt9XG4iICsgCgkJCQkJIgkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHt9CVxuIiArIAoJCQkJCSIJCX07XG4iICsgCgkJCQkJIgl9XG4iICsgCgkJCQkJIglwdWJsaWMgaW50IHNpemUoKSB7cmV0dXJuIDA7fVxuIiArIAoJCQkJCSJ9IgoJCQl9CgkJKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MjY0MwoJcHVibGljIHZvaWQgdGVzdDM2MigpIHsKCQlNYXAgY3VzdG9tT3B0aW9ucz0gZ2V0Q29tcGlsZXJPcHRpb25zKCk7CgkJY3VzdG9tT3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRQcml2YXRlTWVtYmVyLCBDb21waWxlck9wdGlvbnMuRVJST1IpOwoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiVGVzdC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDtcbiIgKyAKCQkJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkJCSJwdWJsaWMgY2xhc3MgVGVzdCB7XG4iICsgCgkJCQkJIiAgIHB1YmxpYyB2b2lkIGEoKSB7XG4iICsgCgkJCQkJIiAgICAgIExpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpO1xuIiArIAoJCQkJCSIgICAgICBMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTtcbiIgKyAKCQkJCQkiICAgICAgY29tcGFyZShsaXN0MSwgbGlzdDIpO1xuIiArIAoJCQkJCSIgICB9XG4iICsgCgkJCQkJIiAgIHByaXZhdGUgPEU+IHZvaWQgY29tcGFyZShMaXN0PEU+IGxpc3QxLCBMaXN0PEU+IGxpc3QyKSB7XG4iICsgCgkJCQkJIiAgICAgIC8vIGRvIHNvbWUgY29tcGFyaW5nIGxvZ2ljLi4uXG4iICsgCgkJCQkJIiAgIH1cbiIgKyAKCQkJCQkifVxuIiArIAoJCQkJCSJcbiIKCQkJfSwKCQkiIiwKCQludWxsLAoJCXRydWUsCgkJbnVsbCwKCQljdXN0b21PcHRpb25zLAoJCW51bGwvKm5vIGN1c3RvbSByZXF1ZXN0b3IqLyk7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzY0MzQKCXB1YmxpYyB2b2lkIHRlc3QzNjMoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLk1hcDtcbiIgKyAKCQkJCSJpbXBvcnQgamF2YS51dGlsLlNldDtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICBTZXQ8TWFwLkVudHJ5PEludGVnZXIsID8+PiBtX3ZhbHVlcztcbiIgKyAKCQkJCSIgIFgoTWFwPEludGVnZXIsID8+IHZhbHVlcykge1xuIiArIAoJCQkJIiAgICBtX3ZhbHVlcyA9IHZhbHVlcy5lbnRyeVNldCgpO1xuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCQkiCW1fdmFsdWVzID0gdmFsdWVzLmVudHJ5U2V0KCk7XG4iICsgCgkJCSIJICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBTZXQ8TWFwLkVudHJ5PEludGVnZXIsY2FwdHVyZS1vZiA/Pj4gdG8gU2V0PE1hcC5FbnRyeTxJbnRlZ2VyLD8+PlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQoJLy8gY2hlY2sgcGFyYW0gdHlwZSBlcXVpdmFsZW5jZXMKCXB1YmxpYyB2b2lkIHRlc3QzNjQoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7IFxuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJdm9pZCBiYXIxKE1YPENsYXNzPD8gZXh0ZW5kcyBTdHJpbmc+PiBteGNzLCBNWDxDbGFzczw/IGV4dGVuZHMgT2JqZWN0Pj4gbXhjbykge1xuIiArIAoJCQkJIgkJbXhjbyA9IG14Y3M7XG4iICsgLy8gd3JvbmcKCQkJCSIJfVxuIiArIAoJCQkJIgl2b2lkIGJhcjEoQ2xhc3M8PyBleHRlbmRzIFN0cmluZz4gY3MsIENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+IGNvKSB7XG4iICsgCgkJCQkiCQljbyA9IGNzO1xuIiArIC8vIG9rCgkJCQkiCX1cbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIE1YPEU+IHtcbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkJIglteGNvID0gbXhjcztcbiIgKyAKCQkJIgkgICAgICAgXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBNWDxDbGFzczw/IGV4dGVuZHMgU3RyaW5nPj4gdG8gTVg8Q2xhc3M8PyBleHRlbmRzIE9iamVjdD4+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJLy8gY2hlY2sgcGFyYW0gdHlwZSBlcXVpdmFsZW5jZXMKCXB1YmxpYyB2b2lkIHRlc3QzNjUoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUIGV4dGVuZHMgUnVubmFibGU+IHtcbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCWNsYXNzIE1YIDxVPiB7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCU1YPFQ+IGNyZWF0ZU1YKCkgeyByZXR1cm4gbmV3IE1YPFQ+KCk7IH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJdm9pZCBmb28oWDw/PiB4LCBNWDw/PiBteCkge1xuIiArIAoJCQkJIgkJbXggPSB4LmNyZWF0ZU1YKCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkJIglteCA9IHguY3JlYXRlTVgoKTtcbiIgKyAKCQkJIgkgICAgIF5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBYPGNhcHR1cmUtb2YgPz4uTVg8Y2FwdHVyZS1vZiA/PiB0byBYPFQ+Lk1YPD8+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJLy8gY2hlY2sgcGFyYW0gdHlwZSBlcXVpdmFsZW5jZXMKCXB1YmxpYyB2b2lkIHRlc3QzNjYoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7IFxuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJdm9pZCBmb28xKE1YPENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+PiB0YXJnZXQsIE1YPENsYXNzPiB2YWx1ZSkge1xuIiArIAoJCQkJIgkJdGFyZ2V0PSB2YWx1ZTsgLy8gZm9vMSAtIHdyb25nXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBmb28yKE1YPENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+PiB0YXJnZXQsIE1YPENsYXNzPD8gZXh0ZW5kcyBTdHJpbmc+PiB2YWx1ZSkge1xuIiArIAoJCQkJIgkJdGFyZ2V0PSB2YWx1ZTsgLy8gZm9vMiAtIHdyb25nXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBmb28zKE1YPENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+PiB0YXJnZXQsIE1YPENsYXNzPD8gZXh0ZW5kcyBTdHJpbmc+PiB2YWx1ZSkge1xuIiArIAoJCQkJIgkJdGFyZ2V0PSB2YWx1ZTsgLy8gZm9vMyAtIHdyb25nXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBmb280KE1YPENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+PiB0YXJnZXQsIE1YPENsYXNzPFN0cmluZz4+IHZhbHVlKSB7XG4iICsgCgkJCQkiCQl0YXJnZXQ9IHZhbHVlOyAvLyBmb280IC0gd3JvbmdcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgl2b2lkIGZvbzUoTVg8PyBleHRlbmRzIENsYXNzPiB0YXJnZXQsIE1YPENsYXNzPiB2YWx1ZSkge1xuIiArIAoJCQkJIgkJdGFyZ2V0PSB2YWx1ZTsgLy8gZm9vNVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXZvaWQgZm9vNihNWDw/IHN1cGVyIENsYXNzPiB0YXJnZXQsIE1YPENsYXNzPiB2YWx1ZSkge1xuIiArIAoJCQkJIgkJdGFyZ2V0PSB2YWx1ZTsgLy8gZm9vNlxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXZvaWQgZm9vNyhNWDxDbGFzczw/IGV4dGVuZHMgQ2xhc3M+PiB0YXJnZXQsIE1YPENsYXNzPENsYXNzPj4gdmFsdWUpIHtcbiIgKyAKCQkJCSIJCXRhcmdldD0gdmFsdWU7IC8vIGZvbzcgLSB3cm9uZ1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXZvaWQgZm9vOChNWDxNWDw/IGV4dGVuZHMgQ2xhc3M+PiB0YXJnZXQsIE1YPE1YPENsYXNzPj4gdmFsdWUpIHtcbiIgKyAKCQkJCSIJCXRhcmdldD0gdmFsdWU7IC8vIGZvbzggLSB3cm9uZ1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXZvaWQgZm9vOShNWDw/IGV4dGVuZHMgT2JqZWN0PiB0YXJnZXQsIE1YPD8gZXh0ZW5kcyBTdHJpbmc+IHZhbHVlKSB7XG4iICsgCgkJCQkiCQl0YXJnZXQ9IHZhbHVlOyAvLyBmb285XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBmb28xMChNWDw/IGV4dGVuZHMgU3RyaW5nPiB0YXJnZXQsIE1YPD8gZXh0ZW5kcyBPYmplY3Q+IHZhbHVlKSB7XG4iICsgCgkJCQkiCQl0YXJnZXQ9IHZhbHVlOyAvLyBmb28xMCAtIHdyb25nXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBmb28xMShNWDw/IHN1cGVyIE9iamVjdD4gdGFyZ2V0LCBNWDw/IHN1cGVyIFN0cmluZz4gdmFsdWUpIHtcbiIgKyAKCQkJCSIJCXRhcmdldD0gdmFsdWU7IC8vIGZvbzExIC0gd3JvbmdcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgl2b2lkIGZvbzEyKE1YPD8gc3VwZXIgU3RyaW5nPiB0YXJnZXQsIE1YPD8gc3VwZXIgT2JqZWN0PiB2YWx1ZSkge1xuIiArIAoJCQkJIgkJdGFyZ2V0PSB2YWx1ZTsgLy8gZm9vMTJcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBNWDxFPiB7XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJdGFyZ2V0PSB2YWx1ZTsgLy8gZm9vMSAtIHdyb25nXG4iICsgCgkJCSIJICAgICAgICBeXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBNWDxDbGFzcz4gdG8gTVg8Q2xhc3M8PyBleHRlbmRzIE9iamVjdD4+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIgl0YXJnZXQ9IHZhbHVlOyAvLyBmb28yIC0gd3JvbmdcbiIgKyAKCQkJIgkgICAgICAgIF5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIE1YPENsYXNzPD8gZXh0ZW5kcyBTdHJpbmc+PiB0byBNWDxDbGFzczw/IGV4dGVuZHMgT2JqZWN0Pj5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMClcbiIgKyAKCQkJIgl0YXJnZXQ9IHZhbHVlOyAvLyBmb28zIC0gd3JvbmdcbiIgKyAKCQkJIgkgICAgICAgIF5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIE1YPENsYXNzPD8gZXh0ZW5kcyBTdHJpbmc+PiB0byBNWDxDbGFzczw/IGV4dGVuZHMgT2JqZWN0Pj5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjQuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMylcbiIgKyAKCQkJIgl0YXJnZXQ9IHZhbHVlOyAvLyBmb280IC0gd3JvbmdcbiIgKyAKCQkJIgkgICAgICAgIF5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIE1YPENsYXNzPFN0cmluZz4+IHRvIE1YPENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+PlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDIyKVxuIiArIAoJCQkiCXRhcmdldD0gdmFsdWU7IC8vIGZvbzcgLSB3cm9uZ1xuIiArIAoJCQkiCSAgICAgICAgXl5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gTVg8Q2xhc3M8Q2xhc3M+PiB0byBNWDxDbGFzczw/IGV4dGVuZHMgQ2xhc3M+PlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDI1KVxuIiArIAoJCQkiCXRhcmdldD0gdmFsdWU7IC8vIGZvbzggLSB3cm9uZ1xuIiArIAoJCQkiCSAgICAgICAgXl5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gTVg8TVg8Q2xhc3M+PiB0byBNWDxNWDw/IGV4dGVuZHMgQ2xhc3M+PlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMxKVxuIiArIAoJCQkiCXRhcmdldD0gdmFsdWU7IC8vIGZvbzEwIC0gd3JvbmdcbiIgKyAKCQkJIgkgICAgICAgIF5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIE1YPGNhcHR1cmUtb2YgPyBleHRlbmRzIE9iamVjdD4gdG8gTVg8PyBleHRlbmRzIFN0cmluZz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjguIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzNClcbiIgKyAKCQkJIgl0YXJnZXQ9IHZhbHVlOyAvLyBmb28xMSAtIHdyb25nXG4iICsgCgkJCSIJICAgICAgICBeXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBNWDxjYXB0dXJlLW9mID8gc3VwZXIgU3RyaW5nPiB0byBNWDw/IHN1cGVyIE9iamVjdD5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgkvLyBjaGVjayBwYXJhbSB0eXBlIGVxdWl2YWxlbmNlcwoJcHVibGljIHZvaWQgdGVzdDM2NygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCQoJCQkJInB1YmxpYyBjbGFzcyBYIHsgXG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIgl2b2lkIGZvbzEoTVg8PyBleHRlbmRzIE1YPiB0YXJnZXQsIE1YPE1YPFN0cmluZz4+IHZhbHVlKSB7XG4iICsgCgkJCQkiCQl0YXJnZXQ9IHZhbHVlOyAvLyBmb28xXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBmb28yKE1YPD8+IHRhcmdldCwgTVg8TVg8U3RyaW5nPj4gdmFsdWUpIHtcbiIgKyAKCQkJCSIJCXRhcmdldD0gdmFsdWU7IC8vIGZvbzJcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgl2b2lkIGZvbzMoTVg8PyBzdXBlciBNWD4gdGFyZ2V0LCBNWDxNWDxTdHJpbmc+PiB2YWx1ZSkge1xuIiArIAoJCQkJIgkJdGFyZ2V0PSB2YWx1ZTsgLy8gZm9vM1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIE1YPEU+IHtcbiIgKyAKCQkJCSJ9XG4iCSwKCQkJfSwKCQkJIiIpOwoJfQoJLy8gY2hlY2sgcGFyYW0gdHlwZSBlcXVpdmFsZW5jZXMKCXB1YmxpYyB2b2lkIHRlc3QzNjgoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAkKCQkJCSJwdWJsaWMgY2xhc3MgWDxUIGV4dGVuZHMgUnVubmFibGU+IHtcbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCXN0YXRpYyBjbGFzcyBNWCA8VT4ge1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIglNWDxUPiBjcmVhdGVNWCgpIHsgcmV0dXJuIG5ldyBNWDxUPigpOyB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXZvaWQgZm9vKFg8Pz4geCwgTVg8Pz4gbXgpIHtcbiIgKyAKCQkJCSIJCW14ID0geC5jcmVhdGVNWCgpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgksCgkJCX0sCgkJCSIiKTsKCX0JCgkvLyBib3VuZCBjaGVjayBmb3IgRW51bTxUPgoJcHVibGljIHZvaWQgdGVzdDM2OSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCQoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCTxUIGV4dGVuZHMgRW51bTxUPj4gVCBmb28oVCB0KSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIiIpOwoJfQoJLy8gZGVjb2RpbmcgcmF3IGJpbmFyeSB0eXBlCglwdWJsaWMgdm9pZCB0ZXN0MzcwKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwJCgkJCSJpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjtcbiIgKyAKCQkJImltcG9ydCBqYXZhLnV0aWwuTWFwO1xuIiArIAoJCQkiXG4iICsgCgkJCSJpbXBvcnQgc3VuLnJlZmxlY3QuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uUGFyc2VyO1xuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIJe1xuIiArIAoJCQkiCQlNYXA8Q2xhc3MsIEFubm90YXRpb24+IG1hcCA9IEFubm90YXRpb25QYXJzZXIucGFyc2VBbm5vdGF0aW9ucyhudWxsLCBudWxsLCBudWxsKTtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iLAoJCQl9LAoJCQkiIik7Cgl9CQkKCS8vIFg8PyBleHRlbmRzIFk+IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggWDxZPgoJcHVibGljIHZvaWQgdGVzdDM3MSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAkKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgCXB1YmxpYyB2b2lkIGZvbyhYQzxSdW5uYWJsZT4gdGFyZ2V0LCBYQzw/IGV4dGVuZHMgUnVubmFibGU+IHZhbHVlKSB7XG4iICsgCgkJCQkiICAgCQl0YXJnZXQgPSB2YWx1ZTtcbiIgKyAKCQkJCSIgICAJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBYQyA8RT57XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCXRhcmdldCA9IHZhbHVlO1xuIiArIAoJCQkiCSAgICAgICAgIF5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFhDPGNhcHR1cmUtb2YgPyBleHRlbmRzIFJ1bm5hYmxlPiB0byBYQzxSdW5uYWJsZT5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQoJcHVibGljIHZvaWQgdGVzdDM3MigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCQoJCQkJImltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7XG4iICsgCgkJCQkiaW1wb3J0IGphdmEudXRpbC5NYXA7XG4iICsgCgkJCQkiaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFggPEssIFY+IHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJdm9pZCBmb28oSXRlcmF0b3I8TWFwLkVudHJ5PEssVj4+IGl0ZXIpIHtcbiIgKyAKCQkJCSIJCW5ldyBYQS5NWEE8SyxWPihpdGVyLm5leHQoKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWEEgPEssIFY+IHtcbiIgKyAKCQkJCSIJc3RhdGljIGNsYXNzIE1YQSA8SywgVj4gIGltcGxlbWVudHMgRW50cnk8SyxWPiB7XG4iICsgCgkJCQkiCQlNWEEoRW50cnk8SyxWPiBlKSB7XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCQlwdWJsaWMgSyBnZXRLZXkoKSB7XG4iICsgCgkJCQkiCQkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCQlwdWJsaWMgViBnZXRWYWx1ZSgpIHtcbiIgKyAKCQkJCSIJCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIJCX1cbiIgKyAKCQkJCSIJCXB1YmxpYyBWIHNldFZhbHVlKFYgdmFsdWUpIHtcbiIgKyAKCQkJCSIJCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIJCX1cbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIJLAoJCQl9LAoJCQkiIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0MzczKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWEEuamF2YSIsCQoJCQkJImltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYQSA8SywgVj4ge1xuIiArIAoJCQkJIglzdGF0aWMgY2xhc3MgTVhBIDxLLCBWPiAgaW1wbGVtZW50cyBFbnRyeTxLLFY+IHtcbiIgKyAKCQkJCSIJCU1YQShFbnRyeTxLLFY+IGUpIHtcbiIgKyAKCQkJCSIJCX1cbiIgKyAKCQkJCSIJCXB1YmxpYyBLIGdldEtleSgpIHtcbiIgKyAKCQkJCSIJCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIJCX1cbiIgKyAKCQkJCSIJCXB1YmxpYyBWIGdldFZhbHVlKCkge1xuIiArIAoJCQkJIgkJCXJldHVybiBudWxsO1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgkJcHVibGljIFYgc2V0VmFsdWUoViB2YWx1ZSkge1xuIiArIAoJCQkJIgkJCXJldHVybiBudWxsO1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgksCgkJCX0sCgkJCSIiKTsKCQkvLyBjb21waWxlIGFnYWluc3QgYmluYXJpZXMKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCQoJCQkJImltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7XG4iICsgCgkJCQkiaW1wb3J0IGphdmEudXRpbC5NYXA7XG4iICsgCgkJCQkiaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFggPEssIFY+IHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJdm9pZCBmb28oSXRlcmF0b3I8TWFwLkVudHJ5PEssVj4+IGl0ZXIpIHtcbiIgKyAKCQkJCSIJCW5ldyBYQS5NWEE8SyxWPihpdGVyLm5leHQoKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iCSwKCQkJfSwKCQkJIiIsCgkJCW51bGwsCgkJCWZhbHNlLAoJCQludWxsKTsKCX0KCS8vIHdpbGRjYXJkIHdpdGggbm8gdXBwZXIgYm91bmQgdXNlcyB0eXBlIHZhcmlhYmxlIGFzIHVwcGVyIGJvdW5kCglwdWJsaWMgdm9pZCB0ZXN0Mzc0KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwJCgkJCQkicHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBFeGNlcHRpb24+IHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJdm9pZCBmb28xKFggPD8gZXh0ZW5kcyBFeGNlcHRpb24+IHRhcmdldCwgWDw/PiB2YWx1ZSkge1xuIiArIAoJCQkJIgkJdGFyZ2V0ID0gdmFsdWU7IC8vIGZvbzFcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgl2b2lkIGZvbzIoWCA8PyBleHRlbmRzIEV4Y2VwdGlvbj4gdGFyZ2V0LCBYPD8gc3VwZXIgUnVudGltZUV4Y2VwdGlvbj4gdmFsdWUpIHtcbiIgKyAKCQkJCSIJCXRhcmdldCA9IHZhbHVlOyAgLy8gZm9vMlxuIiArIAoJCQkJIgl9CVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsKCX0JCglwdWJsaWMgdm9pZCB0ZXN0Mzc1KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCQoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPiB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXZvaWQgZm9vMShYIDw/IHN1cGVyIEV4Y2VwdGlvbj4gdGFyZ2V0LCBYPD8gZXh0ZW5kcyBFeGNlcHRpb24+IHZhbHVlKSB7XG4iICsgCgkJCQkiCQl0YXJnZXQgPSB2YWx1ZTsgLy8gZm9vMVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCXRhcmdldCA9IHZhbHVlOyAvLyBmb28xXG4iICsgCgkJCSIJICAgICAgICAgXl5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gWDxjYXB0dXJlLW9mID8gZXh0ZW5kcyBFeGNlcHRpb24+IHRvIFg8PyBzdXBlciBFeGNlcHRpb24+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDM3NigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlhBLmphdmEiLAkKCQkJCSJpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWEEgPEssIFY+IHtcbiIgKyAKCQkJCSIgICBYQTxLLFY+IHNlbGYoKSB7IHJldHVybiB0aGlzOyB9IFxuIiArCgkJCQkiCXN0YXRpYyBjbGFzcyBNWEEgPEssIFY+ICBpbXBsZW1lbnRzIEVudHJ5PEssVj4ge1xuIiArIAoJCQkJIgkJTVhBKEVudHJ5PEssVj4gZSkge1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgkJcHVibGljIEsgZ2V0S2V5KCkge1xuIiArIAoJCQkJIgkJCXJldHVybiBudWxsO1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgkJcHVibGljIFYgZ2V0VmFsdWUoKSB7XG4iICsgCgkJCQkiCQkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCQlwdWJsaWMgViBzZXRWYWx1ZShWIHZhbHVlKSB7XG4iICsgCgkJCQkiCQkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iCSwKCQkJfSwKCQkJIiIpOwoJCS8vIGNvbXBpbGUgYWdhaW5zdCBiaW5hcmllcwoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwJCgkJCQkiaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjtcbiIgKyAKCQkJCSJpbXBvcnQgamF2YS51dGlsLk1hcDtcbiIgKyAKCQkJCSJpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCA8SywgVj4ge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgl2b2lkIGZvbyhJdGVyYXRvcjxNYXAuRW50cnk8SyxWPj4gaXRlcikge1xuIiArIAoJCQkJIgkJbmV3IFhBLk1YQTxLLFY+KGl0ZXIubmV4dCgpKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIJLAoJCQl9LAoJCQkiIiwKCQkJbnVsbCwKCQkJZmFsc2UsCgkJCW51bGwpOwoJfQkKCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzY2MDEKCXB1YmxpYyB2b2lkIHRlc3QzNzcoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJUZXN0LmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBUZXN0IHtcbiIgKwoJCQkJCSIgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwoJCQkJCSIgIGZpbmFsIFN0cmluZyB2YWwgPSAoYXJncyA9PSBudWxsfHxhcmdzLmxlbmd0aD09MCA/IFwiU1VDQ1wiIDogYXJnc1swXSkgKyBcIkVTU1wiO1xuIiArCgkJCQkJIiAgY2xhc3MgQWxsZWdlZEJvdW5kTWlzbWF0Y2g8RTIgZXh0ZW5kcyBTdXBlckk8RTI+PiB7XG4iICsKCQkJCQkiICAgU3RyaW5nIGZpZWxkID0gdmFsO1xuIiArCgkJCQkJIiAgfVxuIiArCgkJCQkJIiAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBPYmplY3QoKSB7XG4iICsKCQkJCQkiICAgQWxsZWdlZEJvdW5kTWlzbWF0Y2g8U3ViSTxRPj4gdHJpYWwgPSBuZXcgQWxsZWdlZEJvdW5kTWlzbWF0Y2g8U3ViSTxRPj4oKTtcbiIgKwoJCQkJCSIgIH0udHJpYWwuZmllbGQpO1xuIiArCgkJCQkJIiB9XG4iICsKCQkJCQkifVxuIiArCgkJCQkJImNsYXNzIFEge31cbiIgKwoJCQkJCSJpbnRlcmZhY2UgU3ViSTxRPiBleHRlbmRzIFN1cGVySTxTdWJJPFE+PiB7fVxuIiArCgkJCQkJImludGVyZmFjZSBTdXBlckk8UT4ge30iCgkJCX0sCgkJIlNVQ0NFU1MiKTsKCX0KCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMTkKCXB1YmxpYyB2b2lkIHRlc3QzNzgoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJCQi5qYXZhIiwKCQkJCSJpbnRlcmZhY2UgQUE8VywgWiBleHRlbmRzIEFBPFcsIFo+PiB7IFxuIiArCgkJCQkJIiBwdWJsaWMgYm9vbGVhbiBtKEFBPFcsID8+IHRoYXQpOyBcbiIgKwoJCQkJCSIgcHVibGljIFogeigpOyBcbiIgKwoJCQkJCSIgcHVibGljIGJvb2xlYW4gYigpOyBcbiIgKwoJCQkJCSJ9XG4iICsKCQkJCQkiYWJzdHJhY3QgY2xhc3MgQkI8VSwgViBleHRlbmRzIEFBPFUsIFY+PiBpbXBsZW1lbnRzIEFBPFUsVj4geyBcbiIgKwoJCQkJCSIgcHVibGljIGJvb2xlYW4gbShBQTxVLCA/PiB3aHQpIHsgcmV0dXJuIHdodC56KCkuYigpOyB9IFxuIiArCgkJCQkJIn1cbiJ9CgkJKTsKCX0KCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzE2MTIKCXB1YmxpYyB2b2lkIHRlc3QzNzkoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJUZXN0LmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7XG4iICsgCgkJCQkiaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgVGVzdCBleHRlbmRzIEFic3RyYWN0U2V0PFJ1bm5hYmxlPntcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgVGVzdCB0PW5ldyBUZXN0KCk7XG4iICsgCgkJCQkiICAgICAgICB0LmFkZChudWxsKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgYm9vbGVhbiBhZGQoUnVubmFibGUgcnVuKSB7XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJzdWNjZXNzXCIpO1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIHRydWU7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIEl0ZXJhdG9yPFJ1bm5hYmxlPiBpdGVyYXRvcigpIHtyZXR1cm4gbnVsbDt9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHtyZXR1cm4gMDt9XG4iICsgCgkJCQkifSIKCQkJCX0KCQkpOwoJfQoKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NzMyNwoJcHVibGljIHZvaWQgdGVzdDM4MCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlRlc3QuamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBUZXN0IHtcbiIgKyAKCQkJCSIJTGlzdDw/IHN1cGVyIE51bWJlcj4gd3NuPSBudWxsOyAvLyBDb250cmF2YXJpYW5jZVxuIiArIAoJCQkJIglMaXN0PD8gc3VwZXIgSW50ZWdlcj4gd3NpPSB3c247IC8vIHNob3VsZCB3b3JrIVxuIiArIAoJCQkJIn1cbiIKCQkJCX0KCQkpOwoJfQoKCXB1YmxpYyB2b2lkIHRlc3QzODEoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIFkge1xuIiArIAoJCQkJIgl2b2lkIGZvbyhDbGFzczw/IGV4dGVuZHMgU3RyaW5nPiBzKSB7fVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBZIHtcbiIgKwoJCQkJIgl2b2lkIGZvbyhDbGFzczxTdHJpbmc+IHMpIHt9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDIpXG4iICsgCgkJCSIJdm9pZCBmb28oQ2xhc3M8PyBleHRlbmRzIFN0cmluZz4gcykge31cbiIgKyAKCQkJIgkgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiTmFtZSBjbGFzaDogVGhlIG1ldGhvZCBmb28oQ2xhc3M8PyBleHRlbmRzIFN0cmluZz4pIG9mIHR5cGUgWCBoYXMgdGhlIHNhbWUgZXJhc3VyZSBhcyBmb28oQ2xhc3M8U3RyaW5nPikgb2YgdHlwZSBZIGJ1dCBkb2VzIG5vdCBvdmVycmlkZSBpdFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIFkge1xuIiArIAoJCQkJIgl2b2lkIGZvbyhDbGFzczxTdHJpbmc+IHMpIHt9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIFkge1xuIiArCgkJCQkiCXZvaWQgZm9vKENsYXNzPD8gZXh0ZW5kcyBTdHJpbmc+IHMpIHt9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDIpXG4iICsgCgkJCSIJdm9pZCBmb28oQ2xhc3M8U3RyaW5nPiBzKSB7fVxuIiArIAoJCQkiCSAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIk5hbWUgY2xhc2g6IFRoZSBtZXRob2QgZm9vKENsYXNzPFN0cmluZz4pIG9mIHR5cGUgWCBoYXMgdGhlIHNhbWUgZXJhc3VyZSBhcyBmb28oQ2xhc3M8PyBleHRlbmRzIFN0cmluZz4pIG9mIHR5cGUgWSBidXQgZG9lcyBub3Qgb3ZlcnJpZGUgaXRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJcHVibGljIHZvaWQgdGVzdDM4MigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgWSBpbXBsZW1lbnRzIEkge31cbiIgKyAKCQkJCSJpbnRlcmZhY2UgSSB7IHZvaWQgZm9vKENsYXNzPD8gZXh0ZW5kcyBTdHJpbmc+IHMpOyB9XG4iICsgCgkJCQkiY2xhc3MgWSB7IHZvaWQgZm9vKENsYXNzPFN0cmluZz4gcykge30gfVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFggZXh0ZW5kcyBZIGltcGxlbWVudHMgSSB7fVxuIiArIAoJCQkiCSAgICAgICAgICAgICBeXG4iICsgCgkJCSJOYW1lIGNsYXNoOiBUaGUgbWV0aG9kIGZvbyhDbGFzczxTdHJpbmc+KSBvZiB0eXBlIFkgaGFzIHRoZSBzYW1lIGVyYXN1cmUgYXMgZm9vKENsYXNzPD8gZXh0ZW5kcyBTdHJpbmc+KSBvZiB0eXBlIEkgYnV0IGRvZXMgbm90IG92ZXJyaWRlIGl0XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMSlcbiIgKyAKCQkJIglwdWJsaWMgY2xhc3MgWCBleHRlbmRzIFkgaW1wbGVtZW50cyBJIHt9XG4iICsgCgkJCSIJICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlRoZSB0eXBlIFggbXVzdCBpbXBsZW1lbnQgdGhlIGluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2QgSS5mb28oQ2xhc3M8PyBleHRlbmRzIFN0cmluZz4pXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYIGV4dGVuZHMgWSBpbXBsZW1lbnRzIEkge31cbiIgKyAKCQkJCSJpbnRlcmZhY2UgSSB7IHZvaWQgZm9vKENsYXNzPFN0cmluZz4gcyk7IH1cbiIgKyAKCQkJCSJjbGFzcyBZIHsgdm9pZCBmb28oQ2xhc3M8PyBleHRlbmRzIFN0cmluZz4gcykge30gfVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJCSIJcHVibGljIGFic3RyYWN0IGNsYXNzIFggZXh0ZW5kcyBZIGltcGxlbWVudHMgSSB7fVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICBeXG4iICsgCgkJCSJOYW1lIGNsYXNoOiBUaGUgbWV0aG9kIGZvbyhDbGFzczw/IGV4dGVuZHMgU3RyaW5nPikgb2YgdHlwZSBZIGhhcyB0aGUgc2FtZSBlcmFzdXJlIGFzIGZvbyhDbGFzczxTdHJpbmc+KSBvZiB0eXBlIEkgYnV0IGRvZXMgbm90IG92ZXJyaWRlIGl0XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCXB1YmxpYyB2b2lkIHRlc3QzODMoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIFkgaW1wbGVtZW50cyBJIHsgcHVibGljIDxUPiB2b2lkIGZvbyhDbGFzczxUPiBzKSB7fSB9XG4iICsgCgkJCQkiaW50ZXJmYWNlIEkgeyA8VCwgUz4gdm9pZCBmb28oQ2xhc3M8VD4gcyk7IH1cbiIgKyAKCQkJCSJjbGFzcyBZIHsgcHVibGljIDxUPiB2b2lkIGZvbyhDbGFzczxUPiBzKSB7fSB9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMSlcbiIgKyAKCQkJIglwdWJsaWMgY2xhc3MgWCBleHRlbmRzIFkgaW1wbGVtZW50cyBJIHsgcHVibGljIDxUPiB2b2lkIGZvbyhDbGFzczxUPiBzKSB7fSB9XG4iICsgCgkJCSIJICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlRoZSB0eXBlIFggbXVzdCBpbXBsZW1lbnQgdGhlIGluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2QgSS5mb28oQ2xhc3M8VD4pXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMSlcbiIgKyAKCQkJIglwdWJsaWMgY2xhc3MgWCBleHRlbmRzIFkgaW1wbGVtZW50cyBJIHsgcHVibGljIDxUPiB2b2lkIGZvbyhDbGFzczxUPiBzKSB7fSB9XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIk5hbWUgY2xhc2g6IFRoZSBtZXRob2QgZm9vKENsYXNzPFQ+KSBvZiB0eXBlIFggaGFzIHRoZSBzYW1lIGVyYXN1cmUgYXMgZm9vKENsYXNzPFQ+KSBvZiB0eXBlIEkgYnV0IGRvZXMgbm90IG92ZXJyaWRlIGl0XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgWSBpbXBsZW1lbnRzIEkgeyBwdWJsaWMgPFQ+IHZvaWQgZm9vKENsYXNzPFQ+IHMpIHt9IH1cbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCBmb28oQ2xhc3M8VD4pIG9mIHR5cGUgWCBzaG91bGQgYmUgdGFnZ2VkIHdpdGggQE92ZXJyaWRlIHNpbmNlIGl0IGFjdHVhbGx5IG92ZXJyaWRlcyBhIHN1cGVyY2xhc3MgbWV0aG9kXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCQkJLyoKCQkJWC5qYXZhOjE6IFggaXMgbm90IGFic3RyYWN0IGFuZCBkb2VzIG5vdCBvdmVycmlkZSBhYnN0cmFjdCBtZXRob2QgPFQsUz5mb28oamF2YS5sYW5nLkNsYXNzPFQ+KSBpbiBJCgkJCXB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgWSBpbXBsZW1lbnRzIEkgeyBwdWJsaWMgPFQ+IHZvaWQgZm9vKENsYXNzPFQ+IHMpIHt9IH0KCQkJICAgICAgIF4KICAgICAgIAkJKi8KCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgWSBpbXBsZW1lbnRzIEkge31cbiIgKyAKCQkJCSJpbnRlcmZhY2UgSSB7IDxULCBTPiB2b2lkIGZvbyhDbGFzczxUPiBzKTsgfVxuIiArIAoJCQkJImNsYXNzIFkgeyBwdWJsaWMgPFQ+IHZvaWQgZm9vKENsYXNzPFQ+IHMpIHt9IH1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgWSBpbXBsZW1lbnRzIEkge31cbiIgKyAKCQkJIgkgICAgICAgICAgICAgXlxuIiArIAoJCQkiTmFtZSBjbGFzaDogVGhlIG1ldGhvZCBmb28oQ2xhc3M8VD4pIG9mIHR5cGUgWSBoYXMgdGhlIHNhbWUgZXJhc3VyZSBhcyBmb28oQ2xhc3M8VD4pIG9mIHR5cGUgSSBidXQgZG9lcyBub3Qgb3ZlcnJpZGUgaXRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgWSBpbXBsZW1lbnRzIEkge31cbiIgKyAKCQkJIgkgICAgICAgICAgICAgXlxuIiArIAoJCQkiVGhlIHR5cGUgWCBtdXN0IGltcGxlbWVudCB0aGUgaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZCBJLmZvbyhDbGFzczxUPilcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJCQkvKgoJCQlYLmphdmE6MTogWCBpcyBub3QgYWJzdHJhY3QgYW5kIGRvZXMgbm90IG92ZXJyaWRlIGFic3RyYWN0IG1ldGhvZCA8VCxTPmZvbyhqYXZhLmxhbmcuQ2xhc3M8VD4pIGluIEkKCQkJcHVibGljIGNsYXNzIFggZXh0ZW5kcyBZIGltcGxlbWVudHMgSSB7fQoJCQkgICAgICAgXgoJCQkqLwoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGFic3RyYWN0IGNsYXNzIFggZXh0ZW5kcyBZIGltcGxlbWVudHMgSSB7fVxuIiArIC8vIE5PVEU6IFggaXMgYWJzdHJhY3QKCQkJCSJpbnRlcmZhY2UgSSB7IDxUPiB2b2lkIGZvbyhDbGFzczxUPiBzKTsgfVxuIiArIAoJCQkJImNsYXNzIFkgeyBwdWJsaWMgPFQsIFM+IHZvaWQgZm9vKENsYXNzPFQ+IHMpIHt9IH1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxKVxuIiArIAoJCQkiCXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYIGV4dGVuZHMgWSBpbXBsZW1lbnRzIEkge31cbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgXlxuIiArIAoJCQkiTmFtZSBjbGFzaDogVGhlIG1ldGhvZCBmb28oQ2xhc3M8VD4pIG9mIHR5cGUgWSBoYXMgdGhlIHNhbWUgZXJhc3VyZSBhcyBmb28oQ2xhc3M8VD4pIG9mIHR5cGUgSSBidXQgZG9lcyBub3Qgb3ZlcnJpZGUgaXRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJCQkvKgoJCQlYLmphdmE6MTogbmFtZSBjbGFzaDogPFQsUz5mb28oamF2YS5sYW5nLkNsYXNzPFQ+KSBpbiBZIGFuZCA8VD5mb28oamF2YS5sYW5nLkNsYXNzPFQ+KSBpbiBJIGhhdmUgdGhlIHNhbWUgZXJhc3VyZSwgeWV0IG5laXRoZXIgb3ZlcnJpZGVzIHRoZSBvdGhlcgoJCQlwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWCBleHRlbmRzIFkgaW1wbGVtZW50cyBJIHt9CgkJCSAgICAgICAgICAgICAgICBeCgkJCSAqLwoJfQoJcHVibGljIHZvaWQgdGVzdDM4NCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBZIHtcbiIgKyAKCQkJCSIJPFQ+IGphdmEudXRpbC5MaXN0PFQ+IGZvbzMoamF2YS51dGlsLkxpc3Q8VD4gdCkgeyByZXR1cm4gdDsgfVxuIiArIAoJCQkJIglDbGFzczxTdHJpbmc+IGZvbzQoKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkiCUNsYXNzPFN0cmluZz5bXSBmb281KCkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBZIHtcbiIgKwoJCQkJIgk8VD4gamF2YS51dGlsLkxpc3Q8VD4gZm9vMyhqYXZhLnV0aWwuTGlzdDxUPiB0KSB7IHJldHVybiB0OyB9XG4iICsgCgkJCQkiCUNsYXNzPD8gZXh0ZW5kcyBTdHJpbmc+IGZvbzQoKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkiCUNsYXNzPD8gZXh0ZW5kcyBTdHJpbmc+W10gZm9vNSgpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSIiKTsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgWSB7XG4iICsgCgkJCQkiCUNsYXNzPD8gZXh0ZW5kcyBTdHJpbmc+IGZvbygpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSIJQ2xhc3M8PyBleHRlbmRzIFN0cmluZz5bXSBmb28yKCkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBZIHtcbiIgKwoJCQkJIglDbGFzczxTdHJpbmc+IGZvbygpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSIJQ2xhc3M8U3RyaW5nPltdIGZvbzIoKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDIpXG4iICsgCgkJCSIJQ2xhc3M8PyBleHRlbmRzIFN0cmluZz4gZm9vKCkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXG4iICsgCgkJCSJUaGUgcmV0dXJuIHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggWS5mb28oKVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJQ2xhc3M8PyBleHRlbmRzIFN0cmluZz5bXSBmb28yKCkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXG4iICsgCgkJCSJUaGUgcmV0dXJuIHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggWS5mb28yKClcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NzQ5NgoJcHVibGljIHZvaWQgdGVzdDM4NSgpIHsgCgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCQkiaW50ZXJmYWNlIElEb3VibGVzIHsgTGlzdDxEb3VibGU+IGdldExpc3QoKTsgfVxuIiArCgkJCQkiY2xhc3MgQSBpbXBsZW1lbnRzIElEb3VibGVzIHtcbiIgKyAKCQkJCSIJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRMaXN0KCkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBCIHtcbiIgKyAKCQkJCSIJIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TGlzdCgpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQyBleHRlbmRzIEIgaW1wbGVtZW50cyBJRG91YmxlcyB7XG4iICsgCgkJCQkiCXZvaWQgdXNlKCkgeyBMaXN0PFN0cmluZz4gbD0gZ2V0TGlzdCgpOyB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRMaXN0KCkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgcmV0dXJuIHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggSURvdWJsZXMuZ2V0TGlzdCgpXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkJIgljbGFzcyBDIGV4dGVuZHMgQiBpbXBsZW1lbnRzIElEb3VibGVzIHtcbiIgKyAKCQkJIgkgICAgICBeXG4iICsgCgkJCSJUaGUgcmV0dXJuIHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggSURvdWJsZXMuZ2V0TGlzdCgpLCBCLmdldExpc3QoKVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7CgkJCS8qCgkJCVguamF2YTozOiBBIGlzIG5vdCBhYnN0cmFjdCBhbmQgZG9lcyBub3Qgb3ZlcnJpZGUgYWJzdHJhY3QgbWV0aG9kIGdldExpc3QoKSBpbiBJRG91YmxlcwoJCQljbGFzcyBBIGltcGxlbWVudHMgSURvdWJsZXMgewoJCQleCgkJCVguamF2YTo0OiBnZXRMaXN0KCkgaW4gQSBjYW5ub3QgaW1wbGVtZW50IGdldExpc3QoKSBpbiBJRG91YmxlczsgYXR0ZW1wdGluZyB0byB1c2UgaW5jb21wYXRpYmxlIHJldHVybiB0eXBlCgkJCWZvdW5kICAgOiBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPgoJCQlyZXF1aXJlZDogamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLkRvdWJsZT4KCQkJCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TGlzdCgpIHsgcmV0dXJuIG51bGw7IH0KCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KCQkJWC5qYXZhOjk6IEMgaXMgbm90IGFic3RyYWN0IGFuZCBkb2VzIG5vdCBvdmVycmlkZSBhYnN0cmFjdCBtZXRob2QgZ2V0TGlzdCgpIGluIElEb3VibGVzCgkJCWNsYXNzIEMgZXh0ZW5kcyBCIGltcGxlbWVudHMgSURvdWJsZXMgewoJCQkgKi8JCgl9CgoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc3MzI1CglwdWJsaWMgdm9pZCB0ZXN0Mzg2KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiY2xhc3MgWCA8UixVLFYsIFQ+IHtcbiIgKyAKCQkJCQkiCXByaXZhdGUgVSB1O1xuIiArIAoJCQkJCSIJcHJpdmF0ZSBWIHY7XG4iICsgCgkJCQkJIglwdWJsaWMgWChVIHUsViB2KSB7IHRoaXMudT0gdTsgdGhpcy52PSB2OyB9XG4iICsgCgkJCQkJIglwdWJsaWMgUiBnZXRVKCkgeyByZXR1cm4gKFIpdTsgfSAvLyBXYXJuaW5nXG4iICsgCgkJCQkJIglwdWJsaWMgUiBnZXRWKCkgeyByZXR1cm4gKFIpdjsgfSAvLyBXYXJuaW5nXG4iICsgCgkJCQkJIglPYmplY3QgbztcbiIgKyAKCQkJCQkiCXB1YmxpYyBUIGdldFQoKSB7IHJldHVybiAoVClvOyB9IC8vIFdhcm5pbmdcbiIgKyAKCQkJCQkifSIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJCSIJcHVibGljIFIgZ2V0VSgpIHsgcmV0dXJuIChSKXU7IH0gLy8gV2FybmluZ1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNhc3QgZnJvbSBVIHRvIFIgaXMgYWN0dWFsbHkgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZXJhc2VkIHR5cGUgT2JqZWN0XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCQkiCXB1YmxpYyBSIGdldFYoKSB7IHJldHVybiAoUil2OyB9IC8vIFdhcm5pbmdcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBjYXN0IGZyb20gViB0byBSIGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIE9iamVjdFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIglwdWJsaWMgVCBnZXRUKCkgeyByZXR1cm4gKFQpbzsgfSAvLyBXYXJuaW5nXG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIE9iamVjdCB0byBUIGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIE9iamVjdFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc3NDIyIC0gZ2VuZXJpYyB2YXJhcmdzIG1ldGhvZAoJcHVibGljIHZvaWQgdGVzdDM4NygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPlxuIiArIAoJCQkJIntcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIGJvb2xlYW4gdGVzdDEoKVxuIiArIAoJCQkJIgl7XG4iICsgCgkJCQkiCQkJdGVzdDIoXCJ0ZXN0XCIsIG51bGwsIDApO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXB1YmxpYyA8Rj4gTGlzdDxGPiB0ZXN0MihmaW5hbCBMaXN0PEY+IGxpc3QsIGZpbmFsIFN0cmluZy4uLiBzdHJpbmdzKVxuIiArIAoJCQkJIgl7XG4iICsgCgkJCQkiCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCXRlc3QyKFwidGVzdFwiLCBudWxsLCAwKTtcbiIgKyAKCQkJIgleXl5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCB0ZXN0MihMaXN0PEY+LCBTdHJpbmcuLi4pIGluIHRoZSB0eXBlIFg8VD4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKFN0cmluZywgbnVsbCwgaW50KVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc3NDIyIC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0Mzg4KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFg8VD5cbiIgKyAKCQkJCSJ7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXB1YmxpYyBib29sZWFuIHRlc3QxKClcbiIgKyAKCQkJCSIJe1xuIiArIAoJCQkJIgkJCXRlc3QyKG51bGwsIG51bGwsIFwidGVzdFwiKTtcbiIgKyAKCQkJCSIJCQlyZXR1cm4gZmFsc2U7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIDxGPiBMaXN0PEY+IHRlc3QyKGZpbmFsIExpc3Q8Rj4gbGlzdCwgZmluYWwgU3RyaW5nLi4uIHN0cmluZ3MpXG4iICsgCgkJCQkiCXtcbiIgKyAKCQkJCSIJCXJldHVybiBudWxsO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiIgoJCSk7Cgl9CgoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc3NDIyIC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0Mzg5KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXB1YmxpYyBib29sZWFuIHRlc3QxKCkJe1xuIiArIAoJCQkJIgkJU3RyaW5nIHMgPSBmb28oXCJoZWxsb1wiKTtcbiIgKyAKCQkJCSIJCXJldHVybiBzICE9IG51bGw7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIDxGPiBGIGZvbyhGIGYsIEYuLi4gb3RoZXJzKSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gZjtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIiIKCQkpOwoJfQkKCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc3NDIyIC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0MzkwKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXB1YmxpYyBib29sZWFuIHRlc3QxKCkJe1xuIiArIAoJCQkJIgkJU3RyaW5nIHMgPSBmb28obnVsbCwgXCJoZWxsb1wiKTtcbiIgKyAKCQkJCSIJCXJldHVybiBzICE9IG51bGw7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIDxGPiBGIGZvbyhGIGYsIEYuLi4gb3RoZXJzKSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gZjtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIiIKCQkpOwoJfQkJCgkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NzQyMiAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDM5MSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIGJvb2xlYW4gdGVzdDEoKQl7XG4iICsgCgkJCQkiCQlTdHJpbmdbXSBzID0gZm9vKG51bGwsIG5ldyBTdHJpbmdbXXsgXCJoZWxsb1wiIH0pO1xuIiArIAoJCQkJIgkJcmV0dXJuIHMgIT0gbnVsbDtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgPEY+IEYgZm9vKEYgZiwgRi4uLiBvdGhlcnMpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBmO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgkKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCVN0cmluZ1tdIHMgPSBmb28obnVsbCwgbmV3IFN0cmluZ1tdeyBcImhlbGxvXCIgfSk7XG4iICsgCgkJCSIJICAgICAgICAgXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBTdHJpbmcgdG8gU3RyaW5nW11cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIKCQkpOwoJfQkJCgkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NzQyMiAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDM5MigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgYm9vbGVhbiB0ZXN0MSgpCXtcbiIgKyAKCQkJCSIJCWZvbyhudWxsLCBcImhlbGxvXCIpO1xuIiArIC8vIG5vIGluZmVyZW5jZSBvbiBleHBlY3RlZCB0eXBlCgkJCQkiCQlyZXR1cm4gdHJ1ZTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgPEY+IEYgZm9vKEYgZiwgRi4uLiBvdGhlcnMpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBmO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiIgoJCSk7Cgl9CQkKCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4MDQ5IC0gY2hlY2ggaW52YWxpZCBhcnJheSBpbml0aWFsaXplcgoJcHVibGljIHZvaWQgdGVzdDM5MygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgYm9vbGVhbiB0ZXN0MSgpCXtcbiIgKyAKCQkJCSIJCWZvbyhudWxsLCBcImhlbGxvXCIpO1xuIiArIC8vIG5vIGluZmVyZW5jZSBvbiBleHBlY3RlZCB0eXBlCgkJCQkiCQlyZXR1cm4gdHJ1ZTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgPEY+IEYgZm9vKEYgZiwgRi4uLiBvdGhlcnMpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBmO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiIgoJCSk7Cgl9CQkJCgkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03ODAyNwoJcHVibGljIHZvaWQgdGVzdDM5NCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggXG4iICsgCgkJCQkie1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJpbnRlcmZhY2UgSVRlc3Q8QyBleHRlbmRzIFg+XG4iICsgCgkJCQkieyBcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiYWJzdHJhY3QgY2xhc3MgVGVzdDxDIGV4dGVuZHMgWD4gaW1wbGVtZW50cyBJVGVzdDxDPlxuIiArIAoJCQkJIntcbiIgKyAKCQkJCSIgIHByb3RlY3RlZCBNYW5hZ2VyPEM+IG1fbWFuYWdlcjtcbiIgKyAKCQkJCSIgIFxuIiArIAoJCQkJIiAgcHVibGljIElUZXN0PEM+IGdldCgpXG4iICsgCgkJCQkiICB7XG4iICsgCgkJCQkiICAgIHJldHVybiBtX21hbmFnZXIuZ2V0QnlJZChnZXRDbGFzcygpLCBuZXcgSW50ZWdlcigxKSk7XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgcHVibGljIHN0YXRpYyBjbGFzcyBNYW5hZ2VyPEMgZXh0ZW5kcyBYPlxuIiArIAoJCQkJIiAge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgPFQgZXh0ZW5kcyBJVGVzdDxDPj4gVCBnZXRCeUlkKENsYXNzPFQ+IGNscywgSW50ZWdlciBpZClcbiIgKyAKCQkJCSIgICAge1xuIiArIAoJCQkJIiAgICAgIHJldHVybiBudWxsO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiIgoJCSk7Cgl9CQkJCgkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NDExOSAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDM5NSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQgZXh0ZW5kcyBFeGNlcHRpb24+IHtcbiIgKyAKCQkJCSIJVCBlbGVtZW50O1xuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJdm9pZCBmb28oWDw/IHN1cGVyIE51bGxQb2ludGVyRXhjZXB0aW9uPiB4bnBlKSB7XG4iICsgCgkJCQkiCQl4bnBlLmVsZW1lbnQgPSBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJCSIJeG5wZS5lbGVtZW50ID0gbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIElPRXhjZXB0aW9uIHRvIGNhcHR1cmUtb2YgPyBzdXBlciBOdWxsUG9pbnRlckV4Y2VwdGlvblxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCgoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4MTM5IC0gZG93bmNhc3QgZ2VuZXJpYyBtZXRob2QgaW5mZXJlbmNlCglwdWJsaWMgdm9pZCB0ZXN0Mzk2KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uO1xuIiArIAoJCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKyAKCQkJCSJpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWFxuIiArIAoJCQkJIntcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyA8VD4gTGlzdDxUPiBlbXB0eUxpc3QoKSB7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxUPigpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgPFQ+IENvbGxlY3Rpb248VD4gZW1wdHlDb2xsZWN0aW9uKCkge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8VD4oKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIDxUPiBJdGVyYWJsZTxUPiBlbXB0eUl0ZXJhYmxlKCkge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8VD4oKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAJIC8vIGdlbmVyaWMgaW5mZXJlbmNlIHVzaW5nIGV4cGVjdGVkIGxocyB0eXBlOiBUIC0tPiBTdHJpbmdcbiIgKyAKCQkJCSIgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsTCA9IGVtcHR5TGlzdCgpOyAvLyAxXG4iICsgCgkJCQkiICAgICAgICBcbiIgKyAKCQkJCSIgICAgCSAvLyBnZW5lcmljIGluZmVyZW5jZSB1c2luZyBleHBlY3RlZCBjYXN0IHR5cGU6IFQgLS0+IFN0cmluZ1xuIiArIAoJCQkJIiAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGNMID0gKENvbGxlY3Rpb248U3RyaW5nPillbXB0eUxpc3QoKTsgLy8gMlxuIiArIAoJCQkJIiAgICAgICAgXG4iICsgCgkJCQkiICAgIAkgLy8gZ2VuZXJpYyBpbmZlcmVuY2UgdXNpbmcgZXhwZWN0ZWQgY2FzdCB0eXBlOiBUIC0tPiBTdHJpbmdcbiIgKyAKCQkJCSIgICAgICAgIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gaUwgPSAoSXRlcmFibGU8U3RyaW5nPillbXB0eUxpc3QoKTsgLy8gM1xuIiArIAoJCQkJIiAgICAgICAgXG4iICsgCgkJCQkiICAgIAkgLy8gZ2VuZXJpYyBpbmZlcmVuY2UgdXNpbmcgZXhwZWN0ZWQgbGhzIHR5cGU6IFQgLS0+IFN0cmluZ1xuIiArIAoJCQkJIiAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGNDID0gZW1wdHlDb2xsZWN0aW9uKCk7IC8vIDRcbiIgKyAKCQkJCSIgICAgICAgIFxuIiArIAoJCQkJIiAgICAJIC8vIGdlbmVyaWMgaW5mZXJlbmNlIHVzaW5nIGV4cGVjdGVkIGNhc3QgdHlwZTogVCAtLT4gU3RyaW5nXG4iICsgCgkJCQkiICAgICAgICBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IGlDID0gKEl0ZXJhYmxlPFN0cmluZz4pZW1wdHlDb2xsZWN0aW9uKCk7IC8vIDVcbiIgKyAKCQkJCSIgICAgICAgIFxuIiArIAoJCQkJIiAgICAJIC8vIGdlbmVyaWMgaW5mZXJlbmNlIHVzaW5nIGV4cGVjdGVkIGxocyB0eXBlOiBUIC0tPiBTdHJpbmdcbiIgKyAKCQkJCSIgICAgICAgIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gaUkgPSBlbXB0eUl0ZXJhYmxlKCk7IC8vIDZcbiIgKyAKCQkJCSIgICAgICAgIFxuIiArIAoJCQkJIiAgICAJIC8vIGdlbmVyaWMgaW5mZXJlbmNlIHVzaW5nIGV4cGVjdGVkIGxocyB0eXBlOiBUIC0tPiBTdHJpbmdcbiIgKyAKCQkJCSIgICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBjTDIgPSBlbXB0eUxpc3QoKTsgLy8gN1xuIiArIAoJCQkJIiAgICAgICAgXG4iICsgCgkJCQkiICAgIAkgLy8gZ2VuZXJpYyBpbmZlcmVuY2UgdXNpbmcgZXhwZWN0ZWQgbGhzIHR5cGU6IFQgLS0+IFN0cmluZ1xuIiArIAoJCQkJIiAgICAgICAgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBpQzIgPSBlbXB0eUNvbGxlY3Rpb24oKTsgLy8gOFxuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifSIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyMilcclxuIiArIAoJCQkiCWZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBjTCA9IChDb2xsZWN0aW9uPFN0cmluZz4pZW1wdHlMaXN0KCk7IC8vIDJcclxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIkNhbm5vdCBjYXN0IGZyb20gTGlzdDxPYmplY3Q+IHRvIENvbGxlY3Rpb248U3RyaW5nPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDI1KVxyXG4iICsgCgkJCSIJZmluYWwgSXRlcmFibGU8U3RyaW5nPiBpTCA9IChJdGVyYWJsZTxTdHJpbmc+KWVtcHR5TGlzdCgpOyAvLyAzXHJcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIkNhbm5vdCBjYXN0IGZyb20gTGlzdDxPYmplY3Q+IHRvIEl0ZXJhYmxlPFN0cmluZz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzMSlcclxuIiArIAoJCQkiCWZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gaUMgPSAoSXRlcmFibGU8U3RyaW5nPillbXB0eUNvbGxlY3Rpb24oKTsgLy8gNVxyXG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJDYW5ub3QgY2FzdCBmcm9tIENvbGxlY3Rpb248T2JqZWN0PiB0byBJdGVyYWJsZTxTdHJpbmc+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzYxMzIKCXB1YmxpYyB2b2lkIHRlc3QzOTcoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbnRlcmZhY2UgSzE8QT4geyBcbiIgKyAKCQkJCSIgICAgICAgIHB1YmxpYyA8QiBleHRlbmRzIEE+IHZvaWQga2soSzE8Qj4geCk7IFxuIiArIAoJCQkJIn0gXG4iICsgCgkJCQkiIFxuIiArIAoJCQkJImNsYXNzIEsyPEM+IGltcGxlbWVudHMgSzE8Qz4geyBcbiIgKyAKCQkJCSIgICAgICAgIHB1YmxpYyA8RCBleHRlbmRzIEM+IHZvaWQga2soSzE8RD4geSkgeyBcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiSzI6OmtrKFwiICsgeS50b1N0cmluZygpICsgXCIpXCIpOyBcbiIgKyAKCQkJCSIgICAgICAgIH0gXG4iICsgCgkJCQkifSBcbiIgKyAKCQkJCSIgXG4iICsgCgkJCQkiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFxuIiArIAoJCQkJIiBcbiIgKyAKCQkJCSJpbnRlcmZhY2UgTDE8RT4geyBcbiIgKyAKCQkJCSIgICAgICAgIHB1YmxpYyB2b2lkIGxsKEwxPD8gZXh0ZW5kcyBFPiBhKTsgXG4iICsgCgkJCQkifSBcbiIgKyAKCQkJCSIgXG4iICsgCgkJCQkiY2xhc3MgTDI8S0s+IGltcGxlbWVudHMgTDE8S0s+IHsgXG4iICsgCgkJCQkiICAgICAgICBwdWJsaWMgdm9pZCBsbChMMTw/IGV4dGVuZHMgS0s+IGIpIHsgXG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIGxsMihiKTsgXG4iICsgCgkJCQkiICAgICAgICB9IFxuIiArIAoJCQkJIiBcbiIgKyAKCQkJCSIgICAgICAgIHByaXZhdGUgPExMIGV4dGVuZHMgS0s+IHZvaWQgbGwyKEwxPExMPiBjKSB7IFxuIiArIAoJCQkJIiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJMMjo6bGwyKFwiICsgYy50b1N0cmluZygpICsgXCIpXCIpOyBcbiIgKyAKCQkJCSIgICAgICAgIH0gXG4iICsgCgkJCQkifSBcbiIgKyAKCQkJCSIgXG4iICsgCgkJCQkiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFxuIiArIAoJCQkJIiBcbiIgKyAKCQkJCSJpbnRlcmZhY2UgTTE8SD4geyBcbiIgKyAKCQkJCSIgICAgICAgIHB1YmxpYyB2b2lkIG1tKE0xPD8gZXh0ZW5kcyBIPiBwKTsgXG4iICsgCgkJCQkifSBcbiIgKyAKCQkJCSIgXG4iICsgCgkJCQkiY2xhc3MgTTI8ST4gaW1wbGVtZW50cyBNMTxJPiB7IFxuIiArIAoJCQkJIiAgICAgICAgcHVibGljIDxKIGV4dGVuZHMgST4gdm9pZCBtbShNMTxKPiBxKSB7IFxuIiArIAoJCQkJIiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJNMjo6bW0oXCIgKyBxLnRvU3RyaW5nKCkgKyBcIilcIik7IFxuIiArIAoJCQkJIiAgICAgICAgfSBcbiIgKyAKCQkJCSJ9IFxuIiArIAoJCQkJIiBcbiIgKyAKCQkJCSIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gXG4iICsgCgkJCQkiIFxuIiArIAoJCQkJImNsYXNzIFhYICAgICAgICAgICAgeyBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gXCJYWFwiOyB9IH0gXG4iICsgCgkJCQkiY2xhc3MgWVkgZXh0ZW5kcyBYWCB7IHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiBcIllZXCI7IH0gfSBcbiIgKyAKCQkJCSJjbGFzcyBaWiBleHRlbmRzIFlZIHsgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIFwiWlpcIjsgfSB9IFxuIiArIAoJCQkJIiBcbiIgKyAKCQkJCSIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gXG4iICsgCgkJCQkiIFxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHsgXG4iICsgCgkJCQkiICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnW10pIHsgXG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIGdvSyhuZXcgSzI8WVk+KCkpOyBcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgZ29MKG5ldyBMMjxZWT4oKSk7IFxuIiArIAoJCQkJIiAgICAgICAgICAgICAgICBnb00obmV3IE0yPFlZPigpKTsgXG4iICsgCgkJCQkiICAgICAgICB9IFxuIiArIAoJCQkJIiBcbiIgKyAKCQkJCSIgXG4iICsgCgkJCQkiICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ29LKEsxPFlZPiBrKSB7IFxuIiArIAoJCQkJIiAgICAgICAgICAgICAgICAvLyBrLmtrKG5ldyBLMjxYWD4oKSk7IC8vIFdvdWxkIGZhaWwgXG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIGsua2sobmV3IEsyPFlZPigpKTsgXG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIGsua2sobmV3IEsyPFpaPigpKTsgXG4iICsgCgkJCQkiICAgICAgICB9IFxuIiArIAoJCQkJIiBcbiIgKyAKCQkJCSIgXG4iICsgCgkJCQkiICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ29MKEwxPFlZPiBsKSB7IFxuIiArIAoJCQkJIiAgICAgICAgICAgICAgICAvLyBsLmxsKG5ldyBMMjxYWD4oKSk7IC8vIFdvdWxkIGZhaWwgXG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIGwubGwobmV3IEwyPFlZPigpKTsgXG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIGwubGwobmV3IEwyPFpaPigpKTsgXG4iICsgCgkJCQkiICAgICAgICB9IFxuIiArIAoJCQkJIiBcbiIgKyAKCQkJCSIgXG4iICsgCgkJCQkiICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ29NKE0xPFlZPiBtKSB7IFxuIiArIAoJCQkJIiAgICAgICAgICAgICAgICAvLyBtLm1tKG5ldyBNMjxYWD4oKSk7IC8vIFdvdWxkIGZhaWwgXG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIG0ubW0obmV3IE0yPFlZPigpKTsgXG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIG0ubW0obmV3IE0yPFpaPigpKTsgXG4iICsgCgkJCQkiICAgICAgICB9IFxuIiArIAoJCQkJIn0iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMzMpXG4iICsgCgkJCSIJY2xhc3MgTTI8ST4gaW1wbGVtZW50cyBNMTxJPiB7IFxuIiArIAoJCQkiCSAgICAgIF5eXG4iICsgCgkJCSJUaGUgdHlwZSBNMjxJPiBtdXN0IGltcGxlbWVudCB0aGUgaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZCBNMTxJPi5tbShNMTw/IGV4dGVuZHMgST4pXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMzQpXG4iICsgCgkJCSIJcHVibGljIDxKIGV4dGVuZHMgST4gdm9pZCBtbShNMTxKPiBxKSB7IFxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5cbiIgKyAKCQkJIk5hbWUgY2xhc2g6IFRoZSBtZXRob2QgbW0oTTE8Sj4pIG9mIHR5cGUgTTI8ST4gaGFzIHRoZSBzYW1lIGVyYXN1cmUgYXMgbW0oTTE8PyBleHRlbmRzIEg+KSBvZiB0eXBlIE0xPEg+IGJ1dCBkb2VzIG5vdCBvdmVycmlkZSBpdFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNDEpXG4iICsgCgkJCSIJY2xhc3MgWFggICAgICAgICAgICB7IHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiBcIlhYXCI7IH0gfSBcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIHRvU3RyaW5nKCkgb2YgdHlwZSBYWCBzaG91bGQgYmUgdGFnZ2VkIHdpdGggQE92ZXJyaWRlIHNpbmNlIGl0IGFjdHVhbGx5IG92ZXJyaWRlcyBhIHN1cGVyY2xhc3MgbWV0aG9kXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI0LiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA0MilcbiIgKyAKCQkJIgljbGFzcyBZWSBleHRlbmRzIFhYIHsgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIFwiWVlcIjsgfSB9IFxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgdG9TdHJpbmcoKSBvZiB0eXBlIFlZIHNob3VsZCBiZSB0YWdnZWQgd2l0aCBAT3ZlcnJpZGUgc2luY2UgaXQgYWN0dWFsbHkgb3ZlcnJpZGVzIGEgc3VwZXJjbGFzcyBtZXRob2RcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjUuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDQzKVxuIiArIAoJCQkiCWNsYXNzIFpaIGV4dGVuZHMgWVkgeyBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gXCJaWlwiOyB9IH0gXG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCB0b1N0cmluZygpIG9mIHR5cGUgWlogc2hvdWxkIGJlIHRhZ2dlZCB3aXRoIEBPdmVycmlkZSBzaW5jZSBpdCBhY3R1YWxseSBvdmVycmlkZXMgYSBzdXBlcmNsYXNzIG1ldGhvZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCgkvLyBjYW5ub3QgYWxsb2NhdGUgcGFyYW1ldGVyaXplZCB0eXBlIHdpdGggd2lsZGNhcmRzCglwdWJsaWMgdm9pZCB0ZXN0Mzk4KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQ+IHtcbiIgKyAKCQkJCSIgICAgWCgpe1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCW5ldyBYPD8+KCk7XG4iICsgCgkJCQkiCQluZXcgWDw/IGV4dGVuZHMgU3RyaW5nPigpO1xuIiArIAoJCQkJIgkJbmV3IFg8Pz4oKXt9O1xuIiArIAoJCQkJIgkJbmV3IFg8PyBleHRlbmRzIFN0cmluZz4oKXt9O1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgksCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIgluZXcgWDw/PigpO1xuIiArIAoJCQkiCSAgICBeXG4iICsgCgkJCSJDYW5ub3QgaW5zdGFudGlhdGUgdGhlIHR5cGUgWDw/PlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJbmV3IFg8PyBleHRlbmRzIFN0cmluZz4oKTtcbiIgKyAKCQkJIgkgICAgXlxuIiArIAoJCQkiQ2Fubm90IGluc3RhbnRpYXRlIHRoZSB0eXBlIFg8PyBleHRlbmRzIFN0cmluZz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCW5ldyBYPD8+KCl7fTtcbiIgKyAKCQkJIgkgICAgXlxuIiArIAoJCQkiVGhlIHR5cGUgbmV3IFgoKXt9IGNhbm5vdCBleHRlbmQgb3IgaW1wbGVtZW50IFg8Pz4uIEEgc3VwZXJ0eXBlIG1heSBub3Qgc3BlY2lmeSBhbnkgd2lsZGNhcmRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjQuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCW5ldyBYPD8gZXh0ZW5kcyBTdHJpbmc+KCl7fTtcbiIgKyAKCQkJIgkgICAgXlxuIiArIAoJCQkiVGhlIHR5cGUgbmV3IFgoKXt9IGNhbm5vdCBleHRlbmQgb3IgaW1wbGVtZW50IFg8PyBleHRlbmRzIFN0cmluZz4uIEEgc3VwZXJ0eXBlIG1heSBub3Qgc3BlY2lmeSBhbnkgd2lsZGNhcmRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0Mzk5KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQ+IHtcbiIgKyAKCQkJCSIgICAgVCB0O1xuIiArIAoJCQkJIiAgICBYKFQgdCl7XG4iICsgCgkJCQkiICAgICAgICB0aGlzLnQgPSB0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCVg8PyBleHRlbmRzIEFYPiB4ID0gbmV3IFg8QVg8TWF0aD4+KG5ldyBBWDxTdHJpbmc+KCkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIEFYPFA+IHtcbiIgKyAKCQkJCSIgICAgUCBmb28oKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCVg8PyBleHRlbmRzIEFYPiB4ID0gbmV3IFg8QVg8TWF0aD4+KG5ldyBBWDxTdHJpbmc+KCkpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgY29uc3RydWN0b3IgWDxBWDxNYXRoPj4oQVg8U3RyaW5nPikgaXMgdW5kZWZpbmVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsJCgl9CgkKCXB1YmxpYyB2b2lkIHRlc3Q0MDAoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VD4ge1xuIiArIAoJCQkJIiAgICBUIHQ7XG4iICsgCgkJCQkiICAgIFgoWDw/IGV4dGVuZHMgVD4geHQpe1xuIiArIAoJCQkJIiAgICAgICAgdGhpcy50ID0geHQudDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlYPD8gZXh0ZW5kcyBBWD4geCA9IG5ldyBYPEFYPE1hdGg+PihuZXcgWDxBWDxTdHJpbmc+PihudWxsKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQVg8UD4ge1xuIiArIAoJCQkJIiAgICBQIGZvbygpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSJ9IiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCVg8PyBleHRlbmRzIEFYPiB4ID0gbmV3IFg8QVg8TWF0aD4+KG5ldyBYPEFYPFN0cmluZz4+KG51bGwpKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlRoZSBjb25zdHJ1Y3RvciBYPEFYPE1hdGg+PihYPEFYPFN0cmluZz4+KSBpcyB1bmRlZmluZWRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwkKCX0JCQoKCS8vIGxlZ2FsIHRvIGFsbG9jYXRlL2luaGVyaXQgZnJvbSBhIHR5cGUgd2l0aCB3aWxkY2FyZHMsIGFzIGxvbmcgYXMgbm9uIGRpcmVjdCBhcmd1bWVudHMKCXB1YmxpYyB2b2lkIHRlc3Q0MDEoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCgkJCQkiCQluZXcgWDxYPD8+PigpO1xuIiArIAoJCQkJIgkJbmV3IFg8WDw/IGV4dGVuZHMgU3RyaW5nPj4oKTtcbiIgKyAKCQkJCSIJCW5ldyBYPFg8Pz4+KCl7fTtcbiIgKyAKCQkJCSIJCW5ldyBYPFg8PyBleHRlbmRzIFN0cmluZz4+KCl7fTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn0iLAoJCQl9LAoJCQkiIik7CQoJfQkKCQoJLy8gbGVnYWwgdG8gaW5oZXJpdCBmcm9tIGEgdHlwZSB3aXRoIHdpbGRjYXJkcywgYXMgbG9uZyBhcyBub24gZGlyZWN0IGFyZ3VtZW50cwoJcHVibGljIHZvaWQgdGVzdDQwMigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBZPFk8Pz4+IHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWTxUPiB7fSIsCgkJCX0sCgkJCSIiKTsJCgl9CgkvLyBjaGVjayBjYXN0IGJldHdlZW4gZ2VuZXJpYyB0eXBlcwoJcHVibGljIHZvaWQgdGVzdDQwMygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxUPiB7XG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIgl2b2lkIGZvbyhYPFg8PyBleHRlbmRzIFN0cmluZz4+IHhzKSB7XG4iICsgCgkJCQkiCQlYPFg8U3RyaW5nPj4geCA9IChYPFg8U3RyaW5nPj4pIHhzO1xuIiArIAoJCQkJIgkJWm9yayB6O1xuIiArCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJWDxYPFN0cmluZz4+IHggPSAoWDxYPFN0cmluZz4+KSB4cztcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJDYW5ub3QgY2FzdCBmcm9tIFg8WDw/IGV4dGVuZHMgU3RyaW5nPj4gdG8gWDxYPFN0cmluZz4+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIglab3JrIHo7XG4iICsgCgkJCSIJXl5eXlxuIiArIAoJCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsJCgl9CgkKCS8vIGNoZWNrIGNhc3QgYmV0d2VlbiBnZW5lcmljIHR5cGVzCglwdWJsaWMgdm9pZCB0ZXN0NDA0KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQ+IHtcbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCXZvaWQgZm9vKFg8PyBleHRlbmRzIFN0cmluZz4geHMpIHtcbiIgKyAKCQkJCSIJCVg8U3RyaW5nPiB4ID0gKFg8U3RyaW5nPikgeHM7XG4iICsgCgkJCQkiCQlab3JrIHo7XG4iICsKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCVg8U3RyaW5nPiB4ID0gKFg8U3RyaW5nPikgeHM7XG4iICsgCgkJCSIJICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBjYXN0IGZyb20gWDxjYXB0dXJlLW9mID8gZXh0ZW5kcyBTdHJpbmc+IHRvIFg8U3RyaW5nPiBpcyBhY3R1YWxseSBjaGVja2luZyBhZ2FpbnN0IHRoZSBlcmFzZWQgdHlwZSBYXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIglab3JrIHo7XG4iICsgCgkJCSIJXl5eXlxuIiArIAoJCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsJCgl9CQkKCgkvLyBjaGVjayBjYXN0IGJldHdlZW4gZ2VuZXJpYyB0eXBlcwoJcHVibGljIHZvaWQgdGVzdDQwNSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIDxFPiB7XG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIgk8VD4gdm9pZCBmb28oWDxYPFQ+PiB4cykge1xuIiArIAoJCQkJIgkJWDxYPFN0cmluZz4+IHggPSAoWDxYPFN0cmluZz4+KSB4cztcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgk8VD4gdm9pZCBiYXIoWDxUPiB4cykge1xuIiArIAoJCQkJIgkJWDxTdHJpbmc+IHggPSAoWDxTdHJpbmc+KSB4cztcbiIgKyAKCQkJCSIJfQlcbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJWDxYPFN0cmluZz4+IHggPSAoWDxYPFN0cmluZz4+KSB4cztcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJDYW5ub3QgY2FzdCBmcm9tIFg8WDxUPj4gdG8gWDxYPFN0cmluZz4+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCVg8U3RyaW5nPiB4ID0gKFg8U3RyaW5nPikgeHM7XG4iICsgCgkJCSIJICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBjYXN0IGZyb20gWDxUPiB0byBYPFN0cmluZz4gaXMgYWN0dWFsbHkgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZXJhc2VkIHR5cGUgWFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7CQoJfQkJCgkKCXB1YmxpYyB2b2lkIHRlc3Q0MDYoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYPEsxLFYxPiBpbXBsZW1lbnRzIE08SzEsVjE+IHtcbiIgKyAKCQkJCSIJYWJzdHJhY3QgTTxLMSxWMT4gb3RoZXIoKTtcbiIgKyAKCQkJCSIJcHVibGljIFM8RTxLMSxWMT4+IGVudHJ5U2V0KCkge1xuIiArIAoJCQkJIgkJcmV0dXJuIG90aGVyKCkuZW50cnlTZXQoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJpbnRlcmZhY2UgTTxLMixWMj4ge1xuIiArIAoJCQkJIgkgaW50ZXJmYWNlIEU8SzMsVjM+IHsgfVxuIiArIAoJCQkJIgkgUzxFPEsyLCBWMj4+IGVudHJ5U2V0KCk7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImludGVyZmFjZSBTPFQ+IHt9IiwKCQkJfSwKCQkJIiIpOwkKCX0JCQoJCglwdWJsaWMgdm9pZCB0ZXN0NDA3KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWDxLMSxWMT4gaW1wbGVtZW50cyBNPEsxLFYxPiB7XG4iICsgCgkJCQkiCWFic3RyYWN0IE08SzEsVjE+IG90aGVyKCk7XG4iICsgCgkJCQkiCXB1YmxpYyBTPE0uRTxLMSxWMT4+IGVudHJ5U2V0KCkge1xuIiArIC8vIHF1YWxpZmllZCBNLkUuLi4KCQkJCSIJCXJldHVybiBvdGhlcigpLmVudHJ5U2V0KCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiaW50ZXJmYWNlIE08SzIsVjI+IHtcbiIgKyAKCQkJCSIJIGludGVyZmFjZSBFPEszLFYzPiB7IH1cbiIgKyAKCQkJCSIJIFM8RTxLMiwgVjI+PiBlbnRyeVNldCgpO1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJpbnRlcmZhY2UgUzxUPiB7fSIsCgkJCX0sCgkJCSIiKTsJCgl9CQkJCgoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4MDA4CglwdWJsaWMgdm9pZCB0ZXN0NDA4KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgSW50ZWdlcltdIGdldFR5cGVzKCkge1xuIiArIAoJCQkJIiAgICAgICAgTGlzdDxJbnRlZ2VyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpO1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIGxpc3QgPT0gbnVsbCBcbiIgKyAKCQkJCSIgICAgICAgICAgICA/IG5ldyBJbnRlZ2VyWzBdIFxuIiArIAoJCQkJIiAgICAgICAgICAgIDogbGlzdC50b0FycmF5KG5ldyBJbnRlZ2VyW2xpc3Quc2l6ZSgpXSk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgQ2xhc3MgY2xhenogPSBudWxsO1xuIiArIAoJCQkJIiAgICAgICAgdHJ5IHtcbiIgKyAKCQkJCSIgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoXCJYXCIpO1xuIiArIAoJCQkJIiAgICAJICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpO1xuIiArIAoJCQkJIiAgICAgICAgfVxuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifSIsCgkJCX0sCgkJCSJTVUNDRVNTIik7CQoJfQkKCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4MDA4CglwdWJsaWMgdm9pZCB0ZXN0NDA5KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgTnVtYmVyIGdldFR5cGVzKCkge1xuIiArIAoJCQkJIiAgICAgICAgTGlzdDxJbnRlZ2VyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpO1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIGxpc3QgPT0gbnVsbCBcbiIgKyAKCQkJCSIgICAgICAgICAgICA/IEZsb2F0LnZhbHVlT2YoMClcbiIgKyAKCQkJCSIgICAgICAgICAgICA6IGxpc3QuZ2V0KDApO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDtcbiIgKyAKCQkJCSIgICAgICAgIHRyeSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKFwiWFwiKTtcbiIgKyAKCQkJCSIgICAgCSAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTtcbiIgKyAKCQkJCSIgICAgICAgIH1cbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn0iLAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwkKCX0JCQkKCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQxNzgKCXB1YmxpYyB2b2lkIHRlc3Q0MTAoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyB2b2lkIHdyaXRlKExpc3Q8PyBzdXBlciBFeGNlcHRpb24+IGxpc3QpIHtcbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiICBsaXN0LmFkZChuZXcgUnVudGltZUV4Y2VwdGlvbigpKTsgICAgICAgICAgICAgLy8gd29ya3NcbiIgKyAKCQkJCSIgIGxpc3QuYWRkKG5ldyBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uKCkpOyAvLyB3b3Jrc1xuIiArIAoJCQkJIiAgRXhjZXB0aW9uIGV4YyA9IG5ldyBFeGNlcHRpb24oKTtcbiIgKyAKCQkJCSIgIGxpc3QuYWRkKGV4Yyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3Jrc1xuIiArIAoJCQkJIiAgbGlzdC5hZGQobmV3IE9iamVjdCgpKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBmYWlsXG4iICsgCgkJCQkiICBsaXN0LmFkZChuZXcgVGhyb3dhYmxlKCkpOyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGZhaWxcbiIgKyAKCQkJCSIgIGxpc3QuYWRkKG5ldyBFeGNlcHRpb24oKSk7ICAgICAgICAgICAgICAgICAgICAvLyB3b3Jrc1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJ9IiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMSlcbiIgKyAKCQkJIglsaXN0LmFkZChuZXcgT2JqZWN0KCkpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGZhaWxcbiIgKyAKCQkJIgkgICAgIF5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCBhZGQoY2FwdHVyZS1vZiA/IHN1cGVyIEV4Y2VwdGlvbikgaW4gdGhlIHR5cGUgTGlzdDxjYXB0dXJlLW9mID8gc3VwZXIgRXhjZXB0aW9uPiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoT2JqZWN0KVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEyKVxuIiArIAoJCQkiCWxpc3QuYWRkKG5ldyBUaHJvd2FibGUoKSk7ICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgZmFpbFxuIiArIAoJCQkiCSAgICAgXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8gc3VwZXIgRXhjZXB0aW9uKSBpbiB0aGUgdHlwZSBMaXN0PGNhcHR1cmUtb2YgPyBzdXBlciBFeGNlcHRpb24+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChUaHJvd2FibGUpXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsJCgl9CQkJCgkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03ODAxNSAKCXB1YmxpYyB2b2lkIHRlc3Q0MTEoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImludGVyZmFjZSBJPFQ+IHtcbiIgKyAKCQkJCSIgICAgdm9pZCBtMShUIHQpO1xuIiArIAoJCQkJIiAgICB2b2lkIG0yKFQgdCk7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIEEge307XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgQiBpbXBsZW1lbnRzIEk8QT4ge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgdm9pZCBtMShBIGEpIHtcbiIgKyAKCQkJCSIgICAgCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIHZvaWQgbTIoQSBhKSB7fVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIG0obmV3IEIoKSk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG0oSTxBPiB4KSB7XG4iICsgCgkJCQkiICAgICAgICB4Lm0xKG51bGwpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifSIsCgkJCX0sCgkJCSJTVUNDRVNTIik7CQoJfQkJCgkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03ODQ2NyAKCXB1YmxpYyB2b2lkIF90ZXN0NDEyKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGZpcnN0KFQuLi4gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIGFyZ3NbMF07XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgCWlmIChmYWxzZSkgeyBcbiIgKyAKCQkJCSIgICAgCQlTdHJpbmcgcyA9IGZpcnN0KCk7IFxuIiArIAoJCQkJIiAgICAJCWludCBpOyBcbiIgKyAKCQkJCSIgICAgCQlpKys7IFxuIiArIAoJCQkJIiAgICAJfVxuIiArIAoJCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGZpcnN0KFwiU1VDQ0VTU1wiLCBcIkxpc3RcIikpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgWm9yayB6O1xuIiArCgkJCQkifSIsCgkJCX0sCgkJCSJzaG91bGQgd2FybiBhYm91dCB1bmNoZWNrZWQgYXJyYXkgY29udmVyc2lvbiBmb3IgVFtdIik7CQoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0NDEzKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPiB7XG4iICsgCgkJCQkiCXN0YXRpYyBjbGFzcyBUTE0ge1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiICAgIFRMTSBnZXRNYXAoVEwgdCkge1xuIiArIAoJCQkJIiAgICAgICAgcmV0dXJuIHQudGxzO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHN0YXRpYyBUTE0gY3JlYXRlSW5oZXJpdGVkTWFwKFRMTSBwYXJlbnRNYXApIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiBuZXcgVExNKCk7XG4iICsgCgkJCQkiICAgIH0gIFxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBUTCB7XG4iICsgCgkJCQkiICAgWC5UTE0gdGxzID0gbnVsbDtcbiIgKyAKCQkJCSJ9IiwKCQkJfSwKCQkJIiIpOwkKCX0KCQoJcHVibGljIHZvaWQgdGVzdDQxNCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIgl2b2lkIGZvbyhMIGwsIEM8PyBzdXBlciBYPiBjKSB7XG4iICsgCgkJCQkiCQliYXIobCwgYyk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJPFQ+IHZvaWQgYmFyKEw8VD4gbCwgQzw/IHN1cGVyIFQ+IGMpIHsgXG4iICsgCgkJCQkiCX0JXG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEM8RT4ge31cbiIgKyAKCQkJCSJjbGFzcyBMPEU+IHt9IiwKCQkJfSwKCQkJIiIpOwkKCX0KCQoJcHVibGljIHZvaWQgdGVzdDQxNSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgUzxNLkU8T2JqZWN0LE9iamVjdD4+IGZvbyhITSBobSkge1xuIiArIAoJCQkJIgkJcmV0dXJuIEMuYmFyKGhtKS5mb28oKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBDIHtcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyA8SyxWPiBNPEssVj4gYmFyKE08PyBleHRlbmRzIEssPyBleHRlbmRzIFY+IG0pIHtcbiIgKyAKCQkJCSIJCXJldHVybiBudWxsO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIFM8RT4ge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJhYnN0cmFjdCBjbGFzcyBITTxVLFY+IGltcGxlbWVudHMgTTxVLFY+e1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJpbnRlcmZhY2UgTTxBLEI+IHtcbiIgKyAKCQkJCSIJc3RhdGljIGNsYXNzIEU8UyxUPiB7fVxuIiArIAoJCQkJIglTPEU8QSxCPj4gZm9vKCk7CVxuIiArIAoJCQkJIn0iLAoJCQl9LAoJCQkiIik7CQoJfQkKCQoJcHVibGljIHZvaWQgdGVzdDQxNigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgUzxNLkU8T2JqZWN0LFN0cmluZz4+IGZvbyhITSBobSkge1xuIiArIAoJCQkJIiAgICAJTTxPYmplY3QsIFN0cmluZz4gbSA9IEMuYmFyKGhtKTtcbiIgKyAKCQkJCSIgICAgCWlmIChmYWxzZSkgcmV0dXJuIG0uZm9vKCk7XG4iICsgCgkJCQkiCQlyZXR1cm4gQy5iYXIoaG0pLmZvbygpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEMge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIDxLLFY+IE08SyxWPiBiYXIoTTw/IGV4dGVuZHMgSyw/IGV4dGVuZHMgVj4gbSkge1xuIiArIAoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgUzxFPiB7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImFic3RyYWN0IGNsYXNzIEhNPFUsVj4gaW1wbGVtZW50cyBNPFUsVj57XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImludGVyZmFjZSBNPEEsQj4ge1xuIiArIAoJCQkJIglzdGF0aWMgY2xhc3MgRTxTLFQ+IHt9XG4iICsgCgkJCQkiCVM8RTxBLEI+PiBmb28oKTsJXG4iICsgCgkJCQkifSIsCgkJCX0sCgkJCSIiKTsJCgl9CgkKCXB1YmxpYyB2b2lkIHRlc3Q0MTcoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPEU+IHtcbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCTxUPiBYPFQ+IGZvbyhYPFQ+IHh0KSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglYPEU+IGlkZW50aXR5KCkge1xuIiArIAoJCQkJIgkJcmV0dXJuIHRoaXM7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBiYXIoWCB4KSB7XG4iICsgCgkJCQkiCQlYPFN0cmluZz4geHMgPSBmb28oeCkuaWRlbnRpdHkoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsJCgl9CQkJCgkKCXB1YmxpYyB2b2lkIHRlc3Q0MTgoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPEU+IHtcbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCTxUPiBYPFQ+IGZvbyhYPFQ+IHh0LCBYPFQ+IHh0Mikge1xuIiArIAoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJWDxFPiBpZGVudGl0eSgpIHtcbiIgKyAKCQkJCSIJCXJldHVybiB0aGlzO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXZvaWQgYmFyKFggeCwgWDxTdHJpbmc+IHhzKSB7XG4iICsgCgkJCQkiCQlYPFN0cmluZz4geHMyID0gZm9vKHgsIHhzKS5pZGVudGl0eSgpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIiIpOwkKCX0JCQkKCQoJcHVibGljIHZvaWQgdGVzdDQxOSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8RT4ge1xuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJPFQsVT4gWDxUPiBmb28oWDxUPiB4dCwgWDxVPiB4dDIpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBudWxsO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCVg8RT4gaWRlbnRpdHkoKSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gdGhpcztcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgl2b2lkIGJhcihYIHgsIFg8U3RyaW5nPiB4cykge1xuIiArIAoJCQkJIgkJWDxTdHJpbmc+IHhzMiA9IGZvbyh4LCB4cykuaWRlbnRpdHkoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsJCgl9CQkKCQoJcHVibGljIHZvaWQgdGVzdDQyMCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8RT4ge1xuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJPFQsVT4gWDxVPiBmb28oWDxUPiB4dCwgWDxVPiB4dDIpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBudWxsO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCVg8RT4gaWRlbnRpdHkoKSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gdGhpcztcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgl2b2lkIGJhcihYIHgsIFg8U3RyaW5nPiB4cykge1xuIiArIAoJCQkJIgkJWDxTdHJpbmc+IHhzMiA9IGZvbyh4LCB4cykuaWRlbnRpdHkoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsJCgl9CQkKCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4ODYzCglwdWJsaWMgdm9pZCB0ZXN0NDIxKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiVGVzdC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7XG4iICsKCQkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsKCQkJCSJpbXBvcnQgamF2YS51dGlsLk1hcDtcbiIgKwoJCQkJIlxuIiArCgkJCQkicHVibGljIGNsYXNzIFRlc3RcbiIgKwoJCQkJIntcbiIgKwoJCQkJIiAgcHJvdGVjdGVkIE1hcDxDbGFzczw/IGV4dGVuZHMgT2JqZWN0PiwgTGlzdDxPYmplY3Q+PiBtX3Rlc3RcbiIgKwoJCQkJIiAgICA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+LCBMaXN0PE9iamVjdD4+KCk7XG4iICsKCQkJCSJ9XG4iLAoJCQkJIlRlc3QyLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKwoJCQkJImltcG9ydCBqYXZhLnV0aWwuTWFwO1xuIiArCgkJCQkiXG4iICsKCQkJCSJwdWJsaWMgY2xhc3MgVGVzdDIgZXh0ZW5kcyBUZXN0XG4iICsKCQkJCSJ7XG4iICsKCQkJCSIgIHB1YmxpYyBNYXA8Q2xhc3M8PyBleHRlbmRzIE9iamVjdD4sIExpc3Q8T2JqZWN0Pj4gdGVzdCgpXG4iICsKCQkJCSIgIHtcbiIgKwoJCQkJIiAgICByZXR1cm4gbV90ZXN0O1xuIiArCgkJCQkiICB9XG4iICsKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiIik7CQoJfQoJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzg3MDQKCXB1YmxpYyB2b2lkIHRlc3Q0MjIoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPiB7XG4iICsKCQkJCSIJU3RyaW5nIGZvbygpIHtcbiIgKwoJCQkJIgkJcmV0dXJuIG5ldyBYKCk7XG4iICsKCQkJCSIJfVxuIiArCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCXJldHVybiBuZXcgWCgpO1xuIiArIAoJCQkiCSAgICAgICBeXl5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFggdG8gU3RyaW5nXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDQyMygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgICAgc3RhdGljIDxUIGV4dGVuZHMgWD4gVCBiYXIoKSB7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBzdGF0aWMgPFUgZXh0ZW5kcyBYJlJ1bm5hYmxlPiBVIGZvbygpIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiBudWxsO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHtcbiIgKyAKCQkJCSIgICAgCWJhcigpO1xuIiArIAoJCQkJIiAgICAgICAgZm9vKCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJ9IiwKCQkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTIpXG4iICsgCgkJIglmb28oKTtcbiIgKyAKCQkiCV5eXlxuIiArIAoJCSJCb3VuZCBtaXNtYXRjaDogVGhlIGdlbmVyaWMgbWV0aG9kIGZvbygpIG9mIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoKSBzaW5jZSB0aGUgdHlwZSBYIGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VSBleHRlbmRzIFggJiBSdW5uYWJsZT5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQoJCglwdWJsaWMgdm9pZCB0ZXN0NDI0KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIgk8VCBleHRlbmRzIEE+IFQgZm9vKFQgdCkge1xuIiArIAoJCQkJIgkJcmV0dXJuIHQ7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJbmV3IFgoKS5iYXIoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgl2b2lkIGJhcigpIHtcbiIgKyAKCQkJCSIJCUIgYiA9IGZvbyhuZXcgQigpKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBBIHt9XG4iICsgCgkJCQkiY2xhc3MgQiBleHRlbmRzIEEge31cbiIgKyAKCQkJCSJcbiIsCgkJCX0sCgkJIiIpOwoJfQkJCgkKCS8vIGNoZWNrIHRpZWJyZWFrIGVsaW1pbmF0ZXMgcmVsYXRlZCBnZW5lcmljIG1ldGhvZHMgd2hpY2ggYXJlIGxlc3Mgc3BlY2lmaWMKCXB1YmxpYyB2b2lkIHRlc3Q0MjUoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHN0YXRpYyA8RSBleHRlbmRzIEE+IHZvaWQgbShFIGUpIHsgU3lzdGVtLm91dC5wcmludGxuKFwiQTpcIitlLmdldENsYXNzKCkpOyB9XG4iICsgCgkJCQkiICAgIHN0YXRpYyA8RiBleHRlbmRzIEI+IHZvaWQgbShGIGYpIHRocm93cyBFeGNlcHRpb24geyBTeXN0ZW0ub3V0LnByaW50bG4oXCJCOlwiK2YuZ2V0Q2xhc3MoKSk7IH1cbiIgKyAKCQkJCSIgICAgc3RhdGljIDxHIGV4dGVuZHMgQz4gdm9pZCBtKEcgZykgdGhyb3dzIElPRXhjZXB0aW9uIHsgU3lzdGVtLm91dC5wcmludGxuKFwiQzpcIitnLmdldENsYXNzKCkpOyB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIG0obmV3IEEoKSk7XG4iICsgCgkJCQkiICAgICAgICBtKG5ldyBCKCkpO1xuIiArIAoJCQkJIiAgICAgICAgbShuZXcgQygpKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBBIHt9XG4iICsgCgkJCQkiY2xhc3MgQiBleHRlbmRzIEEge31cbiIgKyAKCQkJCSJjbGFzcyBDIGV4dGVuZHMgQSB7fVxuIiArIAoJCQkJIlxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMClcbiIgKyAKCQkJIgltKG5ldyBCKCkpO1xuIiArIAoJCQkiCV5eXl5eXl5eXl5cbiIgKyAKCQkJIlVuaGFuZGxlZCBleGNlcHRpb24gdHlwZSBFeGNlcHRpb25cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMSlcbiIgKyAKCQkJIgltKG5ldyBDKCkpO1xuIiArIAoJCQkiCV5eXl5eXl5eXl5cbiIgKyAKCQkJIlVuaGFuZGxlZCBleGNlcHRpb24gdHlwZSBJT0V4Y2VwdGlvblxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCgkKCS8vIGNoZWNrIGluZmVycmVkIHJldHVybiB0eXBlcyBhcmUgdHJ1bHkgYmFzZWQgb24gYXJndW1lbnRzLCBhbmQgbm90IG9uIHBhcmFtZXRlciBlcmFzdXJlcwoJcHVibGljIHZvaWQgdGVzdDQyNigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBzdGF0aWMgPEUgZXh0ZW5kcyBBPiBFIG0oRSBlKSB7IFN5c3RlbS5vdXQucHJpbnQoXCJbQTpcIitlLmdldENsYXNzKCkrXCJdXCIpOyByZXR1cm4gZTsgfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBBIGEgPSBtKG5ldyBBKCkpO1xuIiArIAoJCQkJIiAgICAgICAgQiBiID0gbShuZXcgQigpKTtcbiIgKyAKCQkJCSIgICAgICAgIEMgYyA9IG0obmV3IEMoKSk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgQSB7fVxuIiArIAoJCQkJImNsYXNzIEIgZXh0ZW5kcyBBIHt9XG4iICsgCgkJCQkiY2xhc3MgQyBleHRlbmRzIEEge31cbiIsCgkJCX0sCgkJCSJbQTpjbGFzcyBBXVtBOmNsYXNzIEJdW0E6Y2xhc3MgQ10iKTsKCX0JCQkKCQoJLy8gY2hlY2sgaW5mZXJyZWQgcmV0dXJuIHR5cGVzIGFyZSB0cnVseSBiYXNlZCBvbiBhcmd1bWVudHMsIGFuZCBub3Qgb24gcGFyYW1ldGVyIGVyYXN1cmVzCglwdWJsaWMgdm9pZCB0ZXN0NDI3KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHN0YXRpYyA8RSBleHRlbmRzIEE+IEUgbShFIGUsIEUuLi4gZTIpIHsgU3lzdGVtLm91dC5wcmludChcIltBOlwiK2UuZ2V0Q2xhc3MoKStcIl1cIik7IHJldHVybiBlOyB9XG4iICsgCgkJCQkiICAgIHN0YXRpYyA8RiBleHRlbmRzIEI+IEYgbShGIGYsIEYuLi4gZjIpIHsgU3lzdGVtLm91dC5wcmludChcIltCOlwiK2YuZ2V0Q2xhc3MoKStcIl1cIik7IHJldHVybiBmOyB9XG4iICsgCgkJCQkiICAgIHN0YXRpYyA8RyBleHRlbmRzIEM+IEcgbShHIGcsIEcuLi4gZzIpIHsgU3lzdGVtLm91dC5wcmludChcIltDOlwiK2cuZ2V0Q2xhc3MoKStcIl1cIik7IHJldHVybiBnOyB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIEEgYSA9IG0obmV3IEEoKSwgbmV3IEEoKSk7XG4iICsgCgkJCQkiICAgICAgICBCIGIgPSBtKG5ldyBCKCksIG5ldyBCKCkpO1xuIiArIAoJCQkJIiAgICAgICAgQyBjID0gbShuZXcgQygpLCBuZXcgQygpKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBBIHt9XG4iICsgCgkJCQkiY2xhc3MgQiBleHRlbmRzIEEge31cbiIgKyAKCQkJCSJjbGFzcyBDIGV4dGVuZHMgQSB7fVxuIiwKCQkJfSwKCQkJIltBOmNsYXNzIEFdW0I6Y2xhc3MgQl1bQzpjbGFzcyBDXSIpOwoJfQkJCQoKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03OTM5MAoJcHVibGljIHZvaWQgdGVzdDQyOCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICBab3JrIHo7XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBmb28oKSB7XG4iICsgCgkJCQkiCQljbGFzcyBBPFQgZXh0ZW5kcyBOdW1iZXI+IHtcbiIgKyAKCQkJCSIJCQlUIHQgPSBudWxsO1xuIiArIAoJCQkJIgkJCVQgZ2V0KCkge1xuIiArIAoJCQkJIgkJCQlyZXR1cm4gdDtcbiIgKyAKCQkJCSIJCQl9XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCQlBPExvbmc+IGEgPSBuZXcgQTxMb25nPigpIHtcbiIgKyAKCQkJCSIJCQlAT3ZlcnJpZGVcbiIgKwoJCQkJIgkJCUxvbmcgZ2V0KCkge1xuIiArCgkJCQkiCQkJCXJldHVybiBuZXcgTG9uZyg1KTtcbiIgKyAKCQkJCSIJCQl9XG4iICsgCgkJCQkiCQl9O1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyKVxuIiArIAoJCQkiCVpvcmsgejtcbiIgKyAKCQkJIgleXl5eXG4iICsgCgkJCSJab3JrIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4MjkzCQoJcHVibGljIHZvaWQgdGVzdDQyOSgpIHsgCgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYMS5qYXZhIiwKCQkJCSJjbGFzcyBYMSA8VCBleHRlbmRzIFkgJiBDb21wYXJhYmxlPFk+PiB7fVxuIiArCgkJCQkiYWJzdHJhY3QgY2xhc3MgWSBpbXBsZW1lbnRzIENvbXBhcmFibGU8WT4ge30iLAoJCQl9LAoJCQkiIgoJCSk7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYMi5qYXZhIiwKCQkJCSJjbGFzcyBYMiA8VCBleHRlbmRzIFkgJiBDb21wYXJhYmxlPFk+PiB7fVxuIiArCgkJCQkiYWJzdHJhY3QgY2xhc3MgWSBleHRlbmRzIFoge31cbiIgKwoJCQkJImFic3RyYWN0IGNsYXNzIFogaW1wbGVtZW50cyBDb21wYXJhYmxlPFk+IHt9IiwKCQkJfSwKCQkJIiIKCQkpOwoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWDMuamF2YSIsCgkJCQkiY2xhc3MgWDMgPFQgZXh0ZW5kcyBZICYgQ29tcGFyYWJsZTxaPj4ge31cbiIgKwoJCQkJImFic3RyYWN0IGNsYXNzIFkgZXh0ZW5kcyBaIHt9XG4iICsKCQkJCSJhYnN0cmFjdCBjbGFzcyBaIGltcGxlbWVudHMgQ29tcGFyYWJsZTxaPiB7fSIsCgkJCX0sCgkJCSIiCgkJKTsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYNC5qYXZhIiwKCQkJCSJjbGFzcyBYNCA8VCBleHRlbmRzIENvbXBhcmFibGU8Wj4gJiBDb21wYXJhYmxlPFo+PiB7fVxuIiArCgkJCQkiYWJzdHJhY3QgY2xhc3MgWSBleHRlbmRzIFoge31cbiIgKwoJCQkJImFic3RyYWN0IGNsYXNzIFogaW1wbGVtZW50cyBDb21wYXJhYmxlPFo+IHt9IiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFg0LmphdmEgKGF0IGxpbmUgMSlcclxuIiArIAoJCQkiCWNsYXNzIFg0IDxUIGV4dGVuZHMgQ29tcGFyYWJsZTxaPiAmIENvbXBhcmFibGU8Wj4+IHt9XHJcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXG4iICsgCgkJCSJEdXBsaWNhdGUgYm91bmQgQ29tcGFyYWJsZTxaPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIgoJCQkvLyBubyBjb21wbGFpbnRzIGFib3V0IGR1cGxpY2F0ZXMgaWYgdGhleSBhcmUgYm90aCBwYXJhbWV0ZXJpemVkIHdpdGggc2FtZSBhcmdzCgkJCS8vIGJ1dCB5b3UgY2Fubm90IGV4dGVuZCBDb21wYXJhYmxlICYgQ29tcGFyYWJsZSBzbyB3ZSdsbCByZXBvcnQgYW4gZXJyb3IKCQkpOwoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlg1LmphdmEiLAoJCQkJImNsYXNzIFg1IDxUIGV4dGVuZHMgWSAmIENvbXBhcmFibGU8WDU+PiB7fVxuIiArCgkJCQkiYWJzdHJhY3QgY2xhc3MgWSBpbXBsZW1lbnRzIENvbXBhcmFibGU8WT4ge30iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWDUuamF2YSAoYXQgbGluZSAxKVxuIiArIAoJCQkiCWNsYXNzIFg1IDxUIGV4dGVuZHMgWSAmIENvbXBhcmFibGU8WDU+PiB7fVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5cbiIgKyAKCQkJIkJvdW5kIGNvbmZsaWN0OiBDb21wYXJhYmxlPFg1PiBpcyBpbmhlcml0ZWQgd2l0aCBjb25mbGljdGluZyBhcmd1bWVudHNcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIKCQkJLy8gQ29tcGFyYWJsZSBjYW5ub3QgYmUgaW5oZXJpdGVkIHdpdGggZGlmZmVyZW50IGFyZ3VtZW50czogPFg1PiBhbmQgPFk+CgkJKTsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYNi5qYXZhIiwKCQkJCSJjbGFzcyBYNiA8VCBleHRlbmRzIFkgJiBDb21wYXJhYmxlPFg2Pj4ge31cbiIgKwoJCQkJImFic3RyYWN0IGNsYXNzIFkgZXh0ZW5kcyBaIHt9XG4iICsKCQkJCSJhYnN0cmFjdCBjbGFzcyBaIGltcGxlbWVudHMgQ29tcGFyYWJsZTxaPiB7fSIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYNi5qYXZhIChhdCBsaW5lIDEpXHJcbiIgKyAKCQkJIgljbGFzcyBYNiA8VCBleHRlbmRzIFkgJiBDb21wYXJhYmxlPFg2Pj4ge31cclxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5cbiIgKyAKCQkJIkJvdW5kIGNvbmZsaWN0OiBDb21wYXJhYmxlPFg2PiBpcyBpbmhlcml0ZWQgd2l0aCBjb25mbGljdGluZyBhcmd1bWVudHNcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIKCQkJLy8gQ29tcGFyYWJsZSBjYW5ub3QgYmUgaW5oZXJpdGVkIHdpdGggZGlmZmVyZW50IGFyZ3VtZW50czogPFg2PiBhbmQgPFk+CgkJKTsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYNy5qYXZhIiwKCQkJCSJjbGFzcyBYNyA8VCBleHRlbmRzIENvbXBhcmFibGU8Wj4gJiBDb21wYXJhYmxlPFg3Pj4ge31cbiIgKwoJCQkJImFic3RyYWN0IGNsYXNzIFkgZXh0ZW5kcyBaIHt9XG4iICsKCQkJCSJhYnN0cmFjdCBjbGFzcyBaIGltcGxlbWVudHMgQ29tcGFyYWJsZTxaPiB7fSIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYNy5qYXZhIChhdCBsaW5lIDEpXHJcbiIgKyAKCQkJIgljbGFzcyBYNyA8VCBleHRlbmRzIENvbXBhcmFibGU8Wj4gJiBDb21wYXJhYmxlPFg3Pj4ge31cclxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5cbiIgKyAKCQkJIkJvdW5kIGNvbmZsaWN0OiBDb21wYXJhYmxlPFg3PiBpcyBpbmhlcml0ZWQgd2l0aCBjb25mbGljdGluZyBhcmd1bWVudHNcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIKCQkJLy8gQ29tcGFyYWJsZSBjYW5ub3QgYmUgaW5oZXJpdGVkIHdpdGggZGlmZmVyZW50IGFyZ3VtZW50czogPFo+IGFuZCA8WDc+CgkJKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03OTc5NwoJcHVibGljIHZvaWQgdGVzdDQzMCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJInAvTU1NLmphdmEiLAoJCQkJInBhY2thZ2UgcDtcbiIgKwoJCQkJInB1YmxpYyBpbnRlcmZhY2UgTU1NPCBGIGV4dGVuZHMgTU1NPEYsRz4sIEcgZXh0ZW5kcyBOTk4+IHsgfSBcbiIsCgkJCQkicC9OTk4uamF2YSIsCgkJCQkicGFja2FnZSBwO1xuIiArCgkJCQkicHVibGljIGludGVyZmFjZSBOTk4geyB9IFxuIiwKCQkJfSwKCQkJIiIpOwoKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IHAuTU1NO1xuIiArIAoJCQkJImltcG9ydCBwLk5OTjtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJpbnRlcmZhY2UgUlJSPCBBIGV4dGVuZHMgTU1NPEEsIEI+LCBCIGV4dGVuZHMgTk5OPiB7fVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIEoxIGltcGxlbWVudHMgTU1NPEoxLCBKMj4geyB9XG4iICsgCgkJCQkiY2xhc3MgSjIgaW1wbGVtZW50cyBOTk4geyB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgSjMgaW1wbGVtZW50cyBSUlI8SjEsSjI+IHt9IFxuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgSjMgdGhpbmcgPSBudWxsO1xuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiLAoJCQludWxsLAoJCQlmYWxzZSwgLy8gZG8gbm90IGZsdXNoIG91dHB1dAoJCQludWxsKTsJCQoJfQkJCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5ODkxCglwdWJsaWMgdm9pZCB0ZXN0NDMxKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VHlwZT4ge1xuIiArIAoJCQkJIiAgcHJpdmF0ZSBjbGFzcyBFbGVtZW50IHtcbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSIgIHB1YmxpYyBYKCkge1xuIiArIAoJCQkJIiAgICBFbGVtZW50W10gZUFycmF5ID0gbmV3IEVsZW1lbnRbMTBdO1xuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJIglFbGVtZW50W10gZUFycmF5ID0gbmV3IEVsZW1lbnRbMTBdO1xuIiArIAoJCSIJICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJDYW5ub3QgY3JlYXRlIGEgZ2VuZXJpYyBhcnJheSBvZiBYPFR5cGU+LkVsZW1lbnRcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03OTg5MQoJcHVibGljIHZvaWQgdGVzdDQzMigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VHlwZT4ge1xuIiArIAoJCQkJIiAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRWxlbWVudCB7XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKCQkJCSIgICAgRWxlbWVudFtdIGVBcnJheSA9IG5ldyBFbGVtZW50WzEwXTtcbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCSIiKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MDE0NAoJcHVibGljIHZvaWQgdGVzdDQzMygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJImludGVyZmFjZSBBbHBoYTxcbiIgKyAKCQkJCSIJQTEgZXh0ZW5kcyBBbHBoYTxBMSwgQjE+LCBcbiIgKyAKCQkJCSIJQjEgZXh0ZW5kcyBCZXRhPEExLCBCMT4+IHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiaW50ZXJmYWNlIEJldGE8XG4iICsgCgkJCQkiCUEyIGV4dGVuZHMgQWxwaGE8QTIsIEIyPiwgXG4iICsgCgkJCQkiCUIyIGV4dGVuZHMgQmV0YTxBMiwgQjI+PiB7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImludGVyZmFjZSBQaGk8XG4iICsgCgkJCQkiCUEzIGV4dGVuZHMgQWxwaGE8QTMsIEIzPiwgXG4iICsgCgkJCQkiCUIzIGV4dGVuZHMgQmV0YTxBMywgQjM+PiB7XG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIglwdWJsaWMgdm9pZCBsYXRpbml6ZShBMyBzKTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFg8XG4iICsgCgkJCQkiCUEgZXh0ZW5kcyBBbHBoYTxBLCBCPiwgXG4iICsgCgkJCQkiCUIgZXh0ZW5kcyBCZXRhPEEsIEI+LCBcbiIgKyAKCQkJCSIJUCBleHRlbmRzIFBoaTxBLCBCPj4gZXh0ZW5kcyBBcnJheUxpc3Q8UD4gaW1wbGVtZW50cyBQaGk8QSwgQj4ge1xuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJcHVibGljIGZpbmFsIHZvaWQgbGF0aW5pemUoQSBhKSB7XG4iICsgCgkJCQkiCQlmcmVuY2hpZnkodGhpcywgYSk7IC8vIChYPEEsQixQPiwgQSlcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIGZpbmFsIDxBQSBleHRlbmRzIEFscGhhPEFBLCBCQj4sIEJCIGV4dGVuZHMgQmV0YTxBQSwgQkI+PiBcbiIgKyAKCQkJCSIJdm9pZCBmcmVuY2hpZnkoQ29sbGVjdGlvbjwgPyBleHRlbmRzIFBoaTxBQSwgQkI+PiBwaGlzLCBBQSBhYSkge1xuIiArIAoJCQkJIgkJZm9yIChmaW5hbCBQaGk8QUEsIEJCPiBwaGkgOiBwaGlzKVxuIiArIAoJCQkJIgkJCXBoaS5sYXRpbml6ZShhYSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCSIiKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MDA4MwoJcHVibGljIHZvaWQgdGVzdDQzNCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFhcbiIgKyAKCQkJCSJ7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKVxuIiArIAoJCQkJIiAge1xuIiArIAoJCQkJIiAgICBBcnJheUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7XG4iICsgCgkJCQkiICAgIGwuYWRkKFwieFwiKTtcbiIgKyAKCQkJCSIgICAgU3RyaW5nIHMgPSBcIlwiO1xuIiArIAoJCQkJIiAgICBzICs9IGwuZ2V0KDApOyAvLyBYXG4iICsgCgkJCQkiICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkiU1VDQ0VTUyIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgwNzY1CglwdWJsaWMgdm9pZCB0ZXN0NDM1KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlRlc3QuamF2YSIsLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCQkiaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247XG4iICsgCgkJCQkiaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJpbXBvcnQgb3JkZXJzLkRpc2NyZXRlT3JkZXI7XG4iICsgCgkJCQkiaW1wb3J0IG9yZGVycy5pbXBsLkludGVnZXJPcmRlcjtcbiIgKyAKCQkJCSJpbXBvcnQgb3JkZXJzLmltcGwuSW50ZWdlck9yZGVyMjtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgVGVzdCB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbixcbiIgKyAKCQkJCSIgICAgICAgICAgICBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbixcbiIgKyAKCQkJCSIgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHtcbiIgKyAKCQkJCSIgICAgICAgIFRlc3QgdGVzdCA9IG5ldyBUZXN0KCk7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICAgICAgICBmb3IgKFN0cmluZyBtZXRob2QgOiBuZXcgU3RyaW5nW10geyBcInRlc3QxXCIsIFwidGVzdDJcIiwgXCJ0ZXN0M1wiLCBcInRlc3Q0XCIgfSkge1xuIiArIAoJCQkJIiAgICAgICAgICAgIE1ldGhvZCBtID0gdGVzdC5nZXRDbGFzcygpLmdldE1ldGhvZChtZXRob2QpO1xuIiArIAoJCQkJIiAgICAgICAgICAgIHRyeSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgIG0uaW52b2tlKHRlc3QpO1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KFwiKioqIFwiICsgbSArIFwiOiBzdWNjZXNzXCIpO1xuIiArIAoJCQkJIiAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkge1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KFwiKioqIFwiICsgbSArIFwiOiBmYWlsZWQsIHN0YWNrdHJhY2UgZm9sbG93c1wiKTtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgZS5nZXRDYXVzZSgpLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTtcbiIgKyAKCQkJCSIgICAgICAgICAgICB9XG4iICsgCgkJCQkiICAgICAgICB9XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7IC8vIHdvcmtzXG4iICsgCgkJCQkiICAgICAgICBuZXcgSW50ZWdlck9yZGVyKCkubmV4dChuZXcgSW50ZWdlcigwKSk7IC8vIHdvcmtzXG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7IC8vIGRvZXNuXCd0IHdvcmtcbiIgKyAKCQkJCSIgICAgICAgIGZpbmFsIERpc2NyZXRlT3JkZXI8SW50ZWdlcj4gb3JkZXIgPSBuZXcgSW50ZWdlck9yZGVyKCk7XG4iICsgCgkJCQkiICAgICAgICBvcmRlci5uZXh0KG5ldyBJbnRlZ2VyKDApKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIiAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsgLy8gd29ya3NcbiIgKyAKCQkJCSIgICAgICAgIG5ldyBJbnRlZ2VyT3JkZXIyKCkubmV4dChuZXcgSW50ZWdlcigwKSk7IC8vIHdvcmtzXG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgICAgcHVibGljIHZvaWQgdGVzdDQoKSB7IC8vIGRvZXNuXCd0IHdvcmtcbiIgKyAKCQkJCSIgICAgICAgIGZpbmFsIERpc2NyZXRlT3JkZXI8SW50ZWdlcj4gb3JkZXIgPSBuZXcgSW50ZWdlck9yZGVyMigpO1xuIiArIAoJCQkJIiAgICAgICAgb3JkZXIubmV4dChuZXcgSW50ZWdlcigwKSk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iLAoJCQkJIm9yZGVycy9EaXNjcmV0ZU9yZGVyLmphdmEiLC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQkJInBhY2thZ2Ugb3JkZXJzO1xuIiArIAoJCQkJInB1YmxpYyBpbnRlcmZhY2UgRGlzY3JldGVPcmRlcjxFIGV4dGVuZHMgQ29tcGFyYWJsZTxFPj4ge1xuIiArIAoJCQkJIiAgICAvKipcbiIgKyAKCQkJCSIgICAgICogQHJldHVybiBUaGUgZWxlbWVudCBpbW1lZGlhdGVseSBiZWZvcmUgPGNvZGU+ZWxlbWVudDwvY29kZT4gaW4gdGhlXG4iICsgCgkJCQkiICAgICAqICAgICAgICAgZGlzY3JldGUgb3JkZXJlZCBzcGFjZS5cbiIgKyAKCQkJCSIgICAgICovXG4iICsgCgkJCQkiICAgIHB1YmxpYyBFIHByZXZpb3VzKEUgZWxlbWVudCk7XG4iICsgCgkJCQkiICAgIC8qKlxuIiArIAoJCQkJIiAgICAgKiBAcmV0dXJuIFRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGFmdGVyIDxjb2RlPmVsZW1lbnQ8L2NvZGU+IGluIHRoZVxuIiArIAoJCQkJIiAgICAgKiAgICAgICAgIGRpc2NyZXRlIG9yZGVyZWQgc3BhY2UuXG4iICsgCgkJCQkiICAgICAqL1xuIiArIAoJCQkJIiAgICBwdWJsaWMgRSBuZXh0KEUgZWxlbWVudCk7XG4iICsgCgkJCQkifVxuIiwJCQkJCgkJCQkib3JkZXJzL2ltcGwvSW50ZWdlck9yZGVyLmphdmEiLC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQkJInBhY2thZ2Ugb3JkZXJzLmltcGw7XG4iICsgCgkJCQkiaW1wb3J0IG9yZGVycy5EaXNjcmV0ZU9yZGVyO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBJbnRlZ2VyT3JkZXIgaW1wbGVtZW50cyBEaXNjcmV0ZU9yZGVyPEludGVnZXI+IHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgICAgcHVibGljIEludGVnZXJPcmRlcigpIHtcbiIgKyAKCQkJCSIgICAgICAgIHN1cGVyKCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgICAgcHVibGljIEludGVnZXIgcHJldmlvdXMoSW50ZWdlciBhcmcwKSB7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gbmV3IEludGVnZXIoYXJnMC5pbnRWYWx1ZSgpIC0gMSk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgICAgcHVibGljIEludGVnZXIgbmV4dChJbnRlZ2VyIGFyZzApIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihhcmcwLmludFZhbHVlKCkgKyAxKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsCQkJCQoJCQkJIm9yZGVycy9pbXBsL0ludGVnZXJPcmRlcjIuamF2YSIsLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCQkicGFja2FnZSBvcmRlcnMuaW1wbDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgSW50ZWdlck9yZGVyMiBleHRlbmRzIEludGVnZXJPcmRlciB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICAgIHB1YmxpYyBJbnRlZ2VyT3JkZXIyKCkge1xuIiArIAoJCQkJIiAgICAgICAgc3VwZXIoKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIiAgICBwdWJsaWMgQ29tcGFyYWJsZSBwcmV2aW91cyhDb21wYXJhYmxlIGFyZzApIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiBwcmV2aW91cygoSW50ZWdlcikgYXJnMCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgICAgcHVibGljIENvbXBhcmFibGUgbmV4dChDb21wYXJhYmxlIGFyZzApIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiBuZXh0KChJbnRlZ2VyKSBhcmcwKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBvcmRlcnNcXGltcGxcXEludGVnZXJPcmRlcjIuamF2YSAoYXQgbGluZSAxMClcclxuIiArIAoJCQkiCXB1YmxpYyBDb21wYXJhYmxlIHByZXZpb3VzKENvbXBhcmFibGUgYXJnMCkge1xyXG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiTmFtZSBjbGFzaDogVGhlIG1ldGhvZCBwcmV2aW91cyhDb21wYXJhYmxlKSBvZiB0eXBlIEludGVnZXJPcmRlcjIgaGFzIHRoZSBzYW1lIGVyYXN1cmUgYXMgcHJldmlvdXMoRSkgb2YgdHlwZSBEaXNjcmV0ZU9yZGVyPEU+IGJ1dCBkb2VzIG5vdCBvdmVycmlkZSBpdFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gb3JkZXJzXFxpbXBsXFxJbnRlZ2VyT3JkZXIyLmphdmEgKGF0IGxpbmUgMTQpXHJcbiIgKyAKCQkJIglwdWJsaWMgQ29tcGFyYWJsZSBuZXh0KENvbXBhcmFibGUgYXJnMCkge1xyXG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJOYW1lIGNsYXNoOiBUaGUgbWV0aG9kIG5leHQoQ29tcGFyYWJsZSkgb2YgdHlwZSBJbnRlZ2VyT3JkZXIyIGhhcyB0aGUgc2FtZSBlcmFzdXJlIGFzIG5leHQoRSkgb2YgdHlwZSBEaXNjcmV0ZU9yZGVyPEU+IGJ1dCBkb2VzIG5vdCBvdmVycmlkZSBpdFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIgoJCQkvLyAiKioqIHB1YmxpYyB2b2lkIFRlc3QudGVzdDEoKTogc3VjY2VzcyoqKiBwdWJsaWMgdm9pZCBUZXN0LnRlc3QyKCk6IHN1Y2Nlc3MqKiogcHVibGljIHZvaWQgVGVzdC50ZXN0MygpOiBzdWNjZXNzKioqIHB1YmxpYyB2b2lkIFRlc3QudGVzdDQoKTogc3VjY2VzcyIKCQkJLy8gbmFtZSBjbGFzaDogbmV4dChqYXZhLmxhbmcuQ29tcGFyYWJsZSkgaW4gb3JkZXJzLmltcGwuSW50ZWdlck9yZGVyMiBhbmQgbmV4dChFKSBpbiBvcmRlcnMuRGlzY3JldGVPcmRlcjxqYXZhLmxhbmcuSW50ZWdlcj4gaGF2ZSB0aGUgc2FtZSBlcmFzdXJlLCB5ZXQgbmVpdGhlciBvdmVycmlkZXMgdGhlIG90aGVyCgkJKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MDAyOAoJcHVibGljIHZvaWQgdGVzdDQzNigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIkEuamF2YSIsCgkJCQkicHVibGljIGNsYXNzIEEge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlOdW1iZXIgbj0gbmV3IEludGVnZXIoMSk7XG4iICsgCgkJCQkiCQlYIHggPSBuZXcgWDxOdW1iZXI+KCk7XG4iICsgCgkJCQkiCQl4Lm0obik7XG4iICsgCgkJCQkiCQl4Lm0obmV3IEludGVnZXIoMikpO1xuIiArIAoJCQkJIgkJWSB5PSBuZXcgWSgpO1xuIiArIAoJCQkJIgkJeS5tKG4pO1xuIiArIAoJCQkJIgkJeS5tKG5ldyBJbnRlZ2VyKDIpKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCQkiWC5qYXZhIiwKCQkJCSJjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgbShOdW1iZXIgbnVtKSB7IFN5c3RlbS5vdXQucHJpbnQoXCJYLm0oTnVtYmVyKSA9IFwiICsgbnVtICsgJywnKTsgfVxuIiArIAoJCQkJIglwdWJsaWMgdm9pZCBtKFQgdCkgeyBTeXN0ZW0ub3V0LnByaW50KFwiWC5tKFQpID0gXCIgKyB0ICsgJywnKTsgfVxuIiArIAoJCQkJIn1cbiIsCgkJCQkiWS5qYXZhIiwKCQkJCSJjbGFzcyBZIGV4dGVuZHMgWDxOdW1iZXI+IHtcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgbShOdW1iZXIgbnVtKSB7IFN5c3RlbS5vdXQucHJpbnQoXCJZLm0oTnVtYmVyKSA9IFwiICsgbnVtICsgJywnKTsgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJIlgubShOdW1iZXIpID0gMSxYLm0oTnVtYmVyKSA9IDIsWS5tKE51bWJlcikgPSAxLFkubShOdW1iZXIpID0gMiwiKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MDAyOAoJcHVibGljIHZvaWQgdGVzdDQzNygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIkEuamF2YSIsCgkJCQkicHVibGljIGNsYXNzIEEge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlOdW1iZXIgbj0gbmV3IEludGVnZXIoMSk7XG4iICsgCgkJCQkiCQlYIHggPSBuZXcgWDxOdW1iZXI+KCk7XG4iICsgCgkJCQkiCQl4Lm0obik7XG4iICsgCgkJCQkiCQl4Lm0obmV3IEludGVnZXIoMikpO1xuIiArIAoJCQkJIgkJWSB5PSBuZXcgWSgpO1xuIiArIAoJCQkJIgkJeS5tKG4pO1xuIiArIAoJCQkJIgkJeS5tKG5ldyBJbnRlZ2VyKDIpKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCQkiWC5qYXZhIiwKCQkJCSJjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgbShOdW1iZXIgbnVtKSB7IFN5c3RlbS5vdXQucHJpbnQoXCJYLm0oTnVtYmVyKSA9IFwiICsgbnVtICsgJywnKTsgfVxuIiArIAoJCQkJIglwdWJsaWMgdm9pZCBtKFQgdCkgeyBTeXN0ZW0ub3V0LnByaW50KFwiWC5tKFQpID0gXCIgKyB0ICsgJywnKTsgfVxuIiArIAoJCQkJIn1cbiIsCgkJCQkiWS5qYXZhIiwKCQkJCSJjbGFzcyBZIGV4dGVuZHMgWDxOdW1iZXI+IHtcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgbShOdW1iZXIgbnVtKSB7IFN5c3RlbS5vdXQucHJpbnQoXCJZLm0oTnVtYmVyKSA9IFwiICsgbnVtICsgJywnKTsgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJIlgubShOdW1iZXIpID0gMSxYLm0oTnVtYmVyKSA9IDIsWS5tKE51bWJlcikgPSAxLFkubShOdW1iZXIpID0gMiwiKTsKCX0JCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzg1OTEKCXB1YmxpYyB2b2lkIHRlc3Q0MzgoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIiAgICBab3JrIHo7XG4iICsKCQkJCSIgICAgTGlzdDxUPiBsaXN0O1xuIiArIAoJCQkJIiAgICB2b2lkIGFkZChPYmplY3QgYWJzKSB7XG4iICsgCgkJCQkiICAgICAgICBsaXN0LmFkZCgoVCkgbGlzdC5nZXQoMCkpOyAvLyBjaGVja2VkIGNhc3RcbiIgKyAKCQkJCSIgICAgICAgIGxpc3QuYWRkKChUKSBhYnMpOyAvLyB1bmNoZWNrZWQgY2FzdFxuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHZvaWQgYmFyKExpc3Q8PyBleHRlbmRzIFQ+IG90aGVyKSB7XG4iICsgCgkJCQkiICAgIAlsaXN0LmFkZCgoVCkgb3RoZXIuZ2V0KDApKTsgLy8gY2hlY2tlZCBjYXN0XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgdm9pZCBiYXooTGlzdDw/IHN1cGVyIFQ+IG90aGVyKSB7XG4iICsgCgkJCQkiICAgIAlsaXN0LmFkZCgoVCkgb3RoZXIuZ2V0KDApKTsgLy8gdW5jaGVja2VkIGNhc3RcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkJIglab3JrIHo7XG4iICsgCgkJCSIJXl5eXlxuIiArIAoJCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCQkiCWxpc3QuYWRkKChUKSBsaXN0LmdldCgwKSk7IC8vIGNoZWNrZWQgY2FzdFxuIiArIAoJCQkiCSAgICAgICAgIF5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVW5uZWNlc3NhcnkgY2FzdCBmcm9tIFQgdG8gVFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglsaXN0LmFkZCgoVCkgYWJzKTsgLy8gdW5jaGVja2VkIGNhc3RcbiIgKyAKCQkJIgkgICAgICAgICBeXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNhc3QgZnJvbSBPYmplY3QgdG8gVCBpcyBhY3R1YWxseSBjaGVja2luZyBhZ2FpbnN0IHRoZSBlcmFzZWQgdHlwZSBPYmplY3RcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjQuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEwKVxuIiArIAoJCQkiCWxpc3QuYWRkKChUKSBvdGhlci5nZXQoMCkpOyAvLyBjaGVja2VkIGNhc3RcbiIgKyAKCQkJIgkgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJVbm5lY2Vzc2FyeSBjYXN0IGZyb20gY2FwdHVyZS1vZiA/IGV4dGVuZHMgVCB0byBUXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI1LiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxMylcbiIgKyAKCQkJIglsaXN0LmFkZCgoVCkgb3RoZXIuZ2V0KDApKTsgLy8gdW5jaGVja2VkIGNhc3RcbiIgKyAKCQkJIgkgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNhc3QgZnJvbSBjYXB0dXJlLW9mID8gc3VwZXIgVCB0byBUIGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIE9iamVjdFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzg1OTIKCXB1YmxpYyB2b2lkIHRlc3Q0MzkoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJjbGFzcyBOb2RlIHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQ29tcG9zaXRlPEU+IHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQ29uY3JldGUgZXh0ZW5kcyBDb21wb3NpdGUge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIENvbXBvc2l0ZTxOb2RlPiBjb21wID0gbmV3IENvbmNyZXRlKCk7IC8vIHVuY2hlY2tlZCBjYXN0XG4iICsgCgkJCQkiICAgIFpvcmsgejtcbiIgKwoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCUNvbXBvc2l0ZTxOb2RlPiBjb21wID0gbmV3IENvbmNyZXRlKCk7IC8vIHVuY2hlY2tlZCBjYXN0XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBleHByZXNzaW9uIG9mIHR5cGUgQ29uY3JldGUgbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBDb21wb3NpdGU8Tm9kZT5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA5KVxuIiArIAoJCQkiCVpvcmsgejtcbiIgKyAKCQkJIgleXl5eXG4iICsgCgkJCSJab3JrIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkKCQoJcHVibGljIHZvaWQgdGVzdDQ0MCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJCSIJY2xhc3MgWTxVPiB7XG4iICsgCgkJCQkiCQlwdWJsaWMgdm9pZCBmb28oWDxUPiB4dCkge1xuIiArIAoJCQkJIgkJCVUgdSA9IChVKSB4dDtcbiIgKyAKCQkJCSIJCX1cbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIiAgWm9yayB6O1xuIiArCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJVSB1ID0gKFUpIHh0O1xuIiArIAoJCQkiCSAgICAgIF5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBjYXN0IGZyb20gWDxUPiB0byBVIGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIE9iamVjdFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJCSIJWm9yayB6O1xuIiArIAoJCQkiCV5eXl5cbiIgKyAKCQkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCQoJcHVibGljIHZvaWQgdGVzdDQ0MSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQgZXh0ZW5kcyBOdW1iZXI+IHtcbiIgKyAKCQkJCSIgICAgVFtdIGFycmF5O1xuIiArIAoJCQkJIiAgICBYKGludCBzKSB7XG4iICsgCgkJCQkiICAgICAgICBhcnJheSA9IChUW10pIG5ldyBOdW1iZXJbc107ICAgLy8gVW5uZWNlc3NhcnkgY2FzdCBmcm9tIE51bWJlcltdIHRvIFRbXVxuIiArIAoJCQkJIiAgICAgICAgYXJyYXkgPSBuZXcgTnVtYmVyW3NdOyAgIC8vIFR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gTnVtYmVyW10gdG8gVFtdXG4iICsgCgkJCQkiICAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJYXJyYXkgPSAoVFtdKSBuZXcgTnVtYmVyW3NdOyAgIC8vIFVubmVjZXNzYXJ5IGNhc3QgZnJvbSBOdW1iZXJbXSB0byBUW11cbiIgKyAKCQkJIgkgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIE51bWJlcltdIHRvIFRbXSBpcyBhY3R1YWxseSBjaGVja2luZyBhZ2FpbnN0IHRoZSBlcmFzZWQgdHlwZSBOdW1iZXJbXVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJCSIJYXJyYXkgPSBuZXcgTnVtYmVyW3NdOyAgIC8vIFR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gTnVtYmVyW10gdG8gVFtdXG4iICsgCgkJCSIJICAgICAgICBeXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIE51bWJlcltdIHRvIFRbXVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MjA1MwoJcHVibGljIHZvaWQgdGVzdDQ0MigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiY2xhc3MgRm9vIHtcbiIgKyAKCQkJCSIJcHVibGljIGludGVyZmFjZSBNb2RlbCB7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIGludGVyZmFjZSBWaWV3PE0gZXh0ZW5kcyBNb2RlbD4ge1xuIiArIAoJCQkJIgkJTSBnZXRUYXJnZXQoKSA7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQmFyIHtcbiIgKyAKCQkJCSIJcHVibGljIGludGVyZmFjZSBNb2RlbCBleHRlbmRzIEZvby5Nb2RlbCB7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIGludGVyZmFjZSBWaWV3PE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBGb28uVmlldzxNPiB7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgdm9pZCBiYXooKSB7XG4iICsgCgkJCQkiCQlCYXIuVmlldzw/PiBidiA9IG51bGwgO1xuIiArIAoJCQkJIgkJQmFyLk1vZGVsIG0gPSBidi5nZXRUYXJnZXQoKSA7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiIik7Cgl9CQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MTc1NwoJcHVibGljIHZvaWQgdGVzdDQ0MygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCBpbXBsZW1lbnRzIEl0ZXJhdG9yPFN0cmluZz4ge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeyByZXR1cm4gZmFsc2U7IH1cbiIgKyAKCQkJCSIgICAgcHVibGljIFN0cmluZyBuZXh0KCkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7fVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsKCX0JCQoJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODE4MjQKCXB1YmxpYyB2b2lkIHRlc3Q0NDQoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCBpbXBsZW1lbnRzIEk8SW50ZWdlcj4sIEk8U3RyaW5nPiB7fVxuIiArIAoJCQkJImludGVyZmFjZSBJPFQ+IHt9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMSlcbiIgKyAKCQkJIglwdWJsaWMgY2xhc3MgWCBpbXBsZW1lbnRzIEk8SW50ZWdlcj4sIEk8U3RyaW5nPiB7fVxuIiArIAoJCQkiCSAgICAgICAgICAgICBeXG4iICsgCgkJCSJUaGUgaW50ZXJmYWNlIEkgY2Fubm90IGJlIGltcGxlbWVudGVkIG1vcmUgdGhhbiBvbmNlIHdpdGggZGlmZmVyZW50IGFyZ3VtZW50czogSTxTdHJpbmc+IGFuZCBJPEludGVnZXI+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzg4MTAKCXB1YmxpYyB2b2lkIHRlc3Q0NDUoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0UHJvcGVydHkoZmluYWwgT2JqZWN0IHNyYywgZmluYWwgU3RyaW5nIG5hbWUpO1xuIiArIAoJCQkJIiAgICBab3JrIHo7XG4iICsgCgkJCQkiICAgIHB1YmxpYyA8VD4gVCBnZXRUaGVQcm9wZXJ0eShmaW5hbCBPYmplY3Qgc3JjLCBmaW5hbCBTdHJpbmcgbmFtZSlcbiIgKyAKCQkJCSIgICAge1xuIiArIAoJCQkJIiAgICAgICAgZmluYWwgVCB2YWwgPSAoVCkgZ2V0UHJvcGVydHkoc3JjLCBuYW1lKTsgLy8gdGhpcyBnaXZlcyBlcnJvbmVvdXMgY2FzdCB3YXJuaW5nXG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gdmFsO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIgksCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMylcclxuIiArIAoJCQkiCVpvcmsgejtcclxuIiArIAoJCQkiCV5eXl5cbiIgKyAKCQkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNilcclxuIiArIAoJCQkiCWZpbmFsIFQgdmFsID0gKFQpIGdldFByb3BlcnR5KHNyYywgbmFtZSk7IC8vIHRoaXMgZ2l2ZXMgZXJyb25lb3VzIGNhc3Qgd2FybmluZ1xyXG4iICsgCgkJCSIJICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBjYXN0IGZyb20gT2JqZWN0IHRvIFQgaXMgYWN0dWFsbHkgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZXJhc2VkIHR5cGUgT2JqZWN0XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MjE1OQoJcHVibGljIHZvaWQgdGVzdDQ0NigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPEE+IHtcbiIgKyAKCQkJCSIgIGNsYXNzIElubmVyPEI+IHsgfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIiAgdm9pZCBtZXRob2QoKSB7XG4iICsgCgkJCQkiICAgIFg8U3RyaW5nPi5Jbm5lcjxJbnRlZ2VyPiBhPSBuZXcgWDxTdHJpbmc+KCkubmV3IElubmVyPEludGVnZXI+KCk7XG4iICsgCgkJCQkiICAgIElubmVyPEludGVnZXI+IGI9IG5ldyBYPEE+KCkubmV3IElubmVyPEludGVnZXI+KCk7XG4iICsgCgkJCQkiICAgIElubmVyPEludGVnZXI+IGM9IG5ldyBJbm5lcjxJbnRlZ2VyPigpO1xuIiArIAoJCQkJIiAgICAvL09LIGZvciBqYXZhYyBhbmQgZWNsaXBzZVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIiAgICBYPFN0cmluZz4uSW5uZXI8SW50ZWdlcj4gZD0gbmV3IFg8U3RyaW5nPi5Jbm5lcjxJbnRlZ2VyPigpO1xuIiArIAoJCQkJIiAgICAvL2VjbGlwc2U6IE9LXG4iICsgCgkJCQkiICAgIC8vamF2YWM6IGVycm9yOiBcJyhcJyBvciBcJ1tcJyBleHBlY3RlZFxuIiArIAoJCQkJIlxuIiArIAoJCQkJIiAgICBYPEE+LklubmVyPEludGVnZXI+IGU9IG5ldyBYPEE+KCkubmV3IElubmVyPEludGVnZXI+KCk7XG4iICsgCgkJCQkiICAgIFg8QT4uSW5uZXI8SW50ZWdlcj4gZj0gbmV3IElubmVyPEludGVnZXI+KCk7XG4iICsgCgkJCQkiICAgIGU9IGI7XG4iICsgCgkJCQkiICAgIGY9IGM7XG4iICsgCgkJCQkiICAgIC8vamF2YWM6IE9LXG4iICsgCgkJCQkiICAgIC8vZWNsaXBzZTogVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBYPEE+LklubmVyPEludGVnZXI+IHRvIFg8QT4uSW5uZXI8SW50ZWdlcj5cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgRXh0ZXJuYWwge1xuIiArIAoJCQkJIiAgdm9pZCBtKCkge1xuIiArIAoJCQkJIiAgICBYPFN0cmluZz4uSW5uZXI8SW50ZWdlcj4geD0gbmV3IFg8U3RyaW5nPigpLm5ldyBJbm5lcjxJbnRlZ2VyPigpO1xuIiArIAoJCQkJIiAgICAvL09LIGZvciBqYXZhYyBhbmQgZWNsaXBzZVxuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTApXG4iICsgCgkJCSIJWDxTdHJpbmc+LklubmVyPEludGVnZXI+IGQ9IG5ldyBYPFN0cmluZz4uSW5uZXI8SW50ZWdlcj4oKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiQ2Fubm90IGFsbG9jYXRlIHRoZSBtZW1iZXIgdHlwZSBYPFN0cmluZz4uSW5uZXI8SW50ZWdlcj4gdXNpbmcgYSBwYXJhbWV0ZXJpemVkIGNvbXBvdW5kIG5hbWU7IHVzZSBpdHMgc2ltcGxlIG5hbWUgYW5kIGFuIGVuY2xvc2luZyBpbnN0YW5jZSBvZiB0eXBlIFg8U3RyaW5nPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgyMTU5IC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0NDQ3KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8QT4ge1xuIiArIAoJCQkJIiAgY2xhc3MgSW5uZXI8Qj4geyB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICB2b2lkIG1ldGhvZCgpIHtcbiIgKyAKCQkJCSIgICAgWDxTdHJpbmc+LklubmVyPEludGVnZXI+IGQxID0gbmV3IFg8U3RyaW5nPi5Jbm5lcjxJbnRlZ2VyPigpO1xuIiArIAoJCQkJIiAgICBYLklubmVyIGQyID0gbmV3IFguSW5uZXIoKTtcbiIgKyAKCQkJCSIgICAgWC5Jbm5lcjxJbnRlZ2VyPiBkMyA9IG5ldyBYLklubmVyPEludGVnZXI+KCk7XG4iICsgCgkJCQkiICAgIGQxID0gZDI7XG4iICsKCQkJCSIgICAgZDIgPSBkMTtcbiIgKwoJCQkJIiAgICBkMSA9IGQzO1xuIiArCgkJCQkiICAgIGQzID0gZDE7XG4iICsKCQkJCSIgICAgZDIgPSBkMztcbiIgKwoJCQkJIiAgICBkMyA9IGQyO1xuIiArCgkJCQkiXG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCVg8U3RyaW5nPi5Jbm5lcjxJbnRlZ2VyPiBkMSA9IG5ldyBYPFN0cmluZz4uSW5uZXI8SW50ZWdlcj4oKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJDYW5ub3QgYWxsb2NhdGUgdGhlIG1lbWJlciB0eXBlIFg8U3RyaW5nPi5Jbm5lcjxJbnRlZ2VyPiB1c2luZyBhIHBhcmFtZXRlcml6ZWQgY29tcG91bmQgbmFtZTsgdXNlIGl0cyBzaW1wbGUgbmFtZSBhbmQgYW4gZW5jbG9zaW5nIGluc3RhbmNlIG9mIHR5cGUgWDxTdHJpbmc+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglYLklubmVyPEludGVnZXI+IGQzID0gbmV3IFguSW5uZXI8SW50ZWdlcj4oKTtcbiIgKyAKCQkJIgleXl5eXl5eXG4iICsgCgkJCSJUaGUgbWVtYmVyIHR5cGUgWC5Jbm5lcjxJbnRlZ2VyPiBtdXN0IGJlIHF1YWxpZmllZCB3aXRoIGEgcGFyYW1ldGVyaXplZCB0eXBlLCBzaW5jZSBpdCBpcyBub3Qgc3RhdGljXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglYLklubmVyPEludGVnZXI+IGQzID0gbmV3IFguSW5uZXI8SW50ZWdlcj4oKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5cbiIgKyAKCQkJIlRoZSBtZW1iZXIgdHlwZSBYLklubmVyPEludGVnZXI+IG11c3QgYmUgcXVhbGlmaWVkIHdpdGggYSBwYXJhbWV0ZXJpemVkIHR5cGUsIHNpbmNlIGl0IGlzIG5vdCBzdGF0aWNcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjQuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJCSIJZDEgPSBkMjtcbiIgKyAKCQkJIgkgICAgIF5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGV4cHJlc3Npb24gb2YgdHlwZSBYLklubmVyIG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG8gWDxTdHJpbmc+LklubmVyPEludGVnZXI+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI1LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTApXG4iICsgCgkJCSIJZDEgPSBkMztcbiIgKyAKCQkJIgkgICAgIF5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFguSW5uZXI8SW50ZWdlcj4gdG8gWDxTdHJpbmc+LklubmVyPEludGVnZXI+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI2LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTEpXG4iICsgCgkJCSIJZDMgPSBkMTtcbiIgKyAKCQkJIgkgICAgIF5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFg8U3RyaW5nPi5Jbm5lcjxJbnRlZ2VyPiB0byBYLklubmVyPEludGVnZXI+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI3LiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxMylcbiIgKyAKCQkJIglkMyA9IGQyO1xuIiArIAoJCQkiCSAgICAgXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIFguSW5uZXIgbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBYLklubmVyPEludGVnZXI+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgyMTU5IC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0NDQ4KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxBPiB7XG4iICsgCgkJCQkiICBzdGF0aWMgY2xhc3MgSW5uZXI8Qj4geyB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICB2b2lkIG1ldGhvZCgpIHtcbiIgKyAKCQkJCSIgICAgWC5Jbm5lcjxJbnRlZ2VyPiBkID0gbmV3IFguSW5uZXI8SW50ZWdlcj4oKTsgICAgXG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIiIpOwoJfQkJCQoJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODIxNTkgLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3Q0NDkoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxBPiB7XG4iICsgCgkJCQkiICBjbGFzcyBJbm5lcjxCPiB7IFxuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIiAgdm9pZCBtZXRob2QoKSB7XG4iICsgCgkJCQkiICAgIFg8U3RyaW5nPi5Jbm5lcjxJbnRlZ2VyPiBkNCA9IG5ldyBYLklubmVyPEludGVnZXI+KCk7XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkifVxuIiAsCgkJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJIglYPFN0cmluZz4uSW5uZXI8SW50ZWdlcj4gZDQgPSBuZXcgWC5Jbm5lcjxJbnRlZ2VyPigpO1xuIiArIAoJCSIJICAgICAgICAgICAgICAgICAgICAgICAgIF5eXG4iICsgCgkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gWC5Jbm5lcjxJbnRlZ2VyPiB0byBYPFN0cmluZz4uSW5uZXI8SW50ZWdlcj5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkiCVg8U3RyaW5nPi5Jbm5lcjxJbnRlZ2VyPiBkNCA9IG5ldyBYLklubmVyPEludGVnZXI+KCk7XG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXlxuIiArIAoJCSJUaGUgbWVtYmVyIHR5cGUgWC5Jbm5lcjxJbnRlZ2VyPiBtdXN0IGJlIHF1YWxpZmllZCB3aXRoIGEgcGFyYW1ldGVyaXplZCB0eXBlLCBzaW5jZSBpdCBpcyBub3Qgc3RhdGljXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQoJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODIxNTkgLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3Q0NTAoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxBPiB7XG4iICsgCgkJCQkiICBzdGF0aWMgY2xhc3MgSW5uZXI8Qj4geyBcbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgIHZvaWQgbWV0aG9kKCkge1xuIiArIAoJCQkJIiAgICBYPFN0cmluZz4uSW5uZXI8SW50ZWdlcj4gZDQgPSBuZXcgWDxTdHJpbmc+LklubmVyPEludGVnZXI+KCk7XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkifVxuIiAsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNilcclxuIiArIAoJCQkiCVg8U3RyaW5nPi5Jbm5lcjxJbnRlZ2VyPiBkNCA9IG5ldyBYPFN0cmluZz4uSW5uZXI8SW50ZWdlcj4oKTtcclxuIiArIAoJCQkiCV5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVGhlIG1lbWJlciB0eXBlIFg8U3RyaW5nPi5Jbm5lciBjYW5ub3QgYmUgcXVhbGlmaWVkIHdpdGggYSBwYXJhbWV0ZXJpemVkIHR5cGUsIHNpbmNlIGl0IGlzIHN0YXRpYy4gUmVtb3ZlIGFyZ3VtZW50cyBmcm9tIHF1YWxpZnlpbmcgdHlwZSBYPFN0cmluZz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxyXG4iICsgCgkJCSIJWDxTdHJpbmc+LklubmVyPEludGVnZXI+IGQ0ID0gbmV3IFg8U3RyaW5nPi5Jbm5lcjxJbnRlZ2VyPigpO1xyXG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVGhlIG1lbWJlciB0eXBlIFg8U3RyaW5nPi5Jbm5lciBjYW5ub3QgYmUgcXVhbGlmaWVkIHdpdGggYSBwYXJhbWV0ZXJpemVkIHR5cGUsIHNpbmNlIGl0IGlzIHN0YXRpYy4gUmVtb3ZlIGFyZ3VtZW50cyBmcm9tIHF1YWxpZnlpbmcgdHlwZSBYPFN0cmluZz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MjE1OSAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDQ1MSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPEE+IHtcbiIgKyAKCQkJCSIgIGNsYXNzIElubmVyPEI+IHsgXG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICB2b2lkIG1ldGhvZCgpIHtcbiIgKyAKCQkJCSIgICAgWDxTdHJpbmc+LklubmVyPEludGVnZXI+IGQ0ID0gbmV3IFg8U3RyaW5nPi5Jbm5lcjxJbnRlZ2VyPigpIHt9O1xuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIn1cbiIgLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJWDxTdHJpbmc+LklubmVyPEludGVnZXI+IGQ0ID0gbmV3IFg8U3RyaW5nPi5Jbm5lcjxJbnRlZ2VyPigpIHt9O1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIkNhbm5vdCBhbGxvY2F0ZSB0aGUgbWVtYmVyIHR5cGUgWDxTdHJpbmc+LklubmVyPEludGVnZXI+IHVzaW5nIGEgcGFyYW1ldGVyaXplZCBjb21wb3VuZCBuYW1lOyB1c2UgaXRzIHNpbXBsZSBuYW1lIGFuZCBhbiBlbmNsb3NpbmcgaW5zdGFuY2Ugb2YgdHlwZSBYPFN0cmluZz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MjE4NwoJcHVibGljIHZvaWQgdGVzdDQ1MigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCSBwdWJsaWMgPEUgZXh0ZW5kcyBPYmplY3QsIFMgZXh0ZW5kcyBDb2xsZWN0aW9uPEU+PiBTIHRlc3QxKFMgcGFyYW0pe1xuIiArIAoJCQkJIgkgCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiCSAJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiCSB9XG4iICsgCgkJCQkiCSBcbiIgKyAKCQkJCSIJIHB1YmxpYyB2b2lkIHRlc3QyKCkge1xuIiArIAoJCQkJIgkgCXRlc3QxKG5ldyBWZWN0b3I8U3RyaW5nPigpKTtcbiIgKyAKCQkJCSIJIH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCW5ldyBYKCkudGVzdDIoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgLAoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQoKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MjI1MAoJcHVibGljIHZvaWQgdGVzdDQ1MygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQgZXh0ZW5kcyBJICYgST4ge31cbiIgKyAKCQkJCSJpbnRlcmZhY2UgSSB7fVxuIiAsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMSlcclxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYPFQgZXh0ZW5kcyBJICYgST4ge31cclxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXlxuIiArIAoJCQkiRHVwbGljYXRlIGJvdW5kIElcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIKCQkpOwoJfQoJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODI1MDQKCXB1YmxpYyB2b2lkIHRlc3Q0NTQoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxULCBVIGV4dGVuZHMgWD4ge1xuIiArIAoJCQkJIglPYmplY3RbXSBvYmplY3RBcnI7XG4iICsgCgkJCQkiCXZvaWQgZm9vKFQgdCkge1xuIiArIAoJCQkJIgkJVCB4MT0gKFQpIG9iamVjdEFycjtcbiIgKyAKCQkJCSIJCVUgeDI9IChVKSBvYmplY3RBcnI7XG4iICsgCgkJCQkiCQlpbnRbXSB4PSAoaW50W10pIHQ7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkJIglUIHgxPSAoVCkgb2JqZWN0QXJyO1xuIiArIAoJCQkiCSAgICAgIF5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIE9iamVjdFtdIHRvIFQgaXMgYWN0dWFsbHkgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZXJhc2VkIHR5cGUgT2JqZWN0XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIglVIHgyPSAoVSkgb2JqZWN0QXJyO1xuIiArIAoJCQkiCSAgICAgIF5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIkNhbm5vdCBjYXN0IGZyb20gT2JqZWN0W10gdG8gVVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkKCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgxNzE5CglwdWJsaWMgdm9pZCB0ZXN0NDU1KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiQWJzdHJhY3RUZXN0LmphdmEiLAoJCQkJInB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRlc3Q8VD4ge1xuIiArIAoJCQkJIiAgYWJzdHJhY3Qgdm9pZCBhcnJheShUW10gYSk7XG4iICsgCgkJCQkiICBhYnN0cmFjdCB2b2lkIHR5cGUoVCBhKTtcbiIgKyAKCQkJCSIgIGFic3RyYWN0IFRbXSBmb28oKTtcbiIgKwoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsKCgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJUZXN0LmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBUZXN0PFQ+IGV4dGVuZHMgQWJzdHJhY3RUZXN0PFQ+IHtcbiIgKyAKCQkJCSIgIHZvaWQgYXJyYXkoVFtdIGEpIHt9XG4iICsgCgkJCQkiICB2b2lkIHR5cGUoVCBhKSB7fVxuIiArIAoJCQkJIiAgVFtdIGZvbygpIHsgcmV0dXJuIG51bGw7IH1cbiIgKwoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiLAoJCQludWxsLAoJCQlmYWxzZSwgLy8gZG8gbm90IGZsdXNoIG91dHB1dAoJCQludWxsKTsJCQoJfQoJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODE3MjEKCXB1YmxpYyB2b2lkIHRlc3Q0NTYoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImludGVyZmFjZSBJPFQ+IHtcbiIgKyAKCQkJCSIJPFMgZXh0ZW5kcyBUPiB2b2lkIGRvVGVzdChTW10gYSk7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGVzdDxVPiBpbXBsZW1lbnRzIEk8VT4ge1xuIiArIAoJCQkJIglwdWJsaWMgPFYgZXh0ZW5kcyBVPiB2b2lkIGRvVGVzdChWW10gYSkge31cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFg8TT4gZXh0ZW5kcyBBYnN0cmFjdFRlc3Q8TT4ge31cbiIsCgkJCX0sCgkJCSIiKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDQ1NygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIiB2b2lkIGFkZChMaXN0PD8gc3VwZXIgWD4gbCkgeyBcbiIgKyAKCQkJCSIgCWwuYWRkKG5ldyBYKCkpOyBcbiIgKyAKCQkJCSIgfVxuIiArIAoJCQkJIiB2b2lkIGFkZDIoTGlzdDw/IGV4dGVuZHMgWD4gbCkgeyBcbiIgKyAKCQkJCSIgCWwuYWRkKG5ldyBYKCkpOyBcbiIgKyAKCQkJCSIgfVxuIiArIAoJCQkJIiBcbiIgKyAKCQkJCSIgc3RhdGljIDxUPiB2b2lkIGFkZDMoTGlzdDxUPiBsLCBMaXN0PFQ+IGwyKSB7IFxuIiArIAoJCQkJIiB9XG4iICsgCgkJCQkiIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJTGlzdDxYPiBseCA9IG51bGw7XG4iICsgCgkJCQkiCUxpc3Q8U3RyaW5nPiBscyA9IG51bGw7XG4iICsgCgkJCQkiCWFkZDMobHgsIGxzKTtcbiIgKyAKCQkJCSIgfSBcbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJCSIJbC5hZGQobmV3IFgoKSk7IFxuIiArIAoJCQkiCSAgXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8gZXh0ZW5kcyBYKSBpbiB0aGUgdHlwZSBMaXN0PGNhcHR1cmUtb2YgPyBleHRlbmRzIFg+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChYKVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDE3KVxuIiArIAoJCQkiCWFkZDMobHgsIGxzKTtcbiIgKyAKCQkJIgleXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGFkZDMoTGlzdDxUPiwgTGlzdDxUPikgaW4gdGhlIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoTGlzdDxYPiwgTGlzdDxTdHJpbmc+KVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODIyNDMKCXB1YmxpYyB2b2lkIHRlc3Q0NTgoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbnRlcmZhY2UgQTxFPntcbiIgKyAKCQkJCSIJRSBnZXRPbmUoKTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiXG4iICsgCgkJCQkiYWJzdHJhY3QgY2xhc3MgQjxUIGV4dGVuZHMgTnVtYmVyPiBpbXBsZW1lbnRzIEE8VD4ge1xuIiArIAoJCQkJIglOdW1iZXIgZ2V0VHdvKCkge1xuIiArIAoJCQkJIgkJcmV0dXJuIGdldE9uZSgpOyAvLyBzdWNjZWVkc1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImFic3RyYWN0IGNsYXNzIEMgZXh0ZW5kcyBCPEludGVnZXI+IHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIgl2b2lkIGZvbyhBIGEsIEIgYiwgQyBjKXtcbiIgKyAKCQkJCSIJCU9iamVjdCBvPSBhLmdldE9uZSgpO1xuIiArIAoJCQkJIgkJTnVtYmVyIG4xPSBiLmdldE9uZSgpOyAvLyBmYWlsc1xuIiArIAoJCQkJIgkJTnVtYmVyIG4yPSBiLmdldFR3bygpOyAvLyBzdWNjZWVkcywgYnV0IGlubGluaW5nIGZhaWxzXG4iICsgCgkJCQkiCQlJbnRlZ2VyIGkgPSBjLmdldE9uZSgpOyAvLyBzdWNjZWVkc1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxOClcbiIgKyAKCQkJIglOdW1iZXIgbjE9IGIuZ2V0T25lKCk7IC8vIGZhaWxzXG4iICsgCgkJCSIJICAgICAgIF5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIE9iamVjdCB0byBOdW1iZXJcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03ODAyNyAtIHZhcmlhdGlvbiAoY2hlY2sgdW5jaGVja2VkIHdhcm5pbmdzKQoJcHVibGljIHZvaWQgX3Rlc3Q0NTkoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCBcbiIgKyAKCQkJCSJ7XG4iICsgCgkJCQkiWm9yayB6O1xuIiArCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImludGVyZmFjZSBJVGVzdDxDIGV4dGVuZHMgWD5cbiIgKyAKCQkJCSJ7IFxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJhYnN0cmFjdCBjbGFzcyBUZXN0PEMgZXh0ZW5kcyBYPiBpbXBsZW1lbnRzIElUZXN0PEM+XG4iICsgCgkJCQkie1xuIiArIAoJCQkJIiAgcHJvdGVjdGVkIE1hbmFnZXI8Qz4gbV9tYW5hZ2VyO1xuIiArIAoJCQkJIiAgXG4iICsgCgkJCQkiICBwdWJsaWMgSVRlc3Q8Qz4gZ2V0KClcbiIgKyAKCQkJCSIgIHtcbiIgKyAKCQkJCSIgICAgcmV0dXJuIG1fbWFuYWdlci5nZXRCeUlkKGdldENsYXNzKCksIG5ldyBJbnRlZ2VyKDEpKTtcbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSIgICAgXG4iICsgCgkJCQkiICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hbmFnZXI8QyBleHRlbmRzIFg+XG4iICsgCgkJCQkiICB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyA8VCBleHRlbmRzIElUZXN0PEM+PiBUIGdldEJ5SWQoQ2xhc3M8VD4gY2xzLCBJbnRlZ2VyIGlkKVxuIiArIAoJCQkJIiAgICB7XG4iICsgCgkJCQkiICAgICAgcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSJzaG91bGQgYmUgMiB1bmNoZWNrZWQgd2FybmluZ3M/IgoJCSk7Cgl9CgkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MjQzOQoJcHVibGljIHZvaWQgdGVzdDQ2MCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXB1YmxpYyA8RSBleHRlbmRzIE9iamVjdCwgUyBleHRlbmRzIENvbGxlY3Rpb248RT4+IFMgdGVzdChTIHBhcmFtKSB7XG4iICsgCgkJCQkiCQlcbiIgKyAKCQkJCSIJCUNsYXNzPD8gZXh0ZW5kcyBDb2xsZWN0aW9uPiBjID0gcGFyYW0uZ2V0Q2xhc3MoKTsgLy8gb2tcbiIgKyAKCQkJCSIJCUNsYXNzPD8gZXh0ZW5kcyBDb2xsZWN0aW9uPiBkID0gZ2V0Q2xhenooKTsgLy8ga29cbiIgKyAKCQkJCSIJCXJldHVybiBudWxsO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCUNsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+IGdldENsYXp6KCkge1xuIiArIAoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiYWJzdHJhY3QgY2xhc3MgWiBpbXBsZW1lbnRzIENvbGxlY3Rpb248U3RyaW5nPiB7XG4iICsgCgkJCQkiCXZvaWQgZm9vKCkge1xuIiArIAoJCQkJIgkJQ2xhc3M8PyBleHRlbmRzIENvbGxlY3Rpb24+IGMgPSBnZXRDbGFzcygpOyAvLyBva1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJCSIJQ2xhc3M8PyBleHRlbmRzIENvbGxlY3Rpb24+IGQgPSBnZXRDbGF6eigpOyAvLyBrb1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIENsYXNzPGNhcHR1cmUtb2YgPyBleHRlbmRzIE9iamVjdD4gdG8gQ2xhc3M8PyBleHRlbmRzIENvbGxlY3Rpb24+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgyODQ0CglwdWJsaWMgdm9pZCB0ZXN0NDYxKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VCBleHRlbmRzIGludFtdPiB7XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJCSIJcHVibGljIGNsYXNzIFg8VCBleHRlbmRzIGludFtdPiB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXG4iICsgCgkJCSJUaGUgYXJyYXkgdHlwZSBpbnRbXSBjYW5ub3QgYmUgdXNlZCBhcyBhIHR5cGUgcGFyYW1ldGVyIGJvdW5kXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzk2MjgKCXB1YmxpYyB2b2lkIHRlc3Q0NjIoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJQcm9wZXJ0aWVkT2JqZWN0LmphdmEiLAoJCQkJImludGVyZmFjZSBQcm9wZXJ0aWVkT2JqZWN0PEIgZXh0ZW5kcyBQcm9wZXJ0aWVkT2JqZWN0PEI+PiB7fVxuIiArIAoJCQkJImludGVyZmFjZSBNb2RlbCBleHRlbmRzIFByb3BlcnRpZWRPYmplY3Q8TW9kZWw+IHt9XG4iICsgCgkJCQkiaW50ZXJmYWNlIFZpZXc8VCBleHRlbmRzIE1vZGVsLFU+IGV4dGVuZHMgUHJvcGVydGllZE9iamVjdDxWaWV3PD8sPz4+IHt9XG4iCgkJCX0sCgkJCSIiKTsKCX0KCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzkxNDQKCXB1YmxpYyB2b2lkIHRlc3Q0NjMoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLlNldDtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgWm9yayB6O1xuIiArCgkJCQkiCXB1YmxpYyBTZXQ8U3RyaW5nPltdIHRlc3QoKSB7XG4iICsgCgkJCQkiCSAgIFNldFtdIHNldHMgPSBuZXcgU2V0WzEwXTtcbiIgKyAKCQkJCSIJICAgcmV0dXJuIHNldHM7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMylcclxuIiArIAoJCQkiCVpvcmsgejtcclxuIiArIAoJCQkiCV5eXl5cbiIgKyAKCQkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNilcclxuIiArIAoJCQkiCXJldHVybiBzZXRzO1xyXG4iICsgCgkJCSIJICAgICAgIF5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIFNldFtdIG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG8gU2V0PFN0cmluZz5bXVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQoJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03OTE0NAoJcHVibGljIHZvaWQgdGVzdDQ2NCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIFpvcmsgejtcbiIgKwoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBMaXN0PEludGVnZXI+W10gbnVtcyA9IG5ldyBMaXN0W10ge0NvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoXCJVaCBvaFwiKX07XG4iICsgCgkJCQkiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obnVtc1swXS5nZXQoMCkuaW50VmFsdWUoKSk7XG4iICsgCgkJCQkiICAgIH0gXG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXHJcbiIgKyAKCQkJIglab3JrIHo7XHJcbiIgKyAKCQkJIgleXl5eXG4iICsgCgkJCSJab3JrIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDYpXHJcbiIgKyAKCQkJIglMaXN0PEludGVnZXI+W10gbnVtcyA9IG5ldyBMaXN0W10ge0NvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoXCJVaCBvaFwiKX07XHJcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGV4cHJlc3Npb24gb2YgdHlwZSBMaXN0W10gbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBMaXN0PEludGVnZXI+W11cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgyNTQ3CglwdWJsaWMgdm9pZCB0ZXN0NDY1KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIkNsYS5qYXZhIiwKCQkJCSJjbGFzcyBDbGE8VD4ge1xuIiArIAoJCQkJIiAgICBUIGdldFQoKSB7XG4iICsgCgkJCQkiICAgICAgICByZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBcbiIgKyAKCQkJCSIgICAgdm9pZCBtKCkge1xuIiArIAoJCQkJIiAgICAgICAgU3RyaW5nIHM9IG5ldyBDbGE8U3RyaW5nPi5nZXRUKCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBDbGEuamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCVN0cmluZyBzPSBuZXcgQ2xhPFN0cmluZz4uZ2V0VCgpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiQ2xhLmdldFQgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODMwOTYKCXB1YmxpYyB2b2lkIHRlc3Q0NjYoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxBLCBBPiB7IH1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxKVxuIiArIAoJCQkiCXB1YmxpYyBjbGFzcyBYPEEsIEE+IHsgfVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIkR1cGxpY2F0ZSB0eXBlIHBhcmFtZXRlciBBXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iCgkJKTsKCX0KCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODI2NzEKCXB1YmxpYyB2b2lkIHRlc3Q0NjcoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJ0ZXN0L0Zvby5qYXZhIiwKCQkJCSJwYWNrYWdlIHRlc3Q7IFxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBGb28geyBcbiIgKyAKCQkJCSIgICBwcm90ZWN0ZWQgU3RyaW5nIHM7IFxuIiArIAoJCQkJIiAgIHByb3RlY3RlZCBTdHJpbmcgZG9zb21ldGhpbmcoKXsgcmV0dXJuIFwiZG9uZVwiOyB9IFxuIiArIAoJCQkJIiAgIHByb3RlY3RlZCBjbGFzcyBCYXIge30gXG4iICsKCQkJCSJ9IFxuIiwKCQkJCSJ0ZXN0Mi9Gb29CYXIuamF2YSIsCgkJCQkicGFja2FnZSB0ZXN0MjsgXG4iICsgCgkJCQkiaW1wb3J0IHRlc3QuRm9vOyBcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgRm9vQmFyPFI+IGV4dGVuZHMgRm9vIHsgXG4iICsgCgkJCQkiICAgdm9pZCBmYWlsKCkgeyBcbiIgKyAKCQkJCSIgICAgICBGb29CYXIgZiA9IG5ldyBGb29CYXIoKTsgXG4iICsgCgkJCQkiICAgICAgZi5zID0gXCJmb29cIjsgXG4iICsgCgkJCQkiICAgICAgdGhpcy5zID0gXCJmb29cIjtcbiIgKyAKCQkJCSIgICAgICBmLmRvc29tZXRoaW5nKCk7IFxuIiArIAoJCQkJIiAgICAgIHRoaXMuZG9zb21ldGhpbmcoKTsgIFxuIiArIAoJCQkJIiAgICAgIEJhciBiMTsgXG4iICsKCQkJCSIgICAgICBGb29CYXIuQmFyIGIyOyBcbiIgKwoJCQkJIiAgICAgIEZvby5CYXIgYjM7IFxuIiArCgkJCQkiICAgfSBcbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSIiCgkJKTsKCX0JCgoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODI2NzEgLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3Q0NjgoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJ0ZXN0L0Zvby5qYXZhIiwKCQkJCSJwYWNrYWdlIHRlc3Q7IFxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBGb28geyBcbiIgKyAKCQkJCSIgICBTdHJpbmcgczsgXG4iICsgCgkJCQkiICAgU3RyaW5nIGRvc29tZXRoaW5nKCl7IHJldHVybiBcImRvbmVcIjsgfSBcbiIgKyAKCQkJCSIgICBjbGFzcyBCYXIge30gXG4iICsKCQkJCSJ9IFxuIiwKCQkJCSJ0ZXN0L0Zvb0Jhci5qYXZhIiwKCQkJCSJwYWNrYWdlIHRlc3Q7IFxuIiArIAoJCQkJImltcG9ydCB0ZXN0LkZvbzsgXG4iICsgCgkJCQkicHVibGljIGNsYXNzIEZvb0JhcjxSPiBleHRlbmRzIEZvbyB7IFxuIiArIAoJCQkJIiAgIHZvaWQgZmFpbCgpIHsgXG4iICsgCgkJCQkiICAgICAgRm9vQmFyIGYgPSBuZXcgRm9vQmFyKCk7IFxuIiArIAoJCQkJIiAgICAgIGYucyA9IFwiZm9vXCI7IFxuIiArIAoJCQkJIiAgICAgIHRoaXMucyA9IFwiZm9vXCI7XG4iICsgCgkJCQkiICAgICAgZi5kb3NvbWV0aGluZygpOyBcbiIgKyAKCQkJCSIgICAgICB0aGlzLmRvc29tZXRoaW5nKCk7ICBcbiIgKyAKCQkJCSIgICAgICBCYXIgYjE7IFxuIiArCgkJCQkiICAgICAgRm9vQmFyLkJhciBiMjsgXG4iICsKCQkJCSIgICAgICBGb28uQmFyIGIzOyBcbiIgKwoJCQkJIiAgIH0gXG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiIgoJCSk7Cgl9CQoKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgzMDgzCglwdWJsaWMgdm9pZCB0ZXN0NDY5KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiYS9DLmphdmEiLAoJCQkJInBhY2thZ2UgYTsgXG4iICsgCgkJCQkiaW1wb3J0IHAuQjsgXG4iICsgCgkJCQkicHVibGljIGNsYXNzIEMgZXh0ZW5kcyBCIHsgXG4iICsgCgkJCQkiCXB1YmxpYyB2b2lkIGZvbyhPYmplY3Qgb2JqKSB7fSBcbiIgKyAKCQkJCSJ9IFxuIiwKCQkJCSJwL0IuamF2YSIsCgkJCQkicGFja2FnZSBwOyBcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgQjxFPiBleHRlbmRzIEE8RT4ge30gXG4iLAoJCQkJInAvQS5qYXZhIiwKCQkJCSJwYWNrYWdlIHA7IFxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBBPEU+IHsgXG4iICsgCgkJCQkiCXB1YmxpYyB2b2lkIGZvbyhFIGUpIHt9IFxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiCgkJKTsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJImEvQy5qYXZhIiwKCQkJCSJwYWNrYWdlIGE7IFxuIiArIAoJCQkJImltcG9ydCBwLkI7IFxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBDIGV4dGVuZHMgQiB7IFxuIiArIAoJCQkJIglwdWJsaWMgdm9pZCBmb28oT2JqZWN0IG9iaikge30gXG4iICsgCgkJCQkifSBcbiIsCgkJCQkicC9BLmphdmEiLAoJCQkJInBhY2thZ2UgcDsgXG4iICsgCgkJCQkicHVibGljIGNsYXNzIEE8RT4geyBcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgZm9vKEUgZSkge30gXG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIiIsCgkJCW51bGwsCgkJCWZhbHNlLCAvLyBkbyBub3QgZmx1c2ggb3V0cHV0CgkJCW51bGwpOwkJCQoJfQoKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgzMjI1CglwdWJsaWMgdm9pZCB0ZXN0NDcwKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIDxUPiBUIGNob29zZShib29sZWFuIGIsIFQgdDEsIFQgdDIpIHtcbiIgKyAKCQkJCSIJCWlmIChiKVxuIiArIAoJCQkJIgkJCXJldHVybiB0MTtcbiIgKyAKCQkJCSIJCXJldHVybiB0MjtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgZm9vKCkge1xuIiArIAoJCQkJIgkJQ29tcGFyYWJsZSBzMSA9IGNob29zZSh0cnVlLCBcInN0cmluZ1wiLCBuZXcgSW50ZWdlcigxKSk7XG4iICsgCgkJCQkiCQlOdW1iZXIgczIgPSBjaG9vc2UodHJ1ZSwgbmV3IEludGVnZXIoMSksIG5ldyBGbG9hdCgyKSk7XG4iICsgCgkJCQkiCQlDb21wYXJhYmxlIHMzID0gY2hvb3NlKHRydWUsIG5ldyBJbnRlZ2VyKDEpLCBuZXcgRmxvYXQoMikpO1xuIiArIAoJCQkJIgkJQ2xvbmVhYmxlIHM0ID0gY2hvb3NlKHRydWUsIG5ldyBJbnRlZ2VyKDEpLCBuZXcgRmxvYXQoMikpO1xuIiArIAoJCQkJIgkJQ2xvbmVhYmxlIHM1ID0gY2hvb3NlKHRydWUsIFwic3RyaW5nXCIsIG5ldyBJbnRlZ2VyKDEpKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMilcbiIgKyAKCQkJIglDbG9uZWFibGUgczQgPSBjaG9vc2UodHJ1ZSwgbmV3IEludGVnZXIoMSksIG5ldyBGbG9hdCgyKSk7XG4iICsgCgkJCSIJICAgICAgICAgIF5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIE51bWJlciZDb21wYXJhYmxlPD8+IHRvIENsb25lYWJsZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEzKVxuIiArIAoJCQkiCUNsb25lYWJsZSBzNSA9IGNob29zZSh0cnVlLCBcInN0cmluZ1wiLCBuZXcgSW50ZWdlcigxKSk7XG4iICsgCgkJCSIJICAgICAgICAgIF5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIE9iamVjdCZTZXJpYWxpemFibGUmQ29tcGFyYWJsZTw/PiB0byBDbG9uZWFibGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MjY3MSAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDQ3MSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJ0ZXN0L0Zvby5qYXZhIiwKCQkJCSJwYWNrYWdlIHRlc3Q7IFxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBGb288Uj4geyBcbiIgKyAKCQkJCSIgICBwcm90ZWN0ZWQgUiBzOyBcbiIgKyAKCQkJCSIgICBwcm90ZWN0ZWQgUiBkb3NvbWV0aGluZygpeyByZXR1cm4gczsgfSBcbiIgKyAKCQkJCSIgICBwcm90ZWN0ZWQgY2xhc3MgQmFyIHt9IFxuIiArCgkJCQkifSBcbiIsCgkJCQkidGVzdDIvRm9vQmFyLmphdmEiLAoJCQkJInBhY2thZ2UgdGVzdDI7IFxuIiArIAoJCQkJImltcG9ydCB0ZXN0LkZvbzsgXG4iICsgCgkJCQkicHVibGljIGNsYXNzIEZvb0JhcjxSPiBleHRlbmRzIEZvbzxSPiB7IFxuIiArIAoJCQkJIiAgIHZvaWQgZmFpbCgpIHsgXG4iICsgCgkJCQkiICAgICAgRm9vQmFyPFN0cmluZz4gZiA9IG5ldyBGb29CYXI8U3RyaW5nPigpOyBcbiIgKyAKCQkJCSIgICAgICBmLnMgPSBcImZvb1wiOyBcbiIgKyAKCQkJCSIgICAgICB0aGlzLnMgPSBcImZvb1wiO1xuIiArIAoJCQkJIiAgICAgIGYuZG9zb21ldGhpbmcoKTsgXG4iICsgCgkJCQkiICAgICAgdGhpcy5kb3NvbWV0aGluZygpOyAgXG4iICsgCgkJCQkiICAgICAgQmFyIGIxOyBcbiIgKwoJCQkJIiAgICAgIEZvb0JhcjxTdHJpbmc+LkJhciBiMjsgXG4iICsKCQkJCSIgICAgICBGb288U3RyaW5nPi5CYXIgYjM7IFxuIiArCgkJCQkiICAgfSBcbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiB0ZXN0MlxcRm9vQmFyLmphdmEgKGF0IGxpbmUgNylcclxuIiArIAoJCQkiCXRoaXMucyA9IFwiZm9vXCI7XHJcbiIgKyAKCQkJIgkgICAgICAgICBeXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBTdHJpbmcgdG8gUlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIgkpOwoJfQkJCgoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODI2NzEgLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3Q0NzIoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkidGVzdC9Gb28uamF2YSIsCgkJCQkicGFja2FnZSB0ZXN0OyBcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgRm9vPFI+IHsgXG4iICsgCgkJCQkiICAgcHJpdmF0ZSBSIHM7IFxuIiArIAoJCQkJIiAgIHByaXZhdGUgUiBkb3NvbWV0aGluZygpeyByZXR1cm4gczsgfSBcbiIgKyAKCQkJCSIgICBwcml2YXRlIGNsYXNzIEJhciB7fSBcbiIgKwoJCQkJIn0gXG4iLAoJCQkJInRlc3QyL0Zvb0Jhci5qYXZhIiwKCQkJCSJwYWNrYWdlIHRlc3QyOyBcbiIgKyAKCQkJCSJpbXBvcnQgdGVzdC5Gb287IFxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBGb29CYXI8Uj4gZXh0ZW5kcyBGb288Uj4geyBcbiIgKyAKCQkJCSIgICB2b2lkIGZhaWwoKSB7IFxuIiArIAoJCQkJIiAgICAgIEZvb0JhcjxTdHJpbmc+IGYgPSBuZXcgRm9vQmFyPFN0cmluZz4oKTsgXG4iICsgCgkJCQkiICAgICAgZi5zID0gXCJmb29cIjsgXG4iICsgCgkJCQkiICAgICAgdGhpcy5zID0gXCJmb29cIjtcbiIgKyAKCQkJCSIgICAgICBmLmRvc29tZXRoaW5nKCk7IFxuIiArIAoJCQkJIiAgICAgIHRoaXMuZG9zb21ldGhpbmcoKTsgIFxuIiArIAoJCQkJIiAgICAgIEJhciBiMTsgXG4iICsKCQkJCSIgICAgICBGb29CYXI8U3RyaW5nPi5CYXIgYjI7IFxuIiArCgkJCQkiICAgICAgRm9vPFN0cmluZz4uQmFyIGIzOyBcbiIgKwoJCQkJIiAgIH0gXG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiB0ZXN0XFxGb28uamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCXByaXZhdGUgUiBkb3NvbWV0aGluZygpeyByZXR1cm4gczsgfSBcbiIgKyAKCQkJIgkgICAgICAgICAgXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCBkb3NvbWV0aGluZygpIGZyb20gdGhlIHR5cGUgRm9vPFI+IGlzIG5ldmVyIHVzZWQgbG9jYWxseVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiB0ZXN0XFxGb28uamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCXByaXZhdGUgY2xhc3MgQmFyIHt9IFxuIiArIAoJCQkiCSAgICAgICAgICAgICAgXl5eXG4iICsgCgkJCSJUaGUgdHlwZSBGb288Uj4uQmFyIGlzIG5ldmVyIHVzZWQgbG9jYWxseVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gdGVzdDJcXEZvb0Jhci5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJZi5zID0gXCJmb29cIjsgXG4iICsgCgkJCSIJXl5eXG4iICsgCgkJCSJUaGUgZmllbGQgRm9vPFN0cmluZz4ucyBpcyBub3QgdmlzaWJsZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gdGVzdDJcXEZvb0Jhci5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJCSIJdGhpcy5zID0gXCJmb29cIjtcbiIgKyAKCQkJIgkgICAgIF5cbiIgKyAKCQkJIlRoZSBmaWVsZCBGb288Uj4ucyBpcyBub3QgdmlzaWJsZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gRVJST1IgaW4gdGVzdDJcXEZvb0Jhci5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJCSIJZi5kb3NvbWV0aGluZygpOyBcbiIgKyAKCQkJIgkgIF5eXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGRvc29tZXRoaW5nKCkgZnJvbSB0aGUgdHlwZSBGb288U3RyaW5nPiBpcyBub3QgdmlzaWJsZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNC4gRVJST1IgaW4gdGVzdDJcXEZvb0Jhci5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJCSIJdGhpcy5kb3NvbWV0aGluZygpOyAgXG4iICsgCgkJCSIJICAgICBeXl5eXl5eXl5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCBkb3NvbWV0aGluZygpIGZyb20gdGhlIHR5cGUgRm9vPFI+IGlzIG5vdCB2aXNpYmxlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI1LiBFUlJPUiBpbiB0ZXN0MlxcRm9vQmFyLmphdmEgKGF0IGxpbmUgMTApXG4iICsgCgkJCSIJQmFyIGIxOyBcbiIgKyAKCQkJIgleXl5cbiIgKyAKCQkJIlRoZSB0eXBlIEJhciBpcyBub3QgdmlzaWJsZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNi4gRVJST1IgaW4gdGVzdDJcXEZvb0Jhci5qYXZhIChhdCBsaW5lIDExKVxuIiArIAoJCQkiCUZvb0JhcjxTdHJpbmc+LkJhciBiMjsgXG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgdHlwZSBGb29CYXIuQmFyIGlzIG5vdCB2aXNpYmxlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI3LiBFUlJPUiBpbiB0ZXN0MlxcRm9vQmFyLmphdmEgKGF0IGxpbmUgMTIpXG4iICsgCgkJCSIJRm9vPFN0cmluZz4uQmFyIGIzOyBcbiIgKyAKCQkJIgleXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlRoZSB0eXBlIEZvby5CYXIgaXMgbm90IHZpc2libGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgxNTk0CglwdWJsaWMgdm9pZCB0ZXN0NDczKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFhcbiIgKyAKCQkJCSJ7XG4iICsgCgkJCQkiCUxpc3Q8Qj4gaXRzTGlzdDtcbiIgKyAKCQkJCSIJQiBpdHNCO1xuIiArIAoJCQkJIglNeVR5cGVkIGl0c1R5cGVkO1xuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCXB1YmxpYyB2b2lkIHRlc3QoKVxuIiArIAoJCQkJIgl7XG4iICsgCgkJCQkiCQltZXRob2QgKGl0c0xpc3QsIGl0c0IsIGl0c1R5cGVkKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJcHVibGljIDxUPiB2b2lkIG1ldGhvZCAoTGlzdDw/IGV4dGVuZHMgVD4gYXJnMSwgVCBhcmcyLCBUeXBlZDw/IHN1cGVyIFQ+IGFyZzMpXG4iICsgCgkJCQkiCXtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJaW50ZXJmYWNlIEF7fVxuIiArIAoJCQkJIgljbGFzcyBCIGltcGxlbWVudHMgQXt9XG4iICsgCgkJCQkiCWNsYXNzIFR5cGVkPFQ+e31cbiIgKyAKCQkJCSIJY2xhc3MgTXlUeXBlZCBleHRlbmRzIFR5cGVkPEE+e31cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSIiKTsKCX0JCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MTU5NCAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDQ3NCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglUeXBlZDxCPiBpdHNMaXN0O1xuIiArIAoJCQkJIglUeXBlZDxBPiBpdHNUeXBlZDtcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgdGVzdCgpIHtcbiIgKyAKCQkJCSIJCW1ldGhvZChpdHNMaXN0LCBpdHNUeXBlZCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIDxUPiB2b2lkIG1ldGhvZChUeXBlZDw/IGV4dGVuZHMgVD4gYXJnMSwgVHlwZWQ8PyBzdXBlciBUPiBhcmczKSB7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJaW50ZXJmYWNlIEEge1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCWNsYXNzIEIgaW1wbGVtZW50cyBBIHtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgljbGFzcyBUeXBlZDxUPiB7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSIiKTsKCX0JCgkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgzMzk4CglwdWJsaWMgdm9pZCB0ZXN0NDc1KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgdm9pZCBtZXRob2QoTGlzdDw/IHN1cGVyIE51bWJlcj4gbGlzdCkge1xuIiArIAoJCQkJIiAgICAgICAgbGlzdC5hZGQobmV3IE9iamVjdCgpKTsgICAvLyBzaG91bGQgZmFpbFxuIiArIAoJCQkJIiAgICAgICAgbGlzdC5hZGQobmV3IEludGVnZXIoMykpOyAvLyBjb3JyZWN0XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIglsaXN0LmFkZChuZXcgT2JqZWN0KCkpOyAgIC8vIHNob3VsZCBmYWlsXG4iICsgCgkJCSIJICAgICBeXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPyBzdXBlciBOdW1iZXIpIGluIHRoZSB0eXBlIExpc3Q8Y2FwdHVyZS1vZiA/IHN1cGVyIE51bWJlcj4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKE9iamVjdClcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgzMzk4IC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0NDc2KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgdm9pZCBtZXRob2QoTGlzdDw/IHN1cGVyIE51bWJlcj4gbGlzdCwgTGlzdDxPYmplY3Q+IGxvKSB7XG4iICsgCgkJCQkiICAgIAlsaXN0ID0gbG87XG4iICsgCgkJCQkiICAgIAlsbyA9IGxpc3Q7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkJIglsbyA9IGxpc3Q7XG4iICsgCgkJCSIJICAgICBeXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIExpc3Q8Y2FwdHVyZS1vZiA/IHN1cGVyIE51bWJlcj4gdG8gTGlzdDxPYmplY3Q+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODMzOTggLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3Q0NzcoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFg8VCBleHRlbmRzIE51bWJlcj4ge1xuIiArIAoJCQkJIglMaXN0PD8gc3VwZXIgVD4gbGhzO1xuIiArIAoJCQkJIglMaXN0PD8gZXh0ZW5kcyBOdW1iZXI+IHJocztcbiIgKyAKCQkJCSIJe1xuIiArIAoJCQkJIgkJbGhzLmFkZChyaHMuZ2V0KDApKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCQkiCWxocy5hZGQocmhzLmdldCgwKSk7XG4iICsgCgkJCSIJICAgIF5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCBhZGQoY2FwdHVyZS1vZiA/IHN1cGVyIFQpIGluIHRoZSB0eXBlIExpc3Q8Y2FwdHVyZS1vZiA/IHN1cGVyIFQ+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChjYXB0dXJlLW9mID8gZXh0ZW5kcyBOdW1iZXIpXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MzM5OCAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDQ3OCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWDxVIGV4dGVuZHMgTnVtYmVyPiB7XG4iICsgCgkJCQkiCUxpc3Q8PyBzdXBlciBOdW1iZXI+IGxocztcbiIgKyAKCQkJCSIJTGlzdDw/IHN1cGVyIFU+IHJocztcbiIgKyAKCQkJCSIJe1xuIiArIAoJCQkJIgkJbGhzLmFkZChyaHMuZ2V0KDApKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCQkiCWxocy5hZGQocmhzLmdldCgwKSk7XG4iICsgCgkJCSIJICAgIF5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCBhZGQoY2FwdHVyZS1vZiA/IHN1cGVyIE51bWJlcikgaW4gdGhlIHR5cGUgTGlzdDxjYXB0dXJlLW9mID8gc3VwZXIgTnVtYmVyPiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoY2FwdHVyZS1vZiA/IHN1cGVyIFUpXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCgkKCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODMzOTggLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3Q0NzkoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWDxVIGV4dGVuZHMgTnVtYmVyPiB7XG4iICsgCgkJCQkiCUxpc3Q8PyBzdXBlciBOdW1iZXI+IGxocztcbiIgKyAKCQkJCSIJTGlzdDw/IGV4dGVuZHMgVT4gcmhzO1xuIiArIAoJCQkJIgl7XG4iICsgCgkJCQkiCQlsaHMuYWRkKHJocy5nZXQoMCkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiIik7Cgl9CQoKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgzMzk4IC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0NDgwKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYPFUgZXh0ZW5kcyBOdW1iZXI+IHtcbiIgKyAKCQkJCSIJTGlzdDw/IHN1cGVyIEludGVnZXI+IGxocztcbiIgKyAKCQkJCSIJTGlzdDw/IGV4dGVuZHMgTnVtYmVyPiByaHM7XG4iICsgCgkJCQkiCXtcbiIgKyAKCQkJCSIJCWxocy5hZGQocmhzLmdldCgwKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkJIglsaHMuYWRkKHJocy5nZXQoMCkpO1xuIiArIAoJCQkiCSAgICBeXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPyBzdXBlciBJbnRlZ2VyKSBpbiB0aGUgdHlwZSBMaXN0PGNhcHR1cmUtb2YgPyBzdXBlciBJbnRlZ2VyPiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoY2FwdHVyZS1vZiA/IGV4dGVuZHMgTnVtYmVyKVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCgoKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgzMzk4IC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0NDgxKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYPFUgZXh0ZW5kcyBOdW1iZXI+IHtcbiIgKyAKCQkJCSIJTGlzdDw/IHN1cGVyIE51bWJlcj4gbGhzO1xuIiArIAoJCQkJIglMaXN0PD8gc3VwZXIgSW50ZWdlcj4gcmhzO1xuIiArIAoJCQkJIgl7XG4iICsgCgkJCQkiCQlsaHMuYWRkKHJocy5nZXQoMCkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJbGhzLmFkZChyaHMuZ2V0KDApKTtcbiIgKyAKCQkJIgkgICAgXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8gc3VwZXIgTnVtYmVyKSBpbiB0aGUgdHlwZSBMaXN0PGNhcHR1cmUtb2YgPyBzdXBlciBOdW1iZXI+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChjYXB0dXJlLW9mID8gc3VwZXIgSW50ZWdlcilcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgzNzk5CglwdWJsaWMgdm9pZCB0ZXN0NDgyKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgZmluYWwgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyA8VD4gdm9pZCB0ZXN0RXF1YWxzKGZpbmFsIFN0cmluZyB4LCBUIG9uZSwgVCB0d28pIHtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgPFQxLCBUMj4gdm9pZCB0ZXN0RXF1YWxzQWx0KGZpbmFsIFN0cmluZyB4LCBUMSBvbmUsIFQyIHR3bykge1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXB1YmxpYyBpbnRlcmZhY2UgRm9vZXkge1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXB1YmxpYyBpbnRlcmZhY2UgQmFyIGV4dGVuZHMgRm9vZXkge1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXB1YmxpYyBpbnRlcmZhY2UgR2VuZXJpY0Zvb2V5PFQ+IHtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgaW50ZXJmYWNlIEdlbmVyaWNCYXI8VD4gZXh0ZW5kcyBHZW5lcmljRm9vZXk8VD4ge1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmljKCkge1xuIiArIAoJCQkJIgkJdGVzdEVxdWFscyhcIlNob3VsZCB3b3JrXCIsIG5ldyBHZW5lcmljQmFyPExvbmc+KCkge1xuIiArIAoJCQkJIgkJfSwgbmV3IEdlbmVyaWNCYXI8TG9uZz4oKSB7XG4iICsgCgkJCQkiCQl9KTtcbiIgKyAKCQkJCSIJCWZpbmFsIEdlbmVyaWNCYXI8TG9uZz4gY2hpbGQgPSBuZXcgR2VuZXJpY0JhcjxMb25nPigpIHtcbiIgKyAKCQkJCSIJCX07XG4iICsgCgkJCQkiCQlmaW5hbCBHZW5lcmljRm9vZXk8TG9uZz4gcGFyZW50ID0gY2hpbGQ7XG4iICsgCgkJCQkiCQl0ZXN0RXF1YWxzKFwiRG9lc25cJ3Qgd29yayBidXQgc2hvdWxkXCIsIGNoaWxkLCBwYXJlbnQpOyAvLyB0aGlzXG4iICsgCgkJCQkiCQkvLyBmYWlsc1xuIiArIAoJCQkJIgkJLy8gYnV0IHNob3VsZCB3b3JrIGl0XCdzIGlkZW50aWNhbCB0byBuZXh0IGxpbmUuXG4iICsgCgkJCQkiCQl0ZXN0RXF1YWxzKFwiRG9lc25cJ3Qgd29yayBidXQgc2hvdWxkXCIsIChHZW5lcmljRm9vZXk8TG9uZz4pIGNoaWxkLCBwYXJlbnQpO1xuIiArIAoJCQkJIgkJdGVzdEVxdWFsc0FsdChcIlNob3VsZCB3b3JrXCIsIGNoaWxkLCBwYXJlbnQpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyB2b2lkIHRlc3QoKSB7XG4iICsgCgkJCQkiCQl0ZXN0RXF1YWxzKFwiU2hvdWxkIHdvcmtcIiwgbmV3IEJhcigpIHtcbiIgKyAKCQkJCSIJCX0sIG5ldyBCYXIoKSB7XG4iICsgCgkJCQkiCQl9KTtcbiIgKyAKCQkJCSIJCWZpbmFsIEJhciBjaGlsZCA9IG5ldyBCYXIoKSB7XG4iICsgCgkJCQkiCQl9O1xuIiArIAoJCQkJIgkJZmluYWwgRm9vZXkgcGFyZW50ID0gY2hpbGQ7XG4iICsgCgkJCQkiCQl0ZXN0RXF1YWxzKFwiRG9lc25cJ3Qgd29yayBidXQgc2hvdWxkXCIsIGNoaWxkLCBwYXJlbnQpO1xuIiArIAoJCQkJIgkJdGVzdEVxdWFscyhcIkRvZXNuXCd0IHdvcmsgYnV0IHNob3VsZFwiLCAoRm9vZXkpIGNoaWxkLCBwYXJlbnQpO1xuIiArIAoJCQkJIgkJdGVzdEVxdWFsc0FsdChcIlNob3VsZCB3b3JrXCIsIGNoaWxkLCBwYXJlbnQpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiIik7Cgl9CgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MzkwNAoJcHVibGljIHZvaWQgdGVzdDQ4MygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImNsYXNzIFk8VCBleHRlbmRzIE51bWJlcj4ge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHtcbiIgKyAKCQkJCSIgICAgICAgIG0obmV3IFk8U2hvcnQ+KCksIG5ldyBZPEludGVnZXI+KCkpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBOdW1iZXI+IHZvaWQgbShZPFQ+IHgsIFk8VD4geSkge1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXHJcbiIgKyAKCQkJIgltKG5ldyBZPFNob3J0PigpLCBuZXcgWTxJbnRlZ2VyPigpKTtcclxuIiArIAoJCQkiCV5cbiIgKyAKCQkJIlRoZSBtZXRob2QgbShZPFQ+LCBZPFQ+KSBpbiB0aGUgdHlwZSBYIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChZPFNob3J0PiwgWTxJbnRlZ2VyPilcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODIzNDkKCXB1YmxpYyB2b2lkIHRlc3Q0ODQoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImNsYXNzIEJhc2U8VD4ge1xuIiArIAoJCQkJIglwdWJsaWMgY2xhc3MgSW5uZXIge1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCUlubmVyIGE7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgQmFzZTxJbnRlZ2VyPiB7XG4iICsgCgkJCQkiCWNsYXNzIERlcml2ZWRJbm5lciBleHRlbmRzIElubmVyIHtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglYKCkge1xuIiArIAoJCQkJIgkJYSA9IG5ldyBEZXJpdmVkSW5uZXIoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIiIpOwoJfQkJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MjM0OSAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDQ4NSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiY2xhc3MgQmFzZTxUPiB7XG4iICsgCgkJCQkiCXB1YmxpYyBjbGFzcyBJbm5lcjxVPiB7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJSW5uZXIgYTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBCYXNlPEludGVnZXI+IHtcbiIgKyAKCQkJCSIJY2xhc3MgRGVyaXZlZElubmVyIGV4dGVuZHMgSW5uZXIge1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCVgoKSB7XG4iICsgCgkJCQkiCQlhID0gbmV3IERlcml2ZWRJbm5lcigpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiIik7Cgl9CQkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgyMzQ5IC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0NDg2KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJjbGFzcyBCYXNlPFQ+IHtcbiIgKyAKCQkJCSIJcHVibGljIGNsYXNzIElubmVyPFU+IHtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglJbm5lciBhO1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIEJhc2U8SW50ZWdlcj4ge1xuIiArIAoJCQkJIgljbGFzcyBEZXJpdmVkSW5uZXIgZXh0ZW5kcyBJbm5lcjxGbG9hdD4ge1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCVgoKSB7XG4iICsgCgkJCQkiCQlhID0gbmV3IERlcml2ZWRJbm5lcigpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiIik7Cgl9CQkKCXB1YmxpYyB2b2lkIHRlc3Q0ODcoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIgl2b2lkIGZvbyhMaXN0PFN0cmluZz4gbHMpIHtcbiIgKyAKCQkJCSIJCUxpc3Q8Pz4gbCA9IGxzO1xuIiArIAoJCQkJIgkJYmFyKGwsIFwiXCIpOyBcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgk8VD4gdm9pZCBiYXIoTGlzdDw/IHN1cGVyIFQ+IGwsIFQgdCkge1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJYmFyKGwsIFwiXCIpOyBcbiIgKyAKCQkJIgleXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgYmFyKExpc3Q8PyBzdXBlciBUPiwgVCkgaW4gdGhlIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoTGlzdDxjYXB0dXJlLW9mID8+LCBTdHJpbmcpXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDQ5NgoJcHVibGljIHZvaWQgdGVzdDQ4OCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgRm9vPD8+IGYxID0gbmV3IEZvbzxJbnRlZ2VyPigpO1xuIiArIAoJCQkJIiAgICAgICAgRm9vPD8+IGYyID0gbmV3IEZvbzxTdHJpbmc+KCk7XG4iICsgCgkJCQkiICAgICAgICBmMS5iYXIgPSBmMi5iYXI7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgc3RhdGljIGNsYXNzIEZvbzxUPiB7XG4iICsgCgkJCQkiICAgICAgIEJhcjxUPiBiYXIgPSBuZXcgQmFyPFQ+KCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgc3RhdGljIGNsYXNzIEJhcjxUPiB7XG4iICsgCgkJCQkiICAgICAgICBUIHQ7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIglmMS5iYXIgPSBmMi5iYXI7XG4iICsgCgkJCSIJICAgICAgICAgXl5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFguQmFyPGNhcHR1cmUtb2YgPz4gdG8gWC5CYXI8Y2FwdHVyZS1vZiA/PlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDQ5NgoJcHVibGljIHZvaWQgdGVzdDQ4OSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgRm9vPD8+IGYxID0gbmV3IEZvbzxJbnRlZ2VyPigpO1xuIiArIAoJCQkJIiAgICAgICAgZjEuYmFyID0gZjEuYmFyO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHN0YXRpYyBjbGFzcyBGb288VD4ge1xuIiArIAoJCQkJIiAgICAgICBCYXI8VD4gYmFyID0gbmV3IEJhcjxUPigpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHN0YXRpYyBjbGFzcyBCYXI8VD4ge1xuIiArIAoJCQkJIiAgICAgICAgVCB0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJZjEuYmFyID0gZjEuYmFyO1xuIiArIAoJCQkiCSAgICAgICAgIF5eXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBYLkJhcjxjYXB0dXJlLW9mID8+IHRvIFguQmFyPGNhcHR1cmUtb2YgPz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCglwdWJsaWMgdm9pZCB0ZXN0NDkwKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIglUIHQ7XG4iICsgCgkJCQkiCXZvaWQgZm9vKFg8Pz4gbGhzLCBYPD8+IHJocykge1xuIiArIAoJCQkJIgkJbGhzID0gcmhzO1xuIiArIAoJCQkJIgkJbGhzLnQgPSByaHMudDtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgl2b2lkIGJhcihYPFg8Pz4+IGxocywgWDxYPD8+PiByaHMpIHtcbiIgKyAKCQkJCSIJCWxocyA9IHJocztcbiIgKyAKCQkJCSIJCWxocy50ID0gcmhzLnQ7XG4iICsgCgkJCQkiCX19XG4iICsgCgkJCQkiXG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIglsaHMudCA9IHJocy50O1xuIiArIAoJCQkiCSAgICAgICAgXl5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gY2FwdHVyZS1vZiA/IHRvIGNhcHR1cmUtb2YgP1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCQoJcHVibGljIHZvaWQgdGVzdDQ5MSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJCSIJVCB0O1xuIiArIAoJCQkJIgl2b2lkIGZvbyhYPD8+IGxocywgWDw/PiByaHMpIHtcbiIgKyAKCQkJCSIJCWxocyA9IHJocztcbiIgKyAKCQkJCSIJCWxocy50ID0gcmhzLnQ7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBiYXIoWDxYPD8+PiBsaHMsIFg8WDw/Pj4gcmhzKSB7XG4iICsgCgkJCQkiCQlsaHMgPSByaHM7XG4iICsgCgkJCQkiCQlsaHMudCA9IHJocy50O1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXZvaWQgYmF6KFg8PyBzdXBlciBOdW1iZXI+IGxocywgWDw/IGV4dGVuZHMgTnVtYmVyPiByaHMpIHtcbiIgKyAKCQkJCSIJCWxocyA9IHJocztcbiIgKyAKCQkJCSIJCWxocy50ID0gcmhzLnQ7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBiYXoyKFg8PyBleHRlbmRzIE51bWJlcj4gbGhzLCBYPD8gZXh0ZW5kcyBOdW1iZXI+IHJocykge1xuIiArIAoJCQkJIgkJbGhzID0gcmhzO1xuIiArIAoJCQkJIgkJbGhzLnQgPSByaHMudDtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgl2b2lkIGJhejMoWDw/IGV4dGVuZHMgTnVtYmVyPiBsaHMsIFg8PyBzdXBlciBOdW1iZXI+IHJocykge1xuIiArIAoJCQkJIgkJbGhzID0gcmhzO1xuIiArIAoJCQkJIgkJbGhzLnQgPSByaHMudDtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgl2b2lkIGJhejQoWDw/IHN1cGVyIE51bWJlcj4gbGhzLCBYPD8gc3VwZXIgTnVtYmVyPiByaHMpIHtcbiIgKyAKCQkJCSIJCWxocyA9IHJocztcbiIgKyAKCQkJCSIJCWxocy50ID0gcmhzLnQ7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIglsaHMudCA9IHJocy50O1xuIiArIAoJCQkiCSAgICAgICAgXl5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gY2FwdHVyZS1vZiA/IHRvIGNhcHR1cmUtb2YgP1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEyKVxuIiArIAoJCQkiCWxocyA9IHJocztcbiIgKyAKCQkJIgkgICAgICBeXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gWDxjYXB0dXJlLW9mID8gZXh0ZW5kcyBOdW1iZXI+IHRvIFg8PyBzdXBlciBOdW1iZXI+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTcpXG4iICsgCgkJCSIJbGhzLnQgPSByaHMudDtcbiIgKyAKCQkJIgkgICAgICAgIF5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIGNhcHR1cmUtb2YgPyBleHRlbmRzIE51bWJlciB0byBjYXB0dXJlLW9mID8gZXh0ZW5kcyBOdW1iZXJcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjQuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyMClcbiIgKyAKCQkJIglsaHMgPSByaHM7XG4iICsgCgkJCSIJICAgICAgXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFg8Y2FwdHVyZS1vZiA/IHN1cGVyIE51bWJlcj4gdG8gWDw/IGV4dGVuZHMgTnVtYmVyPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDIxKVxuIiArIAoJCQkiCWxocy50ID0gcmhzLnQ7XG4iICsgCgkJCSIJICAgICAgICBeXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBjYXB0dXJlLW9mID8gc3VwZXIgTnVtYmVyIHRvIGNhcHR1cmUtb2YgPyBleHRlbmRzIE51bWJlclxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDI1KVxuIiArIAoJCQkiCWxocy50ID0gcmhzLnQ7XG4iICsgCgkJCSIJICAgICAgICBeXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBjYXB0dXJlLW9mID8gc3VwZXIgTnVtYmVyIHRvIGNhcHR1cmUtb2YgPyBzdXBlciBOdW1iZXJcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODE1NzYKCXB1YmxpYyB2b2lkIHRlc3Q0OTIoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJTdXBlclR5cGUuamF2YSIsLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJCSJwdWJsaWMgY2xhc3MgU3VwZXJUeXBlPFQ+IHtcbiIgKyAKCQkJCSIJcHJvdGVjdGVkIElubmVyVHlwZSB2YWx1ZVdyYXBwZXI7XG4iICsgCgkJCQkiCXByb3RlY3RlZCBjbGFzcyBJbm5lclR5cGUge1xuIiArIAoJCQkJIgkJcHJpdmF0ZSBUIHZhbHVlO1xuIiArIAoJCQkJIgkJcHJvdGVjdGVkIElubmVyVHlwZShUIHZhbHVlKSB7XG4iICsgCgkJCQkiCQkJdGhpcy52YWx1ZSA9IHZhbHVlO1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBTdXBlclR5cGUoVCB2YWx1ZSkge1xuIiArIAoJCQkJIgkJLypcbiIgKyAKCQkJCSIJCSAqIFRoaXMgY29uc3RydWN0b3IgZXhpc3RzIG9ubHkgdG8gc2hvdyB0aGF0IHRoZSB1c2FnZSBvZiB0aGUgaW5uZXJcbiIgKyAKCQkJCSIJCSAqIGNsYXNzIHdpdGhpbiBpdHMgZW5jbG9zaW5nIGNsYXNzIG1ha2VzIG5vIHByb2JsZW1zXG4iICsgCgkJCQkiCQkgKi9cbiIgKyAKCQkJCSIJCXRoaXMudmFsdWVXcmFwcGVyID0gbmV3IElubmVyVHlwZSh2YWx1ZSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHJvdGVjdGVkIFN1cGVyVHlwZSgpIHtcbiIgKyAKCQkJCSIJCS8vIFByb3ZpZGVkIGZvciB0aGUgY29udmVuaWVuY2Ugb2Ygc3ViY2xhc3Nlc1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJCSJTdWJUeXBlLmphdmEiLC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCQkicHVibGljIGNsYXNzIFN1YlR5cGU8VD4gZXh0ZW5kcyBTdXBlclR5cGU8VD4ge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgU3ViVHlwZShUIHZhbHVlKSB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCQkvKiBUaGUgY29uc3RydWN0b3IgU3VwZXJUeXBlIDxUPi5Jbm5lclR5cGUoVCkgaXMgdW5kZWZpbmVkICovXG4iICsgCgkJCQkiCQlJbm5lclR5cGUgbG9jYWxWYWx1ZVdyYXBwZXIgPSBuZXcgSW5uZXJUeXBlKHZhbHVlKTtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJCS8qXG4iICsgCgkJCQkiCQkgKiBUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFN1cGVyVHlwZSA8VD4uSW5uZXJUeXBlIHRvXG4iICsgCgkJCQkiCQkgKiBTdXBlclR5cGUgPFQ+LklubmVyVHlwZVxuIiArIAoJCQkJIgkJICogXG4iICsgCgkJCQkiCQkgKiBUeXBlIHNhZmV0eTogVGhlIGV4cHJlc3Npb24gb2YgcmF3IHR5cGUgU3VwZXJUeXBlLklubmVyVHlwZSBpc1xuIiArIAoJCQkJIgkJICogY29udmVydGVkIHRvIFN1cGVyVHlwZSA8VD4uSW5uZXJUeXBlLiBSZWZlcmVuY2VzIHRvIGdlbmVyaWMgdHlwZVxuIiArIAoJCQkJIgkJICogU3VwZXJUeXBlIDxUPi5Jbm5lclR5cGUgc2hvdWxkIGJlIHBhcmFtZXRyaXplZC5cbiIgKyAKCQkJCSIJCSAqL1xuIiArIAoJCQkJIgkJbG9jYWxWYWx1ZVdyYXBwZXIgPSBzdXBlci52YWx1ZVdyYXBwZXI7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJ9XG4iCQkJCgkJCX0sCgkJCSIiKTsKCX0JCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgzNjExCglwdWJsaWMgdm9pZCB0ZXN0NDkzKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyBjbGFzcyBNPFQ+IHsgTShDbGFzczxUPiB0ZW1wbGF0ZUNsYXNzKSB7fSB9XG4iICsgCgkJCQkifVxuIiwKCQkJCSJZLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBZIGV4dGVuZHMgWCB7XG4iICsgCgkJCQkiCXZvaWQgdGVzdCgpIHsgTTxYPiBtID0gbmV3IE08WD4oWC5jbGFzcyk7IH1cbiIgKyAKCQkJCSJ9XG4iCQkJCgkJCX0sCgkJCSIiCgkJKTsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlkuamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFkgZXh0ZW5kcyBYIHtcbiIgKyAKCQkJCSIJdm9pZCB0ZXN0KCkgeyBNPFg+IG0gPSBuZXcgTTxYPihYLmNsYXNzKTsgfVxuIiArIAoJCQkJIn1cbiIJCQkKCQkJfSwKCQkJIiIsCgkJCW51bGwsCgkJCWZhbHNlLAoJCQludWxsCgkJKTsKCX0KCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgzNjE1CglwdWJsaWMgdm9pZCB0ZXN0NDk0KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCU51bWJlciBuPSBudWxsO1xuIiArIAoJCQkJIgkJSW50ZWdlciBpPSBudWxsO1xuIiArIAoJCQkJIgkJbmV3IFgoKS5uZXh0VHJ5KGksIG4pO1xuIiArIAoJCQkJIgkJbmV3IFgoKS5uZXh0VHJ5MihuLCBpKTtcbiIgKyAKCQkJCSIJfQlcbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCTxJLCBOIGV4dGVuZHMgST4gdm9pZCBuZXh0VHJ5KEkgaSwgTiBuKSB7fVxuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJPE4sIEkgZXh0ZW5kcyBOPiB2b2lkIG5leHRUcnkyKE4gbiwgSSBpKSB7fQlcbiIgKyAKCQkJCSJ9XG4iCQkJCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkJIgluZXcgWCgpLm5leHRUcnkoaSwgbik7XG4iICsgCgkJCSIJICAgICAgICBeXl5eXl5eXG4iICsgCgkJCSJCb3VuZCBtaXNtYXRjaDogVGhlIGdlbmVyaWMgbWV0aG9kIG5leHRUcnkoSSwgTikgb2YgdHlwZSBYIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChJbnRlZ2VyLCBOdW1iZXIpIHNpbmNlIHRoZSB0eXBlIE51bWJlciBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPE4gZXh0ZW5kcyBJPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQoJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDQyMgoJcHVibGljIHZvaWQgdGVzdDQ5NSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglMaXN0IGw9IG51bGw7IFxuIiArIAoJCQkJIlxuIiArIAoJCQkJIgl2b2lkIGFkZChTdHJpbmcgcykge1xuIiArIAoJCQkJIgkJbC5hZGQocyk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCXZvaWQgYWRkQWxsKFN0cmluZ1tdIHNzKSB7XG4iICsgCgkJCQkiCQlsLmFkZEFsbChBcnJheXMuYXNMaXN0KHNzKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCVN0cmluZ1tdIGdldCgpIHtcbiIgKyAKCQkJCSIJCXJldHVybiAoU3RyaW5nW10pbC50b0FycmF5KG5ldyBTdHJpbmdbbC5zaXplKCldKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIiIpOwoJfQkJCgkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg0NTkzCglwdWJsaWMgdm9pZCB0ZXN0NDk2KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQkJImNsYXNzIFN1cGVyPFM+IHtcbiIgKyAKCQkJCSIJY2xhc3MgQTxFPiB7IH1cbiIgKyAKCQkJCSIJPFQ+IHZvaWQgdGFrZShBPFM+IG8pIHtcbiIgKwoJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKwoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIFN1YiBleHRlbmRzIFN1cGVyPERvdWJsZT4ge1xuIiArIAoJCQkJIgl2b2lkIHRlc3QoKSB7XG4iICsgCgkJCQkiCQl0YWtlKG5ldyBBKCkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJbmV3IFN1YigpLnRlc3QoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCQoJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDU5MyAtIHZhcmlhdGlvbiAtIHVuY2hlY2sgd2FybmluZ3MKCXB1YmxpYyB2b2lkIHRlc3Q0OTcoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQkJImNsYXNzIFN1cGVyPFM+IHtcbiIgKyAKCQkJCSIJY2xhc3MgQTxFPiB7IH1cbiIgKyAKCQkJCSIJPFQ+IHZvaWQgdGFrZShBPFM+IG8pIHtcbiIgKwoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIFN1YiBleHRlbmRzIFN1cGVyPERvdWJsZT4ge1xuIiArIAoJCQkJIgl2b2lkIHRlc3QoKSB7XG4iICsgCgkJCQkiCQl0YWtlKG5ldyBBKCkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJbmV3IFN1YigpLnRlc3QoKTtcbiIgKyAKCQkJCSIJCVpvcmsgejtcbiIgKwoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIgl0YWtlKG5ldyBBKCkpO1xuIiArIAoJCQkiCSAgICAgXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBleHByZXNzaW9uIG9mIHR5cGUgU3VwZXIuQSBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIFN1cGVyPERvdWJsZT4uQTxEb3VibGU+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTQpXG4iICsgCgkJCSIJWm9yayB6O1xuIiArIAoJCQkiCV5eXl5cbiIgKyAKCQkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkKLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg0NzQzIC0gdmFyaWF0aW9uIGluIC1zb3VyY2UgMS40IG1vZGUgYnV0IDEuNSBjb21wbGlhbmNlIChpZ25vcmUgY292YXJpYW5jZSkKcHVibGljIHZvaWQgdGVzdDQ5OCgpewoJTWFwIGN1c3RvbU9wdGlvbnMgPSBnZXRDb21waWxlck9wdGlvbnMoKTsKCWN1c3RvbU9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzQpOwoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbnRlcmZhY2UgSSB7XG4iICsgCgkJCSIgICBTdHJpbmcgZm9vKCk7XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJpbnRlcmZhY2UgSiB7XG4iICsgCgkJCSIgICBPYmplY3QgZm9vKCk7XG4iICsgCgkJCSJ9XG4iICsgCgkJCSIgXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCBpbXBsZW1lbnRzIEkge1xuIiArIAoJCQkiICAgcHVibGljIFN0cmluZyBmb28oKSB7XG4iICsgCgkJCSIgCXJldHVybiBcIlwiO1xuIiArIAoJCQkiICAgfVxuIiArIAoJCQkiICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkiICAgICAgICAgSSBpID0gbmV3IFgoKTtcbiIgKyAKCQkJIiAgICAgICAgIHRyeSB7XG4iICsgCgkJCSIJICAgICAgICBKIGogPSAoSikgaTtcbiIgKyAKCQkJIiAgICAgICAgIH0gY2F0Y2goQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHtcbiIgKyAKCQkJIgkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCSIgICAgICAgICB9XG4iICsgCgkJCSIgIH1cbiIgKyAKCQkJIn1cbiIKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxNSlcbiIgKyAKCQkiCUogaiA9IChKKSBpO1xuIiArIAoJCSIJICAgICAgXl5eXl5cbiIgKyAKCQkiQ2Fubm90IGNhc3QgZnJvbSBJIHRvIEpcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiwKCQludWxsLAoJCXRydWUsCgkJY3VzdG9tT3B0aW9ucyk7Cn0KLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg1MTU3CnB1YmxpYyB2b2lkIHRlc3Q0OTkoKXsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkiCQkgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkge1xuIiArIAoJCQkiCQkgCQkgU3RyaW5nW10gdGFiMSA9IG5ldyBTdHJpbmdbMF07XG4iICsgCgkJCSIJCSAJCSBJbnRlZ2VyW10gdGFiMiA9IG5ldyBJbnRlZ2VyWzBdO1xuIiArIAoJCQkiCQkgCQkgYm9vbGVhbiBjb25kID0gdHJ1ZTtcbiIgKyAKCQkJIgkJIAkJIEludGVnZXJbXSB2YXIgPSBjb25kID8gdGFiMSA6IHRhYjI7XG4iICsgCgkJCSIJCSAJCSBTeXN0ZW0ub3V0LnByaW50bG4odmFyKTtcbiIgKyAKCQkJIgkJIH1cbiIgKyAKCQkJIn1cbiIKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCSIJSW50ZWdlcltdIHZhciA9IGNvbmQgPyB0YWIxIDogdGFiMjtcbiIgKyAKCQkiCSAgICAgICAgICBeXl5cbiIgKyAKCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBPYmplY3QmU2VyaWFsaXphYmxlJkNsb25lYWJsZSB0byBJbnRlZ2VyW11cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0JCi8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDI1MQpwdWJsaWMgdm9pZCB0ZXN0NTAwKCl7Cgl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7XG4iICsgCgkJCSJpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247XG4iICsgCgkJCSJcbiIgKyAKCQkJImludGVyZmFjZSBTaW5rPFQ+IHsgXG4iICsgCgkJCSIJdm9pZCBmbHVzaChUIHQpO1xuIiArIAoJCQkifVxuIiArIAoJCQkiY2xhc3MgU2ltcGxlU2lua0ltcGw8VD4gaW1wbGVtZW50cyBTaW5rPFQ+IHtcbiIgKyAKCQkJIglwdWJsaWMgdm9pZCBmbHVzaChUIHQpIHt9XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSJcbiIgKyAKCQkJIiAgICBwcml2YXRlIDxUPiBUIHdyaXRlQWxsKENvbGxlY3Rpb248VD4gY29sbCwgU2luazw/IHN1cGVyIFQ+IHNuaykgeyBcbiIgKyAKCQkJIiAgICAgICAgVCBsYXN0ID0gbnVsbDtcbiIgKyAKCQkJIiAgICAgICAgZm9yIChUIHQgOiBjb2xsKSB7IFxuIiArIAoJCQkiICAgICAgICAgICAgbGFzdCA9IHQ7XG4iICsgCgkJCSIgICAgICAgICAgICBzbmsuZmx1c2gobGFzdCk7XG4iICsgCgkJCSIgICAgICAgIH1cbiIgKyAKCQkJIiAgICAgICAgcmV0dXJuIGxhc3Q7XG4iICsgCgkJCSIgICAgfVxuIiArIAoJCQkiXG4iICsgCgkJCSIgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7XG4iICsgCgkJCSIgICAgICAgIFNpbms8T2JqZWN0PiBzID0gbmV3IFNpbXBsZVNpbmtJbXBsPE9iamVjdD4oKTtcbiIgKyAKCQkJIiAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGNzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7XG4iICsgCgkJCSIgICAgICAgIGNzLmFkZChcImhlbGxvIVwiKTtcbiIgKyAKCQkJIiAgICAgICAgY3MuYWRkKFwiZ29vZGJ5ZVwiKTtcbiIgKyAKCQkJIiAgICAgICAgY3MuYWRkKFwic2VlIHlvdVwiKTtcbiIgKyAKCQkJIiAgICAgICAgXG4iICsgCgkJCSIgICAgICAgIFN0cmluZyBzdHIgPSB0aGlzLndyaXRlQWxsKGNzLCBzKTsgIFxuIiArIAoJCQkiICAgIH1cbiIgKyAKCQkJIlxuIiArIAoJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJIiAgICAgICAgWCB0ZXN0ID0gbmV3IFgoKTtcbiIgKyAKCQkJIiAgICAgICAgXG4iICsgCgkJCSIgICAgICAgIHRlc3QudGVzdDEoKTtcbiIgKyAKCQkJIiAgICB9XG4iICsgCgkJCSJ9XG4iCgkJfSwKCQkiIik7Cn0KCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg1MzAzIC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0NTAxKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCA8VCBleHRlbmRzIEFYPiB7XG4iICsgCgkJCQkiICAgIFQgdDtcbiIgKyAKCQkJCSIgICAgWChUIHQpe1xuIiArIAoJCQkJIiAgICAgICAgdGhpcy50ID0gdDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlYPD8gZXh0ZW5kcyBCWD4geCA9IG5ldyBYPEJYPFN0cmluZz4+KG5ldyBCWDxTdHJpbmc+KCkpO1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludCh4LnQuYXgpO1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludCh4LnQuYngpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIEFYPFA+IHtcbiIgKyAKCQkJCSIJUCBheDtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgQlg8UT4gZXh0ZW5kcyBBWDxRPiB7XG4iICsgCgkJCQkiCVEgYng7XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIm51bGxudWxsIik7CQkKCQlTdHJpbmcgZXhwZWN0ZWRPdXRwdXQgPQoJCQkiICAvLyBNZXRob2QgZGVzY3JpcHRvciAjMjUgKFtMamF2YS9sYW5nL1N0cmluZzspVlxuIiArIAoJCQkiICAvLyBTdGFjazogNCwgTG9jYWxzOiAyXG4iICsgCgkJCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpO1xuIiArIAoJCQkiICAgICAwICBuZXcgWCBbMl1cbiIgKyAKCQkJIiAgICAgMyAgZHVwXG4iICsgCgkJCSIgICAgIDQgIG5ldyBCWCBbMjddXG4iICsgCgkJCSIgICAgIDcgIGR1cFxuIiArIAoJCQkiICAgICA4ICBpbnZva2VzcGVjaWFsIEJYKCkgWzI4XVxuIiArIAoJCQkiICAgIDExICBpbnZva2VzcGVjaWFsIFgoQVgpIFszMF1cbiIgKyAKCQkJIiAgICAxNCAgYXN0b3JlXzEgW3hdXG4iICsgCgkJCSIgICAgMTUgIGdldHN0YXRpYyBqYXZhLmxhbmcuU3lzdGVtLm91dCA6IGphdmEuaW8uUHJpbnRTdHJlYW0gWzM2XVxuIiArIAoJCQkiICAgIDE4ICBhbG9hZF8xIFt4XVxuIiArIAoJCQkiICAgIDE5ICBnZXRmaWVsZCBYLnQgOiBBWCBbMTddXG4iICsgCgkJCSIgICAgMjIgIGNoZWNrY2FzdCBCWCBbMjddXG4iICsgCgkJCSIgICAgMjUgIGdldGZpZWxkIEJYLmF4IDogamF2YS5sYW5nLk9iamVjdCBbNDBdXG4iICsgCgkJCSIgICAgMjggIGludm9rZXZpcnR1YWwgamF2YS5pby5QcmludFN0cmVhbS5wcmludChqYXZhLmxhbmcuT2JqZWN0KSA6IHZvaWQgIFs0Nl1cbiIgKyAKCQkJIiAgICAzMSAgZ2V0c3RhdGljIGphdmEubGFuZy5TeXN0ZW0ub3V0IDogamF2YS5pby5QcmludFN0cmVhbSBbMzZdXG4iICsgCgkJCSIgICAgMzQgIGFsb2FkXzEgW3hdXG4iICsgCgkJCSIgICAgMzUgIGdldGZpZWxkIFgudCA6IEFYIFsxN11cbiIgKyAKCQkJIiAgICAzOCAgY2hlY2tjYXN0IEJYIFsyN11cbiIgKyAKCQkJIiAgICA0MSAgZ2V0ZmllbGQgQlguYnggOiBqYXZhLmxhbmcuT2JqZWN0IFs0OV1cbiIgKyAKCQkJIiAgICA0NCAgaW52b2tldmlydHVhbCBqYXZhLmlvLlByaW50U3RyZWFtLnByaW50KGphdmEubGFuZy5PYmplY3QpIDogdm9pZCAgWzQ2XVxuIiArIAoJCQkiICAgIDQ3ICByZXR1cm5cbiIgKyAKCQkJIiAgICAgIExpbmUgbnVtYmVyczpcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAwLCBsaW5lOiA3XVxuIiArIAoJCQkiICAgICAgICBbcGM6IDE1LCBsaW5lOiA4XVxuIiArIAoJCQkiICAgICAgICBbcGM6IDMxLCBsaW5lOiA5XVxuIiArIAoJCQkiICAgICAgICBbcGM6IDQ3LCBsaW5lOiAxMF1cbiIgKyAKCQkJIiAgICAgIExvY2FsIHZhcmlhYmxlIHRhYmxlOlxuIiArIAoJCQkiICAgICAgICBbcGM6IDAsIHBjOiA0OF0gbG9jYWw6IGFyZ3MgaW5kZXg6IDAgdHlwZTogamF2YS5sYW5nLlN0cmluZ1tdXG4iICsgCgkJCSIgICAgICAgIFtwYzogMTUsIHBjOiA0OF0gbG9jYWw6IHggaW5kZXg6IDEgdHlwZTogWFxuIiArIAoJCQkiICAgICAgTG9jYWwgdmFyaWFibGUgdHlwZSB0YWJsZTpcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAxNSwgcGM6IDQ4XSBsb2NhbDogeCBpbmRleDogMSB0eXBlOiBYPD8gZXh0ZW5kcyBCWD5cbiI7CgkJCgkJdHJ5IHsKCQkJRmlsZSBmID0gbmV3IEZpbGUoT1VUUFVUX0RJUiArIEZpbGUuc2VwYXJhdG9yICsgIlguY2xhc3MiKTsKCQkJYnl0ZVtdIGNsYXNzRmlsZUJ5dGVzID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRGaWxlQnl0ZUNvbnRlbnQoZik7CgkJCUNsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyIGRpc2Fzc2VtYmxlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlcigpOwoJCQlTdHJpbmcgcmVzdWx0ID0gZGlzYXNzZW1ibGVyLmRpc2Fzc2VtYmxlKGNsYXNzRmlsZUJ5dGVzLCAiXG4iLCBDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlci5ERVRBSUxFRCk7CgkJCWludCBpbmRleCA9IHJlc3VsdC5pbmRleE9mKGV4cGVjdGVkT3V0cHV0KTsKCQkJaWYgKGluZGV4ID09IC0xIHx8IGV4cGVjdGVkT3V0cHV0Lmxlbmd0aCgpID09IDApIHsKCQkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcocmVzdWx0LCAzKSk7CgkJCX0KCQkJaWYgKGluZGV4ID09IC0xKSB7CgkJCQlhc3NlcnRFcXVhbHMoIldyb25nIGNvbnRlbnRzIiwgZXhwZWN0ZWRPdXRwdXQsIHJlc3VsdCk7CgkJCX0KCQl9IGNhdGNoIChvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNsYXNzRm9ybWF0RXhjZXB0aW9uIGUpIHsKCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7CgkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewoJCQlhc3NlcnRUcnVlKGZhbHNlKTsKCQl9Cgl9CgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NTMwMyAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDUwMigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFggPFQgZXh0ZW5kcyBBWD4ge1xuIiArIAoJCQkJIiAgICBUIHQ7XG4iICsgCgkJCQkiICAgIFgoVCB0KXtcbiIgKyAKCQkJCSIgICAgICAgIHRoaXMudCA9IHQ7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJWDw/IGV4dGVuZHMgQlg+IHggPSBuZXcgWDxCWDxTdHJpbmc+PihuZXcgQlg8U3RyaW5nPigpKTtcbiIgKyAKCQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoeC5zZWxmKCkudC5heCk7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50KHguc2VsZigpLnQuYngpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCVg8VD4gc2VsZigpIHtcbiIgKyAKCQkJCSIJCXJldHVybiB0aGlzO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIEFYPFA+IHtcbiIgKyAKCQkJCSIJUCBheDtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgQlg8UT4gZXh0ZW5kcyBBWDxRPiB7XG4iICsgCgkJCQkiCVEgYng7XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIm51bGxudWxsIik7CQkKCQlTdHJpbmcgZXhwZWN0ZWRPdXRwdXQgPQoJCQkiICAvLyBNZXRob2QgZGVzY3JpcHRvciAjMjUgKFtMamF2YS9sYW5nL1N0cmluZzspVlxuIiArIAoJCQkiICAvLyBTdGFjazogNCwgTG9jYWxzOiAyXG4iICsgCgkJCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpO1xuIiArIAoJCQkiICAgICAwICBuZXcgWCBbMl1cbiIgKyAKCQkJIiAgICAgMyAgZHVwXG4iICsgCgkJCSIgICAgIDQgIG5ldyBCWCBbMjddXG4iICsgCgkJCSIgICAgIDcgIGR1cFxuIiArIAoJCQkiICAgICA4ICBpbnZva2VzcGVjaWFsIEJYKCkgWzI4XVxuIiArIAoJCQkiICAgIDExICBpbnZva2VzcGVjaWFsIFgoQVgpIFszMF1cbiIgKyAKCQkJIiAgICAxNCAgYXN0b3JlXzEgW3hdXG4iICsgCgkJCSIgICAgMTUgIGdldHN0YXRpYyBqYXZhLmxhbmcuU3lzdGVtLm91dCA6IGphdmEuaW8uUHJpbnRTdHJlYW0gWzM2XVxuIiArIAoJCQkiICAgIDE4ICBhbG9hZF8xIFt4XVxuIiArIAoJCQkiICAgIDE5ICBpbnZva2V2aXJ0dWFsIFguc2VsZigpIDogWCAgWzQwXVxuIiArIAoJCQkiICAgIDIyICBnZXRmaWVsZCBYLnQgOiBBWCBbMTddXG4iICsgCgkJCSIgICAgMjUgIGNoZWNrY2FzdCBCWCBbMjddXG4iICsgCgkJCSIgICAgMjggIGdldGZpZWxkIEJYLmF4IDogamF2YS5sYW5nLk9iamVjdCBbNDRdXG4iICsgCgkJCSIgICAgMzEgIGludm9rZXZpcnR1YWwgamF2YS5pby5QcmludFN0cmVhbS5wcmludChqYXZhLmxhbmcuT2JqZWN0KSA6IHZvaWQgIFs1MF1cbiIgKyAKCQkJIiAgICAzNCAgZ2V0c3RhdGljIGphdmEubGFuZy5TeXN0ZW0ub3V0IDogamF2YS5pby5QcmludFN0cmVhbSBbMzZdXG4iICsgCgkJCSIgICAgMzcgIGFsb2FkXzEgW3hdXG4iICsgCgkJCSIgICAgMzggIGludm9rZXZpcnR1YWwgWC5zZWxmKCkgOiBYICBbNDBdXG4iICsgCgkJCSIgICAgNDEgIGdldGZpZWxkIFgudCA6IEFYIFsxN11cbiIgKyAKCQkJIiAgICA0NCAgY2hlY2tjYXN0IEJYIFsyN11cbiIgKyAKCQkJIiAgICA0NyAgZ2V0ZmllbGQgQlguYnggOiBqYXZhLmxhbmcuT2JqZWN0IFs1M11cbiIgKyAKCQkJIiAgICA1MCAgaW52b2tldmlydHVhbCBqYXZhLmlvLlByaW50U3RyZWFtLnByaW50KGphdmEubGFuZy5PYmplY3QpIDogdm9pZCAgWzUwXVxuIiArIAoJCQkiICAgIDUzICByZXR1cm5cbiIgKyAKCQkJIiAgICAgIExpbmUgbnVtYmVyczpcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAwLCBsaW5lOiA3XVxuIiArIAoJCQkiICAgICAgICBbcGM6IDE1LCBsaW5lOiA4XVxuIiArIAoJCQkiICAgICAgICBbcGM6IDM0LCBsaW5lOiA5XVxuIiArIAoJCQkiICAgICAgICBbcGM6IDUzLCBsaW5lOiAxMF1cbiIgKyAKCQkJIiAgICAgIExvY2FsIHZhcmlhYmxlIHRhYmxlOlxuIiArIAoJCQkiICAgICAgICBbcGM6IDAsIHBjOiA1NF0gbG9jYWw6IGFyZ3MgaW5kZXg6IDAgdHlwZTogamF2YS5sYW5nLlN0cmluZ1tdXG4iICsgCgkJCSIgICAgICAgIFtwYzogMTUsIHBjOiA1NF0gbG9jYWw6IHggaW5kZXg6IDEgdHlwZTogWFxuIiArIAoJCQkiICAgICAgTG9jYWwgdmFyaWFibGUgdHlwZSB0YWJsZTpcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAxNSwgcGM6IDU0XSBsb2NhbDogeCBpbmRleDogMSB0eXBlOiBYPD8gZXh0ZW5kcyBCWD5cbiI7CgkJCgkJdHJ5IHsKCQkJRmlsZSBmID0gbmV3IEZpbGUoT1VUUFVUX0RJUiArIEZpbGUuc2VwYXJhdG9yICsgIlguY2xhc3MiKTsKCQkJYnl0ZVtdIGNsYXNzRmlsZUJ5dGVzID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRGaWxlQnl0ZUNvbnRlbnQoZik7CgkJCUNsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyIGRpc2Fzc2VtYmxlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlcigpOwoJCQlTdHJpbmcgcmVzdWx0ID0gZGlzYXNzZW1ibGVyLmRpc2Fzc2VtYmxlKGNsYXNzRmlsZUJ5dGVzLCAiXG4iLCBDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlci5ERVRBSUxFRCk7CgkJCWludCBpbmRleCA9IHJlc3VsdC5pbmRleE9mKGV4cGVjdGVkT3V0cHV0KTsKCQkJaWYgKGluZGV4ID09IC0xIHx8IGV4cGVjdGVkT3V0cHV0Lmxlbmd0aCgpID09IDApIHsKCQkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcocmVzdWx0LCAzKSk7CgkJCX0KCQkJaWYgKGluZGV4ID09IC0xKSB7CgkJCQlhc3NlcnRFcXVhbHMoIldyb25nIGNvbnRlbnRzIiwgZXhwZWN0ZWRPdXRwdXQsIHJlc3VsdCk7CgkJCX0KCQl9IGNhdGNoIChvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNsYXNzRm9ybWF0RXhjZXB0aW9uIGUpIHsKCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7CgkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewoJCQlhc3NlcnRUcnVlKGZhbHNlKTsKCQl9Cgl9CQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODUzMDMgLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3Q1MDMoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkiY2xhc3MgWEEge31cbiIgKyAKCQkJImludGVyZmFjZSBYQiB7XG4iICsgCgkJCSIJWEIgQ09OU1QgPSBuZXcgWEIoKXsgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIFwiU1VDQ0VTU1wiOyB9fTtcbiIgKyAKCQkJIn1cbiIgKyAKCQkJImNsYXNzIFhBQiBleHRlbmRzIFhBIGltcGxlbWVudHMgWEIge31cbiIgKyAKCQkJIlxuIiArIAoJCQkicHVibGljIGNsYXNzIFggPEUgZXh0ZW5kcyBYQSZYQj4ge1xuIiArIAoJCQkiCUUgZTtcbiIgKyAKCQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkiCSAgU3lzdGVtLm91dC5wcmludChuZXcgWDxYQUI+KCkuZS5DT05TVCk7XG4iICsgCgkJCSIJICBuZXcgWDxYQUI+KCkuZm9vKCk7XG4iICsgCgkJCSIgIH1cbiIgKyAKCQkJIiAgcHVibGljIHZvaWQgZm9vKCkge1xuIiArIAoJCQkiICAgIFN5c3RlbS5vdXQucHJpbnQodGhpcy5lLkNPTlNUKTtcbiIgKyAKCQkJIiAgfVxuIiArIAoJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1NTVUNDRVNTIik7CQkKCQlTdHJpbmcgZXhwZWN0ZWRPdXRwdXQgPQoJCQkiLy8gQ29tcGlsZWQgZnJvbSBYLmphdmEgKHZlcnNpb24gMS41IDogNDkuMCwgc3VwZXIgYml0KVxuIiArIAoJCQkiLy8gU2lnbmF0dXJlOiA8RTpMWEE7OkxYQjs+TGphdmEvbGFuZy9PYmplY3Q7XG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIGphdmEubGFuZy5PYmplY3Qge1xuIiArIAoJCQkiICBcbiIgKyAKCQkJIiAgLy8gRmllbGQgZGVzY3JpcHRvciAjNiBMWEE7XG4iICsgCgkJCSIgIC8vIFNpZ25hdHVyZTogVEU7XG4iICsgCgkJCSIgIFhBIGU7XG4iICsgCgkJCSIgIFxuIiArIAoJCQkiICAvLyBNZXRob2QgZGVzY3JpcHRvciAjMTAgKClWXG4iICsgCgkJCSIgIC8vIFN0YWNrOiAxLCBMb2NhbHM6IDFcbiIgKyAKCQkJIiAgcHVibGljIFgoKTtcbiIgKyAKCQkJIiAgICAwICBhbG9hZF8wIFt0aGlzXVxuIiArIAoJCQkiICAgIDEgIGludm9rZXNwZWNpYWwgamF2YS5sYW5nLk9iamVjdCgpIFsxM11cbiIgKyAKCQkJIiAgICA0ICByZXR1cm5cbiIgKyAKCQkJIiAgICAgIExpbmUgbnVtYmVyczpcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAwLCBsaW5lOiA3XVxuIiArIAoJCQkiICAgICAgTG9jYWwgdmFyaWFibGUgdGFibGU6XG4iICsgCgkJCSIgICAgICAgIFtwYzogMCwgcGM6IDVdIGxvY2FsOiB0aGlzIGluZGV4OiAwIHR5cGU6IFhcbiIgKyAKCQkJIiAgICAgIExvY2FsIHZhcmlhYmxlIHR5cGUgdGFibGU6XG4iICsgCgkJCSIgICAgICAgIFtwYzogMCwgcGM6IDVdIGxvY2FsOiB0aGlzIGluZGV4OiAwIHR5cGU6IFg8RT5cbiIgKyAKCQkJIiAgXG4iICsgCgkJCSIgIC8vIE1ldGhvZCBkZXNjcmlwdG9yICMyMSAoW0xqYXZhL2xhbmcvU3RyaW5nOylWXG4iICsgCgkJCSIgIC8vIFN0YWNrOiAzLCBMb2NhbHM6IDFcbiIgKyAKCQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncyk7XG4iICsgCgkJCSIgICAgIDAgIGdldHN0YXRpYyBqYXZhLmxhbmcuU3lzdGVtLm91dCA6IGphdmEuaW8uUHJpbnRTdHJlYW0gWzI3XVxuIiArIAoJCQkiICAgICAzICBuZXcgWCBbMl1cbiIgKyAKCQkJIiAgICAgNiAgZHVwXG4iICsgCgkJCSIgICAgIDcgIGludm9rZXNwZWNpYWwgWCgpIFsyOF1cbiIgKyAKCQkJIiAgICAxMCAgZ2V0ZmllbGQgWC5lIDogWEEgWzMwXVxuIiArIAoJCQkiICAgIDEzICBwb3BcbiIgKyAKCQkJIiAgICAxNCAgZ2V0c3RhdGljIFhBQi5DT05TVCA6IFhCIFszNl1cbiIgKyAKCQkJIiAgICAxNyAgaW52b2tldmlydHVhbCBqYXZhLmlvLlByaW50U3RyZWFtLnByaW50KGphdmEubGFuZy5PYmplY3QpIDogdm9pZCAgWzQyXVxuIiArIAoJCQkiICAgIDIwICBuZXcgWCBbMl1cbiIgKyAKCQkJIiAgICAyMyAgZHVwXG4iICsgCgkJCSIgICAgMjQgIGludm9rZXNwZWNpYWwgWCgpIFsyOF1cbiIgKyAKCQkJIiAgICAyNyAgaW52b2tldmlydHVhbCBYLmZvbygpIDogdm9pZCAgWzQ1XVxuIiArIAoJCQkiICAgIDMwICByZXR1cm5cbiIgKyAKCQkJIiAgICAgIExpbmUgbnVtYmVyczpcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAwLCBsaW5lOiAxMF1cbiIgKyAKCQkJIiAgICAgICAgW3BjOiAyMCwgbGluZTogMTFdXG4iICsgCgkJCSIgICAgICAgIFtwYzogMzAsIGxpbmU6IDEyXVxuIiArIAoJCQkiICAgICAgTG9jYWwgdmFyaWFibGUgdGFibGU6XG4iICsgCgkJCSIgICAgICAgIFtwYzogMCwgcGM6IDMxXSBsb2NhbDogYXJncyBpbmRleDogMCB0eXBlOiBqYXZhLmxhbmcuU3RyaW5nW11cbiIgKyAKCQkJIiAgXG4iICsgCgkJCSIgIC8vIE1ldGhvZCBkZXNjcmlwdG9yICMxMCAoKVZcbiIgKyAKCQkJIiAgLy8gU3RhY2s6IDIsIExvY2FsczogMVxuIiArIAoJCQkiICBwdWJsaWMgdm9pZCBmb28oKTtcbiIgKyAKCQkJIiAgICAgMCAgZ2V0c3RhdGljIGphdmEubGFuZy5TeXN0ZW0ub3V0IDogamF2YS5pby5QcmludFN0cmVhbSBbMjddXG4iICsgCgkJCSIgICAgIDMgIGFsb2FkXzAgW3RoaXNdXG4iICsgCgkJCSIgICAgIDQgIGdldGZpZWxkIFguZSA6IFhBIFszMF1cbiIgKyAKCQkJIiAgICAgNyAgcG9wXG4iICsgCgkJCSIgICAgIDggIGdldHN0YXRpYyBYQi5DT05TVCA6IFhCIFs1MF1cbiIgKyAKCQkJIiAgICAxMSAgaW52b2tldmlydHVhbCBqYXZhLmlvLlByaW50U3RyZWFtLnByaW50KGphdmEubGFuZy5PYmplY3QpIDogdm9pZCAgWzQyXVxuIiArIAoJCQkiICAgIDE0ICByZXR1cm5cbiIgKyAKCQkJIiAgICAgIExpbmUgbnVtYmVyczpcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAwLCBsaW5lOiAxNF1cbiIgKyAKCQkJIiAgICAgICAgW3BjOiAxNCwgbGluZTogMTVdXG4iICsgCgkJCSIgICAgICBMb2NhbCB2YXJpYWJsZSB0YWJsZTpcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAwLCBwYzogMTVdIGxvY2FsOiB0aGlzIGluZGV4OiAwIHR5cGU6IFhcbiIgKyAKCQkJIiAgICAgIExvY2FsIHZhcmlhYmxlIHR5cGUgdGFibGU6XG4iICsgCgkJCSIgICAgICAgIFtwYzogMCwgcGM6IDE1XSBsb2NhbDogdGhpcyBpbmRleDogMCB0eXBlOiBYPEU+XG4iICsgCgkJCSJ9IjsKCQkKCQl0cnkgewoJCQlGaWxlIGYgPSBuZXcgRmlsZShPVVRQVVRfRElSICsgRmlsZS5zZXBhcmF0b3IgKyAiWC5jbGFzcyIpOwoJCQlieXRlW10gY2xhc3NGaWxlQnl0ZXMgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldEZpbGVCeXRlQ29udGVudChmKTsKCQkJQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIgZGlzYXNzZW1ibGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyKCk7CgkJCVN0cmluZyByZXN1bHQgPSBkaXNhc3NlbWJsZXIuZGlzYXNzZW1ibGUoY2xhc3NGaWxlQnl0ZXMsICJcbiIsIENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyLkRFVEFJTEVEKTsKCQkJaW50IGluZGV4ID0gcmVzdWx0LmluZGV4T2YoZXhwZWN0ZWRPdXRwdXQpOwoJCQlpZiAoaW5kZXggPT0gLTEgfHwgZXhwZWN0ZWRPdXRwdXQubGVuZ3RoKCkgPT0gMCkgewoJCQkJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuZGlzcGxheVN0cmluZyhyZXN1bHQsIDMpKTsKCQkJfQoJCQlpZiAoaW5kZXggPT0gLTEpIHsKCQkJCWFzc2VydEVxdWFscygiV3JvbmcgY29udGVudHMiLCBleHBlY3RlZE91dHB1dCwgcmVzdWx0KTsKCQkJfQoJCX0gY2F0Y2ggKG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb24gZSkgewoJCQlhc3NlcnRUcnVlKGZhbHNlKTsKCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CgkJCWFzc2VydFRydWUoZmFsc2UpOwoJCX0KCX0JCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODUzMDMgLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3Q1MDQoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImNsYXNzIFhBIHt9XG4iICsgCgkJCQkiaW50ZXJmYWNlIFhCIHtcbiIgKyAKCQkJCSIJWEIgQ09OU1QgPSBuZXcgWEIoKXsgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIFwiU1VDQ0VTU1wiOyB9fTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWEFCIGV4dGVuZHMgWEEgaW1wbGVtZW50cyBYQiB7fVxuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIDxFIGV4dGVuZHMgWEEmWEI+IHtcbiIgKyAKCQkJCSIgIEUgZSgpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJICBTeXN0ZW0ub3V0LnByaW50KG5ldyBYPFhBQj4oKS5lKCkuQ09OU1QpO1xuIiArIAoJCQkJIgkgIG5ldyBYPFhBQj4oKS5mb28oKTtcbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSIgIHB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKyAKCQkJCSIgICAgU3lzdGVtLm91dC5wcmludCh0aGlzLmUoKS5DT05TVCk7XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1NTVUNDRVNTIik7CQkKCQlTdHJpbmcgZXhwZWN0ZWRPdXRwdXQgPQoJCQkiLy8gQ29tcGlsZWQgZnJvbSBYLmphdmEgKHZlcnNpb24gMS41IDogNDkuMCwgc3VwZXIgYml0KVxuIiArIAoJCQkiLy8gU2lnbmF0dXJlOiA8RTpMWEE7OkxYQjs+TGphdmEvbGFuZy9PYmplY3Q7XG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIGphdmEubGFuZy5PYmplY3Qge1xuIiArIAoJCQkiICBcbiIgKyAKCQkJIiAgLy8gTWV0aG9kIGRlc2NyaXB0b3IgIzYgKClWXG4iICsgCgkJCSIgIC8vIFN0YWNrOiAxLCBMb2NhbHM6IDFcbiIgKyAKCQkJIiAgcHVibGljIFgoKTtcbiIgKyAKCQkJIiAgICAwICBhbG9hZF8wIFt0aGlzXVxuIiArIAoJCQkiICAgIDEgIGludm9rZXNwZWNpYWwgamF2YS5sYW5nLk9iamVjdCgpIFs5XVxuIiArIAoJCQkiICAgIDQgIHJldHVyblxuIiArIAoJCQkiICAgICAgTGluZSBudW1iZXJzOlxuIiArIAoJCQkiICAgICAgICBbcGM6IDAsIGxpbmU6IDddXG4iICsgCgkJCSIgICAgICBMb2NhbCB2YXJpYWJsZSB0YWJsZTpcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAwLCBwYzogNV0gbG9jYWw6IHRoaXMgaW5kZXg6IDAgdHlwZTogWFxuIiArIAoJCQkiICAgICAgTG9jYWwgdmFyaWFibGUgdHlwZSB0YWJsZTpcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAwLCBwYzogNV0gbG9jYWw6IHRoaXMgaW5kZXg6IDAgdHlwZTogWDxFPlxuIiArIAoJCQkiICBcbiIgKyAKCQkJIiAgLy8gTWV0aG9kIGRlc2NyaXB0b3IgIzE3ICgpTFhBO1xuIiArIAoJCQkiICAvLyBTaWduYXR1cmU6ICgpVEU7XG4iICsgCgkJCSIgIC8vIFN0YWNrOiAxLCBMb2NhbHM6IDFcbiIgKyAKCQkJIiAgWEEgZSgpO1xuIiArIAoJCQkiICAgIDAgIGFjb25zdF9udWxsXG4iICsgCgkJCSIgICAgMSAgYXJldHVyblxuIiArIAoJCQkiICAgICAgTGluZSBudW1iZXJzOlxuIiArIAoJCQkiICAgICAgICBbcGM6IDAsIGxpbmU6IDhdXG4iICsgCgkJCSIgICAgICBMb2NhbCB2YXJpYWJsZSB0YWJsZTpcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAwLCBwYzogMl0gbG9jYWw6IHRoaXMgaW5kZXg6IDAgdHlwZTogWFxuIiArIAoJCQkiICAgICAgTG9jYWwgdmFyaWFibGUgdHlwZSB0YWJsZTpcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAwLCBwYzogMl0gbG9jYWw6IHRoaXMgaW5kZXg6IDAgdHlwZTogWDxFPlxuIiArIAoJCQkiICBcbiIgKyAKCQkJIiAgLy8gTWV0aG9kIGRlc2NyaXB0b3IgIzIxIChbTGphdmEvbGFuZy9TdHJpbmc7KVZcbiIgKyAKCQkJIiAgLy8gU3RhY2s6IDMsIExvY2FsczogMVxuIiArIAoJCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKTtcbiIgKyAKCQkJIiAgICAgMCAgZ2V0c3RhdGljIGphdmEubGFuZy5TeXN0ZW0ub3V0IDogamF2YS5pby5QcmludFN0cmVhbSBbMjddXG4iICsgCgkJCSIgICAgIDMgIG5ldyBYIFsyXVxuIiArIAoJCQkiICAgICA2ICBkdXBcbiIgKyAKCQkJIiAgICAgNyAgaW52b2tlc3BlY2lhbCBYKCkgWzI4XVxuIiArIAoJCQkiICAgIDEwICBpbnZva2V2aXJ0dWFsIFguZSgpIDogWEEgIFszMF1cbiIgKyAKCQkJIiAgICAxMyAgcG9wXG4iICsgCgkJCSIgICAgMTQgIGdldHN0YXRpYyBYQUIuQ09OU1QgOiBYQiBbMzZdXG4iICsgCgkJCSIgICAgMTcgIGludm9rZXZpcnR1YWwgamF2YS5pby5QcmludFN0cmVhbS5wcmludChqYXZhLmxhbmcuT2JqZWN0KSA6IHZvaWQgIFs0Ml1cbiIgKyAKCQkJIiAgICAyMCAgbmV3IFggWzJdXG4iICsgCgkJCSIgICAgMjMgIGR1cFxuIiArIAoJCQkiICAgIDI0ICBpbnZva2VzcGVjaWFsIFgoKSBbMjhdXG4iICsgCgkJCSIgICAgMjcgIGludm9rZXZpcnR1YWwgWC5mb28oKSA6IHZvaWQgIFs0NV1cbiIgKyAKCQkJIiAgICAzMCAgcmV0dXJuXG4iICsgCgkJCSIgICAgICBMaW5lIG51bWJlcnM6XG4iICsgCgkJCSIgICAgICAgIFtwYzogMCwgbGluZTogMTBdXG4iICsgCgkJCSIgICAgICAgIFtwYzogMjAsIGxpbmU6IDExXVxuIiArIAoJCQkiICAgICAgICBbcGM6IDMwLCBsaW5lOiAxMl1cbiIgKyAKCQkJIiAgICAgIExvY2FsIHZhcmlhYmxlIHRhYmxlOlxuIiArIAoJCQkiICAgICAgICBbcGM6IDAsIHBjOiAzMV0gbG9jYWw6IGFyZ3MgaW5kZXg6IDAgdHlwZTogamF2YS5sYW5nLlN0cmluZ1tdXG4iICsgCgkJCSIgIFxuIiArIAoJCQkiICAvLyBNZXRob2QgZGVzY3JpcHRvciAjNiAoKVZcbiIgKyAKCQkJIiAgLy8gU3RhY2s6IDIsIExvY2FsczogMVxuIiArIAoJCQkiICBwdWJsaWMgdm9pZCBmb28oKTtcbiIgKyAKCQkJIiAgICAgMCAgZ2V0c3RhdGljIGphdmEubGFuZy5TeXN0ZW0ub3V0IDogamF2YS5pby5QcmludFN0cmVhbSBbMjddXG4iICsgCgkJCSIgICAgIDMgIGFsb2FkXzAgW3RoaXNdXG4iICsgCgkJCSIgICAgIDQgIGludm9rZXZpcnR1YWwgWC5lKCkgOiBYQSAgWzMwXVxuIiArIAoJCQkiICAgICA3ICBwb3BcbiIgKyAKCQkJIiAgICAgOCAgZ2V0c3RhdGljIFhCLkNPTlNUIDogWEIgWzUwXVxuIiArIAoJCQkiICAgIDExICBpbnZva2V2aXJ0dWFsIGphdmEuaW8uUHJpbnRTdHJlYW0ucHJpbnQoamF2YS5sYW5nLk9iamVjdCkgOiB2b2lkICBbNDJdXG4iICsgCgkJCSIgICAgMTQgIHJldHVyblxuIiArIAoJCQkiICAgICAgTGluZSBudW1iZXJzOlxuIiArIAoJCQkiICAgICAgICBbcGM6IDAsIGxpbmU6IDE0XVxuIiArIAoJCQkiICAgICAgICBbcGM6IDE0LCBsaW5lOiAxNV1cbiIgKyAKCQkJIiAgICAgIExvY2FsIHZhcmlhYmxlIHRhYmxlOlxuIiArIAoJCQkiICAgICAgICBbcGM6IDAsIHBjOiAxNV0gbG9jYWw6IHRoaXMgaW5kZXg6IDAgdHlwZTogWFxuIiArIAoJCQkiICAgICAgTG9jYWwgdmFyaWFibGUgdHlwZSB0YWJsZTpcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAwLCBwYzogMTVdIGxvY2FsOiB0aGlzIGluZGV4OiAwIHR5cGU6IFg8RT5cbiIgKyAKCQkJIn0iOwoJCQoJCXRyeSB7CgkJCUZpbGUgZiA9IG5ldyBGaWxlKE9VVFBVVF9ESVIgKyBGaWxlLnNlcGFyYXRvciArICJYLmNsYXNzIik7CgkJCWJ5dGVbXSBjbGFzc0ZpbGVCeXRlcyA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuZ2V0RmlsZUJ5dGVDb250ZW50KGYpOwoJCQlDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlciBkaXNhc3NlbWJsZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIoKTsKCQkJU3RyaW5nIHJlc3VsdCA9IGRpc2Fzc2VtYmxlci5kaXNhc3NlbWJsZShjbGFzc0ZpbGVCeXRlcywgIlxuIiwgQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIuREVUQUlMRUQpOwoJCQlpbnQgaW5kZXggPSByZXN1bHQuaW5kZXhPZihleHBlY3RlZE91dHB1dCk7CgkJCWlmIChpbmRleCA9PSAtMSB8fCBleHBlY3RlZE91dHB1dC5sZW5ndGgoKSA9PSAwKSB7CgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5kaXNwbGF5U3RyaW5nKHJlc3VsdCwgMykpOwoJCQl9CgkJCWlmIChpbmRleCA9PSAtMSkgewoJCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBjb250ZW50cyIsIGV4cGVjdGVkT3V0cHV0LCByZXN1bHQpOwoJCQl9CgkJfSBjYXRjaCAob3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7CgkJCWFzc2VydFRydWUoZmFsc2UpOwoJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7CgkJfQoJfQkJCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODUzMDMgLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3Q1MDUoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImNsYXNzIFhBIHt9XG4iICsgCgkJCQkiaW50ZXJmYWNlIFhCIHtcbiIgKyAKCQkJCSIJWEIgQ09OU1QgPSBuZXcgWEIoKXsgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIFwiU1VDQ0VTU1wiOyB9fTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWEFCIGV4dGVuZHMgWEEgaW1wbGVtZW50cyBYQiB7fVxuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIDxFIGV4dGVuZHMgWEEmWEI+IHtcbiIgKyAKCQkJCSIgIEUgZTtcbiIgKyAKCQkJCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJICBuZXcgWDxYQUI+KCkuZm9vKCk7XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkiICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsgCgkJCQkiCW5ldyBPYmplY3QoKSB7XG4iICsgCgkJCQkiCQl2b2lkIHJ1bigpIHtcbiIgKyAKCQkJCSIJCQlTeXN0ZW0ub3V0LnByaW50KGUuQ09OU1QpO1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9LnJ1bigpO1xuIiArIAoJCQkJIiAgICBTeXN0ZW0ub3V0LnByaW50KGUuQ09OU1QpO1xuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJTVUNDRVNTU1VDQ0VTUyIpOwkJCgkJU3RyaW5nIGV4cGVjdGVkT3V0cHV0ID0KCQkJIi8vIENvbXBpbGVkIGZyb20gWC5qYXZhICh2ZXJzaW9uIDEuNSA6IDQ5LjAsIHN1cGVyIGJpdClcbiIgKyAKCQkJIi8vIFNpZ25hdHVyZTogPEU6TFhBOzpMWEI7PkxqYXZhL2xhbmcvT2JqZWN0O1xuIiArIAoJCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IHtcbiIgKyAKCQkJIiAgXG4iICsgCgkJCSIgIC8vIEZpZWxkIGRlc2NyaXB0b3IgIzYgTFhBO1xuIiArIAoJCQkiICAvLyBTaWduYXR1cmU6IFRFO1xuIiArIAoJCQkiICBYQSBlO1xuIiArIAoJCQkiICBcbiIgKyAKCQkJIiAgLy8gTWV0aG9kIGRlc2NyaXB0b3IgIzEwICgpVlxuIiArIAoJCQkiICAvLyBTdGFjazogMSwgTG9jYWxzOiAxXG4iICsgCgkJCSIgIHB1YmxpYyBYKCk7XG4iICsgCgkJCSIgICAgMCAgYWxvYWRfMCBbdGhpc11cbiIgKyAKCQkJIiAgICAxICBpbnZva2VzcGVjaWFsIGphdmEubGFuZy5PYmplY3QoKSBbMTNdXG4iICsgCgkJCSIgICAgNCAgcmV0dXJuXG4iICsgCgkJCSIgICAgICBMaW5lIG51bWJlcnM6XG4iICsgCgkJCSIgICAgICAgIFtwYzogMCwgbGluZTogN11cbiIgKyAKCQkJIiAgICAgIExvY2FsIHZhcmlhYmxlIHRhYmxlOlxuIiArIAoJCQkiICAgICAgICBbcGM6IDAsIHBjOiA1XSBsb2NhbDogdGhpcyBpbmRleDogMCB0eXBlOiBYXG4iICsgCgkJCSIgICAgICBMb2NhbCB2YXJpYWJsZSB0eXBlIHRhYmxlOlxuIiArIAoJCQkiICAgICAgICBbcGM6IDAsIHBjOiA1XSBsb2NhbDogdGhpcyBpbmRleDogMCB0eXBlOiBYPEU+XG4iICsgCgkJCSIgIFxuIiArIAoJCQkiICAvLyBNZXRob2QgZGVzY3JpcHRvciAjMjEgKFtMamF2YS9sYW5nL1N0cmluZzspVlxuIiArIAoJCQkiICAvLyBTdGFjazogMiwgTG9jYWxzOiAxXG4iICsgCgkJCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpO1xuIiArIAoJCQkiICAgICAwICBuZXcgWCBbMl1cbiIgKyAKCQkJIiAgICAgMyAgZHVwXG4iICsgCgkJCSIgICAgIDQgIGludm9rZXNwZWNpYWwgWCgpIFsyMl1cbiIgKyAKCQkJIiAgICAgNyAgaW52b2tldmlydHVhbCBYLmZvbygpIDogdm9pZCAgWzI1XVxuIiArIAoJCQkiICAgIDEwICByZXR1cm5cbiIgKyAKCQkJIiAgICAgIExpbmUgbnVtYmVyczpcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAwLCBsaW5lOiAxMF1cbiIgKyAKCQkJIiAgICAgICAgW3BjOiAxMCwgbGluZTogMTFdXG4iICsgCgkJCSIgICAgICBMb2NhbCB2YXJpYWJsZSB0YWJsZTpcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAwLCBwYzogMTFdIGxvY2FsOiBhcmdzIGluZGV4OiAwIHR5cGU6IGphdmEubGFuZy5TdHJpbmdbXVxuIiArIAoJCQkiICBcbiIgKyAKCQkJIiAgLy8gTWV0aG9kIGRlc2NyaXB0b3IgIzEwICgpVlxuIiArIAoJCQkiICAvLyBTdGFjazogMywgTG9jYWxzOiAxXG4iICsgCgkJCSIgIHB1YmxpYyB2b2lkIGZvbygpO1xuIiArIAoJCQkiICAgICAwICBuZXcgWCQxIFsyOV1cbiIgKyAKCQkJIiAgICAgMyAgZHVwXG4iICsgCgkJCSIgICAgIDQgIGFsb2FkXzAgW3RoaXNdXG4iICsgCgkJCSIgICAgIDUgIGludm9rZXNwZWNpYWwgWCQxKFgpIFszMl1cbiIgKyAKCQkJIiAgICAgOCAgaW52b2tldmlydHVhbCBYJDEucnVuKCkgOiB2b2lkICBbMzVdXG4iICsgCgkJCSIgICAgMTEgIGdldHN0YXRpYyBqYXZhLmxhbmcuU3lzdGVtLm91dCA6IGphdmEuaW8uUHJpbnRTdHJlYW0gWzQxXVxuIiArIAoJCQkiICAgIDE0ICBhbG9hZF8wIFt0aGlzXVxuIiArIAoJCQkiICAgIDE1ICBnZXRmaWVsZCBYLmUgOiBYQSBbNDNdXG4iICsgCgkJCSIgICAgMTggIHBvcFxuIiArIAoJCQkiICAgIDE5ICBnZXRzdGF0aWMgWEIuQ09OU1QgOiBYQiBbNDldXG4iICsgCgkJCSIgICAgMjIgIGludm9rZXZpcnR1YWwgamF2YS5pby5QcmludFN0cmVhbS5wcmludChqYXZhLmxhbmcuT2JqZWN0KSA6IHZvaWQgIFs1NV1cbiIgKyAKCQkJIiAgICAyNSAgcmV0dXJuXG4iICsgCgkJCSIgICAgICBMaW5lIG51bWJlcnM6XG4iICsgCgkJCSIgICAgICAgIFtwYzogMCwgbGluZTogMTNdXG4iICsgCgkJCSIgICAgICAgIFtwYzogOCwgbGluZTogMTddXG4iICsgCgkJCSIgICAgICAgIFtwYzogMTEsIGxpbmU6IDE4XVxuIiArIAoJCQkiICAgICAgICBbcGM6IDI1LCBsaW5lOiAxOV1cbiIgKyAKCQkJIiAgICAgIExvY2FsIHZhcmlhYmxlIHRhYmxlOlxuIiArIAoJCQkiICAgICAgICBbcGM6IDAsIHBjOiAyNl0gbG9jYWw6IHRoaXMgaW5kZXg6IDAgdHlwZTogWFxuIiArIAoJCQkiICAgICAgTG9jYWwgdmFyaWFibGUgdHlwZSB0YWJsZTpcbiIgKyAKCQkJIiAgICAgICAgW3BjOiAwLCBwYzogMjZdIGxvY2FsOiB0aGlzIGluZGV4OiAwIHR5cGU6IFg8RT5cbiIgKyAKCQkJIlxuIiArIAoJCQkiICBJbm5lciBjbGFzc2VzOlxuIiArIAoJCQkiICAgIFtpbm5lciBjbGFzcyBpbmZvOiAjMjkgWCQxLCBvdXRlciBjbGFzcyBpbmZvOiAjMFxuIiArIAoJCQkiICAgICBpbm5lciBuYW1lOiAjMCwgYWNjZXNzZmxhZ3M6IDE4IHByaXZhdGUgZmluYWwgXVxuIiArIAoJCQkifSI7CgkJCgkJdHJ5IHsKCQkJRmlsZSBmID0gbmV3IEZpbGUoT1VUUFVUX0RJUiArIEZpbGUuc2VwYXJhdG9yICsgIlguY2xhc3MiKTsKCQkJYnl0ZVtdIGNsYXNzRmlsZUJ5dGVzID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRGaWxlQnl0ZUNvbnRlbnQoZik7CgkJCUNsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyIGRpc2Fzc2VtYmxlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlcigpOwoJCQlTdHJpbmcgcmVzdWx0ID0gZGlzYXNzZW1ibGVyLmRpc2Fzc2VtYmxlKGNsYXNzRmlsZUJ5dGVzLCAiXG4iLCBDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlci5ERVRBSUxFRCk7CgkJCWludCBpbmRleCA9IHJlc3VsdC5pbmRleE9mKGV4cGVjdGVkT3V0cHV0KTsKCQkJaWYgKGluZGV4ID09IC0xIHx8IGV4cGVjdGVkT3V0cHV0Lmxlbmd0aCgpID09IDApIHsKCQkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcocmVzdWx0LCAzKSk7CgkJCX0KCQkJaWYgKGluZGV4ID09IC0xKSB7CgkJCQlhc3NlcnRFcXVhbHMoIldyb25nIGNvbnRlbnRzIiwgZXhwZWN0ZWRPdXRwdXQsIHJlc3VsdCk7CgkJCX0KCQl9IGNhdGNoIChvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNsYXNzRm9ybWF0RXhjZXB0aW9uIGUpIHsKCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7CgkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewoJCQlhc3NlcnRUcnVlKGZhbHNlKTsKCQl9Cgl9CQkJCQoJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NTQ3NwoJcHVibGljIHZvaWQgdGVzdDUwNigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCQkiaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9ucztcbiIgKyAKCQkJCSJpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7XG4iICsgCgkJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBmaW5hbCBjbGFzcyBYPEU+IHtcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgdGVzdChMaXN0IGxpc3QsZmluYWwgQ29tcGFyYXRvciBjb21wYXJhdG9yLCBYIHgpIHtcbiIgKyAKCQkJCSIJCWZvbyhsaXN0LCBjb21wYXJhdG9yKTtcbiIgKyAKCQkJCSIJCWJhcihsaXN0LCBjb21wYXJhdG9yKTtcbiIgKyAKCQkJCSIJCVxuIiArIAoJCQkJIgkJeC5mb28obGlzdCwgY29tcGFyYXRvcik7XG4iICsgCgkJCQkiCQl4LmJhcihsaXN0LCBjb21wYXJhdG9yKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIgk8VD4gdm9pZCBmb28oTGlzdDxUPiBsdCwgQ29tcGFyYXRvcjw/IHN1cGVyIFQ+IGN0KSB7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJc3RhdGljIDxUPiB2b2lkIGJhcihMaXN0PFQ+IGx0LCBDb21wYXJhdG9yPD8gc3VwZXIgVD4gY3QpIHtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIiBab3JrIHo7XG4iICsKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCWZvbyhsaXN0LCBjb21wYXJhdG9yKTtcbiIgKyAKCQkJIgleXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBVbmNoZWNrZWQgaW52b2NhdGlvbiBmb28oTGlzdCwgQ29tcGFyYXRvcikgb2YgdGhlIGdlbmVyaWMgbWV0aG9kIGZvbyhMaXN0PFQ+LCBDb21wYXJhdG9yPD8gc3VwZXIgVD4pIG9mIHR5cGUgWDxFPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglmb28obGlzdCwgY29tcGFyYXRvcik7XG4iICsgCgkJCSIJICAgIF5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIExpc3QgbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBMaXN0PFQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCWZvbyhsaXN0LCBjb21wYXJhdG9yKTtcbiIgKyAKCQkJIgkgICAgICAgICAgXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBleHByZXNzaW9uIG9mIHR5cGUgQ29tcGFyYXRvciBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIENvbXBhcmF0b3I8PyBzdXBlciBUPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNC4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIgliYXIobGlzdCwgY29tcGFyYXRvcik7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVW5jaGVja2VkIGludm9jYXRpb24gYmFyKExpc3QsIENvbXBhcmF0b3IpIG9mIHRoZSBnZW5lcmljIG1ldGhvZCBiYXIoTGlzdDxUPiwgQ29tcGFyYXRvcjw/IHN1cGVyIFQ+KSBvZiB0eXBlIFg8RT5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjUuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJCSIJYmFyKGxpc3QsIGNvbXBhcmF0b3IpO1xuIiArIAoJCQkiCSAgICBeXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGV4cHJlc3Npb24gb2YgdHlwZSBMaXN0IG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG8gTGlzdDxUPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIgliYXIobGlzdCwgY29tcGFyYXRvcik7XG4iICsgCgkJCSIJICAgICAgICAgIF5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIENvbXBhcmF0b3IgbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBDb21wYXJhdG9yPD8gc3VwZXIgVD5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjcuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEwKVxuIiArIAoJCQkiCXguZm9vKGxpc3QsIGNvbXBhcmF0b3IpO1xuIiArIAoJCQkiCV5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIG1ldGhvZCBmb28oTGlzdCwgQ29tcGFyYXRvcikgYmVsb25ncyB0byB0aGUgcmF3IHR5cGUgWC4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgWDxFPiBzaG91bGQgYmUgcGFyYW1ldGVyaXplZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiOC4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTEpXG4iICsgCgkJCSIJeC5iYXIobGlzdCwgY29tcGFyYXRvcik7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlRoZSBzdGF0aWMgbWV0aG9kIGJhcihMaXN0LCBDb21wYXJhdG9yKSBmcm9tIHRoZSB0eXBlIFggc2hvdWxkIGJlIGFjY2Vzc2VkIGluIGEgc3RhdGljIHdheVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiOS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTEpXG4iICsgCgkJCSIJeC5iYXIobGlzdCwgY29tcGFyYXRvcik7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBVbmNoZWNrZWQgaW52b2NhdGlvbiBiYXIoTGlzdCwgQ29tcGFyYXRvcikgb2YgdGhlIGdlbmVyaWMgbWV0aG9kIGJhcihMaXN0PFQ+LCBDb21wYXJhdG9yPD8gc3VwZXIgVD4pIG9mIHR5cGUgWFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMTAuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDExKVxuIiArIAoJCQkiCXguYmFyKGxpc3QsIGNvbXBhcmF0b3IpO1xuIiArIAoJCQkiCSAgICAgIF5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIExpc3QgbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBMaXN0PFQ+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTEpXG4iICsgCgkJCSIJeC5iYXIobGlzdCwgY29tcGFyYXRvcik7XG4iICsgCgkJCSIJICAgICAgICAgICAgXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBleHByZXNzaW9uIG9mIHR5cGUgQ29tcGFyYXRvciBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIENvbXBhcmF0b3I8PyBzdXBlciBUPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMTIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxOClcbiIgKyAKCQkJIglab3JrIHo7XG4iICsgCgkJCSIJXl5eXlxuIiArIAoJCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCgkvLyBhcnJheSBib3VuZCBmb3Igd2lsZGNhcmQKCXB1YmxpYyB2b2lkIHRlc3Q1MDcoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCQkiaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlO1xuIiArIAoJCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXZvaWQgZm9vMShMaXN0PD8gZXh0ZW5kcyBpbnRbXT4gbCkge1xuIiArIAoJCQkJIgkJaW50IGkgPSBsLmdldCgwKS5sZW5ndGg7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBmb28yKExpc3Q8PyBleHRlbmRzIGludFtdPiBsKSB7XG4iICsgCgkJCQkiCQlPYmplY3QgbyA9IGwuZ2V0KDApLnRvU3RyaW5nKCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBmb28zKExpc3Q8PyBleHRlbmRzIGludFtdPiBsLCBTZXJpYWxpemFibGUgcykge1xuIiArIAoJCQkJIgkJYm9vbGVhbiBiID0gdHJ1ZTtcbiIgKyAKCQkJCSIJCVNlcmlhbGl6YWJsZSBzMiA9IGIgPyBsLmdldCgwKSA6IHM7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSIiKTsKCX0JCQoJLy8gYXJyYXkgYm91bmQgZm9yIHdpbGRjYXJkCglwdWJsaWMgdm9pZCB0ZXN0NTA4KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJCSJpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7XG4iICsgCgkJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJdm9pZCBmb28xKExpc3Q8PyBzdXBlciBpbnRbXT4gbCkge1xuIiArIAoJCQkJIgkJaW50IGkgPSBsLmdldCgwKS5sZW5ndGg7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBmb28yKExpc3Q8PyBzdXBlciBpbnRbXT4gbCkge1xuIiArIAoJCQkJIgkJT2JqZWN0IG8gPSBsLmdldCgwKS50b1N0cmluZygpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXZvaWQgZm9vMyhMaXN0PD8gc3VwZXIgaW50W10+IGwsIFNlcmlhbGl6YWJsZSBzKSB7XG4iICsgCgkJCQkiCQlib29sZWFuIGIgPSB0cnVlO1xuIiArIAoJCQkJIgkJU2VyaWFsaXphYmxlIHMyID0gYiA/IGwuZ2V0KDApIDogcztcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxyXG4iICsgCgkJCSIJaW50IGkgPSBsLmdldCgwKS5sZW5ndGg7XHJcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgIF5eXl5eXlxuIiArIAoJCQkibGVuZ3RoIGNhbm5vdCBiZSByZXNvbHZlZCBvciBpcyBub3QgYSBmaWVsZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEzKVxyXG4iICsgCgkJCSIJU2VyaWFsaXphYmxlIHMyID0gYiA/IGwuZ2V0KDApIDogcztcclxuIiArIAoJCQkiCSAgICAgICAgICAgICBeXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBPYmplY3QgdG8gU2VyaWFsaXphYmxlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJLy8gdHlwZSBwYXJhbWV0ZXIgaGlkaW5nCglwdWJsaWMgdm9pZCB0ZXN0NTA5KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBMaXN0PE15VGlnZXJTaW1wbGVPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE15VGlnZXJTaW1wbGVPYmplY3Q+KCk7XG4iICsgCgkJCQkiICAgICAgICBsaXN0LmFkZChuZXcgTXlUaWdlclNpbXBsZU9iamVjdChcImFcIikpO1xuIiArIAoJCQkJIiAgICAgICAgbGlzdC5hZGQobmV3IE15VGlnZXJTaW1wbGVPYmplY3QoXCJiXCIpKTtcbiIgKyAKCQkJCSIgICAgICAgIFxuIiArIAoJCQkJIiAgICAgICAgZm9yIChNeVRpZ2VyU2ltcGxlT2JqZWN0IHNvIDogbGlzdClcbiIgKyAKCQkJCSIgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc28uZ2V0U29tZUF0dHJpYnV0ZSgpKTsJCVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIE15VGlnZXJTaW1wbGVPYmplY3Q8RT4ge1xuIiArIAoJCQkJIglNeVRpZ2VyU2ltcGxlT2JqZWN0KFN0cmluZyBzKSB7fVxuIiArIAoJCQkJIglFIGdldFNvbWVBdHRyaWJ1dGUoKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIFRpZ2VyTGlzdDxNeVRpZ2VyU2ltcGxlT2JqZWN0PiBleHRlbmRzIEFycmF5TGlzdDxNeVRpZ2VyU2ltcGxlT2JqZWN0PiB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyB2b2lkIGxpc3RBbGwoKSB7XG4iICsgCgkJCQkiICAgICAgICBmb3IgKE15VGlnZXJTaW1wbGVPYmplY3Qgc28gOiB0aGlzKVxuIiArIAoJCQkJIiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzby5nZXRTb21lQXR0cmlidXRlKCkpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDE3KVxuIiArIAoJCQkiCWNsYXNzIFRpZ2VyTGlzdDxNeVRpZ2VyU2ltcGxlT2JqZWN0PiBleHRlbmRzIEFycmF5TGlzdDxNeVRpZ2VyU2ltcGxlT2JqZWN0PiB7XG4iICsgCgkJCSIJICAgICAgXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgc2VyaWFsaXphYmxlIGNsYXNzIFRpZ2VyTGlzdCBkb2VzIG5vdCBkZWNsYXJlIGEgc3RhdGljIGZpbmFsIHNlcmlhbFZlcnNpb25VSUQgZmllbGQgb2YgdHlwZSBsb25nXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxNylcbiIgKyAKCQkJIgljbGFzcyBUaWdlckxpc3Q8TXlUaWdlclNpbXBsZU9iamVjdD4gZXh0ZW5kcyBBcnJheUxpc3Q8TXlUaWdlclNpbXBsZU9iamVjdD4ge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgdHlwZSBwYXJhbWV0ZXIgTXlUaWdlclNpbXBsZU9iamVjdCBpcyBoaWRpbmcgdGhlIHR5cGUgTXlUaWdlclNpbXBsZU9iamVjdDxFPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDIwKVxuIiArIAoJCQkiCVN5c3RlbS5vdXQucHJpbnRsbihzby5nZXRTb21lQXR0cmlidXRlKCkpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGdldFNvbWVBdHRyaWJ1dGUoKSBpcyB1bmRlZmluZWQgZm9yIHRoZSB0eXBlIE15VGlnZXJTaW1wbGVPYmplY3RcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg0MzU1CglwdWJsaWMgdm9pZCB0ZXN0NTEwKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQkJImltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyBYKCkge1xuIiArIAoJCQkJIgkJU3RyaW5nW10gc3RyaW5ncyA9IG5ldyBTdHJpbmdbXXtcInRlc3RcIn07XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCQkvLyB0aGlzIGZhaWxzXG4iICsgCgkJCQkiCQlPYmplY3Qgb2JqID0gQ2xhc3NCLmRvU29tZXRoaW5nKChTdHJpbmcpIHN0cmluZ3NbMF0pO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgkJLy8gdGhpcyB3b3JrcyBmaW5lXG4iICsgCgkJCQkiCQlTdHJpbmcgaW50ZXJtZWRpYXRlID0gQ2xhc3NCLmRvU29tZXRoaW5nKChTdHJpbmcpIHN0cmluZ3NbMF0pO1xuIiArIAoJCQkJIgkJT2JqZWN0IG9iajEgPSBpbnRlcm1lZGlhdGU7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgQ2xhc3NCIHtcbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4gVCBkb1NvbWV0aGluZyhTdHJpbmcgdmFsdWUpIHtcbiIgKyAKCQkJCSIJCXJldHVybiAoVCkgdmFsdWU7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSIiKTsKCX0JCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgyNDA3CglwdWJsaWMgdm9pZCB0ZXN0NTExKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQkJImltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXN0YXRpYyBIYXNoTWFwPENoYXJhY3RlciwgQ2hhcmFjdGVyPiBzdWJzdGl0dXRpb25MaXN0KFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCQlIYXNoTWFwPENoYXJhY3RlciwgQ2hhcmFjdGVyPiBzdWJzdCA9IG5ldyBIYXNoTWFwPENoYXJhY3RlciwgQ2hhcmFjdGVyPigpO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgkJZm9yIChpbnQgaSA9IDA7IGkgPCBzMS5sZW5ndGgoKTsgaSsrKSB7XG4iICsgCgkJCQkiCQkJY2hhciBrZXkgPSBzMS5jaGFyQXQoaSk7XG4iICsgCgkJCQkiCQkJY2hhciB2YWx1ZSA9IHMyLmNoYXJBdChpKTtcbiIgKyAKCQkJCSIJCQlpZiAoc3Vic3QuY29udGFpbnNLZXkoa2V5KSkge1xuIiArIAoJCQkJIgkJCQlpZiAodmFsdWUgIT0gc3Vic3QuZ2V0KGtleSkpIHtcbiIgKyAKCQkJCSIJCQkJCXJldHVybiBudWxsO1xuIiArIAoJCQkJIgkJCQl9XG4iICsgCgkJCQkiCQkJfSBlbHNlIGlmIChzdWJzdC5jb250YWluc1ZhbHVlKHZhbHVlKSkge1xuIiArIAoJCQkJIgkJCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIJCQl9IGVsc2Uge1xuIiArIAoJCQkJIgkJCQlzdWJzdC5wdXQoa2V5LCB2YWx1ZSk7XG4iICsgCgkJCQkiCQkJfVxuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIgkJcmV0dXJuIHN1YnN0O1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CQkKCXB1YmxpYyB2b2lkIHRlc3Q1MTIoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCQkicHVibGljIGNsYXNzIFggeyBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkge1xuIiArIAoJCQkJIgkJXG4iICsgCgkJCQkiCQluZXcgWCgpLm5ldyBNPEV4Y2VwdGlvbj4obnVsbCkge1xuIiArIAoJCQkJIgkJCXZvaWQgcnVuKCkge1xuIiArIAoJCQkJIgkJCQlFeGNlcHRpb24gZSA9IGV4O1xuIiArIAoJCQkJIgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgkJCX1cbiIgKyAKCQkJCSIJCX0ucnVuKCk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgY2xhc3MgTTxFIGV4dGVuZHMgVGhyb3dhYmxlPiB7XG4iICsgCgkJCQkiICAgICAgICBFIGV4O1xuIiArIAoJCQkJIiAgICAgICAgTShFIGV4KSB7XG4iICsgCgkJCQkiICAgICAgICAgICAgdGhpcy5leCA9IGV4O1xuIiArIAoJCQkJIiAgICAgICAgfVxuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkJCQoJcHVibGljIHZvaWQgdGVzdDUxMygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCQkicHVibGljIGNsYXNzIFggeyBcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkge1xuIiArIAoJCQkJIgkJXG4iICsgCgkJCQkiCQluZXcgWCgpLm5ldyBNKG51bGwpIHtcbiIgKyAKCQkJCSIJCQl2b2lkIHJ1bigpIHtcbiIgKyAKCQkJCSIJCQkJRXhjZXB0aW9uIGUgPSBleDtcbiIgKyAKCQkJCSIJCQkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIJCQl9XG4iICsgCgkJCQkiCQl9LnJ1bigpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIGNsYXNzIE08RSBleHRlbmRzIFRocm93YWJsZT4ge1xuIiArIAoJCQkJIiAgICAgICAgRSBleDtcbiIgKyAKCQkJCSIgICAgICAgIE0oRSBleCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgIHRoaXMuZXggPSBleDtcbiIgKyAKCQkJCSIgICAgICAgIH1cbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJbmV3IFgoKS5uZXcgTShudWxsKSB7XG4iICsgCgkJCSIJCQl2b2lkIHJ1bigpIHtcbiIgKyAKCQkJIgkJCQlFeGNlcHRpb24gZSA9IGV4O1xuIiArIAoJCQkiCQkJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCSIJCQl9XG4iICsgCgkJCSIJCX0ucnVuKCk7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBjb25zdHJ1Y3RvciBYLk0oVGhyb3dhYmxlKSBiZWxvbmdzIHRvIHRoZSByYXcgdHlwZSBYLk0uIFJlZmVyZW5jZXMgdG8gZ2VuZXJpYyB0eXBlIFguTTxFPiBzaG91bGQgYmUgcGFyYW1ldGVyaXplZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkJIgluZXcgWCgpLm5ldyBNKG51bGwpIHtcbiIgKyAKCQkJIgkgICAgICAgICAgICBeXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNvbnN0cnVjdG9yIFguTShUaHJvd2FibGUpIGJlbG9uZ3MgdG8gdGhlIHJhdyB0eXBlIFguTS4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgWC5NPEU+IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkJIglFeGNlcHRpb24gZSA9IGV4O1xuIiArIAoJCQkiCSAgICAgICAgICBeXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFRocm93YWJsZSB0byBFeGNlcHRpb25cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODI5NTUKCXB1YmxpYyB2b2lkIHRlc3Q1MTQoKXsKCQlydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJUZXN0LmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBUZXN0IHtcbiIgKyAKCQkJCSIJc3RhdGljIDxUIGV4dGVuZHMgQmFzZT4gVCBpbmZlciggVCB0MSwgVCB0MiApIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZyBbXSBhcmdzICkge1xuIiArIAoJCQkJIgkJQmFzZSBiYXNlID0gaW5mZXIoIG5ldyBTdWIxKCksIG5ldyBTdWIyKCkgKTtcbiIgKyAKCQkJCSIJCS8vIE5vdGU6IEVjbGlwc2UgMy4xIHNheXMgdGhpcyBpcyBhbiBlcnJvciwgYnV0IGl0XCdzIG5vdFxuIiArIAoJCQkJIgkJUnVubmFibGUgcnVubmFibGUgPSBpbmZlciggbmV3IFN1YjEoKSwgbmV3IFN1YjIoKSApO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEJhc2UgeyB9XG4iICsgCgkJCQkiY2xhc3MgU3ViMSBleHRlbmRzIEJhc2UgaW1wbGVtZW50cyBSdW5uYWJsZSB7IHB1YmxpYyB2b2lkIHJ1bigpIHsgfSB9XG4iICsgCgkJCQkiY2xhc3MgU3ViMiBleHRlbmRzIEJhc2UgaW1wbGVtZW50cyBSdW5uYWJsZSB7IHB1YmxpYyB2b2lkIHJ1bigpIHsgfSB9XG4iCgkJCX0KCQkpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg0MzQ4CglwdWJsaWMgdm9pZCB0ZXN0NTE1KCl7CgkJcnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiVGVzdC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgVGVzdCB7XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgPFQ+IHZvaWQgbXlNZXRob2QoZmluYWwgTGlzdDw/IGV4dGVuZHMgRmlsZT4gZmlsZUxpc3QpIHtcbiIgKyAKCQkJCSIJCUNvbGxlY3Rpb25zLnNvcnQoZmlsZUxpc3QsIG5ldyBDb21wYXJhdG9yPEZpbGU+KCl7XG4iICsgCgkJCQkiCQkJcHVibGljIGludCBjb21wYXJlKEZpbGUgZjEsIEZpbGUgZjIpIHsgcmV0dXJuIDA7IH1cbiIgKyAKCQkJCSIJCX0pO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIExpc3Q8VD4ge31cbiIgKyAKCQkJCSJjbGFzcyBGaWxlIHt9XG4iICsgCgkJCQkiaW50ZXJmYWNlIENvbXBhcmF0b3I8VD4ge31cbiIgKyAKCQkJCSJjbGFzcyBDb2xsZWN0aW9ucyB7XG4iICsgCgkJCQkiCXN0YXRpYyA8VD4gdm9pZCBzb3J0KExpc3Q8VD4gbGlzdCwgQ29tcGFyYXRvcjw/IHN1cGVyIFQ+IGMpIHt9XG4iICsgCgkJCQkifSIKCQkJfQoJCSk7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODQ5NDQKCXB1YmxpYyB2b2lkIHRlc3Q1MTYoKXsKCQlydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJwYXJzZXIvQWJzdHJhY3RQYXJzZXIuamF2YSIsCgkJCQkicGFja2FnZSBwYXJzZXI7XG4iICsgCgkJCQkicHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGFyc2VyPFQ+IGltcGxlbWVudHMgVmFsdWVQYXJzZXI8VD4ge1xuIiArIAoJCQkJIglwdWJsaWMgVCBwYXJzZSggZmluYWwgU3RyaW5nIHN0cmluZyApIHtcbiIgKyAKCQkJCSIJCXJldHVybiB2YWx1ZU9mKHN0cmluZyk7IFxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXByb3RlY3RlZCBhYnN0cmFjdCBUIHZhbHVlT2YoZmluYWwgU3RyaW5nIHN0cmluZyk7CVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJpbnRlcmZhY2UgVmFsdWVQYXJzZXI8VD4ge1xuIiArIAoJCQkJIglUIHBhcnNlKGZpbmFsIFN0cmluZyBzdHJpbmcpO1xuIiArIAoJCQkJIn1cbiIsCgkJCQkicGFyc2VyL0Jvb2xlYW5QYXJzZXIuamF2YSIsCgkJCQkicGFja2FnZSBwYXJzZXI7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIEJvb2xlYW5QYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcjxCb29sZWFuPiB7XG4iICsgCgkJCQkiCXByb3RlY3RlZCBCb29sZWFuIHZhbHVlT2YoZmluYWwgU3RyaW5nIHN0cmluZyApIHtcbiIgKyAKCQkJCSIJCXJldHVybiBCb29sZWFuLnZhbHVlT2Yoc3RyaW5nKTsgCQlcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfQoJCSk7CgkJcnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkidGVzdC9Cb29sZWFuUGFyc2VyVGVzdC5qYXZhIiwKCQkJCSJwYWNrYWdlIHRlc3Q7XG4iICsgCgkJCQkiaW1wb3J0IHBhcnNlci5Cb29sZWFuUGFyc2VyO1xuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBCb29sZWFuUGFyc2VyVGVzdCB7XG4iICsgCgkJCQkiCXN0YXRpYyBmaW5hbCBib29sZWFuIGdldEJvb2xlYW4oZmluYWwgU3RyaW5nIHZhbHVlKSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gbmV3IEJvb2xlYW5QYXJzZXIoKS5wYXJzZSh2YWx1ZSkuYm9vbGVhblZhbHVlKCk7IC8vIFRoZSB0eXBlIEJvb2xlYW4gaXMgbm90IHZpc2libGVcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJbnVsbCwKCQkJbnVsbCwKCQkJZmFsc2UsIC8vIGRvIG5vdCBmbHVzaCBvdXRwdXQgZGlyZWN0b3J5CgkJCW51bGwKCQkpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg0OTQ0IC0gY2hlY2sgbm8gd2FybmluZyBmb3IgdXNpbmcgcmF3IG1lbWJlcgoJcHVibGljIHZvaWQgdGVzdDUxNygpewoJCXJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImNsYXNzIEJhc2U8VD4ge1xuIiArIAoJCQkJIgljbGFzcyBJbm5lckJhc2Uge1xuIiArIAoJCQkJIgkJamF2YS51dGlsLkxpc3Q8U3RyaW5nPiBsaXN0O1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiICBab3JrIHo7XG4iICsKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBCYXNlPEludGVnZXI+IHtcbiIgKyAKCQkJCSIJY2xhc3MgSW5uZXJEZXJpdmVkIGV4dGVuZHMgSW5uZXJCYXNlIHtcbiIgKyAKCQkJCSIJCXZvaWQgbWV0aG9kKCkge1xuIiArIAoJCQkJIgkJCWxpc3QuYWRkKFwiSGlcIik7IC8vIFdhcm5pbmcgb24gdGhpcyBtZXRob2QgY2FsbFxuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJCSIJWm9yayB6O1xuIiArIAoJCQkiCV5eXl5cbiIgKyAKCQkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg1OTMwIC0gY2hlY2sgbm8gd2FybmluZyBmb3IgdXNpbmcgcmF3IG1lbWJlcgoJcHVibGljIHZvaWQgdGVzdDUxOCgpewoJCXJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImludGVyZmFjZSBDYWxsYWJsZTxUPiB7XG4iICsgCgkJCQkiCXB1YmxpYyBlbnVtIFJlc3VsdCB7XG4iICsgCgkJCQkiCQlHT09ELCBCQURcbiIgKyAKCQkJCSIJfTtcbiIgKyAKCQkJCSIJcHVibGljIFJlc3VsdCBjYWxsKFQgYXJnKTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFggaW1wbGVtZW50cyBDYWxsYWJsZTxTdHJpbmc+IHtcbiIgKyAKCQkJCSIJcHVibGljIFJlc3VsdCBjYWxsKFN0cmluZyBhcmcpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBSZXN1bHQuR09PRDtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIiAgWm9yayB6O1xuIiArCQkJCQoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMilcbiIgKyAKCQkJIglab3JrIHo7XG4iICsgCgkJCSIJXl5eXlxuIiArIAoJCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODUyNjIKCXB1YmxpYyB2b2lkIHRlc3Q1MTkoKXsKCQlydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJGb29JbXBsLmphdmEiLAoJCQkJImludGVyZmFjZSBCYXI8UiBleHRlbmRzIEZvbzxSPj4gIHt9IFxuIiArIAoJCQkJIiBcbiIgKyAKCQkJCSJjbGFzcyBCYXJJbXBsPFMgZXh0ZW5kcyBGb288Uz4+IGltcGxlbWVudHMgQmFyPFM+IHt9IFxuIiArIAoJCQkJIiBcbiIgKyAKCQkJCSJpbnRlcmZhY2UgRm9vPFQgZXh0ZW5kcyBGb288VD4+IGV4dGVuZHMgQmFyPFQ+IHt9IFxuIiArIAoJCQkJIiBcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgRm9vSW1wbDxVIGV4dGVuZHMgRm9vPFU+PiBleHRlbmRzIEJhckltcGw8VT4gaW1wbGVtZW50cyBGb288VT4ge31cbiIgKyAKCQkJCSJcbiIKCQkJfSwKCQkJIiIpOwoJfQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NTI2MiAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDUyMCgpewoJCXJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIkJhci5qYXZhIiwKCQkJCSJwdWJsaWMgaW50ZXJmYWNlIEJhcjxSIGV4dGVuZHMgRm9vPFI+PiAge30gXG4iLAoJCQkJIkJhckltcGwuamF2YSIsCgkJCQkicHVibGljIGNsYXNzIEJhckltcGw8UyBleHRlbmRzIEZvbzxTPj4gaW1wbGVtZW50cyBCYXI8Uz4ge30gXG4iLAoJCQkJIkZvby5qYXZhIiwKCQkJCSJwdWJsaWMgaW50ZXJmYWNlIEZvbzxUIGV4dGVuZHMgRm9vPFQ+PiBleHRlbmRzIEJhcjxUPiB7fSBcbiIsCgkJCX0sCgkJCSIiKTsKCQlydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJGb29JbXBsLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBGb29JbXBsPFUgZXh0ZW5kcyBGb288VT4+IGV4dGVuZHMgQmFySW1wbDxVPiBpbXBsZW1lbnRzIEZvbzxVPiB7fVxuIiwKCQkJfSwKCQkJIiIsCgkJCW51bGwsCgkJCWZhbHNlLCAvLyBkbyBub3QgZmx1c2ggb3V0cHV0IGRpcmVjdG9yeQoJCQludWxsKTsKCX0KCXB1YmxpYyB2b2lkIHRlc3Q1MjEoKXsKCQlydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXN0YXRpYyBwdWJsaWMgPFQgZXh0ZW5kcyBDb2xsZWN0aW9uPiB2b2lkIGFkZEFsbChUIGEsIFQgYikge1xuIiArIAoJCQkJIgkJYS5hZGRBbGwoYik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJc3RhdGljIHB1YmxpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJQ29sbGVjdGlvbjxJbnRlZ2VyPiBhID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpO1xuIiArIAoJCQkJIgkJQ29sbGVjdGlvbjxTdHJpbmc+IGIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTtcbiIgKyAKCQkJCSIJCWIuYWRkKFwic3RyaW5nXCIpO1xuIiArIAoJCQkJIgkJYWRkQWxsKGEsIGIpO1xuIiArIAoJCQkJIgkJdHJ5IHtcbiIgKyAKCQkJCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oYS5pdGVyYXRvcigpLm5leHQoKS5pbnRWYWx1ZSgpKTsgLy8gQ2xhc3NDYXN0RXhjZXB0aW9uXG4iICsgCgkJCQkiCQl9IGNhdGNoKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7XG4iICsgCgkJCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIJCX1cbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCQkKCS8vIHZhcmlhdGlvbiBvbiB0ZXN0NTIxLCBjaGVjayBpc3N1aW5nIG9mIHVuY2hlY2tlZCB3YXJuaW5nIChqYXZhYyBtaXNzZXMgaXQpCglwdWJsaWMgdm9pZCB0ZXN0NTIyKCl7CgkJcnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJc3RhdGljIHB1YmxpYyA8VCBleHRlbmRzIENvbGxlY3Rpb24+IHZvaWQgYWRkQWxsKFQgYSwgVCBiKSB7XG4iICsgCgkJCQkiCQlhLmFkZEFsbChiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglzdGF0aWMgcHVibGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlDb2xsZWN0aW9uPEludGVnZXI+IGEgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7XG4iICsgCgkJCQkiCQlDb2xsZWN0aW9uPFN0cmluZz4gYiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpO1xuIiArIAoJCQkJIgkJYi5hZGQoXCJzdHJpbmdcIik7XG4iICsgCgkJCQkiCQlhZGRBbGwoYSwgYik7XG4iICsgCgkJCQkiCQl0cnkge1xuIiArIAoJCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihhLml0ZXJhdG9yKCkubmV4dCgpLmludFZhbHVlKCkpOyAvLyBDbGFzc0Nhc3RFeGNlcHRpb25cbiIgKyAKCQkJCSIJCX0gY2F0Y2goQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHtcbiIgKyAKCQkJCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiICBab3JrIHo7XG4iICsKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCWEuYWRkQWxsKGIpO1xuIiArIAoJCQkiCV5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIG1ldGhvZCBhZGRBbGwoQ29sbGVjdGlvbikgYmVsb25ncyB0byB0aGUgcmF3IHR5cGUgQ29sbGVjdGlvbi4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgQ29sbGVjdGlvbjxFPiBzaG91bGQgYmUgcGFyYW1ldGVyaXplZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDE4KVxuIiArIAoJCQkiCVpvcmsgejtcbiIgKyAKCQkJIgleXl5eXG4iICsgCgkJCSJab3JrIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQoJcHVibGljIHZvaWQgdGVzdDUyMygpewoJCXJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyBYKCkge1xuIiArIAoJCQkJIgkJTSBtID0gbmV3IE0oKTtcbiIgKyAKCQkJCSIJCUxpc3Q8U3RyaW5nPiBscyA9IG0ubGlzdCgpOyAvLyByYXdpZmllZCBldmVuIHRob3VnaCB3YXNuXCd0IHVzaW5nIFQgcGFyYW1ldGVyXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJWm9yayB6O1xuIiArIAoJCQkJIglzdGF0aWMgY2xhc3MgTTxUPiB7XG4iICsgCgkJCQkiCQlMaXN0PFN0cmluZz4gbGlzdCgpIHtcbiIgKyAKCQkJCSIJCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIJCX1cbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJCSIJTGlzdDxTdHJpbmc+IGxzID0gbS5saXN0KCk7IC8vIHJhd2lmaWVkIGV2ZW4gdGhvdWdoIHdhc25cJ3QgdXNpbmcgVCBwYXJhbWV0ZXJcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICBeXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBleHByZXNzaW9uIG9mIHR5cGUgTGlzdCBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIExpc3Q8U3RyaW5nPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJCSIJWm9yayB6O1xuIiArIAoJCQkiCV5eXl5cbiIgKyAKCQkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvLyBlbnN1cmUgdGhlcmUgaXMgbm8gdW5jaGVja2VkIHdhcm5pbmcgKGphdmFjIGluY29ycmVjdGx5IHJlcG9ydHMgb25lKQoJcHVibGljIHZvaWQgdGVzdDUyNCgpewoJCXJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJjbGFzcyBNeUxpc3QgZXh0ZW5kcyBBcnJheUxpc3Q8U3RyaW5nPiB7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgTGlzdDw/IGV4dGVuZHMgU3RyaW5nPiBhID0gbmV3IE15TGlzdCgpO1xuIiArIAoJCQkJIiAgICAgICAgTGlzdDxTdHJpbmc+IGIgPSAoTXlMaXN0KSBhOyAgICAgXG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIJWm9yayB6O1xuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDIpXG4iICsgCgkJCSIJY2xhc3MgTXlMaXN0IGV4dGVuZHMgQXJyYXlMaXN0PFN0cmluZz4ge1xuIiArIAoJCQkiCSAgICAgIF5eXl5eXlxuIiArIAoJCQkiVGhlIHNlcmlhbGl6YWJsZSBjbGFzcyBNeUxpc3QgZG9lcyBub3QgZGVjbGFyZSBhIHN0YXRpYyBmaW5hbCBzZXJpYWxWZXJzaW9uVUlEIGZpZWxkIG9mIHR5cGUgbG9uZ1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEwKVxuIiArIAoJCQkiCVpvcmsgejtcbiIgKyAKCQkJIgleXl5eXG4iICsgCgkJCSJab3JrIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQkKCXB1YmxpYyB2b2lkIHRlc3Q1MjUoKXsKCQlydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCXRyeSB7XG4iICsgCgkJCQkiCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpO1xuIiArIAoJCQkJIgkJCVN0cmluZyBzID0gXCJ0aGlzIHNob3VsZG5cJ3Qgd29ya1wiO1xuIiArIAoJCQkJIgkJCWxpc3QuYWRkKHMpO1xuIiArIAoJCQkJIgkJCUxpc3Q8SW50ZWdlcj4gbGlzdEludCA9IGxpc3Q7XG4iICsgCgkJCQkiCQkJaW50IGkgPSBsaXN0SW50LmdldCgwKTtcbiIgKyAKCQkJCSIJCX0gY2F0Y2goQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHtcbiIgKyAKCQkJCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiU1VDQ0VTUyIpOwoJfQkJCQoJcHVibGljIHZvaWQgdGVzdDUyNigpewoJCXJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgWm9yayB6O1xuIiArCgkJCQkiICAgIDxUPiBUIGYoT2JqZWN0IG8pIHtcbiIgKyAKCQkJCSIJcmV0dXJuIChUKSBvOyAvLyBPS1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICAgIDxVLCBUIGV4dGVuZHMgVT4gVCBnKE9iamVjdCBvKSB7XG4iICsgCgkJCQkiCXJldHVybiAoVCkgbzsgLy8gYnVnPz8/XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgICAgPFUsIFQgZXh0ZW5kcyBVPiBUIGgoT2JqZWN0IG8pIHtcbiIgKyAKCQkJCSIJcmV0dXJuIFguPFQ+Y2FzdFRvKG8pOyAvLyB3b3JrYXJvdW5kXG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgY2FzdFRvKE9iamVjdCBvKSB7XG4iICsgCgkJCQkiCXJldHVybiAoVCkgbztcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyKVxuIiArIAoJCQkiCVpvcmsgejtcbiIgKyAKCQkJIgleXl5eXG4iICsgCgkJCSJab3JrIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJcmV0dXJuIChUKSBvOyAvLyBPS1xuIiArIAoJCQkiCSAgICAgICBeXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBjYXN0IGZyb20gT2JqZWN0IHRvIFQgaXMgYWN0dWFsbHkgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZXJhc2VkIHR5cGUgT2JqZWN0XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCXJldHVybiAoVCkgbzsgLy8gYnVnPz8/XG4iICsgCgkJCSIJICAgICAgIF5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNhc3QgZnJvbSBPYmplY3QgdG8gVCBpcyBhY3R1YWxseSBjaGVja2luZyBhZ2FpbnN0IHRoZSBlcmFzZWQgdHlwZSBPYmplY3RcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjQuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDE2KVxuIiArIAoJCQkiCXJldHVybiAoVCkgbztcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIE9iamVjdCB0byBUIGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIE9iamVjdFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCQoJLy8gc2hvdWxkIG5vdCBwcm9kdWNlIHVuY2hlY2tlZCBlcnJvcnMgKGphdmFjIGluY29ycmVjdGx5IGRvZXMpCglwdWJsaWMgdm9pZCB0ZXN0NTI3KCl7CgkJcnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIgk8VCwgVSBleHRlbmRzIFQsIFYgZXh0ZW5kcyBUPiBUIGZvbyhVIHUsIFYgdikge1xuIiArIAoJCQkJIgkJcmV0dXJuIHRoaXMgPT0gbnVsbCA/IChUKSB1IDogKFQpdjtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglab3JrIHo7XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJCSIJWm9yayB6O1xuIiArIAoJCQkiCV5eXl5cbiIgKyAKCQkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCQoKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2MjE3CglwdWJsaWMgdm9pZCB0ZXN0NTI4KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUIGV4dGVuZHMgWC5NPiBleHRlbmRzIFkge31cbiIgKyAKCQkJCSJjbGFzcyBZIHsgc3RhdGljIGNsYXNzIE0ge30gfVxuIiwKCQkJfSwKCQkJIiIKCQkpOwoJfQoJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjQ2MwoJcHVibGljIHZvaWQgdGVzdDUyOSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWDxUIGV4dGVuZHMgTGlzdD4ge1xuIiArIAoJCQkJIgl2b2lkIGJhcigpIHtcbiIgKyAKCQkJCSIJCVQgdCA9IG5ldyBBcnJheUxpc3QoKTsgLy8gQlVHISEhXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJVCB0ID0gbmV3IEFycmF5TGlzdCgpOyAvLyBCVUchISFcbiIgKyAKCQkJIgkgIF5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gQXJyYXlMaXN0IHRvIFRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkKCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODY0NjMKCXB1YmxpYyB2b2lkIHRlc3Q1MzAoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiYWJzdHJhY3QgY2xhc3MgRm9vPFQgZXh0ZW5kcyBMaXN0PlxuIiArIAoJCQkJIiB7XG4iICsgCgkJCQkiICBhYnN0cmFjdCB2b2lkIGZvbyhUIHQpO1xuIiArIAoJCQkJIiAgdm9pZCBmb28yKClcbiIgKyAKCQkJCSIgIHtcbiIgKyAKCQkJCSIgICAgTGlzdCBsID0gbmV3IExpbmtlZExpc3QoKTtcbiIgKyAKCQkJCSIgICAgZm9vKGwpOyAvLyBCVUchISFcbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBGb288QXJyYXlMaXN0PlxuIiArIAoJCQkJIntcbiIgKyAKCQkJCSIgIHZvaWQgZm9vKEFycmF5TGlzdCBsKVxuIiArIAoJCQkJIiAge1xuIiArIAoJCQkJIiAgICBTeXN0ZW0ub3V0LnByaW50bG4obCk7XG4iICsgCgkJCQkiICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA5KVxuIiArIAoJCQkiCWZvbyhsKTsgLy8gQlVHISEhXG4iICsgCgkJCSIJXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGZvbyhUKSBpbiB0aGUgdHlwZSBGb288VD4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKExpc3QpXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxNSlcbiIgKyAKCQkJIgl2b2lkIGZvbyhBcnJheUxpc3QgbClcbiIgKyAKCQkJIgkgICAgIF5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgZm9vKEFycmF5TGlzdCkgb2YgdHlwZSBYIHNob3VsZCBiZSB0YWdnZWQgd2l0aCBAT3ZlcnJpZGUgc2luY2UgaXQgYWN0dWFsbHkgb3ZlcnJpZGVzIGEgc3VwZXJjbGFzcyBtZXRob2RcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2NjQ2CglwdWJsaWMgdm9pZCB0ZXN0NTMxKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIglwdWJsaWMgVCBmMShUIGwpIHtcbiIgKyAKCQkJCSIJCVZlY3RvcjxUPiB2ID0gbmV3IFZlY3RvcjxUPigpO1xuIiArIAoJCQkJIgkJdi5hZGQobCk7XG4iICsgCgkJCQkiCQlyZXR1cm4gKFQpIHYuZ2V0KDApOyAvLyBFeHBlY3Qgd2FybmluZyBoZXJlXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIgIFpvcmsgejtcbiIgKwoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCXJldHVybiAoVCkgdi5nZXQoMCk7IC8vIEV4cGVjdCB3YXJuaW5nIGhlcmVcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJVbm5lY2Vzc2FyeSBjYXN0IGZyb20gVCB0byBUXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkJIglab3JrIHo7XG4iICsgCgkJCSIJXl5eXlxuIiArIAoJCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDk0NAoJcHVibGljIHZvaWQgdGVzdDUzMigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJInAvWC5qYXZhIiwKCQkJCSJwYWNrYWdlIHA7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBaPEJvb2xlYW4+IHtcbiIgKyAKCQkJCSIJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZhbHVlKCkgeyByZXR1cm4gdHJ1ZTsgfVxuIiArIAoJCQkJIn1cbiIgKwoJCQkJImFic3RyYWN0IGNsYXNzIFo8VD4ge1xuIiArIAoJCQkJIglwdWJsaWMgVCBmb28oKSB7IHJldHVybiB2YWx1ZSgpOyB9XG4iICsgCgkJCQkiCXB1YmxpYyBhYnN0cmFjdCBUIHZhbHVlKCk7XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIiIKCQkpOwoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWS5qYXZhIiwKCQkJCSJpbXBvcnQgcC5YO1xuIiArCgkJCQkicHVibGljIGNsYXNzIFkgeyBib29sZWFuIHRlc3QoKSB7IHJldHVybiBuZXcgWCgpLmZvbygpLmJvb2xlYW5WYWx1ZSgpOyB9IH1cbiIsCgkJCX0sCgkJCSIiLAoJCQludWxsLAoJCQlmYWxzZSwgLy8gZG8gbm90IGZsdXNoIG91dHB1dAoJCQludWxsCgkJKTsJCQoJfQoJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjgzOAoJcHVibGljIHZvaWQgdGVzdDUzMygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuRW51bVNldDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJlbnVtIEZvbyB7XG4iICsgCgkJCQkiCWJsYXJnaCwgYmF6LCBib3o7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJQ2xhc3MgYyA9IEZvby5jbGFzcztcbiIgKyAKCQkJCSIJCUVudW1TZXQ8RW51bT4gZVNldCA9IEVudW1TZXQuYWxsT2YoYyk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEwKVxuIiArIAoJCQkiCUVudW1TZXQ8RW51bT4gZVNldCA9IEVudW1TZXQuYWxsT2YoYyk7XG4iICsgCgkJCSIJICAgICAgICBeXl5eXG4iICsgCgkJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgRW51bSBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPEUgZXh0ZW5kcyBFbnVtPEU+PiBvZiB0aGUgdHlwZSBFbnVtU2V0PEU+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxMClcbiIgKyAKCQkJIglFbnVtU2V0PEVudW0+IGVTZXQgPSBFbnVtU2V0LmFsbE9mKGMpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIEVudW1TZXQgbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBFbnVtU2V0PEVudW0+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxMClcbiIgKyAKCQkJIglFbnVtU2V0PEVudW0+IGVTZXQgPSBFbnVtU2V0LmFsbE9mKGMpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBVbmNoZWNrZWQgaW52b2NhdGlvbiBhbGxPZihDbGFzcykgb2YgdGhlIGdlbmVyaWMgbWV0aG9kIGFsbE9mKENsYXNzPEU+KSBvZiB0eXBlIEVudW1TZXRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjQuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEwKVxuIiArIAoJCQkiCUVudW1TZXQ8RW51bT4gZVNldCA9IEVudW1TZXQuYWxsT2YoYyk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGV4cHJlc3Npb24gb2YgdHlwZSBDbGFzcyBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIENsYXNzPEU+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iCgkJKTsKCX0KCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2ODM4IC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0NTM0KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiZW51bSBGb28ge1xuIiArIAoJCQkJIglibGFyZ2gsIGJheiwgYm96O1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCUNsYXNzIGMgPSBGb28uY2xhc3M7XG4iICsgCgkJCQkiCQlFbnVtU2V0PEZvbz4gZVNldCA9IEVudW1TZXQuYWxsT2YoYyk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiIgoJCSk7Cgl9CgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjgzOCAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDUzNSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJImVudW0gRm9vIHtcbiIgKyAKCQkJCSIJYmxhcmdoLCBiYXosIGJvejtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlDbGFzcyBjID0gRm9vLmNsYXNzO1xuIiArIAoJCQkJIgkJRW51bVNldDw/IGV4dGVuZHMgRW51bT4gZVNldCA9IEVudW1TZXQuYWxsT2YoYyk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiIgoJCSk7Cgl9CgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjgzOCAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDUzNigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJImVudW0gRm9vIHtcbiIgKyAKCQkJCSIJYmxhcmdoLCBiYXosIGJvejtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlDbGFzcyBjID0gRm9vLmNsYXNzO1xuIiArIAoJCQkJIgkJRW51bVNldDw/PiBlU2V0ID0gRW51bVNldC5hbGxPZihjKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiCgkJKTsKCX0KCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2ODM4IC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0NTM3KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJImVudW0gRm9vIHtcbiIgKyAKCQkJCSIJYmxhcmdoLCBiYXosIGJvejtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlDbGFzcyBjID0gRm9vLmNsYXNzO1xuIiArIAoJCQkJIgkJRW51bVNldDw/PiBlU2V0ID0gRW51bVNldC5hbGxPZihjKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIiAgWm9yayB6O1xuIiArCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEwKVxuIiArIAoJCQkiCUVudW1TZXQ8Pz4gZVNldCA9IEVudW1TZXQuYWxsT2YoYyk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFVuY2hlY2tlZCBpbnZvY2F0aW9uIGFsbE9mKENsYXNzKSBvZiB0aGUgZ2VuZXJpYyBtZXRob2QgYWxsT2YoQ2xhc3M8RT4pIG9mIHR5cGUgRW51bVNldFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTApXG4iICsgCgkJCSIJRW51bVNldDw/PiBlU2V0ID0gRW51bVNldC5hbGxPZihjKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIENsYXNzIG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG8gQ2xhc3M8RT5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMilcbiIgKyAKCQkJIglab3JrIHo7XG4iICsgCgkJCSIJXl5eXlxuIiArIAoJCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2ODM4IC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0NTM4KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJImVudW0gRm9vIHtcbiIgKyAKCQkJCSIJYmxhcmdoLCBiYXosIGJvejtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlDbGFzcyBjID0gRm9vLmNsYXNzO1xuIiArIAoJCQkJIgkJRW51bVNldDxFbnVtPD8+PiBlU2V0ID0gRW51bVNldC5hbGxPZihjKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTApXG4iICsgCgkJCSIJRW51bVNldDxFbnVtPD8+PiBlU2V0ID0gRW51bVNldC5hbGxPZihjKTtcbiIgKyAKCQkJIgkgICAgICAgIF5eXl5cbiIgKyAKCQkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSBFbnVtPD8+IGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8RSBleHRlbmRzIEVudW08RT4+IG9mIHRoZSB0eXBlIEVudW1TZXQ8RT5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEwKVxuIiArIAoJCQkiCUVudW1TZXQ8RW51bTw/Pj4gZVNldCA9IEVudW1TZXQuYWxsT2YoYyk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBleHByZXNzaW9uIG9mIHR5cGUgRW51bVNldCBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIEVudW1TZXQ8RW51bTw/Pj5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEwKVxuIiArIAoJCQkiCUVudW1TZXQ8RW51bTw/Pj4gZVNldCA9IEVudW1TZXQuYWxsT2YoYyk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFVuY2hlY2tlZCBpbnZvY2F0aW9uIGFsbE9mKENsYXNzKSBvZiB0aGUgZ2VuZXJpYyBtZXRob2QgYWxsT2YoQ2xhc3M8RT4pIG9mIHR5cGUgRW51bVNldFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNC4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTApXG4iICsgCgkJCSIJRW51bVNldDxFbnVtPD8+PiBlU2V0ID0gRW51bVNldC5hbGxPZihjKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIENsYXNzIG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG8gQ2xhc3M8RT5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2ODM4IC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0NTM5KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIgkJIHN0YXRpYyBjbGFzcyBCPEM+IHtcbiIgKyAKCQkJCSIJCSAJCSBwdWJsaWMgPFQgZXh0ZW5kcyBJMT4gVCB3aWxsQmUoQ2xhc3M8VD4gYykge1xuIiArIAoJCQkJIgkJIAkJIAkJIHJldHVybiAoVCludWxsO1xuIiArIAoJCQkJIgkJIAkJIH1cbiIgKyAKCQkJCSIJCSB9XG4iICsgCgkJCQkiCQkgaW50ZXJmYWNlIEkxICB7XG4iICsgCgkJCQkiCQkgfVxuIiArIAoJCQkJIgkJIGludGVyZmFjZSBJMiAgZXh0ZW5kcyBJMSB7XG4iICsgCgkJCQkiCQkgfVxuIiArIAoJCQkJIgkJIFxuIiArIAoJCQkJIgkJIHB1YmxpYyBzdGF0aWMgdm9pZCBtMShTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQkgCQkgQiBiID0gbmV3IEIoKTtcbiIgKyAKCQkJCSIJCSAJCSBJMiB2ID0gYi53aWxsQmUoSTIuY2xhc3MpO1xuIiArIAoJCQkJIgkJIH1cbiIgKyAKCQkJCSIJCSBwdWJsaWMgc3RhdGljIHZvaWQgbTIoU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJIAkJIEI8Vm9pZD4gYiA9IG5ldyBCPFZvaWQ+KCk7XG4iICsgCgkJCQkiCQkgCQkgSTIgdiA9IGIud2lsbEJlKEkyLmNsYXNzKTtcbiIgKyAKCQkJCSIJCSB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJcmV0dXJuIChUKW51bGw7XG4iICsgCgkJCSIJICAgICAgIF5eXl5eXl5cbiIgKyAKCQkJIlVubmVjZXNzYXJ5IGNhc3QgZnJvbSBudWxsIHRvIFRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxNClcbiIgKyAKCQkJIglJMiB2ID0gYi53aWxsQmUoSTIuY2xhc3MpO1xuIiArIAoJCQkiCSAgIF5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gWC5JMSB0byBYLkkyXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxNClcbiIgKyAKCQkJIglJMiB2ID0gYi53aWxsQmUoSTIuY2xhc3MpO1xuIiArIAoJCQkiCSAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgbWV0aG9kIHdpbGxCZShDbGFzcykgYmVsb25ncyB0byB0aGUgcmF3IHR5cGUgWC5CLiBSZWZlcmVuY2VzIHRvIGdlbmVyaWMgdHlwZSBYLkI8Qz4gc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy8gamF2YWMgaW5jb3JyZWN0bHkgcmVqZWN0cyBpdAoJcHVibGljIHZvaWQgdGVzdDU0MCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIkJhei5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkiaW50ZXJmYWNlIEZvbzxYPiB7fVxuIiArIAoJCQkJImludGVyZmFjZSBCYXIgZXh0ZW5kcyBGb28ge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgQmF6PFIsRD4gIHtcbiIgKyAKCQkJCSIgICAgcHVibGljIFIgdmlzaXQoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRm9vPD8+PiB0cmVlcywgRCBkKSB7XG4iICsgCgkJCQkiCXJldHVybiBudWxsO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIFIgdGVzdChDb2xsZWN0aW9uPEJhcj4gYywgRCBkKSB7XG4iICsgCgkJCQkiCXJldHVybiB2aXNpdChjLCBkKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDU0MSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5NYXA7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgIE1hcCBtID0gbnVsbDtcbiIgKyAKCQkJCSIJIHRyeSB7XG4iICsgCgkJCQkiCSAgICAgTWFwIG0yID0gbS5nZXRDbGFzcygpLm5ld0luc3RhbmNlKCk7XG4iICsgCgkJCQkiCSB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7XG4iICsgCgkJCQkiCSB9XG4iICsgCgkJCQkiICAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDU0MigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglzdGF0aWMgPFQ+IGJvb2xlYW4gaXNPSyhUIHgpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBpc09LKHgpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXN0YXRpYyA8VD4gYm9vbGVhbiBpc1N0aWxsT0soVCB4KSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gdHJ1ZSAmJiBpc09LKHgpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXN0YXRpYyA8VD4gYm9vbGVhbiBpc05vTW9yZU9LKFQgeCkge1xuIiArIAoJCQkJIgkJcmV0dXJuIHRydWUgJiYgaXNOb01vcmVPSyh4KTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIglzdGF0aWMgPFQ+IGJvb2xlYW4gaXNPS0FnYWluKFQgeCkge1xuIiArIAoJCQkJIgkJYm9vbGVhbiByZXM7XG4iICsgCgkJCQkiCQlyZXR1cm4gdHJ1ZSAmJiAocmVzID0gaXNPS0FnYWluKHgpKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDU0MygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCU9iamVjdCBvYmogPSBudWxsO1xuIiArIAoJCQkJIgkJTGlzdDxTdHJpbmc+IGxzID0gKExpc3Q8U3RyaW5nPikgb2JqO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiICBab3JrIHo7XG4iICsKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkJIglMaXN0PFN0cmluZz4gbHMgPSAoTGlzdDxTdHJpbmc+KSBvYmo7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNhc3QgZnJvbSBPYmplY3QgdG8gTGlzdDxTdHJpbmc+IGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIExpc3RcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCVpvcmsgejtcbiIgKyAKCQkJIgleXl5eXG4iICsgCgkJCSJab3JrIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCglwdWJsaWMgdm9pZCB0ZXN0NTQ0KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlWZWN0b3I8SW50ZWdlcj4gYSA9IG5ldyBWZWN0b3I8SW50ZWdlcj4oKTtcbiIgKyAKCQkJCSIJCVZlY3RvciBiID0gbmV3IFZlY3RvcigpO1xuIiArIAoJCQkJIgkJYi5hZGQobmV3IE9iamVjdCgpKTtcbiIgKyAKCQkJCSIJCWEgPSBiO1xuIiArIAoJCQkJIgkJWm9yayB6O1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJCSIJYi5hZGQobmV3IE9iamVjdCgpKTtcbiIgKyAKCQkJIgleXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIG1ldGhvZCBhZGQoT2JqZWN0KSBiZWxvbmdzIHRvIHRoZSByYXcgdHlwZSBWZWN0b3IuIFJlZmVyZW5jZXMgdG8gZ2VuZXJpYyB0eXBlIFZlY3RvcjxFPiBzaG91bGQgYmUgcGFyYW1ldGVyaXplZFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIglhID0gYjtcbiIgKyAKCQkJIgkgICAgXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBleHByZXNzaW9uIG9mIHR5cGUgVmVjdG9yIG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG8gVmVjdG9yPEludGVnZXI+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkJIglab3JrIHo7XG4iICsgCgkJCSIJXl5eXlxuIiArIAoJCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2ODk4CglwdWJsaWMgdm9pZCB0ZXN0NTQ1KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiY2xhc3MgQiBleHRlbmRzIEE8T2JqZWN0PiB7XG4iICsgCgkJCQkiCXZvaWQgbTIoKSB7XG4iICsgCgkJCQkiCQltMygoWDIpIG0oKSk7ICAvLyBBPE9iamVjdD4ubSgpIC0tPiBYPD8gZXh0ZW5kcyBPYmplY3Q+IC0gY2Fubm90IGNhc3QgdG8gWDJcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgl2b2lkIG0zKFgyIGkpIHt9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEE8VD4ge1xuIiArIAoJCQkJIglYPD8gZXh0ZW5kcyBUPiBtKCkge1xuIiArIAoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgWDIgZXh0ZW5kcyBYPFN0cmluZz4ge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPiB7XG4iICsgCgkJCQkiCXZvaWQgZm9vKFg8U3RyaW5nPiBsaHMsIFg8PyBleHRlbmRzIE9iamVjdD4gcmhzKSB7XG4iICsgCgkJCQkiCQlsaHMgPSByaHM7IC8vIGNhbm5vdCBjb252ZXJ0XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBiYXIoWDIgbGhzLCBYPD8gZXh0ZW5kcyBPYmplY3Q+IHJocykge1xuIiArIAoJCQkJIgkJbGhzID0gcmhzOyAvLyBjYW5ub3QgY29udmVydFxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEMge1xuIiArIAoJCQkJIgl2b2lkIGZvbyhYPD8gZXh0ZW5kcyBPYmplY3Q+IHhvKSB7fVxuIiArIAoJCQkJIgl2b2lkIGJhcihYPFN0cmluZz4geHMpIHt9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEQgZXh0ZW5kcyBDIHtcbiIgKyAKCQkJCSIJdm9pZCBmb28oWDxTdHJpbmc+IHhzKSB7fVxuIiArIAoJCQkJIgl2b2lkIGJhcihYPD8gZXh0ZW5kcyBPYmplY3Q+IHhvKSB7fVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCW0zKChYMikgbSgpKTsgIC8vIEE8T2JqZWN0Pi5tKCkgLS0+IFg8PyBleHRlbmRzIE9iamVjdD4gLSBjYW5ub3QgY2FzdCB0byBYMlxuIiArIAoJCQkiCSAgIF5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNhc3QgZnJvbSBYPGNhcHR1cmUtb2YgPyBleHRlbmRzIE9iamVjdD4gdG8gWDIgaXMgYWN0dWFsbHkgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZXJhc2VkIHR5cGUgWDJcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxOClcbiIgKyAKCQkJIglsaHMgPSByaHM7IC8vIGNhbm5vdCBjb252ZXJ0XG4iICsgCgkJCSIJICAgICAgXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFg8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0PiB0byBYPFN0cmluZz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyMSlcbiIgKyAKCQkJIglsaHMgPSByaHM7IC8vIGNhbm5vdCBjb252ZXJ0XG4iICsgCgkJCSIJICAgICAgXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFg8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0PiB0byBYMlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNC4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDI5KVxuIiArIAoJCQkiCXZvaWQgZm9vKFg8U3RyaW5nPiB4cykge31cbiIgKyAKCQkJIgkgICAgIF5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJOYW1lIGNsYXNoOiBUaGUgbWV0aG9kIGZvbyhYPFN0cmluZz4pIG9mIHR5cGUgRCBoYXMgdGhlIHNhbWUgZXJhc3VyZSBhcyBmb28oWDw/IGV4dGVuZHMgT2JqZWN0Pikgb2YgdHlwZSBDIGJ1dCBkb2VzIG5vdCBvdmVycmlkZSBpdFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMwKVxuIiArIAoJCQkiCXZvaWQgYmFyKFg8PyBleHRlbmRzIE9iamVjdD4geG8pIHt9XG4iICsgCgkJCSIJICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIk5hbWUgY2xhc2g6IFRoZSBtZXRob2QgYmFyKFg8PyBleHRlbmRzIE9iamVjdD4pIG9mIHR5cGUgRCBoYXMgdGhlIHNhbWUgZXJhc3VyZSBhcyBiYXIoWDxTdHJpbmc+KSBvZiB0eXBlIEMgYnV0IGRvZXMgbm90IG92ZXJyaWRlIGl0XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJLy8gZW5zdXJlIG5vIHVuc2FmZSBjYXN0IHdhcm5pbmcgKGphdmFjIGluY29ycmVjdGx5IHJlcG9ydHMgb25lKQoJcHVibGljIHZvaWQgdGVzdDU0NigpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImNsYXNzIFN0cmluZ0xpc3QgZXh0ZW5kcyBqYXZhLnV0aWwuTGlua2VkTGlzdDxTdHJpbmc+IHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgU3RyaW5nPiBhID0gbmV3IFN0cmluZ0xpc3QoKTtcbiIgKyAKCQkJCSIgICAgICAgIGphdmEudXRpbC5MaXN0PFN0cmluZz4gYiA9IChTdHJpbmdMaXN0KSBhOyAgICAgIC8vIHdhcm5lZCBidXQgc2FmZS5cbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgIFpvcmsgejtcbiIgKwoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxKVxuIiArIAoJCQkiCWNsYXNzIFN0cmluZ0xpc3QgZXh0ZW5kcyBqYXZhLnV0aWwuTGlua2VkTGlzdDxTdHJpbmc+IHtcbiIgKyAKCQkJIgkgICAgICBeXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgc2VyaWFsaXphYmxlIGNsYXNzIFN0cmluZ0xpc3QgZG9lcyBub3QgZGVjbGFyZSBhIHN0YXRpYyBmaW5hbCBzZXJpYWxWZXJzaW9uVUlEIGZpZWxkIG9mIHR5cGUgbG9uZ1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJCSIJWm9yayB6O1xuIiArIAoJCQkiCV5eXl5cbiIgKyAKCQkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CglwdWJsaWMgdm9pZCB0ZXN0NTQ3KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgPEs+IFRyZWVNYXA8SyxLPiBlc3NhaShLIHR5cGUpIHtcbiIgKyAKCQkJCSIJCVRyZWVNYXA8SyxLPiB0cmVlTWFwID0gbmV3IFRyZWVNYXA8SyxLPigpO1xuIiArIAoJCQkJIgkJcmV0dXJuIHRyZWVNYXA7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkge1xuIiArIAoJCQkJIgkJWCB4ID0gbmV3IFgoKTtcbiIgKyAKCQkJCSIJCVRyZWVNYXA8Pyw/PiB0cmVlTWFwID0geC5lc3NhaShudWxsKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDU0OCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImludGVyZmFjZSBEQTxUPiB7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImludGVyZmFjZSBEQjxUPiBleHRlbmRzIERBPFQ+IHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiaW50ZXJmYWNlIERDPFQ+IGV4dGVuZHMgREE8SW50ZWdlcj4ge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCU9iamVjdCBvID0gKERDPD8+KSAoREE8Pz4pIG51bGw7XG4iICsgCgkJCQkiICBab3JrIHo7XG4iICsKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkJIglPYmplY3QgbyA9IChEQzw/PikgKERBPD8+KSBudWxsO1xuIiArIAoJCQkiCSAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIERBPGNhcHR1cmUtb2YgPz4gdG8gREM8Pz4gaXMgYWN0dWFsbHkgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZXJhc2VkIHR5cGUgRENcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJCSIJT2JqZWN0IG8gPSAoREM8Pz4pIChEQTw/PikgbnVsbDtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJVbm5lY2Vzc2FyeSBjYXN0IGZyb20gbnVsbCB0byBEQTw/PlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEwKVxuIiArIAoJCQkiCVpvcmsgejtcbiIgKyAKCQkJIgleXl5eXG4iICsgCgkJCSJab3JrIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy8gbGVnYWwsIGJ1dCBqYXZhYyByZWplY3RzIGl0CglwdWJsaWMgdm9pZCB0ZXN0NTQ5KCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxUPiB7XG4iICsgCgkJCQkiCWJvb2xlYW4gREVCVUcgPSB0aGlzIGluc3RhbmNlb2YgU3BlY2lhbDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyBjbGFzcyBTcGVjaWFsIGV4dGVuZHMgWDxTdHJpbmc+IHtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsKCX0JCglwdWJsaWMgdm9pZCB0ZXN0NTUwKCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiY2xhc3MgQSB7fVxuIiArIAoJCQkJImNsYXNzIEIgZXh0ZW5kcyBBIHt9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgPFUgZXh0ZW5kcyBCPiB2b2lkIGZvbyhYPD8gc3VwZXIgQT4gcGFyYW0pIHtcbiIgKyAKCQkJCSIgICAgICAgIFg8VT4gZm9vID0gKFg8VT4pcGFyYW07XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICBab3JrIHo7XG4iICsKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkJIglYPFU+IGZvbyA9IChYPFU+KXBhcmFtO1xuIiArIAoJCQkiCSAgICAgICAgICAgXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIFg8Y2FwdHVyZS1vZiA/IHN1cGVyIEE+IHRvIFg8VT4gaXMgYWN0dWFsbHkgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZXJhc2VkIHR5cGUgWFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJCSIJWm9yayB6O1xuIiArIAoJCQkiCV5eXl5cbiIgKyAKCQkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCS8vIGVuc3VyZSBubyB1bmNoZWNrZWQgd2FybmluZwoJcHVibGljIHZvaWQgdGVzdDU1MSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgPFQsIFUgZXh0ZW5kcyBULCBWIGV4dGVuZHMgVD4gVCBjb25kMShib29sZWFuIHosIFUgeDEsIFYgeDIpIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiAoej8gKFQpIHgxOiB4Mik7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgWm9yayB6O1xuIiArCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCVpvcmsgejtcbiIgKyAKCQkJIgleXl5eXG4iICsgCgkJCSJab3JrIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQoJcHVibGljIHZvaWQgdGVzdDU1MigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIglDb21wYXJhYmxlPD8+IHg7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXZvaWQgcHV0KENvbXBhcmFibGU8Pz4gYykge1xuIiArIAoJCQkJIgkJdGhpcy54ID0gYztcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIglDb21wYXJhYmxlPD8+IGdldCgpIHtcbiIgKyAKCQkJCSIJCXJldHVybiB4O1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXZvaWQgdGVzdCgpIHtcbiIgKyAKCQkJCSIJCVggY2kgPSBuZXcgWCgpO1xuIiArIAoJCQkJIgkJY2kucHV0KG5ldyBJbnRlZ2VyKDMpKTtcbiIgKyAKCQkJCSIJCUludGVnZXIgaSA9IChJbnRlZ2VyKSBjaS5nZXQoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsKCX0JCQkJCQoJcHVibGljIHZvaWQgdGVzdDU1MygpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24ge1xuIiArIAoJCQkJIiAgICAgIGRvSXQoKTtcbiIgKyAKCQkJCSIgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgIH1cbiIgKyAKCQkJCSIgICBwdWJsaWMgc3RhdGljIHZvaWQgZG9JdCgpIHtcbiIgKyAKCQkJCSIgICAgICBIb2xkZXI8SW50ZWdlcj4gYXNzb2NpYXRpb24gPSBuZXcgSG9sZGVyPEludGVnZXI+KG5ldyBJbnRlZ2VyKDApKTtcbiIgKyAKCQkJCSIgICAgICBJbnRlZ2VyIHNpemVIb2xkZXIgPSAoSW50ZWdlcikoYXNzb2NpYXRpb24uZ2V0VmFsdWUoKSk7IC8vQ2FzdCB0byBJbnRlZ2VyIGlzIHJlZHVuZGFudCEhIVxuIiArIAoJCQkJIiAgICAgIFN5c3RlbS5vdXQucHJpbnQoc2l6ZUhvbGRlci5pbnRWYWx1ZSgpKTtcbiIgKyAKCQkJCSIgICB9XG4iICsgCgkJCQkiICAgc3RhdGljIGNsYXNzIEhvbGRlcjxWPiB7XG4iICsgCgkJCQkiICAgICAgViB2YWx1ZTtcbiIgKyAKCQkJCSIgICAgICBIb2xkZXIoViB2YWx1ZSkge1xuIiArIAoJCQkJIiAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiIgKyAKCQkJCSIgICAgICB9XG4iICsgCgkJCQkiICAgICAgViBnZXRWYWx1ZSgpIHtcbiIgKyAKCQkJCSIgICAgICAgICByZXR1cm4gdmFsdWU7XG4iICsgCgkJCQkiICAgICAgfVxuIiArIAoJCQkJIiAgIH1cbiIgKyAKCQkJCSJ9XG4iCSwKCQkJfSwKCQkJIjBTVUNDRVNTIik7Cgl9CQkJCQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04Njg5OCAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDU1NCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJIiBpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkiIHB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJCSIgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJWDw/IGV4dGVuZHMgT2JqZWN0PiB4byA9IG51bGw7XG4iICsgCgkJCQkiCQlYPFN0cmluZz4geHMgPSBudWxsO1xuIiArIAoJCQkJIgkJWDIgeDIgPSBudWxsO1xuIiArIAoJCQkJIgkJXG4iICsgCgkJCQkiCQlPYmplY3QgbzEgPSAoWDxTdHJpbmc+KSB4bztcbiIgKyAKCQkJCSIJCU9iamVjdCBvMiA9IChYPD8gZXh0ZW5kcyBPYmplY3Q+KSB4cztcbiIgKyAKCQkJCSIJCU9iamVjdCBvMyA9IChYMikgeG87XG4iICsgCgkJCQkiCQlPYmplY3QgbzQgPSAoWDw/IGV4dGVuZHMgT2JqZWN0PikgeDI7XG4iICsgCgkJCQkiCQlPYmplY3QgbzUgPSAoWDM8U3RyaW5nPikgeG87XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWDIgZXh0ZW5kcyBYPFN0cmluZz4ge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBYMzxVPiBleHRlbmRzIFg8VT4ge1xuIiArIAoJCQkJIiAgIFpvcmsgejtcbiIgKwoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCU9iamVjdCBvMSA9IChYPFN0cmluZz4pIHhvO1xuIiArIAoJCQkiCSAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNhc3QgZnJvbSBYPGNhcHR1cmUtb2YgPyBleHRlbmRzIE9iamVjdD4gdG8gWDxTdHJpbmc+IGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIFhcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJCSIJT2JqZWN0IG8yID0gKFg8PyBleHRlbmRzIE9iamVjdD4pIHhzO1xuIiArIAoJCQkiCSAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVW5uZWNlc3NhcnkgY2FzdCBmcm9tIFg8U3RyaW5nPiB0byBYPD8gZXh0ZW5kcyBPYmplY3Q+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxMClcbiIgKyAKCQkJIglPYmplY3QgbzMgPSAoWDIpIHhvO1xuIiArIAoJCQkiCSAgICAgICAgICAgIF5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIFg8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0PiB0byBYMiBpcyBhY3R1YWxseSBjaGVja2luZyBhZ2FpbnN0IHRoZSBlcmFzZWQgdHlwZSBYMlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNC4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTEpXG4iICsgCgkJCSIJT2JqZWN0IG80ID0gKFg8PyBleHRlbmRzIE9iamVjdD4pIHgyO1xuIiArIAoJCQkiCSAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVW5uZWNlc3NhcnkgY2FzdCBmcm9tIFgyIHRvIFg8PyBleHRlbmRzIE9iamVjdD5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjUuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEyKVxuIiArIAoJCQkiCU9iamVjdCBvNSA9IChYMzxTdHJpbmc+KSB4bztcbiIgKyAKCQkJIgkgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIFg8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0PiB0byBYMzxTdHJpbmc+IGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIFgzXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI2LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTgpXG4iICsgCgkJCSIJWm9yayB6O1xuIiArIAoJCQkiCV5eXl5cbiIgKyAKCQkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCQkKCXB1YmxpYyB2b2lkIHRlc3Q1NTUoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSIgaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkJIiBwdWJsaWMgY2xhc3MgWDxVIGV4dGVuZHMgTnVtYmVyPiB7XG4iICsgCgkJCQkiIFUgdTtcbiIgKyAKCQkJCSIgdm9pZCBmb28oWDw/IGV4dGVuZHMgTnVtYmVyPiB4biwgWDw/IGV4dGVuZHMgVT4geHUpIHtcbiIgKyAKCQkJCSIJCXhuID0geHU7XG4iICsgCgkJCQkiCQl4dSA9IHhuO1xuIiArIAoJCQkJIgkJeHUudSA9IHhuLnU7IC8vIGtvXG4iICsgCgkJCQkiCQl4bi51ID0geHUudTsgLy8ga29cbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkJIgl4dSA9IHhuO1xuIiArIAoJCQkiCSAgICAgXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gWDxjYXB0dXJlLW9mID8gZXh0ZW5kcyBOdW1iZXI+IHRvIFg8PyBleHRlbmRzIFU+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIgl4dS51ID0geG4udTsgLy8ga29cbiIgKyAKCQkJIgkgICAgICAgXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBjYXB0dXJlLW9mID8gZXh0ZW5kcyBOdW1iZXIgdG8gY2FwdHVyZS1vZiA/IGV4dGVuZHMgVVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJCSIJeG4udSA9IHh1LnU7IC8vIGtvXG4iICsgCgkJCSIJICAgICAgIF5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gY2FwdHVyZS1vZiA/IGV4dGVuZHMgVSB0byBjYXB0dXJlLW9mID8gZXh0ZW5kcyBOdW1iZXJcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODcyNzMKCXB1YmxpYyB2b2lkIHRlc3Q1NTYoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImludGVyZmFjZSBGb28ge1xuIiArIAoJCQkJIglPYmplY3QgZ2V0KCk7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImludGVyZmFjZSBNeUxpc3Q8Rj4gZXh0ZW5kcyBGb28ge1xuIiArIAoJCQkJIglwdWJsaWMgRiBnZXQoKTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgTXlMaXN0SW1wbDxHPiBpbXBsZW1lbnRzIE15TGlzdDxHPiB7XG4iICsgCgkJCQkiCXB1YmxpYyBHIGdldCgpIHtcbiIgKyAKCQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsgCgkJCQkiCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJpbnRlcmZhY2UgU3RyaW5nTGlzdCBleHRlbmRzIE15TGlzdDxTdHJpbmc+IHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgU3RyaW5nTGlzdEltcGwgZXh0ZW5kcyBNeUxpc3RJbXBsPFN0cmluZz4gaW1wbGVtZW50cyBTdHJpbmdMaXN0IHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlGb28gZiA9IG5ldyBTdHJpbmdMaXN0SW1wbCgpO1xuIiArIAoJCQkJIgkJZi5nZXQoKTtcbiIgKwoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIlNVQ0NFU1MiKTsKCX0JCQkJCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODMwMDIKCXB1YmxpYyB2b2lkIHRlc3Q1NTcoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJc3RhdGljIDxUIGV4dGVuZHMgRXhjZXB0aW9uPiB2b2lkIGZvbyhUIHQpIHRocm93cyBUIHtcbiIgKyAvLyBlbnN1cmUgZXhjZXB0aW9uIGlzIHByb3Blcmx5IGVuY29kZWQgKC4uLl5leCkKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlkuamF2YSIsCgkJCQkiaW1wb3J0IGphdmEuaW8uKjtcbiIgKwoJCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKyAKCQkJCSIJdm9pZCBmb28oKSB7XG4iICsKCQkJCSIJCXRyeSB7XG4iICsKCQkJCSIJCQlYLmZvbyhuZXcgSU9FeGNlcHRpb24oKSk7XG4iICsKCQkJCSIJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7XG4iICsKCQkJCSIJCX1cbiIgKwoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIiIsCgkJCW51bGwsCgkJCWZhbHNlLAoJCQludWxsKTsKCX0KCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODMwMDIKCXB1YmxpYyB2b2lkIHRlc3Q1NTgoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJc3RhdGljIDxUIGV4dGVuZHMgRXhjZXB0aW9uLCBVIGV4dGVuZHMgRXhjZXB0aW9uPiB2b2lkIGZvbyhUIHQsIFUgdSkgdGhyb3dzIFQsIFUge1xuIiArIC8vIGVuc3VyZSBleGNlcHRpb24gaXMgcHJvcGVybHkgZW5jb2RlZCAoLi4uXmV4KQoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIiIpOwoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWS5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS5pby4qO1xuIiArCgkJCQkicHVibGljIGNsYXNzIFkge1xuIiArIAoJCQkJIgl2b2lkIGZvbygpIHtcbiIgKwoJCQkJIgkJdHJ5IHtcbiIgKwoJCQkJIgkJCVguZm9vKG5ldyBJT0V4Y2VwdGlvbigpLCBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpKTtcbiIgKwoJCQkJIgkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKXtcbiIgKwoJCQkJIgkJfSBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpe1xuIiArCgkJCQkiCQl9XG4iICsKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiLAoJCQludWxsLAoJCQlmYWxzZSwKCQkJbnVsbCk7Cgl9CgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjkwMgoJcHVibGljIHZvaWQgdGVzdDU1OSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImNsYXNzIENlbGw8VD4ge1xuIiArIAoJCQkJIglUIHQ7XG4iICsgCgkJCQkiCXB1YmxpYyB2b2lkIHNldFQoVCB0KSB7XG4iICsgCgkJCQkiCQl0aGlzLnQ9IHQ7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIFQgZ2V0VCgpIHtcbiIgKyAKCQkJCSIJCXJldHVybiB0O1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgIFpvcmsgejtcbiIgKwoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlDZWxsIGM9IG5ldyBDZWxsKCk7XG4iICsgCgkJCQkiCQljLnNldFQoQm9vbGVhbi5GQUxTRSk7IC8vamF2YWM6IHdhcm5pbmc6IFt1bmNoZWNrZWRdIHVuY2hlY2tlZFxuIiArIAoJCQkJIgkJCS8vIGNhbGwgdG8gc2V0VChUKSBhcyBhIG1lbWJlciBvZiB0aGUgcmF3IHR5cGUgcC5DZWxsXG4iICsgCgkJCQkiCQljLnQ9IEJvb2xlYW4uVFJVRTsgLy8gamF2YWM6IHdhcm5pbmc6IFt1bmNoZWNrZWRdIHVuY2hlY2tlZCBjYWxsXG4iICsgCgkJCQkiCQkJLy8gdG8gc2V0VChUKSBhcyBhIG1lbWJlciBvZiB0aGUgcmF3IHR5cGUgcC5DZWxsXG4iICsgCgkJCQkiCQlib29sZWFuIGIxPSAoQm9vbGVhbikgYy5nZXRUKCk7XG4iICsgCgkJCQkiCQlib29sZWFuIGIyPSAoQm9vbGVhbikgYy50O1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMilcbiIgKyAKCQkJIglab3JrIHo7XG4iICsgCgkJCSIJXl5eXlxuIiArIAoJCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxNSlcbiIgKyAKCQkJIgljLnNldFQoQm9vbGVhbi5GQUxTRSk7IC8vamF2YWM6IHdhcm5pbmc6IFt1bmNoZWNrZWRdIHVuY2hlY2tlZFxuIiArIAoJCQkiCV5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBtZXRob2Qgc2V0VChPYmplY3QpIGJlbG9uZ3MgdG8gdGhlIHJhdyB0eXBlIENlbGwuIFJlZmVyZW5jZXMgdG8gZ2VuZXJpYyB0eXBlIENlbGw8VD4gc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDE3KVxuIiArIAoJCQkiCWMudD0gQm9vbGVhbi5UUlVFOyAvLyBqYXZhYzogd2FybmluZzogW3VuY2hlY2tlZF0gdW5jaGVja2VkIGNhbGxcbiIgKyAKCQkJIgleXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZmllbGQgdCBmcm9tIHRoZSByYXcgdHlwZSBDZWxsIGlzIGFzc2lnbmVkIGEgdmFsdWUgb2YgdHlwZSBCb29sZWFuLiBSZWZlcmVuY2VzIHRvIGdlbmVyaWMgdHlwZSBDZWxsPFQ+IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODU5MjQKCXB1YmxpYyB2b2lkIHRlc3Q1NjAoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImludGVyZmFjZSBJQ29udHJvbGxlcjxVIGV4dGVuZHMgSVZpZXc8Pz4+ICB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBVIGdldFZpZXcoKSA7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImludGVyZmFjZSBJVmlldzxVPiAge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBNYXRHcm91cCAgIHtcbiIgKyAKCQkJCSIJcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBWaWV3IGltcGxlbWVudHMgSVZpZXc8U3RyaW5nPiB7XG4iICsgCgkJCQkiCQlwdWJsaWMgdm9pZCBzZXRUZW1wQXBwZWFyYW5jZSgpIHtcbiIgKyAKCQkJCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIglwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEN0cmw8VSBleHRlbmRzIFZpZXc+IGltcGxlbWVudHMgSUNvbnRyb2xsZXI8VT4gIHtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXWFyZ3MpIHtcbiIgKyAKCQkJCSIJCU1hdEdyb3VwLkN0cmw8Pz5jaGlsZHJlbltdID0geyBcbiIgKyAKCQkJCSIJCQkJbmV3IE1hdEdyb3VwLkN0cmw8TWF0R3JvdXAuVmlldz4oKXtcbiIgKyAKCQkJCSIJCQkJCXB1YmxpYyBNYXRHcm91cC5WaWV3IGdldFZpZXcoKSB7IHJldHVybiBuZXcgTWF0R3JvdXAuVmlldygpe307IH0JXG4iICsgCgkJCQkiCQkJCX19IDtcbiIgKyAKCQkJCSIJICAgIGZvcihNYXRHcm91cC5DdHJsPD8+IGdsbWF0OiBjaGlsZHJlbikge1xuIiArIAoJCQkJIgkJCWdsbWF0LmdldFZpZXcoKS5zZXRUZW1wQXBwZWFyYW5jZSgpIDtcbiIgKyAKCQkJCSIJICAgIH1cbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIik7Cgl9CgoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODc5NTYKCXB1YmxpYyB2b2lkIHRlc3Q1NjEoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJdm9pZCBmb28oQTxTdHJpbmc+IGEpIHt9XG4iICsgCgkJCQkiCU9iamVjdCBmb28oQTxJbnRlZ2VyPiBhKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkiCSB2b2lkIHRlc3QoQTxJbnRlZ2VyPiBhKSB7IGZvbyhhKTsgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBBPFQ+IHt9XG4iLAoJCQl9LAoJCQkiIgoJCSk7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJTnVtYmVyIGZvbyhBPFN0cmluZz4gYSkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkJIglJbnRlZ2VyIGZvbyhBPEludGVnZXI+IGEpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSIJdm9pZCB0ZXN0KEE8SW50ZWdlcj4gYSkgeyBmb28oYSk7IH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQTxUPiB7fVxuIiwKCQkJfSwKCQkJIiIKCQkpOwoJfQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODc1NTAKCXB1YmxpYyB2b2lkIHRlc3Q1NjIoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJpbnRlcmZhY2UgSW50ZXI8QSwgQj4ge31cbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWDxULCBVLCBWIGV4dGVuZHMgWDxULCBVLCBWPj4gZXh0ZW5kcyBBcnJheUxpc3Q8Vj4gaW1wbGVtZW50cyBJbnRlcjxULCBVPiB7XG4iICsgCgkJCQkiCXB1YmxpYyBmaW5hbCB2b2lkIGZvbyhVIHUpIHtcbiIgKyAKCQkJCSIJCVguYmFyKHRoaXMsIHUpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgZmluYWwgPFAsIFE+IHZvaWQgYmFyKENvbGxlY3Rpb248PyBleHRlbmRzIEludGVyPFAsIFE+PiBjLCBRIHEpIHt9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIiIpOwkKCX0JCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NzU1MCAtIHZhcmlhdGlvbgkKCXB1YmxpYyB2b2lkIHRlc3Q1NjMoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJpbnRlcmZhY2UgSW50ZXI8QSwgQj4ge31cbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWDxULCBVLCBWIGV4dGVuZHMgWDxULCBVLCBWPj4gZXh0ZW5kcyBBcnJheUxpc3Q8Vj4gaW1wbGVtZW50cyBJbnRlcjxULCBVPiB7XG4iICsgCgkJCQkiCXB1YmxpYyBmaW5hbCB2b2lkIGZvbyhVIHUpIHtcbiIgKyAKCQkJCSIJCVguYmFyKHRoaXMsIHUpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgZmluYWwgPFAsIFEsIFI+IHZvaWQgYmFyKENvbGxlY3Rpb248Uj4gYywgUSBxKSB7fVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsJCgl9CgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NzU1MCAtIHZhcmlhdGlvbgkKCXB1YmxpYyB2b2lkIHRlc3Q1NjQoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJpbnRlcmZhY2UgSW50ZXI8QSwgQj4ge31cbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWDxULCBVLCBWIGV4dGVuZHMgWDxULCBVLCBWPj4gZXh0ZW5kcyBBcnJheUxpc3Q8Vj4gaW1wbGVtZW50cyBJbnRlcjxULCBVPiB7XG4iICsgCgkJCQkiCXB1YmxpYyBmaW5hbCB2b2lkIGZvbyhVIHUpIHtcbiIgKyAKCQkJCSIJCVguYmFyKHRoaXMsIHUpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgZmluYWwgPFAsIFE+IHZvaWQgYmFyKENvbGxlY3Rpb248PyBleHRlbmRzIEludGVyPFAsIFE+PiBjLCBRIHEpIHt9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIiIpOwkKCX0JCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04Nzk5NQktIGNoZWNrIG5vIHdhcm5pbmcKCXB1YmxpYyB2b2lkIHRlc3Q1NjUoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiaW50ZXJmYWNlIElGb288VD4ge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgVCBnZXQoQ2xhc3M8VD4gY2xhenopO1xuIiArIAoJCQkJIiAgIFpvcmsgejtcbiIgKwoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBCYXIgaW1wbGVtZW50cyBJRm9vPEludGVnZXI+IHtcbiIgKyAKCQkJCSIgICAgcHVibGljIEludGVnZXIgZ2V0KENsYXNzPEludGVnZXI+IGFyZzApIHtcbiIgKyAKCQkJCSIgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcigzKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJWm9yayB6O1xuIiArIAoJCQkiCV5eXl5cbiIgKyAKCQkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7CQoJfQkKCXB1YmxpYyB2b2lkIHRlc3Q1NjYoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgl2b2lkIGJhcjIoKSB7XG4iICsgCgkJCQkiCQlMaXN0PFgxPiBsZSA9IG5ldyBBcnJheUxpc3Q8WDE+KDUpO1xuIiArIAoJCQkJIgkJbGUgPSBmaWxsKGxlLCBuZXcgWDIoKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJPFQ+IExpc3Q8VD4gZmlsbChMaXN0PD8gc3VwZXIgVD4gbHQsIFQgdCkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBYMSB7fVxuIiArIAoJCQkJImNsYXNzIFgyIGV4dGVuZHMgWDEge1xuIiArIAoJCQkJIgl2b2lkIGZvbygpe31cbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJCSIJbGUgPSBmaWxsKGxlLCBuZXcgWDIoKSk7XG4iICsgCgkJCSIJICAgICBeXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gTGlzdDxYMj4gdG8gTGlzdDxYMT5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwkKCX0JCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODk0NTQKCXB1YmxpYyB2b2lkIHRlc3Q1NjcoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJUaHJvd2VyLmphdmEiLAoJCQkJInB1YmxpYyBpbnRlcmZhY2UgVGhyb3dlcjxFIGV4dGVuZHMgRXhjZXB0aW9uPiB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyB2b2lkIHRocm93SXQoKSB0aHJvd3MgRTtcbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiIik7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJHZW5lcmljc1Rlc3QuamF2YSIsCgkJCQkicHVibGljIGNsYXNzIEdlbmVyaWNzVGVzdCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBNeUV4Y2VwdGlvbiB7XG4iICsgCgkJCQkiICAgICAgICBUaHJvd2VyPE15RXhjZXB0aW9uPiB0aHJvd2VyID0gbmV3IFRocm93ZXI8TXlFeGNlcHRpb24+KCkge1xuIiArIAoJCQkJIiAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRocm93SXQoKSB0aHJvd3MgTXlFeGNlcHRpb24ge1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTXlFeGNlcHRpb24oKTtcbiIgKyAKCQkJCSIgICAgICAgICAgICB9XG4iICsgCgkJCQkiICAgICAgICB9O1xuIiArIAoJCQkJIiAgICAgICAgdHJ5IHtcbiIgKyAKCQkJCSIgICAgICAgICAgIHRocm93ZXIudGhyb3dJdCgpO1xuIiArIAoJCQkJIiAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkge1xuIiArIAoJCQkJIiAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkJIiAgICAgICAgfVxuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIE15RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHtcbiIgKyAKCQkJCSJ9XG4iLAoJCQl9LAoJCQkiU1VDQ0VTUyIsCgkJCW51bGwsCgkJCWZhbHNlLAoJCQludWxsKTsKCX0JCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04OTQ0OAoJcHVibGljIHZvaWQgdGVzdDU2OCgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7XG4iICsgCgkJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIiAgICAgICAgQXJyYXlMaXN0PEFycmF5TGlzdDxMb25nPj4gbiA9IG5ldyBBcnJheUxpc3Q8QXJyYXlMaXN0PExvbmc+PigpO1xuIiArIAoJCQkJIiAgICAgICAgQXJyYXlMaXN0PExvbmc+IGFyciA9IG5ldyBBcnJheUxpc3Q8TG9uZz4oKTtcbiIgKyAKCQkJCSIgICAgICAgIGFyci5hZGQobmV3IExvbmcoNSkpO1xuIiArIAoJCQkJIiAgICAgICAgbi5hZGQoYXJyKTtcbiIgKyAKCQkJCSIgICAgICAgIFxuIiArIAoJCQkJIiAgICAgICAgTGlzdDw/IGV4dGVuZHMgTGlzdDxMb25nPj4gbSA9IG47IC8vIFdob2EhXG4iICsgCgkJCQkiICAgICAgICBcbiIgKyAKCQkJCSIgICAgICAgIGZvcihMb25nIGwgOiBtLmdldCgwKSkge1xuIiArIAoJCQkJIiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihsKTtcbiIgKyAKCQkJCSIgICAgICAgIH1cbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSI1Iik7CQoJfQkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg5Nzc4CglwdWJsaWMgdm9pZCB0ZXN0NTY5KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFhcbiIgKyAKCQkJCSJ7XG4iICsgCgkJCQkiICAgIHByb3RlY3RlZCBzdGF0aWMgPFQgZXh0ZW5kcyBFeGNlcHRpb24+IHZvaWQgZm9vKCkgdGhyb3dzIFQsIEV4Y2Uge1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCXByb3RlY3RlZCBzdGF0aWMgPFQgZXh0ZW5kcyBFeGNlcHRpb24+IHZvaWQgZm9vKCkgdGhyb3dzIFQsIEV4Y2Uge1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5cbiIgKyAKCQkJIkV4Y2UgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7CQoJfQkJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDE0NwoJcHVibGljIHZvaWQgdGVzdDU3MCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFQgZXh0ZW5kcyBPYmplY3Q+IHtcbiIgKyAKCQkJCSIgIHB1YmxpYyBjbGFzcyBJbm5lckNsYXNzIGltcGxlbWVudHMgQ29tcGFyYWJsZTxUPiB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKFQgb3RoZXIpIHtcbiIgKyAKCQkJCSIgICAgICByZXR1cm4gLTE7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgIH1cbiIgKyAKCQkJCSIgIFxuIiArIAoJCQkJIiAgcHVibGljIHZvaWQgZm9vKCkge1xuIiArIAoJCQkJIiAgICBJbm5lckNsYXNzIGEgPSBuZXcgSW5uZXJDbGFzcygpO1xuIiArIAoJCQkJIiAgICBJbm5lckNsYXNzIGIgPSBuZXcgSW5uZXJDbGFzcygpO1xuIiArIAoJCQkJIiAgICAvLyBUaGUgZm9sbG93aW5nIGxpbmUgZG9lcyBub3QgY29tcGlsZSAoYW55bW9yZSk6XG4iICsgCgkJCQkiICAgIGEuY29tcGFyZVRvKGIpO1xuIiArIAoJCQkJIiAgfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTIpXG4iICsgCgkJCSIJYS5jb21wYXJlVG8oYik7XG4iICsgCgkJCSIJICBeXl5eXl5eXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgY29tcGFyZVRvKFQpIGluIHRoZSB0eXBlIFg8VD4uSW5uZXJDbGFzcyBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoWDxUPi5Jbm5lckNsYXNzKVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7CQoJfQoJcHVibGljIHZvaWQgdGVzdDU3MSgpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW50ZXJmYWNlIElGb28ge1xuIiArIAoJCQkJIgl2b2lkIGZvbygpO1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBCb3g8VCBleHRlbmRzIElGb28+IHtcbiIgKyAKCQkJCSIJVCB2YWx1ZSgpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBudWxsO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImludGVyZmFjZSBJQmFyIHtcbiIgKyAKCQkJCSIJdm9pZCBiYXIoKTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIgl2b2lkIHRlc3QxKEJveDw/PiBib3gpIHtcbiIgKyAKCQkJCSIJCWJveC52YWx1ZSgpLmZvbygpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXZvaWQgdGVzdDIoQm94PD8gZXh0ZW5kcyBJQmFyPiBib3gpIHtcbiIgKyAKCQkJCSIJCWJveC52YWx1ZSgpLmZvbygpO1xuIiArIAoJCQkJIgkJYm94LnZhbHVlKCkuYmFyKCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSJTVUNDRVNTIik7CQoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwNDMwCglwdWJsaWMgdm9pZCB0ZXN0NTcyKCkgewoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyA8VCBleHRlbmRzIEVudW08VD4+IHZvaWQgZG9XaXRoRW51bUNsYXNzKENsYXNzPFQ+IGVudW1DbGFzcykge1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXB1YmxpYyB2b2lkIGYoKSB7XG4iICsgCgkJCQkiCQlDbGFzczw/PiBjbCA9IG51bGw7IC8vIFJldHVybmVkIGJ5IENsYXNzLmZvck5hbWUoXCJ4eXpcIik7XG4iICsgCgkJCQkiCQlkb1dpdGhFbnVtQ2xhc3MoKENsYXNzPEVudW0+KSBjbCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJIn1cbiIsCgkJCX0sCgkJCSIiKTsJCgl9CQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDQzMCAtIGNoZWNrIHVuY2hlY2tlZCB3YXJuaW5ncwoJcHVibGljIHZvaWQgdGVzdDU3MygpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJcHVibGljIDxUIGV4dGVuZHMgRW51bTxUPj4gdm9pZCBkb1dpdGhFbnVtQ2xhc3MoQ2xhc3M8VD4gZW51bUNsYXNzKSB7XG4iICsgCgkJCQkiCQlab3JrIHo7XG4iICsKCQkJCSIJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgdm9pZCBmKCkge1xuIiArIAoJCQkJIgkJQ2xhc3M8Pz4gY2wgPSBudWxsOyAvLyBSZXR1cm5lZCBieSBDbGFzcy5mb3JOYW1lKFwieHl6XCIpO1xuIiArIAoJCQkJIgkJZG9XaXRoRW51bUNsYXNzKChDbGFzczxFbnVtPikgY2wpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCSJ9XG4iLAoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJWm9yayB6O1xuIiArIAoJCQkiCV5eXl5cbiIgKyAKCQkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkJIglkb1dpdGhFbnVtQ2xhc3MoKENsYXNzPEVudW0+KSBjbCk7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVW5jaGVja2VkIGludm9jYXRpb24gZG9XaXRoRW51bUNsYXNzKENsYXNzPEVudW0+KSBvZiB0aGUgZ2VuZXJpYyBtZXRob2QgZG9XaXRoRW51bUNsYXNzKENsYXNzPFQ+KSBvZiB0eXBlIFhcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJCSIJZG9XaXRoRW51bUNsYXNzKChDbGFzczxFbnVtPikgY2wpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGNhc3QgZnJvbSBDbGFzczxjYXB0dXJlLW9mID8+IHRvIENsYXNzPEVudW0+IGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIENsYXNzXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsJCgl9CQkJCgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA0MjMgLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIF90ZXN0NTc0KCkgewoJCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJY2xhc3MgQzIge1xuIiArIAoJCQkJIgkJPFQgZXh0ZW5kcyBJbnRlZ2VyPiBUIGZvbyhPYmplY3QgbykgeyAgcmV0dXJuIG51bGw7IH0gLy8gb2tcbiIgKyAKCQkJCSIJCTxUIGV4dGVuZHMgU3RyaW5nPiBUIGZvbyhPYmplY3QgbykgeyAgcmV0dXJuIG51bGw7IH0gLy8gb2tcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQluZXcgWCgpLm5ldyBDMigpLmZvbygoTGlzdDxTdHJpbmc+KSBudWxsKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJImNvbXBsYWluIGFib3V0IGFtYmlndWl0eSIpOwoJfQkKCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDQ5NiAtIHZhcmlhdGlvbiB3aXRoIGZpZWxkIHJlZgoJcHVibGljIHZvaWQgdGVzdDU3NSgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIiAgICAgICAgRm9vPD8+IGYxID0gbmV3IEZvbzxJbnRlZ2VyPigpO1xuIiArIAoJCQkJIiAgICAgICAgKGYxKS5iYXIgPSAoZjEpLmJhcjtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBzdGF0aWMgY2xhc3MgRm9vPFQ+IHtcbiIgKyAKCQkJCSIgICAgICAgQmFyPFQ+IGJhciA9IG5ldyBCYXI8VD4oKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICBzdGF0aWMgY2xhc3MgQmFyPFQ+IHtcbiIgKyAKCQkJCSIgICAgICAgIFQgdDtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCShmMSkuYmFyID0gKGYxKS5iYXI7XG4iICsgCgkJCSIJICAgICAgICAgICBeXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBYLkJhcjxjYXB0dXJlLW9mID8+IHRvIFguQmFyPGNhcHR1cmUtb2YgPz5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg0NDk2IC0gdmFyaWF0aW9uIHdpdGggc2luZ2xlIHJlZgoJcHVibGljIHZvaWQgdGVzdDU3NigpIHsKCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCQluZXcgU3RyaW5nW10gewoJCQkJIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgICAgICBGb288Pz4gZjEgPSBuZXcgRm9vPEludGVnZXI+KCk7XG4iICsgCgkJCQkiICAgICAgICBGb288Pz4gZjIgPSBuZXcgRm9vPFN0cmluZz4oKTtcbiIgKyAKCQkJCSIJCWYxID0gZjE7XG4iICsgCgkJCQkiCQlmMSA9IGYyO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHN0YXRpYyBjbGFzcyBGb288VD4ge1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiIik7Cgl9CgkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODQ0OTYgLSB2YXJpYXRpb24gd2l0aCBxdWFsaWZpZWQgbmFtZSByZWYKCXB1YmxpYyB2b2lkIHRlc3Q1NzcoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIEZvbzw/PiBmMSA9IG5ldyBGb288SW50ZWdlcj4oKTtcbiIgKyAKCQkJCSIgICAgICAgIChmMSkuYmFyID0gZjEuYmFyO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHN0YXRpYyBjbGFzcyBGb288VD4ge1xuIiArIAoJCQkJIiAgICAgICBCYXI8VD4gYmFyID0gbmV3IEJhcjxUPigpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIHN0YXRpYyBjbGFzcyBCYXI8VD4ge1xuIiArIAoJCQkJIiAgICAgICAgVCB0O1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJKGYxKS5iYXIgPSBmMS5iYXI7XG4iICsgCgkJCSIJICAgICAgICAgICBeXl5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gWC5CYXI8Y2FwdHVyZS1vZiA/PiB0byBYLkJhcjxjYXB0dXJlLW9mID8+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCgkvLyBjaGVjayBhcnJheSBib3VuZCBmb3Igd2lsZGNhcmQKCXB1YmxpYyB2b2lkIHRlc3Q1NzgoKSB7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJdm9pZCBmb28oQm94PD8gZXh0ZW5kcyBpbnRbXT4gYm94KSB7XG4iICsgCgkJCQkiCQlpbnRbXSBpbnRzID0gYm94LmdldCgpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIEJveDxUPiB7XG4iICsgCgkJCQkiCVQgZ2V0KCkgeyByZXR1cm4gbnVsbDsgfVxuIiArIAoJCQkJIn1cbiIKCQkJfSwKCQkJIiIpOwoJfQkJCgkvLyBjaGVjayBhcnJheSBib3VuZCBmb3Igd2lsZGNhcmQKCXB1YmxpYyB2b2lkIHRlc3Q1NzkoKSB7CgkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXZvaWQgZm9vKEJveDw/IHN1cGVyIGludFtdPiBib3gpIHtcbiIgKyAKCQkJCSIJCWludFtdIGludHMgPSBib3guZ2V0KCk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgQm94PFQ+IHtcbiIgKyAKCQkJCSIJVCBnZXQoKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkifVxuIgoJCQl9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJCSIJaW50W10gaW50cyA9IGJveC5nZXQoKTtcbiIgKyAKCQkJIgkgICAgICBeXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIGNhcHR1cmUtb2YgPyBzdXBlciBpbnRbXSB0byBpbnRbXVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCS8vIGNoZWNrIGFycmF5IGJvdW5kIGZvciB3aWxkY2FyZAoJcHVibGljIHZvaWQgdGVzdDU4MCgpIHsKCQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJdm9pZCBmb28oQm94PD8+IGJveCkge1xuIiArIAoJCQkJIgkJaW50W10gaW50cyA9IGJveC5nZXQoKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBCb3g8VD4ge1xuIiArIAoJCQkJIglUIGdldCgpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJCSJ9XG4iCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkJIglpbnRbXSBpbnRzID0gYm94LmdldCgpO1xuIiArIAoJCQkiCSAgICAgIF5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gY2FwdHVyZS1vZiA/IHRvIGludFtdXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODQ0OTYgLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3Q1ODEoKSB7CgkgICAgdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkgICAgICAgICAgICAiWC5qYXZhIiwKCSAgICAgICAgICAgICJjbGFzcyBYIHsiICsKCSAgICAgICAgICAgICIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwoJICAgICAgICAgICAgIiAgICBGb288Pz4gZjEgPSBuZXcgRm9vPEludGVnZXI+KCk7XG4iICsKCSAgICAgICAgICAgICIgICAgZjEuYmFyID0gZjEuYmFyO1xuIiArCgkgICAgICAgICAgICAiICAgfVxuIiArCgkgICAgICAgICAgICAiIH1cbiIgKwoJICAgICAgICAgICAgImNsYXNzIEZvbzxUPiB7XG4iICsKCSAgICAgICAgICAgICIgIEJhcjxUPiBiYXIgPSBuZXcgQmFyPFQ+KCk7XG4iICsKCSAgICAgICAgICAgICJ9XG4iICsKCSAgICAgICAgICAgICJjbGFzcyBCYXI8VD4ge1xuIiArCgkgICAgICAgICAgICAiICBUIHQ7XG4iICsKCSAgICAgICAgICAgICJ9XG4iCgkgICAJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkJIglmMS5iYXIgPSBmMS5iYXI7XG4iICsgCgkJCSIJICAgICAgICAgXl5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIEJhcjxjYXB0dXJlLW9mID8+IHRvIEJhcjxjYXB0dXJlLW9mID8+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsgICAgICAgICAgICAKCX0KCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDQ5NgoJcHVibGljIHZvaWQgdGVzdDU4MigpIHsKCSAgICB0aGlzLnJ1bkNvbmZvcm1UZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCiAgICAgICAgICAgICAgICAiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArCiAgICAgICAgICAgICAgICAiY2xhc3MgWCB7XG4iICsKICAgICAgICAgICAgICAgICIgIHZvaWQgZm9vKExpc3Q8PyBleHRlbmRzIEkxPiBsMSkge1xuIiArCiAgICAgICAgICAgICAgICAiICAgIEMxIGMxID0gKEMxKWwxLmdldCgwKTtcbiIgKwogICAgICAgICAgICAgICAgIiAgfVxuIiArCiAgICAgICAgICAgICAgICAifVxuIiArCiAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIEkxe31cbiIgKwogICAgICAgICAgICAgICAgImNsYXNzIEMxe31cbiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIiIpOwoJfQoJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTAyMQoJcHVibGljIHZvaWQgdGVzdDU4MygpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJImNsYXNzIEQ8VT4ge1xuIiArIAoJCQkJIgkJIHB1YmxpYyBEIChEPFU+IGFub3RoZXJEKSB7XG4iICsgCgkJCQkiCQkgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWDxTPiB7XG4iICsgCgkJCQkiCQkgcHVibGljIHN0YXRpYyBjbGFzcyBDPFQ+IHtcbiIgKyAKCQkJCSIJCSAJCSBwdWJsaWMgQyhDPFQ+IGFub3RoZXJDKSB7XG4iICsgCgkJCQkiCQkgCQkgfVxuIiArIAoJCQkJIgkJIH1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJCSBwdWJsaWMgdm9pZCBtRChEPFM+IGQpIHtcbiIgKyAKCQkJCSIJCSAJCSAvL3RoZSBmb2xsb3dpbmcgbGluZSBpcyBPSyAobm8gd2FybmluZyByZXBvcnRlZClcbiIgKyAKCQkJCSIJCSAJCSBuZXcgRDxTPihkKTtcbiIgKyAKCQkJCSIJCSB9XG4iICsgCgkJCQkiCQkgXG4iICsgCgkJCQkiCQkgcHVibGljIHZvaWQgbUMoQzxTPiBjKSB7XG4iICsgCgkJCQkiCQkgCQkgLyogdHlwZSBzYWZldHkgd2FybmluZ1xuIiArIAoJCQkJIgkJIAkJICAqIChUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIFguQzxTPlxuIiArIAoJCQkJIgkJIAkJICAqIG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG9cbiIgKyAKCQkJCSIJCSAJCSAgKiBYU0I8Uz4uQzxTPilcbiIgKyAKCQkJCSIJCSAJCSAgKi9cbiIgKyAKCQkJCSIJCSAJCSBuZXcgQzxTPihjKTtcbiIgKyAKCQkJCSIJCSB9XG4iICsgCgkJCQkiCQlab3JrIHo7XG4iICsKCQkJCSJ9XG4iCiAgICAgICAgICAgIH0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMjUpXG4iICsgCgkJCSIJWm9yayB6O1xuIiArIAoJCQkiCV5eXl5cbiIgKyAKCQkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQoJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTAxNwoJcHVibGljIHZvaWQgdGVzdDU4NCgpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0O1xuIiArIAoJCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCQkgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJIAkJIExpc3Q8U3RyaW5nPiBzdHJpbmdMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7XG4iICsgCgkJCQkiCQkgCQkgc3RyaW5nTGlzdC5hZGQoXCJmb29cIik7XG4iICsgCgkJCQkiCQkgCQkgTGlzdDxJbnRlZ2VyPiBpbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpO1xuIiArIAoJCQkJIgkJIAkJIGludExpc3QuYWRkKDEpO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgkJIAkJIExpc3Q8Pz4gdW50eXBlZExpc3QgPSBzdHJpbmdMaXN0O1xuIiArIAoJCQkJIgkJIAkJIExpc3Q8Pz4gdW50eXBlZExpc3QyID0gaW50TGlzdDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJCSAJCSAvL2NvcnJlY3RseSBmbGFnZ2VkIGFzIGVycm9yOiB1bnR5cGVkTGlzdC5hZGQobmV3IE9iamVjdCgpKTtcbiIgKyAKCQkJCSIJCSAJCSAvL2RpdHRvOiB1bnR5cGVkTGlzdC5hZGQodW50eXBlZExpc3QyLmdldCgwKSk7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCQkgCQkgLy9idXQgdGhpcyBpcyBub3QgZmxhZ2dlZCBhdCBhbGwgYnkgZWNsaXBzZTpcbiIgKyAKCQkJCSIJCSAJCSB1bnR5cGVkTGlzdC5hZGRBbGwodW50eXBlZExpc3QyKTtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJCSAJCSBmb3IoU3RyaW5nIHMgOiBzdHJpbmdMaXN0KXtcbiIgKyAKCQkJCSIJCSAJCSAJCSAvL25leHQgbGluZSBnZW5lcmF0ZXMgcnVudGltZSBDbGFzc0Nhc3RFeGNlcHRpb25cbiIgKyAKCQkJCSIJCSAJCSAJCSBMb2dnZXIubG9nKFwiVGVzdF9MaXN0cy5tYWluOiBzOiBcIiArIHMpO1xuIiArIAoJCQkJIgkJIAkJIH1cbiIgKyAKCQkJCSIJCSB9XG4iICsgCgkJCQkifVxuIgogICAgICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDE4KVxuIiArIAoJCQkiCXVudHlwZWRMaXN0LmFkZEFsbCh1bnR5cGVkTGlzdDIpO1xuIiArIAoJCQkiCSAgICAgICAgICAgIF5eXl5eXlxuIiArIAoJCQkiVGhlIG1ldGhvZCBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgY2FwdHVyZS1vZiA/PikgaW4gdGhlIHR5cGUgTGlzdDxjYXB0dXJlLW9mID8+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChMaXN0PGNhcHR1cmUtb2YgPz4pXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMjIpXG4iICsgCgkJCSIJTG9nZ2VyLmxvZyhcIlRlc3RfTGlzdHMubWFpbjogczogXCIgKyBzKTtcbiIgKyAKCQkJIgleXl5eXl5cbiIgKyAKCQkJIkxvZ2dlciBjYW5ub3QgYmUgcmVzb2x2ZWRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwODgxCglwdWJsaWMgdm9pZCB0ZXN0NTg1KCkgewoJICAgIHRoaXMucnVuTmVnYXRpdmVUZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgT3V0ZXIuQ29tcGFyYXRvcjxTdHJpbmc+IGkgPSBuZXcgT3V0ZXIuQ29tcGFyYXRvcjxTdHJpbmc+KCkge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIiAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhTdHJpbmcgYSwgU3RyaW5nIGIpIHtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiIgKyAKCQkJCSIgICAgICAgICAgICAgICAgICAgICAgICB9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGludCBoYXNoQ29kZShTdHJpbmcgYSkge1xuIiArIAoJCQkJIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4iICsgCgkJCQkiICAgICAgICAgICAgICAgICAgICAgICAgfVxuIiArIAoJCQkJIiAgICAgICAgICAgICAgICB9O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIiAgICAgICAgfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBPdXRlciB7fVxuIiwKICAgICAgICAgICAgfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCU91dGVyLkNvbXBhcmF0b3I8U3RyaW5nPiBpID0gbmV3IE91dGVyLkNvbXBhcmF0b3I8U3RyaW5nPigpIHtcbiIgKyAKCQkJIgleXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJPdXRlci5Db21wYXJhdG9yIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCU91dGVyLkNvbXBhcmF0b3I8U3RyaW5nPiBpID0gbmV3IE91dGVyLkNvbXBhcmF0b3I8U3RyaW5nPigpIHtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJPdXRlci5Db21wYXJhdG9yIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQoJCgkvL2phdmFjIGluY29ycmVjdGx5IHJlamVjdHMgaXQKCXB1YmxpYyB2b2lkIHRlc3Q1ODYoKSB7CgkgICAgdGhpcy5ydW5Db25mb3JtVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIgICAgc3RhdGljIGNsYXNzIEJCPFQsIFM+IHsgfVxuIiArIAoJCQkJIiAgICBzdGF0aWMgY2xhc3MgQkQ8VD4gZXh0ZW5kcyBCQjxULCBUPiB7IH1cbiIgKyAKCQkJCSIgICAgdm9pZCBmKCkge1xuIiArIAoJCQkJIiAgICAgICAgQkI8PyBleHRlbmRzIE51bWJlciwgPyBzdXBlciBJbnRlZ2VyPiBiYiA9IG51bGw7XG4iICsgCgkJCQkiICAgICAgICBPYmplY3QgbyA9IChCRDxOdW1iZXI+KSBiYjtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIn1cbiIsCiAgICAgICAgICAgIH0sCgkJCSIiKTsKCX0JCQkKCQoJcHVibGljIHZvaWQgdGVzdDU4NygpIHsKCSAgICB0aGlzLnJ1bkNvbmZvcm1UZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkiaW50ZXJmYWNlIERBPFQ+IHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiaW50ZXJmYWNlIERCPFQ+IGV4dGVuZHMgREE8VD4ge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJpbnRlcmZhY2UgREM8VD4gZXh0ZW5kcyBEQTxJbnRlZ2VyPiB7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJT2JqZWN0IG8gPSAoREM8Pz4pIChEQTw/PikgbnVsbDtcbiIgKyAKCQkJCSJ9XG4iLAogICAgICAgICAgICB9LAoJCQkiIik7Cgl9CQkJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDQzMwoJcHVibGljIHZvaWQgdGVzdDU4OCgpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFMgZXh0ZW5kcyBDb21wYXJhYmxlPFM+PiB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyB2b2lkIGYoKSB7XG4iICsgCgkJCQkiICAgICAgICBDbGFzczxTPiBjdXJyZW50Q2xhc3MgPSBudWxsO1xuIiArIAoJCQkJIiAgICAgICAgYm9vbGVhbiBiID0gY3VycmVudENsYXNzID09IExvbmcuY2xhc3M7XG4iICsgLy8gbm90IHByb3ZhYmx5IGRpc3RpbmN0IHR5cGVzCgkJCQkiCQlcbiIgKyAKCQkJCSIJCWJvb2xlYW4gYyA9IFguY2xhc3MgPT0gTG9uZy5jbGFzcztcbiIgKyAvLyBwcm92YWJseSBkaXN0aW5jdCB0eXBlcwoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCQkiCWJvb2xlYW4gYyA9IFguY2xhc3MgPT0gTG9uZy5jbGFzcztcbiIgKyAKCQkJIgkgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIkluY29tcGF0aWJsZSBvcGVyYW5kIHR5cGVzIENsYXNzPFg+IGFuZCBDbGFzczxMb25nPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCgkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg1MjgxCglwdWJsaWMgdm9pZCB0ZXN0NTg5KCkgewoJICAgIHRoaXMucnVuTmVnYXRpdmVUZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7XG4iICsgCgkJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJdm9pZCBhZGRBbGwoTGlzdDw/IGV4dGVuZHMgTnVtYmVyPiB0YXJnZXQsIExpc3Q8PyBleHRlbmRzIE51bWJlcj4gc291cmNlKSB7XG4iICsgCgkJCQkiCQl0YXJnZXQuYWRkQWxsKHNvdXJjZSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nLi4uIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCUxpc3Q8SW50ZWdlcj4gaW50cyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTtcbiIgKyAKCQkJCSIJCWludHMuYWRkKDMpO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgkJTGlzdDxGbG9hdD4gZmxvYXRzID0gbmV3IEFycmF5TGlzdDxGbG9hdD4oKTtcbiIgKyAKCQkJCSIJCWZsb2F0cy5hZGQoM2YpO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgkJbmV3IFgoKS5hZGRBbGwoaW50cywgZmxvYXRzKTtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJCWZvciAoSW50ZWdlciBpbnRlZ2VyIDogaW50cykge1xuIiArIAoJCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihpbnRlZ2VyLmludFZhbHVlKCkpO1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCXRhcmdldC5hZGRBbGwoc291cmNlKTtcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBjYXB0dXJlLW9mID8gZXh0ZW5kcyBOdW1iZXI+KSBpbiB0aGUgdHlwZSBMaXN0PGNhcHR1cmUtb2YgPyBleHRlbmRzIE51bWJlcj4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKExpc3Q8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgTnVtYmVyPilcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODUyODEgLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3Q1OTAoKSB7CgkgICAgdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCiAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDtcbiIgKyAKCQkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgl2b2lkIGFzc2lnbkFsbChDbGFzczw/IHN1cGVyIE51bWJlcj4gc3VwLCBDbGFzczw/IGV4dGVuZHMgTnVtYmVyPiBleHQpIHtcbiIgKyAKCQkJCSIJCUNsYXNzPD8gc3VwZXIgTnVtYmVyPiBzdXBlclN1cCA9IHN1cC5nZXRTdXBlcmNsYXNzKCk7XG4iICsgCgkJCQkiCQlDbGFzczw/PiBzdXBlckV4dCA9IGV4dC5nZXRTdXBlcmNsYXNzKCk7XG4iICsgCgkJCQkiCQlDbGFzczw/IHN1cGVyIE51bWJlcj4gc3VwZXJTdXAyID0gZXh0LmdldFN1cGVyY2xhc3MoKTtcbiIgKyAKCQkJCSIJfQlcbiIgKyAKCQkJCSJ9XG4iLAogICAgICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJCSIJQ2xhc3M8PyBzdXBlciBOdW1iZXI+IHN1cGVyU3VwMiA9IGV4dC5nZXRTdXBlcmNsYXNzKCk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBDbGFzczxjYXB0dXJlLW9mID8gc3VwZXIgY2FwdHVyZS1vZiA/IGV4dGVuZHMgTnVtYmVyPiB0byBDbGFzczw/IHN1cGVyIE51bWJlcj5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NTI4MSAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDU5MSgpIHsKCSAgICB0aGlzLnJ1bkNvbmZvcm1UZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VT4ge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgVmFsdWVzPFU+IGZvbyhCb3g8PyBleHRlbmRzIFU+IGJveCkge1xuIiArIAoJCQkJIgkJcmV0dXJuIHNlbGVjdChib3guZ2V0VmFsdWVzKCkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgPEc+IFZhbHVlczxHPiBzZWxlY3QoVmFsdWVzPD8gZXh0ZW5kcyBHPiB2KSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJhYnN0cmFjdCBjbGFzcyBCb3g8Vj4ge1xuIiArIAoJCQkJIgkgIGFic3RyYWN0IFZhbHVlczxWPiBnZXRWYWx1ZXMoKTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiYWJzdHJhY3QgY2xhc3MgVmFsdWVzPFQ+IHtcbiIgKyAKCQkJCSJ9XG4iLAogICAgICAgICAgICB9LAoJCQkiIik7Cgl9CQkKCXB1YmxpYyB2b2lkIHRlc3Q1OTIoKSB7CgkgICAgdGhpcy5ydW5Db25mb3JtVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIExpc3Q8Pz4gbDtcbiIgKyAKCQkJCSIgICAgdm9pZCBtKCkge1xuIiArIAoJCQkJIgltMihsKTtcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICA8VD4gdm9pZCBtMihMaXN0PFQ+IGwyKSB7XG4iICsgCgkJCQkiCWwyLmFkZChsMi5yZW1vdmUoMCkpO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIiIpOwoJfQkJCQoJcHVibGljIHZvaWQgdGVzdDU5MygpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCSAgICBMaXN0PENsYXNzPD8+PiBjbGFzc2VzMSA9IEFycmF5cy5hc0xpc3QoU3RyaW5nLmNsYXNzLCBCb29sZWFuLmNsYXNzKTtcbiIgKyAKCQkJCSIJICAgIExpc3Q8PyBleHRlbmRzIENsYXNzPD8+PiBjbGFzc2VzMiA9IEFycmF5cy5hc0xpc3QoU3RyaW5nLmNsYXNzLCBCb29sZWFuLmNsYXNzKTtcbiIgKyAJCQkJCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCQkiCUxpc3Q8Q2xhc3M8Pz4+IGNsYXNzZXMxID0gQXJyYXlzLmFzTGlzdChTdHJpbmcuY2xhc3MsIEJvb2xlYW4uY2xhc3MpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgIF5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIExpc3Q8Q2xhc3M8PyBleHRlbmRzIE9iamVjdCZTZXJpYWxpemFibGUmQ29tcGFyYWJsZTw/Pj4+IHRvIExpc3Q8Q2xhc3M8Pz4+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDU5NCgpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJIiBpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkiaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuTWFwLio7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiYWJzdHJhY3QgY2xhc3MgTXlJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHtcbiIgKyAKCQkJCSIJU2V0PEU+IGl0ZXJhdGVkU2V0O1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKCQkJCSIJCU1hcDxTdHJpbmcsID8+IG1hcDtcbiIgKyAKCQkJCSIJCUl0ZXJhdG9yPEVudHJ5PFN0cmluZywgPz4+IGl0ID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJCUVudHJ5PFN0cmluZywgTnVtYmVyPiB1bnJlbGF0ZWRFbnRyeTtcbiIgKyAKCQkJCSIJCU15SXRlcmF0b3I8RW50cnk8U3RyaW5nLCA/Pj4gbWl0ID0gKE15SXRlcmF0b3I8RW50cnk8U3RyaW5nLCA/Pj4pIGl0O1xuIiArIAoJCQkJIgkJbWl0Lml0ZXJhdGVkU2V0LmFkZCh1bnJlbGF0ZWRFbnRyeSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAogICAgICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDExKVxuIiArIAoJCQkiCUl0ZXJhdG9yPEVudHJ5PFN0cmluZywgPz4+IGl0ID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICBeXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLGNhcHR1cmUtb2YgPz4+IHRvIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsPz4+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDU5NSgpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJIiBpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkiaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuTWFwLio7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiYWJzdHJhY3QgY2xhc3MgTXlJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHtcbiIgKyAKCQkJCSIJU2V0PEU+IGl0ZXJhdGVkU2V0O1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIgl2b2lkIGJhcigpIHtcbiIgKyAKCQkJCSIJCU1hcDw/IGV4dGVuZHMgU3RyaW5nLCA/PiBtYXA7XG4iICsgCgkJCQkiCQlJdGVyYXRvcjxFbnRyeTw/IGV4dGVuZHMgU3RyaW5nLCA/Pj4gaXQgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgkJRW50cnk8U3RyaW5nLCBOdW1iZXI+IHVucmVsYXRlZEVudHJ5O1xuIiArIAoJCQkJIgkJTXlJdGVyYXRvcjxFbnRyeTw/IGV4dGVuZHMgU3RyaW5nLCA/Pj4gbWl0ID0gKE15SXRlcmF0b3I8RW50cnk8PyBleHRlbmRzIFN0cmluZywgPz4+KSBpdDtcbiIgKyAKCQkJCSIJCW1pdC5pdGVyYXRlZFNldC5hZGQodW5yZWxhdGVkRW50cnkpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMSlcbiIgKyAKCQkJIglJdGVyYXRvcjxFbnRyeTw/IGV4dGVuZHMgU3RyaW5nLCA/Pj4gaXQgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBJdGVyYXRvcjxNYXAuRW50cnk8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgU3RyaW5nLGNhcHR1cmUtb2YgPz4+IHRvIEl0ZXJhdG9yPE1hcC5FbnRyeTw/IGV4dGVuZHMgU3RyaW5nLD8+PlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCXB1YmxpYyB2b2lkIHRlc3Q1OTYoKSB7CgkgICAgdGhpcy5ydW5Db25mb3JtVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCTxUPiBTZXQ8VD4gdW5tb2RpZmlhYmxlU2V0KFNldDxUPiBzZXQpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBzZXQ7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgZm9vKFNldDw/PiBzKSB7XG4iICsgCgkJCQkiCQlTZXQ8Pz4gczIgPSB1bm1vZGlmaWFibGVTZXQocyk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAogICAgICAgICAgICB9LAoJCQkiIik7Cgl9CQkKCXB1YmxpYyB2b2lkIHRlc3Q1OTcoKSB7CgkgICAgdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCiAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWDxVPiB7XG4iICsgCgkJCQkiCVBhaXI8VSxVPiBtKCkgeyBcbiIgKyAKCQkJCSIJCXJldHVybiBudWxsOyBcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgl2b2lkIGZvbyhYPD8+IHgpIHtcbiIgKyAKCQkJCSIJCXgubSgpLmZpcnN0ID0geC5tKCkuc2Vjb25kO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIglcbiIgKyAKCQkJCSJjbGFzcyBQYWlyPEUsIEY+IHtcbiIgKyAKCQkJCSIJRSBmaXJzdDtcbiIgKyAKCQkJCSIJRiBzZWNvbmQ7XG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIi0tLS0tLS0tLS1cbiIgKyAKICAgIAkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAogICAgCQkiCXgubSgpLmZpcnN0ID0geC5tKCkuc2Vjb25kO1xuIiArIAogICAgCQkiCSAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXG4iICsgCiAgICAJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIGNhcHR1cmUtb2YgPyB0byBjYXB0dXJlLW9mID9cbiIgKyAKICAgIAkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDg3OQoJcHVibGljIHZvaWQgdGVzdDU5OCgpIHsKCSAgICB0aGlzLnJ1bkNvbmZvcm1UZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIFggaW1wbGVtZW50cyBDb21wYXJhYmxlIHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHtcbiIgKyAKCQkJCSIJCXJldHVybiAwO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIFkge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlMaXN0PFg+IGx4ID0gbnVsbDtcbiIgKyAKCQkJCSIJCUNvbGxlY3Rpb25zLnNvcnQobHgpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCQkJfSwKCQkJIiIpOwoJfQkJCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA4NzkgLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3Q1OTkoKSB7CgkgICAgdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCiAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFggaW1wbGVtZW50cyBDb21wYXJhYmxlIHtcbiIgKyAKCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkJIgkJWm9yayB6O1xuIiArIAoJCQkJIgkJXG4iICsgCgkJCQkiCQlMaXN0PFg+IGx4ID0gbnVsbDtcbiIgKyAKCQkJCSIJCXNvcnQxKGx4KTtcbiIgKyAKCQkJCSIJCXNvcnQyKGx4KTtcbiIgKyAKCQkJCSIJCXNvcnQzKGx4KTtcbiIgKyAKCQkJCSIJCXNvcnQ0KGx4KTtcbiIgKyAKCQkJCSIJCXNvcnQ1KGx4KTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgbykge1xuIiArIAoJCQkJIgkJcmV0dXJuIDA7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJc3RhdGljIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIFQ+PiB2b2lkIHNvcnQxKExpc3Q8VD4gbGlzdCkge31cbiIgKyAKCQkJCSIJc3RhdGljIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTw/IGV4dGVuZHMgVD4+IHZvaWQgc29ydDIoTGlzdDxUPiBsaXN0KSB7fVxuIiArIAoJCQkJIglzdGF0aWMgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPD8+PiB2b2lkIHNvcnQzKExpc3Q8VD4gbGlzdCkge31cbiIgKyAKCQkJCSIJc3RhdGljIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTxUPj4gdm9pZCBzb3J0NChMaXN0PFQ+IGxpc3QpIHt9XG4iICsgCgkJCQkiCXN0YXRpYyA8VCBleHRlbmRzIENvbXBhcmFibGU+IHZvaWQgc29ydDUoTGlzdDxUPiBsaXN0KSB7fVxuIiArIAoJCQkJIn1cbiIsCgkJCX0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIglab3JrIHo7XG4iICsgCgkJCSIJXl5eXlxuIiArIAoJCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCXNvcnQxKGx4KTtcbiIgKyAKCQkJIgleXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBVbmNoZWNrZWQgaW52b2NhdGlvbiBzb3J0MShMaXN0PFg+KSBvZiB0aGUgZ2VuZXJpYyBtZXRob2Qgc29ydDEoTGlzdDxUPikgb2YgdHlwZSBYXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA5KVxuIiArIAoJCQkiCXNvcnQyKGx4KTtcbiIgKyAKCQkJIgleXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBVbmNoZWNrZWQgaW52b2NhdGlvbiBzb3J0MihMaXN0PFg+KSBvZiB0aGUgZ2VuZXJpYyBtZXRob2Qgc29ydDIoTGlzdDxUPikgb2YgdHlwZSBYXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSI0LiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxMSlcbiIgKyAKCQkJIglzb3J0NChseCk7XG4iICsgCgkJCSIJXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVW5jaGVja2VkIGludm9jYXRpb24gc29ydDQoTGlzdDxYPikgb2YgdGhlIGdlbmVyaWMgbWV0aG9kIHNvcnQ0KExpc3Q8VD4pIG9mIHR5cGUgWFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwODc5IC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0NjAwKCkgewoJICAgIHRoaXMucnVuTmVnYXRpdmVUZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCVpvcmsgejtcbiIgKyAKCQkJCSIJCVxuIiArIAoJCQkJIgkJTGlzdDxNeUVudW0+IGxlID0gbnVsbDtcbiIgKyAKCQkJCSIJCXNvcnQ2KGxlKTtcbiIgKyAKCQkJCSIJCXNvcnQ3KGxlKTtcbiIgKyAKCQkJCSIJCXNvcnQ4KGxlKTtcbiIgKyAKCQkJCSIJCXNvcnQ5KGxlKTtcbiIgKyAKCQkJCSIJCXNvcnQxMChsZSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHtcbiIgKyAKCQkJCSIJCXJldHVybiAwO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXN0YXRpYyA8VCBleHRlbmRzIE15RW51bTw/IHN1cGVyIFQ+PiB2b2lkIHNvcnQ2KExpc3Q8VD4gbGlzdCkge31cbiIgKyAKCQkJCSIJc3RhdGljIDxUIGV4dGVuZHMgTXlFbnVtPD8gZXh0ZW5kcyBUPj4gdm9pZCBzb3J0NyhMaXN0PFQ+IGxpc3QpIHt9XG4iICsgCgkJCQkiCXN0YXRpYyA8VCBleHRlbmRzIE15RW51bTw/Pj4gdm9pZCBzb3J0OChMaXN0PFQ+IGxpc3QpIHt9XG4iICsgCgkJCQkiCXN0YXRpYyA8VCBleHRlbmRzIE15RW51bTxUPj4gdm9pZCBzb3J0OShMaXN0PFQ+IGxpc3QpIHt9XG4iICsgCgkJCQkiCXN0YXRpYyA8VCBleHRlbmRzIE15RW51bT4gdm9pZCBzb3J0MTAoTGlzdDxUPiBsaXN0KSB7fVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBNeUVudW08RSBleHRlbmRzIE15RW51bTxFPj4ge31cbiIsCiAgICAgICAgICAgIH0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIglab3JrIHo7XG4iICsgCgkJCSIJXl5eXlxuIiArIAoJCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCXNvcnQ2KGxlKTtcbiIgKyAKCQkJIgleXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBVbmNoZWNrZWQgaW52b2NhdGlvbiBzb3J0NihMaXN0PE15RW51bT4pIG9mIHRoZSBnZW5lcmljIG1ldGhvZCBzb3J0NihMaXN0PFQ+KSBvZiB0eXBlIFhcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJCSIJc29ydDcobGUpO1xuIiArIAoJCQkiCV5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFVuY2hlY2tlZCBpbnZvY2F0aW9uIHNvcnQ3KExpc3Q8TXlFbnVtPikgb2YgdGhlIGdlbmVyaWMgbWV0aG9kIHNvcnQ3KExpc3Q8VD4pIG9mIHR5cGUgWFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNC4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTEpXG4iICsgCgkJCSIJc29ydDkobGUpO1xuIiArIAoJCQkiCV5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFVuY2hlY2tlZCBpbnZvY2F0aW9uIHNvcnQ5KExpc3Q8TXlFbnVtPikgb2YgdGhlIGdlbmVyaWMgbWV0aG9kIHNvcnQ5KExpc3Q8VD4pIG9mIHR5cGUgWFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NTI4MSAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDYwMSgpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFU+IHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIFZhbHVlczxVPiBmb28oQm94PD8gZXh0ZW5kcyBVPiBib3gpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBzZWxlY3QoYm94LmdldFZhbHVlcygpKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIDxHPiBWYWx1ZXM8Rz4gc2VsZWN0KFZhbHVlczxHPiB2KSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJhYnN0cmFjdCBjbGFzcyBCb3g8Vj4ge1xuIiArIAoJCQkJIgkgIGFic3RyYWN0IFZhbHVlczxWPiBnZXRWYWx1ZXMoKTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiYWJzdHJhY3QgY2xhc3MgVmFsdWVzPFQ+IHtcbiIgKyAKCQkJCSJ9XG4iLAogICAgICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJcmV0dXJuIHNlbGVjdChib3guZ2V0VmFsdWVzKCkpO1xuIiArIAoJCQkiCSAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBWYWx1ZXM8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgVT4gdG8gVmFsdWVzPFU+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDYwMigpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFU+IHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgZm9vKEJveDw/IGV4dGVuZHMgVT4gYm94KSB7XG4iICsgCgkJCQkiCQlib3guZ2V0VmFsdWVzKClbMF0gPSBib3guZ2V0VmFsdWVzKClbMV07XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiYWJzdHJhY3QgY2xhc3MgQm94PFY+IHtcbiIgKyAKCQkJCSIJICBhYnN0cmFjdCBWYWx1ZXM8Vj5bXSBnZXRWYWx1ZXMoKTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiYWJzdHJhY3QgY2xhc3MgVmFsdWVzPFQ+IHtcbiIgKyAKCQkJCSJ9XG4iLAogICAgICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJYm94LmdldFZhbHVlcygpWzBdID0gYm94LmdldFZhbHVlcygpWzFdO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBWYWx1ZXM8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgVT4gdG8gVmFsdWVzPGNhcHR1cmUtb2YgPyBleHRlbmRzIFU+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDYwMygpIHsKCSAgICB0aGlzLnJ1bkNvbmZvcm1UZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VT4ge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgdm9pZCBmb28oQm94PD8gZXh0ZW5kcyBVPltdIGJveGVzKSB7XG4iICsgCgkJCQkiCQlib3hlc1swXSA9IGJveGVzWzFdO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImFic3RyYWN0IGNsYXNzIEJveDxWPiB7XG4iICsgCgkJCQkiCSAgYWJzdHJhY3QgVmFsdWVzPFY+W10gZ2V0VmFsdWVzKCk7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImFic3RyYWN0IGNsYXNzIFZhbHVlczxUPiB7XG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIiIpOwoJfQkJCgkvLyBjYXB0dXJlIG9uIGFycmF5IHJlZiAKCXB1YmxpYyB2b2lkIHRlc3Q2MDQoKSB7CgkgICAgdGhpcy5ydW5Db25mb3JtVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFU+IHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgZm9vKEJveDw/IGV4dGVuZHMgVT5bXSBib3hlcykge1xuIiArIAoJCQkJIgkJYmFyKGJveGVzWzBdLCBib3hlc1sxXSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJPFY+IHZvaWQgYmFyKFYgdjEsIFYgdjIpIHt9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImFic3RyYWN0IGNsYXNzIEJveDxWPiB7XG4iICsgCgkJCQkiCSAgYWJzdHJhY3QgVmFsdWVzPFY+W10gZ2V0VmFsdWVzKCk7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImFic3RyYWN0IGNsYXNzIFZhbHVlczxUPiB7XG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIiIpOwoJfQkJCgkvLyBjYXB0dXJlIG9uIGFycmF5IHJlZgoJcHVibGljIHZvaWQgdGVzdDYwNSgpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFU+IHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgZm9vKEJveDw/IGV4dGVuZHMgVT4gYm94KSB7XG4iICsgCgkJCQkiCQlib3guZ2V0VmFsdWVzKClbMV0gPSBib3guZ2V0VmFsdWVzKClbMl07XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiYWJzdHJhY3QgY2xhc3MgQm94PFY+IHtcbiIgKyAKCQkJCSIJICBhYnN0cmFjdCBWYWx1ZXM8Vj5bXSBnZXRWYWx1ZXMoKTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiYWJzdHJhY3QgY2xhc3MgVmFsdWVzPFQ+IHtcbiIgKyAKCQkJCSJ9XG4iLAogICAgICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJYm94LmdldFZhbHVlcygpWzFdID0gYm94LmdldFZhbHVlcygpWzJdO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBWYWx1ZXM8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgVT4gdG8gVmFsdWVzPGNhcHR1cmUtb2YgPyBleHRlbmRzIFU+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDYwNigpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYPFU+IHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgZm9vKEJveDw/IGV4dGVuZHMgVT4gYm94KSB7XG4iICsgCgkJCQkiCQlib3guZ2V0VmFsdWVzKClbMV0gPSAoVmFsdWVzPD8gZXh0ZW5kcyBVPikgYm94LmdldFZhbHVlcygpWzJdO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCTxWPiB2b2lkIGJhcihWIHYxLCBWIHYyKSB7fVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJhYnN0cmFjdCBjbGFzcyBCb3g8Vj4ge1xuIiArIAoJCQkJIgkgIGFic3RyYWN0IFZhbHVlczxWPltdIGdldFZhbHVlcygpO1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJhYnN0cmFjdCBjbGFzcyBWYWx1ZXM8VD4ge1xuIiArIAoJCQkJIn1cbiIsCiAgICAgICAgICAgIH0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCWJveC5nZXRWYWx1ZXMoKVsxXSA9IChWYWx1ZXM8PyBleHRlbmRzIFU+KSBib3guZ2V0VmFsdWVzKClbMl07XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVW5uZWNlc3NhcnkgY2FzdCBmcm9tIFZhbHVlczxjYXB0dXJlLW9mID8gZXh0ZW5kcyBVPiB0byBWYWx1ZXM8PyBleHRlbmRzIFU+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkJIglib3guZ2V0VmFsdWVzKClbMV0gPSAoVmFsdWVzPD8gZXh0ZW5kcyBVPikgYm94LmdldFZhbHVlcygpWzJdO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gVmFsdWVzPGNhcHR1cmUtb2YgPyBleHRlbmRzIFU+IHRvIFZhbHVlczxjYXB0dXJlLW9mID8gZXh0ZW5kcyBVPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCXB1YmxpYyB2b2lkIHRlc3Q2MDcoKSB7CgkgICAgdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCiAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgl2b2lkIHRlc3QxKCkge1xuIiArIAoJCQkJIgkJTGlzdDxDb21wYXJhYmxlPE9iamVjdD4+IGxPYmogPSBuZXcgQXJyYXlMaXN0PENvbXBhcmFibGU8T2JqZWN0Pj4gKCk7XG4iICsgCgkJCQkiCQlDb2xsZWN0aW9ucy5zb3J0IChsT2JqKTsJXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCB0ZXN0MigpIHtcbiIgKyAKCQkJCSIJCUxpc3Q8Q29tcGFyYWJsZT4gbENvbXAgPSBuZXcgQXJyYXlMaXN0PENvbXBhcmFibGU+ICgpO1xuIiArIAoJCQkJIgkJQ29sbGVjdGlvbnMuc29ydCAobENvbXApOwkJXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCB0ZXN0MygpIHtcbiIgKyAKCQkJCSIJCUxpc3Q8Q29tcGFyYWJsZTxTdHJpbmc+PiBsU3RyID0gbmV3IEFycmF5TGlzdDxDb21wYXJhYmxlPFN0cmluZz4+ICgpO1xuIiArIAoJCQkJIgkJQ29sbGVjdGlvbnMuc29ydCAobFN0cik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIgfVxuIiwKICAgICAgICAgICAgfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDExKVxuIiArIAoJCQkiCUNvbGxlY3Rpb25zLnNvcnQgKGxDb21wKTsJCVxuIiArIAoJCQkiCV5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFVuY2hlY2tlZCBpbnZvY2F0aW9uIHNvcnQoTGlzdDxDb21wYXJhYmxlPikgb2YgdGhlIGdlbmVyaWMgbWV0aG9kIHNvcnQoTGlzdDxUPikgb2YgdHlwZSBDb2xsZWN0aW9uc1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDE1KVxuIiArIAoJCQkiCUNvbGxlY3Rpb25zLnNvcnQgKGxTdHIpO1xuIiArIAoJCQkiCSAgICAgICAgICAgIF5eXl5cbiIgKyAKCQkJIkJvdW5kIG1pc21hdGNoOiBUaGUgZ2VuZXJpYyBtZXRob2Qgc29ydChMaXN0PFQ+KSBvZiB0eXBlIENvbGxlY3Rpb25zIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChMaXN0PENvbXBhcmFibGU8U3RyaW5nPj4pIHNpbmNlIHRoZSB0eXBlIENvbXBhcmFibGU8U3RyaW5nPiBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgVD4+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDI4NCAtIGNoZWNrIHdhcm5pbmdzCglwdWJsaWMgdm9pZCB0ZXN0NjA4KCkgewoJICAgIHRoaXMucnVuTmVnYXRpdmVUZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIkJhbGwuamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAoJCQkJImNsYXNzIEJhbGwgaW1wbGVtZW50cyBDb21wYXJhYmxlIHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHtcbiIgKyAKCQkJCSIgICAgCXJldHVybiAwO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkiICAgIFxuIiArIAoJCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiICAgIAlMaW5rZWRMaXN0PEJhbGw+IGZvbyA9IG5ldyBMaW5rZWRMaXN0PEJhbGw+KCk7XG4iICsgCgkJCQkiICAgIAlDb2xsZWN0aW9ucy5zb3J0KGZvbyk7XG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIJWm9yayB6O1xuIiArIAoJCQkJIn1cbiIsCiAgICAgICAgICAgIH0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIEJhbGwuamF2YSAoYXQgbGluZSAxMClcbiIgKyAKCQkJIglDb2xsZWN0aW9ucy5zb3J0KGZvbyk7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVW5jaGVja2VkIGludm9jYXRpb24gc29ydChMaXN0PEJhbGw+KSBvZiB0aGUgZ2VuZXJpYyBtZXRob2Qgc29ydChMaXN0PFQ+KSBvZiB0eXBlIENvbGxlY3Rpb25zXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBCYWxsLmphdmEgKGF0IGxpbmUgMTIpXG4iICsgCgkJCSIJWm9yayB6O1xuIiArIAoJCQkiCV5eXl5cbiIgKyAKCQkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgxODMxCglwdWJsaWMgdm9pZCB0ZXN0NjA5KCkgewoJICAgIHRoaXMucnVuQ29uZm9ybVRlc3QoCiAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAiSS5qYXZhIiwKCQkJCSJpbnRlcmZhY2UgSTxUIGV4dGVuZHMgSTw/IHN1cGVyIFQ+PiB7fVxuIiwKICAgICAgICAgICAgfSwKCQkJIiIpOwoJfQkJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04OTk0MAoJcHVibGljIHZvaWQgX3Rlc3Q2MTAoKSB7CgkgICAgdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCiAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAiWC5qYXZhIiwKCQkJCSIgaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJdm9pZCBmb28oTGlzdDxPYmplY3Q+IG9iamVjdHMsIExpc3QgcmF3KSB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCSAgICBMaXN0PE51bWJlcj4gbnVtYmVycztcbiIgKyAKCQkJCSIJICAgIExpc3Q8PyBleHRlbmRzIE51bWJlcj4gZXh0O1xuIiArIAoJCQkJIgkgICAgXG4iICsgCgkJCQkiCSAgICBudW1iZXJzPSAoTGlzdDxOdW1iZXI+KSBvYmplY3RzOyAvLyBjb3JyZWN0IC0gY2FzdCBlcnJvclxuIiArIAoJCQkJIgkgICAgZXh0PSAoTGlzdDw/IGV4dGVuZHMgTnVtYmVyPikgb2JqZWN0czsgLy8gd3JvbmcsIHNob3VsZCBmYWlsXG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCSAgICBleHQ9IHJhdzsgLy8gY29ycmVjdCAtIHJhdyBjb252ZXJzaW9uIHdhcm5pbmcgaXNzdWVkXG4iICsgCgkJCQkiCSAgICBudW1iZXJzPSByYXc7IC8vIGNvcnJlY3QgLSByYXcgY29udmVyc2lvbiB3YXJuaW5nIGlzc3VlZFxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA5KVxuIiArIAoJCQkiCW51bWJlcnM9IChMaXN0PE51bWJlcj4pIG9iamVjdHM7IC8vIGNvcnJlY3QgLSBjYXN0IGVycm9yXG4iICsgCgkJCSIJICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiQ2Fubm90IGNhc3QgZnJvbSBMaXN0PE9iamVjdD4gdG8gTGlzdDxOdW1iZXI+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTApXG4iICsgCgkJCSIJZXh0PSAoTGlzdDw/IGV4dGVuZHMgTnVtYmVyPikgb2JqZWN0czsgLy8gd3JvbmcsIHNob3VsZCBmYWlsXG4iICsgCgkJCSIJICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiQ2Fubm90IGNhc3QgZnJvbSBMaXN0PE9iamVjdD4gdG8gTGlzdDw/IGV4dGVuZHMgTnVtYmVyPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTIpXG4iICsgCgkJCSIJZXh0PSByYXc7IC8vIGNvcnJlY3QgLSByYXcgY29udmVyc2lvbiB3YXJuaW5nIGlzc3VlZFxuIiArIAoJCQkiCSAgICAgXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGV4cHJlc3Npb24gb2YgdHlwZSBMaXN0IG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG8gTGlzdDw/IGV4dGVuZHMgTnVtYmVyPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNC4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTMpXG4iICsgCgkJCSIJbnVtYmVycz0gcmF3OyAvLyBjb3JyZWN0IC0gcmF3IGNvbnZlcnNpb24gd2FybmluZyBpc3N1ZWRcbiIgKyAKCQkJIgkgICAgICAgICBeXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIExpc3QgbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBMaXN0PE51bWJlcj5cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTY5NgoJcHVibGljIHZvaWQgdGVzdDYxMSgpIHsKCSAgICB0aGlzLnJ1bkNvbmZvcm1UZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIkMuamF2YSIsCgkJCQkiaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJImludGVyZmFjZSBBPEsgZXh0ZW5kcyBBLkJLPFM+LCBTIGV4dGVuZHMgQS5CUz4ge1xuIiArIAoJCQkJIglwdWJsaWMgaW50ZXJmYWNlIEJTIGV4dGVuZHMgU2VyaWFsaXphYmxlIHtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgaW50ZXJmYWNlIEJLPFNTPiBleHRlbmRzIFNlcmlhbGl6YWJsZSB7XG4iICsgCgkJCQkiCQlwdWJsaWMgdm9pZCBwdXQoU1MgYSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIFA8SywgUz4gZ2V0UCgpO1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBQPEsgZXh0ZW5kcyBBLkJLPFM+LCBTIGV4dGVuZHMgQS5CUz4ge1xuIiArIAoJCQkJIglLIGs7XG4iICsgCgkJCQkiCVMgcztcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgcHV0KCkge1xuIiArIAoJCQkJIgkJay5wdXQocyk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIEM8VD4gaW1wbGVtZW50cyBBPEMuSywgQy5TPiB7XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgY2xhc3MgSyBpbXBsZW1lbnRzIEEuQks8Qy5TPiB7XG4iICsgCgkJCQkiCQlwdWJsaWMgdm9pZCBwdXQoUyBhKSB7XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBTIGltcGxlbWVudHMgQS5CUyB7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIFA8SywgUz4gZ2V0UCgpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBudWxsO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIiIpOwoJfQkJCQoJcHVibGljIHZvaWQgdGVzdDYxMigpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBNUGFpcjxBLEI+IHt9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFg8SyxWPiB7XG4iICsgCgkJCQkiICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJ1Y2tldCBleHRlbmRzIExpbmtlZExpc3Q8TVBhaXI8SyxWPj4ge31cbiIgKyAKCQkJCSIgICAgcHJpdmF0ZSBCdWNrZXRbXSBidWNrZXRzID0gbmV3IFguQnVja2V0WzEwMF07XG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCQkiCXByaXZhdGUgc3RhdGljIGNsYXNzIEJ1Y2tldCBleHRlbmRzIExpbmtlZExpc3Q8TVBhaXI8SyxWPj4ge31cbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkJIkNhbm5vdCBtYWtlIGEgc3RhdGljIHJlZmVyZW5jZSB0byB0aGUgbm9uLXN0YXRpYyB0eXBlIEtcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCQkiCXByaXZhdGUgc3RhdGljIGNsYXNzIEJ1Y2tldCBleHRlbmRzIExpbmtlZExpc3Q8TVBhaXI8SyxWPj4ge31cbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXlxuIiArIAoJCQkiQ2Fubm90IG1ha2UgYSBzdGF0aWMgcmVmZXJlbmNlIHRvIHRoZSBub24tc3RhdGljIHR5cGUgVlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMy4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglwcml2YXRlIEJ1Y2tldFtdIGJ1Y2tldHMgPSBuZXcgWC5CdWNrZXRbMTAwXTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgIF5eXl5eXl5cbiIgKyAKCQkJIlRoZSBmaWVsZCBYPEssVj4uYnVja2V0cyBpcyBuZXZlciByZWFkIGxvY2FsbHlcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODQ5NzMKCXB1YmxpYyB2b2lkIHRlc3Q2MTMoKSB7CgkgICAgdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCiAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAiTWFwLmphdmEiLAoJCQkJInBhY2thZ2UgeHk7XG4iICsgCgkJCQkiaW1wb3J0IHh5Lk1hcC5FbnRyeTtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBNYXA8TT4ge1xuIiArIAoJCQkJIiAgICBjbGFzcyBFbnRyeTxFPiB7IH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgVXNlciB7XG4iICsgCgkJCQkiICAgIHZvaWQgYShFbnRyeTxTdHJpbmc+IGUpIHsgfSAvLyBFbnRyeTxTdHJpbmc+IGlzIGlsbGVnYWwgKGVjbGlwc2UgYWNjZXB0cylcbiIgKyAKCQkJCSIgICAgdm9pZCBjKE1hcC5FbnRyeTxTdHJpbmc+IGUpIHsgfSAvLyBpbGxlZ2FsIChjb3JyZWN0bHkgZmxhZ2dlZClcbiIgKyAKCQkJCSIgICAgdm9pZCBiKEVudHJ5IGUpIHsgfSAvLyBPS1xuIiArIAoJCQkJIiAgICB2b2lkIGQoTWFwPEludGVnZXI+LkVudHJ5PFN0cmluZz4gZSkgeyB9IC8vIE9LXG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIE1hcC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJCSIJdm9pZCBhKEVudHJ5PFN0cmluZz4gZSkgeyB9IC8vIEVudHJ5PFN0cmluZz4gaXMgaWxsZWdhbCAoZWNsaXBzZSBhY2NlcHRzKVxuIiArIAoJCQkiCSAgICAgICBeXl5eXlxuIiArIAoJCQkiVGhlIG1lbWJlciB0eXBlIE1hcC5FbnRyeTxTdHJpbmc+IG11c3QgYmUgcXVhbGlmaWVkIHdpdGggYSBwYXJhbWV0ZXJpemVkIHR5cGUsIHNpbmNlIGl0IGlzIG5vdCBzdGF0aWNcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIE1hcC5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJCSIJdm9pZCBjKE1hcC5FbnRyeTxTdHJpbmc+IGUpIHsgfSAvLyBpbGxlZ2FsIChjb3JyZWN0bHkgZmxhZ2dlZClcbiIgKyAKCQkJIgkgICAgICAgXl5eXl5eXl5eXG4iICsgCgkJCSJUaGUgbWVtYmVyIHR5cGUgTWFwLkVudHJ5PFN0cmluZz4gbXVzdCBiZSBxdWFsaWZpZWQgd2l0aCBhIHBhcmFtZXRlcml6ZWQgdHlwZSwgc2luY2UgaXQgaXMgbm90IHN0YXRpY1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDk3MyAtIHZhcmlhdGlvbgkKCXB1YmxpYyB2b2lkIHRlc3Q2MTQoKSB7CgkgICAgdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCiAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAiWDEuamF2YSIsCgkJCQkiY2xhc3MgWDEge1xuIiArIAoJCQkJIglzdGF0aWMgY2xhc3MgWDI8VD4ge1xuIiArIAoJCQkJIgkJY2xhc3MgWDM8VT4ge1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImNsYXNzIFkxIHtcbiIgKyAKCQkJCSIJY2xhc3MgWTIgZXh0ZW5kcyBYMS5YMjxFeGNlcHRpb24+IHtcbiIgKyAKCQkJCSIJCXZvaWQgZm9vKCkge1xuIiArIAoJCQkJIgkJCVgzPFN0cmluZz4geDtcbiIgKyAKCQkJCSIJCX1cbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglab3JrIHo7XG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFgxLmphdmEgKGF0IGxpbmUgMTMpXG4iICsgCgkJCSIJWm9yayB6O1xuIiArIAoJCQkiCV5eXl5cbiIgKyAKCQkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDk3MyAtIHZhcmlhdGlvbgkKCXB1YmxpYyB2b2lkIF90ZXN0NjE1KCkgewoJICAgIHRoaXMucnVuTmVnYXRpdmVUZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlgxLmphdmEiLAoJCQkJImNsYXNzIFgxIHtcbiIgKyAKCQkJCSIJc3RhdGljIGNsYXNzIFgyPFQ+IHtcbiIgKyAKCQkJCSIJCWNsYXNzIFgzPFU+IHtcbiIgKyAKCQkJCSIJCX1cbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJjbGFzcyBZMSB7XG4iICsgCgkJCQkiCWNsYXNzIFkyIGV4dGVuZHMgWDEuWDIge1xuIiArIAoJCQkJIgkJdm9pZCBmb28oKSB7XG4iICsgCgkJCQkiCQkJWDM8U3RyaW5nPiB4O1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCVpvcmsgejtcbiIgKyAKCQkJCSJ9XG4iLAogICAgICAgICAgICB9LAoJCQkic2hvdWxkIGNvbXBsYWluIGFib3V0IHJhdyBlbmNsb3NpbmcgdHlwZSArIHBhcmFtZXRlcml6ZWQgbWVtYmVyIik7Cgl9CQkJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDk3MyAtIHZhcmlhdGlvbgkKCXB1YmxpYyB2b2lkIHRlc3Q2MTYoKSB7CgkgICAgdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCiAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAiTWFwLmphdmEiLAoJCQkJInBhY2thZ2UgeHk7XG4iICsgCgkJCQkiaW1wb3J0IHh5Lk1hcC5FbnRyeTtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBNYXA8TT4ge1xuIiArIAoJCQkJIiAgICBjbGFzcyBFbnRyeTxFPiB7IH1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgVXNlciBleHRlbmRzIE1hcDxTdHJpbmc+IHtcbiIgKyAKCQkJCSIgICAgdm9pZCBhKEVudHJ5PFN0cmluZz4gZSkgeyB9IC8vIEVudHJ5PFN0cmluZz4gaXMgaWxsZWdhbCAoZWNsaXBzZSBhY2NlcHRzKVxuIiArIAoJCQkJIiAgICB2b2lkIGMoTWFwLkVudHJ5PFN0cmluZz4gZSkgeyB9IC8vIGlsbGVnYWwgKGNvcnJlY3RseSBmbGFnZ2VkKVxuIiArIAoJCQkJIiAgICB2b2lkIGIoRW50cnkgZSkgeyB9IC8vIE9LXG4iICsgCgkJCQkiICAgIHZvaWQgZChNYXA8SW50ZWdlcj4uRW50cnk8U3RyaW5nPiBlKSB7IH0gLy8gT0tcbiIgKyAKCQkJCSJ9XG4iLAogICAgICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gTWFwLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkJIgl2b2lkIGMoTWFwLkVudHJ5PFN0cmluZz4gZSkgeyB9IC8vIGlsbGVnYWwgKGNvcnJlY3RseSBmbGFnZ2VkKVxuIiArIAoJCQkiCSAgICAgICBeXl5eXl5eXl5cbiIgKyAKCQkJIlRoZSBtZW1iZXIgdHlwZSBNYXAuRW50cnk8U3RyaW5nPiBtdXN0IGJlIHF1YWxpZmllZCB3aXRoIGEgcGFyYW1ldGVyaXplZCB0eXBlLCBzaW5jZSBpdCBpcyBub3Qgc3RhdGljXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KcHVibGljIHZvaWQgdGVzdDYxNygpIHsKICAgICAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAogICAgICAgICAgICAgICAgInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKICAgICAgICAgICAgICAgICJcbiIgKyAKICAgICAgICAgICAgICAgICIgICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsgCiAgICAgICAgICAgICAgICAiICAgICAgIFN0cmluZyBzID0gbnVsbDtcbiIgKyAKICAgICAgICAgICAgICAgICIgICAgICAgWlpaMTw/Pi5aWloyPD8+LlpaWjM8Pz4gdmFyID0gbnVsbDtcbiIgKyAKICAgICAgICAgICAgICAgICIgICAgICAgcyA9IHZhcjtcbiIgKyAKICAgICAgICAgICAgICAgICIgICB9XG4iICsgCiAgICAgICAgICAgICAgICAifVxuIiArIAogICAgICAgICAgICAgICAgIlxuIiArIAogICAgICAgICAgICAgICAgImNsYXNzIFpaWjE8VDE+IHtcbiIgKyAKICAgICAgICAgICAgICAgICIgIGNsYXNzIFpaWjI8VDI+IHtcbiIgKwogICAgICAgICAgICAgICAgIiAgICBjbGFzcyBaWlozPFQzPiB7fVxuIiArIAogICAgICAgICAgICAgICAgIiAgfVxuIiArIAogICAgICAgICAgICAgICAgIn1cbiIsCiAgICAgICAgICAgIH0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkJIglzID0gdmFyO1xuIiArIAoJCQkiCSAgICBeXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gWlpaMTw/Pi5aWloyPD8+LlpaWjM8Y2FwdHVyZS1vZiA/PiB0byBTdHJpbmdcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwogICAgfQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODQ5NzMgLSB2YXJpYXRpb24JCglwdWJsaWMgdm9pZCB0ZXN0NjE4KCkgewoJICAgIHRoaXMucnVuTmVnYXRpdmVUZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIk1hcC5qYXZhIiwKCQkJCSJjbGFzcyBNYXA8TT4ge1xuIiArIAoJCQkJIiAgICBjbGFzcyBFbnRyeTxFPiB7IH1cbiIgKyAKCQkJCSIgICAgY2xhc3MgRm9vIHtcbiIgKyAKCQkJCSIgICAgCUVudHJ5PFN0cmluZz4gZW50cnk7XG4iICsgCgkJCQkiICAgIAlzdGF0aWMgdm9pZCBmb28oRW50cnk8U3RyaW5nPiBlKSB7IH0gLy8gaW52YWxpZCBzdGF0aWMgcmVmXG4iICsgCgkJCQkiICAgIH1cbiIgKyAKCQkJCSIgICAgc3RhdGljIGNsYXNzIEJhciB7XG4iICsgCgkJCQkiICAgIAlFbnRyeTxTdHJpbmc+IGVudHJ5OyAvLyBpbnZhbGlkIHN0YXRpYyByZWZcbiIgKyAKCQkJCSIgICAgfVxuIiArIAoJCQkJIiAgICB2b2lkIGEoRW50cnk8U3RyaW5nPiBlKSB7IH0gLy8gT0tcbiIgKyAKCQkJCSIgICAgdm9pZCBjKE1hcC5FbnRyeTxTdHJpbmc+IGUpIHsgfSAvLyBpbGxlZ2FsIFxuIiArIAoJCQkJIiAgICB2b2lkIGIoRW50cnkgZSkgeyB9IC8vIE9LXG4iICsgCgkJCQkiICAgIHZvaWQgZChNYXA8SW50ZWdlcj4uRW50cnk8U3RyaW5nPiBlKSB7IH0gLy8gT0tcbiIgKyAKCQkJCSJ9XG4iLAogICAgICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gTWFwLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkJIglzdGF0aWMgdm9pZCBmb28oRW50cnk8U3RyaW5nPiBlKSB7IH0gLy8gaW52YWxpZCBzdGF0aWMgcmVmXG4iICsgCgkJCSIJICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgZm9vIGNhbm5vdCBiZSBkZWNsYXJlZCBzdGF0aWM7IHN0YXRpYyBtZXRob2RzIGNhbiBvbmx5IGJlIGRlY2xhcmVkIGluIGEgc3RhdGljIG9yIHRvcCBsZXZlbCB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBNYXAuamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCQkiCXN0YXRpYyB2b2lkIGZvbyhFbnRyeTxTdHJpbmc+IGUpIHsgfSAvLyBpbnZhbGlkIHN0YXRpYyByZWZcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgXl5eXl5cbiIgKyAKCQkJIkNhbm5vdCBtYWtlIGEgc3RhdGljIHJlZmVyZW5jZSB0byB0aGUgbm9uLXN0YXRpYyB0eXBlIEVudHJ5XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBFUlJPUiBpbiBNYXAuamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCUVudHJ5PFN0cmluZz4gZW50cnk7IC8vIGludmFsaWQgc3RhdGljIHJlZlxuIiArIAoJCQkiCV5eXl5eXG4iICsgCgkJCSJDYW5ub3QgbWFrZSBhIHN0YXRpYyByZWZlcmVuY2UgdG8gdGhlIG5vbi1zdGF0aWMgdHlwZSBFbnRyeVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiNC4gRVJST1IgaW4gTWFwLmphdmEgKGF0IGxpbmUgMTEpXG4iICsgCgkJCSIJdm9pZCBjKE1hcC5FbnRyeTxTdHJpbmc+IGUpIHsgfSAvLyBpbGxlZ2FsIFxuIiArIAoJCQkiCSAgICAgICBeXl5eXl5eXl5cbiIgKyAKCQkJIlRoZSBtZW1iZXIgdHlwZSBNYXAuRW50cnk8U3RyaW5nPiBtdXN0IGJlIHF1YWxpZmllZCB3aXRoIGEgcGFyYW1ldGVyaXplZCB0eXBlLCBzaW5jZSBpdCBpcyBub3Qgc3RhdGljXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg5NDQwCQoJcHVibGljIHZvaWQgdGVzdDYxOSgpIHsKCSAgICB0aGlzLnJ1bkNvbmZvcm1UZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkiaW50ZXJmYWNlIElTYW1wbGU8Vj4ge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIGVudW0gU3R1ZmYge1xuIiArIAoJCQkJIgkJRklSU1QsIFNFQ09ORCwgVEhJUkRcbiIgKyAKCQkJCSIJfTtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgU2FtcGxlQ2xhc3Mge1xuIiArIAoJCQkJIglwdWJsaWMgdm9pZCBkb1NvbWV0aGluZyhJU2FtcGxlLlN0dWZmIHRoaW5nKSB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgdm9pZCBkb1NvbWV0aGluZygpIHtcbiIgKyAKCQkJCSIJCVNhbXBsZUNsYXNzIHNhbXBsZSA9IG5ldyBTYW1wbGVDbGFzcygpO1xuIiArIAoJCQkJIgkJc2FtcGxlLmRvU29tZXRoaW5nKElTYW1wbGUuU3R1ZmYuRklSU1QpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIiIpOwoJfQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODQ1NTEJCglwdWJsaWMgdm9pZCB0ZXN0NjIwKCkgewoJICAgIHRoaXMucnVuTmVnYXRpdmVUZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIk91dGVyLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBPdXRlcjxPPiB7XG4iICsgCgkJCQkiCWNsYXNzIElubmVyIHsgfVxuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJc3RhdGljIHZvaWQgdGVzdChJbm5lciBpKSB7IH1cbiIgKyAKCQkJCSJ9XG4iLAogICAgICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gT3V0ZXIuamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCQkiCXN0YXRpYyB2b2lkIHRlc3QoSW5uZXIgaSkgeyB9XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICBeXl5eXlxuIiArIAoJCQkiQ2Fubm90IG1ha2UgYSBzdGF0aWMgcmVmZXJlbmNlIHRvIHRoZSBub24tc3RhdGljIHR5cGUgSW5uZXJcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg0NTUxLSB2YXJpYXRpb24KCXB1YmxpYyB2b2lkIHRlc3Q2MjEoKSB7CgkgICAgdGhpcy5ydW5Db25mb3JtVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJPdXRlci5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgT3V0ZXIge1xuIiArIAoJCQkJIgljbGFzcyBJbm5lciB7IH1cbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCXN0YXRpYyB2b2lkIHRlc3QoSW5uZXIgaSkgeyB9XG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIiIpOwoJfQkJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDU1MSAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDYyMigpIHsKCSAgICB0aGlzLnJ1bkNvbmZvcm1UZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIk91dGVyLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBPdXRlcjxPPiB7XG4iICsgCgkJCQkiCXN0YXRpYyBjbGFzcyBJbm5lciB7IH1cbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCXN0YXRpYyB2b2lkIHRlc3QoSW5uZXIgaSkgeyB9XG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIiIpOwoJfQkJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDU1MSAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDYyMygpIHsKCSAgICB0aGlzLnJ1bkNvbmZvcm1UZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIglzdGF0aWMgY2xhc3MgT3V0ZXIge1xuIiArIAoJCQkJIgkJY2xhc3MgSW5uZXIgeyB9XG4iICsgCgkJCQkiCQlzdGF0aWMgdm9pZCB0ZXN0KElubmVyIGkpIHsgfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIiIpOwoJfQkJCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODMwMzQKCXB1YmxpYyB2b2lkIHRlc3Q2MjQoKSB7CgkgICAgdGhpcy5ydW5Db25mb3JtVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJIiBpbnRlcmZhY2UgSUZvbzxVLCBWIGV4dGVuZHMgWDxVLCBWPj4ge1xuIiArIAoJCQkJIglWIGJhcihpbnQgaSk7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYPEUsIEYgZXh0ZW5kcyBYPEUsIEY+PiB7XG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIglwdWJsaWMgYm9vbGVhbiBmb28oWDxFLCA/PiB4KSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gZmFsc2U7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIGJvb2xlYW4gYmF6KElGb288RSwgPz4gZikge1xuIiArIAoJCQkJIgkJcmV0dXJuIGZvbyhmLmJhcigwKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAogICAgICAgICAgICB9LAoJCQkiIik7Cgl9CQkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgzMDM0IC0gdmFyaWF0aW9uCglwdWJsaWMgdm9pZCB0ZXN0NjI1KCkgewoJICAgIHRoaXMucnVuQ29uZm9ybVRlc3QoCiAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAiRm9vLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBGb288Sz4ge1xuIiArIAoJCQkJIglwdWJsaWMgZW51bSBNb2RlIHtcbiIgKyAKCQkJCSIJCUFcbiIgKyAKCQkJCSIJfTtcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgdGVzdChNb2RlIG1vZGUpIHtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn0gXG4iLAogICAgICAgICAgICB9LAoJCQkiIik7CgkgICAgdGhpcy5ydW5Db25mb3JtVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJZW51bSBLZXlzIHtcbiIgKyAKCQkJCSIJCUJcbiIgKyAKCQkJCSIJfTtcbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgdGVzdCgpIHtcbiIgKyAKCQkJCSIJCUZvbzxLZXlzPiBmb28gPSBuZXcgRm9vPEtleXM+KCk7XG4iICsgCgkJCQkiCQlmb28udGVzdChGb28uTW9kZS5BKTsgLy8gZXJyb3JcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn0gXG4iLAogICAgICAgICAgICB9LAoJCQkiIiwKCQkJbnVsbCwKCQkJZmFsc2UsCgkJCW51bGwpOwoJfQkJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MjAzNwoJcHVibGljIHZvaWQgdGVzdDYyNigpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQSB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQjxBPiB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQUEgZXh0ZW5kcyBBIHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwcml2YXRlIHN0YXRpYyBjbGFzcyBDIGV4dGVuZHMgQjxBQT4ge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCUI8QT4gYiA9IG5ldyBCPEE+KCk7XG4iICsgCgkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oYiBpbnN0YW5jZW9mIEMpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKICAgICAgICAgICAgfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJCSIJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQjxBPiB7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICBeXG4iICsgCgkJCSJUaGUgdHlwZSBwYXJhbWV0ZXIgQSBpcyBoaWRpbmcgdGhlIHR5cGUgWC5BXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMjEpXG4iICsgCgkJCSIJU3lzdGVtLm91dC5wcmludGxuKGIgaW5zdGFuY2VvZiBDKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIkluY29tcGF0aWJsZSBjb25kaXRpb25hbCBvcGVyYW5kIHR5cGVzIFguQjxYLkE+IGFuZCBYLkNcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCglwdWJsaWMgdm9pZCB0ZXN0NjI3KCkgewoJICAgIHRoaXMucnVuTmVnYXRpdmVUZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJPFQ+IExpc3Q8PyBleHRlbmRzIFQ+IGZvbyhMaXN0PD8gZXh0ZW5kcyBUPiBsMSwgTGlzdDw/IGV4dGVuZHMgVD4gbDIpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBsMTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgl2b2lkIGJhcihMaXN0PFN0cmluZz4gbDEsIExpc3Q8SW50ZWdlcj4gbDIpIHtcbiIgKyAKCQkJCSIJCVN0cmluZyBzID0gZm9vKGwxLCBsMik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAogICAgICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJCSIJU3RyaW5nIHMgPSBmb28obDEsIGwyKTtcbiIgKyAKCQkJIgkgICAgICAgXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBMaXN0PGNhcHR1cmUtb2YgPyBleHRlbmRzIE9iamVjdCZTZXJpYWxpemFibGUmQ29tcGFyYWJsZTw/Pj4gdG8gU3RyaW5nXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCgkvLyBjaGVjayBjYXB0dXJlIGZvciBjb25kaXRpb25hbCBvcGVyYXRvcgoJcHVibGljIHZvaWQgdGVzdDYyOCgpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCTxUPiBMaXN0PD8gZXh0ZW5kcyBUPiBmb28oTGlzdDw/IGV4dGVuZHMgVD4gbDEsIExpc3Q8PyBleHRlbmRzIFQ+IGwyKSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gbDE7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBiYXIoTGlzdDxGbG9hdD4gbDEsIExpc3Q8SW50ZWdlcj4gbDIpIHtcbiIgKyAKCQkJCSIJCUxpc3Q8Pz4gbDMgPSBudWxsO1xuIiArIAoJCQkJIgkJU3RyaW5nIHMgPSBsMSAhPSBudWxsID8gZm9vKGwxLCBsMikgOiBsMztcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCiAgICAgICAgICAgIH0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTApXG4iICsgCgkJCSIJU3RyaW5nIHMgPSBsMSAhPSBudWxsID8gZm9vKGwxLCBsMikgOiBsMztcbiIgKyAKCQkJIgkgICAgICAgXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBMaXN0PGNhcHR1cmUtb2YgPyBleHRlbmRzIE9iamVjdD4gdG8gU3RyaW5nXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkyNTU2CglwdWJsaWMgdm9pZCB0ZXN0NjI5KCkgewoJICAgIHRoaXMucnVuQ29uZm9ybVRlc3QoCiAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZXh0PE4gZXh0ZW5kcyBOdW1iZXI+IHtcbiIgKyAKCQkJCSIJCXByaXZhdGUgU3RyYXRlZ3k8TiwgPyBzdXBlciBDb250ZXh0PE4+PiBzdHJhdGVneTtcbiIgKyAKCQkJCSIJCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5KFN0cmF0ZWd5PE4sID8gc3VwZXIgQ29udGV4dDxOPj4gc3RyYXRlZ3kpIHtcbiIgKyAKCQkJCSIJCQl0aGlzLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCQkvLyBt6XRob2RlIHF1aSB1dGlsaXNlIGxhIHN0cmF06WdpZVxuIiArIAoJCQkJIgkJcHVibGljIE4gY2FsbCgpIHRocm93cyBFeGNlcHRpb24ge1xuIiArIAoJCQkJIgkJCXJldHVybiB0aGlzLnN0cmF0ZWd5LmNhbGwodGhpcyk7XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIGludGVyZmFjZSBTdHJhdGVneTxOIGV4dGVuZHMgTnVtYmVyLCBDIGV4dGVuZHMgQ29udGV4dDxOPj4ge1xuIiArIAoJCQkJIgkJcHVibGljIGFic3RyYWN0IE4gY2FsbChDIGNvbnRleHQpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkifSBcbiIsCiAgICAgICAgICAgIH0sCgkJCSIiKTsKCX0JCQkKCXB1YmxpYyB2b2lkIHRlc3Q2MzAoKSB7CgkgICAgdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCiAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDtcbiIgKyAKCQkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgl2b2lkIHRlc3QwKCkge1xuIiArIAoJCQkJIgkJTGlzdDw/IHN1cGVyIE51bWJlcltdPiBhcnJheXM9IG5ldyBBcnJheUxpc3Q8TnVtYmVyW10+KCk7XG4iICsgCgkJCQkiCQlOdW1iZXJbXSBhPSBudWxsO1xuIiArIAoJCQkJIgkJYXJyYXlzLmFkZChudWxsKTtcbiIgKyAKCQkJCSIJCWFycmF5cy5hZGQoYSk7IC8vIEVycm9yOiBUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8gc3VwZXIgTnVtYmVyW10pIGluIHRoZSB0eXBlIExpc3Q8Y2FwdHVyZS1vZiA/IHN1cGVyIE51bWJlcltdPiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoTnVtYmVyW10pXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJdm9pZCB0ZXN0MSgpIHtcbiIgKyAKCQkJCSIJCUxpc3Q8PyBleHRlbmRzIE51bWJlcltdPiBhcnJheXM9IG5ldyBBcnJheUxpc3Q8TnVtYmVyW10+KCk7XG4iICsgCgkJCQkiCQlOdW1iZXJbXSBhPSBudWxsO1xuIiArIAoJCQkJIgkJYXJyYXlzLmFkZChudWxsKTtcbiIgKyAKCQkJCSIJCWFycmF5cy5hZGQoYSk7IC8vIEVycm9yOiBUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8gZXh0ZW5kcyBOdW1iZXJbXSkgaW4gdGhlIHR5cGUgTGlzdDxjYXB0dXJlLW9mID8gc3VwZXIgTnVtYmVyW10+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChOdW1iZXJbXSlcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJdm9pZCB0ZXN0MigpIHtcbiIgKyAKCQkJCSIJCUxpc3Q8PyBzdXBlciBOdW1iZXI+IG51bXM9IG51bGw7XG4iICsgCgkJCQkiCQlOdW1iZXIgbj0gbnVsbDtcbiIgKyAKCQkJCSIJCW51bXMuYWRkKG51bGwpO1xuIiArIAoJCQkJIgkJbnVtcy5hZGQobik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJdm9pZCB0ZXN0MygpIHtcbiIgKyAKCQkJCSIJCUxpc3Q8PyBzdXBlciBMaXN0PE51bWJlcj4+IG51bXM9IG51bGw7XG4iICsgCgkJCQkiCQlMaXN0PE51bWJlcj4gbj0gbnVsbDtcbiIgKyAKCQkJCSIJCW51bXMuYWRkKG51bGwpO1xuIiArIAoJCQkJIgkJbnVtcy5hZGQobik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEwKVxyXG4iICsgCgkJCSIJYXJyYXlzLmFkZChhKTsgLy8gRXJyb3I6IFRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPyBzdXBlciBOdW1iZXJbXSkgaW4gdGhlIHR5cGUgTGlzdDxjYXB0dXJlLW9mID8gc3VwZXIgTnVtYmVyW10+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChOdW1iZXJbXSlcclxuIiArIAoJCQkiCSAgICAgICBeXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPyBzdXBlciBOdW1iZXJbXSkgaW4gdGhlIHR5cGUgTGlzdDxjYXB0dXJlLW9mID8gc3VwZXIgTnVtYmVyW10+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChOdW1iZXJbXSlcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxNylcclxuIiArIAoJCQkiCWFycmF5cy5hZGQoYSk7IC8vIEVycm9yOiBUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8gZXh0ZW5kcyBOdW1iZXJbXSkgaW4gdGhlIHR5cGUgTGlzdDxjYXB0dXJlLW9mID8gc3VwZXIgTnVtYmVyW10+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChOdW1iZXJbXSlcclxuIiArIAoJCQkiCSAgICAgICBeXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPyBleHRlbmRzIE51bWJlcltdKSBpbiB0aGUgdHlwZSBMaXN0PGNhcHR1cmUtb2YgPyBleHRlbmRzIE51bWJlcltdPiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoTnVtYmVyW10pXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzMDQ0CQoJcHVibGljIHZvaWQgdGVzdDYzMSgpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFhcbiIgKyAKCQkJCSJ7XG4iICsgCgkJCQkiCQkgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncylcbiIgKyAKCQkJCSIJCSB7XG4iICsgCgkJCQkiCQkgCQkgQ2xhc3M8PyBleHRlbmRzIEVudW08Pz4+IGMgPSBSZXRlbnRpb25Qb2xpY3kuY2xhc3M7XG4iICsgCgkJCQkiCQkgCQkgU3lzdGVtLm91dC5wcmludGxuKEVudW0udmFsdWVPZihjLCBcIkNMQVNTXCIpKTtcbiIgKyAKCQkJCSIJCSB9XG4iICsgCgkJCQkifVxuIiwKCSAgICAgICAgfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCVN5c3RlbS5vdXQucHJpbnRsbihFbnVtLnZhbHVlT2YoYywgXCJDTEFTU1wiKSk7XG4iICsgCgkJCSIJICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXlxuIiArIAoJCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSBnZW5lcmljIG1ldGhvZCB2YWx1ZU9mKENsYXNzPFQ+LCBTdHJpbmcpIG9mIHR5cGUgRW51bTxFPiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoQ2xhc3M8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgRW51bTw/Pj4sIFN0cmluZykgc2luY2UgdGhlIHR5cGUgY2FwdHVyZS1vZiA/IGV4dGVuZHMgRW51bTw/PiBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFQgZXh0ZW5kcyBFbnVtPFQ+PlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05Mjk4MgoJcHVibGljIHZvaWQgdGVzdDYzMigpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuVmVjdG9yO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJdm9pZCB0ZXN0MSgpIHtcbiIgKyAKCQkJCSIJCVZlY3Rvcjw/IHN1cGVyIGphdmEubGFuZy5PYmplY3RbXT4gbGhzID0gbnVsbDtcbiIgKyAKCQkJCSIJCVZlY3Rvcjw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdFtdPiByaHMgPSBudWxsO1xuIiArIAoJCQkJIgkJbGhzLmFkZChyaHMuZ2V0KDApKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIgl2b2lkIHRlc3QyKCkge1xuIiArIAoJCQkJIgkJVmVjdG9yPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0W10+IGxocyA9IG51bGw7XG4iICsgCgkJCQkiCQlWZWN0b3I8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3RbXT4gcmhzID0gbnVsbDtcbiIgKyAKCQkJCSIJCWxocy5hZGQocmhzLmdldCgwKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCB0ZXN0MygpIHtcbiIgKyAKCQkJCSIJCVZlY3Rvcjw/IHN1cGVyIGphdmEubGFuZy5PYmplY3RbXT4gbGhzID0gbnVsbDtcbiIgKyAKCQkJCSIJCVZlY3Rvcjw/IHN1cGVyIGphdmEubGFuZy5PYmplY3RbXT4gcmhzID0gbnVsbDtcbiIgKyAKCQkJCSIJCWxocy5hZGQocmhzLmdldCgwKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCB0ZXN0NCgpIHtcbiIgKyAKCQkJCSIJCVZlY3Rvcjw/ICBleHRlbmRzIGphdmEubGFuZy5PYmplY3RbXT4gbGhzID0gbnVsbDtcbiIgKyAKCQkJCSIJCVZlY3Rvcjw/IHN1cGVyIGphdmEubGFuZy5PYmplY3RbXT4gcmhzID0gbnVsbDtcbiIgKyAKCQkJCSIJCWxocy5hZGQocmhzLmdldCgwKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJCSIJbGhzLmFkZChyaHMuZ2V0KDApKTtcbiIgKyAKCQkJIgkgICAgXl5eXG4iICsgCgkJCSJUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8gc3VwZXIgT2JqZWN0W10pIGluIHRoZSB0eXBlIFZlY3RvcjxjYXB0dXJlLW9mID8gc3VwZXIgT2JqZWN0W10+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChjYXB0dXJlLW9mID8gZXh0ZW5kcyBPYmplY3RbXSlcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMilcbiIgKyAKCQkJIglsaHMuYWRkKHJocy5nZXQoMCkpO1xuIiArIAoJCQkiCSAgICBeXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPyBleHRlbmRzIE9iamVjdFtdKSBpbiB0aGUgdHlwZSBWZWN0b3I8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0W10+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChjYXB0dXJlLW9mID8gZXh0ZW5kcyBPYmplY3RbXSlcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxNylcbiIgKyAKCQkJIglsaHMuYWRkKHJocy5nZXQoMCkpO1xuIiArIAoJCQkiCSAgICBeXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPyBzdXBlciBPYmplY3RbXSkgaW4gdGhlIHR5cGUgVmVjdG9yPGNhcHR1cmUtb2YgPyBzdXBlciBPYmplY3RbXT4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKGNhcHR1cmUtb2YgPyBzdXBlciBPYmplY3RbXSlcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjQuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyMilcbiIgKyAKCQkJIglsaHMuYWRkKHJocy5nZXQoMCkpO1xuIiArIAoJCQkiCSAgICBeXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPyBleHRlbmRzIE9iamVjdFtdKSBpbiB0aGUgdHlwZSBWZWN0b3I8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0W10+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChjYXB0dXJlLW9mID8gc3VwZXIgT2JqZWN0W10pXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05Mjk4MiAtIHZhcmlhdGlvbgoJcHVibGljIHZvaWQgdGVzdDYzMygpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuVmVjdG9yO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJdm9pZCB0ZXN0MSgpIHtcbiIgKyAKCQkJCSIJCVZlY3Rvcjw/IHN1cGVyIE9iamVjdFtdPiBsaHMgPSBudWxsO1xuIiArIAoJCQkJIgkJVmVjdG9yPE9iamVjdFtdPiByaHMgPSBudWxsO1xuIiArIAoJCQkJIgkJbGhzLmFkZChyaHMuZ2V0KDApKTsgXG4iICsgCgkJCQkiCQlmb28ocmhzLmdldCgwKSk7IC8vIG9rICNmb28oT2JqZWN0W10pXG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJdm9pZCBmb28oT2JqZWN0W10gb2Jqcykge1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCSAgICAgICAgfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCQkiCWxocy5hZGQocmhzLmdldCgwKSk7IFxuIiArIAoJCQkiCSAgICBeXl5cbiIgKyAKCQkJIlRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPyBzdXBlciBPYmplY3RbXSkgaW4gdGhlIHR5cGUgVmVjdG9yPGNhcHR1cmUtb2YgPyBzdXBlciBPYmplY3RbXT4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKE9iamVjdFtdKVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CQkJCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA3NzUKCXB1YmxpYyB2b2lkIHRlc3Q2MzQoKSB7CgkgICAgdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCiAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIglUW10gdGhlQXJyYXk7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXB1YmxpYyBYKENsYXNzPFQ+IGNsYXp6KSB7XG4iICsgCgkJCQkiCQl0aGVBcnJheSA9IChUW10pIEFycmF5Lm5ld0luc3RhbmNlKGNsYXp6LCAxMCk7IC8vIENvbXBpbGVyIHdhcm5pbmdcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgVCBnZXQoaW50IGkpIHtcbiIgKyAKCQkJCSIJCXJldHVybiB0aGVBcnJheVtpXTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlYPEludGVnZXI+IHQgPSBuZXcgWDxJbnRlZ2VyPihJbnRlZ2VyLmNsYXNzKTtcbiIgKyAKCQkJCSIJCS8vIEdlbmVyaWNzQXJyYXkxPEludGVnZXI+IHQgPSBuZXcgR2VuZXJpY3NBcnJheTE8SW50ZWdlcj4oIGludC5jbGFzcyApO1xuIiArIAoJCQkJIgkJT2JqZWN0W10gbyA9IHQudGhlQXJyYXk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIgIFpvcmsgejtcbiIgKwoJCQkJIn1cbiIsCgkgICAgICAgIH0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCXRoZUFycmF5ID0gKFRbXSkgQXJyYXkubmV3SW5zdGFuY2UoY2xhenosIDEwKTsgLy8gQ29tcGlsZXIgd2FybmluZ1xuIiArIAoJCQkiCSAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBjYXN0IGZyb20gT2JqZWN0IHRvIFRbXSBpcyBhY3R1YWxseSBjaGVja2luZyBhZ2FpbnN0IHRoZSBlcmFzZWQgdHlwZSBPYmplY3RbXVxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDIwKVxuIiArIAoJCQkiCVpvcmsgejtcbiIgKyAKCQkJIgleXl5eXG4iICsgCgkJCSJab3JrIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQkJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MzI5OAoJcHVibGljIHZvaWQgdGVzdDYzNSgpIHsKCSAgICB0aGlzLnJ1bkNvbmZvcm1UZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjtcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW5kZXhlZCA8VT4gIHtcbiIgKyAKCQkJCSIJCXB1YmxpYyBJdGVyYXRvcjxVPiBmb28oKSB7XG4iICsgCgkJCQkiCQkJcmV0dXJuIG5ldyBJbmRleGVkSXRlcigpO1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgkJY2xhc3MgSW5kZXhlZEl0ZXIgaW1wbGVtZW50cyBJdGVyYXRvcjxVPiB7XG4iICsgCgkJCQkiCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHtcbiIgKyAKCQkJCSIJCQkJcmV0dXJuIGZhbHNlO1xuIiArIAoJCQkJIgkJCX1cbiIgKyAKCQkJCSIJCQlwdWJsaWMgVSBuZXh0KCkge1xuIiArIAoJCQkJIgkJCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIJCQl9XG4iICsgCgkJCQkiCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkge1xuIiArIAoJCQkJIgkJCX1cbiIgKyAKCQkJCSIJCX1cbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkgICAgICAgIH0sCgkJCSIiKTsKCX0KCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4MDg0CQoJcHVibGljIHZvaWQgdGVzdDYzNigpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkicHVibGljIGFic3RyYWN0IGNsYXNzIFg8VD4ge1xuIiArIAoJCQkiICBwdWJsaWMgZmluYWwgVCBlbGVtZW50KCkge1xuIiArIAoJCQkiICAgIFQgcmVzdWx0ID0gKFQpIGN1c3RvbUVsZW1lbnQoKTsgLy8gcmVwb3J0cyB1bm5lY2Vzc2FyeSBjYXN0XG4iICsgCgkJCSIgICAgcmV0dXJuIHJlc3VsdDtcbiIgKyAKCQkJIiAgfVxuIiArIAoJCQkiICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGN1c3RvbUVsZW1lbnQoKTtcbiIgKyAKCQkJIiAgWm9yayB6O1xuIiArCgkJCSJ9XG4iLAoJICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkJIglUIHJlc3VsdCA9IChUKSBjdXN0b21FbGVtZW50KCk7IC8vIHJlcG9ydHMgdW5uZWNlc3NhcnkgY2FzdFxuIiArIAoJCQkiCSAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVHlwZSBzYWZldHk6IFRoZSBjYXN0IGZyb20gT2JqZWN0IHRvIFQgaXMgYWN0dWFsbHkgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZXJhc2VkIHR5cGUgT2JqZWN0XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglab3JrIHo7XG4iICsgCgkJCSIJXl5eXlxuIiArIAoJCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0KCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg0OTY4CQoJcHVibGljIHZvaWQgdGVzdDYzNygpIHsKCSAgICB0aGlzLnJ1bkNvbmZvcm1UZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8RT4ge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV4MSBleHRlbmRzIEV4Y2VwdGlvbiB7XG4iICsgCgkJCQkiCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXByaXZhdGUgdm9pZCBhMSgpIHtcbiIgKyAKCQkJCSIJCXRyeSB7XG4iICsgCgkJCQkiCQkJYTFfMSgpO1xuIiArIAoJCQkJIgkJfSBjYXRjaCAoRXgxIHNpKSB7XG4iICsgCgkJCQkiCQkJYXNzZXJ0IHNpICE9IG51bGw7XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHJvdGVjdGVkIE9iamVjdCBhMV8xKCkgdGhyb3dzIEV4MSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIglwcml2YXRlIHZvaWQgYTIoKSB7XG4iICsgCgkJCQkiCQl0cnkge1xuIiArIAoJCQkJIgkJCWEyXzEoKTtcbiIgKyAKCQkJCSIJCX0gY2F0Y2ggKEV4MiBzaSkge1xuIiArIAoJCQkJIgkJCWFzc2VydCBzaSAhPSBudWxsO1xuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXByb3RlY3RlZCBPYmplY3QgYTJfMSgpIHRocm93cyBFeDIge1xuIiArIAoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHVibGljIGZpbmFsIGNsYXNzIEV4MyBleHRlbmRzIEV4Y2VwdGlvbiB7XG4iICsgCgkJCQkiCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXByaXZhdGUgdm9pZCBhMygpIHtcbiIgKyAKCQkJCSIJCXRyeSB7XG4iICsgCgkJCQkiCQkJYTNfMSgpO1xuIiArIAoJCQkJIgkJfSBjYXRjaCAoRXgzIHNpKSB7XG4iICsgCgkJCQkiCQkJYXNzZXJ0IHNpICE9IG51bGw7XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJcHJvdGVjdGVkIE9iamVjdCBhM18xKCkgdGhyb3dzIEV4MyB7XG4iICsgCgkJCQkiCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIlxuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJmaW5hbCBjbGFzcyBFeDIgZXh0ZW5kcyBFeGNlcHRpb24ge1xuIiArIAoJCQkJIglwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxO1xuIiArIAoJCQkJIn1cbiIsCgkgICAgICAgIH0sCgkJCSIiKTsKCX0JCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MzQ3OAkKCXB1YmxpYyB2b2lkIHRlc3Q2MzgoKSB7CgkgICAgdGhpcy5ydW5Db25mb3JtVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJc3RhdGljIGludGVyZmFjZSBJTVg8UywgTD4ge1xuIiArIAoJCQkJIgkJdm9pZCBjYWxsKEwgYSwgUyBiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglzdGF0aWMgaW50ZXJmYWNlIFk8UywgTD4ge1xuIiArIAoJCQkJIgkJdm9pZCBhZGRYKGZpbmFsIElNWDxTLCBMPiBhKTtcbiIgKyAKCQkJCSIJCXZvaWQgcmVtb3ZlWChmaW5hbCBJTVg8UywgTD4gYSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJc3RhdGljIGZpbmFsIGNsYXNzIFBhaXI8VCwgVj4ge1xuIiArIAoJCQkJIgkJVCBmaXJzdDtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJCVYgc2Vjb25kO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCXN0YXRpYyBjbGFzcyBCYXI8UD4ge1xuIiArIAoJCQkJIgkJQmFyKGZpbmFsIEJsb2NraW5nUXVldWU8UD4gYSkge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIgkJfVxuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImZpbmFsIGNsYXNzIEZvbzxTLCBMPiBleHRlbmRzIFguQmFyPFguUGFpcjxMW10sIFM+PiBpbXBsZW1lbnRzIFguSU1YPFMsIEw+IHtcbiIgKyAKCQkJCSIJRm9vKGZpbmFsIEJsb2NraW5nUXVldWU8WC5QYWlyPExbXSwgUz4+IGluKSB7XG4iICsgCgkJCQkiCQlzdXBlcihpbik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJcHVibGljIHZvaWQgY2FsbChMIGEsIFMgYikge1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCSAgICAgICAgfSwKCQkJIiIpOwoJfQoJcHVibGljIHZvaWQgdGVzdDYzOSgpIHsKCSAgICB0aGlzLnJ1bkNvbmZvcm1UZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247XG4iICsgCgkJCQkiaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiQGludGVyZmFjZSBNeUFubm90YXRpb24ge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXZvaWQgdGVzdCgpIHRocm93cyBFeGNlcHRpb24ge1xuIiArIAoJCQkJIgkJQ2xhc3MgdHlwZSA9IFguY2xhc3M7XG4iICsgCgkJCQkiCQlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoXCJ0ZXN0XCIpO1xuIiArIAoJCQkJIgkJQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSB0eXBlLmdldENvbnN0cnVjdG9yKCk7XG4iICsgCgkJCQkiCQlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoXCJmaWVsZFwiKTtcbiIgKyAKCQkJCSIJCVBhY2thZ2UgcGFja2dlID0gdHlwZS5nZXRQYWNrYWdlKCk7XG4iICsgCgkJCQkiCQlNeUFubm90YXRpb24gdHlwZUFubm90ID0gZ2V0QW5ub3RhdGlvbihNeUFubm90YXRpb24uY2xhc3MpO1xuIiArIAoJCQkJIgkJTXlBbm5vdGF0aW9uIG1ldGhvZEFubm90ID0gZ2V0QW5ub3RhdGlvbihNeUFubm90YXRpb24uY2xhc3MpO1xuIiArIAoJCQkJIgkJTXlBbm5vdGF0aW9uIGNvbnN0ckFubm90ID0gZ2V0QW5ub3RhdGlvbihNeUFubm90YXRpb24uY2xhc3MpO1xuIiArIAoJCQkJIgkJTXlBbm5vdGF0aW9uIGZpZWxkQW5ub3QgPSBnZXRBbm5vdGF0aW9uKE15QW5ub3RhdGlvbi5jbGFzcyk7XG4iICsgCgkJCQkiCQlNeUFubm90YXRpb24gcGFja2dlQW5ub3QgPSBnZXRBbm5vdGF0aW9uKE15QW5ub3RhdGlvbi5jbGFzcyk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJaW50IGZpZWxkO1xuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJPFUgZXh0ZW5kcyBBbm5vdGF0aW9uPiBVIGdldEFubm90YXRpb24oQ2xhc3M8VT4gYW5ub3RhdGVkVHlwZSkge1xuIiArIAoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJICAgICAgICB9LAoJCQkiIik7Cgl9CQkKCXB1YmxpYyB2b2lkIHRlc3Q2NDAoKSB7CgkgICAgdGhpcy5ydW5Db25mb3JtVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uO1xuIiArIAoJCQkJImltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIkBpbnRlcmZhY2UgTXlBbm5vdGF0aW9uIHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIgl2b2lkIHRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHtcbiIgKyAKCQkJCSIJCUNsYXNzPD8+IHR5cGUgPSBYLmNsYXNzO1xuIiArIAoJCQkJIgkJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKFwidGVzdFwiKTtcbiIgKyAKCQkJCSIJCUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdHlwZS5nZXRDb25zdHJ1Y3RvcigpO1xuIiArIAoJCQkJIgkJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKFwiZmllbGRcIik7XG4iICsgCgkJCQkiCQlQYWNrYWdlIHBhY2tnZSA9IHR5cGUuZ2V0UGFja2FnZSgpO1xuIiArIAoJCQkJIgkJTXlBbm5vdGF0aW9uIHR5cGVBbm5vdCA9IGdldEFubm90YXRpb24oTXlBbm5vdGF0aW9uLmNsYXNzKTtcbiIgKyAKCQkJCSIJCU15QW5ub3RhdGlvbiBtZXRob2RBbm5vdCA9IGdldEFubm90YXRpb24oTXlBbm5vdGF0aW9uLmNsYXNzKTtcbiIgKyAKCQkJCSIJCU15QW5ub3RhdGlvbiBjb25zdHJBbm5vdCA9IGdldEFubm90YXRpb24oTXlBbm5vdGF0aW9uLmNsYXNzKTtcbiIgKyAKCQkJCSIJCU15QW5ub3RhdGlvbiBmaWVsZEFubm90ID0gZ2V0QW5ub3RhdGlvbihNeUFubm90YXRpb24uY2xhc3MpO1xuIiArIAoJCQkJIgkJTXlBbm5vdGF0aW9uIHBhY2tnZUFubm90ID0gZ2V0QW5ub3RhdGlvbihNeUFubm90YXRpb24uY2xhc3MpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCWludCBmaWVsZDtcbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCTxVIGV4dGVuZHMgQW5ub3RhdGlvbj4gVSBnZXRBbm5vdGF0aW9uKENsYXNzPFU+IGFubm90YXRlZFR5cGUpIHtcbiIgKyAKCQkJCSIJCXJldHVybiBudWxsO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCSAgICAgICAgfSwKCQkJIiIpOwoJfQkJCQoJcHVibGljIHZvaWQgdGVzdDY0MSgpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIkBpbnRlcmZhY2UgTXlBbm5vdGF0aW9uIHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiQFN1cHByZXNzV2FybmluZ3MoXCJhbGxcIilcbiIgKwoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJdm9pZCB0ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7XG4iICsgCgkJCQkiCQlDbGFzcyB0eXBlID0gWC5jbGFzcztcbiIgKyAKCQkJCSIJCU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZChcInRlc3RcIik7XG4iICsgCgkJCQkiCQlDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHR5cGUuZ2V0Q29uc3RydWN0b3IoKTtcbiIgKyAKCQkJCSIJCUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZChcImZpZWxkXCIpO1xuIiArIAoJCQkJIgkJUGFja2FnZSBwYWNrZ2UgPSB0eXBlLmdldFBhY2thZ2UoKTtcbiIgKyAKCQkJCSIJCU15QW5ub3RhdGlvbiB0eXBlQW5ub3QgPSB0eXBlLmdldEFubm90YXRpb24oTXlBbm5vdGF0aW9uLmNsYXNzKTtcbiIgKyAKCQkJCSIJCU15QW5ub3RhdGlvbiBtZXRob2RBbm5vdCA9IG1ldGhvZC5nZXRBbm5vdGF0aW9uKE15QW5ub3RhdGlvbi5jbGFzcyk7XG4iICsgCgkJCQkiCQlNeUFubm90YXRpb24gY29uc3RyQW5ub3QgPSBjb25zdHJ1Y3Rvci5nZXRBbm5vdGF0aW9uKE15QW5ub3RhdGlvbi5jbGFzcyk7XG4iICsgCgkJCQkiCQlNeUFubm90YXRpb24gZmllbGRBbm5vdCA9IGZpZWxkLmdldEFubm90YXRpb24oTXlBbm5vdGF0aW9uLmNsYXNzKTtcbiIgKyAKCQkJCSIJCU15QW5ub3RhdGlvbiBwYWNrZ2VBbm5vdCA9IHBhY2tnZS5nZXRBbm5vdGF0aW9uKE15QW5ub3RhdGlvbi5jbGFzcyk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJaW50IGZpZWxkO1xuIiArIAoJCQkJIn1cbiIsCgkgICAgICAgIH0sCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTMpXG4iICsgCgkJCSIJTXlBbm5vdGF0aW9uIHR5cGVBbm5vdCA9IHR5cGUuZ2V0QW5ub3RhdGlvbihNeUFubm90YXRpb24uY2xhc3MpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICBeXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gQW5ub3RhdGlvbiB0byBNeUFubm90YXRpb25cbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxNSlcbiIgKyAKCQkJIglNeUFubm90YXRpb24gY29uc3RyQW5ub3QgPSBjb25zdHJ1Y3Rvci5nZXRBbm5vdGF0aW9uKE15QW5ub3RhdGlvbi5jbGFzcyk7XG4iICsgCgkJCSIJICAgICAgICAgICAgIF5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIEFubm90YXRpb24gdG8gTXlBbm5vdGF0aW9uXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKCXB1YmxpYyB2b2lkIHRlc3Q2NDIoKSB7CgkgICAgdGhpcy5ydW5Db25mb3JtVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qO1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIkBpbnRlcmZhY2UgTXlBbm5vdGF0aW9uIHtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiQFN1cHByZXNzV2FybmluZ3MoXCJhbGxcIilcbiIgKwoJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJCSIJdm9pZCB0ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7XG4iICsgCgkJCQkiCQlDbGFzczw/PiB0eXBlID0gWC5jbGFzcztcbiIgKyAKCQkJCSIJCU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZChcInRlc3RcIik7XG4iICsgCgkJCQkiCQlDb25zdHJ1Y3Rvcjw/PiBjb25zdHJ1Y3RvciA9IHR5cGUuZ2V0Q29uc3RydWN0b3IoKTtcbiIgKyAKCQkJCSIJCUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZChcImZpZWxkXCIpO1xuIiArIAoJCQkJIgkJUGFja2FnZSBwYWNrZ2UgPSB0eXBlLmdldFBhY2thZ2UoKTtcbiIgKyAKCQkJCSIJCU15QW5ub3RhdGlvbiB0eXBlQW5ub3QgPSB0eXBlLmdldEFubm90YXRpb24oTXlBbm5vdGF0aW9uLmNsYXNzKTtcbiIgKyAKCQkJCSIJCU15QW5ub3RhdGlvbiBtZXRob2RBbm5vdCA9IG1ldGhvZC5nZXRBbm5vdGF0aW9uKE15QW5ub3RhdGlvbi5jbGFzcyk7XG4iICsgCgkJCQkiCQlNeUFubm90YXRpb24gY29uc3RyQW5ub3QgPSBjb25zdHJ1Y3Rvci5nZXRBbm5vdGF0aW9uKE15QW5ub3RhdGlvbi5jbGFzcyk7XG4iICsgCgkJCQkiCQlNeUFubm90YXRpb24gZmllbGRBbm5vdCA9IGZpZWxkLmdldEFubm90YXRpb24oTXlBbm5vdGF0aW9uLmNsYXNzKTtcbiIgKyAKCQkJCSIJCU15QW5ub3RhdGlvbiBwYWNrZ2VBbm5vdCA9IHBhY2tnZS5nZXRBbm5vdGF0aW9uKE15QW5ub3RhdGlvbi5jbGFzcyk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJaW50IGZpZWxkO1xuIiArIAoJCQkJIn1cbiIsCgkgICAgICAgIH0sCgkJCSIiKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDY0MygpIHsKCSAgICB0aGlzLnJ1bkNvbmZvcm1UZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJc3RhdGljIDxVPiBVIGZvbyhVIHUpIHtcbiIgKyAKCQkJCSIJCXJldHVybiB1O1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCVxuIiArIAoJCQkJIgl2b2lkIGJhcihYIHgpIHtcbiIgKyAKCQkJCSIJCVN0cmluZyBzdHIgPSB4LmZvbyhcImhlbGxvXCIpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiwKCSAgICAgICAgfSwKCQkJIiIpOwoJfQkJCglwdWJsaWMgdm9pZCB0ZXN0NjQ0KCkgewoJICAgIHRoaXMucnVuTmVnYXRpdmVUZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkJIglcbiIgKyAKCQkJCSIJPFU+IFUgZm9vKFUgdSkge1xuIiArIAoJCQkJIgkJcmV0dXJuIHU7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSIJXG4iICsgCgkJCQkiCXZvaWQgYmFyKFggeCkge1xuIiArIAoJCQkJIgkJU3RyaW5nIHN0ciA9IHguZm9vKFwiaGVsbG9cIik7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgpXHJcbiIgKyAKCQkJIglTdHJpbmcgc3RyID0geC5mb28oXCJoZWxsb1wiKTtcclxuIiArIAoJCQkiCSAgICAgICBeXl5cbiIgKyAKCQkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gT2JqZWN0IHRvIFN0cmluZ1xuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOClcclxuIiArIAoJCQkiCVN0cmluZyBzdHIgPSB4LmZvbyhcImhlbGxvXCIpO1xyXG4iICsgCgkJCSIJICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIG1ldGhvZCBmb28oT2JqZWN0KSBiZWxvbmdzIHRvIHRoZSByYXcgdHlwZSBYLiBSZWZlcmVuY2VzIHRvIGdlbmVyaWMgdHlwZSBYPFQ+IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKCXB1YmxpYyB2b2lkIF90ZXN0NjQ1KCkgewoJICAgIHRoaXMucnVuTmVnYXRpdmVUZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkiaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiQGludGVyZmFjZSBNeUFubm90YXRpb24ge1xuIiArIAoJCQkJIn1cbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJjbGFzcyBYIHtcbiIgKyAKCQkJCSIJdm9pZCBiYXIoWENsYXNzPFN0cmluZz4gYXJnKSB7XG4iICsgCgkJCQkiCQlYQ2xhc3MgeGMgPSBuZXcgWENsYXNzKCk7XG4iICsgCgkJCQkiCQlTdHJpbmcgc3RyID0geGMuZ2V0Q29uc3RydWN0b3IoKS5nZXRBbm5vdGF0aW9uKGFyZyk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgWENsYXNzPFU+IHtcbiIgKyAKCQkJCSIJWENvbnN0cnVjdG9yPFU+IGdldENvbnN0cnVjdG9yKCkge1xuIiArIAoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgWENvbnN0cnVjdG9yPFY+IHtcbiIgKyAKCQkJCSIJPFcgZXh0ZW5kcyBBbm5vdGF0aW9uPiBXIGdldEFubm90YXRpb24oWENsYXNzPFc+IGNsKSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIn1cbiIsCgkgICAgICAgIH0sCgkJCSJzaG91bGQgY29tcGxhaW4gYWJvdXQgYm91bmQgY2hlY2sgZmFpbHVyZSBvbiAjZ2V0QW5ub3RhdGlvbihYQ2xhc3M8U3RyaW5nPikiKTsKCX0JCQkKCXB1YmxpYyB2b2lkIHRlc3Q2NDYoKSB7CgkgICAgdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCiAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCU91dGVyLklubmVyIGlubmVyID0gbmV3IE91dGVyKCkubmV3IElubmVyKCk7XG4iICsgCgkJCQkiCQlYIHggPSBpbm5lci5zZXRPdXRlclQobmV3IFgoKSk7XG4iICsgCgkJCQkiCQlcbiIgKyAKCQkJCSIJCU91dGVyPFN0cmluZz4uSW5uZXIgaW5uZXJTID0gaW5uZXI7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiY2xhc3MgT3V0ZXI8VD4ge1xuIiArIAoJCQkJIglUIHQ7XG4iICsgCgkJCQkiCWNsYXNzIElubmVyIHtcbiIgKyAKCQkJCSIJCVQgc2V0T3V0ZXJUKFQgdDEpIHtcbiIgKyAKCQkJCSIJCQl0ID0gdDE7XG4iICsgCgkJCQkiCQkJcmV0dXJuIHQ7XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJWCB4ID0gaW5uZXIuc2V0T3V0ZXJUKG5ldyBYKCkpO1xuIiArIAoJCQkiCSAgXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBPYmplY3QgdG8gWFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkJIglYIHggPSBpbm5lci5zZXRPdXRlclQobmV3IFgoKSk7XG4iICsgCgkJCSIJICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIG1ldGhvZCBzZXRPdXRlclQoT2JqZWN0KSBiZWxvbmdzIHRvIHRoZSByYXcgdHlwZSBPdXRlci5Jbm5lci4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgT3V0ZXI8VD4uSW5uZXIgc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJCSIJT3V0ZXI8U3RyaW5nPi5Jbm5lciBpbm5lclMgPSBpbm5lcjtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGV4cHJlc3Npb24gb2YgdHlwZSBPdXRlci5Jbm5lciBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIE91dGVyPFN0cmluZz4uSW5uZXJcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQkKCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk0NjQ0CglwdWJsaWMgdm9pZCB0ZXN0NjQ3KCkgewoJICAgIHRoaXMucnVuTmVnYXRpdmVUZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCQkiCQlPdXRlci5Jbm5lciBpbm5lciA9IG5ldyBPdXRlcigpLm5ldyBJbm5lcigpO1xuIiArIAoJCQkJIgkJWCB4ID0gaW5uZXIuc2V0KG5ldyBYKCkpO1xuIiArIAoJCQkJIgkJXG4iICsgCgkJCQkiCQlPdXRlcjxTdHJpbmc+LklubmVyIGlubmVyUyA9IGlubmVyO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkifVxuIiArIAoJCQkJIlxuIiArIAoJCQkJImNsYXNzIE91dGVyPFQ+IHtcbiIgKyAKCQkJCSIJVCB0O1xuIiArIAoJCQkJIglzdGF0aWMgY2xhc3MgSW5uZXI8VT4ge1xuIiArIAoJCQkJIgkJVSBzZXQoVSB1KSB7XG4iICsgCgkJCQkiCQkJcmV0dXJuIHU7XG4iICsgCgkJCQkiCQl9XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJWCB4ID0gaW5uZXIuc2V0KG5ldyBYKCkpO1xuIiArIAoJCQkiCSAgXlxuIiArIAoJCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBPYmplY3QgdG8gWFxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKCQkJIglYIHggPSBpbm5lci5zZXQobmV3IFgoKSk7XG4iICsgCgkJCSIJICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIG1ldGhvZCBzZXQoT2JqZWN0KSBiZWxvbmdzIHRvIHRoZSByYXcgdHlwZSBPdXRlci5Jbm5lci4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgT3V0ZXI8VD4uSW5uZXI8VT4gc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCQkiCU91dGVyPFN0cmluZz4uSW5uZXIgaW5uZXJTID0gaW5uZXI7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCQkiVGhlIG1lbWJlciB0eXBlIE91dGVyPFN0cmluZz4uSW5uZXIgY2Fubm90IGJlIHF1YWxpZmllZCB3aXRoIGEgcGFyYW1ldGVyaXplZCB0eXBlLCBzaW5jZSBpdCBpcyBzdGF0aWMuIFJlbW92ZSBhcmd1bWVudHMgZnJvbSBxdWFsaWZ5aW5nIHR5cGUgT3V0ZXI8U3RyaW5nPlxuIiArIAoJCQkiLS0tLS0tLS0tLVxuIik7Cgl9CgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NDY0NCAtIHZhcmlhdGlvbgkKCXB1YmxpYyB2b2lkIHRlc3Q2NDgoKSB7CgkgICAgdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCiAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAiWC5qYXZhIiwKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXZvaWQgZm9vKCkge1xuIiArIAoJCQkJIgkJQFN1cHByZXNzV2FybmluZ3MoXCJ1bnVzZWRcIilcbiIgKyAKCQkJCSIJCU91dGVyLklubmVyIGlubmVyID0gbmV3IFN1YigpLmdldCgpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCVpvcmsgejtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgT3V0ZXI8VD4ge1xuIiArIAoJCQkJIgljbGFzcyBJbm5lcjxVPiB7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgU3ViIGV4dGVuZHMgT3V0ZXIge1xuIiArIAoJCQkJIglJbm5lciBnZXQoKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkifVxuIiwKCSAgICAgICAgfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCQkiCVpvcmsgejtcbiIgKyAKCQkJIgleXl5eXG4iICsgCgkJCSJab3JrIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQkJCQoJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTQ2NDQgLSB2YXJpYXRpb24JCglwdWJsaWMgdm9pZCB0ZXN0NjQ5KCkgewoJICAgIHRoaXMucnVuTmVnYXRpdmVUZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKCQkJCSIJCUBTdXBwcmVzc1dhcm5pbmdzKFwidW51c2VkXCIpXG4iICsgCgkJCQkiCQlPdXRlcjxTdHJpbmc+LklubmVyIGlubmVyID0gbmV3IFN1YigpLmdldCgpO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiCVpvcmsgejtcbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgT3V0ZXI8VD4ge1xuIiArIAoJCQkJIgljbGFzcyBJbm5lciB7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiY2xhc3MgU3ViIGV4dGVuZHMgT3V0ZXIge1xuIiArIAoJCQkJIglJbm5lciBnZXQoKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCQkifVxuIiwKCSAgICAgICAgfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJCSIJT3V0ZXI8U3RyaW5nPi5Jbm5lciBpbm5lciA9IG5ldyBTdWIoKS5nZXQoKTtcbiIgKyAKCQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIGV4cHJlc3Npb24gb2YgdHlwZSBPdXRlci5Jbm5lciBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIE91dGVyPFN0cmluZz4uSW5uZXJcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCQkiCVpvcmsgejtcbiIgKyAKCQkJIgleXl5eXG4iICsgCgkJCSJab3JrIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIpOwoJfQoJCgkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04OTQ0MAkKCXB1YmxpYyB2b2lkIHRlc3Q2NTAoKSB7CgkgICAgdGhpcy5ydW5Db25mb3JtVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKCQkJCSJwL0EuamF2YSIsCgkJCQkicGFja2FnZSBwO1xuIiArCgkJCQkiXG4iICsKCQkJCSJwdWJsaWMgaW50ZXJmYWNlIEE8Vj4ge1xuIiArCgkJCQkiCXB1YmxpYyBzdGF0aWMgZW51bSBTdHVmZiB7XG4iICsKCQkJCSIJCUZJUlNULCBTRUNPTkQsIFRISVJEXG4iICsKCQkJCSIJfTtcbiIgKwoJCQkJIn0iLAogICAgICAgICAgICB9LAogICAgICAgICAgICAiIik7CgkgICAgdGhpcy5ydW5Db25mb3JtVGVzdCgKCSAgICAJbmV3IFN0cmluZ1tdIHsKCQkJCSJxL1NhbXBsZUNsYXNzMi5qYXZhIiwKCQkJCSJwYWNrYWdlIHE7XG4iICsKCQkJCSJcbiIgKwoJCQkJImltcG9ydCBwLkEuU3R1ZmY7XG4iICsKCQkJCSJcbiIgKwoJCQkJInB1YmxpYyBjbGFzcyBTYW1wbGVDbGFzczIge1xuIiArCgkJCQkiICBwdWJsaWMgdm9pZCBkb1NvbWV0aGluZyhTdHVmZiB0aGluZykge1xuIiArCgkJCQkiICAgIFxuIiArCgkJCQkiICB9XG4iICsKCQkJCSJ9IgogICAgICAgICAgICB9LAoJCQkiIiwKCQkJbnVsbCwKCQkJZmFsc2UsCgkJCW51bGwpOwoJCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJCW5ldyBTdHJpbmdbXSB7CgkJCQkicS9TYW1wbGVDbGFzczMuamF2YSIsCgkJCQkicGFja2FnZSBxO1xuIiArCgkJCQkiXG4iICsKCQkJCSJpbXBvcnQgcC5BO1xuIiArCgkJCQkiXG4iICsKCQkJCSJwdWJsaWMgY2xhc3MgU2FtcGxlQ2xhc3MzIHtcbiIgKwoJCQkJIglwdWJsaWMgdm9pZCBkb1NvbWV0aGluZygpIHtcbiIgKwoJCQkJIgkJU2FtcGxlQ2xhc3MyIHNhbXBsZSA9IG5ldyBTYW1wbGVDbGFzczIoKTtcbiIgKwoJCQkJIgkJc2FtcGxlLmRvU29tZXRoaW5nKEEuU3R1ZmYuRklSU1QpO1xuIiArCgkJCQkiCX1cbiIgKwoJCQkJIn0iLAoJCQl9LAoJCQkiIiwKCQkJbnVsbCwKCQkJZmFsc2UsCgkJCW51bGwpOwoJfQoJcHVibGljIHZvaWQgdGVzdDY1MSgpIHsKCSAgICB0aGlzLnJ1bkNvbmZvcm1UZXN0KAogICAgICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgIlguamF2YSIsCgkJCQkicHVibGljIGNsYXNzIFg8VT4ge1xuIiArIAoJCQkJIlxuIiArIAoJCQkJIglpbnQgZmllbGQ7XG4iICsgCgkJCQkiCXN0YXRpYyBpbnQgRklFTEQ7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXtcbiIgKyAKCQkJCSIJCWZpZWxkID0gMTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglzdGF0aWMge1xuIiArIAoJCQkJIgkJRklFTEQgPSAxO1xuIiArIAoJCQkJIgl9XG4iICsgCgkJCQkiXG4iICsgCgkJCQkiCXB1YmxpYyBWYWx1ZXM8VT4gZm9vKEJveDw/IGV4dGVuZHMgVT4gYm94KSB7XG4iICsgCgkJCQkiCQlyZXR1cm4gc2VsZWN0KGJveC5nZXRWYWx1ZXMoKSk7IC8vIDFcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglwdWJsaWMgc3RhdGljIDxHPiBWYWx1ZXM8Rz4gc2VsZWN0KFZhbHVlczw/IGV4dGVuZHMgRz4gdikge1xuIiArIAoJCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iICsgCgkJCQkiYWJzdHJhY3QgY2xhc3MgQm94PFYgZXh0ZW5kcyBqYXZhLmlvLlNlcmlhbGl6YWJsZT4geyAvLyBBZGRlZCBib3VuZCBmb3IgVlxuIiArIAoJCQkJIglhYnN0cmFjdCBWYWx1ZXM8Vj4gZ2V0VmFsdWVzKCk7XG4iICsgCgkJCQkifVxuIiArIAoJCQkJImFic3RyYWN0IGNsYXNzIFZhbHVlczxUPiB7XG4iICsgCgkJCQkifVxuIiwKCSAgICAgICAgfSwKCQkJIiIpOwoJfQkKCXB1YmxpYyB2b2lkIHRlc3Q2NTIoKSB7CgkgICAgdGhpcy5ydW5Db25mb3JtVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIgICAgICAgIENvbGxlY3Rpb248Pz4gYyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTtcbiIgKyAKCQkJCSIgICAgICAgIFNldDw/PiBzID0gKFNldDw/PiljO1xuIiArIAoJCQkJIiAgICB9XG4iICsgCgkJCQkifVxuIiwKCSAgICAgICAgfSwKCQkJIiIpOwoJfQkKCXB1YmxpYyB2b2lkIHRlc3Q2NTMoKSB7CgkgICAgdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCiAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAiWC5qYXZhIiwKCQkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCQkiXG4iICsgCgkJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkJIglzdGF0aWMgcHVibGljIDxUIGV4dGVuZHMgQ29sbGVjdGlvbj4gdm9pZCB3b3JrYXJvdW5kKFQgYSwgVCBiKSB7XG4iICsgCgkJCQkiCQlhLmFkZEFsbChiKTtcbiIgKyAKCQkJCSIJfVxuIiArIAoJCQkJIglab3JrIHo7XG4iICsgCgkJCQkifVxuIiwKCSAgICAgICAgfSwKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJCSIJYS5hZGRBbGwoYik7XG4iICsgCgkJCSIJXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgbWV0aG9kIGFkZEFsbChDb2xsZWN0aW9uKSBiZWxvbmdzIHRvIHRoZSByYXcgdHlwZSBDb2xsZWN0aW9uLiBSZWZlcmVuY2VzIHRvIGdlbmVyaWMgdHlwZSBDb2xsZWN0aW9uPEU+IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkJIglab3JrIHo7XG4iICsgCgkJCSIJXl5eXlxuIiArIAoJCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQoJcHVibGljIHZvaWQgdGVzdDY1NCgpIHsKCSAgICB0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICJYLmphdmEiLAoJCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJCSIJCU1hcCBteU1hcCA9IG5ldyBIYXNoTWFwKCk7XG4iICsgCgkJCQkiCQlteU1hcC5wdXQoXCJrZXkxXCIsIFwiMVwiKTtcbiIgKyAKCQkJCSJcbiIgKyAKCQkJCSIJCWZvciAoTWFwLkVudHJ5IGUgOiBteU1hcC5lbnRyeVNldCgpKVxuIiArIAoJCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihcIktleSA9IFwiICsgZS5nZXRLZXkoKSArIFwiIFZhbHVlID0gXCIgKyBlLmdldFZhbHVlKCkpO1xuIiArIAoJCQkJIgkJU2V0PE1hcC5FbnRyeT4gc2V0ID0gbXlNYXAuZW50cnlTZXQoKTtcbiIgKyAKCQkJCSIJCWZvciAoTWFwLkVudHJ5IGUgOiBzZXQpXG4iICsgCgkJCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKFwiS2V5ID0gXCIgKyBlLmdldEtleSgpICsgXCIgVmFsdWUgPSBcIiArIGUuZ2V0VmFsdWUoKSk7XG4iICsgCgkJCQkiCX1cbiIgKyAKCQkJCSJ9XG4iLAoJICAgICAgICB9LAoJCQkiLS0tLS0tLS0tLVxuIiArIAoJCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkJIglteU1hcC5wdXQoXCJrZXkxXCIsIFwiMVwiKTtcbiIgKyAKCQkJIgleXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIHNhZmV0eTogVGhlIG1ldGhvZCBwdXQoT2JqZWN0LCBPYmplY3QpIGJlbG9uZ3MgdG8gdGhlIHJhdyB0eXBlIE1hcC4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgTWFwPEssVj4gc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWRcbiIgKyAKCQkJIi0tLS0tLS0tLS1cbiIgKyAKCQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCQkiCWZvciAoTWFwLkVudHJ5IGUgOiBteU1hcC5lbnRyeVNldCgpKVxuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIGVsZW1lbnQgdHlwZSBPYmplY3QgdG8gTWFwLkVudHJ5XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iICsgCgkJCSIzLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxMClcbiIgKyAKCQkJIglTZXQ8TWFwLkVudHJ5PiBzZXQgPSBteU1hcC5lbnRyeVNldCgpO1xuIiArIAoJCQkiCSAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIFNldCBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIFNldDxNYXAuRW50cnk+XG4iICsgCgkJCSItLS0tLS0tLS0tXG4iKTsKCX0JCQkKLy8gamF2YWMgaW5jb3JyZWN0bHkgcmVqZWN0cyB0aGUgY2FzdApwdWJsaWMgdm9pZCB0ZXN0NjU1KCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIgICAgc3RhdGljIGNsYXNzIEJCPFQsIFM+IHsgfVxuIiArIAoJCQkiICAgIHN0YXRpYyBjbGFzcyBCRDxUPiBleHRlbmRzIEJCPFQsIFQ+IHsgfVxuIiArIAoJCQkiICAgIHZvaWQgZigpIHtcbiIgKyAKCQkJIiAgICAgICAgQkI8PyBleHRlbmRzIE51bWJlciwgPyBzdXBlciBJbnRlZ2VyPiBiYiA9IG51bGw7XG4iICsgCgkJCSIgICAgICAgIE9iamVjdCBvID0gKEJEPE51bWJlcj4pIGJiO1xuIiArIAoJCQkiICAgIH1cbiIgKyAKCQkJIiAgICBab3JrIHo7XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkiCU9iamVjdCBvID0gKEJEPE51bWJlcj4pIGJiO1xuIiArIAoJCSIJICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiVHlwZSBzYWZldHk6IFRoZSBjYXN0IGZyb20gWC5CQjxjYXB0dXJlLW9mID8gZXh0ZW5kcyBOdW1iZXIsY2FwdHVyZS1vZiA/IHN1cGVyIEludGVnZXI+IHRvIFguQkQ8TnVtYmVyPiBpcyBhY3R1YWxseSBjaGVja2luZyBhZ2FpbnN0IHRoZSBlcmFzZWQgdHlwZSBYLkJEXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJIglab3JrIHo7XG4iICsgCgkJIgleXl5eXG4iICsgCgkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQkKcHVibGljIHZvaWQgdGVzdDY1NigpIHsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCSJcbiIgKyAKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIglwcm90ZWN0ZWQgVmVjdG9yPFN0cmluZz4gdiA9IG51bGw7XG4iICsgCgkJCSJcbiIgKyAKCQkJIglwdWJsaWMgdm9pZCBmKCkge1xuIiArIAoJCQkiCQkoKFN0cmluZykgKHYuZWxlbWVudEF0KDApKSkuY2hhckF0KDApO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIlxuIiArIAoJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIlNVQ0NFU1MiKTsKfQkKcHVibGljIHZvaWQgdGVzdDY1NygpIHsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWHtcbiIgKyAKCQkJIglcbiIgKyAKCQkJIglwcml2YXRlIHN0YXRpYyBjbGFzcyBHZW5lcmljV3JhcHBlcjxFbGVtPiAge1xuIiArIAoJCQkiCQlwcml2YXRlIEVsZW0gdGhlT2JqZWN0O1xuIiArIAoJCQkiCQlwdWJsaWMgR2VuZXJpY1dyYXBwZXIoRWxlbSBhcmcpIHtcbiIgKyAKCQkJIgkJCXRoZU9iamVjdCA9IGFyZztcbiIgKyAKCQkJIgkJfVxuIiArIAoJCQkiCQlwdWJsaWMgPFQgZXh0ZW5kcyBFbGVtPiBHZW5lcmljV3JhcHBlciAoR2VuZXJpY1dyYXBwZXI8VD4gb3RoZXIpIHtcbiIgKyAKCQkJIgkJCXRoaXMudGhlT2JqZWN0ID0gb3RoZXIudGhlT2JqZWN0O1xuIiArIAoJCQkiCQl9XG4iICsgCgkJCSIJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7XG4iICsgCgkJCSIJCQlyZXR1cm4gdGhlT2JqZWN0LnRvU3RyaW5nKCk7XG4iICsgCgkJCSIJCX1cbiIgKyAKCQkJIgl9XG4iICsgCgkJCSIJcHJpdmF0ZSBzdGF0aWMgR2VuZXJpY1dyYXBwZXI8U3RyaW5nPiBtZXRob2QgKE9iamVjdCB3cmFwcGVkU3RyaW5nKSB7XG4iICsgCgkJCSIJCXJldHVybiAoR2VuZXJpY1dyYXBwZXI8U3RyaW5nPikgd3JhcHBlZFN0cmluZztcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJcbiIgKyAKCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCSIJCVN5c3RlbS5vdXQucHJpbnQobWV0aG9kKG5ldyBHZW5lcmljV3JhcHBlcjxTdHJpbmc+KFwiYWJjXCIpKSk7XG4iICsgCgkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihtZXRob2QobmV3IEdlbmVyaWNXcmFwcGVyPEV4Y2VwdGlvbj4obmV3IEV4Y2VwdGlvbigpKSkpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiYWJjamF2YS5sYW5nLkV4Y2VwdGlvbiIpOwp9CQpwdWJsaWMgdm9pZCB0ZXN0NjU4KCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWHtcbiIgKyAKCQkJIglcbiIgKyAKCQkJIglwcml2YXRlIHN0YXRpYyBjbGFzcyBHZW5lcmljV3JhcHBlcjxFbGVtPiAge1xuIiArIAoJCQkiCQlab3JrIHo7XG4iICsKCQkJIgkJcHJpdmF0ZSBFbGVtIHRoZU9iamVjdDtcbiIgKyAKCQkJIgkJcHVibGljIEdlbmVyaWNXcmFwcGVyKEVsZW0gYXJnKSB7XG4iICsgCgkJCSIJCQl0aGVPYmplY3QgPSBhcmc7XG4iICsgCgkJCSIJCX1cbiIgKyAKCQkJIgkJcHVibGljIDxUIGV4dGVuZHMgRWxlbT4gR2VuZXJpY1dyYXBwZXIgKEdlbmVyaWNXcmFwcGVyPFQ+IG90aGVyKSB7XG4iICsgCgkJCSIJCQl0aGlzLnRoZU9iamVjdCA9IG90aGVyLnRoZU9iamVjdDtcbiIgKyAKCQkJIgkJfVxuIiArIAoJCQkiCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkge1xuIiArIAoJCQkiCQkJcmV0dXJuIHRoZU9iamVjdC50b1N0cmluZygpO1xuIiArIAoJCQkiCQl9XG4iICsgCgkJCSIJfVxuIiArIAoJCQkiCXByaXZhdGUgc3RhdGljIEdlbmVyaWNXcmFwcGVyPFN0cmluZz4gbWV0aG9kIChPYmplY3Qgd3JhcHBlZFN0cmluZykge1xuIiArIAoJCQkiCQlyZXR1cm4gKEdlbmVyaWNXcmFwcGVyPFN0cmluZz4pIHdyYXBwZWRTdHJpbmc7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkiXG4iICsgCgkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkiCQlTeXN0ZW0ub3V0LnByaW50KG1ldGhvZChuZXcgR2VuZXJpY1dyYXBwZXI8U3RyaW5nPihcImFiY1wiKSkpO1xuIiArIAoJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4obWV0aG9kKG5ldyBHZW5lcmljV3JhcHBlcjxFeGNlcHRpb24+KG5ldyBFeGNlcHRpb24oKSkpKTtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJIglab3JrIHo7XG4iICsgCgkJIgleXl5eXG4iICsgCgkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEyKVxuIiArIAoJCSIJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHtcbiIgKyAKCQkiCSAgICAgICAgICAgICAgXl5eXl5eXl5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIHRvU3RyaW5nKCkgb2YgdHlwZSBYLkdlbmVyaWNXcmFwcGVyPEVsZW0+IHNob3VsZCBiZSB0YWdnZWQgd2l0aCBAT3ZlcnJpZGUgc2luY2UgaXQgYWN0dWFsbHkgb3ZlcnJpZGVzIGEgc3VwZXJjbGFzcyBtZXRob2RcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIzLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxNylcbiIgKyAKCQkiCXJldHVybiAoR2VuZXJpY1dyYXBwZXI8U3RyaW5nPikgd3JhcHBlZFN0cmluZztcbiIgKyAKCQkiCSAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJUeXBlIHNhZmV0eTogVGhlIGNhc3QgZnJvbSBPYmplY3QgdG8gWC5HZW5lcmljV3JhcHBlcjxTdHJpbmc+IGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIFguR2VuZXJpY1dyYXBwZXJcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0JCnB1YmxpYyB2b2lkIHRlc3Q2NTkoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImltcG9ydCBqYXZhLmxhbmcucmVmLio7XG4iICsgCgkJCSJcbiIgKyAKCQkJIkBTdXBwcmVzc1dhcm5pbmdzKFwidW51c2VkXCIpXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWDxLLCBWPiBleHRlbmRzIFdlYWtSZWZlcmVuY2U8Vj4ge1xuIiArIAoJCQkiCVpvcmsgejtcbiIgKyAKCQkJIglzdGF0aWMgUmVmZXJlbmNlUXVldWU8SW50ZWdlcj4gcXVldWUgPSBuZXcgUmVmZXJlbmNlUXVldWU8SW50ZWdlcj4oKTtcbiIgKyAKCQkJIlxuIiArIAoJCQkiCXByaXZhdGUgSyBrZXk7XG4iICsgCgkJCSJcbiIgKyAKCQkJIglwdWJsaWMgWChLIGtleSwgViB2YWx1ZSwgUmVmZXJlbmNlUXVldWU8Vj4gcXVldWUpIHtcbiIgKyAKCQkJIgkJc3VwZXIodmFsdWUsIHF1ZXVlKTtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJcbiIgKyAKCQkJIglwdWJsaWMgSyBnZXRLZXkoKSB7XG4iICsgCgkJCSIJCXJldHVybiBrZXk7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkiCUBPdmVycmlkZVxuIiArIAoJCQkiCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7XG4iICsgCgkJCSIJCXJldHVybiBcImtleTpcIiArIGtleTtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJcbiIgKyAKCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmcpIHRocm93cyBFeGNlcHRpb24ge1xuIiArIAoJCQkiCQlYPFN0cmluZywgSW50ZWdlcj4gcmVmID0gbmV3IFg8U3RyaW5nLCBJbnRlZ2VyPihcIkR1bW15IEtleVwiLCBuZXcgSW50ZWdlcig1KSwgcXVldWUpO1xuIiArIAoJCQkiCQluZXcgVGhyZWFkKCkge1xuIiArIAoJCQkiCQkJQE92ZXJyaWRlXG4iICsgCgkJCSIJCQlwdWJsaWMgdm9pZCBydW4oKSB7XG4iICsgCgkJCSIJCQkJZm9yICg7Oykge1xuIiArIAoJCQkiCQkJCQkvLyBmb3JjZSByZWYgdG8gYmUgY2xlYXJlZFxuIiArIAoJCQkiCQkJCQlTeXN0ZW0uZ2MoKTtcbiIgKyAKCQkJIgkJCQl9XG4iICsgCgkJCSIJCQl9XG4iICsgCgkJCSIJCX0uc3RhcnQoKTtcbiIgKyAKCQkJIlxuIiArIAoJCQkiCQlYPFN0cmluZywgSW50ZWdlcj4gZnJvbVF1ZXVlID0gKFg8U3RyaW5nLCBJbnRlZ2VyPikgcXVldWUucmVtb3ZlKCk7XG4iICsgCgkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihmcm9tUXVldWUpO1xuIiArIAoJCQkiCQlTeXN0ZW0uZXhpdCgwKTtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJIglab3JrIHo7XG4iICsgCgkJIgleXl5eXG4iICsgCgkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDM0KVxuIiArIAoJCSIJWDxTdHJpbmcsIEludGVnZXI+IGZyb21RdWV1ZSA9IChYPFN0cmluZywgSW50ZWdlcj4pIHF1ZXVlLnJlbW92ZSgpO1xuIiArIAoJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIFJlZmVyZW5jZTxjYXB0dXJlLW9mID8gZXh0ZW5kcyBJbnRlZ2VyPiB0byBYPFN0cmluZyxJbnRlZ2VyPiBpcyBhY3R1YWxseSBjaGVja2luZyBhZ2FpbnN0IHRoZSBlcmFzZWQgdHlwZSBYXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9CQpwdWJsaWMgdm9pZCB0ZXN0NjYwKCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIlxuIiArIAoJCQkiCWJvb2xlYW4gcnVuKFggeCkge1xuIiArIAoJCQkiCQlyZXR1cm4gZmFsc2U7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkiCTxUPiB2b2lkIHJ1bihDbGFzczxUPiBjdCkge1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIlxuIiArIAoJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJIgkJYm9vbGVhbiBiID0gbmV3IFgoKS5ydW4obmV3IFgoKXt9KTtcbiIgKyAKCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIlNVQ0NFU1MiKTsKfQkKLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTUwNjYKcHVibGljIHZvaWQgdGVzdDY2MSgpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkicHVibGljIGNsYXNzIFg8UyBleHRlbmRzIENvbXBhcmFibGU8Uz4+IHtcbiIgKyAKCQkJIiAgIHB1YmxpYyBYKCkge1xuIiArIAoJCQkiICAgICAgIFMgYSA9IChTKShJbnRlZ2VyKTM7XG4iICsgCgkJCSIgICB9XG4iICsgCgkJCSIJWm9yayB6O1xuIiArCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJIglTIGEgPSAoUykoSW50ZWdlcikzO1xuIiArIAoJCSIJICAgICAgXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJDYW5ub3QgY2FzdCBmcm9tIEludGVnZXIgdG8gU1xuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJIglTIGEgPSAoUykoSW50ZWdlcikzO1xuIiArIAoJCSIJICAgICAgICAgXl5eXl5eXl5eXlxuIiArIAoJCSJVbm5lY2Vzc2FyeSBjYXN0IGZyb20gaW50IHRvIEludGVnZXJcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkiCVpvcmsgejtcbiIgKyAKCQkiCV5eXl5cbiIgKyAKCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9CQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTA2NiAtIHZhcmlhdGlvbgpwdWJsaWMgdm9pZCB0ZXN0NjYyKCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWDxTIGV4dGVuZHMgQ29tcGFyYWJsZTxTdHJpbmc+PiB7XG4iICsgCgkJCSIgICBwdWJsaWMgWCgpIHtcbiIgKyAKCQkJIiAgICAgICBTIGEgPSAoUykoSW50ZWdlcikzOyAvLyB0aGlzIHNob3VsZCBmYWlsXG4iICsgCgkJCSIgICB9XG4iICsKCQkJIglab3JrIHo7XG4iICsKCQkJIn0iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJIglTIGEgPSAoUykoSW50ZWdlcikzOyAvLyB0aGlzIHNob3VsZCBmYWlsXG4iICsgCgkJIgkgICAgICBeXl5eXl5eXl5eXl5eXG4iICsgCgkJIkNhbm5vdCBjYXN0IGZyb20gSW50ZWdlciB0byBTXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkiCVMgYSA9IChTKShJbnRlZ2VyKTM7IC8vIHRoaXMgc2hvdWxkIGZhaWxcbiIgKyAKCQkiCSAgICAgICAgIF5eXl5eXl5eXl5cbiIgKyAKCQkiVW5uZWNlc3NhcnkgY2FzdCBmcm9tIGludCB0byBJbnRlZ2VyXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJIglab3JrIHo7XG4iICsgCgkJIgleXl5eXG4iICsgCgkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQkKLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTUwNjYgLSB2YXJpYXRpb24KcHVibGljIHZvaWQgdGVzdDY2MygpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIgICBPYmplY3QgZm9vKENvbXBhcmFibGU8SW50ZWdlcj4gYykge1xuIiArIAoJCQkiCSAgIHJldHVybiAoQ29tcGFyYWJsZTxTPikgYztcbiIgKyAKCQkJIiAgIH1cbiIgKyAKCQkJIiAgIDxVIGV4dGVuZHMgVGhyb3dhYmxlLCBWIGV4dGVuZHMgUnVubmFibGU+IHZvaWQgZm9vKExpc3Q8Vj4gbHYpIHtcbiIgKyAKCQkJIgkgICBMaXN0IGwgPSAoTGlzdDxVPikgbHY7XG4iICsgCgkJCSIgICB9XG4iICsgCgkJCSIgICA8VSBleHRlbmRzIFRocm93YWJsZSwgViBleHRlbmRzIFJ1bm5hYmxlPiB2b2lkIGZvbzIoTGlzdDxMaXN0PFY+PiBsdikge1xuIiArIAoJCQkiCSAgIExpc3QgbCA9IChMaXN0PExpc3Q8VT4+KSBsdjtcbiIgKyAKCQkJIiAgIH1cbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkiCXJldHVybiAoQ29tcGFyYWJsZTxTPikgYztcbiIgKyAKCQkiCSAgICAgICAgICAgICAgICAgICBeXG4iICsgCgkJIlMgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJIglMaXN0IGwgPSAoTGlzdDxVPikgbHY7XG4iICsgCgkJIgkgICAgICAgICBeXl5eXl5eXl5eXl5cbiIgKyAKCQkiVHlwZSBzYWZldHk6IFRoZSBjYXN0IGZyb20gTGlzdDxWPiB0byBMaXN0PFU+IGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIExpc3RcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTEpXG4iICsgCgkJIglMaXN0IGwgPSAoTGlzdDxMaXN0PFU+PikgbHY7XG4iICsgCgkJIgkgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiQ2Fubm90IGNhc3QgZnJvbSBMaXN0PExpc3Q8Vj4+IHRvIExpc3Q8TGlzdDxVPj5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0JCi8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk1MDY2IC0gdmFyaWF0aW9uCnB1YmxpYyB2b2lkIHRlc3Q2NjQoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYPFMgZXh0ZW5kcyBDb21wYXJhYmxlPFN0cmluZz4+IHtcbiIgKyAKCQkJIiAgIHB1YmxpYyBYKFgyIHgyKSB7XG4iICsgCgkJCSIgICAgICAgUyBhID0gKFMpeDI7XG4iICsgCgkJCSIgICB9XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJhYnN0cmFjdCBjbGFzcyBYMiBpbXBsZW1lbnRzIENvbXBhcmFibGU8WDI+IHtcbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkiCVMgYSA9IChTKXgyO1xuIiArIAoJCSIJICAgICAgXl5eXl5cbiIgKyAKCQkiQ2Fubm90IGNhc3QgZnJvbSBYMiB0byBTXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9CQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTA2NiAtIHZhcmlhdGlvbgpwdWJsaWMgdm9pZCB0ZXN0NjY1KCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlRlc3QuamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgVGVzdDxTPiB7XG4iICsgCgkJCSIJdm9pZCBmb28oKSB7XG4iICsgCgkJCSIJCUEgYSA9IG5ldyBBKCk7XG4iICsgCgkJCSIJCUNvbXBhcmFibGU8T2JqZWN0PiBjID0gKENvbXBhcmFibGU8T2JqZWN0PikgYTsgLy8gRmFpbHMgYXMgZXhwZWN0ZWRcbiIgKyAKCQkJIgkJQ29tcGFyYWJsZTxTPiBjMiA9IChDb21wYXJhYmxlPFM+KSBhOyAvLyBTaG91bGQgZmFpbD9cbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJcbiIgKyAKCQkJIn1cbiIgKyAKCQkJIlxuIiArIAoJCQkiZmluYWwgY2xhc3MgQSBpbXBsZW1lbnRzIENvbXBhcmFibGU8QT4ge1xuIiArIAoJCQkiCXB1YmxpYyBpbnQgY29tcGFyZVRvKEEgbykge1xuIiArIAoJCQkiCQlyZXR1cm4gMDtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gVGVzdC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJIglDb21wYXJhYmxlPE9iamVjdD4gYyA9IChDb21wYXJhYmxlPE9iamVjdD4pIGE7IC8vIEZhaWxzIGFzIGV4cGVjdGVkXG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiQ2Fubm90IGNhc3QgZnJvbSBBIHRvIENvbXBhcmFibGU8T2JqZWN0PlxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIuIEVSUk9SIGluIFRlc3QuamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCSIJQ29tcGFyYWJsZTxTPiBjMiA9IChDb21wYXJhYmxlPFM+KSBhOyAvLyBTaG91bGQgZmFpbD9cbiIgKyAKCQkiCSAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJDYW5ub3QgY2FzdCBmcm9tIEEgdG8gQ29tcGFyYWJsZTxTPlxuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQkKLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODk5NDAKcHVibGljIHZvaWQgdGVzdDY2NigpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIJdm9pZCBmb28oTGlzdDxPYmplY3Q+IG9iamVjdHMsIExpc3QgcmF3KSB7XG4iICsgCgkJCSJcbiIgKyAKCQkJIgkgICAgTGlzdDxOdW1iZXI+IG51bWJlcnM7XG4iICsgCgkJCSIJICAgIExpc3Q8PyBleHRlbmRzIE51bWJlcj4gZXh0O1xuIiArIAoJCQkiCSAgICBcbiIgKyAKCQkJIgkgICAgbnVtYmVycz0gKExpc3Q8TnVtYmVyPikgb2JqZWN0czsgLy8gY29ycmVjdCAtIGNhc3QgZXJyb3JcbiIgKyAKCQkJIgkgICAgZXh0PSAoTGlzdDw/IGV4dGVuZHMgTnVtYmVyPikgb2JqZWN0czsgLy8gd3JvbmcsIHNob3VsZCBmYWlsXG4iICsgCgkJCSJcbiIgKyAKCQkJIgkgICAgZXh0PSByYXc7IC8vIGNvcnJlY3QgLSByYXcgY29udmVyc2lvbiB3YXJuaW5nIGlzc3VlZFxuIiArIAoJCQkiCSAgICBudW1iZXJzPSByYXc7IC8vIGNvcnJlY3QgLSByYXcgY29udmVyc2lvbiB3YXJuaW5nIGlzc3VlZFxuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkiCW51bWJlcnM9IChMaXN0PE51bWJlcj4pIG9iamVjdHM7IC8vIGNvcnJlY3QgLSBjYXN0IGVycm9yXG4iICsgCgkJIgkgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJIkNhbm5vdCBjYXN0IGZyb20gTGlzdDxPYmplY3Q+IHRvIExpc3Q8TnVtYmVyPlxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEwKVxuIiArIAoJCSIJZXh0PSAoTGlzdDw/IGV4dGVuZHMgTnVtYmVyPikgb2JqZWN0czsgLy8gd3JvbmcsIHNob3VsZCBmYWlsXG4iICsgCgkJIgkgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIExpc3Q8T2JqZWN0PiB0byBMaXN0PD8gZXh0ZW5kcyBOdW1iZXI+IGlzIGFjdHVhbGx5IGNoZWNraW5nIGFnYWluc3QgdGhlIGVyYXNlZCB0eXBlIExpc3RcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIzLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxMilcbiIgKyAKCQkiCWV4dD0gcmF3OyAvLyBjb3JyZWN0IC0gcmF3IGNvbnZlcnNpb24gd2FybmluZyBpc3N1ZWRcbiIgKyAKCQkiCSAgICAgXl5eXG4iICsgCgkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIExpc3QgbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBMaXN0PD8gZXh0ZW5kcyBOdW1iZXI+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiNC4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTMpXG4iICsgCgkJIgludW1iZXJzPSByYXc7IC8vIGNvcnJlY3QgLSByYXcgY29udmVyc2lvbiB3YXJuaW5nIGlzc3VlZFxuIiArIAoJCSIJICAgICAgICAgXl5eXG4iICsgCgkJIlR5cGUgc2FmZXR5OiBUaGUgZXhwcmVzc2lvbiBvZiB0eXBlIExpc3QgbmVlZHMgdW5jaGVja2VkIGNvbnZlcnNpb24gdG8gY29uZm9ybSB0byBMaXN0PE51bWJlcj5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0JCnB1YmxpYyB2b2lkIF90ZXN0NjY3KCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCgkJCSJcbiIgKyAKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgZm9vKExpc3Q8PyBzdXBlciBPYmplY3RbXT4gbCkgeyAgICB9XG4iICsgCgkJCSIgXG4iICsgCgkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIGZvbzIoTGlzdDxPYmplY3RbXT4gbCkgeyAgICB9XG4iICsgCgkJCSIgXG4iICsgCgkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIGZvbzMoTGlzdDw/IGV4dGVuZHMgT2JqZWN0W10+IGwpIHsgICAgfVxuIiArIAoJCQkiIFxuIiArIAoJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiYXIoTGlzdDw/IHN1cGVyIE9iamVjdD4gbCkgeyAgICB9XG4iICsgCgkJCSIgXG4iICsgCgkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIGJhcjIoTGlzdDxPYmplY3Q+IGwpIHsgICAgfVxuIiArIAoJCQkiIFxuIiArIAoJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiYXIzKExpc3Q8PyBleHRlbmRzIE9iamVjdD4gbCkgeyAgICB9XG4iICsgCgkJCSIgXG4iICsgCgkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIGJhcjQoTGlzdDw/PiBsKSB7ICAgIH1cbiIgKyAKCQkJIiBcbiIgKyAKCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCSIgICAgICAgIHsgICAvLyBjYW4gYmUgeyBPYmplY3QsIE9iamVjdFtdIH1cbiIgKyAKCQkJIiAgICAgICAgICAgIExpc3Q8PyBzdXBlciBPYmplY3RbXT4gbCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0W10+KCk7XG4iICsgCgkJCSIgICAgICAgICAgICBsLmFkZChsLmdldCgwKSk7ICAvLyBpbGxlZ2FsIFswMV1cbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKChPYmplY3QpIG51bGwpOyAgLy8gaWxsZWdhbCBbMDJdXG4iICsgCgkJCSIgICAgICAgICAgICBsLmFkZCgoSW50ZWdlcikgbnVsbCk7ICAvLyBpbGxlZ2FsIFswM11cbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKChPYmplY3QgW10pIG51bGwpOyAvLyBpbGxlZ2FsIFswNF1cbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKChJbnRlZ2VyIFtdKSBudWxsKTsgLy8gaWxsZWdhbCBbMDVdXG4iICsgCgkJCSIgICAgICAgICAgICBsLmFkZCgoSW50ZWdlciBbXVtdKSBudWxsKTsgLy8gaWxsZWdhbCBbMDZdXG4iICsgCgkJCSIgXG4iICsgCgkJCSIgICAgICAgICAgICBmb28obCk7IC8vIExpc3Q8PyBzdXBlciBPYmplY3RbXT4gLSBsZWdhbCBbMDddXG4iICsgCgkJCSIgICAgICAgICAgICBmb28yKGwpOyAvLyBMaXN0PE9iamVjdFtdPiAtIGlsbGVnYWwgWzA4XVxuIiArIAoJCQkiICAgICAgICAgICAgZm9vMyhsKTsgLy8gTGlzdDw/IGV4dGVuZHMgT2JqZWN0W10+IC0gaWxsZWdhbCBbMDldXG4iICsgCgkJCSIgICAgICAgICAgICBiYXIobCk7IC8vIExpc3Q8PyBzdXBlciBPYmplY3Q+IC0gaWxsZWdhbCBbMTBdXG4iICsgCgkJCSIgICAgICAgICAgICBiYXIyKGwpOyAvLyBMaXN0PE9iamVjdD4gLSBpbGxlZ2FsIFsxMV1cbiIgKyAKCQkJIiAgICAgICAgICAgIGJhcjMobCk7IC8vIExpc3Q8PyBleHRlbmRzIE9iamVjdD4gLSBsZWdhbCBbMTJdXG4iICsgCgkJCSIgICAgICAgICAgICBiYXI0KGwpOyAvLyBMaXN0PD8+IC0gbGVnYWwgWzEzXVxuIiArIAoJCQkiICAgICAgICB9XG4iICsgCgkJCSIgICAgICAgIHsgICAvLyBjYW4gYmUgT2JqZWN0W10gb3IgKD8gZXh0ZW5kcyBPYmplY3QpW11cbiIgKyAKCQkJIiAgICAgICAgICAgIExpc3Q8T2JqZWN0W10+IGwgPSBuZXcgQXJyYXlMaXN0PE9iamVjdFtdPigpO1xuIiArIAoJCQkiICAgICAgICAgICAgbC5hZGQobC5nZXQoMCkpOyAgLy8gbGVnYWwgWzE0XVxuIiArIAoJCQkiICAgICAgICAgICAgbC5hZGQoKE9iamVjdCkgbnVsbCk7ICAvLyBpbGxlZ2FsIFsxNV1cbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKChJbnRlZ2VyKSBudWxsKTsgIC8vIGlsbGVnYWwgWzE2XVxuIiArIAoJCQkiICAgICAgICAgICAgbC5hZGQoKE9iamVjdCBbXSkgbnVsbCk7IC8vIGxlZ2FsIFsxN11cbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKChJbnRlZ2VyIFtdKSBudWxsKTsgLy8gbGVnYWwgWzE4XVxuIiArIAoJCQkiICAgICAgICAgICAgbC5hZGQoKEludGVnZXIgW11bXSkgbnVsbCk7IC8vIGxlZ2FsIFsxOV1cbiIgKyAKCQkJIiBcbiIgKyAKCQkJIiAgICAgICAgICAgIGZvbyhsKTsgLy8gTGlzdDw/IHN1cGVyIE9iamVjdFtdPiAtIGxlZ2FsIFsyMF1cbiIgKyAKCQkJIiAgICAgICAgICAgIGZvbzIobCk7IC8vIExpc3Q8T2JqZWN0W10+IC0gbGVnYWwgWzIxXVxuIiArIAoJCQkiICAgICAgICAgICAgZm9vMyhsKTsgLy8gTGlzdDw/IGV4dGVuZHMgT2JqZWN0W10+IC0gbGVnYWwgWzIyXVxuIiArIAoJCQkiICAgICAgICAgICAgYmFyKGwpOyAvLyBMaXN0PD8gc3VwZXIgT2JqZWN0PiAtIGlsbGVnYWwgWzIzXVxuIiArIAoJCQkiICAgICAgICAgICAgYmFyMihsKTsgLy8gTGlzdDxPYmplY3Q+IC0gaWxsZWdhbCBbMjRdXG4iICsgCgkJCSIgICAgICAgICAgICBiYXIzKGwpOyAvLyBMaXN0PD8gZXh0ZW5kcyBPYmplY3Q+IC0gbGVnYWwgWzI1XVxuIiArIAoJCQkiICAgICAgICAgICAgYmFyNChsKTsgLy8gTGlzdDw/PiAtIGxlZ2FsIFsyNl1cbiIgKyAKCQkJIiAgICAgICAgfVxuIiArIAoJCQkiICAgICAgICB7ICAgLy8gT25seSBhbGxvd3Mgd2lsZGNhcmRzLCBPYmplY3QgaXMgaWxsZWdhbC5cbiIgKyAKCQkJIiAgICAgICAgICAgIExpc3Q8PyBleHRlbmRzIE9iamVjdFtdPiBsID0gbmV3IEFycmF5TGlzdDxPYmplY3RbXT4oKTtcbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKGwuZ2V0KDApKTsgIC8vIGlsbGVnYWwgWzI3XVxuIiArIAoJCQkiICAgICAgICAgICAgbC5hZGQoKE9iamVjdCkgbnVsbCk7ICAvLyBpbGxlZ2FsIFsyOF1cbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKChJbnRlZ2VyKSBudWxsKTsgIC8vIGlsbGVnYWwgWzI5XVxuIiArIAoJCQkiICAgICAgICAgICAgbC5hZGQoKE9iamVjdCBbXSkgbnVsbCk7IC8vIGlsbGVnYWwgWzMwXVxuIiArIAoJCQkiICAgICAgICAgICAgbC5hZGQoKEludGVnZXIgW10pIG51bGwpOyAvLyBpbGxlZ2FsIFszMV1cbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKChJbnRlZ2VyIFtdW10pIG51bGwpOyAvLyBpbGxlZ2FsIFszMl1cbiIgKyAKCQkJIiBcbiIgKyAKCQkJIiAgICAgICAgICAgIGZvbyhsKTsgLy8gTGlzdDw/IHN1cGVyIE9iamVjdFtdPiAtIGlsbGVnYWwgWzMzXVxuIiArIAoJCQkiICAgICAgICAgICAgZm9vMihsKTsgLy8gTGlzdDxPYmplY3RbXT4gLSBpbGxlZ2FsIFszNF1cbiIgKyAKCQkJIiAgICAgICAgICAgIGZvbzMobCk7IC8vIExpc3Q8PyBleHRlbmRzIE9iamVjdFtdPiAtIGxlZ2FsIFszNV1cbiIgKyAKCQkJIiAgICAgICAgICAgIGJhcihsKTsgLy8gTGlzdDw/IHN1cGVyIE9iamVjdD4gLSBpbGxlZ2FsIFszNl1cbiIgKyAKCQkJIiAgICAgICAgICAgIGJhcjIobCk7IC8vIExpc3Q8T2JqZWN0PiAtIGlsbGVnYWwgWzM3XVxuIiArIAoJCQkiICAgICAgICAgICAgYmFyMyhsKTsgLy8gTGlzdDw/IGV4dGVuZHMgT2JqZWN0PiAtIGxlZ2FsIFszOF1cbiIgKyAKCQkJIiAgICAgICAgICAgIGJhcjQobCk7IC8vIExpc3Q8Pz4gLSBsZWdhbCBbMzldXG4iICsgCgkJCSIgICAgICAgIH1cbiIgKyAKCQkJIiAgICAgICAgeyAgIC8vIGNhbiBhZGQgbm9uLWFycmF5cyBidXQgY2FuIG9ubHkgbWF0Y2ggPyBzdXBlciBPYmplY3QsID8gc3VwZXIgT2JqZWN0W10sIG9yID8gZXh0ZW5kcyBPYmplY3QsIGJ1dCBub3QgT2JqZWN0ICBcbiIgKyAKCQkJIiAgICAgICAgICAgIExpc3Q8PyBzdXBlciBPYmplY3Q+IGwgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTtcbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKGwuZ2V0KDApKTsgIC8vIGxlZ2FsIFs0MF1cbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKChPYmplY3QpIG51bGwpOyAgLy8gbGVnYWwgWzQxXVxuIiArIAoJCQkiICAgICAgICAgICAgbC5hZGQoKEludGVnZXIpIG51bGwpOyAgLy8gbGVnYWwgWzQyXVxuIiArIAoJCQkiICAgICAgICAgICAgbC5hZGQoKE9iamVjdCBbXSkgbnVsbCk7IC8vIGlsbGVnYWwgWzQzXVxuIiArIAoJCQkiICAgICAgICAgICAgbC5hZGQoKEludGVnZXIgW10pIG51bGwpOyAvLyBpbGxlZ2FsIFs0NF1cbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKChJbnRlZ2VyIFtdW10pIG51bGwpOyAvLyBpbGxlZ2FsIFs0NV1cbiIgKyAKCQkJIiBcbiIgKyAKCQkJIiAgICAgICAgICAgIGZvbyhsKTsgLy8gbGVnYWwgWzQ2XVxuIiArIAoJCQkiICAgICAgICAgICAgZm9vMihsKTsgLy8gaWxsZWdhbCBbNDddXG4iICsgCgkJCSIgICAgICAgICAgICBmb28zKGwpOyAvLyBpbGxlZ2FsIFs0OF1cbiIgKyAKCQkJIiAgICAgICAgICAgIGJhcihsKTsgLy8gbGVnYWwgWzQ5XVxuIiArIAoJCQkiICAgICAgICAgICAgYmFyMihsKTsgLy8gaWxsZWdhbCBbNTBdXG4iICsgCgkJCSIgICAgICAgICAgICBiYXIzKGwpOyAvLyBsZWdhbCBbNTFdXG4iICsgCgkJCSIgICAgICAgICAgICBiYXI0KGwpOyAvLyBsZWdhbCBbNTJdXG4iICsgCgkJCSIgICAgICAgIH1cbiIgKyAKCQkJIiAgICAgICAgeyAgIC8vIGNhbiBhZGQgYXJyYXkgYnV0IGNhbm5vdCBjYWxsIGEgbWV0aG9kIHdoaWNoIGV4cGVjdHMgYW4gYXJyYXkuIDEwMCUgIVxuIiArIAoJCQkiICAgICAgICAgICAgTGlzdDxPYmplY3Q+IGwgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTtcbiIgKyAKCQkJIiAgICAgICAgICAgIGwuZ2V0KDApLnRvU3RyaW5nKCk7XG4iICsgCgkJCSIgICAgICAgICAgICBsLmFkZChsLmdldCgwKSk7ICAvLyBsZWdhbCBbNTNdXG4iICsgCgkJCSIgICAgICAgICAgICBsLmFkZCgoT2JqZWN0KSBudWxsKTsgIC8vIGxlZ2FsIFs1NF1cbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKChJbnRlZ2VyKSBudWxsKTsgIC8vIGxlZ2FsIFs1NV1cbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKChPYmplY3QgW10pIG51bGwpOyAvLyBsZWdhbCBbNTZdXG4iICsgCgkJCSIgICAgICAgICAgICBsLmFkZCgoSW50ZWdlciBbXSkgbnVsbCk7IC8vIGxlZ2FsIFs1N11cbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKChJbnRlZ2VyIFtdW10pIG51bGwpOyAvLyBsZWdhbCBbNThdXG4iICsgCgkJCSIgXG4iICsgCgkJCSIgICAgICAgICAgICBmb28obCk7IC8vIGxlZ2FsIFs1OV1cbiIgKyAKCQkJIiAgICAgICAgICAgIGZvbzIobCk7IC8vIGlsbGVnYWwgWzYwXVxuIiArIAoJCQkiICAgICAgICAgICAgZm9vMyhsKTsgLy8gaWxsZWdhbCBbNjFdXG4iICsgCgkJCSIgICAgICAgICAgICBiYXIobCk7IC8vIGxlZ2FsIFs2Ml1cbiIgKyAKCQkJIiAgICAgICAgICAgIGJhcjIobCk7IC8vIGxlZ2FsIFs2M11cbiIgKyAKCQkJIiAgICAgICAgICAgIGJhcjMobCk7IC8vIGxlZ2FsIFs2NF1cbiIgKyAKCQkJIiAgICAgICAgICAgIGJhcjQobCk7IC8vIGxlZ2FsIFs2NV1cbiIgKyAKCQkJIiAgICAgICAgfVxuIiArIAoJCQkiICAgICAgICB7ICAgLy8gY2Fubm90IGFkZCBhbnkgdHlwZSBidXQgY2FuIG1hdGNoID8gb3IgPyBleHRlbmRzIE9iamVjdC5cbiIgKyAKCQkJIiAgICAgICAgICAgIExpc3Q8PyBleHRlbmRzIE9iamVjdD4gbCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpO1xuIiArIAoJCQkiICAgICAgICAgICAgbC5hZGQobC5nZXQoMCkpOyAgLy8gaWxsZWdhbCBbNjZdXG4iICsgCgkJCSIgICAgICAgICAgICBsLmFkZCgoT2JqZWN0KSBudWxsKTsgIC8vIGlsbGVnYWwgWzY3XVxuIiArIAoJCQkiICAgICAgICAgICAgbC5hZGQoKEludGVnZXIpIG51bGwpOyAgLy8gaWxsZWdhbCBbNjhdXG4iICsgCgkJCSIgICAgICAgICAgICBsLmFkZCgoT2JqZWN0IFtdKSBudWxsKTsgLy8gaWxsZWdhbCBbNjldXG4iICsgCgkJCSIgICAgICAgICAgICBsLmFkZCgoSW50ZWdlciBbXSkgbnVsbCk7IC8vIGlsbGVnYWwgWzcwXVxuIiArIAoJCQkiICAgICAgICAgICAgbC5hZGQoKEludGVnZXIgW11bXSkgbnVsbCk7IC8vIGlsbGVnYWwgWzcxXVxuIiArIAoJCQkiIFxuIiArIAoJCQkiICAgICAgICAgICAgZm9vKGwpOyAvLyBMaXN0PD8gc3VwZXIgT2JqZWN0W10+IC0gaWxsZWdhbCBbNzJdXG4iICsgCgkJCSIgICAgICAgICAgICBmb28yKGwpOyAvLyBMaXN0PE9iamVjdFtdPiAtIGlsbGVnYWwgWzczXVxuIiArIAoJCQkiICAgICAgICAgICAgZm9vMyhsKTsgLy8gTGlzdDw/IGV4dGVuZHMgT2JqZWN0W10+IC0gaWxsZWdhbCBbNzRdXG4iICsgCgkJCSIgICAgICAgICAgICBiYXIobCk7IC8vIExpc3Q8PyBzdXBlciBPYmplY3Q+IC0gaWxsZWdhbCBbNzVdXG4iICsgCgkJCSIgICAgICAgICAgICBiYXIyKGwpOyAvLyBMaXN0PE9iamVjdD4gLSBpbGxlZ2FsIFs3Nl1cbiIgKyAKCQkJIiAgICAgICAgICAgIGJhcjMobCk7IC8vIExpc3Q8PyBleHRlbmRzIE9iamVjdD4gLSBsZWdhbCBbNzddXG4iICsgCgkJCSIgICAgICAgICAgICBiYXI0KGwpOyAvLyBMaXN0PD8+IC0gbGVnYWwgWzc4XVxuIiArIAoJCQkiICAgICAgICB9XG4iICsgCgkJCSIgICAgICAgIHsgICAvLyBzYW1lIGFzID8gZXh0ZW5kcyBPYmplY3QuXG4iICsgCgkJCSIgICAgICAgICAgICBMaXN0PD8+IGwgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTtcbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKGwuZ2V0KDApKTsgIC8vIGlsbGVnYWwgWzc5XVxuIiArIAoJCQkiICAgICAgICAgICAgbC5hZGQoKE9iamVjdCkgbnVsbCk7ICAvLyBpbGxlZ2FsIFs4MF1cbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKChJbnRlZ2VyKSBudWxsKTsgIC8vIGlsbGVnYWwgWzgxXVxuIiArIAoJCQkiICAgICAgICAgICAgbC5hZGQoKE9iamVjdCBbXSkgbnVsbCk7IC8vIGlsbGVnYWwgWzgyXVxuIiArIAoJCQkiICAgICAgICAgICAgbC5hZGQoKEludGVnZXIgW10pIG51bGwpOyAvLyBpbGxlZ2FsIFs4M11cbiIgKyAKCQkJIiAgICAgICAgICAgIGwuYWRkKChJbnRlZ2VyIFtdW10pIG51bGwpOyAvLyBpbGxlZ2FsIFs4NF1cbiIgKyAKCQkJIiBcbiIgKyAKCQkJIiAgICAgICAgICAgIGZvbyhsKTsgLy8gTGlzdDw/IHN1cGVyIE9iamVjdFtdPiAtIGlsbGVnYWwgWzg1XVxuIiArIAoJCQkiICAgICAgICAgICAgZm9vMihsKTsgLy8gTGlzdDxPYmplY3RbXT4gLSBpbGxlZ2FsIFs4Nl1cbiIgKyAKCQkJIiAgICAgICAgICAgIGZvbzMobCk7IC8vIExpc3Q8PyBleHRlbmRzIE9iamVjdFtdPiAtIGlsbGVnYWwgWzg3XVxuIiArIAoJCQkiICAgICAgICAgICAgYmFyKGwpOyAvLyBMaXN0PD8gc3VwZXIgT2JqZWN0PiAtIGlsbGVnYWwgWzg4XVxuIiArIAoJCQkiICAgICAgICAgICAgYmFyMihsKTsgLy8gTGlzdDxPYmplY3Q+IC0gaWxsZWdhbCBbODldXG4iICsgCgkJCSIgICAgICAgICAgICBiYXIzKGwpOyAvLyBMaXN0PD8gZXh0ZW5kcyBPYmplY3Q+IC0gbGVnYWwgWzkwXVxuIiArIAoJCQkiICAgICAgICAgICAgYmFyNChsKTsgLy8gTGlzdDw/PiAtIGxlZ2FsIFs5MV1cbiIgKyAKCQkJIiAgICAgICAgfVxuIiArIAoJCQkiICAgIH1cbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMjEpXG4iICsgCgkJIglsLmFkZChsLmdldCgwKSk7ICAvLyBpbGxlZ2FsIFswMV1cbiIgKyAKCQkiCSAgXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPyBzdXBlciBPYmplY3RbXSkgaW4gdGhlIHR5cGUgTGlzdDxjYXB0dXJlLW9mID8gc3VwZXIgT2JqZWN0W10+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChjYXB0dXJlLW9mID8gc3VwZXIgT2JqZWN0W10pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDIyKVxuIiArIAoJCSIJbC5hZGQoKE9iamVjdCkgbnVsbCk7ICAvLyBpbGxlZ2FsIFswMl1cbiIgKyAKCQkiCSAgXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPyBzdXBlciBPYmplY3RbXSkgaW4gdGhlIHR5cGUgTGlzdDxjYXB0dXJlLW9mID8gc3VwZXIgT2JqZWN0W10+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChPYmplY3QpXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDIzKVxuIiArIAoJCSIJbC5hZGQoKEludGVnZXIpIG51bGwpOyAgLy8gaWxsZWdhbCBbMDNdXG4iICsgCgkJIgkgIF5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8gc3VwZXIgT2JqZWN0W10pIGluIHRoZSB0eXBlIExpc3Q8Y2FwdHVyZS1vZiA/IHN1cGVyIE9iamVjdFtdPiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoSW50ZWdlcilcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSI0LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMjQpXG4iICsgCgkJIglsLmFkZCgoT2JqZWN0IFtdKSBudWxsKTsgLy8gaWxsZWdhbCBbMDRdXG4iICsgCgkJIgkgIF5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8gc3VwZXIgT2JqZWN0W10pIGluIHRoZSB0eXBlIExpc3Q8Y2FwdHVyZS1vZiA/IHN1cGVyIE9iamVjdFtdPiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoT2JqZWN0W10pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiNS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDI1KVxuIiArIAoJCSIJbC5hZGQoKEludGVnZXIgW10pIG51bGwpOyAvLyBpbGxlZ2FsIFswNV1cbiIgKyAKCQkiCSAgXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPyBzdXBlciBPYmplY3RbXSkgaW4gdGhlIHR5cGUgTGlzdDxjYXB0dXJlLW9mID8gc3VwZXIgT2JqZWN0W10+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChJbnRlZ2VyW10pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiNi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDI2KVxuIiArIAoJCSIJbC5hZGQoKEludGVnZXIgW11bXSkgbnVsbCk7IC8vIGlsbGVnYWwgWzA2XVxuIiArIAoJCSIJICBeXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBhZGQoY2FwdHVyZS1vZiA/IHN1cGVyIE9iamVjdFtdKSBpbiB0aGUgdHlwZSBMaXN0PGNhcHR1cmUtb2YgPyBzdXBlciBPYmplY3RbXT4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKEludGVnZXJbXVtdKVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjcuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyOClcbiIgKyAKCQkiCWZvbyhsKTsgLy8gTGlzdDw/IHN1cGVyIE9iamVjdFtdPiAtIGxlZ2FsIFswN11cbiIgKyAKCQkiCV5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGZvbyhMaXN0PD8gc3VwZXIgT2JqZWN0W10+KSBpbiB0aGUgdHlwZSBYIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChMaXN0PGNhcHR1cmUtb2YgPyBzdXBlciBPYmplY3RbXT4pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiOC4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDI5KVxuIiArIAoJCSIJZm9vMihsKTsgLy8gTGlzdDxPYmplY3RbXT4gLSBpbGxlZ2FsIFswOF1cbiIgKyAKCQkiCV5eXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBmb28yKExpc3Q8T2JqZWN0W10+KSBpbiB0aGUgdHlwZSBYIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChMaXN0PGNhcHR1cmUtb2YgPyBzdXBlciBPYmplY3RbXT4pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiOS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMwKVxuIiArIAoJCSIJZm9vMyhsKTsgLy8gTGlzdDw/IGV4dGVuZHMgT2JqZWN0W10+IC0gaWxsZWdhbCBbMDldXG4iICsgCgkJIgleXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgZm9vMyhMaXN0PD8gZXh0ZW5kcyBPYmplY3RbXT4pIGluIHRoZSB0eXBlIFggaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKExpc3Q8Y2FwdHVyZS1vZiA/IHN1cGVyIE9iamVjdFtdPilcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxMC4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMxKVxuIiArIAoJCSIJYmFyKGwpOyAvLyBMaXN0PD8gc3VwZXIgT2JqZWN0PiAtIGlsbGVnYWwgWzEwXVxuIiArIAoJCSIJXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgYmFyKExpc3Q8PyBzdXBlciBPYmplY3Q+KSBpbiB0aGUgdHlwZSBYIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChMaXN0PGNhcHR1cmUtb2YgPyBzdXBlciBPYmplY3RbXT4pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMTEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzMilcbiIgKyAKCQkiCWJhcjIobCk7IC8vIExpc3Q8T2JqZWN0PiAtIGlsbGVnYWwgWzExXVxuIiArIAoJCSIJXl5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGJhcjIoTGlzdDxPYmplY3Q+KSBpbiB0aGUgdHlwZSBYIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChMaXN0PGNhcHR1cmUtb2YgPyBzdXBlciBPYmplY3RbXT4pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMTIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzOSlcbiIgKyAKCQkiCWwuYWRkKChPYmplY3QpIG51bGwpOyAgLy8gaWxsZWdhbCBbMTVdXG4iICsgCgkJIgkgIF5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGFkZChPYmplY3RbXSkgaW4gdGhlIHR5cGUgTGlzdDxPYmplY3RbXT4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKE9iamVjdClcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxMy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQwKVxuIiArIAoJCSIJbC5hZGQoKEludGVnZXIpIG51bGwpOyAgLy8gaWxsZWdhbCBbMTZdXG4iICsgCgkJIgkgIF5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGFkZChPYmplY3RbXSkgaW4gdGhlIHR5cGUgTGlzdDxPYmplY3RbXT4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKEludGVnZXIpXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMTQuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0OClcbiIgKyAKCQkiCWJhcihsKTsgLy8gTGlzdDw/IHN1cGVyIE9iamVjdD4gLSBpbGxlZ2FsIFsyM11cbiIgKyAKCQkiCV5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGJhcihMaXN0PD8gc3VwZXIgT2JqZWN0PikgaW4gdGhlIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoTGlzdDxPYmplY3RbXT4pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMTUuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0OSlcbiIgKyAKCQkiCWJhcjIobCk7IC8vIExpc3Q8T2JqZWN0PiAtIGlsbGVnYWwgWzI0XVxuIiArIAoJCSIJXl5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGJhcjIoTGlzdDxPYmplY3Q+KSBpbiB0aGUgdHlwZSBYIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChMaXN0PE9iamVjdFtdPilcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxNi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDU1KVxuIiArIAoJCSIJbC5hZGQobC5nZXQoMCkpOyAgLy8gaWxsZWdhbCBbMjddXG4iICsgCgkJIgkgIF5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8gZXh0ZW5kcyBPYmplY3RbXSkgaW4gdGhlIHR5cGUgTGlzdDxjYXB0dXJlLW9mID8gZXh0ZW5kcyBPYmplY3RbXT4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKGNhcHR1cmUtb2YgPyBleHRlbmRzIE9iamVjdFtdKVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjE3LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNTYpXG4iICsgCgkJIglsLmFkZCgoT2JqZWN0KSBudWxsKTsgIC8vIGlsbGVnYWwgWzI4XVxuIiArIAoJCSIJICBeXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBhZGQoY2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0W10pIGluIHRoZSB0eXBlIExpc3Q8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0W10+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChPYmplY3QpXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMTguIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA1NylcbiIgKyAKCQkiCWwuYWRkKChJbnRlZ2VyKSBudWxsKTsgIC8vIGlsbGVnYWwgWzI5XVxuIiArIAoJCSIJICBeXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBhZGQoY2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0W10pIGluIHRoZSB0eXBlIExpc3Q8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0W10+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChJbnRlZ2VyKVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjE5LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNTgpXG4iICsgCgkJIglsLmFkZCgoT2JqZWN0IFtdKSBudWxsKTsgLy8gaWxsZWdhbCBbMzBdXG4iICsgCgkJIgkgIF5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8gZXh0ZW5kcyBPYmplY3RbXSkgaW4gdGhlIHR5cGUgTGlzdDxjYXB0dXJlLW9mID8gZXh0ZW5kcyBPYmplY3RbXT4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKE9iamVjdFtdKVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIwLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNTkpXG4iICsgCgkJIglsLmFkZCgoSW50ZWdlciBbXSkgbnVsbCk7IC8vIGlsbGVnYWwgWzMxXVxuIiArIAoJCSIJICBeXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBhZGQoY2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0W10pIGluIHRoZSB0eXBlIExpc3Q8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0W10+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChJbnRlZ2VyW10pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2MClcbiIgKyAKCQkiCWwuYWRkKChJbnRlZ2VyIFtdW10pIG51bGwpOyAvLyBpbGxlZ2FsIFszMl1cbiIgKyAKCQkiCSAgXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPyBleHRlbmRzIE9iamVjdFtdKSBpbiB0aGUgdHlwZSBMaXN0PGNhcHR1cmUtb2YgPyBleHRlbmRzIE9iamVjdFtdPiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoSW50ZWdlcltdW10pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2MilcbiIgKyAKCQkiCWZvbyhsKTsgLy8gTGlzdDw/IHN1cGVyIE9iamVjdFtdPiAtIGlsbGVnYWwgWzMzXVxuIiArIAoJCSIJXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgZm9vKExpc3Q8PyBzdXBlciBPYmplY3RbXT4pIGluIHRoZSB0eXBlIFggaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKExpc3Q8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0W10+KVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNjMpXG4iICsgCgkJIglmb28yKGwpOyAvLyBMaXN0PE9iamVjdFtdPiAtIGlsbGVnYWwgWzM0XVxuIiArIAoJCSIJXl5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGZvbzIoTGlzdDxPYmplY3RbXT4pIGluIHRoZSB0eXBlIFggaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKExpc3Q8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0W10+KVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjI0LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNjUpXG4iICsgCgkJIgliYXIobCk7IC8vIExpc3Q8PyBzdXBlciBPYmplY3Q+IC0gaWxsZWdhbCBbMzZdXG4iICsgCgkJIgleXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBiYXIoTGlzdDw/IHN1cGVyIE9iamVjdD4pIGluIHRoZSB0eXBlIFggaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKExpc3Q8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0W10+KVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjI1LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNjYpXG4iICsgCgkJIgliYXIyKGwpOyAvLyBMaXN0PE9iamVjdD4gLSBpbGxlZ2FsIFszN11cbiIgKyAKCQkiCV5eXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBiYXIyKExpc3Q8T2JqZWN0PikgaW4gdGhlIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoTGlzdDxjYXB0dXJlLW9mID8gZXh0ZW5kcyBPYmplY3RbXT4pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMjYuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3NSlcbiIgKyAKCQkiCWwuYWRkKChPYmplY3QgW10pIG51bGwpOyAvLyBpbGxlZ2FsIFs0M11cbiIgKyAKCQkiCSAgXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPyBzdXBlciBPYmplY3QpIGluIHRoZSB0eXBlIExpc3Q8Y2FwdHVyZS1vZiA/IHN1cGVyIE9iamVjdD4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKE9iamVjdFtdKVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjI3LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNzYpXG4iICsgCgkJIglsLmFkZCgoSW50ZWdlciBbXSkgbnVsbCk7IC8vIGlsbGVnYWwgWzQ0XVxuIiArIAoJCSIJICBeXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBhZGQoY2FwdHVyZS1vZiA/IHN1cGVyIE9iamVjdCkgaW4gdGhlIHR5cGUgTGlzdDxjYXB0dXJlLW9mID8gc3VwZXIgT2JqZWN0PiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoSW50ZWdlcltdKVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjI4LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNzcpXG4iICsgCgkJIglsLmFkZCgoSW50ZWdlciBbXVtdKSBudWxsKTsgLy8gaWxsZWdhbCBbNDVdXG4iICsgCgkJIgkgIF5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8gc3VwZXIgT2JqZWN0KSBpbiB0aGUgdHlwZSBMaXN0PGNhcHR1cmUtb2YgPyBzdXBlciBPYmplY3Q+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChJbnRlZ2VyW11bXSlcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIyOS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDc5KVxuIiArIAoJCSIJZm9vKGwpOyAvLyBsZWdhbCBbNDZdXG4iICsgCgkJIgleXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBmb28oTGlzdDw/IHN1cGVyIE9iamVjdFtdPikgaW4gdGhlIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoTGlzdDxjYXB0dXJlLW9mID8gc3VwZXIgT2JqZWN0PilcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIzMC4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgwKVxuIiArIAoJCSIJZm9vMihsKTsgLy8gaWxsZWdhbCBbNDddXG4iICsgCgkJIgleXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgZm9vMihMaXN0PE9iamVjdFtdPikgaW4gdGhlIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoTGlzdDxjYXB0dXJlLW9mID8gc3VwZXIgT2JqZWN0PilcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIzMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgxKVxuIiArIAoJCSIJZm9vMyhsKTsgLy8gaWxsZWdhbCBbNDhdXG4iICsgCgkJIgleXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgZm9vMyhMaXN0PD8gZXh0ZW5kcyBPYmplY3RbXT4pIGluIHRoZSB0eXBlIFggaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKExpc3Q8Y2FwdHVyZS1vZiA/IHN1cGVyIE9iamVjdD4pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMzIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4MylcbiIgKyAKCQkiCWJhcjIobCk7IC8vIGlsbGVnYWwgWzUwXVxuIiArIAoJCSIJXl5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGJhcjIoTGlzdDxPYmplY3Q+KSBpbiB0aGUgdHlwZSBYIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChMaXN0PGNhcHR1cmUtb2YgPyBzdXBlciBPYmplY3Q+KVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjMzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOTgpXG4iICsgCgkJIglmb28yKGwpOyAvLyBpbGxlZ2FsIFs2MF1cbiIgKyAKCQkiCV5eXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBmb28yKExpc3Q8T2JqZWN0W10+KSBpbiB0aGUgdHlwZSBYIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChMaXN0PE9iamVjdD4pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMzQuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA5OSlcbiIgKyAKCQkiCWZvbzMobCk7IC8vIGlsbGVnYWwgWzYxXVxuIiArIAoJCSIJXl5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGZvbzMoTGlzdDw/IGV4dGVuZHMgT2JqZWN0W10+KSBpbiB0aGUgdHlwZSBYIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChMaXN0PE9iamVjdD4pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMzUuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMDcpXG4iICsgCgkJIglsLmFkZChsLmdldCgwKSk7ICAvLyBpbGxlZ2FsIFs2Nl1cbiIgKyAKCQkiCSAgXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPyBleHRlbmRzIE9iamVjdCkgaW4gdGhlIHR5cGUgTGlzdDxjYXB0dXJlLW9mID8gZXh0ZW5kcyBPYmplY3Q+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChjYXB0dXJlLW9mID8gZXh0ZW5kcyBPYmplY3QpXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMzYuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMDgpXG4iICsgCgkJIglsLmFkZCgoT2JqZWN0KSBudWxsKTsgIC8vIGlsbGVnYWwgWzY3XVxuIiArIAoJCSIJICBeXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBhZGQoY2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0KSBpbiB0aGUgdHlwZSBMaXN0PGNhcHR1cmUtb2YgPyBleHRlbmRzIE9iamVjdD4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKE9iamVjdClcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIzNy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEwOSlcbiIgKyAKCQkiCWwuYWRkKChJbnRlZ2VyKSBudWxsKTsgIC8vIGlsbGVnYWwgWzY4XVxuIiArIAoJCSIJICBeXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBhZGQoY2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0KSBpbiB0aGUgdHlwZSBMaXN0PGNhcHR1cmUtb2YgPyBleHRlbmRzIE9iamVjdD4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKEludGVnZXIpXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMzguIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMTApXG4iICsgCgkJIglsLmFkZCgoT2JqZWN0IFtdKSBudWxsKTsgLy8gaWxsZWdhbCBbNjldXG4iICsgCgkJIgkgIF5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8gZXh0ZW5kcyBPYmplY3QpIGluIHRoZSB0eXBlIExpc3Q8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0PiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoT2JqZWN0W10pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMzkuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMTEpXG4iICsgCgkJIglsLmFkZCgoSW50ZWdlciBbXSkgbnVsbCk7IC8vIGlsbGVnYWwgWzcwXVxuIiArIAoJCSIJICBeXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBhZGQoY2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0KSBpbiB0aGUgdHlwZSBMaXN0PGNhcHR1cmUtb2YgPyBleHRlbmRzIE9iamVjdD4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKEludGVnZXJbXSlcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSI0MC4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDExMilcbiIgKyAKCQkiCWwuYWRkKChJbnRlZ2VyIFtdW10pIG51bGwpOyAvLyBpbGxlZ2FsIFs3MV1cbiIgKyAKCQkiCSAgXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPyBleHRlbmRzIE9iamVjdCkgaW4gdGhlIHR5cGUgTGlzdDxjYXB0dXJlLW9mID8gZXh0ZW5kcyBPYmplY3Q+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChJbnRlZ2VyW11bXSlcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSI0MS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDExNClcbiIgKyAKCQkiCWZvbyhsKTsgLy8gTGlzdDw/IHN1cGVyIE9iamVjdFtdPiAtIGlsbGVnYWwgWzcyXVxuIiArIAoJCSIJXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgZm9vKExpc3Q8PyBzdXBlciBPYmplY3RbXT4pIGluIHRoZSB0eXBlIFggaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKExpc3Q8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0PilcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSI0Mi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDExNSlcbiIgKyAKCQkiCWZvbzIobCk7IC8vIExpc3Q8T2JqZWN0W10+IC0gaWxsZWdhbCBbNzNdXG4iICsgCgkJIgleXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgZm9vMihMaXN0PE9iamVjdFtdPikgaW4gdGhlIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoTGlzdDxjYXB0dXJlLW9mID8gZXh0ZW5kcyBPYmplY3Q+KVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjQzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTE2KVxuIiArIAoJCSIJZm9vMyhsKTsgLy8gTGlzdDw/IGV4dGVuZHMgT2JqZWN0W10+IC0gaWxsZWdhbCBbNzRdXG4iICsgCgkJIgleXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgZm9vMyhMaXN0PD8gZXh0ZW5kcyBPYmplY3RbXT4pIGluIHRoZSB0eXBlIFggaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKExpc3Q8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0PilcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSI0NC4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDExNylcbiIgKyAKCQkiCWJhcihsKTsgLy8gTGlzdDw/IHN1cGVyIE9iamVjdD4gLSBpbGxlZ2FsIFs3NV1cbiIgKyAKCQkiCV5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGJhcihMaXN0PD8gc3VwZXIgT2JqZWN0PikgaW4gdGhlIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoTGlzdDxjYXB0dXJlLW9mID8gZXh0ZW5kcyBPYmplY3Q+KVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjQ1LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTE4KVxuIiArIAoJCSIJYmFyMihsKTsgLy8gTGlzdDxPYmplY3Q+IC0gaWxsZWdhbCBbNzZdXG4iICsgCgkJIgleXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgYmFyMihMaXN0PE9iamVjdD4pIGluIHRoZSB0eXBlIFggaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKExpc3Q8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0PilcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSI0Ni4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEyNClcbiIgKyAKCQkiCWwuYWRkKGwuZ2V0KDApKTsgIC8vIGlsbGVnYWwgWzc5XVxuIiArIAoJCSIJICBeXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBhZGQoY2FwdHVyZS1vZiA/KSBpbiB0aGUgdHlwZSBMaXN0PGNhcHR1cmUtb2YgPz4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKGNhcHR1cmUtb2YgPylcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSI0Ny4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEyNSlcbiIgKyAKCQkiCWwuYWRkKChPYmplY3QpIG51bGwpOyAgLy8gaWxsZWdhbCBbODBdXG4iICsgCgkJIgkgIF5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8pIGluIHRoZSB0eXBlIExpc3Q8Y2FwdHVyZS1vZiA/PiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoT2JqZWN0KVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjQ4LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTI2KVxuIiArIAoJCSIJbC5hZGQoKEludGVnZXIpIG51bGwpOyAgLy8gaWxsZWdhbCBbODFdXG4iICsgCgkJIgkgIF5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8pIGluIHRoZSB0eXBlIExpc3Q8Y2FwdHVyZS1vZiA/PiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoSW50ZWdlcilcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSI0OS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEyNylcbiIgKyAKCQkiCWwuYWRkKChPYmplY3QgW10pIG51bGwpOyAvLyBpbGxlZ2FsIFs4Ml1cbiIgKyAKCQkiCSAgXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgYWRkKGNhcHR1cmUtb2YgPykgaW4gdGhlIHR5cGUgTGlzdDxjYXB0dXJlLW9mID8+IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChPYmplY3RbXSlcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSI1MC4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEyOClcbiIgKyAKCQkiCWwuYWRkKChJbnRlZ2VyIFtdKSBudWxsKTsgLy8gaWxsZWdhbCBbODNdXG4iICsgCgkJIgkgIF5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGFkZChjYXB0dXJlLW9mID8pIGluIHRoZSB0eXBlIExpc3Q8Y2FwdHVyZS1vZiA/PiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoSW50ZWdlcltdKVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjUxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTI5KVxuIiArIAoJCSIJbC5hZGQoKEludGVnZXIgW11bXSkgbnVsbCk7IC8vIGlsbGVnYWwgWzg0XVxuIiArIAoJCSIJICBeXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBhZGQoY2FwdHVyZS1vZiA/KSBpbiB0aGUgdHlwZSBMaXN0PGNhcHR1cmUtb2YgPz4gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKEludGVnZXJbXVtdKVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjUyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTMxKVxuIiArIAoJCSIJZm9vKGwpOyAvLyBMaXN0PD8gc3VwZXIgT2JqZWN0W10+IC0gaWxsZWdhbCBbODVdXG4iICsgCgkJIgleXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBmb28oTGlzdDw/IHN1cGVyIE9iamVjdFtdPikgaW4gdGhlIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoTGlzdDxjYXB0dXJlLW9mID8+KVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjUzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTMyKVxuIiArIAoJCSIJZm9vMihsKTsgLy8gTGlzdDxPYmplY3RbXT4gLSBpbGxlZ2FsIFs4Nl1cbiIgKyAKCQkiCV5eXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBmb28yKExpc3Q8T2JqZWN0W10+KSBpbiB0aGUgdHlwZSBYIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChMaXN0PGNhcHR1cmUtb2YgPz4pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiNTQuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMzMpXG4iICsgCgkJIglmb28zKGwpOyAvLyBMaXN0PD8gZXh0ZW5kcyBPYmplY3RbXT4gLSBpbGxlZ2FsIFs4N11cbiIgKyAKCQkiCV5eXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBmb28zKExpc3Q8PyBleHRlbmRzIE9iamVjdFtdPikgaW4gdGhlIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoTGlzdDxjYXB0dXJlLW9mID8+KVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjU1LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTM0KVxuIiArIAoJCSIJYmFyKGwpOyAvLyBMaXN0PD8gc3VwZXIgT2JqZWN0PiAtIGlsbGVnYWwgWzg4XVxuIiArIAoJCSIJXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgYmFyKExpc3Q8PyBzdXBlciBPYmplY3Q+KSBpbiB0aGUgdHlwZSBYIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChMaXN0PGNhcHR1cmUtb2YgPz4pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiNTYuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMzUpXG4iICsgCgkJIgliYXIyKGwpOyAvLyBMaXN0PE9iamVjdD4gLSBpbGxlZ2FsIFs4OV1cbiIgKyAKCQkiCV5eXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBiYXIyKExpc3Q8T2JqZWN0PikgaW4gdGhlIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoTGlzdDxjYXB0dXJlLW9mID8+KVxuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQkKcHVibGljIHZvaWQgX3Rlc3Q2NjgoKSB7Cgl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkiIFxuIiArIAoJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkiICAgIHZvaWQgZm9vKExpc3Q8PyBzdXBlciBPYmplY3RbXT4gbCkge1xuIiArIAoJCQkiICAgICAgICBsLmFkZChuZXcgT2JqZWN0WzBdKTtcbiIgKyAKCQkJIiAgICB9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIiIpOwp9CQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTI4OQpwdWJsaWMgdm9pZCB0ZXN0NjY5KCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJIlxuIiArIAoJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkicHJpdmF0ZSBzdGF0aWM8VD4gaW50IGluZGV4T2YoZmluYWwgVFtdIGFycmF5LGZpbmFsIFQgZWxlbSkge1xuIiArIAoJCQkiCXJldHVybiAwO1xuIiArIAoJCQkifVxuIiArIAoJCQkicHVibGljIHN0YXRpYyB2b2lkIG1ldGgoQUNvbnRhaW5lciBhYywgQUluZm9bXSBhaUFycmF5KSB7XG4iICsgCgkJCSIgIGZvcihBSW5mbyBhaTogYWlBcnJheSkge1xuIiArIAoJCQkiCWludCBpbmRleDEgPSBpbmRleE9mKGFjLmdldEFzKCksYWkuYSk7XG4iICsgCgkJCSIJaW50IGluZGV4MiA9IGluZGV4T2YoYWMuZ2V0QXMoKSxhaSk7IC8vIGFpLmNsYXNzIT1haS5hLmNsYXNzISEhXG4iICsgCgkJCSIgIH1cbiIgKyAKCQkJIn1cbiIgKyAKCQkJIn1cbiIgKyAKCQkJIlxuIiArIAoJCQkiY2xhc3MgQUNvbnRhaW5lciB7XG4iICsgCgkJCSIgICBwdWJsaWMgQVtdIGdldEFzKCl7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJcbiIgKyAKCQkJImNsYXNzIEFJbmZvIHtcbiIgKyAKCQkJIiAgIHB1YmxpYyBBIGE7XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJcbiIgKyAKCQkJImNsYXNzIEEge1xuIiArIAoJCQkifVxuIiwKCQl9LAoJCSIiKTsKfQkKLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTUwMjEgKGVuc3VyZSBub3QgZXZlbiBhIHdhcm5pbmcpCnB1YmxpYyB2b2lkIHRlc3Q2NzAoKSB7Cgl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEudXRpbC5NYXA7XG4iICsgCgkJCSJcbiIgKyAKCQkJImludGVyZmFjZSBNZXRob2RQcm9wZXJ0eTxBY3R1YWxUeXBlIGV4dGVuZHMgTWV0aG9kUHJvcGVydHk8QWN0dWFsVHlwZT4+IHtcbiIgKyAKCQkJIglwdWJsaWMgdm9pZCBjb3B5RnJvbShBY3R1YWxUeXBlIG90aGVyKTtcbiIgKyAKCQkJIn1cbiIgKyAKCQkJIlxuIiArIAoJCQkiY2xhc3MgTWV0aG9kUHJvcGVydHlEYXRhYmFzZTxQcm9wZXJ0eSBleHRlbmRzIE1ldGhvZFByb3BlcnR5PFByb3BlcnR5Pj4ge1xuIiArIAoJCQkiCU1hcDxTdHJpbmcsIFByb3BlcnR5PiBwcm9wZXJ0eU1hcDtcbiIgKyAKCQkJIglcbiIgKyAKCQkJIgl2b2lkIHJlYWQoU3RyaW5nIGZpbGVOYW1lKSB7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkifVxuIiArIAoJCQkiXG4iICsgCgkJCSJjbGFzcyBGb29Qcm9wZXJ0eSBpbXBsZW1lbnRzIE1ldGhvZFByb3BlcnR5PEZvb1Byb3BlcnR5PiB7XG4iICsgCgkJCSIJU3RyaW5nIHZhbHVlO1xuIiArIAoJCQkiXG4iICsgCgkJCSIJcHVibGljIHZvaWQgY29weUZyb20oRm9vUHJvcGVydHkgb3RoZXIpIHtcbiIgKyAKCQkJIgkJdGhpcy52YWx1ZSA9IG90aGVyLnZhbHVlO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIgKyAKCQkJIlxuIiArIAoJCQkiY2xhc3MgRm9vUHJvcGVydHlEYXRhYmFzZSBleHRlbmRzIE1ldGhvZFByb3BlcnR5RGF0YWJhc2U8Rm9vUHJvcGVydHk+IHtcbiIgKyAKCQkJIn1cbiIgKyAKCQkJIlxuIiArIAoJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkiCUZvb1Byb3BlcnR5RGF0YWJhc2UgZm9vRGF0YWJhc2U7XG4iICsgCgkJCSIJXG4iICsgCgkJCSIJcHVibGljIHZvaWQgcmVhZERhdGFiYXNlKCkge1xuIiArIAoJCQkiCQlGb29Qcm9wZXJ0eURhdGFiYXNlIGRhdGFiYXNlID0gbmV3IEZvb1Byb3BlcnR5RGF0YWJhc2UoKTtcbiIgKyAKCQkJIgkJXG4iICsgCgkJCSIJCWZvb0RhdGFiYXNlID0gcmVhZERhdGFiYXNlKGRhdGFiYXNlLCBcImZvb2RhdGFiYXNlLmRiXCIpOyAvLyBCdWcgcmVwb3J0ZWQgb24gdGhpcyBsaW5lXG4iICsgCgkJCSIJfVxuIiArIAoJCQkiCVxuIiArIAoJCQkiCXByaXZhdGU8XG4iICsgCgkJCSIJCVByb3BlcnR5IGV4dGVuZHMgTWV0aG9kUHJvcGVydHk8UHJvcGVydHk+LFxuIiArIAoJCQkiCQlEYXRhYmFzZVR5cGUgZXh0ZW5kcyBNZXRob2RQcm9wZXJ0eURhdGFiYXNlPFByb3BlcnR5PlxuIiArIAoJCQkiCQk+IERhdGFiYXNlVHlwZSByZWFkRGF0YWJhc2UoRGF0YWJhc2VUeXBlIGRhdGFiYXNlLCBTdHJpbmcgZmlsZU5hbWUpIHtcbiIgKyAKCQkJIgkJCWRhdGFiYXNlLnJlYWQoZmlsZU5hbWUpO1xuIiArIAoJCQkiCQkJcmV0dXJuIGRhdGFiYXNlO1xuIiArIAoJCQkiCQl9XG4iICsgCgkJCSIJXG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIiIpOwp9CQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTAyMSAtIHZhcmlhdGlvbjogZW5zdXJlIG5vdCBldmVuIGEgd2FybmluZwpwdWJsaWMgdm9pZCB0ZXN0NjcxKCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbXBvcnQgamF2YS51dGlsLk1hcDtcbiIgKyAKCQkJIlxuIiArIAoJCQkiaW50ZXJmYWNlIE1ldGhvZFByb3BlcnR5PEFjdHVhbFR5cGUgZXh0ZW5kcyBNZXRob2RQcm9wZXJ0eTxBY3R1YWxUeXBlPj4ge1xuIiArIAoJCQkiCXB1YmxpYyB2b2lkIGNvcHlGcm9tKEFjdHVhbFR5cGUgb3RoZXIpO1xuIiArIAoJCQkifVxuIiArIAoJCQkiXG4iICsgCgkJCSJjbGFzcyBNZXRob2RQcm9wZXJ0eURhdGFiYXNlPFByb3BlcnR5IGV4dGVuZHMgTWV0aG9kUHJvcGVydHk8UHJvcGVydHk+PiB7XG4iICsgCgkJCSIJTWFwPFN0cmluZywgUHJvcGVydHk+IHByb3BlcnR5TWFwO1xuIiArIAoJCQkiCVxuIiArIAoJCQkiCXZvaWQgcmVhZChTdHJpbmcgZmlsZU5hbWUpIHtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJcbiIgKyAKCQkJImNsYXNzIEZvb1Byb3BlcnR5IGltcGxlbWVudHMgTWV0aG9kUHJvcGVydHk8Rm9vUHJvcGVydHk+IHtcbiIgKyAKCQkJIglTdHJpbmcgdmFsdWU7XG4iICsgCgkJCSJcbiIgKyAKCQkJIglwdWJsaWMgdm9pZCBjb3B5RnJvbShGb29Qcm9wZXJ0eSBvdGhlcikge1xuIiArIAoJCQkiCQl0aGlzLnZhbHVlID0gb3RoZXIudmFsdWU7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkifVxuIiArIAoJCQkiXG4iICsgCgkJCSJjbGFzcyBGb29Qcm9wZXJ0eURhdGFiYXNlIGV4dGVuZHMgTWV0aG9kUHJvcGVydHlEYXRhYmFzZTxGb29Qcm9wZXJ0eT4ge1xuIiArIAoJCQkifVxuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIgIFpvcmsgejtcbiIgKwoJCQkiCUZvb1Byb3BlcnR5RGF0YWJhc2UgZm9vRGF0YWJhc2U7XG4iICsgCgkJCSIJXG4iICsgCgkJCSIJcHVibGljIHZvaWQgcmVhZERhdGFiYXNlKCkge1xuIiArIAoJCQkiCQlGb29Qcm9wZXJ0eURhdGFiYXNlIGRhdGFiYXNlID0gbmV3IEZvb1Byb3BlcnR5RGF0YWJhc2UoKTtcbiIgKyAKCQkJIgkJXG4iICsgCgkJCSIJCWZvb0RhdGFiYXNlID0gcmVhZERhdGFiYXNlKGRhdGFiYXNlLCBcImZvb2RhdGFiYXNlLmRiXCIpOyAvLyBCdWcgcmVwb3J0ZWQgb24gdGhpcyBsaW5lXG4iICsgCgkJCSIJfVxuIiArIAoJCQkiCVxuIiArIAoJCQkiCXByaXZhdGU8XG4iICsgCgkJCSIJCVByb3BlcnR5IGV4dGVuZHMgTWV0aG9kUHJvcGVydHk8UHJvcGVydHk+LFxuIiArIAoJCQkiCQlEYXRhYmFzZVR5cGUgZXh0ZW5kcyBNZXRob2RQcm9wZXJ0eURhdGFiYXNlPFByb3BlcnR5PlxuIiArIAoJCQkiCQk+IERhdGFiYXNlVHlwZSByZWFkRGF0YWJhc2UoRGF0YWJhc2VUeXBlIGRhdGFiYXNlLCBTdHJpbmcgZmlsZU5hbWUpIHtcbiIgKyAKCQkJIgkJCWRhdGFiYXNlLnJlYWQoZmlsZU5hbWUpO1xuIiArIAoJCQkiCQkJcmV0dXJuIGRhdGFiYXNlO1xuIiArIAoJCQkiCQl9XG4iICsgCgkJCSIJXG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDI2KVxuIiArIAoJCSIJWm9yayB6O1xuIiArIAoJCSIJXl5eXlxuIiArIAoJCSJab3JrIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0JCi8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk1MDIxIC0gdmFyaWF0aW9uOiBlbnN1cmUgbm90IGV2ZW4gYSB3YXJuaW5nCnB1YmxpYyB2b2lkIHRlc3Q2NzIoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImludGVyZmFjZSBGb288VCBleHRlbmRzIEZvbzxUPj4ge1xuIiArIAoJCQkifVxuIiArIAoJCQkiXG4iICsgCgkJCSJjbGFzcyBCYXI8UT4ge1xuIiArIAoJCQkifVxuIiArIAoJCQkiXG4iICsgCgkJCSJcbiIgKyAKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIglab3JrIHo7XG4iICsKCQkJIgl2b2lkIHJlYWREYXRhYmFzZSgpIHtcbiIgKyAKCQkJIgkJQmFyPEZvbz4gYmFyID0gbmV3IEJhcjxGb28+KCk7XG4iICsgCgkJCSIJCXJlYWQoYmFyLCBcInNhZGFzZFwiKTtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSIJXG4iICsgCgkJCSIJPFAgZXh0ZW5kcyBGb288UD4sIEQgZXh0ZW5kcyBCYXI8UD4+IFxuIiArIAoJCQkiCUQgcmVhZChEIGQsIFN0cmluZyBzKSB7XG4iICsgCgkJCSIJCQlyZXR1cm4gZDtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJIglab3JrIHo7XG4iICsgCgkJIgleXl5eXG4iICsgCgkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEyKVxuIiArIAoJCSIJcmVhZChiYXIsIFwic2FkYXNkXCIpO1xuIiArIAoJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJUeXBlIHNhZmV0eTogVW5jaGVja2VkIGludm9jYXRpb24gcmVhZChCYXI8Rm9vPiwgU3RyaW5nKSBvZiB0aGUgZ2VuZXJpYyBtZXRob2QgcmVhZChELCBTdHJpbmcpIG9mIHR5cGUgWFxuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQkKLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTU2MzggCnB1YmxpYyB2b2lkIHRlc3Q2NzMoKSB7Cgl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkiXG4iICsgCgkJCSJjbGFzcyBLZXk8RSwgRiBleHRlbmRzIFR5cGU8RSwgRj4+IHtcbiIgKyAKCQkJIn1cbiIgKyAKCQkJIlxuIiArIAoJCQkiY2xhc3MgU3RhdGU8UyBleHRlbmRzIFN0YXRlPiB7XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJcbiIgKyAKCQkJImNsYXNzIFR5cGU8VCwgVSBleHRlbmRzIFR5cGU8VCwgVT4+IHtcbiIgKyAKCQkJIn1cbiIgKyAKCQkJIlxuIiArIAoJCQkiY2xhc3MgU3RvcmU8QSwgQiBleHRlbmRzIFR5cGU8QSwgQj4sIEMgZXh0ZW5kcyBLZXk8QSwgQj4sIEQgZXh0ZW5kcyBTdGF0ZTxEPj4ge1xuIiArIAoJCQkifVxuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWDxLPiB7XG4iICsgCgkJCSIJTGlzdDxTdG9yZTxLLCA/LCA/IGV4dGVuZHMgS2V5PEssID8+LCA/IGV4dGVuZHMgU3RhdGU8Pz4+PiBzdG9yZXM7XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIiIpOwp9CQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTYzOCAtIHZhcmlhdGlvbgpwdWJsaWMgdm9pZCB0ZXN0Njc0KCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImNsYXNzIEtleTxFIGV4dGVuZHMgS2V5PEU+PiB7fVxuIiArIAoJCQkiY2xhc3MgU3RvcmU8RiBleHRlbmRzIEtleTxGPj4ge31cbiIgKyAKCQkJIlxuIiArIAoJCQkicHVibGljIGNsYXNzIFg8VCBleHRlbmRzIEtleTxUPj4ge1xuIiArIAoJCQkiCVN0b3JlPD8gZXh0ZW5kcyBLZXk8VD4+IHN0b3JlO1xuIiArIAoJCQkifVxuIiwKCQl9LAoJCSIiKTsKfQkKLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTU2MzggLSB2YXJpYXRpb24KcHVibGljIHZvaWQgdGVzdDY3NSgpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiY2xhc3MgS2V5PEUgZXh0ZW5kcyBLZXk8RT4+IHt9XG4iICsgCgkJCSJjbGFzcyBTdG9yZTxGIGV4dGVuZHMgS2V5PEY+PiB7fVxuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWDxUPiB7XG4iICsgCgkJCSIJU3RvcmU8PyBleHRlbmRzIEtleTxUPj4gc3RvcmUxO1xuIiArIAoJCQkiCVN0b3JlPD8gZXh0ZW5kcyBLZXk8PyBleHRlbmRzIFQ+PiBzdG9yZTI7XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXHJcbiIgKyAKCQkiCVN0b3JlPD8gZXh0ZW5kcyBLZXk8VD4+IHN0b3JlMTtcclxuIiArIAoJCSIJICAgICAgICAgICAgICAgICAgICBeXG4iICsgCgkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSBUIGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8RSBleHRlbmRzIEtleTxFPj4gb2YgdGhlIHR5cGUgS2V5PEU+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXHJcbiIgKyAKCQkiCVN0b3JlPD8gZXh0ZW5kcyBLZXk8PyBleHRlbmRzIFQ+PiBzdG9yZTI7XHJcbiIgKyAKCQkiCSAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5cbiIgKyAKCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlID8gZXh0ZW5kcyBUIGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8RSBleHRlbmRzIEtleTxFPj4gb2YgdGhlIHR5cGUgS2V5PEU+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9CQovL2NoZWNrIGZhdWx0IHRvbGVyYW5jZSwgaW4gc3BpdGUgb2YgYm91bmQgbWlzbWF0Y2gsIHN0aWxsIHBhc3MgcGFyYW0gdHlwZSBmb3IgZnVydGhlciByZXNvbHZpbmcgbWVzc2FnZSBzZW5kCnB1YmxpYyB2b2lkIHRlc3Q2NzYoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYPFQgZXh0ZW5kcyBUaHJvd2FibGU+IHtcbiIgKyAKCQkJIglUIGdldCgpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJIglcbiIgKyAKCQkJIgl2b2lkIGZvbyhYPFN0cmluZz4geHMpIHtcbiIgKyAKCQkJIgkJeHMuZ2V0KCkucHJpbnRTdGFja1RyYWNlKCk7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkifVxuIiwKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCSIJdm9pZCBmb28oWDxTdHJpbmc+IHhzKSB7XG4iICsgCgkJIgkgICAgICAgICAgIF5eXl5eXlxuIiArIAoJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgU3RyaW5nIGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VCBleHRlbmRzIFRocm93YWJsZT4gb2YgdGhlIHR5cGUgWDxUPlxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCSIJeHMuZ2V0KCkucHJpbnRTdGFja1RyYWNlKCk7XG4iICsgCgkJIgkgICAgICAgICBeXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCBwcmludFN0YWNrVHJhY2UoKSBpcyB1bmRlZmluZWQgZm9yIHRoZSB0eXBlIFN0cmluZ1xuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQkKcHVibGljIHZvaWQgdGVzdDY3NygpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAoJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJIgkJe1xuIiArIAoJCQkiCQkJQXJyYXlMaXN0PE51bWJlcj4gYXJyYXlMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOyAvLyBjb21waWxlIGVycm9yXG4iICsgCgkJCSIJCQlOdW1iZXIgbnVtYmVyID0gYXJyYXlMaXN0LmdldCgwKTtcbiIgKyAKCQkJIgkJfVxuIiArIAoJCQkiCQl7XG4iICsgCgkJCSIJCQlBcnJheUxpc3Q8PyBleHRlbmRzIE51bWJlcj4gYXJyYXlMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOyAvL2NvcnJlY3RcbiIgKyAKCQkJIgkJCU51bWJlciBudW1iZXIgPSBhcnJheUxpc3QuZ2V0KDApO1xuIiArIAoJCQkiCQl9XG4iICsgCgkJCSIJCXtcbiIgKyAKCQkJIgkJCUFycmF5TGlzdDw/IHN1cGVyIEludGVnZXI+IGFycmF5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TnVtYmVyPigpO1xuIiArIAoJCQkiCQkJT2JqZWN0IG51bWJlciA9IGFycmF5TGlzdC5nZXQoMCk7IC8vcmV0dXJucyBqYXZhLmxhbmcuT2JqZWN0XG4iICsgCgkJCSIJCX1cbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJIglBcnJheUxpc3Q8TnVtYmVyPiBhcnJheUxpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7IC8vIGNvbXBpbGUgZXJyb3JcbiIgKyAKCQkiCSAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXlxuIiArIAoJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIEFycmF5TGlzdDxJbnRlZ2VyPiB0byBBcnJheUxpc3Q8TnVtYmVyPlxuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQkKcHVibGljIHZvaWQgdGVzdDY3OCgpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlO1xuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWDxULCBUMiBleHRlbmRzIFQgJiBTZXJpYWxpemFibGUgPiB7XG4iICsgCgkJCSIJXG4iICsgCgkJCSIJWDxPYmplY3QsIFNlcmlhbGl6YWJsZT4gcmlnaHQxO1xuIiArIAoJCQkiCVg8U3RyaW5nLCBTZXJpYWxpemFibGU+IHdyb25nMTtcbiIgKyAKCQkJIglYPFksIFk+IHJpZ2h0MjtcbiIgKyAKCQkJIglcbiIgKyAKCQkJIglzdGF0aWMgY2xhc3MgWSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkifVxuIiwKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCSIJWDxTdHJpbmcsIFNlcmlhbGl6YWJsZT4gd3JvbmcxO1xuIiArIAoJCSIJICAgICAgICAgIF5eXl5eXl5eXl5eXlxuIiArIAoJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgU2VyaWFsaXphYmxlIGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VDIgZXh0ZW5kcyBUICYgU2VyaWFsaXphYmxlPiBvZiB0aGUgdHlwZSBYPFQsVDI+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKCQkiCXN0YXRpYyBjbGFzcyBZIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHtcbiIgKyAKCQkiCSAgICAgICAgICAgICBeXG4iICsgCgkJIlRoZSBzZXJpYWxpemFibGUgY2xhc3MgWSBkb2VzIG5vdCBkZWNsYXJlIGEgc3RhdGljIGZpbmFsIHNlcmlhbFZlcnNpb25VSUQgZmllbGQgb2YgdHlwZSBsb25nXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9CQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTYzOCAtIHZhcmlhdGlvbgpwdWJsaWMgdm9pZCB0ZXN0Njc5KCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImNsYXNzIEtleTxFLCBGIGV4dGVuZHMgS2V5PEUsIEY+PiB7fVxuIiArIAoJCQkiY2xhc3MgU3RvcmU8QSwgQiBleHRlbmRzIEtleTxBLCBCPj4ge31cbiIgKyAKCQkJIlxuIiArIAoJCQkicHVibGljIGNsYXNzIFg8SyBleHRlbmRzIEtleTw/LCBLPj4ge1xuIiArIAoJCQkiCVN0b3JlPEssID8gZXh0ZW5kcyBLZXk8SywgPz4+IHN0b3JlO1xuIiArIAoJCQkifVxuIiwKCQl9LAoJCSIiKTsKfQkKLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTU2MzggLSB2YXJpYXRpb24KcHVibGljIHZvaWQgdGVzdDY4MCgpIHsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCSJcbiIgKyAKCQkJImNsYXNzIEtleTxFLCBGIGV4dGVuZHMgVHlwZTxFLCBGLCBHLCBIPiwgRyBleHRlbmRzIEtleTxFLCBGLCBHLCBIPiwgSCBleHRlbmRzIFN0YXRlPEg+PiB7fVxuIiArIAoJCQkiY2xhc3MgU3RhdGU8UyBleHRlbmRzIFN0YXRlPiB7fVxuIiArIAoJCQkiY2xhc3MgVHlwZTxULCBVIGV4dGVuZHMgVHlwZTxULCBVLCBWLCBXPiwgViBleHRlbmRzIEtleTxULCBVLCBWLCBXPiwgVyBleHRlbmRzIFN0YXRlPFc+PiB7fVxuIiArIAoJCQkiY2xhc3MgU3RvcmU8QSwgQiBleHRlbmRzIFR5cGU8QSwgQiwgQywgRD4sIEMgZXh0ZW5kcyBLZXk8QSwgQiwgQywgRD4sIEQgZXh0ZW5kcyBTdGF0ZTxEPj4ge31cbiIgKyAKCQkJIlxuIiArIAoJCQkicHVibGljIGNsYXNzIFg8SyBleHRlbmRzIEtleTxLLCA/LD8sPz4+IHtcbiIgKyAKCQkJIglMaXN0PFN0b3JlPEssID8sID8gZXh0ZW5kcyBLZXk8SywgPywgPywgPz4sID8gZXh0ZW5kcyBTdGF0ZTw/Pj4+IHN0b3JlcztcbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiIik7Cn0JCi8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk1NjM4IC0gdmFyaWF0aW9uCnB1YmxpYyB2b2lkIHRlc3Q2ODEoKSB7Cgl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiY2xhc3MgS2V5PEUsIEsgZXh0ZW5kcyBLZXk8RSwgSz4+IHtcbiIgKyAKCQkJIn1cbiIgKyAKCQkJImNsYXNzIFN0b3JlPEUsIEsgZXh0ZW5kcyBLZXk8RSwgSz4+IHtcbiIgKyAKCQkJIn1cbiIgKyAKCQkJImNsYXNzIFg8RT4ge1xuIiArIAoJCQkiCVN0b3JlPEUsID8+IHN0b3JlMTtcbiIgKyAKCQkJIglTdG9yZTxFLCA/IGV4dGVuZHMgS2V5PEUsID8+PiBzdG9yZTI7XG4iICsgCgkJCSJcbiIgKyAKCQkJIgljbGFzcyBTdG9yZUhvbGRlciA8RiBleHRlbmRzIEtleTxFLCBGPj4ge1xuIiArIAoJCQkiCQlTdG9yZTxFLCBGPiBzdG9yZTtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJjbGFzcyBZPFQsIFUgZXh0ZW5kcyBZPFQsIFU+PiB7XG4iICsgCgkJCSIJWTw/LCA/PiB5O1xuIiArIAoJCQkifVxuIiwKCQl9LAoJCSIiKTsKfQkKLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTU5NjMKcHVibGljIHZvaWQgdGVzdDY4MigpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiY2xhc3MgWCBleHRlbmRzIEE8WC5NPiB7fVxuIiArIAoJCQkiY2xhc3MgQTxUPiB7fVxuIgoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCgkJIgljbGFzcyBYIGV4dGVuZHMgQTxYLk0+IHt9XG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICBeXl5cbiIgKyAKCQkiWC5NIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIgoJKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NjA4NQpwdWJsaWMgdm9pZCB0ZXN0NjgzKCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiUC5qYXZhIiwKCQkJInB1YmxpYyBpbnRlcmZhY2UgUDxWPiB7XG4iICsgCgkJCSIgICAgaW50ZXJmYWNlIEEge31cbiIgKyAKCQkJIn1cbiIsCgkJCSJQMi5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBQMiBpbXBsZW1lbnRzIFAuQSB7XG4iICsgCgkJCSIgICAgUDIoUC5BIHByb2JsZW0pIHt9XG4iICsgCgkJCSJ9XG4iLAoJCQkiUDMuamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgUDMge1xuIiArIAoJCQkiICAgIHZvaWQgdGVzdCgpIHtQLkEgbyA9IG5ldyBQMigoUC5BKSBudWxsKTt9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIiIpOwoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiUDMuamF2YSIsCgkJCSJjbGFzcyBQMyB7XG4iICsgCgkJCSIgICAgdm9pZCB0ZXN0KCkge1AuQSBvID0gbmV3IFAyKChQLkEpIG51bGwpO31cbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiIiwKCQludWxsLAoJCWZhbHNlLAoJCW51bGwpOwp9CnB1YmxpYyB2b2lkIHRlc3Q2ODQoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJIgk8VT4gVSBmb28oVSB1MSwgVSB1Mikge1xuIiArIAoJCQkiCQlyZXR1cm4gdTE7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkiCXZvaWQgYmFyKFg8PyBleHRlbmRzIFRocm93YWJsZT4geDEsIFg8PyBleHRlbmRzIFJ1bm5hYmxlPiB4Mikge1xuIiArIAoJCQkiCQlYPFN0cmluZz4geCA9IGZvbyh4MSwgeDIpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkiCVg8U3RyaW5nPiB4ID0gZm9vKHgxLCB4Mik7XG4iICsgCgkJIgkgICAgICAgICAgXlxuIiArIAoJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFg8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0PiB0byBYPFN0cmluZz5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0JCnB1YmxpYyB2b2lkIHRlc3Q2ODUoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJIgk8VT4gVSBmb28oVSB1MSwgVSB1Mikge1xuIiArIAoJCQkiCQlyZXR1cm4gdTE7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkiCXZvaWQgYmFyKFg8PyBleHRlbmRzIFRocm93YWJsZT4geDEsIFg8PyBleHRlbmRzIFJ1bm5hYmxlPiB4Mikge1xuIiArIAoJCQkiCQlYPFN0cmluZz4geCA9IGZvbyh4MSwgeDIpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkiCVg8U3RyaW5nPiB4ID0gZm9vKHgxLCB4Mik7XG4iICsgCgkJIgkgICAgICAgICAgXlxuIiArIAoJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFg8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgT2JqZWN0PiB0byBYPFN0cmluZz5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0JCi8vIGNoZWNrIHdpbGRjYXJkIGJvdW5kcyB3cnQgdmFyaWFibGUgYm91bmRDaGVjawpwdWJsaWMgdm9pZCB0ZXN0Njg2KCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCSJjbGFzcyBPdGhlcjxUIGV4dGVuZHMgTGlzdDw/IGV4dGVuZHMgUnVubmFibGU+PiB7XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJcbiIgKyAKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIglPdGhlcjw/IGV4dGVuZHMgTGlzdDw/IGV4dGVuZHMgVGhyb3dhYmxlPj4gb3RoZXIxO1xuIiArIAoJCQkiCU90aGVyPD8gZXh0ZW5kcyBMaXN0PD8gc3VwZXIgU3RyaW5nPj4gb3RoZXIyOwlcbiIgKyAKCQkJIglPdGhlcjw/IGV4dGVuZHMgTGlzdDw/IGV4dGVuZHMgU3RyaW5nPj4gb3RoZXIzOwkJXG4iICsgCgkJCSIJT3RoZXI8PyBleHRlbmRzIExpc3Q8PyBleHRlbmRzIFJ1bm5hYmxlPj4gb3RoZXI3ID0gb3RoZXIxO1xuIiArIAoJCQkifVxuIiwKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCSIJT3RoZXI8PyBleHRlbmRzIExpc3Q8PyBzdXBlciBTdHJpbmc+PiBvdGhlcjI7CVxuIiArIAoJCSIJICAgICAgXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlID8gZXh0ZW5kcyBMaXN0PD8gc3VwZXIgU3RyaW5nPiBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFQgZXh0ZW5kcyBMaXN0PD8gZXh0ZW5kcyBSdW5uYWJsZT4+IG9mIHRoZSB0eXBlIE90aGVyPFQ+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJIglPdGhlcjw/IGV4dGVuZHMgTGlzdDw/IGV4dGVuZHMgU3RyaW5nPj4gb3RoZXIzOwkJXG4iICsgCgkJIgkgICAgICBeXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgPyBleHRlbmRzIExpc3Q8PyBleHRlbmRzIFN0cmluZz4gaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgTGlzdDw/IGV4dGVuZHMgUnVubmFibGU+PiBvZiB0aGUgdHlwZSBPdGhlcjxUPlxuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQovLyBjaGVjayB3aWxkY2FyZCBib3VuZHMgd3J0IHZhcmlhYmxlIGJvdW5kQ2hlY2sKcHVibGljIHZvaWQgdGVzdDY4NygpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkiY2xhc3MgT3RoZXI8VCBleHRlbmRzIExpc3Q8PyBleHRlbmRzIFJ1bm5hYmxlPj4ge1xuIiArIAoJCQkifVxuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIJT3RoZXI8PyBleHRlbmRzIExpc3Q8Pz4+IG90aGVyMjtcbiIgKyAKCQkJIglPdGhlcjw/IGV4dGVuZHMgTGlzdDw/IHN1cGVyIFRocm93YWJsZT4+IG90aGVyMztcbiIgKyAKCQkJIglPdGhlcjw/IHN1cGVyIExpc3Q8PyBleHRlbmRzIFRocm93YWJsZT4+IG90aGVyNDtcbiIgKyAKCQkJIglPdGhlcjw/IHN1cGVyIExpc3Q8Pz4+IG90aGVyNTtcbiIgKyAKCQkJIglPdGhlcjw/IHN1cGVyIExpc3Q8PyBzdXBlciBUaHJvd2FibGU+PiBvdGhlcjY7XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJIglPdGhlcjw/IGV4dGVuZHMgTGlzdDw/IHN1cGVyIFRocm93YWJsZT4+IG90aGVyMztcbiIgKyAKCQkiCSAgICAgIF5eXl5eXl5eXl5eXl5eXG4iICsgCgkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSA/IGV4dGVuZHMgTGlzdDw/IHN1cGVyIFRocm93YWJsZT4gaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgTGlzdDw/IGV4dGVuZHMgUnVubmFibGU+PiBvZiB0aGUgdHlwZSBPdGhlcjxUPlxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCSIJT3RoZXI8PyBzdXBlciBMaXN0PD8gZXh0ZW5kcyBUaHJvd2FibGU+PiBvdGhlcjQ7XG4iICsgCgkJIgkgICAgICBeXl5eXl5eXl5eXl5cbiIgKyAKCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlID8gc3VwZXIgTGlzdDw/IGV4dGVuZHMgVGhyb3dhYmxlPiBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFQgZXh0ZW5kcyBMaXN0PD8gZXh0ZW5kcyBSdW5uYWJsZT4+IG9mIHRoZSB0eXBlIE90aGVyPFQ+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDkpXG4iICsgCgkJIglPdGhlcjw/IHN1cGVyIExpc3Q8Pz4+IG90aGVyNTtcbiIgKyAKCQkiCSAgICAgIF5eXl5eXl5eXl5eXlxuIiArIAoJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgPyBzdXBlciBMaXN0PD8+IGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VCBleHRlbmRzIExpc3Q8PyBleHRlbmRzIFJ1bm5hYmxlPj4gb2YgdGhlIHR5cGUgT3RoZXI8VD5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSI0LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTApXG4iICsgCgkJIglPdGhlcjw/IHN1cGVyIExpc3Q8PyBzdXBlciBUaHJvd2FibGU+PiBvdGhlcjY7XG4iICsgCgkJIgkgICAgICBeXl5eXl5eXl5eXl5cbiIgKyAKCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlID8gc3VwZXIgTGlzdDw/IHN1cGVyIFRocm93YWJsZT4gaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgTGlzdDw/IGV4dGVuZHMgUnVubmFibGU+PiBvZiB0aGUgdHlwZSBPdGhlcjxUPlxuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQovLyBjaGVjayB3aWxkY2FyZCBib3VuZHMgd3J0IHZhcmlhYmxlIGJvdW5kQ2hlY2sKcHVibGljIHZvaWQgdGVzdDY4OCgpIHsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCSJjbGFzcyBPdGhlcjxUIGV4dGVuZHMgTGlzdDw/IGV4dGVuZHMgUnVubmFibGU+PiB7XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJcbiIgKyAKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIglPdGhlcjw/IHN1cGVyIExpc3Q8PyBleHRlbmRzIFJ1bm5hYmxlPj4gb3RoZXI1O1xuIiArIAoJCQkifVxuIiwKCQl9LAoJCSIiKTsKfQovLyBjaGVjayB3aWxkY2FyZCBib3VuZHMgd3J0IHZhcmlhYmxlIGJvdW5kQ2hlY2sKcHVibGljIHZvaWQgdGVzdDY4OSgpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkiY2xhc3MgT3RoZXI8VCBleHRlbmRzIExpc3Q8PyBleHRlbmRzIFJ1bm5hYmxlPj4ge1xuIiArIAoJCQkifVxuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIJT3RoZXI8PyBzdXBlciBMaXN0PD8gc3VwZXIgUnVubmFibGU+PiBvdGhlcjU7XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJIglPdGhlcjw/IHN1cGVyIExpc3Q8PyBzdXBlciBSdW5uYWJsZT4+IG90aGVyNTtcbiIgKyAKCQkiCSAgICAgIF5eXl5eXl5eXl5eXlxuIiArIAoJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgPyBzdXBlciBMaXN0PD8gc3VwZXIgUnVubmFibGU+IGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VCBleHRlbmRzIExpc3Q8PyBleHRlbmRzIFJ1bm5hYmxlPj4gb2YgdGhlIHR5cGUgT3RoZXI8VD5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0KLy8gY2hlY2sgYXNzaWdubWVudCBydWxlcyBhY3Jvc3MgcGFyYW0gdHlwZXMgd2l0aCB3aWxkY2FyZHMKcHVibGljIHZvaWQgdGVzdDY5MCgpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkiCXZvaWQgZm9vKExpc3Q8PyBleHRlbmRzIFJ1bm5hYmxlPiBsciwgTGlzdDw/PiBsYSkge1xuIiArIAoJCQkiCQlsciA9IGxhO1xuIiArIAoJCQkiCQlsYSA9IGxyO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn0gICAgICAgICBcbiIgKyAKCQkJIlxuIiwKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCSIJbHIgPSBsYTtcbiIgKyAKCQkiCSAgICAgXl5cbiIgKyAKCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBMaXN0PGNhcHR1cmUtb2YgPz4gdG8gTGlzdDw/IGV4dGVuZHMgUnVubmFibGU+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9Ci8vIGNoZWNrIHRoYXQgZmluYWwgY2xhc3MgYm91bmQgaXMgbW9yZSByZXN0cmljdGl2ZQpwdWJsaWMgdm9pZCB0ZXN0NjkxKCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlhYLmphdmEiLAoJCQkicHVibGljIGNsYXNzIFhYPFQgZXh0ZW5kcyBSdW5uYWJsZT4ge1xuIiArIAoJCQkiCXZvaWQgZm9vKFhYPD8+IGxocywgWFg8PyBleHRlbmRzIFN0cmluZz4gcmhzKSB7XG4iICsgCgkJCSIJCWxocyA9IHJocztcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWFguamF2YSAoYXQgbGluZSAyKVxuIiArIAoJCSIJdm9pZCBmb28oWFg8Pz4gbGhzLCBYWDw/IGV4dGVuZHMgU3RyaW5nPiByaHMpIHtcbiIgKyAKCQkiCSAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgPyBleHRlbmRzIFN0cmluZyBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFQgZXh0ZW5kcyBSdW5uYWJsZT4gb2YgdGhlIHR5cGUgWFg8VD5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0KLy8gY2hlY2sgd2lsZGNhcmQgYm91bmRzIHdydCB2YXJpYWJsZSBib3VuZENoZWNrCnB1YmxpYyB2b2lkIHRlc3Q2OTIoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKyAKCQkJIlxuIiArIAoJCQkicHVibGljIGNsYXNzIFg8VCBleHRlbmRzIExpc3Q8T2JqZWN0Pj4ge1xuIiArIAoJCQkiCVxuIiArIAoJCQkiCXZvaWQgZm9vKFg8PyBleHRlbmRzIExpc3Q8U3RyaW5nPj4geCkge1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkiCXZvaWQgZm9vKFg8PyBleHRlbmRzIExpc3Q8U3RyaW5nPj4geCkge1xuIiArIAoJCSIJICAgICAgICAgICBeXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgPyBleHRlbmRzIExpc3Q8U3RyaW5nPiBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFQgZXh0ZW5kcyBMaXN0PE9iamVjdD4+IG9mIHRoZSB0eXBlIFg8VD5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0JCi8vIGJvdW5kIGNoZWNrcwpwdWJsaWMgdm9pZCB0ZXN0NjkzKCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWDxUIGV4dGVuZHMgUnVubmFibGU+IHtcbiIgKyAKCQkJIglYPFg8U3RyaW5nPj4geDE7XG4iICsgCgkJCSIJWDw/IGV4dGVuZHMgU3RyaW5nPiB4MjtcbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKCQkiCVg8WDxTdHJpbmc+PiB4MTtcbiIgKyAKCQkiCSAgXlxuIiArIAoJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgWDxTdHJpbmc+IGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VCBleHRlbmRzIFJ1bm5hYmxlPiBvZiB0aGUgdHlwZSBYPFQ+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDIpXG4iICsgCgkJIglYPFg8U3RyaW5nPj4geDE7XG4iICsgCgkJIgkgICAgXl5eXl5eXG4iICsgCgkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSBTdHJpbmcgaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgUnVubmFibGU+IG9mIHRoZSB0eXBlIFg8VD5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkiCVg8PyBleHRlbmRzIFN0cmluZz4geDI7XG4iICsgCgkJIgkgIF5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlID8gZXh0ZW5kcyBTdHJpbmcgaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgUnVubmFibGU+IG9mIHRoZSB0eXBlIFg8VD5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0JCi8vIGJvdW5kIGNoZWNrcwpwdWJsaWMgdm9pZCB0ZXN0Njk0KCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWDxUIGV4dGVuZHMgWDxUPj4ge1xuIiArIAoJCQkiCVg8WDxYPFN0cmluZz4+PiB4MTtcbiIgKyAKCQkJIglYPD8gZXh0ZW5kcyBYPD8gZXh0ZW5kcyBYPFN0cmluZz4+PiB4MjtcbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKCQkiCVg8WDxYPFN0cmluZz4+PiB4MTtcbiIgKyAKCQkiCSAgXlxuIiArIAoJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgWDxYPFN0cmluZz4+IGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VCBleHRlbmRzIFg8VD4+IG9mIHRoZSB0eXBlIFg8VD5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKCQkiCVg8WDxYPFN0cmluZz4+PiB4MTtcbiIgKyAKCQkiCSAgICBeXG4iICsgCgkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSBYPFN0cmluZz4gaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgWDxUPj4gb2YgdGhlIHR5cGUgWDxUPlxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyKVxuIiArIAoJCSIJWDxYPFg8U3RyaW5nPj4+IHgxO1xuIiArIAoJCSIJICAgICAgXl5eXl5eXG4iICsgCgkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSBTdHJpbmcgaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgWDxUPj4gb2YgdGhlIHR5cGUgWDxUPlxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjQuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCSIJWDw/IGV4dGVuZHMgWDw/IGV4dGVuZHMgWDxTdHJpbmc+Pj4geDI7XG4iICsgCgkJIgkgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXG4iICsgCgkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSA/IGV4dGVuZHMgWDxTdHJpbmc+IGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VCBleHRlbmRzIFg8VD4+IG9mIHRoZSB0eXBlIFg8VD5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSI1LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkiCVg8PyBleHRlbmRzIFg8PyBleHRlbmRzIFg8U3RyaW5nPj4+IHgyO1xuIiArIAoJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5cbiIgKyAKCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlIFN0cmluZyBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFQgZXh0ZW5kcyBYPFQ+PiBvZiB0aGUgdHlwZSBYPFQ+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9CQovLyBib3VuZCBjaGVja3MKcHVibGljIHZvaWQgdGVzdDY5NSgpIHsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIkkuamF2YSIsCgkJCSJpbnRlcmZhY2UgSTxUIGV4dGVuZHMgSTw/IGV4dGVuZHMgVD4+IHtcbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiIik7Cn0KcHVibGljIHZvaWQgdGVzdDY5NigpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiY2xhc3MgS2V5PEUgZXh0ZW5kcyBLZXk8RT4+IHt9XG4iICsgCgkJCSJjbGFzcyBTdG9yZTxGIGV4dGVuZHMgS2V5PEY+PiB7fVxuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWDxUPiB7XG4iICsgCgkJCSIJU3RvcmU8PyBleHRlbmRzIEtleTxUPj4gc3RvcmUgPSBuZXcgU3RvcmU8S2V5PFQ+PigpO1xuIiArIAoJCQkifVxuIiwKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA1KVxuIiArIAoJCSIJU3RvcmU8PyBleHRlbmRzIEtleTxUPj4gc3RvcmUgPSBuZXcgU3RvcmU8S2V5PFQ+PigpO1xuIiArIAoJCSIJICAgICAgICAgICAgICAgICAgICBeXG4iICsgCgkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSBUIGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8RSBleHRlbmRzIEtleTxFPj4gb2YgdGhlIHR5cGUgS2V5PEU+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJIglTdG9yZTw/IGV4dGVuZHMgS2V5PFQ+PiBzdG9yZSA9IG5ldyBTdG9yZTxLZXk8VD4+KCk7XG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5cbiIgKyAKCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlIEtleTxUPiBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPEYgZXh0ZW5kcyBLZXk8Rj4+IG9mIHRoZSB0eXBlIFN0b3JlPEY+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJIglTdG9yZTw/IGV4dGVuZHMgS2V5PFQ+PiBzdG9yZSA9IG5ldyBTdG9yZTxLZXk8VD4+KCk7XG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXlxuIiArIAoJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgVCBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPEUgZXh0ZW5kcyBLZXk8RT4+IG9mIHRoZSB0eXBlIEtleTxFPlxuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQpwdWJsaWMgdm9pZCB0ZXN0Njk3KCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKyAKCQkJInB1YmxpYyBjbGFzcyBYPFUsIFYgZXh0ZW5kcyBMaXN0PFU+PiB7XG4iICsgCgkJCSIJViB2O1xuIiArIAoJCQkiCVxuIiArIAoJCQkiCXZvaWQgZm9vKFg8U3RyaW5nLCA/PiB4MSwgWDxPYmplY3QsID8+IHgyKSB7XG4iICsgCgkJCSIJCVN0cmluZyBzID14MS52LmdldCgwKTtcbiIgKyAKCQkJIgkJT2JqZWN0IG8gPSB4Mi52LmdldCgwKTtcbiIgKyAKCQkJIgkJXG4iICsgCgkJCSIJfVxuIiArIAoJCQkifVxuIiwKCQl9LAoJCSIiKTsKfQpwdWJsaWMgdm9pZCB0ZXN0Njk4KCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCSJcbiIgKyAKCQkJInB1YmxpYyBjbGFzcyBYPFUgZXh0ZW5kcyBMaXN0PE9iamVjdD4sIFYgZXh0ZW5kcyBMaXN0PFN0cmluZz4+IHtcbiIgKyAKCQkJIglcbiIgKyAKCQkJIglYPD8gc3VwZXIgRXhjZXB0aW9uLCA/IHN1cGVyIEV4Y2VwdGlvbj4geDtcbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkiCVg8PyBzdXBlciBFeGNlcHRpb24sID8gc3VwZXIgRXhjZXB0aW9uPiB4O1xuIiArIAoJCSIJICBeXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJCb3VuZCBtaXNtYXRjaDogVGhlIHR5cGUgPyBzdXBlciBFeGNlcHRpb24gaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxVIGV4dGVuZHMgTGlzdDxPYmplY3Q+PiBvZiB0aGUgdHlwZSBYPFUsVj5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkiCVg8PyBzdXBlciBFeGNlcHRpb24sID8gc3VwZXIgRXhjZXB0aW9uPiB4O1xuIiArIAoJCSIJICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlID8gc3VwZXIgRXhjZXB0aW9uIGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8ViBleHRlbmRzIExpc3Q8U3RyaW5nPj4gb2YgdGhlIHR5cGUgWDxVLFY+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9CnB1YmxpYyB2b2lkIHRlc3Q2OTkoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWDIuamF2YSIsCgkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCQkJCgkJCSJjbGFzcyBPdGhlcjI8VCBleHRlbmRzIExpc3Q8IFJ1bm5hYmxlPj4ge1xuIiArIAoJCQkifVxuIiArIAoJCQkiXG4iICsgCgkJCSJjbGFzcyBYMiB7XG4iICsgCgkJCSIJT3RoZXIyPD8gZXh0ZW5kcyBMaXN0PFRocm93YWJsZT4+IG90aGVyMTtcbiIgKyAKCQkJIglPdGhlcjI8PyBleHRlbmRzIExpc3Q8PyBzdXBlciBTdHJpbmc+PiBvdGhlcjI7CVxuIiArIAoJCQkiCU90aGVyMjw/IGV4dGVuZHMgTGlzdDw/IGV4dGVuZHMgU3RyaW5nPj4gb3RoZXIzOwkJXG4iICsgCgkJCSIJT3RoZXIyPD8gZXh0ZW5kcyBMaXN0PD8gZXh0ZW5kcyBSdW5uYWJsZT4+IG90aGVyNyA9IG90aGVyMTtcbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYMi5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJIglPdGhlcjI8PyBleHRlbmRzIExpc3Q8VGhyb3dhYmxlPj4gb3RoZXIxO1xuIiArIAoJCSIJICAgICAgIF5eXl5eXl5eXl5eXl5eXG4iICsgCgkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSA/IGV4dGVuZHMgTGlzdDxUaHJvd2FibGU+IGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VCBleHRlbmRzIExpc3Q8UnVubmFibGU+PiBvZiB0aGUgdHlwZSBPdGhlcjI8VD5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIyLiBFUlJPUiBpbiBYMi5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJIglPdGhlcjI8PyBleHRlbmRzIExpc3Q8PyBzdXBlciBTdHJpbmc+PiBvdGhlcjI7CVxuIiArIAoJCSIJICAgICAgIF5eXl5eXl5eXl5eXl5eXG4iICsgCgkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSA/IGV4dGVuZHMgTGlzdDw/IHN1cGVyIFN0cmluZz4gaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgTGlzdDxSdW5uYWJsZT4+IG9mIHRoZSB0eXBlIE90aGVyMjxUPlxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjMuIEVSUk9SIGluIFgyLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkiCU90aGVyMjw/IGV4dGVuZHMgTGlzdDw/IGV4dGVuZHMgU3RyaW5nPj4gb3RoZXIzOwkJXG4iICsgCgkJIgkgICAgICAgXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlID8gZXh0ZW5kcyBMaXN0PD8gZXh0ZW5kcyBTdHJpbmc+IGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VCBleHRlbmRzIExpc3Q8UnVubmFibGU+PiBvZiB0aGUgdHlwZSBPdGhlcjI8VD5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0KLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTY2NDYKcHVibGljIHZvaWQgdGVzdDcwMCgpIHsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJhYnN0cmFjdCBjbGFzcyBCYXNlRmFjdG9yeTxUPiB7XG4iICsgCgkJCSIJcHVibGljIFQgY3JlYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7XG4iICsgCgkJCSIJCXJldHVybiBnZXRUeXBlKCkubmV3SW5zdGFuY2UoKTtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSIJcHVibGljIGFic3RyYWN0IENsYXNzPFQ+IGdldFR5cGUoKTtcbiIgKyAKCQkJIn1cbiIgKyAKCQkJImludGVyZmFjZSBTdHJpbmdGYWN0b3J5IHtcbiIgKyAKCQkJIglwdWJsaWMgU3RyaW5nIGNyZWF0ZSgpIHRocm93cyBFeGNlcHRpb247XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIEJhc2VGYWN0b3J5PFN0cmluZz4gaW1wbGVtZW50cyBTdHJpbmdGYWN0b3J5IHtcbiIgKyAKCQkJIglAT3ZlcnJpZGVcbiIgKyAKCQkJIglwdWJsaWMgQ2xhc3M8U3RyaW5nPiBnZXRUeXBlKCkge1xuIiArIAoJCQkiCQlyZXR1cm4gU3RyaW5nLmNsYXNzO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHtcbiIgKyAKCQkJIgkJU3RyaW5nIGVtcHR5U3RyaW5nID0gbmV3IFgoKS5jcmVhdGUoKTtcbiIgKyAKCQkJIgkJU3lzdGVtLm91dC5wcmludGYoXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiU1VDQ0VTUyIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk3MzAzCnB1YmxpYyB2b2lkIHRlc3Q3MDEoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImltcG9ydCBqYXZhLnV0aWwuQXJyYXlzO1xuIiArIAoJCQkiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArIAoJCQkiXG4iICsgCgkJCSJjbGFzcyBEZWVqYXkge1xuIiArIAoJCQkiCWNsYXNzIENvdW50ZXI8VD4ge31cbiIgKyAKCQkJIlxuIiArIAoJCQkiCUNvdW50ZXI8U29uZz4gc29uZ0NvdW50ZXIgPSBuZXcgQ291bnRlcjxTb25nPigpO1xuIiArIAoJCQkiCUNvdW50ZXI8R2VucmU+IGdlbnJlQ291bnRlciA9IG5ldyBDb3VudGVyPEdlbnJlPigpO1xuIiArIAoJCQkiXG4iICsgCgkJCSIJTGlzdDxDb3VudGVyPD8+PiBsaXN0MSA9IEFycmF5cy5hc0xpc3Qoc29uZ0NvdW50ZXIsIGdlbnJlQ291bnRlcik7XG4iICsgCgkJCSIJTGlzdDxDb3VudGVyPD8gZXh0ZW5kcyBPYmplY3Q+PiBsaXN0MiA9IEFycmF5cy5hc0xpc3Qoc29uZ0NvdW50ZXIsIGdlbnJlQ291bnRlcik7XG4iICsgCgkJCSIJTGlzdDxDb3VudGVyPD8+PiBsaXN0MyA9IEFycmF5cy48Q291bnRlcjw/Pj5hc0xpc3Qoc29uZ0NvdW50ZXIsIGdlbnJlQ291bnRlcik7XG4iICsgCgkJCSIJTGlzdDxDb3VudGVyPD8+PiBsaXN0NCA9IEFycmF5cy5hc0xpc3QobmV3IENvdW50ZXI8Pz5bXSB7c29uZ0NvdW50ZXIsIGdlbnJlQ291bnRlcn0pO1xuIiArIAoJCQkiCUxpc3Q8Q291bnRlcjw/IGV4dGVuZHMgU3RyaW5nPj4gbGlzdDUgPSBBcnJheXMuYXNMaXN0KHNvbmdDb3VudGVyLCBnZW5yZUNvdW50ZXIpO1xuIiArIAoJCQkifVxuIiArIAoJCQkiY2xhc3MgR2VucmUge31cbiIgKwoJCQkiY2xhc3MgU29uZyB7fVxuIiwKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxNClcbiIgKyAKCQkiCUxpc3Q8Q291bnRlcjw/IGV4dGVuZHMgU3RyaW5nPj4gbGlzdDUgPSBBcnJheXMuYXNMaXN0KHNvbmdDb3VudGVyLCBnZW5yZUNvdW50ZXIpO1xuIiArIAoJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXlxuIiArIAoJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIExpc3Q8RGVlamF5LkNvdW50ZXI8PyBleHRlbmRzIE9iamVjdD4+IHRvIExpc3Q8RGVlamF5LkNvdW50ZXI8PyBleHRlbmRzIFN0cmluZz4+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk3MzAzIC0gdmFyaWF0aW9uCnB1YmxpYyB2b2lkIHRlc3Q3MDIoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYPFQgZXh0ZW5kcyBSdW5uYWJsZT4gaW1wbGVtZW50cyBSdW5uYWJsZSB7XG4iICsgCgkJCSIJXG4iICsgCgkJCSIJdm9pZCBmb28wKFg8WDw/Pj4gbGhzLCBYPFg8PyBleHRlbmRzIFJ1bm5hYmxlPj4gcmhzKSB7XG4iICsgCgkJCSIJCWxocyA9IHJoczsgLy8gMFxuIiArIAoJCQkiCX1cbiIgKyAKCQkJIgl2b2lkIGZvbzEoWDxYPD8+PiBsaHMsIFg8WDw/IGV4dGVuZHMgT2JqZWN0Pj4gcmhzKSB7XG4iICsgCgkJCSIJCWxocyA9IHJoczsgLy8gMVxuIiArIC8vIFRPRE8gKHBoaWxpcHBlKSBzaG91bGQgYmUgb2sgdXNpbmcgY2FwdHVyZSBydWxlcyBmb3IgZXF1aXZhbGVuY2UKCQkJIgl9XG4iICsgCgkJCSIJdm9pZCBmb28yKFg8WDw/IGV4dGVuZHMgQ2xvbmVhYmxlPj4gbGhzLCBYPFg8PyBleHRlbmRzIE9iamVjdD4+IHJocykge1xuIiArIAoJCQkiCQlsaHMgPSByaHM7IC8vIDJcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSIJdm9pZCBmb28zKFg8WDw/IGV4dGVuZHMgUnVubmFibGU+PiBsaHMsIFg8WDw/IGV4dGVuZHMgT2JqZWN0Pj4gcmhzKSB7XG4iICsgCgkJCSIJCWxocyA9IHJoczsgLy8gM1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIgl2b2lkIGZvbzQoWDxYPD8gZXh0ZW5kcyBSdW5uYWJsZT4+IGxocywgWDxYPD8+PiByaHMpIHtcbiIgKyAKCQkJIgkJbGhzID0gcmhzOyAvLyA0XG4iICsgCgkJCSIJfVxuIiArIAoJCQkiCXZvaWQgZm9vNShYPFg8Pz4+IGxocywgWDxYPD8gZXh0ZW5kcyBDbG9uZWFibGU+PiByaHMpIHtcbiIgKyAKCQkJIgkJbGhzID0gcmhzOyAvLyA1XG4iICsgCgkJCSIJfVxuIiArIAoJCQkiCXZvaWQgZm9vNihYPFg8WDxYPFg8Pz4+Pj4+IGxocywgWDxYPFg8WDxYPD8gZXh0ZW5kcyBSdW5uYWJsZT4+Pj4+IHJocykge1xuIiArIAoJCQkiCQlsaHMgPSByaHM7IC8vIDZcbiIgKyAKCQkJIgl9CVxuIiArIAoJCQkiCXB1YmxpYyB2b2lkIHJ1bigpIHtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJIglsaHMgPSByaHM7IC8vIDFcbiIgKyAKCQkiCSAgICAgIF5eXlxuIiArIAoJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFg8WDw/IGV4dGVuZHMgT2JqZWN0Pj4gdG8gWDxYPD8+PlxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxMClcbiIgKyAKCQkiCWxocyA9IHJoczsgLy8gMlxuIiArIAoJCSIJICAgICAgXl5eXG4iICsgCgkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gWDxYPD8gZXh0ZW5kcyBPYmplY3Q+PiB0byBYPFg8PyBleHRlbmRzIENsb25lYWJsZT4+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEzKVxuIiArIAoJCSIJbGhzID0gcmhzOyAvLyAzXG4iICsgCgkJIgkgICAgICBeXl5cbiIgKyAKCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBYPFg8PyBleHRlbmRzIE9iamVjdD4+IHRvIFg8WDw/IGV4dGVuZHMgUnVubmFibGU+PlxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjQuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAxOSlcbiIgKyAKCQkiCWxocyA9IHJoczsgLy8gNVxuIiArIAoJCSIJICAgICAgXl5eXG4iICsgCgkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gWDxYPD8gZXh0ZW5kcyBDbG9uZWFibGU+PiB0byBYPFg8Pz4+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9CnB1YmxpYyB2b2lkIHRlc3Q3MDMoKSB7Cgl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkicHVibGljIGNsYXNzIFg8VCBleHRlbmRzIFg8VD4+IHt9XG4iICsgCgkJCSJjbGFzcyBZIGV4dGVuZHMgWDxZPiB7XG4iICsgCgkJCSIgICAgWDw/PiBwID0gKFkpbnVsbDtcbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiIik7Cn0KLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTc4MDAKcHVibGljIHZvaWQgdGVzdDcwNCgpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAoJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkiCQkgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkiCQkgCQkgTGlzdDxTdHJpbmc+IGwgPSAoTGlzdDxTdHJpbmc+KUNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpO1xuIiArIAoJCQkiCQkgfQkgXG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJIglMaXN0PFN0cmluZz4gbCA9IChMaXN0PFN0cmluZz4pQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7XG4iICsgCgkJIgkgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiQ2Fubm90IGNhc3QgZnJvbSBMaXN0PE9iamVjdD4gdG8gTGlzdDxTdHJpbmc+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk3NDgwCnB1YmxpYyB2b2lkIHRlc3Q3MDUoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJIlxuIiArIAoJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkiICB2b2lkIGYoT2JqZWN0IG8pe1xuIiArIAoJCQkiCQkgKChNYXAuRW50cnkpbykuc2V0VmFsdWUoXCJidWdcIik7XG4iICsgCgkJCSIJCSAJCSBcbiIgKyAKCQkJIgkJIE1hcC5FbnRyeSBtZT0gKE1hcC5FbnRyeSlvOyBcbiIgKyAKCQkJIgkJIG1lLnNldFZhbHVlKFwib2tcIik7XG4iICsgCgkJCSIJCSAJCSBcbiIgKyAKCQkJIgkJICgoVmVjdG9yKW8pLmFkZChcIm9rXCIpO1xuIiArIAoJCQkiICB9XG4iICsgCgkJCSIgWm9yayB6O1xuIiArCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkiCSgoTWFwLkVudHJ5KW8pLnNldFZhbHVlKFwiYnVnXCIpO1xuIiArIAoJCSIJXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJIlR5cGUgc2FmZXR5OiBUaGUgbWV0aG9kIHNldFZhbHVlKE9iamVjdCkgYmVsb25ncyB0byB0aGUgcmF3IHR5cGUgTWFwLkVudHJ5LiBSZWZlcmVuY2VzIHRvIGdlbmVyaWMgdHlwZSBNYXA8SyxWPi5FbnRyeTxLLFY+IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKCQkiCW1lLnNldFZhbHVlKFwib2tcIik7XG4iICsgCgkJIgleXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJUeXBlIHNhZmV0eTogVGhlIG1ldGhvZCBzZXRWYWx1ZShPYmplY3QpIGJlbG9uZ3MgdG8gdGhlIHJhdyB0eXBlIE1hcC5FbnRyeS4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgTWFwPEssVj4uRW50cnk8SyxWPiBzaG91bGQgYmUgcGFyYW1ldGVyaXplZFxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjMuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEwKVxuIiArIAoJCSIJKChWZWN0b3IpbykuYWRkKFwib2tcIik7XG4iICsgCgkJIgleXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiVHlwZSBzYWZldHk6IFRoZSBtZXRob2QgYWRkKE9iamVjdCkgYmVsb25ncyB0byB0aGUgcmF3IHR5cGUgVmVjdG9yLiBSZWZlcmVuY2VzIHRvIGdlbmVyaWMgdHlwZSBWZWN0b3I8RT4gc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWRcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSI0LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTIpXG4iICsgCgkJIglab3JrIHo7XG4iICsgCgkJIgleXl5eXG4iICsgCgkJIlpvcmsgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZVxuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NzIxOQpwdWJsaWMgdm9pZCB0ZXN0NzA2KCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKCQkJIgkJQkIgYmIgPSBuZXcgQkIoKTtcbiIgKyAKCQkJIgkJYmIuPE9iamVjdD50ZXN0KCk7XG4iICsgCgkJCSIJCSgoQUE8Q0M+KSBiYikudGVzdCgpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIgKyAKCQkJImNsYXNzIEFBPFQ+IHsgQUE8T2JqZWN0PiB0ZXN0KCkge3JldHVybiBudWxsO30gfVxuIiArIAoJCQkiY2xhc3MgQkIgZXh0ZW5kcyBBQTxDQz4geyA8VT4gQkIgdGVzdCgpIHtyZXR1cm4gbnVsbDt9IH1cbiIgKyAKCQkJImNsYXNzIENDIHt9XG4iLAoJCX0sCgkJIiIKCSk7Cn0KLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTcyMTkKcHVibGljIHZvaWQgdGVzdDcwNmEoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKCQkJIgkJQkIgYmIgPSBuZXcgQkIoKTtcbiIgKyAKCQkJIgkJQUE8T2JqZWN0PiByZXMxID0gYmIudGVzdCgpO1xuIiArIAoJCQkiCQlBQSByZXMzID0gYmIudGVzdCgpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIgKyAKCQkJImNsYXNzIEFBPFQ+IHsgQUE8T2JqZWN0PiB0ZXN0KCkge3JldHVybiBudWxsO30gfVxuIiArIAoJCQkiY2xhc3MgQkIgZXh0ZW5kcyBBQTxDQz4geyA8VT4gQkIgdGVzdCgpIHtyZXR1cm4gbnVsbDt9IH1cbiIgKyAKCQkJImNsYXNzIENDIHt9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXHJcbiIgKyAKCQkiCUFBPE9iamVjdD4gcmVzMSA9IGJiLnRlc3QoKTtcclxuIiArIAoJCSIJICAgICAgICAgICAgICAgICAgICAgXl5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIHRlc3QoKSBpcyBhbWJpZ3VvdXMgZm9yIHRoZSB0eXBlIEJCXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXHJcbiIgKyAKCQkiCUFBIHJlczMgPSBiYi50ZXN0KCk7XHJcbiIgKyAKCQkiCSAgICAgICAgICAgICBeXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgdGVzdCgpIGlzIGFtYmlndW91cyBmb3IgdGhlIHR5cGUgQkJcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIgoJCS8vIDQ6IHJlZmVyZW5jZSB0byB0ZXN0IGlzIGFtYmlndW91cywgYm90aCBtZXRob2QgdGVzdCgpIGluIEFBPENDPiBhbmQgbWV0aG9kIDxVPnRlc3QoKSBpbiBCQiBtYXRjaAoJCS8vIDU6IHJlZmVyZW5jZSB0byB0ZXN0IGlzIGFtYmlndW91cywgYm90aCBtZXRob2QgdGVzdCgpIGluIEFBPENDPiBhbmQgbWV0aG9kIDxVPnRlc3QoKSBpbiBCQiBtYXRjaAoJKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NzIxOQpwdWJsaWMgdm9pZCB0ZXN0NzA2YigpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkiCXZvaWQgZm9vKCkge1xuIiArIAoJCQkiCQlCQiBiYiA9IG5ldyBCQigpO1xuIiArIAoJCQkiCQlBQTxDQz4gcmVzID0gYmIudGVzdCgpO1xuIiArIAoJCQkiCQlCQiByZXMyID0gYmIudGVzdCgpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIgKyAKCQkJImNsYXNzIEFBPFQ+IHsgQUE8T2JqZWN0PiB0ZXN0KCkge3JldHVybiBudWxsO30gfVxuIiArIAoJCQkiY2xhc3MgQkIgZXh0ZW5kcyBBQTxDQz4geyA8VT4gQkIgdGVzdCgpIHtyZXR1cm4gbnVsbDt9IH1cbiIgKyAKCQkJImNsYXNzIENDIHt9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXHJcbiIgKyAKCQkiCUFBPENDPiByZXMgPSBiYi50ZXN0KCk7XHJcbiIgKyAKCQkiCSAgICAgICAgICAgICAgICBeXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgdGVzdCgpIGlzIGFtYmlndW91cyBmb3IgdGhlIHR5cGUgQkJcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcclxuIiArIAoJCSIJQkIgcmVzMiA9IGJiLnRlc3QoKTtcclxuIiArIAoJCSIJICAgICAgICAgICAgIF5eXl5cbiIgKyAKCQkiVGhlIG1ldGhvZCB0ZXN0KCkgaXMgYW1iaWd1b3VzIGZvciB0aGUgdHlwZSBCQlxuIiArIAoJCSItLS0tLS0tLS0tXG4iCgkJLy8gNDogcmVmZXJlbmNlIHRvIHRlc3QgaXMgYW1iaWd1b3VzLCBib3RoIG1ldGhvZCB0ZXN0KCkgaW4gQUE8Q0M+IGFuZCBtZXRob2QgPFU+dGVzdCgpIGluIEJCIG1hdGNoCgkJLy8gNDogaW5jb21wYXRpYmxlIHR5cGVzIG9uIHRoZSBhc3NpZ25tZW50CgkJLy8gNTogcmVmZXJlbmNlIHRvIHRlc3QgaXMgYW1iaWd1b3VzLCBib3RoIG1ldGhvZCB0ZXN0KCkgaW4gQUE8Q0M+IGFuZCBtZXRob2QgPFU+dGVzdCgpIGluIEJCIG1hdGNoCgkJLy8gNTogaW5jb21wYXRpYmxlIHR5cGVzIG9uIHRoZSBhc3NpZ25tZW50CgkpOwoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIJdm9pZCBmb28oKSB7XG4iICsgCgkJCSIJCUJCIGJiID0gbmV3IEJCKCk7XG4iICsgCgkJCSIJCUFBPENDPiByZXMgPSBiYi50ZXN0KCk7XG4iICsgCgkJCSIJCUJCIHJlczIgPSBiYi50ZXN0KCk7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkifVxuIiArIAoJCQkiY2xhc3MgQUE8VD4geyBBQTxPYmplY3Q+IHRlc3QoKSB7cmV0dXJuIG51bGw7fSB9XG4iICsgCgkJCSJjbGFzcyBCQiBleHRlbmRzIEFBPENDPiB7IH1cbiIgKyAKCQkJImNsYXNzIENDIHt9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXHJcbiIgKyAKCQkiCUFBPENDPiByZXMgPSBiYi50ZXN0KCk7XHJcbiIgKyAKCQkiCSAgICAgICBeXl5cbiIgKyAKCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBBQTxPYmplY3Q+IHRvIEFBPENDPlxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA1KVxyXG4iICsgCgkJIglCQiByZXMyID0gYmIudGVzdCgpO1xyXG4iICsgCgkJIgkgICBeXl5eXG4iICsgCgkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gQUE8T2JqZWN0PiB0byBCQlxuIiArIAoJCSItLS0tLS0tLS0tXG4iCgkJLy8gaW5jb21wYXRpYmxlIHR5cGVzIG9uIGJvdGggYXNzaWdubWVudHMKCSk7Cn0KLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTgwNzkKcHVibGljIHZvaWQgdGVzdDcwNygpIHsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWDxUPiB7XG4iICsgCgkJCSJcbiIgKyAKCQkJIiAgICBCPD8gZXh0ZW5kcyBUPiBiKCkge1xuIiArIAoJCQkiICAgICAgICByZXR1cm4gYSgpO1xuIiArIAoJCQkiICAgIH1cbiIgKyAKCQkJIiAgICBcbiIgKyAKCQkJIiAgICA8VSBleHRlbmRzIFQ+IEI8VT4gYSgpIHtcbiIgKyAKCQkJIiAgICAgICAgcmV0dXJuIG51bGw7XG4iICsgCgkJCSIgICAgfVxuIiArIAoJCQkiICAgIFxuIiArIAoJCQkiICAgIHN0YXRpYyBjbGFzcyBCPFY+IHsgfVxuIiArIAoJCQkifVxuIiwKCQl9LAoJCSIiKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTY4NApwdWJsaWMgdm9pZCB0ZXN0NzA4KCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiVXNlckNsYXNzLmphdmEiLAoJCQkicHVibGljIGNsYXNzIFVzZXJDbGFzczxLPiB7XG4iICsgCgkJCSIgICAgcHJvdGVjdGVkIGNsYXNzIERhdGFIb2xkZXIge31cbiIgKyAKCQkJIiAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkSG9vayhEYXRhSG9sZGVyIGRhdGEpIHt9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIiIpOwoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiQ2hpbGRDbGFzcy5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBDaGlsZENsYXNzIGV4dGVuZHMgVXNlckNsYXNzPE9iamVjdD4ge1xuIiArIAoJCQkiICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBsb2FkSG9vayhEYXRhSG9sZGVyIGRhdGEpIHt9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIiIsCgkJbnVsbCwKCQlmYWxzZSwKCQludWxsKTsJCn0KLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTU2ODQgLSB2YXJpYXRpb24KcHVibGljIHZvaWQgdGVzdDcwOSgpIHsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlVzZXJDbGFzcy5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBVc2VyQ2xhc3M8Sz4ge1xuIiArIAoJCQkiICAgIHByb3RlY3RlZCBjbGFzcyBEYXRhSG9sZGVyIHt9XG4iICsgCgkJCSIgICAgcHJvdGVjdGVkIHZvaWQgbG9hZEhvb2soRGF0YUhvbGRlcltdIGRhdGEpIHt9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIiIpOwoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiQ2hpbGRDbGFzcy5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBDaGlsZENsYXNzIGV4dGVuZHMgVXNlckNsYXNzPE9iamVjdD4ge1xuIiArIAoJCQkiICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBsb2FkSG9vayhEYXRhSG9sZGVyW10gZGF0YSkge31cbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiIiwKCQludWxsLAoJCWZhbHNlLAoJCW51bGwpOwkKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NjcxMwpwdWJsaWMgdm9pZCB0ZXN0NzEwKCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIglwdWJsaWMgc3RhdGljIDxWLCBQIGV4dGVuZHMgUGVyc2lzdGVudDxWPj4gUCBjcmVhdGVEYXRhT2JqZWN0KFYgdmFsdWUpIHtcbiIgKyAKCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0Q3JlYXRlRGF0YU9iamVjdChPYmplY3Qgdikge1xuIiArIAoJCQkiCQlQZXJzaXN0ZW50IGQgPSBjcmVhdGVEYXRhT2JqZWN0KHYpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIlxuIiArIAoJCQkiCXByaXZhdGUgaW50ZXJmYWNlIFBlcnNpc3RlbnQ8Vj4ge1xuIiArIAoJCQkiCQlwdWJsaWMgViBnZXRWYWx1ZU9iamVjdCgpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiIik7Cn0KLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk3MTA4CnB1YmxpYyB2b2lkIHRlc3Q3MTEoKXsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDtcbiIgKyAKCQkJImltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDtcbiIgKyAKCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKyAKCQkJImltcG9ydCBqYXZhLnV0aWwuTWFwO1xuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWDxUPiB7XG4iICsgCgkJCSIJc3RhdGljIHByaXZhdGUgTWFwPFN0cmluZywgWFg+IG0xID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBYWD4oKTtcbiIgKyAKCQkJIglwcml2YXRlIExpc3Q8WFg+IG0yID0gbmV3IEFycmF5TGlzdDxYWD4oKTtcbiIgKyAKCQkJIglzdGF0aWMgcHJvdGVjdGVkIFhYIGZvbygpXG4iICsgCgkJCSIJe1xuIiArIAoJCQkiCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSIJc3RhdGljIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYWDxUVD5cbiIgKyAKCQkJIgl7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkifVxuIiwKCQl9LAoJICAgICIiKTsKCQoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWS5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBZIGV4dGVuZHMgWDxPYmplY3Q+ICBcbiIgKyAKCQkJInsgICAgICAgIFxuIiArIAoJCQkifVxuIgoJCX0sCgkgICAgIiIsCgkgICAgbnVsbCwKCSAgICBmYWxzZSwKCSAgICBudWxsKTsKfQovLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTcxMDgKLy8gVGhlIGNhc2UgdGhhdCB3b3JrcwpwdWJsaWMgdm9pZCB0ZXN0NzEyKCl7Cgl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7XG4iICsgCgkJCSJpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7XG4iICsgCgkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCSJpbXBvcnQgamF2YS51dGlsLk1hcDtcbiIgKyAKCQkJIlxuIiArIAoJCQkicHVibGljIGNsYXNzIFg8VD4ge1xuIiArIAoJCQkiCXN0YXRpYyBwcml2YXRlIE1hcDxTdHJpbmcsIFhYPiBtMSA9IG5ldyBIYXNoTWFwPFN0cmluZywgWFg+KCk7XG4iICsgCgkJCSIJcHJpdmF0ZSBMaXN0PFhYPFQ+PiBtMiA9IG5ldyBBcnJheUxpc3Q8WFg8VD4+KCk7XG4iICsgCgkJCSIJc3RhdGljIHByb3RlY3RlZCBYWCBmb28oKVxuIiArIAoJCQkiCXtcbiIgKyAKCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkiCXN0YXRpYyBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWFg8VFQ+XG4iICsgCgkJCSIJe1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIsCgkJfSwKICAgICAgICAiIik7Cgl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJZLmphdmEiLAoJCQkicHVibGljIGNsYXNzIFkgZXh0ZW5kcyBYPE9iamVjdD4gIFxuIiArIAoJCQkieyAgICAgICAgXG4iICsgCgkJCSJ9XG4iCgkJfSwKICAgICAgICAiIiwKICAgICAgICBudWxsLAogICAgICAgIGZhbHNlLAogICAgICAgIG51bGwpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk2NzEzCnB1YmxpYyB2b2lkIHRlc3Q3MTMoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKyAKCQkJIglpbnQgaSA9IDA7XG4iICsgCgkJCSIJaW50ZXJmYWNlIFkge1xuIiArIAoJCQkiCQlqYXZhLnV0aWwuTGlzdDxUPiBsdCA9IG51bGw7XG4iICsgCgkJCSIJCWludCBqID0gaTtcbiIgKyAKCQkJIgkJdm9pZCBtMShUIHQpOwkJXG4iICsgCgkJCSIJfVxuIiArIAoJCQkifVxuIiwKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCSIJamF2YS51dGlsLkxpc3Q8VD4gbHQgPSBudWxsO1xuIiArIAoJCSIJICAgICAgICAgICAgICAgXlxuIiArIAoJCSJDYW5ub3QgbWFrZSBhIHN0YXRpYyByZWZlcmVuY2UgdG8gdGhlIG5vbi1zdGF0aWMgdHlwZSBUXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJIglpbnQgaiA9IGk7XG4iICsgCgkJIgkgICAgICAgIF5cbiIgKyAKCQkiQ2Fubm90IG1ha2UgYSBzdGF0aWMgcmVmZXJlbmNlIHRvIHRoZSBub24tc3RhdGljIGZpZWxkIGlcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIzLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKCQkiCXZvaWQgbTEoVCB0KTsJCVxuIiArIAoJCSIJICAgICAgICBeXG4iICsgCgkJIkNhbm5vdCBtYWtlIGEgc3RhdGljIHJlZmVyZW5jZSB0byB0aGUgbm9uLXN0YXRpYyB0eXBlIFRcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0KLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTgyMzIKcHVibGljIHZvaWQgdGVzdDcxNCgpIHsJCgl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJCLmphdmEiLAoJCQkiaW1wb3J0IGphdmEudXRpbC5NYXA7XG4iICsgCgkJCSJpbXBvcnQgamF2YS51dGlsLlNldDtcbiIgKyAKCQkJImltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0O1xuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgQiAge1xuIiArIAoJCQkiCXN0YXRpYyBTZXQ8TWFwLkVudHJ5PiBmb28oU29ydGVkU2V0PE1hcC5FbnRyeT4gc2V0KSB7XG4iICsgCgkJCSIJCXJldHVybiBudWxsO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIgKyAKCQkJIlxuIiwKCQl9LAogICAgICAgICIiKTsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIkEuamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsgCgkJCSIJQSgpIHtcbiIgKyAKCQkJIgkJQi5mb28obnVsbCk7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkifVxuIgoJCX0sCiAgICAgICAgIiIsCiAgICAgICAgbnVsbCwKICAgICAgICBmYWxzZSwKICAgICAgICBudWxsKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODM5MwpwdWJsaWMgdm9pZCB0ZXN0NzE1KCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIgICAgdm9pZCBmb28oKSB7XG4iICsgCgkJCSIgICAgCUNvbXBhcmFibGU8U3RyaW5nPiBjID0gKGphdmEudXRpbC5MaXN0KWJhcig1LCA1LjApO1xuIiArIAoJCQkiICAgIH1cbiIgKyAKCQkJIiAgICBcbiIgKyAKCQkJIiAgICA8VD4gVCBiYXIoVCB0MSwgVCB0MikgeyByZXR1cm4gdDE7IH1cbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkiCUNvbXBhcmFibGU8U3RyaW5nPiBjID0gKGphdmEudXRpbC5MaXN0KWJhcig1LCA1LjApO1xuIiArIAoJCSIJICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBMaXN0IHRvIENvbXBhcmFibGU8U3RyaW5nPlxuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODM5NgpwdWJsaWMgdm9pZCB0ZXN0NzE2KCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWDxUIGV4dGVuZHMgTnVtYmVyICYgQ29tcGFyYWJsZTxTdHJpbmc+PiB7XG4iICsgCgkJCSIgICAgdm9pZCBmb28oVCB0KSB7XG4iICsgCgkJCSIgICAgCQkgQ29tcGFyYWJsZTxJbnRlZ2VyPiBjaSA9IChDb21wYXJhYmxlPEludGVnZXI+KSB0OyAgXG4iICsgCgkJCSIgICAgfVxuIiArIAoJCQkifVxuIiwKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCSIJQ29tcGFyYWJsZTxJbnRlZ2VyPiBjaSA9IChDb21wYXJhYmxlPEludGVnZXI+KSB0OyAgXG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiQ2Fubm90IGNhc3QgZnJvbSBUIHRvIENvbXBhcmFibGU8SW50ZWdlcj5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0KLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk4Mzk2IC0gdmFyaWF0aW9uCnB1YmxpYyB2b2lkIHRlc3Q3MTcoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKyAKCQkJInB1YmxpYyBjbGFzcyBYPFQgZXh0ZW5kcyBDb21wYXJhYmxlPFN0cmluZz4gJiBMaXN0PEludGVnZXI+PiB7XG4iICsgCgkJCSIgICAgdm9pZCBmb28oVCB0KSB7XG4iICsgCgkJCSIgICAgCQkgQ29tcGFyYWJsZTxJbnRlZ2VyPiBjaSA9IChDb21wYXJhYmxlPEludGVnZXI+KSB0OyAgXG4iICsgCgkJCSIgICAgfVxuIiArIAoJCQkifVxuIiwKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCSIJQ29tcGFyYWJsZTxJbnRlZ2VyPiBjaSA9IChDb21wYXJhYmxlPEludGVnZXI+KSB0OyAgXG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiQ2Fubm90IGNhc3QgZnJvbSBUIHRvIENvbXBhcmFibGU8SW50ZWdlcj5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0KLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTg0NzgKcHVibGljIHZvaWQgdGVzdDcxOCgpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9ucztcbiIgKyAKCQkJImltcG9ydCBqYXZhLnV0aWwuU2V0O1xuIiArIAoJCQkiaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0O1xuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIgICAgXG4iICsgCgkJCSIgICAgcHVibGljIGludGVyZmFjZSBCYXNlIHtcbiIgKyAKCQkJIiAgICB9XG4iICsgCgkJCSIgICAgXG4iICsgCgkJCSIgICAgYWJzdHJhY3QgY2xhc3MgQWN0aW9uPFQgZXh0ZW5kcyBCYXNlPiB7XG4iICsgCgkJCSIgICAgfVxuIiArIAoJCQkiXG4iICsgCgkJCSIgICAgcHVibGljIGNsYXNzIEFjdGlvbkltcGw8VCBleHRlbmRzIEJhc2U+IGV4dGVuZHMgQWN0aW9uPFQ+IGltcGxlbWVudHMgQ29tcGFyYWJsZTxBY3Rpb25JbXBsPiB7XG4iICsgCgkJCSIgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEFjdGlvbkltcGwgbykge1xuIiArIAoJCQkiICAgICAgICAgICAgcmV0dXJuIDA7XG4iICsgCgkJCSIgICAgICAgIH1cbiIgKyAKCQkJIiAgICB9XG4iICsgCgkJCSJcbiIgKyAKCQkJIiAgICBwdWJsaWMgdm9pZCB0ZXN0KCkge1xuIiArIAoJCQkiICAgICAgICBTZXQ8QWN0aW9uSW1wbD4gc2V0ID0gbmV3IFRyZWVTZXQ8QWN0aW9uSW1wbD4oKTtcbiIgKyAKCQkJIiAgICAgICAgQ29sbGVjdGlvbnMubWF4KHNldCk7XG4iICsgCgkJCSIgICAgfVxuIiArIAoJCQkiICAgWm9yayB6O1xuIiArCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMjEpXG4iICsgCgkJIglDb2xsZWN0aW9ucy5tYXgoc2V0KTtcbiIgKyAKCQkiCV5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJIlR5cGUgc2FmZXR5OiBVbmNoZWNrZWQgaW52b2NhdGlvbiBtYXgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWC5BY3Rpb25JbXBsPikgb2YgdGhlIGdlbmVyaWMgbWV0aG9kIG1heChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUPikgb2YgdHlwZSBDb2xsZWN0aW9uc1xuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAyMylcbiIgKyAKCQkiCVpvcmsgejtcbiIgKyAKCQkiCV5eXl5cbiIgKyAKCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk4MzY0CnB1YmxpYyB2b2lkIHRlc3Q3MTkoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7XG4iICsgCgkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjtcbiIgKyAKCQkJIlxuIiArIAoJCQkiaW50ZXJmYWNlIEludGVnZXJJdGVyYXRvciBleHRlbmRzIEl0ZXJhdG9yIHt9XG4iICsgCgkJCSJpbnRlcmZhY2UgSW50ZWdlckxpc3RJdGVyYXRvciBleHRlbmRzIExpc3RJdGVyYXRvcjxJbnRlZ2VyPiwgSW50ZWdlckl0ZXJhdG9yIHt9XG4iICsgCgkJCSJcbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKCQkiCWludGVyZmFjZSBJbnRlZ2VyTGlzdEl0ZXJhdG9yIGV4dGVuZHMgTGlzdEl0ZXJhdG9yPEludGVnZXI+LCBJbnRlZ2VySXRlcmF0b3Ige31cbiIgKyAKCQkiCSAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJIlRoZSBpbnRlcmZhY2UgSXRlcmF0b3IgY2Fubm90IGJlIGltcGxlbWVudGVkIG1vcmUgdGhhbiBvbmNlIHdpdGggZGlmZmVyZW50IGFyZ3VtZW50czogSXRlcmF0b3IgYW5kIEl0ZXJhdG9yPEludGVnZXI+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk4MzY0IC0gdmFyaWF0aW9uCnB1YmxpYyB2b2lkIHRlc3Q3MjAoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImludGVyZmFjZSBGb288VD4ge31cbiIgKyAKCQkJImludGVyZmFjZSBCYXIgZXh0ZW5kcyBGb288SW50ZWdlcj4ge31cbiIgKyAKCQkJImludGVyZmFjZSBCYXogZXh0ZW5kcyBCYXIsIEZvbyB7fVxuIiArIAoJCQkiXG4iICsgCgkJCSJjbGFzcyBYU3VwZXIgaW1wbGVtZW50cyBGb28ge31cbiIgKyAKCQkJImNsYXNzIFhTdWIgZXh0ZW5kcyBYU3VwZXIgaW1wbGVtZW50cyBGb288SW50ZWdlcj4ge31cbiIgKyAKCQkJIlxuIiArIAoJCQkicHVibGljIGNsYXNzIFggaW1wbGVtZW50cyBCYXIsIEZvbyB7fVxuIiwKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAoJCSIJaW50ZXJmYWNlIEJheiBleHRlbmRzIEJhciwgRm9vIHt9XG4iICsgCgkJIgkgICAgICAgICAgXl5eXG4iICsgCgkJIlRoZSBpbnRlcmZhY2UgRm9vIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCBtb3JlIHRoYW4gb25jZSB3aXRoIGRpZmZlcmVudCBhcmd1bWVudHM6IEZvbyBhbmQgRm9vPEludGVnZXI+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJIgljbGFzcyBYU3ViIGV4dGVuZHMgWFN1cGVyIGltcGxlbWVudHMgRm9vPEludGVnZXI+IHt9XG4iICsgCgkJIgkgICAgICBeXl5eXG4iICsgCgkJIlRoZSBpbnRlcmZhY2UgRm9vIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCBtb3JlIHRoYW4gb25jZSB3aXRoIGRpZmZlcmVudCBhcmd1bWVudHM6IEZvbzxJbnRlZ2VyPiBhbmQgRm9vXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgpXG4iICsgCgkJIglwdWJsaWMgY2xhc3MgWCBpbXBsZW1lbnRzIEJhciwgRm9vIHt9XG4iICsgCgkJIgkgICAgICAgICAgICAgXlxuIiArIAoJCSJUaGUgaW50ZXJmYWNlIEZvbyBjYW5ub3QgYmUgaW1wbGVtZW50ZWQgbW9yZSB0aGFuIG9uY2Ugd2l0aCBkaWZmZXJlbnQgYXJndW1lbnRzOiBGb28gYW5kIEZvbzxJbnRlZ2VyPlxuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODU2MQpwdWJsaWMgdm9pZCB0ZXN0NzIxKCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJGb28uamF2YSIsCgkJCQkicHVibGljIGNsYXNzIEZvbzxUPlxuIiArCgkJCQkie1xuIiArCgkJCQkiCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBJbm5lckZvb1xuIiArCgkJCQkiCXtcbiIgKwoJCQkJIgkJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9Tb21ldGhpbmcoKTtcbiIgKwoJCQkJIgl9XG4iICsKCQkJCSIJXG4iICsKCQkJCSIJcHJvdGVjdGVkIHZvaWQgcnVuKCBJbm5lckZvbyBpbm5lckZvbyApXG4iICsKCQkJCSIJe1xuIiArCgkJCQkiCQlpbm5lckZvby5kb1NvbWV0aGluZygpO1xuIiArCgkJCQkiCX1cbiIgKwoJCQkJIn0iLAoJCQl9LAoJICAgICAgICAiIik7CgkJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQkJbmV3IFN0cmluZ1tdIHsKCQkJCSJCYXIuamF2YSIsCgkJCQkicHVibGljIGNsYXNzIEJhciBleHRlbmRzIEZvbzxJbnRlZ2VyPlxuIiArCgkJCQkie1xuIiArCgkJCQkiCXB1YmxpYyB2b2lkIGdvKClcbiIgKwoJCQkJIgl7XG4iICsKCQkJCSIJCUlubmVyRm9vIGlubmVyID0gbmV3IElubmVyRm9vKClcbiIgKwoJCQkJIgkJe1xuIiArCgkJCQkiCQkJcHJvdGVjdGVkIHZvaWQgZG9Tb21ldGhpbmcoKVxuIiArCgkJCQkiCQkJe1xuIiArCgkJCQkiCQkJCVN5c3RlbS5vdXQucHJpbnRsbiggXCJoZWxsb1wiICk7XG4iICsKCQkJCSIJCQl9XG4iICsKCQkJCSIJCX07XG4iICsKCQkJCSIJCXJ1biggaW5uZXIgKTtcbiIgKwoJCQkJIgl9XG4iICsKCQkJCSJ9IgoJCQl9LAoJICAgICAgICAiIiwKCSAgICAgICAgbnVsbCwKCSAgICAgICAgZmFsc2UsCgkgICAgICAgIG51bGwpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk4MzY0IC0gdmFyaWF0aW9uCnB1YmxpYyB2b2lkIHRlc3Q3MjIoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImludGVyZmFjZSBJMTxUMT4ge1xuIiArIAoJCQkifVxuIiArIAoJCQkiXG4iICsgCgkJCSJpbnRlcmZhY2UgSTI8VDI+IGV4dGVuZHMgSTE8VDI+IHtcbiIgKyAKCQkJIn1cbiIgKyAKCQkJIlxuIiArIAoJCQkicHVibGljIGNsYXNzIFg8VTE+IGltcGxlbWVudHMgSTE8VTE+LCBJMjxVMT4ge1xuIiArIAoJCQkifVxuIiwKCQl9LAoJCSIiKTsKfQpwdWJsaWMgdm9pZCB0ZXN0NzIzKCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImludGVyZmFjZSBJQTxFPiB7fVxuIiArIAoJCQkiaW50ZXJmYWNlIElCPEU+IGV4dGVuZHMgSUE8RT4ge31cbiIgKyAKCQkJImNsYXNzIEE8RT4gaW1wbGVtZW50cyBJQTxFPiB7fVxuIiArIAoJCQkiY2xhc3MgQjxFPiBpbXBsZW1lbnRzIElCPEU+IHt9XG4iICsgCgkJCSJcbiIgKyAKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIlxuIiArIAoJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKCQkJIgkJQTxJbnRlZ2VyPiB4ID0gbmV3IEE8SW50ZWdlcj4oKTtcbiIgKyAKCQkJIgkJQjxJbnRlZ2VyPiB5ID0gbmV3IEI8SW50ZWdlcj4oKTtcbiIgKyAKCQkJIgkJcHJpbnQoeCk7XG4iICsgCgkJCSIJCXByaW50KHkpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIglwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgSUE8Pz4+IHZvaWQgcHJpbnQoVCBhKSB7XG4iICsgCgkJCSIJCVN5c3RlbS5vdXQucHJpbnQoXCJBXCIpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIglwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgSUI8Pz4+IHZvaWQgcHJpbnQoVCBhKSB7XG4iICsgCgkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIkJcIik7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkifVxuIiwKCQl9LAoJCSJBQiIpOwp9CnB1YmxpYyB2b2lkIHRlc3Q3MjQoKSB7Cgl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwO1xuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSJcbiIgKyAKCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCSIJCUhhc2hNYXA8Qnl0ZSwgQnl0ZT4gc3Vic3QgPSBuZXcgSGFzaE1hcDxCeXRlLCBCeXRlPigpO1xuIiArIAoJCQkiCQlzdWJzdC5wdXQoKGJ5dGUpMSwgKGJ5dGUpMSk7XG4iICsgCgkJCSIJCWlmICgxICsgc3Vic3QuZ2V0KChieXRlKTEpID4gMC5mKSB7XG4iICsgCgkJCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpO1xuIiArIAoJCQkiCQl9CQlcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIlNVQ0NFU1MiKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODUwMApwdWJsaWMgdm9pZCB0ZXN0NzI1KCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJjbGFzcyBBYnNDIHtcbiIgKyAKCQkJIglwdWJsaWMgPFQ+IFRbXSByZXNpemUoVFtdIHNyYywgVFtdIGRlc3QpIHtcbiIgKyAKCQkJIgkJcmV0dXJuIGRlc3Q7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkifVxuIiArIAoJCQkiXG4iICsgCgkJCSJjbGFzcyBDb25yQzxUPiBleHRlbmRzIEFic0Mge1xuIiArIAoJCQkiCVRbXVtdIGRhdGE7XG4iICsgCgkJCSIJcHJvdGVjdGVkIHZvaWQgYWxsb2NhdGVDaHVua1Nsb3RzKGludCBtYXhDaHVua05vKSB7XG4iICsgCgkJCSIJCWRhdGEgPSByZXNpemUoZGF0YSwgbmV3IE9iamVjdFttYXhDaHVua05vXVtdKTtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDEwKVxuIiArIAoJCSIJZGF0YSA9IHJlc2l6ZShkYXRhLCBuZXcgT2JqZWN0W21heENodW5rTm9dW10pO1xuIiArIAoJCSIJICAgICAgIF5eXl5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIHJlc2l6ZShUW10sIFRbXSkgaW4gdGhlIHR5cGUgQWJzQyBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoVFtdW10sIE9iamVjdFtdW10pXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk4NTAwCnB1YmxpYyB2b2lkIHRlc3Q3MjYoKSB7Cgl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkiCVxuIiArIAoJCQkiCXZvaWQgZm9vKCkge1xuIiArIAoJCQkiCQlcbiIgKyAKCQkJIgkJQ29udHJvbGxlcjw/PiBjdHJsID0gbnVsbDtcbiIgKyAKCQkJIgkJZm9vYmFyKGN0cmwuZ2V0VmlldygpLmdldENvbnRlbnQoKSk7IFxuIiArIAoJCQkiCX0gXG4iICsgCgkJCSIJXG4iICsgCgkJCSIJc3RhdGljIHZvaWQgZm9vYmFyKFggeCkge1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIgKyAKCQkJImludGVyZmFjZSBDb250cm9sbGVyPFQgZXh0ZW5kcyBWaWV3PD8+PiB7XG4iICsgCgkJCSIgICAgcHVibGljIFQgZ2V0VmlldygpIDtcbiIgKyAKCQkJIn1cbiIgKyAKCQkJImludGVyZmFjZSBWaWV3PFUgZXh0ZW5kcyBYPiB7XG4iICsgCgkJCSIJcHVibGljIFUgZ2V0Q29udGVudCgpO1xuIiArIAoJCQkifVxuIgkJCQkKCQl9LAoJCSIiKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODUwMCAtIHZhcmlhdGlvbgpwdWJsaWMgdm9pZCB0ZXN0NzI3KCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYPEU+IHtcbiIgKyAKCQkJIglcbiIgKyAKCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKCQkJIgkJXG4iICsgCgkJCSIJCUNvbnRyb2xsZXI8Pz4gY3RybCA9IG51bGw7XG4iICsgCgkJCSIJCWZvb2JhcihjdHJsLmdldFZpZXcoKS5nZXRDb250ZW50KCkpOyBcbiIgKyAKCQkJIgl9IFxuIiArIAoJCQkiCVxuIiArIAoJCQkiCXN0YXRpYyB2b2lkIGZvb2JhcihYPFN0cmluZz4geCkge1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIgKyAKCQkJImludGVyZmFjZSBDb250cm9sbGVyPFQgZXh0ZW5kcyBWaWV3PD8+PiB7XG4iICsgCgkJCSIgICAgcHVibGljIFQgZ2V0VmlldygpIDtcbiIgKyAKCQkJIn1cbiIgKyAKCQkJImludGVyZmFjZSBWaWV3PFUgZXh0ZW5kcyBYPFN0cmluZz4+IHtcbiIgKyAKCQkJIglwdWJsaWMgVSBnZXRDb250ZW50KCk7XG4iICsgCgkJCSJ9XG4iCQkJCQoJCX0sCgkJIiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk4NTAwIC0gdmFyaWF0aW9uCnB1YmxpYyB2b2lkIHRlc3Q3MjgoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYPEU+IHtcbiIgKyAKCQkJIglcbiIgKyAKCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCSIJCVxuIiArIAoJCQkiCQlDb250cm9sbGVyPD8+IGN0cmwgPSBudWxsO1xuIiArIAoJCQkiCQlmb29iYXIoY3RybC5nZXRWaWV3KCkuZ2V0Q29udGVudCgpKTsgXG4iICsgCgkJCSIJfSBcbiIgKyAKCQkJIglcbiIgKyAKCQkJIglzdGF0aWMgdm9pZCBmb29iYXIoWDxTdHJpbmc+IHgpIHtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJpbnRlcmZhY2UgQ29udHJvbGxlcjxUIGV4dGVuZHMgVmlldzw/Pj4ge1xuIiArIAoJCQkiICAgIHB1YmxpYyBUIGdldFZpZXcoKSA7XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJpbnRlcmZhY2UgVmlldzxVIGV4dGVuZHMgWDxVPj4ge1xuIiArIAoJCQkiCXB1YmxpYyBVIGdldENvbnRlbnQoKTtcbiIgKyAKCQkJIn1cbiIJCQkKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAoJCSIJZm9vYmFyKGN0cmwuZ2V0VmlldygpLmdldENvbnRlbnQoKSk7IFxuIiArIAoJCSIJXl5eXl5eXG4iICsgCgkJIlRoZSBtZXRob2QgZm9vYmFyKFg8U3RyaW5nPikgaW4gdGhlIHR5cGUgWDxFPiBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoPylcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0KLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTY1ODYKcHVibGljIHZvaWQgdGVzdDcyOSgpIHsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWCBpbXBsZW1lbnRzIEk8WT4ge31cbiIgKyAKCQkJImludGVyZmFjZSBJPFQ+IHt9XG4iICsgCgkJCSJjbGFzcyBZIGV4dGVuZHMgWCBpbXBsZW1lbnRzIEk8WT4ge31cbiIJCQkKCQl9LAoJCSIiKTsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkicHVibGljIGNsYXNzIFggaW1wbGVtZW50cyBJPFk+IHt9XG4iICsgCgkJCSJpbnRlcmZhY2UgSTxUIGV4dGVuZHMgSTw/IHN1cGVyIFQ+PiB7fVxuIiArIAoJCQkiY2xhc3MgWSBleHRlbmRzIFggaW1wbGVtZW50cyBJPFg+IHt9XG4iCQkJCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkiCWNsYXNzIFkgZXh0ZW5kcyBYIGltcGxlbWVudHMgSTxYPiB7fVxuIiArIAoJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSB0eXBlIFggaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgSTw/IHN1cGVyIFQ+PiBvZiB0aGUgdHlwZSBJPFQ+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwNDM3CnB1YmxpYyB2b2lkIHRlc3Q3MzAoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIlxuIiArIAoJCQkiICAgIFpvcmsgejtcbiIgKwoJCQkiICAgIHB1YmxpYyBpbnRlcmZhY2UgU3VwZXJJbnRlcmZhY2U8QT4ge1xuIiArIAoJCQkiICAgIH1cbiIgKyAKCQkJIlxuIiArIAoJCQkiICAgIHB1YmxpYyBpbnRlcmZhY2UgU3ViSW50ZXJmYWNlIGV4dGVuZHMgU3VwZXJJbnRlcmZhY2U8U3RyaW5nPiB7XG4iICsgCgkJCSIgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCk7XG4iICsgCgkJCSIgICAgfVxuIiArIAoJCQkiXG4iICsgCgkJCSIgICAgcHJpdmF0ZSBTdXBlckludGVyZmFjZTwgPyBleHRlbmRzIFN1cGVySW50ZXJmYWNlPiB4ID0gbnVsbDtcbiIgKyAKCQkJIlxuIiArIAoJCQkiICAgIHB1YmxpYyB2b2lkIGYoKSB7XG4iICsgCgkJCSIgICAgICAgICgoU3ViSW50ZXJmYWNlKSB0aGlzLngpLmdldFN0cmluZygpO1xuIiArIAoJCQkiICAgIH1cbiIgKyAKCQkJIn1cbiIJCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKCQkiCVpvcmsgejtcbiIgKyAKCQkiCV5eXl5cbiIgKyAKCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMi4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTQpXG4iICsgCgkJIgkoKFN1YkludGVyZmFjZSkgdGhpcy54KS5nZXRTdHJpbmcoKTtcbiIgKyAKCQkiCV5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJIlR5cGUgc2FmZXR5OiBUaGUgY2FzdCBmcm9tIFguU3VwZXJJbnRlcmZhY2U8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgWC5TdXBlckludGVyZmFjZT4gdG8gWC5TdWJJbnRlcmZhY2UgaXMgYWN0dWFsbHkgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZXJhc2VkIHR5cGUgWC5TdWJJbnRlcmZhY2VcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0KLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTc0NDAKcHVibGljIHZvaWQgdGVzdDczMSgpIHsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWDxFPiB7XG4iICsgCgkJCSIJWDw/IHN1cGVyIEU+IHBhcmVudDtcbiIgKyAKCQkJIglYPD8gc3VwZXIgRT4gY3VycmVudDtcbiIgKyAKCQkJIlxuIiArIAoJCQkiCVg8PyBleHRlbmRzIEU+IHBhcmVudDI7XG4iICsgCgkJCSIJWDw/IGV4dGVuZHMgRT4gY3VycmVudDI7XG4iICsgCgkJCSJcbiIgKyAKCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKCQkJIgkJY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIlxuIiArIAoJCQkiCXZvaWQgYmFyKCkge1xuIiArIAoJCQkiCQljdXJyZW50MiA9IGN1cnJlbnQyLnBhcmVudDI7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkifVxuIgoJCX0sCgkJIiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk4MzMxCnB1YmxpYyB2b2lkIHRlc3Q3MzIoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImludGVyZmFjZSBCPFQ+IHt9XG4iICsgCgkJCSJpbnRlcmZhY2UgQyBleHRlbmRzIEI8U3RyaW5nPnt9XG4iICsgCgkJCSJpbnRlcmZhY2UgRCBleHRlbmRzIEI8SW50ZWdlcj57fVxuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkiICAgICAgICAgICAgICAgICAgICAgICAgIEQgZCA9IG51bGw7XG4iICsgCgkJCSIgICAgICAgICAgICAgICAgICAgICAgICAgQyBjID0gKEMpZDsgLy8gaWxsZWdhbFxuIiArIAoJCQkiICAgICAgICAgICAgIH1cbiIgKyAKCQkJIn1cbiIKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCSIJQyBjID0gKEMpZDsgLy8gaWxsZWdhbFxuIiArIAoJCSIJICAgICAgXl5eXlxuIiArIAoJCSJDYW5ub3QgY2FzdCBmcm9tIEQgdG8gQ1xuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODMzMSAtIHZhcmlhdGlvbgpwdWJsaWMgdm9pZCB0ZXN0NzMzKCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImludGVyZmFjZSBCPFQ+IHt9XG4iICsgCgkJCSJpbnRlcmZhY2UgQyBleHRlbmRzIEI8U3RyaW5nPnt9XG4iICsgCgkJCSJpbnRlcmZhY2UgRDxFPiBleHRlbmRzIEI8RT57fVxuIiArIAoJCQkiXG4iICsgCgkJCSJcbiIgKyAKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIgkJCU9iamVjdCBmb28oQyBjKSB7XG4iICsgCgkJCSIJCQkJCXJldHVybiAoRDw/IGV4dGVuZHMgU3RyaW5nPikgYztcbiIgKyAKCQkJIiAgICAgICAgICAgICB9XG4iICsgCgkJCSJ9XG4iCgkJfSwKCQkiIik7Cn0KLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTgzMzEgLSB2YXJpYXRpb24KcHVibGljIHZvaWQgdGVzdDczNCgpIHsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbnRlcmZhY2UgQjxUPiB7fVxuIiArIAoJCQkiaW50ZXJmYWNlIEMgZXh0ZW5kcyBCPFN0cmluZz57fVxuIiArIAoJCQkiaW50ZXJmYWNlIEQ8RT4gZXh0ZW5kcyBCPEU+e31cbiIgKyAKCQkJIlxuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIJCQlPYmplY3QgZm9vKEMgYywgRDw/IGV4dGVuZHMgU3RyaW5nPiBkKSB7XG4iICsgCgkJCSIJCQkJCXJldHVybiBjICE9IG51bGwgPyBjIDogZDsgXG4iICsgCgkJCSIgICAgICAgICAgICAgfVxuIiArIAoJCQkifVxuIgoJCX0sCgkJIiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk4MzMxIC0gdmFyaWF0aW9uCnB1YmxpYyB2b2lkIHRlc3Q3MzUoKSB7Cgl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW50ZXJmYWNlIEI8VD4ge31cbiIgKyAKCQkJImludGVyZmFjZSBDIGV4dGVuZHMgQjxTdHJpbmc+e31cbiIgKyAKCQkJImludGVyZmFjZSBEPEU+IGV4dGVuZHMgQjxFPnt9XG4iICsgCgkJCSJcbiIgKyAKCQkJIlxuIiArIAoJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkiCQkJT2JqZWN0IGZvbyhDIGMsIEQ8PyBleHRlbmRzIEV4Y2VwdGlvbj4gZCkge1xuIiArIAoJCQkiCQkJCQlyZXR1cm4gYyAhPSBudWxsID8gYyA6IGQ7IFxuIiArIAoJCQkiICAgICAgICAgICAgIH1cbiIgKyAKCQkJIn1cbiIKCQl9LAoJCSIiKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODMzMSAtIHZhcmlhdGlvbgpwdWJsaWMgdm9pZCB0ZXN0NzM2KCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbnRlcmZhY2UgQjxUPiB7fVxuIiArIAoJCQkiaW50ZXJmYWNlIEMgZXh0ZW5kcyBCPFN0cmluZz57fVxuIiArIAoJCQkiaW50ZXJmYWNlIEQ8RT4gZXh0ZW5kcyBCPEU+e31cbiIgKyAKCQkJIlxuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIJCQl2b2lkIGJhcihDIGMpIHtcbiIgKyAKCQkJIgkJCQkJRDw/IGV4dGVuZHMgRXhjZXB0aW9uPiBkID0gKEQ8PyBleHRlbmRzIEV4Y2VwdGlvbj4pIGM7XG4iICsgCgkJCSIJCQkJCWZvbyhkLCBjKTtcbiIgKyAKCQkJIiAgICAgICAgICAgICB9XG4iICsgCgkJCSIJCQk8VT4gdm9pZCBmb28oVSB1MSwgVSB1Mikge1xuIiArIAoJCQkiCQkJfVxuIiArIAoJCQkifVxuIgoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDgpXHJcbiIgKyAKCQkiCUQ8PyBleHRlbmRzIEV4Y2VwdGlvbj4gZCA9IChEPD8gZXh0ZW5kcyBFeGNlcHRpb24+KSBjO1xyXG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJDYW5ub3QgY2FzdCBmcm9tIEMgdG8gRDw/IGV4dGVuZHMgRXhjZXB0aW9uPlxuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQpwdWJsaWMgdm9pZCB0ZXN0NzM3KCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImNsYXNzIFN1cCB7XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJcbiIgKyAKCQkJImNsYXNzIFN1YjEgZXh0ZW5kcyBTdXAge1xuIiArIAoJCQkifVxuIiArIAoJCQkiXG4iICsgCgkJCSJjbGFzcyBTdWIyIGV4dGVuZHMgU3VwIHtcbiIgKyAKCQkJIlxuIiArIAoJCQkifVxuIiArIAoJCQkiYWJzdHJhY3QgY2xhc3MgWCB7XG4iICsgCgkJCSIJYWJzdHJhY3QgPFMsIEEgZXh0ZW5kcyBTLCBCIGV4dGVuZHMgUz4gUyBtZXRob2QoQSBsYSwgQiBsYik7XG4iICsgCgkJCSJcbiIgKyAKCQkJIgl2b2lkIG0yKCkge1xuIiArIAoJCQkiCQlTdXAgU3VwID0gbWV0aG9kKG5ldyBTdWIxKCksIG5ldyBTdWIyKCkpOy8vIDwtLSBjb21waWxlcz8/ICggQT1TdWIxLCBCPVN1YjIsIFM9U3VwKVxuIiArIAoJCQkiCQlPYmplY3Qgb2JqID0gbWV0aG9kKDEsIFwiMzJcIik7Ly8gPC0tZG9lc25cJ3QgY29tcGlsZT8/ICggQT1JbnRlZ2VyLCBCPVN0cmluZywgUz1PYmplY3QpXG4iICsgCgkJCSIJfVxuIiArIAoJCQkifVxuIiwKCQl9LAoJCSIiKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODMzMSAtIHZhcmlhdGlvbgpwdWJsaWMgdm9pZCB0ZXN0NzM4KCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbnRlcmZhY2UgQjxUPiB7fVxuIiArIAoJCQkiY2xhc3MgQyBpbXBsZW1lbnRzIEI8U3RyaW5nPnt9XG4iICsgCgkJCSJpbnRlcmZhY2UgRCBleHRlbmRzIEI8SW50ZWdlcj57fVxuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkiICAgICAgICAgICAgICAgICAgICAgICAgIEQgZCA9IG51bGw7XG4iICsgCgkJCSIgICAgICAgICAgICAgICAgICAgICAgICAgQyBjID0gKEMpZDsgLy8gaWxsZWdhbFxuIiArIAoJCQkiICAgICAgICAgICAgIH1cbiIgKyAKCQkJIn1cbiIKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCSIJQyBjID0gKEMpZDsgLy8gaWxsZWdhbFxuIiArIAoJCSIJICAgICAgXl5eXlxuIiArIAoJCSJDYW5ub3QgY2FzdCBmcm9tIEQgdG8gQ1xuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODMzMSAtIHZhcmlhdGlvbgpwdWJsaWMgdm9pZCB0ZXN0NzM5KCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbnRlcmZhY2UgQjxUPiB7fVxuIiArIAoJCQkiaW50ZXJmYWNlIEMgZXh0ZW5kcyBCPFN0cmluZz57fVxuIiArIAoJCQkiY2xhc3MgRCBpbXBsZW1lbnRzIEI8SW50ZWdlcj57fVxuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAoJCQkiICAgICAgICAgICAgICAgICAgICAgICAgIEQgZCA9IG51bGw7XG4iICsgCgkJCSIgICAgICAgICAgICAgICAgICAgICAgICAgQyBjID0gKEMpZDsgLy8gaWxsZWdhbFxuIiArIAoJCQkiICAgICAgICAgICAgIH1cbiIgKyAKCQkJIn1cbiIKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCSIJQyBjID0gKEMpZDsgLy8gaWxsZWdhbFxuIiArIAoJCSIJICAgICAgXl5eXlxuIiArIAoJCSJDYW5ub3QgY2FzdCBmcm9tIEQgdG8gQ1xuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODMzMSAtIHZhcmlhdGlvbgpwdWJsaWMgdm9pZCB0ZXN0NzQwKCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbnRlcmZhY2UgQjxUPiB7fVxuIiArIAoJCQkiZmluYWwgY2xhc3MgQyBpbXBsZW1lbnRzIEI8U3RyaW5nPnt9XG4iICsgCgkJCSJcbiIgKyAKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIiAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCSIgICAgICAgICAgICAgICAgICAgICAgICAgQjxJbnRlZ2VyPiBkID0gbnVsbDtcbiIgKyAKCQkJIiAgICAgICAgICAgICAgICAgICAgICAgICBDIGMgPSAoQylkOyAvLyBpbGxlZ2FsXG4iICsgCgkJCSIgICAgICAgICAgICAgfVxuIiArIAoJCQkifVxuIgoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJIglDIGMgPSAoQylkOyAvLyBpbGxlZ2FsXG4iICsgCgkJIgkgICAgICBeXl5eXG4iICsgCgkJIkNhbm5vdCBjYXN0IGZyb20gQjxJbnRlZ2VyPiB0byBDXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk4MzMxIC0gdmFyaWF0aW9uCnB1YmxpYyB2b2lkIHRlc3Q3NDEoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImludGVyZmFjZSBCPFQ+IHt9XG4iICsgCgkJCSJmaW5hbCBjbGFzcyBEIGltcGxlbWVudHMgQjxJbnRlZ2VyPnt9XG4iICsgCgkJCSJcbiIgKyAKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIiAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCgkJCSIgICAgICAgICAgICAgICAgICAgICAgICAgRCBkID0gbnVsbDtcbiIgKyAKCQkJIiAgICAgICAgICAgICAgICAgICAgICAgICBCPFN0cmluZz4gYyA9IChCPFN0cmluZz4pZDsgLy8gaWxsZWdhbFxuIiArIAoJCQkiICAgICAgICAgICAgIH1cbiIgKyAKCQkJIn1cbiIKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAoJCSIJQjxTdHJpbmc+IGMgPSAoQjxTdHJpbmc+KWQ7IC8vIGlsbGVnYWxcbiIgKyAKCQkiCSAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXG4iICsgCgkJIkNhbm5vdCBjYXN0IGZyb20gRCB0byBCPFN0cmluZz5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0KLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTg1MzgKcHVibGljIHZvaWQgX3Rlc3Q3NDIoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKCQkJIlxuIiArIAoJCQkiIHB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIiBcbiIgKyAKCQkJIgkvKipTdWJjbGFzc2VzIGFyZSBwYXJhbWV0ZXJpemVkIGJ5IHRoZWlyIG93biB0eXBlKi9cbiIgKyAKCQkJIglwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTZWxmVHlwZTxUIGV4dGVuZHMgU2VsZlR5cGU8VD4+e1xuIiArIAoJCQkiCQlwdWJsaWMgYWJzdHJhY3QgVCBnZXRUaGlzKCk7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkiIFxuIiArIAoJCQkiCS8qKlN1cGVydHlwZSBpbmhlcml0cyBkaXJlY3RseSBmcm9tIHRoZSBwYXJhbWV0ZXJpemVkIFNlbGZUeXBlKi9cbiIgKyAKCQkJIglwcml2YXRlIHN0YXRpYyBjbGFzcyBTdXBlclR5cGUgZXh0ZW5kcyBTZWxmVHlwZTxTdXBlclR5cGU+e1xuIiArIAoJCQkiCQlAT3ZlcnJpZGVcbiIgKyAKCQkJIgkJcHVibGljIFN1cGVyVHlwZSBnZXRUaGlzKCl7XG4iICsgCgkJCSIJCQlyZXR1cm4gdGhpcztcbiIgKyAKCQkJIgkJfVxuIiArIAoJCQkiCX1cbiIgKyAKCQkJIiBcbiIgKyAKCQkJIgkvKipTdWJ0eXBlIGluaGVyaXRzIGluZGlyZWN0bHkgZnJvbSB0aGUgcGFyYW1ldGVyaXplZCBTZWxmVHlwZSovXG4iICsgCgkJCSIJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3ViVHlwZSBleHRlbmRzIFN1cGVyVHlwZXt9XG4iICsgCgkJCSIgXG4iICsgCgkJCSIJLyoqQ3JlYXRlcyBhIGxpc3QgY29udGFpbmluZyBhIHNpbmdsZSBTZWxmVHlwZSovXG4iICsgCgkJCSIJcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIFNlbGZUeXBlPFQ+PiBMaXN0PFQ+IG1ha2VTaW5nbGV0b25MaXN0KFQgdCl7XG4iICsgCgkJCSIJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHQpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIiBcbiIgKyAKCQkJIgkvKipcbiIgKyAKCQkJIgkgKiBDcmVhdGVzIGEgbGlzdCBjb250YWluaW5nIGEgc2luZ2xlIFNlbGZUeXBlLCBhbGxvd2luZyB0aGUgbGlzdFwnc1xuIiArIAoJCQkiCSAqIGVsZW1lbnQtdHlwZSB0byBiZSBhIHN1cGVydHlwZSBvZiB0aGUgdHlwZSBvZiBpdHMgc2luZ2xlIGVsZW1lbnRcbiIgKyAKCQkJIgkgKi9cbiIgKyAKCQkJIglwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgU2VsZlR5cGU8VD4sUyBleHRlbmRzIFQ+IExpc3Q8VD4gbWFrZVNpbmdsZXRvbkxpc3QyKFMgcyl7XG4iICsgCgkJCSIJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KChUKXMpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIiBcbiIgKyAKCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKXtcbiIgKyAKCQkJIgkJLyptYWtpbmcgbGlzdHMgb2Ygc3VwZXIgdHlwZXMgd29ya3MgZmluZSAuLi4qL1xuIiArIAoJCQkiCQltYWtlU2luZ2xldG9uTGlzdChuZXcgU3VwZXJUeXBlKCkpO1xuIiArIAoJCQkiCQlMaXN0PFN1cGVyVHlwZT4gbHN1cCA9IG1ha2VTaW5nbGV0b25MaXN0KG5ldyBTdXBlclR5cGUoKSk7XG4iICsgCgkJCSIgXG4iICsgCgkJCSIJCS8qYnV0IHdlIGNhblwndCBtYWtlIGEgbGlzdCBvZiBzdWIgdHlwZXM7IHNlZW1zIHdlaXJkIC4uLiovXG4iICsgCgkJCSIJCUxpc3Q8U3ViVHlwZT4gbHN1YiA9IG1ha2VTaW5nbGV0b25MaXN0KG5ldyBTdWJUeXBlKCkpOyAvL0VSUk9SXG4iICsgCgkJCSIJCVxuIiArIAoJCQkiCQkvKmNhblwndCBldmVuIGNhbGwgaXQgdy9vIGFzc2lnbmluZyB0aGUgcmV0dXJuIHZhbHVlOiovXG4iICsgCgkJCSIJCW1ha2VTaW5nbGV0b25MaXN0KG5ldyBTdWJUeXBlKCkpOyAvL0VSUk9SXG4iICsgCgkJCSIgXG4iICsgCgkJCSIgXG4iICsgCgkJCSIJCS8qc28gaW5zdGVhZCwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gbWFrZSBsaXN0cyBvZiBzdXBlciB0eXBlIGNvbnRhaW5pbmcgc3ViIHR5cGUgZWxlbWVudHMqL1xuIiArIAoJCQkiCQltYWtlU2luZ2xldG9uTGlzdDIobmV3IFN1YlR5cGUoKSk7IC8vRVJST1JcbiIgKyAKCQkJIgkJLypldmVuIGlmIHdlIGFzc2lnbiB0aGUgcmV0dXJuIHZhbHVlOiovXG4iICsgCgkJCSIJCWxzdXAgPSBtYWtlU2luZ2xldG9uTGlzdDIobmV3IFN1YlR5cGUoKSk7IC8vIEVSUk9SIChlY2xpcHNlIGlzIG9rYXkgd2l0aCB0aGlzIHRob3VnaClcbiIgKyAKCQkJIgkJLyp0aGlzIHN0aWxsIGRvZXNuXCd0IHdvcmsgZWl0aGVyOiovXG4iICsgCgkJCSIJCWxzdWIgPSBtYWtlU2luZ2xldG9uTGlzdDIobmV3IFN1YlR5cGUoKSk7IC8vIEVSUk9SXG4iICsgCgkJCSIgXG4iICsgCgkJCSIJCS8qd2UgY2FuIG1ha2UgbGlzdHMgb2Ygc3VwZXIgdHlwZSB0aGlzIHdheSB0aG91Z2gqL1xuIiArIAoJCQkiCQltYWtlU2luZ2xldG9uTGlzdDIobmV3IFN1cGVyVHlwZSgpKTsgLy8gKGVjbGlwc2UgZG9lc25cJ3QgbGlrZSB0aGlzIHRob3VnaClcbiIgKyAKCQkJIgkJLyphbHNvIG9rIGlmIHdlIGFzc2lnbiB0aGUgcmV0dXJuIHZhbHVlKi9cbiIgKyAKCQkJIgkJbHN1cCA9IG1ha2VTaW5nbGV0b25MaXN0MihuZXcgU3VwZXJUeXBlKCkpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0MClcbiIgKyAKCQkiCUxpc3Q8U3ViVHlwZT4gbHN1YiA9IG1ha2VTaW5nbGV0b25MaXN0KG5ldyBTdWJUeXBlKCkpOyAvL0VSUk9SXG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJCb3VuZCBtaXNtYXRjaDogVGhlIGdlbmVyaWMgbWV0aG9kIG1ha2VTaW5nbGV0b25MaXN0KFQpIG9mIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoWC5TdWJUeXBlKSBzaW5jZSB0aGUgdHlwZSBYLlN1YlR5cGUgaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgWC5TZWxmVHlwZTxUPj5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNDMpXG4iICsgCgkJIgltYWtlU2luZ2xldG9uTGlzdChuZXcgU3ViVHlwZSgpKTsgLy9FUlJPUlxuIiArIAoJCSIJXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSBnZW5lcmljIG1ldGhvZCBtYWtlU2luZ2xldG9uTGlzdChUKSBvZiB0eXBlIFggaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKFguU3ViVHlwZSkgc2luY2UgdGhlIHR5cGUgWC5TdWJUeXBlIGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8VCBleHRlbmRzIFguU2VsZlR5cGU8VD4+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQ3KVxuIiArIAoJCSIJbWFrZVNpbmdsZXRvbkxpc3QyKG5ldyBTdWJUeXBlKCkpOyAvL0VSUk9SXG4iICsgCgkJIgleXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiQm91bmQgbWlzbWF0Y2g6IFRoZSBnZW5lcmljIG1ldGhvZCBtYWtlU2luZ2xldG9uTGlzdDIoUykgb2YgdHlwZSBYIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChYLlN1YlR5cGUpIHNpbmNlIHRoZSB0eXBlIFguU3ViVHlwZSBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPFQgZXh0ZW5kcyBYLlNlbGZUeXBlPFQ+PlxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjQuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA1MSlcbiIgKyAKCQkiCWxzdWIgPSBtYWtlU2luZ2xldG9uTGlzdDIobmV3IFN1YlR5cGUoKSk7IC8vIEVSUk9SXG4iICsgCgkJIgkgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJIkJvdW5kIG1pc21hdGNoOiBUaGUgZ2VuZXJpYyBtZXRob2QgbWFrZVNpbmdsZXRvbkxpc3QyKFMpIG9mIHR5cGUgWCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoWC5TdWJUeXBlKSBzaW5jZSB0aGUgdHlwZSBYLlN1YlR5cGUgaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxUIGV4dGVuZHMgWC5TZWxmVHlwZTxUPj5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0KLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTk1NTMKcHVibGljIHZvaWQgdGVzdDc0MygpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW50ZXJmYWNlIFRlc3RHZW5lcmljMjxBPiB7XG4iICsgCgkJCSIJTmVzdGVkPEE+IGdldE5lc3RlZDIoKTsgLy8gc3VwZXJcbiIgKyAKCQkJIlxuIiArIAoJCQkiCWNsYXNzIE5lc3RlZDxCPiBpbXBsZW1lbnRzIFRlc3RHZW5lcmljMjxCPiB7XG4iICsgCgkJCSIJCXB1YmxpYyBOZXN0ZWQ8Qj4gZ2V0TmVzdGVkMigpIHsgLy8gc3ViXG4iICsgCgkJCSIJCQlyZXR1cm4gdGhpczsvLzJcbiIgKyAKCQkJIgkJfVxuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIgKyAKCQkJIiBcbiIgKyAKCQkJImNsYXNzIFRlc3RHZW5lcmljMzxBPiB7XG4iICsgCgkJCSIJTmVzdGVkPEE+IGdldE5lc3RlZDMoKSB7IHJldHVybiBudWxsOyB9IC8vIHN1cGVyXG4iICsgCgkJCSJcbiIgKyAKCQkJIgljbGFzcyBOZXN0ZWQ8Qj4gZXh0ZW5kcyBUZXN0R2VuZXJpYzM8Qj4ge1xuIiArIAoJCQkiCQlAT3ZlcnJpZGUgcHVibGljIE5lc3RlZDxCPiBnZXROZXN0ZWQzKCkgeyAvLyBzdWJcbiIgKyAKCQkJIgkJCXJldHVybiB0aGlzOy8vM1xuIiArIAoJCQkiCQl9XG4iICsgCgkJCSIJfVxuIiArIAoJCQkifVxuIgoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDE1KVxuIiArIAoJCSIJQE92ZXJyaWRlIHB1YmxpYyBOZXN0ZWQ8Qj4gZ2V0TmVzdGVkMygpIHsgLy8gc3ViXG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5cbiIgKyAKCQkiVGhlIHJldHVybiB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoIFRlc3RHZW5lcmljMzxCPi5nZXROZXN0ZWQzKClcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTUpXG4iICsgCgkJIglAT3ZlcnJpZGUgcHVibGljIE5lc3RlZDxCPiBnZXROZXN0ZWQzKCkgeyAvLyBzdWJcbiIgKyAKCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXlxuIiArIAoJCSJUaGUgbWV0aG9kIGdldE5lc3RlZDMoKSBvZiB0eXBlIFRlc3RHZW5lcmljMzxBPi5OZXN0ZWQ8Qj4gbXVzdCBvdmVycmlkZSBhIHN1cGVyY2xhc3MgbWV0aG9kXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9CnB1YmxpYyB2b2lkIHRlc3Q3NDQoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiamF2YS91dGlsL1guamF2YSIsCgkJCSJwYWNrYWdlIGphdmEudXRpbDtcbiIgKyAKCQkJIlxuIiArIAoJCQkiaW1wb3J0IGphdmEuaW8uKjtcbiIgKyAKCQkJIlxuIiArIAoJCQkicHVibGljIGFic3RyYWN0IGNsYXNzIFg8SzEsIFYxPiBleHRlbmRzIEhhc2hNYXA8SzEsIFYxPiB7XG4iICsgCgkJCSJcbiIgKyAKCQkJIglFbnRyeTxLMSwgVjE+IGg7XG4iICsgCgkJCSJcbiIgKyAKCQkJIglwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRyeTxLMiwgVjI+IGV4dGVuZHMgSGFzaE1hcC5FbnRyeTxLMiwgVjI+IHtcbiIgKyAKCQkJIlxuIiArIAoJCQkiCQlFbnRyeSgpIHtcbiIgKyAKCQkJIgkJCXN1cGVyKDAsIG51bGwsIG51bGwsIG51bGwpO1xuIiArIAoJCQkiCQl9XG4iICsgCgkJCSJcbiIgKyAKCQkJIgkJdm9pZCBhYihAU3VwcHJlc3NXYXJuaW5ncyhcInVudXNlZFwiKSBFbnRyeTxLMiwgVjI+IGUpIHtcbiIgKyAKCQkJIgkJfVxuIiArIAoJCQkiXG4iICsgCgkJCSIJCUBPdmVycmlkZSB2b2lkIHJlY29yZEFjY2VzcyhIYXNoTWFwPEsyLCBWMj4gbSkge1xuIiArIAoJCQkiCQkJWDxLMiwgVjI+IHggPSAoWDxLMiwgVjI+KSBtO1xuIiArIAoJCQkiCQkJYWIoeC5oKTtcbiIgKyAKCQkJIgkJfVxuIiArIAoJCQkiCX1cbiIgKyAKCQkJIiAgWm9yayB6O1xuIiArCgkJCSJ9XG4iCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBqYXZhXFx1dGlsXFxYLmphdmEgKGF0IGxpbmUgMjMpXHJcbiIgKyAKCQkiCVpvcmsgejtcclxuIiArIAoJCSIJXl5eXlxuIiArIAoJCSJab3JrIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGVcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0KLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTk5MjIKcHVibGljIHZvaWQgdGVzdDc0NSgpIHsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIJdm9pZCB0ZXN0KCkge1xuIiArIAoJCQkiCQlqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdCgzLCAzLjEpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIKCQl9LAoJCSIiKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05OTkyMiAtIHZhcmlhdGlvbgpwdWJsaWMgdm9pZCB0ZXN0NzQ2KCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIJdm9pZCB0ZXN0KCkge1xuIiArIAoJCQkiCQlTdHJpbmcgcyA9IGphdmEudXRpbC5BcnJheXMuYXNMaXN0KDMsIDMuMSk7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkifVxuIgoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDMpXG4iICsgCgkJIglTdHJpbmcgcyA9IGphdmEudXRpbC5BcnJheXMuYXNMaXN0KDMsIDMuMSk7XG4iICsgCgkJIgkgICAgICAgXlxuIiArIAoJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIExpc3Q8TnVtYmVyJkNvbXBhcmFibGU8Pz4+IHRvIFN0cmluZ1xuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05OTk4MwpwdWJsaWMgdm9pZCB0ZXN0NzQ3KCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKwoJCQkiICBpbnRlcmZhY2UgSSB7fVxuIiArCgkJCSIgIGNsYXNzIFk8VSBleHRlbmRzIFQgJiBJPiB7XG4iICsKCQkJIiAgfVxuIiArCgkJCSJ9IiwKCQl9LAoJCSIiKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDAwMDcKcHVibGljIHZvaWQgdGVzdDc0OCgpIHsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIJc3RhdGljIGludGVyZmFjZSBGYWN0b3J5PFQ+IHtcbiIgKyAKCQkJIgkJcHVibGljIDxVIGV4dGVuZHMgVD4gVSBjcmVhdGUoQ2xhc3M8VT4gY2wpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIglcbiIgKyAKCQkJIglzdGF0aWMgY2xhc3MgQnl0ZXNGYWN0b3J5IGltcGxlbWVudHMgRmFjdG9yeTxieXRlW10+IHtcbiIgKyAKCQkJIgkJcHVibGljIGJ5dGVbXSBjcmVhdGUoQ2xhc3M8Ynl0ZVtdPiBjbCkge1xuIiArIAoJCQkiCQkJcmV0dXJuIG51bGw7XG4iICsgCgkJCSIJCX1cbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDE0OQpwdWJsaWMgdm9pZCB0ZXN0NzQ5KCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCSJcbiIgKyAKCQkJInB1YmxpYyBjbGFzcyBYPFQgZXh0ZW5kcyBYPD8+PiB7XG4iICsgCgkJCSIJVCBnZXQoKSB7IHJldHVybiBudWxsOyB9XG4iICsgCgkJCSIJdm9pZCBmb28oWCB4KSB7XG4iICsgCgkJCSIJCVN0cmluZyBzID0geC5nZXQoKTtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJIglTdHJpbmcgcyA9IHguZ2V0KCk7XG4iICsgCgkJIgkgICAgICAgXlxuIiArIAoJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFggdG8gU3RyaW5nXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDE0OSAtIHZhcmlhdGlvbgpwdWJsaWMgdm9pZCB0ZXN0NzUwKCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgCgkJCSJcbiIgKyAKCQkJInB1YmxpYyBjbGFzcyBYPFQgZXh0ZW5kcyBMaXN0PFN0cmluZz4+IHtcbiIgKyAKCQkJIglUIGdldCgpIHsgcmV0dXJuIG51bGw7IH1cbiIgKyAKCQkJIgl2b2lkIGZvbyhYIHgpIHtcbiIgKyAKCQkJIgkJTGlzdDxPYmplY3Q+IGwgPSB4LmdldCgpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIiAgWm9yayB6IDtcbiIgKwoJCQkifVxuIiwKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCgkJIglMaXN0PE9iamVjdD4gbCA9IHguZ2V0KCk7XG4iICsgCgkJIgkgICAgICAgICAgICAgICAgIF5eXl5eXl5cbiIgKyAKCQkiVHlwZSBzYWZldHk6IFRoZSBleHByZXNzaW9uIG9mIHR5cGUgTGlzdCBuZWVkcyB1bmNoZWNrZWQgY29udmVyc2lvbiB0byBjb25mb3JtIHRvIExpc3Q8T2JqZWN0PlxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA4KVxuIiArIAoJCSIJWm9yayB6IDtcbiIgKyAKCQkiCV5eXl5cbiIgKyAKCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDE1MwovLyBUT0RPIChwaGlsaXBwZSkgcmVlbmFibGUgb25jZSBhZGRyZXNzZWQKcHVibGljIHZvaWQgX3Rlc3Q3NTEoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYPFQgZXh0ZW5kcyBYPFQ+PiB7XG4iICsgCgkJCSIJXG4iICsgCgkJCSIJdm9pZCBmb28oWDw/IGV4dGVuZHMgVD4geCkge1xuIiArIAoJCQkiCQlYPFQ+IHgyID0geDtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCgkJIglYPFQ+IHgyID0geDtcbiIgKyAKCQkiCSAgICAgXl5cbiIgKyAKCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBYPGNhcHR1cmUtb2YgPyBleHRlbmRzIFQ+IHRvIFg8VD5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0KcHVibGljIHZvaWQgdGVzdDc1MigpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlO1xuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWDxFIGV4dGVuZHMgU2VyaWFsaXphYmxlPiB7XG4iICsgCgkJCSIJWDw/IGV4dGVuZHMgSTxFPj4gcGFyZW50O1xuIiArIAoJCQkiCVg8PyBleHRlbmRzIEk8RT4+IGN1cnJlbnQ7XG4iICsgCgkJCSIJdm9pZCBmb28oKSB7XG4iICsgCgkJCSIJCWN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJcbiIgKyAKCQkJImludGVyZmFjZSBJPFQ+IHtcbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKCQkiCWN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiIgKyAKCQkiCSAgICAgICAgICBeXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIFg8Y2FwdHVyZS1vZiA/IGV4dGVuZHMgSTxjYXB0dXJlLW9mID8gZXh0ZW5kcyBJPEU+Pj4gdG8gWDw/IGV4dGVuZHMgSTxFPj5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIik7Cn0KcHVibGljIHZvaWQgdGVzdDc1MygpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlO1xuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWDxFIGV4dGVuZHMgU2VyaWFsaXphYmxlPiB7XG4iICsgCgkJCSIJWDw/IHN1cGVyIEk8RT4+IHBhcmVudDtcbiIgKyAKCQkJIglYPD8gc3VwZXIgSTxFPj4gY3VycmVudDtcbiIgKyAKCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKCQkJIgkJY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIgKyAKCQkJIlxuIiArIAoJCQkiaW50ZXJmYWNlIEk8VD4ge1xuIiArIAoJCQkifVxuIiwKCQl9LAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAoJCSIJWDw/IHN1cGVyIEk8RT4+IHBhcmVudDtcbiIgKyAKCQkiCSAgXl5eXl5eXl5eXG4iICsgCgkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSA/IHN1cGVyIEk8RT4gaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxFIGV4dGVuZHMgU2VyaWFsaXphYmxlPiBvZiB0aGUgdHlwZSBYPEU+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMi4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCgkJIglYPD8gc3VwZXIgSTxFPj4gY3VycmVudDtcbiIgKyAKCQkiCSAgXl5eXl5eXl5eXG4iICsgCgkJIkJvdW5kIG1pc21hdGNoOiBUaGUgdHlwZSA/IHN1cGVyIEk8RT4gaXMgbm90IGEgdmFsaWQgc3Vic3RpdHV0ZSBmb3IgdGhlIGJvdW5kZWQgcGFyYW1ldGVyIDxFIGV4dGVuZHMgU2VyaWFsaXphYmxlPiBvZiB0aGUgdHlwZSBYPEU+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMy4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCgkJIgljdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4iICsgCgkJIgkgICAgICAgICAgXl5eXl5eXl5eXl5eXl5cbiIgKyAKCQkiVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBYPGNhcHR1cmUtb2YgPyBzdXBlciBJPGNhcHR1cmUtb2YgPyBzdXBlciBJPEU+Pj4gdG8gWDw/IHN1cGVyIEk8RT4+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk5NTc4CnB1YmxpYyB2b2lkIHRlc3Q3NTQoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImNsYXNzIGJ1Z1N1cGVyPFQgZXh0ZW5kcyBPYmplY3Q+IHtcbiIgKyAKCQkJIglwdWJsaWMgVCBnZXREYXRhKCl7XG4iICsgCgkJCSIJCXJldHVybiBudWxsO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIgKyAKCQkJIlxuIiArIAoJCQkiY2xhc3MgYnVnRWxlbWVudCB7XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJcbiIgKyAKCQkJImNsYXNzIGJ1Z0NsYXNzPFQgZXh0ZW5kcyBidWdFbGVtZW50PiBleHRlbmRzIGJ1Z1N1cGVyPFQ+e1xuIiArIAoJCQkifVxuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWHtcbiIgKyAKCQkJIglwdWJsaWMgdm9pZCBtZXRob2QoYnVnQ2xhc3MgYmMpe1xuIiArIAoJCQkiCQlidWdFbGVtZW50IGJlID0gYmMuZ2V0RGF0YSgpOyAgIC8vPDwgaGVyZVxuIiArIAoJCQkiCX1cbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTUpXG4iICsgCgkJIglidWdFbGVtZW50IGJlID0gYmMuZ2V0RGF0YSgpOyAgIC8vPDwgaGVyZVxuIiArIAoJCSIJICAgICAgICAgICBeXlxuIiArIAoJCSJUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIE9iamVjdCB0byBidWdFbGVtZW50XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk5OTk5CnB1YmxpYyB2b2lkIHRlc3Q3NTUoKSB7Cgl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKwoJCQkiICBwdWJsaWMgc3RhdGljIGNsYXNzIEIge31cbiIgKwoJCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nLi4uIGFyZ3MpIHtcbiIgKwoJCQkiICAgIFg8Pz4uQltdIGIgPSBuZXcgWDw/Pi5CWzFdO1xuIiArCgkJCSIgIH1cbiIgKwoJCQkifSIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNClcclxuIiArIAoJCSIJWDw/Pi5CW10gYiA9IG5ldyBYPD8+LkJbMV07XHJcbiIgKyAKCQkiCV5eXl5eXlxuIiArIAoJCSJUaGUgbWVtYmVyIHR5cGUgWDw/Pi5CIGNhbm5vdCBiZSBxdWFsaWZpZWQgd2l0aCBhIHBhcmFtZXRlcml6ZWQgdHlwZSwgc2luY2UgaXQgaXMgc3RhdGljLiBSZW1vdmUgYXJndW1lbnRzIGZyb20gcXVhbGlmeWluZyB0eXBlIFg8Pz5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNClcclxuIiArIAoJCSIJWDw/Pi5CW10gYiA9IG5ldyBYPD8+LkJbMV07XHJcbiIgKyAKCQkiCSAgICAgICAgICAgICAgICAgXl5eXl5eXG4iICsgCgkJIlRoZSBtZW1iZXIgdHlwZSBYPD8+LkIgY2Fubm90IGJlIHF1YWxpZmllZCB3aXRoIGEgcGFyYW1ldGVyaXplZCB0eXBlLCBzaW5jZSBpdCBpcyBzdGF0aWMuIFJlbW92ZSBhcmd1bWVudHMgZnJvbSBxdWFsaWZ5aW5nIHR5cGUgWDw/PlxuIiArIAoJCSItLS0tLS0tLS0tXG4iKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05OTk5OQpwdWJsaWMgdm9pZCB0ZXN0NzU2KCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKwoJCQkiICBwdWJsaWMgY2xhc3MgQiB7fVxuIiArCgkJCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcuLi4gYXJncykge1xuIiArCgkJCSIgICAgWDw/Pi5CW10gYiA9IG5ldyBYPD8+LkJbMV07XG4iICsKCQkJIiAgfVxuIiArCgkJCSJ9IiwKCQl9LAoJCSIiKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDAxNDcKcHVibGljIHZvaWQgdGVzdDc1NygpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkicHVibGljIGNsYXNzIFg8SywgVj4ge1xuIiArIAoJCQkiCXN0YXRpYyBjbGFzcyBFbnRyeU1hcDxLLCBWPiB7XG4iICsgCgkJCSIJCWNsYXNzIEVudHJ5IHtcbiIgKyAKCQkJIgkJfVxuIiArIAoJCQkiCX1cbiIgKyAKCQkJIlxuIiArIAoJCQkiCUVudHJ5TWFwLkVudHJ5IGludGVybmFsR2V0KE9iamVjdCBrZXkpIHtcbiIgKyAKCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkiCVxuIiArIAoJCQkiCXZvaWQgZm9vKE9iamVjdCBrZXkpIHtcbiIgKyAKCQkJIgkJRW50cnlNYXA8SyxWPi5FbnRyeSBlbnRyeSA9IGludGVybmFsR2V0KGtleSk7XG4iICsgCgkJCSIJfVxuIiArIAoJCQkiICBab3JrIHo7XG4iICsKCQkJIn1cbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAyKVxyXG4iICsgCgkJIglzdGF0aWMgY2xhc3MgRW50cnlNYXA8SywgVj4ge1xyXG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICAgXlxuIiArIAoJCSJUaGUgdHlwZSBwYXJhbWV0ZXIgSyBpcyBoaWRpbmcgdGhlIHR5cGUgS1xuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjIuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDIpXHJcbiIgKyAKCQkiCXN0YXRpYyBjbGFzcyBFbnRyeU1hcDxLLCBWPiB7XHJcbiIgKyAKCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICBeXG4iICsgCgkJIlRoZSB0eXBlIHBhcmFtZXRlciBWIGlzIGhpZGluZyB0aGUgdHlwZSBWXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMy4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMTIpXHJcbiIgKyAKCQkiCUVudHJ5TWFwPEssVj4uRW50cnkgZW50cnkgPSBpbnRlcm5hbEdldChrZXkpO1xyXG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJUeXBlIHNhZmV0eTogVGhlIGV4cHJlc3Npb24gb2YgdHlwZSBYLkVudHJ5TWFwLkVudHJ5IG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG8gWC5FbnRyeU1hcDxLLFY+LkVudHJ5XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiNC4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDE0KVxyXG4iICsgCgkJIglab3JrIHo7XHJcbiIgKyAKCQkiCV5eXl5cbiIgKyAKCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDE0NyAtIHZhcmlhdGlvbgpwdWJsaWMgdm9pZCB0ZXN0NzU4KCkgewoJdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWDxLLCBWPiB7XG4iICsgCgkJCSIJc3RhdGljIGNsYXNzIEVudHJ5TWFwPEssIFY+IHtcbiIgKyAKCQkJIgkJY2xhc3MgRW50cnkge1xuIiArIAoJCQkiCQl9XG4iICsgCgkJCSIJfVxuIiArIAoJCQkiXG4iICsgCgkJCSIJRW50cnlNYXAuRW50cnkgaW50ZXJuYWxHZXQoT2JqZWN0IGtleSkge1xuIiArIAoJCQkiCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSIJXG4iICsgCgkJCSIJdm9pZCBmb28oT2JqZWN0IGtleSkge1xuIiArIAoJCQkiCQlFbnRyeU1hcDxLLFY+LkVudHJ5IGVudHJ5ID0gKEVudHJ5TWFwLkVudHJ5KSBpbnRlcm5hbEdldChrZXkpO1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIiAgWm9yayB6O1xuIiArCgkJCSJ9XG4iLAoJCX0sCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMilcclxuIiArIAoJCSIJc3RhdGljIGNsYXNzIEVudHJ5TWFwPEssIFY+IHtcclxuIiArIAoJCSIJICAgICAgICAgICAgICAgICAgICAgIF5cbiIgKyAKCQkiVGhlIHR5cGUgcGFyYW1ldGVyIEsgaXMgaGlkaW5nIHRoZSB0eXBlIEtcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIyLiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAyKVxyXG4iICsgCgkJIglzdGF0aWMgY2xhc3MgRW50cnlNYXA8SywgVj4ge1xyXG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgXlxuIiArIAoJCSJUaGUgdHlwZSBwYXJhbWV0ZXIgViBpcyBoaWRpbmcgdGhlIHR5cGUgVlxuIiArIAoJCSItLS0tLS0tLS0tXG4iICsgCgkJIjMuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEyKVxyXG4iICsgCgkJIglFbnRyeU1hcDxLLFY+LkVudHJ5IGVudHJ5ID0gKEVudHJ5TWFwLkVudHJ5KSBpbnRlcm5hbEdldChrZXkpO1xyXG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCgkJIlVubmVjZXNzYXJ5IGNhc3QgZnJvbSBYLkVudHJ5TWFwLkVudHJ5IHRvIFguRW50cnlNYXAuRW50cnlcbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSI0LiBXQVJOSU5HIGluIFguamF2YSAoYXQgbGluZSAxMilcclxuIiArIAoJCSIJRW50cnlNYXA8SyxWPi5FbnRyeSBlbnRyeSA9IChFbnRyeU1hcC5FbnRyeSkgaW50ZXJuYWxHZXQoa2V5KTtcclxuIiArIAoJCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJUeXBlIHNhZmV0eTogVGhlIGV4cHJlc3Npb24gb2YgdHlwZSBYLkVudHJ5TWFwLkVudHJ5IG5lZWRzIHVuY2hlY2tlZCBjb252ZXJzaW9uIHRvIGNvbmZvcm0gdG8gWC5FbnRyeU1hcDxLLFY+LkVudHJ5XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIgKyAKCQkiNS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDE0KVxyXG4iICsgCgkJIglab3JrIHo7XHJcbiIgKyAKCQkiCV5eXl5cbiIgKyAKCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB0eXBlXG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDEyOApwdWJsaWMgdm9pZCB0ZXN0NzU5KCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYPEU+XG4iICsgCgkJCSJ7XG4iICsgCgkJCSIgIEVbXSBtO1xuIiArIAoJCQkiICBwdWJsaWMgWCgpXG4iICsgCgkJCSIgIHtcbiIgKyAKCQkJIglYPD8gZXh0ZW5kcyBFPiB4ID0gbnVsbDtcbiIgKyAKCQkJIglTeXN0ZW0ub3V0LnByaW50bG4oeC5tLmxlbmd0aCk7XG4iICsgCgkJCSIgIH1cbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiIik7Cn0KcHVibGljIHZvaWQgdGVzdDc2MCgpIHsKCXRoaXMucnVuTmVnYXRpdmVUZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAoJCQkiXG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWDxVPiB7XG4iICsgCgkJCSIJcHVibGljIHN0YXRpYyA8VD4gWDxUPiBtYWtlKCkge1xuIiArIAoJCQkiCQlyZXR1cm4gbnVsbDtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSIJcHVibGljIHN0YXRpYyA8VD4gVCBpdHNlbGYoVCB0KSB7XG4iICsgCgkJCSIJCXJldHVybiB0O1xuIiArIAoJCQkiCX1cbiIgKyAKCQkJIlxuIiArIAoJCQkiCXZvaWQgZm9vKCkge1xuIiArIAoJCQkiCQlYPEludGVnZXI+IHgxID0gbWFrZSgpO1xuIiArIAoJCQkiCQlYPEludGVnZXI+IHgyID0gaXRzZWxmKHgxKTtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSIJdm9pZCBiYXIoKSB7XG4iICsgCgkJCSIJCVg8SW50ZWdlcj4geDIgPSBpdHNlbGYobWFrZSgpKTtcbiIgKyAKCQkJIgl9XG4iICsgCgkJCSIJdm9pZCBiYXooKSB7XG4iICsgCgkJCSIJCVg8SW50ZWdlcj4geDIgPSBpdHNlbGYoKFg8SW50ZWdlcj4pbWFrZSgpKTtcbiIgKyAKCQkJIgl9CVxuIiArIAoJCQkifSBcbiIsCgkJfSwKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTYpXG4iICsgCgkJIglYPEludGVnZXI+IHgyID0gaXRzZWxmKG1ha2UoKSk7XG4iICsgCgkJIgkgICAgICAgICAgIF5eXG4iICsgCgkJIlR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gWDxPYmplY3Q+IHRvIFg8SW50ZWdlcj5cbiIgKyAKCQkiLS0tLS0tLS0tLVxuIiArIAoJCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTkpXG4iICsgCgkJIglYPEludGVnZXI+IHgyID0gaXRzZWxmKChYPEludGVnZXI+KW1ha2UoKSk7XG4iICsgCgkJIgkgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAoJCSJDYW5ub3QgY2FzdCBmcm9tIFg8T2JqZWN0PiB0byBYPEludGVnZXI+XG4iICsgCgkJIi0tLS0tLS0tLS1cbiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDQyMQpwdWJsaWMgdm9pZCB0ZXN0NzYxKCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIlxuIiArIAoJCQkiICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NBPEEsIEI+IHtcbiIgKyAKCQkJIiAgICBwdWJsaWMgYWJzdHJhY3QgQiBtZXRob2QoQSBwYXJhbSk7XG4iICsgCgkJCSIgIH1cbiIgKyAKCQkJIlxuIiArIAoJCQkiICBwdWJsaWMgY2xhc3MgQ2xhc3NCPEMsIEQgZXh0ZW5kcyBDPiB7XG4iICsgCgkJCSIgICAgLy8gdGhlIGZvbGxvd2luZyBmaWVsZCBkZWNsYXJhdGlvbiBjYXVzZXMgYW4gZXJyb3JcbiIgKyAKCQkJIiAgICBDbGFzc0E8PyBzdXBlciBDLCA/IGV4dGVuZHMgRD4gY2xhc3NBO1xuIiArIAoJCQkiXG4iICsgCgkJCSIgICAgcHVibGljIEQgbWV0aG9kKEQgZCkge1xuIiArIAoJCQkiICAgICAgcmV0dXJuIGNsYXNzQS5tZXRob2QoZCk7XG4iICsgCgkJCSIgICAgfVxuIiArIAoJCQkiICB9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDQyMSAtIHZhcmlhdGlvbgpwdWJsaWMgdm9pZCB0ZXN0NzYyKCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIlxuIiArIAoJCQkiICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NBPEEsIEIgZXh0ZW5kcyBOdW1iZXI+IHtcbiIgKyAKCQkJIiAgICBwdWJsaWMgYWJzdHJhY3QgQiBtZXRob2QoQSBwYXJhbSk7XG4iICsgCgkJCSIgIH1cbiIgKyAKCQkJIlxuIiArIAoJCQkiICBwdWJsaWMgY2xhc3MgQ2xhc3NCPEMgZXh0ZW5kcyBOdW1iZXIsIEQgZXh0ZW5kcyBDPiB7XG4iICsgCgkJCSIgICAgLy8gdGhlIGZvbGxvd2luZyBmaWVsZCBkZWNsYXJhdGlvbiBjYXVzZXMgYW4gZXJyb3JcbiIgKyAKCQkJIiAgICBDbGFzc0E8PyBzdXBlciBDLCA/IGV4dGVuZHMgRD4gY2xhc3NBO1xuIiArIAoJCQkiXG4iICsgCgkJCSIgICAgcHVibGljIEQgbWV0aG9kKEQgZCkge1xuIiArIAoJCQkiICAgICAgcmV0dXJuIGNsYXNzQS5tZXRob2QoZCk7XG4iICsgCgkJCSIgICAgfVxuIiArIAoJCQkiICB9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIiIpOwp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDUxOQpwdWJsaWMgdm9pZCB0ZXN0NzYzKCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJInB1YmxpYyBjbGFzcyBYPEU+IHtcbiIgKyAKCQkJIglwdWJsaWMgc3RhdGljIGNsYXNzIElubmVyQ2xhc3Mge1xuIiArIAoJCQkiCQlwdWJsaWMgSW5uZXJDbGFzcygpIHtcbiIgKyAKCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihcImNsYXNzIDogXCIgKyBJbm5lckNsYXNzLnRoaXMpO1xuIiArIAoJCQkiCQl9XG4iICsgCgkJCSIJfVxuIiArIAoJCQkifVxuIiwKCQl9LAoJCSIiKTsKfQovL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDE3OTQKcHVibGljIHZvaWQgdGVzdDc3MigpIHsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJpbnRlcmZhY2UgRm9vPFQ+IHtcbiIgKyAKCQkJIiAgcHVibGljIFQgZ2V0SXQoKTtcbiIgKyAKCQkJIn1cbiIgKyAKCQkJIlxuIiArIAoJCQkiY2xhc3MgRm9vSW1wbCBpbXBsZW1lbnRzIEZvbyB7XG4iICsgCgkJCSIgIHB1YmxpYyBTdHJpbmcgZ2V0SXQoKSB7XG4iICsgCgkJCSIgICAgcmV0dXJuIG51bGw7XG4iICsgCgkJCSIgIH1cbiIgKyAKCQkJIn1cbiIgKyAKCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKCQkJIiAgcHVibGljIHZvaWQgZG9JdCgpIHtcbiIgKyAKCQkJIiAgICBPYmplY3QgcyA9IG5ldyBGb29JbXBsKCkuZ2V0SXQoKTtcbiIgKyAKCQkJIiAgfVxuIiArIAoJCQkifVxuIiwKCQl9LAoJCSIiKTsKCXRoaXMucnVuQ29uZm9ybVRlc3QoCgkJbmV3IFN0cmluZ1tdIHsKCQkJIlguamF2YSIsCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIgIHB1YmxpYyB2b2lkIGRvSXQoKSB7XG4iICsgCgkJCSIgICAgT2JqZWN0IHMgPSBuZXcgRm9vSW1wbCgpLmdldEl0KCk7XG4iICsgCgkJCSIgIH1cbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiIiwKCQludWxsLAoJCWZhbHNlLAoJCW51bGwpOwoJCVN0cmluZyBleHBlY3RlZE91dHB1dCA9CgkJCSIgIC8vIE1ldGhvZCBkZXNjcmlwdG9yICMxOCAoKUxqYXZhL2xhbmcvT2JqZWN0O1xuIiArIAoJCQkiICAvLyBTdGFjazogMSwgTG9jYWxzOiAxXG4iICsgCgkJCSIgIHB1YmxpYyBicmlkZ2Ugc3ludGhldGljIE9iamVjdCBnZXRJdCgpO1xuIiArIAoJCQkiICAgIDAgIGFsb2FkXzBcbiIgKyAKCQkJIiAgICAxICBpbnZva2V2aXJ0dWFsIEZvb0ltcGwuZ2V0SXQoKSA6IGphdmEubGFuZy5TdHJpbmcgIFsyMF1cbiIgKyAKCQkJIiAgICA0ICBjaGVja2Nhc3QgamF2YS5sYW5nLk9iamVjdCBbNF1cbiIgKyAKCQkJIiAgICA3ICBhcmV0dXJuXG4iICsgCgkJCSIgICAgICBMaW5lIG51bWJlcnM6XG4iICsgCgkJCSIgICAgICAgIFtwYzogMCwgbGluZTogMV1cbiI7CgkJCgkJdHJ5IHsKCQkJRmlsZSBmID0gbmV3IEZpbGUoT1VUUFVUX0RJUiArIEZpbGUuc2VwYXJhdG9yICsgIkZvb0ltcGwuY2xhc3MiKTsKCQkJYnl0ZVtdIGNsYXNzRmlsZUJ5dGVzID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRGaWxlQnl0ZUNvbnRlbnQoZik7CgkJCUNsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyIGRpc2Fzc2VtYmxlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlcigpOwoJCQlTdHJpbmcgcmVzdWx0ID0gZGlzYXNzZW1ibGVyLmRpc2Fzc2VtYmxlKGNsYXNzRmlsZUJ5dGVzLCAiXG4iLCBDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlci5ERVRBSUxFRCk7CgkJCWludCBpbmRleCA9IHJlc3VsdC5pbmRleE9mKGV4cGVjdGVkT3V0cHV0KTsKCQkJaWYgKGluZGV4ID09IC0xIHx8IGV4cGVjdGVkT3V0cHV0Lmxlbmd0aCgpID09IDApIHsKCQkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcocmVzdWx0LCAzKSk7CgkJCX0KCQkJaWYgKGluZGV4ID09IC0xKSB7CgkJCQlhc3NlcnRFcXVhbHMoIldyb25nIGNvbnRlbnRzIiwgZXhwZWN0ZWRPdXRwdXQsIHJlc3VsdCk7CgkJCX0KCQl9IGNhdGNoIChvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNsYXNzRm9ybWF0RXhjZXB0aW9uIGUpIHsKCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7CgkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewoJCQlhc3NlcnRUcnVlKGZhbHNlKTsKCQl9CQp9Ci8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTc5NCAtIHZhcmlhdGlvbgpwdWJsaWMgdm9pZCB0ZXN0NzczKCkgewoJdGhpcy5ydW5Db25mb3JtVGVzdCgKCQluZXcgU3RyaW5nW10gewoJCQkiWC5qYXZhIiwKCQkJImludGVyZmFjZSBGb288VCBleHRlbmRzIEV4Y2VwdGlvbj4ge1xuIiArIAoJCQkiICBwdWJsaWMgVCBnZXRJdCgpIHRocm93cyBUO1xuIiArIAoJCQkifVxuIiArIAoJCQkiXG4iICsgCgkJCSJjbGFzcyBGb29JbXBsIGltcGxlbWVudHMgRm9vIHtcbiIgKyAKCQkJIiAgcHVibGljIE51bGxQb2ludGVyRXhjZXB0aW9uIGdldEl0KCkge1xuIiArIAoJCQkiICAgIHJldHVybiBudWxsO1xuIiArIAoJCQkiICB9XG4iICsgCgkJCSJ9XG4iICsgCgkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCgkJCSIgIHB1YmxpYyB2b2lkIGRvSXQoKSB7XG4iICsgCgkJCSIgICAgT2JqZWN0IHMgPSBuZXcgRm9vSW1wbCgpLmdldEl0KCk7XG4iICsgCgkJCSIgIH1cbiIgKyAKCQkJIn1cbiIsCgkJfSwKCQkiIik7Cgl0aGlzLnJ1bkNvbmZvcm1UZXN0KAoJCW5ldyBTdHJpbmdbXSB7CgkJCSJYLmphdmEiLAoJCQkicHVibGljIGNsYXNzIFgge1xuIiArIAoJCQkiICBwdWJsaWMgdm9pZCBkb0l0KCkge1xuIiArIAoJCQkiICAgIE9iamVjdCBzID0gbmV3IEZvb0ltcGwoKS5nZXRJdCgpO1xuIiArIAoJCQkiICB9XG4iICsgCgkJCSJ9XG4iLAoJCX0sCgkJIiIsCgkJbnVsbCwKCQlmYWxzZSwKCQludWxsKTsKCQlTdHJpbmcgZXhwZWN0ZWRPdXRwdXQgPQoJCQkiICAvLyBNZXRob2QgZGVzY3JpcHRvciAjMTggKClMamF2YS9sYW5nL0V4Y2VwdGlvbjtcbiIgKyAKCQkJIiAgLy8gU3RhY2s6IDEsIExvY2FsczogMVxuIiArIAoJCQkiICBwdWJsaWMgYnJpZGdlIHN5bnRoZXRpYyBFeGNlcHRpb24gZ2V0SXQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbjtcbiIgKyAKCQkJIiAgICAwICBhbG9hZF8wXG4iICsgCgkJCSIgICAgMSAgaW52b2tldmlydHVhbCBGb29JbXBsLmdldEl0KCkgOiBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gIFsyM11cbiIgKyAKCQkJIiAgICA0ICBjaGVja2Nhc3QgamF2YS5sYW5nLkV4Y2VwdGlvbiBbMjFdXG4iICsgCgkJCSIgICAgNyAgYXJldHVyblxuIiArIAoJCQkiICAgICAgTGluZSBudW1iZXJzOlxuIiArIAoJCQkiICAgICAgICBbcGM6IDAsIGxpbmU6IDFdXG4iOwoJCQoJCXRyeSB7CgkJCUZpbGUgZiA9IG5ldyBGaWxlKE9VVFBVVF9ESVIgKyBGaWxlLnNlcGFyYXRvciArICJGb29JbXBsLmNsYXNzIik7CgkJCWJ5dGVbXSBjbGFzc0ZpbGVCeXRlcyA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuZ2V0RmlsZUJ5dGVDb250ZW50KGYpOwoJCQlDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlciBkaXNhc3NlbWJsZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIoKTsKCQkJU3RyaW5nIHJlc3VsdCA9IGRpc2Fzc2VtYmxlci5kaXNhc3NlbWJsZShjbGFzc0ZpbGVCeXRlcywgIlxuIiwgQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIuREVUQUlMRUQpOwoJCQlpbnQgaW5kZXggPSByZXN1bHQuaW5kZXhPZihleHBlY3RlZE91dHB1dCk7CgkJCWlmIChpbmRleCA9PSAtMSB8fCBleHBlY3RlZE91dHB1dC5sZW5ndGgoKSA9PSAwKSB7CgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5kaXNwbGF5U3RyaW5nKHJlc3VsdCwgMykpOwoJCQl9CgkJCWlmIChpbmRleCA9PSAtMSkgewoJCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBjb250ZW50cyIsIGV4cGVjdGVkT3V0cHV0LCByZXN1bHQpOwoJCQl9CgkJfSBjYXRjaCAob3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7CgkJCWFzc2VydFRydWUoZmFsc2UpOwoJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7CgkJfQkKfQp9Cgo=