IyBqbmRuLXV0aWxzCgpUaGlzIHByb2plY3QgaXMgYSBjb2xsZWN0aW9uIG9mIHRvb2xzIHRvIHNpbXBsaWZ5IHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlciBvdmVyIHRoZSBORE4gbmV0d29yay4gSXQgcmVsaWVzIG9uIHRoZSBbTkROIFByb3RvY29sXShodHRwczovL25hbWVkLWRhdGEubmV0KSBhbmQgaXRzIGFzc29jaWF0ZWQgW2NsaWVudCBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9qbmRuKS4KCiMjIEluc3RhbGwKV2l0aCBNYXZlbiwgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBQT006CmBgYAo8ZGVwZW5kZW5jeT4KICA8Z3JvdXBJZD5jb20uaW50ZWwuam5kbi51dGlsczwvZ3JvdXBJZD4KICA8YXJ0aWZhY3RJZD5qbmRuLXV0aWxzPC9hcnRpZmFjdElkPgogIDx2ZXJzaW9uPlJFTEVBU0U8L3ZlcnNpb24+IDwhLS0gb3IgYSBzcGVjaWZpYyB2ZXJzaW9uIC0tPgo8L2RlcGVuZGVuY3k+CmBgYAoKIyMgVXNlClVzZSBgQ2xpZW50YCBvciBgU2VnbWVudGVkQ2xpZW50YCB0byByZXRyaWV2ZSBkYXRhIGZyb20gdGhlIG5ldHdvcmsuIEZvciBleGFtcGxlOgpgYGAKRGF0YSBkYXRhMSA9IENsaWVudC5nZXREZWZhdWx0KCkuZ2V0U3luYyhmYWNlLCBuYW1lKTsKRGF0YSBkYXRhMiA9IFNlZ21lbnRlZENsaWVudC5nZXREZWZhdWx0KCkuZ2V0U3luYyhmYWNlLCBuYW1lKTsKYGBgCgojIyBMaWNlbnNlCkNvcHlyaWdodCCpIDIwMTUsIEludGVsIENvcnBvcmF0aW9uLgoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMywgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCgpUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgW0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZV0oaHR0cHM6Ly9naXRodWIuY29tLzAxb3JnL2puZG4tdXRpbHMvYmxvYi9tYXN0ZXIvTElDRU5TRSkgZm9yIG1vcmUgZGV0YWlscy4K