Ly8KLy8gqSBDb3B5cmlnaHQgSGVucmlrIFJhdm4gMjAwNAovLwovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KLy8gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi8vCgp1c2luZyBTeXN0ZW07CnVzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwoKbmFtZXNwYWNlIERvdFpMaWIKewoKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBJbXBsZW1lbnRzIGEgZGF0YSBjb21wcmVzc29yLCB1c2luZyB0aGUgZGVmbGF0ZSBhbGdvcml0aG0gaW4gdGhlIFpMaWIgZGxsCiAgICAvLy8gPC9zdW1tYXJ5PgoJcHVibGljIHNlYWxlZCBjbGFzcyBEZWZsYXRlciA6IENvZGVjQmFzZQoJewogICAgICAgICNyZWdpb24gRGxsIGltcG9ydHMKICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCwgQ2hhclNldD1DaGFyU2V0LkFuc2kpXQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZGVmbGF0ZUluaXRfKHJlZiBaU3RyZWFtIHN6LCBpbnQgbGV2ZWwsIHN0cmluZyB2cywgaW50IHNpemUpOwoKICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBkZWZsYXRlKHJlZiBaU3RyZWFtIHN6LCBpbnQgZmx1c2gpOwoKICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBkZWZsYXRlUmVzZXQocmVmIFpTdHJlYW0gc3opOwoKICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBkZWZsYXRlRW5kKHJlZiBaU3RyZWFtIHN6KTsKICAgICAgICAjZW5kcmVnaW9uCgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gQ29uc3RydWN0cyBhbiBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxjPkRlZmxhdGVyPC9jPgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZXZlbCI+VGhlIGNvbXByZXNzaW9uIGxldmVsIHRvIHVzZSBmb3IgdGhpcyA8Yz5EZWZsYXRlcjwvYz48L3BhcmFtPgoJCXB1YmxpYyBEZWZsYXRlcihDb21wcmVzc0xldmVsIGxldmVsKSA6IGJhc2UoKQoJCXsKICAgICAgICAgICAgaW50IHJldHZhbCA9IGRlZmxhdGVJbml0XyhyZWYgX3p0cmVhbSwgKGludClsZXZlbCwgSW5mby5WZXJzaW9uLCBNYXJzaGFsLlNpemVPZihfenRyZWFtKSk7CiAgICAgICAgICAgIGlmIChyZXR2YWwgIT0gMCkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBaTGliRXhjZXB0aW9uKHJldHZhbCwgIkNvdWxkIG5vdCBpbml0aWFsaXplIGRlZmxhdGVyIik7CgogICAgICAgICAgICByZXNldE91dHB1dCgpOwoJCX0KCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBBZGRzIG1vcmUgZGF0YSB0byB0aGUgY29kZWMgdG8gYmUgcHJvY2Vzc2VkLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5CeXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgYWRkZWQgdG8gdGhlIGNvZGVjPC9wYXJhbT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIHRvIGFkZCBmcm9tIDxjPmRhdGE8L2M+PC9wYXJhbT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZDwvcGFyYW0+CiAgICAgICAgLy8vIDxyZW1hcmtzPkFkZGluZyBkYXRhIG1heSwgb3IgbWF5IG5vdCwgcmFpc2UgdGhlIDxjPkRhdGFBdmFpbGFibGU8L2M+IGV2ZW50PC9yZW1hcmtzPgogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEFkZChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigpOwogICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKICAgICAgICAgICAgaWYgKChvZmZzZXQrY291bnQpID4gZGF0YS5MZW5ndGgpIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOwoKICAgICAgICAgICAgaW50IHRvdGFsID0gY291bnQ7CiAgICAgICAgICAgIGludCBpbnB1dEluZGV4ID0gb2Zmc2V0OwogICAgICAgICAgICBpbnQgZXJyID0gMDsKCiAgICAgICAgICAgIHdoaWxlIChlcnIgPj0gMCAmJiBpbnB1dEluZGV4IDwgdG90YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvcHlJbnB1dChkYXRhLCBpbnB1dEluZGV4LCBNYXRoLk1pbih0b3RhbCAtIGlucHV0SW5kZXgsIGtCdWZmZXJTaXplKSk7CiAgICAgICAgICAgICAgICB3aGlsZSAoZXJyID49IDAgJiYgX3p0cmVhbS5hdmFpbF9pbiA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyID0gZGVmbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLk5vbmUpOwogICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF96dHJlYW0uYXZhaWxfb3V0ID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uRGF0YUF2YWlsYWJsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZGVmbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLk5vbmUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCArPSAoaW50KV96dHJlYW0udG90YWxfaW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0Q2hlY2tzdW0oIF96dHJlYW0uYWRsZXIgKTsKICAgICAgICB9CgoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEZpbmlzaGVzIHVwIGFueSBwZW5kaW5nIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYW5kIGhhbmRsZWQuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGaW5pc2goKQogICAgICAgIHsKICAgICAgICAgICAgaW50IGVycjsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZXJyID0gZGVmbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLkZpbmlzaCk7CiAgICAgICAgICAgICAgICBPbkRhdGFBdmFpbGFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoZXJyID09IDApOwogICAgICAgICAgICBzZXRDaGVja3N1bSggX3p0cmVhbS5hZGxlciApOwogICAgICAgICAgICBkZWZsYXRlUmVzZXQocmVmIF96dHJlYW0pOwogICAgICAgICAgICByZXNldE91dHB1dCgpOwogICAgICAgIH0KCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBDbG9zZXMgdGhlIGludGVybmFsIHpsaWIgZGVmbGF0ZSBzdHJlYW0KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIENsZWFuVXAoKSB7IGRlZmxhdGVFbmQocmVmIF96dHJlYW0pOyB9CgogICAgfQp9Cg==