VGhpbmdzIHRvIFRlc3QKPT09PT09PT09PT09PT0KCiogdGVzdCBzeW5jaHJvbml6ZWQgc3RhdGVtZW50CgoqIHRlc3QgY29tcGlsZXIgZXJyb3JzIHdoZW4KCS0gZHVwbGljYXRlIG1ldGhvZHMgdGVzdG5vIAoJLSBkdXBsaWNhdGUgY2xhc3MgaW4gbW9kdWxlCgkKKiB0ZXN0IEJ1dHRvbihhY3Rpb25QZXJmb3JtZWQ6e2V2ZW50fCBldmVudC5wcmludGxuKCkgfQoKCQpDb3JlIEdyb292eSBUYXNrcwo9PT09PT09PT09PT09PT09PQoKKiBhbGxvdyBtYXBzIHRvIGJlIGNyZWF0ZWQgdXNpbmcgaWRlbnRpZmllcnM/Cgl7bmFtZTonSmFtZXMnLCBhZGRyZXNzOidMb25kb24nfQoJCglvbmx5IGlzc3VlIGlzIHRoZSBpZGVudGlmaWVycyBjb3VsZCBjb25mbGljdC4KCQoJQ291bGQgdXNlIGEgaGVscGVyIG1ldGhvZD8KCiogaGFuZGxpbmcgc2VxdWVuY2VzICgwLW4sIDEtbikKCXRoZXkgYXJlIExpc3RzICYgYmVoYXZlIGxpa2UgbGlzdHMsIGFueSBtZXRob2RzIG9uIHRoZSBpdGVtcyB3aWxsCgliZSBjYWxsZWQgZXRjLgoJCglob3dldmVyIGhvdyBhcmUgdGhleSBhc3NpZ25lZCAvIG1vZGlmaWVkLgoJCgkJZm9vLmN1c3RvbWVycyArPSBjdXN0b21lcgoJCQoJCWZvby5jdXN0b21lcnMgPSBbY3VzdG9tZXIxLCBjdXN0b21lcjJdCgkJCgkJc28gYXNzaWdubWVudCBvZiBzZXF1ZW5jZSBmaWVsZHMgZG9uJ3QgcmVhbGx5IGRvIGFuIGFzc2lnbjsgdGhleSBkbyBhIHNldChMaXN0KSBpbnN0ZWFkCgkJCgkJLSBzaG91bGQgd2UgYWxsb3cgcmVhbCBhc3NpZ25tZW50cy4gZS5nLgoJCQoJCUFkZHJlc3MqIGZvbyA9IC4uLjsKCQlmb28gPSBbMSwgMiwgM10KCQkKCQlmb28ga2VlcHMgaXRzIHR5cGUgc28gaXRzIG5vdCBhIExpc3QKCQkKCWhvdyBhYm91dCBoYW5kbGluZyBtYW5kYXRvcnkgdmFsdWVzIC0gCgkJdGhlIHNldCB3ZSBvdmVybG9hZCB0byBkbyB0aGUgbm9uLW51bGwgY2hlY2tzPwoJCXRoaXMgbXVzdCBiZSBhIHR5cGUuIGUuZy4KCQkKCQkJU3RyaW5nISB4ID0gImhlbGxvIgoJCQl4ID0gbnVsbCAvLyBlcnJvcgoJCQkKKiBuZXcgR3Jvb3Z5TWV0aG9kcwl0byBiZSBhZGRlZAoJLSBGaWxlLmdyZXAocGF0dGVybikgLT4gTGlzdAoJLSBGaWxlLmdyZXAocGF0dGVybikgeyBjbG9zdXJlIH0gCgkJYWxsb3cgaXRlcmF0aW9uIHRocm91Z2ggYSBmaWxlIGZvciBlYWNoIGxpbmUgbWF0Y2hpbmcgYSByZWdleCBwYXR0ZXJuCgktIENvbGxlY3Rpb24uZ3JlcChwYXR0ZXJuKSAgLT4gTGlzdAoJLSBDb2xsZWN0aW9uLmdyZXAocGF0dGVybikgIHsgY2xvc3VyZSB9CgkJd2hlcmUgcGF0dGVybiA9IHJlZ2V4cCAoY291bGQgbWF5YmUgYmUgb3RoZXIga2luZHMgb2YgcGF0dGVybnMgbGlrZSBSYW5nZT8pCgkJCgktIExpc3QuZmlyc3QoKSwgTGlzdC5sYXN0KCksIHBvcCgpCgktIENvbGxlY3Rpb24ucmVtb3ZlSWYgeyB4IHwgeCA+IDAgfQoJLSBMaXN0LmVhY2hXaXRoaW5kZXggeyBpdGVtLCBpZHggfCAuLi4gfQoJLSBMaXN0LnJldmVyc2VFYWNoIHsgLi4uIH0KCS0gQ29sbGVjdGlvbi5jb3VudChmb28pIC0+IHJldHVybnMgbnVtYmVyIG9mIG9iamVjdHMgdGhhdCBlcXVhbCBmb28KCS0gQ29sbGVjdGlvbi5jb3VudElmIHsgaXQgPiA1IH0gLT4gcmV0dXJucyBudW1iZXIgb2Ygb2JqZWN0cyB0aGF0IG1hdGNoIGNsb3N1cmUgcHJlZGljYXRlCgoJLSBNYXAuZ2V0KGtleSwgZGVmYXVsdFZhbHVlKQoJLSBNYXAuc2V0RGVmYXVsdChrZXksIGRlZmF1bHRWYWx1ZSkgZm9yIHRoaW5ncyBsaWtlCiAgCQkgbWFwLnNldERlZmF1bHQoa2V5LCBbXSkuYWRkKG5ld1ZhbHVlKQoJCgktIE9iamVjdC5nZXRNZXRhQ2xhc3MoKQoJLSBPYmplY3QuZWFjaFByb3BlcnR5CgktIE9iamVjdC5lYWNoUHJvcGVydHlOYW1lIHsgb2JqZWN0LmdldFByb3BlcnR5KGl0KSB9CgktIE9iamVjdC5zZXRQcm9wZXJ0aWVzKGZvbzonYWJjJywgeDoxMjMpCgkKCS0gTWFwLmVhY2hLZXksIGVhY2hWYWx1ZQoJLSBNYXAuaW5kZXgsIE1hcC5pbmRleGVzCgktIGNvbmZpZ3VyZSBtZXRob2Qgb24gYmVhbnM/CgkJYmVhbi5zZXRQcm9wZXJ0aWVzKG5hbWU6J0phbWVzJywgbG9jYXRpb246J0xvbmRvbicpCgktIHNvbWUga2luZCBvZiBSZWdleHAgaXRlcmF0b3Igb2Ygc3RyaW5ncyBsaWtlIFJ1YnkncyBzY2FuCgktIG1heWJlIHN1cHBvcnQgUHl0aG9ucycgemlwIGFuZCByZWR1Y2UgZnVuY3Rpb25zPwoJCgkJbWF5YmUgYWRkIHRoZSB2YXJpb3VzIHJlYWRvbmx5IExpc3QgQVBJcyB0byBPYmplY3RbXSBhbmQgKltdIHR5cGVzCgkJaWYgd2UgZXZlciBzdXBwb3J0IHRoZSBEVEQgLyBYZWQgc3R5bGUgdHlwZSosIHR5cGUrIHRoZW4gd2UgY2FuIGRvIHRoZSBzYW1lCgkJdGhlcmUgdG9vCgoqIGFkZCBkb2VzTm90VW5kZXJzdGFuZCgpIG1ldGhvZCBmb3IgY2F0Y2hpbmcgJiBoYW5kbGluZyB1bmtub3duIG1ldGhvZHMJCgkJCiogaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFkZCBsaXN0ZW5lcnMgaW4gR3Jvb3Z5LiBlLmcuIGhvdyB0byByZW1vdmUgYWRkZWQgbGlzdGVuZXJzCgoJbGlzdGVuZXIgPSBiZWFuLnByb3BlcnR5ICsgeyBzb21lIGNsb3N1cmUgfQoJYmVhbi5wcm9wZXJ0eSAtIGxpc3RlbmVyCgkKKiBCZWFuQnVpbGRlciAtIGJ1aWxkZXIgd2hpY2ggY3JlYXRlcyBhIHRyZWUgb2YgYmVhbnMKCWJ1aWxkZXIuYmVhbihjbGFzczpTb21lQ2xhc3MsIHg6MTIzLCBiOidoZWxsbycpIHsKCQluZXN0ZWRQcm9wZXJ0eShhOjEyMykKCQluZXN0ZWRQcm9wZXJ0eTIoY2xhc3M6RGVyaXZlZENsYXNzLCBiOjQzKQoJfQoJdXNpbmcgYWRkZXIgbWV0aG9kIGFzIHdlbGwgYXMgc2V0dGVyIG1ldGhvZHMKCiogTUJlYW5CdWlsZGVyPwoJYnVpbGRlci5tbGV0IHsKCQltYmVhbihjbGFzczpTb21lQ2xhc3MpIHsKCQkJc29tZUF0dHJpYnV0ZSh2YWx1ZSkKCQl9CgkJbWJlYW4oY2xhc3M6U29tZUNsYXNzLCBzb21lQXR0cmlidXRlOnZhbHVlKSB7CgkJCW9wZXJhdGlvbigxLCAyKQoJCX0KCX0KCiogdGVtcGxhdGluZyAtIGFsbG93IGxvb3BpbmcgJiBjb25kaXRpb25hbHM/Cgp0ZXh0ID0gIgo8dGFibGU+CiNmb3IgKGYgaW4gZm9vKQo8dHI+Cjx0ZD4ke2YubmFtZX0KPC90cj4KI2VuZAo8L3RhYmxlPgoiCgoqIGFsbG93IGlmL3N3aXRjaCB0byBiZSB0aGUgYW5kIG9mIGEgZnVuY3Rpb24uIGkuZS4KCWZvbygpIHsKCQlpZiAoeCA+IDEpIHsKCQkJImhlbGxvIgoJCX0KCQllbHNlIHsKCQkJImNoZWVzZSIKCQl9Cgl9CglkaXR0byBmb3Igc3dpdGNoPyBpLmUuIG1ha2UgcmV0dXJuIHN0YXRlbWVudCBvcHRpb25hbC4KCQoKKiBTUUwgYnVpbGRlcgoKc3FsLnRhYmxlKCJ1c2VycyIpIHsKysrKIGNvbHVtbigndXNlci1pZCcpIHsgYXV0b2luYygpLCBwcmltYXJ5S2V5KCksIHJlZmVyZW5jZXMoJ2ZvbycpLCBpbml0aWFsVmFsdWUoMTIzNCkgfQrKysogY29sdW1uKCduaWNrbmFtZScpIHsgdmFyY2hhcigyMDApIH0KCWNvbHVtbihuYW1lOidmb28nLCB0eXBlOid2YXJjaGFyKDIwMCknLCByZWZlcmVuY2VzOlsnYScsICdiJ10sIGluaXRpYWxWYWx1ZToxMjM0KQogIH0KfQoKKiB1c2luZyBtaXhpbiBmb3IgYWRkaW5nIHVzaW5nIHN0eWxlIGJlaGF2aW91ciB0byBhbnkgb2JqZWN0Pz8KCgltaXhpbiBVc2luZyB7CgkKCQlzdGF0aWMgdXNpbmcoeWllbGQpIHsKCQkJb2JqZWN0ID0gdGhpcy5uZXdJbnN0YW5jZSgpCgkJCXRyeSB7CgkJCQl5aWVsZChvYmplY3QpCgkJCQlvYmplY3QuY2xvc2UoKQoJCQl9CgkJCWNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJdHJ5IHsKCQkJCQlvYmplY3QuY2xvc2UoKQoJCQkJfQoJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlMikKCQkJCQkvLyBpZ25vcmUgZTIKCQkJCQl0aHJvdyBlCgkJCQl9CgkJCX0KCQl9CgkJCgkJb3IKCQkKCQl1c2luZyh5aWVsZCkgewoJCQl0cnkgewoJCQkJeWllbGQodGhpcykKCQkJCWNsb3NlKCkKCQkJfQoJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCXRyeSB7CgkJCQkJY2xvc2UoKQoJCQkJfQoJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlMikKCQkJCQkvLyBpZ25vcmUgZTIKCQkJCQl0aHJvdyBlCgkJCQl9CgkJCX0KCQl9Cgl9CgkKCXRoZW4gdXNlIGl0IGFzIAoJCgkJbmV3IEZpbGVJbnB1dFN0cmVhbSgpLnVzaW5nIHsgaW4gfAoJCQkuLi4KCQl9CgoqIGxvb2tzIGxpa2UgYSBidWcgb24gZ2VuZXJhdGVkIG1ldGhvZHMsIHNob3VsZCB1c2UgcGFyYW0gbmFtZSBvdmVyIGFueSBmaWVsZCBuYW1lCgktIGFsc28gaXQgbG9va3MgbGlrZSB0aGVyZSdzIHZhcmlvdXMgdW5uZWNlc3Nhcnkgc3R1ZmYgKGNyZWF0aW9uIG9mIHR1cGxlcykgd2hlbiBpbnZva2luZwoJbWV0aG9kcwoJCiogZ3Jvb3Z5IHRocmVhZC4uLgoJZm9vID0gbmV3IEdyb292eVRocmVhZChhcmdzKSB7IGNsb3N1cmUgfQoJCiogTWV0YUNsYXNzIC0+IGFkZCBnZXRQcm9wZXJ0eURlc2NyaXB0b3Igd2hpY2ggaGFzIG1ldGhvZHMKCS0gZ2V0KCksIHNldCgpLCB0eXBlKCksIGNhcmRpbmFsaXR5KCkgZXRjCgkKCWNvdWxkIHVzZSBuYW1pbmcgY29udmVudGlvbnMgdG8gZGV0ZWN0IGNhcmRpbmFsaXR5IC0gZS5nLiBhZGRGb28oKSwgZ2V0Rm9vcygpCgkKKiBnZW5lcmF0ZSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgc3R1ZmYgb24gcHJvcGVydGllcwoKKiB0ZXN0IGlkZW50aXR5IC0+IGhhc2hDb2RlICsgZXF1YWxzIG1ldGhvZHMKCiogc3VwcG9ydCBmb3IgcHJvcGVydHkgY29udmVydGVycywgYmFzZWQgb24gdHlwZQoKKiBnbyB0aHJvdWdoIGFsbCBub3Qtd29ya2luZyBAdG9kbyB0ZXN0cyBpbiBzcmMvdGVzdAoJCiogdG8gc3VwcG9ydCBkeW5hbWljIG1peGlucyB3ZSBzaG91bGQgdXNlIGR5bmFtaWMgcHJveGllcyB0byBhbGxvdwoJYSBncm9vdnkgb2JqZWN0IHRvIGNoYW5nZSBtZXRhY2xhc3MgYXQgcnVudGltZQoKKiBncm9vdnkgZHluYW1pYyBwcm94eSBvZiBhbnkgSmF2YSBvYmplY3QgaW4gSmF2YS1sYW5kPwoJTnVsbE9iamVjdCBwYXR0ZXJuCgkKKiBpbW11dGFibGUgYmVhbgoKKiBNZXRhQ2xhc3MuZGVyaXZlTWV0YUNsYXNzKCkKCU1ldGFDbGFzcy5hZGRNaXhpbihtaXhpbikKCiogY29uc3RydWN0b3JzIHdpdGggbWFwIC8gdHVwbGUgZXhwcmVzc2lvbnMsIG5hbWVkIHBhcmFtZXRlciBjYWxsaW5nCiAKKiBkZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVycwoKKiB0ZXN0IHRyeSAvIGNhdGNoIHdpdGggbXVsdGlwbGUgZXhjZXB0aW9uIHR5cGVzCgoqICogc3VwcG9ydCBzdGF0aWMgbmV3SW5zdGFuY2UoKSBtZXRob2QgZm9yIGNvbnN0cnVjdG9ycwoKKiBtYXliZSBzcGxpdCB1cCBDbGFzc0dlbmVyYXRvciAtIGRvIGNvZGUgZ2VuICYgY2xhc3MgZ2VuIHNlcGFyYXRlbHkKCiogbWl4aW4gc3VwcG9ydC4uLgoKCVNvbWVDbGFzcy5hZGRNaXhpbihGb28pOwoJCglNZXRhQ2xhc3MuYWRkSW50ZXJjZXB0b3IoIG5ldyBJbnRlcmNlcHRvcigpIHsKCQlmaWx0ZXIobWV0aG9kKSB7CgkJCXJldHVybiBtZXRob2QuaXNQdWJsaWMoKTsKCQl9CgkJaW52b2tlKG1ldGhvZCwgYXJncykgewoJCQkvLyBkbyBzb21ldGhpbmcKCQkJbWV0aG9kLmludm9rZShhcmdzKTsKCQl9Cgl9KTsKCgkqIGFsbG93IG1ldGEgY2xhc3NlcyB0byBiZSBhZGRlZCBkeW5hbWljYWxseSB1c2luZyBjbG9zdXJlIHN5bnRheD8KCWUuZy4gTWFwPwoJCgpTVFVGRiBUTyBQT05ERVIKPT09PT09PT09PT09PT09CgoqIGlmIHdlIGFsbG93IHN0YXRlbWVudHMgaW4gY2xhc3MgZGVjbGFyYXRpb25zLCB0aGVuIHdlIGNvdWxkIGRpc2FsbG93IHRoZSBzeW50YXggc3VnYXIKCWZvciBtZXRob2QgaW52b2NhdGlvbiB3aXRoIGNsb3N1cmVzLiBpLmUuIGZvbyB7IGNvZGUgfSB3b3VsZCBoYXZlIHRvIGJlIGZvbyAoe2NvZGV9KQoJb3RoZXJ3aXNlIGl0J2QgYmUgaW50ZXJwZXRlZCBhcyBhIG1ldGhvZCBkZWNsYXJhdGlvbi4KCQoJZS5nLgoJCgltb2R1bGUgTXlWYWxpZGF0aW5nTW9kdWxlCgkKCWNsYXNzIENoZWVzZSB7CgkJcmVhZE9ubHlQcm9wZXJ0eSgnaGVsbG8nKQoJCXZhbGlkYXRpbmdQcm9wZXJ0eSgnbmFtZScsIHsgaXQubGVuZ3RoID4gMCB9ICkKCQkKCQlsYXppbHlDcmVhdGVkUHJvcGVydHkoOmNoZWVzZSwgeyBuZXcgTXlTcGVjaWFsQ2hlZXNlKCkgfSkKCQkKCQlwdWJsaWMoOm1ldGhvZEEsIDptZXRob2RCLCA6bWV0aG9kQykKCX0KCSAKCWZvciBub3cgd2UgY291bGQgYXJndWUgdGhhdCBvbmx5IG1ldGhvZHMgYXJlIGFsbG93ZWQgdG8gYmUgaW52b2tlZCBpbnNpZGUgdGhlIGNsYXNzIGRlY2xhcmF0aW9uLgoJV2UgY291bGQgc3RpbGwgZG8gbWFya3VwIGJ1dCBqdXN0IG5vdCBhcyBuaWNlCgkKCWNsYXNzIFdoYXRub3QgewoJCXRhYmxlKCB7CgkJCWZvbyB7CgkJCX0KCQkJd2hhdG5vdCB7CgkJCX0KCQl9KQoJCQoJCWJsYWggPSB7IAoJCQlhKHg6MTIzNCwgYjo5NDIpIHsKCQkJCWQoKQoJCQl9CgkJfQoJCQoJCiogU3VwcG9ydCBtdWx0aXBsZSByZXR1cm4gdmFsdWVzLi4uCgoJU3RyaW5nLCBOdW1iZXIgY2hlZXNlKCkgewoJCSJoZWxsbyIsIDcKCX0KCQoJYSwgYiA9IGNoZWVzZSgpCgkKCWFsc28gaWYgd2UgZG8gdGhpcyB3ZSBzaG91bGQgZG8gYXNzaWdubWVudCAvIHN3YXBwaW5nCgkKCQlhLCBiID0gMSwgMgoJCWEsIGIgPSBiLCBhCgoqIG1heWJlIHVzZSBzeW50YXggI1sxLCAyXSB0byBjcmVhdGUgYXJyYXlzIHdoaWNoIGJlaGF2ZSBqdXN0IGxpa2UgaW1tdXRhYmxlIGxpc3RzPwoJCQoqIHVzaW5nIG1hY3JvcyB0byBhdm9pZCBkZXBlbmRlbmNpZXMgb24gbG9nZ2luZyBzdHVmZiAoc2F5KQoKCWNsYXNzIEdyb292eUxvZyB7CgkJc3dpdGNoIChTeXN0ZW0uZ2V0UHJvcGVydHkoJ2dyb292eS5sb2cuaW1wbCcsICd1c2VDb21tb25zTG9nZ2luZycpKSB7CgkJCWNhc2UgJ3VzZUNvbW1vbnNMb2dnaW5nJzogewoJCQkJLy8gbGV0cyBkZWZpbmUgdGhlIG5ldyBpbnN0YW5jZSBtZXRob2QKCQkJCW5ld0luc3RhbmNlKCkgewoJCQkJCXJldHVybiBuZXcgQ29tbW9uc0xvZ2dpbmdUaGluZ3koKQoJCQkJfQoJCQl9CgkJCWRlZmF1bHQgewoJCQkJbmV3SW5zdGFuY2UoKSB7CgkJCQkJcmV0dXJuIG5ldyBTaW1wbGVHcm9vdnlMb2coKQoJCQkJfQoJCQl9CgkJfQoJfQoJCglkb2luZyB0aGluZ3MgbGlrZSB0aGlzIGF0IGNvbXBpbGUgdGltZSBtZWFucyBubyBydW50aW1lIGRlcGVuZGVuY2llcy4gRGl0dG8gdG8gZG8gSkRLIGJhc2VkIGNvbXBpbGVzCgkKCQoJClVJIFdPUksKPT09PT09PQoKKiB0cmVlIGRlbW8uLi4KCiogd2hlbiBuYW1lZCBtZXRob2QgY2FsbHMgYXJlIHN1cHBvcnRlZCB3aXRoIGRlZmF1bHQgdmFsdWVzLCByZWZhY3RvciBTd2luZ0J1aWxkZXIKCXNvIHRoYXQgYWxsIHRoZSBjcmVhdGlvbnMgb2Ygd2lkZ2V0cyBvY2N1ciB3aXRoIFN3aW5nRmFjdG9yeSB3aGljaCB3b3VsZCBiZSAKCXVzZWZ1bCBpbiBhbmQgb2YgaXRzZWxmCgktIHBsdXMgd2Ugc2hvdWxkIGJlIHVzaW5nIG5vcm1hbCBtZXRob2QgY2FsbCBtZWNoYW5pc20gJiBmb3IgZ3Jvb3Z5IHRvIGRvIHRoZSByZXN0IHRvIGF2b2lkCgl0aGUgbG9uZyBsYWJvcmlvdXMgTWFwIGNvZGluZwoJCiogYWRkIHRhYmxlIGxheW91dCBjZWxsIHNwYWNpbmcgdGhpbmd5CgoqIEZvcm1Nb2RlbC5hZGRQcm9wZXJ0eU1vZGVsKHByb3BlcnR5KQoJRm9ybU1vZGVsLmFkZENsb3N1cmVNb2RlbChyZWFkQ2xvc3VyZSwgd3JpdGVDbG9zdXJlKQoKKiBMaXN0TW9kZWwgaXMtYSBMaXN0IGJ1dCBkZWxlZ2F0ZXMgdG8gYW4gdW5kZXJseWluZyBsaXN0IGFuZCBoYXMgZXZlbnRzCgoqIHJlbmFtZSB0YWJsZUxheW91dCAtPiB0YWJsZSBhbmQgdGFibGUgLT4gZ3JpZAoKKiBhZGQgc29ydGFibGVHcmlkCgoqIGNyZWF0ZSBhIEdyb292eVVJCgktPiBpbnRlcmFjdGl2ZSBzY3JpcHQgKyBhbGxvd3Mgc2NyaXB0cyB0byBiZSBydW4gJiBvYmplY3RzIGV4cGxvcmVkCgoKCgpFQ0xJUFNFIFdPUksKPT09PT09PT09PT09CgoqIFJ1biBhcyBKVW5pdCBzdXBwb3J0IGZvciBHcm9vdnkhIAoKKiBSZWZhY3RvcmluZyBzdXBwb3J0IGZvciBHcm9vdnkgYW5kIHRpZSBpdCBpbnRvIHRoZSBKYXZhIHJlZmFjdG9yaW5nCgoKSlVOSVQgV09SSwo9PT09PT09PT09CgoqIHBhdGNoIEdyb292eVRlc3RDYXNlIHNvIHRoYXQgbWV0aG9kcyB3aGljaCByZXR1cm4gT2JqZWN0IGFyZSBpbmNsdWRlZCBpbiB0aGUgdGVzdC4gVGhpcyBhdm9pZHMgdXMgaGF2aW5nIHRvCnNwZWNpZnkgdm9pZCBmb3IgbWV0aG9kIHJldHVybiB0eXBlcy5UaGlzIHJlcXVpcmVzIGEgY2xldmVyIHN0YXRpYyBtZXRob2Qgd2hlbiB3ZSBnZW5lcmF0ZSB0aGUKCWJ5dGVjb2RlIHdoaWNoIGNhbiBpbnN0YW50aWF0ZSBhIHNwZWNpYWwga2luZCBvZiBUZXN0U3VpdGUKCXVubGVzcyB0aGVyZSdzIGFub3RoZXIgd2F5PwoKCk9QVElNSVNBVElPTlMKPT09PT09PT09PT09PQoqIG1ldGhvZCBpbnZvY2F0aW9ucyAtIGlmIGZvbyBpbnN0YW5jZW9mIEdyb292eU9iamVjdAp0aGVuIGdlbmVyYXRlIGJ5dGVjb2RlCgpmb28uaW52b2tlTWV0aG9kKG1ldGhvZCwgYXJncyk7CgoqIGNvdWxkIGNvZGUgZ2VuZXJhdGUgdGhlIE1ldGFDbGFzcyB3aXRoIHZlcnkgZWZmaWNpZW50IGR5bmFtaWMgZGlzcGF0Y2gKCWUuZy4gY291bGQgc3dpdGNoKCkgb24gdGhlIG1ldGhvZCBuYW1lICYgdGhlbiB1c2UgcmVhbCBtZXRob2QgaW52b2NhdGlvbgoJb24gdGhlIG1ldGhvZCBpbnN0YW5jZQo=