Ly8KLy8gqSBDb3B5cmlnaHQgSGVucmlrIFJhdm4gMjAwNAovLwovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KLy8gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi8vCgp1c2luZyBTeXN0ZW07CnVzaW5nIFN5c3RlbS5JTzsKdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwoKbmFtZXNwYWNlIERvdFpMaWIKewoJLy8vIDxzdW1tYXJ5PgoJLy8vIEltcGxlbWVudHMgYSBjb21wcmVzc2VkIDxzZWUgY3JlZj0iU3RyZWFtIi8+LCBpbiBHWmlwICguZ3opIGZvcm1hdC4KCS8vLyA8L3N1bW1hcnk+CglwdWJsaWMgY2xhc3MgR1ppcFN0cmVhbSA6IFN0cmVhbSwgSURpc3Bvc2FibGUKCXsKICAgICAgICAjcmVnaW9uIERsbCBJbXBvcnRzCiAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wsIENoYXJTZXQ9Q2hhclNldC5BbnNpKV0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gSW50UHRyIGd6b3BlbihzdHJpbmcgbmFtZSwgc3RyaW5nIG1vZGUpOwoKICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBnemNsb3NlKEludFB0ciBnekZpbGUpOwoKICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBnendyaXRlKEludFB0ciBnekZpbGUsIGludCBkYXRhLCBpbnQgbGVuZ3RoKTsKCiAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZ3pyZWFkKEludFB0ciBnekZpbGUsIGludCBkYXRhLCBpbnQgbGVuZ3RoKTsKCiAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZ3pnZXRjKEludFB0ciBnekZpbGUpOwoKICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBnenB1dGMoSW50UHRyIGd6RmlsZSwgaW50IGMpOwoKICAgICAgICAjZW5kcmVnaW9uCgogICAgICAgICNyZWdpb24gUHJpdmF0ZSBkYXRhCiAgICAgICAgcHJpdmF0ZSBJbnRQdHIgX2d6RmlsZTsKICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQgPSBmYWxzZTsKICAgICAgICBwcml2YXRlIGJvb2wgX2lzV3JpdGluZzsKICAgICAgICAjZW5kcmVnaW9uCgogICAgICAgICNyZWdpb24gQ29uc3RydWN0b3JzCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBDcmVhdGVzIGEgbmV3IGZpbGUgYXMgYSB3cml0ZWFibGUgR1ppcFN0cmVhbQogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlTmFtZSI+VGhlIG5hbWUgb2YgdGhlIGNvbXByZXNzZWQgZmlsZSB0byBjcmVhdGU8L3BhcmFtPgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGV2ZWwiPlRoZSBjb21wcmVzc2lvbiBsZXZlbCB0byB1c2Ugd2hlbiBhZGRpbmcgZGF0YTwvcGFyYW0+CiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iWkxpYkV4Y2VwdGlvbiI+SWYgYW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGludGVybmFsIHpsaWIgZnVuY3Rpb248L2V4Y2VwdGlvbj4KCQlwdWJsaWMgR1ppcFN0cmVhbShzdHJpbmcgZmlsZU5hbWUsIENvbXByZXNzTGV2ZWwgbGV2ZWwpCgkJewogICAgICAgICAgICBfaXNXcml0aW5nID0gdHJ1ZTsKICAgICAgICAgICAgX2d6RmlsZSA9IGd6b3BlbihmaWxlTmFtZSwgU3RyaW5nLkZvcm1hdCgid2J7MH0iLCAoaW50KWxldmVsKSk7CiAgICAgICAgICAgIGlmIChfZ3pGaWxlID09IEludFB0ci5aZXJvKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpMaWJFeGNlcHRpb24oLTEsICJDb3VsZCBub3Qgb3BlbiAiICsgZmlsZU5hbWUpOwoJCX0KCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBPcGVucyBhbiBleGlzdGluZyBmaWxlIGFzIGEgcmVhZGFibGUgR1ppcFN0cmVhbQogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlTmFtZSI+VGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gb3BlbjwvcGFyYW0+CiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iWkxpYkV4Y2VwdGlvbiI+SWYgYW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGludGVybmFsIHpsaWIgZnVuY3Rpb248L2V4Y2VwdGlvbj4KICAgICAgICBwdWJsaWMgR1ppcFN0cmVhbShzdHJpbmcgZmlsZU5hbWUpCiAgICAgICAgewogICAgICAgICAgICBfaXNXcml0aW5nID0gZmFsc2U7CiAgICAgICAgICAgIF9nekZpbGUgPSBnem9wZW4oZmlsZU5hbWUsICJyYiIpOwogICAgICAgICAgICBpZiAoX2d6RmlsZSA9PSBJbnRQdHIuWmVybykKICAgICAgICAgICAgICAgIHRocm93IG5ldyBaTGliRXhjZXB0aW9uKC0xLCAiQ291bGQgbm90IG9wZW4gIiArIGZpbGVOYW1lKTsKCiAgICAgICAgfQogICAgICAgICNlbmRyZWdpb24KCiAgICAgICAgI3JlZ2lvbiBBY2Nlc3MgcHJvcGVydGllcwogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gUmV0dXJucyB0cnVlIG9mIHRoaXMgc3RyZWFtIGNhbiBiZSByZWFkIGZyb20sIGZhbHNlIG90aGVyd2lzZQogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuUmVhZAogICAgICAgIHsKICAgICAgICAgICAgZ2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAhX2lzV3JpdGluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KCgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gUmV0dXJucyBmYWxzZS4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhblNlZWsKICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdHNyZWFtIGlzIHdyaXRlYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5Xcml0ZQogICAgICAgIHsKICAgICAgICAgICAgZ2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBfaXNXcml0aW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICNlbmRyZWdpb24KCiAgICAgICAgI3JlZ2lvbiBEZXN0cnVjdG9yICYgSURpc3Bvc2Ugc3R1ZmYKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBEZXN0cm95cyB0aGlzIGluc3RhbmNlCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICB+R1ppcFN0cmVhbSgpCiAgICAgICAgewogICAgICAgICAgICBjbGVhblVwKGZhbHNlKTsKICAgICAgICB9CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gQ2xvc2VzIHRoZSBleHRlcm5hbCBmaWxlIGhhbmRsZQogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCiAgICAgICAgewogICAgICAgICAgICBjbGVhblVwKHRydWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gRG9lcyB0aGUgYWN0dWFsIGNsb3Npbmcgb2YgdGhlIGZpbGUgaGFuZGxlLgogICAgICAgIHByaXZhdGUgdm9pZCBjbGVhblVwKGJvb2wgaXNEaXNwb3NpbmcpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBnemNsb3NlKF9nekZpbGUpOwogICAgICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICNlbmRyZWdpb24KCiAgICAgICAgI3JlZ2lvbiBCYXNpYyByZWFkaW5nIGFuZCB3cml0aW5nCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBBdHRlbXB0cyB0byByZWFkIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnVmZmVyIj5UaGUgZGVzdGluYXRpb24gZGF0YSBidWZmZXI8L3BhcmFtPgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIGJ5dGUgaW4gPGM+YnVmZmVyPC9jPjwvcGFyYW0+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyByZXF1ZXN0ZWQ8L3BhcmFtPgogICAgICAgIC8vLyA8cmV0dXJucz5UaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQ8L3JldHVybnM+CiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnROdWxsRXhjZXB0aW9uIj5JZiA8Yz5idWZmZXI8L2M+IGlzIG51bGw8L2V4Y2VwdGlvbj4KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24iPklmIDxjPmNvdW50PC9jPiBvciA8Yz5vZmZzZXQ8L2M+IGFyZSBuZWdhdGl2ZTwvZXhjZXB0aW9uPgogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj5JZiA8Yz5vZmZzZXQ8L2M+ICArIDxjPmNvdW50PC9jPiBpcyAmZ3Q7IGJ1ZmZlci5MZW5ndGg8L2V4Y2VwdGlvbj4KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iPklmIHRoaXMgc3RyZWFtIGlzIG5vdCByZWFkYWJsZS48L2V4Y2VwdGlvbj4KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJPYmplY3REaXNwb3NlZEV4Y2VwdGlvbiI+SWYgdGhpcyBzdHJlYW0gaGFzIGJlZW4gZGlzcG9zZWQuPC9leGNlcHRpb24+CiAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQ2FuUmVhZCkgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOwogICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oKTsKICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgY291bnQgPCAwKSB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7CiAgICAgICAgICAgIGlmICgob2Zmc2V0K2NvdW50KSA+IGJ1ZmZlci5MZW5ndGgpIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOwogICAgICAgICAgICBpZiAoX2lzRGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiR1ppcFN0cmVhbSIpOwoKICAgICAgICAgICAgR0NIYW5kbGUgaCA9IEdDSGFuZGxlLkFsbG9jKGJ1ZmZlciwgR0NIYW5kbGVUeXBlLlBpbm5lZCk7CiAgICAgICAgICAgIGludCByZXN1bHQ7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBnenJlYWQoX2d6RmlsZSwgaC5BZGRyT2ZQaW5uZWRPYmplY3QoKS5Ub0ludDMyKCkgKyBvZmZzZXQsIGNvdW50KTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbmFsbHkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaC5GcmVlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gQXR0ZW1wdHMgdG8gcmVhZCBhIHNpbmdsZSBieXRlIGZyb20gdGhlIHN0cmVhbS4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cmV0dXJucz5UaGUgYnl0ZSB0aGF0IHdhcyByZWFkLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yIG9yIEVuZC1PZi1GaWxlPC9yZXR1cm5zPgogICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZEJ5dGUoKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFDYW5SZWFkKSB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CiAgICAgICAgICAgIGlmIChfaXNEaXNwb3NlZCkgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJHWmlwU3RyZWFtIik7CiAgICAgICAgICAgIHJldHVybiBnemdldGMoX2d6RmlsZSk7CiAgICAgICAgfQoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFdyaXRlcyBhIG51bWJlciBvZiBieXRlcyB0byB0aGUgc3RyZWFtCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZmZlciI+PC9wYXJhbT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+PC9wYXJhbT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij48L3BhcmFtPgogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+SWYgPGM+YnVmZmVyPC9jPiBpcyBudWxsPC9leGNlcHRpb24+CiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj5JZiA8Yz5jb3VudDwvYz4gb3IgPGM+b2Zmc2V0PC9jPiBhcmUgbmVnYXRpdmU8L2V4Y2VwdGlvbj4KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudEV4Y2VwdGlvbiI+SWYgPGM+b2Zmc2V0PC9jPiAgKyA8Yz5jb3VudDwvYz4gaXMgJmd0OyBidWZmZXIuTGVuZ3RoPC9leGNlcHRpb24+CiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBpcyBub3Qgd3JpdGVhYmxlLjwvZXhjZXB0aW9uPgogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik9iamVjdERpc3Bvc2VkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBoYXMgYmVlbiBkaXNwb3NlZC48L2V4Y2VwdGlvbj4KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUNhbldyaXRlKSB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CiAgICAgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigpOwogICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKICAgICAgICAgICAgaWYgKChvZmZzZXQrY291bnQpID4gYnVmZmVyLkxlbmd0aCkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgICAgICAgICAgIGlmIChfaXNEaXNwb3NlZCkgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJHWmlwU3RyZWFtIik7CgogICAgICAgICAgICBHQ0hhbmRsZSBoID0gR0NIYW5kbGUuQWxsb2MoYnVmZmVyLCBHQ0hhbmRsZVR5cGUuUGlubmVkKTsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBnendyaXRlKF9nekZpbGUsIGguQWRkck9mUGlubmVkT2JqZWN0KCkuVG9JbnQzMigpICsgb2Zmc2V0LCBjb3VudCk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaW5hbGx5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGguRnJlZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFdyaXRlcyBhIHNpbmdsZSBieXRlIHRvIHRoZSBzdHJlYW0KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBieXRlIHRvIGFkZCB0byB0aGUgc3RyZWFtLjwvcGFyYW0+CiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBpcyBub3Qgd3JpdGVhYmxlLjwvZXhjZXB0aW9uPgogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik9iamVjdERpc3Bvc2VkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBoYXMgYmVlbiBkaXNwb3NlZC48L2V4Y2VwdGlvbj4KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJ5dGUoYnl0ZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQ2FuV3JpdGUpIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkdaaXBTdHJlYW0iKTsKCiAgICAgICAgICAgIGludCByZXN1bHQgPSBnenB1dGMoX2d6RmlsZSwgKGludCl2YWx1ZSk7CiAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7CiAgICAgICAgfQogICAgICAgICNlbmRyZWdpb24KCiAgICAgICAgI3JlZ2lvbiBQb3NpdGlvbiAmIGxlbmd0aCBzdHVmZgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gTm90IHN1cHBvcnRlZC4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPjwvcGFyYW0+CiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5BbHdheXMgdGhyb3duPC9leGNlcHRpb24+CiAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2V0TGVuZ3RoKGxvbmcgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CiAgICAgICAgfQoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vICBOb3Qgc3VwcHBvcnRlZC4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij48L3BhcmFtPgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3JpZ2luIj48L3BhcmFtPgogICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5BbHdheXMgdGhyb3duPC9leGNlcHRpb24+CiAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgU2Vlayhsb25nIG9mZnNldCwgU2Vla09yaWdpbiBvcmlnaW4pCiAgICAgICAgewogICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CiAgICAgICAgfQoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEZsdXNoZXMgdGhlIDxjPkdaaXBTdHJlYW08L2M+LgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxyZW1hcmtzPkluIHRoaXMgaW1wbGVtZW50YXRpb24sIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4gVGhpcyBpcyBiZWNhdXNlIGV4Y2Vzc2l2ZQogICAgICAgIC8vLyBmbHVzaGluZyBtYXkgZGVncmFkZSB0aGUgYWNoaWV2YWJsZSBjb21wcmVzc2lvbiByYXRlcy48L3JlbWFya3M+CiAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQogICAgICAgIHsKICAgICAgICAgICAgLy8gbGVmdCBlbXB0eSBvbiBwdXJwb3NlCiAgICAgICAgfQoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEdldHMvc2V0cyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgPGM+R1ppcFN0cmVhbTwvYz4uIE5vdCBzdXBwcG9ydGVkLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxyZW1hcmtzPkluIHRoaXMgaW1wbGVtZW50YXRpb24gdGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkPC9yZW1hcmtzPgogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik5vdFN1cHBvcnRlZEV4Y2VwdGlvbiI+QWx3YXlzIHRocm93bjwvZXhjZXB0aW9uPgogICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFBvc2l0aW9uCiAgICAgICAgewogICAgICAgICAgICBnZXQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gR2V0cyB0aGUgc2l6ZSBvZiB0aGUgc3RyZWFtLiBOb3Qgc3VwcHBvcnRlZC4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cmVtYXJrcz5JbiB0aGlzIGltcGxlbWVudGF0aW9uIHRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZDwvcmVtYXJrcz4KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iPkFsd2F5cyB0aHJvd248L2V4Y2VwdGlvbj4KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBMZW5ndGgKICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgI2VuZHJlZ2lvbgogICAgfQp9Cg==