LyogdGltZXJzLmggLSBoZWFkZXIgZmlsZSBmb3IgdGltZXJzIHBhY2thZ2UKKioKKiogQ29weXJpZ2h0IKkgMTk5NSwxOTk4LDE5OTksMjAwMCBieSBKZWYgUG9za2FuemVyIDxqZWZAbWFpbC5hY21lLmNvbT4uCioqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCioqCioqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAoqKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKiogYXJlIG1ldDoKKiogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKiogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoqKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAoqKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCioqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCioqCioqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKiogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCioqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCioqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCioqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCioqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCioqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQoqKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAoqKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCioqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKiogU1VDSCBEQU1BR0UuCiovCgojcHJhZ21hIG9uY2UKCiNpbmNsdWRlIDxzeXMvdGltZS5oPgoKI2lmbmRlZiBJTkZUSU0KI2RlZmluZSBJTkZUSU0gLTEKI2VuZGlmIC8qIElORlRJTSAqLwoKLyogQ2xpZW50RGF0YSBpcyBhIHJhbmRvbSB2YWx1ZSB0aGF0IHRhZ3MgYWxvbmcgd2l0aCBhIHRpbWVyLiAgVGhlIGNsaWVudAoqKiBjYW4gdXNlIGl0IGZvciB3aGF0ZXZlciwgYW5kIGl0IGdldHMgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayB3aGVuIHRoZQoqKiB0aW1lciB0cmlnZ2Vycy4KKi8KdHlwZWRlZiB1bmlvbiB7CiAgdm9pZCAqcDsKICBpbnQgaTsKICBsb25nIGw7Cn0gQ2xpZW50RGF0YTsKCmV4dGVybiBDbGllbnREYXRhIEp1bmtDbGllbnREYXRhOyAvKiBmb3IgdXNlIHdoZW4geW91IGRvbid0IGNhcmUgKi8KCi8qIFRoZSBUaW1lclByb2MgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgdGltZXIgZXhwaXJlcy4gIEl0IGdldHMgcGFzc2VkCioqIHRoZSBDbGllbnREYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGltZXIsIGFuZCBhIHRpbWV2YWwgaW4gY2FzZQoqKiBpdCB3YW50cyB0byBzY2hlZHVsZSBhbm90aGVyIHRpbWVyLgoqLwp0eXBlZGVmIHZvaWQgVGltZXJQcm9jKENsaWVudERhdGEgY2xpZW50X2RhdGEsIHN0cnVjdCB0aW1ldmFsICpub3dQKTsKCi8qIFRoZSBUaW1lciBzdHJ1Y3QuICovCnR5cGVkZWYgc3RydWN0IFRpbWVyU3RydWN0IHsKICBUaW1lclByb2MgKnRpbWVyX3Byb2M7CiAgQ2xpZW50RGF0YSBjbGllbnRfZGF0YTsKICBsb25nIG1zZWNzOwogIGludCBwZXJpb2RpYzsKICBzdHJ1Y3QgdGltZXZhbCB0aW1lOwogIHN0cnVjdCBUaW1lclN0cnVjdCAqcHJldjsKICBzdHJ1Y3QgVGltZXJTdHJ1Y3QgKm5leHQ7CiAgaW50IGhhc2g7Cn0gVGltZXI7CgovKiBJbml0aWFsaXplIHRoZSB0aW1lciBwYWNrYWdlLiAqLwpleHRlcm4gdm9pZCB0bXJfaW5pdCh2b2lkKTsKCi8qIFNldCB1cCBhIHRpbWVyLCBlaXRoZXIgcGVyaW9kaWMgb3Igb25lLXNob3QuIFJldHVybnMgKFRpbWVyKikgMCBvbiBlcnJvcnMuICovCmV4dGVybiBUaW1lciAqdG1yX2NyZWF0ZShzdHJ1Y3QgdGltZXZhbCAqbm93UCwgVGltZXJQcm9jICp0aW1lcl9wcm9jLCBDbGllbnREYXRhIGNsaWVudF9kYXRhLCBsb25nIG1zZWNzLCBpbnQgcGVyaW9kaWMpOwoKLyogUmV0dXJucyBhIHRpbWVvdXQgaW5kaWNhdGluZyBob3cgbG9uZyB1bnRpbCB0aGUgbmV4dCB0aW1lciB0cmlnZ2Vycy4gIFlvdQoqKiBjYW4ganVzdCBwdXQgdGhlIGNhbGwgdG8gdGhpcyByb3V0aW5lIHJpZ2h0IGluIHlvdXIgc2VsZWN0KCkuICBSZXR1cm5zCioqIChzdHJ1Y3QgdGltZXZhbCopIDAgaWYgbm8gdGltZXJzIGFyZSBwZW5kaW5nLgoqLwpleHRlcm4gc3RydWN0IHRpbWV2YWwgKnRtcl90aW1lb3V0KHN0cnVjdCB0aW1ldmFsICpub3dQKTsKCi8qIFJldHVybnMgYSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBpbmRpY2F0aW5nIGhvdyBsb25nIHVudGlsIHRoZSBuZXh0IHRpbWVyCioqIHRyaWdnZXJzLiAgWW91IGNhbiBqdXN0IHB1dCB0aGUgY2FsbCB0byB0aGlzIHJvdXRpbmUgcmlnaHQgaW4geW91ciBwb2xsKCkuCioqIFJldHVybnMgSU5GVElNICgtMSkgaWYgbm8gdGltZXJzIGFyZSBwZW5kaW5nLgoqLwpleHRlcm4gbG9uZyB0bXJfbXN0aW1lb3V0KHN0cnVjdCB0aW1ldmFsICpub3dQKTsKCi8qIFJ1biB0aGUgbGlzdCBvZiB0aW1lcnMuIFlvdXIgbWFpbiBwcm9ncmFtIG5lZWRzIHRvIGNhbGwgdGhpcyBldmVyeSBzbyBvZnRlbiwKKiogb3IgYXMgaW5kaWNhdGVkIGJ5IHRtcl90aW1lb3V0KCkuCiovCmV4dGVybiB2b2lkIHRtcl9ydW4oc3RydWN0IHRpbWV2YWwgKm5vd1ApOwoKLyogUmVzZXQgdGhlIGNsb2NrIG9uIGEgdGltZXIsIHRvIGN1cnJlbnQgdGltZSBwbHVzIHRoZSBvcmlnaW5hbCB0aW1lb3V0LiAqLwpleHRlcm4gdm9pZCB0bXJfcmVzZXQoc3RydWN0IHRpbWV2YWwgKm5vd1AsIFRpbWVyICp0aW1lcik7CgovKiBEZXNjaGVkdWxlIGEgdGltZXIuICBOb3RlIHRoYXQgbm9uLXBlcmlvZGljIHRpbWVycyBhcmUgYXV0b21hdGljYWxseQoqKiBkZXNjaGVkdWxlZCB3aGVuIHRoZXkgcnVuLCBzbyB5b3UgZG9uJ3QgaGF2ZSB0byBjYWxsIHRoaXMgb24gdGhlbS4KKi8KZXh0ZXJuIHZvaWQgdG1yX2NhbmNlbChUaW1lciAqdGltZXIpOwoKLyogQ2xlYW4gdXAgdGhlIHRpbWVycyBwYWNrYWdlLCBmcmVlaW5nIGFueSB1bnVzZWQgc3RvcmFnZS4gKi8KZXh0ZXJuIHZvaWQgdG1yX2NsZWFudXAodm9pZCk7CgovKiBDYW5jZWwgYWxsIHRpbWVycyBhbmQgZnJlZSBzdG9yYWdlLCB1c3VhbGx5IGluIHByZXBhcmF0aW9uIGZvciBleGl0dGluZy4gKi8KZXh0ZXJuIHZvaWQgdG1yX2Rlc3Ryb3kodm9pZCk7Cg==