IyEvdXNyL2Jpbi9wZXJsIC13VAojIC0qLSBNb2RlOiBwZXJsOyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCiMKIyBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYwojIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCiMgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCiMgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiMKIyBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKIyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCiMgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCiMgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIHRoZSBCdWd6aWxsYSBCdWcgVHJhY2tpbmcgU3lzdGVtLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIE5ldHNjYXBlIENvbW11bmljYXRpb25zCiMgQ29ycG9yYXRpb24uIFBvcnRpb25zIGNyZWF0ZWQgYnkgTmV0c2NhcGUgYXJlCiMgQ29weXJpZ2h0IChDKSAxOTk4IE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLiBBbGwKIyBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKTogVGVycnkgV2Vpc3NtYW4gPHRlcnJ5QG1vemlsbGEub3JnPgojICAgICAgICAgICAgICAgICBEYW4gTW9zZWRhbGUgPGRtb3NlQG1vemlsbGEub3JnPgojICAgICAgICAgICAgICAgICBEYXZlIE1pbGxlciA8anVzdGRhdmVAc3luZGljb21tLmNvbT4KIyAgICAgICAgICAgICAgICAgQ2hyaXN0b3BoZXIgQWlsbG9uIDxjaHJpc3RvcGhlckBhaWxsb24uY29tPgojICAgICAgICAgICAgICAgICBNeWsgTWVsZXogPG15a0Btb3ppbGxhLm9yZz4KIyAgICAgICAgICAgICAgICAgSmVmZiBIZWRsdW5kIDxqZWZmLmhlZGx1bmRAbWF0cml4c2kuY29tPgojICAgICAgICAgICAgICAgICBGculk6XJpYyBCdWNsaW4gPExwU29saXRAZ21haWwuY29tPgoKIyBJbXBsZW1lbnRhdGlvbiBub3RlcyBmb3IgdGhpcyBmaWxlOgojCiMgMSkgdGhlICdpZCcgZm9ybSBwYXJhbWV0ZXIgaXMgdmFsaWRhdGVkIGVhcmx5IG9uLCBhbmQgaWYgaXQgaXMgbm90IGEgdmFsaWQKIyBidWdpZCBhbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkLCBzbyBpdCBpcyBPSyBmb3IgbGF0ZXIgY29kZSB0byBzaW1wbHkgY2hlY2sKIyBmb3IgYSBkZWZpbmVkIGZvcm0gJ2lkJyB2YWx1ZSwgYW5kIGl0IGNhbiBhc3N1bWUgYSB2YWxpZCBidWdpZC4KIwojIDIpIElmIHRoZSAnaWQnIGZvcm0gcGFyYW1ldGVyIGlzIG5vdCBkZWZpbmVkIChhZnRlciB0aGUgaW5pdGlhbCB2YWxpZGF0aW9uKSwKIyB0aGVuIHdlIGFyZSBwcm9jZXNzaW5nIG11bHRpcGxlIGJ1Z3MsIGFuZCBAaWRsaXN0IHdpbGwgY29udGFpbiB0aGUgaWRzLgojCiMgMykgSWYgd2UgYXJlIHByb2Nlc3NpbmcganVzdCB0aGUgb25lIGlkLCB0aGVuIGl0IGlzIHN0b3JlZCBpbiBAaWRsaXN0IGZvcgojIGxhdGVyIHByb2Nlc3NpbmcuCgp1c2Ugc3RyaWN0OwoKbXkgJFVzZXJJbkVkaXRHcm91cFNldCA9IC0xOwpteSAkVXNlckluQ2FuQ29uZmlybUdyb3VwU2V0ID0gLTE7Cm15ICRQcml2aWxlZ2VzUmVxdWlyZWQgPSAwOwpteSAkbGFzdGJ1Z2lkID0gMDsKCnVzZSBsaWIgcXcoLik7Cgp1c2UgQnVnemlsbGE7CnVzZSBCdWd6aWxsYTo6Q29uc3RhbnRzOwpyZXF1aXJlICJDR0kucGwiOwoKdXNlIEJ1Z3ppbGxhOjpCdWc7CnVzZSBCdWd6aWxsYTo6VXNlcjsKdXNlIEJ1Z3ppbGxhOjpVdGlsOwoKIyBVc2UgdGhlIEZsYWcgbW9kdWxlIHRvIG1vZGlmeSBmbGFnIGRhdGEgaWYgdGhlIHVzZXIgc2V0IGZsYWdzLgp1c2UgQnVnemlsbGE6OkZsYWc7CnVzZSBCdWd6aWxsYTo6RmxhZ1R5cGU7CgojIFNodXQgdXAgbWlzZ3VpZGVkIC13IHdhcm5pbmdzIGFib3V0ICJ1c2VkIG9ubHkgb25jZSI6Cgp1c2UgdmFycyBxdyhAbGVnYWxfcHJvZHVjdAogICAgICAgICAgJXZlcnNpb25zCiAgICAgICAgICAlY29tcG9uZW50cwogICAgICAgICAgJWxlZ2FsX29wc3lzCiAgICAgICAgICAlbGVnYWxfcGxhdGZvcm0KICAgICAgICAgICVsZWdhbF9wcmlvcml0eQogICAgICAgICAgJXNldHRhYmxlX3Jlc29sdXRpb24KICAgICAgICAgICV0YXJnZXRfbWlsZXN0b25lCiAgICAgICAgICAlbGVnYWxfc2V2ZXJpdHkKICAgICAgICAgICApOwoKbXkgJHVzZXIgPSBCdWd6aWxsYS0+bG9naW4oTE9HSU5fUkVRVUlSRUQpOwpteSAkd2hvaWQgPSAkdXNlci0+aWQ7CgpteSAkY2dpID0gQnVnemlsbGEtPmNnaTsKbXkgJGRiaCA9IEJ1Z3ppbGxhLT5kYmg7CgpteSAkcmVxdWlyZW1pbGVzdG9uZSA9IDA7Cgp1c2UgdmFycyBxdygkdGVtcGxhdGUgJHZhcnMpOwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIEJlZ2luIERhdGEvU2VjdXJpdHkgVmFsaWRhdGlvbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIENyZWF0ZSBhIGxpc3Qgb2YgSURzIG9mIGFsbCBidWdzIGJlaW5nIG1vZGlmaWVkIGluIHRoaXMgcmVxdWVzdC4KIyBUaGlzIGxpc3Qgd2lsbCBlaXRoZXIgY29uc2lzdCBvZiBhIHNpbmdsZSBidWcgbnVtYmVyIGZyb20gdGhlICJpZCIKIyBmb3JtL1VSTCBmaWVsZCBvciBhIHNlcmllcyBvZiBudW1iZXJzIGZyb20gbXVsdGlwbGUgZm9ybS9VUkwgZmllbGRzCiMgbmFtZWQgImlkX3giIHdoZXJlICJ4IiBpcyB0aGUgYnVnIG51bWJlci4KIyBGb3IgZWFjaCBidWcgYmVpbmcgbW9kaWZpZWQsIG1ha2Ugc3VyZSBpdHMgSUQgaXMgYSB2YWxpZCBidWcgbnVtYmVyIAojIHJlcHJlc2VudGluZyBhbiBleGlzdGluZyBidWcgdGhhdCB0aGUgdXNlciBpcyBhdXRob3JpemVkIHRvIGFjY2Vzcy4KbXkgQGlkbGlzdDsKaWYgKGRlZmluZWQgJGNnaS0+cGFyYW0oJ2lkJykpIHsKICBteSAkaWQgPSAkY2dpLT5wYXJhbSgnaWQnKTsKICBWYWxpZGF0ZUJ1Z0lEKCRpZCk7CgogICMgU3RvcmUgdGhlIHZhbGlkYXRlZCwgYW5kIGRldGFpbnRlZCBpZCBiYWNrIGluIHRoZSBjZ2kgZGF0YSwgYXMKICAjIGxvdHMgb2YgbGF0ZXIgY29kZSB3aWxsIG5lZWQgaXQsIGFuZCB3aWxsIG9idGFpbiBpdCBmcm9tIHRoZXJlCiAgJGNnaS0+cGFyYW0oJ2lkJywgJGlkKTsKICBwdXNoIEBpZGxpc3QsICRpZDsKfSBlbHNlIHsKICAgIGZvcmVhY2ggbXkgJGkgKCRjZ2ktPnBhcmFtKCkpIHsKICAgICAgICBpZiAoJGkgPX4gL15pZF8oWzEtOV1bMC05XSopLykgewogICAgICAgICAgICBteSAkaWQgPSAkMTsKICAgICAgICAgICAgVmFsaWRhdGVCdWdJRCgkaWQpOwogICAgICAgICAgICBwdXNoIEBpZGxpc3QsICRpZDsKICAgICAgICB9CiAgICB9Cn0KCiMgTWFrZSBzdXJlIHRoZXJlIGFyZSBidWdzIHRvIHByb2Nlc3MuCnNjYWxhcihAaWRsaXN0KSB8fCBUaHJvd1VzZXJFcnJvcigibm9fYnVnc19jaG9zZW4iKTsKCiMgTWFrZSBzdXJlIGZvcm0gcGFyYW0gJ2RvbnRjaGFuZ2UnIGlzIGRlZmluZWQgc28gaXQgY2FuIGJlIGNvbXBhcmVkIHRvIGVhc2lseS4KJGNnaS0+cGFyYW0oJ2RvbnRjaGFuZ2UnLCcnKSB1bmxlc3MgZGVmaW5lZCAkY2dpLT5wYXJhbSgnZG9udGNoYW5nZScpOwoKIyBNYWtlIHN1cmUgdGhlICdrbm9iJyBwYXJhbSBpcyBkZWZpbmVkOyBlbHNlIHNldCBpdCB0byAnbm9uZScuCiRjZ2ktPnBhcmFtKCdrbm9iJywgJ25vbmUnKSB1bmxlc3MgZGVmaW5lZCAkY2dpLT5wYXJhbSgna25vYicpOwoKIyBWYWxpZGF0ZSBhbGwgdGltZXRyYWNraW5nIGZpZWxkcwpmb3JlYWNoIG15ICRmaWVsZCAoImVzdGltYXRlZF90aW1lIiwgIndvcmtfdGltZSIsICJyZW1haW5pbmdfdGltZSIpIHsKICAgIGlmIChkZWZpbmVkICRjZ2ktPnBhcmFtKCRmaWVsZCkpIHsKICAgICAgICBteSAkZXJfdGltZSA9IHRyaW0oJGNnaS0+cGFyYW0oJGZpZWxkKSk7CiAgICAgICAgaWYgKCRlcl90aW1lIG5lICRjZ2ktPnBhcmFtKCdkb250Y2hhbmdlJykpIHsKICAgICAgICAgICAgQnVnemlsbGE6OkJ1Zzo6VmFsaWRhdGVUaW1lKCRlcl90aW1lLCAkZmllbGQpOwogICAgICAgIH0KICAgIH0KfQoKaWYgKFVzZXJJbkdyb3VwKFBhcmFtKCd0aW1ldHJhY2tpbmdncm91cCcpKSkgewogICAgbXkgJHdrX3RpbWUgPSAkY2dpLT5wYXJhbSgnd29ya190aW1lJyk7CiAgICBpZiAoJGNnaS0+cGFyYW0oJ2NvbW1lbnQnKSA9fiAvXlxzKiQvICYmICR3a190aW1lICYmICR3a190aW1lICE9IDApIHsKICAgICAgICBUaHJvd1VzZXJFcnJvcignY29tbWVudF9yZXF1aXJlZCcpOwogICAgfQp9CgpWYWxpZGF0ZUNvbW1lbnQoc2NhbGFyICRjZ2ktPnBhcmFtKCdjb21tZW50JykpOwoKIyBJZiB0aGUgYnVnKHMpIGJlaW5nIG1vZGlmaWVkIGhhdmUgZGVwZW5kZW5jaWVzLCB2YWxpZGF0ZSB0aGVtCiMgYW5kIHJlYnVpbGQgdGhlIGxpc3Qgd2l0aCB0aGUgdmFsaWRhdGVkIHZhbHVlcy4gIFRoaXMgaXMgaW1wb3J0YW50CiMgYmVjYXVzZSB0aGVyZSBhcmUgc2l0dWF0aW9ucyB3aGVyZSB2YWxpZGF0aW9uIGNoYW5nZXMgdGhlIHZhbHVlCiMgaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBlcnJvciwgZi5lLiB3aGVuIG9uZSBvciBtb3JlIG9mIHRoZSB2YWx1ZXMKIyBpcyBhIGJ1ZyBhbGlhcyB0aGF0IGdldHMgY29udmVydGVkIHRvIGl0cyBjb3JyZXNwb25kaW5nIGJ1ZyBJRAojIGR1cmluZyB2YWxpZGF0aW9uLgpmb3JlYWNoIG15ICRmaWVsZCAoImRlcGVuZHNvbiIsICJibG9ja2VkIikgewogICAgaWYgKCRjZ2ktPnBhcmFtKCdpZCcpKSB7CiAgICAgICAgbXkgJGJ1ZyA9IG5ldyBCdWd6aWxsYTo6QnVnKCRjZ2ktPnBhcmFtKCdpZCcpLCAkdXNlci0+aWQpOwogICAgICAgIG15IEBvbGQgPSBAeyRidWctPiRmaWVsZH07CiAgICAgICAgbXkgQG5ldzsKICAgICAgICBmb3JlYWNoIG15ICRpZCAoc3BsaXQoL1tccyxdKy8sICRjZ2ktPnBhcmFtKCRmaWVsZCkpKSB7CiAgICAgICAgICAgIG5leHQgdW5sZXNzICRpZDsKICAgICAgICAgICAgVmFsaWRhdGVCdWdJRCgkaWQsICRmaWVsZCk7CiAgICAgICAgICAgIHB1c2ggQG5ldywgJGlkOwogICAgICAgIH0KICAgICAgICAkY2dpLT5wYXJhbSgkZmllbGQsIGpvaW4oIiwiLCBAbmV3KSk7CiAgICAgICAgbXkgKCRhZGRlZCwgJHJlbW92ZWQpID0gQnVnemlsbGE6OlV0aWw6OmRpZmZfYXJyYXlzKFxAb2xkLCBcQG5ldyk7CiAgICAgICAgZm9yZWFjaCBteSAkaWQgKEAkYWRkZWQgLCBAJHJlbW92ZWQpIHsKICAgICAgICAgICAgIyBWYWxpZGF0ZUJ1Z0lEIGlzIGNhbGxlZCB3aXRob3V0ICRmaWVsZCBoZXJlIHNvIHRoYXQgaXQgd2lsbAogICAgICAgICAgICAjIHRocm93IGFuIGVycm9yIGlmIGFueSBvZiB0aGUgY2hhbmdlZCBidWdzIGFyZSBub3QgdmlzaWJsZS4KICAgICAgICAgICAgVmFsaWRhdGVCdWdJRCgkaWQpOwogICAgICAgICAgICBpZiAoIUNoZWNrQ2FuQ2hhbmdlRmllbGQoJGZpZWxkLCAkYnVnLT5idWdfaWQsIDAsIDEpKSB7CiAgICAgICAgICAgICAgICAkdmFycy0+eydwcml2cyd9ID0gJFByaXZpbGVnZXNSZXF1aXJlZDsKICAgICAgICAgICAgICAgICR2YXJzLT57J2ZpZWxkJ30gPSAkZmllbGQ7CiAgICAgICAgICAgICAgICBUaHJvd1VzZXJFcnJvcigiaWxsZWdhbF9jaGFuZ2UiLCAkdmFycyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgICMgQnVnemlsbGEgZG9lcyBub3Qgc3VwcG9ydCBtYXNzLWNoYW5nZSBvZiBkZXBlbmRlbmNpZXMgc28gdGhleQogICAgICAgICMgYXJlIG5vdCB2YWxpZGF0ZWQuICBUbyBwcmV2ZW50IGEgVVJMLWhhY2tpbmcgcmlzaywgdGhlIGRlcGVuZGVuY2llcwogICAgICAgICMgYXJlIGRlbGV0ZWQgZm9yIG1hc3MtY2hhbmdlcy4KICAgICAgICAkY2dpLT5kZWxldGUoJGZpZWxkKTsKICAgIH0KfQoKIyBkbyBhIG1hdGNoIG9uIHRoZSBmaWVsZHMgaWYgYXBwbGljYWJsZQoKIyBUaGUgb3JkZXIgb2YgdGhlc2UgZnVuY3Rpb24gY2FsbHMgaXMgaW1wb3J0YW50LCBhcyBib3RoIEZsYWc6OnZhbGlkYXRlCiMgYW5kIEZsYWdUeXBlOjp2YWxpZGF0ZSBhc3N1bWUgVXNlcjo6bWF0Y2hfZmllbGQgaGFzIGVuc3VyZWQgdGhhdCB0aGUgdmFsdWVzCiMgaW4gdGhlIHJlcXVlc3RlZSBmaWVsZHMgYXJlIGxlZ2l0aW1hdGUgdXNlciBlbWFpbCBhZGRyZXNzZXMuCiZCdWd6aWxsYTo6VXNlcjo6bWF0Y2hfZmllbGQoJGNnaSwgewogICAgJ3FhX2NvbnRhY3QnICAgICAgICAgICAgICAgID0+IHsgJ3R5cGUnID0+ICdzaW5nbGUnIH0sCiAgICAnbmV3Y2MnICAgICAgICAgICAgICAgICAgICAgPT4geyAndHlwZScgPT4gJ211bHRpJyAgfSwKICAgICdtYXNzY2MnICAgICAgICAgICAgICAgICAgICA9PiB7ICd0eXBlJyA9PiAnbXVsdGknICB9LAogICAgJ2Fzc2lnbmVkX3RvJyAgICAgICAgICAgICAgID0+IHsgJ3R5cGUnID0+ICdzaW5nbGUnIH0sCiAgICAnXnJlcXVlc3RlZShfdHlwZSk/LShcZCspJCcgPT4geyAndHlwZScgPT4gJ3NpbmdsZScgfSwKfSk7CgojIFZhbGlkYXRlIGZsYWdzIGluIGFsbCBjYXNlcy4gdmFsaWRhdGUoKSBzaG91bGQgbm90IGRldGVjdCBhbnkKIyByZWZlcmVuY2UgdG8gZmxhZ3MgaWYgJGNnaS0+cGFyYW0oJ2lkJykgaXMgdW5kZWZpbmVkLgpCdWd6aWxsYTo6RmxhZzo6dmFsaWRhdGUoJGNnaSwgJGNnaS0+cGFyYW0oJ2lkJykpOwpCdWd6aWxsYTo6RmxhZ1R5cGU6OnZhbGlkYXRlKCRjZ2ksICRjZ2ktPnBhcmFtKCdpZCcpKTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBFbmQgRGF0YS9TZWN1cml0eSBWYWxpZGF0aW9uCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnByaW50ICRjZ2ktPmhlYWRlcigpOwokdmFycy0+eyd0aXRsZV90YWcnfSA9ICJidWdfcHJvY2Vzc2VkIjsKCiMgU2V0IHRoZSB0aXRsZSBpZiB3ZSBjYW4gc2VlIGEgbWlkLWFpciBjb21pbmcuIFRoaXMgdGVzdCBtYXkgaGF2ZSBmYWxzZQojIG5lZ2F0aXZlcywgYnV0IG5ldmVyIGZhbHNlIHBvc2l0aXZlcywgYW5kIHNob3VsZCBjYXRjaCB0aGUgbWFqb3JpdHkgb2YgY2FzZXMuCiMgSXQgb25seSB3b3JrcyBhdCBhbGwgaW4gdGhlIHNpbmdsZSBidWcgY2FzZS4KaWYgKGRlZmluZWQgJGNnaS0+cGFyYW0oJ2lkJykpIHsKICAgIFNlbmRTUUwoIlNFTEVDVCBkZWx0YV90cyBGUk9NIGJ1Z3MgV0hFUkUgYnVnX2lkID0gIiAuCiAgICAgICAgICAgICRjZ2ktPnBhcmFtKCdpZCcpKTsKICAgIG15ICRkZWx0YV90cyA9IEZldGNoT25lQ29sdW1uKCk7CiAgICAKICAgIGlmIChkZWZpbmVkICRjZ2ktPnBhcmFtKCdkZWx0YV90cycpICYmICRjZ2ktPnBhcmFtKCdkZWx0YV90cycpIG5lICRkZWx0YV90cykKICAgIHsKICAgICAgICAkdmFycy0+eyd0aXRsZV90YWcnfSA9ICJtaWRfYWlyIjsKICAgIH0KfQoKIyBTZXQgdXAgdGhlIHZhcnMgZm9yIG5hZ2lhdnRpb25hbCA8bGluaz4gZWxlbWVudHMKbXkgJG5leHRfYnVnOwppZiAoJGNnaS0+Y29va2llKCJCVUdMSVNUIikgJiYgZGVmaW5lZCAkY2dpLT5wYXJhbSgnaWQnKSkgewogICAgbXkgQGJ1Z19saXN0ID0gc3BsaXQoLzovLCAkY2dpLT5jb29raWUoIkJVR0xJU1QiKSk7CiAgICAkdmFycy0+eydidWdfbGlzdCd9ID0gXEBidWdfbGlzdDsKICAgIG15ICRjdXIgPSBsc2VhcmNoKFxAYnVnX2xpc3QsICRjZ2ktPnBhcmFtKCJpZCIpKTsKICAgIGlmICgkY3VyID49IDAgJiYgJGN1ciA8ICQjYnVnX2xpc3QpIHsKICAgICAgICAkbmV4dF9idWcgPSAkYnVnX2xpc3RbJGN1ciArIDFdOwoKICAgICAgICAjIE5vdGUgdGhhdCB3ZSBvbmx5IGJvdGhlciB3aXRoIHRoZSBidWdfaWQgaGVyZSwgYW5kIGdldAogICAgICAgICMgdGhlIGZ1bGwgYnVnIG9iamVjdCBhdCB0aGUgZW5kLCBiZWZvcmUgc2hvd2luZyB0aGUgZWRpdAogICAgICAgICMgcGFnZS4gSWYgeW91IGNoYW5nZSB0aGlzLCByZW1lbWJlciB0aGF0IHdlIGhhdmUgbm90CiAgICAgICAgIyBkb25lIHRoZSBzZWN1cml0eSBjaGVja3Mgb24gdGhlIG5leHQgYnVnIHlldAogICAgICAgICR2YXJzLT57J2J1Zyd9ID0geyBidWdfaWQgPT4gJG5leHRfYnVnIH07CiAgICB9Cn0KCkdldFZlcnNpb25UYWJsZSgpOwoKQ2hlY2tGb3JtRmllbGREZWZpbmVkKCRjZ2ksICdwcm9kdWN0Jyk7CkNoZWNrRm9ybUZpZWxkRGVmaW5lZCgkY2dpLCAndmVyc2lvbicpOwpDaGVja0Zvcm1GaWVsZERlZmluZWQoJGNnaSwgJ2NvbXBvbmVudCcpOwoKCiMgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlcmUgaXMgYSBjb21tZW50IHJlcXVpcmVkIGZvciBhIHNwZWNpZmljCiMgZnVuY3Rpb24gYW5kIHRlc3RzLCBpZiB0aGUgY29tbWVudCB3YXMgZ2l2ZW4uCiMgSWYgY29tbWVudHMgYXJlIHJlcXVpcmVkIGZvciBmdW5jdGlvbnMgaXMgZGVmaW5lZCBieSBwYXJhbXMuCiMKc3ViIENoZWNrb25Db21tZW50KCAkICkgewogICAgbXkgKCRmdW5jdGlvbikgPSAoQF8pOwogICAgCiAgICAjIFBhcmFtIGlzIDEgaWYgY29tbWVudCBzaG91bGQgYmUgYWRkZWQgIQogICAgbXkgJHJldCA9IFBhcmFtKCAiY29tbWVudG9uIiAuICRmdW5jdGlvbiApOwoKICAgICMgQWxsb3cgd2l0aG91dCBjb21tZW50IGluIGNhc2Ugb2YgdW5kZWZpbmVkIFBhcmFtcy4KICAgICRyZXQgPSAwIHVubGVzcyAoIGRlZmluZWQoICRyZXQgKSk7CgogICAgaWYoICRyZXQgKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICRjZ2ktPnBhcmFtKCdjb21tZW50JykKICAgICAgICAgICAgfHwgJGNnaS0+cGFyYW0oJ2NvbW1lbnQnKSA9fiAvXlxzKiQvKSB7CiAgICAgICAgICAgICMgTm8gY29tbWVudCAtIHNvcnJ5LCBhY3Rpb24gbm90IGFsbG93ZWQgIQogICAgICAgICAgICBUaHJvd1VzZXJFcnJvcigiY29tbWVudF9yZXF1aXJlZCIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRyZXQgPSAwOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiggISAkcmV0ICk7ICMgUmV0dXJuIHZhbCBoYXMgdG8gYmUgaW52ZXJ0ZWQKfQoKIyBGaWd1cmUgb3V0IHdoZXRoZXIgb3Igbm90IHRoZSB1c2VyIGlzIHRyeWluZyB0byBjaGFuZ2UgdGhlIHByb2R1Y3QKIyAoZWl0aGVyIHRoZSAicHJvZHVjdCIgdmFyaWFibGUgaXMgbm90IHNldCB0byAiZG9uJ3QgY2hhbmdlIiBvciB0aGUKIyB1c2VyIGlzIGNoYW5naW5nIGEgc2luZ2xlIGJ1ZyBhbmQgaGFzIGNoYW5nZWQgdGhlIGJ1ZydzIHByb2R1Y3QpLAojIGFuZCBtYWtlIHRoZSB1c2VyIHZlcmlmeSB0aGUgdmVyc2lvbiwgY29tcG9uZW50LCB0YXJnZXQgbWlsZXN0b25lLAojIGFuZCBidWcgZ3JvdXBzIGlmIHNvLgpteSAkb2xkcHJvZHVjdCA9ICcnOwppZiAoZGVmaW5lZCAkY2dpLT5wYXJhbSgnaWQnKSkgewogICAgU2VuZFNRTCgiU0VMRUNUIG5hbWUgRlJPTSBwcm9kdWN0cyBJTk5FUiBKT0lOIGJ1Z3MgIiAuCiAgICAgICAgICAgICJPTiBwcm9kdWN0cy5pZCA9IGJ1Z3MucHJvZHVjdF9pZCBXSEVSRSBidWdfaWQgPSAiIC4KICAgICAgICAgICAgJGNnaS0+cGFyYW0oJ2lkJykpOwogICAgJG9sZHByb2R1Y3QgPSBGZXRjaFNRTERhdGEoKTsKfQoKaWYgKCgoZGVmaW5lZCAkY2dpLT5wYXJhbSgnaWQnKSAmJiAkY2dpLT5wYXJhbSgncHJvZHVjdCcpIG5lICRvbGRwcm9kdWN0KSAKICAgICB8fCAoISRjZ2ktPnBhcmFtKCdpZCcpCiAgICAgICAgICYmICRjZ2ktPnBhcmFtKCdwcm9kdWN0JykgbmUgJGNnaS0+cGFyYW0oJ2RvbnRjaGFuZ2UnKSkpCiAgICAmJiBDaGVja29uQ29tbWVudCggInJlYXNzaWduYnljb21wb25lbnQiICkpCnsKICAgICMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZXkgYWN0dWFsbHkgaGF2ZSB0aGUgcmlnaHQgdG8gY2hhbmdlIHRoZSBwcm9kdWN0CiAgICBpZiAoIUNoZWNrQ2FuQ2hhbmdlRmllbGQoJ3Byb2R1Y3QnLCBzY2FsYXIgJGNnaS0+cGFyYW0oJ2lkJyksICRvbGRwcm9kdWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2dpLT5wYXJhbSgncHJvZHVjdCcpKSkgewogICAgICAgICR2YXJzLT57J29sZHZhbHVlJ30gPSAkb2xkcHJvZHVjdDsKICAgICAgICAkdmFycy0+eyduZXd2YWx1ZSd9ID0gJGNnaS0+cGFyYW0oJ3Byb2R1Y3QnKTsKICAgICAgICAkdmFycy0+eydmaWVsZCd9ID0gJ3Byb2R1Y3QnOwogICAgICAgICR2YXJzLT57J3ByaXZzJ30gPSAkUHJpdmlsZWdlc1JlcXVpcmVkOwogICAgICAgIFRocm93VXNlckVycm9yKCJpbGxlZ2FsX2NoYW5nZSIsICR2YXJzKTsKICAgIH0KCiAgICBteSAkcHJvZCA9ICRjZ2ktPnBhcmFtKCdwcm9kdWN0Jyk7CiAgICB0cmlja190YWludCgkcHJvZCk7CgogICAgIyBJZiBhdCBsZWFzdCBvbmUgYnVnIGRvZXMgbm90IGJlbG9uZyB0byB0aGUgcHJvZHVjdCB3ZSBhcmUKICAgICMgbW92aW5nIHRvLCB3ZSBoYXZlIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB1c2VyIGlzCiAgICAjIGFsbG93ZWQgdG8gZW50ZXIgYnVncyBpbnRvIHRoYXQgcHJvZHVjdC4KICAgICMgTm90ZSB0aGF0IHRoaXMgY2hlY2sgbXVzdCBiZSBkb25lIGVhcmx5IHRvIGF2b2lkIHRoZSBsZWFrYWdlCiAgICAjIG9mIGNvbXBvbmVudCwgdmVyc2lvbiBhbmQgdGFyZ2V0IG1pbGVzdG9uZSBuYW1lcy4KICAgIG15ICRjaGVja19jYW5fZW50ZXIgPQogICAgICAgICRkYmgtPnNlbGVjdHJvd19hcnJheSgiU0VMRUNUIDEgRlJPTSBidWdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTk5FUiBKT0lOIHByb2R1Y3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTiBidWdzLnByb2R1Y3RfaWQgPSBwcm9kdWN0cy5pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgcHJvZHVjdHMubmFtZSAhPSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkQgYnVncy5idWdfaWQgSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiIC4gam9pbignLCcsIEBpZGxpc3QpIC4gIikgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGJoLT5zcWxfbGltaXQoMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwgJHByb2QpOwoKICAgIGlmICgkY2hlY2tfY2FuX2VudGVyKSB7IENhbkVudGVyUHJvZHVjdE9yV2FybigkcHJvZCkgfQoKICAgICMgbm90ZSB0aGF0IHdoZW4gdGhpcyBzY3JpcHQgaXMgY2FsbGVkIGZyb20gYnVnbGlzdC5jZ2kgKHJhdGhlcgogICAgIyB0aGFuIHNob3dfYnVnLmNnaSksIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgcHJvZHVjdCB3aWxsIGJlIGNoYW5nZWQKICAgICMgYnV0IHRoYXQgdGhlIHZlcnNpb24gYW5kL29yIGNvbXBvbmVudCB3aWxsIGJlIHNldCB0byAKICAgICMgIi0tZG9udF9jaGFuZ2UtLSIgYnV0IHN0aWxsIGhhcHBlbiB0byBiZSBjb3JyZWN0LiAgaW4gdGhpcyBjYXNlLAogICAgIyB0aGUgaWYgc3RhdGVtZW50IHdpbGwgaW5jb3JyZWN0bHkgdHJpZ2dlciBhbnl3YXkuICB0aGlzIGlzIGEgCiAgICAjIHByZXR0eSB3ZWlyZCBjYXNlLCBhbmQgbm90IHRlcnJpYmx5IHVucmVhc29uYWJsZSBiZWhhdmlvciwgYnV0IAogICAgIyB3b3J0aHkgb2YgYSBjb21tZW50LCBwZXJoYXBzLgogICAgIwogICAgbXkgJHZvayA9IGxzZWFyY2goJDo6dmVyc2lvbnN7JHByb2R9LCAkY2dpLT5wYXJhbSgndmVyc2lvbicpKSA+PSAwOwogICAgbXkgJGNvayA9IGxzZWFyY2goJDo6Y29tcG9uZW50c3skcHJvZH0sICRjZ2ktPnBhcmFtKCdjb21wb25lbnQnKSkgPj0gMDsKCiAgICBteSAkbW9rID0gMTsgICAjIHNvIGl0IHdvbid0IGFmZmVjdCB0aGUgJ2lmJyBzdGF0ZW1lbnQgaWYgbWlsZXN0b25lcyBhcmVuJ3QgdXNlZAogICAgaWYgKCBQYXJhbSgidXNldGFyZ2V0bWlsZXN0b25lIikgKSB7CiAgICAgICBDaGVja0Zvcm1GaWVsZERlZmluZWQoJGNnaSwgJ3RhcmdldF9taWxlc3RvbmUnKTsKICAgICAgICRtb2sgPSBsc2VhcmNoKCQ6OnRhcmdldF9taWxlc3RvbmV7JHByb2R9LAogICAgICAgICAgICAgICAgICAgICAgJGNnaS0+cGFyYW0oJ3RhcmdldF9taWxlc3RvbmUnKSkgPj0gMDsKICAgIH0KCiAgICAjIElmIHRoZSBwcm9kdWN0LXNwZWNpZmljIGZpZWxkcyBuZWVkIHRvIGJlIHZlcmlmaWVkLCBvciB3ZSBuZWVkIHRvIHZlcmlmeQogICAgIyB3aGV0aGVyIG9yIG5vdCB0byBhZGQgdGhlIGJ1Z3MgdG8gdGhlaXIgbmV3IHByb2R1Y3QncyBncm91cCwgZGlzcGxheQogICAgIyBhIHZlcmlmaWNhdGlvbiBmb3JtLgogICAgaWYgKCEkdm9rIHx8ICEkY29rIHx8ICEkbW9rIHx8IChBbnlEZWZhdWx0R3JvdXBzKCkKICAgICAgICAmJiAhZGVmaW5lZCAkY2dpLT5wYXJhbSgnYWRkdG9uZXdncm91cCcpKSkgewogICAgICAgIAogICAgICAgIGlmICghJHZvayB8fCAhJGNvayB8fCAhJG1vaykgewogICAgICAgICAgICAkdmFycy0+eyd2ZXJpZnlfZmllbGRzJ30gPSAxOwogICAgICAgICAgICBteSAlZGVmYXVsdHM7CiAgICAgICAgICAgICMgV2Ugc2V0IHRoZSBkZWZhdWx0cyB0byB0aGVzZSBmaWVsZHMgdG8gdGhlIG9sZCB2YWx1ZSwKICAgICAgICAgICAgIyBpZiBpdHMgYSB2YWxpZCBvcHRpb24sIG90aGVyd2lzZSB3ZSB1c2UgdGhlIGRlZmF1bHQgd2hlcmUKICAgICAgICAgICAgIyB0aGF0cyBhcHByb3ByaWF0ZQogICAgICAgICAgICAkdmFycy0+eyd2ZXJzaW9ucyd9ID0gJDo6dmVyc2lvbnN7JHByb2R9OwogICAgICAgICAgICBpZiAoJHZvaykgewogICAgICAgICAgICAgICAgJGRlZmF1bHRzeyd2ZXJzaW9uJ30gPSAkY2dpLT5wYXJhbSgndmVyc2lvbicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR2YXJzLT57J2NvbXBvbmVudHMnfSA9ICQ6OmNvbXBvbmVudHN7JHByb2R9OwogICAgICAgICAgICBpZiAoJGNvaykgewogICAgICAgICAgICAgICAgJGRlZmF1bHRzeydjb21wb25lbnQnfSA9ICRjZ2ktPnBhcmFtKCdjb21wb25lbnQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoUGFyYW0oInVzZXRhcmdldG1pbGVzdG9uZSIpKSB7CiAgICAgICAgICAgICAgICAkdmFycy0+eyd1c2VfdGFyZ2V0X21pbGVzdG9uZSd9ID0gMTsKICAgICAgICAgICAgICAgICR2YXJzLT57J21pbGVzdG9uZXMnfSA9ICQ6OnRhcmdldF9taWxlc3RvbmV7JHByb2R9OwogICAgICAgICAgICAgICAgaWYgKCRtb2spIHsKICAgICAgICAgICAgICAgICAgICAkZGVmYXVsdHN7J3RhcmdldF9taWxlc3RvbmUnfSA9ICRjZ2ktPnBhcmFtKCd0YXJnZXRfbWlsZXN0b25lJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFNlbmRTUUwoIlNFTEVDVCBkZWZhdWx0bWlsZXN0b25lIEZST00gcHJvZHVjdHMgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUgbmFtZSA9ICIgLiBTcWxRdW90ZSgkcHJvZCkpOwogICAgICAgICAgICAgICAgICAgICRkZWZhdWx0c3sndGFyZ2V0X21pbGVzdG9uZSd9ID0gRmV0Y2hPbmVDb2x1bW4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICR2YXJzLT57J3VzZV90YXJnZXRfbWlsZXN0b25lJ30gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR2YXJzLT57J2RlZmF1bHRzJ30gPSBcJWRlZmF1bHRzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJHZhcnMtPnsndmVyaWZ5X2ZpZWxkcyd9ID0gMDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJHZhcnMtPnsndmVyaWZ5X2J1Z19ncm91cCd9ID0gKEFueURlZmF1bHRHcm91cHMoKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWRlZmluZWQgJGNnaS0+cGFyYW0oJ2FkZHRvbmV3Z3JvdXAnKSk7CiAgICAgICAgCiAgICAgICAgJHRlbXBsYXRlLT5wcm9jZXNzKCJidWcvcHJvY2Vzcy92ZXJpZnktbmV3LXByb2R1Y3QuaHRtbC50bXBsIiwgJHZhcnMpCiAgICAgICAgICB8fCBUaHJvd1RlbXBsYXRlRXJyb3IoJHRlbXBsYXRlLT5lcnJvcigpKTsKICAgICAgICBleGl0OwogICAgfQp9CgoKIyBDaGVja3MgdGhhdCB0aGUgdXNlciBpcyBhbGxvd2VkIHRvIGNoYW5nZSB0aGUgZ2l2ZW4gZmllbGQuICBBY3R1YWxseSwgcmlnaHQKIyBub3csIHRoZSBydWxlcyBhcmUgcHJldHR5IHNpbXBsZSwgYW5kIGRvbid0IGxvb2sgYXQgdGhlIGZpZWxkIGl0c2VsZiB2ZXJ5CiMgbXVjaCwgYnV0IHRoYXQgY291bGQgYmUgZW5oYW5jZWQuCgpteSAkb3duZXJpZDsKbXkgJHJlcG9ydGVyaWQ7Cm15ICRxYWNvbnRhY3RpZDsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgQ2hlY2tDYW5DaGFuZ2VGaWVsZCgpIGRlZmluZXMgd2hhdCB1c2VycyBhcmUgYWxsb3dlZCB0byBjaGFuZ2Ugd2hhdCBidWdzLiBZb3UKIyBjYW4gYWRkIGNvZGUgaGVyZSBmb3Igc2l0ZS1zcGVjaWZpYyBwb2xpY3kgY2hhbmdlcywgYWNjb3JkaW5nIHRvIHRoZSAKIyBpbnN0cnVjdGlvbnMgZ2l2ZW4gaW4gdGhlIEJ1Z3ppbGxhIEd1aWRlIGFuZCBiZWxvdy4gTm90ZSB0aGF0IHlvdSBtYXkgYWxzbwojIGhhdmUgdG8gdXBkYXRlIHRoZSBCdWd6aWxsYTo6QnVnOjp1c2VyKCkgZnVuY3Rpb24gdG8gZ2l2ZSBwZW9wbGUgYWNjZXNzIHRvIHRoZQojIG9wdGlvbnMgdGhhdCB0aGV5IGFyZSBwZXJtaXR0ZWQgdG8gY2hhbmdlLgojCiMgQ2hlY2tDYW5DaGFuZ2VGaWVsZCgpIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiB0aGUgdXNlciBpcyBhbGxvd2VkIHRvIGNoYW5nZSB0aGlzCiMgZmllbGQsIGFuZCBmYWxzZSBpZiB0aGV5IGFyZSBub3QuCiMKIyBUaGUgcGFyYW1ldGVycyB0byB0aGlzIGZ1bmN0aW9uIGFyZSBhcyBmb2xsb3dzOgojICRmaWVsZCAgICAtIG5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBidWdzIHRhYmxlIHRoZSB1c2VyIGlzIHRyeWluZyB0byBjaGFuZ2UKIyAkYnVnaWQgICAgLSB0aGUgSUQgb2YgdGhlIGJ1ZyB0aGV5IGFyZSBjaGFuZ2luZwojICRvbGR2YWx1ZSAtIHdoYXQgdGhleSBhcmUgY2hhbmdpbmcgaXQgZnJvbQojICRuZXd2YWx1ZSAtIHdoYXQgdGhleSBhcmUgY2hhbmdpbmcgaXQgdG8KIwojIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSBub3QgY2FsbGVkIGZvciBkZXBlbmRlbmN5IGNoYW5nZXMgCiMgKGJ1ZyAxNDE1OTMpIG9yIENDIGNoYW5nZXMsIHdoaWNoIG1lYW5zIGFueW9uZSBjYW4gY2hhbmdlIHRob3NlIGZpZWxkcy4KIwojIERvIG5vdCBjaGFuZ2UgdGhlIHNlY3Rpb25zIGJldHdlZW4gU1RBUlQgRE9fTk9UX0NIQU5HRSBhbmQgRU5EIERPX05PVF9DSEFOR0UuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBDaGVja0NhbkNoYW5nZUZpZWxkIHsKICAgICMgU1RBUlQgRE9fTk9UX0NIQU5HRQogICAgbXkgKCRmaWVsZCwgJGJ1Z2lkLCAkb2xkdmFsdWUsICRuZXd2YWx1ZSkgPSAoQF8pOwoKICAgICRvbGR2YWx1ZSA9IGRlZmluZWQoJG9sZHZhbHVlKSA/ICRvbGR2YWx1ZSA6ICcnOwogICAgJG5ld3ZhbHVlID0gZGVmaW5lZCgkbmV3dmFsdWUpID8gJG5ld3ZhbHVlIDogJyc7CgogICAgIyBSZXR1cm4gdHJ1ZSBpZiB0aGV5IGhhdmVuJ3QgY2hhbmdlZCB0aGlzIGZpZWxkIGF0IGFsbC4KICAgIGlmICgkb2xkdmFsdWUgZXEgJG5ld3ZhbHVlKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9IGVsc2lmICh0cmltKCRvbGR2YWx1ZSkgZXEgdHJpbSgkbmV3dmFsdWUpKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICAjIG51bWVyaWMgZmllbGRzIG5lZWQgdG8gYmUgY29tcGFyZWQgdXNpbmcgPT0gCiAgICB9IGVsc2lmICgoJGZpZWxkIGVxICJlc3RpbWF0ZWRfdGltZSIgfHwgJGZpZWxkIGVxICJyZW1haW5pbmdfdGltZSIpCiAgICAgICAgICAgICAmJiAkbmV3dmFsdWUgbmUgJGNnaS0+cGFyYW0oJ2RvbnRjaGFuZ2UnKQogICAgICAgICAgICAgJiYgJG9sZHZhbHVlID09ICRuZXd2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIEEgcmVzb2x1dGlvbiBjaGFuZ2UgaXMgYWx3YXlzIGFjY29tcGFuaWVkIGJ5IGEgc3RhdHVzIGNoYW5nZS4gU28sIHdlIAogICAgIyBhbHdheXMgT0sgcmVzb2x1dGlvbiBjaGFuZ2VzOyBpZiB0aGV5IHJlYWxseSBjYW4ndCBkbyB0aGlzLCB3ZSB3aWxsIAogICAgIyBub3RpY2UgaXQgd2hlbiBzdGF0dXMgaXMgY2hlY2tlZC4gCiAgICBpZiAoJGZpZWxkIGVxICJyZXNvbHV0aW9uIikgeyAKICAgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgCiAgICB9CiAgICAjIEVORCBET19OT1RfQ0hBTkdFCgogICAgIyBBbGxvdyBhbnlvbmUgdG8gY2hhbmdlIGNvbW1lbnRzLgogICAgaWYgKCRmaWVsZCA9fiAvXmxvbmdkZXNjLykgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgSWdub3JlIHRoZSBhc3NpZ25lZF90byBmaWVsZCBpZiB0aGUgYnVnIGlzIG5vdCBiZWluZyByZWFzc2lnbmVkCiAgICBpZiAoJGZpZWxkIGVxICJhc3NpZ25lZF90byIKICAgICAgICAmJiAkY2dpLT5wYXJhbSgna25vYicpIG5lICJyZWFzc2lnbmJ5Y29tcG9uZW50IgogICAgICAgICYmICRjZ2ktPnBhcmFtKCdrbm9iJykgbmUgInJlYXNzaWduIikKICAgIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIFNUQVJUIERPX05PVF9DSEFOR0UKICAgICMgRmluZCBvdXQgd2hldGhlciB0aGUgdXNlciBpcyBhIG1lbWJlciBvZiB0aGUgImVkaXRidWdzIiBhbmQvb3IKICAgICMgImNhbmNvbmZpcm0iIGdyb3Vwcy4gJFVzZXJJbipHcm91cFNldCBhcmUgY2FjaGVzIG9mIHRoZSByZXR1cm4gdmFsdWUgb2YgCiAgICAjIHRoZSBVc2VySW5Hcm91cCBjYWxscy4KICAgIGlmICgkVXNlckluRWRpdEdyb3VwU2V0IDwgMCkgewogICAgICAgICRVc2VySW5FZGl0R3JvdXBTZXQgPSBVc2VySW5Hcm91cCgiZWRpdGJ1Z3MiKTsKICAgIH0KICAgIAogICAgaWYgKCRVc2VySW5DYW5Db25maXJtR3JvdXBTZXQgPCAwKSB7CiAgICAgICAgJFVzZXJJbkNhbkNvbmZpcm1Hcm91cFNldCA9IFVzZXJJbkdyb3VwKCJjYW5jb25maXJtIik7CiAgICB9CiAgICAjIEVORCBET19OT1RfQ0hBTkdFCgogICAgIyBJZiB0aGUgdXNlciBpc24ndCBhbGxvd2VkIHRvIGNoYW5nZSBhIGZpZWxkLCB3ZSBtdXN0IHRlbGwgaGltIHdobyBjYW4uCiAgICAjIFdlIHN0b3JlIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uIHNldCBpbnRvIHRoZSAkUHJpdmlsZWdlc1JlcXVpcmVkCiAgICAjIHZhcmlhYmxlIHdoaWNoIGdldHMgcGFzc2VkIHRvIHRoZSBlcnJvciB0ZW1wbGF0ZS4KICAgICMKICAgICMgJFByaXZpbGVnZXNSZXF1aXJlZCA9IDAgOiBubyBwcml2aWxlZ2VzIHJlcXVpcmVkOwogICAgIyAkUHJpdmlsZWdlc1JlcXVpcmVkID0gMSA6IHRoZSByZXBvcnRlciwgYXNzaWduZWUgb3IgYW4gZW1wb3dlcmVkIHVzZXI7CiAgICAjICRQcml2aWxlZ2VzUmVxdWlyZWQgPSAyIDogdGhlIGFzc2lnbmVlIG9yIGFuIGVtcG93ZXJlZCB1c2VyOwogICAgIyAkUHJpdmlsZWdlc1JlcXVpcmVkID0gMyA6IGFuIGVtcG93ZXJlZCB1c2VyLgoKICAgICMgQWxsb3cgYW55b25lIHdpdGggImVkaXRidWdzIiBwcml2cyB0byBjaGFuZ2UgYW55dGhpbmcuCiAgICBpZiAoJFVzZXJJbkVkaXRHcm91cFNldCkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgKk9ubHkqIHVzZXJzIHdpdGggImNhbmNvbmZpcm0iIHByaXZzIGNhbiBjb25maXJtIGJ1Z3MuCiAgICBpZiAoJGZpZWxkIGVxICJjYW5jb25maXJtIgogICAgICAgIHx8ICgkZmllbGQgZXEgImJ1Z19zdGF0dXMiCiAgICAgICAgICAgICYmICRvbGR2YWx1ZSBlcSAnVU5DT05GSVJNRUQnCiAgICAgICAgICAgICYmIElzT3BlbmVkU3RhdGUoJG5ld3ZhbHVlKSkpCiAgICB7CiAgICAgICAgJFByaXZpbGVnZXNSZXF1aXJlZCA9IDM7CiAgICAgICAgcmV0dXJuICRVc2VySW5DYW5Db25maXJtR3JvdXBTZXQ7CiAgICB9CgogICAgIyBTVEFSVCBET19OT1RfQ0hBTkdFCiAgICAjICRyZXBvcnRlcmlkLCAkb3duZXJpZCBhbmQgJHFhY29udGFjdGlkIGFyZSBjYWNoZXMgb2YgdGhlIHJlc3VsdHMgb2YKICAgICMgdGhlIGNhbGwgdG8gZmluZCBvdXQgdGhlIGFzc2lnbmVlLCByZXBvcnRlciBhbmQgcWFjb250YWN0IG9mIHRoZSBjdXJyZW50IGJ1Zy4KICAgIGlmICgkbGFzdGJ1Z2lkICE9ICRidWdpZCkgewogICAgICAgIFNlbmRTUUwoIlNFTEVDVCByZXBvcnRlciwgYXNzaWduZWRfdG8sIHFhX2NvbnRhY3QgRlJPTSBidWdzCiAgICAgICAgICAgICAgICAgV0hFUkUgYnVnX2lkID0gJGJ1Z2lkIik7CiAgICAgICAgKCRyZXBvcnRlcmlkLCAkb3duZXJpZCwgJHFhY29udGFjdGlkKSA9IChGZXRjaFNRTERhdGEoKSk7CiAgICAgICAgJGxhc3RidWdpZCA9ICRidWdpZDsKICAgIH0gICAgCiAgICAjIEVORCBET19OT1RfQ0hBTkdFCgogICAgIyBBbGxvdyB0aGUgYXNzaWduZWUgdG8gY2hhbmdlIGFueXRoaW5nIGVsc2UuCiAgICBpZiAoJG93bmVyaWQgPT0gJHdob2lkKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICAKICAgICMgQWxsb3cgdGhlIFFBIGNvbnRhY3QgdG8gY2hhbmdlIGFueXRoaW5nIGVsc2UuCiAgICBpZiAoUGFyYW0oJ3VzZXFhY29udGFjdCcpICYmICRxYWNvbnRhY3RpZCAmJiAoJHFhY29udGFjdGlkID09ICR3aG9pZCkpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIAogICAgIyBBdCB0aGlzIHBvaW50LCB0aGUgdXNlciBpcyBlaXRoZXIgdGhlIHJlcG9ydGVyIG9yIGFuCiAgICAjIHVucHJpdmlsZWdlZCB1c2VyLiBXZSBmaXJzdCBjaGVjayBmb3IgZmllbGRzIHRoZSByZXBvcnRlcgogICAgIyBpcyBub3QgYWxsb3dlZCB0byBjaGFuZ2UuCgogICAgIyBUaGUgcmVwb3J0ZXIgbWF5IG5vdDoKICAgICMgLSByZWFzc2lnbiBidWdzLCB1bmxlc3MgdGhlIGJ1Z3MgYXJlIGFzc2lnbmVkIHRvIGhpbTsKICAgICMgICBpbiB0aGF0IGNhc2Ugd2Ugd2lsbCBoYXZlIGFscmVhZHkgcmV0dXJuZWQgMSBhYm92ZQogICAgIyAgIHdoZW4gY2hlY2tpbmcgZm9yIHRoZSBhc3NpZ25lZSBvZiB0aGUgYnVnLgogICAgaWYgKCRmaWVsZCBlcSAiYXNzaWduZWRfdG8iKSB7CiAgICAgICAgJFByaXZpbGVnZXNSZXF1aXJlZCA9IDI7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAjIC0gY2hhbmdlIHRoZSBRQSBjb250YWN0CiAgICBpZiAoJGZpZWxkIGVxICJxYV9jb250YWN0IikgewogICAgICAgICRQcml2aWxlZ2VzUmVxdWlyZWQgPSAyOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgIyAtIGNoYW5nZSB0aGUgdGFyZ2V0IG1pbGVzdG9uZQogICAgaWYgKCRmaWVsZCBlcSAidGFyZ2V0X21pbGVzdG9uZSIpIHsKICAgICAgICAkUHJpdmlsZWdlc1JlcXVpcmVkID0gMjsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgICMgLSBjaGFuZ2UgdGhlIHByaW9yaXR5ICh1bmxlc3MgaGUgY291bGQgaGF2ZSBzZXQgaXQgb3JpZ2luYWxseSkKICAgIGlmICgkZmllbGQgZXEgInByaW9yaXR5IgogICAgICAgICYmICFQYXJhbSgnbGV0c3VibWl0dGVyY2hvb3NlcHJpb3JpdHknKSkKICAgIHsKICAgICAgICAkUHJpdmlsZWdlc1JlcXVpcmVkID0gMjsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAjIFRoZSByZXBvcnRlciBpcyBhbGxvd2VkIHRvIGNoYW5nZSBhbnl0aGluZyBlbHNlLgogICAgaWYgKCRyZXBvcnRlcmlkID09ICR3aG9pZCkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgSWYgd2UgaGF2ZW4ndCByZXR1cm5lZCBieSB0aGlzIHBvaW50LCB0aGVuIHRoZSB1c2VyIGRvZXNuJ3QKICAgICMgaGF2ZSB0aGUgbmVjZXNzYXJ5IHBlcm1pc3Npb25zIHRvIGNoYW5nZSB0aGlzIGZpZWxkLgogICAgJFByaXZpbGVnZXNSZXF1aXJlZCA9IDE7CiAgICByZXR1cm4gMDsKfQoKIyBDb25maXJtIHRoYXQgdGhlIHJlcG9ydGVyIG9mIHRoZSBjdXJyZW50IGJ1ZyBjYW4gYWNjZXNzIHRoZSBidWcgd2UgYXJlIGR1cGluZyB0by4Kc3ViIER1cGxpY2F0ZVVzZXJDb25maXJtIHsKICAgICMgaWYgd2UndmUgYWxyZWFkeSBiZWVuIHRocm91Z2ggaGVyZSwgdGhlbiBleGl0CiAgICBpZiAoZGVmaW5lZCAkY2dpLT5wYXJhbSgnY29uZmlybV9hZGRfZHVwbGljYXRlJykpIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBSZW1lbWJlciB0aGF0IHdlIHZhbGlkYXRlZCBib3RoIHRoZXNlIGlkcyBlYXJsaWVyLCBzbyB3ZSBrbm93CiAgICAjIHRoZXkgYXJlIGJvdGggdmFsaWQgYnVnIGlkcwogICAgbXkgJGR1cGUgPSAkY2dpLT5wYXJhbSgnaWQnKTsKICAgIG15ICRvcmlnaW5hbCA9ICRjZ2ktPnBhcmFtKCdkdXBfaWQnKTsKICAgIAogICAgU2VuZFNRTCgiU0VMRUNUIHJlcG9ydGVyIEZST00gYnVncyBXSEVSRSBidWdfaWQgPSAkZHVwZSIpOwogICAgbXkgJHJlcG9ydGVyID0gRmV0Y2hPbmVDb2x1bW4oKTsKICAgIG15ICRyZXBfdXNlciA9IEJ1Z3ppbGxhOjpVc2VyLT5uZXcoJHJlcG9ydGVyKTsKCiAgICBpZiAoJHJlcF91c2VyLT5jYW5fc2VlX2J1Zygkb3JpZ2luYWwpKSB7CiAgICAgICAgJGNnaS0+cGFyYW0oJ2NvbmZpcm1fYWRkX2R1cGxpY2F0ZScsICcxJyk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIFNlbmRTUUwoIlNFTEVDVCBjY2xpc3RfYWNjZXNzaWJsZSBGUk9NIGJ1Z3MgV0hFUkUgYnVnX2lkID0gJG9yaWdpbmFsIik7CiAgICAkdmFycy0+eydjY2xpc3RfYWNjZXNzaWJsZSd9ID0gRmV0Y2hPbmVDb2x1bW4oKTsKICAgIAogICAgIyBPbmNlIGluIHRoaXMgcGFydCBvZiB0aGUgc3Vicm91dGluZSwgdGhlIHVzZXIgaGFzIG5vdCBiZWVuIGF1dG8tdmFsaWRhdGVkCiAgICAjIGFuZCB0aGUgZHVwZXIgaGFzIG5vdCBjaG9zZW4gd2hldGhlciBvciBub3QgdG8gYWRkIHRvIENDIGxpc3QsIHNvIGxldCdzCiAgICAjIGFzayB0aGUgZHVwZXIgd2hhdCBoZS9zaGUgd2FudHMgdG8gZG8uCiAgICAKICAgICR2YXJzLT57J29yaWdpbmFsX2J1Z19pZCd9ID0gJG9yaWdpbmFsOwogICAgJHZhcnMtPnsnZHVwbGljYXRlX2J1Z19pZCd9ID0gJGR1cGU7CiAgICAKICAgICMgQ29uZmlybSB3aGV0aGVyIG9yIG5vdCB0byBhZGQgdGhlIHJlcG9ydGVyIHRvIHRoZSBjYzogbGlzdAogICAgIyBvZiB0aGUgb3JpZ2luYWwgYnVnICh0aGUgb25lIHRoaXMgYnVnIGlzIGJlaW5nIGR1cGVkIGFnYWluc3QpLgogICAgcHJpbnQgQnVnemlsbGEtPmNnaS0+aGVhZGVyKCk7CiAgICAkdGVtcGxhdGUtPnByb2Nlc3MoImJ1Zy9wcm9jZXNzL2NvbmZpcm0tZHVwbGljYXRlLmh0bWwudG1wbCIsICR2YXJzKQogICAgICB8fCBUaHJvd1RlbXBsYXRlRXJyb3IoJHRlbXBsYXRlLT5lcnJvcigpKTsKICAgIGV4aXQ7Cn0KCmlmIChkZWZpbmVkICRjZ2ktPnBhcmFtKCdpZCcpKSB7CiAgICAjIHNpbmNlIHRoaXMgbWVhbnMgdGhhdCB3ZSB3ZXJlIGNhbGxlZCBmcm9tIHNob3dfYnVnLmNnaSwgbm93IGlzIGEgZ29vZAogICAgIyB0aW1lIHRvIGRvIGEgd2hvbGUgYnVuY2ggb2YgZXJyb3IgY2hlY2tpbmcgdGhhdCBjYW4ndCBlYXNpbHkgaGFwcGVuIHdoZW4KICAgICMgd2UndmUgYmVlbiBjYWxsZWQgZnJvbSBidWdsaXN0LmNnaSwgYmVjYXVzZSBidWdsaXN0LmNnaSBvbmx5IHR3ZWFrcwogICAgIyB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBpbnN0ZWFkIG9mIHN1Ym1pdHRpbmcgYWxsIHRoZSBuZXcgdmFsdWVzLgogICAgIyAoWFhYIHRob3NlIGVycm9yIGNoZWNrcyBuZWVkIHRvIGhhcHBlbiB0b28sIGJ1dCBpbXBsZW1lbnRpbmcgdGhlbSAKICAgICMgaXMgbW9yZSB3b3JrIGluIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSBvZiB0aGlzIHNjcmlwdC4uLikKICAgICMKICAgIENoZWNrRm9ybUZpZWxkKCRjZ2ksICdwcm9kdWN0JywgXEA6OmxlZ2FsX3Byb2R1Y3QpOwogICAgQ2hlY2tGb3JtRmllbGQoJGNnaSwgJ2NvbXBvbmVudCcsIAogICAgICAgICAgICAgICAgICAgXEB7JDo6Y29tcG9uZW50c3skY2dpLT5wYXJhbSgncHJvZHVjdCcpfX0pOwogICAgQ2hlY2tGb3JtRmllbGQoJGNnaSwgJ3ZlcnNpb24nLCBcQHskOjp2ZXJzaW9uc3skY2dpLT5wYXJhbSgncHJvZHVjdCcpfX0pOwogICAgaWYgKCBQYXJhbSgidXNldGFyZ2V0bWlsZXN0b25lIikgKSB7CiAgICAgICAgQ2hlY2tGb3JtRmllbGQoJGNnaSwgJ3RhcmdldF9taWxlc3RvbmUnLCAKICAgICAgICAgICAgICAgICAgICAgICBcQHskOjp0YXJnZXRfbWlsZXN0b25leyRjZ2ktPnBhcmFtKCdwcm9kdWN0Jyl9fSk7CiAgICB9CiAgICBDaGVja0Zvcm1GaWVsZCgkY2dpLCAncmVwX3BsYXRmb3JtJywgXEA6OmxlZ2FsX3BsYXRmb3JtKTsKICAgIENoZWNrRm9ybUZpZWxkKCRjZ2ksICdvcF9zeXMnLCBcQDo6bGVnYWxfb3BzeXMpOwogICAgQ2hlY2tGb3JtRmllbGQoJGNnaSwgJ3ByaW9yaXR5JywgXEA6OmxlZ2FsX3ByaW9yaXR5KTsKICAgIENoZWNrRm9ybUZpZWxkKCRjZ2ksICdidWdfc2V2ZXJpdHknLCBcQDo6bGVnYWxfc2V2ZXJpdHkpOwogICAgQ2hlY2tGb3JtRmllbGREZWZpbmVkKCRjZ2ksICdidWdfZmlsZV9sb2MnKTsKICAgIENoZWNrRm9ybUZpZWxkRGVmaW5lZCgkY2dpLCAnc2hvcnRfZGVzYycpOwogICAgQ2hlY2tGb3JtRmllbGREZWZpbmVkKCRjZ2ksICdsb25nZGVzY2xlbmd0aCcpOwogICAgJGNnaS0+cGFyYW0oJ3Nob3J0X2Rlc2MnLCBjbGVhbl90ZXh0KCRjZ2ktPnBhcmFtKCdzaG9ydF9kZXNjJykpKTsKCiAgICBpZiAodHJpbSgkY2dpLT5wYXJhbSgnc2hvcnRfZGVzYycpKSBlcSAiIikgewogICAgICAgIFRocm93VXNlckVycm9yKCJyZXF1aXJlX3N1bW1hcnkiKTsKICAgIH0KfQoKbXkgJGFjdGlvbiA9IHRyaW0oJGNnaS0+cGFyYW0oJ2FjdGlvbicpIHx8ICcnKTsKCmlmICgkYWN0aW9uIGVxIFBhcmFtKCdtb3ZlLWJ1dHRvbi10ZXh0JykpIHsKICAkY2dpLT5wYXJhbSgnYnVnbGlzdCcsIGpvaW4gKCI6IiwgQGlkbGlzdCkpOwogIGRvICJtb3ZlLnBsIiB8fCBkaWUgIkVycm9yIGV4ZWN1dGluZyBtb3ZlLmNnaTogJCEiOwogIGV4aXQ7Cn0KCgokOjpxdWVyeSA9ICJ1cGRhdGUgYnVnc1xuc2V0IjsKJDo6Y29tbWEgPSAiIjsKdW1hc2soMCk7CgpzdWIgX3JlbW92ZV9yZW1haW5pbmdfdGltZSB7CiAgICBpZiAoVXNlckluR3JvdXAoUGFyYW0oJ3RpbWV0cmFja2luZ2dyb3VwJykpKSB7CiAgICAgICAgaWYgKCBkZWZpbmVkICRjZ2ktPnBhcmFtKCdyZW1haW5pbmdfdGltZScpIAogICAgICAgICAgICAgJiYgJGNnaS0+cGFyYW0oJ3JlbWFpbmluZ190aW1lJykgPiAwICkKICAgICAgICB7CiAgICAgICAgICAgICRjZ2ktPnBhcmFtKCdyZW1haW5pbmdfdGltZScsIDApOwogICAgICAgICAgICAkdmFycy0+eydtZXNzYWdlJ30gPSAicmVtYWluaW5nX3RpbWVfemVyb2VkIjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBEb0NvbW1hKCk7CiAgICAgICAgJDo6cXVlcnkgLj0gInJlbWFpbmluZ190aW1lID0gMCI7CiAgICB9Cn0KCnN1YiBEb0NvbW1hIHsKICAgICQ6OnF1ZXJ5IC49ICIkOjpjb21tYVxuICAgICI7CiAgICAkOjpjb21tYSA9ICIsIjsKfQoKc3ViIERvQ29uZmlybSB7CiAgICBpZiAoQ2hlY2tDYW5DaGFuZ2VGaWVsZCgiY2FuY29uZmlybSIsIHNjYWxhciAkY2dpLT5wYXJhbSgnaWQnKSwgMCwgMSkpIHsKICAgICAgICBEb0NvbW1hKCk7CiAgICAgICAgJDo6cXVlcnkgLj0gImV2ZXJjb25maXJtZWQgPSAxIjsKICAgIH0KfQoKc3ViIENoYW5nZVN0YXR1cyB7CiAgICBteSAoJHN0cikgPSAoQF8pOwogICAgaWYgKCEkY2dpLT5wYXJhbSgnZG9udGNoYW5nZScpCiAgICAgICAgfHwgJHN0ciBuZSAkY2dpLT5wYXJhbSgnZG9udGNoYW5nZScpKSB7CiAgICAgICAgRG9Db21tYSgpOwogICAgICAgIGlmICgkY2dpLT5wYXJhbSgna25vYicpIGVxICdyZW9wZW4nKSB7CiAgICAgICAgICAgICMgV2hlbiByZW9wZW5pbmcsIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgYnVnIHdhcyBldmVyCiAgICAgICAgICAgICMgY29uZmlybWVkIG9yIG5vdAogICAgICAgICAgICAkOjpxdWVyeSAuPSAiYnVnX3N0YXR1cyA9IENBU0UgV0hFTiBldmVyY29uZmlybWVkID0gMSBUSEVOICIgLgogICAgICAgICAgICAgICAgICAgICAgICAgU3FsUXVvdGUoJHN0cikgLiAiIEVMU0UgJ1VOQ09ORklSTUVEJyBFTkQiOwogICAgICAgIH0gZWxzaWYgKElzT3BlbmVkU3RhdGUoJHN0cikpIHsKICAgICAgICAgICAgIyBOb3RlIHRoYXQgd2UgY2Fubm90IGNvbWJpbmUgdGhpcyB3aXRoIHRoZSBhYm92ZSBicmFuY2ggLSBoZXJlIHdlCiAgICAgICAgICAgICMgbmVlZCB0byBjaGVjayBpZiBidWdzLmJ1Z19zdGF0dXMgaXMgb3BlbiwgKHNpbmNlIHdlIGRvbid0IHdhbnQgdG8KICAgICAgICAgICAgIyByZW9wZW4gY2xvc2VkIGJ1Z3Mgd2hlbiByZWFzc2lnbmluZyksIHdoaWxlIGFib3ZlIHRoZSB3aG9sZSBwb2ludAogICAgICAgICAgICAjIGlzIHRvIHJlb3BlbiBhIGNsb3NlZCBidWcuCiAgICAgICAgICAgICMgQ3VycmVudGx5LCB0aGUgVUkgZG9lc24ndCBwZXJtaXQgYSB1c2VyIHRvIHJlYXNzaWduIGEgY2xvc2VkIGJ1ZwogICAgICAgICAgICAjIGZyb20gdGhlIHNpbmdsZSBidWcgcGFnZSAob25seSBkdXJpbmcgYSBtYXNzIGNoYW5nZSksIGJ1dCB0aGV5CiAgICAgICAgICAgICMgY291bGQgc3RpbGwgaGFjayB0aGUgc3VibWl0LCBzbyBkb24ndCByZXN0cmljdCB0aGlzIGV4dGVuZGVkCiAgICAgICAgICAgICMgY2hlY2sgdG8gdGhlIG1hc3MgY2hhbmdlIHBhZ2UgZm9yIHNhZmV0eS9zYW5pdHkvY29uc2lzdGVuY3kKICAgICAgICAgICAgIyBwdXJwb3Nlcy4KCiAgICAgICAgICAgICMgVGhlIGxvZ2ljIGZvciB0aGlzIGJsb2NrIGlzOgogICAgICAgICAgICAjIElmIHRoZSBuZXcgc3RhdGUgaXMgb3BlbjoKICAgICAgICAgICAgIyAgIElmIHRoZSBvbGQgc3RhdGUgd2FzIG9wZW4KICAgICAgICAgICAgIyAgICAgSWYgdGhlIGJ1ZyB3YXMgY29uZmlybWVkCiAgICAgICAgICAgICMgICAgICAgLSBtb3ZlIGl0IHRvIHRoZSBuZXcgc3RhdGUKICAgICAgICAgICAgIyAgICAgRWxzZQogICAgICAgICAgICAjICAgICAgIC0gU2V0IHRoZSBzdGF0ZSB0byB1bmNvbmZpcm1lZAogICAgICAgICAgICAjICAgRWxzZQogICAgICAgICAgICAjICAgICAtIGxlYXZlIGl0IGFzIGl0IHdhcwoKICAgICAgICAgICAgIyBUaGlzIGlzIHZhbGlkIG9ubHkgYmVjYXVzZSAncmVvcGVuJyBpcyB0aGUgb25seSB0aGluZyB3aGljaCBtb3ZlcwogICAgICAgICAgICAjIGZyb20gY2xvc2VkIHRvIG9wZW4sIGFuZCBpdHMgaGFuZGxlZCBhYm92ZQogICAgICAgICAgICAjIFRoaXMgYWxzbyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBjb25maXJtaW5nIGFuZCBhY2NlcHRpbmcgaGF2ZQogICAgICAgICAgICAjIGFscmVhZHkgY2FsbGVkIERvQ29uZmlybSBiZWZvcmUgdGhpcyBpcyBjYWxsZWQKCiAgICAgICAgICAgIG15IEBvcGVuX3N0YXRlID0gbWFwKFNxbFF1b3RlKCRfKSwgT3BlblN0YXRlcygpKTsKICAgICAgICAgICAgbXkgJG9wZW5fc3RhdGUgPSBqb2luKCIsICIsIEBvcGVuX3N0YXRlKTsKICAgICAgICAgICAgJDo6cXVlcnkgLj0gImJ1Z19zdGF0dXMgPSBDQVNFIFdIRU4gYnVnX3N0YXR1cyBJTigkb3Blbl9zdGF0ZSkgVEhFTiAiIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoQ0FTRSBXSEVOIGV2ZXJjb25maXJtZWQgPSAxIFRIRU4gIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3FsUXVvdGUoJHN0cikgLiAiIEVMU0UgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnVU5DT05GSVJNRUQnIEVORCkgRUxTRSAiIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWdfc3RhdHVzIEVORCI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJDo6cXVlcnkgLj0gImJ1Z19zdGF0dXMgPSAiIC4gU3FsUXVvdGUoJHN0cik7CiAgICAgICAgfQogICAgICAgICMgSWYgYnVncyBhcmUgcmVhc3NpZ25lZCBhbmQgdGhlaXIgc3RhdHVzIGlzICJVTkNPTkZJUk1FRCIsIHRoZXkKICAgICAgICAjIHNob3VsZCBrZWVwIHRoaXMgc3RhdHVzIGluc3RlYWQgb2YgIk5FVyIgYXMgc3VnZ2VzdGVkIGhlcmUuCiAgICAgICAgIyBUaGlzIHBvaW50IGlzIGNoZWNrZWQgZm9yIGVhY2ggYnVnIGxhdGVyIGluIHRoZSBjb2RlLgogICAgICAgICRjZ2ktPnBhcmFtKCdidWdfc3RhdHVzJywgJHN0cik7CiAgICB9Cn0KCnN1YiBDaGFuZ2VSZXNvbHV0aW9uIHsKICAgIG15ICgkc3RyKSA9IChAXyk7CiAgICBpZiAoISRjZ2ktPnBhcmFtKCdkb250Y2hhbmdlJykKICAgICAgICB8fCAkc3RyIG5lICRjZ2ktPnBhcmFtKCdkb250Y2hhbmdlJykpCiAgICB7CiAgICAgICAgRG9Db21tYSgpOwogICAgICAgICQ6OnF1ZXJ5IC49ICJyZXNvbHV0aW9uID0gIiAuIFNxbFF1b3RlKCRzdHIpOwogICAgICAgICMgV2UgZGVmaW5lIHRoaXMgdmFyaWFibGUgaGVyZSBzbyB0aGF0IGN1c3RvbWl6ZWQgaW5zdGFsbGF0aW9ucwogICAgICAgICMgbWF5IHNldCBydWxlcyBiYXNlZCBvbiB0aGUgcmVzb2x1dGlvbiBpbiBDaGVja0NhbkNoYW5nZUZpZWxkLgogICAgICAgICRjZ2ktPnBhcmFtKCdyZXNvbHV0aW9uJywgJHN0cik7CiAgICB9Cn0KCiMgQ2hhbmdpbmcgdGhpcyBzbyB0aGF0IGl0IHdpbGwgcHJvY2VzcyBncm91cHMgZnJvbSBjaGVja2JveGVzIGluc3RlYWQgb2YKIyBzZWxlY3QgbGlzdHMuICBUaGlzIG1lYW5zIHRoYXQgaW5zdGVhZCBvZiBsb29raW5nIGZvciB0aGUgYml0LVggdmFsdWVzIGluCiMgdGhlIGZvcm0sIHdlIG5lZWQgdG8gbG9vcCB0aHJvdWdoIGFsbCB0aGUgYnVnIGdyb3VwcyB0aGlzIHVzZXIgaGFzIGFjY2VzcwojIHRvLCBhbmQgZm9yIGVhY2ggb25lLCBzZWUgaWYgaXQncyBzZWxlY3RlZC4KIyBJZiB0aGUgZm9ybSBlbGVtZW50IGlzbid0IHByZXNlbnQsIG9yIHRoZSB1c2VyIGlzbid0IGluIHRoZSBncm91cCwgbGVhdmUKIyBpdCBhcy1pcwoKbXkgQGdyb3VwQWRkID0gKCk7Cm15IEBncm91cERlbCA9ICgpOwoKU2VuZFNRTCgiU0VMRUNUIGdyb3Vwcy5pZCwgaXNhY3RpdmUgRlJPTSBncm91cHMgSU5ORVIgSk9JTiB1c2VyX2dyb3VwX21hcCAiIC4KICAgICAgICAiT04gZ3JvdXBzLmlkID0gdXNlcl9ncm91cF9tYXAuZ3JvdXBfaWQgIiAuCiAgICAgICAgIldIRVJFIHVzZXJfZ3JvdXBfbWFwLnVzZXJfaWQgPSAkd2hvaWQgIiAuCiAgICAgICAgIkFORCBpc2JsZXNzID0gMCBBTkQgaXNidWdncm91cCA9IDEiKTsKd2hpbGUgKG15ICgkYiwgJGlzYWN0aXZlKSA9IEZldGNoU1FMRGF0YSgpKSB7CiAgICAjIFRoZSBtdWx0aXBsZSBjaGFuZ2UgcGFnZSBtYXkgbm90IHNob3cgYWxsIGdyb3VwcyBhIGJ1ZyBpcyBpbgogICAgIyAoZWcgcHJvZHVjdCBncm91cHMgd2hlbiBsaXN0aW5nIG1vcmUgdGhhbiBvbmUgcHJvZHVjdCkKICAgICMgT25seSBjb25zaWRlciBncm91cHMgd2hpY2ggd2VyZSBwcmVzZW50IG9uIHRoZSBmb3JtLiBXZSBjYW4ndCBkbyB0aGlzCiAgICAjIGZvciBzaW5nbGUgYnVnIGNoYW5nZXMgYmVjYXVzZSBub24tY2hlY2tlZCBjaGVja2JveGVzIGFyZW4ndCBwcmVzZW50LgogICAgIyBBbGwgdGhlIGNoZWNrYm94ZXMgc2hvdWxkIGJlIHNob3duIGluIHRoYXQgY2FzZSwgdGhvdWdoLCBzbyBpdHMgbm90CiAgICAjIGFuIGlzc3VlIHRoZXJlCiAgICBpZiAoZGVmaW5lZCAkY2dpLT5wYXJhbSgnaWQnKSB8fCBkZWZpbmVkICRjZ2ktPnBhcmFtKCJiaXQtJGIiKSkgewogICAgICAgIGlmICghJGNnaS0+cGFyYW0oImJpdC0kYiIpKSB7CiAgICAgICAgICAgIHB1c2goQGdyb3VwRGVsLCAkYik7CiAgICAgICAgfSBlbHNpZiAoJGNnaS0+cGFyYW0oImJpdC0kYiIpID09IDEgJiYgJGlzYWN0aXZlKSB7CiAgICAgICAgICAgIHB1c2goQGdyb3VwQWRkLCAkYik7CiAgICAgICAgfQogICAgfQp9Cgpmb3JlYWNoIG15ICRmaWVsZCAoInJlcF9wbGF0Zm9ybSIsICJwcmlvcml0eSIsICJidWdfc2V2ZXJpdHkiLAogICAgICAgICAgICAgICAgICAgImJ1Z19maWxlX2xvYyIsICJzaG9ydF9kZXNjIiwgInZlcnNpb24iLCAib3Bfc3lzIiwKICAgICAgICAgICAgICAgICAgICJ0YXJnZXRfbWlsZXN0b25lIiwgInN0YXR1c193aGl0ZWJvYXJkIikgewogICAgaWYgKGRlZmluZWQgJGNnaS0+cGFyYW0oJGZpZWxkKSkgewogICAgICAgIGlmICghJGNnaS0+cGFyYW0oJ2RvbnRjaGFuZ2UnKQogICAgICAgICAgICB8fCAkY2dpLT5wYXJhbSgkZmllbGQpIG5lICRjZ2ktPnBhcmFtKCdkb250Y2hhbmdlJykpIHsKICAgICAgICAgICAgRG9Db21tYSgpOwogICAgICAgICAgICAkOjpxdWVyeSAuPSAiJGZpZWxkID0gIiAuIFNxbFF1b3RlKHRyaW0oJGNnaS0+cGFyYW0oJGZpZWxkKSkpOwogICAgICAgIH0KICAgIH0KfQoKbXkgJHByb2RfaWQ7ICMgUmVtZW1iZXIsIGNhbid0IHVzZSB0aGlzIGZvciBtYXNzIGNoYW5nZXMKaWYgKCRjZ2ktPnBhcmFtKCdwcm9kdWN0JykgbmUgJGNnaS0+cGFyYW0oJ2RvbnRjaGFuZ2UnKSkgewogICAgJHByb2RfaWQgPSBnZXRfcHJvZHVjdF9pZCgkY2dpLT5wYXJhbSgncHJvZHVjdCcpKTsKICAgICRwcm9kX2lkIHx8CiAgICAgIFRocm93VXNlckVycm9yKCJpbnZhbGlkX3Byb2R1Y3RfbmFtZSIsIAogICAgICAgICAgICAgICAgICAgICB7cHJvZHVjdCA9PiAkY2dpLT5wYXJhbSgncHJvZHVjdCcpfSk7CiAgICAgIAogICAgRG9Db21tYSgpOwogICAgJDo6cXVlcnkgLj0gInByb2R1Y3RfaWQgPSAkcHJvZF9pZCI7Cn0gZWxzZSB7CiAgICBTZW5kU1FMKCJTRUxFQ1QgRElTVElOQ1QgcHJvZHVjdF9pZCBGUk9NIGJ1Z3MgV0hFUkUgYnVnX2lkIElOICgiIC4KICAgICAgICAgICAgam9pbignLCcsIEBpZGxpc3QpIC4gIikgIiAuICRkYmgtPnNxbF9saW1pdCgyKSk7CiAgICAkcHJvZF9pZCA9IEZldGNoT25lQ29sdW1uKCk7CiAgICAkcHJvZF9pZCA9IHVuZGVmIGlmIChGZXRjaE9uZUNvbHVtbigpKTsKfQoKbXkgJGNvbXBfaWQ7ICMgUmVtZW1iZXIsIGNhbid0IHVzZSB0aGlzIGZvciBtYXNzIGNoYW5nZXMKaWYgKCRjZ2ktPnBhcmFtKCdjb21wb25lbnQnKSBuZSAkY2dpLT5wYXJhbSgnZG9udGNoYW5nZScpKSB7CiAgICBpZiAoIWRlZmluZWQgJHByb2RfaWQpIHsKICAgICAgICBUaHJvd1VzZXJFcnJvcigibm9fY29tcG9uZW50X2NoYW5nZV9mb3JfbXVsdGlwbGVfcHJvZHVjdHMiKTsKICAgIH0KICAgICRjb21wX2lkID0gZ2V0X2NvbXBvbmVudF9pZCgkcHJvZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2dpLT5wYXJhbSgnY29tcG9uZW50JykpOwogICAgJGNvbXBfaWQgfHwgVGhyb3dDb2RlRXJyb3IoImludmFsaWRfY29tcG9uZW50IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZSA9PiAkY2dpLT5wYXJhbSgnY29tcG9uZW50JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCA9PiAkY2dpLT5wYXJhbSgncHJvZHVjdCcpfSk7CiAgICAKICAgICRjZ2ktPnBhcmFtKCdjb21wb25lbnRfaWQnLCAkY29tcF9pZCk7CiAgICBEb0NvbW1hKCk7CiAgICAkOjpxdWVyeSAuPSAiY29tcG9uZW50X2lkID0gJGNvbXBfaWQiOwp9CgojIElmIHRoaXMgaW5zdGFsbGF0aW9uIHVzZXMgYnVnIGFsaWFzZXMsIGFuZCB0aGUgdXNlciBpcyBjaGFuZ2luZyB0aGUgYWxpYXMsCiMgYWRkIHRoaXMgY2hhbmdlIHRvIHRoZSBxdWVyeS4KaWYgKFBhcmFtKCJ1c2VidWdhbGlhc2VzIikgJiYgZGVmaW5lZCAkY2dpLT5wYXJhbSgnYWxpYXMnKSkgewogICAgbXkgJGFsaWFzID0gdHJpbSgkY2dpLT5wYXJhbSgnYWxpYXMnKSk7CiAgICAKICAgICMgU2luY2UgYWxpYXNlcyBhcmUgdW5pcXVlIChsaWtlIGJ1ZyBudW1iZXJzKSwgdGhleSBjYW4gb25seSBiZSBjaGFuZ2VkCiAgICAjIGZvciBvbmUgYnVnIGF0IGEgdGltZSwgc28gaWdub3JlIHRoZSBhbGlhcyBjaGFuZ2UgdW5sZXNzIG9ubHkgYSBzaW5nbGUKICAgICMgYnVnIGlzIGJlaW5nIGNoYW5nZWQuCiAgICBpZiAoc2NhbGFyKEBpZGxpc3QpID09IDEpIHsKICAgICAgICAjIEFkZCB0aGUgYWxpYXMgY2hhbmdlIHRvIHRoZSBxdWVyeS4gIElmIHRoZSBmaWVsZCBjb250YWlucyB0aGUgYmxhbmsgCiAgICAgICAgIyB2YWx1ZSwgbWFrZSB0aGUgZmllbGQgYmUgTlVMTCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBidWcgaGFzIG5vIGFsaWFzLgogICAgICAgICMgT3RoZXJ3aXNlLCBpZiB0aGUgZmllbGQgY29udGFpbnMgYSB2YWx1ZSwgdXBkYXRlIHRoZSByZWNvcmQgCiAgICAgICAgIyB3aXRoIHRoYXQgdmFsdWUuCiAgICAgICAgRG9Db21tYSgpOwogICAgICAgICQ6OnF1ZXJ5IC49ICJhbGlhcyA9ICI7CiAgICAgICAgaWYgKCRhbGlhcyBuZSAiIikgewogICAgICAgICAgICBWYWxpZGF0ZUJ1Z0FsaWFzKCRhbGlhcywgJGlkbGlzdFswXSk7CiAgICAgICAgICAgICQ6OnF1ZXJ5IC49ICRkYmgtPnF1b3RlKCRhbGlhcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJDo6cXVlcnkgLj0gIk5VTEwiOwogICAgICAgIH0KICAgIH0KfQoKIyBJZiB0aGUgdXNlciBpcyBzdWJtaXR0aW5nIGNoYW5nZXMgZnJvbSBzaG93X2J1Zy5jZ2kgZm9yIGEgc2luZ2xlIGJ1ZywKIyBhbmQgdGhhdCBidWcgaXMgcmVzdHJpY3RlZCB0byBhIGdyb3VwLCBwcm9jZXNzIHRoZSBjaGVja2JveGVzIHRoYXQKIyBhbGxvd2VkIHRoZSB1c2VyIHRvIHNldCB3aGV0aGVyIG9yIG5vdCB0aGUgcmVwb3J0ZXIKIyBhbmQgY2MgbGlzdCBjYW4gc2VlIHRoZSBidWcgZXZlbiBpZiB0aGV5IGFyZSBub3QgbWVtYmVycyBvZiBhbGwgZ3JvdXBzIAojIHRvIHdoaWNoIHRoZSBidWcgaXMgcmVzdHJpY3RlZC4KaWYgKGRlZmluZWQgJGNnaS0+cGFyYW0oJ2lkJykpIHsKICAgIFNlbmRTUUwoIlNFTEVDVCBncm91cF9pZCBGUk9NIGJ1Z19ncm91cF9tYXAgV0hFUkUgYnVnX2lkID0gIiAuCiAgICAgICAgICAgICRjZ2ktPnBhcmFtKCdpZCcpKTsKICAgIG15ICgkaGF2ZWdyb3VwKSA9IEZldGNoU1FMRGF0YSgpOwogICAgaWYgKCAkaGF2ZWdyb3VwICkgewogICAgICAgIERvQ29tbWEoKTsKICAgICAgICAkY2dpLT5wYXJhbSgncmVwb3J0ZXJfYWNjZXNzaWJsZScsCiAgICAgICAgICAgICAgICAgICAgJGNnaS0+cGFyYW0oJ3JlcG9ydGVyX2FjY2Vzc2libGUnKSA/ICcxJyA6ICcwJyk7CiAgICAgICAgJDo6cXVlcnkgLj0gJ3JlcG9ydGVyX2FjY2Vzc2libGUgPSAnIC4KICAgICAgICAgICAgICAgICAgICAkY2dpLT5wYXJhbSgncmVwb3J0ZXJfYWNjZXNzaWJsZScpOwoKICAgICAgICBEb0NvbW1hKCk7CiAgICAgICAgJGNnaS0+cGFyYW0oJ2NjbGlzdF9hY2Nlc3NpYmxlJywKICAgICAgICAgICAgICAgICAgICAkY2dpLT5wYXJhbSgnY2NsaXN0X2FjY2Vzc2libGUnKSA/ICcxJyA6ICcwJyk7CiAgICAgICAgJDo6cXVlcnkgLj0gJ2NjbGlzdF9hY2Nlc3NpYmxlID0gJyAuICRjZ2ktPnBhcmFtKCdjY2xpc3RfYWNjZXNzaWJsZScpOwogICAgfQp9CgppZiAoZGVmaW5lZCAkY2dpLT5wYXJhbSgnaWQnKSAmJgogICAgKFBhcmFtKCJpbnNpZGVyZ3JvdXAiKSAmJiBVc2VySW5Hcm91cChQYXJhbSgiaW5zaWRlcmdyb3VwIikpKSkgewoKICAgIGZvcmVhY2ggbXkgJGZpZWxkICgkY2dpLT5wYXJhbSgpKSB7CiAgICAgICAgaWYgKCRmaWVsZCA9fiAvd2hlbi0oWzAtOV0rKS8pIHsKICAgICAgICAgICAgbXkgJHNlcXVlbmNlID0gJDE7CiAgICAgICAgICAgIG15ICRwcml2YXRlID0gJGNnaS0+cGFyYW0oImlzcHJpdmF0ZS0kc2VxdWVuY2UiKSA/IDEgOiAwIDsKICAgICAgICAgICAgaWYgKCRwcml2YXRlICE9ICRjZ2ktPnBhcmFtKCJvaXNwcml2YXRlLSRzZXF1ZW5jZSIpKSB7CiAgICAgICAgICAgICAgICBteSAkZmllbGRfZGF0YSA9ICRjZ2ktPnBhcmFtKCIkZmllbGQiKTsKICAgICAgICAgICAgICAgIGRldGFpbnRfbmF0dXJhbCgkZmllbGRfZGF0YSk7CiAgICAgICAgICAgICAgICBTZW5kU1FMKCJVUERBVEUgbG9uZ2Rlc2NzIFNFVCBpc3ByaXZhdGUgPSAkcHJpdmF0ZSAiIC4KICAgICAgICAgICAgICAgICAgICAgICAgIldIRVJFIGJ1Z19pZCA9ICIgLiAkY2dpLT5wYXJhbSgnaWQnKSAuIAogICAgICAgICAgICAgICAgICAgICAgICAiIEFORCBidWdfd2hlbiA9ICRmaWVsZF9kYXRhIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfQp9CgpteSAkZHVwbGljYXRlID0gMDsKCiMgV2UgbmVlZCB0byBjaGVjayB0aGUgYWRkcmVzc2VzIGludm9sdmVkIGluIGEgQ0MgY2hhbmdlIGJlZm9yZSB3ZSB0b3VjaCBhbnkgYnVncy4KIyBXaGF0IHdlJ2xsIGRvIGhlcmUgaXMgZm9ybXVsYXRlIHRoZSBDQyBkYXRhIGludG8gdHdvIGhhc2hlcyBvZiBJRCdzIGludm9sdmVkCiMgaW4gdGhpcyBDQyBjaGFuZ2UuICBUaGVuIHRob3NlIGhhc2hlcyBjYW4gYmUgdXNlZCBsYXRlciBvbiBmb3IgdGhlIGFjdHVhbCBjaGFuZ2UuCm15ICglY2NfYWRkLCAlY2NfcmVtb3ZlKTsKaWYgKGRlZmluZWQgJGNnaS0+cGFyYW0oJ25ld2NjJykKICAgIHx8IGRlZmluZWQgJGNnaS0+cGFyYW0oJ2FkZHNlbGZjYycpCiAgICB8fCBkZWZpbmVkICRjZ2ktPnBhcmFtKCdyZW1vdmVjYycpCiAgICB8fCBkZWZpbmVkICRjZ2ktPnBhcmFtKCdtYXNzY2MnKSkgewogICAgIyBJZiBtYXNzY2MgaXMgZGVmaW5lZCwgdGhlbiB3ZSBjYW1lIGZyb20gYnVnbGlzdCBhbmQgbmVlZCB0byBlaXRoZXIgYWRkIG9yCiAgICAjIHJlbW92ZSBjYydzLi4uIG90aGVyd2lzZSwgd2UgY2FtZSBmcm9tIGJ1Z2Zvcm0gYW5kIG1heSBuZWVkIHRvIGRvIGJvdGguCiAgICBteSAoJGNjX2FkZCwgJGNjX3JlbW92ZSkgPSAiIjsKICAgIGlmIChkZWZpbmVkICRjZ2ktPnBhcmFtKCdtYXNzY2MnKSkgewogICAgICAgIGlmICgkY2dpLT5wYXJhbSgnY2NhY3Rpb24nKSBlcSAnYWRkJykgewogICAgICAgICAgICAkY2NfYWRkID0gam9pbignICcsJGNnaS0+cGFyYW0oJ21hc3NjYycpKTsKICAgICAgICB9IGVsc2lmICgkY2dpLT5wYXJhbSgnY2NhY3Rpb24nKSBlcSAncmVtb3ZlJykgewogICAgICAgICAgICAkY2NfcmVtb3ZlID0gam9pbignICcsJGNnaS0+cGFyYW0oJ21hc3NjYycpKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgICRjY19hZGQgPSBqb2luKCcgJywkY2dpLT5wYXJhbSgnbmV3Y2MnKSk7CiAgICAgICAgIyBXZSBjYW1lIGZyb20gYnVnX2Zvcm0gd2hpY2ggdXNlcyBhIHNlbGVjdCBib3ggdG8gZGV0ZXJtaW5lIHdoYXQgY2MncwogICAgICAgICMgbmVlZCB0byBiZSByZW1vdmVkLi4uCiAgICAgICAgaWYgKGRlZmluZWQgJGNnaS0+cGFyYW0oJ3JlbW92ZWNjJykgJiYgJGNnaS0+cGFyYW0oJ2NjJykpIHsKICAgICAgICAgICAgJGNjX3JlbW92ZSA9IGpvaW4gKCIsIiwgJGNnaS0+cGFyYW0oJ2NjJykpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJGNjX2FkZCkgewogICAgICAgICRjY19hZGQgPX4gcy9bXHMsXSsvIC9nOyAjIENoYW5nZSBhbGwgZGVsaW1pdGVycyB0byBhIHNpbmdsZSBzcGFjZQogICAgICAgIGZvcmVhY2ggbXkgJHBlcnNvbiAoIHNwbGl0KCIgIiwgJGNjX2FkZCkgKSB7CiAgICAgICAgICAgIG15ICRwaWQgPSBEQk5hbWVUb0lkQW5kQ2hlY2soJHBlcnNvbik7CiAgICAgICAgICAgICRjY19hZGR7JHBpZH0gPSAkcGVyc29uOwogICAgICAgIH0KICAgIH0KICAgIGlmICgkY2dpLT5wYXJhbSgnYWRkc2VsZmNjJykpIHsKICAgICAgICAkY2NfYWRkeyR3aG9pZH0gPSAkdXNlci0+bG9naW47CiAgICB9CiAgICBpZiAoJGNjX3JlbW92ZSkgewogICAgICAgICRjY19yZW1vdmUgPX4gcy9bXHMsXSsvIC9nOyAjIENoYW5nZSBhbGwgZGVsaW1pdGVycyB0byBhIHNpbmdsZSBzcGFjZQogICAgICAgIGZvcmVhY2ggbXkgJHBlcnNvbiAoIHNwbGl0KCIgIiwgJGNjX3JlbW92ZSkgKSB7CiAgICAgICAgICAgIG15ICRwaWQgPSBEQk5hbWVUb0lkQW5kQ2hlY2soJHBlcnNvbik7CiAgICAgICAgICAgICRjY19yZW1vdmV7JHBpZH0gPSAkcGVyc29uOwogICAgICAgIH0KICAgIH0KfQoKIyBTdG9yZSB0aGUgbmV3IGFzc2lnbmVlIGFuZCBRQSBjb250YWN0IElEcyAoaWYgYW55KS4gVGhpcyBpcyB0aGUKIyBvbmx5IHdheSB0byBrZWVwIHRoZXNlIGluZm9ybWF0aW9ucyB3aGVuIGJ1Z3MgYXJlIHJlYXNzaWduZWQgYnkKIyBjb21wb25lbnQgYXMgJGNnaS0+cGFyYW0oJ2Fzc2lnbmVkX3RvJykgYW5kICRjZ2ktPnBhcmFtKCdxYV9jb250YWN0JykKIyBhcmUgbm90IHRoZSByaWdodCBmaWVsZHMgdG8gbG9vayBhdC4KCm15ICRhc3NpZ25lZTsKbXkgJHFhY29udGFjdDsKCmlmIChkZWZpbmVkICRjZ2ktPnBhcmFtKCdxYV9jb250YWN0JykKICAgICYmICRjZ2ktPnBhcmFtKCdrbm9iJykgbmUgInJlYXNzaWduYnljb21wb25lbnQiKQp7CiAgICBteSAkbmFtZSA9IHRyaW0oJGNnaS0+cGFyYW0oJ3FhX2NvbnRhY3QnKSk7CiAgICAjIFRoZSBRQSBjb250YWN0IGNhbm5vdCBiZSBkZWxldGVkIGZyb20gc2hvd19idWcuY2dpIGZvciBhIHNpbmdsZSBidWchCiAgICBpZiAoJG5hbWUgbmUgJGNnaS0+cGFyYW0oJ2RvbnRjaGFuZ2UnKSkgewogICAgICAgICRxYWNvbnRhY3QgPSBEQk5hbWVUb0lkQW5kQ2hlY2soJG5hbWUpIGlmICgkbmFtZSBuZSAiIik7CiAgICAgICAgRG9Db21tYSgpOwogICAgICAgIGlmKCRxYWNvbnRhY3QpIHsKICAgICAgICAgICAgJDo6cXVlcnkgLj0gInFhX2NvbnRhY3QgPSAkcWFjb250YWN0IjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICQ6OnF1ZXJ5IC49ICJxYV9jb250YWN0ID0gTlVMTCI7CiAgICAgICAgfQogICAgfQp9CgpTV0lUQ0g6IGZvciAoJGNnaS0+cGFyYW0oJ2tub2InKSkgewogICAgL15ub25lJC8gJiYgZG8gewogICAgICAgIGxhc3QgU1dJVENIOwogICAgfTsKICAgIC9eY29uZmlybSQvICYmIENoZWNrb25Db21tZW50KCAiY29uZmlybSIgKSAmJiBkbyB7CiAgICAgICAgRG9Db25maXJtKCk7CiAgICAgICAgQ2hhbmdlU3RhdHVzKCdORVcnKTsKICAgICAgICBsYXN0IFNXSVRDSDsKICAgIH07CiAgICAvXmFjY2VwdCQvICYmIENoZWNrb25Db21tZW50KCAiYWNjZXB0IiApICYmIGRvIHsKICAgICAgICBEb0NvbmZpcm0oKTsKICAgICAgICBDaGFuZ2VTdGF0dXMoJ0FTU0lHTkVEJyk7CiAgICAgICAgaWYgKFBhcmFtKCJ1c2V0YXJnZXRtaWxlc3RvbmUiKSAmJiBQYXJhbSgibXVzdGhhdmVtaWxlc3RvbmVvbmFjY2VwdCIpKSB7CiAgICAgICAgICAgICRyZXF1aXJlbWlsZXN0b25lID0gMTsKICAgICAgICB9CiAgICAgICAgbGFzdCBTV0lUQ0g7CiAgICB9OwogICAgL15jbGVhcnJlc29sdXRpb24kLyAmJiBDaGVja29uQ29tbWVudCggImNsZWFycmVzb2x1dGlvbiIgKSAmJiBkbyB7CiAgICAgICAgQ2hhbmdlUmVzb2x1dGlvbignJyk7CiAgICAgICAgbGFzdCBTV0lUQ0g7CiAgICB9OwogICAgL15yZXNvbHZlJC8gJiYgQ2hlY2tvbkNvbW1lbnQoICJyZXNvbHZlIiApICYmIGRvIHsKICAgICAgICAjIENoZWNrIGhlcmUsIGJlY2F1c2UgaXRzIHRoZSBvbmx5IHBsYWNlIHdlIHJlcXVpcmUgdGhlIHJlc29sdXRpb24KICAgICAgICBDaGVja0Zvcm1GaWVsZCgkY2dpLCAncmVzb2x1dGlvbicsIFxAOjpzZXR0YWJsZV9yZXNvbHV0aW9uKTsKCiAgICAgICAgIyBkb24ndCByZXNvbHZlIGFzIGZpeGVkIHdoaWxlIHN0aWxsIHVucmVzb2x2ZWQgYmxvY2tpbmcgYnVncwogICAgICAgIGlmIChQYXJhbSgibm9yZXNvbHZlb25vcGVuYmxvY2tlcnMiKQogICAgICAgICAgICAmJiAkY2dpLT5wYXJhbSgncmVzb2x1dGlvbicpIGVxICdGSVhFRCcpCiAgICAgICAgewogICAgICAgICAgICBteSBAZGVwZW5kZW5jaWVzID0gQnVnemlsbGE6OkJ1Zzo6Q291bnRPcGVuRGVwZW5kZW5jaWVzKEBpZGxpc3QpOwogICAgICAgICAgICBpZiAoc2NhbGFyIEBkZXBlbmRlbmNpZXMgPiAwKSB7CiAgICAgICAgICAgICAgICBUaHJvd1VzZXJFcnJvcigic3RpbGxfdW5yZXNvbHZlZF9idWdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZGVwZW5kZW5jaWVzICAgICA9PiBcQGRlcGVuZGVuY2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeV9jb3VudCA9PiBzY2FsYXIgQGRlcGVuZGVuY2llcyB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBSRVNPTFZFRCBidWdzIHNob3VsZCBoYXZlIG5vIHRpbWUgcmVtYWluaW5nOwogICAgICAgICMgbW9yZSB0aW1lIGNhbiBiZSBhZGRlZCBmb3IgdGhlIFZFUklGWSBzdGVwLCBpZiBuZWVkZWQuCiAgICAgICAgX3JlbW92ZV9yZW1haW5pbmdfdGltZSgpOwoKICAgICAgICBDaGFuZ2VTdGF0dXMoJ1JFU09MVkVEJyk7CiAgICAgICAgQ2hhbmdlUmVzb2x1dGlvbigkY2dpLT5wYXJhbSgncmVzb2x1dGlvbicpKTsKICAgICAgICBsYXN0IFNXSVRDSDsKICAgIH07CiAgICAvXnJlYXNzaWduJC8gJiYgQ2hlY2tvbkNvbW1lbnQoICJyZWFzc2lnbiIgKSAmJiBkbyB7CiAgICAgICAgaWYgKCRjZ2ktPnBhcmFtKCdhbmRjb25maXJtJykpIHsKICAgICAgICAgICAgRG9Db25maXJtKCk7CiAgICAgICAgfQogICAgICAgIENoYW5nZVN0YXR1cygnTkVXJyk7CiAgICAgICAgRG9Db21tYSgpOwogICAgICAgIGlmICghZGVmaW5lZCAkY2dpLT5wYXJhbSgnYXNzaWduZWRfdG8nKQogICAgICAgICAgICB8fCB0cmltKCRjZ2ktPnBhcmFtKCdhc3NpZ25lZF90bycpKSBlcSAiIikgewogICAgICAgICAgICBUaHJvd1VzZXJFcnJvcigicmVhc3NpZ25fdG9fZW1wdHkiKTsKICAgICAgICB9CiAgICAgICAgJGFzc2lnbmVlID0gREJOYW1lVG9JZEFuZENoZWNrKHRyaW0oJGNnaS0+cGFyYW0oJ2Fzc2lnbmVkX3RvJykpKTsKICAgICAgICAkOjpxdWVyeSAuPSAiYXNzaWduZWRfdG8gPSAkYXNzaWduZWUiOwogICAgICAgIGxhc3QgU1dJVENIOwogICAgfTsKICAgIC9ecmVhc3NpZ25ieWNvbXBvbmVudCQvICAmJiBDaGVja29uQ29tbWVudCggInJlYXNzaWduYnljb21wb25lbnQiICkgJiYgZG8gewogICAgICAgIGlmICgkY2dpLT5wYXJhbSgncHJvZHVjdCcpIGVxICRjZ2ktPnBhcmFtKCdkb250Y2hhbmdlJykpIHsKICAgICAgICAgICAgVGhyb3dVc2VyRXJyb3IoIm5lZWRfcHJvZHVjdCIpOwogICAgICAgIH0KICAgICAgICBpZiAoJGNnaS0+cGFyYW0oJ2NvbXBvbmVudCcpIGVxICRjZ2ktPnBhcmFtKCdkb250Y2hhbmdlJykpIHsKICAgICAgICAgICAgVGhyb3dVc2VyRXJyb3IoIm5lZWRfY29tcG9uZW50Iik7CiAgICAgICAgfQogICAgICAgIGlmICgkY2dpLT5wYXJhbSgnY29tcGNvbmZpcm0nKSkgewogICAgICAgICAgICBEb0NvbmZpcm0oKTsKICAgICAgICB9CiAgICAgICAgQ2hhbmdlU3RhdHVzKCdORVcnKTsKICAgICAgICBTZW5kU1FMKCJTRUxFQ1QgaW5pdGlhbG93bmVyIEZST00gY29tcG9uZW50cyAiIC4KICAgICAgICAgICAgICAgICJXSEVSRSBjb21wb25lbnRzLmlkID0gJGNvbXBfaWQiKTsKICAgICAgICAkYXNzaWduZWUgPSBGZXRjaE9uZUNvbHVtbigpOwogICAgICAgIERvQ29tbWEoKTsKICAgICAgICAkOjpxdWVyeSAuPSAiYXNzaWduZWRfdG8gPSAkYXNzaWduZWUiOwogICAgICAgIGlmIChQYXJhbSgidXNlcWFjb250YWN0IikpIHsKICAgICAgICAgICAgU2VuZFNRTCgiU0VMRUNUIGluaXRpYWxxYWNvbnRhY3QgRlJPTSBjb21wb25lbnRzICIgLgogICAgICAgICAgICAgICAgICAgICJXSEVSRSBjb21wb25lbnRzLmlkID0gJGNvbXBfaWQiKTsKICAgICAgICAgICAgJHFhY29udGFjdCA9IEZldGNoT25lQ29sdW1uKCk7CiAgICAgICAgICAgIERvQ29tbWEoKTsKICAgICAgICAgICAgaWYgKCRxYWNvbnRhY3QpIHsKICAgICAgICAgICAgICAgICQ6OnF1ZXJ5IC49ICJxYV9jb250YWN0ID0gJHFhY29udGFjdCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkOjpxdWVyeSAuPSAicWFfY29udGFjdCA9IE5VTEwiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxhc3QgU1dJVENIOwogICAgfTsgICAKICAgIC9ecmVvcGVuJC8gICYmIENoZWNrb25Db21tZW50KCAicmVvcGVuIiApICYmIGRvIHsKICAgICAgICBDaGFuZ2VTdGF0dXMoJ1JFT1BFTkVEJyk7CiAgICAgICAgQ2hhbmdlUmVzb2x1dGlvbignJyk7CiAgICAgICAgbGFzdCBTV0lUQ0g7CiAgICB9OwogICAgL152ZXJpZnkkLyAmJiBDaGVja29uQ29tbWVudCggInZlcmlmeSIgKSAmJiBkbyB7CiAgICAgICAgQ2hhbmdlU3RhdHVzKCdWRVJJRklFRCcpOwogICAgICAgIGxhc3QgU1dJVENIOwogICAgfTsKICAgIC9eY2xvc2UkLyAmJiBDaGVja29uQ29tbWVudCggImNsb3NlIiApICYmIGRvIHsKICAgICAgICAjIENMT1NFRCBidWdzIHNob3VsZCBoYXZlIG5vIHRpbWUgcmVtYWluaW5nLgogICAgICAgIF9yZW1vdmVfcmVtYWluaW5nX3RpbWUoKTsKCiAgICAgICAgQ2hhbmdlU3RhdHVzKCdDTE9TRUQnKTsKICAgICAgICBsYXN0IFNXSVRDSDsKICAgIH07CiAgICAvXmR1cGxpY2F0ZSQvICYmIENoZWNrb25Db21tZW50KCAiZHVwbGljYXRlIiApICYmIGRvIHsKICAgICAgICAjIFlvdSBjYW5ub3QgbWFyayBidWdzIGFzIGR1cGxpY2F0ZXMgd2hlbiBjaGFuZ2luZwogICAgICAgICMgc2V2ZXJhbCBidWdzIGF0IG9uY2UuCiAgICAgICAgdW5sZXNzIChkZWZpbmVkICRjZ2ktPnBhcmFtKCdpZCcpKSB7CiAgICAgICAgICAgIFRocm93VXNlckVycm9yKCdkdXBlX25vdF9hbGxvd2VkJyk7CiAgICAgICAgfQoKICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBjYW4gY2hhbmdlIHRoZSBvcmlnaW5hbCBidWcgKGlzc3VlIEEgb24gYnVnIDk2MDg1KQogICAgICAgIENoZWNrRm9ybUZpZWxkRGVmaW5lZCgkY2dpLCAnZHVwX2lkJyk7CiAgICAgICAgJGR1cGxpY2F0ZSA9ICRjZ2ktPnBhcmFtKCdkdXBfaWQnKTsKICAgICAgICBWYWxpZGF0ZUJ1Z0lEKCRkdXBsaWNhdGUsICdkdXBfaWQnKTsKICAgICAgICAkY2dpLT5wYXJhbSgnZHVwX2lkJywgJGR1cGxpY2F0ZSk7CgogICAgICAgICMgTWFrZSBzdXJlIHRoZSBidWcgaXMgbm90IGFscmVhZHkgbWFya2VkIGFzIGEgZHVwZQogICAgICAgICMgKG1heSBhcHBlYXIgaW4gcmFjZSBjb25kaXRpb24pCiAgICAgICAgbXkgJGR1cGVfb2YgPQogICAgICAgICAgICAkZGJoLT5zZWxlY3Ryb3dfYXJyYXkoIlNFTEVDVCBkdXBlX29mIEZST00gZHVwbGljYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIGR1cGUgPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwgJGNnaS0+cGFyYW0oJ2lkJykpOwogICAgICAgIGlmICgkZHVwZV9vZikgewogICAgICAgICAgICBUaHJvd1VzZXJFcnJvcigiZHVwZV9lbnRyeV9mb3VuZCIsIHsgZHVwZV9vZiA9PiAkZHVwZV9vZiB9KTsKICAgICAgICB9CgogICAgICAgICMgTWFrZSBzdXJlIGEgbG9vcCBpc24ndCBjcmVhdGVkIHdoZW4gbWFya2luZyB0aGlzIGJ1ZwogICAgICAgICMgYXMgZHVwbGljYXRlLgogICAgICAgIG15ICVkdXBlczsKICAgICAgICAkZHVwZV9vZiA9ICRkdXBsaWNhdGU7CiAgICAgICAgbXkgJHN0aCA9ICRkYmgtPnByZXBhcmUoJ1NFTEVDVCBkdXBlX29mIEZST00gZHVwbGljYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBkdXBlID0gPycpOwoKICAgICAgICB3aGlsZSAoJGR1cGVfb2YpIHsKICAgICAgICAgICAgaWYgKCRkdXBlX29mID09ICRjZ2ktPnBhcmFtKCdpZCcpKSB7CiAgICAgICAgICAgICAgICBUaHJvd1VzZXJFcnJvcignZHVwZV9sb29wX2RldGVjdGVkJywgeyBidWdfaWQgID0+ICRjZ2ktPnBhcmFtKCdpZCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwZV9vZiA9PiAkZHVwbGljYXRlIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgSWYgJGR1cGVzeyRkdXBlX29mfSBpcyBhbHJlYWR5IHNldCB0byAxLCB0aGVuIGEgbG9vcAogICAgICAgICAgICAjIGFscmVhZHkgZXhpc3RzIHdoaWNoIGRvZXMgbm90IGludm9sdmUgdGhpcyBidWcuCiAgICAgICAgICAgICMgQXMgdGhlIHVzZXIgaXMgbm90IHJlc3BvbnNpYmxlIGZvciB0aGlzIGxvb3AsIGRvIG5vdAogICAgICAgICAgICAjIHByZXZlbnQgaGltIGZyb20gbWFya2luZyB0aGlzIGJ1ZyBhcyBhIGR1cGxpY2F0ZS4KICAgICAgICAgICAgbGFzdCBpZiBleGlzdHMgJGR1cGVzeyIkZHVwZV9vZiJ9OwogICAgICAgICAgICAkZHVwZXN7IiRkdXBlX29mIn0gPSAxOwogICAgICAgICAgICAkc3RoLT5leGVjdXRlKCRkdXBlX29mKTsKICAgICAgICAgICAgJGR1cGVfb2YgPSAkc3RoLT5mZXRjaHJvd19hcnJheTsKICAgICAgICB9CgogICAgICAgICMgQWxzbywgbGV0J3Mgc2VlIGlmIHRoZSByZXBvcnRlciBoYXMgYXV0aG9yaXphdGlvbiB0byBzZWUKICAgICAgICAjIHRoZSBidWcgdG8gd2hpY2ggd2UgYXJlIGR1cGluZy4gSWYgbm90IHdlIG5lZWQgdG8gcHJvbXB0LgogICAgICAgIER1cGxpY2F0ZVVzZXJDb25maXJtKCk7CgogICAgICAgICMgRFVQTElDQVRFIGJ1Z3Mgc2hvdWxkIGhhdmUgbm8gdGltZSByZW1haW5pbmcuCiAgICAgICAgX3JlbW92ZV9yZW1haW5pbmdfdGltZSgpOwoKICAgICAgICBDaGFuZ2VTdGF0dXMoJ1JFU09MVkVEJyk7CiAgICAgICAgQ2hhbmdlUmVzb2x1dGlvbignRFVQTElDQVRFJyk7CiAgICAgICAgbXkgJGNvbW1lbnQgPSAkY2dpLT5wYXJhbSgnY29tbWVudCcpOwogICAgICAgICRjb21tZW50IC49ICJcblxuKioqIFRoaXMgYnVnIGhhcyBiZWVuIG1hcmtlZCAiIC4KICAgICAgICAgICAgICAgICAgICAiYXMgYSBkdXBsaWNhdGUgb2YgJGR1cGxpY2F0ZSAqKioiOwogICAgICAgICRjZ2ktPnBhcmFtKCdjb21tZW50JywgJGNvbW1lbnQpOwogICAgICAgIGxhc3QgU1dJVENIOwogICAgfTsKCiAgICBUaHJvd0NvZGVFcnJvcigidW5rbm93bl9hY3Rpb24iLCB7IGFjdGlvbiA9PiAkY2dpLT5wYXJhbSgna25vYicpIH0pOwp9CgpteSBAa2V5d29yZGxpc3Q7Cm15ICVrZXl3b3Jkc2VlbjsKCmlmIChkZWZpbmVkICRjZ2ktPnBhcmFtKCdrZXl3b3JkcycpKSB7CiAgICBmb3JlYWNoIG15ICRrZXl3b3JkIChzcGxpdCgvW1xzLF0rLywgJGNnaS0+cGFyYW0oJ2tleXdvcmRzJykpKSB7CiAgICAgICAgaWYgKCRrZXl3b3JkIGVxICcnKSB7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQogICAgICAgIG15ICRpID0gR2V0S2V5d29yZElkRnJvbU5hbWUoJGtleXdvcmQpOwogICAgICAgIGlmICghJGkpIHsKICAgICAgICAgICAgVGhyb3dVc2VyRXJyb3IoInVua25vd25fa2V5d29yZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHsga2V5d29yZCA9PiAka2V5d29yZCB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCEka2V5d29yZHNlZW57JGl9KSB7CiAgICAgICAgICAgIHB1c2goQGtleXdvcmRsaXN0LCAkaSk7CiAgICAgICAgICAgICRrZXl3b3Jkc2VlbnskaX0gPSAxOwogICAgICAgIH0KICAgIH0KfQoKbXkgJGtleXdvcmRhY3Rpb24gPSAkY2dpLT5wYXJhbSgna2V5d29yZGFjdGlvbicpIHx8ICJtYWtlZXhhY3QiOwppZiAoIWdyZXAoJGtleXdvcmRhY3Rpb24gZXEgJF8sIHF3KGFkZCBkZWxldGUgbWFrZWV4YWN0KSkpIHsKICAgICRrZXl3b3JkYWN0aW9uID0gIm1ha2VleGFjdCI7Cn0KCmlmICgkOjpjb21tYSBlcSAiIgogICAgJiYgKCEgQGdyb3VwQWRkKSAmJiAoISBAZ3JvdXBEZWwpCiAgICAmJiAoISBAOjpsZWdhbF9rZXl3b3JkcyB8fCAoMCA9PSBAa2V5d29yZGxpc3QgJiYgJGtleXdvcmRhY3Rpb24gbmUgIm1ha2VleGFjdCIpKQogICAgJiYgZGVmaW5lZCAkY2dpLT5wYXJhbSgnbWFzc2NjJykgJiYgISAkY2dpLT5wYXJhbSgnbWFzc2NjJykKICAgICkgewogICAgaWYgKCFkZWZpbmVkICRjZ2ktPnBhcmFtKCdjb21tZW50JykgfHwgJGNnaS0+cGFyYW0oJ2NvbW1lbnQnKSA9fiAvXlxzKiQvKSB7CiAgICAgICAgVGhyb3dVc2VyRXJyb3IoImJ1Z3Nfbm90X2NoYW5nZWQiKTsKICAgIH0KfQoKIyBQcm9jZXNzIGRhdGEgZm9yIFRpbWUgVHJhY2tpbmcgZmllbGRzCmlmIChVc2VySW5Hcm91cChQYXJhbSgndGltZXRyYWNraW5nZ3JvdXAnKSkpIHsKICAgIGZvcmVhY2ggbXkgJGZpZWxkICgiZXN0aW1hdGVkX3RpbWUiLCAicmVtYWluaW5nX3RpbWUiKSB7CiAgICAgICAgaWYgKGRlZmluZWQgJGNnaS0+cGFyYW0oJGZpZWxkKSkgewogICAgICAgICAgICBteSAkZXJfdGltZSA9IHRyaW0oJGNnaS0+cGFyYW0oJGZpZWxkKSk7CiAgICAgICAgICAgIGlmICgkZXJfdGltZSBuZSAkY2dpLT5wYXJhbSgnZG9udGNoYW5nZScpKSB7CiAgICAgICAgICAgICAgICBEb0NvbW1hKCk7CiAgICAgICAgICAgICAgICAkOjpxdWVyeSAuPSAiJGZpZWxkID0gIiAuIFNxbFF1b3RlKCRlcl90aW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoZGVmaW5lZCAkY2dpLT5wYXJhbSgnZGVhZGxpbmUnKSkgewogICAgICAgIERvQ29tbWEoKTsKICAgICAgICAkOjpxdWVyeSAuPSAiZGVhZGxpbmUgPSAiOwogICAgICAgIGlmICgkY2dpLT5wYXJhbSgnZGVhZGxpbmUnKSkgewogICAgICAgICAgICBCdWd6aWxsYTo6VXRpbDo6VmFsaWRhdGVEYXRlKCRjZ2ktPnBhcmFtKCdkZWFkbGluZScpLCAnWVlZWS1NTS1ERCcpOwogICAgICAgICAgICAkOjpxdWVyeSAuPSBTcWxRdW90ZSgkY2dpLT5wYXJhbSgnZGVhZGxpbmUnKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJDo6cXVlcnkgLj0gIk5VTEwiIDsKICAgICAgICB9CiAgICB9Cn0KCm15ICRiYXNlcXVlcnkgPSAkOjpxdWVyeTsKbXkgJGRlbHRhX3RzOwoKCnN1YiBTbmFwU2hvdEJ1ZyB7CiAgICBteSAoJGlkKSA9IChAXyk7CiAgICBTZW5kU1FMKCJTRUxFQ1QgZGVsdGFfdHMsICIgLiBqb2luKCcsJywgQDo6bG9nX2NvbHVtbnMpIC4KICAgICAgICAgICAgIiBGUk9NIGJ1Z3MgV0hFUkUgYnVnX2lkID0gJGlkIik7CiAgICBteSBAcm93ID0gRmV0Y2hTUUxEYXRhKCk7CiAgICAkZGVsdGFfdHMgPSBzaGlmdCBAcm93OwoKICAgIHJldHVybiBAcm93Owp9CgoKc3ViIFNuYXBTaG90RGVwcyB7CiAgICBteSAoJGksICR0YXJnZXQsICRtZSkgPSAoQF8pOwogICAgU2VuZFNRTCgiU0VMRUNUICR0YXJnZXQgRlJPTSBkZXBlbmRlbmNpZXMgV0hFUkUgJG1lID0gJGkgT1JERVIgQlkgJHRhcmdldCIpOwogICAgbXkgQGxpc3Q7CiAgICB3aGlsZSAoTW9yZVNRTERhdGEoKSkgewogICAgICAgIHB1c2goQGxpc3QsIEZldGNoT25lQ29sdW1uKCkpOwogICAgfQogICAgcmV0dXJuIGpvaW4oJywnLCBAbGlzdCk7Cn0KCgpteSAkdGltZXN0YW1wOwpteSAkYnVnX2NoYW5nZWQ7CgpzdWIgTG9nRGVwZW5kZW5jeUFjdGl2aXR5IHsKICAgIG15ICgkaSwgJG9sZHN0ciwgJHRhcmdldCwgJG1lLCAkdGltZXN0YW1wKSA9IChAXyk7CiAgICBteSAkc3FsX3RpbWVzdGFtcCA9IFNxbFF1b3RlKCR0aW1lc3RhbXApOwogICAgbXkgJG5ld3N0ciA9IFNuYXBTaG90RGVwcygkaSwgJHRhcmdldCwgJG1lKTsKICAgIGlmICgkb2xkc3RyIG5lICRuZXdzdHIpIHsKICAgICAgICAjIEZpZ3VyZSBvdXQgd2hhdCdzIHJlYWxseSBkaWZmZXJlbnQuLi4KICAgICAgICBteSAoJHJlbW92ZWQsICRhZGRlZCkgPSBkaWZmX3N0cmluZ3MoJG9sZHN0ciwgJG5ld3N0cik7CiAgICAgICAgTG9nQWN0aXZpdHlFbnRyeSgkaSwkdGFyZ2V0LCRyZW1vdmVkLCRhZGRlZCwkd2hvaWQsJHRpbWVzdGFtcCk7CiAgICAgICAgIyB1cGRhdGUgdGltZXN0YW1wIG9uIHRhcmdldCBidWcgc28gbWlkYWlycyB3aWxsIGJlIHRyaWdnZXJlZAogICAgICAgIFNlbmRTUUwoIlVQREFURSBidWdzIFNFVCBkZWx0YV90cyA9ICRzcWxfdGltZXN0YW1wIFdIRVJFIGJ1Z19pZCA9ICRpIik7CiAgICAgICAgJGJ1Z19jaGFuZ2VkID0gMTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIHJldHVybiAwOwp9CgojIFRoaXMgbG9vcCBpdGVyYXRlcyBvbmNlIGZvciBlYWNoIGJ1ZyB0byBiZSBwcm9jZXNzZWQgKGkuZS4gYWxsIHRoZQojIGJ1Z3Mgc2VsZWN0ZWQgd2hlbiB0aGlzIHNjcmlwdCBpcyBjYWxsZWQgd2l0aCBtdWx0aXBsZSBidWdzIHNlbGVjdGVkCiMgZnJvbSBidWdsaXN0LmNnaSwgb3IganVzdCB0aGUgb25lIGJ1ZyB3aGVuIGNhbGxlZCBmcm9tCiMgc2hvd19idWcuY2dpKS4KIwpmb3JlYWNoIG15ICRpZCAoQGlkbGlzdCkgewogICAgbXkgJWRlcGVuZGVuY3ljaGFuZ2VkOwogICAgJGJ1Z19jaGFuZ2VkID0gMDsKICAgIG15ICR3cml0ZSA9ICJXUklURSI7ICAgICAgICAjIE1pZ2h0IHdhbnQgdG8gbWFrZSBhIHBhcmFtIHRvIGNvbnRyb2wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgd2UgZG8gTE9XX1BSSU9SSVRZIC4uLgogICAgJGRiaC0+YnpfbG9ja190YWJsZXMoImJ1Z3MgJHdyaXRlIiwgImJ1Z3NfYWN0aXZpdHkgJHdyaXRlIiwKICAgICAgICAgICAgImNjICR3cml0ZSIsICJjYyBBUyBzZWxlY3RWaXNpYmxlX2NjICR3cml0ZSIsCiAgICAgICAgICAgICJwcm9maWxlcyAkd3JpdGUiLCAiZGVwZW5kZW5jaWVzICR3cml0ZSIsICJ2b3RlcyAkd3JpdGUiLAogICAgICAgICAgICAicHJvZHVjdHMgUkVBRCIsICJjb21wb25lbnRzIFJFQUQiLAogICAgICAgICAgICAia2V5d29yZHMgJHdyaXRlIiwgImxvbmdkZXNjcyAkd3JpdGUiLCAiZmllbGRkZWZzICR3cml0ZSIsCiAgICAgICAgICAgICJidWdfZ3JvdXBfbWFwICR3cml0ZSIsICJmbGFncyAkd3JpdGUiLCAiZHVwbGljYXRlcyAkd3JpdGUiLAogICAgICAgICAgICAjIHVzZXJfZ3JvdXBfbWFwIHdvdWxkIGJlIGEgUkVBRCBsb2NrIGV4Y2VwdCB0aGF0IEZsYWc6OnByb2Nlc3MKICAgICAgICAgICAgIyBtYXkgY2FsbCBGbGFnOjpub3RpZnksIHdoaWNoIGNyZWF0ZXMgYSBuZXcgdXNlciBvYmplY3QsCiAgICAgICAgICAgICMgd2hpY2ggbWlnaHQgY2FsbCBkZXJpdmVfZ3JvdXBzLCB3aGljaCB3YW50cyBhIFdSSVRFIGxvY2sgb24gdGhhdAogICAgICAgICAgICAjIHRhYmxlLiBncm91cF9ncm91cF9tYXAgaXMgaW4gaGVyZSBhdCBhbGwgYmVjYXVzZSBkZXJpdmVfZ3JvdXBzCiAgICAgICAgICAgICMgbmVlZHMgaXQuCiAgICAgICAgICAgICJ1c2VyX2dyb3VwX21hcCAkd3JpdGUiLCAiZ3JvdXBfZ3JvdXBfbWFwIFJFQUQiLCAiZmxhZ3R5cGVzIFJFQUQiLAogICAgICAgICAgICAiZmxhZ2luY2x1c2lvbnMgQVMgaSBSRUFEIiwgImZsYWdleGNsdXNpb25zIEFTIGUgUkVBRCIsCiAgICAgICAgICAgICJrZXl3b3JkZGVmcyBSRUFEIiwgImdyb3VwcyBSRUFEIiwgImF0dGFjaG1lbnRzIFJFQUQiLAogICAgICAgICAgICAiZ3JvdXBfY29udHJvbF9tYXAgQVMgb2xkY29udHJvbG1hcCBSRUFEIiwKICAgICAgICAgICAgImdyb3VwX2NvbnRyb2xfbWFwIEFTIG5ld2NvbnRyb2xtYXAgUkVBRCIsCiAgICAgICAgICAgICJncm91cF9jb250cm9sX21hcCBSRUFEIiwgImVtYWlsX3NldHRpbmcgUkVBRCIpOwoKICAgICMgSXQgbWF5IHNvdW5kIGNyYXp5IHRvIHNldCAlZm9ybWhhc2ggZm9yIGVhY2ggYnVnIGFzICRjZ2ktPnBhcmFtKCkKICAgICMgd2lsbCBub3QgY2hhbmdlLCBidXQgJWZvcm1oYXNoIGlzIG1vZGlmaWVkIGJlbG93IGFuZCB3ZSBwcmVmZXIKICAgICMgdG8gc2V0IGl0IGFnYWluLgogICAgbXkgJGkgPSAwOwogICAgbXkgQG9sZHZhbHVlcyA9IFNuYXBTaG90QnVnKCRpZCk7CiAgICBteSAlb2xkaGFzaDsKICAgIG15ICVmb3JtaGFzaDsKICAgIGZvcmVhY2ggbXkgJGNvbCAoQDo6bG9nX2NvbHVtbnMpIHsKICAgICAgICAjIENvbnNpZGVyIE5VTEwgZGIgZW50cmllcyB0byBiZSBlcXVpdmFsZW50IHRvIHRoZSBlbXB0eSBzdHJpbmcKICAgICAgICAkb2xkdmFsdWVzWyRpXSA9IGRlZmluZWQoJG9sZHZhbHVlc1skaV0pID8gJG9sZHZhbHVlc1skaV0gOiAnJzsKICAgICAgICAjIENvbnZlcnQgdGhlIGRlYWRsaW5lIHRha2VuIGZyb20gdGhlIERCIGludG8gdGhlIFlZWVktTU0tREQgZm9ybWF0CiAgICAgICAgIyBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgZGVhZGxpbmUgcHJvdmlkZWQgYnkgdGhlIHVzZXIsIGlmIGFueS4KICAgICAgICAjIEVsc2UgQ2hlY2tDYW5DaGFuZ2VGaWVsZCgpIHdvdWxkIHNlZSB0aGVtIGFzIGRpZmZlcmVudCBpbiBhbGwgY2FzZXMuCiAgICAgICAgaWYgKCRjb2wgZXEgJ2RlYWRsaW5lJykgewogICAgICAgICAgICAkb2xkdmFsdWVzWyRpXSA9IGZvcm1hdF90aW1lKCRvbGR2YWx1ZXNbJGldLCAiJVktJW0tJWQiKTsKICAgICAgICB9CiAgICAgICAgJG9sZGhhc2h7JGNvbH0gPSAkb2xkdmFsdWVzWyRpXTsKICAgICAgICAkZm9ybWhhc2h7JGNvbH0gPSAkY2dpLT5wYXJhbSgkY29sKSBpZiBkZWZpbmVkICRjZ2ktPnBhcmFtKCRjb2wpOwogICAgICAgICRpKys7CiAgICB9CiAgICAjIElmIHRoZSB1c2VyIGlzIHJlYXNzaWduaW5nIGJ1Z3MsIHdlIG5lZWQgdG86CiAgICAjIC0gY29udmVydCAkbmV3aGFzaHsnYXNzaWduZWRfdG8nfSBhbmQgJG5ld2hhc2h7J3FhX2NvbnRhY3QnfQogICAgIyAgIGVtYWlsIGFkZHJlc3NlcyBpbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgSURzOwogICAgIyAtIHVwZGF0ZSAkbmV3aGFzaHsnYnVnX3N0YXR1cyd9IHRvIGl0cyByZWFsIHN0YXRlIGlmIHRoZSBidWcKICAgICMgICBpcyBpbiB0aGUgdW5jb25maXJtZWQgc3RhdGUuCiAgICAkZm9ybWhhc2h7J3FhX2NvbnRhY3QnfSA9ICRxYWNvbnRhY3QgaWYgUGFyYW0oJ3VzZXFhY29udGFjdCcpOwogICAgaWYgKCRjZ2ktPnBhcmFtKCdrbm9iJykgZXEgJ3JlYXNzaWduYnljb21wb25lbnQnCiAgICAgICAgfHwgJGNnaS0+cGFyYW0oJ2tub2InKSBlcSAncmVhc3NpZ24nKSB7CiAgICAgICAgJGZvcm1oYXNoeydhc3NpZ25lZF90byd9ID0gJGFzc2lnbmVlOwogICAgICAgIGlmICgkb2xkaGFzaHsnYnVnX3N0YXR1cyd9IGVxICdVTkNPTkZJUk1FRCcpIHsKICAgICAgICAgICAgJGZvcm1oYXNoeydidWdfc3RhdHVzJ30gPSAkb2xkaGFzaHsnYnVnX3N0YXR1cyd9OwogICAgICAgIH0KICAgIH0KICAgIGZvcmVhY2ggbXkgJGNvbCAoQDo6bG9nX2NvbHVtbnMpIHsKICAgICAgICBpZiAoZXhpc3RzICRmb3JtaGFzaHskY29sfQogICAgICAgICAgICAmJiAhQ2hlY2tDYW5DaGFuZ2VGaWVsZCgkY29sLCAkaWQsICRvbGRoYXNoeyRjb2x9LCAkZm9ybWhhc2h7JGNvbH0pKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJHZhcnM7CiAgICAgICAgICAgIGlmICgkY29sIGVxICdjb21wb25lbnRfaWQnKSB7CiAgICAgICAgICAgICAgICAjIERpc3BsYXkgdGhlIGNvbXBvbmVudCBuYW1lCiAgICAgICAgICAgICAgICAkdmFycy0+eydvbGR2YWx1ZSd9ID0gZ2V0X2NvbXBvbmVudF9uYW1lKCRvbGRoYXNoeyRjb2x9KTsKICAgICAgICAgICAgICAgICR2YXJzLT57J25ld3ZhbHVlJ30gPSAkY2dpLT5wYXJhbSgnY29tcG9uZW50Jyk7CiAgICAgICAgICAgICAgICAkdmFycy0+eydmaWVsZCd9ID0gJ2NvbXBvbmVudCc7CiAgICAgICAgICAgIH0gZWxzaWYgKCRjb2wgZXEgJ2Fzc2lnbmVkX3RvJyB8fCAkY29sIGVxICdxYV9jb250YWN0JykgewogICAgICAgICAgICAgICAgIyBEaXNwbGF5IHRoZSBhc3NpZ25lZSBvciBRQSBjb250YWN0IGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgICAgICR2YXJzLT57J29sZHZhbHVlJ30gPSBEQklEX3RvX25hbWUoJG9sZGhhc2h7JGNvbH0pOwogICAgICAgICAgICAgICAgJHZhcnMtPnsnbmV3dmFsdWUnfSA9IERCSURfdG9fbmFtZSgkZm9ybWhhc2h7JGNvbH0pOwogICAgICAgICAgICAgICAgJHZhcnMtPnsnZmllbGQnfSA9ICRjb2w7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdmFycy0+eydvbGR2YWx1ZSd9ID0gJG9sZGhhc2h7JGNvbH07CiAgICAgICAgICAgICAgICAkdmFycy0+eyduZXd2YWx1ZSd9ID0gJGZvcm1oYXNoeyRjb2x9OwogICAgICAgICAgICAgICAgJHZhcnMtPnsnZmllbGQnfSA9ICRjb2w7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHZhcnMtPnsncHJpdnMnfSA9ICRQcml2aWxlZ2VzUmVxdWlyZWQ7CiAgICAgICAgICAgIFRocm93VXNlckVycm9yKCJpbGxlZ2FsX2NoYW5nZSIsICR2YXJzKTsKICAgICAgICB9CiAgICB9CgogICAgIyBXaGVuIGVkaXRpbmcgbXVsdGlwbGUgYnVncywgdXNlcnMgY2FuIHNwZWNpZnkgYSBsaXN0IG9mIGtleXdvcmRzIHRvIGRlbGV0ZQogICAgIyBmcm9tIGJ1Z3MuICBJZiB0aGUgbGlzdCBtYXRjaGVzIHRoZSBjdXJyZW50IHNldCBvZiBrZXl3b3JkcyBvbiB0aG9zZSBidWdzLAogICAgIyBDaGVja0NhbkNoYW5nZUZpZWxkIGFib3ZlIHdpbGwgZmFpbCB0byBjaGVjayBwZXJtaXNzaW9ucyBiZWNhdXNlIGl0IHRoaW5rcwogICAgIyB0aGUgbGlzdCBoYXNuJ3QgY2hhbmdlZC4gIFRvIGZpeCB0aGF0LCB3ZSBoYXZlIHRvIGNhbGwgQ2hlY2tDYW5DaGFuZ2VGaWVsZAogICAgIyBhZ2FpbiB3aXRoIG9sZCE9bmV3IGlmIHRoZSBrZXl3b3JkIGFjdGlvbiBpcyAiZGVsZXRlIiBhbmQgb2xkPW5ldy4KICAgIGlmICgka2V5d29yZGFjdGlvbiBlcSAiZGVsZXRlIgogICAgICAgICYmIGRlZmluZWQgJGNnaS0+cGFyYW0oJ2tleXdvcmRzJykKICAgICAgICAmJiBsZW5ndGgoQGtleXdvcmRsaXN0KSA+IDAKICAgICAgICAmJiAkY2dpLT5wYXJhbSgna2V5d29yZHMnKSBlcSAkb2xkaGFzaHtrZXl3b3Jkc30KICAgICAgICAmJiAhQ2hlY2tDYW5DaGFuZ2VGaWVsZCgia2V5d29yZHMiLCAkaWQsICJvbGQgaXMgbm90IiwgImVxdWFsIHRvIG5ldyIpKQogICAgewogICAgICAgICR2YXJzLT57J29sZHZhbHVlJ30gPSAkb2xkaGFzaHtrZXl3b3Jkc307CiAgICAgICAgJHZhcnMtPnsnbmV3dmFsdWUnfSA9ICJubyBrZXl3b3JkcyI7CiAgICAgICAgJHZhcnMtPnsnZmllbGQnfSA9ICJrZXl3b3JkcyI7CiAgICAgICAgJHZhcnMtPnsncHJpdnMnfSA9ICRQcml2aWxlZ2VzUmVxdWlyZWQ7CiAgICAgICAgVGhyb3dVc2VyRXJyb3IoImlsbGVnYWxfY2hhbmdlIiwgJHZhcnMpOwogICAgfQoKICAgICRvbGRoYXNoeydwcm9kdWN0J30gPSBnZXRfcHJvZHVjdF9uYW1lKCRvbGRoYXNoeydwcm9kdWN0X2lkJ30pOwogICAgaWYgKCFDYW5FZGl0UHJvZHVjdElkKCRvbGRoYXNoeydwcm9kdWN0X2lkJ30pKSB7CiAgICAgICAgVGhyb3dVc2VyRXJyb3IoInByb2R1Y3RfZWRpdF9kZW5pZWQiLAogICAgICAgICAgICAgICAgICAgICAgeyBwcm9kdWN0ID0+ICRvbGRoYXNoeydwcm9kdWN0J30gfSk7CiAgICB9CgogICAgaWYgKCRyZXF1aXJlbWlsZXN0b25lKSB7CiAgICAgICAgIyBtdXN0aGF2ZW1pbGVzdG9uZW9uYWNjZXB0IGFwcGxpZXMgb25seSBpZiBhdCBsZWFzdCB0d28KICAgICAgICAjIHRhcmdldCBtaWxlc3RvbmVzIGFyZSBkZWZpbmVkIGZvciB0aGUgY3VycmVudCBwcm9kdWN0LgogICAgICAgIG15ICRuYl9taWxlc3RvbmVzID0gc2NhbGFyKEB7JDo6dGFyZ2V0X21pbGVzdG9uZXskb2xkaGFzaHsncHJvZHVjdCd9fX0pOwogICAgICAgIGlmICgkbmJfbWlsZXN0b25lcyA+IDEpIHsKICAgICAgICAgICAgbXkgJHZhbHVlID0gJGNnaS0+cGFyYW0oJ3RhcmdldF9taWxlc3RvbmUnKTsKICAgICAgICAgICAgaWYgKCFkZWZpbmVkICR2YWx1ZSB8fCAkdmFsdWUgZXEgJGNnaS0+cGFyYW0oJ2RvbnRjaGFuZ2UnKSkgewogICAgICAgICAgICAgICAgJHZhbHVlID0gJG9sZGhhc2h7J3RhcmdldF9taWxlc3RvbmUnfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkZGVmYXVsdG1pbGVzdG9uZSA9CiAgICAgICAgICAgICAgICAkZGJoLT5zZWxlY3Ryb3dfYXJyYXkoIlNFTEVDVCBkZWZhdWx0bWlsZXN0b25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gcHJvZHVjdHMgV0hFUkUgaWQgPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsICRvbGRoYXNoeydwcm9kdWN0X2lkJ30pOwogICAgICAgICAgICAjIGlmIG11c3RoYXZlbWlsZXN0b25lb25hY2NlcHQgPT0gMSwgdGhlbiB0aGUgdGFyZ2V0CiAgICAgICAgICAgICMgbWlsZXN0b25lIG11c3QgYmUgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgb25lLgogICAgICAgICAgICBpZiAoJHZhbHVlIGVxICRkZWZhdWx0bWlsZXN0b25lKSB7CiAgICAgICAgICAgICAgICBUaHJvd1VzZXJFcnJvcigibWlsZXN0b25lX3JlcXVpcmVkIiwgeyBidWdfaWQgPT4gJGlkIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSAgIAogICAgaWYgKGRlZmluZWQgJGNnaS0+cGFyYW0oJ2RlbHRhX3RzJykgJiYgJGNnaS0+cGFyYW0oJ2RlbHRhX3RzJykgbmUgJGRlbHRhX3RzKQogICAgewogICAgICAgICgkdmFycy0+eydvcGVyYXRpb25zJ30pID0gR2V0QnVnQWN0aXZpdHkoJGNnaS0+cGFyYW0oJ2lkJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2dpLT5wYXJhbSgnZGVsdGFfdHMnKSk7CgogICAgICAgICR2YXJzLT57J3N0YXJ0X2F0J30gPSAkY2dpLT5wYXJhbSgnbG9uZ2Rlc2NsZW5ndGgnKTsKCiAgICAgICAgIyBBbHdheXMgc29ydCBtaWRhaXIgY29sbGlzaW9uIGNvbW1lbnRzIG9sZGVzdCB0byBuZXdlc3QsCiAgICAgICAgIyByZWdhcmRsZXNzIG9mIHRoZSB1c2VyJ3MgcGVyc29uYWwgcHJlZmVyZW5jZS4KICAgICAgICAkdmFycy0+eydjb21tZW50cyd9ID0gQnVnemlsbGE6OkJ1Zzo6R2V0Q29tbWVudHMoJGlkLCAib2xkZXN0X3RvX25ld2VzdCIpOwoKICAgICAgICAkY2dpLT5wYXJhbSgnZGVsdGFfdHMnLCAkZGVsdGFfdHMpOwogICAgICAgIAogICAgICAgICR2YXJzLT57J2J1Z19pZCd9ID0gJGlkOwogICAgICAgIAogICAgICAgICRkYmgtPmJ6X3VubG9ja190YWJsZXMoVU5MT0NLX0FCT1JUKTsKICAgICAgICAKICAgICAgICAjIFdhcm4gdGhlIHVzZXIgYWJvdXQgdGhlIG1pZC1haXIgY29sbGlzaW9uIGFuZCBhc2sgdGhlbSB3aGF0IHRvIGRvLgogICAgICAgICR0ZW1wbGF0ZS0+cHJvY2VzcygiYnVnL3Byb2Nlc3MvbWlkYWlyLmh0bWwudG1wbCIsICR2YXJzKQogICAgICAgICAgfHwgVGhyb3dUZW1wbGF0ZUVycm9yKCR0ZW1wbGF0ZS0+ZXJyb3IoKSk7CiAgICAgICAgZXhpdDsKICAgIH0KCiAgICAjIEdhdGhlciB0aGUgZGVwZW5kZW5jeSBsaXN0LCBhbmQgbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBjaXJjdWxhciByZWZzCiAgICBteSAlZGVwcyA9IEJ1Z3ppbGxhOjpCdWc6OlZhbGlkYXRlRGVwZW5kZW5jaWVzKCRjZ2ktPnBhcmFtKCdkZXBlbmRzb24nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNnaS0+cGFyYW0oJ2Jsb2NrZWQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlkKTsKCiAgICAjCiAgICAjIFN0YXJ0IHVwZGF0aW5nIHRoZSByZWxldmFudCBkYXRhYmFzZSBlbnRyaWVzCiAgICAjCgogICAgU2VuZFNRTCgic2VsZWN0IG5vdygpIik7CiAgICAkdGltZXN0YW1wID0gRmV0Y2hPbmVDb2x1bW4oKTsKICAgIG15ICRzcWxfdGltZXN0YW1wID0gU3FsUXVvdGUoJHRpbWVzdGFtcCk7CgogICAgbXkgJHdvcmtfdGltZTsKICAgIGlmIChVc2VySW5Hcm91cChQYXJhbSgndGltZXRyYWNraW5nZ3JvdXAnKSkpIHsKICAgICAgICAkd29ya190aW1lID0gJGNnaS0+cGFyYW0oJ3dvcmtfdGltZScpOwogICAgICAgIGlmICgkd29ya190aW1lKSB7CiAgICAgICAgICAgICMgQXBwZW5kQ29tbWVudCAoY2FsbGVkIGJlbG93KSBjYW4gaW4gdGhlb3J5IHJhaXNlIGFuIGVycm9yLAogICAgICAgICAgICAjIGJ1dCBiZWNhdXNlIHdlJ3ZlIGFscmVhZHkgdmFsaWRhdGVkIHdvcmtfdGltZSBoZXJlIGl0J3MKICAgICAgICAgICAgIyBzYWZlIHRvIGxvZyB0aGUgZW50cnkgYmVmb3JlIGFkZGluZyB0aGUgY29tbWVudC4KICAgICAgICAgICAgTG9nQWN0aXZpdHlFbnRyeSgkaWQsICJ3b3JrX3RpbWUiLCAiIiwgJHdvcmtfdGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd2hvaWQsICR0aW1lc3RhbXApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJGNnaS0+cGFyYW0oJ2NvbW1lbnQnKSB8fCAkd29ya190aW1lKSB7CiAgICAgICAgQXBwZW5kQ29tbWVudCgkaWQsICR3aG9pZCwgJGNnaS0+cGFyYW0oJ2NvbW1lbnQnKSwKICAgICAgICAgICAgICAgICAgICAgICRjZ2ktPnBhcmFtKCdjb21tZW50cHJpdmFjeScpLCAkdGltZXN0YW1wLCAkd29ya190aW1lKTsKICAgICAgICAkYnVnX2NoYW5nZWQgPSAxOwogICAgfQoKICAgIGlmIChAOjpsZWdhbF9rZXl3b3JkcyAmJiBkZWZpbmVkICRjZ2ktPnBhcmFtKCdrZXl3b3JkcycpKSB7CiAgICAgICAgIyBUaGVyZSBhcmUgdGhyZWUga2luZHMgb2YgImtleXdvcmRzYWN0aW9uIjogbWFrZWV4YWN0LCBhZGQsIGRlbGV0ZS4KICAgICAgICAjIEZvciBtYWtlZXhhY3QsIHdlIGRlbGV0ZSBldmVyeXRoaW5nLCBhbmQgdGhlbiBhZGQgb3VyIHRoaW5ncy4KICAgICAgICAjIEZvciBhZGQsIHdlIGRlbGV0ZSB0aGluZ3Mgd2UncmUgYWRkaW5nICh0byBtYWtlIHN1cmUgd2UgZG9uJ3QKICAgICAgICAjIGVuZCB1cCBoYXZpbmcgdGhlbSB0d2ljZSksIGFuZCB0aGVuIHdlIGFkZCB0aGVtLgogICAgICAgICMgRm9yIGRlbGV0ZSwgd2UganVzdCBkZWxldGUgdGhpbmdzIG9uIHRoZSBsaXN0LgogICAgICAgIG15ICRjaGFuZ2VkID0gMDsKICAgICAgICBpZiAoJGtleXdvcmRhY3Rpb24gZXEgIm1ha2VleGFjdCIpIHsKICAgICAgICAgICAgU2VuZFNRTCgiREVMRVRFIEZST00ga2V5d29yZHMgV0hFUkUgYnVnX2lkID0gJGlkIik7CiAgICAgICAgICAgICRjaGFuZ2VkID0gMTsKICAgICAgICB9CiAgICAgICAgZm9yZWFjaCBteSAka2V5d29yZCAoQGtleXdvcmRsaXN0KSB7CiAgICAgICAgICAgIGlmICgka2V5d29yZGFjdGlvbiBuZSAibWFrZWV4YWN0IikgewogICAgICAgICAgICAgICAgU2VuZFNRTCgiREVMRVRFIEZST00ga2V5d29yZHMKICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIGJ1Z19pZCA9ICRpZCBBTkQga2V5d29yZGlkID0gJGtleXdvcmQiKTsKICAgICAgICAgICAgICAgICRjaGFuZ2VkID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJGtleXdvcmRhY3Rpb24gbmUgImRlbGV0ZSIpIHsKICAgICAgICAgICAgICAgIFNlbmRTUUwoIklOU0VSVCBJTlRPIGtleXdvcmRzIAogICAgICAgICAgICAgICAgICAgICAgICAgKGJ1Z19pZCwga2V5d29yZGlkKSBWQUxVRVMgKCRpZCwgJGtleXdvcmQpIik7CiAgICAgICAgICAgICAgICAkY2hhbmdlZCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRjaGFuZ2VkKSB7CiAgICAgICAgICAgIFNlbmRTUUwoIlNFTEVDVCBrZXl3b3JkZGVmcy5uYW1lIAogICAgICAgICAgICAgICAgICAgICBGUk9NIGtleXdvcmRkZWZzIElOTkVSIEpPSU4ga2V5d29yZHMKICAgICAgICAgICAgICAgICAgICAgICBPTiBrZXl3b3JkZGVmcy5pZCA9IGtleXdvcmRzLmtleXdvcmRpZAogICAgICAgICAgICAgICAgICAgICBXSEVSRSBrZXl3b3Jkcy5idWdfaWQgPSAkaWQKICAgICAgICAgICAgICAgICAgICAgT1JERVIgQlkga2V5d29yZGRlZnMubmFtZSIpOwogICAgICAgICAgICBteSBAbGlzdDsKICAgICAgICAgICAgd2hpbGUgKE1vcmVTUUxEYXRhKCkpIHsKICAgICAgICAgICAgICAgIHB1c2goQGxpc3QsIEZldGNoT25lQ29sdW1uKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRkYmgtPmRvKCJVUERBVEUgYnVncyBTRVQga2V5d29yZHMgPSA/IFdIRVJFIGJ1Z19pZCA9ID8iLAogICAgICAgICAgICAgICAgICAgICB1bmRlZiwgam9pbignLCAnLCBAbGlzdCksICRpZCk7CiAgICAgICAgfQogICAgfQogICAgbXkgJHF1ZXJ5ID0gIiRiYXNlcXVlcnlcbndoZXJlIGJ1Z19pZCA9ICRpZCI7CiAgICAKICAgIGlmICgkOjpjb21tYSBuZSAiIikgewogICAgICAgIFNlbmRTUUwoJHF1ZXJ5KTsKICAgIH0KCiAgICAjIENoZWNrIGZvciBkdXBsaWNhdGVzIGlmIHRoZSBidWcgaXMgW3JlXW9wZW4KICAgIFNlbmRTUUwoIlNFTEVDVCByZXNvbHV0aW9uIEZST00gYnVncyBXSEVSRSBidWdfaWQgPSAkaWQiKTsKICAgIG15ICRyZXNvbHV0aW9uID0gRmV0Y2hPbmVDb2x1bW4oKTsKICAgIGlmICgkcmVzb2x1dGlvbiBlcSAnJykgewogICAgICAgIFNlbmRTUUwoIkRFTEVURSBGUk9NIGR1cGxpY2F0ZXMgV0hFUkUgZHVwZSA9ICRpZCIpOwogICAgfQogICAgCiAgICBteSAkbmV3cHJvZHVjdF9pZCA9ICRvbGRoYXNoeydwcm9kdWN0X2lkJ307CiAgICBpZiAoJGNnaS0+cGFyYW0oJ3Byb2R1Y3QnKSBuZSAkY2dpLT5wYXJhbSgnZG9udGNoYW5nZScpKSB7CiAgICAgICAgbXkgJG5ld3Byb2R1Y3RfaWQgPSBnZXRfcHJvZHVjdF9pZCgkY2dpLT5wYXJhbSgncHJvZHVjdCcpKTsKICAgIH0KCiAgICBteSAlZ3JvdXBzcmVxdWlyZWQgPSAoKTsKICAgIG15ICVncm91cHNmb3JiaWRkZW4gPSAoKTsKICAgIFNlbmRTUUwoIlNFTEVDVCBpZCwgbWVtYmVyY29udHJvbCAKICAgICAgICAgICAgIEZST00gZ3JvdXBzIExFRlQgSk9JTiBncm91cF9jb250cm9sX21hcAogICAgICAgICAgICAgT04gaWQgPSBncm91cF9pZAogICAgICAgICAgICAgQU5EIHByb2R1Y3RfaWQgPSAkbmV3cHJvZHVjdF9pZCBXSEVSRSBpc2FjdGl2ZSAhPSAwIik7CiAgICB3aGlsZSAoTW9yZVNRTERhdGEoKSkgewogICAgICAgIG15ICgkZ3JvdXAsICRjb250cm9sKSA9IEZldGNoU1FMRGF0YSgpOwogICAgICAgICRjb250cm9sIHx8PSAwOwogICAgICAgIHVubGVzcyAoJGNvbnRyb2wgPiAmOjpDT05UUk9MTUFQTkEpICB7CiAgICAgICAgICAgICRncm91cHNmb3JiaWRkZW57JGdyb3VwfSA9IDE7CiAgICAgICAgfQogICAgICAgIGlmICgkY29udHJvbCA9PSAmOjpDT05UUk9MTUFQTUFOREFUT1JZKSB7CiAgICAgICAgICAgICRncm91cHNyZXF1aXJlZHskZ3JvdXB9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgbXkgQGdyb3VwQWRkTmFtZXMgPSAoKTsKICAgIG15IEBncm91cEFkZE5hbWVzQWxsID0gKCk7CiAgICBmb3JlYWNoIG15ICRncm91cHRvYWRkIChAZ3JvdXBBZGQsIGtleXMgJWdyb3Vwc3JlcXVpcmVkKSB7CiAgICAgICAgbmV4dCBpZiAkZ3JvdXBzZm9yYmlkZGVueyRncm91cHRvYWRkfTsKICAgICAgICBwdXNoKEBncm91cEFkZE5hbWVzQWxsLCBHcm91cElkVG9OYW1lKCRncm91cHRvYWRkKSk7CiAgICAgICAgaWYgKCFCdWdJbkdyb3VwSWQoJGlkLCAkZ3JvdXB0b2FkZCkpIHsKICAgICAgICAgICAgcHVzaChAZ3JvdXBBZGROYW1lcywgR3JvdXBJZFRvTmFtZSgkZ3JvdXB0b2FkZCkpOwogICAgICAgICAgICBTZW5kU1FMKCJJTlNFUlQgSU5UTyBidWdfZ3JvdXBfbWFwIChidWdfaWQsIGdyb3VwX2lkKSAKICAgICAgICAgICAgICAgICAgICAgVkFMVUVTICgkaWQsICRncm91cHRvYWRkKSIpOwogICAgICAgIH0KICAgIH0KICAgIG15IEBncm91cERlbE5hbWVzID0gKCk7CiAgICBteSBAZ3JvdXBEZWxOYW1lc0FsbCA9ICgpOwogICAgZm9yZWFjaCBteSAkZ3JvdXB0b2RlbCAoQGdyb3VwRGVsLCBrZXlzICVncm91cHNmb3JiaWRkZW4pIHsKICAgICAgICBwdXNoKEBncm91cERlbE5hbWVzQWxsLCBHcm91cElkVG9OYW1lKCRncm91cHRvZGVsKSk7CiAgICAgICAgbmV4dCBpZiAkZ3JvdXBzcmVxdWlyZWR7JGdyb3VwdG9kZWx9OwogICAgICAgIGlmIChCdWdJbkdyb3VwSWQoJGlkLCAkZ3JvdXB0b2RlbCkpIHsKICAgICAgICAgICAgcHVzaChAZ3JvdXBEZWxOYW1lcywgR3JvdXBJZFRvTmFtZSgkZ3JvdXB0b2RlbCkpOwogICAgICAgIH0KICAgICAgICBTZW5kU1FMKCJERUxFVEUgRlJPTSBidWdfZ3JvdXBfbWFwIAogICAgICAgICAgICAgICAgIFdIRVJFIGJ1Z19pZCA9ICRpZCBBTkQgZ3JvdXBfaWQgPSAkZ3JvdXB0b2RlbCIpOwogICAgfQoKICAgIG15ICRncm91cERlbE5hbWVzID0gam9pbignLCcsIEBncm91cERlbE5hbWVzKTsKICAgIG15ICRncm91cEFkZE5hbWVzID0gam9pbignLCcsIEBncm91cEFkZE5hbWVzKTsKCiAgICBpZiAoJGdyb3VwRGVsTmFtZXMgbmUgJGdyb3VwQWRkTmFtZXMpIHsKICAgICAgICBMb2dBY3Rpdml0eUVudHJ5KCRpZCwgImJ1Z19ncm91cCIsICRncm91cERlbE5hbWVzLCAkZ3JvdXBBZGROYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICR3aG9pZCwgJHRpbWVzdGFtcCk7IAogICAgICAgICRidWdfY2hhbmdlZCA9IDE7CiAgICB9CgogICAgbXkgQGNjUmVtb3ZlZCA9ICgpOyAKICAgIGlmIChkZWZpbmVkICRjZ2ktPnBhcmFtKCduZXdjYycpCiAgICAgICAgfHwgZGVmaW5lZCAkY2dpLT5wYXJhbSgnYWRkc2VsZmNjJykKICAgICAgICB8fCBkZWZpbmVkICRjZ2ktPnBhcmFtKCdyZW1vdmVjYycpCiAgICAgICAgfHwgZGVmaW5lZCAkY2dpLT5wYXJhbSgnbWFzc2NjJykpIHsKICAgICAgICAjIEdldCB0aGUgY3VycmVudCBDQyBsaXN0IGZvciB0aGlzIGJ1ZwogICAgICAgIG15ICVvbmNjOwogICAgICAgIFNlbmRTUUwoIlNFTEVDVCB3aG8gRlJPTSBjYyBXSEVSRSBidWdfaWQgPSAkaWQiKTsKICAgICAgICB3aGlsZSAoTW9yZVNRTERhdGEoKSkgewogICAgICAgICAgICAkb25jY3tGZXRjaE9uZUNvbHVtbigpfSA9IDE7CiAgICAgICAgfQoKICAgICAgICBteSAoQGFkZGVkLCBAcmVtb3ZlZCkgPSAoKTsKICAgICAgICBmb3JlYWNoIG15ICRwaWQgKGtleXMgJWNjX2FkZCkgewogICAgICAgICAgICAjIElmIHRoaXMgcGVyc29uIGlzbid0IGFscmVhZHkgb24gdGhlIGNjIGxpc3QsIGFkZCB0aGVtCiAgICAgICAgICAgIGlmICghICRvbmNjeyRwaWR9KSB7CiAgICAgICAgICAgICAgICBTZW5kU1FMKCJJTlNFUlQgSU5UTyBjYyAoYnVnX2lkLCB3aG8pIFZBTFVFUyAoJGlkLCAkcGlkKSIpOwogICAgICAgICAgICAgICAgcHVzaCAoQGFkZGVkLCAkY2NfYWRkeyRwaWR9KTsKICAgICAgICAgICAgICAgICRvbmNjeyRwaWR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3JlYWNoIG15ICRwaWQgKGtleXMgJWNjX3JlbW92ZSkgewogICAgICAgICAgICAjIElmIHRoZSBwZXJzb24gaXMgb24gdGhlIGNjIGxpc3QsIHJlbW92ZSB0aGVtCiAgICAgICAgICAgIGlmICgkb25jY3skcGlkfSkgewogICAgICAgICAgICAgICAgU2VuZFNRTCgiREVMRVRFIEZST00gY2MgV0hFUkUgYnVnX2lkID0gJGlkIEFORCB3aG8gPSAkcGlkIik7CiAgICAgICAgICAgICAgICBwdXNoIChAcmVtb3ZlZCwgJGNjX3JlbW92ZXskcGlkfSk7CiAgICAgICAgICAgICAgICAkb25jY3skcGlkfSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgSWYgYW55IGNoYW5nZXMgd2VyZSBmb3VuZCwgcmVjb3JkIGl0IGluIHRoZSBhY3Rpdml0eSBsb2cKICAgICAgICBpZiAoc2NhbGFyKEByZW1vdmVkKSB8fCBzY2FsYXIoQGFkZGVkKSkgewogICAgICAgICAgICBteSAkcmVtb3ZlZCA9IGpvaW4oIiwgIiwgQHJlbW92ZWQpOwogICAgICAgICAgICBteSAkYWRkZWQgPSBqb2luKCIsICIsIEBhZGRlZCk7CiAgICAgICAgICAgIExvZ0FjdGl2aXR5RW50cnkoJGlkLCJjYyIsJHJlbW92ZWQsJGFkZGVkLCR3aG9pZCwkdGltZXN0YW1wKTsKICAgICAgICAgICAgJGJ1Z19jaGFuZ2VkID0gMTsKICAgICAgICB9CiAgICAgICAgQGNjUmVtb3ZlZCA9IEByZW1vdmVkOwogICAgfQoKICAgICMgV2UgbmVlZCB0byBzZW5kIG1haWwgZm9yIGRlcGVuZHNvbi9ibG9ja2VkIGJ1Z3MgaWYgdGhlIGRlcGVuZGVuY2llcwogICAgIyBjaGFuZ2Ugb3IgdGhlIHN0YXR1cyBvciByZXNvbHV0aW9uIGNoYW5nZS4gVGhpcyB2YXIga2VlcHMgdHJhY2sgb2YgdGhhdC4KICAgIG15ICRjaGVja19kZXBfYnVncyA9IDA7CgogICAgZm9yZWFjaCBteSAkcGFpciAoImJsb2NrZWQvZGVwZW5kc29uIiwgImRlcGVuZHNvbi9ibG9ja2VkIikgewogICAgICAgIG15ICgkbWUsICR0YXJnZXQpID0gc3BsaXQoIi8iLCAkcGFpcik7CgogICAgICAgIG15IEBvbGRsaXN0ID0gQHskZGJoLT5zZWxlY3Rjb2xfYXJyYXlyZWYoIlNFTEVDVCAkdGFyZ2V0IEZST00gZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgJG1lID0gPyBPUkRFUiBCWSAkdGFyZ2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwgJGlkKX07CiAgICAgICAgQGRlcGVuZGVuY3ljaGFuZ2Vke0BvbGRsaXN0fSA9IDE7CgogICAgICAgIGlmIChkZWZpbmVkICRjZ2ktPnBhcmFtKCR0YXJnZXQpKSB7CiAgICAgICAgICAgIG15ICVzbmFwc2hvdDsKICAgICAgICAgICAgbXkgQG5ld2xpc3QgPSBzb3J0IHskYSA8PT4gJGJ9IEB7JGRlcHN7JHRhcmdldH19OwogICAgICAgICAgICBAZGVwZW5kZW5jeWNoYW5nZWR7QG5ld2xpc3R9ID0gMTsKCiAgICAgICAgICAgIHdoaWxlICgwIDwgQG9sZGxpc3QgfHwgMCA8IEBuZXdsaXN0KSB7CiAgICAgICAgICAgICAgICBpZiAoQG9sZGxpc3QgPT0gMCB8fCAoQG5ld2xpc3QgPiAwICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9sZGxpc3RbMF0gPiAkbmV3bGlzdFswXSkpIHsKICAgICAgICAgICAgICAgICAgICAkc25hcHNob3R7JG5ld2xpc3RbMF19ID0gU25hcFNob3REZXBzKCRuZXdsaXN0WzBdLCAkbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICBzaGlmdCBAbmV3bGlzdDsKICAgICAgICAgICAgICAgIH0gZWxzaWYgKEBuZXdsaXN0ID09IDAgfHwgKEBvbGRsaXN0ID4gMCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5ld2xpc3RbMF0gPiAkb2xkbGlzdFswXSkpIHsKICAgICAgICAgICAgICAgICAgICAkc25hcHNob3R7JG9sZGxpc3RbMF19ID0gU25hcFNob3REZXBzKCRvbGRsaXN0WzBdLCAkbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICBzaGlmdCBAb2xkbGlzdDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRvbGRsaXN0WzBdICE9ICRuZXdsaXN0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRkYmgtPmJ6X3VubG9ja190YWJsZXMoVU5MT0NLX0FCT1JUKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGllICJFcnJvciBpbiBsaXN0IGNvbXBhcmluZyBjb2RlIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2hpZnQgQG9sZGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgc2hpZnQgQG5ld2xpc3Q7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgQGtleXMgPSBrZXlzKCVzbmFwc2hvdCk7CiAgICAgICAgICAgIGlmIChAa2V5cykgewogICAgICAgICAgICAgICAgbXkgJG9sZHNuYXAgPSBTbmFwU2hvdERlcHMoJGlkLCAkdGFyZ2V0LCAkbWUpOwogICAgICAgICAgICAgICAgU2VuZFNRTCgiZGVsZXRlIGZyb20gZGVwZW5kZW5jaWVzIHdoZXJlICRtZSA9ICRpZCIpOwogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkaSAoQHskZGVwc3skdGFyZ2V0fX0pIHsKICAgICAgICAgICAgICAgICAgICBTZW5kU1FMKCJpbnNlcnQgaW50byBkZXBlbmRlbmNpZXMgKCRtZSwgJHRhcmdldCkgdmFsdWVzICgkaWQsICRpKSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkayAoQGtleXMpIHsKICAgICAgICAgICAgICAgICAgICBMb2dEZXBlbmRlbmN5QWN0aXZpdHkoJGssICRzbmFwc2hvdHska30sICRtZSwgJHRhcmdldCwgJHRpbWVzdGFtcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBMb2dEZXBlbmRlbmN5QWN0aXZpdHkoJGlkLCAkb2xkc25hcCwgJHRhcmdldCwgJG1lLCAkdGltZXN0YW1wKTsKICAgICAgICAgICAgICAgICRjaGVja19kZXBfYnVncyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBXaGVuIGEgYnVnIGNoYW5nZXMgcHJvZHVjdHMgYW5kIHRoZSBvbGQgb3IgbmV3IHByb2R1Y3QgaXMgYXNzb2NpYXRlZAogICAgIyB3aXRoIGEgYnVnIGdyb3VwLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHJlbW92ZSB0aGUgYnVnIGZyb20gdGhlIG9sZAogICAgIyBncm91cCBvciBhZGQgaXQgdG8gdGhlIG5ldyBvbmUuICBUaGVyZSBhcmUgYSB2ZXJ5IHNwZWNpZmljIHNlcmllcyBvZgogICAgIyBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZXNlIGFjdGl2aXRpZXMgdGFrZSBwbGFjZSwgbW9yZSBpbmZvcm1hdGlvbgogICAgIyBhYm91dCB3aGljaCBjYW4gYmUgZm91bmQgaW4gY29tbWVudHMgd2l0aGluIHRoZSBjb25kaXRpb25hbHMgYmVsb3cuCiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBjaGFuZ2VkIHRoZSBwcm9kdWN0IHRvIHdoaWNoIHRoZSBidWcgYmVsb25nczsKICAgIGlmICgkY2dpLT5wYXJhbSgncHJvZHVjdCcpIG5lICRjZ2ktPnBhcmFtKCdkb250Y2hhbmdlJykKICAgICAgICAmJiAkY2dpLT5wYXJhbSgncHJvZHVjdCcpIG5lICRvbGRoYXNoeydwcm9kdWN0J30KICAgICkgewogICAgICAgICRuZXdwcm9kdWN0X2lkID0gZ2V0X3Byb2R1Y3RfaWQoJGNnaS0+cGFyYW0oJ3Byb2R1Y3QnKSk7CiAgICAgICAgIyBEZXBlbmRpbmcgb24gdGhlICJhZGR0b25ld2dyb3VwIiB2YXJpYWJsZSwgZ3JvdXBzIHdpdGgKICAgICAgICAjIGRlZmF1bHRzIHdpbGwgY2hhbmdlLgogICAgICAgICMKICAgICAgICAjIEZvciBlYWNoIGdyb3VwLCBkZXRlcm1pbmUKICAgICAgICAjIC0gVGhlIGdyb3VwIGlkIGFuZCBpZiBpdCBpcyBhY3RpdmUKICAgICAgICAjIC0gVGhlIGNvbnRyb2wgbWFwIHZhbHVlIGZvciB0aGUgb2xkIHByb2R1Y3QgYW5kIHRoaXMgZ3JvdXAKICAgICAgICAjIC0gVGhlIGNvbnRyb2wgbWFwIHZhbHVlIGZvciB0aGUgbmV3IHByb2R1Y3QgYW5kIHRoaXMgZ3JvdXAKICAgICAgICAjIC0gSXMgdGhlIHVzZXIgaW4gdGhpcyBncm91cD8KICAgICAgICAjIC0gSXMgdGhlIGJ1ZyBpbiB0aGlzIGdyb3VwPwogICAgICAgIFNlbmRTUUwoIlNFTEVDVCBESVNUSU5DVCBncm91cHMuaWQsIGlzYWN0aXZlLCAiIC4KICAgICAgICAgICAgICAgICJvbGRjb250cm9sbWFwLm1lbWJlcmNvbnRyb2wsIG5ld2NvbnRyb2xtYXAubWVtYmVyY29udHJvbCwgIiAuCiAgICAgICAgICAgICAgICAidXNlcl9ncm91cF9tYXAudXNlcl9pZCBJUyBOT1QgTlVMTCwgIiAuCiAgICAgICAgICAgICAgICAiYnVnX2dyb3VwX21hcC5ncm91cF9pZCBJUyBOT1QgTlVMTCAiIC4KICAgICAgICAgICAgICAgICJGUk9NIGdyb3VwcyAiIC4KICAgICAgICAgICAgICAgICJMRUZUIEpPSU4gZ3JvdXBfY29udHJvbF9tYXAgQVMgb2xkY29udHJvbG1hcCAiIC4KICAgICAgICAgICAgICAgICJPTiBvbGRjb250cm9sbWFwLmdyb3VwX2lkID0gZ3JvdXBzLmlkICIgLgogICAgICAgICAgICAgICAgIkFORCBvbGRjb250cm9sbWFwLnByb2R1Y3RfaWQgPSAiIC4gJG9sZGhhc2h7J3Byb2R1Y3RfaWQnfSAuCiAgICAgICAgICAgICAgICAiIExFRlQgSk9JTiBncm91cF9jb250cm9sX21hcCBBUyBuZXdjb250cm9sbWFwICIgLgogICAgICAgICAgICAgICAgIk9OIG5ld2NvbnRyb2xtYXAuZ3JvdXBfaWQgPSBncm91cHMuaWQgIiAuCiAgICAgICAgICAgICAgICAiQU5EIG5ld2NvbnRyb2xtYXAucHJvZHVjdF9pZCA9ICRuZXdwcm9kdWN0X2lkICIgLgogICAgICAgICAgICAgICAgIkxFRlQgSk9JTiB1c2VyX2dyb3VwX21hcCAiIC4KICAgICAgICAgICAgICAgICJPTiB1c2VyX2dyb3VwX21hcC5ncm91cF9pZCA9IGdyb3Vwcy5pZCAiIC4KICAgICAgICAgICAgICAgICJBTkQgdXNlcl9ncm91cF9tYXAudXNlcl9pZCA9ICR3aG9pZCAiIC4KICAgICAgICAgICAgICAgICJBTkQgdXNlcl9ncm91cF9tYXAuaXNibGVzcyA9IDAgIiAuCiAgICAgICAgICAgICAgICAiTEVGVCBKT0lOIGJ1Z19ncm91cF9tYXAgIiAuCiAgICAgICAgICAgICAgICAiT04gYnVnX2dyb3VwX21hcC5ncm91cF9pZCA9IGdyb3Vwcy5pZCAiIC4KICAgICAgICAgICAgICAgICJBTkQgYnVnX2dyb3VwX21hcC5idWdfaWQgPSAkaWQgIgogICAgICAgICAgICApOwogICAgICAgIG15IEBncm91cHN0b3JlbW92ZSA9ICgpOwogICAgICAgIG15IEBncm91cHN0b2FkZCA9ICgpOwogICAgICAgIG15IEBkZWZhdWx0c3RvcmVtb3ZlID0gKCk7CiAgICAgICAgbXkgQGRlZmF1bHRzdG9hZGQgPSAoKTsKICAgICAgICBteSBAYWxsZ3JvdXBzID0gKCk7CiAgICAgICAgbXkgJGJ1Z2luYW55ZGVmYXVsdCA9IDA7CiAgICAgICAgbXkgJGJ1Z2luYW55Y2hhbmdpbmdkZWZhdWx0ID0gMDsKICAgICAgICB3aGlsZSAoTW9yZVNRTERhdGEoKSkgewogICAgICAgICAgICBteSAoJGdyb3VwaWQsICRpc2FjdGl2ZSwgJG9sZGNvbnRyb2wsICRuZXdjb250cm9sLCAKICAgICAgICAgICAgJHVzZXJpbmdyb3VwLCAkYnVnaW5ncm91cCkgPSBGZXRjaFNRTERhdGEoKTsKICAgICAgICAgICAgIyBBbiB1bmRlZmluZWQgbmV3Y29udHJvbCBpcyBub25lLgogICAgICAgICAgICAkbmV3Y29udHJvbCA9IENPTlRST0xNQVBOQSB1bmxlc3MgJG5ld2NvbnRyb2w7CiAgICAgICAgICAgICRvbGRjb250cm9sID0gQ09OVFJPTE1BUE5BIHVubGVzcyAkb2xkY29udHJvbDsKICAgICAgICAgICAgcHVzaChAYWxsZ3JvdXBzLCAkZ3JvdXBpZCk7CiAgICAgICAgICAgIGlmICgoJGJ1Z2luZ3JvdXApICYmICgkaXNhY3RpdmUpCiAgICAgICAgICAgICAgICAmJiAoJG9sZGNvbnRyb2wgPT0gQ09OVFJPTE1BUERFRkFVTFQpKSB7CiAgICAgICAgICAgICAgICAjIEJ1ZyB3YXMgaW4gYSBkZWZhdWx0IGdyb3VwLgogICAgICAgICAgICAgICAgJGJ1Z2luYW55ZGVmYXVsdCA9IDE7CiAgICAgICAgICAgICAgICBpZiAoKCRuZXdjb250cm9sICE9IENPTlRST0xNQVBERUZBVUxUKQogICAgICAgICAgICAgICAgICAgICYmICgkbmV3Y29udHJvbCAhPSBDT05UUk9MTUFQTUFOREFUT1JZKSkgewogICAgICAgICAgICAgICAgICAgICMgQnVnIHdhcyBpbiBhIGRlZmF1bHQgZ3JvdXAgdGhhdCBubyBsb25nZXIgaXMuCiAgICAgICAgICAgICAgICAgICAgJGJ1Z2luYW55Y2hhbmdpbmdkZWZhdWx0ID0gMTsKICAgICAgICAgICAgICAgICAgICBwdXNoIChAZGVmYXVsdHN0b3JlbW92ZSwgJGdyb3VwaWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoJGlzYWN0aXZlKSAmJiAoISRidWdpbmdyb3VwKQogICAgICAgICAgICAgICAgJiYgKCRuZXdjb250cm9sID09IENPTlRST0xNQVBERUZBVUxUKQogICAgICAgICAgICAgICAgJiYgKCR1c2VyaW5ncm91cCkpIHsKICAgICAgICAgICAgICAgIHB1c2ggKEBkZWZhdWx0c3RvYWRkLCAkZ3JvdXBpZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCgkYnVnaW5ncm91cCkgJiYgKCRpc2FjdGl2ZSkgJiYgKCRuZXdjb250cm9sID09IENPTlRST0xNQVBOQSkpIHsKICAgICAgICAgICAgICAgICMgR3JvdXAgaXMgbm8gbG9uZ2VyIHBlcm1pdHRlZC4KICAgICAgICAgICAgICAgIHB1c2goQGdyb3Vwc3RvcmVtb3ZlLCAkZ3JvdXBpZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCghJGJ1Z2luZ3JvdXApICYmICgkaXNhY3RpdmUpIAogICAgICAgICAgICAgICAgJiYgKCRuZXdjb250cm9sID09IENPTlRST0xNQVBNQU5EQVRPUlkpKSB7CiAgICAgICAgICAgICAgICAjIEdyb3VwIGlzIG5vdyByZXF1aXJlZC4KICAgICAgICAgICAgICAgIHB1c2goQGdyb3Vwc3RvYWRkLCAkZ3JvdXBpZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgIyBJZiBhZGR0b25ld2dyb3VwcyA9ICJ5ZXMiLCBvbGQgZGVmYXVsdCBncm91cHMgd2lsbCBiZSByZW1vdmVkCiAgICAgICAgIyBhbmQgbmV3IGRlZmF1bHQgZ3JvdXBzIHdpbGwgYmUgYWRkZWQuCiAgICAgICAgIyBJZiBhZGR0b25ld2dyb3VwcyA9ICJ5ZXNpZmlub2xkIiwgb2xkIGRlZmF1bHQgZ3JvdXBzIHdpbGwgYmUgcmVtb3ZlZAogICAgICAgICMgYW5kIG5ldyBkZWZhdWx0IGdyb3VwcyB3aWxsIGJlIGFkZGVkIG9ubHkgaWYgdGhlIGJ1ZyB3YXMgaW4gQU5ZCiAgICAgICAgIyBvZiB0aGUgb2xkIGRlZmF1bHQgZ3JvdXBzLgogICAgICAgICMgSWYgYWRkdG9uZXdncm91cHMgPSAibm8iLCBvbGQgZGVmYXVsdCBncm91cHMgd2lsbCBiZSByZW1vdmVkIGFuZCBub3QKICAgICAgICAjIHJlcGxhY2VkLgogICAgICAgIHB1c2goQGdyb3Vwc3RvcmVtb3ZlLCBAZGVmYXVsdHN0b3JlbW92ZSk7CiAgICAgICAgaWYgKEFueURlZmF1bHRHcm91cHMoKQogICAgICAgICAgICAmJiAoKCRjZ2ktPnBhcmFtKCdhZGR0b25ld2dyb3VwJykgZXEgJ3llcycpCiAgICAgICAgICAgIHx8ICgoJGNnaS0+cGFyYW0oJ2FkZHRvbmV3Z3JvdXAnKSBlcSAneWVzaWZpbm9sZCcpCiAgICAgICAgICAgICYmICgkYnVnaW5hbnlkZWZhdWx0KSkpKSB7CiAgICAgICAgICAgIHB1c2goQGdyb3Vwc3RvYWRkLCBAZGVmYXVsdHN0b2FkZCk7CiAgICAgICAgfQoKICAgICAgICAjIE5vdyBhY3R1YWxseSB1cGRhdGUgdGhlIGJ1Z19ncm91cF9tYXAuCiAgICAgICAgbXkgQERlZkdyb3Vwc0FkZGVkID0gKCk7CiAgICAgICAgbXkgQERlZkdyb3Vwc1JlbW92ZWQgPSAoKTsKICAgICAgICBmb3JlYWNoIG15ICRncm91cGlkIChAYWxsZ3JvdXBzKSB7CiAgICAgICAgICAgIG15ICR0aGlzYWRkID0gZ3JlcCggKCRfID09ICRncm91cGlkKSwgQGdyb3Vwc3RvYWRkKTsKICAgICAgICAgICAgbXkgJHRoaXNkZWwgPSBncmVwKCAoJF8gPT0gJGdyb3VwaWQpLCBAZ3JvdXBzdG9yZW1vdmUpOwogICAgICAgICAgICBpZiAoJHRoaXNhZGQpIHsKICAgICAgICAgICAgICAgIHB1c2goQERlZkdyb3Vwc0FkZGVkLCBHcm91cElkVG9OYW1lKCRncm91cGlkKSk7CiAgICAgICAgICAgICAgICBTZW5kU1FMKCJJTlNFUlQgSU5UTyBidWdfZ3JvdXBfbWFwIChidWdfaWQsIGdyb3VwX2lkKSBWQUxVRVMgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICIoJGlkLCAkZ3JvdXBpZCkiKTsKICAgICAgICAgICAgfSBlbHNpZiAoJHRoaXNkZWwpIHsKICAgICAgICAgICAgICAgIHB1c2goQERlZkdyb3Vwc1JlbW92ZWQsIEdyb3VwSWRUb05hbWUoJGdyb3VwaWQpKTsKICAgICAgICAgICAgICAgIFNlbmRTUUwoIkRFTEVURSBGUk9NIGJ1Z19ncm91cF9tYXAgV0hFUkUgYnVnX2lkID0gJGlkICIgLgogICAgICAgICAgICAgICAgICAgICAgICAiQU5EIGdyb3VwX2lkID0gJGdyb3VwaWQiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoKEBEZWZHcm91cHNBZGRlZCkgfHwgKEBEZWZHcm91cHNSZW1vdmVkKSkgewogICAgICAgICAgICBMb2dBY3Rpdml0eUVudHJ5KCRpZCwgImJ1Z19ncm91cCIsCiAgICAgICAgICAgICAgICBqb2luKCcsICcsIEBEZWZHcm91cHNSZW1vdmVkKSwKICAgICAgICAgICAgICAgIGpvaW4oJywgJywgQERlZkdyb3Vwc0FkZGVkKSwKICAgICAgICAgICAgICAgICAgICAgJHdob2lkLCAkdGltZXN0YW1wKTsgCiAgICAgICAgfQogICAgfQogIAogICAgIyBnZXQgYSBzbmFwc2hvdCBvZiB0aGUgbmV3bHkgc2V0IHZhbHVlcyBvdXQgb2YgdGhlIGRhdGFiYXNlLCAKICAgICMgYW5kIHRoZW4gZ2VuZXJhdGUgYW55IG5lY2Vzc2FyeSBidWcgYWN0aXZpdHkgZW50cmllcyBieSBzZWVpbmcgCiAgICAjIHdoYXQgaGFzIGNoYW5nZWQgc2luY2UgYmVmb3JlIHdlIHdyb3RlIG91dCB0aGUgbmV3IHZhbHVlcy4KICAgICMKICAgIG15IEBuZXd2YWx1ZXMgPSBTbmFwU2hvdEJ1ZygkaWQpOwogICAgbXkgJW5ld2hhc2g7CiAgICAkaSA9IDA7CiAgICBmb3JlYWNoIG15ICRjb2wgKEA6OmxvZ19jb2x1bW5zKSB7CiAgICAgICAgIyBDb25zaWRlciBOVUxMIGRiIGVudHJpZXMgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUgZW1wdHkgc3RyaW5nCiAgICAgICAgJG5ld3ZhbHVlc1skaV0gPSBkZWZpbmVkKCRuZXd2YWx1ZXNbJGldKSA/ICRuZXd2YWx1ZXNbJGldIDogJyc7CiAgICAgICAgIyBDb252ZXJ0IHRoZSBkZWFkbGluZSB0byB0aGUgWVlZWS1NTS1ERCBmb3JtYXQuCiAgICAgICAgaWYgKCRjb2wgZXEgJ2RlYWRsaW5lJykgewogICAgICAgICAgICAkbmV3dmFsdWVzWyRpXSA9IGZvcm1hdF90aW1lKCRuZXd2YWx1ZXNbJGldLCAiJVktJW0tJWQiKTsKICAgICAgICB9CiAgICAgICAgJG5ld2hhc2h7JGNvbH0gPSAkbmV3dmFsdWVzWyRpXTsKICAgICAgICAkaSsrOwogICAgfQogICAgIyBmb3IgcGFzc2luZyB0byBCdWd6aWxsYTo6QnVnTWFpbCB0byBlbnN1cmUgdGhhdCB3aGVuIHNvbWVvbmUgaXMgcmVtb3ZlZAogICAgIyBmcm9tIG9uZSBvZiB0aGVzZSBmaWVsZHMsIHRoZXkgZ2V0IG5vdGlmaWVkIG9mIHRoYXQgZmFjdCAoaWYgZGVzaXJlZCkKICAgICMKICAgIG15ICRvcmlnT3duZXIgPSAiIjsKICAgIG15ICRvcmlnUWFDb250YWN0ID0gIiI7CiAgICAKICAgIGZvcmVhY2ggbXkgJGMgKEA6OmxvZ19jb2x1bW5zKSB7CiAgICAgICAgbXkgJGNvbCA9ICRjOyAgICAgICAgICAgIyBXZSBtb2RpZnkgaXQsIGRvbid0IHdhbnQgdG8gbW9kaWZ5IGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB2YWx1ZXMgaW4gcGxhY2UuCiAgICAgICAgbXkgJG9sZCA9IHNoaWZ0IEBvbGR2YWx1ZXM7CiAgICAgICAgbXkgJG5ldyA9IHNoaWZ0IEBuZXd2YWx1ZXM7CiAgICAgICAgaWYgKCRvbGQgbmUgJG5ldykgewoKICAgICAgICAgICAgIyBQcm9kdWN0cyBhbmQgY29tcG9uZW50cyBhcmUgbm93IHN0b3JlZCBpbiB0aGUgREIgdXNpbmcgSUQncwogICAgICAgICAgICAjIFdlIG5lZWQgdG8gdHJhbnNsYXRlIHRoaXMgdG8gRW5nbGlzaCBiZWZvcmUgbG9nZ2luZyBpdAogICAgICAgICAgICBpZiAoJGNvbCBlcSAncHJvZHVjdF9pZCcpIHsKICAgICAgICAgICAgICAgICRvbGQgPSBnZXRfcHJvZHVjdF9uYW1lKCRvbGQpOwogICAgICAgICAgICAgICAgJG5ldyA9IGdldF9wcm9kdWN0X25hbWUoJG5ldyk7CiAgICAgICAgICAgICAgICAkY29sID0gJ3Byb2R1Y3QnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkY29sIGVxICdjb21wb25lbnRfaWQnKSB7CiAgICAgICAgICAgICAgICAkb2xkID0gZ2V0X2NvbXBvbmVudF9uYW1lKCRvbGQpOwogICAgICAgICAgICAgICAgJG5ldyA9IGdldF9jb21wb25lbnRfbmFtZSgkbmV3KTsKICAgICAgICAgICAgICAgICRjb2wgPSAnY29tcG9uZW50JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzYXZlIG9mZiB0aGUgb2xkIHZhbHVlIGZvciBwYXNzaW5nIHRvIEJ1Z3ppbGxhOjpCdWdNYWlsIHNvCiAgICAgICAgICAgICMgdGhlIG9sZCBhc3NpZ25lZSBjYW4gYmUgbm90aWZpZWQKICAgICAgICAgICAgIwogICAgICAgICAgICBpZiAoJGNvbCBlcSAnYXNzaWduZWRfdG8nKSB7CiAgICAgICAgICAgICAgICAkb2xkID0gKCRvbGQpID8gREJJRF90b19uYW1lKCRvbGQpIDogIiI7CiAgICAgICAgICAgICAgICAkbmV3ID0gKCRuZXcpID8gREJJRF90b19uYW1lKCRuZXcpIDogIiI7CiAgICAgICAgICAgICAgICAkb3JpZ093bmVyID0gJG9sZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBkaXR0byBmb3IgdGhlIG9sZCBxYSBjb250YWN0CiAgICAgICAgICAgICMKICAgICAgICAgICAgaWYgKCRjb2wgZXEgJ3FhX2NvbnRhY3QnKSB7CiAgICAgICAgICAgICAgICAkb2xkID0gKCRvbGQpID8gREJJRF90b19uYW1lKCRvbGQpIDogIiI7CiAgICAgICAgICAgICAgICAkbmV3ID0gKCRuZXcpID8gREJJRF90b19uYW1lKCRuZXcpIDogIiI7CiAgICAgICAgICAgICAgICAkb3JpZ1FhQ29udGFjdCA9ICRvbGQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgSWYgdGhpcyBpcyB0aGUga2V5d29yZCBmaWVsZCwgb25seSByZWNvcmQgdGhlIGNoYW5nZXMsIG5vdCBldmVyeXRoaW5nLgogICAgICAgICAgICBpZiAoJGNvbCBlcSAna2V5d29yZHMnKSB7CiAgICAgICAgICAgICAgICAoJG9sZCwgJG5ldykgPSBkaWZmX3N0cmluZ3MoJG9sZCwgJG5ldyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkY29sIGVxICdwcm9kdWN0JykgewogICAgICAgICAgICAgICAgUmVtb3ZlVm90ZXMoJGlkLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgYnVnIGhhcyBiZWVuIG1vdmVkIHRvIGEgZGlmZmVyZW50IHByb2R1Y3QiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCRjb2wgZXEgJ2J1Z19zdGF0dXMnIAogICAgICAgICAgICAgICAgJiYgSXNPcGVuZWRTdGF0ZSgkb2xkKSBuZSBJc09wZW5lZFN0YXRlKCRuZXcpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkY2hlY2tfZGVwX2J1Z3MgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBMb2dBY3Rpdml0eUVudHJ5KCRpZCwkY29sLCRvbGQsJG5ldywkd2hvaWQsJHRpbWVzdGFtcCk7CiAgICAgICAgICAgICRidWdfY2hhbmdlZCA9IDE7CiAgICAgICAgfQogICAgfQogICAgIyBTZXQgYW5kIHVwZGF0ZSBmbGFncy4KICAgIG15ICR0YXJnZXQgPSBCdWd6aWxsYTo6RmxhZzo6R2V0VGFyZ2V0KCRpZCk7CiAgICBCdWd6aWxsYTo6RmxhZzo6cHJvY2VzcygkdGFyZ2V0LCAkdGltZXN0YW1wLCAkY2dpKTsKCiAgICBpZiAoJGJ1Z19jaGFuZ2VkKSB7CiAgICAgICAgU2VuZFNRTCgiVVBEQVRFIGJ1Z3MgU0VUIGRlbHRhX3RzID0gJHNxbF90aW1lc3RhbXAgV0hFUkUgYnVnX2lkID0gJGlkIik7CiAgICB9CiAgICAkZGJoLT5iel91bmxvY2tfdGFibGVzKCk7CgogICAgaWYgKCRkdXBsaWNhdGUpIHsKICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiBSZXBvcnRlciBvZiB0aGlzIGJ1ZyBpcyByZXBvcnRlciBvZiBEdXBlIAogICAgICAgIFNlbmRTUUwoIlNFTEVDVCByZXBvcnRlciBGUk9NIGJ1Z3MgV0hFUkUgYnVnX2lkID0gIiAuCiAgICAgICAgICAgICAgICAkY2dpLT5wYXJhbSgnaWQnKSk7CiAgICAgICAgbXkgJHJlcG9ydGVyID0gRmV0Y2hPbmVDb2x1bW4oKTsKICAgICAgICBTZW5kU1FMKCJTRUxFQ1QgcmVwb3J0ZXIgRlJPTSBidWdzIFdIRVJFIGJ1Z19pZCA9ICIgLgogICAgICAgICAgICAgICAgIiRkdXBsaWNhdGUgYW5kIHJlcG9ydGVyID0gJHJlcG9ydGVyIik7CiAgICAgICAgbXkgJGlzcmVwb3J0ZXIgPSBGZXRjaE9uZUNvbHVtbigpOwogICAgICAgIFNlbmRTUUwoIlNFTEVDVCB3aG8gRlJPTSBjYyBXSEVSRSBidWdfaWQgPSAiIC4KICAgICAgICAgICAgICAgICIgJGR1cGxpY2F0ZSBhbmQgd2hvID0gJHJlcG9ydGVyIik7CiAgICAgICAgbXkgJGlzb25jYyA9IEZldGNoT25lQ29sdW1uKCk7CiAgICAgICAgdW5sZXNzICgkaXNyZXBvcnRlciB8fCAkaXNvbmNjCiAgICAgICAgICAgICAgICB8fCAhJGNnaS0+cGFyYW0oJ2NvbmZpcm1fYWRkX2R1cGxpY2F0ZScpKSB7CiAgICAgICAgICAgICMgVGhlIHJlcG9ydGVyIGlzIG9ibGl2aW91cyB0byB0aGUgZXhpc3RlbmNlIG9mIHRoZSBuZXcgYnVnIGFuZCBpcyBwZXJtaXR0ZWQgYWNjZXNzCiAgICAgICAgICAgICMgLi4uIGFkZCAnZW0gdG8gdGhlIGNjIChhbmQgcmVjb3JkIGFjdGl2aXR5KQogICAgICAgICAgICBMb2dBY3Rpdml0eUVudHJ5KCRkdXBsaWNhdGUsImNjIiwiIixEQklEX3RvX25hbWUoJHJlcG9ydGVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd2hvaWQsJHRpbWVzdGFtcCk7CiAgICAgICAgICAgIFNlbmRTUUwoIklOU0VSVCBJTlRPIGNjICh3aG8sIGJ1Z19pZCkgIiAuCiAgICAgICAgICAgICAgICAgICAgIlZBTFVFUyAoJHJlcG9ydGVyLCAkZHVwbGljYXRlKSIpOwogICAgICAgIH0KICAgICAgICAjIEJ1ZyAxNzE2MzkgLSBEdXBsaWNhdGUgbm90aWZpY2F0aW9ucyBkbyBub3QgbmVlZCB0byBiZSBwcml2YXRlLiAKICAgICAgICBBcHBlbmRDb21tZW50KCRkdXBsaWNhdGUsICR3aG9pZCwKICAgICAgICAgICAgICAgICAgICAgICIqKiogQnVnICIgLiAkY2dpLT5wYXJhbSgnaWQnKSAuCiAgICAgICAgICAgICAgICAgICAgICAiIGhhcyBiZWVuIG1hcmtlZCBhcyBhIGR1cGxpY2F0ZSBvZiB0aGlzIGJ1Zy4gKioqIiwKICAgICAgICAgICAgICAgICAgICAgIDAsICR0aW1lc3RhbXApOwoKICAgICAgICBDaGVja0Zvcm1GaWVsZERlZmluZWQoJGNnaSwnY29tbWVudCcpOwogICAgICAgIFNlbmRTUUwoIklOU0VSVCBJTlRPIGR1cGxpY2F0ZXMgVkFMVUVTICgkZHVwbGljYXRlLCAiIC4KICAgICAgICAgICAgICAgICRjZ2ktPnBhcmFtKCdpZCcpIC4gIikiKTsKICAgIH0KCiAgICAjIE5vdyBhbGwgY2hhbmdlcyB0byB0aGUgREIgaGF2ZSBiZWVuIG1hZGUuIEl0J3MgdGltZSB0byBlbWFpbAogICAgIyBhbGwgY29uY2VybmVkIHVzZXJzLCBpbmNsdWRpbmcgdGhlIGJ1ZyBpdHNlbGYsIGJ1dCBhbHNvIHRoZQogICAgIyBkdXBsaWNhdGVkIGJ1ZyBhbmQgZGVwZW5kZW50IGJ1Z3MsIGlmIGFueS4KCiAgICAkdmFycy0+eydtYWlscmVjaXBpZW50cyd9ID0geyAnY2MnID0+IFxAY2NSZW1vdmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ293bmVyJyA9PiAkb3JpZ093bmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3FhY29udGFjdCcgPT4gJG9yaWdRYUNvbnRhY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2hhbmdlcicgPT4gQnVnemlsbGEtPnVzZXItPmxvZ2luIH07CgogICAgJHZhcnMtPnsnaWQnfSA9ICRpZDsKICAgICR2YXJzLT57J3R5cGUnfSA9ICJidWciOwogICAgCiAgICAjIExldCB0aGUgdXNlciBrbm93IHRoZSBidWcgd2FzIGNoYW5nZWQgYW5kIHdobyBkaWQgYW5kIGRpZG4ndAogICAgIyByZWNlaXZlIGVtYWlsIGFib3V0IHRoZSBjaGFuZ2UuCiAgICAkdGVtcGxhdGUtPnByb2Nlc3MoImJ1Zy9wcm9jZXNzL3Jlc3VsdHMuaHRtbC50bXBsIiwgJHZhcnMpCiAgICAgIHx8IFRocm93VGVtcGxhdGVFcnJvcigkdGVtcGxhdGUtPmVycm9yKCkpOwogICAgJHZhcnMtPnsnaGVhZGVyX2RvbmUnfSA9IDE7CiAgICAKICAgIGlmICgkZHVwbGljYXRlKSB7CiAgICAgICAgJHZhcnMtPnsnbWFpbHJlY2lwaWVudHMnfSA9IHsgJ2NoYW5nZXInID0+IEJ1Z3ppbGxhLT51c2VyLT5sb2dpbiB9OyAKCiAgICAgICAgJHZhcnMtPnsnaWQnfSA9ICRkdXBsaWNhdGU7CiAgICAgICAgJHZhcnMtPnsndHlwZSd9ID0gImR1cGUiOwogICAgICAgIAogICAgICAgICMgTGV0IHRoZSB1c2VyIGtub3cgYSBkdXBsaWNhdGlvbiBub3RhdGlvbiB3YXMgYWRkZWQgdG8gdGhlIG9yaWdpbmFsIGJ1Zy4KICAgICAgICAkdGVtcGxhdGUtPnByb2Nlc3MoImJ1Zy9wcm9jZXNzL3Jlc3VsdHMuaHRtbC50bXBsIiwgJHZhcnMpCiAgICAgICAgICB8fCBUaHJvd1RlbXBsYXRlRXJyb3IoJHRlbXBsYXRlLT5lcnJvcigpKTsKICAgICAgICAkdmFycy0+eydoZWFkZXJfZG9uZSd9ID0gMTsKICAgIH0KCiAgICBpZiAoJGNoZWNrX2RlcF9idWdzKSB7CiAgICAgICAgZm9yZWFjaCBteSAkayAoa2V5cyglZGVwZW5kZW5jeWNoYW5nZWQpKSB7CiAgICAgICAgICAgICR2YXJzLT57J21haWxyZWNpcGllbnRzJ30gPSB7ICdjaGFuZ2VyJyA9PiBCdWd6aWxsYS0+dXNlci0+bG9naW4gfTsgCiAgICAgICAgICAgICR2YXJzLT57J2lkJ30gPSAkazsKICAgICAgICAgICAgJHZhcnMtPnsndHlwZSd9ID0gImRlcCI7CgogICAgICAgICAgICAjIExldCB0aGUgdXNlciBrbm93IHdlIGNoZWNrZWQgdG8gc2VlIGlmIHdlIHNob3VsZCBlbWFpbCBub3RpY2UKICAgICAgICAgICAgIyBvZiB0aGlzIGNoYW5nZSB0byB1c2VycyB3aXRoIGEgcmVsYXRpb25zaGlwIHRvIHRoZSBkZXBlbmRlbnQKICAgICAgICAgICAgIyBidWcgYW5kIHdobyBkaWQgYW5kIGRpZG4ndCByZWNlaXZlIGVtYWlsIGFib3V0IGl0LgogICAgICAgICAgICAkdGVtcGxhdGUtPnByb2Nlc3MoImJ1Zy9wcm9jZXNzL3Jlc3VsdHMuaHRtbC50bXBsIiwgJHZhcnMpCiAgICAgICAgICAgICAgfHwgVGhyb3dUZW1wbGF0ZUVycm9yKCR0ZW1wbGF0ZS0+ZXJyb3IoKSk7CiAgICAgICAgICAgICR2YXJzLT57J2hlYWRlcl9kb25lJ30gPSAxOwogICAgICAgIH0KICAgIH0KfQoKIyBub3cgc2hvdyB0aGUgbmV4dCBidWcKaWYgKCRuZXh0X2J1ZykgewogICAgaWYgKGRldGFpbnRfbmF0dXJhbCgkbmV4dF9idWcpICYmIEJ1Z3ppbGxhLT51c2VyLT5jYW5fc2VlX2J1ZygkbmV4dF9idWcpKSB7CiAgICAgICAgbXkgJGJ1ZyA9IG5ldyBCdWd6aWxsYTo6QnVnKCRuZXh0X2J1ZywgJHdob2lkKTsKICAgICAgICBUaHJvd0NvZGVFcnJvcigiYnVnX2Vycm9yIiwgeyBidWcgPT4gJGJ1ZyB9KSBpZiAkYnVnLT5lcnJvcjsKCiAgICAgICAgIyBuZXh0Lmh0bWwudG1wbCBpbmNsdWRlcyBlZGl0Lmh0bWwudG1wbCwgYW5kIHRoZXJlZm9yZSB3ZQogICAgICAgICMgbmVlZCAkYnVnIGRlZmluZWQgaW4gJHZhcnMuCiAgICAgICAgJHZhcnMtPnsnYnVnJ30gPSAkYnVnOwoKICAgICAgICAjIEFuZCB3ZSBuZWVkIHRvIGRldGVybWluZSBpZiBQYXRjaCBWaWV3ZXIgaXMgaW5zdGFsbGVkLCBmb3IKICAgICAgICAjIERpZmYgbGluayAoTkI6IER1cGxpY2F0ZSBjb2RlIHdpdGggc2hvd19idWcuY2dpLikKICAgICAgICBldmFsIHsKICAgICAgICAgICAgcmVxdWlyZSBQYXRjaFJlYWRlcjsKICAgICAgICAgICAgJHZhcnMtPnsncGF0Y2h2aWV3ZXJpbnN0YWxsZWQnfSA9IDE7CiAgICAgICAgfTsKCiAgICAgICAgJHRlbXBsYXRlLT5wcm9jZXNzKCJidWcvcHJvY2Vzcy9uZXh0Lmh0bWwudG1wbCIsICR2YXJzKQogICAgICAgICAgfHwgVGhyb3dUZW1wbGF0ZUVycm9yKCR0ZW1wbGF0ZS0+ZXJyb3IoKSk7CgogICAgICAgIGV4aXQ7CiAgICB9Cn0KCiMgRW5kIHRoZSByZXNwb25zZSBwYWdlLgokdGVtcGxhdGUtPnByb2Nlc3MoImJ1Zy9uYXZpZ2F0ZS5odG1sLnRtcGwiLCAkdmFycykKICB8fCBUaHJvd1RlbXBsYXRlRXJyb3IoJHRlbXBsYXRlLT5lcnJvcigpKTsKJHRlbXBsYXRlLT5wcm9jZXNzKCJnbG9iYWwvZm9vdGVyLmh0bWwudG1wbCIsICR2YXJzKQogIHx8IFRocm93VGVtcGxhdGVFcnJvcigkdGVtcGxhdGUtPmVycm9yKCkpOwo=