Ly8KLy8gQ29weXJpZ2h0IKkgMjAxMiBMaW5hcm8gTGltaXRlZAovLwovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2xtYXJrMiBPcGVuR0wgKEVTKSAyLjAgYmVuY2htYXJrLgovLwovLyBnbG1hcmsyIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCi8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLy8gRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKLy8gdmVyc2lvbi4KLy8KLy8gZ2xtYXJrMiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKLy8gV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi8vIGRldGFpbHMuCi8vCi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLy8gZ2xtYXJrMi4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLy8KLy8gQXV0aG9yczoKLy8gIEFsZWtzYW5kYXIgUm9kaWMgLSBDcmVhdG9yIGFuZCBXZWJHTCBpbXBsZW1lbnRhdGlvbiAKLy8gIEplc3NlIEJhcmtlciAtIGdsbWFyazIgcG9ydAovLwojaWZuZGVmIFNDRU5FX0pFTExZRklTSF8KI2RlZmluZSBTQ0VORV9KRUxMWUZJU0hfCiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlICJ2ZWMuaCIKI2luY2x1ZGUgInN0YWNrLmgiCiNpbmNsdWRlICJwcm9ncmFtLmgiCgpjbGFzcyBHcmFkaWVudFJlbmRlcmVyCnsKICAgIFByb2dyYW0gcHJvZ3JhbV87CiAgICBpbnQgcG9zaXRpb25Mb2NhdGlvbl87CiAgICBpbnQgdXZMb2NhdGlvbl87CiAgICB1bnNpZ25lZCBpbnQgdXZPZmZzZXRfOwogICAgdW5zaWduZWQgaW50IGJ1ZmZlck9iamVjdF87CiAgICBzdGQ6OnZlY3RvcjxMaWJNYXRyaXg6OnZlYzI+IHZlcnRpY2VzXzsKICAgIHN0ZDo6dmVjdG9yPExpYk1hdHJpeDo6dmVjMj4gdXZzXzsKICAgIApwdWJsaWM6CiAgICBHcmFkaWVudFJlbmRlcmVyKCkgOgogICAgICAgIHBvc2l0aW9uTG9jYXRpb25fKDApLAogICAgICAgIHV2TG9jYXRpb25fKDApLAogICAgICAgIHV2T2Zmc2V0XygwKSwKICAgICAgICBidWZmZXJPYmplY3RfKDApIHt9CiAgICB+R3JhZGllbnRSZW5kZXJlcigpCiAgICB7CiAgICAgICAgdmVydGljZXNfLmNsZWFyKCk7CiAgICAgICAgdXZzXy5jbGVhcigpOwogICAgfQogICAgYm9vbCBpbml0KCk7CiAgICB2b2lkIGNsZWFudXAoKTsKICAgIHZvaWQgZHJhdygpOwp9OwoKY2xhc3MgSmVsbHlmaXNoUHJpdmF0ZQp7CiAgICBib29sIGxvYWRfb2JqKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSk7CgogICAgLy8gRm9yIHRoZSBiYWNrZ3JvdW5kIGdyYWRpZW50LgogICAgR3JhZGllbnRSZW5kZXJlciBncmFkaWVudF87CgogICAgLy8gVmVydGV4IGRhdGEuCiAgICBzdGQ6OnZlY3RvcjxMaWJNYXRyaXg6OnZlYzM+IHBvc2l0aW9uc187CiAgICBzdGQ6OnZlY3RvcjxMaWJNYXRyaXg6OnZlYzM+IG5vcm1hbHNfOwogICAgc3RkOjp2ZWN0b3I8TGliTWF0cml4Ojp2ZWMzPiBjb2xvcnNfOwogICAgc3RkOjp2ZWN0b3I8TGliTWF0cml4Ojp2ZWMzPiB0ZXhjb29yZHNfOwogICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgc2hvcnQ+IGluZGljZXNfOwogICAgLy8gQSBzaW1wbGUgbWFwIHNvIHdlIGtub3cgd2hlcmUgZWFjaCBzZWN0aW9uIG9mIG91ciBkYXRhIHN0YXJ0cyB3aXRoaW4KICAgIC8vIG91ciB2ZXJ0ZXggYnVmZmVyIG9iamVjdC4KICAgIHN0cnVjdCBWZXJ0ZXhEYXRhTWFwCiAgICB7CiAgICAgICAgdW5zaWduZWQgaW50IHBvc2l0aW9uT2Zmc2V0OwogICAgICAgIHVuc2lnbmVkIGludCBwb3NpdGlvblNpemU7CiAgICAgICAgdW5zaWduZWQgaW50IG5vcm1hbE9mZnNldDsKICAgICAgICB1bnNpZ25lZCBpbnQgbm9ybWFsU2l6ZTsKICAgICAgICB1bnNpZ25lZCBpbnQgY29sb3JPZmZzZXQ7CiAgICAgICAgdW5zaWduZWQgaW50IGNvbG9yU2l6ZTsKICAgICAgICB1bnNpZ25lZCBpbnQgdGV4Y29vcmRPZmZzZXQ7CiAgICAgICAgdW5zaWduZWQgaW50IHRleGNvb3JkU2l6ZTsKICAgICAgICB1bnNpZ25lZCBpbnQgdG90YWxTaXplOwogICAgfSBkYXRhTWFwXzsKICAgIC8vIE9iamVjdCBoYW5kbGVzCiAgICB1bnNpZ25lZCBpbnQgYnVmZmVyT2JqZWN0c19bMl07CiAgICB1bnNpZ25lZCBpbnQgdGV4dHVyZU9iamVjdHNfWzMzXTsKICAgIHVuc2lnbmVkIGludCB3aGljaENhdXN0aWNfOwogICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHVuc2lnbmVkIGludD4gY2F1c3RpY01hcF87CgogICAgLy8gUHJvZ3JhbSBzdGF0ZSwgaW5jbHVkaW5nIGF0dHJpYnV0ZXMsIHVuaWZvcm1zLCBhbmQsIGxvY2F0aW9ucy4KICAgIFByb2dyYW0gcHJvZ3JhbV87CiAgICBpbnQgcG9zaXRpb25Mb2NhdGlvbl87CiAgICBpbnQgbm9ybWFsTG9jYXRpb25fOwogICAgaW50IGNvbG9yTG9jYXRpb25fOwogICAgaW50IHRleGNvb3JkTG9jYXRpb25fOwogICAgTGliTWF0cml4Ojp2ZWMyIHZpZXdwb3J0XzsKICAgIExpYk1hdHJpeDo6U3RhY2s0IHdvcmxkXzsKICAgIExpYk1hdHJpeDo6U3RhY2s0IHByb2plY3Rpb25fOwogICAgTGliTWF0cml4Ojp2ZWMzIGxpZ2h0UG9zaXRpb25fOwogICAgTGliTWF0cml4Ojp2ZWM0IGxpZ2h0Q29sb3JfOwogICAgZmxvYXQgbGlnaHRSYWRpdXNfOwogICAgTGliTWF0cml4Ojp2ZWM0IGFtYmllbnRDb2xvcl87CiAgICBMaWJNYXRyaXg6OnZlYzQgZnJlc25lbENvbG9yXzsKICAgIGZsb2F0IGZyZXNuZWxQb3dlcl87CiAgICBmbG9hdCByb3RhdGlvbl87CiAgICBmbG9hdCBjdXJyZW50VGltZV87CiAgICBkb3VibGUgbGFzdFVwZGF0ZVRpbWVfOwogICAgLy8gR0wgc3RhdGUgd2UgcGxhbiB0byBvdmVycmlkZSwgc28gd2UgY2FuIHJlc3RvcmUgaXQgY2xlYW5seS4KICAgIHVuc2lnbmVkIGludCBjdWxsRmFjZV87CiAgICB1bnNpZ25lZCBpbnQgZGVwdGhUZXN0XzsKICAgIHVuc2lnbmVkIGludCBibGVuZF87CiAgICBpbnQgYmxlbmRGdW5jU3JjXzsKICAgIGludCBibGVuZEZ1bmNEc3RfOwoKcHVibGljOgogICAgSmVsbHlmaXNoUHJpdmF0ZSgpOwogICAgfkplbGx5ZmlzaFByaXZhdGUoKTsKICAgIGJvb2wgaW5pdGlhbGl6ZSgpOwogICAgdm9pZCB1cGRhdGVfdmlld3BvcnQoY29uc3QgTGliTWF0cml4Ojp2ZWMyJiB2aWV3cG9ydCk7CiAgICB2b2lkIHVwZGF0ZV90aW1lKCk7CiAgICB2b2lkIGNsZWFudXAoKTsKICAgIHZvaWQgZHJhdygpOwp9OwoKI2VuZGlmIC8vIFNDRU5FX0pFTExZRklTSF8K