LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ny0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogRmlsZSBTSU1QTEVUWi5ICioKKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDA0LzIxLzk3ICAgIGFsaXUgICAgICAgIE92ZXJoYXVsZWQgaGVhZGVyLgoqICAgIDA4LzEwLzk4ICAgIHN0ZXBoZW4gICAgICAgIEpESyAxLjIgc3luYwoqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIHNldFN0YXJ0UnVsZSgpIC8gc2V0RW5kUnVsZSgpIG92ZXJsb2FkcwoqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGhhc1NhbWVSdWxlcygpCiogICAgMDkvMDIvOTggICAgc3RlcGhlbiAgICAgICAgQWRkZWQgZ2V0T2Zmc2V0KG1vbnRoTGVuKQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWQgZ2V0T2Zmc2V0KCkgdG8gdGFrZSBVRXJyb3JDb2RlCiogICAgMDcvMDkvOTkgICAgc3RlcGhlbiAgICAgUmVtb3ZlZCBtaWxsaXNQZXJIb3VyICh1bnVzZWQsIGZvciBIUCBjb21waWxlcikKKiAgIDEyLzAyLzk5ICAgIGFsaXUgICAgICAgIEFkZGVkIFRpbWVNb2RlIGFuZCBjb25zdHJ1Y3RvciBhbmQgc2V0U3RhcnQvRW5kUnVsZQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcyB0aGF0IHRha2UgVGltZU1vZGUuIEFkZGVkIHRvIGRvY3MuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgojaWZuZGVmIFNJTVBMRVRaX0gKI2RlZmluZSBTSU1QTEVUWl9ICgojaW5jbHVkZSAidW5pY29kZS90aW1lem9uZS5oIgoKc3RydWN0IFN0YW5kYXJkWm9uZTsKc3RydWN0IERTVFpvbmU7CmNsYXNzIFRpbWVab25lOwoKLyoqCiAqIDxjb2RlPlNpbXBsZVRpbWVab25lPC9jb2RlPiBpcyBhIGNvbmNyZXRlIHN1YmNsYXNzIG9mIDxjb2RlPlRpbWVab25lPC9jb2RlPgogKiB0aGF0IHJlcHJlc2VudHMgYSB0aW1lIHpvbmUgZm9yIHVzZSB3aXRoIGEgR3JlZ29yaWFuIGNhbGVuZGFyLiBUaGlzCiAqIGNsYXNzIGRvZXMgbm90IGhhbmRsZSBoaXN0b3JpY2FsIGNoYW5nZXMuCiAqIDxQPgogKiBXaGVuIHNwZWNpZnlpbmcgZGF5bGlnaHQtc2F2aW5ncy10aW1lIGJlZ2luIGFuZCBlbmQgZGF0ZXMsIHVzZSBhIG5lZ2F0aXZlIHZhbHVlIGZvcgogKiA8Y29kZT5kYXlPZldlZWtJbk1vbnRoPC9jb2RlPiB0byBpbmRpY2F0ZSB0aGF0IDxjb2RlPlNpbXBsZVRpbWVab25lPC9jb2RlPiBzaG91bGQKICogY291bnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBtb250aCBiYWNrd2FyZHMuIEZvciBleGFtcGxlLCBpbiB0aGUgVS5TLiwgRGF5bGlnaHQgU2F2aW5ncwogKiBUaW1lIGVuZHMgYXQgdGhlIGxhc3QgKGRheU9mV2Vla0luTW9udGggPSAtMSkgU3VuZGF5IGluIE9jdG9iZXIsIGF0IDIgQU0gaW4gc3RhbmRhcmQKICogdGltZS4KICoKICogQHNlZSAgICAgIENhbGVuZGFyCiAqIEBzZWUgICAgICBHcmVnb3JpYW5DYWxlbmRhcgogKiBAc2VlICAgICAgVGltZVpvbmUKICogQGF1dGhvciAgIERhdmlkIEdvbGRzbWl0aCwgTWFyayBEYXZpcywgQ2hlbi1MaWVoIEh1YW5nLCBBbGFuIExpdQogKi8KY2xhc3MgVV9JMThOX0FQSSBTaW1wbGVUaW1lWm9uZTogcHVibGljIFRpbWVab25lIHsKcHVibGljOgoKICAgIC8qKgogICAgICogVGltZU1vZGUgaXMgdXNlZCwgdG9nZXRoZXIgd2l0aCBhIG1pbGxpc2Vjb25kIG9mZnNldCBhZnRlcgogICAgICogbWlkbmlnaHQsIHRvIHNwZWNpZnkgYSBydWxlIHRyYW5zaXRpb24gdGltZS4gIE1vc3QgcnVsZXMKICAgICAqIHRyYW5zaXRpb24gYXQgYSBsb2NhbCB3YWxsIHRpbWUsIHRoYXQgaXMsIGFjY29yZGluZyB0byB0aGUKICAgICAqIGN1cnJlbnQgdGltZSBpbiBlZmZlY3QsIGVpdGhlciBzdGFuZGFyZCwgb3IgRFNULiAgSG93ZXZlciwgc29tZQogICAgICogcnVsZXMgdHJhbnNpdGlvbiBhdCBsb2NhbCBzdGFuZGFyZCB0aW1lLCBhbmQgc29tZSBhdCBhIHNwZWNpZmljCiAgICAgKiBVVEMgdGltZS4gIEFsdGhvdWdoIGl0IG1pZ2h0IHNlZW0gdGhhdCBhbGwgdGltZXMgY291bGQgYmUKICAgICAqIGNvbnZlcnRlZCB0byB3YWxsIHRpbWUsIHRodXMgZWxpbWluYXRpbmcgdGhlIG5lZWQgZm9yIHRoaXMKICAgICAqIHBhcmFtZXRlciwgdGhpcyBpcyBub3QgdGhlIGNhc2UuCiAgICAgKi8KICAgIGVudW0gVGltZU1vZGUgewogICAgICAgIFdBTExfVElNRSA9IDAsCiAgICAgICAgU1RBTkRBUkRfVElNRSwKICAgICAgICBVVENfVElNRQogICAgfTsKCiAgICAvKioKICAgICAqIENvcHkgY29uc3RydWN0b3IKICAgICAqIEBzdGFibGUKICAgICAqLwogICAgU2ltcGxlVGltZVpvbmUoY29uc3QgU2ltcGxlVGltZVpvbmUmIHNvdXJjZSk7CgogICAgLyoqCiAgICAgKiBEZWZhdWx0IGFzc2lnbm1lbnQgb3BlcmF0b3IKICAgICAqIEBzdGFibGUKICAgICAqLwogICAgU2ltcGxlVGltZVpvbmUmIG9wZXJhdG9yPShjb25zdCBTaW1wbGVUaW1lWm9uZSYgcmlnaHQpOwoKICAgIC8qKgogICAgICogRGVzdHJ1Y3RvcgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2aXJ0dWFsIH5TaW1wbGVUaW1lWm9uZSgpOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gVGltZVpvbmUgb2JqZWN0cyBhcmUgZXF1YWw7IHRoYXQgaXMsIHRoZXkgaGF2ZQogICAgICogdGhlIHNhbWUgSUQsIHJhdyBHTVQgb2Zmc2V0LCBhbmQgRFNUIHJ1bGVzLgogICAgICoKICAgICAqIEBwYXJhbSB0aGF0ICBUaGUgU2ltcGxlVGltZVpvbmUgb2JqZWN0IHRvIGJlIGNvbXBhcmVkIHdpdGguCiAgICAgKiBAcmV0dXJuICAgICAgVHJ1ZSBpZiB0aGUgZ2l2ZW4gdGltZSB6b25lIGlzIGVxdWFsIHRvIHRoaXMgdGltZSB6b25lOyBmYWxzZQogICAgICogICAgICAgICAgICAgIG90aGVyd2lzZS4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdmlydHVhbCBVQm9vbCBvcGVyYXRvcj09KGNvbnN0IFRpbWVab25lJiB0aGF0KSBjb25zdDsKCiAgICAvKioKICAgICAqIENvbnN0cnVjdHMgYSBTaW1wbGVUaW1lWm9uZSB3aXRoIHRoZSBnaXZlbiByYXcgR01UIG9mZnNldCBhbmQgdGltZSB6b25lIElELAogICAgICogYW5kIHdoaWNoIGRvZXNuJ3Qgb2JzZXJ2ZSBkYXlsaWdodCBzYXZpbmdzIHRpbWUuICBOb3JtYWxseSB5b3Ugc2hvdWxkIHVzZQogICAgICogVGltZVpvbmU6OmNyZWF0ZUluc3RhbmNlKCkgdG8gY3JlYXRlIGEgVGltZVpvbmUgaW5zdGVhZCBvZiBjcmVhdGluZyBhCiAgICAgKiBTaW1wbGVUaW1lWm9uZSBkaXJlY3RseSB3aXRoIHRoaXMgY29uc3RydWN0b3IuCiAgICAgKgogICAgICogQHBhcmFtIHJhd09mZnNldCAgVGhlIGdpdmVuIGJhc2UgdGltZSB6b25lIG9mZnNldCB0byBHTVQuCiAgICAgKiBAcGFyYW0gSUQgICAgICAgICBUaGUgdGltZXpvbmUgSUQgd2hpY2ggaXMgb2J0YWluZWQgZnJvbQogICAgICogICAgICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0QXZhaWxhYmxlSURzLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBTaW1wbGVUaW1lWm9uZShpbnQzMl90IHJhd09mZnNldCwgY29uc3QgVW5pY29kZVN0cmluZyYgSUQpOwoKICAgIC8qKgogICAgICogQ29uc3RydWN0IGEgU2ltcGxlVGltZVpvbmUgd2l0aCB0aGUgZ2l2ZW4gcmF3IEdNVCBvZmZzZXQsIHRpbWUgem9uZSBJRCwKICAgICAqIGFuZCB0aW1lcyB0byBzdGFydCBhbmQgZW5kIGRheWxpZ2h0IHNhdmluZ3MgdGltZS4gVG8gY3JlYXRlIGEgVGltZVpvbmUgdGhhdAogICAgICogZG9lc24ndCBvYnNlcnZlIGRheWxpZ2h0IHNhdmluZ3MgdGltZSwgZG9uJ3QgdXNlIHRoaXMgY29uc3RydWN0b3I7IHVzZSAKICAgICAqIFNpbXBsZVRpbWVab25lKHJhd09mZnNldCwgSUQpIGluc3RlYWQuIE5vcm1hbGx5LCB5b3Ugc2hvdWxkIHVzZQogICAgICogVGltZVpvbmUuY3JlYXRlSW5zdGFuY2UoKSB0byBjcmVhdGUgYSBUaW1lWm9uZSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEKICAgICAqIFNpbXBsZVRpbWVab25lIGRpcmVjdGx5IHdpdGggdGhpcyBjb25zdHJ1Y3Rvci4KICAgICAqIDxQPgogICAgICogVmFyaW91cyB0eXBlcyBvZiBkYXlsaWdodC1zYXZpbmdzIHRpbWUgcnVsZXMgY2FuIGJlIHNwZWNmaWVkIGJ5IHVzaW5nIGRpZmZlcmVudAogICAgICogdmFsdWVzIGZvciBzdGFydERheSBhbmQgc3RhcnREYXlPZldlZWsgYW5kIGVuZERheSBhbmQgZW5kRGF5T2ZXZWVrLiAgRm9yIGEKICAgICAqIGNvbXBsZXRlIGV4cGxhbmF0aW9uIG9mIGhvdyB0aGVzZSBwYXJhbWV0ZXJzIHdvcmssIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKICAgICAqIHNldFN0YXJ0UnVsZSgpLgogICAgICoKICAgICAqIEBwYXJhbSByYXdPZmZzZXQgICAgICAgVGhlIG5ldyBTaW1wbGVUaW1lWm9uZSdzIHJhdyBHTVQgb2Zmc2V0CiAgICAgKiBAcGFyYW0gSUQgICAgICAgICAgICAgIFRoZSBuZXcgU2ltcGxlVGltZVpvbmUncyB0aW1lIHpvbmUgSUQuCiAgICAgKiBAcGFyYW0gc3RhcnRNb250aCAgICAgIFRoZSBkYXlsaWdodCBzYXZpbmdzIHN0YXJ0aW5nIG1vbnRoLiBNb250aCBpcwogICAgICogICAgICAgICAgICAgICAgICAgICAgICAwLWJhc2VkLiBlZywgMCBmb3IgSmFudWFyeS4KICAgICAqIEBwYXJhbSBzdGFydERheSAgICAgICAgVGhlIGRheWxpZ2h0IHNhdmluZ3Mgc3RhcnRpbmcKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgZGF5LW9mLXdlZWstaW4tbW9udGguIFNlZSBzZXRTdGFydFJ1bGUoKSBmb3IgYQogICAgICogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSBleHBsYW5hdGlvbi4KICAgICAqIEBwYXJhbSBzdGFydERheU9mV2VlayAgVGhlIGRheWxpZ2h0IHNhdmluZ3Mgc3RhcnRpbmcgZGF5LW9mLXdlZWsuIFNlZSBzZXRTdGFydFJ1bGUoKQogICAgICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgYSBjb21wbGV0ZSBleHBsYW5hdGlvbi4KICAgICAqIEBwYXJhbSBzdGFydFRpbWUgICAgICAgVGhlIGRheWxpZ2h0IHNhdmluZ3Mgc3RhcnRpbmcgdGltZSwgZXhwcmVzc2VkIGFzIHRoZQogICAgICogICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGFmdGVyIG1pZG5pZ2h0LgogICAgICogQHBhcmFtIHN0YXJ0VGltZU1vZGUgICBXaGV0aGVyIHRoZSBzdGFydCB0aW1lIGlzIGxvY2FsIHdhbGwgdGltZSwgbG9jYWwKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQgdGltZSwgb3IgVVRDIHRpbWUuIERlZmF1bHQgaXMgbG9jYWwgd2FsbCB0aW1lLgogICAgICogQHBhcmFtIGVuZE1vbnRoICAgICAgICBUaGUgZGF5bGlnaHQgc2F2aW5ncyBlbmRpbmcgbW9udGguIE1vbnRoIGlzCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIDAtYmFzZWQuIGVnLCAwIGZvciBKYW51YXJ5LgogICAgICogQHBhcmFtIGVuZERheSAgICAgICAgICBUaGUgZGF5bGlnaHQgc2F2aW5ncyBlbmRpbmcgZGF5LW9mLXdlZWstaW4tbW9udGguCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBzZXRTdGFydFJ1bGUoKSBmb3IgYSBjb21wbGV0ZSBleHBsYW5hdGlvbi4KICAgICAqIEBwYXJhbSBlbmREYXlPZldlZWsgICAgVGhlIGRheWxpZ2h0IHNhdmluZ3MgZW5kaW5nIGRheS1vZi13ZWVrLiBTZWUgc2V0U3RhcnRSdWxlKCkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGEgY29tcGxldGUgZXhwbGFuYXRpb24uCiAgICAgKiBAcGFyYW0gZW5kVGltZSAgICAgICAgIFRoZSBkYXlsaWdodCBzYXZpbmdzIGVuZGluZyB0aW1lLCBleHByZXNzZWQgYXMgdGhlCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYWZ0ZXIgbWlkbmlnaHQuCiAgICAgKiBAcGFyYW0gZW5kVGltZU1vZGUgICAgIFdoZXRoZXIgdGhlIGVuZCB0aW1lIGlzIGxvY2FsIHdhbGwgdGltZSwgbG9jYWwKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQgdGltZSwgb3IgVVRDIHRpbWUuIERlZmF1bHQgaXMgbG9jYWwgd2FsbCB0aW1lLgogICAgICogQHBhcmFtIGRzdFNhdmluZ3MgICAgICBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBhZGRlZCB0byBzdGFuZGFyZCB0aW1lCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIGdldCBEU1QgdGltZS4gRGVmYXVsdCBpcyBvbmUgaG91ci4KICAgICAqIEBwYXJhbSBzdGF0dXMgICAgICAgICAgQW4gVUVycm9yQ29kZSB0byByZWNlaXZlIHRoZSBzdGF0dXMuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIFNpbXBsZVRpbWVab25lKGludDMyX3QgcmF3T2Zmc2V0LCBjb25zdCBVbmljb2RlU3RyaW5nJiBJRCwKICAgICAgICBpbnQ4X3Qgc3RhcnRNb250aCwgaW50OF90IHN0YXJ0RGF5T2ZXZWVrSW5Nb250aCwKICAgICAgICBpbnQ4X3Qgc3RhcnREYXlPZldlZWssIGludDMyX3Qgc3RhcnRUaW1lLAogICAgICAgIGludDhfdCBlbmRNb250aCwgaW50OF90IGVuZERheU9mV2Vla0luTW9udGgsCiAgICAgICAgaW50OF90IGVuZERheU9mV2VlaywgaW50MzJfdCBlbmRUaW1lLAogICAgICAgIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgU2ltcGxlVGltZVpvbmUoaW50MzJfdCByYXdPZmZzZXQsIGNvbnN0IFVuaWNvZGVTdHJpbmcmIElELAogICAgICAgIGludDhfdCBzdGFydE1vbnRoLCBpbnQ4X3Qgc3RhcnREYXlPZldlZWtJbk1vbnRoLAogICAgICAgIGludDhfdCBzdGFydERheU9mV2VlaywgaW50MzJfdCBzdGFydFRpbWUsCiAgICAgICAgaW50OF90IGVuZE1vbnRoLCBpbnQ4X3QgZW5kRGF5T2ZXZWVrSW5Nb250aCwKICAgICAgICBpbnQ4X3QgZW5kRGF5T2ZXZWVrLCBpbnQzMl90IGVuZFRpbWUsCiAgICAgICAgaW50MzJfdCBkc3RTYXZpbmdzLCBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIFNpbXBsZVRpbWVab25lKGludDMyX3QgcmF3T2Zmc2V0LCBjb25zdCBVbmljb2RlU3RyaW5nJiBJRCwKICAgICAgICBpbnQ4X3Qgc3RhcnRNb250aCwgaW50OF90IHN0YXJ0RGF5T2ZXZWVrSW5Nb250aCwKICAgICAgICBpbnQ4X3Qgc3RhcnREYXlPZldlZWssIGludDMyX3Qgc3RhcnRUaW1lLCBUaW1lTW9kZSBzdGFydFRpbWVNb2RlLAogICAgICAgIGludDhfdCBlbmRNb250aCwgaW50OF90IGVuZERheU9mV2Vla0luTW9udGgsCiAgICAgICAgaW50OF90IGVuZERheU9mV2VlaywgaW50MzJfdCBlbmRUaW1lLCBUaW1lTW9kZSBlbmRUaW1lTW9kZSwKICAgICAgICBpbnQzMl90IGRzdFNhdmluZ3MsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBkYXlsaWdodCBzYXZpbmdzIHN0YXJ0aW5nIHllYXIsIHRoYXQgaXMsIHRoZSB5ZWFyIHRoaXMgdGltZSB6b25lIGJlZ2FuCiAgICAgKiBvYnNlcnZpbmcgaXRzIHNwZWNpZmllZCBkYXlsaWdodCBzYXZpbmdzIHRpbWUgcnVsZXMuICBUaGUgdGltZSB6b25lIGlzIGNvbnNpZGVyZWQKICAgICAqIG5vdCB0byBvYnNlcnZlIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBwcmlvciB0byB0aGF0IHllYXI7IFNpbXBsZVRpbWVab25lIGRvZXNuJ3QKICAgICAqIHN1cHBvcnQgaGlzdG9yaWNhbCBkYXlsaWdodC1zYXZpbmdzLXRpbWUgcnVsZXMuCiAgICAgKiBAcGFyYW0geWVhciB0aGUgZGF5bGlnaHQgc2F2aW5ncyBzdGFydGluZyB5ZWFyLgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2b2lkIHNldFN0YXJ0WWVhcihpbnQzMl90IHllYXIpOwoKICAgIC8qKgogICAgICogU2V0cyB0aGUgZGF5bGlnaHQgc2F2aW5ncyBzdGFydGluZyBydWxlLiBGb3IgZXhhbXBsZSwgaW4gdGhlIFUuUy4sIERheWxpZ2h0IFNhdmluZ3MKICAgICAqIFRpbWUgc3RhcnRzIGF0IHRoZSBmaXJzdCBTdW5kYXkgaW4gQXByaWwsIGF0IDIgQU0gaW4gc3RhbmRhcmQgdGltZS4KICAgICAqIFRoZXJlZm9yZSwgeW91IGNhbiBzZXQgdGhlIHN0YXJ0IHJ1bGUgYnkgY2FsbGluZzoKICAgICAqIHNldFN0YXJ0UnVsZShUaW1lRmllbGRzLkFQUklMLCAxLCBUaW1lRmllbGRzLlNVTkRBWSwgMio2MCo2MCoxMDAwKTsKICAgICAqIFRoZSBkYXlPZldlZWtJbk1vbnRoIGFuZCBkYXlPZldlZWsgcGFyYW1ldGVycyB0b2dldGhlciBzcGVjaWZ5IGhvdyB0byBjYWxjdWxhdGUKICAgICAqIHRoZSBleGFjdCBzdGFydGluZyBkYXRlLiAgVGhlaXIgZXhhY3QgbWVhbmluZyBkZXBlbmQgb24gdGhlaXIgcmVzcGVjdGl2ZSBzaWducywKICAgICAqIGFsbG93aW5nIHZhcmlvdXMgdHlwZXMgb2YgcnVsZXMgdG8gYmUgY29uc3RydWN0ZWQsIGFzIGZvbGxvd3M6PHVsPgogICAgICogICA8bGk+SWYgYm90aCBkYXlPZldlZWtJbk1vbnRoIGFuZCBkYXlPZldlZWsgYXJlIHBvc2l0aXZlLCB0aGV5IHNwZWNpZnkgdGhlCiAgICAgKiAgICAgICBkYXkgb2Ygd2VlayBpbiB0aGUgbW9udGggKGUuZy4sICgyLCBXRURORVNEQVkpIGlzIHRoZSBzZWNvbmQgV2VkbmVzZGF5CiAgICAgKiAgICAgICBvZiB0aGUgbW9udGgpLgogICAgICogICA8bGk+SWYgZGF5T2ZXZWVrIGlzIHBvc2l0aXZlIGFuZCBkYXlPZldlZWtJbk1vbnRoIGlzIG5lZ2F0aXZlLCB0aGV5IHNwZWNpZnkKICAgICAqICAgICAgIHRoZSBkYXkgb2Ygd2VlayBpbiB0aGUgbW9udGggY291bnRpbmcgYmFja3dhcmQgZnJvbSB0aGUgZW5kIG9mIHRoZSBtb250aC4KICAgICAqICAgICAgIChlLmcuLCAoLTEsIE1PTkRBWSkgaXMgdGhlIGxhc3QgTW9uZGF5IGluIHRoZSBtb250aCkKICAgICAqICAgPGxpPklmIGRheU9mV2VlayBpcyB6ZXJvIGFuZCBkYXlPZldlZWtJbk1vbnRoIGlzIHBvc2l0aXZlLCBkYXlPZldlZWtJbk1vbnRoCiAgICAgKiAgICAgICBzcGVjaWZpZXMgdGhlIGRheSBvZiB0aGUgbW9udGgsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBkYXkgb2YgdGhlIHdlZWsgaXQgaXMuCiAgICAgKiAgICAgICAoZS5nLiwgKDEwLCAwKSBpcyB0aGUgdGVudGggZGF5IG9mIHRoZSBtb250aCkKICAgICAqICAgPGxpPklmIGRheU9mV2VlayBpcyB6ZXJvIGFuZCBkYXlPZldlZWtJbk1vbnRoIGlzIG5lZ2F0aXZlLCBkYXlPZldlZWtJbk1vbnRoCiAgICAgKiAgICAgICBzcGVjaWZpZXMgdGhlIGRheSBvZiB0aGUgbW9udGggY291bnRpbmcgYmFja3dhcmQgZnJvbSB0aGUgZW5kIG9mIHRoZQogICAgICogICAgICAgbW9udGgsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBkYXkgb2YgdGhlIHdlZWsgaXQgaXMgKGUuZy4sICgtMiwgMCkgaXMgdGhlCiAgICAgKiAgICAgICBuZXh0LXRvLWxhc3QgZGF5IG9mIHRoZSBtb250aCkuCiAgICAgKiAgIDxsaT5JZiBkYXlPZldlZWsgaXMgbmVnYXRpdmUgYW5kIGRheU9mV2Vla0luTW9udGggaXMgcG9zaXRpdmUsIHRoZXkgc3BlY2lmeSB0aGUKICAgICAqICAgICAgIGZpcnN0IHNwZWNpZmllZCBkYXkgb2YgdGhlIHdlZWsgb24gb3IgYWZ0ZXIgdGhlIHNwZWNmaWVkIGRheSBvZiB0aGUgbW9udGguCiAgICAgKiAgICAgICAoZS5nLiwgKDE1LCAtU1VOREFZKSBpcyB0aGUgZmlyc3QgU3VuZGF5IGFmdGVyIHRoZSAxNXRoIG9mIHRoZSBtb250aAogICAgICogICAgICAgW29yIHRoZSAxNXRoIGl0c2VsZiBpZiB0aGUgMTV0aCBpcyBhIFN1bmRheV0uKQogICAgICogICA8bGk+SWYgZGF5T2ZXZWVrIGFuZCBEYXlPZldlZWtJbk1vbnRoIGFyZSBib3RoIG5lZ2F0aXZlLCB0aGV5IHNwZWNpZnkgdGhlCiAgICAgKiAgICAgICBsYXN0IHNwZWNpZmllZCBkYXkgb2YgdGhlIHdlZWsgb24gb3IgYmVmb3JlIHRoZSBzcGVjaWZpZWQgZGF5IG9mIHRoZSBtb250aC4KICAgICAqICAgICAgIChlLmcuLCAoLTIwLCAtVFVFU0RBWSkgaXMgdGhlIGxhc3QgVHVlc2RheSBiZWZvcmUgdGhlIDIwdGggb2YgdGhlIG1vbnRoCiAgICAgKiAgICAgICBbb3IgdGhlIDIwdGggaXRzZWxmIGlmIHRoZSAyMHRoIGlzIGEgVHVlc2RheV0uKTwvdWw+CiAgICAgKiBAcGFyYW0gbW9udGggdGhlIGRheWxpZ2h0IHNhdmluZ3Mgc3RhcnRpbmcgbW9udGguIE1vbnRoIGlzIDAtYmFzZWQuCiAgICAgKiBlZywgMCBmb3IgSmFudWFyeS4KICAgICAqIEBwYXJhbSBkYXlPZldlZWtJbk1vbnRoIHRoZSBkYXlsaWdodCBzYXZpbmdzIHN0YXJ0aW5nCiAgICAgKiBkYXktb2Ytd2Vlay1pbi1tb250aC4gUGxlYXNlIHNlZSB0aGUgbWVtYmVyIGRlc2NyaXB0aW9uIGZvciBhbiBleGFtcGxlLgogICAgICogQHBhcmFtIGRheU9mV2VlayB0aGUgZGF5bGlnaHQgc2F2aW5ncyBzdGFydGluZyBkYXktb2Ytd2Vlay4gUGxlYXNlIHNlZQogICAgICogdGhlIG1lbWJlciBkZXNjcmlwdGlvbiBmb3IgYW4gZXhhbXBsZS4KICAgICAqIEBwYXJhbSB0aW1lIHRoZSBkYXlsaWdodCBzYXZpbmdzIHN0YXJ0aW5nIHRpbWUuIFBsZWFzZSBzZWUgdGhlIG1lbWJlcgogICAgICogZGVzY3JpcHRpb24gZm9yIGFuIGV4YW1wbGUuCiAgICAgKiBAcGFyYW0gbW9kZSB3aGV0aGVyIHRoZSB0aW1lIGlzIGxvY2FsIHdhbGwgdGltZSwgbG9jYWwgc3RhbmRhcmQgdGltZSwKICAgICAqIG9yIFVUQyB0aW1lLiBEZWZhdWx0IGlzIGxvY2FsIHdhbGwgdGltZS4KICAgICAqIEBwYXJhbSBzdGF0dXMgQW4gVUVycm9yQ29kZQogICAgICogQHN0YWJsZQogICAgICovCiAgICB2b2lkIHNldFN0YXJ0UnVsZShpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheU9mV2Vla0luTW9udGgsIGludDMyX3QgZGF5T2ZXZWVrLAogICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lLCBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIHZvaWQgc2V0U3RhcnRSdWxlKGludDMyX3QgbW9udGgsIGludDMyX3QgZGF5T2ZXZWVrSW5Nb250aCwgaW50MzJfdCBkYXlPZldlZWssCiAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRpbWUsIFRpbWVNb2RlIG1vZGUsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBEU1Qgc3RhcnQgcnVsZSB0byBhIGZpeGVkIGRhdGUgd2l0aGluIGEgbW9udGguCiAgICAgKgogICAgICogQHBhcmFtIG1vbnRoICAgICAgICAgVGhlIG1vbnRoIGluIHdoaWNoIHRoaXMgcnVsZSBvY2N1cnMgKDAtYmFzZWQpLgogICAgICogQHBhcmFtIGRheU9mTW9udGggICAgVGhlIGRhdGUgaW4gdGhhdCBtb250aCAoMS1iYXNlZCkuCiAgICAgKiBAcGFyYW0gdGltZSAgICAgICAgICBUaGUgdGltZSBvZiB0aGF0IGRheSAobnVtYmVyIG9mIG1pbGxpcyBhZnRlciBtaWRuaWdodCkKICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdoZW4gRFNUIHRha2VzIGVmZmVjdCBpbiBsb2NhbCB3YWxsIHRpbWUsIHdoaWNoIGlzCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCB0aW1lIGluIHRoaXMgY2FzZS4KICAgICAqIEBwYXJhbSBtb2RlIHdoZXRoZXIgdGhlIHRpbWUgaXMgbG9jYWwgd2FsbCB0aW1lLCBsb2NhbCBzdGFuZGFyZCB0aW1lLAogICAgICogb3IgVVRDIHRpbWUuIERlZmF1bHQgaXMgbG9jYWwgd2FsbCB0aW1lLgogICAgICogQHBhcmFtIHN0YXR1cyBBbiBVRXJyb3JDb2RlCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZvaWQgc2V0U3RhcnRSdWxlKGludDMyX3QgbW9udGgsIGludDMyX3QgZGF5T2ZNb250aCwgaW50MzJfdCB0aW1lLCAKICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgdm9pZCBzZXRTdGFydFJ1bGUoaW50MzJfdCBtb250aCwgaW50MzJfdCBkYXlPZk1vbnRoLCBpbnQzMl90IHRpbWUsIAogICAgICAgICAgICAgICAgICAgICAgVGltZU1vZGUgbW9kZSwgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICAvKioKICAgICAqIFNldHMgdGhlIERTVCBzdGFydCBydWxlIHRvIGEgd2Vla2RheSBiZWZvcmUgb3IgYWZ0ZXIgYSBnaXZlIGRhdGUgd2l0aGluCiAgICAgKiBhIG1vbnRoLCBlLmcuLCB0aGUgZmlyc3QgTW9uZGF5IG9uIG9yIGFmdGVyIHRoZSA4dGguCiAgICAgKgogICAgICogQHBhcmFtIG1vbnRoICAgICAgICAgVGhlIG1vbnRoIGluIHdoaWNoIHRoaXMgcnVsZSBvY2N1cnMgKDAtYmFzZWQpLgogICAgICogQHBhcmFtIGRheU9mTW9udGggICAgQSBkYXRlIHdpdGhpbiB0aGF0IG1vbnRoICgxLWJhc2VkKS4KICAgICAqIEBwYXJhbSBkYXlPZldlZWsgICAgIFRoZSBkYXkgb2YgdGhlIHdlZWsgb24gd2hpY2ggdGhpcyBydWxlIG9jY3Vycy4KICAgICAqIEBwYXJhbSB0aW1lICAgICAgICAgIFRoZSB0aW1lIG9mIHRoYXQgZGF5IChudW1iZXIgb2YgbWlsbGlzIGFmdGVyIG1pZG5pZ2h0KQogICAgICogICAgICAgICAgICAgICAgICAgICAgd2hlbiBEU1QgdGFrZXMgZWZmZWN0IGluIGxvY2FsIHdhbGwgdGltZSwgd2hpY2ggaXMKICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkIHRpbWUgaW4gdGhpcyBjYXNlLgogICAgICogQHBhcmFtIG1vZGUgd2hldGhlciB0aGUgdGltZSBpcyBsb2NhbCB3YWxsIHRpbWUsIGxvY2FsIHN0YW5kYXJkIHRpbWUsCiAgICAgKiBvciBVVEMgdGltZS4gRGVmYXVsdCBpcyBsb2NhbCB3YWxsIHRpbWUuCiAgICAgKiBAcGFyYW0gYWZ0ZXIgICAgICAgICBJZiB0cnVlLCB0aGlzIHJ1bGUgc2VsZWN0cyB0aGUgZmlyc3QgZGF5T2ZXZWVrIG9uCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvciBhZnRlciBkYXlPZk1vbnRoLiAgSWYgZmFsc2UsIHRoaXMgcnVsZSBzZWxlY3RzCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgbGFzdCBkYXlPZldlZWsgb24gb3IgYmVmb3JlIGRheU9mTW9udGguCiAgICAgKiBAcGFyYW0gc3RhdHVzIEFuIFVFcnJvckNvZGUKICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdm9pZCBzZXRTdGFydFJ1bGUoaW50MzJfdCBtb250aCwgaW50MzJfdCBkYXlPZk1vbnRoLCBpbnQzMl90IGRheU9mV2VlaywgCiAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRpbWUsIFVCb29sIGFmdGVyLCBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIHZvaWQgc2V0U3RhcnRSdWxlKGludDMyX3QgbW9udGgsIGludDMyX3QgZGF5T2ZNb250aCwgaW50MzJfdCBkYXlPZldlZWssIAogICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lLCBUaW1lTW9kZSBtb2RlLCBVQm9vbCBhZnRlciwgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICAvKioKICAgICAqIFNldHMgdGhlIGRheWxpZ2h0IHNhdmluZ3MgZW5kaW5nIHJ1bGUuIEZvciBleGFtcGxlLCBpbiB0aGUgVS5TLiwgRGF5bGlnaHQKICAgICAqIFNhdmluZ3MgVGltZSBlbmRzIGF0IHRoZSBsYXN0ICgtMSkgU3VuZGF5IGluIE9jdG9iZXIsIGF0IDIgQU0gaW4gc3RhbmRhcmQgdGltZS4KICAgICAqIFRoZXJlZm9yZSwgeW91IGNhbiBzZXQgdGhlIGVuZCBydWxlIGJ5IGNhbGxpbmc6CiAgICAgKiA8cHJlPgogICAgICogLiAgIHNldEVuZFJ1bGUoVGltZUZpZWxkcy5PQ1RPQkVSLCAtMSwgVGltZUZpZWxkcy5TVU5EQVksIDIqNjAqNjAqMTAwMCk7CiAgICAgKiA8L3ByZT4KICAgICAqIFZhcmlvdXMgb3RoZXIgdHlwZXMgb2YgcnVsZXMgY2FuIGJlIHNwZWNpZmllZCBieSBtYW5pcHVsYXRpbmcgdGhlIGRheU9mV2VlawogICAgICogYW5kIGRheU9mV2Vla0luTW9udGggcGFyYW1ldGVycy4gIEZvciBjb21wbGV0ZSBkZXRhaWxzLCBzZWUgdGhlIGRvY3VtZW50YXRpb24KICAgICAqIGZvciBzZXRTdGFydFJ1bGUoKS4KICAgICAqCiAgICAgKiBAcGFyYW0gbW9udGggdGhlIGRheWxpZ2h0IHNhdmluZ3MgZW5kaW5nIG1vbnRoLiBNb250aCBpcyAwLWJhc2VkLgogICAgICogZWcsIDAgZm9yIEphbnVhcnkuCiAgICAgKiBAcGFyYW0gZGF5T2ZXZWVrSW5Nb250aCB0aGUgZGF5bGlnaHQgc2F2aW5ncyBlbmRpbmcKICAgICAqIGRheS1vZi13ZWVrLWluLW1vbnRoLiBTZWUgc2V0U3RhcnRSdWxlKCkgZm9yIGEgY29tcGxldGUgZXhwbGFuYXRpb24uCiAgICAgKiBAcGFyYW0gZGF5T2ZXZWVrIHRoZSBkYXlsaWdodCBzYXZpbmdzIGVuZGluZyBkYXktb2Ytd2Vlay4gU2VlIHNldFN0YXJ0UnVsZSgpCiAgICAgKiBmb3IgYSBjb21wbGV0ZSBleHBsYW5hdGlvbi4KICAgICAqIEBwYXJhbSB0aW1lIHRoZSBkYXlsaWdodCBzYXZpbmdzIGVuZGluZyB0aW1lLiBQbGVhc2Ugc2VlIHRoZSBtZW1iZXIKICAgICAqIGRlc2NyaXB0aW9uIGZvciBhbiBleGFtcGxlLgogICAgICogQHBhcmFtIG1vZGUgd2hldGhlciB0aGUgdGltZSBpcyBsb2NhbCB3YWxsIHRpbWUsIGxvY2FsIHN0YW5kYXJkIHRpbWUsCiAgICAgKiBvciBVVEMgdGltZS4gRGVmYXVsdCBpcyBsb2NhbCB3YWxsIHRpbWUuCiAgICAgKiBAcGFyYW0gc3RhdHVzIEFuIFVFcnJvckNvZGUKICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdm9pZCBzZXRFbmRSdWxlKGludDMyX3QgbW9udGgsIGludDMyX3QgZGF5T2ZXZWVrSW5Nb250aCwgaW50MzJfdCBkYXlPZldlZWssCiAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lLCBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIHZvaWQgc2V0RW5kUnVsZShpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheU9mV2Vla0luTW9udGgsIGludDMyX3QgZGF5T2ZXZWVrLAogICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGltZSwgVGltZU1vZGUgbW9kZSwgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICAvKioKICAgICAqIFNldHMgdGhlIERTVCBlbmQgcnVsZSB0byBhIGZpeGVkIGRhdGUgd2l0aGluIGEgbW9udGguCiAgICAgKgogICAgICogQHBhcmFtIG1vbnRoICAgICAgICAgVGhlIG1vbnRoIGluIHdoaWNoIHRoaXMgcnVsZSBvY2N1cnMgKDAtYmFzZWQpLgogICAgICogQHBhcmFtIGRheU9mTW9udGggICAgVGhlIGRhdGUgaW4gdGhhdCBtb250aCAoMS1iYXNlZCkuCiAgICAgKiBAcGFyYW0gdGltZSAgICAgICAgICBUaGUgdGltZSBvZiB0aGF0IGRheSAobnVtYmVyIG9mIG1pbGxpcyBhZnRlciBtaWRuaWdodCkKICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdoZW4gRFNUIGVuZHMgaW4gbG9jYWwgd2FsbCB0aW1lLCB3aGljaCBpcyBkYXlsaWdodAogICAgICogICAgICAgICAgICAgICAgICAgICAgdGltZSBpbiB0aGlzIGNhc2UuCiAgICAgKiBAcGFyYW0gbW9kZSB3aGV0aGVyIHRoZSB0aW1lIGlzIGxvY2FsIHdhbGwgdGltZSwgbG9jYWwgc3RhbmRhcmQgdGltZSwKICAgICAqIG9yIFVUQyB0aW1lLiBEZWZhdWx0IGlzIGxvY2FsIHdhbGwgdGltZS4KICAgICAqIEBwYXJhbSBzdGF0dXMgQW4gVUVycm9yQ29kZQogICAgICogQHN0YWJsZQogICAgICovCiAgICB2b2lkIHNldEVuZFJ1bGUoaW50MzJfdCBtb250aCwgaW50MzJfdCBkYXlPZk1vbnRoLCBpbnQzMl90IHRpbWUsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgdm9pZCBzZXRFbmRSdWxlKGludDMyX3QgbW9udGgsIGludDMyX3QgZGF5T2ZNb250aCwgaW50MzJfdCB0aW1lLAogICAgICAgICAgICAgICAgICAgIFRpbWVNb2RlIG1vZGUsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBEU1QgZW5kIHJ1bGUgdG8gYSB3ZWVrZGF5IGJlZm9yZSBvciBhZnRlciBhIGdpdmUgZGF0ZSB3aXRoaW4KICAgICAqIGEgbW9udGgsIGUuZy4sIHRoZSBmaXJzdCBNb25kYXkgb24gb3IgYWZ0ZXIgdGhlIDh0aC4KICAgICAqCiAgICAgKiBAcGFyYW0gbW9udGggICAgICAgICBUaGUgbW9udGggaW4gd2hpY2ggdGhpcyBydWxlIG9jY3VycyAoMC1iYXNlZCkuCiAgICAgKiBAcGFyYW0gZGF5T2ZNb250aCAgICBBIGRhdGUgd2l0aGluIHRoYXQgbW9udGggKDEtYmFzZWQpLgogICAgICogQHBhcmFtIGRheU9mV2VlayAgICAgVGhlIGRheSBvZiB0aGUgd2VlayBvbiB3aGljaCB0aGlzIHJ1bGUgb2NjdXJzLgogICAgICogQHBhcmFtIHRpbWUgICAgICAgICAgVGhlIHRpbWUgb2YgdGhhdCBkYXkgKG51bWJlciBvZiBtaWxsaXMgYWZ0ZXIgbWlkbmlnaHQpCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aGVuIERTVCBlbmRzIGluIGxvY2FsIHdhbGwgdGltZSwgd2hpY2ggaXMgZGF5bGlnaHQKICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRpbWUgaW4gdGhpcyBjYXNlLgogICAgICogQHBhcmFtIG1vZGUgd2hldGhlciB0aGUgdGltZSBpcyBsb2NhbCB3YWxsIHRpbWUsIGxvY2FsIHN0YW5kYXJkIHRpbWUsCiAgICAgKiBvciBVVEMgdGltZS4gRGVmYXVsdCBpcyBsb2NhbCB3YWxsIHRpbWUuCiAgICAgKiBAcGFyYW0gYWZ0ZXIgICAgICAgICBJZiB0cnVlLCB0aGlzIHJ1bGUgc2VsZWN0cyB0aGUgZmlyc3QgZGF5T2ZXZWVrIG9uCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvciBhZnRlciBkYXlPZk1vbnRoLiAgSWYgZmFsc2UsIHRoaXMgcnVsZSBzZWxlY3RzCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgbGFzdCBkYXlPZldlZWsgb24gb3IgYmVmb3JlIGRheU9mTW9udGguCiAgICAgKiBAcGFyYW0gc3RhdHVzIEFuIFVFcnJvckNvZGUKICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdm9pZCBzZXRFbmRSdWxlKGludDMyX3QgbW9udGgsIGludDMyX3QgZGF5T2ZNb250aCwgaW50MzJfdCBkYXlPZldlZWssIAogICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGltZSwgVUJvb2wgYWZ0ZXIsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgdm9pZCBzZXRFbmRSdWxlKGludDMyX3QgbW9udGgsIGludDMyX3QgZGF5T2ZNb250aCwgaW50MzJfdCBkYXlPZldlZWssIAogICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGltZSwgVGltZU1vZGUgbW9kZSwgVUJvb2wgYWZ0ZXIsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBUaW1lWm9uZSdzIGFkanVzdGVkIEdNVCBvZmZzZXQgKGkuZS4sIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGFkZAogICAgICogdG8gR01UIHRvIGdldCBsb2NhbCB0aW1lIGluIHRoaXMgdGltZSB6b25lLCB0YWtpbmcgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIGludG8KICAgICAqIGFjY291bnQpIGFzIG9mIGEgcGFydGljdWxhciByZWZlcmVuY2UgZGF0ZS4gIFRoZSByZWZlcmVuY2UgZGF0ZSBpcyB1c2VkIHRvIGRldGVybWluZQogICAgICogd2hldGhlciBkYXlsaWdodCBzYXZpbmdzIHRpbWUgaXMgaW4gZWZmZWN0IGFuZCBuZWVkcyB0byBiZSBmaWd1cmVkIGludG8gdGhlIG9mZnNldAogICAgICogdGhhdCBpcyByZXR1cm5lZCAoaW4gb3RoZXIgd29yZHMsIHdoYXQgaXMgdGhlIGFkanVzdGVkIEdNVCBvZmZzZXQgaW4gdGhpcyB0aW1lIHpvbmUKICAgICAqIGF0IHRoaXMgcGFydGljdWxhciBkYXRlIGFuZCB0aW1lPykuICBGb3IgdGhlIHRpbWUgem9uZXMgcHJvZHVjZWQgYnkgY3JlYXRlVGltZVpvbmUoKSwKICAgICAqIHRoZSByZWZlcmVuY2UgZGF0YSBpcyBzcGVjaWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIsIGFuZCB0aGUgZGF0ZQogICAgICogYW5kIHRpbWUgZmllbGRzIGFyZSBpbiBHTVQsIE5PVCBsb2NhbCB0aW1lLgogICAgICoKICAgICAqIEBwYXJhbSBlcmEgICAgICAgIFRoZSByZWZlcmVuY2UgZGF0ZSdzIGVyYQogICAgICogQHBhcmFtIHllYXIgICAgICAgVGhlIHJlZmVyZW5jZSBkYXRlJ3MgeWVhcgogICAgICogQHBhcmFtIG1vbnRoICAgICAgVGhlIHJlZmVyZW5jZSBkYXRlJ3MgbW9udGggKDAtYmFzZWQ7IDAgaXMgSmFudWFyeSkKICAgICAqIEBwYXJhbSBkYXkgICAgICAgIFRoZSByZWZlcmVuY2UgZGF0ZSdzIGRheS1pbi1tb250aCAoMS1iYXNlZCkKICAgICAqIEBwYXJhbSBkYXlPZldlZWsgIFRoZSByZWZlcmVuY2UgZGF0ZSdzIGRheS1vZi13ZWVrICgxLWJhc2VkOyAxIGlzIFN1bmRheSkKICAgICAqIEBwYXJhbSBtaWxsaXMgICAgIFRoZSByZWZlcmVuY2UgZGF0ZSdzIG1pbGxpc2Vjb25kcyBpbiBkYXksIFVUVCAoTk9UIGxvY2FsIHRpbWUpLgogICAgICogQHJldHVybiAgICAgICAgICAgVGhlIG9mZnNldCBpbiBtaWxsaXNlY29uZHMgdG8gYWRkIHRvIEdNVCB0byBnZXQgbG9jYWwgdGltZS4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdmlydHVhbCBpbnQzMl90IGdldE9mZnNldCh1aW50OF90IGVyYSwgaW50MzJfdCB5ZWFyLCBpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXlPZldlZWssIGludDMyX3QgbWlsbGlzLCBVRXJyb3JDb2RlJiBzdGF0dXMpIGNvbnN0OwoKICAgIHZpcnR1YWwgaW50MzJfdCBnZXRPZmZzZXQodWludDhfdCBlcmEsIGludDMyX3QgeWVhciwgaW50MzJfdCBtb250aCwgaW50MzJfdCBkYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGF5T2ZXZWVrLCBpbnQzMl90IG1pbGxpcykgY29uc3Q7CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSB0aW1lIHpvbmUgb2Zmc2V0LCBmb3IgY3VycmVudCBkYXRlLCBtb2RpZmllZCBpbiBjYXNlIG9mCiAgICAgKiBkYXlsaWdodCBzYXZpbmdzLiBUaGlzIGlzIHRoZSBvZmZzZXQgdG8gYWRkICp0byogVVRDIHRvIGdldCBsb2NhbCB0aW1lLgogICAgICogQHBhcmFtIGVyYSB0aGUgZXJhIG9mIHRoZSBnaXZlbiBkYXRlLgogICAgICogQHBhcmFtIHllYXIgdGhlIHllYXIgaW4gdGhlIGdpdmVuIGRhdGUuCiAgICAgKiBAcGFyYW0gbW9udGggdGhlIG1vbnRoIGluIHRoZSBnaXZlbiBkYXRlLgogICAgICogTW9udGggaXMgMC1iYXNlZC4gZS5nLiwgMCBmb3IgSmFudWFyeS4KICAgICAqIEBwYXJhbSBkYXkgdGhlIGRheS1pbi1tb250aCBvZiB0aGUgZ2l2ZW4gZGF0ZS4KICAgICAqIEBwYXJhbSBkYXlPZldlZWsgdGhlIGRheS1vZi13ZWVrIG9mIHRoZSBnaXZlbiBkYXRlLgogICAgICogQHBhcmFtIG1pbGxpc2Vjb25kcyB0aGUgbWlsbGlzIGluIGRheSBpbiA8ZW0+c3RhbmRhcmQ8L2VtPiBsb2NhbCB0aW1lLgogICAgICogQHBhcmFtIG1vbnRoTGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIG1vbnRoIGluIGRheXMuCiAgICAgKiBAcGFyYW0gcHJldk1vbnRoTGVuZ3RoIGxlbmd0aCBvZiB0aGUgcHJldmlvdXMgbW9udGggaW4gZGF5cy4KICAgICAqIEByZXR1cm4gdGhlIG9mZnNldCB0byBhZGQgKnRvKiBHTVQgdG8gZ2V0IGxvY2FsIHRpbWUuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZpcnR1YWwgaW50MzJfdCBnZXRPZmZzZXQodWludDhfdCBlcmEsIGludDMyX3QgeWVhciwgaW50MzJfdCBtb250aCwgaW50MzJfdCBkYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGF5T2ZXZWVrLCBpbnQzMl90IG1pbGxpc2Vjb25kcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbW9udGhMZW5ndGgsIFVFcnJvckNvZGUmIHN0YXR1cykgY29uc3Q7CgogICAgdmlydHVhbCBpbnQzMl90IGdldE9mZnNldCh1aW50OF90IGVyYSwgaW50MzJfdCB5ZWFyLCBpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXlPZldlZWssIGludDMyX3QgbWlsbGlzZWNvbmRzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtb250aExlbmd0aCwgaW50MzJfdCBwcmV2TW9udGhMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmIHN0YXR1cykgY29uc3Q7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBUaW1lWm9uZSdzIHJhdyBHTVQgb2Zmc2V0IChpLmUuLCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBhZGQKICAgICAqIHRvIEdNVCB0byBnZXQgbG9jYWwgdGltZSwgYmVmb3JlIHRha2luZyBkYXlsaWdodCBzYXZpbmdzIHRpbWUgaW50byBhY2NvdW50KS4KICAgICAqCiAgICAgKiBAcmV0dXJuICAgVGhlIFRpbWVab25lJ3MgcmF3IEdNVCBvZmZzZXQuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZpcnR1YWwgaW50MzJfdCBnZXRSYXdPZmZzZXQodm9pZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBUaW1lWm9uZSdzIHJhdyBHTVQgb2Zmc2V0IChpLmUuLCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBhZGQKICAgICAqIHRvIEdNVCB0byBnZXQgbG9jYWwgdGltZSwgYmVmb3JlIHRha2luZyBkYXlsaWdodCBzYXZpbmdzIHRpbWUgaW50byBhY2NvdW50KS4KICAgICAqCiAgICAgKiBAcGFyYW0gb2Zmc2V0TWlsbGlzICBUaGUgbmV3IHJhdyBHTVQgb2Zmc2V0IGZvciB0aGlzIHRpbWUgem9uZS4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdmlydHVhbCB2b2lkIHNldFJhd09mZnNldChpbnQzMl90IG9mZnNldE1pbGxpcyk7CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBhbW91bnQgb2YgdGltZSBpbiBtcyB0aGF0IHRoZSBjbG9jayBpcyBhZHZhbmNlZCBkdXJpbmcgRFNULgogICAgICogQHBhcmFtIG1pbGxpc1NhdmVkRHVyaW5nRFNUIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoZSB0aW1lIGlzCiAgICAgKiBhZHZhbmNlZCB3aXRoIHJlc3BlY3QgdG8gc3RhbmRhcmQgdGltZSB3aGVuIHRoZSBkYXlsaWdodCBzYXZpbmdzIHJ1bGVzCiAgICAgKiBhcmUgaW4gZWZmZWN0LiBBIHBvc2l0aXZlIG51bWJlciwgdHlwaWNhbGx5IG9uZSBob3VyICgzNjAwMDAwKS4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdm9pZCBzZXREU1RTYXZpbmdzKGludDMyX3QgbWlsbGlzU2F2ZWREdXJpbmdEU1QsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgLyoqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICovCiAgICB2b2lkIHNldERTVFNhdmluZ3MoaW50MzJfdCBtaWxsaXNTYXZlZER1cmluZ0RTVCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBhbW91bnQgb2YgdGltZSBpbiBtcyB0aGF0IHRoZSBjbG9jayBpcyBhZHZhbmNlZCBkdXJpbmcgRFNULgogICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGUgdGltZSBpcwogICAgICogYWR2YW5jZWQgd2l0aCByZXNwZWN0IHRvIHN0YW5kYXJkIHRpbWUgd2hlbiB0aGUgZGF5bGlnaHQgc2F2aW5ncyBydWxlcwogICAgICogYXJlIGluIGVmZmVjdC4gQSBwb3NpdGl2ZSBudW1iZXIsIHR5cGljYWxseSBvbmUgaG91ciAoMzYwMDAwMCkuCiAgICAgKi8KICAgIGludDMyX3QgZ2V0RFNUU2F2aW5ncyh2b2lkKSBjb25zdDsKCiAgICAvKioKICAgICAqIFF1ZXJpZXMgaWYgdGhpcyBUaW1lWm9uZSB1c2VzIERheWxpZ2h0IFNhdmluZ3MgVGltZS4KICAgICAqCiAgICAgKiBAcmV0dXJuICAgVHJ1ZSBpZiB0aGlzIFRpbWVab25lIHVzZXMgRGF5bGlnaHQgU2F2aW5ncyBUaW1lOyBmYWxzZSBvdGhlcndpc2UuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZpcnR1YWwgVUJvb2wgdXNlRGF5bGlnaHRUaW1lKHZvaWQpIGNvbnN0OwoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBkYXRlIGlzIHdpdGhpbiB0aGUgcGVyaW9kIHdoZW4gZGF5bGlnaHQgc2F2aW5ncyB0aW1lCiAgICAgKiBpcyBpbiBlZmZlY3Q7IGZhbHNlIG90aGVyd2lzZS4gIElmIHRoZSBUaW1lWm9uZSBkb2Vzbid0IG9ic2VydmUgZGF5bGlnaHQgc2F2aW5ncwogICAgICogdGltZSwgdGhpcyBmdW5jdGlvbnMgYWx3YXlzIHJldHVybnMgZmFsc2UuCiAgICAgKiBAcGFyYW0gZGF0ZSBUaGUgZGF0ZSB0byB0ZXN0LgogICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBkYXRlIGlzIGluIERheWxpZ2h0IFNhdmluZ3MgVGltZTsKICAgICAqIGZhbHNlIG90aGVyd2lzZS4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdmlydHVhbCBVQm9vbCBpbkRheWxpZ2h0VGltZShVRGF0ZSBkYXRlLCBVRXJyb3JDb2RlJiBzdGF0dXMpIGNvbnN0OwoKICAgIC8qKgogICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyB6b25lIGhhcyB0aGUgc2FtZSBydWxlcyBhbmQgb2Zmc2V0IGFzIGFub3RoZXIgem9uZS4KICAgICAqIEBwYXJhbSBvdGhlciB0aGUgVGltZVpvbmUgb2JqZWN0IHRvIGJlIGNvbXBhcmVkIHdpdGgKICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gem9uZSBoYXMgdGhlIHNhbWUgcnVsZXMgYW5kIG9mZnNldCBhcyB0aGlzIG9uZQogICAgICogQHN0YWJsZQogICAgICovCiAgICBVQm9vbCBoYXNTYW1lUnVsZXMoY29uc3QgVGltZVpvbmUmIG90aGVyKSBjb25zdDsKCiAgICAvKioKICAgICAqIENsb25lcyBUaW1lWm9uZSBvYmplY3RzIHBvbHltb3JwaGljYWxseS4gQ2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nCiAgICAgKiB0aGUgVGltZVpvbmUgb2JqZWN0IGNsb25lZC4KICAgICAqCiAgICAgKiBAcmV0dXJuICAgQSBuZXcgY29weSBvZiB0aGlzIFRpbWVab25lIG9iamVjdC4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdmlydHVhbCBUaW1lWm9uZSogY2xvbmUodm9pZCkgY29uc3Q7CgpwdWJsaWM6CgogICAgLyoqCiAgICAgKiBPdmVycmlkZSBUaW1lWm9uZSBSZXR1cm5zIGEgdW5pcXVlIGNsYXNzIElEIFBPTFlNT1JQSElDQUxMWS4gUHVyZSB2aXJ0dWFsCiAgICAgKiBvdmVycmlkZS4gVGhpcyBtZXRob2QgaXMgdG8gaW1wbGVtZW50IGEgc2ltcGxlIHZlcnNpb24gb2YgUlRUSSwgc2luY2Ugbm90IGFsbCBDKysKICAgICAqIGNvbXBpbGVycyBzdXBwb3J0IGdlbnVpbmUgUlRUSS4gUG9seW1vcnBoaWMgb3BlcmF0b3I9PSgpIGFuZCBjbG9uZSgpIG1ldGhvZHMgY2FsbAogICAgICogdGhpcyBtZXRob2QuCiAgICAgKgogICAgICogQHJldHVybiAgIFRoZSBjbGFzcyBJRCBmb3IgdGhpcyBvYmplY3QuIEFsbCBvYmplY3RzIG9mIGEgZ2l2ZW4gY2xhc3MgaGF2ZSB0aGUKICAgICAqICAgICAgICAgICBzYW1lIGNsYXNzIElELiBPYmplY3RzIG9mIG90aGVyIGNsYXNzZXMgaGF2ZSBkaWZmZXJlbnQgY2xhc3MgSURzLgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2aXJ0dWFsIFVDbGFzc0lEIGdldER5bmFtaWNDbGFzc0lEKHZvaWQpIGNvbnN0IHsgcmV0dXJuIChVQ2xhc3NJRCkmZmdDbGFzc0lEOyB9CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIElEIGZvciB0aGlzIGNsYXNzLiBUaGlzIGlzIHVzZWZ1bCBvbmx5IGZvciBjb21wYXJpbmcgdG8gYSByZXR1cm4KICAgICAqIHZhbHVlIGZyb20gZ2V0RHluYW1pY0NsYXNzSUQoKS4gRm9yIGV4YW1wbGU6CiAgICAgKiA8cHJlPgogICAgICogLiAgIEJhc2UqIHBvbHltb3JwaGljX3BvaW50ZXIgPSBjcmVhdGVQb2x5bW9ycGhpY09iamVjdCgpOwogICAgICogLiAgIGlmIChwb2x5bW9ycGhpY19wb2ludGVyLT5nZXREeW5hbWljQ2xhc3NJRCgpID09CiAgICAgKiAuICAgICAgIERlcml2ZWQ6OmdldFN0YXRpY0NsYXNzSUQoKSkgLi4uCiAgICAgKiA8L3ByZT4KICAgICAqIEByZXR1cm4gICBUaGUgY2xhc3MgSUQgZm9yIGFsbCBvYmplY3RzIG9mIHRoaXMgY2xhc3MuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHN0YXRpYyBVQ2xhc3NJRCBnZXRTdGF0aWNDbGFzc0lEKHZvaWQpIHsgcmV0dXJuIChVQ2xhc3NJRCkmZmdDbGFzc0lEOyB9Cgpwcml2YXRlOgogICAgLyoqIAogICAgICogQ29uc3RhbnRzIHNwZWNpZnlpbmcgdmFsdWVzIG9mIHN0YXJ0TW9kZSBhbmQgZW5kTW9kZS4KICAgICAqLwogICAgZW51bSBFTW9kZQogICAgewogICAgICAgIERPTV9NT0RFID0gMSwKICAgICAgICBET1dfSU5fTU9OVEhfTU9ERSwKICAgICAgICBET1dfR0VfRE9NX01PREUsCiAgICAgICAgRE9XX0xFX0RPTV9NT0RFCiAgICB9OwoKICAgIGZyaWVuZCBjbGFzcyBUaW1lWm9uZTsgLy8gZm9yIGFjY2VzcyB0byB0aGVzZSAyIGNvbnN0cnVjdG9yczoKCiAgICAvKioKICAgICAqIENvbnN0cnVjdCBmcm9tIG1lbW9yeS1tYXBwZWQgZGF0YS4KICAgICAqLwogICAgU2ltcGxlVGltZVpvbmUoY29uc3QgU3RhbmRhcmRab25lJiBzdGRab25lLCBjb25zdCBVbmljb2RlU3RyaW5nJiBpZCk7CiAgICBTaW1wbGVUaW1lWm9uZShjb25zdCBEU1Rab25lJiBkc3Rab25lLCBjb25zdCBVbmljb2RlU3RyaW5nJiBpZCk7CgogICAgLyoqCiAgICAgKiBJbnRlcm5hbCBjb25zdHJ1Y3Rpb24gbWV0aG9kLgogICAgICovCiAgICB2b2lkIGNvbnN0cnVjdChpbnQzMl90IHJhd09mZnNldCwgY29uc3QgVW5pY29kZVN0cmluZyYgSUQsCiAgICAgICAgICAgICAgICAgICBpbnQ4X3Qgc3RhcnRNb250aCwgaW50OF90IHN0YXJ0RGF5LCBpbnQ4X3Qgc3RhcnREYXlPZldlZWssCiAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0VGltZSwgVGltZU1vZGUgc3RhcnRUaW1lTW9kZSwKICAgICAgICAgICAgICAgICAgIGludDhfdCBlbmRNb250aCwgaW50OF90IGVuZERheSwgaW50OF90IGVuZERheU9mV2VlaywKICAgICAgICAgICAgICAgICAgIGludDMyX3QgZW5kVGltZSwgVGltZU1vZGUgZW5kVGltZU1vZGUsCiAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdFNhdmluZ3MsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgLyoqCiAgICAgKiBDb21wYXJlIGEgZ2l2ZW4gZGF0ZSBpbiB0aGUgeWVhciB0byBhIHJ1bGUuIFJldHVybiAxLCAwLCBvciAtMSwgZGVwZW5kaW5nCiAgICAgKiBvbiB3aGV0aGVyIHRoZSBkYXRlIGlzIGFmdGVyLCBlcXVhbCB0bywgb3IgYmVmb3JlIHRoZSBydWxlIGRhdGUuIFRoZQogICAgICogbWlsbGlzIGFyZSBjb21wYXJlZCBkaXJlY3RseSBhZ2FpbnN0IHRoZSBydWxlTWlsbGlzLCBzbyBhbnkKICAgICAqIHN0YW5kYXJkLWRheWxpZ2h0IGFkanVzdG1lbnRzIG11c3QgYmUgaGFuZGxlZCBieSB0aGUgY2FsbGVyLgogICAgICoKICAgICAqIEByZXR1cm4gIDEgaWYgdGhlIGRhdGUgaXMgYWZ0ZXIgdGhlIHJ1bGUgZGF0ZSwgLTEgaWYgdGhlIGRhdGUgaXMgYmVmb3JlCiAgICAgKiAgICAgICAgICB0aGUgcnVsZSBkYXRlLCBvciAwIGlmIHRoZSBkYXRlIGlzIGVxdWFsIHRvIHRoZSBydWxlIGRhdGUuCiAgICAgKi8KICAgIHN0YXRpYyBpbnQzMl90IGNvbXBhcmVUb1J1bGUoaW50OF90IG1vbnRoLCBpbnQ4X3QgbW9udGhMZW4sIGludDhfdCBwcmV2TW9udGhMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCBkYXlPZk1vbnRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgZGF5T2ZXZWVrLCBpbnQzMl90IG1pbGxpcywgaW50MzJfdCBtaWxsaXNEZWx0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU1vZGUgcnVsZU1vZGUsIGludDhfdCBydWxlTW9udGgsIGludDhfdCBydWxlRGF5T2ZXZWVrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgcnVsZURheSwgaW50MzJfdCBydWxlTWlsbGlzKTsKCiAgICAvKioKICAgICAqIEdpdmVuIGEgc2V0IG9mIGVuY29kZWQgcnVsZXMgaW4gc3RhcnREYXkgYW5kIHN0YXJ0RGF5T2ZNb250aCwgZGVjb2RlCiAgICAgKiB0aGVtIGFuZCBzZXQgdGhlIHN0YXJ0TW9kZSBhcHByb3ByaWF0ZWx5LiAgRG8gdGhlIHNhbWUgZm9yIGVuZERheSBhbmQKICAgICAqIGVuZERheU9mTW9udGguICAKICAgICAqIDxQPgogICAgICogVXBvbiBlbnRyeSwgdGhlIGRheSBvZiB3ZWVrIHZhcmlhYmxlcyBtYXkgYmUgemVybyBvcgogICAgICogbmVnYXRpdmUsIGluIG9yZGVyIHRvIGluZGljYXRlIHNwZWNpYWwgbW9kZXMuICBUaGUgZGF5IG9mIG1vbnRoCiAgICAgKiB2YXJpYWJsZXMgbWF5IGFsc28gYmUgbmVnYXRpdmUuCiAgICAgKiA8UD4KICAgICAqIFVwb24gZXhpdCwgdGhlIG1vZGUgdmFyaWFibGVzIHdpbGwgYmUKICAgICAqIHNldCwgYW5kIHRoZSBkYXkgb2Ygd2VlayBhbmQgZGF5IG9mIG1vbnRoIHZhcmlhYmxlcyB3aWxsIGJlIHBvc2l0aXZlLgogICAgICogPFA+CiAgICAgKiBUaGlzIG1ldGhvZCBhbHNvIHJlY29nbml6ZXMgYSBzdGFydERheSBvciBlbmREYXkgb2YgemVybyBhcyBpbmRpY2F0aW5nCiAgICAgKiBubyBEU1QuCiAgICAgKi8KICAgIHZvaWQgZGVjb2RlUnVsZXMoVUVycm9yQ29kZSYgc3RhdHVzKTsKICAgIHZvaWQgZGVjb2RlU3RhcnRSdWxlKFVFcnJvckNvZGUmIHN0YXR1cyk7CiAgICB2b2lkIGRlY29kZUVuZFJ1bGUoVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICBzdGF0aWMgY2hhciAgICAgZmdDbGFzc0lEOwoKICAgIGludDhfdCBzdGFydE1vbnRoLCBzdGFydERheSwgc3RhcnREYXlPZldlZWs7ICAgLy8gdGhlIG1vbnRoLCBkYXksIERPVywgYW5kIHRpbWUgRFNUIHN0YXJ0cwogICAgaW50MzJfdCBzdGFydFRpbWU7CiAgICBUaW1lTW9kZSBzdGFydFRpbWVNb2RlLCBlbmRUaW1lTW9kZTsgLy8gTW9kZSBmb3Igc3RhcnRUaW1lLCBlbmRUaW1lOyBzZWUgVGltZU1vZGUKICAgIGludDhfdCBlbmRNb250aCwgZW5kRGF5LCBlbmREYXlPZldlZWs7IC8vIHRoZSBtb250aCwgZGF5LCBET1csIGFuZCB0aW1lIERTVCBlbmRzCiAgICBpbnQzMl90IGVuZFRpbWU7CiAgICBpbnQzMl90IHN0YXJ0WWVhcjsgIC8vIHRoZSB5ZWFyIHRoZXNlIERTVCBydWxlcyB0b29rIGVmZmVjdAogICAgaW50MzJfdCByYXdPZmZzZXQ7ICAvLyB0aGUgVGltZVpvbmUncyByYXcgR01UIG9mZnNldAogICAgVUJvb2wgdXNlRGF5bGlnaHQ7IC8vIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgVGltZVpvbmUgdXNlcyBEU1QKICAgIHN0YXRpYyBjb25zdCBpbnQ4X3Qgc3RhdGljTW9udGhMZW5ndGhbMTJdOyAvLyBsZW5ndGhzIG9mIHRoZSBtb250aHMKICAgIEVNb2RlIHN0YXJ0TW9kZSwgZW5kTW9kZTsgICAvLyBmbGFncyBpbmRpY2F0aW5nIHdoYXQga2luZCBvZiBydWxlcyB0aGUgRFNUIHJ1bGVzIGFyZQoKICAgIC8qKgogICAgICogQSBwb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBhbW91bnQgb2YgdGltZSBzYXZlZCBkdXJpbmcgRFNUIGluIG1zLgogICAgICogVHlwaWNhbGx5IG9uZSBob3VyOyBzb21ldGltZXMgMzAgbWludXRlcy4KICAgICAqLwogICAgaW50MzJfdCBkc3RTYXZpbmdzOwp9OwoKaW5saW5lIHZvaWQgU2ltcGxlVGltZVpvbmU6OnNldFN0YXJ0UnVsZShpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheU9mV2Vla0luTW9udGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXlPZldlZWssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lLCBVRXJyb3JDb2RlJiBzdGF0dXMpIHsKICAgIHNldFN0YXJ0UnVsZShtb250aCwgZGF5T2ZXZWVrSW5Nb250aCwgZGF5T2ZXZWVrLCB0aW1lLCBXQUxMX1RJTUUsIHN0YXR1cyk7Cn0KCmlubGluZSB2b2lkIFNpbXBsZVRpbWVab25lOjpzZXRTdGFydFJ1bGUoaW50MzJfdCBtb250aCwgaW50MzJfdCBkYXlPZk1vbnRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGltZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKSB7CiAgICBzZXRTdGFydFJ1bGUobW9udGgsIGRheU9mTW9udGgsIHRpbWUsIFdBTExfVElNRSwgc3RhdHVzKTsKfQoKaW5saW5lIHZvaWQgU2ltcGxlVGltZVpvbmU6OnNldFN0YXJ0UnVsZShpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheU9mTW9udGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXlPZldlZWssIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGltZSwgVUJvb2wgYWZ0ZXIsIFVFcnJvckNvZGUmIHN0YXR1cykgewogICAgc2V0U3RhcnRSdWxlKG1vbnRoLCBkYXlPZk1vbnRoLCBkYXlPZldlZWssIHRpbWUsIFdBTExfVElNRSwgYWZ0ZXIsIHN0YXR1cyk7Cn0KCmlubGluZSB2b2lkIFNpbXBsZVRpbWVab25lOjpzZXRFbmRSdWxlKGludDMyX3QgbW9udGgsIGludDMyX3QgZGF5T2ZXZWVrSW5Nb250aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXlPZldlZWssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGltZSwgVUVycm9yQ29kZSYgc3RhdHVzKSB7CiAgICBzZXRFbmRSdWxlKG1vbnRoLCBkYXlPZldlZWtJbk1vbnRoLCBkYXlPZldlZWssIHRpbWUsIFdBTExfVElNRSwgc3RhdHVzKTsKfQoKaW5saW5lIHZvaWQgU2ltcGxlVGltZVpvbmU6OnNldEVuZFJ1bGUoaW50MzJfdCBtb250aCwgaW50MzJfdCBkYXlPZk1vbnRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRpbWUsIFVFcnJvckNvZGUmIHN0YXR1cykgewogICAgc2V0RW5kUnVsZShtb250aCwgZGF5T2ZNb250aCwgdGltZSwgV0FMTF9USU1FLCBzdGF0dXMpOwp9CgppbmxpbmUgdm9pZCBTaW1wbGVUaW1lWm9uZTo6c2V0RW5kUnVsZShpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheU9mTW9udGgsIGludDMyX3QgZGF5T2ZXZWVrLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lLCBVQm9vbCBhZnRlciwgVUVycm9yQ29kZSYgc3RhdHVzKSB7CiAgICBzZXRFbmRSdWxlKG1vbnRoLCBkYXlPZk1vbnRoLCBkYXlPZldlZWssIHRpbWUsIFdBTExfVElNRSwgYWZ0ZXIsIHN0YXR1cyk7Cn0KCiNlbmRpZiAvLyBfU0lNUExFVFoK