LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ni0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRmlsZSB0YWJsZXMuaAovLwovLyAKLy8KLy8gQ3JlYXRlZCBieTogSGVsZW5hIFNoaWgKLy8KLy8gTW9kaWZpY2F0aW9uIEhpc3Rvcnk6Ci8vCi8vICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgovLyAgMi81Lzk3ICAgICAgYWxpdSAgICAgICAgQWRkZWQgc3RyZWFtSW4gYW5kIHN0cmVhbU91dCBtZXRob2RzIHRvIEVudHJ5UGFpciwKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mSW50LCBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlLCBWZWN0b3JPZlBUb0NvbnRyYWN0RWxlbWVudCwKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mUFRvQ29udHJhY3RUYWJsZS4gIFRoZXNlIGFyZSB1c2VkIGJ5IFRhYmxlQ29sbGF0aW9uCi8vICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbiBhbmQgc3RyZWFtT3V0IG1ldGhvZHMuCi8vICAzLzUvOTcgICAgICBhbGl1ICAgICAgICBNYWRlIFZlY3Rvck9mUG9pbnRlcnNUb1BhdHRlcm5FbnRyeTo6YXQoKSBpbmxpbmUuCi8vICA1LzA3Lzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBpc0JvZ3VzKCkuCi8vICA2LzE4Lzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBWZWN0b3JPZlBvaW50ZXIgZm9yIHF1ZXVlLXVwIGV4dGVuc2lvbiBsaXN0IGluCi8vICAgICAgICAgICAgICAgICAgICAgICAgICBNZXJnZUNvbGxhdGlvbi4KLy8gIDgvMTgvOTcgICAgIGhlbGVuYSAgICAgIEFkZGVkIGludGVybmFsIEFQSSBkb2N1bWVudGF0aW9uLiAgTm90ZS4gQWxsIHRoZSBWZWN0b3JPZlhYWAovLyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIGlzIGFib3V0IHRoZSBzYW1lLiAgVGhlIGludGVybmFsIEFQSSBkb2NzIHdpbGwgYmUKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIHRvIG9ubHkgdGhlIGZpcnN0IHZlcnNpb24gYW5kIGFkZGl0aW9uYWwgZGVzY3JpcHRpb24KLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgd2hlcmUgbmVjZXNzYXJ5LgovLyAgOC8wNC85OCAgICAgICAgZXJtICAgICAgICAgICAgQWRkZWQgZndkIG1lbWJlciB0byBFbnRyeVBhaXIuCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2lmbmRlZiBUQUJMRVNfSAojZGVmaW5lIFRBQkxFU19ICgoKI2luY2x1ZGUgImZpbGVzdHJtLmgiCiNpbmNsdWRlICJ1bWVtc3RybS5oIgojaW5jbHVkZSAidW5pY29kZS91bmlzdHIuaCIKCgovKioKICogRW50cnlQYWlyIGlzIHVzZWQgZm9yIGNvbnRyYWN0aW5nIGNoYXJhY3RlcnMuICBFYWNoIGVudHJ5IHBhaXIgY29udGFpbnMgdGhlIGNvbnRyYWN0aW5nIAogKiBjaGFyYWN0ZXIgc3RyaW5nIGFuZCBpdHMgY29sbGF0aW9uIG9yZGVyLgogKi8KY2xhc3MgRW50cnlQYWlyCnsKcHVibGljOgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RvcgogICAgICovCiAgICBFbnRyeVBhaXIoKTsKICAgIEVudHJ5UGFpcihjb25zdCBVbmljb2RlU3RyaW5nICZuYW1lLCBpbnQzMl90IGFWYWx1ZSwgVUJvb2wgYUZ3ZCA9IFRSVUUpOwoKICAgIFVuaWNvZGVTdHJpbmcgZW50cnlOYW1lOyAgICAgICAgLy8gQ29udHJhY3RpbmcgY2hhcmFjdGVycwogICAgaW50MzJfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAvLyBDb2xsYXRpb24gb3JkZXIKICAgIFVCb29sIGZ3ZDsgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGlmIHRoaXMgcGFpciBpcyBmb3IgdGhlIGZvcndhcmQgZGlyZWN0aW9uCgogICAgLyoqCiAgICAgKiBUaGUgc3RyZWFtSW4gYW5kIHN0cmVhbU91dCBtZXRob2RzIHJlYWQgYW5kIHdyaXRlIG9iamVjdHMgb2YgdGhpcwogICAgICogY2xhc3MgYXMgYmluYXJ5LCBwbGF0Zm9ybS1kZXBlbmRlbnQgZGF0YSBpbiB0aGUgaW9zdHJlYW0uICBUaGUgc3RyZWFtCiAgICAgKiBtdXN0IGJlIGluIGlvczo6YmluYXJ5IG1vZGUgZm9yIHRoaXMgdG8gd29yay4gIFRoZXNlIG1ldGhvZHMgYXJlIG5vdAogICAgICogaW50ZW5kZWQgZm9yIGdlbmVyYWwgcHVibGljIHVzZTsgdGhleSBhcmUgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGltcHJvdmUKICAgICAqIHBlcmZvcm1hbmNlIGJ5IHN0b3JpbmcgY2VydGFpbiBvYmplY3RzIGluIGJpbmFyeSBmaWxlcy4KICAgICAqLwogICAgdm9pZCBzdHJlYW1PdXQoRmlsZVN0cmVhbSogb3MpIGNvbnN0OwogICAgdm9pZCBzdHJlYW1JbihGaWxlU3RyZWFtKiBpcyk7CgogICAgdm9pZCBzdHJlYW1PdXQoVU1lbW9yeVN0cmVhbSogb3MpIGNvbnN0OwogICAgdm9pZCBzdHJlYW1JbihVTWVtb3J5U3RyZWFtKiBpcyk7Cn07CgoKLyoqCiAqIFZlY3Rvck9mSW50IGlzIGEgZHluYW1pYyBhcnJheSBvZiAzMi1iaXQgaW50ZWdlcnMuICAKICogSWRlYWxseSB3ZSB3b3VsZCB1c2UgdGVtcGxhdGVzIGZvciB0aGlzLCBidXQgdGhleSdyZSBub3Qgc3VwcG9ydGVkCiAqIG9uIGFsbCBvZiB0aGUgcGxhdGZvcm1zIHdlIG5lZWQgdG8gc3VwcG9ydC4KICovCmNsYXNzIFZlY3Rvck9mSW50IHsKCiAgICBwdWJsaWM6CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGNodW5rIHNpemUgYnkgd2hpY2ggdGhlIGFycmF5IGlzIGdyb3duLgogICAgICAgICAqIFRoaXMgcHJvYmFibHkgc2hvdWxkbid0IGJlIGluIHRoZSBBUEkKICAgICAgICAgKi8KICAgICAgICBlbnVtIEVHcm93dGhSYXRlIHsgR1JPV1RIX1JBVEUgPSA0IH07CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIHZlY3RvciB0aGF0IGNvbnRhaW5zIGVsZW1lbnRzIG9mIGludGVnZXJzLgogICAgICAgICAqIEBwYXJhbSBpbml0aWFsU2l6ZSB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSB2ZWN0b3Igb2JqZWN0LgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mSW50KGludDMyX3QgaW5pdGlhbFNpemUgPSAwKTsKICAgICAgICAvKioKICAgICAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mSW50KGNvbnN0IFZlY3Rvck9mSW50JiAgdGhhdCk7CiAgICAgICAgLyoqCiAgICAgICAgICogRGVzdHJ1Y3Rvci4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+VmVjdG9yT2ZJbnQoKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQXNzaWdubWVudCBvcGVyYXRvci4KICAgICAgICAgKi8KICAgICAgICBjb25zdCBWZWN0b3JPZkludCYgICAgICBvcGVyYXRvcj0oY29uc3QgVmVjdG9yT2ZJbnQmICAgIHRoYXQpOwogICAgICAgIAoKICAgICAgICAvKioKICAgICAgICAgKiBFcXVhbGl0eSBvcGVyYXRvcnMuCiAgICAgICAgICovCiAgICAgICAgVUJvb2wgICAgICAgICAgICAgICAgICBvcGVyYXRvcj09KGNvbnN0IFZlY3Rvck9mSW50JiB0aGF0KTsKICAgICAgICBVQm9vbCAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgVmVjdG9yT2ZJbnQmIHRoYXQpOwoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGEgcmVhZC1vbmx5IHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAgICAqIFRoaXMgZG9lcyBub3QgZG8gcmFuZ2UtY2hlY2tpbmc7IGFuIGludmFsaWQgaW5kZXggbWF5IGNhdXNlIGEgY3Jhc2guCiAgICAgICAgICogQHJldHVybiB0aGUgYWNjZXNzZWQgZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBvcGVyYXRvcltdKGludDMyX3QgIGluZGV4KSBjb25zdDsKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBhdChpbnQzMl90ICBpbmRleCkgY29uc3Q7CgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgYSBub24tY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICAgICogVGhpcyBkb2VzIHJhbmdlLWNoZWNraW5nOyBhY2Nlc3MgdG8gZWxlbWVudHMgYmV5b25kIHRoZSBlbmQgb2YgdGhlCiAgICAgICAgICogYXJyYXkgd2lsbCBjYXVzZSB0aGUgYXJyYXkgdG8gZ3Jvdy4KICAgICAgICAgKi8KICAgICAgICBpbnQzMl90JiAgICAgICAgICAgICAgICBvcGVyYXRvcltdKGludDMyX3QgIGluZGV4KTsKICAgICAgICBpbnQzMl90JiAgICAgICAgICAgICAgICBhdChpbnQzMl90ICBpbmRleCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byBhIGRpZmZlcmVudCB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBhdFB1dCggIGludDMyX3QgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCYgIHZhbHVlKTsKICAgICAgICAvKioKICAgICAgICAgKiBJbnNlcnRzIGEgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgc2xpZGluZyB0aGUgcmVzdCBvZgogICAgICAgICAqIHRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXkgb3ZlciB0byBtYWtlIHJvb20uCiAgICAgICAgICogQHBhcmFtIGluZGV4IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBhdEluc2VydCggICBpbnQzMl90ICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QmICB2YWx1ZSk7CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgogICAgICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgIHNpemUodm9pZCkgY29uc3Q7CgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhpcyB2ZWN0b3IuIElmIHRoZSBuZXcgc2l6ZSBpcyBncmVhdGVyIHRoYW4gdGhlIAogICAgICAgICAqIGN1cnJlbnQgc2l6ZSwgbmV3IDxjb2RlPjA8L2NvZGU+IGl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgZW5kIG9mIAogICAgICAgICAqIHRoZSB2ZWN0b3IuIElmIHRoZSBuZXcgc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgc2l6ZSwgYWxsIAogICAgICAgICAqIGNvbXBvbmVudHMgYXQgaW5kZXggPGNvZGU+bmV3U2l6ZTwvY29kZT4gYW5kIGdyZWF0ZXIgYXJlIGRpc2NhcmRlZC4KICAgICAgICAgKiBJZiA8Y29kZT5uZXdTaXplPC9jb2RlPiBpcyBuZWdhdGl2ZSBpdCBpcyB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgemVyby4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSAgIG5ld1NpemUgICB0aGUgbmV3IHNpemUgb2YgdGhpcyB2ZWN0b3IuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZShpbnQzMl90IG5ld1NpemUpOwoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyB2ZWN0b3Igb2JqZWN0IGlzIHZhbGlkLgogICAgICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgdmVjdG9yIG9iamVjdCBpcyB2YWxpZCwgRkFMU0Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIFVCb29sICAgICAgICAgICAgICAgICAgaXNCb2d1cyh2b2lkKSBjb25zdDsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHN0cmVhbUluIGFuZCBzdHJlYW1PdXQgbWV0aG9kcyByZWFkIGFuZCB3cml0ZSBvYmplY3RzIG9mIHRoaXMKICAgICAgICAgKiBjbGFzcyBhcyBiaW5hcnksIHBsYXRmb3JtLWRlcGVuZGVudCBkYXRhIGluIHRoZSBpb3N0cmVhbS4gIFRoZSBzdHJlYW0KICAgICAgICAgKiBtdXN0IGJlIGluIGlvczo6YmluYXJ5IG1vZGUgZm9yIHRoaXMgdG8gd29yay4gIFRoZXNlIG1ldGhvZHMgYXJlIG5vdAogICAgICAgICAqIGludGVuZGVkIGZvciBnZW5lcmFsIHB1YmxpYyB1c2U7IHRoZXkgYXJlIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBpbXByb3ZlCiAgICAgICAgICogcGVyZm9ybWFuY2UgYnkgc3RvcmluZyBjZXJ0YWluIG9iamVjdHMgaW4gYmluYXJ5IGZpbGVzLgogICAgICAgICAqLwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHN0cmVhbU91dChGaWxlU3RyZWFtKiBvcykgY29uc3Q7CiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW4oRmlsZVN0cmVhbSogaXMpOwoKICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBzdHJlYW1PdXQoVU1lbW9yeVN0cmVhbSogb3MpIGNvbnN0OwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluKFVNZW1vcnlTdHJlYW0qIGlzKTsKCiAgICBwcml2YXRlOgogICAgICAgIC8qKgogICAgICAgICAqIFJlc2l6ZXMgdGhlIHZlY3RvciBpZiBuZWNlc3Nhcnkgd2hlbiBjb21wYXJlZCB0byBhIG5ldyBzaXplLgogICAgICAgICAqIEBwYXJhbSBuZXdTaXplIHRoZSBuZXcgc2l6ZS4KICAgICAgICAgKi8KICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplKGludDMyX3QgIG5ld1NpemUpOwogICAgCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIGZTaXplOwogICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBmQ2FwYWNpdHk7CiAgICAgICAgaW50MzJfdCogICAgICAgICAgICAgICAgICAgIGZFbGVtZW50czsKICAgICAgICBVQm9vbCAgICAgICAgICAgICAgICAgICAgICBmQm9ndXM7Cn07CgovKioKICogVmVjdG9yT2ZQb2ludGVyIGlzIGEgZHluYW1pYyBhcnJheSBvZiB2b2lkKiBwb2ludGVycy4gIAogKiAgPFA+CiAqICBUaGlzIGlzIGEgdmVjdG9yIGNsYXNzIHRoYXQgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCB3aXRoIHBvaW50ZXIgdHlwZXMgYW5kIHdoaWNoIGltcGxlbWVudHMKICogIG93bmluZyBzZW1hbnRpY3MuICBUaGF0IGlzLCBvbmNlIGEgdmFsdWUgaXMgcGxhY2VkIGFuIGVsZW1lbnQgb2YgdGhlIHZlY3RvciwgdGhlIHZlY3RvciBpcwogKiAgY29uc2lkZXJlZCB0byBvd24gaXQgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQuICBUaGlzIHdpbGwgaGFwcGVuIGJvdGggd2hlbiB0aGUKICogIGVsZW1lbnQgaXMgY2hhbmdlZCB1c2luZyBhdFB1dCgpIG9yIHRocm91Z2ggYW4gUG9pbnRlclRvKioqKiwgYW5kIHdoZW4gdGhlIHZlY3RvciBpdHNlbGYgaXMKICogIGRpc3Bvc2VkLiAgCiAqICA8UD4KICogIFdBUk5JTkc6ICBUaGUgY2FsbGVyIG11c3QgYmUgY2FyZWZ1bCB0byBhdm9pZCBob2xkaW5nIG9udG8gYW55IGRhbmdsaW5nIHJlZmVyZW5jZXMKICogIGFmdGVyIHRoZSB2ZWN0b3IgaXMgZGlzcG9zZWQsIGFuZCB0aGUgY2FsbGVyIG11c3QgYWxzbyBiZSBjYXJlZnVsIG5vdCB0byBwdXQgdGhlIHNhbWUKICogIHZhbHVlIGludG8gbW9yZSB0aGFuIG9uZSBlbGVtZW50IGluIHRoZSB2ZWN0b3IgKHVubGVzcyB0aGUgdmFsdWUgaXMgTlVMTCkuCiAqICA8UD4KICogIEFzIHdpdGggVmVjdG9yT2YqKio+LCB0aGUgdmVjdG9yIGdyb3dzIGFzIG5lY2Vzc2FyeSB0byBhY2NvbW1vZGF0ZSBhbGwgZWxlbWVudHMsIHRoZQogKiAgc2l6ZSBpcyBvbmUgcGx1cyB0aGUgaW5kZXggb2YgdGhlIGhpZ2hlc3QgZWxlbWVudCB0aGF0J3MgYmVlbiBzZXQsIGFuZCBhbnkgZWxlbWVudHMgYmVsb3cKICogIHRoZSBoaWdoZXN0IGVsZW1lbnQgdGhhdCBhcmVuJ3QgZXhwbGljaXRseSBpbml0aWFsaXplZCBhcmUgaW5pdGlhbGl6ZWQgdG8gTlVMTC4KICovCmNsYXNzIFZlY3Rvck9mUG9pbnRlciB7CiAgICBwdWJsaWM6CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGNodW5rIHNpemUgYnkgd2hpY2ggdGhlIGFycmF5IGlzIGdyb3duLgogICAgICAgICAqIFRoaXMgcHJvYmFibHkgc2hvdWxkbid0IGJlIGluIHRoZSBBUEkKICAgICAgICAgKi8KICAgICAgICBlbnVtIEVHcm93dGhSYXRlIHsgR1JPV1RIX1JBVEUgPSA0IH07CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIHZlY3RvciB0aGF0IGNvbnRhaW5zIGVsZW1lbnRzIG9mIHBvaW50ZXJzIHRvIG9iamVjdHMuCiAgICAgICAgICogQHBhcmFtIGluaXRpYWxTaXplIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHZlY3RvciBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mUG9pbnRlcihpbnQzMl90IGluaXRpYWxTaXplID0gMCk7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yT2ZQb2ludGVyKGNvbnN0IFZlY3Rvck9mUG9pbnRlciYgIHRoYXQpOwogICAgICAgIC8qKgogICAgICAgICAqIERlc3RydWN0b3IuCiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5WZWN0b3JPZlBvaW50ZXIoKTsKICAgICAgICAvKioKICAgICAgICAgKiBBc3NpZ25tZW50IG9wZXJhdG9yLgogICAgICAgICAqLwogICAgICAgIGNvbnN0IFZlY3Rvck9mUG9pbnRlciYgICAgICBvcGVyYXRvcj0oY29uc3QgVmVjdG9yT2ZQb2ludGVyJiAgICB0aGF0KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogRXF1YWxpdHkgb3BlcmF0b3JzLgogICAgICAgICAqLwogICAgICAgIFVCb29sICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgVmVjdG9yT2ZQb2ludGVyJiB0aGF0KTsKICAgICAgICBVQm9vbCAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciE9KGNvbnN0IFZlY3Rvck9mUG9pbnRlciYgdGhhdCk7CgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgYSByZWFkLW9ubHkgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICAgICogVGhpcyBkb2VzIG5vdCBkbyByYW5nZS1jaGVja2luZzsgYW4gaW52YWxpZCBpbmRleCBtYXkgY2F1c2UgYSBjcmFzaC4KICAgICAgICAgKiBAcmV0dXJuIHRoZSBhY2Nlc3NlZCBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcltdKGludDMyX3QgIGluZGV4KSBjb25zdDsKICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgYXQoaW50MzJfdCAgaW5kZXgpIGNvbnN0OwoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGEgbm9uLWNvbnN0IHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAgICAqIFRoaXMgZG9lcyByYW5nZS1jaGVja2luZzsgYWNjZXNzIHRvIGVsZW1lbnRzIGJleW9uZCB0aGUgZW5kIG9mIHRoZQogICAgICAgICAqIGFycmF5IHdpbGwgY2F1c2UgdGhlIGFycmF5IHRvIGdyb3cuCiAgICAgICAgICovCiAgICAgICAgdm9pZComICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yW10oaW50MzJfdCAgaW5kZXgpOwogICAgICAgIHZvaWQqJiAgICAgICAgICAgICAgICAgICAgICBhdChpbnQzMl90ICBpbmRleCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byBhIGRpZmZlcmVudCB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgYXRQdXQoICBpbnQzMl90ICAgICAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZComICAgIHZhbHVlKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5zZXJ0cyBhIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIHNsaWRpbmcgdGhlIHJlc3Qgb2YKICAgICAgICAgKiB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5IG92ZXIgdG8gbWFrZSByb29tLgogICAgICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIGF0SW5zZXJ0KCAgIGludDMyX3QgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiYgICAgdmFsdWUpOwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgogICAgICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBzaXplKHZvaWQpIGNvbnN0OwoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyB2ZWN0b3Igb2JqZWN0IGlzIHZhbGlkLgogICAgICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgdmVjdG9yIG9iamVjdCBpcyB2YWxpZCwgRkFMU0Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIFVCb29sICAgICAgICAgICAgICAgICAgICAgIGlzQm9ndXModm9pZCkgY29uc3Q7CgogICAgcHJpdmF0ZToKICAgICAgICAvKioKICAgICAgICAgKiBSZXNpemVzIHRoZSB2ZWN0b3IgaWYgbmVjZXNzYXJ5IHdoZW4gY29tcGFyZWQgdG8gYSBuZXcgc2l6ZS4KICAgICAgICAgKiBAcGFyYW0gbmV3U2l6ZSB0aGUgbmV3IHNpemUuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZShpbnQzMl90ICBuZXdTaXplKTsKICAgIAogICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBmU2l6ZTsKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgZkNhcGFjaXR5OwogICAgICAgIHZvaWQqKiAgICAgICAgICAgICAgICAgICAgICBmRWxlbWVudHM7CiAgICAgICAgVUJvb2wgICAgICAgICAgICAgICAgICAgICAgZkJvZ3VzOwp9OwoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vICBUaGUgZm9sbG93aW5nIGRpYWdyYW0gc2hvd3MgdGhlIGRhdGEgc3RydWN0dXJlIG9mIHRoZSBSdWxlQmFzZWRDb2xsYXRvciBvYmplY3QuCi8vICBTdXBwb3NlIHdlIGhhdmUgdGhlIHJ1bGUsIHdoZXJlICdvLXVtbGF1dCcgaXMgdGhlIHVuaWNvZGUgY2hhciAweDAwRjYuCi8vICAiYSwgQSA8IGIsIEIgPCBjLCBDLCBjaCwgY0gsIENoLCBDSCA8IGQsIEQgLi4uIDwgbywgTzsgJ28tdW1sYXV0Jy9FLCAnTy11bWxhdXQnL0UgLi4uIi4KLy8gIFdoYXQgdGhlIHJ1bGUgc2F5cyBpcywgc29ydHMgJ2NoJ2xpZ2F0dXJlcyBhbmQgJ2MnIG9ubHkgd2l0aCB0ZXJ0aWFyeSBkaWZmZXJlbmNlIGFuZAovLyAgc29ydHMgJ28tdW1sYXV0JyBhcyBpZiBpdCdzIGFsd2F5cyBleHBhbmRlZCB3aXRoICdlJy4KLy8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZlY3Rvck9mUFRvQ29udHJhY3RUYWJsZSkgICAgICAgICAoVmVjdG9yT2ZQVG9FeHBhbmRUYWJsZSkKLy8gbWFwcGluZyB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0aW5nIGxpc3QgICAgICAgICAgICAgICAgICBleHBhbmRpbmcgbGlzdAovLyAoY29udGFpbnMgYWxsIHVuaWNvZGUgY2hhcgovLyAgZW50cmllcykKLy8gICAgICAgICAgICAgICAgICAgKFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KSAqKFBUb0NvbnRyYWN0RWxlbWVudCkgICAgICAoUFRvRXhwYW5kVGFibGUpCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX18gICAgICAgIF9fX19fX19fX19fX18gICAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fCi8vICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgfD09PT09PnxfKl98LS0tLS0+fCdjJyAgfHYoJ2MnKSB8ICAgfD09Pnx2KCdvJyl8digndW1sYXV0Jyl8dignZScpfAovLyAgfF9cdTAwMDFffC0tPiB2KCdcdTAwMDEnKSAgIHwgICAgICB8XzpffCAgICAgIHwtLS0tLS0tLS0tLS0tfCAgIHwgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLy8gIHxfXHUwMDAyX3wtLT4gdignXHUwMDAyJykgICB8ICAgICAgfF86X3wgICAgICB8J2NoJyB8dignY2gnKXwgICB8ICAgfCAgICAgICAgICAgICA6ICAgICAgICAgICB8Ci8vICB8X19fXzpfX198ICAgICAgICAgICAgICAgICAgfCAgICAgIHxfOl98ICAgICAgfC0tLS0tLS0tLS0tLS18ICAgfCAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAovLyAgfF9fX186X19ffCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwnY0gnIHx2KCdjSCcpfCAgIHwgICB8ICAgICAgICAgICAgIDogICAgICAgICAgIHwKLy8gIHxfXydhJ19fX3wtLT4gdignYScpICAgICAgICB8ICAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLXwgICB8ICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci8vICB8X18nYidfX198LS0+IHYoJ2InKSAgICAgICAgfCAgICAgICAgICAgICAgICAgfCdDaCcgfHYoJ0NoJyl8ICAgfCAgIHwgICAgICAgICAgICAgOiAgICAgICAgICAgfAovLyAgfF9fX186X19ffCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tfCAgIHwgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLy8gIHxfX19fOl9fX3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8J0NIJyB8dignQ0gnKXwgICB8ICAgfCAgICAgICAgICAgICA6ICAgICAgICAgICB8Ci8vICB8X18nY2gnX198LS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgfCAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAovLyAgfF9fX186X19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICAgICAgICAgIDogICAgICAgICAgIHwKLy8gIHxvLXVtbGF1dHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgfF9fX19fX19fX19fX19fX19fX19fX19fX198Ci8vICB8X19fXzpfX198Ci8vCi8vCi8vIE5vdGVkIGJ5IEhlbGVuYSBTaGloIG9uIDYvMjMvOTcgd2l0aCBwZW5kaW5nIGRlc2lnbiBjaGFuZ2VzIChzbGltbWluZyBjb2xsYXRpb24pLgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmNsYXNzIFZlY3Rvck9mUFRvRXhwYW5kVGFibGU7CgovKiogCiAqIFBUb0V4cGFuZFRhYmxlIGlzIGEgc21hcnQtcG9pbnRlciB0byBhIFZlY3Rvck9mSW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZQogKiB0aGUgY29sbGF0aW9uIG9yZGVycyB0aGF0IGFyZSB0aGUgcmVzdWx0IG9mIGFuIGV4cGFuc2lvbi4KICogPFA+CiAqIFlvdSBjYW4gdXNlIHRoaXMgb2JqZWN0IGFzIGlmIGl0IHdlcmUgYSBwb2ludGVyIHRvIGEgVmVjdG9yT2ZJbnQsIGUuZy4KICogPHByZT4KICogUFRvRXhwYW5kVGFibGUgZm9vID0gLi4uLjsKICogZm9vLT5hdEluc2VydCguLi4uKTsKICogPC9wcmU+CiAqLwpjbGFzcyBQVG9FeHBhbmRUYWJsZSB7CiAgICBwdWJsaWM6CiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogRGVzdHJ1Y3Rvci4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+UFRvRXhwYW5kVGFibGUoKTsKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBBc3NpZ25tZW50IG9wZXJhdG9ycwogICAgICAgICAqIFRoZSBleHBhbmQgdGFibGUgdGhhdCB0aGlzIG9iamVjdCBhbHJlYWR5IHBvaW50cyB0byAoaWYgYW55KSBpcyBkZWxldGVkLgogICAgICAgICAqLwogICAgICAgIGNvbnN0IFBUb0V4cGFuZFRhYmxlJiAgICAgICAgICAgICAgIG9wZXJhdG9yPShWZWN0b3JPZkludCogIG5ld1ZhbHVlKTsKICAgICAgICBjb25zdCBQVG9FeHBhbmRUYWJsZSYgICAgICAgICAgICAgICBvcGVyYXRvcj0oY29uc3QgUFRvRXhwYW5kVGFibGUmIHBvaW50ZXJUb05ld1ZhbHVlKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogUG9pbnRlciBvcGVyYXRvciBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIFZlY3Rvck9mSW50KigpIGNvbnN0OwoKICAgIHByaXZhdGU6CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0b3IKICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVG9FeHBhbmRUYWJsZShWZWN0b3JPZkludComICAgIHZhbHVlKTsKICAgICAgICAvKioKICAgICAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUb0V4cGFuZFRhYmxlKGNvbnN0IFBUb0V4cGFuZFRhYmxlJiAgICB0aGF0KTsKCiAgICAgICAgVmVjdG9yT2ZJbnQqJiAgICAgICAgICAgICAgICAgICAgICAgZlZhbHVlOwoKICAgICAgICBmcmllbmQgY2xhc3MgVmVjdG9yT2ZQVG9FeHBhbmRUYWJsZTsKfTsKCi8qKgogKiAgVmVjdG9yT2ZQb2ludGVyIGlzIGEgZHluYW1pYyBhcnJheSBvZiBQVG9FeHBhbmRUYWJsZSBvYmplY3RzCiAqICB3aGljaCBpbiB0dXJuIHBvaW50IHRvIHRoZSBhcnJheSBvZiBjb2xsYXRpb24gb3JkZXJzIGZvciBlYWNoIGV4cGFuZGluZyBjaGFyYWN0ZXIuCiAqICA8UD4KICogIFRoaXMgaXMgYSB2ZWN0b3IgY2xhc3MgdGhhdCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIHdpdGggcG9pbnRlciB0eXBlcyBhbmQgd2hpY2ggaW1wbGVtZW50cwogKiAgb3duaW5nIHNlbWFudGljcy4gIFRoYXQgaXMsIG9uY2UgYSB2YWx1ZSBpcyBwbGFjZWQgYW4gZWxlbWVudCBvZiB0aGUgdmVjdG9yLCB0aGUgdmVjdG9yIGlzCiAqICBjb25zaWRlcmVkIHRvIG93biBpdCBhbmQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdC4gIFRoaXMgd2lsbCBoYXBwZW4gYm90aCB3aGVuIHRoZQogKiAgZWxlbWVudCBpcyBjaGFuZ2VkIHVzaW5nIGF0UHV0KCkgb3IgdGhyb3VnaCBhbiBQb2ludGVyVG8qKioqLCBhbmQgd2hlbiB0aGUgdmVjdG9yIGl0c2VsZiBpcwogKiAgZGlzcG9zZWQuICAKICogIDxQPgogKiAgV0FSTklORzogIFRoZSBjYWxsZXIgbXVzdCBiZSBjYXJlZnVsIHRvIGF2b2lkIGhvbGRpbmcgb250byBhbnkgZGFuZ2xpbmcgcmVmZXJlbmNlcwogKiAgYWZ0ZXIgdGhlIHZlY3RvciBpcyBkaXNwb3NlZCwgYW5kIHRoZSBjYWxsZXIgbXVzdCBhbHNvIGJlIGNhcmVmdWwgbm90IHRvIHB1dCB0aGUgc2FtZQogKiAgdmFsdWUgaW50byBtb3JlIHRoYW4gb25lIGVsZW1lbnQgaW4gdGhlIHZlY3RvciAodW5sZXNzIHRoZSB2YWx1ZSBpcyBOVUxMKS4KICogIDxQPgogKiAgQXMgd2l0aCBWZWN0b3JPZioqKj4sIHRoZSB2ZWN0b3IgZ3Jvd3MgYXMgbmVjZXNzYXJ5IHRvIGFjY29tbW9kYXRlIGFsbCBlbGVtZW50cywgdGhlCiAqICBzaXplIGlzIG9uZSBwbHVzIHRoZSBpbmRleCBvZiB0aGUgaGlnaGVzdCBlbGVtZW50IHRoYXQncyBiZWVuIHNldCwgYW5kIGFueSBlbGVtZW50cyBiZWxvdwogKiAgdGhlIGhpZ2hlc3QgZWxlbWVudCB0aGF0IGFyZW4ndCBleHBsaWNpdGx5IGluaXRpYWxpemVkIGFyZSBpbml0aWFsaXplZCB0byBOVUxMLgogKi8KY2xhc3MgVmVjdG9yT2ZQVG9FeHBhbmRUYWJsZSB7CiAgICBwdWJsaWM6CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBjaHVuayBzaXplIGJ5IHdoaWNoIHRoZSBhcnJheSBpcyBncm93bi4KICAgICAgICAgKiBUaGlzIHByb2JhYmx5IHNob3VsZG4ndCBiZSBpbiB0aGUgQVBJCiAgICAgICAgICovCiAgICAgICAgZW51bSBFR3Jvd3RoUmF0ZSB7IEdST1dUSF9SQVRFID0gNCB9OwogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSB2ZWN0b3IgdGhhdCBjb250YWlucyBlbGVtZW50cyBvZiBQVG9FeHBhbmRUYWJsZS4KICAgICAgICAgKiBAcGFyYW0gaW5pdGlhbFNpemUgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgdmVjdG9yIG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mUFRvRXhwYW5kVGFibGUoaW50MzJfdCAgaW5pdGlhbFNpemUgPSAwKTsKICAgICAgICAvKioKICAgICAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yT2ZQVG9FeHBhbmRUYWJsZShjb25zdCBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlJiAgICB0aGF0KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogRGVzdHJ1Y3Rvci4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5WZWN0b3JPZlBUb0V4cGFuZFRhYmxlKCk7CgogICAgICAgIC8qKgogICAgICAgICAqIEFzc2lnbm1lbnQgb3BlcmF0b3IuCiAgICAgICAgICovCiAgICAgICAgY29uc3QgVmVjdG9yT2ZQVG9FeHBhbmRUYWJsZSYgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yPShjb25zdCBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlJiB0aGF0KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJuIGEgbW9kaWZpYWJsZSBzbWFydC1wb2ludGVyIHRvIHRoZSBleHBhbnNpb24gdGFibGUKICAgICAgICAgKiBhdCB0aGUgZ2l2ZW4gaW5kZXguICBBc3NpZ25pbmcgdG8gdGhpcyBzbWFydCBwb2ludGVyIHdpbGwgd29yaywgZS5nLgogICAgICAgICAqICBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlIGZvbyA9IC4uLi47CiAgICAgICAgICogIGZvb1s1XSA9IG5ldyBWZWN0b3JPZkludCAuLi47CiAgICAgICAgICogVGhpcyBkb2VzIHJhbmdlLWNoZWNraW5nOyBhY2Nlc3MgdG8gZWxlbWVudHMgYmV5b25kIHRoZSBlbmQgb2YgdGhlCiAgICAgICAgICogYXJyYXkgd2lsbCBjYXVzZSB0aGUgYXJyYXkgdG8gZ3Jvdy4KICAgICAgICAgKi8KICAgICAgICBQVG9FeHBhbmRUYWJsZSAgICAgIGF0KGludDMyX3QgIGluZGV4KTsKICAgICAgICBQVG9FeHBhbmRUYWJsZSAgICAgIG9wZXJhdG9yW10oaW50MzJfdCAgaW5kZXgpOwoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCiAgICAgICAgICogVGhlIHBvaW50ZXIgaXRzZWxmIGNhbm5vdCBiZSBtb2RpZmllZCwgYnV0IHRoZSBlbGVtZW50cyBpdCBwb2ludHMgdG8gbWF5OgogICAgICAgICAqIDxwcmU+CiAgICAgICAgICogIGNvbnN0IFZlY3Rvck9mUFRvRXhwYW5kVGFibGUgZm9vID0gLi4uLjsKICAgICAgICAgKiAgZm9vWzVdID0gLi4uLjsgICAgICAvLyBOT1QgQUxMT1dFRAogICAgICAgICAqICBmb29bNV1bMF0gPSAxMjM0NTsgIC8vIG9rCiAgICAgICAgICogPC9wcmU+CiAgICAgICAgICogVGhpcyBkb2VzIG5vdCBkbyByYW5nZS1jaGVja2luZzsgYW4gaW52YWxpZCBpbmRleCBtYXkgY2F1c2UgYSBjcmFzaC4KICAgICAgICAgKiBAcmV0dXJuIHRoZSBhY2Nlc3NlZCBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIFZlY3Rvck9mSW50KiAgICAgICAgYXQoaW50MzJfdCAgaW5kZXgpIGNvbnN0OwogICAgICAgIFZlY3Rvck9mSW50KiAgICAgICAgb3BlcmF0b3JbXShpbnQzMl90ICBpbmRleCkgY29uc3Q7CgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byBhIGRpZmZlcmVudCB2YWx1ZS4KICAgICAgICAgKiBJZiB0aGVyZSB3YXMgYXJlYWR5IGFuIG9iamVjdCBzdG9yZWQgYXQgdGhpcyBpbmRleCwgaXQgaXMgZGVsZXRlZC4KICAgICAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICB2b2lkICAgICAgICAgICAgICAgIGF0UHV0KCAgaW50MzJfdCAgICAgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JPZkludCogICAgdmFsdWUpOwoKICAgICAgICAvKioKICAgICAgICAgKiAiT3JwaGFuIiB0aGUgcG9pbnRlciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiAgVGhlIGFycmF5IHdpbGwgbm8KICAgICAgICAgKiBsb25nZXIgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0LCBhbmQgdGhlIGNhbGxlciBpcwogICAgICAgICAqIG5vdyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgaXRzIHN0b3JhZ2UuCiAgICAgICAgICovCiAgICAgICAgVmVjdG9yT2ZJbnQqICAgICAgICBvcnBoYW5BdChpbnQzMl90ICAgIGluZGV4KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCiAgICAgICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB2ZWN0b3IuCiAgICAgICAgICovCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBzaXplKHZvaWQpIGNvbnN0OwoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyB2ZWN0b3Igb2JqZWN0IGlzIHZhbGlkLgogICAgICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgdmVjdG9yIG9iamVjdCBpcyB2YWxpZCwgRkFMU0Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIFVCb29sICAgICAgICAgICAgICBpc0JvZ3VzKHZvaWQpIGNvbnN0OwoKICAgIC8qKgogICAgICogVGhlIHN0cmVhbUluIGFuZCBzdHJlYW1PdXQgbWV0aG9kcyByZWFkIGFuZCB3cml0ZSBvYmplY3RzIG9mIHRoaXMKICAgICAqIGNsYXNzIGFzIGJpbmFyeSwgcGxhdGZvcm0tZGVwZW5kZW50IGRhdGEgaW4gdGhlIGlvc3RyZWFtLiAgVGhlIHN0cmVhbQogICAgICogbXVzdCBiZSBpbiBpb3M6OmJpbmFyeSBtb2RlIGZvciB0aGlzIHRvIHdvcmsuICBUaGVzZSBtZXRob2RzIGFyZSBub3QKICAgICAqIGludGVuZGVkIGZvciBnZW5lcmFsIHB1YmxpYyB1c2U7IHRoZXkgYXJlIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBpbXByb3ZlCiAgICAgKiBwZXJmb3JtYW5jZSBieSBzdG9yaW5nIGNlcnRhaW4gb2JqZWN0cyBpbiBiaW5hcnkgZmlsZXMuCiAgICAgKi8KICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHN0cmVhbU91dChGaWxlU3RyZWFtKiBvcykgY29uc3Q7CiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzdHJlYW1JbihGaWxlU3RyZWFtKiBpcyk7CgogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc3RyZWFtT3V0KFVNZW1vcnlTdHJlYW0qIG9zKSBjb25zdDsKICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHN0cmVhbUluKFVNZW1vcnlTdHJlYW0qIGlzKTsKCiAgICBwcml2YXRlOgogICAgICAgIC8qKgogICAgICAgICAqIFJlc2l6ZXMgdGhlIHZlY3RvciBpZiBuZWNlc3Nhcnkgd2hlbiBjb21wYXJlZCB0byBhIG5ldyBzaXplLgogICAgICAgICAqIEBwYXJhbSBuZXdTaXplIHRoZSBuZXcgc2l6ZS4KICAgICAgICAgKi8KICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHJlc2l6ZShpbnQzMl90ICAgICAgbmV3U2l6ZSk7CgogICAgICAgIGludDMyX3QgICAgICAgICAgICAgZlNpemU7CiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBmQ2FwYWNpdHk7CiAgICAgICAgVmVjdG9yT2ZJbnQqKiAgICAgICBmRWxlbWVudHM7CiAgICAgICAgVUJvb2wgICAgICAgICAgICAgIGZCb2d1czsKfTsKCmNsYXNzIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50OwoKLyoqIAogKiBQVG9Db250cmFjdEVsZW1lbnQgaXMgYSBzbWFydC1wb2ludGVyIHRvIGFuIGFycmF5IHRoYXQgaXMgdXNlZCB0byBzdG9yZQogKiB0aGUgY29udHJhY3RpbmctY2hhcmFjdGVyIHN0cmluZ3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gVW5pY29kZSBjaGFyYWN0ZXIuCiAqIDxQPgogKiBZb3UgY2FuIHVzZSB0aGlzIG9iamVjdCBhcyBpZiBpdCB3ZXJlIGEgcG9pbnRlciB0byBhbiBFbnRyeVBhaXIgYXJyYXksIGUuZy4KICogPHByZT4KICogUFRvQ29udHJhY3RFbGVtZW50IGZvbyA9IC4uLi47CiAqIGZvby0+ZW50cnlOYW1lID0gLi4uLjsKICogPC9wcmU+CiAqLwpjbGFzcyBQVG9Db250cmFjdEVsZW1lbnQgewogICAgcHVibGljOgogICAgICAgIC8qKgogICAgICAgICAqIERlc3RydWN0b3IuCiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgflBUb0NvbnRyYWN0RWxlbWVudCgpOwogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIEFzc2lnbm1lbnQgb3BlcmF0b3JzCiAgICAgICAgICogVGhlIEVudHJ5UGFpciB0aGF0IHRoaXMgb2JqZWN0IGFscmVhZHkgcG9pbnRzIHRvIChpZiBhbnkpIGlzIGRlbGV0ZWQuCiAgICAgICAgICovCiAgICAgICAgY29uc3QgUFRvQ29udHJhY3RFbGVtZW50JiAgICAgICAgICAgICAgIG9wZXJhdG9yPShFbnRyeVBhaXIqICAgIG5ld1ZhbHVlKTsKICAgICAgICBjb25zdCBQVG9Db250cmFjdEVsZW1lbnQmICAgICAgICAgICAgICAgb3BlcmF0b3I9KGNvbnN0IFBUb0NvbnRyYWN0RWxlbWVudCYgcG9pbnRlclRvTmV3VmFsdWUpOwoKICAgICAgICAvKioKICAgICAgICAgKiBQb2ludGVyIG9wZXJhdG9yIG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgRW50cnlQYWlyKigpIGNvbnN0OwoKICAgIHByaXZhdGU6CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0b3IKICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVG9Db250cmFjdEVsZW1lbnQoRW50cnlQYWlyKiYgIHZhbHVlKTsKICAgICAgICAvKioKICAgICAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUb0NvbnRyYWN0RWxlbWVudChjb25zdCBQVG9Db250cmFjdEVsZW1lbnQmICAgIHRoYXQpOwoKICAgICAgICBFbnRyeVBhaXIqJiAgICAgICAgICAgICAgICAgICAgIGZWYWx1ZTsKCiAgICAgICAgZnJpZW5kIGNsYXNzIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50Owp9OwoKLyoqCiAqICBUaGUgdGFibGUgdGhhdCBjb250YWlucyB0aGUgbGlzdCBvZiBjb250cmFjdGluZyBjaGFyYWN0ZXIgZW50cmllcy4KICogIDxQPgogKiAgVGhpcyBpcyBhIHZlY3RvciBjbGFzcyB0aGF0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgd2l0aCBwb2ludGVyIHR5cGVzIGFuZCB3aGljaCBpbXBsZW1lbnRzCiAqICBvd25pbmcgc2VtYW50aWNzLiAgVGhhdCBpcywgb25jZSBhIHZhbHVlIGlzIHBsYWNlZCBhbiBlbGVtZW50IG9mIHRoZSB2ZWN0b3IsIHRoZSB2ZWN0b3IgaXMKICogIGNvbnNpZGVyZWQgdG8gb3duIGl0IGFuZCBpcyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0LiAgVGhpcyB3aWxsIGhhcHBlbiBib3RoIHdoZW4gdGhlCiAqICBlbGVtZW50IGlzIGNoYW5nZWQgdXNpbmcgYXRQdXQoKSBvciB0aHJvdWdoIGFuIFBvaW50ZXJUbyoqKiosIGFuZCB3aGVuIHRoZSB2ZWN0b3IgaXRzZWxmIGlzCiAqICBkaXNwb3NlZC4gIAogKiAgPFA+CiAqICBXQVJOSU5HOiAgVGhlIGNhbGxlciBtdXN0IGJlIGNhcmVmdWwgdG8gYXZvaWQgaG9sZGluZyBvbnRvIGFueSBkYW5nbGluZyByZWZlcmVuY2VzCiAqICBhZnRlciB0aGUgdmVjdG9yIGlzIGRpc3Bvc2VkLCBhbmQgdGhlIGNhbGxlciBtdXN0IGFsc28gYmUgY2FyZWZ1bCBub3QgdG8gcHV0IHRoZSBzYW1lCiAqICB2YWx1ZSBpbnRvIG1vcmUgdGhhbiBvbmUgZWxlbWVudCBpbiB0aGUgdmVjdG9yICh1bmxlc3MgdGhlIHZhbHVlIGlzIE5VTEwpLgogKiAgPFA+CiAqICBBcyB3aXRoIFZlY3Rvck9mKioqPiwgdGhlIHZlY3RvciBncm93cyBhcyBuZWNlc3NhcnkgdG8gYWNjb21tb2RhdGUgYWxsIGVsZW1lbnRzLCB0aGUKICogIHNpemUgaXMgb25lIHBsdXMgdGhlIGluZGV4IG9mIHRoZSBoaWdoZXN0IGVsZW1lbnQgdGhhdCdzIGJlZW4gc2V0LCBhbmQgYW55IGVsZW1lbnRzIGJlbG93CiAqICB0aGUgaGlnaGVzdCBlbGVtZW50IHRoYXQgYXJlbid0IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgYXJlIGluaXRpYWxpemVkIHRvIE5VTEwuCiAqLwpjbGFzcyBWZWN0b3JPZlBUb0NvbnRyYWN0RWxlbWVudCB7CiAgICBwdWJsaWM6CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGNodW5rIHNpemUgYnkgd2hpY2ggdGhlIGFycmF5IGlzIGdyb3duLgogICAgICAgICAqIFRoaXMgcHJvYmFibHkgc2hvdWxkbid0IGJlIGluIHRoZSBBUEkKICAgICAgICAgKi8KICAgICAgICBlbnVtIEVHcm93dGhSYXRlIHsgR1JPV1RIX1JBVEUgPSA0IH07CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIHZlY3RvciB0aGF0IGNvbnRhaW5zIGVsZW1lbnRzIG9mIFBUb0NvbnRyYWN0RWxlbWVudC4KICAgICAgICAgKiBAcGFyYW0gaW5pdGlhbFNpemUgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgdmVjdG9yIG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KGludDMyX3QgIGluaXRpYWxTaXplID0gMCk7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KGNvbnN0IFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50JiAgICB0aGF0KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogRGVzdHJ1Y3Rvci4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5WZWN0b3JPZlBUb0NvbnRyYWN0RWxlbWVudCgpOwoKICAgICAgICAvKioKICAgICAgICAgKiBBc3NpZ25tZW50IG9wZXJhdG9yLgogICAgICAgICAqLwogICAgICAgIGNvbnN0IFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50JiAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I9KGNvbnN0IFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50JiB0aGF0KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJuIGEgbW9kaWZpYWJsZSBzbWFydC1wb2ludGVyIHRvIHRoZSBFbnRyeVBhaXIKICAgICAgICAgKiBhdCB0aGUgZ2l2ZW4gaW5kZXguICBBc3NpZ25pbmcgdG8gdGhpcyBzbWFydCBwb2ludGVyIHdpbGwgd29yaywgZS5nLgogICAgICAgICAqIDxwcmU+CiAgICAgICAgICogIFBUb0NvbnRyYWN0RWxlbWVudCBmb28gPSAuLi4uOwogICAgICAgICAqICBmb29bNV0gPSAuLi47CiAgICAgICAgICogPC9wcmU+CiAgICAgICAgICogVGhpcyBkb2VzIHJhbmdlLWNoZWNraW5nOyBhY2Nlc3MgdG8gZWxlbWVudHMgYmV5b25kIHRoZSBlbmQgb2YgdGhlCiAgICAgICAgICogYXJyYXkgd2lsbCBjYXVzZSB0aGUgYXJyYXkgdG8gZ3Jvdy4KICAgICAgICAgKi8KICAgICAgICBQVG9Db250cmFjdEVsZW1lbnQgIG9wZXJhdG9yW10oaW50MzJfdCAgaW5kZXgpOwogICAgICAgIFBUb0NvbnRyYWN0RWxlbWVudCAgYXQoaW50MzJfdCAgaW5kZXgpOwoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBFbnRyeVBhaXIgYXQgdGhlIGdpdmVuIGluZGV4LgogICAgICAgICAqIFRoZSBwb2ludGVyIGl0c2VsZiBjYW5ub3QgYmUgbW9kaWZpZWQsIGJ1dCB0aGUgZWxlbWVudHMgaXQgcG9pbnRzIHRvIG1heToKICAgICAgICAgKiA8cHJlPgogICAgICAgICAqICBjb25zdCBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlIGZvbyA9IC4uLi47CiAgICAgICAgICogIGZvb1s1XSA9IC4uLi47ICAgICAgICAgICAgICAvLyBOT1QgQUxMT1dFRAogICAgICAgICAqICBmb29bNV0tPmVudHJ5TmFtZSA9IC4uLi47ICAgLy8gb2sKICAgICAgICAgKiA8L3ByZT4KICAgICAgICAgKiBUaGlzIGRvZXMgbm90IGRvIHJhbmdlLWNoZWNraW5nOyBhbiBpbnZhbGlkIGluZGV4IG1heSBjYXVzZSBhIGNyYXNoLgogICAgICAgICAqIEByZXR1cm4gdGhlIGFjY2Vzc2VkIGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgRW50cnlQYWlyKiAgICAgICAgICBvcGVyYXRvcltdKGludDMyX3QgIGluZGV4KSBjb25zdDsKICAgICAgICBFbnRyeVBhaXIqICAgICAgICAgIGF0KGludDMyX3QgIGluZGV4KSBjb25zdDsKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIGEgZGlmZmVyZW50IHZhbHVlLgogICAgICAgICAqIElmIHRoZXJlIHdhcyBhcmVhZHkgYW4gb2JqZWN0IHN0b3JlZCBhdCB0aGlzIGluZGV4LCBpdCBpcyBkZWxldGVkLgogICAgICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgogICAgICAgICAqLwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgYXRQdXQoICBpbnQzMl90ICAgICAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5UGFpciogICAgICB2YWx1ZSk7CiAgICAgICAgLyoqCiAgICAgICAgICogSW5zZXJ0cyBhIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIHNsaWRpbmcgdGhlIHJlc3Qgb2YKICAgICAgICAgKiB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5IG92ZXIgdG8gbWFrZSByb29tLgogICAgICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBhdEluc2VydCggICBpbnQzMl90ICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5UGFpciogIHZhbHVlKTsKICAgICAgICAvKioKICAgICAgICAgKiAiT3JwaGFuIiB0aGUgcG9pbnRlciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiAgVGhlIGFycmF5IHdpbGwgbm8KICAgICAgICAgKiBsb25nZXIgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0LCBhbmQgdGhlIGNhbGxlciBpcwogICAgICAgICAqIG5vdyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgaXRzIHN0b3JhZ2UuCiAgICAgICAgICovCiAgICAgICAgRW50cnlQYWlyKiAgICAgICAgICBvcnBoYW5BdChpbnQzMl90ICAgIGluZGV4KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCiAgICAgICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB2ZWN0b3IuCiAgICAgICAgICovCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBzaXplKHZvaWQpIGNvbnN0OwoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyB2ZWN0b3Igb2JqZWN0IGlzIHZhbGlkLgogICAgICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgdmVjdG9yIG9iamVjdCBpcyB2YWxpZCwgRkFMU0Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIFVCb29sICAgICAgICAgICAgICBpc0JvZ3VzKHZvaWQpIGNvbnN0OwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgc3RyZWFtSW4gYW5kIHN0cmVhbU91dCBtZXRob2RzIHJlYWQgYW5kIHdyaXRlIG9iamVjdHMgb2YgdGhpcwogICAgICAgICAqIGNsYXNzIGFzIGJpbmFyeSwgcGxhdGZvcm0tZGVwZW5kZW50IGRhdGEgaW4gdGhlIGlvc3RyZWFtLiAgVGhlIHN0cmVhbQogICAgICAgICAqIG11c3QgYmUgaW4gaW9zOjpiaW5hcnkgbW9kZSBmb3IgdGhpcyB0byB3b3JrLiAgVGhlc2UgbWV0aG9kcyBhcmUgbm90CiAgICAgICAgICogaW50ZW5kZWQgZm9yIGdlbmVyYWwgcHVibGljIHVzZTsgdGhleSBhcmUgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGltcHJvdmUKICAgICAgICAgKiBwZXJmb3JtYW5jZSBieSBzdG9yaW5nIGNlcnRhaW4gb2JqZWN0cyBpbiBiaW5hcnkgZmlsZXMuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzdHJlYW1PdXQoRmlsZVN0cmVhbSogb3MpIGNvbnN0OwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc3RyZWFtSW4oRmlsZVN0cmVhbSogaXMpOwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc3RyZWFtT3V0KFVNZW1vcnlTdHJlYW0qIG9zKSBjb25zdDsKICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHN0cmVhbUluKFVNZW1vcnlTdHJlYW0qIGlzKTsKCiAgICBwcml2YXRlOgogICAgICAgIC8qKgogICAgICAgICAqIFJlc2l6ZXMgdGhlIHZlY3RvciBpZiBuZWNlc3Nhcnkgd2hlbiBjb21wYXJlZCB0byBhIG5ldyBzaXplLgogICAgICAgICAqIEBwYXJhbSBuZXdTaXplIHRoZSBuZXcgc2l6ZS4KICAgICAgICAgKi8KICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHJlc2l6ZShpbnQzMl90ICAgICAgbmV3U2l6ZSk7CgogICAgICAgIGludDMyX3QgICAgICAgICAgICAgZlNpemU7CiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBmQ2FwYWNpdHk7CiAgICAgICAgRW50cnlQYWlyKiogICAgICAgICBmRWxlbWVudHM7CiAgICAgICAgVUJvb2wgICAgICAgICAgICAgIGZCb2d1czsKfTsKCmNsYXNzIFZlY3Rvck9mUFRvQ29udHJhY3RUYWJsZTsKCi8qKgogKiBQb2ludGVyIHRvIGVhY2ggY29udHJhY2luZyBlbGVtZW50IGxpc3QuCiAqLwpjbGFzcyBQVG9Db250cmFjdFRhYmxlIHsKICAgIHB1YmxpYzoKICAgICAgICAvKioKICAgICAgICAgKiBEZXN0cnVjdG9yLgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5QVG9Db250cmFjdFRhYmxlKCk7CiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogQXNzaWdubWVudCBvcGVyYXRvcnMuCiAgICAgICAgICogPFA+CiAgICAgICAgICogVGhlIGNvbnRyYWN0aW5nIGVsZW1lbnQgbGlzdCAoaWYgYW55KSB0aGF0IHRoaXMgb2JqZWN0IGFscmVhZHkgcG9pbnRzIHRvCiAgICAgICAgICogaXMgZGVsZXRlZC4KICAgICAgICAgKi8KICAgICAgICBjb25zdCBQVG9Db250cmFjdFRhYmxlJiAgICAgICAgICAgICBvcGVyYXRvcj0oVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQqICAgbmV3VmFsdWUpOwogICAgICAgIGNvbnN0IFBUb0NvbnRyYWN0VGFibGUmICAgICAgICAgICAgIG9wZXJhdG9yPShjb25zdCBQVG9Db250cmFjdFRhYmxlJiAgIHBvaW50ZXJUb05ld1ZhbHVlKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogUG9pbnRlciBvcGVyYXRvciBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KigpIGNvbnN0OwoKICAgIHByaXZhdGU6CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0b3IKICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVG9Db250cmFjdFRhYmxlKFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KiYgICB2YWx1ZSk7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVG9Db250cmFjdFRhYmxlKGNvbnN0IFBUb0NvbnRyYWN0VGFibGUmICAgIHRoYXQpOwoKICAgICAgICBWZWN0b3JPZlBUb0NvbnRyYWN0RWxlbWVudComICAgICAgICAgICAgICAgICAgICAgICAgZlZhbHVlOwoKICAgICAgICBmcmllbmQgY2xhc3MgVmVjdG9yT2ZQVG9Db250cmFjdFRhYmxlOwp9OwoKLyoqCiAqIFRoZSB2ZWN0b3IgdGhhdCBjb250YWlucyBhbGwgY29udHJhY3RpbmcgbGlzdCB0YWJsZXMuCiAqICA8UD4KICogIFRoaXMgaXMgYSB2ZWN0b3IgY2xhc3MgdGhhdCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIHdpdGggcG9pbnRlciB0eXBlcyBhbmQgd2hpY2ggaW1wbGVtZW50cwogKiAgb3duaW5nIHNlbWFudGljcy4gIFRoYXQgaXMsIG9uY2UgYSB2YWx1ZSBpcyBwbGFjZWQgYW4gZWxlbWVudCBvZiB0aGUgdmVjdG9yLCB0aGUgdmVjdG9yIGlzCiAqICBjb25zaWRlcmVkIHRvIG93biBpdCBhbmQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdC4gIFRoaXMgd2lsbCBoYXBwZW4gYm90aCB3aGVuIHRoZQogKiAgZWxlbWVudCBpcyBjaGFuZ2VkIHVzaW5nIGF0UHV0KCkgb3IgdGhyb3VnaCBhbiBQb2ludGVyVG8qKioqLCBhbmQgd2hlbiB0aGUgdmVjdG9yIGl0c2VsZiBpcwogKiAgZGlzcG9zZWQuICAKICogIDxQPgogKiAgV0FSTklORzogIFRoZSBjYWxsZXIgbXVzdCBiZSBjYXJlZnVsIHRvIGF2b2lkIGhvbGRpbmcgb250byBhbnkgZGFuZ2xpbmcgcmVmZXJlbmNlcwogKiAgYWZ0ZXIgdGhlIHZlY3RvciBpcyBkaXNwb3NlZCwgYW5kIHRoZSBjYWxsZXIgbXVzdCBhbHNvIGJlIGNhcmVmdWwgbm90IHRvIHB1dCB0aGUgc2FtZQogKiAgdmFsdWUgaW50byBtb3JlIHRoYW4gb25lIGVsZW1lbnQgaW4gdGhlIHZlY3RvciAodW5sZXNzIHRoZSB2YWx1ZSBpcyBOVUxMKS4KICogIDxQPgogKiAgQXMgd2l0aCBWZWN0b3JPZioqKj4sIHRoZSB2ZWN0b3IgZ3Jvd3MgYXMgbmVjZXNzYXJ5IHRvIGFjY29tbW9kYXRlIGFsbCBlbGVtZW50cywgdGhlCiAqICBzaXplIGlzIG9uZSBwbHVzIHRoZSBpbmRleCBvZiB0aGUgaGlnaGVzdCBlbGVtZW50IHRoYXQncyBiZWVuIHNldCwgYW5kIGFueSBlbGVtZW50cyBiZWxvdwogKiAgdGhlIGhpZ2hlc3QgZWxlbWVudCB0aGF0IGFyZW4ndCBleHBsaWNpdGx5IGluaXRpYWxpemVkIGFyZSBpbml0aWFsaXplZCB0byBOVUxMLgogKi8KY2xhc3MgVmVjdG9yT2ZQVG9Db250cmFjdFRhYmxlIHsKICAgIHB1YmxpYzoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgY2h1bmsgc2l6ZSBieSB3aGljaCB0aGUgYXJyYXkgaXMgZ3Jvd24uCiAgICAgICAgICogVGhpcyBwcm9iYWJseSBzaG91bGRuJ3QgYmUgaW4gdGhlIEFQSQogICAgICAgICAqLwogICAgICAgIGVudW0gRUdyb3d0aFJhdGUgeyBHUk9XVEhfUkFURSA9IDQgfTsKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgdmVjdG9yIHRoYXQgY29udGFpbnMgZWxlbWVudHMgb2YgUFRvQ29udHJhY3RUYWJsZS4KICAgICAgICAgKiBAcGFyYW0gaW5pdGlhbFNpemUgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgdmVjdG9yIG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mUFRvQ29udHJhY3RUYWJsZShpbnQzMl90ICAgIGluaXRpYWxTaXplID0gMCk7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mUFRvQ29udHJhY3RUYWJsZShjb25zdCBWZWN0b3JPZlBUb0NvbnRyYWN0VGFibGUmICAgIHRoYXQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5WZWN0b3JPZlBUb0NvbnRyYWN0VGFibGUoKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQXNzaWdubWVudCBvcGVyYXRvci4KICAgICAgICAgKi8KICAgICAgICBjb25zdCBWZWN0b3JPZlBUb0NvbnRyYWN0VGFibGUmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I9KGNvbnN0IFZlY3Rvck9mUFRvQ29udHJhY3RUYWJsZSYgICB0aGF0KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJuIGEgbW9kaWZpYWJsZSBzbWFydC1wb2ludGVyIHRvIHRoZSBjb250cmFjdGlvbiB0YWJsZQogICAgICAgICAqIGF0IHRoZSBnaXZlbiBpbmRleC4gIEFzc2lnbmluZyB0byB0aGlzIHNtYXJ0IHBvaW50ZXIgd2lsbCB3b3JrLCBlLmcuCiAgICAgICAgICogPHByZT4KICAgICAgICAgKiAgVmVjdG9yT2ZQVG9Db250cmFjdFRhYmxlIGZvbyA9IC4uLi47CiAgICAgICAgICogIGZvb1s1XSA9IC4uLjsKICAgICAgICAgKiA8L3ByZT4KICAgICAgICAgKiBUaGlzIGRvZXMgcmFuZ2UtY2hlY2tpbmc7IGFjY2VzcyB0byBlbGVtZW50cyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKICAgICAgICAgKiBhcnJheSB3aWxsIGNhdXNlIHRoZSBhcnJheSB0byBncm93LgogICAgICAgICAqLwogICAgICAgIFBUb0NvbnRyYWN0VGFibGUgICAgICAgIG9wZXJhdG9yW10oaW50MzJfdCAgaW5kZXgpOwogICAgICAgIFBUb0NvbnRyYWN0VGFibGUgICAgICAgIGF0KGludDMyX3QgIGluZGV4KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY29udHJhY3Rpb24gdGFibGUgYXQgdGhlIGdpdmVuIGluZGV4LgogICAgICAgICAqIFRoZSBwb2ludGVyIGl0c2VsZiBjYW5ub3QgYmUgbW9kaWZpZWQsIGJ1dCB0aGUgZWxlbWVudHMgaXQgcG9pbnRzIHRvIG1heToKICAgICAgICAgKiA8cHJlPgogICAgICAgICAqICBjb25zdCBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlIGZvbyA9IC4uLi47CiAgICAgICAgICogIGZvb1s1XSA9IC4uLi47ICAgICAgICAgICAgICAvLyBOT1QgQUxMT1dFRAogICAgICAgICAqICBmb29bNV1bMF0gPSAuLi4uOyAgICAgICAgICAgLy8gb2sKICAgICAgICAgKiA8L3ByZT4KICAgICAgICAgKiBUaGlzIGRvZXMgbm90IGRvIHJhbmdlLWNoZWNraW5nOyBhbiBpbnZhbGlkIGluZGV4IG1heSBjYXVzZSBhIGNyYXNoLgogICAgICAgICAqIEByZXR1cm4gdGhlIGFjY2Vzc2VkIGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQqICAgICBvcGVyYXRvcltdKGludDMyX3QgIGluZGV4KSBjb25zdDsKICAgICAgICBWZWN0b3JPZlBUb0NvbnRyYWN0RWxlbWVudCogICAgIGF0KGludDMyX3QgIGluZGV4KSBjb25zdDsKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIGEgZGlmZmVyZW50IHZhbHVlLgogICAgICAgICAqIElmIHRoZXJlIHdhcyBhcmVhZHkgYW4gb2JqZWN0IHN0b3JlZCBhdCB0aGlzIGluZGV4LCBpdCBpcyBkZWxldGVkLgogICAgICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgogICAgICAgICAqLwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgYXRQdXQoICBpbnQzMl90ICAgICAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KiB2YWx1ZSk7CiAgICAgICAgLyoqCiAgICAgICAgICogIk9ycGhhbiIgdGhlIHBvaW50ZXIgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4gIFRoZSBhcnJheSB3aWxsIG5vCiAgICAgICAgICogbG9uZ2VyIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCwgYW5kIHRoZSBjYWxsZXIgaXMKICAgICAgICAgKiBub3cgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIGl0cyBzdG9yYWdlLgogICAgICAgICAqLwogICAgICAgIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KiAgICAgb3JwaGFuQXQoaW50MzJfdCAgICBpbmRleCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgogICAgICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGludDMyX3QgICAgICAgICAgICAgc2l6ZSh2b2lkKSBjb25zdDsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgdmVjdG9yIG9iamVjdCBpcyB2YWxpZC4KICAgICAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIHZlY3RvciBvYmplY3QgaXMgdmFsaWQsIEZBTFNFIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBVQm9vbCAgICAgICAgICAgICAgaXNCb2d1cyh2b2lkKSBjb25zdDsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgc3RyZWFtSW4gYW5kIHN0cmVhbU91dCBtZXRob2RzIHJlYWQgYW5kIHdyaXRlIG9iamVjdHMgb2YgdGhpcwogICAgICAgICAqIGNsYXNzIGFzIGJpbmFyeSwgcGxhdGZvcm0tZGVwZW5kZW50IGRhdGEgaW4gdGhlIGlvc3RyZWFtLiAgVGhlIHN0cmVhbQogICAgICAgICAqIG11c3QgYmUgaW4gaW9zOjpiaW5hcnkgbW9kZSBmb3IgdGhpcyB0byB3b3JrLiAgVGhlc2UgbWV0aG9kcyBhcmUgbm90CiAgICAgICAgICogaW50ZW5kZWQgZm9yIGdlbmVyYWwgcHVibGljIHVzZTsgdGhleSBhcmUgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGltcHJvdmUKICAgICAgICAgKiBwZXJmb3JtYW5jZSBieSBzdG9yaW5nIGNlcnRhaW4gb2JqZWN0cyBpbiBiaW5hcnkgZmlsZXMuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzdHJlYW1PdXQoRmlsZVN0cmVhbSogb3MpIGNvbnN0OwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc3RyZWFtSW4oRmlsZVN0cmVhbSogaXMpOwoKICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHN0cmVhbU91dChVTWVtb3J5U3RyZWFtKiBvcykgY29uc3Q7CiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzdHJlYW1JbihVTWVtb3J5U3RyZWFtKiBpcyk7CgogICAgcHJpdmF0ZToKICAgICAgICAvKioKICAgICAgICAgKiBSZXNpemVzIHRoZSB2ZWN0b3IgaWYgbmVjZXNzYXJ5IHdoZW4gY29tcGFyZWQgdG8gYSBuZXcgc2l6ZS4KICAgICAgICAgKiBAcGFyYW0gbmV3U2l6ZSB0aGUgbmV3IHNpemUuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICByZXNpemUoaW50MzJfdCAgICAgIG5ld1NpemUpOwoKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGZTaXplOwogICAgICAgIGludDMyX3QgICAgICAgICAgICAgZkNhcGFjaXR5OwogICAgICAgIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KiogICAgICAgIGZFbGVtZW50czsKICAgICAgICBVQm9vbCAgICAgICAgICAgICAgZkJvZ3VzOwp9OwoKY2xhc3MgUGF0dGVybkVudHJ5OwpjbGFzcyBWZWN0b3JPZlBvaW50ZXJzVG9QYXR0ZXJuRW50cnk7CgovKioKICogIFByb3h5IGNsYXNzIGZvciBhY2Nlc3NpbmcgZWxlbWVudHMgb2YgYSBWZWN0b3JPZlBvaW50ZXJzVG9QYXR0ZXJuRW50cnkKICogIDxQPgogKiAgVGhpcyBjbGFzcyBpcyBhIHNpbXBsZSBwcm94eSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIG93bmluZyBzZW1hbnRpY3MgZm9yIHRoZQogKiAgb3BlcmF0b3JbXSBhbmQgYXQoKSBmdW5jdGlvbnMgb24gVmVjdG9yT2ZQb2ludGVyc1RvUGF0dGVybkVudHJ5LiAgSXQgZW5hYmxlcwogKiAgZXhwcmVzc2lvbnMgbGlrZSAidlszXSA9IHNvbWVOZXdWYWx1ZSIuICBPbmUgbmV2ZXIgY3JlYXRlcyBhIFBvaW50ZXJUb1BhdHRlcm5FbnRyeQogKiAgZGlyZWN0bHksIGFuZCBvbmUgbmV2ZXIgZGVjbGFyZXMgdmFyaWFibGVzIG9mIHRoaXMgdHlwZS4gIEl0IGp1c3QgZXhpc3RzIHRvCiAqICBpbXBsZW1lbnQgdGhlIEFQSSBvZiBWZWN0b3JPZlBvaW50ZXJzVG9QYXR0ZXJuRW50cnkuCiAqLwoKY2xhc3MgUG9pbnRlclRvUGF0dGVybkVudHJ5IHsKICAgIHB1YmxpYzoKICAgICAgICAvKioKICAgICAgICAgKiBEZXN0cnVjdG9yLgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5Qb2ludGVyVG9QYXR0ZXJuRW50cnkoKTsKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBBc3NpZ25tZW50IG9wZXJhdG9ycwogICAgICAgICAqIFRoZSBQYXR0ZXJuRW50cnkgdGhhdCB0aGlzIG9iamVjdCBhbHJlYWR5IHBvaW50cyB0byAoaWYgYW55KSBpcyBkZWxldGVkLgogICAgICAgICAqLwogICAgICAgIGNvbnN0IFBvaW50ZXJUb1BhdHRlcm5FbnRyeSYgICAgICAgIG9wZXJhdG9yPShQYXR0ZXJuRW50cnkqIG5ld1ZhbHVlKTsKICAgICAgICBjb25zdCBQb2ludGVyVG9QYXR0ZXJuRW50cnkmICAgICAgICBvcGVyYXRvcj0oY29uc3QgUG9pbnRlclRvUGF0dGVybkVudHJ5JiAgcG9pbnRlclRvTmV3VmFsdWUpOwoKICAgICAgICAvKioKICAgICAgICAgKiBQb2ludGVyIG9wZXJhdG9yIG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgUGF0dGVybkVudHJ5KigpIGNvbnN0OwoKICAgIHByaXZhdGU6CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0b3IKICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyVG9QYXR0ZXJuRW50cnkoUGF0dGVybkVudHJ5KiYgICAgdmFsdWUpOwogICAgICAgIC8qKgogICAgICAgICAqIENvcHkgY29uc3RydWN0b3IuCiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlclRvUGF0dGVybkVudHJ5KGNvbnN0IFBvaW50ZXJUb1BhdHRlcm5FbnRyeSYgIHRoYXQpOwoKICAgICAgICBQYXR0ZXJuRW50cnkqJiAgICAgICAgICAgICAgICAgICAgICBmVmFsdWU7CgogICAgICAgIGZyaWVuZCBjbGFzcyBWZWN0b3JPZlBvaW50ZXJzVG9QYXR0ZXJuRW50cnk7Cn07CgovKioKICogIFNpbXBsZSBvd25pbmctdmVjdG9yIGNsYXNzCiAqICBUaGlzIGlzIGEgdmVjdG9yIGNsYXNzIHRoYXQgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCB3aXRoIHBvaW50ZXIgdHlwZXMgYW5kIHdoaWNoIGltcGxlbWVudHMKICogIG93bmluZyBzZW1hbnRpY3MuICBUaGF0IGlzLCBvbmNlIGEgdmFsdWUgaXMgcGxhY2VkIGFuIGVsZW1lbnQgb2YgdGhlIHZlY3RvciwgdGhlIHZlY3RvciBpcwogKiAgY29uc2lkZXJlZCB0byBvd24gaXQgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQuICBUaGlzIHdpbGwgaGFwcGVuIGJvdGggd2hlbiB0aGUKICogIGVsZW1lbnQgaXMgY2hhbmdlZCB1c2luZyBhdFB1dCgpIG9yIHRocm91Z2ggYW4gUG9pbnRlclRvKioqKiwgYW5kIHdoZW4gdGhlIHZlY3RvciBpdHNlbGYgaXMKICogIGRpc3Bvc2VkLiAgCiAqICA8UD4KICogIFdBUk5JTkc6ICBUaGUgY2FsbGVyIG11c3QgYmUgY2FyZWZ1bCB0byBhdm9pZCBob2xkaW5nIG9udG8gYW55IGRhbmdsaW5nIHJlZmVyZW5jZXMKICogIGFmdGVyIHRoZSB2ZWN0b3IgaXMgZGlzcG9zZWQsIGFuZCB0aGUgY2FsbGVyIG11c3QgYWxzbyBiZSBjYXJlZnVsIG5vdCB0byBwdXQgdGhlIHNhbWUKICogIHZhbHVlIGludG8gbW9yZSB0aGFuIG9uZSBlbGVtZW50IGluIHRoZSB2ZWN0b3IgKHVubGVzcyB0aGUgdmFsdWUgaXMgTlVMTCkuCiAqICA8UD4KICogIEFzIHdpdGggVmVjdG9yT2YqKio+LCB0aGUgdmVjdG9yIGdyb3dzIGFzIG5lY2Vzc2FyeSB0byBhY2NvbW1vZGF0ZSBhbGwgZWxlbWVudHMsIHRoZQogKiAgc2l6ZSBpcyBvbmUgcGx1cyB0aGUgaW5kZXggb2YgdGhlIGhpZ2hlc3QgZWxlbWVudCB0aGF0J3MgYmVlbiBzZXQsIGFuZCBhbnkgZWxlbWVudHMgYmVsb3cKICogIHRoZSBoaWdoZXN0IGVsZW1lbnQgdGhhdCBhcmVuJ3QgZXhwbGljaXRseSBpbml0aWFsaXplZCBhcmUgaW5pdGlhbGl6ZWQgdG8gTlVMTC4KICovCgpjbGFzcyBWZWN0b3JPZlBvaW50ZXJzVG9QYXR0ZXJuRW50cnkgewogICAgcHVibGljOgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBjaHVuayBzaXplIGJ5IHdoaWNoIHRoZSBhcnJheSBpcyBncm93bi4KICAgICAgICAgKiBUaGlzIHByb2JhYmx5IHNob3VsZG4ndCBiZSBpbiB0aGUgQVBJCiAgICAgICAgICovCiAgICAgICAgZW51bSBFR3Jvd3RoUmF0ZSB7IEdST1dUSF9SQVRFID0gNCB9OwogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSB2ZWN0b3IgdGhhdCBjb250YWlucyBlbGVtZW50cyBvZiBQb2ludGVyVG9QYXR0ZXJuRW50cnkuCiAgICAgICAgICogQHBhcmFtIGluaXRpYWxTaXplIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHZlY3RvciBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yT2ZQb2ludGVyc1RvUGF0dGVybkVudHJ5KGludDMyX3QgIGluaXRpYWxTaXplID0gMCk7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JPZlBvaW50ZXJzVG9QYXR0ZXJuRW50cnkoY29uc3QgVmVjdG9yT2ZQb2ludGVyc1RvUGF0dGVybkVudHJ5JiB0aGF0KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogRGVzdHJ1Y3Rvci4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+VmVjdG9yT2ZQb2ludGVyc1RvUGF0dGVybkVudHJ5KCk7CgogICAgICAgIC8qKgogICAgICAgICAqIEFzc2lnbm1lbnQgb3BlcmF0b3IuCiAgICAgICAgICovCiAgICAgICAgY29uc3QgVmVjdG9yT2ZQb2ludGVyc1RvUGF0dGVybkVudHJ5JiBvcGVyYXRvcj0oY29uc3QgVmVjdG9yT2ZQb2ludGVyc1RvUGF0dGVybkVudHJ5JiB0aGF0KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJuIGEgbW9kaWZpYWJsZSBzbWFydC1wb2ludGVyIHRvIHRoZSBjb250cmFjdGlvbiB0YWJsZQogICAgICAgICAqIGF0IHRoZSBnaXZlbiBpbmRleC4gIEFzc2lnbmluZyB0byB0aGlzIHNtYXJ0IHBvaW50ZXIgd2lsbCB3b3JrLCBlLmcuCiAgICAgICAgICogPHByZT4KICAgICAgICAgKiAgVmVjdG9yT2ZQb2ludGVyc1RvUGF0dGVybkVudHJ5IGZvbyA9IC4uLi47CiAgICAgICAgICogIGZvb1s1XSA9IC4uLjsKICAgICAgICAgKiA8L3ByZT4KICAgICAgICAgKiBUaGlzIGRvZXMgcmFuZ2UtY2hlY2tpbmc7IGFjY2VzcyB0byBlbGVtZW50cyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKICAgICAgICAgKiBhcnJheSB3aWxsIGNhdXNlIHRoZSBhcnJheSB0byBncm93LgogICAgICAgICAqLwogICAgICAgIFBvaW50ZXJUb1BhdHRlcm5FbnRyeSAgICAgICAgICAgICAgIG9wZXJhdG9yW10oaW50MzJfdCAgaW5kZXgpOwogICAgICAgIGlubGluZSBQb2ludGVyVG9QYXR0ZXJuRW50cnkgICAgICAgIGF0KGludDMyX3QgIGluZGV4KSB7IHJldHVybiAoKnRoaXMpW2luZGV4XTsgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBFbnRyeVBhaXIgYXQgdGhlIGdpdmVuIGluZGV4LgogICAgICAgICAqIFRoZSBwb2ludGVyIGl0c2VsZiBjYW5ub3QgYmUgbW9kaWZpZWQsIGJ1dCB0aGUgZWxlbWVudHMgaXQgcG9pbnRzIHRvIG1heToKICAgICAgICAgKiA8cHJlPgogICAgICAgICAqICBjb25zdCBWZWN0b3JPZlBvaW50ZXJzVG9QYXR0ZXJuRW50cnlmb28gPSAuLi4uOwogICAgICAgICAqICBmb29bNV0gPSAuLi4uOyAgICAgICAgICAgICAgLy8gTk9UIEFMTE9XRUQKICAgICAgICAgKiAgZm9vWzVdLT5nZXRTdHJlbmd0aCgpOyAgICAgIC8vIG9rCiAgICAgICAgICogPC9wcmU+CiAgICAgICAgICogVGhpcyBkb2VzIG5vdCBkbyByYW5nZS1jaGVja2luZzsgYW4gaW52YWxpZCBpbmRleCBtYXkgY2F1c2UgYSBjcmFzaC4KICAgICAgICAgKiBAcmV0dXJuIHRoZSBhY2Nlc3NlZCBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIFBhdHRlcm5FbnRyeSogICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yW10oaW50MzJfdCAgaW5kZXgpIGNvbnN0OwogICAgICAgIGlubGluZSBQYXR0ZXJuRW50cnkqICAgICAgICAgICAgICAgIGF0KGludDMyX3QgIGluZGV4KSBjb25zdCB7IHJldHVybiAoKnRoaXMpW2luZGV4XTsgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggdG8gYSBkaWZmZXJlbnQgdmFsdWUuCiAgICAgICAgICogSWYgdGhlcmUgd2FzIGFyZWFkeSBhbiBvYmplY3Qgc3RvcmVkIGF0IHRoaXMgaW5kZXgsIGl0IGlzIGRlbGV0ZWQuCiAgICAgICAgICogQHBhcmFtIGluZGV4IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRQdXQoICBpbnQzMl90ICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdHRlcm5FbnRyeSogICB2YWx1ZSk7CiAgICAgICAgLyoqCiAgICAgICAgICogSW5zZXJ0cyBhIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIHNsaWRpbmcgdGhlIHJlc3Qgb2YKICAgICAgICAgKiB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5IG92ZXIgdG8gbWFrZSByb29tLgogICAgICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRJbnNlcnQoICAgaW50MzJfdCAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0dGVybkVudHJ5KiAgIHZhbHVlKTsKICAgICAgICAvKioKICAgICAgICAgKiAiT3JwaGFuIiB0aGUgcG9pbnRlciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiAgVGhlIGFycmF5IHdpbGwgbm8KICAgICAgICAgKiBsb25nZXIgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0LCBhbmQgdGhlIGNhbGxlciBpcwogICAgICAgICAqIG5vdyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgaXRzIHN0b3JhZ2UuCiAgICAgICAgICovCiAgICAgICAgUGF0dGVybkVudHJ5KiAgICAgICAgICAgICAgICAgICAgICAgb3JwaGFuQXQoaW50MzJfdCAgICBpbmRleCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSB0aGUgdmVjdG9yLgogICAgICAgICAqLwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyKHZvaWQpOwoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KICAgICAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHZlY3Rvci4KICAgICAgICAgKi8KICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKHZvaWQpIGNvbnN0OwoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGV4aXN0cyBpbiB0aGUgdmVjdG9yLCByZXR1cm4gaXRzIGluZGV4LgogICAgICAgICAqIElmIG5vdCwgcmV0dXJuIC0xLgogICAgICAgICAqLwogICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4T2YoY29uc3QgUGF0dGVybkVudHJ5KiB2YWx1ZSkgY29uc3Q7CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJhbmNlIG9mIHZhbHVlIGluIHRoZSB2ZWN0b3IsCiAgICAgICAgICogb3IgLTEgaWYgdGhlIHZlY3RvciBkb2Vzbid0IGNvbnRhaW4gdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEluZGV4T2YoY29uc3QgUGF0dGVybkVudHJ5KiB2YWx1ZSkgY29uc3Q7CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiB0aGlzIHZlY3RvciBvYmplY3QgaXMgdmFsaWQuCiAgICAgICAgICogQHJldHVybiBUUlVFIGlmIHRoZSB2ZWN0b3Igb2JqZWN0IGlzIHZhbGlkLCBGQUxTRSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgVUJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0JvZ3VzKHZvaWQpIGNvbnN0OwogICAgcHJpdmF0ZToKICAgICAgICAvKioKICAgICAgICAgKiBSZXNpemVzIHRoZSB2ZWN0b3IgaWYgbmVjZXNzYXJ5IHdoZW4gY29tcGFyZWQgdG8gYSBuZXcgc2l6ZS4KICAgICAgICAgKiBAcGFyYW0gbmV3U2l6ZSB0aGUgbmV3IHNpemUuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplKGludDMyX3QgICAgICBuZXdTaXplKTsKCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlNpemU7CiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNhcGFjaXR5OwogICAgICAgIFBhdHRlcm5FbnRyeSoqICAgICAgICAgICAgICAgICAgICAgIGZFbGVtZW50czsKICAgICAgICBVQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZCb2d1czsKfTsKCmlubGluZQpFbnRyeVBhaXI6OkVudHJ5UGFpcigpCiAgOiBlbnRyeU5hbWUoKSwgdmFsdWUoMHhmZmZmZmZmZiksIGZ3ZChUUlVFKQp7Cn0KCmlubGluZQpFbnRyeVBhaXI6OkVudHJ5UGFpcihjb25zdCBVbmljb2RlU3RyaW5nICZuYW1lLCBpbnQzMl90IGFWYWx1ZSwgVUJvb2wgYUZ3ZCkKICA6IGVudHJ5TmFtZShuYW1lKSwgdmFsdWUoYVZhbHVlKSwgZndkKGFGd2QpCnsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gTUVUSE9EUyBPTiBWZWN0b3JPZkludAovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKaW5saW5lIGludDMyX3QKVmVjdG9yT2ZJbnQ6Om9wZXJhdG9yW10oaW50MzJfdCBpbmRleCkgY29uc3QKewogICAgcmV0dXJuIChpbmRleCA8IGZDYXBhY2l0eSkgPyBmRWxlbWVudHNbaW5kZXhdIDogMDsKfQoKCmlubGluZSBpbnQzMl90ClZlY3Rvck9mSW50OjphdChpbnQzMl90IGluZGV4KSBjb25zdAp7CiAgICByZXR1cm4gKCp0aGlzKVtpbmRleF07Cn0KCmlubGluZSBpbnQzMl90JgpWZWN0b3JPZkludDo6YXQoaW50MzJfdCBpbmRleCkKewogICAgcmV0dXJuICgqdGhpcylbaW5kZXhdOwp9CgppbmxpbmUgaW50MzJfdApWZWN0b3JPZkludDo6c2l6ZSgpIGNvbnN0CnsKICAgIHJldHVybiBmU2l6ZTsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gTUVUSE9EUyBPTiBWZWN0b3JPZlBvaW50ZXIKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmlubGluZSB2b2lkKgpWZWN0b3JPZlBvaW50ZXI6Om9wZXJhdG9yW10oaW50MzJfdCBpbmRleCkgY29uc3QKewogICAgcmV0dXJuIChpbmRleCA8IGZDYXBhY2l0eSkgPyBmRWxlbWVudHNbaW5kZXhdIDogMDsKfQoKCmlubGluZSB2b2lkKgpWZWN0b3JPZlBvaW50ZXI6OmF0KGludDMyX3QgaW5kZXgpIGNvbnN0CnsKICAgIHJldHVybiAoKnRoaXMpW2luZGV4XTsKfQoKaW5saW5lIHZvaWQqJgpWZWN0b3JPZlBvaW50ZXI6OmF0KGludDMyX3QgaW5kZXgpCnsKICAgIHJldHVybiAoKnRoaXMpW2luZGV4XTsKfQoKaW5saW5lIGludDMyX3QKVmVjdG9yT2ZQb2ludGVyOjpzaXplKCkgY29uc3QKewogICAgcmV0dXJuIGZTaXplOwp9Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIE1FVEhPRFMgT04gUFRvRXhwYW5kVGFibGUKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmlubGluZQpQVG9FeHBhbmRUYWJsZTo6b3BlcmF0b3IgVmVjdG9yT2ZJbnQqKCkgY29uc3QKewogICAgcmV0dXJuIGZWYWx1ZTsKfQoKaW5saW5lClBUb0V4cGFuZFRhYmxlOjpQVG9FeHBhbmRUYWJsZShWZWN0b3JPZkludComICAgIHZhbHVlKQo6IGZWYWx1ZSh2YWx1ZSkKewp9CgppbmxpbmUKUFRvRXhwYW5kVGFibGU6OlBUb0V4cGFuZFRhYmxlKGNvbnN0IFBUb0V4cGFuZFRhYmxlJiAgICB0aGF0KQo6IGZWYWx1ZSh0aGF0LmZWYWx1ZSkKewp9CgppbmxpbmUKUFRvRXhwYW5kVGFibGU6On5QVG9FeHBhbmRUYWJsZSgpCnsKfQoKaW5saW5lIGNvbnN0IFBUb0V4cGFuZFRhYmxlJgpQVG9FeHBhbmRUYWJsZTo6b3BlcmF0b3I9KFZlY3Rvck9mSW50KiAgbmV3VmFsdWUpCnsKICAgIGRlbGV0ZSBmVmFsdWU7CiAgICBmVmFsdWUgPSBuZXdWYWx1ZTsKICAgIHJldHVybiAqdGhpczsKfQoKaW5saW5lIGNvbnN0IFBUb0V4cGFuZFRhYmxlJgpQVG9FeHBhbmRUYWJsZTo6b3BlcmF0b3I9KGNvbnN0IFBUb0V4cGFuZFRhYmxlJiBwb2ludGVyVG9OZXdWYWx1ZSkKewogICAgZGVsZXRlIGZWYWx1ZTsKICAgIGZWYWx1ZSA9IChWZWN0b3JPZkludCopKHBvaW50ZXJUb05ld1ZhbHVlKTsKICAgIHJldHVybiAqdGhpczsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gTUVUSE9EUyBPTiBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmlubGluZSBWZWN0b3JPZkludCoKVmVjdG9yT2ZQVG9FeHBhbmRUYWJsZTo6b3BlcmF0b3JbXShpbnQzMl90ICBpbmRleCkgY29uc3QKewogICAgcmV0dXJuIChpbmRleCA8IGZDYXBhY2l0eSkgPyBmRWxlbWVudHNbaW5kZXhdIDogMDsKfQoKaW5saW5lIFZlY3Rvck9mSW50KgpWZWN0b3JPZlBUb0V4cGFuZFRhYmxlOjphdChpbnQzMl90ICBpbmRleCkgY29uc3QKewogICAgcmV0dXJuICgqdGhpcylbaW5kZXhdOwp9CgppbmxpbmUgUFRvRXhwYW5kVGFibGUKVmVjdG9yT2ZQVG9FeHBhbmRUYWJsZTo6YXQoaW50MzJfdCAgaW5kZXgpCnsKICAgIHJldHVybiAoKnRoaXMpW2luZGV4XTsKfQoKaW5saW5lIGludDMyX3QKVmVjdG9yT2ZQVG9FeHBhbmRUYWJsZTo6c2l6ZSgpIGNvbnN0CnsKICAgIHJldHVybiBmU2l6ZTsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gTUVUSE9EUyBPTiBQVG9Db250cmFjdEVsZW1lbnQKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmlubGluZQpQVG9Db250cmFjdEVsZW1lbnQ6Om9wZXJhdG9yIEVudHJ5UGFpciooKSBjb25zdAp7CiAgICByZXR1cm4gZlZhbHVlOwp9CgppbmxpbmUKUFRvQ29udHJhY3RFbGVtZW50OjpQVG9Db250cmFjdEVsZW1lbnQoRW50cnlQYWlyKiYgIHZhbHVlKQo6IGZWYWx1ZSh2YWx1ZSkKewp9CgppbmxpbmUKUFRvQ29udHJhY3RFbGVtZW50OjpQVG9Db250cmFjdEVsZW1lbnQoY29uc3QgUFRvQ29udHJhY3RFbGVtZW50JiAgICB0aGF0KQo6IGZWYWx1ZSh0aGF0LmZWYWx1ZSkKewp9CgppbmxpbmUKUFRvQ29udHJhY3RFbGVtZW50Ojp+UFRvQ29udHJhY3RFbGVtZW50KCkKewp9CgppbmxpbmUgY29uc3QgUFRvQ29udHJhY3RFbGVtZW50JgpQVG9Db250cmFjdEVsZW1lbnQ6Om9wZXJhdG9yPShFbnRyeVBhaXIqICAgIG5ld1ZhbHVlKQp7CiAgICBkZWxldGUgZlZhbHVlOwogICAgZlZhbHVlID0gbmV3VmFsdWU7CiAgICByZXR1cm4gKnRoaXM7Cn0KCmlubGluZSBjb25zdCBQVG9Db250cmFjdEVsZW1lbnQmClBUb0NvbnRyYWN0RWxlbWVudDo6b3BlcmF0b3I9KGNvbnN0IFBUb0NvbnRyYWN0RWxlbWVudCYgcG9pbnRlclRvTmV3VmFsdWUpCnsKICAgIGRlbGV0ZSBmVmFsdWU7CiAgICBmVmFsdWUgPSAoRW50cnlQYWlyKikocG9pbnRlclRvTmV3VmFsdWUpOwogICAgcmV0dXJuICp0aGlzOwp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBNRVRIT0RTIE9OIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgppbmxpbmUgRW50cnlQYWlyKgpWZWN0b3JPZlBUb0NvbnRyYWN0RWxlbWVudDo6b3BlcmF0b3JbXShpbnQzMl90ICBpbmRleCkgY29uc3QKewogICAgcmV0dXJuIChpbmRleCA8IGZDYXBhY2l0eSkgPyBmRWxlbWVudHNbaW5kZXhdIDogMDsKfQoKaW5saW5lIEVudHJ5UGFpcioKVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQ6OmF0KGludDMyX3QgIGluZGV4KSBjb25zdAp7CiAgICByZXR1cm4gKCp0aGlzKVtpbmRleF07Cn0KCmlubGluZSBQVG9Db250cmFjdEVsZW1lbnQKVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQ6OmF0KGludDMyX3QgIGluZGV4KQp7CiAgICByZXR1cm4gKCp0aGlzKVtpbmRleF07Cn0KCmlubGluZSBpbnQzMl90ClZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50OjpzaXplKCkgY29uc3QKewogICAgcmV0dXJuIGZTaXplOwp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBNRVRIT0RTIE9OIFBUb0NvbnRyYWN0VGFibGUKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmlubGluZQpQVG9Db250cmFjdFRhYmxlOjpvcGVyYXRvciBWZWN0b3JPZlBUb0NvbnRyYWN0RWxlbWVudCooKSBjb25zdAp7CiAgICByZXR1cm4gZlZhbHVlOwp9CgppbmxpbmUKUFRvQ29udHJhY3RUYWJsZTo6UFRvQ29udHJhY3RUYWJsZShWZWN0b3JPZlBUb0NvbnRyYWN0RWxlbWVudComIHZhbHVlKQo6IGZWYWx1ZSh2YWx1ZSkKewp9CgppbmxpbmUKUFRvQ29udHJhY3RUYWJsZTo6UFRvQ29udHJhY3RUYWJsZShjb25zdCBQVG9Db250cmFjdFRhYmxlJiAgdGhhdCkKOiBmVmFsdWUodGhhdC5mVmFsdWUpCnsKfQoKaW5saW5lClBUb0NvbnRyYWN0VGFibGU6On5QVG9Db250cmFjdFRhYmxlKCkKewp9CgppbmxpbmUgY29uc3QgUFRvQ29udHJhY3RUYWJsZSYKUFRvQ29udHJhY3RUYWJsZTo6b3BlcmF0b3I9KFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KiBuZXdWYWx1ZSkKewogICAgZGVsZXRlIGZWYWx1ZTsKICAgIGZWYWx1ZSA9IG5ld1ZhbHVlOwogICAgcmV0dXJuICp0aGlzOwp9CgppbmxpbmUgY29uc3QgUFRvQ29udHJhY3RUYWJsZSYKUFRvQ29udHJhY3RUYWJsZTo6b3BlcmF0b3I9KGNvbnN0IFBUb0NvbnRyYWN0VGFibGUmIHBvaW50ZXJUb05ld1ZhbHVlKQp7CiAgICBkZWxldGUgZlZhbHVlOwogICAgZlZhbHVlID0gKFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KikocG9pbnRlclRvTmV3VmFsdWUpOwogICAgcmV0dXJuICp0aGlzOwp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBNRVRIT0RTIE9OIFZlY3Rvck9mUFRvQ29udHJhY3RUYWJsZQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKaW5saW5lIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KgpWZWN0b3JPZlBUb0NvbnRyYWN0VGFibGU6Om9wZXJhdG9yW10oaW50MzJfdCAgICBpbmRleCkgY29uc3QKewogICAgcmV0dXJuIChpbmRleCA8IGZDYXBhY2l0eSkgPyBmRWxlbWVudHNbaW5kZXhdIDogMDsKfQoKaW5saW5lIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KgpWZWN0b3JPZlBUb0NvbnRyYWN0VGFibGU6OmF0KGludDMyX3QgICAgaW5kZXgpIGNvbnN0CnsKICAgIHJldHVybiAoKnRoaXMpW2luZGV4XTsKfQoKaW5saW5lIFBUb0NvbnRyYWN0VGFibGUKVmVjdG9yT2ZQVG9Db250cmFjdFRhYmxlOjphdChpbnQzMl90ICAgIGluZGV4KQp7CiAgICByZXR1cm4gKCp0aGlzKVtpbmRleF07Cn0KCmlubGluZSBpbnQzMl90ClZlY3Rvck9mUFRvQ29udHJhY3RUYWJsZTo6c2l6ZSgpIGNvbnN0CnsKICAgIHJldHVybiBmU2l6ZTsKfQoKI2VuZGlmCg==