Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IDIwMjEsIERpbmVzaCBBbm5heXlhCi8vIAovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKLy8gU1BEWC1GaWxlQ29udHJpYnV0b3I6IERpbmVzaCBBbm5heXlhIDxkaW5lc2hhQG9wZW5jb3Jlcy5vcmc+Ci8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICB5aWZpdmUgV2lzaGJvbmUgaW50ZXJmYWNlIGZvciBJbnN0cnVjdGlvbiBtZW1vcnkgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHlpZml2ZSBjb3JlcyBwcm9qZWN0ICAgICAgICAgICAgICAgLy8vLwovLy8vICBodHRwczovL2dpdGh1Yi5jb20vZGluZXNoYW5uYXl5YS95aWZpdmVfcjAuZ2l0ICAgICAgICAgICAgICAvLy8vCi8vLy8gIGh0dHA6Ly93d3cub3BlbmNvcmVzLm9yZy9jb3Jlcy95aWZpdmUvICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgIGludGVncmF0ZWQgd2lzaGJvbmUgaS9mIHRvIGluc3RydWN0aW9uIG1lbW9yeSAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICBUbyBEbzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgbm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICBBdXRob3Iocyk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAtIERpbmVzaCBBbm5heXlhLCBkaW5lc2hhQG9wZW5jb3Jlcy5vcmcgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICBSZXZpc2lvbiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgIHYwOiAgICBKdW5lIDcsIDIwMjEsIERpbmVzaCBBICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICB3aXNoYm9uZSBpbnRlZ3JhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICAgICB2MTogICAgSnVuZSA5LCAyMDIxLCBEaW5lc2ggQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgICAgICAgIE9uIHBvd2VyIHVwLCB3aXNoYm9uZSBvdXRwdXQgYXJlIHVua293biBhcyBpdCAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgZHJpdmVuIGZyb20gZmlmbyBvdXRwdXQuIFRvIGF2b2lkIHVua25vd24gICAgICAgLy8vLwovLy8vICAgICAgICAgICAgICBwcm9wZ2F0aW9uLCB3ZSBhcmUgZHJpdmluZyAnaDAgd2hlbiBmaWZvIGVtcHR5ICAvLy8vCi8vLy8gICAgIHYyOiAgICBKdW5lIDE4LCAyMDIxLCBEaW5lc2ggQSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgIGNvcmUgYW5kIHdpc2hib25lIGlzIG1hZGUgYXN5bmMgYW5kIGFzeW5jIGZpZm8gICAgLy8vLwovLy8vICAgICAgICAgICAgYWRkZWQgdG8gdGFrZSBjYXJlIG9mIGRvbWFpbiBjcm9zcy1vdmVyICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gQ29weXJpZ2h0IChDKSAyMDAwIEF1dGhvcnMgYW5kIE9QRU5DT1JFUy5PUkcgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vIFRoaXMgc291cmNlIGZpbGUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHdpdGhvdXQgICAgICAgICAvLy8vCi8vLy8gcmVzdHJpY3Rpb24gcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodCBzdGF0ZW1lbnQgaXMgbm90ICAgIC8vLy8KLy8vLyByZW1vdmVkIGZyb20gdGhlIGZpbGUgYW5kIHRoYXQgYW55IGRlcml2YXRpdmUgd29yayBjb250YWlucyAgLy8vLwovLy8vIHRoZSBvcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGUgYXNzb2NpYXRlZCBkaXNjbGFpbWVyLiAvLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0ICAgLy8vLwovLy8vIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgICAvLy8vCi8vLy8gUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IC8vLy8KLy8vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55ICAgLy8vLwovLy8vIGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgICAgICAgLy8vLwovLy8vIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgICAvLy8vCi8vLy8gd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAgICAgIC8vLy8KLy8vLyBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgLy8vLwovLy8vIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgICAgLy8vLwovLy8vIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBzb3VyY2U7IGlmIG5vdCwgZG93bmxvYWQgaXQgICAvLy8vCi8vLy8gZnJvbSBodHRwOi8vd3d3Lm9wZW5jb3Jlcy5vcmcvbGdwbC5zaHRtbCAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vICAgICBPcmdpbmFsIG93bmVyIERldGFpbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8gQ29weXJpZ2h0IGJ5IFN5bnRhY29yZSBMTEMgqSAyMDE2LTIwMjEuIFNlZSBMSUNFTlNFIGZvciBkZXRhaWxzLy8vCi8vLyBAZmlsZSAgICAgICA8c2NyMV9pbWVtX3diLnN2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8KLy8vIEBicmllZiAgICAgIEluc3RydWN0aW9uIG1lbW9yeSBBSEIgYnJpZGdlICAgICAgICAgICAgICAgICAgICAgIC8vLwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgpgaW5jbHVkZSAic2NyMV93Yi5zdmgiCmBpbmNsdWRlICJzY3IxX21lbWlmLnN2aCIKCm1vZHVsZSBzY3IxX2ltZW1fd2IgKAogICAgLy8gQ29udHJvbCBTaWduYWxzCiAgICBpbnB1dCAgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZV9yc3RfbiwgLy8gY29yZSByZXNldAogICAgaW5wdXQgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfY2xrLCAgIC8vIENvcmUgY2xvY2sKCiAgICAvLyBDb3JlIEludGVyZmFjZQogICAgb3V0cHV0ICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZW1fcmVxX2FjaywKICAgIGlucHV0ICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWVtX3JlcSwKICAgIGlucHV0ICAgbG9naWMgICBbU0NSMV9XQl9XSURUSC0xOjBdICAgICBpbWVtX2FkZHIsCiAgICBvdXRwdXQgIGxvZ2ljICAgW1NDUjFfV0JfV0lEVEgtMTowXSAgICAgaW1lbV9yZGF0YSwKICAgIG91dHB1dCAgbG9naWMgWzE6MF0gICAgICAgICAgICAgICAgICAgICBpbWVtX3Jlc3AsCgogICAgLy8gV0IgSW50ZXJmYWNlCiAgICBpbnB1dCAgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgd2JfcnN0X24sICAgLy8gd2lzaGJvbmUgcmVzZXQKICAgIGlucHV0ICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICB3Yl9jbGssICAgICAvLyB3aXNoYm9uZSBjbG9jawogICAgb3V0cHV0ICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdiZF9zdGJfbywgLy8gc3Ryb2JlL3JlcXVlc3QKICAgIG91dHB1dCAgbG9naWMgICBbU0NSMV9XQl9XSURUSC0xOjBdICAgICB3YmRfYWRyX28sIC8vIGFkZHJlc3MKICAgIG91dHB1dCAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICB3YmRfd2VfbywgIC8vIHdyaXRlCiAgICBvdXRwdXQgIGxvZ2ljICAgW1NDUjFfV0JfV0lEVEgtMTowXSAgICAgd2JkX2RhdF9vLCAvLyBkYXRhIG91dHB1dAogICAgb3V0cHV0ICBsb2dpYyAgIFszOjBdICAgICAgICAgICAgICAgICAgIHdiZF9zZWxfbywgLy8gYnl0ZSBlbmFibGUKICAgIGlucHV0ICAgbG9naWMgICBbU0NSMV9XQl9XSURUSC0xOjBdICAgICB3YmRfZGF0X2ksIC8vIGRhdGEgaW5wdXQKICAgIGlucHV0ICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICB3YmRfYWNrX2ksIC8vIGFja25vd2xlZ2VtZW50CiAgICBpbnB1dCAgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgd2JkX2Vycl9pICAvLyBlcnJvcgoKKTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBMb2NhbCBwYXJhbWV0ZXJzIGRlY2xhcmF0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIExvY2FsIHR5cGVzIGRlY2xhcmF0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdHlwZWRlZiBzdHJ1Y3QgcGFja2VkIHsKICAgIGxvZ2ljICAgW1NDUjFfV0JfV0lEVEgtMTowXSAgICBoYWRkcjsKfSB0eXBlX3NjcjFfcmVxX2ZpZm9fczsKCnR5cGVkZWYgc3RydWN0IHBhY2tlZCB7CiAgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZXNwOwogICAgbG9naWMgICBbU0NSMV9XQl9XSURUSC0xOjBdICAgIGhyZGF0YTsKfSB0eXBlX3NjcjFfcmVzcF9maWZvX3M7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gTG9jYWwgc2lnbmFsIGRlY2xhcmF0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFJlcXVlc3QgRklGTwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfZmlmb19yZDsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfZmlmb193cjsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfZmlmb19lbXB0eTsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfZmlmb19mdWxsOwoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUmVzcG9uc2UgRklGTyAoUkVBRCBQQVRICi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BfZmlmb19lbXB0eTsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BfZmlmb19yZDsKCgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFJFUV9GSUZPCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0eXBlX3NjcjFfcmVxX2ZpZm9fcyAgICByZXFfZmlmb19kaW47CnR5cGVfc2NyMV9yZXFfZmlmb19zICAgIHJlcV9maWZvX2RvdXQ7Cgphc3NpZ24gcmVxX2ZpZm9fd3IgID0gfnJlcV9maWZvX2Z1bGwgJiBpbWVtX3JlcTsKYXNzaWduIGltZW1fcmVxX2FjayA9IH5yZXFfZmlmb19mdWxsOwoKYXNzaWduIHJlcV9maWZvX2Rpbi5oYWRkciA9IGltZW1fYWRkcjsKCiBhc3luY19maWZvICMoCiAgICAgIC5XKFNDUjFfV0JfV0lEVEgpLCAvLyBEYXRhIFdpZHRoCiAgICAgIC5EUCg0KSwgICAgICAgICAgICAvLyBGSUZPIERFUFRICiAgICAgIC5XUl9GQVNUKDEpLCAgICAgICAvLyBXZSBuZWVkIEZGJ2VkIEZ1bGwKICAgICAgLlJEX0ZBU1QoMSkgICAgICAgIC8vIFdlIG5lZWQgRkYnZWQgRW1wdHkKICAgICApICAgdV9yZXFfZmlmbygKICAgICAvLyBXcml0YyBDbG9jawoJLndyX2NsayAgICAgIChjb3JlX2NsayAgICAgICApLAogICAgICAgIC53cl9yZXNldF9uICAoY29yZV9yc3RfbiAgICAgKSwKICAgICAgICAud3JfZW4gICAgICAgKHJlcV9maWZvX3dyICAgICksCiAgICAgICAgLndyX2RhdGEgICAgIChyZXFfZmlmb19kaW4gICApLAogICAgICAgIC5mdWxsICAgICAgICAocmVxX2ZpZm9fZnVsbCAgKSwKICAgICAgICAuYWZ1bGwgICAgICAgKCAgICAgICAgICAgICAgICksICAgICAgICAgICAgICAgICAKCiAgICAvLyBSRCBDbG9jawogICAgICAgIC5yZF9jbGsgICAgICh3Yl9jbGsgICAgICAgICAgKSwKICAgICAgICAucmRfcmVzZXRfbiAod2JfcnN0X24gICAgICAgICksCiAgICAgICAgLnJkX2VuICAgICAgKHJlcV9maWZvX3JkICAgICApLAogICAgICAgIC5lbXB0eSAgICAgIChyZXFfZmlmb19lbXB0eSAgKSwgICAgICAgICAgICAgICAgCiAgICAgICAgLmFlbXB0eSAgICAgKCAgICAgICAgICAgICAgICApLCAgICAgICAgICAgICAgICAKICAgICAgICAucmRfZGF0YSAgICAocmVxX2ZpZm9fZG91dCAgICkKICAgICAgKTsKCgphbHdheXNfY29tYiBiZWdpbgogICAgcmVxX2ZpZm9fcmQgPSAxJ2IwOwogICAgaWYgKHdiZF9hY2tfaSkgYmVnaW4KICAgICAgICAgcmVxX2ZpZm9fcmQgPSB+cmVxX2ZpZm9fZW1wdHk7CiAgICBlbmQKZW5kCgphc3NpZ24gd2JkX3N0Yl9vICAgID0gfnJlcV9maWZvX2VtcHR5OwovLyBPbiBQb3dlciwgdG8gYXZvaWQgdW5rbm93IHByb3BnYXRpbmcgdGhlIHZhbHVlCmFzc2lnbiB3YmRfYWRyX28gICAgPSAocmVxX2ZpZm9fZW1wdHkpID8gJ2gwIDogcmVxX2ZpZm9fZG91dC5oYWRkcjsgCmFzc2lnbiB3YmRfd2VfbyAgICAgPSAwOyAvLyBPbmx5IFJlYWQgc3VwcG9ydGVkCmFzc2lnbiB3YmRfZGF0X28gICAgPSAzMidoMDsgLy8gTm8gV3JpdGUKYXNzaWduIHdiZF9zZWxfbyAgICA9IDQnYjExMTE7IC8vIE9ubHkgUmVhZCBhbGxvd2VkIGluIGltZW0gaS9mCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBSZXNwb25zZSBwYXRoIC0gVXNlZCBieSBSZWFkIHBhdGggbG9naWMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnR5cGVfc2NyMV9yZXNwX2ZpZm9fcyAgICAgICAgICAgICAgICAgICAgICAgcmVzcF9maWZvX2RpbjsKdHlwZV9zY3IxX3Jlc3BfZmlmb19zICAgICAgICAgICAgICAgICAgICAgICByZXNwX2ZpZm9fZG91dDsKCmFzc2lnbiByZXNwX2ZpZm9fZGluLmhyZXNwICA9ICh3YmRfZXJyX2kpID8gMSdiMCA6IDEnYjE7CmFzc2lnbiByZXNwX2ZpZm9fZGluLmhyZGF0YSA9IHdiZF9kYXRfaTsKCiBhc3luY19maWZvICMoCiAgICAgIC5XKFNDUjFfV0JfV0lEVEgrMSksIC8vIERhdGEgV2lkdGgKICAgICAgLkRQKDQpLCAgICAgICAgICAgIC8vIEZJRk8gREVQVEgKICAgICAgLldSX0ZBU1QoMSksICAgICAgIC8vIFdlIG5lZWQgRkYnZWQgRnVsbAogICAgICAuUkRfRkFTVCgxKSAgICAgICAgLy8gV2UgbmVlZCBGRidlZCBFbXB0eQogICAgICkgICB1X3Jlc19maWZvKAogICAgIC8vIFdyaXRjIENsb2NrCgkud3JfY2xrICAgICAgKHdiX2NsayAgICAgICAgICAgICAgICAgKSwKICAgICAgICAud3JfcmVzZXRfbiAgKHdiX3JzdF9uICAgICAgICAgICAgICAgKSwKICAgICAgICAud3JfZW4gICAgICAgKHdiZF9hY2tfaSAgICAgICAgICAgICAgKSwKICAgICAgICAud3JfZGF0YSAgICAgKHJlc3BfZmlmb19kaW4gICAgICAgICAgKSwKICAgICAgICAuZnVsbCAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgKSwgLy8gQXNzbWVkIEZJRk8gd2lsbCBuZXZlciBiZSBmdWxsIGFzIGl0J3MgUmVzcG9uc2UgYSBTaW5nbGUgUmVxdWVzdAogICAgICAgIC5hZnVsbCAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICApLCAgICAgICAgICAgICAgICAgCgogICAgLy8gUkQgQ2xvY2sKICAgICAgICAucmRfY2xrICAgICAoY29yZV9jbGsgICAgICAgICAgICAgICAgKSwKICAgICAgICAucmRfcmVzZXRfbiAoY29yZV9yc3RfbiAgICAgICAgICAgICAgKSwKICAgICAgICAucmRfZW4gICAgICAocmVzcF9maWZvX3JkICAgICAgICAgICAgKSwKICAgICAgICAuZW1wdHkgICAgICAocmVzcF9maWZvX2VtcHR5ICAgICAgICAgKSwgICAgICAgICAgICAgICAgCiAgICAgICAgLmFlbXB0eSAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICksICAgICAgICAgICAgICAgIAogICAgICAgIC5yZF9kYXRhICAgIChyZXNwX2ZpZm9fZG91dCAgICAgICAgICApCiAgICAgICk7CgoKYXNzaWduIHJlc3BfZmlmb19yZCA9ICFyZXNwX2ZpZm9fZW1wdHk7CmFzc2lnbiBpbWVtX3JkYXRhICAgPSByZXNwX2ZpZm9fZG91dC5ocmRhdGE7Cgphc3NpZ24gaW1lbV9yZXNwID0gKHJlc3BfZmlmb19yZCkKICAgICAgICAgICAgICAgICAgICA/IChyZXNwX2ZpZm9fZG91dC5ocmVzcCA9PSAxJ2IxKQogICAgICAgICAgICAgICAgICAgICAgICA/IFNDUjFfTUVNX1JFU1BfUkRZX09LCiAgICAgICAgICAgICAgICAgICAgICAgIDogU0NSMV9NRU1fUkVTUF9SRFlfRVIKICAgICAgICAgICAgICAgICAgICA6IFNDUjFfTUVNX1JFU1BfTk9UUkRZIDsKCgpgaWZkZWYgU0NSMV9UUkdUX1NJTVVMQVRJT04KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEFzc2VydGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIENoZWNrIENvcmUgaW50ZXJmYWNlClNDUjFfU1ZBX0lNRU1fV0JfQlJJREdFX1JFUV9YQ0hFQ0sgOiBhc3NlcnQgcHJvcGVydHkgKAogICAgQChuZWdlZGdlIGNsaykgZGlzYWJsZSBpZmYgKH5yc3RfbikKICAgICEkaXN1bmtub3duKGltZW1fcmVxKQogICAgKSBlbHNlICRlcnJvcigiSU1FTSBXQiBicmlkZ2UgRXJyb3I6IGltZW1fcmVxIGhhcyB1bmtub3duIHZhbHVlcyIpOwoKU0NSMV9JTUVNX1dCX0JSSURHRV9BRERSX1hDSEVDSyA6IGFzc2VydCBwcm9wZXJ0eSAoCiAgICBAKG5lZ2VkZ2UgY2xrKSBkaXNhYmxlIGlmZiAofnJzdF9uKQogICAgaW1lbV9yZXEgfC0+ICEkaXN1bmtub3duKGltZW1fYWRkcikKICAgICkgZWxzZSAkZXJyb3IoIklNRU0gV0IgYnJpZGdlIEVycm9yOiBpbWVtX2FkZHIgaGFzIHVua25vd24gdmFsdWVzIik7CgpTQ1IxX0lNRU1fV0JfQlJJREdFX0FERFJfQUxMSUdOIDogYXNzZXJ0IHByb3BlcnR5ICgKICAgIEAobmVnZWRnZSBjbGspIGRpc2FibGUgaWZmICh+cnN0X24pCiAgICBpbWVtX3JlcSB8LT4gKGltZW1fYWRkclsxOjBdID09ICcwKQogICAgKSBlbHNlICRlcnJvcigiSU1FTSBXQiBicmlkZ2UgRXJyb3I6IGltZW1fYWRkciBoYXMgdW5hbGlnbiB2YWx1ZXMiKTsKCi8vIENoZWNrIFdCIGludGVyZmFjZQpTQ1IxX0lNRU1fV0JfQlJJREdFX0hSRUFEWV9YQ0hFQ0sgOiBhc3NlcnQgcHJvcGVydHkgKAogICAgQChuZWdlZGdlIGNsaykgZGlzYWJsZSBpZmYgKH5yc3RfbikKICAgICEkaXN1bmtub3duKGhyZWFkeSkKICAgICkgZWxzZSAkZXJyb3IoIklNRU0gV0IgYnJpZGdlIEVycm9yOiBocmVhZHkgaGFzIHVua25vd24gdmFsdWVzIik7CgpTQ1IxX0lNRU1fV0JfQlJJREdFX0hSRVNQX1hDSEVDSyA6IGFzc2VydCBwcm9wZXJ0eSAoCiAgICBAKG5lZ2VkZ2UgY2xrKSBkaXNhYmxlIGlmZiAofnJzdF9uKQogICAgISRpc3Vua25vd24oaHJlc3ApCiAgICApIGVsc2UgJGVycm9yKCJJTUVNIFdCIGJyaWRnZSBFcnJvcjogaHJlc3AgaGFzIHVua25vd24gdmFsdWVzIik7CgpgZW5kaWYgLy8gU0NSMV9UUkdUX1NJTVVMQVRJT04KCmVuZG1vZHVsZSA6IHNjcjFfaW1lbV93Ygo=