LyoKICogVmVydGV4IHBvc2l0aW9uIGRhdGEgZGVzY3JpYmluZyB0aGUgbGV0dGVyICdpJwogKgogKiAoYykgQ29weXJpZ2h0IDE5OTMsIFNpbGljb24gR3JhcGhpY3MsIEluYy4KICogQ29weXJpZ2h0IKkgMjAxMiBMaW5hcm8gTGltaXRlZAogKgogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2xtYXJrMiBPcGVuR0wgKEVTKSAyLjAgYmVuY2htYXJrLgogKgogKiBnbG1hcmsyIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCiAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKICogdmVyc2lvbi4KICoKICogZ2xtYXJrMiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwogKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCiAqIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKICogZ2xtYXJrMi4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICoKICogQXV0aG9yczoKICogIEplc3NlIEJhcmtlcgogKi8KI2luY2x1ZGUgImNoYXJhY3RlcnMuaCIKCnVzaW5nIExpYk1hdHJpeDo6dmVjMjsKCkxldHRlckk6OkxldHRlckkoKQp7CiAgICAvLyBWZXJ0ZXggZGF0YS4uLgogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMC41NDg3NjcsIDkuNDE0NzkxKSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigyLjc5NTI4NCwgOS43NTc3NzEpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDEuNDU3NjYzLCA5LjMxMTg5NykpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMi41MDM3NTEsIDkuMTU3NTU3KSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigxLjcxNDg5OCwgOC45ODYwNjcpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDIuMTA5MzI1LCA3Ljc4NTYzOCkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMS4yODYxNzQsIDcuMDEzOTM0KSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigxLjgwMDY0MywgNi4wNzA3NDApKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDAuOTk0NjQxLCA1LjE2MTg0MykpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMS43ODM0OTQsIDQuNzY3NDE3KSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigwLjk0MzE5NCwgNC4xNjcyMDIpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDEuODUyMDkwLCA0LjMwNDM5NCkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMS4wNjMyMzcsIDMuNTQ5ODM5KSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigyLjAyMzU4MCwgMy45Nzg1NjQpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDEuNDA2MjE3LCAzLjE3MjU2MikpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMi4zMTUxMTMsIDMuODc1NjcwKSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigyLjAwNjQzMSwgMy4wMTgyMjEpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDIuODEyNDMzLCAzLjk0NDI2NikpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMi43MjY2ODgsIDMuNDI5Nzk2KSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigzLjI1ODMwNywgNC4xMzI5MDUpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDEuOTg5MjgyLCAxMC45MjM5MDIpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDIuNzc4MTM1LCAxMi4yOTU4MjApKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDIuOTY2Nzc0LCAxMS42Nzg0NTYpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDMuNjg3MDMxLCAxMi45NDc0ODEpKTsKCiAgICAvLyBJbmRleCBkYXRhLi4uCiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygwKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDEpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMik7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygzKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDQpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soNSk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjayg2KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDcpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soOCk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjayg5KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDEwKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDExKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDEyKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDEzKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDE0KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDE1KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDE2KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDE3KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDE4KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDE5KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDIwKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDIxKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDIyKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDIzKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDApOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMik7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjayg0KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDYpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soOCk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygxMCk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygxMik7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygxNCk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygxNik7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygxOCk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygxOSk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygxNyk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygxNSk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygxMyk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygxMSk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjayg5KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDcpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soNSk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygzKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDEpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjApOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjIpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjMpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjEpOwoKICAgIC8vIFByaW1pdGl2ZSBzdGF0ZSBzbyB0aGF0IHRoZSBkcmF3IGNhbGwgY2FuIGlzc3VlIHRoZSBwcmltaXRpdmVzIHdlIHdhbnQuCiAgICB1bnNpZ25lZCBpbnQgY3VyT2Zmc2V0KDApOwogICAgcHJpbVZlY18ucHVzaF9iYWNrKFByaW1pdGl2ZVN0YXRlKEdMX1RSSUFOR0xFX1NUUklQLCAyMCwgY3VyT2Zmc2V0KSk7CiAgICBjdXJPZmZzZXQgKz0gKDIwICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CiAgICBwcmltVmVjXy5wdXNoX2JhY2soUHJpbWl0aXZlU3RhdGUoR0xfVFJJQU5HTEVfU1RSSVAsIDQsIGN1ck9mZnNldCkpOwogICAgY3VyT2Zmc2V0ICs9ICg0ICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CiAgICBwcmltVmVjXy5wdXNoX2JhY2soUHJpbWl0aXZlU3RhdGUoR0xfVFJJQU5HTEVfU1RSSVAsIDIwLCBjdXJPZmZzZXQpKTsKICAgIGN1ck9mZnNldCArPSAoMjAgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKICAgIHByaW1WZWNfLnB1c2hfYmFjayhQcmltaXRpdmVTdGF0ZShHTF9UUklBTkdMRV9TVFJJUCwgNCwgY3VyT2Zmc2V0KSk7Cn0K