Ly8gQ29weXJpZ2h0IChDKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgovLwovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCi8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQovLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQovLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLy8gYW55IGxhdGVyIHZlcnNpb24uCgovLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQovLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQovLyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLy8gVVNBLgoKI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxsb2NhbGU+CiNpbmNsdWRlIDx0ZXN0c3VpdGVfaG9va3MuaD4KCmludCBtYWluKCkKewogIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CgogIGJvb2wgdGVzdCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IHRydWU7CiAgbG9jYWxlIGwxID0gX19nbnVfdGVzdDo6dHJ5X25hbWVkX2xvY2FsZSgiZGVfREUiKTsKICBsb2NhbGUgbDIgPSBfX2dudV90ZXN0Ojp0cnlfbmFtZWRfbG9jYWxlKCJlc19FUyIpOwogIAogIGNvbnN0IHRpbWVfcHV0PGNoYXI+ICZ0cCA9IHVzZV9mYWNldDx0aW1lX3B1dDxjaGFyPiA+KGwxKTsgIAogIG9zdHJpbmdzdHJlYW0gb3NzOwogIG9zcy5pbWJ1ZShsMik7CiAgCiAgdG0gdCA9IHRtKCk7ICAKICB0cC5wdXQob3NzLnJkYnVmKCksIG9zcywgJyAnLCAmdCwgJ0EnKTsKICBzdHJpbmcgcmVzID0gb3NzLnN0cigpOwogIAogIFZFUklGWSggcmVzID09ICJkb21pbmdvIiApOwoKICByZXR1cm4gMDsKfQoKLy8gVHdvIGludGVycHJldGF0aW9ucyBvZiB0aGUgc3RhbmRhcmQuCgovLyAxIDogdGltZV9nZXQsIHRpbWVfcHV0IGVhY2ggaGF2ZSB0aGVpciBvd24gZGF0YSBpbnRlcm5hbGx5Ci8vICAgdXNlIGludGVybmFsIGRhdGEgZm9yIHRpbWUgYW5kIGRhdGUgc3BlY2lmaWNzCi8vICAgdXNlIGdldGxvYyBmb3IgY3R5cGUgaW5mbwoKLy8gMiA6IHRpbWVfZ2V0LCB0aW1lX3B1dCB1c2UgdGhlIGlvc19iYXNlJiBhcmd1bWVudCBhbmQgZ2V0bG9jIHRvCi8vIHJldHJpZXZlIHRoZSBuZWNlc3NhcnkgZGF0YS4KLy8gICB1c2UgZ2V0bG9jIGZvciBjdHlwZSwgdGltZSBhbmQgZGF0ZSBzcGVjaWZpY3MKCi8vIEl0IGlzIG15IG9waW5pb24gdGhhdCB0aGUgbGFuZ3VhZ2UgaW4gdGhlIHN0YW5kYXJkIGlzIHN1ZmZpY2llbnRseQovLyB2YWd1ZSB0byBwZXJtaXQgYm90aCBpbnRlcnByZXRhdGlvbnMuIEluIHBhcnRpY3VsYXIsIHRoZSBpbnRlcmZhY2UKLy8gZm9yIHRpbWVfZ2V0IGFuZCB0aW1lX3B1dCBpcyBiYXNlZCBvbiBzdHJmdGltZSwgd2hpY2ggYXMKLy8gUE9TSVggbm90ZXMgaXMgZGVwZW5kZW50IG9uIExDX1RJTUUuIFRoZSBDKysgc3RhbmRhcmQsIGhvd2V2ZXIsCi8vIGRvZXMgbm90IHNwZWNpZnkgdGhlIGVxdWl2YWxlbnQgbWFwcGluZ3Mgb2YgTENfVElNRSB0byB0aW1lX2dldCBhbmQKLy8gdGltZV9wdXQuCgovKgpUaGUgcHJvYmxlbXMgd2l0aCB0aGUgZmlyc3QgYXBwcm9hY2gsIGFzIGFib3ZlLCBhcmUgbnVtZXJvdXMuCgoxKSBUaGUgbG9jYWxlIHVzYWdlIGFuZCBkZXNpZ24gZm9yIGZvcm1hdHRlcnMgYW5kIHBhcnNlcnMgYmVjb21lcwogICBmcmFnbWVudGVkLiBPbiBvbmUgc2lkZSwgbnVtX3B1dCBhbmQgbW9uZXlfcHV0LCBhbmQgb24gdGhlIG90aGVyLAogICB0aW1lX3B1dC4gVGhpcyBpbmNvbnNpc3RlbmN5IGlzIG5vdCB1c2VmdWwuCgoyKSBUaGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aW1lIGFuZCBkYXRlIGZvcm1hdHRpbmcgYXJlIHRoZSBsYXJnZXN0IGluCiAgIHRoZSBsb2NhbGUgbGlicmFyeS4gTWFraW5nIHRpbWVfcHV0IGFuZCB0aW1lX2dldCBrZWVwIHNlcGFyYXRlCiAgIGNvcGllcyBpcyBpbmVmZmljaWVudC4gKE5vdGUgdGhhdCB0aW1lX3B1dCBhbmQgdGltZV9nZXQgYXJlIGluIHRoZQogICBzYW1lIGxvY2FsZTo6Y2F0ZWdvcnkpLgoqLwoKCi8qCjIyLjIuNSAtIFRoZSB0aW1lIGNhdGVnb3J5IFtsaWIuY2F0ZWdvcnkudGltZV0KCi0xLSBUZW1wbGF0ZXMgdGltZV9nZXQ8Y2hhclQsSW5wdXRJdGVyYXRvcj4gYW5kCiB0aW1lX3B1dDxjaGFyVCxPdXRwdXRJdGVyYXRvcj4gcHJvdmlkZSBkYXRlIGFuZCB0aW1lIGZvcm1hdHRpbmcgYW5kCiBwYXJzaW5nLiBBbGwgc3BlY2lmaWNhdGlvbnMgb2YgbWVtYmVyIGZ1bmN0aW9ucyBmb3IgdGltZV9wdXQgYW5kCiB0aW1lX2dldCBpbiB0aGUgc3ViY2xhdXNlcyBvZiBsaWIuY2F0ZWdvcnkudGltZSBvbmx5IGFwcGx5IHRvIHRoZQogaW5zdGFudGlhdGlvbnMgcmVxdWlyZWQgaW4gVGFibGVzIDUxIGFuZCA1MgogKGxpYi5sb2NhbGUuY2F0ZWdvcnkpLiBUaGVpciBtZW1iZXJzIHVzZSB0aGVpciBpb3NfYmFzZSYsCiBpb3NfYmFzZTo6aW9zdGF0ZSYsIGFuZCBmaWxsIGFyZ3VtZW50cyBhcyBkZXNjcmliZWQgaW4KIChsaWIubG9jYWxlLmNhdGVnb3JpZXMpLCBhbmQgdGhlIGN0eXBlPD4gZmFjZXQsIHRvIGRldGVybWluZQogZm9ybWF0dGluZyBkZXRhaWxzLgoqLwoKLyoKMjIuMiAtIFN0YW5kYXJkIGxvY2FsZSBjYXRlZ29yaWVzIFtsaWIubG9jYWxlLmNhdGVnb3JpZXNdCgotMS0gRWFjaCBvZiB0aGUgc3RhbmRhcmQgY2F0ZWdvcmllcyBpbmNsdWRlcyBhIGZhbWlseSBvZiBmYWNldHMuIFNvbWUKIG9mIHRoZXNlIGltcGxlbWVudCBmb3JtYXR0aW5nIG9yIHBhcnNpbmcgb2YgYSBkYXR1bSwgZm9yIHVzZSBieQogc3RhbmRhcmQgb3IgdXNlcnMnIGlvc3RyZWFtIG9wZXJhdG9ycyA8PCBhbmQgPj4sIGFzIG1lbWJlcnMgcHV0KCkgYW5kCiBnZXQoKSwgcmVzcGVjdGl2ZWx5LiBFYWNoIHN1Y2ggbWVtYmVyIGZ1bmN0aW9uIHRha2VzIGFuIGlvc19iYXNlJgogYXJndW1lbnQgd2hvc2UgbWVtYmVycyBmbGFncygpLCBwcmVjaXNpb24oKSwgYW5kIHdpZHRoKCksIHNwZWNpZnkgdGhlCiBmb3JtYXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZGF0dW0uIChsaWIuaW9zLmJhc2UpLiBUaG9zZSBmdW5jdGlvbnMKIHdoaWNoIG5lZWQgdG8gdXNlIG90aGVyIGZhY2V0cyBjYWxsIGl0cyBtZW1iZXIgZ2V0bG9jKCkgdG8gcmV0cmlldmUKIHRoZSBsb2NhbGUgaW1idWVkIHRoZXJlLiBGb3JtYXR0aW5nIGZhY2V0cyB1c2UgdGhlIGNoYXJhY3RlciBhcmd1bWVudAogZmlsbCB0byBmaWxsIG91dCB0aGUgc3BlY2lmaWVkIHdpZHRoIHdoZXJlIG5lY2Vzc2FyeS4KKi8KCi8qCldpdGggR0NDL2xpYnN0ZGMrKywgdGhlIG91dHB1dCBvZiB0aGUgcHJvZ3JhbSB3aXRoIHRoZSBhcmd1bWVudHMKb2YgZGVfREUgZXNfRVMgaXM6CiAgICAgZG9taW5nbwogICAgIGx1bmVzCiAgICAgbWFydGVzCiAgICAgbWnpcmNvbGVzCiAgICAganVldmVzCiAgICAgdmllcm5lcwogICAgIHPhYmFkbwoKV2l0aCBJbnRlbCBDKyssIGl0IGlzOiAodGhpcyBpcyBjbGVhcmx5IHdyb25nKQogICAgIFN1bmRheQogICAgIE1vbmRheQogICAgIFR1ZXNkYXkKICAgICBXZWRuZXNkYXkKICAgICBUaHVyc2RheQogICAgIEZyaWRheQogICAgIFNhdHVyZGF5CgpBbmQgd2l0aCBSb2d1ZVdhdmUgQysrCiAgICAgU29ubnRhZwogICAgIE1vbnRhZwogICAgIERpZW5zdGFnCiAgICAgTWl0dHdvY2gKICAgICBEb25uZXJzdGFnCiAgICAgRnJlaXRhZwogICAgIFNhbXN0YWcKKi8K