diff --git a/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/ConfigureEnvironmentForAOAG.yaml.json b/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/ConfigureEnvironmentForAOAG.yaml.json index f9fa3d01..a3ae1ff7 100644 --- a/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/ConfigureEnvironmentForAOAG.yaml.json +++ b/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/ConfigureEnvironmentForAOAG.yaml.json @@ -20,8 +20,8 @@ } ], "Scripts": [ - "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKZnVuY3Rpb24gU2hvdy1JbnZvY2F0aW9uSW5mbyB7CiAgICBwYXJhbSAoCiAgICAgICAgJEludm9jYXRpb24sCiAgICAgICAgW1N3aXRjaF0gJEVuZAogICAgKQoKICAgIGlmICgkRW5kKSB7CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgIH0KICAgIGVsc2UgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8ZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPHBhcmFtPiIKICAgICAgICBmb3JlYWNoICgkUGFyYW1ldGVyIGluICRJbnZvY2F0aW9uLk15Q29tbWFuZC5QYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRLZXkgaW4gJFBhcmFtZXRlci5LZXlzKSB7CiAgICAgICAgICAgICAgICAkVHlwZSA9ICRQYXJhbWV0ZXJbJEtleV0uUGFyYW1ldGVyVHlwZS5GdWxsTmFtZQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJFZhbHVlIGluICRJbnZvY2F0aW9uLkJvdW5kUGFyYW1ldGVyc1skS2V5XSkgewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJbJFR5cGVdICRLZXkgPSAnJFZhbHVlJyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPC9wYXJhbT4iCiAgICB9Cn0KCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", - "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoKEdldC1Nb2R1bGUgU1FMUFMgLUxpc3RBdmFpbGFibGUpIC1uZSAkbnVsbCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIk1vZHVsZSBTUUxTUCBhbHJlYWR5IGluc3RhbGxlZC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICRNdXJhbm9GaWxlU2hhcmUgPSBbRW52aXJvbm1lbnRdOjpHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdNdXJhbm9GaWxlU2hhcmUnKQogICAgICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgICAgIHRocm93KCJVbmFibGUgdG8gZmluZCBNdXJhbm9GaWxlU2hhcmUgcGF0aC4iKQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJFNldHVwUm9vdCAtZXEgJycpIHsKICAgICAgICAgICAgJFNldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXFRvb2xzJykKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJEZpbGVMaXN0ID0gQCgKICAgICAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgICAgICdTaGFyZWRNYW5hZ2VtZW50T2JqZWN0cy5tc2knLAogICAgICAgICAgICAnUG93ZXJTaGVsbFRvb2xzLm1zaScKICAgICAgICApCgogICAgICAgIGZvcmVhY2ggKCRNc2lGaWxlIGluICRGaWxlTGlzdCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRyeWluZyB0byBpbnN0YWxsICckTXNpRmlsZScgLi4uIgogICAgICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgICAgIGlmIChbSU8uRmlsZV06OkV4aXN0cygkTXNpUGF0aCkpIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgbXNpZXhlIC4uLiIKICAgICAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL2knLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICAgICAgaWYgKCRSZXN1bHQuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoIkluc3RhbGxhdGlvbiBvZiBNU0kgcGFja2FnZSAnJE1zaVBhdGgnIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJyQoJFJlc3VsdC5FeGl0Q29kZSknIikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5zdGFsbC1TcWxTZXJ2ZXJGb3JBT0FHIHsKICAgIHBhcmFtICgKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUwgZmVhdHVyZXMgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU2V0dXBSb290ID0gJycsCgogICAgICAgICMgUGF0aCB0byBmb2xkZXIgd2hlcmUgbXNpIGZpbGVzIGZvciBhZGRpdGlvbmFsIFNRTFBTIG1vZHVsZSBhcmUgbG9jYXRlZAogICAgICAgIFtTdHJpbmddICRTcWxwc1NldHVwUm9vdCA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkTXVyYW5vRmlsZVNoYXJlID0gJycsCgogICAgICAgICMgKFJFUVVJUkVEKSBEb21haW4gbmFtZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlckRvbWFpbiA9ICdmYy1hY21lLmxvY2FsJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFVzZXIgbmFtZSBmb3IgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IFNRTCBzZXJ2aWNlCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyTmFtZSA9ICdBZG1pbmlzdHJhdG9yJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFBhc3N3b3JkIGZvciB0aGF0IHVzZXIKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJQYXNzd29yZCA9ICdQQHNzdzByZCcsCgogICAgICAgIFtTd2l0Y2hdICRVcGRhdGVFbmFibGVkCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgJE11cmFub0ZpbGVTaGFyZSA9IFtFbnZpcm9ubWVudF06OkdldEVudmlyb25tZW50VmFyaWFibGUoJ011cmFub0ZpbGVTaGFyZScpCiAgICAgICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICAgICAkU2V0dXBSb290ID0gW0lPLlBhdGhdOjpDb21iaW5lKCRNdXJhbm9GaWxlU2hhcmUsICdQcmVyZXF1aXNpdGVzXFNRTCBTZXJ2ZXJcMjAxMicpCiAgICAgICAgfQoKICAgICAgICAkRXh0cmFPcHRpb25zID0gQHt9CgogICAgICAgIGlmICgkVXBkYXRlRW5hYmxlZCkgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJHRydWV9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJGZhbHNlfQogICAgICAgIH0KCiAgICAgICAgTmV3LVNRTFNlcnZlckZvckFPQUcgYAogICAgICAgICAgICAtU2V0dXBSb290ICRTZXR1cFJvb3QgYAogICAgICAgICAgICAtU1FMU3ZjVXNyRG9tYWluICRTUUxTZXJ2aWNlVXNlckRvbWFpbiBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JOYW1lICRTUUxTZXJ2aWNlVXNlck5hbWUgYAogICAgICAgICAgICAtU1FMU3ZjVXNyUGFzc3dvcmQgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgYAogICAgICAgICAgICAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKICAgIH0KfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCwKICAgICAgICBbU3RyaW5nXSAkU3FsU2VydmljZUFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lID0gJ1NoYXJlZFdvcmtEaXInCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAkU2hhcmVOZXR3b3JrUGF0aCA9ICdcXCcgKyAkUHJpbWFyeU5vZGUgKyAnXCcgKyAkU2hhcmVOYW1lCgogICAgICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAgICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluQWRtaW5BY2NvdW50TmFtZSIgYAogICAgICAgICAgICAtUGFzc3dvcmQgIiREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUaGlzIHNjcmlwdCBydW5zIG9uIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nIHNjcmlwdC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRTaGFyZU5hbWUgLWVxICcnKSB7CiAgICAgICAgICAgICRTaGFyZU5hbWUgPSBbSU8uUGF0aF06OkdldEZpbGVOYW1lV2l0aG91dEV4dGVuc2lvbigkU2hhcmVQYXRoKQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlUGF0aCA9ICckU2hhcmVQYXRoJyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU2hhcmVOYW1lID0gJyRTaGFyZU5hbWUnIgoKICAgICAgICB0cnkgewogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZSAnJFNoYXJlTmFtZSciCiAgICAgICAgICAgICRudWxsID0gR2V0LVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UKICAgICAgICAgICAgd3JpdGUtTG9nICJTaGFyZSAnJFNoYXJlTmFtZScgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiU2hhcmUgJyRTaGFyZU5hbWUnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgZm9sZGVyICckU2hhcmVQYXRoIgogICAgICAgICAgICAkbnVsbCA9IEdldC1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1SZWN1cnNlIC1Gb3JjZQogICAgICAgICAgICBXcml0ZS1Mb2cgIkZvbGRlciAnJFNoYXJlUGF0aCcgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiRm9sZGVyICckU2hhcmVQYXRoJyBub3QgZXhpc3RzIG9yIGNhbm5vdCBiZSBkZWxldGVkLiIKICAgICAgICB9CgogICAgICAgICRudWxsID0gTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQogICAgICAgICAgICAgICAgCiAgICAgICAgJG51bGwgPSBOZXctU21iU2hhcmUgLVBhdGggJFNoYXJlUGF0aCBgCiAgICAgICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYAogICAgICAgICAgICAtRnVsbEFjY2VzcyAiRXZlcnlvbmUiIGAKICAgICAgICAgICAgLURlc2NyaXB0aW9uICJTaGFyZWQgZm9sZGVyIGZvciBBbHdheXNPbiBBdmFpbGFiaWxpdHkgR3JvdXAgc2V0dXAuIgoKICAgICAgICByZXR1cm4gJ1xcJyArICRFbnY6Q29tcHV0ZXJOYW1lICsgJ1wnICsgJFNoYXJlTmFtZQogICAgfQp9CgoKCmZ1bmN0aW9uIE5ldy1EYXRhYmFzZUZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREYXRhYmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRGdW5jdGlvbnNGaWxlID0gRXhwb3J0LUZ1bmN0aW9uICdJbnZva2UtU1FMVGV4dCcsICdDb252ZXJ0VG8tU1FMTmFtZScsICdDb252ZXJ0VG8tU1FMU3RyaW5nJywgJ05ldy1TUUxEYXRhYmFzZScKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gZmlsZSAnJEZ1bmN0aW9uc0ZpbGUnIC4uLiIKLiAiJEZ1bmN0aW9uc0ZpbGUiCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctU1FMRGF0YWJhc2UnIC4uLiIKTmV3LVNRTERhdGFiYXNlICREYXRhYmFzZU5hbWUKIkAgLUNyZWRlbnRpYWwgJENyZWRzIC1Ob0Jhc2U2NAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSA9ICdNdXJhbm9BRycsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkRGF0YWJhc2VMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTGlzdGVuZXIgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBieSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VzIGluIHRoYXQgQUcKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lck5hbWUgPSAnTXVyYW5vQUdfTGlzdGVuZXInLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lcklQLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUE1hc2sgPSAnMjU1LjI1NS4yNTUuMCcsCgogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lclBvcnQgPSAnNTAyMycsCgogICAgICAgICMgU3luYyBNb2RlIE5vZGUgTGlzdAogICAgICAgIFtTdHJpbmdbXV0gJFN5bmNNb2RlTm9kZUxpc3QsCgogICAgICAgIFtTdHJpbmddICRTaGFyZWRXb3JrRGlyID0gJ1NoYXJlZFdvcmtEaXInLAoKICAgICAgICBbU3RyaW5nXSAkQ2xpWG1sRmlsZSA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgV3JpdGUtTG9nICJQcmltYXJ5IG5vZGU6ICckKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkpJyIKICAgICAgICBXcml0ZS1Mb2cgIkN1cnJlbnQgbm9kZTogJyQoKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpJyIKCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICQoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRoaXMgZnVuY3Rpb24gd29ya3Mgb24gUHJpbWFyeU5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRDbGlYbWxGaWxlIC1lcSAnJykgewogICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ID0gQCgpCiAgICAgICAgICAgIGZvcmVhY2ggKCROb2RlIGluICROb2RlTGlzdCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IEltcG9ydC1DbGlYbWwgLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcJE5vZGUueG1sIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiVXNpbmcgZGVmYXVsdCBlbmRwb2ludCBwb3J0IDUwMjIiCiAgICAgICAgICAgICAgICAgICAgJE5vZGVFbmRwb2ludFBvcnQgPSA1MDIyCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uID0gQHsKICAgICAgICAgICAgICAgICAgICAiU0VSVkVSX0lOU1RBTkNFIiA9ICIkTm9kZSI7CiAgICAgICAgICAgICAgICAgICAgIkVORFBPSU5UX1VSTCIgPSAiVENQOi8vJHtOb2RlfToke05vZGVFbmRwb2ludFBvcnR9IjsKICAgICAgICAgICAgICAgICAgICAiQVZBSUxBQklMSVRZX01PREUiID0gIkFTWU5DSFJPTk9VU19DT01NSVQiOwogICAgICAgICAgICAgICAgICAgICJGQUlMT1ZFUl9NT0RFIj0iTUFOVUFMIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJFN5bmNNb2RlTm9kZUxpc3QgLWNvbnRhaW5zICROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvblsnQVZBSUxBQklMSVRZX01PREUnXSA9ICJTWU5DSFJPTk9VU19DT01NSVQiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydGQUlMT1ZFUl9NT0RFJ10gPSAiQVVUT01BVElDIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBOT1QgaW4gU3luY01vZGVOb2RlTGlzdCIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ICs9IEAoJFJlcGxpY2FEZWZpbml0aW9uKQogICAgICAgICAgICB9CgogICAgICAgICAgICAkUHJlZmVyZW5jZXMgPSBAe30KCiAgICAgICAgICAgICRMaXN0ZW5lckRlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgIk5BTUUiPSRMaXN0ZW5lck5hbWU7CiAgICAgICAgICAgICAgICAiUE9SVCIgPSAiJExpc3RlbmVyUG9ydCI7CiAgICAgICAgICAgICAgICAiU1RBVElDIiA9ICIkTGlzdGVuZXJJUC8kTGlzdGVuZXJJUE1hc2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbWV0ZXJzID0gQHsKICAgICAgICAgICAgICAgICdXb3JrRGlyJyA9ICJcXCRQcmltYXJ5Tm9kZVwkU2hhcmVkV29ya0RpciI7CiAgICAgICAgICAgICAgICAnTmFtZScgPSAkR3JvdXBOYW1lOwogICAgICAgICAgICAgICAgJ0RhdGFiYXNlTmFtZXMnID0gJERhdGFiYXNlTGlzdDsKICAgICAgICAgICAgICAgICdSZXBsaWNhRGVmcycgPSAkUmVwbGljYURlZmluaXRpb25MaXN0OwogICAgICAgICAgICAgICAgJ1ByZWZlcmVuY2VzJyA9ICRQcmVmZXJlbmNlczsKICAgICAgICAgICAgICAgICdMaXN0ZW5lckRlZicgPSAkTGlzdGVuZXJEZWZpbml0aW9uOwogICAgICAgICAgICB9CgogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAiXFwkUHJpbWFyeU5vZGVcU2hhcmVkV29ya0RpclwqIiAtRm9yY2UKCiAgICAgICAgICAgICRDbGlYbWxGaWxlID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkNsaVhtbCBmaWxlOiAnJENsaVhtbEZpbGUnIgoKICAgICAgICAgICAgRXhwb3J0LUNsaVhtbCAtUGF0aCAkQ2xpWG1sRmlsZSAtSW5wdXRPYmplY3QgJFBhcmFtZXRlcnMgLURlcHRoIDEwCgogICAgICAgICAgICBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSBgCiAgICAgICAgICAgICAgICAtQ2xpWG1sRmlsZSAkQ2xpWG1sRmlsZSBgCiAgICAgICAgICAgICAgICAtRG9tYWluTmFtZSAkRG9tYWluTmFtZSBgCiAgICAgICAgICAgICAgICAtVXNlck5hbWUgJFVzZXJOYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyUGFzc3dvcmQgJFVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgICAgICAtUHJpbWFyeU5vZGUgJFByaW1hcnlOb2RlCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gLUFsbAoKICAgICAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiSW1wb3J0aW5nIENsaVhtbCBwYXJhbWV0ZXJzIGZpbGUgLi4uIgpgJFBhcmFtZXRlcnMgPSBJbXBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCcgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCBgYAogICAgLVdvcmtEaXIgYCRQYXJhbWV0ZXJzWydXb3JrRGlyJ10gYGAKICAgIC1OYW1lIGAkUGFyYW1ldGVyc1snTmFtZSddIGBgCiAgICAtRGF0YWJhc2VOYW1lcyBgJFBhcmFtZXRlcnNbJ0RhdGFiYXNlTmFtZXMnXSBgYAogICAgLVJlcGxpY2FEZWZzIGAkUGFyYW1ldGVyc1snUmVwbGljYURlZnMnXSBgYAogICAgLVByZWZlcmVuY2VzIGAkUGFyYW1ldGVyc1snUHJlZmVyZW5jZXMnXSBgYAogICAgLUxpc3RlbmVyRGVmIGAkUGFyYW1ldGVyc1snTGlzdGVuZXJEZWYnXQoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICAgICAgfQogICAgfQp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1NlY29uZGFyeVJlcGxpY2EgewogICAgcGFyYW0gKAogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nW11dICROb2RlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGUgbmFtZSB0aGF0IHdpbGwgYmUgcHJpbWFyeSBmb3Igc2VsZWN0ZWQgQXZhaWxhYmlsaXR5IEdyb3VwCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKCiAgICAgICAgW1N0cmluZ10gJFNoYXJlZFdvcmtEaXIgPSAnU2hhcmVkV29ya0RpcicsCgogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApIAogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYScgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cFJlcGxpY2EgLVdvcmtEaXIgIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIgoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICB9Cn0KCgoKZnVuY3Rpb24gRGlzYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBuZXRzaCBhZHZmaXJld2FsbCBzZXQgYWxscHJvZmlsZXMgc3RhdGUgb2ZmCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLUZpcmV3YWxsIHsKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIG5ldHNoIGFkdmZpcmV3YWxsIHNldCBhbGxwcm9maWxlcyBzdGF0ZSBvbgogICAgfQp9CgoKCmZ1bmN0aW9uIEVuYWJsZS1UcnVzdGVkSG9zdHMgewogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgU2V0LUl0ZW0gV1NNYW46XGxvY2FsaG9zdFxDbGllbnRcVHJ1c3RlZEhvc3RzIC1WYWx1ZSAnKicgLUZvcmNlCiAgICB9Cn0K", - "CmZ1bmN0aW9uIE5ldy1TcWxTZXJ2ZXJTeXN0ZW1BY2NvdW50IHsKICAgIHBhcmFtICgKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIE5hbWUKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgd2hvIGhhcyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgYW5kIG1vZGlmeSB1c2VyUGFzc3dvcmQKICAgICAgICAjIFVzdWFsbHkgdGhpcyBpcyB0aGUgZG9tYWluIGFkbWluaXN0cmF0b3IgJyRkb21haW5OYW1lXEFkbWluaXN0cmF0b3InIGFjY291bnQKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAoKICAgICAgICAjIChSRVFVSVJFRCkgUGFzc3dvcmQgZm9yIHRoYXQgdXNlcgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLAoKICAgICAgICAjIChSRVFVSVJFRCkgVXNlciBuYW1lIGZvciBhIG5ldyBhY2NvdW50IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJ1biBTUUwgU2VydmVyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlclBhc3N3b3JkLAoKICAgICAgICBbU3RyaW5nXSAkUHJpbWFyeU5vZGUgPSAnICcKICAgICkKCiAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICBXcml0ZS1Mb2cgIlRIaXMgZnVuY3Rpb24gcnVucyBvbiBBT0FHIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICBXcml0ZS1Mb2cgIkV4aXRpbmcuIgogICAgICAgIHJldHVybgogICAgfQoKICAgIFdyaXRlLUxvZyAiSW5zdGFsbGluZyAnUlNBVC1BRC1Qb3dlclNoZWxsJyAuLi4gIgogICAgQWRkLVdpbmRvd3NGZWF0dXJlIFJTQVQtQUQtUG93ZXJTaGVsbAoKICAgIEltcG9ydC1Nb2R1bGUgQWN0aXZlRGlyZWN0b3J5CgogICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICBXcml0ZS1Mb2cgIkFkZGluZyBuZXcgdXNlciAuLi4iCiAgICAkbnVsbCA9IE5ldy1BRFVzZXIgYAogICAgICAgIC1OYW1lICRTUUxTZXJ2aWNlVXNlck5hbWUgYAogICAgICAgIC1BY2NvdW50UGFzc3dvcmQgJChDb252ZXJ0VG8tU2VjdXJlU3RyaW5nIC1TdHJpbmcgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgLUFzUGxhaW5UZXh0IC1Gb3JjZSkgYAogICAgICAgIC1DcmVkZW50aWFsICRDcmVkcyBgCiAgICAgICAgLUVycm9yQWN0aW9uICdTdG9wJwp9Cg==" + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKCmZ1bmN0aW9uIFNob3ctSW52b2NhdGlvbkluZm8gewogICAgcGFyYW0gKAogICAgICAgICRJbnZvY2F0aW9uLAogICAgICAgIFtTd2l0Y2hdICRFbmQKICAgICkKCiAgICBpZiAoJEVuZCkgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8L2Z1bmN0aW9uIG5hbWU9JyQoJEludm9jYXRpb24uTXlDb21tYW5kLk5hbWUpJz4iCiAgICB9CiAgICBlbHNlIHsKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPGZ1bmN0aW9uIG5hbWU9JyQoJEludm9jYXRpb24uTXlDb21tYW5kLk5hbWUpJz4iCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjxwYXJhbT4iCiAgICAgICAgZm9yZWFjaCAoJFBhcmFtZXRlciBpbiAkSW52b2NhdGlvbi5NeUNvbW1hbmQuUGFyYW1ldGVycykgewogICAgICAgICAgICBmb3JlYWNoICgkS2V5IGluICRQYXJhbWV0ZXIuS2V5cykgewogICAgICAgICAgICAgICAgJFR5cGUgPSAkUGFyYW1ldGVyWyRLZXldLlBhcmFtZXRlclR5cGUuRnVsbE5hbWUKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRWYWx1ZSBpbiAkSW52b2NhdGlvbi5Cb3VuZFBhcmFtZXRlcnNbJEtleV0pIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiWyRUeXBlXSAkS2V5ID0gJyRWYWx1ZSciCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvcGFyYW0+IgogICAgfQp9CgoKJFRyYXBIYW5kbGVyID0gewogICAgV3JpdGUtTG9nRXJyb3IgQCgiPGV4Y2VwdGlvbj4iLCAkXykgLUVudGlyZU9iamVjdAogICAgV3JpdGUtTG9nRXJyb3IgIjwvZXhjZXB0aW9uPiIKICAgIGJyZWFrCn0KCgp0cmFwIHsKICAgICYkVHJhcEhhbmRsZXIKfQoKJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICdTdG9wJwoKCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", + "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKChHZXQtTW9kdWxlIFNRTFBTIC1MaXN0QXZhaWxhYmxlKSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJNb2R1bGUgU1FMU1AgYWxyZWFkeSBpbnN0YWxsZWQuIgogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICAgICB0aHJvdygiVW5hYmxlIHRvIGZpbmQgTXVyYW5vRmlsZVNoYXJlIHBhdGguIikKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclxUb29scycpCiAgICAgICAgfQogICAgICAgIAogICAgICAgICRGaWxlTGlzdCA9IEAoCiAgICAgICAgICAgICdTUUxTeXNDbHJUeXBlcy5tc2knLAogICAgICAgICAgICAnU2hhcmVkTWFuYWdlbWVudE9iamVjdHMubXNpJywKICAgICAgICAgICAgJ1Bvd2VyU2hlbGxUb29scy5tc2knCiAgICAgICAgKQoKICAgICAgICBmb3JlYWNoICgkTXNpRmlsZSBpbiAkRmlsZUxpc3QpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUcnlpbmcgdG8gaW5zdGFsbCAnJE1zaUZpbGUnIC4uLiIKICAgICAgICAgICAgJE1zaVBhdGggPSBKb2luLVBhdGggJFNldHVwUm9vdCAkTXNpRmlsZQogICAgICAgICAgICBpZiAoW0lPLkZpbGVdOjpFeGlzdHMoJE1zaVBhdGgpKSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIG1zaWV4ZSAuLi4iCiAgICAgICAgICAgICAgICAkUmVzdWx0ID0gRXhlYyAtRmlsZVBhdGggIm1zaWV4ZWMuZXhlIiAtQXJndW1lbnRMaXN0IEAoJy9pJywgImAiJE1zaVBhdGhgIiIsICcvcXVpZXQnKSAtUGFzc1RocnUKICAgICAgICAgICAgICAgIGlmICgkUmVzdWx0LkV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCJJbnN0YWxsYXRpb24gb2YgTVNJIHBhY2thZ2UgJyRNc2lQYXRoJyBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICckKCRSZXN1bHQuRXhpdENvZGUpJyIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIkZpbGUgJyRNc2lQYXRoJyBub3QgZm91bmQuIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgoKCmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyRm9yQU9BRyB7CiAgICBwYXJhbSAoCiAgICAgICAgIyBQYXRoIHRvIGZvbGRlciB3aGVyZSBtc2kgZmlsZXMgZm9yIGFkZGl0aW9uYWwgU1FMIGZlYXR1cmVzIGFyZSBsb2NhdGVkCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnLAoKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUxQUyBtb2R1bGUgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU3FscHNTZXR1cFJvb3QgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJE11cmFub0ZpbGVTaGFyZSA9ICcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIG5hbWUKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJEb21haW4gPSAnZmMtYWNtZS5sb2NhbCcsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgZm9yIHRoZSBhY2NvdW50IHdoaWNoIHdpbGwgYmUgdXNlZCBieSBTUUwgc2VydmljZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUgPSAnQWRtaW5pc3RyYXRvcicsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgPSAnUEBzc3cwcmQnLAoKICAgICAgICBbU3dpdGNoXSAkVXBkYXRlRW5hYmxlZAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgdHJhcCB7CiAgICAgICAgICAgICYkVHJhcEhhbmRsZXIKICAgICAgICB9CgogICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICAgICB0aHJvdygiVW5hYmxlIHRvIGZpbmQgTXVyYW5vRmlsZVNoYXJlIHBhdGguIikKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclwyMDEyJykKICAgICAgICB9CgogICAgICAgICRFeHRyYU9wdGlvbnMgPSBAe30KCiAgICAgICAgaWYgKCRVcGRhdGVFbmFibGVkKSB7CiAgICAgICAgICAgICRFeHRyYU9wdGlvbnMgKz0gQHsnVXBkYXRlRW5hYmxlZCcgPSAkdHJ1ZX0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRFeHRyYU9wdGlvbnMgKz0gQHsnVXBkYXRlRW5hYmxlZCcgPSAkZmFsc2V9CiAgICAgICAgfQoKICAgICAgICBOZXctU1FMU2VydmVyRm9yQU9BRyBgCiAgICAgICAgICAgIC1TZXR1cFJvb3QgJFNldHVwUm9vdCBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JEb21haW4gJFNRTFNlcnZpY2VVc2VyRG9tYWluIGAKICAgICAgICAgICAgLVNRTFN2Y1Vzck5hbWUgJFNRTFNlcnZpY2VVc2VyTmFtZSBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JQYXNzd29yZCAkU1FMU2VydmljZVVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgIC1FeHRyYU9wdGlvbnMgJEV4dHJhT3B0aW9ucwogICAgfQp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbkFkbWluQWNjb3VudE5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbkFkbWluQWNjb3VudFBhc3N3b3JkLAogICAgICAgIFtTdHJpbmddICRTcWxTZXJ2aWNlQWNjb3VudE5hbWUsCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAogICAgICAgIFtTdHJpbmddICRTaGFyZU5hbWUgPSAnU2hhcmVkV29ya0RpcicKICAgICkKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICAkU2hhcmVOZXR3b3JrUGF0aCA9ICdcXCcgKyAkUHJpbWFyeU5vZGUgKyAnXCcgKyAkU2hhcmVOYW1lCgogICAgICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAgICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluQWRtaW5BY2NvdW50TmFtZSIgYAogICAgICAgICAgICAtUGFzc3dvcmQgIiREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBzY3JpcHQgcnVucyBvbiBwcmltYXJ5IG5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZyBzY3JpcHQuIgogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmICgkU2hhcmVOYW1lIC1lcSAnJykgewogICAgICAgICAgICAkU2hhcmVOYW1lID0gW0lPLlBhdGhdOjpHZXRGaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24oJFNoYXJlUGF0aCkKICAgICAgICB9CgogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJTaGFyZVBhdGggPSAnJFNoYXJlUGF0aCciCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlTmFtZSA9ICckU2hhcmVOYW1lJyIKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgc2hhcmUgJyRTaGFyZU5hbWUnIgogICAgICAgICAgICAkbnVsbCA9IEdldC1TbWJTaGFyZSAtTmFtZSAkU2hhcmVOYW1lIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICAgICAgUmVtb3ZlLVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUZvcmNlCiAgICAgICAgICAgIHdyaXRlLUxvZyAiU2hhcmUgJyRTaGFyZU5hbWUnIHJlbW92ZWQuIgogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIFdyaXRlLUxvZ1dhcm5pbmcgIlNoYXJlICckU2hhcmVOYW1lJyBub3QgZXhpc3RzIG9yIGNhbm5vdCBiZSBkZWxldGVkLiIKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJUcnlpbmcgdG8gcmVtb3ZlIGZvbGRlciAnJFNoYXJlUGF0aCIKICAgICAgICAgICAgJG51bGwgPSBHZXQtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICAgICAgUmVtb3ZlLUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtUmVjdXJzZSAtRm9yY2UKICAgICAgICAgICAgV3JpdGUtTG9nICJGb2xkZXIgJyRTaGFyZVBhdGgnIHJlbW92ZWQuIgogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIFdyaXRlLUxvZ1dhcm5pbmcgIkZvbGRlciAnJFNoYXJlUGF0aCcgbm90IGV4aXN0cyBvciBjYW5ub3QgYmUgZGVsZXRlZC4iCiAgICAgICAgfQoKICAgICAgICAkbnVsbCA9IE5ldy1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUl0ZW1UeXBlIENvbnRhaW5lciAtRm9yY2UKICAgICAgICAgICAgICAgIAogICAgICAgICRudWxsID0gTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYAogICAgICAgICAgICAtTmFtZSAkU2hhcmVOYW1lIGAKICAgICAgICAgICAgLUZ1bGxBY2Nlc3MgIkV2ZXJ5b25lIiBgCiAgICAgICAgICAgIC1EZXNjcmlwdGlvbiAiU2hhcmVkIGZvbGRlciBmb3IgQWx3YXlzT24gQXZhaWxhYmlsaXR5IEdyb3VwIHNldHVwLiIKCiAgICAgICAgcmV0dXJuICdcXCcgKyAkRW52OkNvbXB1dGVyTmFtZSArICdcJyArICRTaGFyZU5hbWUKICAgIH0KfQoKCgpmdW5jdGlvbiBOZXctRGF0YWJhc2VGb3JBT0FHIHsKICAgIHBhcmFtICgKICAgICAgICBbU3RyaW5nXSAkRGF0YWJhc2VOYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApCgogICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAnSW52b2tlLVNRTFRleHQnLCAnQ29udmVydFRvLVNRTE5hbWUnLCAnQ29udmVydFRvLVNRTFN0cmluZycsICdOZXctU1FMRGF0YWJhc2UnCgogICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tIGZpbGUgJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnTmV3LVNRTERhdGFiYXNlJyAuLi4iCk5ldy1TUUxEYXRhYmFzZSAkRGF0YWJhc2VOYW1lCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoT1BUSU9OQUwpIE5hbWUgb2YgdGhlIG5ldyBBdmFpbGFiaWxpdHkgR3JvdXAuIElmIG5vdCBzcGVjaWZpZWQgdGhlbiBkZWZhdWx0IG5hbWUgd2lsbCBiZSB1c2VkLgogICAgICAgIFtTdHJpbmddICRHcm91cE5hbWUgPSAnTXVyYW5vQUcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZXMgdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgYXMgcmVwbGljYSBwYXJ0bmVycy4KICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKCiAgICAgICAgIyAoUkVRVUlSRUQpIERhdGFiYXNlIGxpc3QgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJERhdGFiYXNlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIExpc3RlbmVyIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgYnkgY2xpZW50cyB0byBjb25uZWN0IHRvIGRhdGFiYXNlcyBpbiB0aGF0IEFHCiAgICAgICAgI1tQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJOYW1lID0gJ011cmFub0FHX0xpc3RlbmVyJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIElQIGFkZHJlc3Mgb2YgdGhlIGxpc3RlbmVyCiAgICAgICAgI1tQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUCwKCiAgICAgICAgW1N0cmluZ10gJExpc3RlbmVySVBNYXNrID0gJzI1NS4yNTUuMjU1LjAnLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJQb3J0ID0gJzUwMjMnLAoKICAgICAgICAjIFN5bmMgTW9kZSBOb2RlIExpc3QKICAgICAgICBbU3RyaW5nW11dICRTeW5jTW9kZU5vZGVMaXN0LAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJENsaVhtbEZpbGUgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICBXcml0ZS1Mb2cgIlByaW1hcnkgbm9kZTogJyQoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSknIgogICAgICAgIFdyaXRlLUxvZyAiQ3VycmVudCBub2RlOiAnJCgoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSknIgoKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgJCgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBQcmltYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZiAoJENsaVhtbEZpbGUgLWVxICcnKSB7CiAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgPSBAKCkKICAgICAgICAgICAgZm9yZWFjaCAoJE5vZGUgaW4gJE5vZGVMaXN0KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICROb2RlRW5kcG9pbnRQb3J0ID0gSW1wb3J0LUNsaVhtbCAtUGF0aCAiXFwkUHJpbWFyeU5vZGVcU2hhcmVkV29ya0RpclwkTm9kZS54bWwiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICJVc2luZyBkZWZhdWx0IGVuZHBvaW50IHBvcnQgNTAyMiIKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IDUwMjIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgICAgICJTRVJWRVJfSU5TVEFOQ0UiID0gIiROb2RlIjsKICAgICAgICAgICAgICAgICAgICAiRU5EUE9JTlRfVVJMIiA9ICJUQ1A6Ly8ke05vZGV9OiR7Tm9kZUVuZHBvaW50UG9ydH0iOwogICAgICAgICAgICAgICAgICAgICJBVkFJTEFCSUxJVFlfTU9ERSIgPSAiQVNZTkNIUk9OT1VTX0NPTU1JVCI7CiAgICAgICAgICAgICAgICAgICAgIkZBSUxPVkVSX01PREUiPSJNQU5VQUwiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkU3luY01vZGVOb2RlTGlzdCAtY29udGFpbnMgJE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIiROb2RlIGlzIGluIFN5bmNNb2RlTm9kZUxpc3QiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydBVkFJTEFCSUxJVFlfTU9ERSddID0gIlNZTkNIUk9OT1VTX0NPTU1JVCIKICAgICAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25bJ0ZBSUxPVkVSX01PREUnXSA9ICJBVVRPTUFUSUMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIiROb2RlIGlzIE5PVCBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgKz0gQCgkUmVwbGljYURlZmluaXRpb24pCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQcmVmZXJlbmNlcyA9IEB7fQoKICAgICAgICAgICAgJExpc3RlbmVyRGVmaW5pdGlvbiA9IEB7CiAgICAgICAgICAgICAgICAiTkFNRSI9JExpc3RlbmVyTmFtZTsKICAgICAgICAgICAgICAgICJQT1JUIiA9ICIkTGlzdGVuZXJQb3J0IjsKICAgICAgICAgICAgICAgICJTVEFUSUMiID0gIiRMaXN0ZW5lcklQLyRMaXN0ZW5lcklQTWFzayIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFtZXRlcnMgPSBAewogICAgICAgICAgICAgICAgJ1dvcmtEaXInID0gIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIjsKICAgICAgICAgICAgICAgICdOYW1lJyA9ICRHcm91cE5hbWU7CiAgICAgICAgICAgICAgICAnRGF0YWJhc2VOYW1lcycgPSAkRGF0YWJhc2VMaXN0OwogICAgICAgICAgICAgICAgJ1JlcGxpY2FEZWZzJyA9ICRSZXBsaWNhRGVmaW5pdGlvbkxpc3Q7CiAgICAgICAgICAgICAgICAnUHJlZmVyZW5jZXMnID0gJFByZWZlcmVuY2VzOwogICAgICAgICAgICAgICAgJ0xpc3RlbmVyRGVmJyA9ICRMaXN0ZW5lckRlZmluaXRpb247CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFJlbW92ZS1JdGVtIC1QYXRoICJcXCRQcmltYXJ5Tm9kZVxTaGFyZWRXb3JrRGlyXCoiIC1Gb3JjZQoKICAgICAgICAgICAgJENsaVhtbEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCgogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiQ2xpWG1sIGZpbGU6ICckQ2xpWG1sRmlsZSciCgogICAgICAgICAgICBFeHBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlIC1JbnB1dE9iamVjdCAkUGFyYW1ldGVycyAtRGVwdGggMTAKCiAgICAgICAgICAgIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIGAKICAgICAgICAgICAgICAgIC1DbGlYbWxGaWxlICRDbGlYbWxGaWxlIGAKICAgICAgICAgICAgICAgIC1Eb21haW5OYW1lICREb21haW5OYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyTmFtZSAkVXNlck5hbWUgYAogICAgICAgICAgICAgICAgLVVzZXJQYXNzd29yZCAkVXNlclBhc3N3b3JkIGAKICAgICAgICAgICAgICAgIC1QcmltYXJ5Tm9kZSAkUHJpbWFyeU5vZGUKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJFVzZXJOYW1lIiAtUGFzc3dvcmQgIiRVc2VyUGFzc3dvcmQiCgogICAgICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJJbXBvcnRpbmcgQ2xpWG1sIHBhcmFtZXRlcnMgZmlsZSAuLi4iCmAkUGFyYW1ldGVycyA9IEltcG9ydC1DbGlYbWwgLVBhdGggJENsaVhtbEZpbGUKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIGBgCiAgICAtV29ya0RpciBgJFBhcmFtZXRlcnNbJ1dvcmtEaXInXSBgYAogICAgLU5hbWUgYCRQYXJhbWV0ZXJzWydOYW1lJ10gYGAKICAgIC1EYXRhYmFzZU5hbWVzIGAkUGFyYW1ldGVyc1snRGF0YWJhc2VOYW1lcyddIGBgCiAgICAtUmVwbGljYURlZnMgYCRQYXJhbWV0ZXJzWydSZXBsaWNhRGVmcyddIGBgCiAgICAtUHJlZmVyZW5jZXMgYCRQYXJhbWV0ZXJzWydQcmVmZXJlbmNlcyddIGBgCiAgICAtTGlzdGVuZXJEZWYgYCRQYXJhbWV0ZXJzWydMaXN0ZW5lckRlZiddCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BT0FHU2Vjb25kYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFzIHJlcGxpY2EgcGFydG5lcnMuCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkgCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYScgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cFJlcGxpY2EgLVdvcmtEaXIgIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIgoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICB9Cn0KCgoKZnVuY3Rpb24gRGlzYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9mZgogICAgfQp9CgoKCmZ1bmN0aW9uIEVuYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9uCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLVRydXN0ZWRIb3N0cyB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgU2V0LUl0ZW0gV1NNYW46XGxvY2FsaG9zdFxDbGllbnRcVHJ1c3RlZEhvc3RzIC1WYWx1ZSAnKicgLUZvcmNlCiAgICB9Cn0K", + "CmZ1bmN0aW9uIE5ldy1TcWxTZXJ2ZXJTeXN0ZW1BY2NvdW50IHsKICAgIHBhcmFtICgKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIE5hbWUKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgd2hvIGhhcyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgYW5kIG1vZGlmeSB1c2VyUGFzc3dvcmQKICAgICAgICAjIFVzdWFsbHkgdGhpcyBpcyB0aGUgZG9tYWluIGFkbWluaXN0cmF0b3IgJyRkb21haW5OYW1lXEFkbWluaXN0cmF0b3InIGFjY291bnQKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAoKICAgICAgICAjIChSRVFVSVJFRCkgUGFzc3dvcmQgZm9yIHRoYXQgdXNlcgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLAoKICAgICAgICAjIChSRVFVSVJFRCkgVXNlciBuYW1lIGZvciBhIG5ldyBhY2NvdW50IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJ1biBTUUwgU2VydmVyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlclBhc3N3b3JkLAoKICAgICAgICBbU3RyaW5nXSAkUHJpbWFyeU5vZGUgPSAnICcKICAgICkKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUSGlzIGZ1bmN0aW9uIHJ1bnMgb24gQU9BRyBwcmltYXJ5IG5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJJbnN0YWxsaW5nICdSU0FULUFELVBvd2VyU2hlbGwnIC4uLiAiCiAgICAgICAgQWRkLVdpbmRvd3NGZWF0dXJlIFJTQVQtQUQtUG93ZXJTaGVsbAoKICAgICAgICBJbXBvcnQtTW9kdWxlIEFjdGl2ZURpcmVjdG9yeQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICBXcml0ZS1Mb2cgIkFkZGluZyBuZXcgdXNlciAuLi4iCiAgICAgICAgJG51bGwgPSBOZXctQURVc2VyIGAKICAgICAgICAgICAgLU5hbWUgJFNRTFNlcnZpY2VVc2VyTmFtZSBgCiAgICAgICAgICAgIC1BY2NvdW50UGFzc3dvcmQgJChDb252ZXJ0VG8tU2VjdXJlU3RyaW5nIC1TdHJpbmcgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgLUFzUGxhaW5UZXh0IC1Gb3JjZSkgYAogICAgICAgICAgICAtQ3JlZGVudGlhbCAkQ3JlZHMgYAogICAgICAgICAgICAtRXJyb3JBY3Rpb24gJ1N0b3AnCiAgICB9Cn0K" ] } \ No newline at end of file diff --git a/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/FailoverCluster.yaml.json b/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/FailoverCluster.yaml.json index 019404fe..fa09d22f 100644 --- a/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/FailoverCluster.yaml.json +++ b/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/FailoverCluster.yaml.json @@ -24,9 +24,9 @@ ], "RebootOnCompletion": 0, "Scripts": [ - "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKZnVuY3Rpb24gU2hvdy1JbnZvY2F0aW9uSW5mbyB7CiAgICBwYXJhbSAoCiAgICAgICAgJEludm9jYXRpb24sCiAgICAgICAgW1N3aXRjaF0gJEVuZAogICAgKQoKICAgIGlmICgkRW5kKSB7CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgIH0KICAgIGVsc2UgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8ZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPHBhcmFtPiIKICAgICAgICBmb3JlYWNoICgkUGFyYW1ldGVyIGluICRJbnZvY2F0aW9uLk15Q29tbWFuZC5QYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRLZXkgaW4gJFBhcmFtZXRlci5LZXlzKSB7CiAgICAgICAgICAgICAgICAkVHlwZSA9ICRQYXJhbWV0ZXJbJEtleV0uUGFyYW1ldGVyVHlwZS5GdWxsTmFtZQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJFZhbHVlIGluICRJbnZvY2F0aW9uLkJvdW5kUGFyYW1ldGVyc1skS2V5XSkgewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJbJFR5cGVdICRLZXkgPSAnJFZhbHVlJyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPC9wYXJhbT4iCiAgICB9Cn0KCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", - "CmZ1bmN0aW9uIE5ldy1TcWxTZXJ2ZXJTeXN0ZW1BY2NvdW50IHsKICAgIHBhcmFtICgKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIE5hbWUKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgd2hvIGhhcyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgYW5kIG1vZGlmeSB1c2VyUGFzc3dvcmQKICAgICAgICAjIFVzdWFsbHkgdGhpcyBpcyB0aGUgZG9tYWluIGFkbWluaXN0cmF0b3IgJyRkb21haW5OYW1lXEFkbWluaXN0cmF0b3InIGFjY291bnQKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAoKICAgICAgICAjIChSRVFVSVJFRCkgUGFzc3dvcmQgZm9yIHRoYXQgdXNlcgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLAoKICAgICAgICAjIChSRVFVSVJFRCkgVXNlciBuYW1lIGZvciBhIG5ldyBhY2NvdW50IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJ1biBTUUwgU2VydmVyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlclBhc3N3b3JkLAoKICAgICAgICBbU3RyaW5nXSAkUHJpbWFyeU5vZGUgPSAnICcKICAgICkKCiAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICBXcml0ZS1Mb2cgIlRIaXMgZnVuY3Rpb24gcnVucyBvbiBBT0FHIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICBXcml0ZS1Mb2cgIkV4aXRpbmcuIgogICAgICAgIHJldHVybgogICAgfQoKICAgIFdyaXRlLUxvZyAiSW5zdGFsbGluZyAnUlNBVC1BRC1Qb3dlclNoZWxsJyAuLi4gIgogICAgQWRkLVdpbmRvd3NGZWF0dXJlIFJTQVQtQUQtUG93ZXJTaGVsbAoKICAgIEltcG9ydC1Nb2R1bGUgQWN0aXZlRGlyZWN0b3J5CgogICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICBXcml0ZS1Mb2cgIkFkZGluZyBuZXcgdXNlciAuLi4iCiAgICAkbnVsbCA9IE5ldy1BRFVzZXIgYAogICAgICAgIC1OYW1lICRTUUxTZXJ2aWNlVXNlck5hbWUgYAogICAgICAgIC1BY2NvdW50UGFzc3dvcmQgJChDb252ZXJ0VG8tU2VjdXJlU3RyaW5nIC1TdHJpbmcgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgLUFzUGxhaW5UZXh0IC1Gb3JjZSkgYAogICAgICAgIC1DcmVkZW50aWFsICRDcmVkcyBgCiAgICAgICAgLUVycm9yQWN0aW9uICdTdG9wJwp9Cg==", - "CmZ1bmN0aW9uIFNlbGVjdC1DbGlYbWxCbG9jayB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFBhdGgsCiAgICAgICAgW1N0cmluZ10gJE91dEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICApCgogICAgJFRhZ0ZvdW5kID0gJGZhbHNlCiAgICBHZXQtQ29udGVudCAkUGF0aCB8CiAgICAgICAgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICBpZiAoJF8gLWVxICcjPCBDTElYTUwnKSB7CiAgICAgICAgICAgICAgICAkVGFnRm91bmQgPSAkdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkVGFnRm91bmQpIHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRPdXRGaWxlIC1WYWx1ZSAkXwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgJE91dEZpbGUKfQoKCgpmdW5jdGlvbiBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJENvbW1hbmQsCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbCwKICAgICAgICBbU3dpdGNoXSAkSWdub3JlU3RkRXJyLAogICAgICAgIFtTd2l0Y2hdICROb0Jhc2U2NAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgJFN0ZE91dCA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICAgICAkU3RkRXJyID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAkQXJndW1lbnRMaXN0ID0gQCgnLU91dHB1dEZvcm1hdCcsICdYTUwnKQoKICAgICAgICBpZiAoJE5vQmFzZTY0KSB7CiAgICAgICAgICAgICRUbXBTY3JpcHQgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAgICAgICAgIFJlbmFtZS1JdGVtIC1QYXRoICIkVG1wU2NyaXB0IiAtTmV3TmFtZSAiJFRtcFNjcmlwdC5wczEiIC1Gb3JjZQogICAgICAgICAgICAkVG1wU2NyaXB0ID0gIiRUbXBTY3JpcHQucHMxIgoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgJFRtcFNjcmlwdAoKICAgICAgICAgICAgJENvbW1hbmQgfCBPdXQtRmlsZSAkVG1wU2NyaXB0CgogICAgICAgICAgICAkQXJndW1lbnRMaXN0ICs9IEAoJy1GaWxlJywgIiRUbXBTY3JpcHQiKQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEJ5dGVzID0gW1RleHQuRW5jb2RpbmddOjpVbmljb2RlLkdldEJ5dGVzKCRDb21tYW5kKQogICAgICAgICAgICAkRW5jb2RlZENvbW1hbmQgPSBbQ29udmVydF06OlRvQmFzZTY0U3RyaW5nKCRCeXRlcykKICAgICAgICAgICAgCiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICRFbmNvZGVkQ29tbWFuZAoKICAgICAgICAgICAgJEFyZ3VtZW50TGlzdCArPSBAKCctRW5jb2RlZENvbW1hbmQnLCAkRW5jb2RlZENvbW1hbmQpCiAgICAgICAgfQoKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAkQXJndW1lbnRMaXN0CgogICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgZXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIC4uLiIKCiAgICAgICAgaWYgKCRDcmVkZW50aWFsIC1lcSAkbnVsbCkgewogICAgICAgICAgICAkUHJvY2VzcyA9IFN0YXJ0LVByb2Nlc3MgLUZpbGVQYXRoICdwb3dlcnNoZWxsLmV4ZScgYAogICAgICAgICAgICAgICAgLUFyZ3VtZW50TGlzdCBAKCRBcmd1bWVudExpc3QpIGAKICAgICAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ICRTdGRPdXQgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRFcnJvciAkU3RkRXJyIGAKICAgICAgICAgICAgICAgIC1Ob05ld1dpbmRvdyBgCiAgICAgICAgICAgICAgICAtV2FpdCBgCiAgICAgICAgICAgICAgICAtUGFzc1RocnUKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQcm9jZXNzID0gU3RhcnQtUHJvY2VzcyAtRmlsZVBhdGggJ3Bvd2Vyc2hlbGwuZXhlJyBgCiAgICAgICAgICAgICAgICAtQXJndW1lbnRMaXN0IEAoJEFyZ3VtZW50TGlzdCkgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRPdXRwdXQgJFN0ZE91dCBgCiAgICAgICAgICAgICAgICAtUmVkaXJlY3RTdGFuZGFyZEVycm9yICRTdGRFcnIgYAogICAgICAgICAgICAgICAgLUNyZWRlbnRpYWwgJENyZWRlbnRpYWwgYAogICAgICAgICAgICAgICAgLU5vTmV3V2luZG93IGAKICAgICAgICAgICAgICAgIC1XYWl0IGAKICAgICAgICAgICAgICAgIC1QYXNzVGhydQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeHRlcm5hbCBQb3dlclNoZWxsIHByb2Nlc3MgZXhpdGVkIHdpdGggZXhpdCBjb2RlICckKCRQcm9jZXNzLkV4aXRDb2RlKScuIgoKICAgICAgICAjaWYgKCRBcmd1bWVudExpc3QgLWNvbnRhaW5zICctRmlsZScpIHsKICAgICAgICAjICAgIFJlbW92ZS1JdGVtIC1QYXRoICRUbXBTY3JpcHQgLUZvcmNlCiAgICAgICAgI30KCiAgICAgICAgJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZQogICAgICAgICRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU2lsZW50bHlDb250aW51ZScKCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlN0ZE91dCBmaWxlIGlzICckU3RkT3V0JyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU3RkRXJyIGZpbGUgaXMgJyRTdGRFcnInIgoKICAgICAgICBpZiAoKEdldC1JdGVtICRTdGRPdXQpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkxvYWRpbmcgU3RkT3V0IGZyb20gJyRTdGRPdXQnIgogICAgICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZE91dAogICAgICAgICAgICAgICAgJFN0ZE91dE9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8U3RkT3V0PiIKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICgkU3RkT3V0T2JqZWN0KQogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkT3V0PiIKICAgICAgICAgICAgICAgICRTdGRPdXRPYmplY3QKICAgICAgICAgICAgICAgICNSZW1vdmUtSXRlbSAtUGF0aCAkVG1wRmlsZSAtRm9yY2UKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBsb2FkaW5nIFN0ZE91dCBmcm9tICckVG1wRmlsZSciCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgoR2V0LUl0ZW0gJFN0ZEVycikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiTG9hZGluZyBTdGRFcnIgLi4uIgogICAgICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZEVycgogICAgICAgICAgICAgICAgJFN0ZEVyck9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8U3RkRXJyPiIKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICgkU3RkRXJyT2JqZWN0KQogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkRXJyPiIKICAgICAgICAgICAgICAgIGlmICgtbm90ICRJZ25vcmVTdGRFcnIpIHsKICAgICAgICAgICAgICAgICAgICAkU3RkRXJyT2JqZWN0CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjUmVtb3ZlLUl0ZW0gLVBhdGggJFRtcEZpbGUgLUZvcmNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgbG9hZGluZyBTdGRFcnIgZnJvbSAnJFRtcEZpbGUnIgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkCgogICAgICAgIGlmICgkUHJvY2Vzcy5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICB0aHJvdygiRXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJyQoJFByb2Nlc3MuRXhpdENvZGUpJyIpCiAgICAgICAgfQoKICAgICAgICAjUmVtb3ZlLUl0ZW0gJFN0ZE91dCAtRm9yY2UKICAgICAgICAjUmVtb3ZlLUl0ZW0gJFN0ZEVyciAtRm9yY2UKICAgIH0KfQo=", - "PCMNCi5ERVNDUklQVElPTg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIElucHV0IERhdGEgKGZyb20gdGhlIFVJKQ0KDQoqIERvbWFpbiBNZW1iZXJzaGlwDQogICAgLSBbU3RyaW5nXSAvIFtTZWxlY3QgYm94XSAkRG9tYWluTmFtZSAtIERvbWFpbiBuYW1lDQoqIERvbWFpbiBVc2VyIENyZWRlbnRpYWxzDQogICAgLSBbU3RyaW5nXSAkVXNlck5hbWUgLSBVc2VybmFtZQ0KICAgIC0gW1Bhc3N3b3JkIHN0cmluZ10gJFVzZXJQYXNzd29yZCAtIFVzZXIgcGFzc3dvcmQNCiogU2hhcmVkIEZvbGRlciBJbmZvcm1hdGlvbg0KICAgIC0gW1N0cmluZ10gJFNoYXJlU2VydmVyIC0gU2VydmVyIHdoaWNoIHdpbGwgaG9zdCB0aGUgZm9sZGVyDQogICAgLSBbU3RyaW5nXSAkU2hhcmVOYW1lIC0gU2hhcmUgbmFtZQ0KICAgIC0gW1N0cmluZ10gJFNoYXJlUGF0aCAtIFNoYXJlZCBmb2xkZXIgaW50ZXJuYWwgcGF0aA0KKiBGYWlsb3ZlciBDbHVzdGVyIE1lbWJlcnMNCiAgICAtIFtTdHJpbmddICRDbHVzdGVyTmFtZSAtIENsdXN0ZXIgbmFtZQ0KICAgIC0gW1N0cmluZ10gJENsdXN0ZXJJUCAtIFN0YXRpYyBJUCBhZGRyZXNzIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgY2x1c3Rlcg0KICAgIC0gW1N0cmluZ1tdXSAkQ2x1c3Rlck5vZGVzIC0gTGlzdCBvZiBub2RlIG5hbWVzDQoNCg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIGNyZWF0aW9uIHdvcmtmbG93DQoNCiogQ3JlYXRlIEFEIGRvbWFpbg0KKiBKb2luIGFsbCB0aGUgVk1zIHRvIHRoYXQgZG9tYWluDQoqIFByZXBhcmUgbm9kZXMNCiAgICAtIEluc3RhbGwgRmFpbG92ZXIgQ2x1c3RlciBwcmVyZXF1aXNpdGVzIG9uIGFsbCBGQyBub2Rlcw0KKiBDcmVhdGUgZmFpbG92ZXIgY2x1c3Rlcg0KICAgIC0gQ3JlYXRlIG5ldyBjbHVzdGVyDQogICAgLSBBZGQgbWVtYmVycw0KKiBDb25mdWd1cmUgRkMgcXVvcnVtDQogICAgLSBDcmVhdGUgbmV3IGZvbGRlciB0aGF0IHdpbGwgYmUgc2hhcmVkDQogICAgLSBTaGFyZSB0aGF0IGZvbGRlciB3aXRoIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zDQogICAgLSBDb25maWd1cmUgcXVvcnVtIG1vZGUNCg0KDQoNCiMjIEhlbHBmdWwgU21iU2hhcmUqIEZ1bmN0aW9ucw0KDQoqIE5ldy1TbWJTaGFyZQ0KKiBHcmFudC1TbWJTaGFyZUFjY2Vzcw0KDQojPg0KDQoNCg0KZnVuY3Rpb24gSW5zdGFsbC1GYWlsb3ZlckNsdXN0ZXJQcmVyZXF1aXNpdGVzIHsNCiAgICBJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCg0KICAgIEFkZC1XaW5kb3dzRmVhdHVyZSBGYWlsb3Zlci1DbHVzdGVyaW5nLCBSU0FULUNsdXN0ZXJpbmctUG93ZXJTaGVsbA0KfQ0KDQoNCg0KZnVuY3Rpb24gTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciB7DQoJcGFyYW0gKA0KICAgICAgICBbU3RyaW5nXSAkQ2x1c3Rlck5hbWUsDQogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLA0KICAgICAgICBbU3RyaW5nXSAkU2hhcmVTZXJ2ZXIsDQoJCVtTdHJpbmddICRTaGFyZVBhdGggPSAkKCRFbnY6U3lzdGVtRHJpdmUgKyAnXEZDU2hhcmUnKSwNCgkJW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdGQ1NoYXJlJywNCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLA0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLA0KICAgICAgICAkQ3JlZGVudGlhbCA9ICRudWxsDQoJKQ0KICAgIGJlZ2luIHsNCiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uDQogICAgfQ0KICAgIGVuZCB7DQogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kDQogICAgfQ0KICAgIHByb2Nlc3Mgew0KICAgICAgICB0cmFwIHsNCiAgICAgICAgICAgIFdyaXRlLUxvZ0Vycm9yICRfIC1FbnRpcmVPYmplY3QNCiAgICAgICAgICAgIGJyZWFrDQogICAgICAgIH0NCg0KICAgICAgICAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJ1N0b3AnDQoNCiAgICAgICAgV3JpdGUtTG9nICItLT4gTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciINCg0KICAgICAgICBXcml0ZS1Mb2cgIkNyZWF0aW5nIHNoYXJlZCBmb2xkZXIgZm9yIEZhaWxvdmVyIENsdXN0ZXIgLi4uIg0KICAgICAgICANCiAgICAgICAgaWYgKCRDcmVkZW50aWFsIC1lcSAkbnVsbCkgew0KICAgICAgICAgICAgJENyZWRlbnRpYWwgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIg0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKChUZXN0LUNvbm5lY3Rpb24gLUNvbXB1dGVyTmFtZSAkU2hhcmVTZXJ2ZXIgLUNvdW50IDEgLVF1aWV0KSAtZXEgJGZhbHNlKSB7DQogICAgICAgICAgICB0aHJvdygiU2VydmVyICckU2hhcmVTZXJ2ZXInIGlzIHVucmVhY2hhYmxlIHZpYSBJQ01QLiIpDQogICAgICAgIH0NCg0KICAgICAgICAkU2Vzc2lvbiA9IE5ldy1QU1Nlc3Npb24gLUNvbXB1dGVyTmFtZSAkU2hhcmVTZXJ2ZXIgLUNyZWRlbnRpYWwgJENyZWRlbnRpYWwNCg0KICAgICAgICBXcml0ZS1Mb2cgIkNyZWF0aW5nIGZvbGRlciBvbiAnJFNoYXJlU2VydmVyJyAuLi4iDQogICAgICAgIEludm9rZS1Db21tYW5kIC1TZXNzaW9uICRTZXNzaW9uIC1TY3JpcHRCbG9jayB7DQogICAgICAgICAgICAgICAgcGFyYW0gKA0KICAgICAgICAgICAgICAgICAgICBbU3RyaW5nXSAkU2hhcmVQYXRoLA0KICAgICAgICAgICAgICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lLA0KICAgICAgICAgICAgICAgICAgICBbU3RyaW5nXSAkQ2x1c3RlckFjY291bnQNCiAgICAgICAgICAgICAgICApDQoNCiAgICAgICAgICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UgLUVycm9yQWN0aW9uICdTaWxlbnRseUNvbnRpbnVlJw0KICAgICAgICAgICAgICAgIFJlbW92ZS1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUZvcmNlIC1FcnJvckFjdGlvbiAnU2lsZW50bHlDb250aW51ZScNCg0KICAgICAgICAgICAgICAgIE5ldy1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUl0ZW1UeXBlIENvbnRhaW5lciAtRm9yY2UNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBOZXctU21iU2hhcmUgLVBhdGggJFNoYXJlUGF0aCBgDQogICAgICAgICAgICAgICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYA0KICAgICAgICAgICAgICAgICAgICAtRnVsbEFjY2VzcyAiJENsdXN0ZXJBY2NvdW50IiBgDQogICAgICAgICAgICAgICAgICAgIC1EZXNjcmlwdGlvbiAiU2hhcmVkIGZvbGRlciBmb3IgRmFpbG92ZXIgQ2x1c3Rlci4iDQoNCiAgICAgICAgICAgIH0gLUFyZ3VtZW50TGlzdCAkU2hhcmVQYXRoLCAkU2hhcmVOYW1lLCAiJERvbWFpbk5hbWVcJENsdXN0ZXJOYW1lYCQiDQoNCiAgICAgICAgV3JpdGUtTG9nICJDb25mZ3VyaW5nIEZhaWxvdmVyIENsdXN0ZXIgdG8gdXNlIHNoYXJlZCBmb2xkZXIgYXMgcW91cnVtIHJlc291cnNlIC4uLiINCg0KICAgICAgICAkbnVsbCA9IFNldC1DbHVzdGVyUXVvcnVtIC1Ob2RlQW5kRmlsZVNoYXJlTWFqb3JpdHkgIlxcJFNoYXJlU2VydmVyXCRTaGFyZU5hbWUiDQoNCiAgICAgICAgV3JpdGUtTG9nICI8LS0gTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciINCiAgICB9DQp9DQoNCg0KDQpmdW5jdGlvbiBOZXctRmFpbG92ZXJDbHVzdGVyIHsNCglwYXJhbSAoDQogICAgICAgIFtTdHJpbmddICRDbHVzdGVyTmFtZSwNCiAgICAgICAgW1N0cmluZ10gJFN0YXRpY0FkZHJlc3MsDQogICAgICAgIFtTdHJpbmdbXV0gJENsdXN0ZXJOb2RlcywNCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsDQogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwNCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZCwNCiAgICAgICAgJENyZWRlbnRpYWwNCiAgICApDQogICAgYmVnaW4gew0KICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24NCiAgICB9DQogICAgZW5kIHsNCiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQNCiAgICB9DQogICAgcHJvY2VzcyB7DQogICAgICAgIHRyYXAgew0KICAgICAgICAgICAgV3JpdGUtTG9nRXJyb3IgJF8gLUVudGlyZU9iamVjdA0KICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICdTdG9wJw0KDQogICAgICAgIFdyaXRlLUxvZyAiQ2x1c3Rlck5vZGVzOiAkKCRDbHVzdGVyTm9kZXMgLWpvaW4gJywgJykiDQoNCiAgICAgICAgaWYgKCRDcmVkZW50aWFsIC1lcSAkbnVsbCkgew0KICAgICAgICAgICAgJENyZWRlbnRpYWwgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIg0KICAgICAgICB9DQoNCiAgICAgICAgSW1wb3J0LU1vZHVsZSBGYWlsb3ZlckNsdXN0ZXJzDQoNCiAgICAJaWYgKChHZXQtQ2x1c3RlciAkQ2x1c3Rlck5hbWUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUpIC1lcSAkbnVsbCkgew0KICAgICAgICAgICAgV3JpdGUtTG9nICJDcmVhdGluZyBuZXcgY2x1c3RlciAnJENsdXN0ZXJOYW1lJyAuLi4iDQogICAgICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyAtQ29tbWFuZCBAIg0KSW1wb3J0LU1vZHVsZSBGYWlsb3ZlckNsdXN0ZXJzDQpOZXctQ2x1c3RlciAtTmFtZSAnJENsdXN0ZXJOYW1lJyAtU3RhdGljQWRkcmVzcyAnJFN0YXRpY0FkZHJlc3MnDQoiQCAtQ3JlZGVudGlhbCAkQ3JlZGVudGlhbCAtTm9CYXNlNjQNCiAgICAgICAgICAgIFN0YXJ0LVNsZWVwIC1TZWNvbmRzIDE1DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBXcml0ZS1Mb2cgIkNsdXN0ZXIgJyRDbHVzdGVyTmFtZScgYWxyZWFkeSBleGlzdHMuIg0KICAgICAgICB9DQoNCiAgICAgICAgZm9yZWFjaCAoJE5vZGUgaW4gJENsdXN0ZXJOb2Rlcykgew0KICAgICAgICAgICAgV3JpdGUtTG9nICJBZGRpbmcgbm9kZSAnJE5vZGUnIHRvIHRoZSBjbHVzdGVyICckQ2x1c3Rlck5hbWUnIC4uLiINCiAgICAgICAgICAgIGlmICgoR2V0LUNsdXN0ZXJOb2RlICROb2RlIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlKSAtZXEgJG51bGwpIHsNCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIkFkZGluZyBub2RlIC4uLiINCiAgICAgICAgICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyAtQ29tbWFuZCBAIg0KSW1wb3J0LU1vZHVsZSBGYWlsb3ZlckNsdXN0ZXJzDQpBZGQtQ2x1c3Rlck5vZGUgLUNsdXN0ZXIgJyRDbHVzdGVyTmFtZScgLU5hbWUgJyROb2RlJw0KIkAgLUNyZWRlbnRpYWwgJENyZWRlbnRpYWwgLU5vQmFzZTY0DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIk5vZGUgJyROb2RlJyBhbHJlYWR5IGEgcGFydCBvZiB0aGUgY2x1c3RlciAnJENsdXN0ZXJOYW1lJy4iDQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCg0KDQo8Iw0KDQojIEV4YW1wbGUNCg0KJERvbWFpbk5hbWUgPSAnZmMtYWNtZS5sb2NhbCcNCiREb21haW5Vc2VyID0gJ0FkbWluaXN0cmF0b3InDQokRG9tYWluUGFzc3dvcmQgPSAnUEBzc3cwcmQnDQoNCiRDbHVzdGVyTmFtZSA9ICdmYy10ZXN0Jw0KJENsdXN0ZXJJUCA9ICcxMC4yMDAuMC42MCcNCiRDbHVzdGVyTm9kZXMgPSBAKCdmYy1ub2RlLTAxJywnZmMtbm9kZS0wMicsJ2ZjLW5vZGUtMDMnKQ0KDQokU2hhcmVTZXJ2ZXIgPSAnZmMtZGMtMDEnDQokU2hhcmVOYW1lID0gJ0ZDU2hhcmUnDQoNCiRTaGFyZVBhdGggPSAiQzpcJFNoYXJlTmFtZSINCg0KDQoNCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucyAtRm9yY2UNCg0KJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgYA0KICAgIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJERvbWFpblVzZXIiIGANCiAgICAtUGFzc3dvcmQgIiREb21haW5QYXNzd29yZCINCg0KTmV3LUZhaWxvdmVyQ2x1c3RlciBgDQogICAgLUNsdXN0ZXJOYW1lICRDbHVzdGVyTmFtZSBgDQogICAgLVN0YXRpY0FkZHJlc3MgJENsdXN0ZXJJUCBgDQogICAgLUNsdXN0ZXJOb2RlcyAkQ2x1c3Rlck5vZGVzIGANCiAgICAtQ3JlZGVudGlhbCAkQ3JlZHMNCg0KTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciBgDQogICAgLUNsdXN0ZXJOYW1lICRDbHVzdGVyTmFtZSBgDQogICAgLURvbWFpbk5hbWUgJERvbWFpbk5hbWUgYA0KICAgIC1TaGFyZVNlcnZlciAkU2hhcmVTZXJ2ZXIgYA0KICAgIC1TaGFyZVBhdGggIiRTaGFyZVBhdGgiIGANCiAgICAtU2hhcmVOYW1lICIkU2hhcmVOYW1lIiBgDQogICAgLUNyZWRlbnRpYWwgJENyZWRzDQoNCiM+DQo=" + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKCmZ1bmN0aW9uIFNob3ctSW52b2NhdGlvbkluZm8gewogICAgcGFyYW0gKAogICAgICAgICRJbnZvY2F0aW9uLAogICAgICAgIFtTd2l0Y2hdICRFbmQKICAgICkKCiAgICBpZiAoJEVuZCkgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8L2Z1bmN0aW9uIG5hbWU9JyQoJEludm9jYXRpb24uTXlDb21tYW5kLk5hbWUpJz4iCiAgICB9CiAgICBlbHNlIHsKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPGZ1bmN0aW9uIG5hbWU9JyQoJEludm9jYXRpb24uTXlDb21tYW5kLk5hbWUpJz4iCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjxwYXJhbT4iCiAgICAgICAgZm9yZWFjaCAoJFBhcmFtZXRlciBpbiAkSW52b2NhdGlvbi5NeUNvbW1hbmQuUGFyYW1ldGVycykgewogICAgICAgICAgICBmb3JlYWNoICgkS2V5IGluICRQYXJhbWV0ZXIuS2V5cykgewogICAgICAgICAgICAgICAgJFR5cGUgPSAkUGFyYW1ldGVyWyRLZXldLlBhcmFtZXRlclR5cGUuRnVsbE5hbWUKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRWYWx1ZSBpbiAkSW52b2NhdGlvbi5Cb3VuZFBhcmFtZXRlcnNbJEtleV0pIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiWyRUeXBlXSAkS2V5ID0gJyRWYWx1ZSciCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvcGFyYW0+IgogICAgfQp9CgoKJFRyYXBIYW5kbGVyID0gewogICAgV3JpdGUtTG9nRXJyb3IgQCgiPGV4Y2VwdGlvbj4iLCAkXykgLUVudGlyZU9iamVjdAogICAgV3JpdGUtTG9nRXJyb3IgIjwvZXhjZXB0aW9uPiIKICAgIGJyZWFrCn0KCgp0cmFwIHsKICAgICYkVHJhcEhhbmRsZXIKfQoKJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICdTdG9wJwoKCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", + "CmZ1bmN0aW9uIE5ldy1TcWxTZXJ2ZXJTeXN0ZW1BY2NvdW50IHsKICAgIHBhcmFtICgKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIE5hbWUKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgd2hvIGhhcyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgYW5kIG1vZGlmeSB1c2VyUGFzc3dvcmQKICAgICAgICAjIFVzdWFsbHkgdGhpcyBpcyB0aGUgZG9tYWluIGFkbWluaXN0cmF0b3IgJyRkb21haW5OYW1lXEFkbWluaXN0cmF0b3InIGFjY291bnQKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAoKICAgICAgICAjIChSRVFVSVJFRCkgUGFzc3dvcmQgZm9yIHRoYXQgdXNlcgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLAoKICAgICAgICAjIChSRVFVSVJFRCkgVXNlciBuYW1lIGZvciBhIG5ldyBhY2NvdW50IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJ1biBTUUwgU2VydmVyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlclBhc3N3b3JkLAoKICAgICAgICBbU3RyaW5nXSAkUHJpbWFyeU5vZGUgPSAnICcKICAgICkKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUSGlzIGZ1bmN0aW9uIHJ1bnMgb24gQU9BRyBwcmltYXJ5IG5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJJbnN0YWxsaW5nICdSU0FULUFELVBvd2VyU2hlbGwnIC4uLiAiCiAgICAgICAgQWRkLVdpbmRvd3NGZWF0dXJlIFJTQVQtQUQtUG93ZXJTaGVsbAoKICAgICAgICBJbXBvcnQtTW9kdWxlIEFjdGl2ZURpcmVjdG9yeQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICBXcml0ZS1Mb2cgIkFkZGluZyBuZXcgdXNlciAuLi4iCiAgICAgICAgJG51bGwgPSBOZXctQURVc2VyIGAKICAgICAgICAgICAgLU5hbWUgJFNRTFNlcnZpY2VVc2VyTmFtZSBgCiAgICAgICAgICAgIC1BY2NvdW50UGFzc3dvcmQgJChDb252ZXJ0VG8tU2VjdXJlU3RyaW5nIC1TdHJpbmcgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgLUFzUGxhaW5UZXh0IC1Gb3JjZSkgYAogICAgICAgICAgICAtQ3JlZGVudGlhbCAkQ3JlZHMgYAogICAgICAgICAgICAtRXJyb3JBY3Rpb24gJ1N0b3AnCiAgICB9Cn0K", + "CmZ1bmN0aW9uIFNlbGVjdC1DbGlYbWxCbG9jayB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFBhdGgsCiAgICAgICAgW1N0cmluZ10gJE91dEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICApCgogICAgJFRhZ0ZvdW5kID0gJGZhbHNlCiAgICBHZXQtQ29udGVudCAkUGF0aCB8CiAgICAgICAgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICBpZiAoJF8gLWVxICcjPCBDTElYTUwnKSB7CiAgICAgICAgICAgICAgICAkVGFnRm91bmQgPSAkdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkVGFnRm91bmQpIHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRPdXRGaWxlIC1WYWx1ZSAkXwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgJE91dEZpbGUKfQoKCgpmdW5jdGlvbiBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJENvbW1hbmQsCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbCwKICAgICAgICBbU3dpdGNoXSAkSWdub3JlU3RkRXJyLAogICAgICAgIFtTd2l0Y2hdICROb0Jhc2U2NAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgdHJhcCB7CiAgICAgICAgICAgICYkVHJhcEhhbmRsZXIKICAgICAgICB9CgogICAgICAgICRTdGRPdXQgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAgICAgJFN0ZEVyciA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKCiAgICAgICAgJEFyZ3VtZW50TGlzdCA9IEAoJy1PdXRwdXRGb3JtYXQnLCAnWE1MJykKCiAgICAgICAgaWYgKCROb0Jhc2U2NCkgewogICAgICAgICAgICAkVG1wU2NyaXB0ID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQogICAgICAgICAgICBSZW5hbWUtSXRlbSAtUGF0aCAiJFRtcFNjcmlwdCIgLU5ld05hbWUgIiRUbXBTY3JpcHQucHMxIiAtRm9yY2UKICAgICAgICAgICAgJFRtcFNjcmlwdCA9ICIkVG1wU2NyaXB0LnBzMSIKCiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICRUbXBTY3JpcHQKCiAgICAgICAgICAgICRDb21tYW5kIHwgT3V0LUZpbGUgJFRtcFNjcmlwdAoKICAgICAgICAgICAgJEFyZ3VtZW50TGlzdCArPSBAKCctRmlsZScsICIkVG1wU2NyaXB0IikKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRCeXRlcyA9IFtUZXh0LkVuY29kaW5nXTo6VW5pY29kZS5HZXRCeXRlcygkQ29tbWFuZCkKICAgICAgICAgICAgJEVuY29kZWRDb21tYW5kID0gW0NvbnZlcnRdOjpUb0Jhc2U2NFN0cmluZygkQnl0ZXMpCiAgICAgICAgICAgIAogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAkRW5jb2RlZENvbW1hbmQKCiAgICAgICAgICAgICRBcmd1bWVudExpc3QgKz0gQCgnLUVuY29kZWRDb21tYW5kJywgJEVuY29kZWRDb21tYW5kKQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nRGVidWcgJEFyZ3VtZW50TGlzdAoKICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIGV4dGVybmFsIFBvd2VyU2hlbGwgcHJvY2VzcyAuLi4iCgogICAgICAgIGlmICgkQ3JlZGVudGlhbCAtZXEgJG51bGwpIHsKICAgICAgICAgICAgJFByb2Nlc3MgPSBTdGFydC1Qcm9jZXNzIC1GaWxlUGF0aCAncG93ZXJzaGVsbC5leGUnIGAKICAgICAgICAgICAgICAgIC1Bcmd1bWVudExpc3QgQCgkQXJndW1lbnRMaXN0KSBgCiAgICAgICAgICAgICAgICAtUmVkaXJlY3RTdGFuZGFyZE91dHB1dCAkU3RkT3V0IGAKICAgICAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkRXJyb3IgJFN0ZEVyciBgCiAgICAgICAgICAgICAgICAtTm9OZXdXaW5kb3cgYAogICAgICAgICAgICAgICAgLVdhaXQgYAogICAgICAgICAgICAgICAgLVBhc3NUaHJ1CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUHJvY2VzcyA9IFN0YXJ0LVByb2Nlc3MgLUZpbGVQYXRoICdwb3dlcnNoZWxsLmV4ZScgYAogICAgICAgICAgICAgICAgLUFyZ3VtZW50TGlzdCBAKCRBcmd1bWVudExpc3QpIGAKICAgICAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ICRTdGRPdXQgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRFcnJvciAkU3RkRXJyIGAKICAgICAgICAgICAgICAgIC1DcmVkZW50aWFsICRDcmVkZW50aWFsIGAKICAgICAgICAgICAgICAgIC1Ob05ld1dpbmRvdyBgCiAgICAgICAgICAgICAgICAtV2FpdCBgCiAgICAgICAgICAgICAgICAtUGFzc1RocnUKICAgICAgICB9CgogICAgICAgIFdyaXRlLUxvZyAiRXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIGV4aXRlZCB3aXRoIGV4aXQgY29kZSAnJCgkUHJvY2Vzcy5FeGl0Q29kZSknLiIKCiAgICAgICAgI2lmICgkQXJndW1lbnRMaXN0IC1jb250YWlucyAnLUZpbGUnKSB7CiAgICAgICAgIyAgICBSZW1vdmUtSXRlbSAtUGF0aCAkVG1wU2NyaXB0IC1Gb3JjZQogICAgICAgICN9CgogICAgICAgICRFcnJvckFjdGlvblByZWZlcmVuY2VTYXZlZCA9ICRFcnJvckFjdGlvblByZWZlcmVuY2UKICAgICAgICAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJ1NpbGVudGx5Q29udGludWUnCgogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJTdGRPdXQgZmlsZSBpcyAnJFN0ZE91dCciCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlN0ZEVyciBmaWxlIGlzICckU3RkRXJyJyIKCiAgICAgICAgaWYgKChHZXQtSXRlbSAkU3RkT3V0KS5MZW5ndGggLWd0IDApIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJMb2FkaW5nIFN0ZE91dCBmcm9tICckU3RkT3V0JyIKICAgICAgICAgICAgICAgICRUbXBGaWxlID0gU2VsZWN0LUNsaVhtbEJsb2NrICRTdGRPdXQKICAgICAgICAgICAgICAgICRTdGRPdXRPYmplY3QgPSBJbXBvcnQtQ2xpeG1sICRUbXBGaWxlCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPFN0ZE91dD4iCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAoJFN0ZE91dE9iamVjdCkKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8L1N0ZE91dD4iCiAgICAgICAgICAgICAgICAkU3RkT3V0T2JqZWN0CiAgICAgICAgICAgICAgICAjUmVtb3ZlLUl0ZW0gLVBhdGggJFRtcEZpbGUgLUZvcmNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgbG9hZGluZyBTdGRPdXQgZnJvbSAnJFRtcEZpbGUnIgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoKEdldC1JdGVtICRTdGRFcnIpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkxvYWRpbmcgU3RkRXJyIC4uLiIKICAgICAgICAgICAgICAgICRUbXBGaWxlID0gU2VsZWN0LUNsaVhtbEJsb2NrICRTdGRFcnIKICAgICAgICAgICAgICAgICRTdGRFcnJPYmplY3QgPSBJbXBvcnQtQ2xpeG1sICRUbXBGaWxlCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPFN0ZEVycj4iCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAoJFN0ZEVyck9iamVjdCkKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8L1N0ZEVycj4iCiAgICAgICAgICAgICAgICBpZiAoLW5vdCAkSWdub3JlU3RkRXJyKSB7CiAgICAgICAgICAgICAgICAgICAgJFN0ZEVyck9iamVjdAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgI1JlbW92ZS1JdGVtIC1QYXRoICRUbXBGaWxlIC1Gb3JjZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGxvYWRpbmcgU3RkRXJyIGZyb20gJyRUbXBGaWxlJyIKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICRFcnJvckFjdGlvblByZWZlcmVuY2VTYXZlZAoKICAgICAgICBpZiAoJFByb2Nlc3MuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICAgICAgdGhyb3coIkV4dGVybmFsIFBvd2VyU2hlbGwgcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlICckKCRQcm9jZXNzLkV4aXRDb2RlKSciKQogICAgICAgIH0KCiAgICAgICAgI1JlbW92ZS1JdGVtICRTdGRPdXQgLUZvcmNlCiAgICAgICAgI1JlbW92ZS1JdGVtICRTdGRFcnIgLUZvcmNlCiAgICB9Cn0K", + "PCMNCi5ERVNDUklQVElPTg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIElucHV0IERhdGEgKGZyb20gdGhlIFVJKQ0KDQoqIERvbWFpbiBNZW1iZXJzaGlwDQogICAgLSBbU3RyaW5nXSAvIFtTZWxlY3QgYm94XSAkRG9tYWluTmFtZSAtIERvbWFpbiBuYW1lDQoqIERvbWFpbiBVc2VyIENyZWRlbnRpYWxzDQogICAgLSBbU3RyaW5nXSAkVXNlck5hbWUgLSBVc2VybmFtZQ0KICAgIC0gW1Bhc3N3b3JkIHN0cmluZ10gJFVzZXJQYXNzd29yZCAtIFVzZXIgcGFzc3dvcmQNCiogU2hhcmVkIEZvbGRlciBJbmZvcm1hdGlvbg0KICAgIC0gW1N0cmluZ10gJFNoYXJlU2VydmVyIC0gU2VydmVyIHdoaWNoIHdpbGwgaG9zdCB0aGUgZm9sZGVyDQogICAgLSBbU3RyaW5nXSAkU2hhcmVOYW1lIC0gU2hhcmUgbmFtZQ0KICAgIC0gW1N0cmluZ10gJFNoYXJlUGF0aCAtIFNoYXJlZCBmb2xkZXIgaW50ZXJuYWwgcGF0aA0KKiBGYWlsb3ZlciBDbHVzdGVyIE1lbWJlcnMNCiAgICAtIFtTdHJpbmddICRDbHVzdGVyTmFtZSAtIENsdXN0ZXIgbmFtZQ0KICAgIC0gW1N0cmluZ10gJENsdXN0ZXJJUCAtIFN0YXRpYyBJUCBhZGRyZXNzIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgY2x1c3Rlcg0KICAgIC0gW1N0cmluZ1tdXSAkQ2x1c3Rlck5vZGVzIC0gTGlzdCBvZiBub2RlIG5hbWVzDQoNCg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIGNyZWF0aW9uIHdvcmtmbG93DQoNCiogQ3JlYXRlIEFEIGRvbWFpbg0KKiBKb2luIGFsbCB0aGUgVk1zIHRvIHRoYXQgZG9tYWluDQoqIFByZXBhcmUgbm9kZXMNCiAgICAtIEluc3RhbGwgRmFpbG92ZXIgQ2x1c3RlciBwcmVyZXF1aXNpdGVzIG9uIGFsbCBGQyBub2Rlcw0KKiBDcmVhdGUgZmFpbG92ZXIgY2x1c3Rlcg0KICAgIC0gQ3JlYXRlIG5ldyBjbHVzdGVyDQogICAgLSBBZGQgbWVtYmVycw0KKiBDb25mdWd1cmUgRkMgcXVvcnVtDQogICAgLSBDcmVhdGUgbmV3IGZvbGRlciB0aGF0IHdpbGwgYmUgc2hhcmVkDQogICAgLSBTaGFyZSB0aGF0IGZvbGRlciB3aXRoIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zDQogICAgLSBDb25maWd1cmUgcXVvcnVtIG1vZGUNCg0KDQoNCiMjIEhlbHBmdWwgU21iU2hhcmUqIEZ1bmN0aW9ucw0KDQoqIE5ldy1TbWJTaGFyZQ0KKiBHcmFudC1TbWJTaGFyZUFjY2Vzcw0KDQojPg0KDQoNCg0KZnVuY3Rpb24gSW5zdGFsbC1GYWlsb3ZlckNsdXN0ZXJQcmVyZXF1aXNpdGVzIHsNCiAgICBJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCg0KICAgIEFkZC1XaW5kb3dzRmVhdHVyZSBGYWlsb3Zlci1DbHVzdGVyaW5nLCBSU0FULUNsdXN0ZXJpbmctUG93ZXJTaGVsbA0KfQ0KDQoNCg0KZnVuY3Rpb24gTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciB7DQoJcGFyYW0gKA0KICAgICAgICBbU3RyaW5nXSAkQ2x1c3Rlck5hbWUsDQogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLA0KICAgICAgICBbU3RyaW5nXSAkU2hhcmVTZXJ2ZXIsDQoJCVtTdHJpbmddICRTaGFyZVBhdGggPSAkKCRFbnY6U3lzdGVtRHJpdmUgKyAnXEZDU2hhcmUnKSwNCgkJW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdGQ1NoYXJlJywNCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLA0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLA0KICAgICAgICAkQ3JlZGVudGlhbCA9ICRudWxsDQoJKQ0KICAgIGJlZ2luIHsNCiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uDQogICAgfQ0KICAgIGVuZCB7DQogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kDQogICAgfQ0KICAgIHByb2Nlc3Mgew0KICAgICAgICB0cmFwIHsNCiAgICAgICAgICAgICYkVHJhcEhhbmRsZXINCiAgICAgICAgfQ0KDQogICAgICAgIFdyaXRlLUxvZyAiLS0+IE5ldy1GYWlsb3ZlckNsdXN0ZXJTaGFyZWRGb2xkZXIiDQoNCiAgICAgICAgV3JpdGUtTG9nICJDcmVhdGluZyBzaGFyZWQgZm9sZGVyIGZvciBGYWlsb3ZlciBDbHVzdGVyIC4uLiINCiAgICAgICAgDQogICAgICAgIGlmICgkQ3JlZGVudGlhbCAtZXEgJG51bGwpIHsNCiAgICAgICAgICAgICRDcmVkZW50aWFsID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCINCiAgICAgICAgfQ0KDQogICAgICAgIGlmICgoVGVzdC1Db25uZWN0aW9uIC1Db21wdXRlck5hbWUgJFNoYXJlU2VydmVyIC1Db3VudCAxIC1RdWlldCkgLWVxICRmYWxzZSkgew0KICAgICAgICAgICAgdGhyb3coIlNlcnZlciAnJFNoYXJlU2VydmVyJyBpcyB1bnJlYWNoYWJsZSB2aWEgSUNNUC4iKQ0KICAgICAgICB9DQoNCiAgICAgICAgJFNlc3Npb24gPSBOZXctUFNTZXNzaW9uIC1Db21wdXRlck5hbWUgJFNoYXJlU2VydmVyIC1DcmVkZW50aWFsICRDcmVkZW50aWFsDQoNCiAgICAgICAgV3JpdGUtTG9nICJDcmVhdGluZyBmb2xkZXIgb24gJyRTaGFyZVNlcnZlcicgLi4uIg0KICAgICAgICBJbnZva2UtQ29tbWFuZCAtU2Vzc2lvbiAkU2Vzc2lvbiAtU2NyaXB0QmxvY2sgew0KICAgICAgICAgICAgICAgIHBhcmFtICgNCiAgICAgICAgICAgICAgICAgICAgW1N0cmluZ10gJFNoYXJlUGF0aCwNCiAgICAgICAgICAgICAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgW1N0cmluZ10gJENsdXN0ZXJBY2NvdW50DQogICAgICAgICAgICAgICAgKQ0KDQogICAgICAgICAgICAgICAgUmVtb3ZlLVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUZvcmNlIC1FcnJvckFjdGlvbiAnU2lsZW50bHlDb250aW51ZScNCiAgICAgICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1Gb3JjZSAtRXJyb3JBY3Rpb24gJ1NpbGVudGx5Q29udGludWUnDQoNCiAgICAgICAgICAgICAgICBOZXctSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1JdGVtVHlwZSBDb250YWluZXIgLUZvcmNlDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYA0KICAgICAgICAgICAgICAgICAgICAtTmFtZSAkU2hhcmVOYW1lIGANCiAgICAgICAgICAgICAgICAgICAgLUZ1bGxBY2Nlc3MgIiRDbHVzdGVyQWNjb3VudCIgYA0KICAgICAgICAgICAgICAgICAgICAtRGVzY3JpcHRpb24gIlNoYXJlZCBmb2xkZXIgZm9yIEZhaWxvdmVyIENsdXN0ZXIuIg0KDQogICAgICAgICAgICB9IC1Bcmd1bWVudExpc3QgJFNoYXJlUGF0aCwgJFNoYXJlTmFtZSwgIiREb21haW5OYW1lXCRDbHVzdGVyTmFtZWAkIg0KDQogICAgICAgIFdyaXRlLUxvZyAiQ29uZmd1cmluZyBGYWlsb3ZlciBDbHVzdGVyIHRvIHVzZSBzaGFyZWQgZm9sZGVyIGFzIHFvdXJ1bSByZXNvdXJzZSAuLi4iDQoNCiAgICAgICAgJG51bGwgPSBTZXQtQ2x1c3RlclF1b3J1bSAtTm9kZUFuZEZpbGVTaGFyZU1ham9yaXR5ICJcXCRTaGFyZVNlcnZlclwkU2hhcmVOYW1lIg0KDQogICAgICAgIFdyaXRlLUxvZyAiPC0tIE5ldy1GYWlsb3ZlckNsdXN0ZXJTaGFyZWRGb2xkZXIiDQogICAgfQ0KfQ0KDQoNCg0KZnVuY3Rpb24gTmV3LUZhaWxvdmVyQ2x1c3RlciB7DQoJcGFyYW0gKA0KICAgICAgICBbU3RyaW5nXSAkQ2x1c3Rlck5hbWUsDQogICAgICAgIFtTdHJpbmddICRTdGF0aWNBZGRyZXNzLA0KICAgICAgICBbU3RyaW5nW11dICRDbHVzdGVyTm9kZXMsDQogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLA0KICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsDQogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQsDQogICAgICAgICRDcmVkZW50aWFsDQogICAgKQ0KICAgIGJlZ2luIHsNCiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uDQogICAgfQ0KICAgIGVuZCB7DQogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kDQogICAgfQ0KICAgIHByb2Nlc3Mgew0KICAgICAgICB0cmFwIHsNCiAgICAgICAgICAgICYkVHJhcEhhbmRsZXINCiAgICAgICAgfQ0KDQogICAgICAgIFdyaXRlLUxvZyAiQ2x1c3Rlck5vZGVzOiAkKCRDbHVzdGVyTm9kZXMgLWpvaW4gJywgJykiDQoNCiAgICAgICAgaWYgKCRDcmVkZW50aWFsIC1lcSAkbnVsbCkgew0KICAgICAgICAgICAgJENyZWRlbnRpYWwgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIg0KICAgICAgICB9DQoNCiAgICAgICAgSW1wb3J0LU1vZHVsZSBGYWlsb3ZlckNsdXN0ZXJzDQoNCiAgICAJaWYgKChHZXQtQ2x1c3RlciAkQ2x1c3Rlck5hbWUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUpIC1lcSAkbnVsbCkgew0KICAgICAgICAgICAgV3JpdGUtTG9nICJDcmVhdGluZyBuZXcgY2x1c3RlciAnJENsdXN0ZXJOYW1lJyAuLi4iDQogICAgICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyAtQ29tbWFuZCBAIg0KSW1wb3J0LU1vZHVsZSBGYWlsb3ZlckNsdXN0ZXJzDQpOZXctQ2x1c3RlciAtTmFtZSAnJENsdXN0ZXJOYW1lJyAtU3RhdGljQWRkcmVzcyAnJFN0YXRpY0FkZHJlc3MnDQoiQCAtQ3JlZGVudGlhbCAkQ3JlZGVudGlhbCAtTm9CYXNlNjQNCiAgICAgICAgICAgIFN0YXJ0LVNsZWVwIC1TZWNvbmRzIDE1DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBXcml0ZS1Mb2cgIkNsdXN0ZXIgJyRDbHVzdGVyTmFtZScgYWxyZWFkeSBleGlzdHMuIg0KICAgICAgICB9DQoNCiAgICAgICAgZm9yZWFjaCAoJE5vZGUgaW4gJENsdXN0ZXJOb2Rlcykgew0KICAgICAgICAgICAgV3JpdGUtTG9nICJBZGRpbmcgbm9kZSAnJE5vZGUnIHRvIHRoZSBjbHVzdGVyICckQ2x1c3Rlck5hbWUnIC4uLiINCiAgICAgICAgICAgIGlmICgoR2V0LUNsdXN0ZXJOb2RlICROb2RlIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlKSAtZXEgJG51bGwpIHsNCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIkFkZGluZyBub2RlIC4uLiINCiAgICAgICAgICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyAtQ29tbWFuZCBAIg0KSW1wb3J0LU1vZHVsZSBGYWlsb3ZlckNsdXN0ZXJzDQpBZGQtQ2x1c3Rlck5vZGUgLUNsdXN0ZXIgJyRDbHVzdGVyTmFtZScgLU5hbWUgJyROb2RlJw0KIkAgLUNyZWRlbnRpYWwgJENyZWRlbnRpYWwgLU5vQmFzZTY0DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIk5vZGUgJyROb2RlJyBhbHJlYWR5IGEgcGFydCBvZiB0aGUgY2x1c3RlciAnJENsdXN0ZXJOYW1lJy4iDQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCg0KDQo8Iw0KDQojIEV4YW1wbGUNCg0KJERvbWFpbk5hbWUgPSAnZmMtYWNtZS5sb2NhbCcNCiREb21haW5Vc2VyID0gJ0FkbWluaXN0cmF0b3InDQokRG9tYWluUGFzc3dvcmQgPSAnUEBzc3cwcmQnDQoNCiRDbHVzdGVyTmFtZSA9ICdmYy10ZXN0Jw0KJENsdXN0ZXJJUCA9ICcxMC4yMDAuMC42MCcNCiRDbHVzdGVyTm9kZXMgPSBAKCdmYy1ub2RlLTAxJywnZmMtbm9kZS0wMicsJ2ZjLW5vZGUtMDMnKQ0KDQokU2hhcmVTZXJ2ZXIgPSAnZmMtZGMtMDEnDQokU2hhcmVOYW1lID0gJ0ZDU2hhcmUnDQoNCiRTaGFyZVBhdGggPSAiQzpcJFNoYXJlTmFtZSINCg0KDQoNCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucyAtRm9yY2UNCg0KJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgYA0KICAgIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJERvbWFpblVzZXIiIGANCiAgICAtUGFzc3dvcmQgIiREb21haW5QYXNzd29yZCINCg0KTmV3LUZhaWxvdmVyQ2x1c3RlciBgDQogICAgLUNsdXN0ZXJOYW1lICRDbHVzdGVyTmFtZSBgDQogICAgLVN0YXRpY0FkZHJlc3MgJENsdXN0ZXJJUCBgDQogICAgLUNsdXN0ZXJOb2RlcyAkQ2x1c3Rlck5vZGVzIGANCiAgICAtQ3JlZGVudGlhbCAkQ3JlZHMNCg0KTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciBgDQogICAgLUNsdXN0ZXJOYW1lICRDbHVzdGVyTmFtZSBgDQogICAgLURvbWFpbk5hbWUgJERvbWFpbk5hbWUgYA0KICAgIC1TaGFyZVNlcnZlciAkU2hhcmVTZXJ2ZXIgYA0KICAgIC1TaGFyZVBhdGggIiRTaGFyZVBhdGgiIGANCiAgICAtU2hhcmVOYW1lICIkU2hhcmVOYW1lIiBgDQogICAgLUNyZWRlbnRpYWwgJENyZWRzDQoNCiM+DQo=" ] } \ No newline at end of file diff --git a/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/FailoverClusterPrerequisites.yaml b/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/FailoverClusterPrerequisites.yaml index c1bce521..e3bc50cd 100644 --- a/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/FailoverClusterPrerequisites.yaml +++ b/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/FailoverClusterPrerequisites.yaml @@ -1,12 +1,16 @@ Scripts: - ../../WindowsPowerShell/Functions/ImportCoreFunctions.ps1 - ../../WindowsPowerShell/Functions/Update-ServiceConfig.ps1 + - ../../WindowsPowerShell/Functions/SQLServerForAOAG.ps1 - ../../WindowsPowerShell/Functions/Failover-Cluster.ps1 Commands: - Name: Install-FailoverClusterPrerequisites Arguments: {} + - Name: Enable-TrustedHosts + Arguments: {} + - Name: Update-ServiceConfig Arguments: Name: Murano Agent diff --git a/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/FailoverClusterPrerequisites.yaml.json b/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/FailoverClusterPrerequisites.yaml.json index 02913847..9a246d0d 100644 --- a/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/FailoverClusterPrerequisites.yaml.json +++ b/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/FailoverClusterPrerequisites.yaml.json @@ -4,6 +4,10 @@ "Name": "Install-FailoverClusterPrerequisites", "Arguments": {} }, + { + "Name": "Enable-TrustedHosts", + "Arguments": {} + }, { "Name": "Update-ServiceConfig", "Arguments": { @@ -16,8 +20,9 @@ ], "RebootOnCompletion": 1, "Scripts": [ - "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKZnVuY3Rpb24gU2hvdy1JbnZvY2F0aW9uSW5mbyB7CiAgICBwYXJhbSAoCiAgICAgICAgJEludm9jYXRpb24sCiAgICAgICAgW1N3aXRjaF0gJEVuZAogICAgKQoKICAgIGlmICgkRW5kKSB7CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgIH0KICAgIGVsc2UgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8ZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPHBhcmFtPiIKICAgICAgICBmb3JlYWNoICgkUGFyYW1ldGVyIGluICRJbnZvY2F0aW9uLk15Q29tbWFuZC5QYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRLZXkgaW4gJFBhcmFtZXRlci5LZXlzKSB7CiAgICAgICAgICAgICAgICAkVHlwZSA9ICRQYXJhbWV0ZXJbJEtleV0uUGFyYW1ldGVyVHlwZS5GdWxsTmFtZQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJFZhbHVlIGluICRJbnZvY2F0aW9uLkJvdW5kUGFyYW1ldGVyc1skS2V5XSkgewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJbJFR5cGVdICRLZXkgPSAnJFZhbHVlJyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPC9wYXJhbT4iCiAgICB9Cn0KCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", - "CmZ1bmN0aW9uIFVwZGF0ZS1TZXJ2aWNlQ29uZmlnIHsKICAgIHBhcmFtICgKICAgICAgICBbU3RyaW5nXSAkTmFtZSwKICAgICAgICBbU3RyaW5nXSAkUnVuQXNVc2VyID0gJycsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUgPSAnLicsCiAgICAgICAgW1N0cmluZ10gJFBhc3N3b3JkID0gJycsCiAgICAgICAgW1N3aXRjaF0gJFJ1bkFzTG9jYWxTZXJ2aWNlCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAkQXJndW1lbnRMaXN0ID0gQCgnY29uZmlnJywgImAiJE5hbWVgIiIpCgogICAgICAgIGlmICgkUnVuQXNMb2NhbFNlcnZpY2UpIHsKICAgICAgICAgICAgJEFyZ3VtZW50TGlzdCArPSBAKCJvYmo9IiwgImAiTlQgQVVUSE9SSVRZXExvY2FsU2VydmljZWAiIikKICAgICAgICB9CiAgICAgICAgZWxzZWlmICgkUnVuQXNVc2VyIC1uZSAnJykgewogICAgICAgICAgICAkQXJndW1lbnRMaXN0ICs9IEAoIm9iaj0iLCAiYCIkRG9tYWluTmFtZVwkUnVuQXNVc2VyYCIiLCAicGFzc3dvcmQ9IiwgImAiJFBhc3N3b3JkYCIiKQogICAgICAgIH0KCiAgICAgICAgJFByb2Nlc3MgPSBFeGVjICdzYy5leGUnICRBcmd1bWVudExpc3QgLVBhc3NUaHJ1IC1SZWRpcmVjdFN0cmVhbXMKCiAgICAgICAgaWYgKCRQcm9jZXNzLkV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgICAgIHRocm93ICJDb21tYW5kICdzYy5leGUnIHJldHVybmVkIGV4aXQgY29kZSAnJCgkUHJvY2Vzcy5FeGl0Q29kZSknIgogICAgICAgIH0KCiAgICAgICAgJE50UmlnaHRzID0gIkM6XE11cmFub1xUb29sc1xudHJpZ2h0cy5leGUiCgogICAgICAgIGlmICgtbm90IChbSU8uRmlsZV06OkV4aXN0cygkTnRSaWdodHMpKSkgewogICAgICAgICAgICB0aHJvdyAiRmlsZSAnJE50UmlnaHRzJyBub3QgZm91bmQuIgogICAgICAgIH0KCiAgICAgICAgJFByb2Nlc3MgPSBFeGVjICROdFJpZ2h0cyBAKCctdScsICIkRG9tYWluTmFtZVwkUnVuQXNVc2VyIiwgJytyJywgJ1NlU2VydmljZUxvZ29uUmlnaHQnKSAtUmVkaXJlY3RTdHJlYW1zIC1QYXNzVGhydQoKICAgICAgICBpZiAoJFByb2Nlc3MuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICAgICAgdGhyb3cgIkNvbW1hbmQgJyROdFJpZ2h0cycgcmV0dXJuZWQgZXhpdCBjb2RlICckKCRQcm9jZXNzLkV4aXRDb2RlKSciCiAgICAgICAgfQoKICAgICAgICAkUHJvY2VzcyA9IEV4ZWMgJE50UmlnaHRzIEAoJy11JywgIiREb21haW5OYW1lXCRSdW5Bc1VzZXIiLCAnK3InLCAnU2VCYXRjaExvZ29uUmlnaHQnKSAtUmVkaXJlY3RTdHJlYW1zIC1QYXNzVGhydQoKICAgICAgICBpZiAoJFByb2Nlc3MuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICAgICAgdGhyb3cgIkNvbW1hbmQgJyROdFJpZ2h0cycgcmV0dXJuZWQgZXhpdCBjb2RlICckKCRQcm9jZXNzLkV4aXRDb2RlKSciCiAgICAgICAgfQogICAgfQp9Cg==", - "PCMNCi5ERVNDUklQVElPTg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIElucHV0IERhdGEgKGZyb20gdGhlIFVJKQ0KDQoqIERvbWFpbiBNZW1iZXJzaGlwDQogICAgLSBbU3RyaW5nXSAvIFtTZWxlY3QgYm94XSAkRG9tYWluTmFtZSAtIERvbWFpbiBuYW1lDQoqIERvbWFpbiBVc2VyIENyZWRlbnRpYWxzDQogICAgLSBbU3RyaW5nXSAkVXNlck5hbWUgLSBVc2VybmFtZQ0KICAgIC0gW1Bhc3N3b3JkIHN0cmluZ10gJFVzZXJQYXNzd29yZCAtIFVzZXIgcGFzc3dvcmQNCiogU2hhcmVkIEZvbGRlciBJbmZvcm1hdGlvbg0KICAgIC0gW1N0cmluZ10gJFNoYXJlU2VydmVyIC0gU2VydmVyIHdoaWNoIHdpbGwgaG9zdCB0aGUgZm9sZGVyDQogICAgLSBbU3RyaW5nXSAkU2hhcmVOYW1lIC0gU2hhcmUgbmFtZQ0KICAgIC0gW1N0cmluZ10gJFNoYXJlUGF0aCAtIFNoYXJlZCBmb2xkZXIgaW50ZXJuYWwgcGF0aA0KKiBGYWlsb3ZlciBDbHVzdGVyIE1lbWJlcnMNCiAgICAtIFtTdHJpbmddICRDbHVzdGVyTmFtZSAtIENsdXN0ZXIgbmFtZQ0KICAgIC0gW1N0cmluZ10gJENsdXN0ZXJJUCAtIFN0YXRpYyBJUCBhZGRyZXNzIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgY2x1c3Rlcg0KICAgIC0gW1N0cmluZ1tdXSAkQ2x1c3Rlck5vZGVzIC0gTGlzdCBvZiBub2RlIG5hbWVzDQoNCg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIGNyZWF0aW9uIHdvcmtmbG93DQoNCiogQ3JlYXRlIEFEIGRvbWFpbg0KKiBKb2luIGFsbCB0aGUgVk1zIHRvIHRoYXQgZG9tYWluDQoqIFByZXBhcmUgbm9kZXMNCiAgICAtIEluc3RhbGwgRmFpbG92ZXIgQ2x1c3RlciBwcmVyZXF1aXNpdGVzIG9uIGFsbCBGQyBub2Rlcw0KKiBDcmVhdGUgZmFpbG92ZXIgY2x1c3Rlcg0KICAgIC0gQ3JlYXRlIG5ldyBjbHVzdGVyDQogICAgLSBBZGQgbWVtYmVycw0KKiBDb25mdWd1cmUgRkMgcXVvcnVtDQogICAgLSBDcmVhdGUgbmV3IGZvbGRlciB0aGF0IHdpbGwgYmUgc2hhcmVkDQogICAgLSBTaGFyZSB0aGF0IGZvbGRlciB3aXRoIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zDQogICAgLSBDb25maWd1cmUgcXVvcnVtIG1vZGUNCg0KDQoNCiMjIEhlbHBmdWwgU21iU2hhcmUqIEZ1bmN0aW9ucw0KDQoqIE5ldy1TbWJTaGFyZQ0KKiBHcmFudC1TbWJTaGFyZUFjY2Vzcw0KDQojPg0KDQoNCg0KZnVuY3Rpb24gSW5zdGFsbC1GYWlsb3ZlckNsdXN0ZXJQcmVyZXF1aXNpdGVzIHsNCiAgICBJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCg0KICAgIEFkZC1XaW5kb3dzRmVhdHVyZSBGYWlsb3Zlci1DbHVzdGVyaW5nLCBSU0FULUNsdXN0ZXJpbmctUG93ZXJTaGVsbA0KfQ0KDQoNCg0KZnVuY3Rpb24gTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciB7DQoJcGFyYW0gKA0KICAgICAgICBbU3RyaW5nXSAkQ2x1c3Rlck5hbWUsDQogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLA0KICAgICAgICBbU3RyaW5nXSAkU2hhcmVTZXJ2ZXIsDQoJCVtTdHJpbmddICRTaGFyZVBhdGggPSAkKCRFbnY6U3lzdGVtRHJpdmUgKyAnXEZDU2hhcmUnKSwNCgkJW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdGQ1NoYXJlJywNCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLA0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLA0KICAgICAgICAkQ3JlZGVudGlhbCA9ICRudWxsDQoJKQ0KICAgIGJlZ2luIHsNCiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uDQogICAgfQ0KICAgIGVuZCB7DQogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kDQogICAgfQ0KICAgIHByb2Nlc3Mgew0KICAgICAgICB0cmFwIHsNCiAgICAgICAgICAgIFdyaXRlLUxvZ0Vycm9yICRfIC1FbnRpcmVPYmplY3QNCiAgICAgICAgICAgIGJyZWFrDQogICAgICAgIH0NCg0KICAgICAgICAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJ1N0b3AnDQoNCiAgICAgICAgV3JpdGUtTG9nICItLT4gTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciINCg0KICAgICAgICBXcml0ZS1Mb2cgIkNyZWF0aW5nIHNoYXJlZCBmb2xkZXIgZm9yIEZhaWxvdmVyIENsdXN0ZXIgLi4uIg0KICAgICAgICANCiAgICAgICAgaWYgKCRDcmVkZW50aWFsIC1lcSAkbnVsbCkgew0KICAgICAgICAgICAgJENyZWRlbnRpYWwgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIg0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKChUZXN0LUNvbm5lY3Rpb24gLUNvbXB1dGVyTmFtZSAkU2hhcmVTZXJ2ZXIgLUNvdW50IDEgLVF1aWV0KSAtZXEgJGZhbHNlKSB7DQogICAgICAgICAgICB0aHJvdygiU2VydmVyICckU2hhcmVTZXJ2ZXInIGlzIHVucmVhY2hhYmxlIHZpYSBJQ01QLiIpDQogICAgICAgIH0NCg0KICAgICAgICAkU2Vzc2lvbiA9IE5ldy1QU1Nlc3Npb24gLUNvbXB1dGVyTmFtZSAkU2hhcmVTZXJ2ZXIgLUNyZWRlbnRpYWwgJENyZWRlbnRpYWwNCg0KICAgICAgICBXcml0ZS1Mb2cgIkNyZWF0aW5nIGZvbGRlciBvbiAnJFNoYXJlU2VydmVyJyAuLi4iDQogICAgICAgIEludm9rZS1Db21tYW5kIC1TZXNzaW9uICRTZXNzaW9uIC1TY3JpcHRCbG9jayB7DQogICAgICAgICAgICAgICAgcGFyYW0gKA0KICAgICAgICAgICAgICAgICAgICBbU3RyaW5nXSAkU2hhcmVQYXRoLA0KICAgICAgICAgICAgICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lLA0KICAgICAgICAgICAgICAgICAgICBbU3RyaW5nXSAkQ2x1c3RlckFjY291bnQNCiAgICAgICAgICAgICAgICApDQoNCiAgICAgICAgICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UgLUVycm9yQWN0aW9uICdTaWxlbnRseUNvbnRpbnVlJw0KICAgICAgICAgICAgICAgIFJlbW92ZS1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUZvcmNlIC1FcnJvckFjdGlvbiAnU2lsZW50bHlDb250aW51ZScNCg0KICAgICAgICAgICAgICAgIE5ldy1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUl0ZW1UeXBlIENvbnRhaW5lciAtRm9yY2UNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBOZXctU21iU2hhcmUgLVBhdGggJFNoYXJlUGF0aCBgDQogICAgICAgICAgICAgICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYA0KICAgICAgICAgICAgICAgICAgICAtRnVsbEFjY2VzcyAiJENsdXN0ZXJBY2NvdW50IiBgDQogICAgICAgICAgICAgICAgICAgIC1EZXNjcmlwdGlvbiAiU2hhcmVkIGZvbGRlciBmb3IgRmFpbG92ZXIgQ2x1c3Rlci4iDQoNCiAgICAgICAgICAgIH0gLUFyZ3VtZW50TGlzdCAkU2hhcmVQYXRoLCAkU2hhcmVOYW1lLCAiJERvbWFpbk5hbWVcJENsdXN0ZXJOYW1lYCQiDQoNCiAgICAgICAgV3JpdGUtTG9nICJDb25mZ3VyaW5nIEZhaWxvdmVyIENsdXN0ZXIgdG8gdXNlIHNoYXJlZCBmb2xkZXIgYXMgcW91cnVtIHJlc291cnNlIC4uLiINCg0KICAgICAgICAkbnVsbCA9IFNldC1DbHVzdGVyUXVvcnVtIC1Ob2RlQW5kRmlsZVNoYXJlTWFqb3JpdHkgIlxcJFNoYXJlU2VydmVyXCRTaGFyZU5hbWUiDQoNCiAgICAgICAgV3JpdGUtTG9nICI8LS0gTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciINCiAgICB9DQp9DQoNCg0KDQpmdW5jdGlvbiBOZXctRmFpbG92ZXJDbHVzdGVyIHsNCglwYXJhbSAoDQogICAgICAgIFtTdHJpbmddICRDbHVzdGVyTmFtZSwNCiAgICAgICAgW1N0cmluZ10gJFN0YXRpY0FkZHJlc3MsDQogICAgICAgIFtTdHJpbmdbXV0gJENsdXN0ZXJOb2RlcywNCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsDQogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwNCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZCwNCiAgICAgICAgJENyZWRlbnRpYWwNCiAgICApDQogICAgYmVnaW4gew0KICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24NCiAgICB9DQogICAgZW5kIHsNCiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQNCiAgICB9DQogICAgcHJvY2VzcyB7DQogICAgICAgIHRyYXAgew0KICAgICAgICAgICAgV3JpdGUtTG9nRXJyb3IgJF8gLUVudGlyZU9iamVjdA0KICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICdTdG9wJw0KDQogICAgICAgIFdyaXRlLUxvZyAiQ2x1c3Rlck5vZGVzOiAkKCRDbHVzdGVyTm9kZXMgLWpvaW4gJywgJykiDQoNCiAgICAgICAgaWYgKCRDcmVkZW50aWFsIC1lcSAkbnVsbCkgew0KICAgICAgICAgICAgJENyZWRlbnRpYWwgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIg0KICAgICAgICB9DQoNCiAgICAgICAgSW1wb3J0LU1vZHVsZSBGYWlsb3ZlckNsdXN0ZXJzDQoNCiAgICAJaWYgKChHZXQtQ2x1c3RlciAkQ2x1c3Rlck5hbWUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUpIC1lcSAkbnVsbCkgew0KICAgICAgICAgICAgV3JpdGUtTG9nICJDcmVhdGluZyBuZXcgY2x1c3RlciAnJENsdXN0ZXJOYW1lJyAuLi4iDQogICAgICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyAtQ29tbWFuZCBAIg0KSW1wb3J0LU1vZHVsZSBGYWlsb3ZlckNsdXN0ZXJzDQpOZXctQ2x1c3RlciAtTmFtZSAnJENsdXN0ZXJOYW1lJyAtU3RhdGljQWRkcmVzcyAnJFN0YXRpY0FkZHJlc3MnDQoiQCAtQ3JlZGVudGlhbCAkQ3JlZGVudGlhbCAtTm9CYXNlNjQNCiAgICAgICAgICAgIFN0YXJ0LVNsZWVwIC1TZWNvbmRzIDE1DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBXcml0ZS1Mb2cgIkNsdXN0ZXIgJyRDbHVzdGVyTmFtZScgYWxyZWFkeSBleGlzdHMuIg0KICAgICAgICB9DQoNCiAgICAgICAgZm9yZWFjaCAoJE5vZGUgaW4gJENsdXN0ZXJOb2Rlcykgew0KICAgICAgICAgICAgV3JpdGUtTG9nICJBZGRpbmcgbm9kZSAnJE5vZGUnIHRvIHRoZSBjbHVzdGVyICckQ2x1c3Rlck5hbWUnIC4uLiINCiAgICAgICAgICAgIGlmICgoR2V0LUNsdXN0ZXJOb2RlICROb2RlIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlKSAtZXEgJG51bGwpIHsNCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIkFkZGluZyBub2RlIC4uLiINCiAgICAgICAgICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyAtQ29tbWFuZCBAIg0KSW1wb3J0LU1vZHVsZSBGYWlsb3ZlckNsdXN0ZXJzDQpBZGQtQ2x1c3Rlck5vZGUgLUNsdXN0ZXIgJyRDbHVzdGVyTmFtZScgLU5hbWUgJyROb2RlJw0KIkAgLUNyZWRlbnRpYWwgJENyZWRlbnRpYWwgLU5vQmFzZTY0DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIk5vZGUgJyROb2RlJyBhbHJlYWR5IGEgcGFydCBvZiB0aGUgY2x1c3RlciAnJENsdXN0ZXJOYW1lJy4iDQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCg0KDQo8Iw0KDQojIEV4YW1wbGUNCg0KJERvbWFpbk5hbWUgPSAnZmMtYWNtZS5sb2NhbCcNCiREb21haW5Vc2VyID0gJ0FkbWluaXN0cmF0b3InDQokRG9tYWluUGFzc3dvcmQgPSAnUEBzc3cwcmQnDQoNCiRDbHVzdGVyTmFtZSA9ICdmYy10ZXN0Jw0KJENsdXN0ZXJJUCA9ICcxMC4yMDAuMC42MCcNCiRDbHVzdGVyTm9kZXMgPSBAKCdmYy1ub2RlLTAxJywnZmMtbm9kZS0wMicsJ2ZjLW5vZGUtMDMnKQ0KDQokU2hhcmVTZXJ2ZXIgPSAnZmMtZGMtMDEnDQokU2hhcmVOYW1lID0gJ0ZDU2hhcmUnDQoNCiRTaGFyZVBhdGggPSAiQzpcJFNoYXJlTmFtZSINCg0KDQoNCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucyAtRm9yY2UNCg0KJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgYA0KICAgIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJERvbWFpblVzZXIiIGANCiAgICAtUGFzc3dvcmQgIiREb21haW5QYXNzd29yZCINCg0KTmV3LUZhaWxvdmVyQ2x1c3RlciBgDQogICAgLUNsdXN0ZXJOYW1lICRDbHVzdGVyTmFtZSBgDQogICAgLVN0YXRpY0FkZHJlc3MgJENsdXN0ZXJJUCBgDQogICAgLUNsdXN0ZXJOb2RlcyAkQ2x1c3Rlck5vZGVzIGANCiAgICAtQ3JlZGVudGlhbCAkQ3JlZHMNCg0KTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciBgDQogICAgLUNsdXN0ZXJOYW1lICRDbHVzdGVyTmFtZSBgDQogICAgLURvbWFpbk5hbWUgJERvbWFpbk5hbWUgYA0KICAgIC1TaGFyZVNlcnZlciAkU2hhcmVTZXJ2ZXIgYA0KICAgIC1TaGFyZVBhdGggIiRTaGFyZVBhdGgiIGANCiAgICAtU2hhcmVOYW1lICIkU2hhcmVOYW1lIiBgDQogICAgLUNyZWRlbnRpYWwgJENyZWRzDQoNCiM+DQo=" + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKCmZ1bmN0aW9uIFNob3ctSW52b2NhdGlvbkluZm8gewogICAgcGFyYW0gKAogICAgICAgICRJbnZvY2F0aW9uLAogICAgICAgIFtTd2l0Y2hdICRFbmQKICAgICkKCiAgICBpZiAoJEVuZCkgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8L2Z1bmN0aW9uIG5hbWU9JyQoJEludm9jYXRpb24uTXlDb21tYW5kLk5hbWUpJz4iCiAgICB9CiAgICBlbHNlIHsKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPGZ1bmN0aW9uIG5hbWU9JyQoJEludm9jYXRpb24uTXlDb21tYW5kLk5hbWUpJz4iCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjxwYXJhbT4iCiAgICAgICAgZm9yZWFjaCAoJFBhcmFtZXRlciBpbiAkSW52b2NhdGlvbi5NeUNvbW1hbmQuUGFyYW1ldGVycykgewogICAgICAgICAgICBmb3JlYWNoICgkS2V5IGluICRQYXJhbWV0ZXIuS2V5cykgewogICAgICAgICAgICAgICAgJFR5cGUgPSAkUGFyYW1ldGVyWyRLZXldLlBhcmFtZXRlclR5cGUuRnVsbE5hbWUKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRWYWx1ZSBpbiAkSW52b2NhdGlvbi5Cb3VuZFBhcmFtZXRlcnNbJEtleV0pIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiWyRUeXBlXSAkS2V5ID0gJyRWYWx1ZSciCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvcGFyYW0+IgogICAgfQp9CgoKJFRyYXBIYW5kbGVyID0gewogICAgV3JpdGUtTG9nRXJyb3IgQCgiPGV4Y2VwdGlvbj4iLCAkXykgLUVudGlyZU9iamVjdAogICAgV3JpdGUtTG9nRXJyb3IgIjwvZXhjZXB0aW9uPiIKICAgIGJyZWFrCn0KCgp0cmFwIHsKICAgICYkVHJhcEhhbmRsZXIKfQoKJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICdTdG9wJwoKCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", + "CmZ1bmN0aW9uIFVwZGF0ZS1TZXJ2aWNlQ29uZmlnIHsKICAgIHBhcmFtICgKICAgICAgICBbU3RyaW5nXSAkTmFtZSwKICAgICAgICBbU3RyaW5nXSAkUnVuQXNVc2VyID0gJycsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUgPSAnLicsCiAgICAgICAgW1N0cmluZ10gJFBhc3N3b3JkID0gJycsCiAgICAgICAgW1N3aXRjaF0gJFJ1bkFzTG9jYWxTZXJ2aWNlCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgJEFyZ3VtZW50TGlzdCA9IEAoJ2NvbmZpZycsICJgIiROYW1lYCIiKQoKICAgICAgICBpZiAoJFJ1bkFzTG9jYWxTZXJ2aWNlKSB7CiAgICAgICAgICAgICRBcmd1bWVudExpc3QgKz0gQCgib2JqPSIsICJgIk5UIEFVVEhPUklUWVxMb2NhbFNlcnZpY2VgIiIpCiAgICAgICAgfQogICAgICAgIGVsc2VpZiAoJFJ1bkFzVXNlciAtbmUgJycpIHsKICAgICAgICAgICAgJEFyZ3VtZW50TGlzdCArPSBAKCJvYmo9IiwgImAiJERvbWFpbk5hbWVcJFJ1bkFzVXNlcmAiIiwgInBhc3N3b3JkPSIsICJgIiRQYXNzd29yZGAiIikKICAgICAgICB9CgogICAgICAgICRQcm9jZXNzID0gRXhlYyAnc2MuZXhlJyAkQXJndW1lbnRMaXN0IC1QYXNzVGhydSAtUmVkaXJlY3RTdHJlYW1zCgogICAgICAgIGlmICgkUHJvY2Vzcy5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICB0aHJvdyAiQ29tbWFuZCAnc2MuZXhlJyByZXR1cm5lZCBleGl0IGNvZGUgJyQoJFByb2Nlc3MuRXhpdENvZGUpJyIKICAgICAgICB9CgogICAgICAgICROdFJpZ2h0cyA9ICJDOlxNdXJhbm9cVG9vbHNcbnRyaWdodHMuZXhlIgoKICAgICAgICBpZiAoLW5vdCAoW0lPLkZpbGVdOjpFeGlzdHMoJE50UmlnaHRzKSkpIHsKICAgICAgICAgICAgdGhyb3cgIkZpbGUgJyROdFJpZ2h0cycgbm90IGZvdW5kLiIKICAgICAgICB9CgogICAgICAgICRQcm9jZXNzID0gRXhlYyAkTnRSaWdodHMgQCgnLXUnLCAiJERvbWFpbk5hbWVcJFJ1bkFzVXNlciIsICcrcicsICdTZVNlcnZpY2VMb2dvblJpZ2h0JykgLVJlZGlyZWN0U3RyZWFtcyAtUGFzc1RocnUKCiAgICAgICAgaWYgKCRQcm9jZXNzLkV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgICAgIHRocm93ICJDb21tYW5kICckTnRSaWdodHMnIHJldHVybmVkIGV4aXQgY29kZSAnJCgkUHJvY2Vzcy5FeGl0Q29kZSknIgogICAgICAgIH0KCiAgICAgICAgJFByb2Nlc3MgPSBFeGVjICROdFJpZ2h0cyBAKCctdScsICIkRG9tYWluTmFtZVwkUnVuQXNVc2VyIiwgJytyJywgJ1NlQmF0Y2hMb2dvblJpZ2h0JykgLVJlZGlyZWN0U3RyZWFtcyAtUGFzc1RocnUKCiAgICAgICAgaWYgKCRQcm9jZXNzLkV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgICAgIHRocm93ICJDb21tYW5kICckTnRSaWdodHMnIHJldHVybmVkIGV4aXQgY29kZSAnJCgkUHJvY2Vzcy5FeGl0Q29kZSknIgogICAgICAgIH0KICAgIH0KfQo=", + "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKChHZXQtTW9kdWxlIFNRTFBTIC1MaXN0QXZhaWxhYmxlKSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJNb2R1bGUgU1FMU1AgYWxyZWFkeSBpbnN0YWxsZWQuIgogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICAgICB0aHJvdygiVW5hYmxlIHRvIGZpbmQgTXVyYW5vRmlsZVNoYXJlIHBhdGguIikKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclxUb29scycpCiAgICAgICAgfQogICAgICAgIAogICAgICAgICRGaWxlTGlzdCA9IEAoCiAgICAgICAgICAgICdTUUxTeXNDbHJUeXBlcy5tc2knLAogICAgICAgICAgICAnU2hhcmVkTWFuYWdlbWVudE9iamVjdHMubXNpJywKICAgICAgICAgICAgJ1Bvd2VyU2hlbGxUb29scy5tc2knCiAgICAgICAgKQoKICAgICAgICBmb3JlYWNoICgkTXNpRmlsZSBpbiAkRmlsZUxpc3QpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUcnlpbmcgdG8gaW5zdGFsbCAnJE1zaUZpbGUnIC4uLiIKICAgICAgICAgICAgJE1zaVBhdGggPSBKb2luLVBhdGggJFNldHVwUm9vdCAkTXNpRmlsZQogICAgICAgICAgICBpZiAoW0lPLkZpbGVdOjpFeGlzdHMoJE1zaVBhdGgpKSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIG1zaWV4ZSAuLi4iCiAgICAgICAgICAgICAgICAkUmVzdWx0ID0gRXhlYyAtRmlsZVBhdGggIm1zaWV4ZWMuZXhlIiAtQXJndW1lbnRMaXN0IEAoJy9pJywgImAiJE1zaVBhdGhgIiIsICcvcXVpZXQnKSAtUGFzc1RocnUKICAgICAgICAgICAgICAgIGlmICgkUmVzdWx0LkV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCJJbnN0YWxsYXRpb24gb2YgTVNJIHBhY2thZ2UgJyRNc2lQYXRoJyBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICckKCRSZXN1bHQuRXhpdENvZGUpJyIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIkZpbGUgJyRNc2lQYXRoJyBub3QgZm91bmQuIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgoKCmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyRm9yQU9BRyB7CiAgICBwYXJhbSAoCiAgICAgICAgIyBQYXRoIHRvIGZvbGRlciB3aGVyZSBtc2kgZmlsZXMgZm9yIGFkZGl0aW9uYWwgU1FMIGZlYXR1cmVzIGFyZSBsb2NhdGVkCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnLAoKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUxQUyBtb2R1bGUgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU3FscHNTZXR1cFJvb3QgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJE11cmFub0ZpbGVTaGFyZSA9ICcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIG5hbWUKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJEb21haW4gPSAnZmMtYWNtZS5sb2NhbCcsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgZm9yIHRoZSBhY2NvdW50IHdoaWNoIHdpbGwgYmUgdXNlZCBieSBTUUwgc2VydmljZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUgPSAnQWRtaW5pc3RyYXRvcicsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgPSAnUEBzc3cwcmQnLAoKICAgICAgICBbU3dpdGNoXSAkVXBkYXRlRW5hYmxlZAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgdHJhcCB7CiAgICAgICAgICAgICYkVHJhcEhhbmRsZXIKICAgICAgICB9CgogICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICAgICB0aHJvdygiVW5hYmxlIHRvIGZpbmQgTXVyYW5vRmlsZVNoYXJlIHBhdGguIikKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclwyMDEyJykKICAgICAgICB9CgogICAgICAgICRFeHRyYU9wdGlvbnMgPSBAe30KCiAgICAgICAgaWYgKCRVcGRhdGVFbmFibGVkKSB7CiAgICAgICAgICAgICRFeHRyYU9wdGlvbnMgKz0gQHsnVXBkYXRlRW5hYmxlZCcgPSAkdHJ1ZX0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRFeHRyYU9wdGlvbnMgKz0gQHsnVXBkYXRlRW5hYmxlZCcgPSAkZmFsc2V9CiAgICAgICAgfQoKICAgICAgICBOZXctU1FMU2VydmVyRm9yQU9BRyBgCiAgICAgICAgICAgIC1TZXR1cFJvb3QgJFNldHVwUm9vdCBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JEb21haW4gJFNRTFNlcnZpY2VVc2VyRG9tYWluIGAKICAgICAgICAgICAgLVNRTFN2Y1Vzck5hbWUgJFNRTFNlcnZpY2VVc2VyTmFtZSBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JQYXNzd29yZCAkU1FMU2VydmljZVVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgIC1FeHRyYU9wdGlvbnMgJEV4dHJhT3B0aW9ucwogICAgfQp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbkFkbWluQWNjb3VudE5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbkFkbWluQWNjb3VudFBhc3N3b3JkLAogICAgICAgIFtTdHJpbmddICRTcWxTZXJ2aWNlQWNjb3VudE5hbWUsCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAogICAgICAgIFtTdHJpbmddICRTaGFyZU5hbWUgPSAnU2hhcmVkV29ya0RpcicKICAgICkKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICAkU2hhcmVOZXR3b3JrUGF0aCA9ICdcXCcgKyAkUHJpbWFyeU5vZGUgKyAnXCcgKyAkU2hhcmVOYW1lCgogICAgICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAgICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluQWRtaW5BY2NvdW50TmFtZSIgYAogICAgICAgICAgICAtUGFzc3dvcmQgIiREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBzY3JpcHQgcnVucyBvbiBwcmltYXJ5IG5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZyBzY3JpcHQuIgogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmICgkU2hhcmVOYW1lIC1lcSAnJykgewogICAgICAgICAgICAkU2hhcmVOYW1lID0gW0lPLlBhdGhdOjpHZXRGaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24oJFNoYXJlUGF0aCkKICAgICAgICB9CgogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJTaGFyZVBhdGggPSAnJFNoYXJlUGF0aCciCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlTmFtZSA9ICckU2hhcmVOYW1lJyIKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgc2hhcmUgJyRTaGFyZU5hbWUnIgogICAgICAgICAgICAkbnVsbCA9IEdldC1TbWJTaGFyZSAtTmFtZSAkU2hhcmVOYW1lIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICAgICAgUmVtb3ZlLVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUZvcmNlCiAgICAgICAgICAgIHdyaXRlLUxvZyAiU2hhcmUgJyRTaGFyZU5hbWUnIHJlbW92ZWQuIgogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIFdyaXRlLUxvZ1dhcm5pbmcgIlNoYXJlICckU2hhcmVOYW1lJyBub3QgZXhpc3RzIG9yIGNhbm5vdCBiZSBkZWxldGVkLiIKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJUcnlpbmcgdG8gcmVtb3ZlIGZvbGRlciAnJFNoYXJlUGF0aCIKICAgICAgICAgICAgJG51bGwgPSBHZXQtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICAgICAgUmVtb3ZlLUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtUmVjdXJzZSAtRm9yY2UKICAgICAgICAgICAgV3JpdGUtTG9nICJGb2xkZXIgJyRTaGFyZVBhdGgnIHJlbW92ZWQuIgogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIFdyaXRlLUxvZ1dhcm5pbmcgIkZvbGRlciAnJFNoYXJlUGF0aCcgbm90IGV4aXN0cyBvciBjYW5ub3QgYmUgZGVsZXRlZC4iCiAgICAgICAgfQoKICAgICAgICAkbnVsbCA9IE5ldy1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUl0ZW1UeXBlIENvbnRhaW5lciAtRm9yY2UKICAgICAgICAgICAgICAgIAogICAgICAgICRudWxsID0gTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYAogICAgICAgICAgICAtTmFtZSAkU2hhcmVOYW1lIGAKICAgICAgICAgICAgLUZ1bGxBY2Nlc3MgIkV2ZXJ5b25lIiBgCiAgICAgICAgICAgIC1EZXNjcmlwdGlvbiAiU2hhcmVkIGZvbGRlciBmb3IgQWx3YXlzT24gQXZhaWxhYmlsaXR5IEdyb3VwIHNldHVwLiIKCiAgICAgICAgcmV0dXJuICdcXCcgKyAkRW52OkNvbXB1dGVyTmFtZSArICdcJyArICRTaGFyZU5hbWUKICAgIH0KfQoKCgpmdW5jdGlvbiBOZXctRGF0YWJhc2VGb3JBT0FHIHsKICAgIHBhcmFtICgKICAgICAgICBbU3RyaW5nXSAkRGF0YWJhc2VOYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApCgogICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAnSW52b2tlLVNRTFRleHQnLCAnQ29udmVydFRvLVNRTE5hbWUnLCAnQ29udmVydFRvLVNRTFN0cmluZycsICdOZXctU1FMRGF0YWJhc2UnCgogICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tIGZpbGUgJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnTmV3LVNRTERhdGFiYXNlJyAuLi4iCk5ldy1TUUxEYXRhYmFzZSAkRGF0YWJhc2VOYW1lCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoT1BUSU9OQUwpIE5hbWUgb2YgdGhlIG5ldyBBdmFpbGFiaWxpdHkgR3JvdXAuIElmIG5vdCBzcGVjaWZpZWQgdGhlbiBkZWZhdWx0IG5hbWUgd2lsbCBiZSB1c2VkLgogICAgICAgIFtTdHJpbmddICRHcm91cE5hbWUgPSAnTXVyYW5vQUcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZXMgdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgYXMgcmVwbGljYSBwYXJ0bmVycy4KICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKCiAgICAgICAgIyAoUkVRVUlSRUQpIERhdGFiYXNlIGxpc3QgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJERhdGFiYXNlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIExpc3RlbmVyIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgYnkgY2xpZW50cyB0byBjb25uZWN0IHRvIGRhdGFiYXNlcyBpbiB0aGF0IEFHCiAgICAgICAgI1tQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJOYW1lID0gJ011cmFub0FHX0xpc3RlbmVyJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIElQIGFkZHJlc3Mgb2YgdGhlIGxpc3RlbmVyCiAgICAgICAgI1tQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUCwKCiAgICAgICAgW1N0cmluZ10gJExpc3RlbmVySVBNYXNrID0gJzI1NS4yNTUuMjU1LjAnLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJQb3J0ID0gJzUwMjMnLAoKICAgICAgICAjIFN5bmMgTW9kZSBOb2RlIExpc3QKICAgICAgICBbU3RyaW5nW11dICRTeW5jTW9kZU5vZGVMaXN0LAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJENsaVhtbEZpbGUgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICBXcml0ZS1Mb2cgIlByaW1hcnkgbm9kZTogJyQoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSknIgogICAgICAgIFdyaXRlLUxvZyAiQ3VycmVudCBub2RlOiAnJCgoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSknIgoKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgJCgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBQcmltYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZiAoJENsaVhtbEZpbGUgLWVxICcnKSB7CiAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgPSBAKCkKICAgICAgICAgICAgZm9yZWFjaCAoJE5vZGUgaW4gJE5vZGVMaXN0KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICROb2RlRW5kcG9pbnRQb3J0ID0gSW1wb3J0LUNsaVhtbCAtUGF0aCAiXFwkUHJpbWFyeU5vZGVcU2hhcmVkV29ya0RpclwkTm9kZS54bWwiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICJVc2luZyBkZWZhdWx0IGVuZHBvaW50IHBvcnQgNTAyMiIKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IDUwMjIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgICAgICJTRVJWRVJfSU5TVEFOQ0UiID0gIiROb2RlIjsKICAgICAgICAgICAgICAgICAgICAiRU5EUE9JTlRfVVJMIiA9ICJUQ1A6Ly8ke05vZGV9OiR7Tm9kZUVuZHBvaW50UG9ydH0iOwogICAgICAgICAgICAgICAgICAgICJBVkFJTEFCSUxJVFlfTU9ERSIgPSAiQVNZTkNIUk9OT1VTX0NPTU1JVCI7CiAgICAgICAgICAgICAgICAgICAgIkZBSUxPVkVSX01PREUiPSJNQU5VQUwiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkU3luY01vZGVOb2RlTGlzdCAtY29udGFpbnMgJE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIiROb2RlIGlzIGluIFN5bmNNb2RlTm9kZUxpc3QiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydBVkFJTEFCSUxJVFlfTU9ERSddID0gIlNZTkNIUk9OT1VTX0NPTU1JVCIKICAgICAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25bJ0ZBSUxPVkVSX01PREUnXSA9ICJBVVRPTUFUSUMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIiROb2RlIGlzIE5PVCBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgKz0gQCgkUmVwbGljYURlZmluaXRpb24pCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQcmVmZXJlbmNlcyA9IEB7fQoKICAgICAgICAgICAgJExpc3RlbmVyRGVmaW5pdGlvbiA9IEB7CiAgICAgICAgICAgICAgICAiTkFNRSI9JExpc3RlbmVyTmFtZTsKICAgICAgICAgICAgICAgICJQT1JUIiA9ICIkTGlzdGVuZXJQb3J0IjsKICAgICAgICAgICAgICAgICJTVEFUSUMiID0gIiRMaXN0ZW5lcklQLyRMaXN0ZW5lcklQTWFzayIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFtZXRlcnMgPSBAewogICAgICAgICAgICAgICAgJ1dvcmtEaXInID0gIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIjsKICAgICAgICAgICAgICAgICdOYW1lJyA9ICRHcm91cE5hbWU7CiAgICAgICAgICAgICAgICAnRGF0YWJhc2VOYW1lcycgPSAkRGF0YWJhc2VMaXN0OwogICAgICAgICAgICAgICAgJ1JlcGxpY2FEZWZzJyA9ICRSZXBsaWNhRGVmaW5pdGlvbkxpc3Q7CiAgICAgICAgICAgICAgICAnUHJlZmVyZW5jZXMnID0gJFByZWZlcmVuY2VzOwogICAgICAgICAgICAgICAgJ0xpc3RlbmVyRGVmJyA9ICRMaXN0ZW5lckRlZmluaXRpb247CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFJlbW92ZS1JdGVtIC1QYXRoICJcXCRQcmltYXJ5Tm9kZVxTaGFyZWRXb3JrRGlyXCoiIC1Gb3JjZQoKICAgICAgICAgICAgJENsaVhtbEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCgogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiQ2xpWG1sIGZpbGU6ICckQ2xpWG1sRmlsZSciCgogICAgICAgICAgICBFeHBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlIC1JbnB1dE9iamVjdCAkUGFyYW1ldGVycyAtRGVwdGggMTAKCiAgICAgICAgICAgIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIGAKICAgICAgICAgICAgICAgIC1DbGlYbWxGaWxlICRDbGlYbWxGaWxlIGAKICAgICAgICAgICAgICAgIC1Eb21haW5OYW1lICREb21haW5OYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyTmFtZSAkVXNlck5hbWUgYAogICAgICAgICAgICAgICAgLVVzZXJQYXNzd29yZCAkVXNlclBhc3N3b3JkIGAKICAgICAgICAgICAgICAgIC1QcmltYXJ5Tm9kZSAkUHJpbWFyeU5vZGUKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJFVzZXJOYW1lIiAtUGFzc3dvcmQgIiRVc2VyUGFzc3dvcmQiCgogICAgICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJJbXBvcnRpbmcgQ2xpWG1sIHBhcmFtZXRlcnMgZmlsZSAuLi4iCmAkUGFyYW1ldGVycyA9IEltcG9ydC1DbGlYbWwgLVBhdGggJENsaVhtbEZpbGUKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIGBgCiAgICAtV29ya0RpciBgJFBhcmFtZXRlcnNbJ1dvcmtEaXInXSBgYAogICAgLU5hbWUgYCRQYXJhbWV0ZXJzWydOYW1lJ10gYGAKICAgIC1EYXRhYmFzZU5hbWVzIGAkUGFyYW1ldGVyc1snRGF0YWJhc2VOYW1lcyddIGBgCiAgICAtUmVwbGljYURlZnMgYCRQYXJhbWV0ZXJzWydSZXBsaWNhRGVmcyddIGBgCiAgICAtUHJlZmVyZW5jZXMgYCRQYXJhbWV0ZXJzWydQcmVmZXJlbmNlcyddIGBgCiAgICAtTGlzdGVuZXJEZWYgYCRQYXJhbWV0ZXJzWydMaXN0ZW5lckRlZiddCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BT0FHU2Vjb25kYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFzIHJlcGxpY2EgcGFydG5lcnMuCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkgCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYScgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cFJlcGxpY2EgLVdvcmtEaXIgIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIgoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICB9Cn0KCgoKZnVuY3Rpb24gRGlzYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9mZgogICAgfQp9CgoKCmZ1bmN0aW9uIEVuYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9uCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLVRydXN0ZWRIb3N0cyB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgU2V0LUl0ZW0gV1NNYW46XGxvY2FsaG9zdFxDbGllbnRcVHJ1c3RlZEhvc3RzIC1WYWx1ZSAnKicgLUZvcmNlCiAgICB9Cn0K", + "PCMNCi5ERVNDUklQVElPTg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIElucHV0IERhdGEgKGZyb20gdGhlIFVJKQ0KDQoqIERvbWFpbiBNZW1iZXJzaGlwDQogICAgLSBbU3RyaW5nXSAvIFtTZWxlY3QgYm94XSAkRG9tYWluTmFtZSAtIERvbWFpbiBuYW1lDQoqIERvbWFpbiBVc2VyIENyZWRlbnRpYWxzDQogICAgLSBbU3RyaW5nXSAkVXNlck5hbWUgLSBVc2VybmFtZQ0KICAgIC0gW1Bhc3N3b3JkIHN0cmluZ10gJFVzZXJQYXNzd29yZCAtIFVzZXIgcGFzc3dvcmQNCiogU2hhcmVkIEZvbGRlciBJbmZvcm1hdGlvbg0KICAgIC0gW1N0cmluZ10gJFNoYXJlU2VydmVyIC0gU2VydmVyIHdoaWNoIHdpbGwgaG9zdCB0aGUgZm9sZGVyDQogICAgLSBbU3RyaW5nXSAkU2hhcmVOYW1lIC0gU2hhcmUgbmFtZQ0KICAgIC0gW1N0cmluZ10gJFNoYXJlUGF0aCAtIFNoYXJlZCBmb2xkZXIgaW50ZXJuYWwgcGF0aA0KKiBGYWlsb3ZlciBDbHVzdGVyIE1lbWJlcnMNCiAgICAtIFtTdHJpbmddICRDbHVzdGVyTmFtZSAtIENsdXN0ZXIgbmFtZQ0KICAgIC0gW1N0cmluZ10gJENsdXN0ZXJJUCAtIFN0YXRpYyBJUCBhZGRyZXNzIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgY2x1c3Rlcg0KICAgIC0gW1N0cmluZ1tdXSAkQ2x1c3Rlck5vZGVzIC0gTGlzdCBvZiBub2RlIG5hbWVzDQoNCg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIGNyZWF0aW9uIHdvcmtmbG93DQoNCiogQ3JlYXRlIEFEIGRvbWFpbg0KKiBKb2luIGFsbCB0aGUgVk1zIHRvIHRoYXQgZG9tYWluDQoqIFByZXBhcmUgbm9kZXMNCiAgICAtIEluc3RhbGwgRmFpbG92ZXIgQ2x1c3RlciBwcmVyZXF1aXNpdGVzIG9uIGFsbCBGQyBub2Rlcw0KKiBDcmVhdGUgZmFpbG92ZXIgY2x1c3Rlcg0KICAgIC0gQ3JlYXRlIG5ldyBjbHVzdGVyDQogICAgLSBBZGQgbWVtYmVycw0KKiBDb25mdWd1cmUgRkMgcXVvcnVtDQogICAgLSBDcmVhdGUgbmV3IGZvbGRlciB0aGF0IHdpbGwgYmUgc2hhcmVkDQogICAgLSBTaGFyZSB0aGF0IGZvbGRlciB3aXRoIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zDQogICAgLSBDb25maWd1cmUgcXVvcnVtIG1vZGUNCg0KDQoNCiMjIEhlbHBmdWwgU21iU2hhcmUqIEZ1bmN0aW9ucw0KDQoqIE5ldy1TbWJTaGFyZQ0KKiBHcmFudC1TbWJTaGFyZUFjY2Vzcw0KDQojPg0KDQoNCg0KZnVuY3Rpb24gSW5zdGFsbC1GYWlsb3ZlckNsdXN0ZXJQcmVyZXF1aXNpdGVzIHsNCiAgICBJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCg0KICAgIEFkZC1XaW5kb3dzRmVhdHVyZSBGYWlsb3Zlci1DbHVzdGVyaW5nLCBSU0FULUNsdXN0ZXJpbmctUG93ZXJTaGVsbA0KfQ0KDQoNCg0KZnVuY3Rpb24gTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciB7DQoJcGFyYW0gKA0KICAgICAgICBbU3RyaW5nXSAkQ2x1c3Rlck5hbWUsDQogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLA0KICAgICAgICBbU3RyaW5nXSAkU2hhcmVTZXJ2ZXIsDQoJCVtTdHJpbmddICRTaGFyZVBhdGggPSAkKCRFbnY6U3lzdGVtRHJpdmUgKyAnXEZDU2hhcmUnKSwNCgkJW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdGQ1NoYXJlJywNCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLA0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLA0KICAgICAgICAkQ3JlZGVudGlhbCA9ICRudWxsDQoJKQ0KICAgIGJlZ2luIHsNCiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uDQogICAgfQ0KICAgIGVuZCB7DQogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kDQogICAgfQ0KICAgIHByb2Nlc3Mgew0KICAgICAgICB0cmFwIHsNCiAgICAgICAgICAgICYkVHJhcEhhbmRsZXINCiAgICAgICAgfQ0KDQogICAgICAgIFdyaXRlLUxvZyAiLS0+IE5ldy1GYWlsb3ZlckNsdXN0ZXJTaGFyZWRGb2xkZXIiDQoNCiAgICAgICAgV3JpdGUtTG9nICJDcmVhdGluZyBzaGFyZWQgZm9sZGVyIGZvciBGYWlsb3ZlciBDbHVzdGVyIC4uLiINCiAgICAgICAgDQogICAgICAgIGlmICgkQ3JlZGVudGlhbCAtZXEgJG51bGwpIHsNCiAgICAgICAgICAgICRDcmVkZW50aWFsID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCINCiAgICAgICAgfQ0KDQogICAgICAgIGlmICgoVGVzdC1Db25uZWN0aW9uIC1Db21wdXRlck5hbWUgJFNoYXJlU2VydmVyIC1Db3VudCAxIC1RdWlldCkgLWVxICRmYWxzZSkgew0KICAgICAgICAgICAgdGhyb3coIlNlcnZlciAnJFNoYXJlU2VydmVyJyBpcyB1bnJlYWNoYWJsZSB2aWEgSUNNUC4iKQ0KICAgICAgICB9DQoNCiAgICAgICAgJFNlc3Npb24gPSBOZXctUFNTZXNzaW9uIC1Db21wdXRlck5hbWUgJFNoYXJlU2VydmVyIC1DcmVkZW50aWFsICRDcmVkZW50aWFsDQoNCiAgICAgICAgV3JpdGUtTG9nICJDcmVhdGluZyBmb2xkZXIgb24gJyRTaGFyZVNlcnZlcicgLi4uIg0KICAgICAgICBJbnZva2UtQ29tbWFuZCAtU2Vzc2lvbiAkU2Vzc2lvbiAtU2NyaXB0QmxvY2sgew0KICAgICAgICAgICAgICAgIHBhcmFtICgNCiAgICAgICAgICAgICAgICAgICAgW1N0cmluZ10gJFNoYXJlUGF0aCwNCiAgICAgICAgICAgICAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgW1N0cmluZ10gJENsdXN0ZXJBY2NvdW50DQogICAgICAgICAgICAgICAgKQ0KDQogICAgICAgICAgICAgICAgUmVtb3ZlLVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUZvcmNlIC1FcnJvckFjdGlvbiAnU2lsZW50bHlDb250aW51ZScNCiAgICAgICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1Gb3JjZSAtRXJyb3JBY3Rpb24gJ1NpbGVudGx5Q29udGludWUnDQoNCiAgICAgICAgICAgICAgICBOZXctSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1JdGVtVHlwZSBDb250YWluZXIgLUZvcmNlDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYA0KICAgICAgICAgICAgICAgICAgICAtTmFtZSAkU2hhcmVOYW1lIGANCiAgICAgICAgICAgICAgICAgICAgLUZ1bGxBY2Nlc3MgIiRDbHVzdGVyQWNjb3VudCIgYA0KICAgICAgICAgICAgICAgICAgICAtRGVzY3JpcHRpb24gIlNoYXJlZCBmb2xkZXIgZm9yIEZhaWxvdmVyIENsdXN0ZXIuIg0KDQogICAgICAgICAgICB9IC1Bcmd1bWVudExpc3QgJFNoYXJlUGF0aCwgJFNoYXJlTmFtZSwgIiREb21haW5OYW1lXCRDbHVzdGVyTmFtZWAkIg0KDQogICAgICAgIFdyaXRlLUxvZyAiQ29uZmd1cmluZyBGYWlsb3ZlciBDbHVzdGVyIHRvIHVzZSBzaGFyZWQgZm9sZGVyIGFzIHFvdXJ1bSByZXNvdXJzZSAuLi4iDQoNCiAgICAgICAgJG51bGwgPSBTZXQtQ2x1c3RlclF1b3J1bSAtTm9kZUFuZEZpbGVTaGFyZU1ham9yaXR5ICJcXCRTaGFyZVNlcnZlclwkU2hhcmVOYW1lIg0KDQogICAgICAgIFdyaXRlLUxvZyAiPC0tIE5ldy1GYWlsb3ZlckNsdXN0ZXJTaGFyZWRGb2xkZXIiDQogICAgfQ0KfQ0KDQoNCg0KZnVuY3Rpb24gTmV3LUZhaWxvdmVyQ2x1c3RlciB7DQoJcGFyYW0gKA0KICAgICAgICBbU3RyaW5nXSAkQ2x1c3Rlck5hbWUsDQogICAgICAgIFtTdHJpbmddICRTdGF0aWNBZGRyZXNzLA0KICAgICAgICBbU3RyaW5nW11dICRDbHVzdGVyTm9kZXMsDQogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLA0KICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsDQogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQsDQogICAgICAgICRDcmVkZW50aWFsDQogICAgKQ0KICAgIGJlZ2luIHsNCiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uDQogICAgfQ0KICAgIGVuZCB7DQogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kDQogICAgfQ0KICAgIHByb2Nlc3Mgew0KICAgICAgICB0cmFwIHsNCiAgICAgICAgICAgICYkVHJhcEhhbmRsZXINCiAgICAgICAgfQ0KDQogICAgICAgIFdyaXRlLUxvZyAiQ2x1c3Rlck5vZGVzOiAkKCRDbHVzdGVyTm9kZXMgLWpvaW4gJywgJykiDQoNCiAgICAgICAgaWYgKCRDcmVkZW50aWFsIC1lcSAkbnVsbCkgew0KICAgICAgICAgICAgJENyZWRlbnRpYWwgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIg0KICAgICAgICB9DQoNCiAgICAgICAgSW1wb3J0LU1vZHVsZSBGYWlsb3ZlckNsdXN0ZXJzDQoNCiAgICAJaWYgKChHZXQtQ2x1c3RlciAkQ2x1c3Rlck5hbWUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUpIC1lcSAkbnVsbCkgew0KICAgICAgICAgICAgV3JpdGUtTG9nICJDcmVhdGluZyBuZXcgY2x1c3RlciAnJENsdXN0ZXJOYW1lJyAuLi4iDQogICAgICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyAtQ29tbWFuZCBAIg0KSW1wb3J0LU1vZHVsZSBGYWlsb3ZlckNsdXN0ZXJzDQpOZXctQ2x1c3RlciAtTmFtZSAnJENsdXN0ZXJOYW1lJyAtU3RhdGljQWRkcmVzcyAnJFN0YXRpY0FkZHJlc3MnDQoiQCAtQ3JlZGVudGlhbCAkQ3JlZGVudGlhbCAtTm9CYXNlNjQNCiAgICAgICAgICAgIFN0YXJ0LVNsZWVwIC1TZWNvbmRzIDE1DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBXcml0ZS1Mb2cgIkNsdXN0ZXIgJyRDbHVzdGVyTmFtZScgYWxyZWFkeSBleGlzdHMuIg0KICAgICAgICB9DQoNCiAgICAgICAgZm9yZWFjaCAoJE5vZGUgaW4gJENsdXN0ZXJOb2Rlcykgew0KICAgICAgICAgICAgV3JpdGUtTG9nICJBZGRpbmcgbm9kZSAnJE5vZGUnIHRvIHRoZSBjbHVzdGVyICckQ2x1c3Rlck5hbWUnIC4uLiINCiAgICAgICAgICAgIGlmICgoR2V0LUNsdXN0ZXJOb2RlICROb2RlIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlKSAtZXEgJG51bGwpIHsNCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIkFkZGluZyBub2RlIC4uLiINCiAgICAgICAgICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyAtQ29tbWFuZCBAIg0KSW1wb3J0LU1vZHVsZSBGYWlsb3ZlckNsdXN0ZXJzDQpBZGQtQ2x1c3Rlck5vZGUgLUNsdXN0ZXIgJyRDbHVzdGVyTmFtZScgLU5hbWUgJyROb2RlJw0KIkAgLUNyZWRlbnRpYWwgJENyZWRlbnRpYWwgLU5vQmFzZTY0DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIk5vZGUgJyROb2RlJyBhbHJlYWR5IGEgcGFydCBvZiB0aGUgY2x1c3RlciAnJENsdXN0ZXJOYW1lJy4iDQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCg0KDQo8Iw0KDQojIEV4YW1wbGUNCg0KJERvbWFpbk5hbWUgPSAnZmMtYWNtZS5sb2NhbCcNCiREb21haW5Vc2VyID0gJ0FkbWluaXN0cmF0b3InDQokRG9tYWluUGFzc3dvcmQgPSAnUEBzc3cwcmQnDQoNCiRDbHVzdGVyTmFtZSA9ICdmYy10ZXN0Jw0KJENsdXN0ZXJJUCA9ICcxMC4yMDAuMC42MCcNCiRDbHVzdGVyTm9kZXMgPSBAKCdmYy1ub2RlLTAxJywnZmMtbm9kZS0wMicsJ2ZjLW5vZGUtMDMnKQ0KDQokU2hhcmVTZXJ2ZXIgPSAnZmMtZGMtMDEnDQokU2hhcmVOYW1lID0gJ0ZDU2hhcmUnDQoNCiRTaGFyZVBhdGggPSAiQzpcJFNoYXJlTmFtZSINCg0KDQoNCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucyAtRm9yY2UNCg0KJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgYA0KICAgIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJERvbWFpblVzZXIiIGANCiAgICAtUGFzc3dvcmQgIiREb21haW5QYXNzd29yZCINCg0KTmV3LUZhaWxvdmVyQ2x1c3RlciBgDQogICAgLUNsdXN0ZXJOYW1lICRDbHVzdGVyTmFtZSBgDQogICAgLVN0YXRpY0FkZHJlc3MgJENsdXN0ZXJJUCBgDQogICAgLUNsdXN0ZXJOb2RlcyAkQ2x1c3Rlck5vZGVzIGANCiAgICAtQ3JlZGVudGlhbCAkQ3JlZHMNCg0KTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciBgDQogICAgLUNsdXN0ZXJOYW1lICRDbHVzdGVyTmFtZSBgDQogICAgLURvbWFpbk5hbWUgJERvbWFpbk5hbWUgYA0KICAgIC1TaGFyZVNlcnZlciAkU2hhcmVTZXJ2ZXIgYA0KICAgIC1TaGFyZVBhdGggIiRTaGFyZVBhdGgiIGANCiAgICAtU2hhcmVOYW1lICIkU2hhcmVOYW1lIiBgDQogICAgLUNyZWRlbnRpYWwgJENyZWRzDQoNCiM+DQo=" ] } \ No newline at end of file diff --git a/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/InitializeAOAGPrimaryReplica.yaml.json b/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/InitializeAOAGPrimaryReplica.yaml.json index b435269c..26ff01c3 100644 --- a/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/InitializeAOAGPrimaryReplica.yaml.json +++ b/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/InitializeAOAGPrimaryReplica.yaml.json @@ -17,12 +17,12 @@ } ], "Scripts": [ - "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKZnVuY3Rpb24gU2hvdy1JbnZvY2F0aW9uSW5mbyB7CiAgICBwYXJhbSAoCiAgICAgICAgJEludm9jYXRpb24sCiAgICAgICAgW1N3aXRjaF0gJEVuZAogICAgKQoKICAgIGlmICgkRW5kKSB7CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgIH0KICAgIGVsc2UgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8ZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPHBhcmFtPiIKICAgICAgICBmb3JlYWNoICgkUGFyYW1ldGVyIGluICRJbnZvY2F0aW9uLk15Q29tbWFuZC5QYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRLZXkgaW4gJFBhcmFtZXRlci5LZXlzKSB7CiAgICAgICAgICAgICAgICAkVHlwZSA9ICRQYXJhbWV0ZXJbJEtleV0uUGFyYW1ldGVyVHlwZS5GdWxsTmFtZQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJFZhbHVlIGluICRJbnZvY2F0aW9uLkJvdW5kUGFyYW1ldGVyc1skS2V5XSkgewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJbJFR5cGVdICRLZXkgPSAnJFZhbHVlJyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPC9wYXJhbT4iCiAgICB9Cn0KCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKCmZ1bmN0aW9uIFNob3ctSW52b2NhdGlvbkluZm8gewogICAgcGFyYW0gKAogICAgICAgICRJbnZvY2F0aW9uLAogICAgICAgIFtTd2l0Y2hdICRFbmQKICAgICkKCiAgICBpZiAoJEVuZCkgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8L2Z1bmN0aW9uIG5hbWU9JyQoJEludm9jYXRpb24uTXlDb21tYW5kLk5hbWUpJz4iCiAgICB9CiAgICBlbHNlIHsKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPGZ1bmN0aW9uIG5hbWU9JyQoJEludm9jYXRpb24uTXlDb21tYW5kLk5hbWUpJz4iCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjxwYXJhbT4iCiAgICAgICAgZm9yZWFjaCAoJFBhcmFtZXRlciBpbiAkSW52b2NhdGlvbi5NeUNvbW1hbmQuUGFyYW1ldGVycykgewogICAgICAgICAgICBmb3JlYWNoICgkS2V5IGluICRQYXJhbWV0ZXIuS2V5cykgewogICAgICAgICAgICAgICAgJFR5cGUgPSAkUGFyYW1ldGVyWyRLZXldLlBhcmFtZXRlclR5cGUuRnVsbE5hbWUKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRWYWx1ZSBpbiAkSW52b2NhdGlvbi5Cb3VuZFBhcmFtZXRlcnNbJEtleV0pIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiWyRUeXBlXSAkS2V5ID0gJyRWYWx1ZSciCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvcGFyYW0+IgogICAgfQp9CgoKJFRyYXBIYW5kbGVyID0gewogICAgV3JpdGUtTG9nRXJyb3IgQCgiPGV4Y2VwdGlvbj4iLCAkXykgLUVudGlyZU9iamVjdAogICAgV3JpdGUtTG9nRXJyb3IgIjwvZXhjZXB0aW9uPiIKICAgIGJyZWFrCn0KCgp0cmFwIHsKICAgICYkVHJhcEhhbmRsZXIKfQoKJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICdTdG9wJwoKCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", "ZnVuY3Rpb24gTmV3LU9wdGlvbiAoW3N0cmluZ10kTmFtZSwgW3N3aXRjaF0kU3dpdGNoLCBbc3dpdGNoXSRCb29sZWFuLCBbc3dpdGNoXSRTdHJpbmcsIFtzd2l0Y2hdJExpc3QsICRDb25zdHJhaW50cz0kbnVsbCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb24gb2JqZWN0CgogICAgLkRFU0NSSVBUSU9OCiAgICBPcHRpb24gb2JqZWN0IGlzIGEgdmlydHVhbCBvYmplY3QgcmVwcmVzdG50aW5nIHR5cGVkIGNvbW1hbmQgbGluZSBvcHRpb24uIFRoZXNlIG9iamVjdHMgZW5jYXBzdWxhdGUgZXNjYXBpbmcgYW5kCiAgICB2YWxpZGF0aW9uIG1hdHRlcnMuCgogICAgT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgc3dpdGNoZXMgJ1N3aXRjaCcsICdCb29sZWFuJywgJ1N0cmluZycgb3IgJ0xpc3QnIHNob3VsZCBiZSBwcm92aWRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZS4KCiAgICAuUEFSQU1FVEVSIFN3aXRjaAogICAgVXNlIHRoaXMgc3dpdGNoIHRvIGNyZWF0ZSB2YWx1ZWxlc3Mgb3B0aW9uIChhIHN3aXRjaCkuCgogICAgLlBBUkFNRVRFUiBCb29sZWFuCiAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gY3JlYXRlIGJvb2xlYW4gb3B0aW9uLiBJdHMgdmFsdWUgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byAiMSIgb3IgIjAiCgogICAgLlBBUkFNRVRFUiBTdHJpbmcKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgc3RyaW5nIG9wdGlvbi4gSXRzIHZhbHVlIHdpbGwgYmUgcHJvcGVybHkgcXVvdGVkIGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIExpc3QKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgb3B0aW9uIHdpdGggbGlzdCB2YWx1ZS4gVmFsdWVzIHdpbGwgYmUgcHV0IGludG8gY29tbWFuZCBsaW5lIHVzaW5nIHZhbGlkIHZhbHVlIGRlbGVtaXRlciAoYSBjb21tYSkKCiAgICAuUEFSQU1FVEVSIENvbnN0cmFpbnRzCiAgICBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgb3B0aW9uIHZhbHVlcyBhcmUgbGltaXRlZCB0byBvcHRpb25zIGZyb20gdGhhdCBsaXN0LgoKICAgICM+CgogICAgJE9wdGlvbiA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFBTT2JqZWN0CgogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBUeXBlIC12YWx1ZSAkbnVsbAogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IE5hbWUgLXZhbHVlICRudWxsCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgQWxsb3dlZFZhbHVlcyAtdmFsdWUgJG51bGwKCiAgICAjIEluaXQKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgX19pbml0X18gewogICAgICAgIHBhcmFtKFtzdHJpbmddJE5hbWUsICRTd2l0Y2gsICRCb29sZWFuLCAkU3RyaW5nLCAkTGlzdCkKCiAgICAgICAgJHRoaXMuTmFtZSA9ICROYW1lCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIyBXaXRoIHJlc3BlY3QgZm9yIG91ciBkZXZlbG9wZXJzIHdlIGRvIG5vdCBjaGVjayBmb3IgZG91YmxlIHR5cGUgc2VsZWN0ZWQKICAgICAgICBpZiAoJFN3aXRjaCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3dpdGNoKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkQm9vbGVhbikgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uQm9vbGVhbigkdGhpcykKICAgICAgICB9IGVsc2VpZiAoJFN0cmluZykgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3RyaW5nKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkTGlzdCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uTGlzdCgkdGhpcykKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiU3dpdGNoLCBCb29sZWFuLCBTdHJpbmcgb3IgTGlzdCBvcHRpb24gdHlwZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBvcHRpb24gJyROYW1lJyIKICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIF9fcG9zdF9pbml0X18gewogICAgICAgIHBhcmFtKCRDb25zdHJhaW50cz0kbnVsbCkKICAgICAgICBpZiAoJENvbnN0cmFpbnRzIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkdGhpcy5BbGxvd2VkVmFsdWVzID0gQCgpCiAgICAgICAgICAgICR0aGlzLkFsbG93ZWRWYWx1ZXMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzICsgJENvbnN0cmFpbnRzCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnN0cmFpbnRzID0gJG51bGwKICAgICAgICB9CiAgICB9CgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBWYWxpZGF0ZSB7CiAgICAgICAgaWYgKCR0aGlzLkFsbG93ZWRWYWx1ZXMgLW5lICRudWxsKSB7CiAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICR0aGlzLlZhbHVlKSkgewogICAgICAgICAgICAgICAgJEN0cyA9ICR0aGlzLkFsbG93ZWRWYWx1ZXMgLWpvaW4gJywnCiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckKCR0aGlzLk5hbWUpJyBtYXkgaGF2ZSB2YWx1ZXMgKCRDdHMpIGJ1dCBub3QgJyQoJHRoaXMuVmFsdWUpJyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFRvU3RyaW5nIHsKICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpIgogICAgfQoKICAgICMgaW52b2tlIGNvbnN0cnVjdG9yCgogICAgJE9wdGlvbi5fX2luaXRfXygkTmFtZSwgJFN3aXRjaCwgJEJvb2xlYW4sICRTdHJpbmcsICRMaXN0KQogICAgJE9wdGlvbi5fX3Bvc3RfaW5pdF9fKCRDb25zdHJhaW50cykKCiAgICByZXR1cm4gJE9wdGlvbgp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3dpdGNoKCRPcHRpb24pIHsKfQoKZnVuY3Rpb24gQXVnbWVudE9wdGlvbkJvb2xlYW4oJE9wdGlvbikgewogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBWYWx1ZSAtdmFsdWUgJGZhbHNlCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgaWYgKCR0aGlzLlZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9MSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpPTAiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3RyaW5nKCRPcHRpb24pIHsKICAgICMgRmllbGRzCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgVmFsdWUgLXZhbHVlICIiCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgJHYgPSAiJCgkdGhpcy5WYWx1ZSkiCiAgICAgICAgaWYgKCR2IC1tYXRjaCAnLiogLionKSB7CiAgICAgICAgICAgICMgVE9ETzogRXNjYXBlIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzIGlmIHBvc3NpYmxlCiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9YCIkdmAiIgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JHYiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uTGlzdCgkT3B0aW9uKSB7CiAgICAjIEZpZWxkcwogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFZhbHVlIC12YWx1ZSBAKCkKCiAgICAjIE1ldGhvZHMKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFZhbGlkYXRlIHsKICAgICAgICBpZiAoJHRoaXMuQWxsb3dlZFZhbHVlcyAtbmUgJG51bGwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJFYgaW4gJHRoaXMuVmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICRWKSkgewogICAgICAgICAgICAgICAgICAgICRDdHMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzIC1qb2luICcsJwogICAgICAgICAgICAgICAgICAgIHRocm93ICJPcHRpb24gJyQoJHRoaXMuTmFtZSknIG1heSBoYXZlIHZhbHVlcyAoJEN0cykgYnV0IG5vdCAnJFYnIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIC1Gb3JjZSBTY3JpcHRNZXRob2QgVG9TdHJpbmcgewogICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JCgkdGhpcy5WYWx1ZSAtam9pbiAnLCcpIgogICAgfQp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyKCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb25QYXJzZXIgb2JqZWN0LgoKICAgIC5ERVNDUklQVElPTgogICAgT3B0aW9uUGFyc2VyIG9iamVjdCBsZXZlcmFnZXMgT3B0aW9uIG9iamVjdHMgY2FwYWJpbGl0aWVzIGFuZCBidWlsZHMgdmFsaWQgY29tbWFuZCBsaW5lIHVzaW5nIHNwZWNpZmllZCBvcHRpb25zLgogICAgQW4gYXBwbGljYXRpb24gbWF5IGFsc28gYmUgaW52b2tlZCB3aXRoIE9wdGlvblBhcnNlci4KCiAgICAjPgoKICAgICRPcHRpb25QYXJzZXIgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBQU09iamVjdAoKICAgICMgRmllbGRzCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgT3B0aW9ucyAtdmFsdWUgQHt9CiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgRGVmYXVsdHMgLXZhbHVlIEB7fQogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFJlcXVpcmVkT3B0aW9ucyAtdmFsdWUgQCgpCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIEFkZE9wdGlvbiB7CiAgICAgICAgPCMKICAgICAgICAuU1lOT1BTSVMKICAgICAgICBBZGRzIHN1cHBvcnRlZCBvcHRpb24gaW50byBPcHRpb25QYXJzZXIuCiAgICAgICAgCiAgICAgICAgLkRFU0NSSVBUSU9OCiAgICAgICAgT3B0aW9uUGFyc2VyIGRvZXMgbm90IGFsbG93IHVzaW5nIHVucmVjb2duaXplZCBvcHRpb25zLiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsbCBPcHRpb25QYXJzZXIgd2l0aCByZWNvZ25pemVkIG9wdGlvbnMKCiAgICAgICAgLlBBUkFNRVRFUiBPcHRpb24KICAgICAgICBPcHRpb24gb2JqZWN0CgogICAgICAgIC5QQVJBTUVURVIgUmVxdWlyZWQKICAgICAgICBSZXF1aXJlZCBvcHRpb24gc3dpdGNoCgogICAgICAgIC5QQVJBTUVURVIgRGVmYXVsdAogICAgICAgIE9wdGlvbiBkZWZhdWx0IHZhbHVlCiAgICAgICAgIz4KICAgICAgICBwYXJhbSgkT3B0aW9uLCBbYm9vbF0kUmVxdWlyZWQ9JGZhbHNlLCAkRGVmYXVsdD0kbnVsbCkKICAgICAgICAkdGhpcy5PcHRpb25zLkFkZCgkT3B0aW9uLk5hbWUsICRPcHRpb24pCiAgICAgICAgaWYgKCRSZXF1aXJlZCkgewogICAgICAgICAgICAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgPSAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgKyAkT3B0aW9uLk5hbWUKICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgIGlmICgkRGVmYXVsdCkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLkRlZmF1bHRzLkFkZCgkT3B0aW9uLk5hbWUsICREZWZhdWx0KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMuRGVmYXVsdHMuQWRkKCRPcHRpb24uTmFtZSwgJG51bGwpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIFBhcnNlIHsKICAgICAgICA8IwogICAgICAgIC5TWU5PUFNJUwogICAgICAgIFBhcnNlcyBzdXBwbGllZCBvcHRpb25zIGFuZCByZXR1cm5zIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFycmF5LgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQgb25seSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGFsbCBtYW5kYXRvcnkgb3B0aW9ucyBhcmUgaW4gcGxhY2UsIAogICAgICAgIGFsbCBvcHRpb24gbWVldCBjb25zdHJhaW50cyBpZiBhbnkuIFVuc3BlY2lmaWVkIG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhcmUgYWRkZWQgdG8gY29tbWFuZCBsaW5lLgogICAgICAgIFNvLCBtYW5kYXRvcnkgb3B0aW9uIHdpdGggZGVmYXVsdCB2YWx1ZSBuZXZlciBjYXVzZXMgZXhjZXB0aW9uLgoKICAgICAgICAuUEFSQU1FVEVSIE9wdGlvbnMKICAgICAgICBBIGhhc2ggbWFwIG9mIG9wdGlvbnMgdG8gcGFyc2UuIE9wdGlvbiBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgogICAgICAgICM+CiAgICAgICAgcGFyYW0oW2hhc2h0YWJsZV0kT3B0aW9ucykKCiAgICAgICAgJENvbW1hbmRMaW5lID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJFJlcXVpcmVkT3B0aW9uTmFtZSBpbiAkdGhpcy5SZXF1aXJlZE9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJE9wdGlvbnMuQ29udGFpbnNLZXkoJFJlcXVpcmVkT3B0aW9uTmFtZSkpIHsKICAgICAgICAgICAgICAgICREZWZhdWx0ID0gJHRoaXMuRGVmYXVsdHMuR2V0X0l0ZW0oJFJlcXVpcmVkT3B0aW9uTmFtZSkKICAgICAgICAgICAgICAgIGlmICgkdGhpcy5EZWZhdWx0cy5Db250YWluc0tleSgkUmVxdWlyZWRPcHRpb25OYW1lKSkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25zLkFkZCgkUmVxdWlyZWRPcHRpb25OYW1lLCAkdGhpcy5EZWZhdWx0cy5HZXRfSXRlbSgkUmVxdWlyZWRPcHRpb25OYW1lKSkKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlJlcXVpcmVkIG9wdGlvbiAnJFJlcXVpcmVkT3B0aW9uTmFtZScgaXMgbWlzc2luZyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJE9wdGlvbk5hbWUgaW4gJCgkT3B0aW9ucy5rZXlzKSkgewogICAgICAgICAgICAkT3B0aW9uID0gJHRoaXMuT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgaWYgKCRPcHRpb24gLWVxICRudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckT3B0aW9uTmFtZScgaXMgbm90IGFsbG93ZWQiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgICRPcHRpb24uVmFsdWUgPSAkT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgfQogICAgICAgICAgICAkT3B0aW9uLlZhbGlkYXRlKCkKICAgICAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJE9wdGlvbi5Ub1N0cmluZygpCiAgICAgICAgfQogICAgICAgIHJldHVybiAkQ29tbWFuZExpbmUKICAgIH0KCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgRXhlY3V0ZUJpbmFyeSB7CiAgICAgICAgcGFyYW0oJEJpbmFyeSwgW2hhc2h0YWJsZV0kT3B0aW9ucyA9IEB7fSwgJENvbW1hbmRMaW5lU3VmZml4ID0gQCgpKQogICAgICAgIDwjCiAgICAgICAgLlNZTk9QU0lTCiAgICAgICAgRXhlY3V0ZXMgYmluYXJ5IHdpdGggYSBjb21tYW5kIGxpbmUgY29uc3RydWN0ZWQgZnJvbSBwcm92aWRlZCBvcHRpb25zLiBBbiBhcmJpdHJhcnkgc3VmZml4IG1heSBiZSAKICAgICAgICBhcHBlbmRlZCB0byB0aGUgY29tbWFuZCBsaW5lLgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHVzZXMgT3B0aW9uUGFyc2VyLlBhcnNlIG1ldGhvZCB0byBjb25zdHJ1Y3QgY29tbWFuZCBsaW5lLiBJZiB0aGVyZSBhIGNvbW1hbmQgbGluZSBzdWZmaXggCiAgICAgICAgd2FzIHN1cHBsaWVkLCBpdCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIGNvbW1hbmQgbGluZS4gTm9ybWFsbHkgY29tbWFuZCBsaW5lIHN1ZmZpeCBzaG91bGQgY29udGFpbgogICAgICAgIGxlYWRpbmcgc3BhY2UgY2hhcmFjdGVyLgoKICAgICAgICBNZXRob2Qgd2FpdHMgZm9yIGV4ZWN1dGFibGUgcHJvY2VzcyB0byBjb21wbGV0ZSBhbmQgcmV0dXJucyBpdHMgZXhpdCBjb2RlLgoKICAgICAgICAuUEFSQU1FVEVSIEJpbmFyeQogICAgICAgIEZ1bGwgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSB0byBydW4uCgogICAgICAgIC5QQVJBTUVURVIgT3B0aW9ucwogICAgICAgIEEgaGFzaCBtYXAgb2Ygb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBleGVjdXRhYmxlLgoKICAgICAgICAuUEFSQU1FVEVSIENvbW1hbmRMaW5lU3VmZml4CiAgICAgICAgQXJiaXRyYXJ5IGNvbW1hbmQgbGluZSBzdWZmaXguIE5vcm1hbGx5IGl0IHNob3VkIGhhdmUgbGVhZGluZyBzcGFjZSBjaGFyYWN0ZXIuCiAgICAgICAgIz4KCiAgICAgICAgJEJpbmFyeSA9IEdldC1JdGVtICRCaW5hcnkKICAgICAgICAkQ29tbWFuZExpbmUgPSAkdGhpcy5QYXJzZSgkT3B0aW9ucykKICAgICAgICBpZiAoJENvbW1hbmRMaW5lU3VmZml4KSB7CiAgICAgICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICRDb21tYW5kTGluZVN1ZmZpeAogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeGVjdXRpbmc6ICQoJEJpbmFyeS5GdWxsTmFtZSkgJCgkQ29tbWFuZExpbmUgLWpvaW4gJyAnKSIKICAgICAgICAkcHJvY2VzcyA9IFtTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzc106OlN0YXJ0KCRCaW5hcnksICRDb21tYW5kTGluZSkKICAgICAgICAkcHJvY2Vzcy5XYWl0Rm9yRXhpdCgpCiAgICAgICAgJHByb2Nlc3MuUmVmcmVzaCgpCiAgICAgICAgcmV0dXJuICRwcm9jZXNzLkV4aXRDb2RlCiAgICB9CgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQo=", "ZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckluc3RhbGwgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIklOU1RBTEwiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkSXNQYXJ0T2ZEb21haW4gPSAoR2V0LVdtaU9iamVjdCBXaW4zMl9Db21wdXRlclN5c3RlbSkuUGFydE9mRG9tYWluCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIklOU1RBTEwiKSwgJHRydWUsICJJTlNUQUxMIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICMkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVwZGF0ZVNvdXJjZSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIkRSRVBMQVlfQ1RMUiIsIkRSRVBMQVlfQ0xUIiwiU05BQ19TREsiLCJTREsiLCJMb2NhbERCIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJPTEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU1BJX0FTX0V4aXN0aW5nRmFybSIsICJTUElfQVNfTmV3RmFybSIsICJBbGxGZWF0dXJlc19XaXRoRGVmYXVsdHMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRFdPV0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVJTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJOb3JtYWwiLCAiQXV0b0FkdmFuY2UiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU0NPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNDT05GSUdESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU0VSVkVSTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNVUxUSURJTUVOU0lPTkFMIiwgIlBPV0VSUElWT1QiLCAiVEFCVUxBUiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgaWYgKCRJc1BhcnRPZkRvbWFpbikgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6VVNFUkRPTUFJTlxBZG1pbmlzdHJhdG9yIikKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1RFTVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTUFJPVklERVJNU09MQVAiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkFSTVBBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJQQVNTUEhSQVNFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQURNSU5JUE9SVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQlJPV1NFUlNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5BQkxFUkFOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNRTERBVEFESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNBUFdEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTRUNVUklUWU1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnJzICgiU1FMIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTEJBQ0tVUERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQ09MTEFUSU9OIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBRERDVVJSRU5UVVNFUkFTU1FMQURNSU4iIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgIGlmICgkSXNQYXJ0T2ZEb21haW4pIHsKICAgICAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNTEVWRUwiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiMCIsICIxIiwgIjIiLCAiMyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNU0hBUkVOQU1FIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ0FDQ09VTlQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIk5QRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlRDUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU0lOU1RBTExNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIlNoYXJlUG9pbnRGaWxlc09ubHlNb2RlIiwgIkRlZmF1bHROYXRpdmVNb2RlIiwgIkZpbGVzT25seU1vZGUiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1N0YXJ0dXBUeXBlIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IGZvciBpbnN0YWxsZXIgdmVyc2lvbiBvZiBNUyBTUUwgU2VydmVyIHByaW9yIHRvIDIwMTIgU1AxIEN1bXVsYXRpdmUgVXBkYXRlIDIgb25seSB0aGUKICAgIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOiBTUUxFbmdpbmUsIFJlcGxpY2F0aW9uLCBGdWxsVGV4dCwgUlMKCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiUHJlcGFyZUltYWdlIiksICR0cnVlLCAiUHJlcGFyZUltYWdlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVFbmFibGVkIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVTb3VyY2UiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKIyAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJSUyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGRUFUVVJFUyIgLUxpc3QgLUNvbnN0cmFpbnRzICgiU1FMIiwiU1FMRW5naW5lIiwiUmVwbGljYXRpb24iLCJGdWxsVGV4dCIsIkRRIiwiQVMiLCJSUyIsIkRRQyIsIklTIiwiTURTIiwiVG9vbHMiLCJCQyIsIkJPTCIsIkJJRFMiLCJDb25uIiwiU1NNUyIsIkFEVl9TU01TIiwiRFJFUExBWV9DVExSIiwiRFJFUExBWV9DTFQiLCJTTkFDX1NESyIsIlNESyIsIkxvY2FsREIiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTSEFSRURESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQU5DRUlEIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2VTUDFVMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgVGhpcyBjbWRsZXQgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9yIGxhdGVyLgoKICAgIE5vdGUgdGhhdCBmb3IgaW5zdGFsbGVyIHZlcnNpb24gb2YgTVMgU1FMIFNlcnZlciBwcmlvciB0byAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9ubHkgdGhlCiAgICBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDogU1FMRW5naW5lLCBSZXBsaWNhdGlvbiwgRnVsbFRleHQsIFJTCgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlByZXBhcmVJbWFnZSIpLCAkdHJ1ZSwgIlByZXBhcmVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlU291cmNlIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJDT05GSUdVUkFUSU9ORklMRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJISURFQ09OU09MRSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk1TU1FMU0VSVkVSIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIkNvbXBsZXRlSW1hZ2UiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IElOU1RBTkNFSUQgcGFyYW1ldGVyIHZhbHVlIE1VU1QgYmUgdGhlIHNhbWUgYXMgc3BlY2lmaWVkIG9uICJQcmVwYXJlSW1hZ2UiIHBoYXNlLgoKICAgIEFsbCBkb2N1bWVudGVkIG9wdGlvbiBhcmUgc3VwcG9ydGVkLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvciBkZXRhaWxzOgogICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKICAgICM+CiAgICAkT3B0aW9uUGFyc2VyID0gTmV3LU9wdGlvblBhcnNlcgoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBQ1RJT04iIC1TdHJpbmcgLUNvbnN0cmFpbnRzICJDb21wbGV0ZUltYWdlIiksICR0cnVlLCAiQ29tcGxldGVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VJRCIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTVJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkhJREVDT05TT0xFIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUdUU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJCUk9XU0VSU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTkFCTEVSQU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQUxMU1FMREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0FQV0QiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNFQ1VSSVRZTU9ERSIgLVN0cmluZyAtQ29uc3RyYWlucnMgKCJTUUwiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxDT0xMQVRJT04iIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1MRVZFTCIgLVN0cmluZyAtQ29uc3RyYWludHMgKCIwIiwgIjEiLCAiMiIsICIzIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1TSEFSRU5BTUUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiTlBFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVENQRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTSU5TVEFMTE1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU2hhcmVQb2ludEZpbGVzT25seU1vZGUiLCAiRGVmYXVsdE5hdGl2ZU1vZGUiLCAiRmlsZXNPbmx5TW9kZSIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDU3RhcnR1cFR5cGUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICByZXR1cm4gJE9wdGlvblBhcnNlcgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVJbWFnZVNQMVUyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiQ29tcGxldGVJbWFnZSIgYWN0aW9uLgoKICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBTUDEgQ2ltaWxhdGl2ZSBVcGRhdGUgMiBvciBsYXRlci4KCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiQ29tcGxldGVJbWFnZSIpLCAkdHJ1ZSwgIkNvbXBsZXRlSW1hZ2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklBQ0NFUFRTUUxTRVJWRVJMSUNFTlNFVEVSTVMiIC1Td2l0Y2gpLCAkdHJ1ZSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFUlJPUlJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUElEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkJST1dTRVJTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOQUJMRVJBTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTUUxEQVRBRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTQVBXRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0VDVVJJVFlNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW5ycyAoIlNRTCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxCQUNLVVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTENPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTUxFVkVMIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIjAiLCAiMSIsICIyIiwgIjMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTVNIQVJFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNBQ0NPVU5UIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJOUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJUQ1BFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNJTlNUQUxMTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJTaGFyZVBvaW50RmlsZXNPbmx5TW9kZSIsICJEZWZhdWx0TmF0aXZlTW9kZSIsICJGaWxlc09ubHlNb2RlIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJVcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckVkaXRpb25VcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlcGFpciB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJSZWJ1aWxkZGF0YWJhc2UgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiSU5TVEFMTCIgYWN0aW9uLgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlVOSU5TVEFMTCIpLCAkdHJ1ZSwgIlVOSU5TVEFMTCIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZFQVRVUkVTIiAtTGlzdCAtQ29uc3RyYWludHMgKCJTUUwiLCJTUUxFbmdpbmUiLCJSZXBsaWNhdGlvbiIsIkZ1bGxUZXh0IiwiRFEiLCJBUyIsIlJTIiwiRFFDIiwiSVMiLCJNRFMiLCJUb29scyIsIkJDIiwiQk9MIiwiQklEUyIsIkNvbm4iLCJTU01TIiwiQURWX1NTTVMiLCJEUkVQTEFZX0NUTFIiLCJEUkVQTEFZX0NMVCIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VOQU1FIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsRmFpbG92ZXJDbHVzdGVyIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVXBncmFkZSB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJBZGROb2RlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlbW92ZU5vZGUgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9Cg==", "SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKZnVuY3Rpb24gVGVzdC1LZXkoW3N0cmluZ10kcGF0aCwgW3N0cmluZ10ka2V5KSB7CiAgICBpZighKFRlc3QtUGF0aCAkcGF0aCkpIHsgcmV0dXJuICRmYWxzZSB9CiAgICBpZiAoKEdldC1JdGVtUHJvcGVydHkgJHBhdGgpLiRrZXkgLWVxICRudWxsKSB7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCmZ1bmN0aW9uIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBNUyBTUUwgU2VydmVyIHByZXJlcXVpc2l0ZXMgKC5OZXQgRnJhbWV3b3JrIDMuNSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgICM+CiAgICBpZiAoLW5vdCAoVGVzdC1LZXkgIkhLTE06XFNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41IiAiSW5zdGFsbCIpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBTZXJ2ZXJNYW5hZ2VyCiAgICAgICAgV3JpdGUtSG9zdCAiLk5ldCBGcmFtZXdvcmsgMy41IG5vdCBmb3VuZC4gSW5zdGFsbGluZyBpdCB1c2luZyBTZXJ2ZXIgTWFuYWdlci4uLiIKICAgICAgICAkRmVhdHVyZSA9IEdldC1XaW5kb3dzRmVhdHVyZSBORVQtRnJhbWV3b3JrCiAgICAgICAgaWYgKCRGZWF0dXJlIC1lcSAkbnVsbCkgewogICAgICAgICAgICAjIFdlIGFyZSBwcm9iYWJseSBvbiBXaW5kb3dzIFNlcnZlciAyMDEyCiAgICAgICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmstQ29yZQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkRmVhdHVyZSkgewogICAgICAgICAgICB0aHJvdyAiLk5ldCBmcmFtZXdvcmsgMy41IGZlYXR1cmUgd2FzIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlLkRpc3BsYXlOYW1lIC1tYXRjaCAiMy41IikgewogICAgICAgICAgICBMb2ctV2FybmluZyAiLk5ldCBmcmFtZXdvcmsgMy41IGlzIHJlcXVpcmVkLCBidXQgJCgkRmVhdHVyZS5EaXNwbGF5TmFtZSkgaXMgYXZhaWxhYmxlIGFzIFdpbmRvd3MgZmVhdHVyZS4gUHJvY2VlZGluZyB3aXRoIGluc3RhbGxhdGlvbiIKICAgICAgICB9CiAgICAgICAgW3ZvaWRdKEFkZC1XaW5kb3dzRmVhdHVyZSAkRmVhdHVyZSkKICAgIH0KfQoKZnVuY3Rpb24gTmV3LVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUSIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiKSArICRFeHRyYUZlYXR1cmVzfSArICRFeHRyYU9wdGlvbnMpCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSB3aXRoIGFsbCBuZWVkZWQgZmVhdHVyZXMgdG8gc2V0IHVwIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCAKICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW4gdW5hdHRlbmRlZCBtb2RlLiBBbGwgZmVhdHVyZXMgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cHMgYXJlCiAgICBpbnN0YWxsZWQuCgogICAgQWxsIGF2YWlsYWJpbGl0eSBncm91cCBtZW1iZXJzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgU1FMU3ZjVXNyRG9tYW4sIFNRTFN2Y1Vzck5hbWUgYW5kIFNRTFN2Y1VzclBhc3N3b3JkIHBhcmFtZXRlcnMuCiAgICBVc2VyIG11c3QgYmUgYSBkb21haW4gdXNlciBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIG5vZGVzIGludGVyY29ubmVjdGlvbi4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JEb21haW4KICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IGRvbWFpbiBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyTmFtZQogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzclBhc3N3b3JkCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgcmVtb3ZlZCBiZXNpZGVzICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JEb21haW4sCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU1FMU3ZjVXNyTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JQYXNzd29yZCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRTUUxVc2VyID0gIiRTUUxTdmNVc3JEb21haW5cJFNRTFN2Y1Vzck5hbWUiCiAgICAkZG9tYWluID0gTmV3LU9iamVjdCBTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuRGlyZWN0b3J5RW50cnkoIkxEQVA6Ly8kU1FMU3ZjVXNyRG9tYWluIiwgJFNRTFN2Y1Vzck5hbWUsICRTUUxTdmNVc3JQYXNzd29yZCkKCiAgICBpZiAoJGRvbWFpbi5uYW1lIC1lcSAkbnVsbCkgewogICAgICAgIHRocm93ICJDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgdXNlciAkU1FMVXNlci4gQ2hlY2sgZG9tYWluLCBsb2dpbiBuYW1lIGFuZCBwYXNzd29yZC4iCiAgICB9CgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIsICJEUkVQTEFZX0NUTFIiLCAiRFJFUExBWV9DTFQiKSArICRFeHRyYUZlYXR1cmVzOwogICAgICAgICJBR1RTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQUdUU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiQVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJBU1NZU0FETUlOQUNDT1VOVFMiID0gJFNRTFVTZXI7CiAgICAgICAgIlNRTFNWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJTUUxTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJTUUxTWVNBRE1JTkFDQ09VTlRTIiA9ICRTUUxVc2VyOyAiSVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiSVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7IAogICAgICAgICJSU1NWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJSU1NWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZH0gKyAkRXh0cmFPcHRpb25zKQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gUmVtb3ZlLVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQKCiAgICAuREVTQ1JJUFRJT04KICAgIFVuaW5zdGFsbHMgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbnN0YWxsZWQgd2l0aCBOZXctU1FMU2VydmVyIGNtZGxldCBpbiB1bmF0dGVuZGVkIG1vZGUKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIHJlbW92ZWQgYmVzaWRlcyAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJVbmluc3RhbGwKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlEiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIikgKyAkRXh0cmFGZWF0dXJlc30pCgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSIKICAgIH0KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgp9CgpmdW5jdGlvbiBJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLiBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sIAogICAgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIi4gTm90ZSB0aGF0IHByaW9yIHRvCiAgICBTUUwgU2VydmVyIHZlcnNpb24gMjAxMiBTZXJ2aWNlIFBhY2sgMSBDdW11bGF0aXZlIFVwZGF0ZSAyIChKYW51YXJ5IDIwMTMpIG9ubHkgIlJlcGxpY2F0aW9uIiwgCiAgICAiRnVsbFRleHQiIGFuZCAiUlMiIG1heSBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gIlNRTEVuZ2luZSIuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yCiAgICBkZXRpYWxzOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU2V0dXBSb290LAogICAgICAgIFthcnJheV0kRXh0cmFGZWF0dXJlcyA9IEAoKQogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICBSZXNvbHZlLVNRTFNlcnZlclByZXJlcXVpc2l0ZXMKCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZQogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUVMiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiKSArICRFeHRyYUZlYXR1cmVzIH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb21wbGV0ZS1TUUxTZXJ2ZXJBZnRlclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgcHJldmlvdXNseSBwcmVwYXJlZCB3aXRoICJJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAiIE1TIFNRTCBTZXJ2ZXIgYWZ0ZXIgdGhlIHN5c3RlbSB3YXMgcmVhcm1lZC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIAogICAgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdAogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsfSkKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxTdHJpbmcgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3RlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3Rlcy4gVGhlIHN0cmluZyBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVycy4KICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNzk4OTkuYXNweAoKICAgIC5QQVJBTUVURVIgUwogICAgU3RyaW5nIHRvIGNvbnZlcnQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlLCBWYWx1ZUZyb21QaXBlbGluZSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTCiAgICApCiAgICAKICAgIHJldHVybiAiJyQoJFMgLXJlcGxhY2UgIiciLCAiJyciKSciCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxOYW1lIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc1ODc0LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgcmV0dXJuICJbJCgkUyAtcmVwbGFjZSAiXSIsICJdXSIpXSIKfQoKZnVuY3Rpb24gSW52b2tlLVNRTFRleHQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dC4gUmV0dXJucyByYXcgU1FMIHNlcnZlciBvdXRwdXQuCgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQoKICAgICNXcml0ZS1XYXJuaW5nICIkU1FMYG4iCiAgICAjcmV0dXJuCgogICAgJEJpbmFyeSA9IEdldC1Db21tYW5kICJzcWxjbWQuZXhlIgoKICAgICR0ZW1wRmlsZSA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICR0ZW1wRmlsZSA9IEdldC1JdGVtICR0ZW1wRmlsZQogICAgU2V0LUNvbnRlbnQgLVBhdGggJHRlbXBGaWxlIC1WYWx1ZSAkU1FMCgogICAgJENvbW1hbmRMaW5lID0gQCgnLWgnLCAnLTEnLCAnLWInLCAnLWknLCAiYCIkKCR0ZW1wRmlsZS5GdWxsTmFtZSlgIiIpCiAgICBpZiAoKCRVc2VyIC1uZSAkbnVsbCkgLWFuZCAoJFVzZXIgLW5lICcnKSkgewogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctVScKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkVXNlcgogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctUCcKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkUGFzc3dvcmQKICAgIH0KCiAgICBXcml0ZS1EZWJ1ZyAiRXhlY3V0aW5nOiBgbiRTUUxgbiIKICAgIFtzdHJpbmddJG91dHB1dCA9ICYkQmluYXJ5ICRDb21tYW5kTGluZQoKICAgICRFeGl0Q29kZSA9ICRMYXN0RXhpdENvZGUKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICBXcml0ZS1XYXJuaW5nICRvdXRwdXQKICAgICAgICB0aHJvdyAiU1FMQ01ELkVYRSByZXR1cm5lZCB3aXRoIGV4aXQgY29kZSAkRXhpdENvZGUgd2hpbGUgcnVubmluZyAkQmluYXJ5ICRDb21tYW5kTGluZSIKICAgIH0KICAgCiAgICBSZW1vdmUtSXRlbSAkdGVtcEZpbGUKCiAgICByZXR1cm4gJG91dHB1dAp9CgpmdW5jdGlvbiBOZXctU1FMVXNlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQp9CgpmdW5jdGlvbiBOZXctUGFzc3dvcmQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyByYW5kb20gcGFzc3dvcmQgb2YgdGhlIHNwZWNpZmllZCBsZW5ndGgKCiAgICAuREVTQ1JJUFRJT04KICAgIFBhc3N3b3JkIGNvbnRhaW5zIHJhbmRvbSBjaGFyYWN0ZXJzIGEteiwgQS1aLCBudW1iZXJzIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMuCiAgICBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbGwgdGhlIHR5cGVzIG9mIHN5bWJvbHMgd2lsbCBiZSBwcmVzZW50IGluIHRoZSBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIExlbmd0aAogICAgRGVzaXJlZCBsZW5ndGggb2YgdGhlIHBhc3N3b3JkLgoKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRMZW5ndGg9NgogICAgKQoKICAgICRSZXN1bHQgPSAiIgogICAgJGFscGhhID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5IUAjJCVeJiooKSdgImBgXytbXVx7fXw7OiwuLzw+P34iCiAgICB3aGlsZSAoJExlbmd0aCAtZ3QgMCkgewogICAgICAgICR4ID0gR2V0LVJhbmRvbSAkYWxwaGEuTGVuZ3RoCiAgICAgICAgJGMgPSAkYWxwaGFbJHhdCiAgICAgICAgJFJlc3VsdCA9ICIkUmVzdWx0JGMiCiAgICAgICAgJExlbmd0aCA9ICRMZW5ndGggLSAxCiAgICB9CiAgICByZXR1cm4gJFJlc3VsdAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5ERVNDUklQVElPTgogICAgTWFzdGVyIGtleSBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeS4gSG9zdCBjZXJ0aWZpY2F0ZSBpcyBjcmVhdGVkIHdoZW4gbmVjZXNzYXJ5IGVpdGhlciAobm9ybWFsbHkgb24gZmlyc3QgZW5kcG9pbnQgY3JlYXRpb24pLgoKICAgIEVuZHBvaW50IGFuZCBjZXJ0aWZpY2F0ZSBhcmUgcmVjcmVhdGVkIGluIGNhc2UgaWYgbWFzdGVyIGtleSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3Qgbm9ybWFsbHkgaGFwcGVuKS4KCiAgICBFbmRwb2ludCBpcyByZWNyZWF0ZWQgaW4gY2FzZSBpZiBjZXJ0aWZpY2F0ZSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyB0aGUgZW5kcG9pbnQgd2FzIGNyZWF0ZWQgbWFudWFsbHkpLgoKICAgIE1pcnJvcmluZyBlbmRwb2ludCBpcyBjcmVhdGVkIHVubGVzcyBvbmUgYWxyZWFkeSBleGlzdHMuIFRoZSBlbmRwb2ludCBpcyBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBXaGVuIHRoZSBlbmRwb2ludAogICAgYWxyZWFkeSBleGlzdHMgaXMgaXMgdW5jaGFuZ2VkLgoKICAgIEVuZHBvaW50IHBvcnQgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseSBhcyA0MDIyIG9yIGFzIGZpcnN0IGF2YWlsYWJsZSBwb3J0IGFmdGVyIDQwMjIgaW4gY2FzZSBpZiA0MDIyIGlzIGFscmVhZHkgbGlzdGVuaW5nLgogICAgSWYgdGhlcmUgaXMgbm8gZmlyZXdhbGwgcnVsZSB3aXRoIG5hbWUgJ0RhdGFiYXNlTWlycm9yaW5nLVRDUC17cG9ydG51bWJlcn0nLCBhbGxvd2luZyBydWxlIGlzIGNyZWF0ZWQuCgogICAgQ2VydGlmaWNhdGUgaXMgc3RvcmVkIGluIHRoZSBzcGVjaWZpZWQgZmlsZS4KCiAgICBSZXR1cm5zIGVuZHBvaW50IGxpc3RlbmluZyBwb3J0LgoKICAgIC5QQVJBTUVURVIgRW5jcnlwdGlvblBhc3N3b3JkCiAgICBFbmNyeXB0aW9uIHBhc3N3b3JkIHVzZWQgdG8gY3JlYXRlIGNlcnRpZmljYXRlLgoKICAgIC5QQVJBTUVURVIgQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgQ2VydGlmaWNhdGUgdGFyZ2V0IGZpbGUgbmFtZS4gRmlsZSBNVVNUIE5PVCBleGlzdC4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRDZXJ0aWZpY2F0ZUZpbGVOYW1lCiAgICApCgogICAgJEVuZHBvaW50TmFtZSA9ICdNaXJyb3JpbmdFbmRwb2ludCcKCiAgICAkRm9sZGVyID0gR2V0LUl0ZW0gJFdvcmtEaXIKCiAgICAkSCA9ICRFbnY6Q09NUFVURVJOQU1FIC1yZXBsYWNlICdbXkEtWmEtejAtOV9dJywgJ18nCgogICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0IDQwMjIKCiAgICAkQ3JlYXRlTWFzdGVyS2V5ID0gIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5bW1ldHJpY19rZXlzIHdoZXJlIG5hbWUgPSAnIyNNU19EYXRhYmFzZU1hc3RlcktleSMjJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBNQVNURVIgS0VZIEVOQ1JZUFRJT04gQlkgUEFTU1dPUkQgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJEVuY3J5cHRpb25QYXNzd29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X2NlcnQgV0lUSCBTVUJKRUNUID0gJyR7SH0gZW5kcG9pbnQgY2VydGlmaWNhdGUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIEJBQ0tVUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQgVE8gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJENlcnRpZmljYXRlRmlsZU5hbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBwb3J0IGludAogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoU0VMRUNUICogRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSBwb3J0IEZST00gc3lzLnRjcF9lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIEVORCBFTFNFCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgRU5EUE9JTlQgJChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFID0gU1RBUlRFRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTIFRDUCAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJU1RFTkVSX1BPUlQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIExJU1RFTkVSX0lQID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0VfTUlSUk9SSU5HICggCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhFTlRJQ0FUSU9OID0gQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgRU5DUllQVElPTiA9IFJFUVVJUkVEIEFMR09SSVRITSBBRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBST0xFID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAncG9ydDooJyArIENPTlZFUlQoVkFSQ0hBUiwgYEBwb3J0KSArICcpJyBhcyBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRDcmVhdGVNYXN0ZXJLZXkKICAgIFtpbnRdJFBvcnQgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipwb3J0OlwoKFteKV0qKVwpLionLCAnJDEnCgogICAgIyBPcGVuIHBvcnQgaW4gV2luZG93cyBGaXJld2FsbAoKICAgICRQb3J0T3BlbiA9ICRmYWxzZQogICAgJFJ1bGVOYW1lID0gIkRhdGFiYXNlTWlycm9yaW5nLVRDUC0kUG9ydCIKICAgIEdldC1OZXRGaXJld2FsbFJ1bGUgfCBGb3JlYWNoLU9iamVjdCB7CiAgICAgICAgaWYgKCRfLk5hbWUgLWVxICRSdWxlTmFtZSkgewogICAgICAgICAgICAkUG9ydE9wZW4gPSAkdHJ1ZQogICAgICAgIH0KICAgIH0KICAgIGlmICgtbm90ICRQb3J0T3BlbikgewogICAgICAgICREaXNwbGF5TmFtZSA9ICJNUyBTUUwgRGF0YWJhc2UgTWlycm9yaW5nIEVuZHBvaW50IGF0IFRDUCBwb3J0ICRQb3J0IgogICAgICAgIE5ldy1OZXRGaXJld2FsbFJ1bGUgLU5hbWUgJFJ1bGVOYW1lIC1EaXNwbGF5TmFtZSAkRGlzcGxheU5hbWUgLURlc2NyaXB0aW9uICREaXNwbGF5TmFtZSAtUHJvdG9jb2wgVENQIC1Mb2NhbFBvcnQgJFBvcnQgLUVuYWJsZWQgVHJ1ZSAtUHJvZmlsZSBBbnkgLUFjdGlvbiBBbGxvdwogICAgfQogICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIENvbXBsZXRlLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBtaXJyb3JpbmcgZW5kcG9pbnQKCiAgICAuREVTQ1JJUFRJT04KICAgIEFsbG93cyBpbmJvdW5kIGNvbm5lY3Rpb25zIGZyb20gcmVtb3RlIGhvc3QKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TG9naW4sCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFVzZXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFBhc3N3b3JkCiAgICApCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRSZW1vdGVXb3JrRGlyCiAgICAkUmVtb3RlV29ya0RpciA9ICRGb2xkZXIuRnVsbE5hbWUKCiAgICAkSCA9ICRSZW1vdGVIb3N0TmFtZSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgIGlmICgtbm90ICRSZW1vdGVIb3N0TG9naW4pIHsKICAgICAgICAkUmVtb3RlSG9zdExvZ2luID0gIiR7SH1fbG9naW4iCiAgICB9CiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdFVzZXIpIHsKICAgICAgICAkUmVtb3RlSG9zdFVzZXIgPSAiJHtIfV91c2VyIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RQYXNzd29yZCkgewogICAgICAgICRSZW1vdGVIb3N0UGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKICAgIH0KCiAgICAkU1FMID0gICAgICAgICAgICAgIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnNxbF9sb2dpbnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RMb2dpbikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSBXSVRIIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0UGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuc3lzdXNlcnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RVc2VyKSkKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBVU0VSICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RVc2VyKSBGT1IgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWU9JyR7SH1fcmVtb3RlX2NlcnQnKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIENFUlRJRklDQVRFICR7SH1fcmVtb3RlX2NlcnQgQVVUSE9SSVpBVElPTiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRlJPTSBGSUxFID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAnbmFtZTooJyArIGBAbmFtZSArICcpJyBhcyBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICIKCiAgICAkcmF3ZGF0YSA9IEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTAogICAgJEVuZHBvaW50TmFtZSA9ICRyYXdkYXRhIC1yZXBsYWNlICcuKm5hbWU6XCgoW14pXSopXCkuKicsICckMScKICAgICRTUUwgPSAgICAgICAgICAgICAiR1JBTlQgQ09OTkVDVCBPTiBFTkRQT0lOVDo6JChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKSBUTyAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0TG9naW4pIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTCkKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMTWlycm9yIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBjcmVhdGlvbiBvZiBtaXJyb3JlZCBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSBmaXJzdCBleGVjdXRlZCBvbiBtaXJyb3Igc2VydmVyIGFuZCB0aGVuIG9uIHByaW5jaXBhbCBzZXJ2ZXIuCiAgICBPdGhlcndpc2UgaXQgd2lsbCBmYWlsIChob3dldmVyIGl0IG1heSBiZSBleGVjdXRlZCBhZ2FpbiB3aXRoIG5vIGhhcm0pLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbSW50XSRSZW1vdGVQb3J0LAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgICRVcmwgPSAiVENQOi8vJHtSZW1vdGVIb3N0TmFtZX06JHtSZW1vdGVQb3J0fSIKICAgICRBbHRlckRiID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIFBBUlRORVIgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJFVybCk7CiAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRiKQp9CgpmdW5jdGlvbiBOZXctU1FMRGF0YWJhc2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBlbXB0eSBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlIHdpdGggZGVmYXVsdCBzZXR0aW5ncy4gRmFpbHMgaW4gY2FzZSBpcyB0aGUgZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIERhdGFiYXNlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBtZGZGaWxlCiAgICBOYW1lIG9mIHRoZSBNREYgKGRhdGEpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX0ubWRmIgogICAgV2hlcmUge0RhdGFCYXNlUGF0aE5hbWV9IGlzIGRhdGFiYXNlIG5hbWUgd2l0aCBhbGwgYnV0IEEtWiwgYS16LCAwLTkgY2hhcmFjdGVycwogICAgcmVwbGFjZWQgYnkgdW5kZXJzY29yZS4KCiAgICAuUEFSQU1FVEVSIERhdGFCYXNlTmFtZQogICAgTmFtZSBvZiB0aGUgTERGICh0cmFuc2FjdGlvbiBsb2cpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZSwKICAgICAgICBbU3RyaW5nXSRtZGZGaWxlPSRudWxsLAogICAgICAgIFtTdHJpbmddJGxkZkZpbGU9JG51bGwKICAgICkKCiAgICAkRGF0YUJhc2VQYXRoTmFtZSA9ICREYXRhQmFzZU5hbWUgLXJlcGxhY2UgJ1teMC05YS16QS1aXScsICdfJwogICAgaWYgKC1ub3QgJG1kZkZpbGUpIHsKICAgICAgICAkbWRmRmlsZSA9ICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVwke0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIH0KICAgIGlmICgtbm90ICRsZGZGaWxlKSB7CiAgICAgICAgJGxkZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfV9sb2cubGRmIgogICAgfQoKICAgICROZXdEYXRhYmFzZSA9ICIKICAgICAgICBDUkVBVEUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgICAgICAgICAgQ09OVEFJTk1FTlQgPSBOT05FCiAgICAgICAgICAgICAgICBPTiAgUFJJTUFSWSAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkRGF0YUJhc2VOYW1lKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRtZGZGaWxlKSAsIFNJWkUgPSA0MDk2S0IgLCBGSUxFR1JPV1RIID0gMTAyNEtCICkKICAgICAgICAgICAgICAgIExPRyBPTiAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJHtEYXRhQmFzZU5hbWV9X2xvZyIpLCBGSUxFTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJGxkZkZpbGUpICwgU0laRSA9IDEwMjRLQiAsIEZJTEVHUk9XVEggPSAxMCUpCiAgICAgICAgR08KICAgICAgICBVU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgIEdPCiAgICAgICAgSUYgTk9UIEVYSVNUUyAoU0VMRUNUIG5hbWUgRlJPTSBzeXMuZmlsZWdyb3VwcyBXSEVSRSBpc19kZWZhdWx0PTEgQU5EIG5hbWUgPSBOJ1BSSU1BUlknKSBBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIE1PRElGWSBGSUxFR1JPVVAgW1BSSU1BUlldIERFRkFVTFQKICAgICAgICBHTyIKCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkTmV3RGF0YWJhc2UpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCAodGhpcyBpcyBhYnNvbHV0ZWx5IHN5bW1ldHJpYyBzdGVwIHRvIHRoZSBtaXJyb3IgaW5pdCkuIEluIGFkZGl0aW9uIHRvIHRoYXQgaXQgY3JlYXRlcwogICAgYSBkYXRhYmFzZSBhbmQgc3RvcmVzIGJhY2t1cHMgb2YgaXQgYW5kIGl0cyB0cmFuc2FjdGlvbiBsb2cgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBlbmRwb2ludCBjZXJ0aWZpY2F0ZS4KCiAgICBBIGZpcmV3YWxsIHJ1bGUgaXMgY3JlYXRlZCBmb3IgZW5kcG9pbnQgaWYgbmVjZXNzYXJ5LgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBtaXJyb3Igc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIGJlIHVzZSBhdCBtaXJyb3Igc2VydmVyIGVpdGhlci4KICAgIAogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQogICAgaWYgKChHZXQtQ2hpbGRJdGVtIC1QYXRoICRXb3JrRGlyKS5MZW5ndGggLWd0IDApIHsKICAgICAgICB0aHJvdyAiV29ya2luZyBkaXJlY3RvcnkgJFdvcmtEaXIgaXMgbm90IGVtcHR5IgogICAgfQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCiAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQoKICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsIE5BTUUgPSBOJ0Z1bGwgRGF0YWJhc2UgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAkQmFja3VwTG9nID0gIkJBQ0tVUCBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlX2xvZy5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCAgTkFNRSA9IE4nVHJhbnNhY3Rpb24gTG9nICBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAobWlycm9yKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIG1pcnJvciBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpcgogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAzKQoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIG1pcnJvciBjcmVhdGlvbi4gVGhpcyBzdGVwIG11c3QgYmUgZ2xvYmFsbHkgdGhlIGxhc3Qgb25lIGluIG1pcnJvciBjcmVhdGlvbiBzZXF1ZW5jZS4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZSBhbmQgbmFtZSBwcm92aWRlZCBvbiBzdGVwIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UxKQoKICAgIC5ERVNDUklQVElPTgogICAgSW5pdGlhbGl6ZXMgbWlycm9yaW5nIGVuZHBvaW50IGZvciBtaXJyb3Igc2VydmVyLiBTdG9yZXMgbWlycm9yaW5nIGVuZHBvaW50IGNlcnRpZmljYXRlIGluIFdvcmtkaXIuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5kIGRpcmVjdG9yeS4gVGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRyYW5mZXJyZWQgdG8gdGhlIHByaW5jaXBhbCBzZXJ2ZXIgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMikKCiAgICAuREVTQ1JJUFRJT04KICAgIEltcG9ydHMgcmVtb3RlIHNlcnZlciBjZXJ0aWZpY2F0ZSBhbmQgZ3JhbnRzIGl0IHdpdGggYWNjZXNzIHRvIHRoZSBtaXJyb3JpbmcgZW5kcG9pbnQuCiAgICBSZXN0b3JlcyBkYXRhYmFzZSBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBhbmQgbGVhdmVzIGl0IGluICdSZXN0b3JpbmcnIHN0YXRlLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKCiAgICAkUmVzdG9yZURiID0gIlJFU1RPUkUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2UuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRSZW1vdGVXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGV4ZWN1dGVkIHN0cmljdGx5IGJlZm9yZSBzeW1tZXRyaWMgc3RlcCBvbiB0aGUgcHJpbmNpcGFsLgoKICAgIE5vdGUgdGhhdCB0aGUgcmVtb3RlIGhvc3QgY2VydGlmaWNhdGUgaXMgdmFsaWQgZnJvbSB0aGUgdGltZSBpdCBpcyBjcmVhdGVkIHRoZXJlLiBTbwogICAgdGhpcyBzdGVwIHdpbGwgZmFpbCBpZiB0aGVyZSBpcyBub3RpY2FibGUgZGlmZmVyZW50IGluIHRpbWUgbG9jYWwgYW5kIHJlbW90ZSBtYWNoaW5lcy4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbaW50XSRwb3J0ID0gR2V0LUNvbnRlbnQgIiR7UmVtb3RlV29ya0Rpcn1cZW5kcG9pbnQtcG9ydC50eHQiCiAgICBDb21wbGV0ZS1TUUxNaXJyb3IgJFJlbW90ZUhvc3ROYW1lICRwb3J0ICREYXRhYmFzZU5hbWUKfQoKZnVuY3Rpb24gR2V0LU5leHRGcmVlUG9ydCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBSZXR1cm5zIHNwZWNpZmllZCBkZXNpcmVkIHBvcnQgb3IgY2xvc2VzdCBuZXh0IG9uZSB1bm9jY3VwaWVkLgoKICAgIC5QQVJBTUVURVIgUG9ydAogICAgRGVzaXJlZCBwb3J0IG51bWJlci4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtpbnRdJFBvcnQKICAgICkKICAgICRPcGVuUG9ydHMgPSBuZXRzdGF0IC1hb24gfCBzZWxlY3Qtc3RyaW5nICdMSVNURU5JTkcnIHwgRm9yZWFjaC1PYmplY3QgeyAoKCRfIC1yZXBsYWNlICdeXHMqJywgJycgLXNwbGl0ICdccysnKVsxXSAtc3BsaXQgJy4qOicpWzFdIH0gfCBTb3J0LU9iamVjdCB8IEdldC1VbmlxdWUKICAgIHdoaWxlICgkT3BlblBvcnRzLkNvbnRhaW5zKCR7UG9ydH0pKSB7CiAgICAgICAgJFBvcnQgPSAkUG9ydCArIDEKICAgIH0KICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluaXRpYWxpemVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlciBhbmQgY3JlYXRlcyBBbHdheXNPbiBlbmRwb2ludCBsaXN0ZW5lci4gUmV0dXJucyBBbHdheXNPbiBlbmRwb2ludCBwb3J0IG51bWJlci4KCiAgICAuREVTQ1JJUFRJT04KICAgIEVuYWJsZXMgQWx3YXlzT24gY2x1c3RlcmluZyBvbiBsb2NhbCBTUUwgc2VydmVyLiBDcmVhdGVzIEFsd2F5c09uIFRDUCBlbmRwb2ludCBvbiBwb3J0IDUwMjIgb3IgZ3JlYXRlciBpZiB0aGUgb25lIGlzIG9jY3VwaWVkLiAgIAogICAgIz4KCiAgICBpZiAoIShUZXN0LVBhdGggU1FMU0VSVkVSOlwpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBzcWxwcwogICAgfQogICAgJE1hY2hpbmVOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUwpWzBdLlBTQ2hpbGROYW1lCiAgICAkSW5zdGFuY2VOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lKS5QU0NoaWxkTmFtZQogICAgJEFsd2F5c09uRW5hYmxlZCA9ICgoR2V0LUl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lXCRJbnN0YW5jZU5hbWUpIHwgc2VsZWN0IElzSGFkckVuYWJsZWQpLklzSGFkckVuYWJsZWQKICAgIGlmICgtbm90ICRBbHdheXNPbkVuYWJsZWQpIHsKICAgICAgICBFbmFibGUtU3FsQWx3YXlzT24gLVBhdGggIlNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lIiAtRm9yY2UKICAgIH0KICAgICRJbnN0YW5jZSA9IEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICAkZW5kcG9pbnQgPSAkSW5zdGFuY2UuRW5kcG9pbnRzWyJBbHdheXNPbkVuZHBvaW50Il0KICAgIGlmICgtbm90ICRlbmRwb2ludCkgewogICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA1MDIyCiAgICAgICAgJGVuZHBvaW50ID0gTmV3LVNxbEhhZHJFbmRwb2ludCBBbHdheXNPbkVuZHBvaW50IC1Qb3J0ICRQb3J0IC1QYXRoIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICB9IGVsc2UgewogICAgICAgICRQb3J0ID0gJGVuZHBvaW50LlByb3RvY29sLlRjcC5MaXN0ZW5lclBvcnQKICAgIH0gCiAgICBpZiAoJGVuZHBvaW50LkVuZHBvaW50U3RhdGUgLW5lICJTdGFydGVkIikgewogICAgICAgICRlbmRwb2ludC5TdGFydCgpCiAgICB9ICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbmV3IEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBvbiBwcmltYXJ5IHJlcGxpY2EuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSByZXBsaWNhIHNlcnZlcihzKSBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgQXZhaWxhYmlsaXR5IGdyb3VwIG5hbWUuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWVzCiAgICBSZXBsaWNhIGRhdGFiYXNlKHMpIG5hbWVzLgoKICAgIC5QQVJBTUVURVIgUmVwbGljYURlZnMKICAgIEFycmF5IG9mIHJlcGxpY2EgZGVmaW5pdGlvbi4gRWFjaCBkZWZpbml0aW9uIGlzIGEgaGFzaCB0YWJsZSB3aXRoIHJlcGxpY2Etc3BlY2lmaWMgdmFsdWVzLgogICAgCiAgICBNYW5kYXRvcnkgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW1N0cmluZ10gU0VSVkVSX0lOU1RBTkNFICAgLSBSZXBsaWNhIHNlcnZlciBpbnN0YW5jZSBuYW1lCiAgICAgICAgKiBbU3RyaW5nXSBFTkRQT0lOVF9VUkwgICAgICAtIFJlcGxpY2Egc2VydmVyIGVuZHBvaW50IFVSTC4gTm9ybWFsbHkgaXQgaXMgVENQOi8vZnVsbHkucXVhbGlmaWVkLmRvbWFpbi5uYW1lOjUwMjIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQgbnVtYmVyIHNob3VsZCBiZSBvYnRhaW5lZCB3aXRoIEluaXRpYWxpemUtQWx3YXlzT24gYXQgdGhlIHJlcGxpY2Egc2VydmVyCiAgICAgICAgKiBbU3RyaW5nXSBBVkFJTEFCSUxJVFlfTU9ERSAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiU1lOQ0hST05PVVNfQ09NTUlUIiBvciAiQVNZTkNIUk9OT1VTX0NPTU1JVCIgb25seS4KICAgICAgICAqIFtTdHJpbmddIEZBSUxPVkVSX01PREUgICAgIC0gUmVwbGljYSBhdmFpbGFiaWxpdHkgbW9kZS4gQ2FuIGJlICJNQU5VQUwiIG9yICJBVVRPTUFUSUMiIG9ubHkuCgogICAgT3B0aW9uYWwgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW0ludGVnZXJdIEJBQ0tVUF9QUklPUklUWSAgICAgICAgICAtIEJhY2t1cCBwcmlvcml0eQogICAgICAgICogW0ludGVnZXJdIFNFU1NJT05fVElNRU9VVCAgICAgICAgICAtIFNlc3Npb24gdGltZW91dAogICAgICAgICogW1N0cmluZ10gIFBfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlByaW1hcnkiIHJlcGxpY2EgbW9kZS4gQ2FuIGJlICJSRUFEX1dSSVRFIiBvciAiQUxMIiBvbmx5LgogICAgICAgICogW0FycmF5XSAgIFBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCAtIExpc3Qgb2YgcmVwbGljYXMgcHJvdmlyaW5nIHJlYWRvbmx5IGFjY2VzcyB3aGVuIHRoaXMgb25lIGlzIHByaW1hcnkuCiAgICAgICAgKiBbU3RyaW5nXSAgU19BTExPV19DT05ORUNUSU9OUyAgICAgIC0gQWxsb3dlZCBjb25uZWN0aW9uIHR5cGVzIGZvciAiU2Vjb25kYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSBvbmUgb2YgIk5PIiwgIlJFQURfT05MWSIsICJBTEwiLgogICAgICAgICogW1N0cmluZ10gIFNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMICAtIFJlcGxpY2EgcmVhZC1vbmx5IHJlcXVlc3RzIGxpc3RlbmVyIFVSTC4gTm9ybWFsbHkgZGVmYXVsdCBzZXJ2ZXIgbGlzdGVuZXIgYXQgcG9ydCAxNDMzIGlzIHVzZWQuCgogICAgLlBBUkFNRVRFUiBQcmVmZXJlbmNlcwogICAgSGFzaCB0YWJsZSBvZiBnZW5lcmFsIGF2YWlsYWJpbGl0eSBncm91cCBwcmVmZXJlbmNlcy4gQWxsIHRoZSBrZXlzIGFyZSBvcHRpb25hbC4gU3VwcG9ydGVkIGVudHJ5IGtleXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddICBBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UgLSBBdXRvbWF0ZWQgYmFja3VwIHByZWZlcmVuY2UuIENhbiBiZSAiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiIG9yICJOT05FIi4KICAgICAgICAqIFtTdHJpbmddICBGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCAgICAgLSBGYWlsdXJlIGNvbmRpdGlvbiBsZXZlbC4gQ2FuIGJlICIxIiwgIjIiLCAiMyIsICI0IiBvciAiNSIuCiAgICAgICAgKiBbSW50ZWdlcl0gSEVBTFRIX0NIRUNLX1RJTUVPVVQgICAgICAgIC0gUmVwbGljYSBoZWFsdGggY2hlY2sgdGltZW91dC4KCiAgICAuUEFSQU1FVEVSIExpc3RlbmVyRGVmCiAgICBIYXNoIHRhYmxlIGNvbnRhaW5pbmcgYXZhaWxhYmlsaXR5IGdyb3VwIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24uCgogICAgTWFuZGF0b3J5IGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKCiAgICAgICAgW1N0cmluZ10gTkFNRSAtIExpc3RlbmVyIG5hbWUuCgogICAgT3B0aW9uYWwgbGlzdGVuZXIgY29uZmlndXJhdGlvbiB2YWx1ZXMgYXJlOgogICAgCiAgICAgICAgW1N0cmluZ10gUE9SVCAtIExpc3RlbmVyIHBvcnQgbnVtYmVyLiBJbnRlZ2VyIHZhbHVlIG1heSBiZSBzdWZmaXhlZCBieSBhICIrIiBzeW1vbCAoc3VjaCBhcyAiNTAyMisiKSB3aGljaCBhbGxvd3MgdGhlIHJvdXRpbmUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IG5leHQgZnJlZSBwb3J0IHdpdGggbnVtYmVyIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgICBbU3RyaW5nXSBESENQIC0gREhDUCBsaXN0ZW5lciBhZGRyZXNzIGNvbmZpZ3VyYXRpb24gZmxhZy4gV2hlbiBhbnkgdmFsdWUgc3BlY2lmaWVkLCBESENQIGlzIHVzZWQgdG8gY29uZmlndXJlIGxpc3RlbmVyCiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGlzIGFsc28gdGhlIGRlZmF1bHQgYmVoYXZpb3IpLiBBbHNvLCBhIHNwZWNpZmljIGludGVyZmFjZSBmb3IgREhDUCBtYXkgYmUgc3BlY2lmaWVkIGFzIElQX0FERFJFU1MvTUFTSwogICAgICAgICAgICAgICAgICAgICAgICAobGlrZSAiMTkyLjE2OC4xLjAvMjU1LjI1NS4yNTUuMCIpIGFzIGEgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KICAgICAgICBbQXJyYXldIFNUQVRJQyAtIFN0YXRpYyBJUCBhZGRyZXNzZXMgdG8gbGlzdGVuLiBJUCBhZGRyZXNzZXMgbWF5IGJlIElQdjQgYWRkcmVzc2VzIGluIHRoZSAiSVBfQUREUkVTUy9NQVNLIiBmb3JtIG9yIElQdjYKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VzIGluIHN0YW5kYXJkIElQdjYgbm90YXRpb24uCgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9mZjg3ODM5OS5hc3B4IHBhZ2UgZm9yIG1vcmUgZGV0YWlscyByZWdhcmRpbmcgYWxsIHRoZSBzdXBwb3J0ZWQgb3B0aW9ucy4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtBcnJheV0kRGF0YWJhc2VOYW1lcywKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJFJlcGxpY2FEZWZzLAogICAgICAgIFtwYXJhbWV0ZXJdCiAgICAgICAgW0hhc2h0YWJsZV0kUHJlZmVyZW5jZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0hhc2h0YWJsZV0kTGlzdGVuZXJEZWYKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkUXVvdGVkREJOYW1lcyA9ICgkRGF0YWJhc2VOYW1lcyB8IEZvckVhY2gtT2JqZWN0IHsgQ29udmVydFRvLVNRTE5hbWUgJF8gfSkgLWpvaW4gIiwgIgoKICAgIGlmICgkUHJlZmVyZW5jZXMgLWVxICRudWxsKSB7CiAgICAgICAgJFByZWZlcmVuY2VzID0gQCgpCiAgICB9CiAgICAkUHJlZnMgPSBAKCkKICAgIGZvcmVhY2goJFByZWYgaW4gJFByZWZlcmVuY2VzKSB7CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgJG51bGwpIHsKICAgICAgICAgICAgQ29udGludWUKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgIkFVVE9NQVRFRF9CQUNLVVBfUFJFRkVSRU5DRSIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCJQUklNQVJZIiwgIlNFQ09OREFSWV9PTkxZIiwgIlNFQ09OREFSWSIsICJOT05FIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAkUHJlZi5LZXkpCiAgICAgICAgfSBlbHNlaWYgKCRQcmVmLktleSAtZXEgIkZBSUxVUkVfQ09ORElUSU9OX0xFVkVMIikgewogICAgICAgICAgICAkUHJlZnMgPSAkUHJlZnMgKyAoVmFsaWRhdGUtT3B0aW9uICRQcmVmLktleSwgJFByZWYuVmFsdWUsIEAoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJIRUFMVEhfQ0hFQ0tfVElNRU9VVCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLUludE9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93ICJVbmV4cGVjdGVkIHBlZmVyZW5jZXMgb3B0aW9uOiAnJCgkUHJlZi5LZXkpJyIKICAgICAgICB9CiAgICB9CgogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICRSZXBsaWNhRGVmcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkUkRlZiA9ICRSZXBsaWNhRGVmc1skaV0KICAgICAgICBpZiAoJFJEZWYuR2V0VHlwZSgpLk5hbWUgLW5lICJIYXNodGFibGUiKSB7CiAgICAgICAgICAgIHRocm93ICJBbGwgZWxlbWVudHMgb2YgUmVwbGljYURlZnMgYXJyYXkgc2hvdWxkIGJlIEhhc2h0YWJsZXMiCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYU9wdHMgPSBAKCkKCiAgICAgICAgIyBNYW5kYXRvcnkgb3B0aW9ucwogICAgICAgICRSZXBsaWNhTmFtZSA9IFZhbGlkYXRlLURlZmluZWRPcHRpb24gIlNFUlZFUl9JTlNUQU5DRSIgJFJEZWZbIlNFUlZFUl9JTlNUQU5DRSJdCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLURlZmluZWRPcHRpb24gIkVORFBPSU5UX1VSTCIgJFJEZWZbIkVORFBPSU5UX1VSTCJdIHwgQ29udmVydFRvLVNRTFN0cmluZyB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJFTkRQT0lOVF9VUkwiKQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1PcHRpb24gIkFWQUlMQUJJTElUWV9NT0RFIiAkUkRlZlsiQVZBSUxBQklMSVRZX01PREUiXSBAKCJTWU5DSFJPTk9VU19DT01NSVQiLCAiQVNZTkNIUk9OT1VTX0NPTU1JVCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFWQUlMQUJJTElUWV9NT0RFIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJGQUlMT1ZFUl9NT0RFIiAkUkRlZlsiRkFJTE9WRVJfTU9ERSJdIEAoIkFVVE9NQVRJQyIsICJNQU5VQUwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJGQUlMT1ZFUl9NT0RFIikKCiAgICAgICAgIyBPcHRpb25hbCBvcHRpb25zCiAgICAgICAgaWYgKCRSRGVmWyJCQUNLVVBfUFJJT1JJVFkiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiQkFDS1VQX1BSSU9SSVRZIiAkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQkFDS1VQX1BSSU9SSVRZIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJTRVNTSU9OX1RJTUVPVVQiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiU0VTU0lPTl9USU1FT1VUIiAkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiU0VTU0lPTl9USU1FT1VUIikKICAgICAgICB9CgogICAgICAgICRTZWNvbmRhcnlSb2xlID0gQCgpCiAgICAgICAgaWYgKCRSRGVmWyJTX0FMTE9XX0NPTk5FQ1RJT05TIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJTX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIEAoIk5PIiwgIlJFQURfT05MWSIsICJBTEwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBTExPV19DT05ORUNUSU9OUyIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFNlY29uZGFyeVJvbGUgPSAkU2Vjb25kYXJ5Um9sZSArICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFNlY29uZGFyeVJvbGUuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArICgiKCAkKCRTZWNvbmRhcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFQ09OREFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRQcmltYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJQX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIEAoIlJFQURfV1JJVEUiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoKCgkUkRlZlsiUF9SRUFEX09OTFlfUk9VVElOR19MSVNUIl0gfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxTdHJpbmcgJF8gfSkgLWpvaW4gJywgJykgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFByaW1hcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkUHJpbWFyeVJvbGUgLWpvaW4gJywgJykgKSIgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiUFJJTUFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSArCiAgICAgICAgICAgICMgIFRDUDovL2JyYXZvLm11cmFuby5sb2NhbDo1MDIyCiAgICAgICAgICAgICJOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZXBsaWNhTmFtZSkgV0lUSCAoJCgkUmVwbGljYU9wdHMgLWpvaW4gJywgJykpIgogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9ucyA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSAtam9pbiAiLGByYG4gICAgICAgICI7CgogICAgaWYgKCRMaXN0ZW5lckRlZlsiREhDUCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXS5tYXRjaGVzKCJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikpIHsKICAgICAgICAgICAgKCRJcEFkZHIsICRNYXNrKSA9ICRMaXN0ZW5lckRlZlsiREhDUCJdIC1zcGxpdCAiLyIKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIE9OICggJElwQWRkciwgJE1hc2sgKSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBbYXJyYXldJElQQWRkcmVzc2VzID0gJExpc3RlbmVyRGVmWyJTVEFUSUMiXQogICAgICAgIGlmICgoJElQQWRkcmVzc2VzIC1lcSAkbnVsbCkgLW9yICgkSVBBZGRyZXNzZXMuQ291bnQgLWVxIDApKSB7CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9IEAoKQogICAgICAgICAgICBmb3JlYWNoICgkSXBPcHRpb24gaW4gJElQQWRkcmVzc2VzKSB7CiAgICAgICAgICAgICAgICAjIElQdjQKICAgICAgICAgICAgICAgIGlmICgkSXBPcHRpb24gLW1hdGNoICJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikgewogICAgICAgICAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkSXBPcHRpb24gLXNwbGl0ICIvIgogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwQWRkciksICQoQ29udmVydFRvLVNRTFN0cmluZyAkTWFzaykgKSIKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBJUHY2CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXigoKD89KD8+Lio/OjopKD8hLio6OikpKSg6Oik/KFswLTlBLUZdezEsNH06Oj8pezAsNX18KFswLTlBLUZdezEsNH06KXs2fSkoXDIoWzAtOUEtRl17MSw0fSg6Oj98JCkpezAsMn18KCgyNVswLTVdfCgyWzAtNF18MVxkfFsxLTldKT9cZCkoXC58JCkpezR9fFswLTlBLUZdezEsNH06WzAtOUEtRl17MSw0fSkoPzwhW146XTp8XC4pXHoiKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSAkQ29udmVydGVkT3B0cyArICIoICQoQ29udmVydFRvLVNRTFN0cmluZyAkSXBPcHRpb24pICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93ICJNYWxmb3JtZWQgSVB2NC9JUHY2IGFkZHJlc3M6ICRJcE9wdGlvbiIKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIklQICggJCgkQ29udmVydGVkT3B0cyAtam9pbiAnLCAnKSApIgogICAgICAgIH0KICAgIH0KICAgIGlmICgoJExpc3RlbmVyRGVmWyJOQU1FIl0gLWVxICRudWxsKSAtb3IgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXlxzKiQiKSkgewogICAgICAgIHRocm93ICJMaXN0ZW5lciBuYW1lIGlzIHJlcXVpcmVkIgogICAgfQogICAgaWYgKC1ub3QgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXltBLVphLXowLTlcLl9cLV0rJCIpKSB7CiAgICAgICAgdGhyb3cgIklsbGVnYWwgbGlzdGVuZXIgbmFtZS4gSXQgY2FuIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgZGFzaGVzICgtKSwgYW5kIGh5cGhlbnMgKF8pLCBpbiBhbnkgb3JkZXIuIgogICAgfQogICAgJFBvcnQgPSAkbnVsbAogICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkK1wrIikgewogICAgICAgICAgICAkU3RhcnRpbmdQb3J0ID0gJExpc3RlbmVyRGVmWyJQT1JUIl0gLXJlcGxhY2UgIlwrIiwgIiIKICAgICAgICAgICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0ICRTdGFydGluZ1BvcnQKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJFBvcnQiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1tYXRjaCAiXGQrIikgewogICAgICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCBwb3J0IHZhbHVlOiAkKCRMaXN0ZW5lckRlZlsiUE9SVCJdKSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRMaXN0ZW5lciA9ICJMSVNURU5FUiAnJCgkTGlzdGVuZXJEZWZbIk5BTUUiXSknICggV0lUSCAkTGlzdGVuZXJBZGRyICkiCgogICAgJE5hbWUgfCBPdXQtRmlsZSAiJFdvcmtEaXJcYXZncm91cC5uYW1lIgogICAgCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICREYXRhYmFzZU5hbWVzLkxlbmd0aDsgJGkrKykgewogICAgICAgICREYXRhQmFzZU5hbWUgPSAkRGF0YWJhc2VOYW1lc1skaV0KICAgICAgICAkRGF0YUJhc2VOYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGRiJGkubmFtZSIKICAgICAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQogICAgICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAgICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJHtpfS5sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBpZiAoJFByZWZzLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICRQcmVmc0xpbmUgPSAiV0lUSCAoICQoJFByZWZzIC1qb2luICcsICcpICkiCiAgICB9IGVsc2UgewogICAgICAgICRQcmVmc0xpbmUgPSAiIgogICAgfQogICAgJFNRTCA9ICJDUkVBVEUgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJE5hbWUpICRQcmVmc0xpbmUKICAgICAgICAgICAgICAgIEZPUiBEQVRBQkFTRSAkUXVvdGVkREJOYW1lcwogICAgICAgICAgICAgICAgUkVQTElDQSBPTmByYG4gICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnMKICAgICAgICAgICAgICAgICRMaXN0ZW5lcjsKICAgICIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXBSZXBsaWNhIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIHNlY29uZGFyeSByZXBsaWNhCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYSBiYXNlZCBvbiBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byBhbmQgYnkgTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5nIGRpcmVjdG9yeSB3aGljaCB3YXMgdHJhbnNmZXJyZWQgZnJvbSB0aGUgcHJpbWFyeSByZXBsaWNhLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIKICAgICkKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIldvcmsgZGlyICckV29ya0Rpcicgbm90IGZvdW5kIgogICAgfQogICAgJFdvcmtEaXJPYmogPSBHZXQtSXRlbSAtUGF0aCAkV29ya0RpcgogICAgJFdvcmtEaXIgPSAkV29ya0Rpck9iai5GdWxsTmFtZQogICAgJEdyb3VwTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJhdmdyb3VwLm5hbWUiKS5GdWxsTmFtZQoKICAgICRKb2luR3JvdXAgPSAiQUxURVIgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJEdyb3VwTmFtZSkgSk9JTgogICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkSm9pbkdyb3VwKQoKICAgIGZvciAoJGkgPSAwOyA7ICRpKyspIHsKICAgICAgICAkRmlsZSA9ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKQogICAgICAgIGlmICgtbm90ICRGaWxlKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAkRGF0YUJhc2VOYW1lID0gR2V0LUNvbnRlbnQgJFdvcmtEaXJPYmouR2V0RmlsZXMoImRiJGkubmFtZSIpLkZ1bGxOYW1lCiAgICAgICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgUkVQTEFDRSwgU1RBVFMgPSA1CiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVEYikKICAgICAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkubG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCiAgICAgICAgJEFsdGVyREIgPSAiQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBTRVQgSEFEUiBBVkFJTEFCSUxJVFkgR1JPVVAgPSAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEFsdGVyREIpCiAgICB9Cn0KCmZ1bmN0aW9uIE5ldy1SZXBsaWNhT3B0aW9uIHsKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIHJldHVybiAiJE5hbWUgPSAkVmFsdWUiCn0KCmZ1bmN0aW9uIFZhbGlkYXRlLU9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzIG9yIHRocm93cyBleGNlcHRpb24gb3RoZXJ3aXNlLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCgogICAgLlBBUkFNRVRFUiBBbGxvd2VkCiAgICBMaXN0IG9mIGFsbG93ZWQgb3B0aW9uIHZhbHVzLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW1N0cmluZ10kVmFsdWUsCiAgICAgICAgW0FycmF5XSRBbGxvd2VkCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGZvcmVhY2ggKCRWIGluICRBbGxvd2VkKSB7CiAgICAgICAgaWYgKCRWIC1lcSAkVmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuICRWYWx1ZQogICAgICAgIH0KICAgIH0KICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IG9uZSBvZiAkKCRBbGxvd2VkIC1qb2luICcsICcpIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1JbnRPcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIGludGVnZXIKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGlmICgtbm90ICgiJFZhbHVlIiAtbWF0Y2ggIl5bKy1dP1xkKyQiKSkgewogICAgICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IGEgbnVtYmVyIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbAoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG5vdCBudWxsLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICRmYWxzZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIGlmICgoJFZhbHVlIC1lcSAkbnVsbCkgLW9yICgkVmFsdWUgLWVxICIiKSkgewogICAgICAgIHRocm93ICJObyB2YWx1ZSB3YXMgcHJvdmlkZWQgZm9yICROYW1lIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgoKCg==", - "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoKEdldC1Nb2R1bGUgU1FMUFMgLUxpc3RBdmFpbGFibGUpIC1uZSAkbnVsbCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIk1vZHVsZSBTUUxTUCBhbHJlYWR5IGluc3RhbGxlZC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICRNdXJhbm9GaWxlU2hhcmUgPSBbRW52aXJvbm1lbnRdOjpHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdNdXJhbm9GaWxlU2hhcmUnKQogICAgICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgICAgIHRocm93KCJVbmFibGUgdG8gZmluZCBNdXJhbm9GaWxlU2hhcmUgcGF0aC4iKQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJFNldHVwUm9vdCAtZXEgJycpIHsKICAgICAgICAgICAgJFNldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXFRvb2xzJykKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJEZpbGVMaXN0ID0gQCgKICAgICAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgICAgICdTaGFyZWRNYW5hZ2VtZW50T2JqZWN0cy5tc2knLAogICAgICAgICAgICAnUG93ZXJTaGVsbFRvb2xzLm1zaScKICAgICAgICApCgogICAgICAgIGZvcmVhY2ggKCRNc2lGaWxlIGluICRGaWxlTGlzdCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRyeWluZyB0byBpbnN0YWxsICckTXNpRmlsZScgLi4uIgogICAgICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgICAgIGlmIChbSU8uRmlsZV06OkV4aXN0cygkTXNpUGF0aCkpIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgbXNpZXhlIC4uLiIKICAgICAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL2knLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICAgICAgaWYgKCRSZXN1bHQuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoIkluc3RhbGxhdGlvbiBvZiBNU0kgcGFja2FnZSAnJE1zaVBhdGgnIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJyQoJFJlc3VsdC5FeGl0Q29kZSknIikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5zdGFsbC1TcWxTZXJ2ZXJGb3JBT0FHIHsKICAgIHBhcmFtICgKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUwgZmVhdHVyZXMgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU2V0dXBSb290ID0gJycsCgogICAgICAgICMgUGF0aCB0byBmb2xkZXIgd2hlcmUgbXNpIGZpbGVzIGZvciBhZGRpdGlvbmFsIFNRTFBTIG1vZHVsZSBhcmUgbG9jYXRlZAogICAgICAgIFtTdHJpbmddICRTcWxwc1NldHVwUm9vdCA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkTXVyYW5vRmlsZVNoYXJlID0gJycsCgogICAgICAgICMgKFJFUVVJUkVEKSBEb21haW4gbmFtZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlckRvbWFpbiA9ICdmYy1hY21lLmxvY2FsJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFVzZXIgbmFtZSBmb3IgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IFNRTCBzZXJ2aWNlCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyTmFtZSA9ICdBZG1pbmlzdHJhdG9yJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFBhc3N3b3JkIGZvciB0aGF0IHVzZXIKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJQYXNzd29yZCA9ICdQQHNzdzByZCcsCgogICAgICAgIFtTd2l0Y2hdICRVcGRhdGVFbmFibGVkCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgJE11cmFub0ZpbGVTaGFyZSA9IFtFbnZpcm9ubWVudF06OkdldEVudmlyb25tZW50VmFyaWFibGUoJ011cmFub0ZpbGVTaGFyZScpCiAgICAgICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICAgICAkU2V0dXBSb290ID0gW0lPLlBhdGhdOjpDb21iaW5lKCRNdXJhbm9GaWxlU2hhcmUsICdQcmVyZXF1aXNpdGVzXFNRTCBTZXJ2ZXJcMjAxMicpCiAgICAgICAgfQoKICAgICAgICAkRXh0cmFPcHRpb25zID0gQHt9CgogICAgICAgIGlmICgkVXBkYXRlRW5hYmxlZCkgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJHRydWV9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJGZhbHNlfQogICAgICAgIH0KCiAgICAgICAgTmV3LVNRTFNlcnZlckZvckFPQUcgYAogICAgICAgICAgICAtU2V0dXBSb290ICRTZXR1cFJvb3QgYAogICAgICAgICAgICAtU1FMU3ZjVXNyRG9tYWluICRTUUxTZXJ2aWNlVXNlckRvbWFpbiBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JOYW1lICRTUUxTZXJ2aWNlVXNlck5hbWUgYAogICAgICAgICAgICAtU1FMU3ZjVXNyUGFzc3dvcmQgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgYAogICAgICAgICAgICAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKICAgIH0KfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCwKICAgICAgICBbU3RyaW5nXSAkU3FsU2VydmljZUFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lID0gJ1NoYXJlZFdvcmtEaXInCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAkU2hhcmVOZXR3b3JrUGF0aCA9ICdcXCcgKyAkUHJpbWFyeU5vZGUgKyAnXCcgKyAkU2hhcmVOYW1lCgogICAgICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAgICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluQWRtaW5BY2NvdW50TmFtZSIgYAogICAgICAgICAgICAtUGFzc3dvcmQgIiREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUaGlzIHNjcmlwdCBydW5zIG9uIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nIHNjcmlwdC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRTaGFyZU5hbWUgLWVxICcnKSB7CiAgICAgICAgICAgICRTaGFyZU5hbWUgPSBbSU8uUGF0aF06OkdldEZpbGVOYW1lV2l0aG91dEV4dGVuc2lvbigkU2hhcmVQYXRoKQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlUGF0aCA9ICckU2hhcmVQYXRoJyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU2hhcmVOYW1lID0gJyRTaGFyZU5hbWUnIgoKICAgICAgICB0cnkgewogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZSAnJFNoYXJlTmFtZSciCiAgICAgICAgICAgICRudWxsID0gR2V0LVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UKICAgICAgICAgICAgd3JpdGUtTG9nICJTaGFyZSAnJFNoYXJlTmFtZScgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiU2hhcmUgJyRTaGFyZU5hbWUnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgZm9sZGVyICckU2hhcmVQYXRoIgogICAgICAgICAgICAkbnVsbCA9IEdldC1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1SZWN1cnNlIC1Gb3JjZQogICAgICAgICAgICBXcml0ZS1Mb2cgIkZvbGRlciAnJFNoYXJlUGF0aCcgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiRm9sZGVyICckU2hhcmVQYXRoJyBub3QgZXhpc3RzIG9yIGNhbm5vdCBiZSBkZWxldGVkLiIKICAgICAgICB9CgogICAgICAgICRudWxsID0gTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQogICAgICAgICAgICAgICAgCiAgICAgICAgJG51bGwgPSBOZXctU21iU2hhcmUgLVBhdGggJFNoYXJlUGF0aCBgCiAgICAgICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYAogICAgICAgICAgICAtRnVsbEFjY2VzcyAiRXZlcnlvbmUiIGAKICAgICAgICAgICAgLURlc2NyaXB0aW9uICJTaGFyZWQgZm9sZGVyIGZvciBBbHdheXNPbiBBdmFpbGFiaWxpdHkgR3JvdXAgc2V0dXAuIgoKICAgICAgICByZXR1cm4gJ1xcJyArICRFbnY6Q29tcHV0ZXJOYW1lICsgJ1wnICsgJFNoYXJlTmFtZQogICAgfQp9CgoKCmZ1bmN0aW9uIE5ldy1EYXRhYmFzZUZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREYXRhYmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRGdW5jdGlvbnNGaWxlID0gRXhwb3J0LUZ1bmN0aW9uICdJbnZva2UtU1FMVGV4dCcsICdDb252ZXJ0VG8tU1FMTmFtZScsICdDb252ZXJ0VG8tU1FMU3RyaW5nJywgJ05ldy1TUUxEYXRhYmFzZScKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gZmlsZSAnJEZ1bmN0aW9uc0ZpbGUnIC4uLiIKLiAiJEZ1bmN0aW9uc0ZpbGUiCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctU1FMRGF0YWJhc2UnIC4uLiIKTmV3LVNRTERhdGFiYXNlICREYXRhYmFzZU5hbWUKIkAgLUNyZWRlbnRpYWwgJENyZWRzIC1Ob0Jhc2U2NAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSA9ICdNdXJhbm9BRycsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkRGF0YWJhc2VMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTGlzdGVuZXIgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBieSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VzIGluIHRoYXQgQUcKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lck5hbWUgPSAnTXVyYW5vQUdfTGlzdGVuZXInLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lcklQLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUE1hc2sgPSAnMjU1LjI1NS4yNTUuMCcsCgogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lclBvcnQgPSAnNTAyMycsCgogICAgICAgICMgU3luYyBNb2RlIE5vZGUgTGlzdAogICAgICAgIFtTdHJpbmdbXV0gJFN5bmNNb2RlTm9kZUxpc3QsCgogICAgICAgIFtTdHJpbmddICRTaGFyZWRXb3JrRGlyID0gJ1NoYXJlZFdvcmtEaXInLAoKICAgICAgICBbU3RyaW5nXSAkQ2xpWG1sRmlsZSA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgV3JpdGUtTG9nICJQcmltYXJ5IG5vZGU6ICckKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkpJyIKICAgICAgICBXcml0ZS1Mb2cgIkN1cnJlbnQgbm9kZTogJyQoKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpJyIKCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICQoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRoaXMgZnVuY3Rpb24gd29ya3Mgb24gUHJpbWFyeU5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRDbGlYbWxGaWxlIC1lcSAnJykgewogICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ID0gQCgpCiAgICAgICAgICAgIGZvcmVhY2ggKCROb2RlIGluICROb2RlTGlzdCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IEltcG9ydC1DbGlYbWwgLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcJE5vZGUueG1sIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiVXNpbmcgZGVmYXVsdCBlbmRwb2ludCBwb3J0IDUwMjIiCiAgICAgICAgICAgICAgICAgICAgJE5vZGVFbmRwb2ludFBvcnQgPSA1MDIyCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uID0gQHsKICAgICAgICAgICAgICAgICAgICAiU0VSVkVSX0lOU1RBTkNFIiA9ICIkTm9kZSI7CiAgICAgICAgICAgICAgICAgICAgIkVORFBPSU5UX1VSTCIgPSAiVENQOi8vJHtOb2RlfToke05vZGVFbmRwb2ludFBvcnR9IjsKICAgICAgICAgICAgICAgICAgICAiQVZBSUxBQklMSVRZX01PREUiID0gIkFTWU5DSFJPTk9VU19DT01NSVQiOwogICAgICAgICAgICAgICAgICAgICJGQUlMT1ZFUl9NT0RFIj0iTUFOVUFMIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJFN5bmNNb2RlTm9kZUxpc3QgLWNvbnRhaW5zICROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvblsnQVZBSUxBQklMSVRZX01PREUnXSA9ICJTWU5DSFJPTk9VU19DT01NSVQiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydGQUlMT1ZFUl9NT0RFJ10gPSAiQVVUT01BVElDIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBOT1QgaW4gU3luY01vZGVOb2RlTGlzdCIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ICs9IEAoJFJlcGxpY2FEZWZpbml0aW9uKQogICAgICAgICAgICB9CgogICAgICAgICAgICAkUHJlZmVyZW5jZXMgPSBAe30KCiAgICAgICAgICAgICRMaXN0ZW5lckRlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgIk5BTUUiPSRMaXN0ZW5lck5hbWU7CiAgICAgICAgICAgICAgICAiUE9SVCIgPSAiJExpc3RlbmVyUG9ydCI7CiAgICAgICAgICAgICAgICAiU1RBVElDIiA9ICIkTGlzdGVuZXJJUC8kTGlzdGVuZXJJUE1hc2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbWV0ZXJzID0gQHsKICAgICAgICAgICAgICAgICdXb3JrRGlyJyA9ICJcXCRQcmltYXJ5Tm9kZVwkU2hhcmVkV29ya0RpciI7CiAgICAgICAgICAgICAgICAnTmFtZScgPSAkR3JvdXBOYW1lOwogICAgICAgICAgICAgICAgJ0RhdGFiYXNlTmFtZXMnID0gJERhdGFiYXNlTGlzdDsKICAgICAgICAgICAgICAgICdSZXBsaWNhRGVmcycgPSAkUmVwbGljYURlZmluaXRpb25MaXN0OwogICAgICAgICAgICAgICAgJ1ByZWZlcmVuY2VzJyA9ICRQcmVmZXJlbmNlczsKICAgICAgICAgICAgICAgICdMaXN0ZW5lckRlZicgPSAkTGlzdGVuZXJEZWZpbml0aW9uOwogICAgICAgICAgICB9CgogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAiXFwkUHJpbWFyeU5vZGVcU2hhcmVkV29ya0RpclwqIiAtRm9yY2UKCiAgICAgICAgICAgICRDbGlYbWxGaWxlID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkNsaVhtbCBmaWxlOiAnJENsaVhtbEZpbGUnIgoKICAgICAgICAgICAgRXhwb3J0LUNsaVhtbCAtUGF0aCAkQ2xpWG1sRmlsZSAtSW5wdXRPYmplY3QgJFBhcmFtZXRlcnMgLURlcHRoIDEwCgogICAgICAgICAgICBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSBgCiAgICAgICAgICAgICAgICAtQ2xpWG1sRmlsZSAkQ2xpWG1sRmlsZSBgCiAgICAgICAgICAgICAgICAtRG9tYWluTmFtZSAkRG9tYWluTmFtZSBgCiAgICAgICAgICAgICAgICAtVXNlck5hbWUgJFVzZXJOYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyUGFzc3dvcmQgJFVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgICAgICAtUHJpbWFyeU5vZGUgJFByaW1hcnlOb2RlCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gLUFsbAoKICAgICAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiSW1wb3J0aW5nIENsaVhtbCBwYXJhbWV0ZXJzIGZpbGUgLi4uIgpgJFBhcmFtZXRlcnMgPSBJbXBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCcgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCBgYAogICAgLVdvcmtEaXIgYCRQYXJhbWV0ZXJzWydXb3JrRGlyJ10gYGAKICAgIC1OYW1lIGAkUGFyYW1ldGVyc1snTmFtZSddIGBgCiAgICAtRGF0YWJhc2VOYW1lcyBgJFBhcmFtZXRlcnNbJ0RhdGFiYXNlTmFtZXMnXSBgYAogICAgLVJlcGxpY2FEZWZzIGAkUGFyYW1ldGVyc1snUmVwbGljYURlZnMnXSBgYAogICAgLVByZWZlcmVuY2VzIGAkUGFyYW1ldGVyc1snUHJlZmVyZW5jZXMnXSBgYAogICAgLUxpc3RlbmVyRGVmIGAkUGFyYW1ldGVyc1snTGlzdGVuZXJEZWYnXQoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICAgICAgfQogICAgfQp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1NlY29uZGFyeVJlcGxpY2EgewogICAgcGFyYW0gKAogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nW11dICROb2RlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGUgbmFtZSB0aGF0IHdpbGwgYmUgcHJpbWFyeSBmb3Igc2VsZWN0ZWQgQXZhaWxhYmlsaXR5IEdyb3VwCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKCiAgICAgICAgW1N0cmluZ10gJFNoYXJlZFdvcmtEaXIgPSAnU2hhcmVkV29ya0RpcicsCgogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApIAogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYScgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cFJlcGxpY2EgLVdvcmtEaXIgIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIgoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICB9Cn0KCgoKZnVuY3Rpb24gRGlzYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBuZXRzaCBhZHZmaXJld2FsbCBzZXQgYWxscHJvZmlsZXMgc3RhdGUgb2ZmCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLUZpcmV3YWxsIHsKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIG5ldHNoIGFkdmZpcmV3YWxsIHNldCBhbGxwcm9maWxlcyBzdGF0ZSBvbgogICAgfQp9CgoKCmZ1bmN0aW9uIEVuYWJsZS1UcnVzdGVkSG9zdHMgewogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgU2V0LUl0ZW0gV1NNYW46XGxvY2FsaG9zdFxDbGllbnRcVHJ1c3RlZEhvc3RzIC1WYWx1ZSAnKicgLUZvcmNlCiAgICB9Cn0K", + "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKChHZXQtTW9kdWxlIFNRTFBTIC1MaXN0QXZhaWxhYmxlKSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJNb2R1bGUgU1FMU1AgYWxyZWFkeSBpbnN0YWxsZWQuIgogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICAgICB0aHJvdygiVW5hYmxlIHRvIGZpbmQgTXVyYW5vRmlsZVNoYXJlIHBhdGguIikKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclxUb29scycpCiAgICAgICAgfQogICAgICAgIAogICAgICAgICRGaWxlTGlzdCA9IEAoCiAgICAgICAgICAgICdTUUxTeXNDbHJUeXBlcy5tc2knLAogICAgICAgICAgICAnU2hhcmVkTWFuYWdlbWVudE9iamVjdHMubXNpJywKICAgICAgICAgICAgJ1Bvd2VyU2hlbGxUb29scy5tc2knCiAgICAgICAgKQoKICAgICAgICBmb3JlYWNoICgkTXNpRmlsZSBpbiAkRmlsZUxpc3QpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUcnlpbmcgdG8gaW5zdGFsbCAnJE1zaUZpbGUnIC4uLiIKICAgICAgICAgICAgJE1zaVBhdGggPSBKb2luLVBhdGggJFNldHVwUm9vdCAkTXNpRmlsZQogICAgICAgICAgICBpZiAoW0lPLkZpbGVdOjpFeGlzdHMoJE1zaVBhdGgpKSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIG1zaWV4ZSAuLi4iCiAgICAgICAgICAgICAgICAkUmVzdWx0ID0gRXhlYyAtRmlsZVBhdGggIm1zaWV4ZWMuZXhlIiAtQXJndW1lbnRMaXN0IEAoJy9pJywgImAiJE1zaVBhdGhgIiIsICcvcXVpZXQnKSAtUGFzc1RocnUKICAgICAgICAgICAgICAgIGlmICgkUmVzdWx0LkV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCJJbnN0YWxsYXRpb24gb2YgTVNJIHBhY2thZ2UgJyRNc2lQYXRoJyBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICckKCRSZXN1bHQuRXhpdENvZGUpJyIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIkZpbGUgJyRNc2lQYXRoJyBub3QgZm91bmQuIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgoKCmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyRm9yQU9BRyB7CiAgICBwYXJhbSAoCiAgICAgICAgIyBQYXRoIHRvIGZvbGRlciB3aGVyZSBtc2kgZmlsZXMgZm9yIGFkZGl0aW9uYWwgU1FMIGZlYXR1cmVzIGFyZSBsb2NhdGVkCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnLAoKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUxQUyBtb2R1bGUgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU3FscHNTZXR1cFJvb3QgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJE11cmFub0ZpbGVTaGFyZSA9ICcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIG5hbWUKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJEb21haW4gPSAnZmMtYWNtZS5sb2NhbCcsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgZm9yIHRoZSBhY2NvdW50IHdoaWNoIHdpbGwgYmUgdXNlZCBieSBTUUwgc2VydmljZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUgPSAnQWRtaW5pc3RyYXRvcicsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgPSAnUEBzc3cwcmQnLAoKICAgICAgICBbU3dpdGNoXSAkVXBkYXRlRW5hYmxlZAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgdHJhcCB7CiAgICAgICAgICAgICYkVHJhcEhhbmRsZXIKICAgICAgICB9CgogICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICAgICB0aHJvdygiVW5hYmxlIHRvIGZpbmQgTXVyYW5vRmlsZVNoYXJlIHBhdGguIikKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclwyMDEyJykKICAgICAgICB9CgogICAgICAgICRFeHRyYU9wdGlvbnMgPSBAe30KCiAgICAgICAgaWYgKCRVcGRhdGVFbmFibGVkKSB7CiAgICAgICAgICAgICRFeHRyYU9wdGlvbnMgKz0gQHsnVXBkYXRlRW5hYmxlZCcgPSAkdHJ1ZX0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRFeHRyYU9wdGlvbnMgKz0gQHsnVXBkYXRlRW5hYmxlZCcgPSAkZmFsc2V9CiAgICAgICAgfQoKICAgICAgICBOZXctU1FMU2VydmVyRm9yQU9BRyBgCiAgICAgICAgICAgIC1TZXR1cFJvb3QgJFNldHVwUm9vdCBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JEb21haW4gJFNRTFNlcnZpY2VVc2VyRG9tYWluIGAKICAgICAgICAgICAgLVNRTFN2Y1Vzck5hbWUgJFNRTFNlcnZpY2VVc2VyTmFtZSBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JQYXNzd29yZCAkU1FMU2VydmljZVVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgIC1FeHRyYU9wdGlvbnMgJEV4dHJhT3B0aW9ucwogICAgfQp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbkFkbWluQWNjb3VudE5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbkFkbWluQWNjb3VudFBhc3N3b3JkLAogICAgICAgIFtTdHJpbmddICRTcWxTZXJ2aWNlQWNjb3VudE5hbWUsCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAogICAgICAgIFtTdHJpbmddICRTaGFyZU5hbWUgPSAnU2hhcmVkV29ya0RpcicKICAgICkKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICAkU2hhcmVOZXR3b3JrUGF0aCA9ICdcXCcgKyAkUHJpbWFyeU5vZGUgKyAnXCcgKyAkU2hhcmVOYW1lCgogICAgICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAgICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluQWRtaW5BY2NvdW50TmFtZSIgYAogICAgICAgICAgICAtUGFzc3dvcmQgIiREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBzY3JpcHQgcnVucyBvbiBwcmltYXJ5IG5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZyBzY3JpcHQuIgogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmICgkU2hhcmVOYW1lIC1lcSAnJykgewogICAgICAgICAgICAkU2hhcmVOYW1lID0gW0lPLlBhdGhdOjpHZXRGaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24oJFNoYXJlUGF0aCkKICAgICAgICB9CgogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJTaGFyZVBhdGggPSAnJFNoYXJlUGF0aCciCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlTmFtZSA9ICckU2hhcmVOYW1lJyIKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgc2hhcmUgJyRTaGFyZU5hbWUnIgogICAgICAgICAgICAkbnVsbCA9IEdldC1TbWJTaGFyZSAtTmFtZSAkU2hhcmVOYW1lIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICAgICAgUmVtb3ZlLVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUZvcmNlCiAgICAgICAgICAgIHdyaXRlLUxvZyAiU2hhcmUgJyRTaGFyZU5hbWUnIHJlbW92ZWQuIgogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIFdyaXRlLUxvZ1dhcm5pbmcgIlNoYXJlICckU2hhcmVOYW1lJyBub3QgZXhpc3RzIG9yIGNhbm5vdCBiZSBkZWxldGVkLiIKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJUcnlpbmcgdG8gcmVtb3ZlIGZvbGRlciAnJFNoYXJlUGF0aCIKICAgICAgICAgICAgJG51bGwgPSBHZXQtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICAgICAgUmVtb3ZlLUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtUmVjdXJzZSAtRm9yY2UKICAgICAgICAgICAgV3JpdGUtTG9nICJGb2xkZXIgJyRTaGFyZVBhdGgnIHJlbW92ZWQuIgogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIFdyaXRlLUxvZ1dhcm5pbmcgIkZvbGRlciAnJFNoYXJlUGF0aCcgbm90IGV4aXN0cyBvciBjYW5ub3QgYmUgZGVsZXRlZC4iCiAgICAgICAgfQoKICAgICAgICAkbnVsbCA9IE5ldy1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUl0ZW1UeXBlIENvbnRhaW5lciAtRm9yY2UKICAgICAgICAgICAgICAgIAogICAgICAgICRudWxsID0gTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYAogICAgICAgICAgICAtTmFtZSAkU2hhcmVOYW1lIGAKICAgICAgICAgICAgLUZ1bGxBY2Nlc3MgIkV2ZXJ5b25lIiBgCiAgICAgICAgICAgIC1EZXNjcmlwdGlvbiAiU2hhcmVkIGZvbGRlciBmb3IgQWx3YXlzT24gQXZhaWxhYmlsaXR5IEdyb3VwIHNldHVwLiIKCiAgICAgICAgcmV0dXJuICdcXCcgKyAkRW52OkNvbXB1dGVyTmFtZSArICdcJyArICRTaGFyZU5hbWUKICAgIH0KfQoKCgpmdW5jdGlvbiBOZXctRGF0YWJhc2VGb3JBT0FHIHsKICAgIHBhcmFtICgKICAgICAgICBbU3RyaW5nXSAkRGF0YWJhc2VOYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApCgogICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAnSW52b2tlLVNRTFRleHQnLCAnQ29udmVydFRvLVNRTE5hbWUnLCAnQ29udmVydFRvLVNRTFN0cmluZycsICdOZXctU1FMRGF0YWJhc2UnCgogICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tIGZpbGUgJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnTmV3LVNRTERhdGFiYXNlJyAuLi4iCk5ldy1TUUxEYXRhYmFzZSAkRGF0YWJhc2VOYW1lCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoT1BUSU9OQUwpIE5hbWUgb2YgdGhlIG5ldyBBdmFpbGFiaWxpdHkgR3JvdXAuIElmIG5vdCBzcGVjaWZpZWQgdGhlbiBkZWZhdWx0IG5hbWUgd2lsbCBiZSB1c2VkLgogICAgICAgIFtTdHJpbmddICRHcm91cE5hbWUgPSAnTXVyYW5vQUcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZXMgdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgYXMgcmVwbGljYSBwYXJ0bmVycy4KICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKCiAgICAgICAgIyAoUkVRVUlSRUQpIERhdGFiYXNlIGxpc3QgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJERhdGFiYXNlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIExpc3RlbmVyIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgYnkgY2xpZW50cyB0byBjb25uZWN0IHRvIGRhdGFiYXNlcyBpbiB0aGF0IEFHCiAgICAgICAgI1tQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJOYW1lID0gJ011cmFub0FHX0xpc3RlbmVyJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIElQIGFkZHJlc3Mgb2YgdGhlIGxpc3RlbmVyCiAgICAgICAgI1tQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUCwKCiAgICAgICAgW1N0cmluZ10gJExpc3RlbmVySVBNYXNrID0gJzI1NS4yNTUuMjU1LjAnLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJQb3J0ID0gJzUwMjMnLAoKICAgICAgICAjIFN5bmMgTW9kZSBOb2RlIExpc3QKICAgICAgICBbU3RyaW5nW11dICRTeW5jTW9kZU5vZGVMaXN0LAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJENsaVhtbEZpbGUgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICBXcml0ZS1Mb2cgIlByaW1hcnkgbm9kZTogJyQoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSknIgogICAgICAgIFdyaXRlLUxvZyAiQ3VycmVudCBub2RlOiAnJCgoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSknIgoKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgJCgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBQcmltYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZiAoJENsaVhtbEZpbGUgLWVxICcnKSB7CiAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgPSBAKCkKICAgICAgICAgICAgZm9yZWFjaCAoJE5vZGUgaW4gJE5vZGVMaXN0KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICROb2RlRW5kcG9pbnRQb3J0ID0gSW1wb3J0LUNsaVhtbCAtUGF0aCAiXFwkUHJpbWFyeU5vZGVcU2hhcmVkV29ya0RpclwkTm9kZS54bWwiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICJVc2luZyBkZWZhdWx0IGVuZHBvaW50IHBvcnQgNTAyMiIKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IDUwMjIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgICAgICJTRVJWRVJfSU5TVEFOQ0UiID0gIiROb2RlIjsKICAgICAgICAgICAgICAgICAgICAiRU5EUE9JTlRfVVJMIiA9ICJUQ1A6Ly8ke05vZGV9OiR7Tm9kZUVuZHBvaW50UG9ydH0iOwogICAgICAgICAgICAgICAgICAgICJBVkFJTEFCSUxJVFlfTU9ERSIgPSAiQVNZTkNIUk9OT1VTX0NPTU1JVCI7CiAgICAgICAgICAgICAgICAgICAgIkZBSUxPVkVSX01PREUiPSJNQU5VQUwiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkU3luY01vZGVOb2RlTGlzdCAtY29udGFpbnMgJE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIiROb2RlIGlzIGluIFN5bmNNb2RlTm9kZUxpc3QiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydBVkFJTEFCSUxJVFlfTU9ERSddID0gIlNZTkNIUk9OT1VTX0NPTU1JVCIKICAgICAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25bJ0ZBSUxPVkVSX01PREUnXSA9ICJBVVRPTUFUSUMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIiROb2RlIGlzIE5PVCBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgKz0gQCgkUmVwbGljYURlZmluaXRpb24pCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQcmVmZXJlbmNlcyA9IEB7fQoKICAgICAgICAgICAgJExpc3RlbmVyRGVmaW5pdGlvbiA9IEB7CiAgICAgICAgICAgICAgICAiTkFNRSI9JExpc3RlbmVyTmFtZTsKICAgICAgICAgICAgICAgICJQT1JUIiA9ICIkTGlzdGVuZXJQb3J0IjsKICAgICAgICAgICAgICAgICJTVEFUSUMiID0gIiRMaXN0ZW5lcklQLyRMaXN0ZW5lcklQTWFzayIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFtZXRlcnMgPSBAewogICAgICAgICAgICAgICAgJ1dvcmtEaXInID0gIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIjsKICAgICAgICAgICAgICAgICdOYW1lJyA9ICRHcm91cE5hbWU7CiAgICAgICAgICAgICAgICAnRGF0YWJhc2VOYW1lcycgPSAkRGF0YWJhc2VMaXN0OwogICAgICAgICAgICAgICAgJ1JlcGxpY2FEZWZzJyA9ICRSZXBsaWNhRGVmaW5pdGlvbkxpc3Q7CiAgICAgICAgICAgICAgICAnUHJlZmVyZW5jZXMnID0gJFByZWZlcmVuY2VzOwogICAgICAgICAgICAgICAgJ0xpc3RlbmVyRGVmJyA9ICRMaXN0ZW5lckRlZmluaXRpb247CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFJlbW92ZS1JdGVtIC1QYXRoICJcXCRQcmltYXJ5Tm9kZVxTaGFyZWRXb3JrRGlyXCoiIC1Gb3JjZQoKICAgICAgICAgICAgJENsaVhtbEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCgogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiQ2xpWG1sIGZpbGU6ICckQ2xpWG1sRmlsZSciCgogICAgICAgICAgICBFeHBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlIC1JbnB1dE9iamVjdCAkUGFyYW1ldGVycyAtRGVwdGggMTAKCiAgICAgICAgICAgIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIGAKICAgICAgICAgICAgICAgIC1DbGlYbWxGaWxlICRDbGlYbWxGaWxlIGAKICAgICAgICAgICAgICAgIC1Eb21haW5OYW1lICREb21haW5OYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyTmFtZSAkVXNlck5hbWUgYAogICAgICAgICAgICAgICAgLVVzZXJQYXNzd29yZCAkVXNlclBhc3N3b3JkIGAKICAgICAgICAgICAgICAgIC1QcmltYXJ5Tm9kZSAkUHJpbWFyeU5vZGUKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJFVzZXJOYW1lIiAtUGFzc3dvcmQgIiRVc2VyUGFzc3dvcmQiCgogICAgICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJJbXBvcnRpbmcgQ2xpWG1sIHBhcmFtZXRlcnMgZmlsZSAuLi4iCmAkUGFyYW1ldGVycyA9IEltcG9ydC1DbGlYbWwgLVBhdGggJENsaVhtbEZpbGUKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIGBgCiAgICAtV29ya0RpciBgJFBhcmFtZXRlcnNbJ1dvcmtEaXInXSBgYAogICAgLU5hbWUgYCRQYXJhbWV0ZXJzWydOYW1lJ10gYGAKICAgIC1EYXRhYmFzZU5hbWVzIGAkUGFyYW1ldGVyc1snRGF0YWJhc2VOYW1lcyddIGBgCiAgICAtUmVwbGljYURlZnMgYCRQYXJhbWV0ZXJzWydSZXBsaWNhRGVmcyddIGBgCiAgICAtUHJlZmVyZW5jZXMgYCRQYXJhbWV0ZXJzWydQcmVmZXJlbmNlcyddIGBgCiAgICAtTGlzdGVuZXJEZWYgYCRQYXJhbWV0ZXJzWydMaXN0ZW5lckRlZiddCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BT0FHU2Vjb25kYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFzIHJlcGxpY2EgcGFydG5lcnMuCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkgCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYScgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cFJlcGxpY2EgLVdvcmtEaXIgIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIgoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICB9Cn0KCgoKZnVuY3Rpb24gRGlzYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9mZgogICAgfQp9CgoKCmZ1bmN0aW9uIEVuYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9uCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLVRydXN0ZWRIb3N0cyB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgU2V0LUl0ZW0gV1NNYW46XGxvY2FsaG9zdFxDbGllbnRcVHJ1c3RlZEhvc3RzIC1WYWx1ZSAnKicgLUZvcmNlCiAgICB9Cn0K", "CmZ1bmN0aW9uIEV4cG9ydC1GdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ1tdXSAkTmFtZSwKCiAgICAgICAgW1BhcmFtZXRlcihWYWx1ZUZyb21QaXBlbGluZT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFBhdGggPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpLAoKICAgICAgICBbU3dpdGNoXSAkQWxsCiAgICApCgogICAgaWYgKFtJTy5QYXRoXTo6R2V0RXh0ZW5zaW9uKCRQYXRoKSAtbmUgJ3BzMScpIHsKICAgICAgICAkbnVsbCA9IFJlbmFtZS1JdGVtIC1QYXRoICRQYXRoIC1OZXdOYW1lICIkUGF0aC5wczEiIC1Gb3JjZQogICAgICAgICRQYXRoID0gIiRQYXRoLnBzMSIKICAgIH0KCiAgICAkU3lzdGVtRnVuY3Rpb25zID0gQCgKICAgICAgICAnQTonLCAnQjonLCAnQzonLCAnRDonLCAnRTonLCAnRjonLCAnRzonLCAnSDonLCAnSTonLCAnSjonLAogICAgICAgICdLOicsICdMOicsICdNOicsICdOOicsICdPOicsICdQOicsICdROicsICdSOicsICdTOicsICdUOicsCiAgICAgICAgJ1U6JywgJ1Y6JywgJ1c6JywgJ1g6JywgJ1k6JywgJ1o6JywKICAgICAgICAnY2QuLicsICdjZFwnLCAnaGVscCcsICdta2RpcicsICdtb3JlJywgJ29zcycsICdwcm9tcHQnLAogICAgICAgICdDbGVhci1Ib3N0JywgJ0dldC1WZXJiJywgJ1BhdXNlJywgJ1RhYkV4cGFuc2lvbjInCiAgICApCgogICAgaWYgKCRBbGwpIHsKICAgICAgICBHZXQtQ2hpbGRJdGVtIEZ1bmN0aW9uOiB8CiAgICAgICAgICAgIFdoZXJlLU9iamVjdCB7JF8uTW9kdWxlTmFtZSAtZXEgJyd9IHwKICAgICAgICAgICAgV2hlcmUtT2JqZWN0IHskU3lzdGVtRnVuY3Rpb25zIC1ub3Rjb250YWlucyAkXy5OYW1lfSB8CiAgICAgICAgICAgIEZvckVhY2gtT2JqZWN0IHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRQYXRoIC1WYWx1ZSBAIgoKCmZ1bmN0aW9uICQoJF8uTmFtZSkgewokKCRfLlNjcmlwdEJsb2NrKQp9CgoiQAogICAgICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBmb3JlYWNoICgkRnVuY3Rpb25OYW1lIGluICROYW1lKSB7CiAgICAgICAgICAgICRGdW5jdGlvbk9iamVjdCA9IEdldC1DaGlsZEl0ZW0gIkZ1bmN0aW9uOlwkRnVuY3Rpb25OYW1lIgogICAgICAgICAgICBpZiAoJEZ1bmN0aW9uT2JqZWN0IC1uZSAkbnVsbCkgewogICAgICAgICAgICAgICAgQWRkLUNvbnRlbnQgLVBhdGggJFBhdGggLVZhbHVlIEAiCgoKZnVuY3Rpb24gJEZ1bmN0aW9uTmFtZSB7CiQoJEZ1bmN0aW9uT2JqZWN0LlNjcmlwdEJsb2NrKQp9CgoiQAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUGF0aAp9Cg==", - "CmZ1bmN0aW9uIFNlbGVjdC1DbGlYbWxCbG9jayB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFBhdGgsCiAgICAgICAgW1N0cmluZ10gJE91dEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICApCgogICAgJFRhZ0ZvdW5kID0gJGZhbHNlCiAgICBHZXQtQ29udGVudCAkUGF0aCB8CiAgICAgICAgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICBpZiAoJF8gLWVxICcjPCBDTElYTUwnKSB7CiAgICAgICAgICAgICAgICAkVGFnRm91bmQgPSAkdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkVGFnRm91bmQpIHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRPdXRGaWxlIC1WYWx1ZSAkXwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgJE91dEZpbGUKfQoKCgpmdW5jdGlvbiBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJENvbW1hbmQsCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbCwKICAgICAgICBbU3dpdGNoXSAkSWdub3JlU3RkRXJyLAogICAgICAgIFtTd2l0Y2hdICROb0Jhc2U2NAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgJFN0ZE91dCA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICAgICAkU3RkRXJyID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAkQXJndW1lbnRMaXN0ID0gQCgnLU91dHB1dEZvcm1hdCcsICdYTUwnKQoKICAgICAgICBpZiAoJE5vQmFzZTY0KSB7CiAgICAgICAgICAgICRUbXBTY3JpcHQgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAgICAgICAgIFJlbmFtZS1JdGVtIC1QYXRoICIkVG1wU2NyaXB0IiAtTmV3TmFtZSAiJFRtcFNjcmlwdC5wczEiIC1Gb3JjZQogICAgICAgICAgICAkVG1wU2NyaXB0ID0gIiRUbXBTY3JpcHQucHMxIgoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgJFRtcFNjcmlwdAoKICAgICAgICAgICAgJENvbW1hbmQgfCBPdXQtRmlsZSAkVG1wU2NyaXB0CgogICAgICAgICAgICAkQXJndW1lbnRMaXN0ICs9IEAoJy1GaWxlJywgIiRUbXBTY3JpcHQiKQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEJ5dGVzID0gW1RleHQuRW5jb2RpbmddOjpVbmljb2RlLkdldEJ5dGVzKCRDb21tYW5kKQogICAgICAgICAgICAkRW5jb2RlZENvbW1hbmQgPSBbQ29udmVydF06OlRvQmFzZTY0U3RyaW5nKCRCeXRlcykKICAgICAgICAgICAgCiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICRFbmNvZGVkQ29tbWFuZAoKICAgICAgICAgICAgJEFyZ3VtZW50TGlzdCArPSBAKCctRW5jb2RlZENvbW1hbmQnLCAkRW5jb2RlZENvbW1hbmQpCiAgICAgICAgfQoKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAkQXJndW1lbnRMaXN0CgogICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgZXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIC4uLiIKCiAgICAgICAgaWYgKCRDcmVkZW50aWFsIC1lcSAkbnVsbCkgewogICAgICAgICAgICAkUHJvY2VzcyA9IFN0YXJ0LVByb2Nlc3MgLUZpbGVQYXRoICdwb3dlcnNoZWxsLmV4ZScgYAogICAgICAgICAgICAgICAgLUFyZ3VtZW50TGlzdCBAKCRBcmd1bWVudExpc3QpIGAKICAgICAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ICRTdGRPdXQgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRFcnJvciAkU3RkRXJyIGAKICAgICAgICAgICAgICAgIC1Ob05ld1dpbmRvdyBgCiAgICAgICAgICAgICAgICAtV2FpdCBgCiAgICAgICAgICAgICAgICAtUGFzc1RocnUKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQcm9jZXNzID0gU3RhcnQtUHJvY2VzcyAtRmlsZVBhdGggJ3Bvd2Vyc2hlbGwuZXhlJyBgCiAgICAgICAgICAgICAgICAtQXJndW1lbnRMaXN0IEAoJEFyZ3VtZW50TGlzdCkgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRPdXRwdXQgJFN0ZE91dCBgCiAgICAgICAgICAgICAgICAtUmVkaXJlY3RTdGFuZGFyZEVycm9yICRTdGRFcnIgYAogICAgICAgICAgICAgICAgLUNyZWRlbnRpYWwgJENyZWRlbnRpYWwgYAogICAgICAgICAgICAgICAgLU5vTmV3V2luZG93IGAKICAgICAgICAgICAgICAgIC1XYWl0IGAKICAgICAgICAgICAgICAgIC1QYXNzVGhydQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeHRlcm5hbCBQb3dlclNoZWxsIHByb2Nlc3MgZXhpdGVkIHdpdGggZXhpdCBjb2RlICckKCRQcm9jZXNzLkV4aXRDb2RlKScuIgoKICAgICAgICAjaWYgKCRBcmd1bWVudExpc3QgLWNvbnRhaW5zICctRmlsZScpIHsKICAgICAgICAjICAgIFJlbW92ZS1JdGVtIC1QYXRoICRUbXBTY3JpcHQgLUZvcmNlCiAgICAgICAgI30KCiAgICAgICAgJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZQogICAgICAgICRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU2lsZW50bHlDb250aW51ZScKCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlN0ZE91dCBmaWxlIGlzICckU3RkT3V0JyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU3RkRXJyIGZpbGUgaXMgJyRTdGRFcnInIgoKICAgICAgICBpZiAoKEdldC1JdGVtICRTdGRPdXQpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkxvYWRpbmcgU3RkT3V0IGZyb20gJyRTdGRPdXQnIgogICAgICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZE91dAogICAgICAgICAgICAgICAgJFN0ZE91dE9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8U3RkT3V0PiIKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICgkU3RkT3V0T2JqZWN0KQogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkT3V0PiIKICAgICAgICAgICAgICAgICRTdGRPdXRPYmplY3QKICAgICAgICAgICAgICAgICNSZW1vdmUtSXRlbSAtUGF0aCAkVG1wRmlsZSAtRm9yY2UKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBsb2FkaW5nIFN0ZE91dCBmcm9tICckVG1wRmlsZSciCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgoR2V0LUl0ZW0gJFN0ZEVycikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiTG9hZGluZyBTdGRFcnIgLi4uIgogICAgICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZEVycgogICAgICAgICAgICAgICAgJFN0ZEVyck9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8U3RkRXJyPiIKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICgkU3RkRXJyT2JqZWN0KQogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkRXJyPiIKICAgICAgICAgICAgICAgIGlmICgtbm90ICRJZ25vcmVTdGRFcnIpIHsKICAgICAgICAgICAgICAgICAgICAkU3RkRXJyT2JqZWN0CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjUmVtb3ZlLUl0ZW0gLVBhdGggJFRtcEZpbGUgLUZvcmNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgbG9hZGluZyBTdGRFcnIgZnJvbSAnJFRtcEZpbGUnIgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkCgogICAgICAgIGlmICgkUHJvY2Vzcy5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICB0aHJvdygiRXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJyQoJFByb2Nlc3MuRXhpdENvZGUpJyIpCiAgICAgICAgfQoKICAgICAgICAjUmVtb3ZlLUl0ZW0gJFN0ZE91dCAtRm9yY2UKICAgICAgICAjUmVtb3ZlLUl0ZW0gJFN0ZEVyciAtRm9yY2UKICAgIH0KfQo=" + "CmZ1bmN0aW9uIFNlbGVjdC1DbGlYbWxCbG9jayB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFBhdGgsCiAgICAgICAgW1N0cmluZ10gJE91dEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICApCgogICAgJFRhZ0ZvdW5kID0gJGZhbHNlCiAgICBHZXQtQ29udGVudCAkUGF0aCB8CiAgICAgICAgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICBpZiAoJF8gLWVxICcjPCBDTElYTUwnKSB7CiAgICAgICAgICAgICAgICAkVGFnRm91bmQgPSAkdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkVGFnRm91bmQpIHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRPdXRGaWxlIC1WYWx1ZSAkXwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgJE91dEZpbGUKfQoKCgpmdW5jdGlvbiBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJENvbW1hbmQsCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbCwKICAgICAgICBbU3dpdGNoXSAkSWdub3JlU3RkRXJyLAogICAgICAgIFtTd2l0Y2hdICROb0Jhc2U2NAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgdHJhcCB7CiAgICAgICAgICAgICYkVHJhcEhhbmRsZXIKICAgICAgICB9CgogICAgICAgICRTdGRPdXQgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAgICAgJFN0ZEVyciA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKCiAgICAgICAgJEFyZ3VtZW50TGlzdCA9IEAoJy1PdXRwdXRGb3JtYXQnLCAnWE1MJykKCiAgICAgICAgaWYgKCROb0Jhc2U2NCkgewogICAgICAgICAgICAkVG1wU2NyaXB0ID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQogICAgICAgICAgICBSZW5hbWUtSXRlbSAtUGF0aCAiJFRtcFNjcmlwdCIgLU5ld05hbWUgIiRUbXBTY3JpcHQucHMxIiAtRm9yY2UKICAgICAgICAgICAgJFRtcFNjcmlwdCA9ICIkVG1wU2NyaXB0LnBzMSIKCiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICRUbXBTY3JpcHQKCiAgICAgICAgICAgICRDb21tYW5kIHwgT3V0LUZpbGUgJFRtcFNjcmlwdAoKICAgICAgICAgICAgJEFyZ3VtZW50TGlzdCArPSBAKCctRmlsZScsICIkVG1wU2NyaXB0IikKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRCeXRlcyA9IFtUZXh0LkVuY29kaW5nXTo6VW5pY29kZS5HZXRCeXRlcygkQ29tbWFuZCkKICAgICAgICAgICAgJEVuY29kZWRDb21tYW5kID0gW0NvbnZlcnRdOjpUb0Jhc2U2NFN0cmluZygkQnl0ZXMpCiAgICAgICAgICAgIAogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAkRW5jb2RlZENvbW1hbmQKCiAgICAgICAgICAgICRBcmd1bWVudExpc3QgKz0gQCgnLUVuY29kZWRDb21tYW5kJywgJEVuY29kZWRDb21tYW5kKQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nRGVidWcgJEFyZ3VtZW50TGlzdAoKICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIGV4dGVybmFsIFBvd2VyU2hlbGwgcHJvY2VzcyAuLi4iCgogICAgICAgIGlmICgkQ3JlZGVudGlhbCAtZXEgJG51bGwpIHsKICAgICAgICAgICAgJFByb2Nlc3MgPSBTdGFydC1Qcm9jZXNzIC1GaWxlUGF0aCAncG93ZXJzaGVsbC5leGUnIGAKICAgICAgICAgICAgICAgIC1Bcmd1bWVudExpc3QgQCgkQXJndW1lbnRMaXN0KSBgCiAgICAgICAgICAgICAgICAtUmVkaXJlY3RTdGFuZGFyZE91dHB1dCAkU3RkT3V0IGAKICAgICAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkRXJyb3IgJFN0ZEVyciBgCiAgICAgICAgICAgICAgICAtTm9OZXdXaW5kb3cgYAogICAgICAgICAgICAgICAgLVdhaXQgYAogICAgICAgICAgICAgICAgLVBhc3NUaHJ1CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUHJvY2VzcyA9IFN0YXJ0LVByb2Nlc3MgLUZpbGVQYXRoICdwb3dlcnNoZWxsLmV4ZScgYAogICAgICAgICAgICAgICAgLUFyZ3VtZW50TGlzdCBAKCRBcmd1bWVudExpc3QpIGAKICAgICAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ICRTdGRPdXQgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRFcnJvciAkU3RkRXJyIGAKICAgICAgICAgICAgICAgIC1DcmVkZW50aWFsICRDcmVkZW50aWFsIGAKICAgICAgICAgICAgICAgIC1Ob05ld1dpbmRvdyBgCiAgICAgICAgICAgICAgICAtV2FpdCBgCiAgICAgICAgICAgICAgICAtUGFzc1RocnUKICAgICAgICB9CgogICAgICAgIFdyaXRlLUxvZyAiRXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIGV4aXRlZCB3aXRoIGV4aXQgY29kZSAnJCgkUHJvY2Vzcy5FeGl0Q29kZSknLiIKCiAgICAgICAgI2lmICgkQXJndW1lbnRMaXN0IC1jb250YWlucyAnLUZpbGUnKSB7CiAgICAgICAgIyAgICBSZW1vdmUtSXRlbSAtUGF0aCAkVG1wU2NyaXB0IC1Gb3JjZQogICAgICAgICN9CgogICAgICAgICRFcnJvckFjdGlvblByZWZlcmVuY2VTYXZlZCA9ICRFcnJvckFjdGlvblByZWZlcmVuY2UKICAgICAgICAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJ1NpbGVudGx5Q29udGludWUnCgogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJTdGRPdXQgZmlsZSBpcyAnJFN0ZE91dCciCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlN0ZEVyciBmaWxlIGlzICckU3RkRXJyJyIKCiAgICAgICAgaWYgKChHZXQtSXRlbSAkU3RkT3V0KS5MZW5ndGggLWd0IDApIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJMb2FkaW5nIFN0ZE91dCBmcm9tICckU3RkT3V0JyIKICAgICAgICAgICAgICAgICRUbXBGaWxlID0gU2VsZWN0LUNsaVhtbEJsb2NrICRTdGRPdXQKICAgICAgICAgICAgICAgICRTdGRPdXRPYmplY3QgPSBJbXBvcnQtQ2xpeG1sICRUbXBGaWxlCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPFN0ZE91dD4iCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAoJFN0ZE91dE9iamVjdCkKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8L1N0ZE91dD4iCiAgICAgICAgICAgICAgICAkU3RkT3V0T2JqZWN0CiAgICAgICAgICAgICAgICAjUmVtb3ZlLUl0ZW0gLVBhdGggJFRtcEZpbGUgLUZvcmNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgbG9hZGluZyBTdGRPdXQgZnJvbSAnJFRtcEZpbGUnIgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoKEdldC1JdGVtICRTdGRFcnIpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkxvYWRpbmcgU3RkRXJyIC4uLiIKICAgICAgICAgICAgICAgICRUbXBGaWxlID0gU2VsZWN0LUNsaVhtbEJsb2NrICRTdGRFcnIKICAgICAgICAgICAgICAgICRTdGRFcnJPYmplY3QgPSBJbXBvcnQtQ2xpeG1sICRUbXBGaWxlCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPFN0ZEVycj4iCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAoJFN0ZEVyck9iamVjdCkKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8L1N0ZEVycj4iCiAgICAgICAgICAgICAgICBpZiAoLW5vdCAkSWdub3JlU3RkRXJyKSB7CiAgICAgICAgICAgICAgICAgICAgJFN0ZEVyck9iamVjdAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgI1JlbW92ZS1JdGVtIC1QYXRoICRUbXBGaWxlIC1Gb3JjZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGxvYWRpbmcgU3RkRXJyIGZyb20gJyRUbXBGaWxlJyIKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICRFcnJvckFjdGlvblByZWZlcmVuY2VTYXZlZAoKICAgICAgICBpZiAoJFByb2Nlc3MuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICAgICAgdGhyb3coIkV4dGVybmFsIFBvd2VyU2hlbGwgcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlICckKCRQcm9jZXNzLkV4aXRDb2RlKSciKQogICAgICAgIH0KCiAgICAgICAgI1JlbW92ZS1JdGVtICRTdGRPdXQgLUZvcmNlCiAgICAgICAgI1JlbW92ZS1JdGVtICRTdGRFcnIgLUZvcmNlCiAgICB9Cn0K" ] } \ No newline at end of file diff --git a/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/InitializeAOAGSecondaryReplica.yaml.json b/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/InitializeAOAGSecondaryReplica.yaml.json index a2a599af..edb91fb2 100644 --- a/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/InitializeAOAGSecondaryReplica.yaml.json +++ b/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/InitializeAOAGSecondaryReplica.yaml.json @@ -12,12 +12,12 @@ } ], "Scripts": [ - "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKZnVuY3Rpb24gU2hvdy1JbnZvY2F0aW9uSW5mbyB7CiAgICBwYXJhbSAoCiAgICAgICAgJEludm9jYXRpb24sCiAgICAgICAgW1N3aXRjaF0gJEVuZAogICAgKQoKICAgIGlmICgkRW5kKSB7CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgIH0KICAgIGVsc2UgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8ZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPHBhcmFtPiIKICAgICAgICBmb3JlYWNoICgkUGFyYW1ldGVyIGluICRJbnZvY2F0aW9uLk15Q29tbWFuZC5QYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRLZXkgaW4gJFBhcmFtZXRlci5LZXlzKSB7CiAgICAgICAgICAgICAgICAkVHlwZSA9ICRQYXJhbWV0ZXJbJEtleV0uUGFyYW1ldGVyVHlwZS5GdWxsTmFtZQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJFZhbHVlIGluICRJbnZvY2F0aW9uLkJvdW5kUGFyYW1ldGVyc1skS2V5XSkgewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJbJFR5cGVdICRLZXkgPSAnJFZhbHVlJyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPC9wYXJhbT4iCiAgICB9Cn0KCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKCmZ1bmN0aW9uIFNob3ctSW52b2NhdGlvbkluZm8gewogICAgcGFyYW0gKAogICAgICAgICRJbnZvY2F0aW9uLAogICAgICAgIFtTd2l0Y2hdICRFbmQKICAgICkKCiAgICBpZiAoJEVuZCkgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8L2Z1bmN0aW9uIG5hbWU9JyQoJEludm9jYXRpb24uTXlDb21tYW5kLk5hbWUpJz4iCiAgICB9CiAgICBlbHNlIHsKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPGZ1bmN0aW9uIG5hbWU9JyQoJEludm9jYXRpb24uTXlDb21tYW5kLk5hbWUpJz4iCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjxwYXJhbT4iCiAgICAgICAgZm9yZWFjaCAoJFBhcmFtZXRlciBpbiAkSW52b2NhdGlvbi5NeUNvbW1hbmQuUGFyYW1ldGVycykgewogICAgICAgICAgICBmb3JlYWNoICgkS2V5IGluICRQYXJhbWV0ZXIuS2V5cykgewogICAgICAgICAgICAgICAgJFR5cGUgPSAkUGFyYW1ldGVyWyRLZXldLlBhcmFtZXRlclR5cGUuRnVsbE5hbWUKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRWYWx1ZSBpbiAkSW52b2NhdGlvbi5Cb3VuZFBhcmFtZXRlcnNbJEtleV0pIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiWyRUeXBlXSAkS2V5ID0gJyRWYWx1ZSciCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvcGFyYW0+IgogICAgfQp9CgoKJFRyYXBIYW5kbGVyID0gewogICAgV3JpdGUtTG9nRXJyb3IgQCgiPGV4Y2VwdGlvbj4iLCAkXykgLUVudGlyZU9iamVjdAogICAgV3JpdGUtTG9nRXJyb3IgIjwvZXhjZXB0aW9uPiIKICAgIGJyZWFrCn0KCgp0cmFwIHsKICAgICYkVHJhcEhhbmRsZXIKfQoKJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICdTdG9wJwoKCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", "ZnVuY3Rpb24gTmV3LU9wdGlvbiAoW3N0cmluZ10kTmFtZSwgW3N3aXRjaF0kU3dpdGNoLCBbc3dpdGNoXSRCb29sZWFuLCBbc3dpdGNoXSRTdHJpbmcsIFtzd2l0Y2hdJExpc3QsICRDb25zdHJhaW50cz0kbnVsbCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb24gb2JqZWN0CgogICAgLkRFU0NSSVBUSU9OCiAgICBPcHRpb24gb2JqZWN0IGlzIGEgdmlydHVhbCBvYmplY3QgcmVwcmVzdG50aW5nIHR5cGVkIGNvbW1hbmQgbGluZSBvcHRpb24uIFRoZXNlIG9iamVjdHMgZW5jYXBzdWxhdGUgZXNjYXBpbmcgYW5kCiAgICB2YWxpZGF0aW9uIG1hdHRlcnMuCgogICAgT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgc3dpdGNoZXMgJ1N3aXRjaCcsICdCb29sZWFuJywgJ1N0cmluZycgb3IgJ0xpc3QnIHNob3VsZCBiZSBwcm92aWRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZS4KCiAgICAuUEFSQU1FVEVSIFN3aXRjaAogICAgVXNlIHRoaXMgc3dpdGNoIHRvIGNyZWF0ZSB2YWx1ZWxlc3Mgb3B0aW9uIChhIHN3aXRjaCkuCgogICAgLlBBUkFNRVRFUiBCb29sZWFuCiAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gY3JlYXRlIGJvb2xlYW4gb3B0aW9uLiBJdHMgdmFsdWUgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byAiMSIgb3IgIjAiCgogICAgLlBBUkFNRVRFUiBTdHJpbmcKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgc3RyaW5nIG9wdGlvbi4gSXRzIHZhbHVlIHdpbGwgYmUgcHJvcGVybHkgcXVvdGVkIGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIExpc3QKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgb3B0aW9uIHdpdGggbGlzdCB2YWx1ZS4gVmFsdWVzIHdpbGwgYmUgcHV0IGludG8gY29tbWFuZCBsaW5lIHVzaW5nIHZhbGlkIHZhbHVlIGRlbGVtaXRlciAoYSBjb21tYSkKCiAgICAuUEFSQU1FVEVSIENvbnN0cmFpbnRzCiAgICBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgb3B0aW9uIHZhbHVlcyBhcmUgbGltaXRlZCB0byBvcHRpb25zIGZyb20gdGhhdCBsaXN0LgoKICAgICM+CgogICAgJE9wdGlvbiA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFBTT2JqZWN0CgogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBUeXBlIC12YWx1ZSAkbnVsbAogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IE5hbWUgLXZhbHVlICRudWxsCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgQWxsb3dlZFZhbHVlcyAtdmFsdWUgJG51bGwKCiAgICAjIEluaXQKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgX19pbml0X18gewogICAgICAgIHBhcmFtKFtzdHJpbmddJE5hbWUsICRTd2l0Y2gsICRCb29sZWFuLCAkU3RyaW5nLCAkTGlzdCkKCiAgICAgICAgJHRoaXMuTmFtZSA9ICROYW1lCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIyBXaXRoIHJlc3BlY3QgZm9yIG91ciBkZXZlbG9wZXJzIHdlIGRvIG5vdCBjaGVjayBmb3IgZG91YmxlIHR5cGUgc2VsZWN0ZWQKICAgICAgICBpZiAoJFN3aXRjaCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3dpdGNoKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkQm9vbGVhbikgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uQm9vbGVhbigkdGhpcykKICAgICAgICB9IGVsc2VpZiAoJFN0cmluZykgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3RyaW5nKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkTGlzdCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uTGlzdCgkdGhpcykKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiU3dpdGNoLCBCb29sZWFuLCBTdHJpbmcgb3IgTGlzdCBvcHRpb24gdHlwZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBvcHRpb24gJyROYW1lJyIKICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIF9fcG9zdF9pbml0X18gewogICAgICAgIHBhcmFtKCRDb25zdHJhaW50cz0kbnVsbCkKICAgICAgICBpZiAoJENvbnN0cmFpbnRzIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkdGhpcy5BbGxvd2VkVmFsdWVzID0gQCgpCiAgICAgICAgICAgICR0aGlzLkFsbG93ZWRWYWx1ZXMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzICsgJENvbnN0cmFpbnRzCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnN0cmFpbnRzID0gJG51bGwKICAgICAgICB9CiAgICB9CgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBWYWxpZGF0ZSB7CiAgICAgICAgaWYgKCR0aGlzLkFsbG93ZWRWYWx1ZXMgLW5lICRudWxsKSB7CiAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICR0aGlzLlZhbHVlKSkgewogICAgICAgICAgICAgICAgJEN0cyA9ICR0aGlzLkFsbG93ZWRWYWx1ZXMgLWpvaW4gJywnCiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckKCR0aGlzLk5hbWUpJyBtYXkgaGF2ZSB2YWx1ZXMgKCRDdHMpIGJ1dCBub3QgJyQoJHRoaXMuVmFsdWUpJyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFRvU3RyaW5nIHsKICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpIgogICAgfQoKICAgICMgaW52b2tlIGNvbnN0cnVjdG9yCgogICAgJE9wdGlvbi5fX2luaXRfXygkTmFtZSwgJFN3aXRjaCwgJEJvb2xlYW4sICRTdHJpbmcsICRMaXN0KQogICAgJE9wdGlvbi5fX3Bvc3RfaW5pdF9fKCRDb25zdHJhaW50cykKCiAgICByZXR1cm4gJE9wdGlvbgp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3dpdGNoKCRPcHRpb24pIHsKfQoKZnVuY3Rpb24gQXVnbWVudE9wdGlvbkJvb2xlYW4oJE9wdGlvbikgewogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBWYWx1ZSAtdmFsdWUgJGZhbHNlCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgaWYgKCR0aGlzLlZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9MSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpPTAiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3RyaW5nKCRPcHRpb24pIHsKICAgICMgRmllbGRzCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgVmFsdWUgLXZhbHVlICIiCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgJHYgPSAiJCgkdGhpcy5WYWx1ZSkiCiAgICAgICAgaWYgKCR2IC1tYXRjaCAnLiogLionKSB7CiAgICAgICAgICAgICMgVE9ETzogRXNjYXBlIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzIGlmIHBvc3NpYmxlCiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9YCIkdmAiIgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JHYiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uTGlzdCgkT3B0aW9uKSB7CiAgICAjIEZpZWxkcwogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFZhbHVlIC12YWx1ZSBAKCkKCiAgICAjIE1ldGhvZHMKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFZhbGlkYXRlIHsKICAgICAgICBpZiAoJHRoaXMuQWxsb3dlZFZhbHVlcyAtbmUgJG51bGwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJFYgaW4gJHRoaXMuVmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICRWKSkgewogICAgICAgICAgICAgICAgICAgICRDdHMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzIC1qb2luICcsJwogICAgICAgICAgICAgICAgICAgIHRocm93ICJPcHRpb24gJyQoJHRoaXMuTmFtZSknIG1heSBoYXZlIHZhbHVlcyAoJEN0cykgYnV0IG5vdCAnJFYnIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIC1Gb3JjZSBTY3JpcHRNZXRob2QgVG9TdHJpbmcgewogICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JCgkdGhpcy5WYWx1ZSAtam9pbiAnLCcpIgogICAgfQp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyKCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb25QYXJzZXIgb2JqZWN0LgoKICAgIC5ERVNDUklQVElPTgogICAgT3B0aW9uUGFyc2VyIG9iamVjdCBsZXZlcmFnZXMgT3B0aW9uIG9iamVjdHMgY2FwYWJpbGl0aWVzIGFuZCBidWlsZHMgdmFsaWQgY29tbWFuZCBsaW5lIHVzaW5nIHNwZWNpZmllZCBvcHRpb25zLgogICAgQW4gYXBwbGljYXRpb24gbWF5IGFsc28gYmUgaW52b2tlZCB3aXRoIE9wdGlvblBhcnNlci4KCiAgICAjPgoKICAgICRPcHRpb25QYXJzZXIgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBQU09iamVjdAoKICAgICMgRmllbGRzCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgT3B0aW9ucyAtdmFsdWUgQHt9CiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgRGVmYXVsdHMgLXZhbHVlIEB7fQogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFJlcXVpcmVkT3B0aW9ucyAtdmFsdWUgQCgpCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIEFkZE9wdGlvbiB7CiAgICAgICAgPCMKICAgICAgICAuU1lOT1BTSVMKICAgICAgICBBZGRzIHN1cHBvcnRlZCBvcHRpb24gaW50byBPcHRpb25QYXJzZXIuCiAgICAgICAgCiAgICAgICAgLkRFU0NSSVBUSU9OCiAgICAgICAgT3B0aW9uUGFyc2VyIGRvZXMgbm90IGFsbG93IHVzaW5nIHVucmVjb2duaXplZCBvcHRpb25zLiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsbCBPcHRpb25QYXJzZXIgd2l0aCByZWNvZ25pemVkIG9wdGlvbnMKCiAgICAgICAgLlBBUkFNRVRFUiBPcHRpb24KICAgICAgICBPcHRpb24gb2JqZWN0CgogICAgICAgIC5QQVJBTUVURVIgUmVxdWlyZWQKICAgICAgICBSZXF1aXJlZCBvcHRpb24gc3dpdGNoCgogICAgICAgIC5QQVJBTUVURVIgRGVmYXVsdAogICAgICAgIE9wdGlvbiBkZWZhdWx0IHZhbHVlCiAgICAgICAgIz4KICAgICAgICBwYXJhbSgkT3B0aW9uLCBbYm9vbF0kUmVxdWlyZWQ9JGZhbHNlLCAkRGVmYXVsdD0kbnVsbCkKICAgICAgICAkdGhpcy5PcHRpb25zLkFkZCgkT3B0aW9uLk5hbWUsICRPcHRpb24pCiAgICAgICAgaWYgKCRSZXF1aXJlZCkgewogICAgICAgICAgICAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgPSAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgKyAkT3B0aW9uLk5hbWUKICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgIGlmICgkRGVmYXVsdCkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLkRlZmF1bHRzLkFkZCgkT3B0aW9uLk5hbWUsICREZWZhdWx0KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMuRGVmYXVsdHMuQWRkKCRPcHRpb24uTmFtZSwgJG51bGwpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIFBhcnNlIHsKICAgICAgICA8IwogICAgICAgIC5TWU5PUFNJUwogICAgICAgIFBhcnNlcyBzdXBwbGllZCBvcHRpb25zIGFuZCByZXR1cm5zIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFycmF5LgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQgb25seSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGFsbCBtYW5kYXRvcnkgb3B0aW9ucyBhcmUgaW4gcGxhY2UsIAogICAgICAgIGFsbCBvcHRpb24gbWVldCBjb25zdHJhaW50cyBpZiBhbnkuIFVuc3BlY2lmaWVkIG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhcmUgYWRkZWQgdG8gY29tbWFuZCBsaW5lLgogICAgICAgIFNvLCBtYW5kYXRvcnkgb3B0aW9uIHdpdGggZGVmYXVsdCB2YWx1ZSBuZXZlciBjYXVzZXMgZXhjZXB0aW9uLgoKICAgICAgICAuUEFSQU1FVEVSIE9wdGlvbnMKICAgICAgICBBIGhhc2ggbWFwIG9mIG9wdGlvbnMgdG8gcGFyc2UuIE9wdGlvbiBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgogICAgICAgICM+CiAgICAgICAgcGFyYW0oW2hhc2h0YWJsZV0kT3B0aW9ucykKCiAgICAgICAgJENvbW1hbmRMaW5lID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJFJlcXVpcmVkT3B0aW9uTmFtZSBpbiAkdGhpcy5SZXF1aXJlZE9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJE9wdGlvbnMuQ29udGFpbnNLZXkoJFJlcXVpcmVkT3B0aW9uTmFtZSkpIHsKICAgICAgICAgICAgICAgICREZWZhdWx0ID0gJHRoaXMuRGVmYXVsdHMuR2V0X0l0ZW0oJFJlcXVpcmVkT3B0aW9uTmFtZSkKICAgICAgICAgICAgICAgIGlmICgkdGhpcy5EZWZhdWx0cy5Db250YWluc0tleSgkUmVxdWlyZWRPcHRpb25OYW1lKSkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25zLkFkZCgkUmVxdWlyZWRPcHRpb25OYW1lLCAkdGhpcy5EZWZhdWx0cy5HZXRfSXRlbSgkUmVxdWlyZWRPcHRpb25OYW1lKSkKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlJlcXVpcmVkIG9wdGlvbiAnJFJlcXVpcmVkT3B0aW9uTmFtZScgaXMgbWlzc2luZyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJE9wdGlvbk5hbWUgaW4gJCgkT3B0aW9ucy5rZXlzKSkgewogICAgICAgICAgICAkT3B0aW9uID0gJHRoaXMuT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgaWYgKCRPcHRpb24gLWVxICRudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckT3B0aW9uTmFtZScgaXMgbm90IGFsbG93ZWQiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgICRPcHRpb24uVmFsdWUgPSAkT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgfQogICAgICAgICAgICAkT3B0aW9uLlZhbGlkYXRlKCkKICAgICAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJE9wdGlvbi5Ub1N0cmluZygpCiAgICAgICAgfQogICAgICAgIHJldHVybiAkQ29tbWFuZExpbmUKICAgIH0KCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgRXhlY3V0ZUJpbmFyeSB7CiAgICAgICAgcGFyYW0oJEJpbmFyeSwgW2hhc2h0YWJsZV0kT3B0aW9ucyA9IEB7fSwgJENvbW1hbmRMaW5lU3VmZml4ID0gQCgpKQogICAgICAgIDwjCiAgICAgICAgLlNZTk9QU0lTCiAgICAgICAgRXhlY3V0ZXMgYmluYXJ5IHdpdGggYSBjb21tYW5kIGxpbmUgY29uc3RydWN0ZWQgZnJvbSBwcm92aWRlZCBvcHRpb25zLiBBbiBhcmJpdHJhcnkgc3VmZml4IG1heSBiZSAKICAgICAgICBhcHBlbmRlZCB0byB0aGUgY29tbWFuZCBsaW5lLgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHVzZXMgT3B0aW9uUGFyc2VyLlBhcnNlIG1ldGhvZCB0byBjb25zdHJ1Y3QgY29tbWFuZCBsaW5lLiBJZiB0aGVyZSBhIGNvbW1hbmQgbGluZSBzdWZmaXggCiAgICAgICAgd2FzIHN1cHBsaWVkLCBpdCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIGNvbW1hbmQgbGluZS4gTm9ybWFsbHkgY29tbWFuZCBsaW5lIHN1ZmZpeCBzaG91bGQgY29udGFpbgogICAgICAgIGxlYWRpbmcgc3BhY2UgY2hhcmFjdGVyLgoKICAgICAgICBNZXRob2Qgd2FpdHMgZm9yIGV4ZWN1dGFibGUgcHJvY2VzcyB0byBjb21wbGV0ZSBhbmQgcmV0dXJucyBpdHMgZXhpdCBjb2RlLgoKICAgICAgICAuUEFSQU1FVEVSIEJpbmFyeQogICAgICAgIEZ1bGwgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSB0byBydW4uCgogICAgICAgIC5QQVJBTUVURVIgT3B0aW9ucwogICAgICAgIEEgaGFzaCBtYXAgb2Ygb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBleGVjdXRhYmxlLgoKICAgICAgICAuUEFSQU1FVEVSIENvbW1hbmRMaW5lU3VmZml4CiAgICAgICAgQXJiaXRyYXJ5IGNvbW1hbmQgbGluZSBzdWZmaXguIE5vcm1hbGx5IGl0IHNob3VkIGhhdmUgbGVhZGluZyBzcGFjZSBjaGFyYWN0ZXIuCiAgICAgICAgIz4KCiAgICAgICAgJEJpbmFyeSA9IEdldC1JdGVtICRCaW5hcnkKICAgICAgICAkQ29tbWFuZExpbmUgPSAkdGhpcy5QYXJzZSgkT3B0aW9ucykKICAgICAgICBpZiAoJENvbW1hbmRMaW5lU3VmZml4KSB7CiAgICAgICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICRDb21tYW5kTGluZVN1ZmZpeAogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeGVjdXRpbmc6ICQoJEJpbmFyeS5GdWxsTmFtZSkgJCgkQ29tbWFuZExpbmUgLWpvaW4gJyAnKSIKICAgICAgICAkcHJvY2VzcyA9IFtTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzc106OlN0YXJ0KCRCaW5hcnksICRDb21tYW5kTGluZSkKICAgICAgICAkcHJvY2Vzcy5XYWl0Rm9yRXhpdCgpCiAgICAgICAgJHByb2Nlc3MuUmVmcmVzaCgpCiAgICAgICAgcmV0dXJuICRwcm9jZXNzLkV4aXRDb2RlCiAgICB9CgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQo=", "ZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckluc3RhbGwgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIklOU1RBTEwiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkSXNQYXJ0T2ZEb21haW4gPSAoR2V0LVdtaU9iamVjdCBXaW4zMl9Db21wdXRlclN5c3RlbSkuUGFydE9mRG9tYWluCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIklOU1RBTEwiKSwgJHRydWUsICJJTlNUQUxMIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICMkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVwZGF0ZVNvdXJjZSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIkRSRVBMQVlfQ1RMUiIsIkRSRVBMQVlfQ0xUIiwiU05BQ19TREsiLCJTREsiLCJMb2NhbERCIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJPTEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU1BJX0FTX0V4aXN0aW5nRmFybSIsICJTUElfQVNfTmV3RmFybSIsICJBbGxGZWF0dXJlc19XaXRoRGVmYXVsdHMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRFdPV0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVJTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJOb3JtYWwiLCAiQXV0b0FkdmFuY2UiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU0NPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNDT05GSUdESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU0VSVkVSTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNVUxUSURJTUVOU0lPTkFMIiwgIlBPV0VSUElWT1QiLCAiVEFCVUxBUiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgaWYgKCRJc1BhcnRPZkRvbWFpbikgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6VVNFUkRPTUFJTlxBZG1pbmlzdHJhdG9yIikKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1RFTVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTUFJPVklERVJNU09MQVAiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkFSTVBBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJQQVNTUEhSQVNFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQURNSU5JUE9SVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQlJPV1NFUlNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5BQkxFUkFOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNRTERBVEFESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNBUFdEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTRUNVUklUWU1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnJzICgiU1FMIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTEJBQ0tVUERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQ09MTEFUSU9OIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBRERDVVJSRU5UVVNFUkFTU1FMQURNSU4iIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgIGlmICgkSXNQYXJ0T2ZEb21haW4pIHsKICAgICAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNTEVWRUwiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiMCIsICIxIiwgIjIiLCAiMyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNU0hBUkVOQU1FIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ0FDQ09VTlQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIk5QRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlRDUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU0lOU1RBTExNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIlNoYXJlUG9pbnRGaWxlc09ubHlNb2RlIiwgIkRlZmF1bHROYXRpdmVNb2RlIiwgIkZpbGVzT25seU1vZGUiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1N0YXJ0dXBUeXBlIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IGZvciBpbnN0YWxsZXIgdmVyc2lvbiBvZiBNUyBTUUwgU2VydmVyIHByaW9yIHRvIDIwMTIgU1AxIEN1bXVsYXRpdmUgVXBkYXRlIDIgb25seSB0aGUKICAgIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOiBTUUxFbmdpbmUsIFJlcGxpY2F0aW9uLCBGdWxsVGV4dCwgUlMKCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiUHJlcGFyZUltYWdlIiksICR0cnVlLCAiUHJlcGFyZUltYWdlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVFbmFibGVkIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVTb3VyY2UiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKIyAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJSUyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGRUFUVVJFUyIgLUxpc3QgLUNvbnN0cmFpbnRzICgiU1FMIiwiU1FMRW5naW5lIiwiUmVwbGljYXRpb24iLCJGdWxsVGV4dCIsIkRRIiwiQVMiLCJSUyIsIkRRQyIsIklTIiwiTURTIiwiVG9vbHMiLCJCQyIsIkJPTCIsIkJJRFMiLCJDb25uIiwiU1NNUyIsIkFEVl9TU01TIiwiRFJFUExBWV9DVExSIiwiRFJFUExBWV9DTFQiLCJTTkFDX1NESyIsIlNESyIsIkxvY2FsREIiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTSEFSRURESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQU5DRUlEIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2VTUDFVMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgVGhpcyBjbWRsZXQgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9yIGxhdGVyLgoKICAgIE5vdGUgdGhhdCBmb3IgaW5zdGFsbGVyIHZlcnNpb24gb2YgTVMgU1FMIFNlcnZlciBwcmlvciB0byAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9ubHkgdGhlCiAgICBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDogU1FMRW5naW5lLCBSZXBsaWNhdGlvbiwgRnVsbFRleHQsIFJTCgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlByZXBhcmVJbWFnZSIpLCAkdHJ1ZSwgIlByZXBhcmVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlU291cmNlIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJDT05GSUdVUkFUSU9ORklMRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJISURFQ09OU09MRSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk1TU1FMU0VSVkVSIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIkNvbXBsZXRlSW1hZ2UiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IElOU1RBTkNFSUQgcGFyYW1ldGVyIHZhbHVlIE1VU1QgYmUgdGhlIHNhbWUgYXMgc3BlY2lmaWVkIG9uICJQcmVwYXJlSW1hZ2UiIHBoYXNlLgoKICAgIEFsbCBkb2N1bWVudGVkIG9wdGlvbiBhcmUgc3VwcG9ydGVkLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvciBkZXRhaWxzOgogICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKICAgICM+CiAgICAkT3B0aW9uUGFyc2VyID0gTmV3LU9wdGlvblBhcnNlcgoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBQ1RJT04iIC1TdHJpbmcgLUNvbnN0cmFpbnRzICJDb21wbGV0ZUltYWdlIiksICR0cnVlLCAiQ29tcGxldGVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VJRCIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTVJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkhJREVDT05TT0xFIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUdUU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJCUk9XU0VSU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTkFCTEVSQU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQUxMU1FMREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0FQV0QiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNFQ1VSSVRZTU9ERSIgLVN0cmluZyAtQ29uc3RyYWlucnMgKCJTUUwiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxDT0xMQVRJT04iIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1MRVZFTCIgLVN0cmluZyAtQ29uc3RyYWludHMgKCIwIiwgIjEiLCAiMiIsICIzIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1TSEFSRU5BTUUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiTlBFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVENQRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTSU5TVEFMTE1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU2hhcmVQb2ludEZpbGVzT25seU1vZGUiLCAiRGVmYXVsdE5hdGl2ZU1vZGUiLCAiRmlsZXNPbmx5TW9kZSIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDU3RhcnR1cFR5cGUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICByZXR1cm4gJE9wdGlvblBhcnNlcgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVJbWFnZVNQMVUyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiQ29tcGxldGVJbWFnZSIgYWN0aW9uLgoKICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBTUDEgQ2ltaWxhdGl2ZSBVcGRhdGUgMiBvciBsYXRlci4KCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiQ29tcGxldGVJbWFnZSIpLCAkdHJ1ZSwgIkNvbXBsZXRlSW1hZ2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklBQ0NFUFRTUUxTRVJWRVJMSUNFTlNFVEVSTVMiIC1Td2l0Y2gpLCAkdHJ1ZSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFUlJPUlJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUElEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkJST1dTRVJTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOQUJMRVJBTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTUUxEQVRBRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTQVBXRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0VDVVJJVFlNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW5ycyAoIlNRTCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxCQUNLVVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTENPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTUxFVkVMIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIjAiLCAiMSIsICIyIiwgIjMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTVNIQVJFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNBQ0NPVU5UIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJOUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJUQ1BFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNJTlNUQUxMTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJTaGFyZVBvaW50RmlsZXNPbmx5TW9kZSIsICJEZWZhdWx0TmF0aXZlTW9kZSIsICJGaWxlc09ubHlNb2RlIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJVcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckVkaXRpb25VcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlcGFpciB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJSZWJ1aWxkZGF0YWJhc2UgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiSU5TVEFMTCIgYWN0aW9uLgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlVOSU5TVEFMTCIpLCAkdHJ1ZSwgIlVOSU5TVEFMTCIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZFQVRVUkVTIiAtTGlzdCAtQ29uc3RyYWludHMgKCJTUUwiLCJTUUxFbmdpbmUiLCJSZXBsaWNhdGlvbiIsIkZ1bGxUZXh0IiwiRFEiLCJBUyIsIlJTIiwiRFFDIiwiSVMiLCJNRFMiLCJUb29scyIsIkJDIiwiQk9MIiwiQklEUyIsIkNvbm4iLCJTU01TIiwiQURWX1NTTVMiLCJEUkVQTEFZX0NUTFIiLCJEUkVQTEFZX0NMVCIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VOQU1FIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsRmFpbG92ZXJDbHVzdGVyIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVXBncmFkZSB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJBZGROb2RlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlbW92ZU5vZGUgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9Cg==", "SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKZnVuY3Rpb24gVGVzdC1LZXkoW3N0cmluZ10kcGF0aCwgW3N0cmluZ10ka2V5KSB7CiAgICBpZighKFRlc3QtUGF0aCAkcGF0aCkpIHsgcmV0dXJuICRmYWxzZSB9CiAgICBpZiAoKEdldC1JdGVtUHJvcGVydHkgJHBhdGgpLiRrZXkgLWVxICRudWxsKSB7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCmZ1bmN0aW9uIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBNUyBTUUwgU2VydmVyIHByZXJlcXVpc2l0ZXMgKC5OZXQgRnJhbWV3b3JrIDMuNSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgICM+CiAgICBpZiAoLW5vdCAoVGVzdC1LZXkgIkhLTE06XFNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41IiAiSW5zdGFsbCIpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBTZXJ2ZXJNYW5hZ2VyCiAgICAgICAgV3JpdGUtSG9zdCAiLk5ldCBGcmFtZXdvcmsgMy41IG5vdCBmb3VuZC4gSW5zdGFsbGluZyBpdCB1c2luZyBTZXJ2ZXIgTWFuYWdlci4uLiIKICAgICAgICAkRmVhdHVyZSA9IEdldC1XaW5kb3dzRmVhdHVyZSBORVQtRnJhbWV3b3JrCiAgICAgICAgaWYgKCRGZWF0dXJlIC1lcSAkbnVsbCkgewogICAgICAgICAgICAjIFdlIGFyZSBwcm9iYWJseSBvbiBXaW5kb3dzIFNlcnZlciAyMDEyCiAgICAgICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmstQ29yZQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkRmVhdHVyZSkgewogICAgICAgICAgICB0aHJvdyAiLk5ldCBmcmFtZXdvcmsgMy41IGZlYXR1cmUgd2FzIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlLkRpc3BsYXlOYW1lIC1tYXRjaCAiMy41IikgewogICAgICAgICAgICBMb2ctV2FybmluZyAiLk5ldCBmcmFtZXdvcmsgMy41IGlzIHJlcXVpcmVkLCBidXQgJCgkRmVhdHVyZS5EaXNwbGF5TmFtZSkgaXMgYXZhaWxhYmxlIGFzIFdpbmRvd3MgZmVhdHVyZS4gUHJvY2VlZGluZyB3aXRoIGluc3RhbGxhdGlvbiIKICAgICAgICB9CiAgICAgICAgW3ZvaWRdKEFkZC1XaW5kb3dzRmVhdHVyZSAkRmVhdHVyZSkKICAgIH0KfQoKZnVuY3Rpb24gTmV3LVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUSIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiKSArICRFeHRyYUZlYXR1cmVzfSArICRFeHRyYU9wdGlvbnMpCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSB3aXRoIGFsbCBuZWVkZWQgZmVhdHVyZXMgdG8gc2V0IHVwIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCAKICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW4gdW5hdHRlbmRlZCBtb2RlLiBBbGwgZmVhdHVyZXMgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cHMgYXJlCiAgICBpbnN0YWxsZWQuCgogICAgQWxsIGF2YWlsYWJpbGl0eSBncm91cCBtZW1iZXJzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgU1FMU3ZjVXNyRG9tYW4sIFNRTFN2Y1Vzck5hbWUgYW5kIFNRTFN2Y1VzclBhc3N3b3JkIHBhcmFtZXRlcnMuCiAgICBVc2VyIG11c3QgYmUgYSBkb21haW4gdXNlciBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIG5vZGVzIGludGVyY29ubmVjdGlvbi4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JEb21haW4KICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IGRvbWFpbiBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyTmFtZQogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzclBhc3N3b3JkCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgcmVtb3ZlZCBiZXNpZGVzICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JEb21haW4sCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU1FMU3ZjVXNyTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JQYXNzd29yZCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRTUUxVc2VyID0gIiRTUUxTdmNVc3JEb21haW5cJFNRTFN2Y1Vzck5hbWUiCiAgICAkZG9tYWluID0gTmV3LU9iamVjdCBTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuRGlyZWN0b3J5RW50cnkoIkxEQVA6Ly8kU1FMU3ZjVXNyRG9tYWluIiwgJFNRTFN2Y1Vzck5hbWUsICRTUUxTdmNVc3JQYXNzd29yZCkKCiAgICBpZiAoJGRvbWFpbi5uYW1lIC1lcSAkbnVsbCkgewogICAgICAgIHRocm93ICJDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgdXNlciAkU1FMVXNlci4gQ2hlY2sgZG9tYWluLCBsb2dpbiBuYW1lIGFuZCBwYXNzd29yZC4iCiAgICB9CgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIsICJEUkVQTEFZX0NUTFIiLCAiRFJFUExBWV9DTFQiKSArICRFeHRyYUZlYXR1cmVzOwogICAgICAgICJBR1RTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQUdUU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiQVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJBU1NZU0FETUlOQUNDT1VOVFMiID0gJFNRTFVTZXI7CiAgICAgICAgIlNRTFNWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJTUUxTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJTUUxTWVNBRE1JTkFDQ09VTlRTIiA9ICRTUUxVc2VyOyAiSVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiSVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7IAogICAgICAgICJSU1NWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJSU1NWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZH0gKyAkRXh0cmFPcHRpb25zKQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gUmVtb3ZlLVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQKCiAgICAuREVTQ1JJUFRJT04KICAgIFVuaW5zdGFsbHMgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbnN0YWxsZWQgd2l0aCBOZXctU1FMU2VydmVyIGNtZGxldCBpbiB1bmF0dGVuZGVkIG1vZGUKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIHJlbW92ZWQgYmVzaWRlcyAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJVbmluc3RhbGwKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlEiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIikgKyAkRXh0cmFGZWF0dXJlc30pCgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSIKICAgIH0KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgp9CgpmdW5jdGlvbiBJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLiBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sIAogICAgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIi4gTm90ZSB0aGF0IHByaW9yIHRvCiAgICBTUUwgU2VydmVyIHZlcnNpb24gMjAxMiBTZXJ2aWNlIFBhY2sgMSBDdW11bGF0aXZlIFVwZGF0ZSAyIChKYW51YXJ5IDIwMTMpIG9ubHkgIlJlcGxpY2F0aW9uIiwgCiAgICAiRnVsbFRleHQiIGFuZCAiUlMiIG1heSBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gIlNRTEVuZ2luZSIuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yCiAgICBkZXRpYWxzOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU2V0dXBSb290LAogICAgICAgIFthcnJheV0kRXh0cmFGZWF0dXJlcyA9IEAoKQogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICBSZXNvbHZlLVNRTFNlcnZlclByZXJlcXVpc2l0ZXMKCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZQogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUVMiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiKSArICRFeHRyYUZlYXR1cmVzIH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb21wbGV0ZS1TUUxTZXJ2ZXJBZnRlclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgcHJldmlvdXNseSBwcmVwYXJlZCB3aXRoICJJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAiIE1TIFNRTCBTZXJ2ZXIgYWZ0ZXIgdGhlIHN5c3RlbSB3YXMgcmVhcm1lZC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIAogICAgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdAogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsfSkKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxTdHJpbmcgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3RlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3Rlcy4gVGhlIHN0cmluZyBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVycy4KICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNzk4OTkuYXNweAoKICAgIC5QQVJBTUVURVIgUwogICAgU3RyaW5nIHRvIGNvbnZlcnQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlLCBWYWx1ZUZyb21QaXBlbGluZSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTCiAgICApCiAgICAKICAgIHJldHVybiAiJyQoJFMgLXJlcGxhY2UgIiciLCAiJyciKSciCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxOYW1lIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc1ODc0LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgcmV0dXJuICJbJCgkUyAtcmVwbGFjZSAiXSIsICJdXSIpXSIKfQoKZnVuY3Rpb24gSW52b2tlLVNRTFRleHQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dC4gUmV0dXJucyByYXcgU1FMIHNlcnZlciBvdXRwdXQuCgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQoKICAgICNXcml0ZS1XYXJuaW5nICIkU1FMYG4iCiAgICAjcmV0dXJuCgogICAgJEJpbmFyeSA9IEdldC1Db21tYW5kICJzcWxjbWQuZXhlIgoKICAgICR0ZW1wRmlsZSA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICR0ZW1wRmlsZSA9IEdldC1JdGVtICR0ZW1wRmlsZQogICAgU2V0LUNvbnRlbnQgLVBhdGggJHRlbXBGaWxlIC1WYWx1ZSAkU1FMCgogICAgJENvbW1hbmRMaW5lID0gQCgnLWgnLCAnLTEnLCAnLWInLCAnLWknLCAiYCIkKCR0ZW1wRmlsZS5GdWxsTmFtZSlgIiIpCiAgICBpZiAoKCRVc2VyIC1uZSAkbnVsbCkgLWFuZCAoJFVzZXIgLW5lICcnKSkgewogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctVScKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkVXNlcgogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctUCcKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkUGFzc3dvcmQKICAgIH0KCiAgICBXcml0ZS1EZWJ1ZyAiRXhlY3V0aW5nOiBgbiRTUUxgbiIKICAgIFtzdHJpbmddJG91dHB1dCA9ICYkQmluYXJ5ICRDb21tYW5kTGluZQoKICAgICRFeGl0Q29kZSA9ICRMYXN0RXhpdENvZGUKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICBXcml0ZS1XYXJuaW5nICRvdXRwdXQKICAgICAgICB0aHJvdyAiU1FMQ01ELkVYRSByZXR1cm5lZCB3aXRoIGV4aXQgY29kZSAkRXhpdENvZGUgd2hpbGUgcnVubmluZyAkQmluYXJ5ICRDb21tYW5kTGluZSIKICAgIH0KICAgCiAgICBSZW1vdmUtSXRlbSAkdGVtcEZpbGUKCiAgICByZXR1cm4gJG91dHB1dAp9CgpmdW5jdGlvbiBOZXctU1FMVXNlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQp9CgpmdW5jdGlvbiBOZXctUGFzc3dvcmQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyByYW5kb20gcGFzc3dvcmQgb2YgdGhlIHNwZWNpZmllZCBsZW5ndGgKCiAgICAuREVTQ1JJUFRJT04KICAgIFBhc3N3b3JkIGNvbnRhaW5zIHJhbmRvbSBjaGFyYWN0ZXJzIGEteiwgQS1aLCBudW1iZXJzIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMuCiAgICBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbGwgdGhlIHR5cGVzIG9mIHN5bWJvbHMgd2lsbCBiZSBwcmVzZW50IGluIHRoZSBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIExlbmd0aAogICAgRGVzaXJlZCBsZW5ndGggb2YgdGhlIHBhc3N3b3JkLgoKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRMZW5ndGg9NgogICAgKQoKICAgICRSZXN1bHQgPSAiIgogICAgJGFscGhhID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5IUAjJCVeJiooKSdgImBgXytbXVx7fXw7OiwuLzw+P34iCiAgICB3aGlsZSAoJExlbmd0aCAtZ3QgMCkgewogICAgICAgICR4ID0gR2V0LVJhbmRvbSAkYWxwaGEuTGVuZ3RoCiAgICAgICAgJGMgPSAkYWxwaGFbJHhdCiAgICAgICAgJFJlc3VsdCA9ICIkUmVzdWx0JGMiCiAgICAgICAgJExlbmd0aCA9ICRMZW5ndGggLSAxCiAgICB9CiAgICByZXR1cm4gJFJlc3VsdAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5ERVNDUklQVElPTgogICAgTWFzdGVyIGtleSBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeS4gSG9zdCBjZXJ0aWZpY2F0ZSBpcyBjcmVhdGVkIHdoZW4gbmVjZXNzYXJ5IGVpdGhlciAobm9ybWFsbHkgb24gZmlyc3QgZW5kcG9pbnQgY3JlYXRpb24pLgoKICAgIEVuZHBvaW50IGFuZCBjZXJ0aWZpY2F0ZSBhcmUgcmVjcmVhdGVkIGluIGNhc2UgaWYgbWFzdGVyIGtleSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3Qgbm9ybWFsbHkgaGFwcGVuKS4KCiAgICBFbmRwb2ludCBpcyByZWNyZWF0ZWQgaW4gY2FzZSBpZiBjZXJ0aWZpY2F0ZSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyB0aGUgZW5kcG9pbnQgd2FzIGNyZWF0ZWQgbWFudWFsbHkpLgoKICAgIE1pcnJvcmluZyBlbmRwb2ludCBpcyBjcmVhdGVkIHVubGVzcyBvbmUgYWxyZWFkeSBleGlzdHMuIFRoZSBlbmRwb2ludCBpcyBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBXaGVuIHRoZSBlbmRwb2ludAogICAgYWxyZWFkeSBleGlzdHMgaXMgaXMgdW5jaGFuZ2VkLgoKICAgIEVuZHBvaW50IHBvcnQgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseSBhcyA0MDIyIG9yIGFzIGZpcnN0IGF2YWlsYWJsZSBwb3J0IGFmdGVyIDQwMjIgaW4gY2FzZSBpZiA0MDIyIGlzIGFscmVhZHkgbGlzdGVuaW5nLgogICAgSWYgdGhlcmUgaXMgbm8gZmlyZXdhbGwgcnVsZSB3aXRoIG5hbWUgJ0RhdGFiYXNlTWlycm9yaW5nLVRDUC17cG9ydG51bWJlcn0nLCBhbGxvd2luZyBydWxlIGlzIGNyZWF0ZWQuCgogICAgQ2VydGlmaWNhdGUgaXMgc3RvcmVkIGluIHRoZSBzcGVjaWZpZWQgZmlsZS4KCiAgICBSZXR1cm5zIGVuZHBvaW50IGxpc3RlbmluZyBwb3J0LgoKICAgIC5QQVJBTUVURVIgRW5jcnlwdGlvblBhc3N3b3JkCiAgICBFbmNyeXB0aW9uIHBhc3N3b3JkIHVzZWQgdG8gY3JlYXRlIGNlcnRpZmljYXRlLgoKICAgIC5QQVJBTUVURVIgQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgQ2VydGlmaWNhdGUgdGFyZ2V0IGZpbGUgbmFtZS4gRmlsZSBNVVNUIE5PVCBleGlzdC4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRDZXJ0aWZpY2F0ZUZpbGVOYW1lCiAgICApCgogICAgJEVuZHBvaW50TmFtZSA9ICdNaXJyb3JpbmdFbmRwb2ludCcKCiAgICAkRm9sZGVyID0gR2V0LUl0ZW0gJFdvcmtEaXIKCiAgICAkSCA9ICRFbnY6Q09NUFVURVJOQU1FIC1yZXBsYWNlICdbXkEtWmEtejAtOV9dJywgJ18nCgogICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0IDQwMjIKCiAgICAkQ3JlYXRlTWFzdGVyS2V5ID0gIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5bW1ldHJpY19rZXlzIHdoZXJlIG5hbWUgPSAnIyNNU19EYXRhYmFzZU1hc3RlcktleSMjJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBNQVNURVIgS0VZIEVOQ1JZUFRJT04gQlkgUEFTU1dPUkQgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJEVuY3J5cHRpb25QYXNzd29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X2NlcnQgV0lUSCBTVUJKRUNUID0gJyR7SH0gZW5kcG9pbnQgY2VydGlmaWNhdGUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIEJBQ0tVUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQgVE8gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJENlcnRpZmljYXRlRmlsZU5hbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBwb3J0IGludAogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoU0VMRUNUICogRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSBwb3J0IEZST00gc3lzLnRjcF9lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIEVORCBFTFNFCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgRU5EUE9JTlQgJChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFID0gU1RBUlRFRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTIFRDUCAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJU1RFTkVSX1BPUlQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIExJU1RFTkVSX0lQID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0VfTUlSUk9SSU5HICggCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhFTlRJQ0FUSU9OID0gQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgRU5DUllQVElPTiA9IFJFUVVJUkVEIEFMR09SSVRITSBBRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBST0xFID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAncG9ydDooJyArIENPTlZFUlQoVkFSQ0hBUiwgYEBwb3J0KSArICcpJyBhcyBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRDcmVhdGVNYXN0ZXJLZXkKICAgIFtpbnRdJFBvcnQgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipwb3J0OlwoKFteKV0qKVwpLionLCAnJDEnCgogICAgIyBPcGVuIHBvcnQgaW4gV2luZG93cyBGaXJld2FsbAoKICAgICRQb3J0T3BlbiA9ICRmYWxzZQogICAgJFJ1bGVOYW1lID0gIkRhdGFiYXNlTWlycm9yaW5nLVRDUC0kUG9ydCIKICAgIEdldC1OZXRGaXJld2FsbFJ1bGUgfCBGb3JlYWNoLU9iamVjdCB7CiAgICAgICAgaWYgKCRfLk5hbWUgLWVxICRSdWxlTmFtZSkgewogICAgICAgICAgICAkUG9ydE9wZW4gPSAkdHJ1ZQogICAgICAgIH0KICAgIH0KICAgIGlmICgtbm90ICRQb3J0T3BlbikgewogICAgICAgICREaXNwbGF5TmFtZSA9ICJNUyBTUUwgRGF0YWJhc2UgTWlycm9yaW5nIEVuZHBvaW50IGF0IFRDUCBwb3J0ICRQb3J0IgogICAgICAgIE5ldy1OZXRGaXJld2FsbFJ1bGUgLU5hbWUgJFJ1bGVOYW1lIC1EaXNwbGF5TmFtZSAkRGlzcGxheU5hbWUgLURlc2NyaXB0aW9uICREaXNwbGF5TmFtZSAtUHJvdG9jb2wgVENQIC1Mb2NhbFBvcnQgJFBvcnQgLUVuYWJsZWQgVHJ1ZSAtUHJvZmlsZSBBbnkgLUFjdGlvbiBBbGxvdwogICAgfQogICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIENvbXBsZXRlLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBtaXJyb3JpbmcgZW5kcG9pbnQKCiAgICAuREVTQ1JJUFRJT04KICAgIEFsbG93cyBpbmJvdW5kIGNvbm5lY3Rpb25zIGZyb20gcmVtb3RlIGhvc3QKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TG9naW4sCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFVzZXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFBhc3N3b3JkCiAgICApCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRSZW1vdGVXb3JrRGlyCiAgICAkUmVtb3RlV29ya0RpciA9ICRGb2xkZXIuRnVsbE5hbWUKCiAgICAkSCA9ICRSZW1vdGVIb3N0TmFtZSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgIGlmICgtbm90ICRSZW1vdGVIb3N0TG9naW4pIHsKICAgICAgICAkUmVtb3RlSG9zdExvZ2luID0gIiR7SH1fbG9naW4iCiAgICB9CiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdFVzZXIpIHsKICAgICAgICAkUmVtb3RlSG9zdFVzZXIgPSAiJHtIfV91c2VyIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RQYXNzd29yZCkgewogICAgICAgICRSZW1vdGVIb3N0UGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKICAgIH0KCiAgICAkU1FMID0gICAgICAgICAgICAgIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnNxbF9sb2dpbnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RMb2dpbikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSBXSVRIIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0UGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuc3lzdXNlcnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RVc2VyKSkKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBVU0VSICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RVc2VyKSBGT1IgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWU9JyR7SH1fcmVtb3RlX2NlcnQnKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIENFUlRJRklDQVRFICR7SH1fcmVtb3RlX2NlcnQgQVVUSE9SSVpBVElPTiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRlJPTSBGSUxFID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAnbmFtZTooJyArIGBAbmFtZSArICcpJyBhcyBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICIKCiAgICAkcmF3ZGF0YSA9IEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTAogICAgJEVuZHBvaW50TmFtZSA9ICRyYXdkYXRhIC1yZXBsYWNlICcuKm5hbWU6XCgoW14pXSopXCkuKicsICckMScKICAgICRTUUwgPSAgICAgICAgICAgICAiR1JBTlQgQ09OTkVDVCBPTiBFTkRQT0lOVDo6JChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKSBUTyAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0TG9naW4pIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTCkKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMTWlycm9yIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBjcmVhdGlvbiBvZiBtaXJyb3JlZCBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSBmaXJzdCBleGVjdXRlZCBvbiBtaXJyb3Igc2VydmVyIGFuZCB0aGVuIG9uIHByaW5jaXBhbCBzZXJ2ZXIuCiAgICBPdGhlcndpc2UgaXQgd2lsbCBmYWlsIChob3dldmVyIGl0IG1heSBiZSBleGVjdXRlZCBhZ2FpbiB3aXRoIG5vIGhhcm0pLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbSW50XSRSZW1vdGVQb3J0LAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgICRVcmwgPSAiVENQOi8vJHtSZW1vdGVIb3N0TmFtZX06JHtSZW1vdGVQb3J0fSIKICAgICRBbHRlckRiID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIFBBUlRORVIgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJFVybCk7CiAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRiKQp9CgpmdW5jdGlvbiBOZXctU1FMRGF0YWJhc2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBlbXB0eSBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlIHdpdGggZGVmYXVsdCBzZXR0aW5ncy4gRmFpbHMgaW4gY2FzZSBpcyB0aGUgZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIERhdGFiYXNlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBtZGZGaWxlCiAgICBOYW1lIG9mIHRoZSBNREYgKGRhdGEpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX0ubWRmIgogICAgV2hlcmUge0RhdGFCYXNlUGF0aE5hbWV9IGlzIGRhdGFiYXNlIG5hbWUgd2l0aCBhbGwgYnV0IEEtWiwgYS16LCAwLTkgY2hhcmFjdGVycwogICAgcmVwbGFjZWQgYnkgdW5kZXJzY29yZS4KCiAgICAuUEFSQU1FVEVSIERhdGFCYXNlTmFtZQogICAgTmFtZSBvZiB0aGUgTERGICh0cmFuc2FjdGlvbiBsb2cpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZSwKICAgICAgICBbU3RyaW5nXSRtZGZGaWxlPSRudWxsLAogICAgICAgIFtTdHJpbmddJGxkZkZpbGU9JG51bGwKICAgICkKCiAgICAkRGF0YUJhc2VQYXRoTmFtZSA9ICREYXRhQmFzZU5hbWUgLXJlcGxhY2UgJ1teMC05YS16QS1aXScsICdfJwogICAgaWYgKC1ub3QgJG1kZkZpbGUpIHsKICAgICAgICAkbWRmRmlsZSA9ICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVwke0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIH0KICAgIGlmICgtbm90ICRsZGZGaWxlKSB7CiAgICAgICAgJGxkZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfV9sb2cubGRmIgogICAgfQoKICAgICROZXdEYXRhYmFzZSA9ICIKICAgICAgICBDUkVBVEUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgICAgICAgICAgQ09OVEFJTk1FTlQgPSBOT05FCiAgICAgICAgICAgICAgICBPTiAgUFJJTUFSWSAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkRGF0YUJhc2VOYW1lKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRtZGZGaWxlKSAsIFNJWkUgPSA0MDk2S0IgLCBGSUxFR1JPV1RIID0gMTAyNEtCICkKICAgICAgICAgICAgICAgIExPRyBPTiAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJHtEYXRhQmFzZU5hbWV9X2xvZyIpLCBGSUxFTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJGxkZkZpbGUpICwgU0laRSA9IDEwMjRLQiAsIEZJTEVHUk9XVEggPSAxMCUpCiAgICAgICAgR08KICAgICAgICBVU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgIEdPCiAgICAgICAgSUYgTk9UIEVYSVNUUyAoU0VMRUNUIG5hbWUgRlJPTSBzeXMuZmlsZWdyb3VwcyBXSEVSRSBpc19kZWZhdWx0PTEgQU5EIG5hbWUgPSBOJ1BSSU1BUlknKSBBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIE1PRElGWSBGSUxFR1JPVVAgW1BSSU1BUlldIERFRkFVTFQKICAgICAgICBHTyIKCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkTmV3RGF0YWJhc2UpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCAodGhpcyBpcyBhYnNvbHV0ZWx5IHN5bW1ldHJpYyBzdGVwIHRvIHRoZSBtaXJyb3IgaW5pdCkuIEluIGFkZGl0aW9uIHRvIHRoYXQgaXQgY3JlYXRlcwogICAgYSBkYXRhYmFzZSBhbmQgc3RvcmVzIGJhY2t1cHMgb2YgaXQgYW5kIGl0cyB0cmFuc2FjdGlvbiBsb2cgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBlbmRwb2ludCBjZXJ0aWZpY2F0ZS4KCiAgICBBIGZpcmV3YWxsIHJ1bGUgaXMgY3JlYXRlZCBmb3IgZW5kcG9pbnQgaWYgbmVjZXNzYXJ5LgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBtaXJyb3Igc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIGJlIHVzZSBhdCBtaXJyb3Igc2VydmVyIGVpdGhlci4KICAgIAogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQogICAgaWYgKChHZXQtQ2hpbGRJdGVtIC1QYXRoICRXb3JrRGlyKS5MZW5ndGggLWd0IDApIHsKICAgICAgICB0aHJvdyAiV29ya2luZyBkaXJlY3RvcnkgJFdvcmtEaXIgaXMgbm90IGVtcHR5IgogICAgfQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCiAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQoKICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsIE5BTUUgPSBOJ0Z1bGwgRGF0YWJhc2UgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAkQmFja3VwTG9nID0gIkJBQ0tVUCBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlX2xvZy5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCAgTkFNRSA9IE4nVHJhbnNhY3Rpb24gTG9nICBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAobWlycm9yKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIG1pcnJvciBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpcgogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAzKQoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIG1pcnJvciBjcmVhdGlvbi4gVGhpcyBzdGVwIG11c3QgYmUgZ2xvYmFsbHkgdGhlIGxhc3Qgb25lIGluIG1pcnJvciBjcmVhdGlvbiBzZXF1ZW5jZS4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZSBhbmQgbmFtZSBwcm92aWRlZCBvbiBzdGVwIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UxKQoKICAgIC5ERVNDUklQVElPTgogICAgSW5pdGlhbGl6ZXMgbWlycm9yaW5nIGVuZHBvaW50IGZvciBtaXJyb3Igc2VydmVyLiBTdG9yZXMgbWlycm9yaW5nIGVuZHBvaW50IGNlcnRpZmljYXRlIGluIFdvcmtkaXIuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5kIGRpcmVjdG9yeS4gVGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRyYW5mZXJyZWQgdG8gdGhlIHByaW5jaXBhbCBzZXJ2ZXIgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMikKCiAgICAuREVTQ1JJUFRJT04KICAgIEltcG9ydHMgcmVtb3RlIHNlcnZlciBjZXJ0aWZpY2F0ZSBhbmQgZ3JhbnRzIGl0IHdpdGggYWNjZXNzIHRvIHRoZSBtaXJyb3JpbmcgZW5kcG9pbnQuCiAgICBSZXN0b3JlcyBkYXRhYmFzZSBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBhbmQgbGVhdmVzIGl0IGluICdSZXN0b3JpbmcnIHN0YXRlLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKCiAgICAkUmVzdG9yZURiID0gIlJFU1RPUkUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2UuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRSZW1vdGVXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGV4ZWN1dGVkIHN0cmljdGx5IGJlZm9yZSBzeW1tZXRyaWMgc3RlcCBvbiB0aGUgcHJpbmNpcGFsLgoKICAgIE5vdGUgdGhhdCB0aGUgcmVtb3RlIGhvc3QgY2VydGlmaWNhdGUgaXMgdmFsaWQgZnJvbSB0aGUgdGltZSBpdCBpcyBjcmVhdGVkIHRoZXJlLiBTbwogICAgdGhpcyBzdGVwIHdpbGwgZmFpbCBpZiB0aGVyZSBpcyBub3RpY2FibGUgZGlmZmVyZW50IGluIHRpbWUgbG9jYWwgYW5kIHJlbW90ZSBtYWNoaW5lcy4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbaW50XSRwb3J0ID0gR2V0LUNvbnRlbnQgIiR7UmVtb3RlV29ya0Rpcn1cZW5kcG9pbnQtcG9ydC50eHQiCiAgICBDb21wbGV0ZS1TUUxNaXJyb3IgJFJlbW90ZUhvc3ROYW1lICRwb3J0ICREYXRhYmFzZU5hbWUKfQoKZnVuY3Rpb24gR2V0LU5leHRGcmVlUG9ydCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBSZXR1cm5zIHNwZWNpZmllZCBkZXNpcmVkIHBvcnQgb3IgY2xvc2VzdCBuZXh0IG9uZSB1bm9jY3VwaWVkLgoKICAgIC5QQVJBTUVURVIgUG9ydAogICAgRGVzaXJlZCBwb3J0IG51bWJlci4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtpbnRdJFBvcnQKICAgICkKICAgICRPcGVuUG9ydHMgPSBuZXRzdGF0IC1hb24gfCBzZWxlY3Qtc3RyaW5nICdMSVNURU5JTkcnIHwgRm9yZWFjaC1PYmplY3QgeyAoKCRfIC1yZXBsYWNlICdeXHMqJywgJycgLXNwbGl0ICdccysnKVsxXSAtc3BsaXQgJy4qOicpWzFdIH0gfCBTb3J0LU9iamVjdCB8IEdldC1VbmlxdWUKICAgIHdoaWxlICgkT3BlblBvcnRzLkNvbnRhaW5zKCR7UG9ydH0pKSB7CiAgICAgICAgJFBvcnQgPSAkUG9ydCArIDEKICAgIH0KICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluaXRpYWxpemVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlciBhbmQgY3JlYXRlcyBBbHdheXNPbiBlbmRwb2ludCBsaXN0ZW5lci4gUmV0dXJucyBBbHdheXNPbiBlbmRwb2ludCBwb3J0IG51bWJlci4KCiAgICAuREVTQ1JJUFRJT04KICAgIEVuYWJsZXMgQWx3YXlzT24gY2x1c3RlcmluZyBvbiBsb2NhbCBTUUwgc2VydmVyLiBDcmVhdGVzIEFsd2F5c09uIFRDUCBlbmRwb2ludCBvbiBwb3J0IDUwMjIgb3IgZ3JlYXRlciBpZiB0aGUgb25lIGlzIG9jY3VwaWVkLiAgIAogICAgIz4KCiAgICBpZiAoIShUZXN0LVBhdGggU1FMU0VSVkVSOlwpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBzcWxwcwogICAgfQogICAgJE1hY2hpbmVOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUwpWzBdLlBTQ2hpbGROYW1lCiAgICAkSW5zdGFuY2VOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lKS5QU0NoaWxkTmFtZQogICAgJEFsd2F5c09uRW5hYmxlZCA9ICgoR2V0LUl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lXCRJbnN0YW5jZU5hbWUpIHwgc2VsZWN0IElzSGFkckVuYWJsZWQpLklzSGFkckVuYWJsZWQKICAgIGlmICgtbm90ICRBbHdheXNPbkVuYWJsZWQpIHsKICAgICAgICBFbmFibGUtU3FsQWx3YXlzT24gLVBhdGggIlNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lIiAtRm9yY2UKICAgIH0KICAgICRJbnN0YW5jZSA9IEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICAkZW5kcG9pbnQgPSAkSW5zdGFuY2UuRW5kcG9pbnRzWyJBbHdheXNPbkVuZHBvaW50Il0KICAgIGlmICgtbm90ICRlbmRwb2ludCkgewogICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA1MDIyCiAgICAgICAgJGVuZHBvaW50ID0gTmV3LVNxbEhhZHJFbmRwb2ludCBBbHdheXNPbkVuZHBvaW50IC1Qb3J0ICRQb3J0IC1QYXRoIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICB9IGVsc2UgewogICAgICAgICRQb3J0ID0gJGVuZHBvaW50LlByb3RvY29sLlRjcC5MaXN0ZW5lclBvcnQKICAgIH0gCiAgICBpZiAoJGVuZHBvaW50LkVuZHBvaW50U3RhdGUgLW5lICJTdGFydGVkIikgewogICAgICAgICRlbmRwb2ludC5TdGFydCgpCiAgICB9ICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbmV3IEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBvbiBwcmltYXJ5IHJlcGxpY2EuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSByZXBsaWNhIHNlcnZlcihzKSBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgQXZhaWxhYmlsaXR5IGdyb3VwIG5hbWUuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWVzCiAgICBSZXBsaWNhIGRhdGFiYXNlKHMpIG5hbWVzLgoKICAgIC5QQVJBTUVURVIgUmVwbGljYURlZnMKICAgIEFycmF5IG9mIHJlcGxpY2EgZGVmaW5pdGlvbi4gRWFjaCBkZWZpbml0aW9uIGlzIGEgaGFzaCB0YWJsZSB3aXRoIHJlcGxpY2Etc3BlY2lmaWMgdmFsdWVzLgogICAgCiAgICBNYW5kYXRvcnkgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW1N0cmluZ10gU0VSVkVSX0lOU1RBTkNFICAgLSBSZXBsaWNhIHNlcnZlciBpbnN0YW5jZSBuYW1lCiAgICAgICAgKiBbU3RyaW5nXSBFTkRQT0lOVF9VUkwgICAgICAtIFJlcGxpY2Egc2VydmVyIGVuZHBvaW50IFVSTC4gTm9ybWFsbHkgaXQgaXMgVENQOi8vZnVsbHkucXVhbGlmaWVkLmRvbWFpbi5uYW1lOjUwMjIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQgbnVtYmVyIHNob3VsZCBiZSBvYnRhaW5lZCB3aXRoIEluaXRpYWxpemUtQWx3YXlzT24gYXQgdGhlIHJlcGxpY2Egc2VydmVyCiAgICAgICAgKiBbU3RyaW5nXSBBVkFJTEFCSUxJVFlfTU9ERSAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiU1lOQ0hST05PVVNfQ09NTUlUIiBvciAiQVNZTkNIUk9OT1VTX0NPTU1JVCIgb25seS4KICAgICAgICAqIFtTdHJpbmddIEZBSUxPVkVSX01PREUgICAgIC0gUmVwbGljYSBhdmFpbGFiaWxpdHkgbW9kZS4gQ2FuIGJlICJNQU5VQUwiIG9yICJBVVRPTUFUSUMiIG9ubHkuCgogICAgT3B0aW9uYWwgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW0ludGVnZXJdIEJBQ0tVUF9QUklPUklUWSAgICAgICAgICAtIEJhY2t1cCBwcmlvcml0eQogICAgICAgICogW0ludGVnZXJdIFNFU1NJT05fVElNRU9VVCAgICAgICAgICAtIFNlc3Npb24gdGltZW91dAogICAgICAgICogW1N0cmluZ10gIFBfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlByaW1hcnkiIHJlcGxpY2EgbW9kZS4gQ2FuIGJlICJSRUFEX1dSSVRFIiBvciAiQUxMIiBvbmx5LgogICAgICAgICogW0FycmF5XSAgIFBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCAtIExpc3Qgb2YgcmVwbGljYXMgcHJvdmlyaW5nIHJlYWRvbmx5IGFjY2VzcyB3aGVuIHRoaXMgb25lIGlzIHByaW1hcnkuCiAgICAgICAgKiBbU3RyaW5nXSAgU19BTExPV19DT05ORUNUSU9OUyAgICAgIC0gQWxsb3dlZCBjb25uZWN0aW9uIHR5cGVzIGZvciAiU2Vjb25kYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSBvbmUgb2YgIk5PIiwgIlJFQURfT05MWSIsICJBTEwiLgogICAgICAgICogW1N0cmluZ10gIFNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMICAtIFJlcGxpY2EgcmVhZC1vbmx5IHJlcXVlc3RzIGxpc3RlbmVyIFVSTC4gTm9ybWFsbHkgZGVmYXVsdCBzZXJ2ZXIgbGlzdGVuZXIgYXQgcG9ydCAxNDMzIGlzIHVzZWQuCgogICAgLlBBUkFNRVRFUiBQcmVmZXJlbmNlcwogICAgSGFzaCB0YWJsZSBvZiBnZW5lcmFsIGF2YWlsYWJpbGl0eSBncm91cCBwcmVmZXJlbmNlcy4gQWxsIHRoZSBrZXlzIGFyZSBvcHRpb25hbC4gU3VwcG9ydGVkIGVudHJ5IGtleXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddICBBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UgLSBBdXRvbWF0ZWQgYmFja3VwIHByZWZlcmVuY2UuIENhbiBiZSAiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiIG9yICJOT05FIi4KICAgICAgICAqIFtTdHJpbmddICBGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCAgICAgLSBGYWlsdXJlIGNvbmRpdGlvbiBsZXZlbC4gQ2FuIGJlICIxIiwgIjIiLCAiMyIsICI0IiBvciAiNSIuCiAgICAgICAgKiBbSW50ZWdlcl0gSEVBTFRIX0NIRUNLX1RJTUVPVVQgICAgICAgIC0gUmVwbGljYSBoZWFsdGggY2hlY2sgdGltZW91dC4KCiAgICAuUEFSQU1FVEVSIExpc3RlbmVyRGVmCiAgICBIYXNoIHRhYmxlIGNvbnRhaW5pbmcgYXZhaWxhYmlsaXR5IGdyb3VwIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24uCgogICAgTWFuZGF0b3J5IGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKCiAgICAgICAgW1N0cmluZ10gTkFNRSAtIExpc3RlbmVyIG5hbWUuCgogICAgT3B0aW9uYWwgbGlzdGVuZXIgY29uZmlndXJhdGlvbiB2YWx1ZXMgYXJlOgogICAgCiAgICAgICAgW1N0cmluZ10gUE9SVCAtIExpc3RlbmVyIHBvcnQgbnVtYmVyLiBJbnRlZ2VyIHZhbHVlIG1heSBiZSBzdWZmaXhlZCBieSBhICIrIiBzeW1vbCAoc3VjaCBhcyAiNTAyMisiKSB3aGljaCBhbGxvd3MgdGhlIHJvdXRpbmUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IG5leHQgZnJlZSBwb3J0IHdpdGggbnVtYmVyIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgICBbU3RyaW5nXSBESENQIC0gREhDUCBsaXN0ZW5lciBhZGRyZXNzIGNvbmZpZ3VyYXRpb24gZmxhZy4gV2hlbiBhbnkgdmFsdWUgc3BlY2lmaWVkLCBESENQIGlzIHVzZWQgdG8gY29uZmlndXJlIGxpc3RlbmVyCiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGlzIGFsc28gdGhlIGRlZmF1bHQgYmVoYXZpb3IpLiBBbHNvLCBhIHNwZWNpZmljIGludGVyZmFjZSBmb3IgREhDUCBtYXkgYmUgc3BlY2lmaWVkIGFzIElQX0FERFJFU1MvTUFTSwogICAgICAgICAgICAgICAgICAgICAgICAobGlrZSAiMTkyLjE2OC4xLjAvMjU1LjI1NS4yNTUuMCIpIGFzIGEgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KICAgICAgICBbQXJyYXldIFNUQVRJQyAtIFN0YXRpYyBJUCBhZGRyZXNzZXMgdG8gbGlzdGVuLiBJUCBhZGRyZXNzZXMgbWF5IGJlIElQdjQgYWRkcmVzc2VzIGluIHRoZSAiSVBfQUREUkVTUy9NQVNLIiBmb3JtIG9yIElQdjYKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VzIGluIHN0YW5kYXJkIElQdjYgbm90YXRpb24uCgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9mZjg3ODM5OS5hc3B4IHBhZ2UgZm9yIG1vcmUgZGV0YWlscyByZWdhcmRpbmcgYWxsIHRoZSBzdXBwb3J0ZWQgb3B0aW9ucy4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtBcnJheV0kRGF0YWJhc2VOYW1lcywKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJFJlcGxpY2FEZWZzLAogICAgICAgIFtwYXJhbWV0ZXJdCiAgICAgICAgW0hhc2h0YWJsZV0kUHJlZmVyZW5jZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0hhc2h0YWJsZV0kTGlzdGVuZXJEZWYKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkUXVvdGVkREJOYW1lcyA9ICgkRGF0YWJhc2VOYW1lcyB8IEZvckVhY2gtT2JqZWN0IHsgQ29udmVydFRvLVNRTE5hbWUgJF8gfSkgLWpvaW4gIiwgIgoKICAgIGlmICgkUHJlZmVyZW5jZXMgLWVxICRudWxsKSB7CiAgICAgICAgJFByZWZlcmVuY2VzID0gQCgpCiAgICB9CiAgICAkUHJlZnMgPSBAKCkKICAgIGZvcmVhY2goJFByZWYgaW4gJFByZWZlcmVuY2VzKSB7CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgJG51bGwpIHsKICAgICAgICAgICAgQ29udGludWUKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgIkFVVE9NQVRFRF9CQUNLVVBfUFJFRkVSRU5DRSIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCJQUklNQVJZIiwgIlNFQ09OREFSWV9PTkxZIiwgIlNFQ09OREFSWSIsICJOT05FIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAkUHJlZi5LZXkpCiAgICAgICAgfSBlbHNlaWYgKCRQcmVmLktleSAtZXEgIkZBSUxVUkVfQ09ORElUSU9OX0xFVkVMIikgewogICAgICAgICAgICAkUHJlZnMgPSAkUHJlZnMgKyAoVmFsaWRhdGUtT3B0aW9uICRQcmVmLktleSwgJFByZWYuVmFsdWUsIEAoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJIRUFMVEhfQ0hFQ0tfVElNRU9VVCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLUludE9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93ICJVbmV4cGVjdGVkIHBlZmVyZW5jZXMgb3B0aW9uOiAnJCgkUHJlZi5LZXkpJyIKICAgICAgICB9CiAgICB9CgogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICRSZXBsaWNhRGVmcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkUkRlZiA9ICRSZXBsaWNhRGVmc1skaV0KICAgICAgICBpZiAoJFJEZWYuR2V0VHlwZSgpLk5hbWUgLW5lICJIYXNodGFibGUiKSB7CiAgICAgICAgICAgIHRocm93ICJBbGwgZWxlbWVudHMgb2YgUmVwbGljYURlZnMgYXJyYXkgc2hvdWxkIGJlIEhhc2h0YWJsZXMiCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYU9wdHMgPSBAKCkKCiAgICAgICAgIyBNYW5kYXRvcnkgb3B0aW9ucwogICAgICAgICRSZXBsaWNhTmFtZSA9IFZhbGlkYXRlLURlZmluZWRPcHRpb24gIlNFUlZFUl9JTlNUQU5DRSIgJFJEZWZbIlNFUlZFUl9JTlNUQU5DRSJdCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLURlZmluZWRPcHRpb24gIkVORFBPSU5UX1VSTCIgJFJEZWZbIkVORFBPSU5UX1VSTCJdIHwgQ29udmVydFRvLVNRTFN0cmluZyB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJFTkRQT0lOVF9VUkwiKQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1PcHRpb24gIkFWQUlMQUJJTElUWV9NT0RFIiAkUkRlZlsiQVZBSUxBQklMSVRZX01PREUiXSBAKCJTWU5DSFJPTk9VU19DT01NSVQiLCAiQVNZTkNIUk9OT1VTX0NPTU1JVCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFWQUlMQUJJTElUWV9NT0RFIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJGQUlMT1ZFUl9NT0RFIiAkUkRlZlsiRkFJTE9WRVJfTU9ERSJdIEAoIkFVVE9NQVRJQyIsICJNQU5VQUwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJGQUlMT1ZFUl9NT0RFIikKCiAgICAgICAgIyBPcHRpb25hbCBvcHRpb25zCiAgICAgICAgaWYgKCRSRGVmWyJCQUNLVVBfUFJJT1JJVFkiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiQkFDS1VQX1BSSU9SSVRZIiAkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQkFDS1VQX1BSSU9SSVRZIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJTRVNTSU9OX1RJTUVPVVQiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiU0VTU0lPTl9USU1FT1VUIiAkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiU0VTU0lPTl9USU1FT1VUIikKICAgICAgICB9CgogICAgICAgICRTZWNvbmRhcnlSb2xlID0gQCgpCiAgICAgICAgaWYgKCRSRGVmWyJTX0FMTE9XX0NPTk5FQ1RJT05TIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJTX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIEAoIk5PIiwgIlJFQURfT05MWSIsICJBTEwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBTExPV19DT05ORUNUSU9OUyIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFNlY29uZGFyeVJvbGUgPSAkU2Vjb25kYXJ5Um9sZSArICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFNlY29uZGFyeVJvbGUuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArICgiKCAkKCRTZWNvbmRhcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFQ09OREFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRQcmltYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJQX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIEAoIlJFQURfV1JJVEUiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoKCgkUkRlZlsiUF9SRUFEX09OTFlfUk9VVElOR19MSVNUIl0gfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxTdHJpbmcgJF8gfSkgLWpvaW4gJywgJykgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFByaW1hcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkUHJpbWFyeVJvbGUgLWpvaW4gJywgJykgKSIgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiUFJJTUFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSArCiAgICAgICAgICAgICMgIFRDUDovL2JyYXZvLm11cmFuby5sb2NhbDo1MDIyCiAgICAgICAgICAgICJOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZXBsaWNhTmFtZSkgV0lUSCAoJCgkUmVwbGljYU9wdHMgLWpvaW4gJywgJykpIgogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9ucyA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSAtam9pbiAiLGByYG4gICAgICAgICI7CgogICAgaWYgKCRMaXN0ZW5lckRlZlsiREhDUCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXS5tYXRjaGVzKCJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikpIHsKICAgICAgICAgICAgKCRJcEFkZHIsICRNYXNrKSA9ICRMaXN0ZW5lckRlZlsiREhDUCJdIC1zcGxpdCAiLyIKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIE9OICggJElwQWRkciwgJE1hc2sgKSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBbYXJyYXldJElQQWRkcmVzc2VzID0gJExpc3RlbmVyRGVmWyJTVEFUSUMiXQogICAgICAgIGlmICgoJElQQWRkcmVzc2VzIC1lcSAkbnVsbCkgLW9yICgkSVBBZGRyZXNzZXMuQ291bnQgLWVxIDApKSB7CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9IEAoKQogICAgICAgICAgICBmb3JlYWNoICgkSXBPcHRpb24gaW4gJElQQWRkcmVzc2VzKSB7CiAgICAgICAgICAgICAgICAjIElQdjQKICAgICAgICAgICAgICAgIGlmICgkSXBPcHRpb24gLW1hdGNoICJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikgewogICAgICAgICAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkSXBPcHRpb24gLXNwbGl0ICIvIgogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwQWRkciksICQoQ29udmVydFRvLVNRTFN0cmluZyAkTWFzaykgKSIKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBJUHY2CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXigoKD89KD8+Lio/OjopKD8hLio6OikpKSg6Oik/KFswLTlBLUZdezEsNH06Oj8pezAsNX18KFswLTlBLUZdezEsNH06KXs2fSkoXDIoWzAtOUEtRl17MSw0fSg6Oj98JCkpezAsMn18KCgyNVswLTVdfCgyWzAtNF18MVxkfFsxLTldKT9cZCkoXC58JCkpezR9fFswLTlBLUZdezEsNH06WzAtOUEtRl17MSw0fSkoPzwhW146XTp8XC4pXHoiKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSAkQ29udmVydGVkT3B0cyArICIoICQoQ29udmVydFRvLVNRTFN0cmluZyAkSXBPcHRpb24pICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93ICJNYWxmb3JtZWQgSVB2NC9JUHY2IGFkZHJlc3M6ICRJcE9wdGlvbiIKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIklQICggJCgkQ29udmVydGVkT3B0cyAtam9pbiAnLCAnKSApIgogICAgICAgIH0KICAgIH0KICAgIGlmICgoJExpc3RlbmVyRGVmWyJOQU1FIl0gLWVxICRudWxsKSAtb3IgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXlxzKiQiKSkgewogICAgICAgIHRocm93ICJMaXN0ZW5lciBuYW1lIGlzIHJlcXVpcmVkIgogICAgfQogICAgaWYgKC1ub3QgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXltBLVphLXowLTlcLl9cLV0rJCIpKSB7CiAgICAgICAgdGhyb3cgIklsbGVnYWwgbGlzdGVuZXIgbmFtZS4gSXQgY2FuIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgZGFzaGVzICgtKSwgYW5kIGh5cGhlbnMgKF8pLCBpbiBhbnkgb3JkZXIuIgogICAgfQogICAgJFBvcnQgPSAkbnVsbAogICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkK1wrIikgewogICAgICAgICAgICAkU3RhcnRpbmdQb3J0ID0gJExpc3RlbmVyRGVmWyJQT1JUIl0gLXJlcGxhY2UgIlwrIiwgIiIKICAgICAgICAgICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0ICRTdGFydGluZ1BvcnQKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJFBvcnQiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1tYXRjaCAiXGQrIikgewogICAgICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCBwb3J0IHZhbHVlOiAkKCRMaXN0ZW5lckRlZlsiUE9SVCJdKSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRMaXN0ZW5lciA9ICJMSVNURU5FUiAnJCgkTGlzdGVuZXJEZWZbIk5BTUUiXSknICggV0lUSCAkTGlzdGVuZXJBZGRyICkiCgogICAgJE5hbWUgfCBPdXQtRmlsZSAiJFdvcmtEaXJcYXZncm91cC5uYW1lIgogICAgCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICREYXRhYmFzZU5hbWVzLkxlbmd0aDsgJGkrKykgewogICAgICAgICREYXRhQmFzZU5hbWUgPSAkRGF0YWJhc2VOYW1lc1skaV0KICAgICAgICAkRGF0YUJhc2VOYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGRiJGkubmFtZSIKICAgICAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQogICAgICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAgICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJHtpfS5sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBpZiAoJFByZWZzLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICRQcmVmc0xpbmUgPSAiV0lUSCAoICQoJFByZWZzIC1qb2luICcsICcpICkiCiAgICB9IGVsc2UgewogICAgICAgICRQcmVmc0xpbmUgPSAiIgogICAgfQogICAgJFNRTCA9ICJDUkVBVEUgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJE5hbWUpICRQcmVmc0xpbmUKICAgICAgICAgICAgICAgIEZPUiBEQVRBQkFTRSAkUXVvdGVkREJOYW1lcwogICAgICAgICAgICAgICAgUkVQTElDQSBPTmByYG4gICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnMKICAgICAgICAgICAgICAgICRMaXN0ZW5lcjsKICAgICIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXBSZXBsaWNhIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIHNlY29uZGFyeSByZXBsaWNhCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYSBiYXNlZCBvbiBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byBhbmQgYnkgTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5nIGRpcmVjdG9yeSB3aGljaCB3YXMgdHJhbnNmZXJyZWQgZnJvbSB0aGUgcHJpbWFyeSByZXBsaWNhLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIKICAgICkKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIldvcmsgZGlyICckV29ya0Rpcicgbm90IGZvdW5kIgogICAgfQogICAgJFdvcmtEaXJPYmogPSBHZXQtSXRlbSAtUGF0aCAkV29ya0RpcgogICAgJFdvcmtEaXIgPSAkV29ya0Rpck9iai5GdWxsTmFtZQogICAgJEdyb3VwTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJhdmdyb3VwLm5hbWUiKS5GdWxsTmFtZQoKICAgICRKb2luR3JvdXAgPSAiQUxURVIgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJEdyb3VwTmFtZSkgSk9JTgogICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkSm9pbkdyb3VwKQoKICAgIGZvciAoJGkgPSAwOyA7ICRpKyspIHsKICAgICAgICAkRmlsZSA9ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKQogICAgICAgIGlmICgtbm90ICRGaWxlKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAkRGF0YUJhc2VOYW1lID0gR2V0LUNvbnRlbnQgJFdvcmtEaXJPYmouR2V0RmlsZXMoImRiJGkubmFtZSIpLkZ1bGxOYW1lCiAgICAgICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgUkVQTEFDRSwgU1RBVFMgPSA1CiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVEYikKICAgICAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkubG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCiAgICAgICAgJEFsdGVyREIgPSAiQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBTRVQgSEFEUiBBVkFJTEFCSUxJVFkgR1JPVVAgPSAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEFsdGVyREIpCiAgICB9Cn0KCmZ1bmN0aW9uIE5ldy1SZXBsaWNhT3B0aW9uIHsKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIHJldHVybiAiJE5hbWUgPSAkVmFsdWUiCn0KCmZ1bmN0aW9uIFZhbGlkYXRlLU9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzIG9yIHRocm93cyBleGNlcHRpb24gb3RoZXJ3aXNlLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCgogICAgLlBBUkFNRVRFUiBBbGxvd2VkCiAgICBMaXN0IG9mIGFsbG93ZWQgb3B0aW9uIHZhbHVzLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW1N0cmluZ10kVmFsdWUsCiAgICAgICAgW0FycmF5XSRBbGxvd2VkCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGZvcmVhY2ggKCRWIGluICRBbGxvd2VkKSB7CiAgICAgICAgaWYgKCRWIC1lcSAkVmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuICRWYWx1ZQogICAgICAgIH0KICAgIH0KICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IG9uZSBvZiAkKCRBbGxvd2VkIC1qb2luICcsICcpIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1JbnRPcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIGludGVnZXIKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGlmICgtbm90ICgiJFZhbHVlIiAtbWF0Y2ggIl5bKy1dP1xkKyQiKSkgewogICAgICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IGEgbnVtYmVyIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbAoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG5vdCBudWxsLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICRmYWxzZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIGlmICgoJFZhbHVlIC1lcSAkbnVsbCkgLW9yICgkVmFsdWUgLWVxICIiKSkgewogICAgICAgIHRocm93ICJObyB2YWx1ZSB3YXMgcHJvdmlkZWQgZm9yICROYW1lIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgoKCg==", - "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoKEdldC1Nb2R1bGUgU1FMUFMgLUxpc3RBdmFpbGFibGUpIC1uZSAkbnVsbCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIk1vZHVsZSBTUUxTUCBhbHJlYWR5IGluc3RhbGxlZC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICRNdXJhbm9GaWxlU2hhcmUgPSBbRW52aXJvbm1lbnRdOjpHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdNdXJhbm9GaWxlU2hhcmUnKQogICAgICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgICAgIHRocm93KCJVbmFibGUgdG8gZmluZCBNdXJhbm9GaWxlU2hhcmUgcGF0aC4iKQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJFNldHVwUm9vdCAtZXEgJycpIHsKICAgICAgICAgICAgJFNldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXFRvb2xzJykKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJEZpbGVMaXN0ID0gQCgKICAgICAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgICAgICdTaGFyZWRNYW5hZ2VtZW50T2JqZWN0cy5tc2knLAogICAgICAgICAgICAnUG93ZXJTaGVsbFRvb2xzLm1zaScKICAgICAgICApCgogICAgICAgIGZvcmVhY2ggKCRNc2lGaWxlIGluICRGaWxlTGlzdCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRyeWluZyB0byBpbnN0YWxsICckTXNpRmlsZScgLi4uIgogICAgICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgICAgIGlmIChbSU8uRmlsZV06OkV4aXN0cygkTXNpUGF0aCkpIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgbXNpZXhlIC4uLiIKICAgICAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL2knLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICAgICAgaWYgKCRSZXN1bHQuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoIkluc3RhbGxhdGlvbiBvZiBNU0kgcGFja2FnZSAnJE1zaVBhdGgnIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJyQoJFJlc3VsdC5FeGl0Q29kZSknIikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5zdGFsbC1TcWxTZXJ2ZXJGb3JBT0FHIHsKICAgIHBhcmFtICgKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUwgZmVhdHVyZXMgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU2V0dXBSb290ID0gJycsCgogICAgICAgICMgUGF0aCB0byBmb2xkZXIgd2hlcmUgbXNpIGZpbGVzIGZvciBhZGRpdGlvbmFsIFNRTFBTIG1vZHVsZSBhcmUgbG9jYXRlZAogICAgICAgIFtTdHJpbmddICRTcWxwc1NldHVwUm9vdCA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkTXVyYW5vRmlsZVNoYXJlID0gJycsCgogICAgICAgICMgKFJFUVVJUkVEKSBEb21haW4gbmFtZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlckRvbWFpbiA9ICdmYy1hY21lLmxvY2FsJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFVzZXIgbmFtZSBmb3IgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IFNRTCBzZXJ2aWNlCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyTmFtZSA9ICdBZG1pbmlzdHJhdG9yJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFBhc3N3b3JkIGZvciB0aGF0IHVzZXIKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJQYXNzd29yZCA9ICdQQHNzdzByZCcsCgogICAgICAgIFtTd2l0Y2hdICRVcGRhdGVFbmFibGVkCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgJE11cmFub0ZpbGVTaGFyZSA9IFtFbnZpcm9ubWVudF06OkdldEVudmlyb25tZW50VmFyaWFibGUoJ011cmFub0ZpbGVTaGFyZScpCiAgICAgICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICAgICAkU2V0dXBSb290ID0gW0lPLlBhdGhdOjpDb21iaW5lKCRNdXJhbm9GaWxlU2hhcmUsICdQcmVyZXF1aXNpdGVzXFNRTCBTZXJ2ZXJcMjAxMicpCiAgICAgICAgfQoKICAgICAgICAkRXh0cmFPcHRpb25zID0gQHt9CgogICAgICAgIGlmICgkVXBkYXRlRW5hYmxlZCkgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJHRydWV9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJGZhbHNlfQogICAgICAgIH0KCiAgICAgICAgTmV3LVNRTFNlcnZlckZvckFPQUcgYAogICAgICAgICAgICAtU2V0dXBSb290ICRTZXR1cFJvb3QgYAogICAgICAgICAgICAtU1FMU3ZjVXNyRG9tYWluICRTUUxTZXJ2aWNlVXNlckRvbWFpbiBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JOYW1lICRTUUxTZXJ2aWNlVXNlck5hbWUgYAogICAgICAgICAgICAtU1FMU3ZjVXNyUGFzc3dvcmQgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgYAogICAgICAgICAgICAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKICAgIH0KfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCwKICAgICAgICBbU3RyaW5nXSAkU3FsU2VydmljZUFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lID0gJ1NoYXJlZFdvcmtEaXInCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAkU2hhcmVOZXR3b3JrUGF0aCA9ICdcXCcgKyAkUHJpbWFyeU5vZGUgKyAnXCcgKyAkU2hhcmVOYW1lCgogICAgICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAgICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluQWRtaW5BY2NvdW50TmFtZSIgYAogICAgICAgICAgICAtUGFzc3dvcmQgIiREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUaGlzIHNjcmlwdCBydW5zIG9uIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nIHNjcmlwdC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRTaGFyZU5hbWUgLWVxICcnKSB7CiAgICAgICAgICAgICRTaGFyZU5hbWUgPSBbSU8uUGF0aF06OkdldEZpbGVOYW1lV2l0aG91dEV4dGVuc2lvbigkU2hhcmVQYXRoKQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlUGF0aCA9ICckU2hhcmVQYXRoJyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU2hhcmVOYW1lID0gJyRTaGFyZU5hbWUnIgoKICAgICAgICB0cnkgewogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZSAnJFNoYXJlTmFtZSciCiAgICAgICAgICAgICRudWxsID0gR2V0LVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UKICAgICAgICAgICAgd3JpdGUtTG9nICJTaGFyZSAnJFNoYXJlTmFtZScgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiU2hhcmUgJyRTaGFyZU5hbWUnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgZm9sZGVyICckU2hhcmVQYXRoIgogICAgICAgICAgICAkbnVsbCA9IEdldC1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1SZWN1cnNlIC1Gb3JjZQogICAgICAgICAgICBXcml0ZS1Mb2cgIkZvbGRlciAnJFNoYXJlUGF0aCcgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiRm9sZGVyICckU2hhcmVQYXRoJyBub3QgZXhpc3RzIG9yIGNhbm5vdCBiZSBkZWxldGVkLiIKICAgICAgICB9CgogICAgICAgICRudWxsID0gTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQogICAgICAgICAgICAgICAgCiAgICAgICAgJG51bGwgPSBOZXctU21iU2hhcmUgLVBhdGggJFNoYXJlUGF0aCBgCiAgICAgICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYAogICAgICAgICAgICAtRnVsbEFjY2VzcyAiRXZlcnlvbmUiIGAKICAgICAgICAgICAgLURlc2NyaXB0aW9uICJTaGFyZWQgZm9sZGVyIGZvciBBbHdheXNPbiBBdmFpbGFiaWxpdHkgR3JvdXAgc2V0dXAuIgoKICAgICAgICByZXR1cm4gJ1xcJyArICRFbnY6Q29tcHV0ZXJOYW1lICsgJ1wnICsgJFNoYXJlTmFtZQogICAgfQp9CgoKCmZ1bmN0aW9uIE5ldy1EYXRhYmFzZUZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREYXRhYmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRGdW5jdGlvbnNGaWxlID0gRXhwb3J0LUZ1bmN0aW9uICdJbnZva2UtU1FMVGV4dCcsICdDb252ZXJ0VG8tU1FMTmFtZScsICdDb252ZXJ0VG8tU1FMU3RyaW5nJywgJ05ldy1TUUxEYXRhYmFzZScKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gZmlsZSAnJEZ1bmN0aW9uc0ZpbGUnIC4uLiIKLiAiJEZ1bmN0aW9uc0ZpbGUiCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctU1FMRGF0YWJhc2UnIC4uLiIKTmV3LVNRTERhdGFiYXNlICREYXRhYmFzZU5hbWUKIkAgLUNyZWRlbnRpYWwgJENyZWRzIC1Ob0Jhc2U2NAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSA9ICdNdXJhbm9BRycsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkRGF0YWJhc2VMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTGlzdGVuZXIgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBieSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VzIGluIHRoYXQgQUcKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lck5hbWUgPSAnTXVyYW5vQUdfTGlzdGVuZXInLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lcklQLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUE1hc2sgPSAnMjU1LjI1NS4yNTUuMCcsCgogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lclBvcnQgPSAnNTAyMycsCgogICAgICAgICMgU3luYyBNb2RlIE5vZGUgTGlzdAogICAgICAgIFtTdHJpbmdbXV0gJFN5bmNNb2RlTm9kZUxpc3QsCgogICAgICAgIFtTdHJpbmddICRTaGFyZWRXb3JrRGlyID0gJ1NoYXJlZFdvcmtEaXInLAoKICAgICAgICBbU3RyaW5nXSAkQ2xpWG1sRmlsZSA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgV3JpdGUtTG9nICJQcmltYXJ5IG5vZGU6ICckKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkpJyIKICAgICAgICBXcml0ZS1Mb2cgIkN1cnJlbnQgbm9kZTogJyQoKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpJyIKCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICQoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRoaXMgZnVuY3Rpb24gd29ya3Mgb24gUHJpbWFyeU5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRDbGlYbWxGaWxlIC1lcSAnJykgewogICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ID0gQCgpCiAgICAgICAgICAgIGZvcmVhY2ggKCROb2RlIGluICROb2RlTGlzdCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IEltcG9ydC1DbGlYbWwgLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcJE5vZGUueG1sIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiVXNpbmcgZGVmYXVsdCBlbmRwb2ludCBwb3J0IDUwMjIiCiAgICAgICAgICAgICAgICAgICAgJE5vZGVFbmRwb2ludFBvcnQgPSA1MDIyCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uID0gQHsKICAgICAgICAgICAgICAgICAgICAiU0VSVkVSX0lOU1RBTkNFIiA9ICIkTm9kZSI7CiAgICAgICAgICAgICAgICAgICAgIkVORFBPSU5UX1VSTCIgPSAiVENQOi8vJHtOb2RlfToke05vZGVFbmRwb2ludFBvcnR9IjsKICAgICAgICAgICAgICAgICAgICAiQVZBSUxBQklMSVRZX01PREUiID0gIkFTWU5DSFJPTk9VU19DT01NSVQiOwogICAgICAgICAgICAgICAgICAgICJGQUlMT1ZFUl9NT0RFIj0iTUFOVUFMIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJFN5bmNNb2RlTm9kZUxpc3QgLWNvbnRhaW5zICROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvblsnQVZBSUxBQklMSVRZX01PREUnXSA9ICJTWU5DSFJPTk9VU19DT01NSVQiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydGQUlMT1ZFUl9NT0RFJ10gPSAiQVVUT01BVElDIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBOT1QgaW4gU3luY01vZGVOb2RlTGlzdCIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ICs9IEAoJFJlcGxpY2FEZWZpbml0aW9uKQogICAgICAgICAgICB9CgogICAgICAgICAgICAkUHJlZmVyZW5jZXMgPSBAe30KCiAgICAgICAgICAgICRMaXN0ZW5lckRlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgIk5BTUUiPSRMaXN0ZW5lck5hbWU7CiAgICAgICAgICAgICAgICAiUE9SVCIgPSAiJExpc3RlbmVyUG9ydCI7CiAgICAgICAgICAgICAgICAiU1RBVElDIiA9ICIkTGlzdGVuZXJJUC8kTGlzdGVuZXJJUE1hc2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbWV0ZXJzID0gQHsKICAgICAgICAgICAgICAgICdXb3JrRGlyJyA9ICJcXCRQcmltYXJ5Tm9kZVwkU2hhcmVkV29ya0RpciI7CiAgICAgICAgICAgICAgICAnTmFtZScgPSAkR3JvdXBOYW1lOwogICAgICAgICAgICAgICAgJ0RhdGFiYXNlTmFtZXMnID0gJERhdGFiYXNlTGlzdDsKICAgICAgICAgICAgICAgICdSZXBsaWNhRGVmcycgPSAkUmVwbGljYURlZmluaXRpb25MaXN0OwogICAgICAgICAgICAgICAgJ1ByZWZlcmVuY2VzJyA9ICRQcmVmZXJlbmNlczsKICAgICAgICAgICAgICAgICdMaXN0ZW5lckRlZicgPSAkTGlzdGVuZXJEZWZpbml0aW9uOwogICAgICAgICAgICB9CgogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAiXFwkUHJpbWFyeU5vZGVcU2hhcmVkV29ya0RpclwqIiAtRm9yY2UKCiAgICAgICAgICAgICRDbGlYbWxGaWxlID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkNsaVhtbCBmaWxlOiAnJENsaVhtbEZpbGUnIgoKICAgICAgICAgICAgRXhwb3J0LUNsaVhtbCAtUGF0aCAkQ2xpWG1sRmlsZSAtSW5wdXRPYmplY3QgJFBhcmFtZXRlcnMgLURlcHRoIDEwCgogICAgICAgICAgICBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSBgCiAgICAgICAgICAgICAgICAtQ2xpWG1sRmlsZSAkQ2xpWG1sRmlsZSBgCiAgICAgICAgICAgICAgICAtRG9tYWluTmFtZSAkRG9tYWluTmFtZSBgCiAgICAgICAgICAgICAgICAtVXNlck5hbWUgJFVzZXJOYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyUGFzc3dvcmQgJFVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgICAgICAtUHJpbWFyeU5vZGUgJFByaW1hcnlOb2RlCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gLUFsbAoKICAgICAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiSW1wb3J0aW5nIENsaVhtbCBwYXJhbWV0ZXJzIGZpbGUgLi4uIgpgJFBhcmFtZXRlcnMgPSBJbXBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCcgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCBgYAogICAgLVdvcmtEaXIgYCRQYXJhbWV0ZXJzWydXb3JrRGlyJ10gYGAKICAgIC1OYW1lIGAkUGFyYW1ldGVyc1snTmFtZSddIGBgCiAgICAtRGF0YWJhc2VOYW1lcyBgJFBhcmFtZXRlcnNbJ0RhdGFiYXNlTmFtZXMnXSBgYAogICAgLVJlcGxpY2FEZWZzIGAkUGFyYW1ldGVyc1snUmVwbGljYURlZnMnXSBgYAogICAgLVByZWZlcmVuY2VzIGAkUGFyYW1ldGVyc1snUHJlZmVyZW5jZXMnXSBgYAogICAgLUxpc3RlbmVyRGVmIGAkUGFyYW1ldGVyc1snTGlzdGVuZXJEZWYnXQoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICAgICAgfQogICAgfQp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1NlY29uZGFyeVJlcGxpY2EgewogICAgcGFyYW0gKAogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nW11dICROb2RlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGUgbmFtZSB0aGF0IHdpbGwgYmUgcHJpbWFyeSBmb3Igc2VsZWN0ZWQgQXZhaWxhYmlsaXR5IEdyb3VwCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKCiAgICAgICAgW1N0cmluZ10gJFNoYXJlZFdvcmtEaXIgPSAnU2hhcmVkV29ya0RpcicsCgogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApIAogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYScgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cFJlcGxpY2EgLVdvcmtEaXIgIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIgoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICB9Cn0KCgoKZnVuY3Rpb24gRGlzYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBuZXRzaCBhZHZmaXJld2FsbCBzZXQgYWxscHJvZmlsZXMgc3RhdGUgb2ZmCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLUZpcmV3YWxsIHsKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIG5ldHNoIGFkdmZpcmV3YWxsIHNldCBhbGxwcm9maWxlcyBzdGF0ZSBvbgogICAgfQp9CgoKCmZ1bmN0aW9uIEVuYWJsZS1UcnVzdGVkSG9zdHMgewogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgU2V0LUl0ZW0gV1NNYW46XGxvY2FsaG9zdFxDbGllbnRcVHJ1c3RlZEhvc3RzIC1WYWx1ZSAnKicgLUZvcmNlCiAgICB9Cn0K", + "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKChHZXQtTW9kdWxlIFNRTFBTIC1MaXN0QXZhaWxhYmxlKSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJNb2R1bGUgU1FMU1AgYWxyZWFkeSBpbnN0YWxsZWQuIgogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICAgICB0aHJvdygiVW5hYmxlIHRvIGZpbmQgTXVyYW5vRmlsZVNoYXJlIHBhdGguIikKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclxUb29scycpCiAgICAgICAgfQogICAgICAgIAogICAgICAgICRGaWxlTGlzdCA9IEAoCiAgICAgICAgICAgICdTUUxTeXNDbHJUeXBlcy5tc2knLAogICAgICAgICAgICAnU2hhcmVkTWFuYWdlbWVudE9iamVjdHMubXNpJywKICAgICAgICAgICAgJ1Bvd2VyU2hlbGxUb29scy5tc2knCiAgICAgICAgKQoKICAgICAgICBmb3JlYWNoICgkTXNpRmlsZSBpbiAkRmlsZUxpc3QpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUcnlpbmcgdG8gaW5zdGFsbCAnJE1zaUZpbGUnIC4uLiIKICAgICAgICAgICAgJE1zaVBhdGggPSBKb2luLVBhdGggJFNldHVwUm9vdCAkTXNpRmlsZQogICAgICAgICAgICBpZiAoW0lPLkZpbGVdOjpFeGlzdHMoJE1zaVBhdGgpKSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIG1zaWV4ZSAuLi4iCiAgICAgICAgICAgICAgICAkUmVzdWx0ID0gRXhlYyAtRmlsZVBhdGggIm1zaWV4ZWMuZXhlIiAtQXJndW1lbnRMaXN0IEAoJy9pJywgImAiJE1zaVBhdGhgIiIsICcvcXVpZXQnKSAtUGFzc1RocnUKICAgICAgICAgICAgICAgIGlmICgkUmVzdWx0LkV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCJJbnN0YWxsYXRpb24gb2YgTVNJIHBhY2thZ2UgJyRNc2lQYXRoJyBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICckKCRSZXN1bHQuRXhpdENvZGUpJyIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIkZpbGUgJyRNc2lQYXRoJyBub3QgZm91bmQuIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgoKCmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyRm9yQU9BRyB7CiAgICBwYXJhbSAoCiAgICAgICAgIyBQYXRoIHRvIGZvbGRlciB3aGVyZSBtc2kgZmlsZXMgZm9yIGFkZGl0aW9uYWwgU1FMIGZlYXR1cmVzIGFyZSBsb2NhdGVkCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnLAoKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUxQUyBtb2R1bGUgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU3FscHNTZXR1cFJvb3QgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJE11cmFub0ZpbGVTaGFyZSA9ICcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIG5hbWUKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJEb21haW4gPSAnZmMtYWNtZS5sb2NhbCcsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgZm9yIHRoZSBhY2NvdW50IHdoaWNoIHdpbGwgYmUgdXNlZCBieSBTUUwgc2VydmljZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUgPSAnQWRtaW5pc3RyYXRvcicsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgPSAnUEBzc3cwcmQnLAoKICAgICAgICBbU3dpdGNoXSAkVXBkYXRlRW5hYmxlZAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgdHJhcCB7CiAgICAgICAgICAgICYkVHJhcEhhbmRsZXIKICAgICAgICB9CgogICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICAgICB0aHJvdygiVW5hYmxlIHRvIGZpbmQgTXVyYW5vRmlsZVNoYXJlIHBhdGguIikKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclwyMDEyJykKICAgICAgICB9CgogICAgICAgICRFeHRyYU9wdGlvbnMgPSBAe30KCiAgICAgICAgaWYgKCRVcGRhdGVFbmFibGVkKSB7CiAgICAgICAgICAgICRFeHRyYU9wdGlvbnMgKz0gQHsnVXBkYXRlRW5hYmxlZCcgPSAkdHJ1ZX0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRFeHRyYU9wdGlvbnMgKz0gQHsnVXBkYXRlRW5hYmxlZCcgPSAkZmFsc2V9CiAgICAgICAgfQoKICAgICAgICBOZXctU1FMU2VydmVyRm9yQU9BRyBgCiAgICAgICAgICAgIC1TZXR1cFJvb3QgJFNldHVwUm9vdCBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JEb21haW4gJFNRTFNlcnZpY2VVc2VyRG9tYWluIGAKICAgICAgICAgICAgLVNRTFN2Y1Vzck5hbWUgJFNRTFNlcnZpY2VVc2VyTmFtZSBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JQYXNzd29yZCAkU1FMU2VydmljZVVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgIC1FeHRyYU9wdGlvbnMgJEV4dHJhT3B0aW9ucwogICAgfQp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbkFkbWluQWNjb3VudE5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbkFkbWluQWNjb3VudFBhc3N3b3JkLAogICAgICAgIFtTdHJpbmddICRTcWxTZXJ2aWNlQWNjb3VudE5hbWUsCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAogICAgICAgIFtTdHJpbmddICRTaGFyZU5hbWUgPSAnU2hhcmVkV29ya0RpcicKICAgICkKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICAkU2hhcmVOZXR3b3JrUGF0aCA9ICdcXCcgKyAkUHJpbWFyeU5vZGUgKyAnXCcgKyAkU2hhcmVOYW1lCgogICAgICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAgICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluQWRtaW5BY2NvdW50TmFtZSIgYAogICAgICAgICAgICAtUGFzc3dvcmQgIiREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBzY3JpcHQgcnVucyBvbiBwcmltYXJ5IG5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZyBzY3JpcHQuIgogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmICgkU2hhcmVOYW1lIC1lcSAnJykgewogICAgICAgICAgICAkU2hhcmVOYW1lID0gW0lPLlBhdGhdOjpHZXRGaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24oJFNoYXJlUGF0aCkKICAgICAgICB9CgogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJTaGFyZVBhdGggPSAnJFNoYXJlUGF0aCciCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlTmFtZSA9ICckU2hhcmVOYW1lJyIKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgc2hhcmUgJyRTaGFyZU5hbWUnIgogICAgICAgICAgICAkbnVsbCA9IEdldC1TbWJTaGFyZSAtTmFtZSAkU2hhcmVOYW1lIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICAgICAgUmVtb3ZlLVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUZvcmNlCiAgICAgICAgICAgIHdyaXRlLUxvZyAiU2hhcmUgJyRTaGFyZU5hbWUnIHJlbW92ZWQuIgogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIFdyaXRlLUxvZ1dhcm5pbmcgIlNoYXJlICckU2hhcmVOYW1lJyBub3QgZXhpc3RzIG9yIGNhbm5vdCBiZSBkZWxldGVkLiIKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJUcnlpbmcgdG8gcmVtb3ZlIGZvbGRlciAnJFNoYXJlUGF0aCIKICAgICAgICAgICAgJG51bGwgPSBHZXQtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICAgICAgUmVtb3ZlLUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtUmVjdXJzZSAtRm9yY2UKICAgICAgICAgICAgV3JpdGUtTG9nICJGb2xkZXIgJyRTaGFyZVBhdGgnIHJlbW92ZWQuIgogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIFdyaXRlLUxvZ1dhcm5pbmcgIkZvbGRlciAnJFNoYXJlUGF0aCcgbm90IGV4aXN0cyBvciBjYW5ub3QgYmUgZGVsZXRlZC4iCiAgICAgICAgfQoKICAgICAgICAkbnVsbCA9IE5ldy1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUl0ZW1UeXBlIENvbnRhaW5lciAtRm9yY2UKICAgICAgICAgICAgICAgIAogICAgICAgICRudWxsID0gTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYAogICAgICAgICAgICAtTmFtZSAkU2hhcmVOYW1lIGAKICAgICAgICAgICAgLUZ1bGxBY2Nlc3MgIkV2ZXJ5b25lIiBgCiAgICAgICAgICAgIC1EZXNjcmlwdGlvbiAiU2hhcmVkIGZvbGRlciBmb3IgQWx3YXlzT24gQXZhaWxhYmlsaXR5IEdyb3VwIHNldHVwLiIKCiAgICAgICAgcmV0dXJuICdcXCcgKyAkRW52OkNvbXB1dGVyTmFtZSArICdcJyArICRTaGFyZU5hbWUKICAgIH0KfQoKCgpmdW5jdGlvbiBOZXctRGF0YWJhc2VGb3JBT0FHIHsKICAgIHBhcmFtICgKICAgICAgICBbU3RyaW5nXSAkRGF0YWJhc2VOYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApCgogICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAnSW52b2tlLVNRTFRleHQnLCAnQ29udmVydFRvLVNRTE5hbWUnLCAnQ29udmVydFRvLVNRTFN0cmluZycsICdOZXctU1FMRGF0YWJhc2UnCgogICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tIGZpbGUgJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnTmV3LVNRTERhdGFiYXNlJyAuLi4iCk5ldy1TUUxEYXRhYmFzZSAkRGF0YWJhc2VOYW1lCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoT1BUSU9OQUwpIE5hbWUgb2YgdGhlIG5ldyBBdmFpbGFiaWxpdHkgR3JvdXAuIElmIG5vdCBzcGVjaWZpZWQgdGhlbiBkZWZhdWx0IG5hbWUgd2lsbCBiZSB1c2VkLgogICAgICAgIFtTdHJpbmddICRHcm91cE5hbWUgPSAnTXVyYW5vQUcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZXMgdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgYXMgcmVwbGljYSBwYXJ0bmVycy4KICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKCiAgICAgICAgIyAoUkVRVUlSRUQpIERhdGFiYXNlIGxpc3QgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJERhdGFiYXNlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIExpc3RlbmVyIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgYnkgY2xpZW50cyB0byBjb25uZWN0IHRvIGRhdGFiYXNlcyBpbiB0aGF0IEFHCiAgICAgICAgI1tQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJOYW1lID0gJ011cmFub0FHX0xpc3RlbmVyJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIElQIGFkZHJlc3Mgb2YgdGhlIGxpc3RlbmVyCiAgICAgICAgI1tQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUCwKCiAgICAgICAgW1N0cmluZ10gJExpc3RlbmVySVBNYXNrID0gJzI1NS4yNTUuMjU1LjAnLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJQb3J0ID0gJzUwMjMnLAoKICAgICAgICAjIFN5bmMgTW9kZSBOb2RlIExpc3QKICAgICAgICBbU3RyaW5nW11dICRTeW5jTW9kZU5vZGVMaXN0LAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJENsaVhtbEZpbGUgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICBXcml0ZS1Mb2cgIlByaW1hcnkgbm9kZTogJyQoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSknIgogICAgICAgIFdyaXRlLUxvZyAiQ3VycmVudCBub2RlOiAnJCgoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSknIgoKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgJCgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBQcmltYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZiAoJENsaVhtbEZpbGUgLWVxICcnKSB7CiAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgPSBAKCkKICAgICAgICAgICAgZm9yZWFjaCAoJE5vZGUgaW4gJE5vZGVMaXN0KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICROb2RlRW5kcG9pbnRQb3J0ID0gSW1wb3J0LUNsaVhtbCAtUGF0aCAiXFwkUHJpbWFyeU5vZGVcU2hhcmVkV29ya0RpclwkTm9kZS54bWwiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICJVc2luZyBkZWZhdWx0IGVuZHBvaW50IHBvcnQgNTAyMiIKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IDUwMjIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgICAgICJTRVJWRVJfSU5TVEFOQ0UiID0gIiROb2RlIjsKICAgICAgICAgICAgICAgICAgICAiRU5EUE9JTlRfVVJMIiA9ICJUQ1A6Ly8ke05vZGV9OiR7Tm9kZUVuZHBvaW50UG9ydH0iOwogICAgICAgICAgICAgICAgICAgICJBVkFJTEFCSUxJVFlfTU9ERSIgPSAiQVNZTkNIUk9OT1VTX0NPTU1JVCI7CiAgICAgICAgICAgICAgICAgICAgIkZBSUxPVkVSX01PREUiPSJNQU5VQUwiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkU3luY01vZGVOb2RlTGlzdCAtY29udGFpbnMgJE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIiROb2RlIGlzIGluIFN5bmNNb2RlTm9kZUxpc3QiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydBVkFJTEFCSUxJVFlfTU9ERSddID0gIlNZTkNIUk9OT1VTX0NPTU1JVCIKICAgICAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25bJ0ZBSUxPVkVSX01PREUnXSA9ICJBVVRPTUFUSUMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIiROb2RlIGlzIE5PVCBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgKz0gQCgkUmVwbGljYURlZmluaXRpb24pCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQcmVmZXJlbmNlcyA9IEB7fQoKICAgICAgICAgICAgJExpc3RlbmVyRGVmaW5pdGlvbiA9IEB7CiAgICAgICAgICAgICAgICAiTkFNRSI9JExpc3RlbmVyTmFtZTsKICAgICAgICAgICAgICAgICJQT1JUIiA9ICIkTGlzdGVuZXJQb3J0IjsKICAgICAgICAgICAgICAgICJTVEFUSUMiID0gIiRMaXN0ZW5lcklQLyRMaXN0ZW5lcklQTWFzayIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFtZXRlcnMgPSBAewogICAgICAgICAgICAgICAgJ1dvcmtEaXInID0gIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIjsKICAgICAgICAgICAgICAgICdOYW1lJyA9ICRHcm91cE5hbWU7CiAgICAgICAgICAgICAgICAnRGF0YWJhc2VOYW1lcycgPSAkRGF0YWJhc2VMaXN0OwogICAgICAgICAgICAgICAgJ1JlcGxpY2FEZWZzJyA9ICRSZXBsaWNhRGVmaW5pdGlvbkxpc3Q7CiAgICAgICAgICAgICAgICAnUHJlZmVyZW5jZXMnID0gJFByZWZlcmVuY2VzOwogICAgICAgICAgICAgICAgJ0xpc3RlbmVyRGVmJyA9ICRMaXN0ZW5lckRlZmluaXRpb247CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFJlbW92ZS1JdGVtIC1QYXRoICJcXCRQcmltYXJ5Tm9kZVxTaGFyZWRXb3JrRGlyXCoiIC1Gb3JjZQoKICAgICAgICAgICAgJENsaVhtbEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCgogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiQ2xpWG1sIGZpbGU6ICckQ2xpWG1sRmlsZSciCgogICAgICAgICAgICBFeHBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlIC1JbnB1dE9iamVjdCAkUGFyYW1ldGVycyAtRGVwdGggMTAKCiAgICAgICAgICAgIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIGAKICAgICAgICAgICAgICAgIC1DbGlYbWxGaWxlICRDbGlYbWxGaWxlIGAKICAgICAgICAgICAgICAgIC1Eb21haW5OYW1lICREb21haW5OYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyTmFtZSAkVXNlck5hbWUgYAogICAgICAgICAgICAgICAgLVVzZXJQYXNzd29yZCAkVXNlclBhc3N3b3JkIGAKICAgICAgICAgICAgICAgIC1QcmltYXJ5Tm9kZSAkUHJpbWFyeU5vZGUKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJFVzZXJOYW1lIiAtUGFzc3dvcmQgIiRVc2VyUGFzc3dvcmQiCgogICAgICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJJbXBvcnRpbmcgQ2xpWG1sIHBhcmFtZXRlcnMgZmlsZSAuLi4iCmAkUGFyYW1ldGVycyA9IEltcG9ydC1DbGlYbWwgLVBhdGggJENsaVhtbEZpbGUKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIGBgCiAgICAtV29ya0RpciBgJFBhcmFtZXRlcnNbJ1dvcmtEaXInXSBgYAogICAgLU5hbWUgYCRQYXJhbWV0ZXJzWydOYW1lJ10gYGAKICAgIC1EYXRhYmFzZU5hbWVzIGAkUGFyYW1ldGVyc1snRGF0YWJhc2VOYW1lcyddIGBgCiAgICAtUmVwbGljYURlZnMgYCRQYXJhbWV0ZXJzWydSZXBsaWNhRGVmcyddIGBgCiAgICAtUHJlZmVyZW5jZXMgYCRQYXJhbWV0ZXJzWydQcmVmZXJlbmNlcyddIGBgCiAgICAtTGlzdGVuZXJEZWYgYCRQYXJhbWV0ZXJzWydMaXN0ZW5lckRlZiddCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BT0FHU2Vjb25kYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFzIHJlcGxpY2EgcGFydG5lcnMuCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkgCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYScgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cFJlcGxpY2EgLVdvcmtEaXIgIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIgoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICB9Cn0KCgoKZnVuY3Rpb24gRGlzYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9mZgogICAgfQp9CgoKCmZ1bmN0aW9uIEVuYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9uCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLVRydXN0ZWRIb3N0cyB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgU2V0LUl0ZW0gV1NNYW46XGxvY2FsaG9zdFxDbGllbnRcVHJ1c3RlZEhvc3RzIC1WYWx1ZSAnKicgLUZvcmNlCiAgICB9Cn0K", "CmZ1bmN0aW9uIEV4cG9ydC1GdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ1tdXSAkTmFtZSwKCiAgICAgICAgW1BhcmFtZXRlcihWYWx1ZUZyb21QaXBlbGluZT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFBhdGggPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpLAoKICAgICAgICBbU3dpdGNoXSAkQWxsCiAgICApCgogICAgaWYgKFtJTy5QYXRoXTo6R2V0RXh0ZW5zaW9uKCRQYXRoKSAtbmUgJ3BzMScpIHsKICAgICAgICAkbnVsbCA9IFJlbmFtZS1JdGVtIC1QYXRoICRQYXRoIC1OZXdOYW1lICIkUGF0aC5wczEiIC1Gb3JjZQogICAgICAgICRQYXRoID0gIiRQYXRoLnBzMSIKICAgIH0KCiAgICAkU3lzdGVtRnVuY3Rpb25zID0gQCgKICAgICAgICAnQTonLCAnQjonLCAnQzonLCAnRDonLCAnRTonLCAnRjonLCAnRzonLCAnSDonLCAnSTonLCAnSjonLAogICAgICAgICdLOicsICdMOicsICdNOicsICdOOicsICdPOicsICdQOicsICdROicsICdSOicsICdTOicsICdUOicsCiAgICAgICAgJ1U6JywgJ1Y6JywgJ1c6JywgJ1g6JywgJ1k6JywgJ1o6JywKICAgICAgICAnY2QuLicsICdjZFwnLCAnaGVscCcsICdta2RpcicsICdtb3JlJywgJ29zcycsICdwcm9tcHQnLAogICAgICAgICdDbGVhci1Ib3N0JywgJ0dldC1WZXJiJywgJ1BhdXNlJywgJ1RhYkV4cGFuc2lvbjInCiAgICApCgogICAgaWYgKCRBbGwpIHsKICAgICAgICBHZXQtQ2hpbGRJdGVtIEZ1bmN0aW9uOiB8CiAgICAgICAgICAgIFdoZXJlLU9iamVjdCB7JF8uTW9kdWxlTmFtZSAtZXEgJyd9IHwKICAgICAgICAgICAgV2hlcmUtT2JqZWN0IHskU3lzdGVtRnVuY3Rpb25zIC1ub3Rjb250YWlucyAkXy5OYW1lfSB8CiAgICAgICAgICAgIEZvckVhY2gtT2JqZWN0IHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRQYXRoIC1WYWx1ZSBAIgoKCmZ1bmN0aW9uICQoJF8uTmFtZSkgewokKCRfLlNjcmlwdEJsb2NrKQp9CgoiQAogICAgICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBmb3JlYWNoICgkRnVuY3Rpb25OYW1lIGluICROYW1lKSB7CiAgICAgICAgICAgICRGdW5jdGlvbk9iamVjdCA9IEdldC1DaGlsZEl0ZW0gIkZ1bmN0aW9uOlwkRnVuY3Rpb25OYW1lIgogICAgICAgICAgICBpZiAoJEZ1bmN0aW9uT2JqZWN0IC1uZSAkbnVsbCkgewogICAgICAgICAgICAgICAgQWRkLUNvbnRlbnQgLVBhdGggJFBhdGggLVZhbHVlIEAiCgoKZnVuY3Rpb24gJEZ1bmN0aW9uTmFtZSB7CiQoJEZ1bmN0aW9uT2JqZWN0LlNjcmlwdEJsb2NrKQp9CgoiQAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUGF0aAp9Cg==", - "CmZ1bmN0aW9uIFNlbGVjdC1DbGlYbWxCbG9jayB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFBhdGgsCiAgICAgICAgW1N0cmluZ10gJE91dEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICApCgogICAgJFRhZ0ZvdW5kID0gJGZhbHNlCiAgICBHZXQtQ29udGVudCAkUGF0aCB8CiAgICAgICAgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICBpZiAoJF8gLWVxICcjPCBDTElYTUwnKSB7CiAgICAgICAgICAgICAgICAkVGFnRm91bmQgPSAkdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkVGFnRm91bmQpIHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRPdXRGaWxlIC1WYWx1ZSAkXwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgJE91dEZpbGUKfQoKCgpmdW5jdGlvbiBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJENvbW1hbmQsCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbCwKICAgICAgICBbU3dpdGNoXSAkSWdub3JlU3RkRXJyLAogICAgICAgIFtTd2l0Y2hdICROb0Jhc2U2NAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgJFN0ZE91dCA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICAgICAkU3RkRXJyID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAkQXJndW1lbnRMaXN0ID0gQCgnLU91dHB1dEZvcm1hdCcsICdYTUwnKQoKICAgICAgICBpZiAoJE5vQmFzZTY0KSB7CiAgICAgICAgICAgICRUbXBTY3JpcHQgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAgICAgICAgIFJlbmFtZS1JdGVtIC1QYXRoICIkVG1wU2NyaXB0IiAtTmV3TmFtZSAiJFRtcFNjcmlwdC5wczEiIC1Gb3JjZQogICAgICAgICAgICAkVG1wU2NyaXB0ID0gIiRUbXBTY3JpcHQucHMxIgoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgJFRtcFNjcmlwdAoKICAgICAgICAgICAgJENvbW1hbmQgfCBPdXQtRmlsZSAkVG1wU2NyaXB0CgogICAgICAgICAgICAkQXJndW1lbnRMaXN0ICs9IEAoJy1GaWxlJywgIiRUbXBTY3JpcHQiKQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEJ5dGVzID0gW1RleHQuRW5jb2RpbmddOjpVbmljb2RlLkdldEJ5dGVzKCRDb21tYW5kKQogICAgICAgICAgICAkRW5jb2RlZENvbW1hbmQgPSBbQ29udmVydF06OlRvQmFzZTY0U3RyaW5nKCRCeXRlcykKICAgICAgICAgICAgCiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICRFbmNvZGVkQ29tbWFuZAoKICAgICAgICAgICAgJEFyZ3VtZW50TGlzdCArPSBAKCctRW5jb2RlZENvbW1hbmQnLCAkRW5jb2RlZENvbW1hbmQpCiAgICAgICAgfQoKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAkQXJndW1lbnRMaXN0CgogICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgZXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIC4uLiIKCiAgICAgICAgaWYgKCRDcmVkZW50aWFsIC1lcSAkbnVsbCkgewogICAgICAgICAgICAkUHJvY2VzcyA9IFN0YXJ0LVByb2Nlc3MgLUZpbGVQYXRoICdwb3dlcnNoZWxsLmV4ZScgYAogICAgICAgICAgICAgICAgLUFyZ3VtZW50TGlzdCBAKCRBcmd1bWVudExpc3QpIGAKICAgICAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ICRTdGRPdXQgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRFcnJvciAkU3RkRXJyIGAKICAgICAgICAgICAgICAgIC1Ob05ld1dpbmRvdyBgCiAgICAgICAgICAgICAgICAtV2FpdCBgCiAgICAgICAgICAgICAgICAtUGFzc1RocnUKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQcm9jZXNzID0gU3RhcnQtUHJvY2VzcyAtRmlsZVBhdGggJ3Bvd2Vyc2hlbGwuZXhlJyBgCiAgICAgICAgICAgICAgICAtQXJndW1lbnRMaXN0IEAoJEFyZ3VtZW50TGlzdCkgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRPdXRwdXQgJFN0ZE91dCBgCiAgICAgICAgICAgICAgICAtUmVkaXJlY3RTdGFuZGFyZEVycm9yICRTdGRFcnIgYAogICAgICAgICAgICAgICAgLUNyZWRlbnRpYWwgJENyZWRlbnRpYWwgYAogICAgICAgICAgICAgICAgLU5vTmV3V2luZG93IGAKICAgICAgICAgICAgICAgIC1XYWl0IGAKICAgICAgICAgICAgICAgIC1QYXNzVGhydQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeHRlcm5hbCBQb3dlclNoZWxsIHByb2Nlc3MgZXhpdGVkIHdpdGggZXhpdCBjb2RlICckKCRQcm9jZXNzLkV4aXRDb2RlKScuIgoKICAgICAgICAjaWYgKCRBcmd1bWVudExpc3QgLWNvbnRhaW5zICctRmlsZScpIHsKICAgICAgICAjICAgIFJlbW92ZS1JdGVtIC1QYXRoICRUbXBTY3JpcHQgLUZvcmNlCiAgICAgICAgI30KCiAgICAgICAgJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZQogICAgICAgICRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU2lsZW50bHlDb250aW51ZScKCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlN0ZE91dCBmaWxlIGlzICckU3RkT3V0JyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU3RkRXJyIGZpbGUgaXMgJyRTdGRFcnInIgoKICAgICAgICBpZiAoKEdldC1JdGVtICRTdGRPdXQpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkxvYWRpbmcgU3RkT3V0IGZyb20gJyRTdGRPdXQnIgogICAgICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZE91dAogICAgICAgICAgICAgICAgJFN0ZE91dE9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8U3RkT3V0PiIKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICgkU3RkT3V0T2JqZWN0KQogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkT3V0PiIKICAgICAgICAgICAgICAgICRTdGRPdXRPYmplY3QKICAgICAgICAgICAgICAgICNSZW1vdmUtSXRlbSAtUGF0aCAkVG1wRmlsZSAtRm9yY2UKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBsb2FkaW5nIFN0ZE91dCBmcm9tICckVG1wRmlsZSciCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgoR2V0LUl0ZW0gJFN0ZEVycikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiTG9hZGluZyBTdGRFcnIgLi4uIgogICAgICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZEVycgogICAgICAgICAgICAgICAgJFN0ZEVyck9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8U3RkRXJyPiIKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICgkU3RkRXJyT2JqZWN0KQogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkRXJyPiIKICAgICAgICAgICAgICAgIGlmICgtbm90ICRJZ25vcmVTdGRFcnIpIHsKICAgICAgICAgICAgICAgICAgICAkU3RkRXJyT2JqZWN0CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjUmVtb3ZlLUl0ZW0gLVBhdGggJFRtcEZpbGUgLUZvcmNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgbG9hZGluZyBTdGRFcnIgZnJvbSAnJFRtcEZpbGUnIgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkCgogICAgICAgIGlmICgkUHJvY2Vzcy5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICB0aHJvdygiRXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJyQoJFByb2Nlc3MuRXhpdENvZGUpJyIpCiAgICAgICAgfQoKICAgICAgICAjUmVtb3ZlLUl0ZW0gJFN0ZE91dCAtRm9yY2UKICAgICAgICAjUmVtb3ZlLUl0ZW0gJFN0ZEVyciAtRm9yY2UKICAgIH0KfQo=" + "CmZ1bmN0aW9uIFNlbGVjdC1DbGlYbWxCbG9jayB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFBhdGgsCiAgICAgICAgW1N0cmluZ10gJE91dEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICApCgogICAgJFRhZ0ZvdW5kID0gJGZhbHNlCiAgICBHZXQtQ29udGVudCAkUGF0aCB8CiAgICAgICAgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICBpZiAoJF8gLWVxICcjPCBDTElYTUwnKSB7CiAgICAgICAgICAgICAgICAkVGFnRm91bmQgPSAkdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkVGFnRm91bmQpIHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRPdXRGaWxlIC1WYWx1ZSAkXwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgJE91dEZpbGUKfQoKCgpmdW5jdGlvbiBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJENvbW1hbmQsCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbCwKICAgICAgICBbU3dpdGNoXSAkSWdub3JlU3RkRXJyLAogICAgICAgIFtTd2l0Y2hdICROb0Jhc2U2NAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgdHJhcCB7CiAgICAgICAgICAgICYkVHJhcEhhbmRsZXIKICAgICAgICB9CgogICAgICAgICRTdGRPdXQgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAgICAgJFN0ZEVyciA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKCiAgICAgICAgJEFyZ3VtZW50TGlzdCA9IEAoJy1PdXRwdXRGb3JtYXQnLCAnWE1MJykKCiAgICAgICAgaWYgKCROb0Jhc2U2NCkgewogICAgICAgICAgICAkVG1wU2NyaXB0ID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQogICAgICAgICAgICBSZW5hbWUtSXRlbSAtUGF0aCAiJFRtcFNjcmlwdCIgLU5ld05hbWUgIiRUbXBTY3JpcHQucHMxIiAtRm9yY2UKICAgICAgICAgICAgJFRtcFNjcmlwdCA9ICIkVG1wU2NyaXB0LnBzMSIKCiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICRUbXBTY3JpcHQKCiAgICAgICAgICAgICRDb21tYW5kIHwgT3V0LUZpbGUgJFRtcFNjcmlwdAoKICAgICAgICAgICAgJEFyZ3VtZW50TGlzdCArPSBAKCctRmlsZScsICIkVG1wU2NyaXB0IikKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRCeXRlcyA9IFtUZXh0LkVuY29kaW5nXTo6VW5pY29kZS5HZXRCeXRlcygkQ29tbWFuZCkKICAgICAgICAgICAgJEVuY29kZWRDb21tYW5kID0gW0NvbnZlcnRdOjpUb0Jhc2U2NFN0cmluZygkQnl0ZXMpCiAgICAgICAgICAgIAogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAkRW5jb2RlZENvbW1hbmQKCiAgICAgICAgICAgICRBcmd1bWVudExpc3QgKz0gQCgnLUVuY29kZWRDb21tYW5kJywgJEVuY29kZWRDb21tYW5kKQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nRGVidWcgJEFyZ3VtZW50TGlzdAoKICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIGV4dGVybmFsIFBvd2VyU2hlbGwgcHJvY2VzcyAuLi4iCgogICAgICAgIGlmICgkQ3JlZGVudGlhbCAtZXEgJG51bGwpIHsKICAgICAgICAgICAgJFByb2Nlc3MgPSBTdGFydC1Qcm9jZXNzIC1GaWxlUGF0aCAncG93ZXJzaGVsbC5leGUnIGAKICAgICAgICAgICAgICAgIC1Bcmd1bWVudExpc3QgQCgkQXJndW1lbnRMaXN0KSBgCiAgICAgICAgICAgICAgICAtUmVkaXJlY3RTdGFuZGFyZE91dHB1dCAkU3RkT3V0IGAKICAgICAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkRXJyb3IgJFN0ZEVyciBgCiAgICAgICAgICAgICAgICAtTm9OZXdXaW5kb3cgYAogICAgICAgICAgICAgICAgLVdhaXQgYAogICAgICAgICAgICAgICAgLVBhc3NUaHJ1CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUHJvY2VzcyA9IFN0YXJ0LVByb2Nlc3MgLUZpbGVQYXRoICdwb3dlcnNoZWxsLmV4ZScgYAogICAgICAgICAgICAgICAgLUFyZ3VtZW50TGlzdCBAKCRBcmd1bWVudExpc3QpIGAKICAgICAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ICRTdGRPdXQgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRFcnJvciAkU3RkRXJyIGAKICAgICAgICAgICAgICAgIC1DcmVkZW50aWFsICRDcmVkZW50aWFsIGAKICAgICAgICAgICAgICAgIC1Ob05ld1dpbmRvdyBgCiAgICAgICAgICAgICAgICAtV2FpdCBgCiAgICAgICAgICAgICAgICAtUGFzc1RocnUKICAgICAgICB9CgogICAgICAgIFdyaXRlLUxvZyAiRXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIGV4aXRlZCB3aXRoIGV4aXQgY29kZSAnJCgkUHJvY2Vzcy5FeGl0Q29kZSknLiIKCiAgICAgICAgI2lmICgkQXJndW1lbnRMaXN0IC1jb250YWlucyAnLUZpbGUnKSB7CiAgICAgICAgIyAgICBSZW1vdmUtSXRlbSAtUGF0aCAkVG1wU2NyaXB0IC1Gb3JjZQogICAgICAgICN9CgogICAgICAgICRFcnJvckFjdGlvblByZWZlcmVuY2VTYXZlZCA9ICRFcnJvckFjdGlvblByZWZlcmVuY2UKICAgICAgICAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJ1NpbGVudGx5Q29udGludWUnCgogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJTdGRPdXQgZmlsZSBpcyAnJFN0ZE91dCciCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlN0ZEVyciBmaWxlIGlzICckU3RkRXJyJyIKCiAgICAgICAgaWYgKChHZXQtSXRlbSAkU3RkT3V0KS5MZW5ndGggLWd0IDApIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJMb2FkaW5nIFN0ZE91dCBmcm9tICckU3RkT3V0JyIKICAgICAgICAgICAgICAgICRUbXBGaWxlID0gU2VsZWN0LUNsaVhtbEJsb2NrICRTdGRPdXQKICAgICAgICAgICAgICAgICRTdGRPdXRPYmplY3QgPSBJbXBvcnQtQ2xpeG1sICRUbXBGaWxlCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPFN0ZE91dD4iCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAoJFN0ZE91dE9iamVjdCkKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8L1N0ZE91dD4iCiAgICAgICAgICAgICAgICAkU3RkT3V0T2JqZWN0CiAgICAgICAgICAgICAgICAjUmVtb3ZlLUl0ZW0gLVBhdGggJFRtcEZpbGUgLUZvcmNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgbG9hZGluZyBTdGRPdXQgZnJvbSAnJFRtcEZpbGUnIgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoKEdldC1JdGVtICRTdGRFcnIpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkxvYWRpbmcgU3RkRXJyIC4uLiIKICAgICAgICAgICAgICAgICRUbXBGaWxlID0gU2VsZWN0LUNsaVhtbEJsb2NrICRTdGRFcnIKICAgICAgICAgICAgICAgICRTdGRFcnJPYmplY3QgPSBJbXBvcnQtQ2xpeG1sICRUbXBGaWxlCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPFN0ZEVycj4iCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAoJFN0ZEVyck9iamVjdCkKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8L1N0ZEVycj4iCiAgICAgICAgICAgICAgICBpZiAoLW5vdCAkSWdub3JlU3RkRXJyKSB7CiAgICAgICAgICAgICAgICAgICAgJFN0ZEVyck9iamVjdAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgI1JlbW92ZS1JdGVtIC1QYXRoICRUbXBGaWxlIC1Gb3JjZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGxvYWRpbmcgU3RkRXJyIGZyb20gJyRUbXBGaWxlJyIKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICRFcnJvckFjdGlvblByZWZlcmVuY2VTYXZlZAoKICAgICAgICBpZiAoJFByb2Nlc3MuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICAgICAgdGhyb3coIkV4dGVybmFsIFBvd2VyU2hlbGwgcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlICckKCRQcm9jZXNzLkV4aXRDb2RlKSciKQogICAgICAgIH0KCiAgICAgICAgI1JlbW92ZS1JdGVtICRTdGRPdXQgLUZvcmNlCiAgICAgICAgI1JlbW92ZS1JdGVtICRTdGRFcnIgLUZvcmNlCiAgICB9Cn0K" ] } \ No newline at end of file diff --git a/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/InitializeAlwaysOn.yaml.json b/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/InitializeAlwaysOn.yaml.json index 290940cb..f51328da 100644 --- a/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/InitializeAlwaysOn.yaml.json +++ b/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/InitializeAlwaysOn.yaml.json @@ -12,12 +12,12 @@ } ], "Scripts": [ - "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKZnVuY3Rpb24gU2hvdy1JbnZvY2F0aW9uSW5mbyB7CiAgICBwYXJhbSAoCiAgICAgICAgJEludm9jYXRpb24sCiAgICAgICAgW1N3aXRjaF0gJEVuZAogICAgKQoKICAgIGlmICgkRW5kKSB7CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgIH0KICAgIGVsc2UgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8ZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPHBhcmFtPiIKICAgICAgICBmb3JlYWNoICgkUGFyYW1ldGVyIGluICRJbnZvY2F0aW9uLk15Q29tbWFuZC5QYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRLZXkgaW4gJFBhcmFtZXRlci5LZXlzKSB7CiAgICAgICAgICAgICAgICAkVHlwZSA9ICRQYXJhbWV0ZXJbJEtleV0uUGFyYW1ldGVyVHlwZS5GdWxsTmFtZQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJFZhbHVlIGluICRJbnZvY2F0aW9uLkJvdW5kUGFyYW1ldGVyc1skS2V5XSkgewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJbJFR5cGVdICRLZXkgPSAnJFZhbHVlJyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPC9wYXJhbT4iCiAgICB9Cn0KCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKCmZ1bmN0aW9uIFNob3ctSW52b2NhdGlvbkluZm8gewogICAgcGFyYW0gKAogICAgICAgICRJbnZvY2F0aW9uLAogICAgICAgIFtTd2l0Y2hdICRFbmQKICAgICkKCiAgICBpZiAoJEVuZCkgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8L2Z1bmN0aW9uIG5hbWU9JyQoJEludm9jYXRpb24uTXlDb21tYW5kLk5hbWUpJz4iCiAgICB9CiAgICBlbHNlIHsKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPGZ1bmN0aW9uIG5hbWU9JyQoJEludm9jYXRpb24uTXlDb21tYW5kLk5hbWUpJz4iCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjxwYXJhbT4iCiAgICAgICAgZm9yZWFjaCAoJFBhcmFtZXRlciBpbiAkSW52b2NhdGlvbi5NeUNvbW1hbmQuUGFyYW1ldGVycykgewogICAgICAgICAgICBmb3JlYWNoICgkS2V5IGluICRQYXJhbWV0ZXIuS2V5cykgewogICAgICAgICAgICAgICAgJFR5cGUgPSAkUGFyYW1ldGVyWyRLZXldLlBhcmFtZXRlclR5cGUuRnVsbE5hbWUKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRWYWx1ZSBpbiAkSW52b2NhdGlvbi5Cb3VuZFBhcmFtZXRlcnNbJEtleV0pIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiWyRUeXBlXSAkS2V5ID0gJyRWYWx1ZSciCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvcGFyYW0+IgogICAgfQp9CgoKJFRyYXBIYW5kbGVyID0gewogICAgV3JpdGUtTG9nRXJyb3IgQCgiPGV4Y2VwdGlvbj4iLCAkXykgLUVudGlyZU9iamVjdAogICAgV3JpdGUtTG9nRXJyb3IgIjwvZXhjZXB0aW9uPiIKICAgIGJyZWFrCn0KCgp0cmFwIHsKICAgICYkVHJhcEhhbmRsZXIKfQoKJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICdTdG9wJwoKCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", "ZnVuY3Rpb24gTmV3LU9wdGlvbiAoW3N0cmluZ10kTmFtZSwgW3N3aXRjaF0kU3dpdGNoLCBbc3dpdGNoXSRCb29sZWFuLCBbc3dpdGNoXSRTdHJpbmcsIFtzd2l0Y2hdJExpc3QsICRDb25zdHJhaW50cz0kbnVsbCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb24gb2JqZWN0CgogICAgLkRFU0NSSVBUSU9OCiAgICBPcHRpb24gb2JqZWN0IGlzIGEgdmlydHVhbCBvYmplY3QgcmVwcmVzdG50aW5nIHR5cGVkIGNvbW1hbmQgbGluZSBvcHRpb24uIFRoZXNlIG9iamVjdHMgZW5jYXBzdWxhdGUgZXNjYXBpbmcgYW5kCiAgICB2YWxpZGF0aW9uIG1hdHRlcnMuCgogICAgT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgc3dpdGNoZXMgJ1N3aXRjaCcsICdCb29sZWFuJywgJ1N0cmluZycgb3IgJ0xpc3QnIHNob3VsZCBiZSBwcm92aWRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZS4KCiAgICAuUEFSQU1FVEVSIFN3aXRjaAogICAgVXNlIHRoaXMgc3dpdGNoIHRvIGNyZWF0ZSB2YWx1ZWxlc3Mgb3B0aW9uIChhIHN3aXRjaCkuCgogICAgLlBBUkFNRVRFUiBCb29sZWFuCiAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gY3JlYXRlIGJvb2xlYW4gb3B0aW9uLiBJdHMgdmFsdWUgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byAiMSIgb3IgIjAiCgogICAgLlBBUkFNRVRFUiBTdHJpbmcKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgc3RyaW5nIG9wdGlvbi4gSXRzIHZhbHVlIHdpbGwgYmUgcHJvcGVybHkgcXVvdGVkIGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIExpc3QKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgb3B0aW9uIHdpdGggbGlzdCB2YWx1ZS4gVmFsdWVzIHdpbGwgYmUgcHV0IGludG8gY29tbWFuZCBsaW5lIHVzaW5nIHZhbGlkIHZhbHVlIGRlbGVtaXRlciAoYSBjb21tYSkKCiAgICAuUEFSQU1FVEVSIENvbnN0cmFpbnRzCiAgICBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgb3B0aW9uIHZhbHVlcyBhcmUgbGltaXRlZCB0byBvcHRpb25zIGZyb20gdGhhdCBsaXN0LgoKICAgICM+CgogICAgJE9wdGlvbiA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFBTT2JqZWN0CgogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBUeXBlIC12YWx1ZSAkbnVsbAogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IE5hbWUgLXZhbHVlICRudWxsCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgQWxsb3dlZFZhbHVlcyAtdmFsdWUgJG51bGwKCiAgICAjIEluaXQKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgX19pbml0X18gewogICAgICAgIHBhcmFtKFtzdHJpbmddJE5hbWUsICRTd2l0Y2gsICRCb29sZWFuLCAkU3RyaW5nLCAkTGlzdCkKCiAgICAgICAgJHRoaXMuTmFtZSA9ICROYW1lCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIyBXaXRoIHJlc3BlY3QgZm9yIG91ciBkZXZlbG9wZXJzIHdlIGRvIG5vdCBjaGVjayBmb3IgZG91YmxlIHR5cGUgc2VsZWN0ZWQKICAgICAgICBpZiAoJFN3aXRjaCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3dpdGNoKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkQm9vbGVhbikgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uQm9vbGVhbigkdGhpcykKICAgICAgICB9IGVsc2VpZiAoJFN0cmluZykgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3RyaW5nKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkTGlzdCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uTGlzdCgkdGhpcykKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiU3dpdGNoLCBCb29sZWFuLCBTdHJpbmcgb3IgTGlzdCBvcHRpb24gdHlwZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBvcHRpb24gJyROYW1lJyIKICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIF9fcG9zdF9pbml0X18gewogICAgICAgIHBhcmFtKCRDb25zdHJhaW50cz0kbnVsbCkKICAgICAgICBpZiAoJENvbnN0cmFpbnRzIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkdGhpcy5BbGxvd2VkVmFsdWVzID0gQCgpCiAgICAgICAgICAgICR0aGlzLkFsbG93ZWRWYWx1ZXMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzICsgJENvbnN0cmFpbnRzCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnN0cmFpbnRzID0gJG51bGwKICAgICAgICB9CiAgICB9CgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBWYWxpZGF0ZSB7CiAgICAgICAgaWYgKCR0aGlzLkFsbG93ZWRWYWx1ZXMgLW5lICRudWxsKSB7CiAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICR0aGlzLlZhbHVlKSkgewogICAgICAgICAgICAgICAgJEN0cyA9ICR0aGlzLkFsbG93ZWRWYWx1ZXMgLWpvaW4gJywnCiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckKCR0aGlzLk5hbWUpJyBtYXkgaGF2ZSB2YWx1ZXMgKCRDdHMpIGJ1dCBub3QgJyQoJHRoaXMuVmFsdWUpJyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFRvU3RyaW5nIHsKICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpIgogICAgfQoKICAgICMgaW52b2tlIGNvbnN0cnVjdG9yCgogICAgJE9wdGlvbi5fX2luaXRfXygkTmFtZSwgJFN3aXRjaCwgJEJvb2xlYW4sICRTdHJpbmcsICRMaXN0KQogICAgJE9wdGlvbi5fX3Bvc3RfaW5pdF9fKCRDb25zdHJhaW50cykKCiAgICByZXR1cm4gJE9wdGlvbgp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3dpdGNoKCRPcHRpb24pIHsKfQoKZnVuY3Rpb24gQXVnbWVudE9wdGlvbkJvb2xlYW4oJE9wdGlvbikgewogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBWYWx1ZSAtdmFsdWUgJGZhbHNlCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgaWYgKCR0aGlzLlZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9MSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpPTAiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3RyaW5nKCRPcHRpb24pIHsKICAgICMgRmllbGRzCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgVmFsdWUgLXZhbHVlICIiCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgJHYgPSAiJCgkdGhpcy5WYWx1ZSkiCiAgICAgICAgaWYgKCR2IC1tYXRjaCAnLiogLionKSB7CiAgICAgICAgICAgICMgVE9ETzogRXNjYXBlIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzIGlmIHBvc3NpYmxlCiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9YCIkdmAiIgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JHYiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uTGlzdCgkT3B0aW9uKSB7CiAgICAjIEZpZWxkcwogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFZhbHVlIC12YWx1ZSBAKCkKCiAgICAjIE1ldGhvZHMKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFZhbGlkYXRlIHsKICAgICAgICBpZiAoJHRoaXMuQWxsb3dlZFZhbHVlcyAtbmUgJG51bGwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJFYgaW4gJHRoaXMuVmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICRWKSkgewogICAgICAgICAgICAgICAgICAgICRDdHMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzIC1qb2luICcsJwogICAgICAgICAgICAgICAgICAgIHRocm93ICJPcHRpb24gJyQoJHRoaXMuTmFtZSknIG1heSBoYXZlIHZhbHVlcyAoJEN0cykgYnV0IG5vdCAnJFYnIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIC1Gb3JjZSBTY3JpcHRNZXRob2QgVG9TdHJpbmcgewogICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JCgkdGhpcy5WYWx1ZSAtam9pbiAnLCcpIgogICAgfQp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyKCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb25QYXJzZXIgb2JqZWN0LgoKICAgIC5ERVNDUklQVElPTgogICAgT3B0aW9uUGFyc2VyIG9iamVjdCBsZXZlcmFnZXMgT3B0aW9uIG9iamVjdHMgY2FwYWJpbGl0aWVzIGFuZCBidWlsZHMgdmFsaWQgY29tbWFuZCBsaW5lIHVzaW5nIHNwZWNpZmllZCBvcHRpb25zLgogICAgQW4gYXBwbGljYXRpb24gbWF5IGFsc28gYmUgaW52b2tlZCB3aXRoIE9wdGlvblBhcnNlci4KCiAgICAjPgoKICAgICRPcHRpb25QYXJzZXIgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBQU09iamVjdAoKICAgICMgRmllbGRzCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgT3B0aW9ucyAtdmFsdWUgQHt9CiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgRGVmYXVsdHMgLXZhbHVlIEB7fQogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFJlcXVpcmVkT3B0aW9ucyAtdmFsdWUgQCgpCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIEFkZE9wdGlvbiB7CiAgICAgICAgPCMKICAgICAgICAuU1lOT1BTSVMKICAgICAgICBBZGRzIHN1cHBvcnRlZCBvcHRpb24gaW50byBPcHRpb25QYXJzZXIuCiAgICAgICAgCiAgICAgICAgLkRFU0NSSVBUSU9OCiAgICAgICAgT3B0aW9uUGFyc2VyIGRvZXMgbm90IGFsbG93IHVzaW5nIHVucmVjb2duaXplZCBvcHRpb25zLiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsbCBPcHRpb25QYXJzZXIgd2l0aCByZWNvZ25pemVkIG9wdGlvbnMKCiAgICAgICAgLlBBUkFNRVRFUiBPcHRpb24KICAgICAgICBPcHRpb24gb2JqZWN0CgogICAgICAgIC5QQVJBTUVURVIgUmVxdWlyZWQKICAgICAgICBSZXF1aXJlZCBvcHRpb24gc3dpdGNoCgogICAgICAgIC5QQVJBTUVURVIgRGVmYXVsdAogICAgICAgIE9wdGlvbiBkZWZhdWx0IHZhbHVlCiAgICAgICAgIz4KICAgICAgICBwYXJhbSgkT3B0aW9uLCBbYm9vbF0kUmVxdWlyZWQ9JGZhbHNlLCAkRGVmYXVsdD0kbnVsbCkKICAgICAgICAkdGhpcy5PcHRpb25zLkFkZCgkT3B0aW9uLk5hbWUsICRPcHRpb24pCiAgICAgICAgaWYgKCRSZXF1aXJlZCkgewogICAgICAgICAgICAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgPSAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgKyAkT3B0aW9uLk5hbWUKICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgIGlmICgkRGVmYXVsdCkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLkRlZmF1bHRzLkFkZCgkT3B0aW9uLk5hbWUsICREZWZhdWx0KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMuRGVmYXVsdHMuQWRkKCRPcHRpb24uTmFtZSwgJG51bGwpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIFBhcnNlIHsKICAgICAgICA8IwogICAgICAgIC5TWU5PUFNJUwogICAgICAgIFBhcnNlcyBzdXBwbGllZCBvcHRpb25zIGFuZCByZXR1cm5zIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFycmF5LgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQgb25seSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGFsbCBtYW5kYXRvcnkgb3B0aW9ucyBhcmUgaW4gcGxhY2UsIAogICAgICAgIGFsbCBvcHRpb24gbWVldCBjb25zdHJhaW50cyBpZiBhbnkuIFVuc3BlY2lmaWVkIG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhcmUgYWRkZWQgdG8gY29tbWFuZCBsaW5lLgogICAgICAgIFNvLCBtYW5kYXRvcnkgb3B0aW9uIHdpdGggZGVmYXVsdCB2YWx1ZSBuZXZlciBjYXVzZXMgZXhjZXB0aW9uLgoKICAgICAgICAuUEFSQU1FVEVSIE9wdGlvbnMKICAgICAgICBBIGhhc2ggbWFwIG9mIG9wdGlvbnMgdG8gcGFyc2UuIE9wdGlvbiBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgogICAgICAgICM+CiAgICAgICAgcGFyYW0oW2hhc2h0YWJsZV0kT3B0aW9ucykKCiAgICAgICAgJENvbW1hbmRMaW5lID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJFJlcXVpcmVkT3B0aW9uTmFtZSBpbiAkdGhpcy5SZXF1aXJlZE9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJE9wdGlvbnMuQ29udGFpbnNLZXkoJFJlcXVpcmVkT3B0aW9uTmFtZSkpIHsKICAgICAgICAgICAgICAgICREZWZhdWx0ID0gJHRoaXMuRGVmYXVsdHMuR2V0X0l0ZW0oJFJlcXVpcmVkT3B0aW9uTmFtZSkKICAgICAgICAgICAgICAgIGlmICgkdGhpcy5EZWZhdWx0cy5Db250YWluc0tleSgkUmVxdWlyZWRPcHRpb25OYW1lKSkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25zLkFkZCgkUmVxdWlyZWRPcHRpb25OYW1lLCAkdGhpcy5EZWZhdWx0cy5HZXRfSXRlbSgkUmVxdWlyZWRPcHRpb25OYW1lKSkKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlJlcXVpcmVkIG9wdGlvbiAnJFJlcXVpcmVkT3B0aW9uTmFtZScgaXMgbWlzc2luZyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJE9wdGlvbk5hbWUgaW4gJCgkT3B0aW9ucy5rZXlzKSkgewogICAgICAgICAgICAkT3B0aW9uID0gJHRoaXMuT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgaWYgKCRPcHRpb24gLWVxICRudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckT3B0aW9uTmFtZScgaXMgbm90IGFsbG93ZWQiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgICRPcHRpb24uVmFsdWUgPSAkT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgfQogICAgICAgICAgICAkT3B0aW9uLlZhbGlkYXRlKCkKICAgICAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJE9wdGlvbi5Ub1N0cmluZygpCiAgICAgICAgfQogICAgICAgIHJldHVybiAkQ29tbWFuZExpbmUKICAgIH0KCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgRXhlY3V0ZUJpbmFyeSB7CiAgICAgICAgcGFyYW0oJEJpbmFyeSwgW2hhc2h0YWJsZV0kT3B0aW9ucyA9IEB7fSwgJENvbW1hbmRMaW5lU3VmZml4ID0gQCgpKQogICAgICAgIDwjCiAgICAgICAgLlNZTk9QU0lTCiAgICAgICAgRXhlY3V0ZXMgYmluYXJ5IHdpdGggYSBjb21tYW5kIGxpbmUgY29uc3RydWN0ZWQgZnJvbSBwcm92aWRlZCBvcHRpb25zLiBBbiBhcmJpdHJhcnkgc3VmZml4IG1heSBiZSAKICAgICAgICBhcHBlbmRlZCB0byB0aGUgY29tbWFuZCBsaW5lLgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHVzZXMgT3B0aW9uUGFyc2VyLlBhcnNlIG1ldGhvZCB0byBjb25zdHJ1Y3QgY29tbWFuZCBsaW5lLiBJZiB0aGVyZSBhIGNvbW1hbmQgbGluZSBzdWZmaXggCiAgICAgICAgd2FzIHN1cHBsaWVkLCBpdCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIGNvbW1hbmQgbGluZS4gTm9ybWFsbHkgY29tbWFuZCBsaW5lIHN1ZmZpeCBzaG91bGQgY29udGFpbgogICAgICAgIGxlYWRpbmcgc3BhY2UgY2hhcmFjdGVyLgoKICAgICAgICBNZXRob2Qgd2FpdHMgZm9yIGV4ZWN1dGFibGUgcHJvY2VzcyB0byBjb21wbGV0ZSBhbmQgcmV0dXJucyBpdHMgZXhpdCBjb2RlLgoKICAgICAgICAuUEFSQU1FVEVSIEJpbmFyeQogICAgICAgIEZ1bGwgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSB0byBydW4uCgogICAgICAgIC5QQVJBTUVURVIgT3B0aW9ucwogICAgICAgIEEgaGFzaCBtYXAgb2Ygb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBleGVjdXRhYmxlLgoKICAgICAgICAuUEFSQU1FVEVSIENvbW1hbmRMaW5lU3VmZml4CiAgICAgICAgQXJiaXRyYXJ5IGNvbW1hbmQgbGluZSBzdWZmaXguIE5vcm1hbGx5IGl0IHNob3VkIGhhdmUgbGVhZGluZyBzcGFjZSBjaGFyYWN0ZXIuCiAgICAgICAgIz4KCiAgICAgICAgJEJpbmFyeSA9IEdldC1JdGVtICRCaW5hcnkKICAgICAgICAkQ29tbWFuZExpbmUgPSAkdGhpcy5QYXJzZSgkT3B0aW9ucykKICAgICAgICBpZiAoJENvbW1hbmRMaW5lU3VmZml4KSB7CiAgICAgICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICRDb21tYW5kTGluZVN1ZmZpeAogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeGVjdXRpbmc6ICQoJEJpbmFyeS5GdWxsTmFtZSkgJCgkQ29tbWFuZExpbmUgLWpvaW4gJyAnKSIKICAgICAgICAkcHJvY2VzcyA9IFtTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzc106OlN0YXJ0KCRCaW5hcnksICRDb21tYW5kTGluZSkKICAgICAgICAkcHJvY2Vzcy5XYWl0Rm9yRXhpdCgpCiAgICAgICAgJHByb2Nlc3MuUmVmcmVzaCgpCiAgICAgICAgcmV0dXJuICRwcm9jZXNzLkV4aXRDb2RlCiAgICB9CgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQo=", "ZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckluc3RhbGwgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIklOU1RBTEwiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkSXNQYXJ0T2ZEb21haW4gPSAoR2V0LVdtaU9iamVjdCBXaW4zMl9Db21wdXRlclN5c3RlbSkuUGFydE9mRG9tYWluCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIklOU1RBTEwiKSwgJHRydWUsICJJTlNUQUxMIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICMkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVwZGF0ZVNvdXJjZSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIkRSRVBMQVlfQ1RMUiIsIkRSRVBMQVlfQ0xUIiwiU05BQ19TREsiLCJTREsiLCJMb2NhbERCIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJPTEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU1BJX0FTX0V4aXN0aW5nRmFybSIsICJTUElfQVNfTmV3RmFybSIsICJBbGxGZWF0dXJlc19XaXRoRGVmYXVsdHMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRFdPV0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVJTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJOb3JtYWwiLCAiQXV0b0FkdmFuY2UiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU0NPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNDT05GSUdESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU0VSVkVSTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNVUxUSURJTUVOU0lPTkFMIiwgIlBPV0VSUElWT1QiLCAiVEFCVUxBUiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgaWYgKCRJc1BhcnRPZkRvbWFpbikgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6VVNFUkRPTUFJTlxBZG1pbmlzdHJhdG9yIikKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1RFTVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTUFJPVklERVJNU09MQVAiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkFSTVBBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJQQVNTUEhSQVNFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQURNSU5JUE9SVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQlJPV1NFUlNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5BQkxFUkFOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNRTERBVEFESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNBUFdEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTRUNVUklUWU1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnJzICgiU1FMIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTEJBQ0tVUERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQ09MTEFUSU9OIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBRERDVVJSRU5UVVNFUkFTU1FMQURNSU4iIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgIGlmICgkSXNQYXJ0T2ZEb21haW4pIHsKICAgICAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNTEVWRUwiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiMCIsICIxIiwgIjIiLCAiMyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNU0hBUkVOQU1FIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ0FDQ09VTlQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIk5QRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlRDUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU0lOU1RBTExNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIlNoYXJlUG9pbnRGaWxlc09ubHlNb2RlIiwgIkRlZmF1bHROYXRpdmVNb2RlIiwgIkZpbGVzT25seU1vZGUiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1N0YXJ0dXBUeXBlIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IGZvciBpbnN0YWxsZXIgdmVyc2lvbiBvZiBNUyBTUUwgU2VydmVyIHByaW9yIHRvIDIwMTIgU1AxIEN1bXVsYXRpdmUgVXBkYXRlIDIgb25seSB0aGUKICAgIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOiBTUUxFbmdpbmUsIFJlcGxpY2F0aW9uLCBGdWxsVGV4dCwgUlMKCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiUHJlcGFyZUltYWdlIiksICR0cnVlLCAiUHJlcGFyZUltYWdlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVFbmFibGVkIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVTb3VyY2UiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKIyAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJSUyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGRUFUVVJFUyIgLUxpc3QgLUNvbnN0cmFpbnRzICgiU1FMIiwiU1FMRW5naW5lIiwiUmVwbGljYXRpb24iLCJGdWxsVGV4dCIsIkRRIiwiQVMiLCJSUyIsIkRRQyIsIklTIiwiTURTIiwiVG9vbHMiLCJCQyIsIkJPTCIsIkJJRFMiLCJDb25uIiwiU1NNUyIsIkFEVl9TU01TIiwiRFJFUExBWV9DVExSIiwiRFJFUExBWV9DTFQiLCJTTkFDX1NESyIsIlNESyIsIkxvY2FsREIiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTSEFSRURESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQU5DRUlEIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2VTUDFVMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgVGhpcyBjbWRsZXQgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9yIGxhdGVyLgoKICAgIE5vdGUgdGhhdCBmb3IgaW5zdGFsbGVyIHZlcnNpb24gb2YgTVMgU1FMIFNlcnZlciBwcmlvciB0byAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9ubHkgdGhlCiAgICBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDogU1FMRW5naW5lLCBSZXBsaWNhdGlvbiwgRnVsbFRleHQsIFJTCgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlByZXBhcmVJbWFnZSIpLCAkdHJ1ZSwgIlByZXBhcmVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlU291cmNlIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJDT05GSUdVUkFUSU9ORklMRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJISURFQ09OU09MRSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk1TU1FMU0VSVkVSIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIkNvbXBsZXRlSW1hZ2UiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IElOU1RBTkNFSUQgcGFyYW1ldGVyIHZhbHVlIE1VU1QgYmUgdGhlIHNhbWUgYXMgc3BlY2lmaWVkIG9uICJQcmVwYXJlSW1hZ2UiIHBoYXNlLgoKICAgIEFsbCBkb2N1bWVudGVkIG9wdGlvbiBhcmUgc3VwcG9ydGVkLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvciBkZXRhaWxzOgogICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKICAgICM+CiAgICAkT3B0aW9uUGFyc2VyID0gTmV3LU9wdGlvblBhcnNlcgoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBQ1RJT04iIC1TdHJpbmcgLUNvbnN0cmFpbnRzICJDb21wbGV0ZUltYWdlIiksICR0cnVlLCAiQ29tcGxldGVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VJRCIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTVJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkhJREVDT05TT0xFIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUdUU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJCUk9XU0VSU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTkFCTEVSQU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQUxMU1FMREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0FQV0QiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNFQ1VSSVRZTU9ERSIgLVN0cmluZyAtQ29uc3RyYWlucnMgKCJTUUwiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxDT0xMQVRJT04iIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1MRVZFTCIgLVN0cmluZyAtQ29uc3RyYWludHMgKCIwIiwgIjEiLCAiMiIsICIzIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1TSEFSRU5BTUUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiTlBFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVENQRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTSU5TVEFMTE1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU2hhcmVQb2ludEZpbGVzT25seU1vZGUiLCAiRGVmYXVsdE5hdGl2ZU1vZGUiLCAiRmlsZXNPbmx5TW9kZSIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDU3RhcnR1cFR5cGUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICByZXR1cm4gJE9wdGlvblBhcnNlcgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVJbWFnZVNQMVUyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiQ29tcGxldGVJbWFnZSIgYWN0aW9uLgoKICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBTUDEgQ2ltaWxhdGl2ZSBVcGRhdGUgMiBvciBsYXRlci4KCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiQ29tcGxldGVJbWFnZSIpLCAkdHJ1ZSwgIkNvbXBsZXRlSW1hZ2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklBQ0NFUFRTUUxTRVJWRVJMSUNFTlNFVEVSTVMiIC1Td2l0Y2gpLCAkdHJ1ZSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFUlJPUlJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUElEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkJST1dTRVJTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOQUJMRVJBTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTUUxEQVRBRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTQVBXRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0VDVVJJVFlNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW5ycyAoIlNRTCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxCQUNLVVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTENPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTUxFVkVMIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIjAiLCAiMSIsICIyIiwgIjMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTVNIQVJFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNBQ0NPVU5UIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJOUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJUQ1BFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNJTlNUQUxMTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJTaGFyZVBvaW50RmlsZXNPbmx5TW9kZSIsICJEZWZhdWx0TmF0aXZlTW9kZSIsICJGaWxlc09ubHlNb2RlIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJVcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckVkaXRpb25VcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlcGFpciB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJSZWJ1aWxkZGF0YWJhc2UgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiSU5TVEFMTCIgYWN0aW9uLgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlVOSU5TVEFMTCIpLCAkdHJ1ZSwgIlVOSU5TVEFMTCIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZFQVRVUkVTIiAtTGlzdCAtQ29uc3RyYWludHMgKCJTUUwiLCJTUUxFbmdpbmUiLCJSZXBsaWNhdGlvbiIsIkZ1bGxUZXh0IiwiRFEiLCJBUyIsIlJTIiwiRFFDIiwiSVMiLCJNRFMiLCJUb29scyIsIkJDIiwiQk9MIiwiQklEUyIsIkNvbm4iLCJTU01TIiwiQURWX1NTTVMiLCJEUkVQTEFZX0NUTFIiLCJEUkVQTEFZX0NMVCIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VOQU1FIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsRmFpbG92ZXJDbHVzdGVyIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVXBncmFkZSB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJBZGROb2RlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlbW92ZU5vZGUgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9Cg==", "SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKZnVuY3Rpb24gVGVzdC1LZXkoW3N0cmluZ10kcGF0aCwgW3N0cmluZ10ka2V5KSB7CiAgICBpZighKFRlc3QtUGF0aCAkcGF0aCkpIHsgcmV0dXJuICRmYWxzZSB9CiAgICBpZiAoKEdldC1JdGVtUHJvcGVydHkgJHBhdGgpLiRrZXkgLWVxICRudWxsKSB7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCmZ1bmN0aW9uIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBNUyBTUUwgU2VydmVyIHByZXJlcXVpc2l0ZXMgKC5OZXQgRnJhbWV3b3JrIDMuNSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgICM+CiAgICBpZiAoLW5vdCAoVGVzdC1LZXkgIkhLTE06XFNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41IiAiSW5zdGFsbCIpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBTZXJ2ZXJNYW5hZ2VyCiAgICAgICAgV3JpdGUtSG9zdCAiLk5ldCBGcmFtZXdvcmsgMy41IG5vdCBmb3VuZC4gSW5zdGFsbGluZyBpdCB1c2luZyBTZXJ2ZXIgTWFuYWdlci4uLiIKICAgICAgICAkRmVhdHVyZSA9IEdldC1XaW5kb3dzRmVhdHVyZSBORVQtRnJhbWV3b3JrCiAgICAgICAgaWYgKCRGZWF0dXJlIC1lcSAkbnVsbCkgewogICAgICAgICAgICAjIFdlIGFyZSBwcm9iYWJseSBvbiBXaW5kb3dzIFNlcnZlciAyMDEyCiAgICAgICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmstQ29yZQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkRmVhdHVyZSkgewogICAgICAgICAgICB0aHJvdyAiLk5ldCBmcmFtZXdvcmsgMy41IGZlYXR1cmUgd2FzIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlLkRpc3BsYXlOYW1lIC1tYXRjaCAiMy41IikgewogICAgICAgICAgICBMb2ctV2FybmluZyAiLk5ldCBmcmFtZXdvcmsgMy41IGlzIHJlcXVpcmVkLCBidXQgJCgkRmVhdHVyZS5EaXNwbGF5TmFtZSkgaXMgYXZhaWxhYmxlIGFzIFdpbmRvd3MgZmVhdHVyZS4gUHJvY2VlZGluZyB3aXRoIGluc3RhbGxhdGlvbiIKICAgICAgICB9CiAgICAgICAgW3ZvaWRdKEFkZC1XaW5kb3dzRmVhdHVyZSAkRmVhdHVyZSkKICAgIH0KfQoKZnVuY3Rpb24gTmV3LVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUSIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiKSArICRFeHRyYUZlYXR1cmVzfSArICRFeHRyYU9wdGlvbnMpCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSB3aXRoIGFsbCBuZWVkZWQgZmVhdHVyZXMgdG8gc2V0IHVwIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCAKICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW4gdW5hdHRlbmRlZCBtb2RlLiBBbGwgZmVhdHVyZXMgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cHMgYXJlCiAgICBpbnN0YWxsZWQuCgogICAgQWxsIGF2YWlsYWJpbGl0eSBncm91cCBtZW1iZXJzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgU1FMU3ZjVXNyRG9tYW4sIFNRTFN2Y1Vzck5hbWUgYW5kIFNRTFN2Y1VzclBhc3N3b3JkIHBhcmFtZXRlcnMuCiAgICBVc2VyIG11c3QgYmUgYSBkb21haW4gdXNlciBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIG5vZGVzIGludGVyY29ubmVjdGlvbi4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JEb21haW4KICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IGRvbWFpbiBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyTmFtZQogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzclBhc3N3b3JkCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgcmVtb3ZlZCBiZXNpZGVzICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JEb21haW4sCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU1FMU3ZjVXNyTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JQYXNzd29yZCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRTUUxVc2VyID0gIiRTUUxTdmNVc3JEb21haW5cJFNRTFN2Y1Vzck5hbWUiCiAgICAkZG9tYWluID0gTmV3LU9iamVjdCBTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuRGlyZWN0b3J5RW50cnkoIkxEQVA6Ly8kU1FMU3ZjVXNyRG9tYWluIiwgJFNRTFN2Y1Vzck5hbWUsICRTUUxTdmNVc3JQYXNzd29yZCkKCiAgICBpZiAoJGRvbWFpbi5uYW1lIC1lcSAkbnVsbCkgewogICAgICAgIHRocm93ICJDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgdXNlciAkU1FMVXNlci4gQ2hlY2sgZG9tYWluLCBsb2dpbiBuYW1lIGFuZCBwYXNzd29yZC4iCiAgICB9CgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIsICJEUkVQTEFZX0NUTFIiLCAiRFJFUExBWV9DTFQiKSArICRFeHRyYUZlYXR1cmVzOwogICAgICAgICJBR1RTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQUdUU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiQVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJBU1NZU0FETUlOQUNDT1VOVFMiID0gJFNRTFVTZXI7CiAgICAgICAgIlNRTFNWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJTUUxTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJTUUxTWVNBRE1JTkFDQ09VTlRTIiA9ICRTUUxVc2VyOyAiSVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiSVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7IAogICAgICAgICJSU1NWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJSU1NWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZH0gKyAkRXh0cmFPcHRpb25zKQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gUmVtb3ZlLVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQKCiAgICAuREVTQ1JJUFRJT04KICAgIFVuaW5zdGFsbHMgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbnN0YWxsZWQgd2l0aCBOZXctU1FMU2VydmVyIGNtZGxldCBpbiB1bmF0dGVuZGVkIG1vZGUKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIHJlbW92ZWQgYmVzaWRlcyAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJVbmluc3RhbGwKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlEiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIikgKyAkRXh0cmFGZWF0dXJlc30pCgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSIKICAgIH0KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgp9CgpmdW5jdGlvbiBJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLiBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sIAogICAgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIi4gTm90ZSB0aGF0IHByaW9yIHRvCiAgICBTUUwgU2VydmVyIHZlcnNpb24gMjAxMiBTZXJ2aWNlIFBhY2sgMSBDdW11bGF0aXZlIFVwZGF0ZSAyIChKYW51YXJ5IDIwMTMpIG9ubHkgIlJlcGxpY2F0aW9uIiwgCiAgICAiRnVsbFRleHQiIGFuZCAiUlMiIG1heSBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gIlNRTEVuZ2luZSIuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yCiAgICBkZXRpYWxzOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU2V0dXBSb290LAogICAgICAgIFthcnJheV0kRXh0cmFGZWF0dXJlcyA9IEAoKQogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICBSZXNvbHZlLVNRTFNlcnZlclByZXJlcXVpc2l0ZXMKCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZQogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUVMiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiKSArICRFeHRyYUZlYXR1cmVzIH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb21wbGV0ZS1TUUxTZXJ2ZXJBZnRlclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgcHJldmlvdXNseSBwcmVwYXJlZCB3aXRoICJJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAiIE1TIFNRTCBTZXJ2ZXIgYWZ0ZXIgdGhlIHN5c3RlbSB3YXMgcmVhcm1lZC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIAogICAgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdAogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsfSkKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxTdHJpbmcgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3RlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3Rlcy4gVGhlIHN0cmluZyBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVycy4KICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNzk4OTkuYXNweAoKICAgIC5QQVJBTUVURVIgUwogICAgU3RyaW5nIHRvIGNvbnZlcnQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlLCBWYWx1ZUZyb21QaXBlbGluZSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTCiAgICApCiAgICAKICAgIHJldHVybiAiJyQoJFMgLXJlcGxhY2UgIiciLCAiJyciKSciCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxOYW1lIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc1ODc0LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgcmV0dXJuICJbJCgkUyAtcmVwbGFjZSAiXSIsICJdXSIpXSIKfQoKZnVuY3Rpb24gSW52b2tlLVNRTFRleHQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dC4gUmV0dXJucyByYXcgU1FMIHNlcnZlciBvdXRwdXQuCgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQoKICAgICNXcml0ZS1XYXJuaW5nICIkU1FMYG4iCiAgICAjcmV0dXJuCgogICAgJEJpbmFyeSA9IEdldC1Db21tYW5kICJzcWxjbWQuZXhlIgoKICAgICR0ZW1wRmlsZSA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICR0ZW1wRmlsZSA9IEdldC1JdGVtICR0ZW1wRmlsZQogICAgU2V0LUNvbnRlbnQgLVBhdGggJHRlbXBGaWxlIC1WYWx1ZSAkU1FMCgogICAgJENvbW1hbmRMaW5lID0gQCgnLWgnLCAnLTEnLCAnLWInLCAnLWknLCAiYCIkKCR0ZW1wRmlsZS5GdWxsTmFtZSlgIiIpCiAgICBpZiAoKCRVc2VyIC1uZSAkbnVsbCkgLWFuZCAoJFVzZXIgLW5lICcnKSkgewogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctVScKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkVXNlcgogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctUCcKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkUGFzc3dvcmQKICAgIH0KCiAgICBXcml0ZS1EZWJ1ZyAiRXhlY3V0aW5nOiBgbiRTUUxgbiIKICAgIFtzdHJpbmddJG91dHB1dCA9ICYkQmluYXJ5ICRDb21tYW5kTGluZQoKICAgICRFeGl0Q29kZSA9ICRMYXN0RXhpdENvZGUKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICBXcml0ZS1XYXJuaW5nICRvdXRwdXQKICAgICAgICB0aHJvdyAiU1FMQ01ELkVYRSByZXR1cm5lZCB3aXRoIGV4aXQgY29kZSAkRXhpdENvZGUgd2hpbGUgcnVubmluZyAkQmluYXJ5ICRDb21tYW5kTGluZSIKICAgIH0KICAgCiAgICBSZW1vdmUtSXRlbSAkdGVtcEZpbGUKCiAgICByZXR1cm4gJG91dHB1dAp9CgpmdW5jdGlvbiBOZXctU1FMVXNlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQp9CgpmdW5jdGlvbiBOZXctUGFzc3dvcmQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyByYW5kb20gcGFzc3dvcmQgb2YgdGhlIHNwZWNpZmllZCBsZW5ndGgKCiAgICAuREVTQ1JJUFRJT04KICAgIFBhc3N3b3JkIGNvbnRhaW5zIHJhbmRvbSBjaGFyYWN0ZXJzIGEteiwgQS1aLCBudW1iZXJzIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMuCiAgICBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbGwgdGhlIHR5cGVzIG9mIHN5bWJvbHMgd2lsbCBiZSBwcmVzZW50IGluIHRoZSBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIExlbmd0aAogICAgRGVzaXJlZCBsZW5ndGggb2YgdGhlIHBhc3N3b3JkLgoKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRMZW5ndGg9NgogICAgKQoKICAgICRSZXN1bHQgPSAiIgogICAgJGFscGhhID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5IUAjJCVeJiooKSdgImBgXytbXVx7fXw7OiwuLzw+P34iCiAgICB3aGlsZSAoJExlbmd0aCAtZ3QgMCkgewogICAgICAgICR4ID0gR2V0LVJhbmRvbSAkYWxwaGEuTGVuZ3RoCiAgICAgICAgJGMgPSAkYWxwaGFbJHhdCiAgICAgICAgJFJlc3VsdCA9ICIkUmVzdWx0JGMiCiAgICAgICAgJExlbmd0aCA9ICRMZW5ndGggLSAxCiAgICB9CiAgICByZXR1cm4gJFJlc3VsdAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5ERVNDUklQVElPTgogICAgTWFzdGVyIGtleSBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeS4gSG9zdCBjZXJ0aWZpY2F0ZSBpcyBjcmVhdGVkIHdoZW4gbmVjZXNzYXJ5IGVpdGhlciAobm9ybWFsbHkgb24gZmlyc3QgZW5kcG9pbnQgY3JlYXRpb24pLgoKICAgIEVuZHBvaW50IGFuZCBjZXJ0aWZpY2F0ZSBhcmUgcmVjcmVhdGVkIGluIGNhc2UgaWYgbWFzdGVyIGtleSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3Qgbm9ybWFsbHkgaGFwcGVuKS4KCiAgICBFbmRwb2ludCBpcyByZWNyZWF0ZWQgaW4gY2FzZSBpZiBjZXJ0aWZpY2F0ZSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyB0aGUgZW5kcG9pbnQgd2FzIGNyZWF0ZWQgbWFudWFsbHkpLgoKICAgIE1pcnJvcmluZyBlbmRwb2ludCBpcyBjcmVhdGVkIHVubGVzcyBvbmUgYWxyZWFkeSBleGlzdHMuIFRoZSBlbmRwb2ludCBpcyBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBXaGVuIHRoZSBlbmRwb2ludAogICAgYWxyZWFkeSBleGlzdHMgaXMgaXMgdW5jaGFuZ2VkLgoKICAgIEVuZHBvaW50IHBvcnQgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseSBhcyA0MDIyIG9yIGFzIGZpcnN0IGF2YWlsYWJsZSBwb3J0IGFmdGVyIDQwMjIgaW4gY2FzZSBpZiA0MDIyIGlzIGFscmVhZHkgbGlzdGVuaW5nLgogICAgSWYgdGhlcmUgaXMgbm8gZmlyZXdhbGwgcnVsZSB3aXRoIG5hbWUgJ0RhdGFiYXNlTWlycm9yaW5nLVRDUC17cG9ydG51bWJlcn0nLCBhbGxvd2luZyBydWxlIGlzIGNyZWF0ZWQuCgogICAgQ2VydGlmaWNhdGUgaXMgc3RvcmVkIGluIHRoZSBzcGVjaWZpZWQgZmlsZS4KCiAgICBSZXR1cm5zIGVuZHBvaW50IGxpc3RlbmluZyBwb3J0LgoKICAgIC5QQVJBTUVURVIgRW5jcnlwdGlvblBhc3N3b3JkCiAgICBFbmNyeXB0aW9uIHBhc3N3b3JkIHVzZWQgdG8gY3JlYXRlIGNlcnRpZmljYXRlLgoKICAgIC5QQVJBTUVURVIgQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgQ2VydGlmaWNhdGUgdGFyZ2V0IGZpbGUgbmFtZS4gRmlsZSBNVVNUIE5PVCBleGlzdC4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRDZXJ0aWZpY2F0ZUZpbGVOYW1lCiAgICApCgogICAgJEVuZHBvaW50TmFtZSA9ICdNaXJyb3JpbmdFbmRwb2ludCcKCiAgICAkRm9sZGVyID0gR2V0LUl0ZW0gJFdvcmtEaXIKCiAgICAkSCA9ICRFbnY6Q09NUFVURVJOQU1FIC1yZXBsYWNlICdbXkEtWmEtejAtOV9dJywgJ18nCgogICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0IDQwMjIKCiAgICAkQ3JlYXRlTWFzdGVyS2V5ID0gIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5bW1ldHJpY19rZXlzIHdoZXJlIG5hbWUgPSAnIyNNU19EYXRhYmFzZU1hc3RlcktleSMjJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBNQVNURVIgS0VZIEVOQ1JZUFRJT04gQlkgUEFTU1dPUkQgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJEVuY3J5cHRpb25QYXNzd29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X2NlcnQgV0lUSCBTVUJKRUNUID0gJyR7SH0gZW5kcG9pbnQgY2VydGlmaWNhdGUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIEJBQ0tVUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQgVE8gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJENlcnRpZmljYXRlRmlsZU5hbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBwb3J0IGludAogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoU0VMRUNUICogRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSBwb3J0IEZST00gc3lzLnRjcF9lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIEVORCBFTFNFCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgRU5EUE9JTlQgJChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFID0gU1RBUlRFRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTIFRDUCAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJU1RFTkVSX1BPUlQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIExJU1RFTkVSX0lQID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0VfTUlSUk9SSU5HICggCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhFTlRJQ0FUSU9OID0gQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgRU5DUllQVElPTiA9IFJFUVVJUkVEIEFMR09SSVRITSBBRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBST0xFID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAncG9ydDooJyArIENPTlZFUlQoVkFSQ0hBUiwgYEBwb3J0KSArICcpJyBhcyBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRDcmVhdGVNYXN0ZXJLZXkKICAgIFtpbnRdJFBvcnQgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipwb3J0OlwoKFteKV0qKVwpLionLCAnJDEnCgogICAgIyBPcGVuIHBvcnQgaW4gV2luZG93cyBGaXJld2FsbAoKICAgICRQb3J0T3BlbiA9ICRmYWxzZQogICAgJFJ1bGVOYW1lID0gIkRhdGFiYXNlTWlycm9yaW5nLVRDUC0kUG9ydCIKICAgIEdldC1OZXRGaXJld2FsbFJ1bGUgfCBGb3JlYWNoLU9iamVjdCB7CiAgICAgICAgaWYgKCRfLk5hbWUgLWVxICRSdWxlTmFtZSkgewogICAgICAgICAgICAkUG9ydE9wZW4gPSAkdHJ1ZQogICAgICAgIH0KICAgIH0KICAgIGlmICgtbm90ICRQb3J0T3BlbikgewogICAgICAgICREaXNwbGF5TmFtZSA9ICJNUyBTUUwgRGF0YWJhc2UgTWlycm9yaW5nIEVuZHBvaW50IGF0IFRDUCBwb3J0ICRQb3J0IgogICAgICAgIE5ldy1OZXRGaXJld2FsbFJ1bGUgLU5hbWUgJFJ1bGVOYW1lIC1EaXNwbGF5TmFtZSAkRGlzcGxheU5hbWUgLURlc2NyaXB0aW9uICREaXNwbGF5TmFtZSAtUHJvdG9jb2wgVENQIC1Mb2NhbFBvcnQgJFBvcnQgLUVuYWJsZWQgVHJ1ZSAtUHJvZmlsZSBBbnkgLUFjdGlvbiBBbGxvdwogICAgfQogICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIENvbXBsZXRlLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBtaXJyb3JpbmcgZW5kcG9pbnQKCiAgICAuREVTQ1JJUFRJT04KICAgIEFsbG93cyBpbmJvdW5kIGNvbm5lY3Rpb25zIGZyb20gcmVtb3RlIGhvc3QKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TG9naW4sCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFVzZXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFBhc3N3b3JkCiAgICApCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRSZW1vdGVXb3JrRGlyCiAgICAkUmVtb3RlV29ya0RpciA9ICRGb2xkZXIuRnVsbE5hbWUKCiAgICAkSCA9ICRSZW1vdGVIb3N0TmFtZSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgIGlmICgtbm90ICRSZW1vdGVIb3N0TG9naW4pIHsKICAgICAgICAkUmVtb3RlSG9zdExvZ2luID0gIiR7SH1fbG9naW4iCiAgICB9CiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdFVzZXIpIHsKICAgICAgICAkUmVtb3RlSG9zdFVzZXIgPSAiJHtIfV91c2VyIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RQYXNzd29yZCkgewogICAgICAgICRSZW1vdGVIb3N0UGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKICAgIH0KCiAgICAkU1FMID0gICAgICAgICAgICAgIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnNxbF9sb2dpbnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RMb2dpbikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSBXSVRIIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0UGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuc3lzdXNlcnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RVc2VyKSkKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBVU0VSICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RVc2VyKSBGT1IgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWU9JyR7SH1fcmVtb3RlX2NlcnQnKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIENFUlRJRklDQVRFICR7SH1fcmVtb3RlX2NlcnQgQVVUSE9SSVpBVElPTiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRlJPTSBGSUxFID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAnbmFtZTooJyArIGBAbmFtZSArICcpJyBhcyBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICIKCiAgICAkcmF3ZGF0YSA9IEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTAogICAgJEVuZHBvaW50TmFtZSA9ICRyYXdkYXRhIC1yZXBsYWNlICcuKm5hbWU6XCgoW14pXSopXCkuKicsICckMScKICAgICRTUUwgPSAgICAgICAgICAgICAiR1JBTlQgQ09OTkVDVCBPTiBFTkRQT0lOVDo6JChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKSBUTyAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0TG9naW4pIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTCkKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMTWlycm9yIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBjcmVhdGlvbiBvZiBtaXJyb3JlZCBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSBmaXJzdCBleGVjdXRlZCBvbiBtaXJyb3Igc2VydmVyIGFuZCB0aGVuIG9uIHByaW5jaXBhbCBzZXJ2ZXIuCiAgICBPdGhlcndpc2UgaXQgd2lsbCBmYWlsIChob3dldmVyIGl0IG1heSBiZSBleGVjdXRlZCBhZ2FpbiB3aXRoIG5vIGhhcm0pLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbSW50XSRSZW1vdGVQb3J0LAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgICRVcmwgPSAiVENQOi8vJHtSZW1vdGVIb3N0TmFtZX06JHtSZW1vdGVQb3J0fSIKICAgICRBbHRlckRiID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIFBBUlRORVIgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJFVybCk7CiAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRiKQp9CgpmdW5jdGlvbiBOZXctU1FMRGF0YWJhc2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBlbXB0eSBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlIHdpdGggZGVmYXVsdCBzZXR0aW5ncy4gRmFpbHMgaW4gY2FzZSBpcyB0aGUgZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIERhdGFiYXNlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBtZGZGaWxlCiAgICBOYW1lIG9mIHRoZSBNREYgKGRhdGEpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX0ubWRmIgogICAgV2hlcmUge0RhdGFCYXNlUGF0aE5hbWV9IGlzIGRhdGFiYXNlIG5hbWUgd2l0aCBhbGwgYnV0IEEtWiwgYS16LCAwLTkgY2hhcmFjdGVycwogICAgcmVwbGFjZWQgYnkgdW5kZXJzY29yZS4KCiAgICAuUEFSQU1FVEVSIERhdGFCYXNlTmFtZQogICAgTmFtZSBvZiB0aGUgTERGICh0cmFuc2FjdGlvbiBsb2cpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZSwKICAgICAgICBbU3RyaW5nXSRtZGZGaWxlPSRudWxsLAogICAgICAgIFtTdHJpbmddJGxkZkZpbGU9JG51bGwKICAgICkKCiAgICAkRGF0YUJhc2VQYXRoTmFtZSA9ICREYXRhQmFzZU5hbWUgLXJlcGxhY2UgJ1teMC05YS16QS1aXScsICdfJwogICAgaWYgKC1ub3QgJG1kZkZpbGUpIHsKICAgICAgICAkbWRmRmlsZSA9ICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVwke0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIH0KICAgIGlmICgtbm90ICRsZGZGaWxlKSB7CiAgICAgICAgJGxkZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfV9sb2cubGRmIgogICAgfQoKICAgICROZXdEYXRhYmFzZSA9ICIKICAgICAgICBDUkVBVEUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgICAgICAgICAgQ09OVEFJTk1FTlQgPSBOT05FCiAgICAgICAgICAgICAgICBPTiAgUFJJTUFSWSAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkRGF0YUJhc2VOYW1lKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRtZGZGaWxlKSAsIFNJWkUgPSA0MDk2S0IgLCBGSUxFR1JPV1RIID0gMTAyNEtCICkKICAgICAgICAgICAgICAgIExPRyBPTiAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJHtEYXRhQmFzZU5hbWV9X2xvZyIpLCBGSUxFTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJGxkZkZpbGUpICwgU0laRSA9IDEwMjRLQiAsIEZJTEVHUk9XVEggPSAxMCUpCiAgICAgICAgR08KICAgICAgICBVU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgIEdPCiAgICAgICAgSUYgTk9UIEVYSVNUUyAoU0VMRUNUIG5hbWUgRlJPTSBzeXMuZmlsZWdyb3VwcyBXSEVSRSBpc19kZWZhdWx0PTEgQU5EIG5hbWUgPSBOJ1BSSU1BUlknKSBBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIE1PRElGWSBGSUxFR1JPVVAgW1BSSU1BUlldIERFRkFVTFQKICAgICAgICBHTyIKCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkTmV3RGF0YWJhc2UpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCAodGhpcyBpcyBhYnNvbHV0ZWx5IHN5bW1ldHJpYyBzdGVwIHRvIHRoZSBtaXJyb3IgaW5pdCkuIEluIGFkZGl0aW9uIHRvIHRoYXQgaXQgY3JlYXRlcwogICAgYSBkYXRhYmFzZSBhbmQgc3RvcmVzIGJhY2t1cHMgb2YgaXQgYW5kIGl0cyB0cmFuc2FjdGlvbiBsb2cgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBlbmRwb2ludCBjZXJ0aWZpY2F0ZS4KCiAgICBBIGZpcmV3YWxsIHJ1bGUgaXMgY3JlYXRlZCBmb3IgZW5kcG9pbnQgaWYgbmVjZXNzYXJ5LgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBtaXJyb3Igc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIGJlIHVzZSBhdCBtaXJyb3Igc2VydmVyIGVpdGhlci4KICAgIAogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQogICAgaWYgKChHZXQtQ2hpbGRJdGVtIC1QYXRoICRXb3JrRGlyKS5MZW5ndGggLWd0IDApIHsKICAgICAgICB0aHJvdyAiV29ya2luZyBkaXJlY3RvcnkgJFdvcmtEaXIgaXMgbm90IGVtcHR5IgogICAgfQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCiAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQoKICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsIE5BTUUgPSBOJ0Z1bGwgRGF0YWJhc2UgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAkQmFja3VwTG9nID0gIkJBQ0tVUCBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlX2xvZy5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCAgTkFNRSA9IE4nVHJhbnNhY3Rpb24gTG9nICBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAobWlycm9yKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIG1pcnJvciBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpcgogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAzKQoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIG1pcnJvciBjcmVhdGlvbi4gVGhpcyBzdGVwIG11c3QgYmUgZ2xvYmFsbHkgdGhlIGxhc3Qgb25lIGluIG1pcnJvciBjcmVhdGlvbiBzZXF1ZW5jZS4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZSBhbmQgbmFtZSBwcm92aWRlZCBvbiBzdGVwIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UxKQoKICAgIC5ERVNDUklQVElPTgogICAgSW5pdGlhbGl6ZXMgbWlycm9yaW5nIGVuZHBvaW50IGZvciBtaXJyb3Igc2VydmVyLiBTdG9yZXMgbWlycm9yaW5nIGVuZHBvaW50IGNlcnRpZmljYXRlIGluIFdvcmtkaXIuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5kIGRpcmVjdG9yeS4gVGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRyYW5mZXJyZWQgdG8gdGhlIHByaW5jaXBhbCBzZXJ2ZXIgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMikKCiAgICAuREVTQ1JJUFRJT04KICAgIEltcG9ydHMgcmVtb3RlIHNlcnZlciBjZXJ0aWZpY2F0ZSBhbmQgZ3JhbnRzIGl0IHdpdGggYWNjZXNzIHRvIHRoZSBtaXJyb3JpbmcgZW5kcG9pbnQuCiAgICBSZXN0b3JlcyBkYXRhYmFzZSBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBhbmQgbGVhdmVzIGl0IGluICdSZXN0b3JpbmcnIHN0YXRlLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKCiAgICAkUmVzdG9yZURiID0gIlJFU1RPUkUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2UuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRSZW1vdGVXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGV4ZWN1dGVkIHN0cmljdGx5IGJlZm9yZSBzeW1tZXRyaWMgc3RlcCBvbiB0aGUgcHJpbmNpcGFsLgoKICAgIE5vdGUgdGhhdCB0aGUgcmVtb3RlIGhvc3QgY2VydGlmaWNhdGUgaXMgdmFsaWQgZnJvbSB0aGUgdGltZSBpdCBpcyBjcmVhdGVkIHRoZXJlLiBTbwogICAgdGhpcyBzdGVwIHdpbGwgZmFpbCBpZiB0aGVyZSBpcyBub3RpY2FibGUgZGlmZmVyZW50IGluIHRpbWUgbG9jYWwgYW5kIHJlbW90ZSBtYWNoaW5lcy4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbaW50XSRwb3J0ID0gR2V0LUNvbnRlbnQgIiR7UmVtb3RlV29ya0Rpcn1cZW5kcG9pbnQtcG9ydC50eHQiCiAgICBDb21wbGV0ZS1TUUxNaXJyb3IgJFJlbW90ZUhvc3ROYW1lICRwb3J0ICREYXRhYmFzZU5hbWUKfQoKZnVuY3Rpb24gR2V0LU5leHRGcmVlUG9ydCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBSZXR1cm5zIHNwZWNpZmllZCBkZXNpcmVkIHBvcnQgb3IgY2xvc2VzdCBuZXh0IG9uZSB1bm9jY3VwaWVkLgoKICAgIC5QQVJBTUVURVIgUG9ydAogICAgRGVzaXJlZCBwb3J0IG51bWJlci4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtpbnRdJFBvcnQKICAgICkKICAgICRPcGVuUG9ydHMgPSBuZXRzdGF0IC1hb24gfCBzZWxlY3Qtc3RyaW5nICdMSVNURU5JTkcnIHwgRm9yZWFjaC1PYmplY3QgeyAoKCRfIC1yZXBsYWNlICdeXHMqJywgJycgLXNwbGl0ICdccysnKVsxXSAtc3BsaXQgJy4qOicpWzFdIH0gfCBTb3J0LU9iamVjdCB8IEdldC1VbmlxdWUKICAgIHdoaWxlICgkT3BlblBvcnRzLkNvbnRhaW5zKCR7UG9ydH0pKSB7CiAgICAgICAgJFBvcnQgPSAkUG9ydCArIDEKICAgIH0KICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluaXRpYWxpemVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlciBhbmQgY3JlYXRlcyBBbHdheXNPbiBlbmRwb2ludCBsaXN0ZW5lci4gUmV0dXJucyBBbHdheXNPbiBlbmRwb2ludCBwb3J0IG51bWJlci4KCiAgICAuREVTQ1JJUFRJT04KICAgIEVuYWJsZXMgQWx3YXlzT24gY2x1c3RlcmluZyBvbiBsb2NhbCBTUUwgc2VydmVyLiBDcmVhdGVzIEFsd2F5c09uIFRDUCBlbmRwb2ludCBvbiBwb3J0IDUwMjIgb3IgZ3JlYXRlciBpZiB0aGUgb25lIGlzIG9jY3VwaWVkLiAgIAogICAgIz4KCiAgICBpZiAoIShUZXN0LVBhdGggU1FMU0VSVkVSOlwpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBzcWxwcwogICAgfQogICAgJE1hY2hpbmVOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUwpWzBdLlBTQ2hpbGROYW1lCiAgICAkSW5zdGFuY2VOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lKS5QU0NoaWxkTmFtZQogICAgJEFsd2F5c09uRW5hYmxlZCA9ICgoR2V0LUl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lXCRJbnN0YW5jZU5hbWUpIHwgc2VsZWN0IElzSGFkckVuYWJsZWQpLklzSGFkckVuYWJsZWQKICAgIGlmICgtbm90ICRBbHdheXNPbkVuYWJsZWQpIHsKICAgICAgICBFbmFibGUtU3FsQWx3YXlzT24gLVBhdGggIlNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lIiAtRm9yY2UKICAgIH0KICAgICRJbnN0YW5jZSA9IEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICAkZW5kcG9pbnQgPSAkSW5zdGFuY2UuRW5kcG9pbnRzWyJBbHdheXNPbkVuZHBvaW50Il0KICAgIGlmICgtbm90ICRlbmRwb2ludCkgewogICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA1MDIyCiAgICAgICAgJGVuZHBvaW50ID0gTmV3LVNxbEhhZHJFbmRwb2ludCBBbHdheXNPbkVuZHBvaW50IC1Qb3J0ICRQb3J0IC1QYXRoIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICB9IGVsc2UgewogICAgICAgICRQb3J0ID0gJGVuZHBvaW50LlByb3RvY29sLlRjcC5MaXN0ZW5lclBvcnQKICAgIH0gCiAgICBpZiAoJGVuZHBvaW50LkVuZHBvaW50U3RhdGUgLW5lICJTdGFydGVkIikgewogICAgICAgICRlbmRwb2ludC5TdGFydCgpCiAgICB9ICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbmV3IEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBvbiBwcmltYXJ5IHJlcGxpY2EuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSByZXBsaWNhIHNlcnZlcihzKSBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgQXZhaWxhYmlsaXR5IGdyb3VwIG5hbWUuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWVzCiAgICBSZXBsaWNhIGRhdGFiYXNlKHMpIG5hbWVzLgoKICAgIC5QQVJBTUVURVIgUmVwbGljYURlZnMKICAgIEFycmF5IG9mIHJlcGxpY2EgZGVmaW5pdGlvbi4gRWFjaCBkZWZpbml0aW9uIGlzIGEgaGFzaCB0YWJsZSB3aXRoIHJlcGxpY2Etc3BlY2lmaWMgdmFsdWVzLgogICAgCiAgICBNYW5kYXRvcnkgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW1N0cmluZ10gU0VSVkVSX0lOU1RBTkNFICAgLSBSZXBsaWNhIHNlcnZlciBpbnN0YW5jZSBuYW1lCiAgICAgICAgKiBbU3RyaW5nXSBFTkRQT0lOVF9VUkwgICAgICAtIFJlcGxpY2Egc2VydmVyIGVuZHBvaW50IFVSTC4gTm9ybWFsbHkgaXQgaXMgVENQOi8vZnVsbHkucXVhbGlmaWVkLmRvbWFpbi5uYW1lOjUwMjIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQgbnVtYmVyIHNob3VsZCBiZSBvYnRhaW5lZCB3aXRoIEluaXRpYWxpemUtQWx3YXlzT24gYXQgdGhlIHJlcGxpY2Egc2VydmVyCiAgICAgICAgKiBbU3RyaW5nXSBBVkFJTEFCSUxJVFlfTU9ERSAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiU1lOQ0hST05PVVNfQ09NTUlUIiBvciAiQVNZTkNIUk9OT1VTX0NPTU1JVCIgb25seS4KICAgICAgICAqIFtTdHJpbmddIEZBSUxPVkVSX01PREUgICAgIC0gUmVwbGljYSBhdmFpbGFiaWxpdHkgbW9kZS4gQ2FuIGJlICJNQU5VQUwiIG9yICJBVVRPTUFUSUMiIG9ubHkuCgogICAgT3B0aW9uYWwgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW0ludGVnZXJdIEJBQ0tVUF9QUklPUklUWSAgICAgICAgICAtIEJhY2t1cCBwcmlvcml0eQogICAgICAgICogW0ludGVnZXJdIFNFU1NJT05fVElNRU9VVCAgICAgICAgICAtIFNlc3Npb24gdGltZW91dAogICAgICAgICogW1N0cmluZ10gIFBfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlByaW1hcnkiIHJlcGxpY2EgbW9kZS4gQ2FuIGJlICJSRUFEX1dSSVRFIiBvciAiQUxMIiBvbmx5LgogICAgICAgICogW0FycmF5XSAgIFBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCAtIExpc3Qgb2YgcmVwbGljYXMgcHJvdmlyaW5nIHJlYWRvbmx5IGFjY2VzcyB3aGVuIHRoaXMgb25lIGlzIHByaW1hcnkuCiAgICAgICAgKiBbU3RyaW5nXSAgU19BTExPV19DT05ORUNUSU9OUyAgICAgIC0gQWxsb3dlZCBjb25uZWN0aW9uIHR5cGVzIGZvciAiU2Vjb25kYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSBvbmUgb2YgIk5PIiwgIlJFQURfT05MWSIsICJBTEwiLgogICAgICAgICogW1N0cmluZ10gIFNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMICAtIFJlcGxpY2EgcmVhZC1vbmx5IHJlcXVlc3RzIGxpc3RlbmVyIFVSTC4gTm9ybWFsbHkgZGVmYXVsdCBzZXJ2ZXIgbGlzdGVuZXIgYXQgcG9ydCAxNDMzIGlzIHVzZWQuCgogICAgLlBBUkFNRVRFUiBQcmVmZXJlbmNlcwogICAgSGFzaCB0YWJsZSBvZiBnZW5lcmFsIGF2YWlsYWJpbGl0eSBncm91cCBwcmVmZXJlbmNlcy4gQWxsIHRoZSBrZXlzIGFyZSBvcHRpb25hbC4gU3VwcG9ydGVkIGVudHJ5IGtleXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddICBBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UgLSBBdXRvbWF0ZWQgYmFja3VwIHByZWZlcmVuY2UuIENhbiBiZSAiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiIG9yICJOT05FIi4KICAgICAgICAqIFtTdHJpbmddICBGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCAgICAgLSBGYWlsdXJlIGNvbmRpdGlvbiBsZXZlbC4gQ2FuIGJlICIxIiwgIjIiLCAiMyIsICI0IiBvciAiNSIuCiAgICAgICAgKiBbSW50ZWdlcl0gSEVBTFRIX0NIRUNLX1RJTUVPVVQgICAgICAgIC0gUmVwbGljYSBoZWFsdGggY2hlY2sgdGltZW91dC4KCiAgICAuUEFSQU1FVEVSIExpc3RlbmVyRGVmCiAgICBIYXNoIHRhYmxlIGNvbnRhaW5pbmcgYXZhaWxhYmlsaXR5IGdyb3VwIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24uCgogICAgTWFuZGF0b3J5IGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKCiAgICAgICAgW1N0cmluZ10gTkFNRSAtIExpc3RlbmVyIG5hbWUuCgogICAgT3B0aW9uYWwgbGlzdGVuZXIgY29uZmlndXJhdGlvbiB2YWx1ZXMgYXJlOgogICAgCiAgICAgICAgW1N0cmluZ10gUE9SVCAtIExpc3RlbmVyIHBvcnQgbnVtYmVyLiBJbnRlZ2VyIHZhbHVlIG1heSBiZSBzdWZmaXhlZCBieSBhICIrIiBzeW1vbCAoc3VjaCBhcyAiNTAyMisiKSB3aGljaCBhbGxvd3MgdGhlIHJvdXRpbmUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IG5leHQgZnJlZSBwb3J0IHdpdGggbnVtYmVyIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgICBbU3RyaW5nXSBESENQIC0gREhDUCBsaXN0ZW5lciBhZGRyZXNzIGNvbmZpZ3VyYXRpb24gZmxhZy4gV2hlbiBhbnkgdmFsdWUgc3BlY2lmaWVkLCBESENQIGlzIHVzZWQgdG8gY29uZmlndXJlIGxpc3RlbmVyCiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGlzIGFsc28gdGhlIGRlZmF1bHQgYmVoYXZpb3IpLiBBbHNvLCBhIHNwZWNpZmljIGludGVyZmFjZSBmb3IgREhDUCBtYXkgYmUgc3BlY2lmaWVkIGFzIElQX0FERFJFU1MvTUFTSwogICAgICAgICAgICAgICAgICAgICAgICAobGlrZSAiMTkyLjE2OC4xLjAvMjU1LjI1NS4yNTUuMCIpIGFzIGEgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KICAgICAgICBbQXJyYXldIFNUQVRJQyAtIFN0YXRpYyBJUCBhZGRyZXNzZXMgdG8gbGlzdGVuLiBJUCBhZGRyZXNzZXMgbWF5IGJlIElQdjQgYWRkcmVzc2VzIGluIHRoZSAiSVBfQUREUkVTUy9NQVNLIiBmb3JtIG9yIElQdjYKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VzIGluIHN0YW5kYXJkIElQdjYgbm90YXRpb24uCgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9mZjg3ODM5OS5hc3B4IHBhZ2UgZm9yIG1vcmUgZGV0YWlscyByZWdhcmRpbmcgYWxsIHRoZSBzdXBwb3J0ZWQgb3B0aW9ucy4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtBcnJheV0kRGF0YWJhc2VOYW1lcywKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJFJlcGxpY2FEZWZzLAogICAgICAgIFtwYXJhbWV0ZXJdCiAgICAgICAgW0hhc2h0YWJsZV0kUHJlZmVyZW5jZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0hhc2h0YWJsZV0kTGlzdGVuZXJEZWYKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkUXVvdGVkREJOYW1lcyA9ICgkRGF0YWJhc2VOYW1lcyB8IEZvckVhY2gtT2JqZWN0IHsgQ29udmVydFRvLVNRTE5hbWUgJF8gfSkgLWpvaW4gIiwgIgoKICAgIGlmICgkUHJlZmVyZW5jZXMgLWVxICRudWxsKSB7CiAgICAgICAgJFByZWZlcmVuY2VzID0gQCgpCiAgICB9CiAgICAkUHJlZnMgPSBAKCkKICAgIGZvcmVhY2goJFByZWYgaW4gJFByZWZlcmVuY2VzKSB7CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgJG51bGwpIHsKICAgICAgICAgICAgQ29udGludWUKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgIkFVVE9NQVRFRF9CQUNLVVBfUFJFRkVSRU5DRSIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCJQUklNQVJZIiwgIlNFQ09OREFSWV9PTkxZIiwgIlNFQ09OREFSWSIsICJOT05FIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAkUHJlZi5LZXkpCiAgICAgICAgfSBlbHNlaWYgKCRQcmVmLktleSAtZXEgIkZBSUxVUkVfQ09ORElUSU9OX0xFVkVMIikgewogICAgICAgICAgICAkUHJlZnMgPSAkUHJlZnMgKyAoVmFsaWRhdGUtT3B0aW9uICRQcmVmLktleSwgJFByZWYuVmFsdWUsIEAoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJIRUFMVEhfQ0hFQ0tfVElNRU9VVCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLUludE9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93ICJVbmV4cGVjdGVkIHBlZmVyZW5jZXMgb3B0aW9uOiAnJCgkUHJlZi5LZXkpJyIKICAgICAgICB9CiAgICB9CgogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICRSZXBsaWNhRGVmcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkUkRlZiA9ICRSZXBsaWNhRGVmc1skaV0KICAgICAgICBpZiAoJFJEZWYuR2V0VHlwZSgpLk5hbWUgLW5lICJIYXNodGFibGUiKSB7CiAgICAgICAgICAgIHRocm93ICJBbGwgZWxlbWVudHMgb2YgUmVwbGljYURlZnMgYXJyYXkgc2hvdWxkIGJlIEhhc2h0YWJsZXMiCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYU9wdHMgPSBAKCkKCiAgICAgICAgIyBNYW5kYXRvcnkgb3B0aW9ucwogICAgICAgICRSZXBsaWNhTmFtZSA9IFZhbGlkYXRlLURlZmluZWRPcHRpb24gIlNFUlZFUl9JTlNUQU5DRSIgJFJEZWZbIlNFUlZFUl9JTlNUQU5DRSJdCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLURlZmluZWRPcHRpb24gIkVORFBPSU5UX1VSTCIgJFJEZWZbIkVORFBPSU5UX1VSTCJdIHwgQ29udmVydFRvLVNRTFN0cmluZyB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJFTkRQT0lOVF9VUkwiKQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1PcHRpb24gIkFWQUlMQUJJTElUWV9NT0RFIiAkUkRlZlsiQVZBSUxBQklMSVRZX01PREUiXSBAKCJTWU5DSFJPTk9VU19DT01NSVQiLCAiQVNZTkNIUk9OT1VTX0NPTU1JVCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFWQUlMQUJJTElUWV9NT0RFIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJGQUlMT1ZFUl9NT0RFIiAkUkRlZlsiRkFJTE9WRVJfTU9ERSJdIEAoIkFVVE9NQVRJQyIsICJNQU5VQUwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJGQUlMT1ZFUl9NT0RFIikKCiAgICAgICAgIyBPcHRpb25hbCBvcHRpb25zCiAgICAgICAgaWYgKCRSRGVmWyJCQUNLVVBfUFJJT1JJVFkiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiQkFDS1VQX1BSSU9SSVRZIiAkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQkFDS1VQX1BSSU9SSVRZIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJTRVNTSU9OX1RJTUVPVVQiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiU0VTU0lPTl9USU1FT1VUIiAkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiU0VTU0lPTl9USU1FT1VUIikKICAgICAgICB9CgogICAgICAgICRTZWNvbmRhcnlSb2xlID0gQCgpCiAgICAgICAgaWYgKCRSRGVmWyJTX0FMTE9XX0NPTk5FQ1RJT05TIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJTX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIEAoIk5PIiwgIlJFQURfT05MWSIsICJBTEwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBTExPV19DT05ORUNUSU9OUyIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFNlY29uZGFyeVJvbGUgPSAkU2Vjb25kYXJ5Um9sZSArICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFNlY29uZGFyeVJvbGUuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArICgiKCAkKCRTZWNvbmRhcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFQ09OREFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRQcmltYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJQX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIEAoIlJFQURfV1JJVEUiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoKCgkUkRlZlsiUF9SRUFEX09OTFlfUk9VVElOR19MSVNUIl0gfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxTdHJpbmcgJF8gfSkgLWpvaW4gJywgJykgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFByaW1hcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkUHJpbWFyeVJvbGUgLWpvaW4gJywgJykgKSIgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiUFJJTUFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSArCiAgICAgICAgICAgICMgIFRDUDovL2JyYXZvLm11cmFuby5sb2NhbDo1MDIyCiAgICAgICAgICAgICJOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZXBsaWNhTmFtZSkgV0lUSCAoJCgkUmVwbGljYU9wdHMgLWpvaW4gJywgJykpIgogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9ucyA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSAtam9pbiAiLGByYG4gICAgICAgICI7CgogICAgaWYgKCRMaXN0ZW5lckRlZlsiREhDUCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXS5tYXRjaGVzKCJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikpIHsKICAgICAgICAgICAgKCRJcEFkZHIsICRNYXNrKSA9ICRMaXN0ZW5lckRlZlsiREhDUCJdIC1zcGxpdCAiLyIKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIE9OICggJElwQWRkciwgJE1hc2sgKSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBbYXJyYXldJElQQWRkcmVzc2VzID0gJExpc3RlbmVyRGVmWyJTVEFUSUMiXQogICAgICAgIGlmICgoJElQQWRkcmVzc2VzIC1lcSAkbnVsbCkgLW9yICgkSVBBZGRyZXNzZXMuQ291bnQgLWVxIDApKSB7CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9IEAoKQogICAgICAgICAgICBmb3JlYWNoICgkSXBPcHRpb24gaW4gJElQQWRkcmVzc2VzKSB7CiAgICAgICAgICAgICAgICAjIElQdjQKICAgICAgICAgICAgICAgIGlmICgkSXBPcHRpb24gLW1hdGNoICJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikgewogICAgICAgICAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkSXBPcHRpb24gLXNwbGl0ICIvIgogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwQWRkciksICQoQ29udmVydFRvLVNRTFN0cmluZyAkTWFzaykgKSIKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBJUHY2CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXigoKD89KD8+Lio/OjopKD8hLio6OikpKSg6Oik/KFswLTlBLUZdezEsNH06Oj8pezAsNX18KFswLTlBLUZdezEsNH06KXs2fSkoXDIoWzAtOUEtRl17MSw0fSg6Oj98JCkpezAsMn18KCgyNVswLTVdfCgyWzAtNF18MVxkfFsxLTldKT9cZCkoXC58JCkpezR9fFswLTlBLUZdezEsNH06WzAtOUEtRl17MSw0fSkoPzwhW146XTp8XC4pXHoiKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSAkQ29udmVydGVkT3B0cyArICIoICQoQ29udmVydFRvLVNRTFN0cmluZyAkSXBPcHRpb24pICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93ICJNYWxmb3JtZWQgSVB2NC9JUHY2IGFkZHJlc3M6ICRJcE9wdGlvbiIKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIklQICggJCgkQ29udmVydGVkT3B0cyAtam9pbiAnLCAnKSApIgogICAgICAgIH0KICAgIH0KICAgIGlmICgoJExpc3RlbmVyRGVmWyJOQU1FIl0gLWVxICRudWxsKSAtb3IgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXlxzKiQiKSkgewogICAgICAgIHRocm93ICJMaXN0ZW5lciBuYW1lIGlzIHJlcXVpcmVkIgogICAgfQogICAgaWYgKC1ub3QgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXltBLVphLXowLTlcLl9cLV0rJCIpKSB7CiAgICAgICAgdGhyb3cgIklsbGVnYWwgbGlzdGVuZXIgbmFtZS4gSXQgY2FuIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgZGFzaGVzICgtKSwgYW5kIGh5cGhlbnMgKF8pLCBpbiBhbnkgb3JkZXIuIgogICAgfQogICAgJFBvcnQgPSAkbnVsbAogICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkK1wrIikgewogICAgICAgICAgICAkU3RhcnRpbmdQb3J0ID0gJExpc3RlbmVyRGVmWyJQT1JUIl0gLXJlcGxhY2UgIlwrIiwgIiIKICAgICAgICAgICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0ICRTdGFydGluZ1BvcnQKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJFBvcnQiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1tYXRjaCAiXGQrIikgewogICAgICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCBwb3J0IHZhbHVlOiAkKCRMaXN0ZW5lckRlZlsiUE9SVCJdKSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRMaXN0ZW5lciA9ICJMSVNURU5FUiAnJCgkTGlzdGVuZXJEZWZbIk5BTUUiXSknICggV0lUSCAkTGlzdGVuZXJBZGRyICkiCgogICAgJE5hbWUgfCBPdXQtRmlsZSAiJFdvcmtEaXJcYXZncm91cC5uYW1lIgogICAgCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICREYXRhYmFzZU5hbWVzLkxlbmd0aDsgJGkrKykgewogICAgICAgICREYXRhQmFzZU5hbWUgPSAkRGF0YWJhc2VOYW1lc1skaV0KICAgICAgICAkRGF0YUJhc2VOYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGRiJGkubmFtZSIKICAgICAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQogICAgICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAgICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJHtpfS5sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBpZiAoJFByZWZzLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICRQcmVmc0xpbmUgPSAiV0lUSCAoICQoJFByZWZzIC1qb2luICcsICcpICkiCiAgICB9IGVsc2UgewogICAgICAgICRQcmVmc0xpbmUgPSAiIgogICAgfQogICAgJFNRTCA9ICJDUkVBVEUgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJE5hbWUpICRQcmVmc0xpbmUKICAgICAgICAgICAgICAgIEZPUiBEQVRBQkFTRSAkUXVvdGVkREJOYW1lcwogICAgICAgICAgICAgICAgUkVQTElDQSBPTmByYG4gICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnMKICAgICAgICAgICAgICAgICRMaXN0ZW5lcjsKICAgICIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXBSZXBsaWNhIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIHNlY29uZGFyeSByZXBsaWNhCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYSBiYXNlZCBvbiBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byBhbmQgYnkgTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5nIGRpcmVjdG9yeSB3aGljaCB3YXMgdHJhbnNmZXJyZWQgZnJvbSB0aGUgcHJpbWFyeSByZXBsaWNhLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIKICAgICkKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIldvcmsgZGlyICckV29ya0Rpcicgbm90IGZvdW5kIgogICAgfQogICAgJFdvcmtEaXJPYmogPSBHZXQtSXRlbSAtUGF0aCAkV29ya0RpcgogICAgJFdvcmtEaXIgPSAkV29ya0Rpck9iai5GdWxsTmFtZQogICAgJEdyb3VwTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJhdmdyb3VwLm5hbWUiKS5GdWxsTmFtZQoKICAgICRKb2luR3JvdXAgPSAiQUxURVIgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJEdyb3VwTmFtZSkgSk9JTgogICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkSm9pbkdyb3VwKQoKICAgIGZvciAoJGkgPSAwOyA7ICRpKyspIHsKICAgICAgICAkRmlsZSA9ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKQogICAgICAgIGlmICgtbm90ICRGaWxlKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAkRGF0YUJhc2VOYW1lID0gR2V0LUNvbnRlbnQgJFdvcmtEaXJPYmouR2V0RmlsZXMoImRiJGkubmFtZSIpLkZ1bGxOYW1lCiAgICAgICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgUkVQTEFDRSwgU1RBVFMgPSA1CiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVEYikKICAgICAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkubG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCiAgICAgICAgJEFsdGVyREIgPSAiQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBTRVQgSEFEUiBBVkFJTEFCSUxJVFkgR1JPVVAgPSAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEFsdGVyREIpCiAgICB9Cn0KCmZ1bmN0aW9uIE5ldy1SZXBsaWNhT3B0aW9uIHsKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIHJldHVybiAiJE5hbWUgPSAkVmFsdWUiCn0KCmZ1bmN0aW9uIFZhbGlkYXRlLU9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzIG9yIHRocm93cyBleGNlcHRpb24gb3RoZXJ3aXNlLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCgogICAgLlBBUkFNRVRFUiBBbGxvd2VkCiAgICBMaXN0IG9mIGFsbG93ZWQgb3B0aW9uIHZhbHVzLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW1N0cmluZ10kVmFsdWUsCiAgICAgICAgW0FycmF5XSRBbGxvd2VkCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGZvcmVhY2ggKCRWIGluICRBbGxvd2VkKSB7CiAgICAgICAgaWYgKCRWIC1lcSAkVmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuICRWYWx1ZQogICAgICAgIH0KICAgIH0KICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IG9uZSBvZiAkKCRBbGxvd2VkIC1qb2luICcsICcpIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1JbnRPcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIGludGVnZXIKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGlmICgtbm90ICgiJFZhbHVlIiAtbWF0Y2ggIl5bKy1dP1xkKyQiKSkgewogICAgICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IGEgbnVtYmVyIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbAoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG5vdCBudWxsLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICRmYWxzZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIGlmICgoJFZhbHVlIC1lcSAkbnVsbCkgLW9yICgkVmFsdWUgLWVxICIiKSkgewogICAgICAgIHRocm93ICJObyB2YWx1ZSB3YXMgcHJvdmlkZWQgZm9yICROYW1lIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgoKCg==", "CmZ1bmN0aW9uIEV4cG9ydC1GdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ1tdXSAkTmFtZSwKCiAgICAgICAgW1BhcmFtZXRlcihWYWx1ZUZyb21QaXBlbGluZT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFBhdGggPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpLAoKICAgICAgICBbU3dpdGNoXSAkQWxsCiAgICApCgogICAgaWYgKFtJTy5QYXRoXTo6R2V0RXh0ZW5zaW9uKCRQYXRoKSAtbmUgJ3BzMScpIHsKICAgICAgICAkbnVsbCA9IFJlbmFtZS1JdGVtIC1QYXRoICRQYXRoIC1OZXdOYW1lICIkUGF0aC5wczEiIC1Gb3JjZQogICAgICAgICRQYXRoID0gIiRQYXRoLnBzMSIKICAgIH0KCiAgICAkU3lzdGVtRnVuY3Rpb25zID0gQCgKICAgICAgICAnQTonLCAnQjonLCAnQzonLCAnRDonLCAnRTonLCAnRjonLCAnRzonLCAnSDonLCAnSTonLCAnSjonLAogICAgICAgICdLOicsICdMOicsICdNOicsICdOOicsICdPOicsICdQOicsICdROicsICdSOicsICdTOicsICdUOicsCiAgICAgICAgJ1U6JywgJ1Y6JywgJ1c6JywgJ1g6JywgJ1k6JywgJ1o6JywKICAgICAgICAnY2QuLicsICdjZFwnLCAnaGVscCcsICdta2RpcicsICdtb3JlJywgJ29zcycsICdwcm9tcHQnLAogICAgICAgICdDbGVhci1Ib3N0JywgJ0dldC1WZXJiJywgJ1BhdXNlJywgJ1RhYkV4cGFuc2lvbjInCiAgICApCgogICAgaWYgKCRBbGwpIHsKICAgICAgICBHZXQtQ2hpbGRJdGVtIEZ1bmN0aW9uOiB8CiAgICAgICAgICAgIFdoZXJlLU9iamVjdCB7JF8uTW9kdWxlTmFtZSAtZXEgJyd9IHwKICAgICAgICAgICAgV2hlcmUtT2JqZWN0IHskU3lzdGVtRnVuY3Rpb25zIC1ub3Rjb250YWlucyAkXy5OYW1lfSB8CiAgICAgICAgICAgIEZvckVhY2gtT2JqZWN0IHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRQYXRoIC1WYWx1ZSBAIgoKCmZ1bmN0aW9uICQoJF8uTmFtZSkgewokKCRfLlNjcmlwdEJsb2NrKQp9CgoiQAogICAgICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBmb3JlYWNoICgkRnVuY3Rpb25OYW1lIGluICROYW1lKSB7CiAgICAgICAgICAgICRGdW5jdGlvbk9iamVjdCA9IEdldC1DaGlsZEl0ZW0gIkZ1bmN0aW9uOlwkRnVuY3Rpb25OYW1lIgogICAgICAgICAgICBpZiAoJEZ1bmN0aW9uT2JqZWN0IC1uZSAkbnVsbCkgewogICAgICAgICAgICAgICAgQWRkLUNvbnRlbnQgLVBhdGggJFBhdGggLVZhbHVlIEAiCgoKZnVuY3Rpb24gJEZ1bmN0aW9uTmFtZSB7CiQoJEZ1bmN0aW9uT2JqZWN0LlNjcmlwdEJsb2NrKQp9CgoiQAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUGF0aAp9Cg==", - "CmZ1bmN0aW9uIFNlbGVjdC1DbGlYbWxCbG9jayB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFBhdGgsCiAgICAgICAgW1N0cmluZ10gJE91dEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICApCgogICAgJFRhZ0ZvdW5kID0gJGZhbHNlCiAgICBHZXQtQ29udGVudCAkUGF0aCB8CiAgICAgICAgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICBpZiAoJF8gLWVxICcjPCBDTElYTUwnKSB7CiAgICAgICAgICAgICAgICAkVGFnRm91bmQgPSAkdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkVGFnRm91bmQpIHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRPdXRGaWxlIC1WYWx1ZSAkXwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgJE91dEZpbGUKfQoKCgpmdW5jdGlvbiBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJENvbW1hbmQsCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbCwKICAgICAgICBbU3dpdGNoXSAkSWdub3JlU3RkRXJyLAogICAgICAgIFtTd2l0Y2hdICROb0Jhc2U2NAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgJFN0ZE91dCA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICAgICAkU3RkRXJyID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAkQXJndW1lbnRMaXN0ID0gQCgnLU91dHB1dEZvcm1hdCcsICdYTUwnKQoKICAgICAgICBpZiAoJE5vQmFzZTY0KSB7CiAgICAgICAgICAgICRUbXBTY3JpcHQgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAgICAgICAgIFJlbmFtZS1JdGVtIC1QYXRoICIkVG1wU2NyaXB0IiAtTmV3TmFtZSAiJFRtcFNjcmlwdC5wczEiIC1Gb3JjZQogICAgICAgICAgICAkVG1wU2NyaXB0ID0gIiRUbXBTY3JpcHQucHMxIgoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgJFRtcFNjcmlwdAoKICAgICAgICAgICAgJENvbW1hbmQgfCBPdXQtRmlsZSAkVG1wU2NyaXB0CgogICAgICAgICAgICAkQXJndW1lbnRMaXN0ICs9IEAoJy1GaWxlJywgIiRUbXBTY3JpcHQiKQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEJ5dGVzID0gW1RleHQuRW5jb2RpbmddOjpVbmljb2RlLkdldEJ5dGVzKCRDb21tYW5kKQogICAgICAgICAgICAkRW5jb2RlZENvbW1hbmQgPSBbQ29udmVydF06OlRvQmFzZTY0U3RyaW5nKCRCeXRlcykKICAgICAgICAgICAgCiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICRFbmNvZGVkQ29tbWFuZAoKICAgICAgICAgICAgJEFyZ3VtZW50TGlzdCArPSBAKCctRW5jb2RlZENvbW1hbmQnLCAkRW5jb2RlZENvbW1hbmQpCiAgICAgICAgfQoKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAkQXJndW1lbnRMaXN0CgogICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgZXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIC4uLiIKCiAgICAgICAgaWYgKCRDcmVkZW50aWFsIC1lcSAkbnVsbCkgewogICAgICAgICAgICAkUHJvY2VzcyA9IFN0YXJ0LVByb2Nlc3MgLUZpbGVQYXRoICdwb3dlcnNoZWxsLmV4ZScgYAogICAgICAgICAgICAgICAgLUFyZ3VtZW50TGlzdCBAKCRBcmd1bWVudExpc3QpIGAKICAgICAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ICRTdGRPdXQgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRFcnJvciAkU3RkRXJyIGAKICAgICAgICAgICAgICAgIC1Ob05ld1dpbmRvdyBgCiAgICAgICAgICAgICAgICAtV2FpdCBgCiAgICAgICAgICAgICAgICAtUGFzc1RocnUKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQcm9jZXNzID0gU3RhcnQtUHJvY2VzcyAtRmlsZVBhdGggJ3Bvd2Vyc2hlbGwuZXhlJyBgCiAgICAgICAgICAgICAgICAtQXJndW1lbnRMaXN0IEAoJEFyZ3VtZW50TGlzdCkgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRPdXRwdXQgJFN0ZE91dCBgCiAgICAgICAgICAgICAgICAtUmVkaXJlY3RTdGFuZGFyZEVycm9yICRTdGRFcnIgYAogICAgICAgICAgICAgICAgLUNyZWRlbnRpYWwgJENyZWRlbnRpYWwgYAogICAgICAgICAgICAgICAgLU5vTmV3V2luZG93IGAKICAgICAgICAgICAgICAgIC1XYWl0IGAKICAgICAgICAgICAgICAgIC1QYXNzVGhydQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeHRlcm5hbCBQb3dlclNoZWxsIHByb2Nlc3MgZXhpdGVkIHdpdGggZXhpdCBjb2RlICckKCRQcm9jZXNzLkV4aXRDb2RlKScuIgoKICAgICAgICAjaWYgKCRBcmd1bWVudExpc3QgLWNvbnRhaW5zICctRmlsZScpIHsKICAgICAgICAjICAgIFJlbW92ZS1JdGVtIC1QYXRoICRUbXBTY3JpcHQgLUZvcmNlCiAgICAgICAgI30KCiAgICAgICAgJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZQogICAgICAgICRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU2lsZW50bHlDb250aW51ZScKCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlN0ZE91dCBmaWxlIGlzICckU3RkT3V0JyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU3RkRXJyIGZpbGUgaXMgJyRTdGRFcnInIgoKICAgICAgICBpZiAoKEdldC1JdGVtICRTdGRPdXQpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkxvYWRpbmcgU3RkT3V0IGZyb20gJyRTdGRPdXQnIgogICAgICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZE91dAogICAgICAgICAgICAgICAgJFN0ZE91dE9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8U3RkT3V0PiIKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICgkU3RkT3V0T2JqZWN0KQogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkT3V0PiIKICAgICAgICAgICAgICAgICRTdGRPdXRPYmplY3QKICAgICAgICAgICAgICAgICNSZW1vdmUtSXRlbSAtUGF0aCAkVG1wRmlsZSAtRm9yY2UKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBsb2FkaW5nIFN0ZE91dCBmcm9tICckVG1wRmlsZSciCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgoR2V0LUl0ZW0gJFN0ZEVycikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiTG9hZGluZyBTdGRFcnIgLi4uIgogICAgICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZEVycgogICAgICAgICAgICAgICAgJFN0ZEVyck9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8U3RkRXJyPiIKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICgkU3RkRXJyT2JqZWN0KQogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkRXJyPiIKICAgICAgICAgICAgICAgIGlmICgtbm90ICRJZ25vcmVTdGRFcnIpIHsKICAgICAgICAgICAgICAgICAgICAkU3RkRXJyT2JqZWN0CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjUmVtb3ZlLUl0ZW0gLVBhdGggJFRtcEZpbGUgLUZvcmNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgbG9hZGluZyBTdGRFcnIgZnJvbSAnJFRtcEZpbGUnIgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkCgogICAgICAgIGlmICgkUHJvY2Vzcy5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICB0aHJvdygiRXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJyQoJFByb2Nlc3MuRXhpdENvZGUpJyIpCiAgICAgICAgfQoKICAgICAgICAjUmVtb3ZlLUl0ZW0gJFN0ZE91dCAtRm9yY2UKICAgICAgICAjUmVtb3ZlLUl0ZW0gJFN0ZEVyciAtRm9yY2UKICAgIH0KfQo=", - "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoKEdldC1Nb2R1bGUgU1FMUFMgLUxpc3RBdmFpbGFibGUpIC1uZSAkbnVsbCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIk1vZHVsZSBTUUxTUCBhbHJlYWR5IGluc3RhbGxlZC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICRNdXJhbm9GaWxlU2hhcmUgPSBbRW52aXJvbm1lbnRdOjpHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdNdXJhbm9GaWxlU2hhcmUnKQogICAgICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgICAgIHRocm93KCJVbmFibGUgdG8gZmluZCBNdXJhbm9GaWxlU2hhcmUgcGF0aC4iKQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJFNldHVwUm9vdCAtZXEgJycpIHsKICAgICAgICAgICAgJFNldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXFRvb2xzJykKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJEZpbGVMaXN0ID0gQCgKICAgICAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgICAgICdTaGFyZWRNYW5hZ2VtZW50T2JqZWN0cy5tc2knLAogICAgICAgICAgICAnUG93ZXJTaGVsbFRvb2xzLm1zaScKICAgICAgICApCgogICAgICAgIGZvcmVhY2ggKCRNc2lGaWxlIGluICRGaWxlTGlzdCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRyeWluZyB0byBpbnN0YWxsICckTXNpRmlsZScgLi4uIgogICAgICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgICAgIGlmIChbSU8uRmlsZV06OkV4aXN0cygkTXNpUGF0aCkpIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgbXNpZXhlIC4uLiIKICAgICAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL2knLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICAgICAgaWYgKCRSZXN1bHQuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoIkluc3RhbGxhdGlvbiBvZiBNU0kgcGFja2FnZSAnJE1zaVBhdGgnIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJyQoJFJlc3VsdC5FeGl0Q29kZSknIikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5zdGFsbC1TcWxTZXJ2ZXJGb3JBT0FHIHsKICAgIHBhcmFtICgKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUwgZmVhdHVyZXMgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU2V0dXBSb290ID0gJycsCgogICAgICAgICMgUGF0aCB0byBmb2xkZXIgd2hlcmUgbXNpIGZpbGVzIGZvciBhZGRpdGlvbmFsIFNRTFBTIG1vZHVsZSBhcmUgbG9jYXRlZAogICAgICAgIFtTdHJpbmddICRTcWxwc1NldHVwUm9vdCA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkTXVyYW5vRmlsZVNoYXJlID0gJycsCgogICAgICAgICMgKFJFUVVJUkVEKSBEb21haW4gbmFtZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlckRvbWFpbiA9ICdmYy1hY21lLmxvY2FsJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFVzZXIgbmFtZSBmb3IgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IFNRTCBzZXJ2aWNlCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyTmFtZSA9ICdBZG1pbmlzdHJhdG9yJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFBhc3N3b3JkIGZvciB0aGF0IHVzZXIKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJQYXNzd29yZCA9ICdQQHNzdzByZCcsCgogICAgICAgIFtTd2l0Y2hdICRVcGRhdGVFbmFibGVkCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgJE11cmFub0ZpbGVTaGFyZSA9IFtFbnZpcm9ubWVudF06OkdldEVudmlyb25tZW50VmFyaWFibGUoJ011cmFub0ZpbGVTaGFyZScpCiAgICAgICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICAgICAkU2V0dXBSb290ID0gW0lPLlBhdGhdOjpDb21iaW5lKCRNdXJhbm9GaWxlU2hhcmUsICdQcmVyZXF1aXNpdGVzXFNRTCBTZXJ2ZXJcMjAxMicpCiAgICAgICAgfQoKICAgICAgICAkRXh0cmFPcHRpb25zID0gQHt9CgogICAgICAgIGlmICgkVXBkYXRlRW5hYmxlZCkgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJHRydWV9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJGZhbHNlfQogICAgICAgIH0KCiAgICAgICAgTmV3LVNRTFNlcnZlckZvckFPQUcgYAogICAgICAgICAgICAtU2V0dXBSb290ICRTZXR1cFJvb3QgYAogICAgICAgICAgICAtU1FMU3ZjVXNyRG9tYWluICRTUUxTZXJ2aWNlVXNlckRvbWFpbiBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JOYW1lICRTUUxTZXJ2aWNlVXNlck5hbWUgYAogICAgICAgICAgICAtU1FMU3ZjVXNyUGFzc3dvcmQgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgYAogICAgICAgICAgICAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKICAgIH0KfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCwKICAgICAgICBbU3RyaW5nXSAkU3FsU2VydmljZUFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lID0gJ1NoYXJlZFdvcmtEaXInCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAkU2hhcmVOZXR3b3JrUGF0aCA9ICdcXCcgKyAkUHJpbWFyeU5vZGUgKyAnXCcgKyAkU2hhcmVOYW1lCgogICAgICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAgICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluQWRtaW5BY2NvdW50TmFtZSIgYAogICAgICAgICAgICAtUGFzc3dvcmQgIiREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUaGlzIHNjcmlwdCBydW5zIG9uIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nIHNjcmlwdC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRTaGFyZU5hbWUgLWVxICcnKSB7CiAgICAgICAgICAgICRTaGFyZU5hbWUgPSBbSU8uUGF0aF06OkdldEZpbGVOYW1lV2l0aG91dEV4dGVuc2lvbigkU2hhcmVQYXRoKQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlUGF0aCA9ICckU2hhcmVQYXRoJyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU2hhcmVOYW1lID0gJyRTaGFyZU5hbWUnIgoKICAgICAgICB0cnkgewogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZSAnJFNoYXJlTmFtZSciCiAgICAgICAgICAgICRudWxsID0gR2V0LVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UKICAgICAgICAgICAgd3JpdGUtTG9nICJTaGFyZSAnJFNoYXJlTmFtZScgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiU2hhcmUgJyRTaGFyZU5hbWUnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgZm9sZGVyICckU2hhcmVQYXRoIgogICAgICAgICAgICAkbnVsbCA9IEdldC1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1SZWN1cnNlIC1Gb3JjZQogICAgICAgICAgICBXcml0ZS1Mb2cgIkZvbGRlciAnJFNoYXJlUGF0aCcgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiRm9sZGVyICckU2hhcmVQYXRoJyBub3QgZXhpc3RzIG9yIGNhbm5vdCBiZSBkZWxldGVkLiIKICAgICAgICB9CgogICAgICAgICRudWxsID0gTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQogICAgICAgICAgICAgICAgCiAgICAgICAgJG51bGwgPSBOZXctU21iU2hhcmUgLVBhdGggJFNoYXJlUGF0aCBgCiAgICAgICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYAogICAgICAgICAgICAtRnVsbEFjY2VzcyAiRXZlcnlvbmUiIGAKICAgICAgICAgICAgLURlc2NyaXB0aW9uICJTaGFyZWQgZm9sZGVyIGZvciBBbHdheXNPbiBBdmFpbGFiaWxpdHkgR3JvdXAgc2V0dXAuIgoKICAgICAgICByZXR1cm4gJ1xcJyArICRFbnY6Q29tcHV0ZXJOYW1lICsgJ1wnICsgJFNoYXJlTmFtZQogICAgfQp9CgoKCmZ1bmN0aW9uIE5ldy1EYXRhYmFzZUZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREYXRhYmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRGdW5jdGlvbnNGaWxlID0gRXhwb3J0LUZ1bmN0aW9uICdJbnZva2UtU1FMVGV4dCcsICdDb252ZXJ0VG8tU1FMTmFtZScsICdDb252ZXJ0VG8tU1FMU3RyaW5nJywgJ05ldy1TUUxEYXRhYmFzZScKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gZmlsZSAnJEZ1bmN0aW9uc0ZpbGUnIC4uLiIKLiAiJEZ1bmN0aW9uc0ZpbGUiCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctU1FMRGF0YWJhc2UnIC4uLiIKTmV3LVNRTERhdGFiYXNlICREYXRhYmFzZU5hbWUKIkAgLUNyZWRlbnRpYWwgJENyZWRzIC1Ob0Jhc2U2NAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSA9ICdNdXJhbm9BRycsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkRGF0YWJhc2VMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTGlzdGVuZXIgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBieSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VzIGluIHRoYXQgQUcKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lck5hbWUgPSAnTXVyYW5vQUdfTGlzdGVuZXInLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lcklQLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUE1hc2sgPSAnMjU1LjI1NS4yNTUuMCcsCgogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lclBvcnQgPSAnNTAyMycsCgogICAgICAgICMgU3luYyBNb2RlIE5vZGUgTGlzdAogICAgICAgIFtTdHJpbmdbXV0gJFN5bmNNb2RlTm9kZUxpc3QsCgogICAgICAgIFtTdHJpbmddICRTaGFyZWRXb3JrRGlyID0gJ1NoYXJlZFdvcmtEaXInLAoKICAgICAgICBbU3RyaW5nXSAkQ2xpWG1sRmlsZSA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgV3JpdGUtTG9nICJQcmltYXJ5IG5vZGU6ICckKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkpJyIKICAgICAgICBXcml0ZS1Mb2cgIkN1cnJlbnQgbm9kZTogJyQoKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpJyIKCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICQoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRoaXMgZnVuY3Rpb24gd29ya3Mgb24gUHJpbWFyeU5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRDbGlYbWxGaWxlIC1lcSAnJykgewogICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ID0gQCgpCiAgICAgICAgICAgIGZvcmVhY2ggKCROb2RlIGluICROb2RlTGlzdCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IEltcG9ydC1DbGlYbWwgLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcJE5vZGUueG1sIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiVXNpbmcgZGVmYXVsdCBlbmRwb2ludCBwb3J0IDUwMjIiCiAgICAgICAgICAgICAgICAgICAgJE5vZGVFbmRwb2ludFBvcnQgPSA1MDIyCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uID0gQHsKICAgICAgICAgICAgICAgICAgICAiU0VSVkVSX0lOU1RBTkNFIiA9ICIkTm9kZSI7CiAgICAgICAgICAgICAgICAgICAgIkVORFBPSU5UX1VSTCIgPSAiVENQOi8vJHtOb2RlfToke05vZGVFbmRwb2ludFBvcnR9IjsKICAgICAgICAgICAgICAgICAgICAiQVZBSUxBQklMSVRZX01PREUiID0gIkFTWU5DSFJPTk9VU19DT01NSVQiOwogICAgICAgICAgICAgICAgICAgICJGQUlMT1ZFUl9NT0RFIj0iTUFOVUFMIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJFN5bmNNb2RlTm9kZUxpc3QgLWNvbnRhaW5zICROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvblsnQVZBSUxBQklMSVRZX01PREUnXSA9ICJTWU5DSFJPTk9VU19DT01NSVQiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydGQUlMT1ZFUl9NT0RFJ10gPSAiQVVUT01BVElDIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBOT1QgaW4gU3luY01vZGVOb2RlTGlzdCIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ICs9IEAoJFJlcGxpY2FEZWZpbml0aW9uKQogICAgICAgICAgICB9CgogICAgICAgICAgICAkUHJlZmVyZW5jZXMgPSBAe30KCiAgICAgICAgICAgICRMaXN0ZW5lckRlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgIk5BTUUiPSRMaXN0ZW5lck5hbWU7CiAgICAgICAgICAgICAgICAiUE9SVCIgPSAiJExpc3RlbmVyUG9ydCI7CiAgICAgICAgICAgICAgICAiU1RBVElDIiA9ICIkTGlzdGVuZXJJUC8kTGlzdGVuZXJJUE1hc2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbWV0ZXJzID0gQHsKICAgICAgICAgICAgICAgICdXb3JrRGlyJyA9ICJcXCRQcmltYXJ5Tm9kZVwkU2hhcmVkV29ya0RpciI7CiAgICAgICAgICAgICAgICAnTmFtZScgPSAkR3JvdXBOYW1lOwogICAgICAgICAgICAgICAgJ0RhdGFiYXNlTmFtZXMnID0gJERhdGFiYXNlTGlzdDsKICAgICAgICAgICAgICAgICdSZXBsaWNhRGVmcycgPSAkUmVwbGljYURlZmluaXRpb25MaXN0OwogICAgICAgICAgICAgICAgJ1ByZWZlcmVuY2VzJyA9ICRQcmVmZXJlbmNlczsKICAgICAgICAgICAgICAgICdMaXN0ZW5lckRlZicgPSAkTGlzdGVuZXJEZWZpbml0aW9uOwogICAgICAgICAgICB9CgogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAiXFwkUHJpbWFyeU5vZGVcU2hhcmVkV29ya0RpclwqIiAtRm9yY2UKCiAgICAgICAgICAgICRDbGlYbWxGaWxlID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkNsaVhtbCBmaWxlOiAnJENsaVhtbEZpbGUnIgoKICAgICAgICAgICAgRXhwb3J0LUNsaVhtbCAtUGF0aCAkQ2xpWG1sRmlsZSAtSW5wdXRPYmplY3QgJFBhcmFtZXRlcnMgLURlcHRoIDEwCgogICAgICAgICAgICBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSBgCiAgICAgICAgICAgICAgICAtQ2xpWG1sRmlsZSAkQ2xpWG1sRmlsZSBgCiAgICAgICAgICAgICAgICAtRG9tYWluTmFtZSAkRG9tYWluTmFtZSBgCiAgICAgICAgICAgICAgICAtVXNlck5hbWUgJFVzZXJOYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyUGFzc3dvcmQgJFVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgICAgICAtUHJpbWFyeU5vZGUgJFByaW1hcnlOb2RlCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gLUFsbAoKICAgICAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiSW1wb3J0aW5nIENsaVhtbCBwYXJhbWV0ZXJzIGZpbGUgLi4uIgpgJFBhcmFtZXRlcnMgPSBJbXBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCcgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCBgYAogICAgLVdvcmtEaXIgYCRQYXJhbWV0ZXJzWydXb3JrRGlyJ10gYGAKICAgIC1OYW1lIGAkUGFyYW1ldGVyc1snTmFtZSddIGBgCiAgICAtRGF0YWJhc2VOYW1lcyBgJFBhcmFtZXRlcnNbJ0RhdGFiYXNlTmFtZXMnXSBgYAogICAgLVJlcGxpY2FEZWZzIGAkUGFyYW1ldGVyc1snUmVwbGljYURlZnMnXSBgYAogICAgLVByZWZlcmVuY2VzIGAkUGFyYW1ldGVyc1snUHJlZmVyZW5jZXMnXSBgYAogICAgLUxpc3RlbmVyRGVmIGAkUGFyYW1ldGVyc1snTGlzdGVuZXJEZWYnXQoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICAgICAgfQogICAgfQp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1NlY29uZGFyeVJlcGxpY2EgewogICAgcGFyYW0gKAogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nW11dICROb2RlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGUgbmFtZSB0aGF0IHdpbGwgYmUgcHJpbWFyeSBmb3Igc2VsZWN0ZWQgQXZhaWxhYmlsaXR5IEdyb3VwCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKCiAgICAgICAgW1N0cmluZ10gJFNoYXJlZFdvcmtEaXIgPSAnU2hhcmVkV29ya0RpcicsCgogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApIAogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYScgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cFJlcGxpY2EgLVdvcmtEaXIgIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIgoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICB9Cn0KCgoKZnVuY3Rpb24gRGlzYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBuZXRzaCBhZHZmaXJld2FsbCBzZXQgYWxscHJvZmlsZXMgc3RhdGUgb2ZmCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLUZpcmV3YWxsIHsKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIG5ldHNoIGFkdmZpcmV3YWxsIHNldCBhbGxwcm9maWxlcyBzdGF0ZSBvbgogICAgfQp9CgoKCmZ1bmN0aW9uIEVuYWJsZS1UcnVzdGVkSG9zdHMgewogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgU2V0LUl0ZW0gV1NNYW46XGxvY2FsaG9zdFxDbGllbnRcVHJ1c3RlZEhvc3RzIC1WYWx1ZSAnKicgLUZvcmNlCiAgICB9Cn0K" + "CmZ1bmN0aW9uIFNlbGVjdC1DbGlYbWxCbG9jayB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFBhdGgsCiAgICAgICAgW1N0cmluZ10gJE91dEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICApCgogICAgJFRhZ0ZvdW5kID0gJGZhbHNlCiAgICBHZXQtQ29udGVudCAkUGF0aCB8CiAgICAgICAgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICBpZiAoJF8gLWVxICcjPCBDTElYTUwnKSB7CiAgICAgICAgICAgICAgICAkVGFnRm91bmQgPSAkdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkVGFnRm91bmQpIHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRPdXRGaWxlIC1WYWx1ZSAkXwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgJE91dEZpbGUKfQoKCgpmdW5jdGlvbiBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJENvbW1hbmQsCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbCwKICAgICAgICBbU3dpdGNoXSAkSWdub3JlU3RkRXJyLAogICAgICAgIFtTd2l0Y2hdICROb0Jhc2U2NAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgdHJhcCB7CiAgICAgICAgICAgICYkVHJhcEhhbmRsZXIKICAgICAgICB9CgogICAgICAgICRTdGRPdXQgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAgICAgJFN0ZEVyciA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKCiAgICAgICAgJEFyZ3VtZW50TGlzdCA9IEAoJy1PdXRwdXRGb3JtYXQnLCAnWE1MJykKCiAgICAgICAgaWYgKCROb0Jhc2U2NCkgewogICAgICAgICAgICAkVG1wU2NyaXB0ID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQogICAgICAgICAgICBSZW5hbWUtSXRlbSAtUGF0aCAiJFRtcFNjcmlwdCIgLU5ld05hbWUgIiRUbXBTY3JpcHQucHMxIiAtRm9yY2UKICAgICAgICAgICAgJFRtcFNjcmlwdCA9ICIkVG1wU2NyaXB0LnBzMSIKCiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICRUbXBTY3JpcHQKCiAgICAgICAgICAgICRDb21tYW5kIHwgT3V0LUZpbGUgJFRtcFNjcmlwdAoKICAgICAgICAgICAgJEFyZ3VtZW50TGlzdCArPSBAKCctRmlsZScsICIkVG1wU2NyaXB0IikKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRCeXRlcyA9IFtUZXh0LkVuY29kaW5nXTo6VW5pY29kZS5HZXRCeXRlcygkQ29tbWFuZCkKICAgICAgICAgICAgJEVuY29kZWRDb21tYW5kID0gW0NvbnZlcnRdOjpUb0Jhc2U2NFN0cmluZygkQnl0ZXMpCiAgICAgICAgICAgIAogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAkRW5jb2RlZENvbW1hbmQKCiAgICAgICAgICAgICRBcmd1bWVudExpc3QgKz0gQCgnLUVuY29kZWRDb21tYW5kJywgJEVuY29kZWRDb21tYW5kKQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nRGVidWcgJEFyZ3VtZW50TGlzdAoKICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIGV4dGVybmFsIFBvd2VyU2hlbGwgcHJvY2VzcyAuLi4iCgogICAgICAgIGlmICgkQ3JlZGVudGlhbCAtZXEgJG51bGwpIHsKICAgICAgICAgICAgJFByb2Nlc3MgPSBTdGFydC1Qcm9jZXNzIC1GaWxlUGF0aCAncG93ZXJzaGVsbC5leGUnIGAKICAgICAgICAgICAgICAgIC1Bcmd1bWVudExpc3QgQCgkQXJndW1lbnRMaXN0KSBgCiAgICAgICAgICAgICAgICAtUmVkaXJlY3RTdGFuZGFyZE91dHB1dCAkU3RkT3V0IGAKICAgICAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkRXJyb3IgJFN0ZEVyciBgCiAgICAgICAgICAgICAgICAtTm9OZXdXaW5kb3cgYAogICAgICAgICAgICAgICAgLVdhaXQgYAogICAgICAgICAgICAgICAgLVBhc3NUaHJ1CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUHJvY2VzcyA9IFN0YXJ0LVByb2Nlc3MgLUZpbGVQYXRoICdwb3dlcnNoZWxsLmV4ZScgYAogICAgICAgICAgICAgICAgLUFyZ3VtZW50TGlzdCBAKCRBcmd1bWVudExpc3QpIGAKICAgICAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ICRTdGRPdXQgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRFcnJvciAkU3RkRXJyIGAKICAgICAgICAgICAgICAgIC1DcmVkZW50aWFsICRDcmVkZW50aWFsIGAKICAgICAgICAgICAgICAgIC1Ob05ld1dpbmRvdyBgCiAgICAgICAgICAgICAgICAtV2FpdCBgCiAgICAgICAgICAgICAgICAtUGFzc1RocnUKICAgICAgICB9CgogICAgICAgIFdyaXRlLUxvZyAiRXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIGV4aXRlZCB3aXRoIGV4aXQgY29kZSAnJCgkUHJvY2Vzcy5FeGl0Q29kZSknLiIKCiAgICAgICAgI2lmICgkQXJndW1lbnRMaXN0IC1jb250YWlucyAnLUZpbGUnKSB7CiAgICAgICAgIyAgICBSZW1vdmUtSXRlbSAtUGF0aCAkVG1wU2NyaXB0IC1Gb3JjZQogICAgICAgICN9CgogICAgICAgICRFcnJvckFjdGlvblByZWZlcmVuY2VTYXZlZCA9ICRFcnJvckFjdGlvblByZWZlcmVuY2UKICAgICAgICAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJ1NpbGVudGx5Q29udGludWUnCgogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJTdGRPdXQgZmlsZSBpcyAnJFN0ZE91dCciCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlN0ZEVyciBmaWxlIGlzICckU3RkRXJyJyIKCiAgICAgICAgaWYgKChHZXQtSXRlbSAkU3RkT3V0KS5MZW5ndGggLWd0IDApIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJMb2FkaW5nIFN0ZE91dCBmcm9tICckU3RkT3V0JyIKICAgICAgICAgICAgICAgICRUbXBGaWxlID0gU2VsZWN0LUNsaVhtbEJsb2NrICRTdGRPdXQKICAgICAgICAgICAgICAgICRTdGRPdXRPYmplY3QgPSBJbXBvcnQtQ2xpeG1sICRUbXBGaWxlCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPFN0ZE91dD4iCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAoJFN0ZE91dE9iamVjdCkKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8L1N0ZE91dD4iCiAgICAgICAgICAgICAgICAkU3RkT3V0T2JqZWN0CiAgICAgICAgICAgICAgICAjUmVtb3ZlLUl0ZW0gLVBhdGggJFRtcEZpbGUgLUZvcmNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgbG9hZGluZyBTdGRPdXQgZnJvbSAnJFRtcEZpbGUnIgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoKEdldC1JdGVtICRTdGRFcnIpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkxvYWRpbmcgU3RkRXJyIC4uLiIKICAgICAgICAgICAgICAgICRUbXBGaWxlID0gU2VsZWN0LUNsaVhtbEJsb2NrICRTdGRFcnIKICAgICAgICAgICAgICAgICRTdGRFcnJPYmplY3QgPSBJbXBvcnQtQ2xpeG1sICRUbXBGaWxlCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPFN0ZEVycj4iCiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAoJFN0ZEVyck9iamVjdCkKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8L1N0ZEVycj4iCiAgICAgICAgICAgICAgICBpZiAoLW5vdCAkSWdub3JlU3RkRXJyKSB7CiAgICAgICAgICAgICAgICAgICAgJFN0ZEVyck9iamVjdAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgI1JlbW92ZS1JdGVtIC1QYXRoICRUbXBGaWxlIC1Gb3JjZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGxvYWRpbmcgU3RkRXJyIGZyb20gJyRUbXBGaWxlJyIKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICRFcnJvckFjdGlvblByZWZlcmVuY2VTYXZlZAoKICAgICAgICBpZiAoJFByb2Nlc3MuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICAgICAgdGhyb3coIkV4dGVybmFsIFBvd2VyU2hlbGwgcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlICckKCRQcm9jZXNzLkV4aXRDb2RlKSciKQogICAgICAgIH0KCiAgICAgICAgI1JlbW92ZS1JdGVtICRTdGRPdXQgLUZvcmNlCiAgICAgICAgI1JlbW92ZS1JdGVtICRTdGRFcnIgLUZvcmNlCiAgICB9Cn0K", + "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKChHZXQtTW9kdWxlIFNRTFBTIC1MaXN0QXZhaWxhYmxlKSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJNb2R1bGUgU1FMU1AgYWxyZWFkeSBpbnN0YWxsZWQuIgogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICAgICB0aHJvdygiVW5hYmxlIHRvIGZpbmQgTXVyYW5vRmlsZVNoYXJlIHBhdGguIikKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclxUb29scycpCiAgICAgICAgfQogICAgICAgIAogICAgICAgICRGaWxlTGlzdCA9IEAoCiAgICAgICAgICAgICdTUUxTeXNDbHJUeXBlcy5tc2knLAogICAgICAgICAgICAnU2hhcmVkTWFuYWdlbWVudE9iamVjdHMubXNpJywKICAgICAgICAgICAgJ1Bvd2VyU2hlbGxUb29scy5tc2knCiAgICAgICAgKQoKICAgICAgICBmb3JlYWNoICgkTXNpRmlsZSBpbiAkRmlsZUxpc3QpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUcnlpbmcgdG8gaW5zdGFsbCAnJE1zaUZpbGUnIC4uLiIKICAgICAgICAgICAgJE1zaVBhdGggPSBKb2luLVBhdGggJFNldHVwUm9vdCAkTXNpRmlsZQogICAgICAgICAgICBpZiAoW0lPLkZpbGVdOjpFeGlzdHMoJE1zaVBhdGgpKSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIG1zaWV4ZSAuLi4iCiAgICAgICAgICAgICAgICAkUmVzdWx0ID0gRXhlYyAtRmlsZVBhdGggIm1zaWV4ZWMuZXhlIiAtQXJndW1lbnRMaXN0IEAoJy9pJywgImAiJE1zaVBhdGhgIiIsICcvcXVpZXQnKSAtUGFzc1RocnUKICAgICAgICAgICAgICAgIGlmICgkUmVzdWx0LkV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCJJbnN0YWxsYXRpb24gb2YgTVNJIHBhY2thZ2UgJyRNc2lQYXRoJyBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICckKCRSZXN1bHQuRXhpdENvZGUpJyIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIkZpbGUgJyRNc2lQYXRoJyBub3QgZm91bmQuIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgoKCmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyRm9yQU9BRyB7CiAgICBwYXJhbSAoCiAgICAgICAgIyBQYXRoIHRvIGZvbGRlciB3aGVyZSBtc2kgZmlsZXMgZm9yIGFkZGl0aW9uYWwgU1FMIGZlYXR1cmVzIGFyZSBsb2NhdGVkCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnLAoKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUxQUyBtb2R1bGUgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU3FscHNTZXR1cFJvb3QgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJE11cmFub0ZpbGVTaGFyZSA9ICcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIG5hbWUKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJEb21haW4gPSAnZmMtYWNtZS5sb2NhbCcsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgZm9yIHRoZSBhY2NvdW50IHdoaWNoIHdpbGwgYmUgdXNlZCBieSBTUUwgc2VydmljZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUgPSAnQWRtaW5pc3RyYXRvcicsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgPSAnUEBzc3cwcmQnLAoKICAgICAgICBbU3dpdGNoXSAkVXBkYXRlRW5hYmxlZAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgdHJhcCB7CiAgICAgICAgICAgICYkVHJhcEhhbmRsZXIKICAgICAgICB9CgogICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICAgICB0aHJvdygiVW5hYmxlIHRvIGZpbmQgTXVyYW5vRmlsZVNoYXJlIHBhdGguIikKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclwyMDEyJykKICAgICAgICB9CgogICAgICAgICRFeHRyYU9wdGlvbnMgPSBAe30KCiAgICAgICAgaWYgKCRVcGRhdGVFbmFibGVkKSB7CiAgICAgICAgICAgICRFeHRyYU9wdGlvbnMgKz0gQHsnVXBkYXRlRW5hYmxlZCcgPSAkdHJ1ZX0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRFeHRyYU9wdGlvbnMgKz0gQHsnVXBkYXRlRW5hYmxlZCcgPSAkZmFsc2V9CiAgICAgICAgfQoKICAgICAgICBOZXctU1FMU2VydmVyRm9yQU9BRyBgCiAgICAgICAgICAgIC1TZXR1cFJvb3QgJFNldHVwUm9vdCBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JEb21haW4gJFNRTFNlcnZpY2VVc2VyRG9tYWluIGAKICAgICAgICAgICAgLVNRTFN2Y1Vzck5hbWUgJFNRTFNlcnZpY2VVc2VyTmFtZSBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JQYXNzd29yZCAkU1FMU2VydmljZVVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgIC1FeHRyYU9wdGlvbnMgJEV4dHJhT3B0aW9ucwogICAgfQp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbkFkbWluQWNjb3VudE5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbkFkbWluQWNjb3VudFBhc3N3b3JkLAogICAgICAgIFtTdHJpbmddICRTcWxTZXJ2aWNlQWNjb3VudE5hbWUsCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAogICAgICAgIFtTdHJpbmddICRTaGFyZU5hbWUgPSAnU2hhcmVkV29ya0RpcicKICAgICkKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICAkU2hhcmVOZXR3b3JrUGF0aCA9ICdcXCcgKyAkUHJpbWFyeU5vZGUgKyAnXCcgKyAkU2hhcmVOYW1lCgogICAgICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAgICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluQWRtaW5BY2NvdW50TmFtZSIgYAogICAgICAgICAgICAtUGFzc3dvcmQgIiREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBzY3JpcHQgcnVucyBvbiBwcmltYXJ5IG5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZyBzY3JpcHQuIgogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmICgkU2hhcmVOYW1lIC1lcSAnJykgewogICAgICAgICAgICAkU2hhcmVOYW1lID0gW0lPLlBhdGhdOjpHZXRGaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24oJFNoYXJlUGF0aCkKICAgICAgICB9CgogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJTaGFyZVBhdGggPSAnJFNoYXJlUGF0aCciCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlTmFtZSA9ICckU2hhcmVOYW1lJyIKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgc2hhcmUgJyRTaGFyZU5hbWUnIgogICAgICAgICAgICAkbnVsbCA9IEdldC1TbWJTaGFyZSAtTmFtZSAkU2hhcmVOYW1lIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICAgICAgUmVtb3ZlLVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUZvcmNlCiAgICAgICAgICAgIHdyaXRlLUxvZyAiU2hhcmUgJyRTaGFyZU5hbWUnIHJlbW92ZWQuIgogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIFdyaXRlLUxvZ1dhcm5pbmcgIlNoYXJlICckU2hhcmVOYW1lJyBub3QgZXhpc3RzIG9yIGNhbm5vdCBiZSBkZWxldGVkLiIKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJUcnlpbmcgdG8gcmVtb3ZlIGZvbGRlciAnJFNoYXJlUGF0aCIKICAgICAgICAgICAgJG51bGwgPSBHZXQtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICAgICAgUmVtb3ZlLUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtUmVjdXJzZSAtRm9yY2UKICAgICAgICAgICAgV3JpdGUtTG9nICJGb2xkZXIgJyRTaGFyZVBhdGgnIHJlbW92ZWQuIgogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIFdyaXRlLUxvZ1dhcm5pbmcgIkZvbGRlciAnJFNoYXJlUGF0aCcgbm90IGV4aXN0cyBvciBjYW5ub3QgYmUgZGVsZXRlZC4iCiAgICAgICAgfQoKICAgICAgICAkbnVsbCA9IE5ldy1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUl0ZW1UeXBlIENvbnRhaW5lciAtRm9yY2UKICAgICAgICAgICAgICAgIAogICAgICAgICRudWxsID0gTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYAogICAgICAgICAgICAtTmFtZSAkU2hhcmVOYW1lIGAKICAgICAgICAgICAgLUZ1bGxBY2Nlc3MgIkV2ZXJ5b25lIiBgCiAgICAgICAgICAgIC1EZXNjcmlwdGlvbiAiU2hhcmVkIGZvbGRlciBmb3IgQWx3YXlzT24gQXZhaWxhYmlsaXR5IEdyb3VwIHNldHVwLiIKCiAgICAgICAgcmV0dXJuICdcXCcgKyAkRW52OkNvbXB1dGVyTmFtZSArICdcJyArICRTaGFyZU5hbWUKICAgIH0KfQoKCgpmdW5jdGlvbiBOZXctRGF0YWJhc2VGb3JBT0FHIHsKICAgIHBhcmFtICgKICAgICAgICBbU3RyaW5nXSAkRGF0YWJhc2VOYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApCgogICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAnSW52b2tlLVNRTFRleHQnLCAnQ29udmVydFRvLVNRTE5hbWUnLCAnQ29udmVydFRvLVNRTFN0cmluZycsICdOZXctU1FMRGF0YWJhc2UnCgogICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tIGZpbGUgJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnTmV3LVNRTERhdGFiYXNlJyAuLi4iCk5ldy1TUUxEYXRhYmFzZSAkRGF0YWJhc2VOYW1lCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoT1BUSU9OQUwpIE5hbWUgb2YgdGhlIG5ldyBBdmFpbGFiaWxpdHkgR3JvdXAuIElmIG5vdCBzcGVjaWZpZWQgdGhlbiBkZWZhdWx0IG5hbWUgd2lsbCBiZSB1c2VkLgogICAgICAgIFtTdHJpbmddICRHcm91cE5hbWUgPSAnTXVyYW5vQUcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZXMgdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgYXMgcmVwbGljYSBwYXJ0bmVycy4KICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKCiAgICAgICAgIyAoUkVRVUlSRUQpIERhdGFiYXNlIGxpc3QgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJERhdGFiYXNlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIExpc3RlbmVyIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgYnkgY2xpZW50cyB0byBjb25uZWN0IHRvIGRhdGFiYXNlcyBpbiB0aGF0IEFHCiAgICAgICAgI1tQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJOYW1lID0gJ011cmFub0FHX0xpc3RlbmVyJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIElQIGFkZHJlc3Mgb2YgdGhlIGxpc3RlbmVyCiAgICAgICAgI1tQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUCwKCiAgICAgICAgW1N0cmluZ10gJExpc3RlbmVySVBNYXNrID0gJzI1NS4yNTUuMjU1LjAnLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJQb3J0ID0gJzUwMjMnLAoKICAgICAgICAjIFN5bmMgTW9kZSBOb2RlIExpc3QKICAgICAgICBbU3RyaW5nW11dICRTeW5jTW9kZU5vZGVMaXN0LAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJENsaVhtbEZpbGUgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICBXcml0ZS1Mb2cgIlByaW1hcnkgbm9kZTogJyQoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSknIgogICAgICAgIFdyaXRlLUxvZyAiQ3VycmVudCBub2RlOiAnJCgoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSknIgoKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgJCgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBQcmltYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZiAoJENsaVhtbEZpbGUgLWVxICcnKSB7CiAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgPSBAKCkKICAgICAgICAgICAgZm9yZWFjaCAoJE5vZGUgaW4gJE5vZGVMaXN0KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICROb2RlRW5kcG9pbnRQb3J0ID0gSW1wb3J0LUNsaVhtbCAtUGF0aCAiXFwkUHJpbWFyeU5vZGVcU2hhcmVkV29ya0RpclwkTm9kZS54bWwiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICJVc2luZyBkZWZhdWx0IGVuZHBvaW50IHBvcnQgNTAyMiIKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IDUwMjIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgICAgICJTRVJWRVJfSU5TVEFOQ0UiID0gIiROb2RlIjsKICAgICAgICAgICAgICAgICAgICAiRU5EUE9JTlRfVVJMIiA9ICJUQ1A6Ly8ke05vZGV9OiR7Tm9kZUVuZHBvaW50UG9ydH0iOwogICAgICAgICAgICAgICAgICAgICJBVkFJTEFCSUxJVFlfTU9ERSIgPSAiQVNZTkNIUk9OT1VTX0NPTU1JVCI7CiAgICAgICAgICAgICAgICAgICAgIkZBSUxPVkVSX01PREUiPSJNQU5VQUwiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkU3luY01vZGVOb2RlTGlzdCAtY29udGFpbnMgJE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIiROb2RlIGlzIGluIFN5bmNNb2RlTm9kZUxpc3QiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydBVkFJTEFCSUxJVFlfTU9ERSddID0gIlNZTkNIUk9OT1VTX0NPTU1JVCIKICAgICAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25bJ0ZBSUxPVkVSX01PREUnXSA9ICJBVVRPTUFUSUMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIiROb2RlIGlzIE5PVCBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgKz0gQCgkUmVwbGljYURlZmluaXRpb24pCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQcmVmZXJlbmNlcyA9IEB7fQoKICAgICAgICAgICAgJExpc3RlbmVyRGVmaW5pdGlvbiA9IEB7CiAgICAgICAgICAgICAgICAiTkFNRSI9JExpc3RlbmVyTmFtZTsKICAgICAgICAgICAgICAgICJQT1JUIiA9ICIkTGlzdGVuZXJQb3J0IjsKICAgICAgICAgICAgICAgICJTVEFUSUMiID0gIiRMaXN0ZW5lcklQLyRMaXN0ZW5lcklQTWFzayIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFtZXRlcnMgPSBAewogICAgICAgICAgICAgICAgJ1dvcmtEaXInID0gIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIjsKICAgICAgICAgICAgICAgICdOYW1lJyA9ICRHcm91cE5hbWU7CiAgICAgICAgICAgICAgICAnRGF0YWJhc2VOYW1lcycgPSAkRGF0YWJhc2VMaXN0OwogICAgICAgICAgICAgICAgJ1JlcGxpY2FEZWZzJyA9ICRSZXBsaWNhRGVmaW5pdGlvbkxpc3Q7CiAgICAgICAgICAgICAgICAnUHJlZmVyZW5jZXMnID0gJFByZWZlcmVuY2VzOwogICAgICAgICAgICAgICAgJ0xpc3RlbmVyRGVmJyA9ICRMaXN0ZW5lckRlZmluaXRpb247CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFJlbW92ZS1JdGVtIC1QYXRoICJcXCRQcmltYXJ5Tm9kZVxTaGFyZWRXb3JrRGlyXCoiIC1Gb3JjZQoKICAgICAgICAgICAgJENsaVhtbEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCgogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiQ2xpWG1sIGZpbGU6ICckQ2xpWG1sRmlsZSciCgogICAgICAgICAgICBFeHBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlIC1JbnB1dE9iamVjdCAkUGFyYW1ldGVycyAtRGVwdGggMTAKCiAgICAgICAgICAgIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIGAKICAgICAgICAgICAgICAgIC1DbGlYbWxGaWxlICRDbGlYbWxGaWxlIGAKICAgICAgICAgICAgICAgIC1Eb21haW5OYW1lICREb21haW5OYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyTmFtZSAkVXNlck5hbWUgYAogICAgICAgICAgICAgICAgLVVzZXJQYXNzd29yZCAkVXNlclBhc3N3b3JkIGAKICAgICAgICAgICAgICAgIC1QcmltYXJ5Tm9kZSAkUHJpbWFyeU5vZGUKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJFVzZXJOYW1lIiAtUGFzc3dvcmQgIiRVc2VyUGFzc3dvcmQiCgogICAgICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJJbXBvcnRpbmcgQ2xpWG1sIHBhcmFtZXRlcnMgZmlsZSAuLi4iCmAkUGFyYW1ldGVycyA9IEltcG9ydC1DbGlYbWwgLVBhdGggJENsaVhtbEZpbGUKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIGBgCiAgICAtV29ya0RpciBgJFBhcmFtZXRlcnNbJ1dvcmtEaXInXSBgYAogICAgLU5hbWUgYCRQYXJhbWV0ZXJzWydOYW1lJ10gYGAKICAgIC1EYXRhYmFzZU5hbWVzIGAkUGFyYW1ldGVyc1snRGF0YWJhc2VOYW1lcyddIGBgCiAgICAtUmVwbGljYURlZnMgYCRQYXJhbWV0ZXJzWydSZXBsaWNhRGVmcyddIGBgCiAgICAtUHJlZmVyZW5jZXMgYCRQYXJhbWV0ZXJzWydQcmVmZXJlbmNlcyddIGBgCiAgICAtTGlzdGVuZXJEZWYgYCRQYXJhbWV0ZXJzWydMaXN0ZW5lckRlZiddCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BT0FHU2Vjb25kYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFzIHJlcGxpY2EgcGFydG5lcnMuCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkgCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYScgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cFJlcGxpY2EgLVdvcmtEaXIgIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIgoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICB9Cn0KCgoKZnVuY3Rpb24gRGlzYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9mZgogICAgfQp9CgoKCmZ1bmN0aW9uIEVuYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9uCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLVRydXN0ZWRIb3N0cyB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgU2V0LUl0ZW0gV1NNYW46XGxvY2FsaG9zdFxDbGllbnRcVHJ1c3RlZEhvc3RzIC1WYWx1ZSAnKicgLUZvcmNlCiAgICB9Cn0K" ] } \ No newline at end of file diff --git a/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/InstallSqlServerForAOAG.yaml.json b/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/InstallSqlServerForAOAG.yaml.json index 6795d851..c292b055 100644 --- a/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/InstallSqlServerForAOAG.yaml.json +++ b/ExecutionPlan/SqlServerAlwaysOnAvailabilityGroup/InstallSqlServerForAOAG.yaml.json @@ -10,10 +10,10 @@ } ], "Scripts": [ - "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKZnVuY3Rpb24gU2hvdy1JbnZvY2F0aW9uSW5mbyB7CiAgICBwYXJhbSAoCiAgICAgICAgJEludm9jYXRpb24sCiAgICAgICAgW1N3aXRjaF0gJEVuZAogICAgKQoKICAgIGlmICgkRW5kKSB7CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgIH0KICAgIGVsc2UgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8ZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPHBhcmFtPiIKICAgICAgICBmb3JlYWNoICgkUGFyYW1ldGVyIGluICRJbnZvY2F0aW9uLk15Q29tbWFuZC5QYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRLZXkgaW4gJFBhcmFtZXRlci5LZXlzKSB7CiAgICAgICAgICAgICAgICAkVHlwZSA9ICRQYXJhbWV0ZXJbJEtleV0uUGFyYW1ldGVyVHlwZS5GdWxsTmFtZQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJFZhbHVlIGluICRJbnZvY2F0aW9uLkJvdW5kUGFyYW1ldGVyc1skS2V5XSkgewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJbJFR5cGVdICRLZXkgPSAnJFZhbHVlJyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPC9wYXJhbT4iCiAgICB9Cn0KCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKCmZ1bmN0aW9uIFNob3ctSW52b2NhdGlvbkluZm8gewogICAgcGFyYW0gKAogICAgICAgICRJbnZvY2F0aW9uLAogICAgICAgIFtTd2l0Y2hdICRFbmQKICAgICkKCiAgICBpZiAoJEVuZCkgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8L2Z1bmN0aW9uIG5hbWU9JyQoJEludm9jYXRpb24uTXlDb21tYW5kLk5hbWUpJz4iCiAgICB9CiAgICBlbHNlIHsKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPGZ1bmN0aW9uIG5hbWU9JyQoJEludm9jYXRpb24uTXlDb21tYW5kLk5hbWUpJz4iCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjxwYXJhbT4iCiAgICAgICAgZm9yZWFjaCAoJFBhcmFtZXRlciBpbiAkSW52b2NhdGlvbi5NeUNvbW1hbmQuUGFyYW1ldGVycykgewogICAgICAgICAgICBmb3JlYWNoICgkS2V5IGluICRQYXJhbWV0ZXIuS2V5cykgewogICAgICAgICAgICAgICAgJFR5cGUgPSAkUGFyYW1ldGVyWyRLZXldLlBhcmFtZXRlclR5cGUuRnVsbE5hbWUKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRWYWx1ZSBpbiAkSW52b2NhdGlvbi5Cb3VuZFBhcmFtZXRlcnNbJEtleV0pIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiWyRUeXBlXSAkS2V5ID0gJyRWYWx1ZSciCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvcGFyYW0+IgogICAgfQp9CgoKJFRyYXBIYW5kbGVyID0gewogICAgV3JpdGUtTG9nRXJyb3IgQCgiPGV4Y2VwdGlvbj4iLCAkXykgLUVudGlyZU9iamVjdAogICAgV3JpdGUtTG9nRXJyb3IgIjwvZXhjZXB0aW9uPiIKICAgIGJyZWFrCn0KCgp0cmFwIHsKICAgICYkVHJhcEhhbmRsZXIKfQoKJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICdTdG9wJwoKCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", "ZnVuY3Rpb24gTmV3LU9wdGlvbiAoW3N0cmluZ10kTmFtZSwgW3N3aXRjaF0kU3dpdGNoLCBbc3dpdGNoXSRCb29sZWFuLCBbc3dpdGNoXSRTdHJpbmcsIFtzd2l0Y2hdJExpc3QsICRDb25zdHJhaW50cz0kbnVsbCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb24gb2JqZWN0CgogICAgLkRFU0NSSVBUSU9OCiAgICBPcHRpb24gb2JqZWN0IGlzIGEgdmlydHVhbCBvYmplY3QgcmVwcmVzdG50aW5nIHR5cGVkIGNvbW1hbmQgbGluZSBvcHRpb24uIFRoZXNlIG9iamVjdHMgZW5jYXBzdWxhdGUgZXNjYXBpbmcgYW5kCiAgICB2YWxpZGF0aW9uIG1hdHRlcnMuCgogICAgT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgc3dpdGNoZXMgJ1N3aXRjaCcsICdCb29sZWFuJywgJ1N0cmluZycgb3IgJ0xpc3QnIHNob3VsZCBiZSBwcm92aWRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZS4KCiAgICAuUEFSQU1FVEVSIFN3aXRjaAogICAgVXNlIHRoaXMgc3dpdGNoIHRvIGNyZWF0ZSB2YWx1ZWxlc3Mgb3B0aW9uIChhIHN3aXRjaCkuCgogICAgLlBBUkFNRVRFUiBCb29sZWFuCiAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gY3JlYXRlIGJvb2xlYW4gb3B0aW9uLiBJdHMgdmFsdWUgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byAiMSIgb3IgIjAiCgogICAgLlBBUkFNRVRFUiBTdHJpbmcKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgc3RyaW5nIG9wdGlvbi4gSXRzIHZhbHVlIHdpbGwgYmUgcHJvcGVybHkgcXVvdGVkIGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIExpc3QKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgb3B0aW9uIHdpdGggbGlzdCB2YWx1ZS4gVmFsdWVzIHdpbGwgYmUgcHV0IGludG8gY29tbWFuZCBsaW5lIHVzaW5nIHZhbGlkIHZhbHVlIGRlbGVtaXRlciAoYSBjb21tYSkKCiAgICAuUEFSQU1FVEVSIENvbnN0cmFpbnRzCiAgICBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgb3B0aW9uIHZhbHVlcyBhcmUgbGltaXRlZCB0byBvcHRpb25zIGZyb20gdGhhdCBsaXN0LgoKICAgICM+CgogICAgJE9wdGlvbiA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFBTT2JqZWN0CgogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBUeXBlIC12YWx1ZSAkbnVsbAogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IE5hbWUgLXZhbHVlICRudWxsCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgQWxsb3dlZFZhbHVlcyAtdmFsdWUgJG51bGwKCiAgICAjIEluaXQKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgX19pbml0X18gewogICAgICAgIHBhcmFtKFtzdHJpbmddJE5hbWUsICRTd2l0Y2gsICRCb29sZWFuLCAkU3RyaW5nLCAkTGlzdCkKCiAgICAgICAgJHRoaXMuTmFtZSA9ICROYW1lCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIyBXaXRoIHJlc3BlY3QgZm9yIG91ciBkZXZlbG9wZXJzIHdlIGRvIG5vdCBjaGVjayBmb3IgZG91YmxlIHR5cGUgc2VsZWN0ZWQKICAgICAgICBpZiAoJFN3aXRjaCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3dpdGNoKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkQm9vbGVhbikgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uQm9vbGVhbigkdGhpcykKICAgICAgICB9IGVsc2VpZiAoJFN0cmluZykgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3RyaW5nKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkTGlzdCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uTGlzdCgkdGhpcykKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiU3dpdGNoLCBCb29sZWFuLCBTdHJpbmcgb3IgTGlzdCBvcHRpb24gdHlwZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBvcHRpb24gJyROYW1lJyIKICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIF9fcG9zdF9pbml0X18gewogICAgICAgIHBhcmFtKCRDb25zdHJhaW50cz0kbnVsbCkKICAgICAgICBpZiAoJENvbnN0cmFpbnRzIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkdGhpcy5BbGxvd2VkVmFsdWVzID0gQCgpCiAgICAgICAgICAgICR0aGlzLkFsbG93ZWRWYWx1ZXMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzICsgJENvbnN0cmFpbnRzCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnN0cmFpbnRzID0gJG51bGwKICAgICAgICB9CiAgICB9CgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBWYWxpZGF0ZSB7CiAgICAgICAgaWYgKCR0aGlzLkFsbG93ZWRWYWx1ZXMgLW5lICRudWxsKSB7CiAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICR0aGlzLlZhbHVlKSkgewogICAgICAgICAgICAgICAgJEN0cyA9ICR0aGlzLkFsbG93ZWRWYWx1ZXMgLWpvaW4gJywnCiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckKCR0aGlzLk5hbWUpJyBtYXkgaGF2ZSB2YWx1ZXMgKCRDdHMpIGJ1dCBub3QgJyQoJHRoaXMuVmFsdWUpJyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFRvU3RyaW5nIHsKICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpIgogICAgfQoKICAgICMgaW52b2tlIGNvbnN0cnVjdG9yCgogICAgJE9wdGlvbi5fX2luaXRfXygkTmFtZSwgJFN3aXRjaCwgJEJvb2xlYW4sICRTdHJpbmcsICRMaXN0KQogICAgJE9wdGlvbi5fX3Bvc3RfaW5pdF9fKCRDb25zdHJhaW50cykKCiAgICByZXR1cm4gJE9wdGlvbgp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3dpdGNoKCRPcHRpb24pIHsKfQoKZnVuY3Rpb24gQXVnbWVudE9wdGlvbkJvb2xlYW4oJE9wdGlvbikgewogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBWYWx1ZSAtdmFsdWUgJGZhbHNlCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgaWYgKCR0aGlzLlZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9MSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpPTAiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3RyaW5nKCRPcHRpb24pIHsKICAgICMgRmllbGRzCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgVmFsdWUgLXZhbHVlICIiCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgJHYgPSAiJCgkdGhpcy5WYWx1ZSkiCiAgICAgICAgaWYgKCR2IC1tYXRjaCAnLiogLionKSB7CiAgICAgICAgICAgICMgVE9ETzogRXNjYXBlIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzIGlmIHBvc3NpYmxlCiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9YCIkdmAiIgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JHYiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uTGlzdCgkT3B0aW9uKSB7CiAgICAjIEZpZWxkcwogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFZhbHVlIC12YWx1ZSBAKCkKCiAgICAjIE1ldGhvZHMKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFZhbGlkYXRlIHsKICAgICAgICBpZiAoJHRoaXMuQWxsb3dlZFZhbHVlcyAtbmUgJG51bGwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJFYgaW4gJHRoaXMuVmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICRWKSkgewogICAgICAgICAgICAgICAgICAgICRDdHMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzIC1qb2luICcsJwogICAgICAgICAgICAgICAgICAgIHRocm93ICJPcHRpb24gJyQoJHRoaXMuTmFtZSknIG1heSBoYXZlIHZhbHVlcyAoJEN0cykgYnV0IG5vdCAnJFYnIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIC1Gb3JjZSBTY3JpcHRNZXRob2QgVG9TdHJpbmcgewogICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JCgkdGhpcy5WYWx1ZSAtam9pbiAnLCcpIgogICAgfQp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyKCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb25QYXJzZXIgb2JqZWN0LgoKICAgIC5ERVNDUklQVElPTgogICAgT3B0aW9uUGFyc2VyIG9iamVjdCBsZXZlcmFnZXMgT3B0aW9uIG9iamVjdHMgY2FwYWJpbGl0aWVzIGFuZCBidWlsZHMgdmFsaWQgY29tbWFuZCBsaW5lIHVzaW5nIHNwZWNpZmllZCBvcHRpb25zLgogICAgQW4gYXBwbGljYXRpb24gbWF5IGFsc28gYmUgaW52b2tlZCB3aXRoIE9wdGlvblBhcnNlci4KCiAgICAjPgoKICAgICRPcHRpb25QYXJzZXIgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBQU09iamVjdAoKICAgICMgRmllbGRzCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgT3B0aW9ucyAtdmFsdWUgQHt9CiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgRGVmYXVsdHMgLXZhbHVlIEB7fQogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFJlcXVpcmVkT3B0aW9ucyAtdmFsdWUgQCgpCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIEFkZE9wdGlvbiB7CiAgICAgICAgPCMKICAgICAgICAuU1lOT1BTSVMKICAgICAgICBBZGRzIHN1cHBvcnRlZCBvcHRpb24gaW50byBPcHRpb25QYXJzZXIuCiAgICAgICAgCiAgICAgICAgLkRFU0NSSVBUSU9OCiAgICAgICAgT3B0aW9uUGFyc2VyIGRvZXMgbm90IGFsbG93IHVzaW5nIHVucmVjb2duaXplZCBvcHRpb25zLiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsbCBPcHRpb25QYXJzZXIgd2l0aCByZWNvZ25pemVkIG9wdGlvbnMKCiAgICAgICAgLlBBUkFNRVRFUiBPcHRpb24KICAgICAgICBPcHRpb24gb2JqZWN0CgogICAgICAgIC5QQVJBTUVURVIgUmVxdWlyZWQKICAgICAgICBSZXF1aXJlZCBvcHRpb24gc3dpdGNoCgogICAgICAgIC5QQVJBTUVURVIgRGVmYXVsdAogICAgICAgIE9wdGlvbiBkZWZhdWx0IHZhbHVlCiAgICAgICAgIz4KICAgICAgICBwYXJhbSgkT3B0aW9uLCBbYm9vbF0kUmVxdWlyZWQ9JGZhbHNlLCAkRGVmYXVsdD0kbnVsbCkKICAgICAgICAkdGhpcy5PcHRpb25zLkFkZCgkT3B0aW9uLk5hbWUsICRPcHRpb24pCiAgICAgICAgaWYgKCRSZXF1aXJlZCkgewogICAgICAgICAgICAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgPSAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgKyAkT3B0aW9uLk5hbWUKICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgIGlmICgkRGVmYXVsdCkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLkRlZmF1bHRzLkFkZCgkT3B0aW9uLk5hbWUsICREZWZhdWx0KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMuRGVmYXVsdHMuQWRkKCRPcHRpb24uTmFtZSwgJG51bGwpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIFBhcnNlIHsKICAgICAgICA8IwogICAgICAgIC5TWU5PUFNJUwogICAgICAgIFBhcnNlcyBzdXBwbGllZCBvcHRpb25zIGFuZCByZXR1cm5zIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFycmF5LgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQgb25seSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGFsbCBtYW5kYXRvcnkgb3B0aW9ucyBhcmUgaW4gcGxhY2UsIAogICAgICAgIGFsbCBvcHRpb24gbWVldCBjb25zdHJhaW50cyBpZiBhbnkuIFVuc3BlY2lmaWVkIG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhcmUgYWRkZWQgdG8gY29tbWFuZCBsaW5lLgogICAgICAgIFNvLCBtYW5kYXRvcnkgb3B0aW9uIHdpdGggZGVmYXVsdCB2YWx1ZSBuZXZlciBjYXVzZXMgZXhjZXB0aW9uLgoKICAgICAgICAuUEFSQU1FVEVSIE9wdGlvbnMKICAgICAgICBBIGhhc2ggbWFwIG9mIG9wdGlvbnMgdG8gcGFyc2UuIE9wdGlvbiBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgogICAgICAgICM+CiAgICAgICAgcGFyYW0oW2hhc2h0YWJsZV0kT3B0aW9ucykKCiAgICAgICAgJENvbW1hbmRMaW5lID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJFJlcXVpcmVkT3B0aW9uTmFtZSBpbiAkdGhpcy5SZXF1aXJlZE9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJE9wdGlvbnMuQ29udGFpbnNLZXkoJFJlcXVpcmVkT3B0aW9uTmFtZSkpIHsKICAgICAgICAgICAgICAgICREZWZhdWx0ID0gJHRoaXMuRGVmYXVsdHMuR2V0X0l0ZW0oJFJlcXVpcmVkT3B0aW9uTmFtZSkKICAgICAgICAgICAgICAgIGlmICgkdGhpcy5EZWZhdWx0cy5Db250YWluc0tleSgkUmVxdWlyZWRPcHRpb25OYW1lKSkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25zLkFkZCgkUmVxdWlyZWRPcHRpb25OYW1lLCAkdGhpcy5EZWZhdWx0cy5HZXRfSXRlbSgkUmVxdWlyZWRPcHRpb25OYW1lKSkKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlJlcXVpcmVkIG9wdGlvbiAnJFJlcXVpcmVkT3B0aW9uTmFtZScgaXMgbWlzc2luZyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJE9wdGlvbk5hbWUgaW4gJCgkT3B0aW9ucy5rZXlzKSkgewogICAgICAgICAgICAkT3B0aW9uID0gJHRoaXMuT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgaWYgKCRPcHRpb24gLWVxICRudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckT3B0aW9uTmFtZScgaXMgbm90IGFsbG93ZWQiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgICRPcHRpb24uVmFsdWUgPSAkT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgfQogICAgICAgICAgICAkT3B0aW9uLlZhbGlkYXRlKCkKICAgICAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJE9wdGlvbi5Ub1N0cmluZygpCiAgICAgICAgfQogICAgICAgIHJldHVybiAkQ29tbWFuZExpbmUKICAgIH0KCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgRXhlY3V0ZUJpbmFyeSB7CiAgICAgICAgcGFyYW0oJEJpbmFyeSwgW2hhc2h0YWJsZV0kT3B0aW9ucyA9IEB7fSwgJENvbW1hbmRMaW5lU3VmZml4ID0gQCgpKQogICAgICAgIDwjCiAgICAgICAgLlNZTk9QU0lTCiAgICAgICAgRXhlY3V0ZXMgYmluYXJ5IHdpdGggYSBjb21tYW5kIGxpbmUgY29uc3RydWN0ZWQgZnJvbSBwcm92aWRlZCBvcHRpb25zLiBBbiBhcmJpdHJhcnkgc3VmZml4IG1heSBiZSAKICAgICAgICBhcHBlbmRlZCB0byB0aGUgY29tbWFuZCBsaW5lLgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHVzZXMgT3B0aW9uUGFyc2VyLlBhcnNlIG1ldGhvZCB0byBjb25zdHJ1Y3QgY29tbWFuZCBsaW5lLiBJZiB0aGVyZSBhIGNvbW1hbmQgbGluZSBzdWZmaXggCiAgICAgICAgd2FzIHN1cHBsaWVkLCBpdCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIGNvbW1hbmQgbGluZS4gTm9ybWFsbHkgY29tbWFuZCBsaW5lIHN1ZmZpeCBzaG91bGQgY29udGFpbgogICAgICAgIGxlYWRpbmcgc3BhY2UgY2hhcmFjdGVyLgoKICAgICAgICBNZXRob2Qgd2FpdHMgZm9yIGV4ZWN1dGFibGUgcHJvY2VzcyB0byBjb21wbGV0ZSBhbmQgcmV0dXJucyBpdHMgZXhpdCBjb2RlLgoKICAgICAgICAuUEFSQU1FVEVSIEJpbmFyeQogICAgICAgIEZ1bGwgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSB0byBydW4uCgogICAgICAgIC5QQVJBTUVURVIgT3B0aW9ucwogICAgICAgIEEgaGFzaCBtYXAgb2Ygb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBleGVjdXRhYmxlLgoKICAgICAgICAuUEFSQU1FVEVSIENvbW1hbmRMaW5lU3VmZml4CiAgICAgICAgQXJiaXRyYXJ5IGNvbW1hbmQgbGluZSBzdWZmaXguIE5vcm1hbGx5IGl0IHNob3VkIGhhdmUgbGVhZGluZyBzcGFjZSBjaGFyYWN0ZXIuCiAgICAgICAgIz4KCiAgICAgICAgJEJpbmFyeSA9IEdldC1JdGVtICRCaW5hcnkKICAgICAgICAkQ29tbWFuZExpbmUgPSAkdGhpcy5QYXJzZSgkT3B0aW9ucykKICAgICAgICBpZiAoJENvbW1hbmRMaW5lU3VmZml4KSB7CiAgICAgICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICRDb21tYW5kTGluZVN1ZmZpeAogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeGVjdXRpbmc6ICQoJEJpbmFyeS5GdWxsTmFtZSkgJCgkQ29tbWFuZExpbmUgLWpvaW4gJyAnKSIKICAgICAgICAkcHJvY2VzcyA9IFtTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzc106OlN0YXJ0KCRCaW5hcnksICRDb21tYW5kTGluZSkKICAgICAgICAkcHJvY2Vzcy5XYWl0Rm9yRXhpdCgpCiAgICAgICAgJHByb2Nlc3MuUmVmcmVzaCgpCiAgICAgICAgcmV0dXJuICRwcm9jZXNzLkV4aXRDb2RlCiAgICB9CgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQo=", "ZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckluc3RhbGwgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIklOU1RBTEwiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkSXNQYXJ0T2ZEb21haW4gPSAoR2V0LVdtaU9iamVjdCBXaW4zMl9Db21wdXRlclN5c3RlbSkuUGFydE9mRG9tYWluCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIklOU1RBTEwiKSwgJHRydWUsICJJTlNUQUxMIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICMkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVwZGF0ZVNvdXJjZSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIkRSRVBMQVlfQ1RMUiIsIkRSRVBMQVlfQ0xUIiwiU05BQ19TREsiLCJTREsiLCJMb2NhbERCIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJPTEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU1BJX0FTX0V4aXN0aW5nRmFybSIsICJTUElfQVNfTmV3RmFybSIsICJBbGxGZWF0dXJlc19XaXRoRGVmYXVsdHMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRFdPV0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVJTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJOb3JtYWwiLCAiQXV0b0FkdmFuY2UiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU0NPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNDT05GSUdESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU0VSVkVSTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNVUxUSURJTUVOU0lPTkFMIiwgIlBPV0VSUElWT1QiLCAiVEFCVUxBUiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgaWYgKCRJc1BhcnRPZkRvbWFpbikgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6VVNFUkRPTUFJTlxBZG1pbmlzdHJhdG9yIikKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1RFTVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTUFJPVklERVJNU09MQVAiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkFSTVBBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJQQVNTUEhSQVNFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQURNSU5JUE9SVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQlJPV1NFUlNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5BQkxFUkFOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNRTERBVEFESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNBUFdEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTRUNVUklUWU1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnJzICgiU1FMIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTEJBQ0tVUERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQ09MTEFUSU9OIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBRERDVVJSRU5UVVNFUkFTU1FMQURNSU4iIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgIGlmICgkSXNQYXJ0T2ZEb21haW4pIHsKICAgICAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNTEVWRUwiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiMCIsICIxIiwgIjIiLCAiMyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNU0hBUkVOQU1FIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ0FDQ09VTlQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIk5QRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlRDUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU0lOU1RBTExNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIlNoYXJlUG9pbnRGaWxlc09ubHlNb2RlIiwgIkRlZmF1bHROYXRpdmVNb2RlIiwgIkZpbGVzT25seU1vZGUiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1N0YXJ0dXBUeXBlIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IGZvciBpbnN0YWxsZXIgdmVyc2lvbiBvZiBNUyBTUUwgU2VydmVyIHByaW9yIHRvIDIwMTIgU1AxIEN1bXVsYXRpdmUgVXBkYXRlIDIgb25seSB0aGUKICAgIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOiBTUUxFbmdpbmUsIFJlcGxpY2F0aW9uLCBGdWxsVGV4dCwgUlMKCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiUHJlcGFyZUltYWdlIiksICR0cnVlLCAiUHJlcGFyZUltYWdlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVFbmFibGVkIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVTb3VyY2UiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKIyAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJSUyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGRUFUVVJFUyIgLUxpc3QgLUNvbnN0cmFpbnRzICgiU1FMIiwiU1FMRW5naW5lIiwiUmVwbGljYXRpb24iLCJGdWxsVGV4dCIsIkRRIiwiQVMiLCJSUyIsIkRRQyIsIklTIiwiTURTIiwiVG9vbHMiLCJCQyIsIkJPTCIsIkJJRFMiLCJDb25uIiwiU1NNUyIsIkFEVl9TU01TIiwiRFJFUExBWV9DVExSIiwiRFJFUExBWV9DTFQiLCJTTkFDX1NESyIsIlNESyIsIkxvY2FsREIiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTSEFSRURESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQU5DRUlEIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2VTUDFVMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgVGhpcyBjbWRsZXQgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9yIGxhdGVyLgoKICAgIE5vdGUgdGhhdCBmb3IgaW5zdGFsbGVyIHZlcnNpb24gb2YgTVMgU1FMIFNlcnZlciBwcmlvciB0byAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9ubHkgdGhlCiAgICBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDogU1FMRW5naW5lLCBSZXBsaWNhdGlvbiwgRnVsbFRleHQsIFJTCgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlByZXBhcmVJbWFnZSIpLCAkdHJ1ZSwgIlByZXBhcmVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlU291cmNlIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJDT05GSUdVUkFUSU9ORklMRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJISURFQ09OU09MRSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk1TU1FMU0VSVkVSIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIkNvbXBsZXRlSW1hZ2UiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IElOU1RBTkNFSUQgcGFyYW1ldGVyIHZhbHVlIE1VU1QgYmUgdGhlIHNhbWUgYXMgc3BlY2lmaWVkIG9uICJQcmVwYXJlSW1hZ2UiIHBoYXNlLgoKICAgIEFsbCBkb2N1bWVudGVkIG9wdGlvbiBhcmUgc3VwcG9ydGVkLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvciBkZXRhaWxzOgogICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKICAgICM+CiAgICAkT3B0aW9uUGFyc2VyID0gTmV3LU9wdGlvblBhcnNlcgoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBQ1RJT04iIC1TdHJpbmcgLUNvbnN0cmFpbnRzICJDb21wbGV0ZUltYWdlIiksICR0cnVlLCAiQ29tcGxldGVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VJRCIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTVJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkhJREVDT05TT0xFIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUdUU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJCUk9XU0VSU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTkFCTEVSQU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQUxMU1FMREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0FQV0QiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNFQ1VSSVRZTU9ERSIgLVN0cmluZyAtQ29uc3RyYWlucnMgKCJTUUwiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxDT0xMQVRJT04iIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1MRVZFTCIgLVN0cmluZyAtQ29uc3RyYWludHMgKCIwIiwgIjEiLCAiMiIsICIzIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1TSEFSRU5BTUUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiTlBFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVENQRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTSU5TVEFMTE1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU2hhcmVQb2ludEZpbGVzT25seU1vZGUiLCAiRGVmYXVsdE5hdGl2ZU1vZGUiLCAiRmlsZXNPbmx5TW9kZSIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDU3RhcnR1cFR5cGUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICByZXR1cm4gJE9wdGlvblBhcnNlcgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVJbWFnZVNQMVUyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiQ29tcGxldGVJbWFnZSIgYWN0aW9uLgoKICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBTUDEgQ2ltaWxhdGl2ZSBVcGRhdGUgMiBvciBsYXRlci4KCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiQ29tcGxldGVJbWFnZSIpLCAkdHJ1ZSwgIkNvbXBsZXRlSW1hZ2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklBQ0NFUFRTUUxTRVJWRVJMSUNFTlNFVEVSTVMiIC1Td2l0Y2gpLCAkdHJ1ZSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFUlJPUlJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUElEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkJST1dTRVJTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOQUJMRVJBTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTUUxEQVRBRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTQVBXRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0VDVVJJVFlNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW5ycyAoIlNRTCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxCQUNLVVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTENPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTUxFVkVMIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIjAiLCAiMSIsICIyIiwgIjMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTVNIQVJFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNBQ0NPVU5UIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJOUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJUQ1BFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNJTlNUQUxMTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJTaGFyZVBvaW50RmlsZXNPbmx5TW9kZSIsICJEZWZhdWx0TmF0aXZlTW9kZSIsICJGaWxlc09ubHlNb2RlIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJVcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckVkaXRpb25VcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlcGFpciB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJSZWJ1aWxkZGF0YWJhc2UgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiSU5TVEFMTCIgYWN0aW9uLgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlVOSU5TVEFMTCIpLCAkdHJ1ZSwgIlVOSU5TVEFMTCIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZFQVRVUkVTIiAtTGlzdCAtQ29uc3RyYWludHMgKCJTUUwiLCJTUUxFbmdpbmUiLCJSZXBsaWNhdGlvbiIsIkZ1bGxUZXh0IiwiRFEiLCJBUyIsIlJTIiwiRFFDIiwiSVMiLCJNRFMiLCJUb29scyIsIkJDIiwiQk9MIiwiQklEUyIsIkNvbm4iLCJTU01TIiwiQURWX1NTTVMiLCJEUkVQTEFZX0NUTFIiLCJEUkVQTEFZX0NMVCIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VOQU1FIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsRmFpbG92ZXJDbHVzdGVyIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVXBncmFkZSB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJBZGROb2RlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlbW92ZU5vZGUgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9Cg==", "SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKZnVuY3Rpb24gVGVzdC1LZXkoW3N0cmluZ10kcGF0aCwgW3N0cmluZ10ka2V5KSB7CiAgICBpZighKFRlc3QtUGF0aCAkcGF0aCkpIHsgcmV0dXJuICRmYWxzZSB9CiAgICBpZiAoKEdldC1JdGVtUHJvcGVydHkgJHBhdGgpLiRrZXkgLWVxICRudWxsKSB7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCmZ1bmN0aW9uIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBNUyBTUUwgU2VydmVyIHByZXJlcXVpc2l0ZXMgKC5OZXQgRnJhbWV3b3JrIDMuNSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgICM+CiAgICBpZiAoLW5vdCAoVGVzdC1LZXkgIkhLTE06XFNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41IiAiSW5zdGFsbCIpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBTZXJ2ZXJNYW5hZ2VyCiAgICAgICAgV3JpdGUtSG9zdCAiLk5ldCBGcmFtZXdvcmsgMy41IG5vdCBmb3VuZC4gSW5zdGFsbGluZyBpdCB1c2luZyBTZXJ2ZXIgTWFuYWdlci4uLiIKICAgICAgICAkRmVhdHVyZSA9IEdldC1XaW5kb3dzRmVhdHVyZSBORVQtRnJhbWV3b3JrCiAgICAgICAgaWYgKCRGZWF0dXJlIC1lcSAkbnVsbCkgewogICAgICAgICAgICAjIFdlIGFyZSBwcm9iYWJseSBvbiBXaW5kb3dzIFNlcnZlciAyMDEyCiAgICAgICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmstQ29yZQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkRmVhdHVyZSkgewogICAgICAgICAgICB0aHJvdyAiLk5ldCBmcmFtZXdvcmsgMy41IGZlYXR1cmUgd2FzIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlLkRpc3BsYXlOYW1lIC1tYXRjaCAiMy41IikgewogICAgICAgICAgICBMb2ctV2FybmluZyAiLk5ldCBmcmFtZXdvcmsgMy41IGlzIHJlcXVpcmVkLCBidXQgJCgkRmVhdHVyZS5EaXNwbGF5TmFtZSkgaXMgYXZhaWxhYmxlIGFzIFdpbmRvd3MgZmVhdHVyZS4gUHJvY2VlZGluZyB3aXRoIGluc3RhbGxhdGlvbiIKICAgICAgICB9CiAgICAgICAgW3ZvaWRdKEFkZC1XaW5kb3dzRmVhdHVyZSAkRmVhdHVyZSkKICAgIH0KfQoKZnVuY3Rpb24gTmV3LVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUSIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiKSArICRFeHRyYUZlYXR1cmVzfSArICRFeHRyYU9wdGlvbnMpCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSB3aXRoIGFsbCBuZWVkZWQgZmVhdHVyZXMgdG8gc2V0IHVwIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCAKICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW4gdW5hdHRlbmRlZCBtb2RlLiBBbGwgZmVhdHVyZXMgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cHMgYXJlCiAgICBpbnN0YWxsZWQuCgogICAgQWxsIGF2YWlsYWJpbGl0eSBncm91cCBtZW1iZXJzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgU1FMU3ZjVXNyRG9tYW4sIFNRTFN2Y1Vzck5hbWUgYW5kIFNRTFN2Y1VzclBhc3N3b3JkIHBhcmFtZXRlcnMuCiAgICBVc2VyIG11c3QgYmUgYSBkb21haW4gdXNlciBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIG5vZGVzIGludGVyY29ubmVjdGlvbi4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JEb21haW4KICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IGRvbWFpbiBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyTmFtZQogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzclBhc3N3b3JkCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgcmVtb3ZlZCBiZXNpZGVzICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JEb21haW4sCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU1FMU3ZjVXNyTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JQYXNzd29yZCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRTUUxVc2VyID0gIiRTUUxTdmNVc3JEb21haW5cJFNRTFN2Y1Vzck5hbWUiCiAgICAkZG9tYWluID0gTmV3LU9iamVjdCBTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuRGlyZWN0b3J5RW50cnkoIkxEQVA6Ly8kU1FMU3ZjVXNyRG9tYWluIiwgJFNRTFN2Y1Vzck5hbWUsICRTUUxTdmNVc3JQYXNzd29yZCkKCiAgICBpZiAoJGRvbWFpbi5uYW1lIC1lcSAkbnVsbCkgewogICAgICAgIHRocm93ICJDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgdXNlciAkU1FMVXNlci4gQ2hlY2sgZG9tYWluLCBsb2dpbiBuYW1lIGFuZCBwYXNzd29yZC4iCiAgICB9CgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIsICJEUkVQTEFZX0NUTFIiLCAiRFJFUExBWV9DTFQiKSArICRFeHRyYUZlYXR1cmVzOwogICAgICAgICJBR1RTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQUdUU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiQVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJBU1NZU0FETUlOQUNDT1VOVFMiID0gJFNRTFVTZXI7CiAgICAgICAgIlNRTFNWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJTUUxTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJTUUxTWVNBRE1JTkFDQ09VTlRTIiA9ICRTUUxVc2VyOyAiSVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiSVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7IAogICAgICAgICJSU1NWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJSU1NWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZH0gKyAkRXh0cmFPcHRpb25zKQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gUmVtb3ZlLVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQKCiAgICAuREVTQ1JJUFRJT04KICAgIFVuaW5zdGFsbHMgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbnN0YWxsZWQgd2l0aCBOZXctU1FMU2VydmVyIGNtZGxldCBpbiB1bmF0dGVuZGVkIG1vZGUKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIHJlbW92ZWQgYmVzaWRlcyAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJVbmluc3RhbGwKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlEiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIikgKyAkRXh0cmFGZWF0dXJlc30pCgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSIKICAgIH0KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgp9CgpmdW5jdGlvbiBJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLiBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sIAogICAgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIi4gTm90ZSB0aGF0IHByaW9yIHRvCiAgICBTUUwgU2VydmVyIHZlcnNpb24gMjAxMiBTZXJ2aWNlIFBhY2sgMSBDdW11bGF0aXZlIFVwZGF0ZSAyIChKYW51YXJ5IDIwMTMpIG9ubHkgIlJlcGxpY2F0aW9uIiwgCiAgICAiRnVsbFRleHQiIGFuZCAiUlMiIG1heSBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gIlNRTEVuZ2luZSIuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yCiAgICBkZXRpYWxzOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU2V0dXBSb290LAogICAgICAgIFthcnJheV0kRXh0cmFGZWF0dXJlcyA9IEAoKQogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICBSZXNvbHZlLVNRTFNlcnZlclByZXJlcXVpc2l0ZXMKCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZQogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUVMiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiKSArICRFeHRyYUZlYXR1cmVzIH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb21wbGV0ZS1TUUxTZXJ2ZXJBZnRlclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgcHJldmlvdXNseSBwcmVwYXJlZCB3aXRoICJJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAiIE1TIFNRTCBTZXJ2ZXIgYWZ0ZXIgdGhlIHN5c3RlbSB3YXMgcmVhcm1lZC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIAogICAgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdAogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsfSkKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxTdHJpbmcgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3RlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3Rlcy4gVGhlIHN0cmluZyBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVycy4KICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNzk4OTkuYXNweAoKICAgIC5QQVJBTUVURVIgUwogICAgU3RyaW5nIHRvIGNvbnZlcnQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlLCBWYWx1ZUZyb21QaXBlbGluZSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTCiAgICApCiAgICAKICAgIHJldHVybiAiJyQoJFMgLXJlcGxhY2UgIiciLCAiJyciKSciCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxOYW1lIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc1ODc0LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgcmV0dXJuICJbJCgkUyAtcmVwbGFjZSAiXSIsICJdXSIpXSIKfQoKZnVuY3Rpb24gSW52b2tlLVNRTFRleHQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dC4gUmV0dXJucyByYXcgU1FMIHNlcnZlciBvdXRwdXQuCgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQoKICAgICNXcml0ZS1XYXJuaW5nICIkU1FMYG4iCiAgICAjcmV0dXJuCgogICAgJEJpbmFyeSA9IEdldC1Db21tYW5kICJzcWxjbWQuZXhlIgoKICAgICR0ZW1wRmlsZSA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICR0ZW1wRmlsZSA9IEdldC1JdGVtICR0ZW1wRmlsZQogICAgU2V0LUNvbnRlbnQgLVBhdGggJHRlbXBGaWxlIC1WYWx1ZSAkU1FMCgogICAgJENvbW1hbmRMaW5lID0gQCgnLWgnLCAnLTEnLCAnLWInLCAnLWknLCAiYCIkKCR0ZW1wRmlsZS5GdWxsTmFtZSlgIiIpCiAgICBpZiAoKCRVc2VyIC1uZSAkbnVsbCkgLWFuZCAoJFVzZXIgLW5lICcnKSkgewogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctVScKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkVXNlcgogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctUCcKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkUGFzc3dvcmQKICAgIH0KCiAgICBXcml0ZS1EZWJ1ZyAiRXhlY3V0aW5nOiBgbiRTUUxgbiIKICAgIFtzdHJpbmddJG91dHB1dCA9ICYkQmluYXJ5ICRDb21tYW5kTGluZQoKICAgICRFeGl0Q29kZSA9ICRMYXN0RXhpdENvZGUKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICBXcml0ZS1XYXJuaW5nICRvdXRwdXQKICAgICAgICB0aHJvdyAiU1FMQ01ELkVYRSByZXR1cm5lZCB3aXRoIGV4aXQgY29kZSAkRXhpdENvZGUgd2hpbGUgcnVubmluZyAkQmluYXJ5ICRDb21tYW5kTGluZSIKICAgIH0KICAgCiAgICBSZW1vdmUtSXRlbSAkdGVtcEZpbGUKCiAgICByZXR1cm4gJG91dHB1dAp9CgpmdW5jdGlvbiBOZXctU1FMVXNlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQp9CgpmdW5jdGlvbiBOZXctUGFzc3dvcmQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyByYW5kb20gcGFzc3dvcmQgb2YgdGhlIHNwZWNpZmllZCBsZW5ndGgKCiAgICAuREVTQ1JJUFRJT04KICAgIFBhc3N3b3JkIGNvbnRhaW5zIHJhbmRvbSBjaGFyYWN0ZXJzIGEteiwgQS1aLCBudW1iZXJzIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMuCiAgICBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbGwgdGhlIHR5cGVzIG9mIHN5bWJvbHMgd2lsbCBiZSBwcmVzZW50IGluIHRoZSBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIExlbmd0aAogICAgRGVzaXJlZCBsZW5ndGggb2YgdGhlIHBhc3N3b3JkLgoKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRMZW5ndGg9NgogICAgKQoKICAgICRSZXN1bHQgPSAiIgogICAgJGFscGhhID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5IUAjJCVeJiooKSdgImBgXytbXVx7fXw7OiwuLzw+P34iCiAgICB3aGlsZSAoJExlbmd0aCAtZ3QgMCkgewogICAgICAgICR4ID0gR2V0LVJhbmRvbSAkYWxwaGEuTGVuZ3RoCiAgICAgICAgJGMgPSAkYWxwaGFbJHhdCiAgICAgICAgJFJlc3VsdCA9ICIkUmVzdWx0JGMiCiAgICAgICAgJExlbmd0aCA9ICRMZW5ndGggLSAxCiAgICB9CiAgICByZXR1cm4gJFJlc3VsdAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5ERVNDUklQVElPTgogICAgTWFzdGVyIGtleSBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeS4gSG9zdCBjZXJ0aWZpY2F0ZSBpcyBjcmVhdGVkIHdoZW4gbmVjZXNzYXJ5IGVpdGhlciAobm9ybWFsbHkgb24gZmlyc3QgZW5kcG9pbnQgY3JlYXRpb24pLgoKICAgIEVuZHBvaW50IGFuZCBjZXJ0aWZpY2F0ZSBhcmUgcmVjcmVhdGVkIGluIGNhc2UgaWYgbWFzdGVyIGtleSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3Qgbm9ybWFsbHkgaGFwcGVuKS4KCiAgICBFbmRwb2ludCBpcyByZWNyZWF0ZWQgaW4gY2FzZSBpZiBjZXJ0aWZpY2F0ZSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyB0aGUgZW5kcG9pbnQgd2FzIGNyZWF0ZWQgbWFudWFsbHkpLgoKICAgIE1pcnJvcmluZyBlbmRwb2ludCBpcyBjcmVhdGVkIHVubGVzcyBvbmUgYWxyZWFkeSBleGlzdHMuIFRoZSBlbmRwb2ludCBpcyBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBXaGVuIHRoZSBlbmRwb2ludAogICAgYWxyZWFkeSBleGlzdHMgaXMgaXMgdW5jaGFuZ2VkLgoKICAgIEVuZHBvaW50IHBvcnQgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseSBhcyA0MDIyIG9yIGFzIGZpcnN0IGF2YWlsYWJsZSBwb3J0IGFmdGVyIDQwMjIgaW4gY2FzZSBpZiA0MDIyIGlzIGFscmVhZHkgbGlzdGVuaW5nLgogICAgSWYgdGhlcmUgaXMgbm8gZmlyZXdhbGwgcnVsZSB3aXRoIG5hbWUgJ0RhdGFiYXNlTWlycm9yaW5nLVRDUC17cG9ydG51bWJlcn0nLCBhbGxvd2luZyBydWxlIGlzIGNyZWF0ZWQuCgogICAgQ2VydGlmaWNhdGUgaXMgc3RvcmVkIGluIHRoZSBzcGVjaWZpZWQgZmlsZS4KCiAgICBSZXR1cm5zIGVuZHBvaW50IGxpc3RlbmluZyBwb3J0LgoKICAgIC5QQVJBTUVURVIgRW5jcnlwdGlvblBhc3N3b3JkCiAgICBFbmNyeXB0aW9uIHBhc3N3b3JkIHVzZWQgdG8gY3JlYXRlIGNlcnRpZmljYXRlLgoKICAgIC5QQVJBTUVURVIgQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgQ2VydGlmaWNhdGUgdGFyZ2V0IGZpbGUgbmFtZS4gRmlsZSBNVVNUIE5PVCBleGlzdC4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRDZXJ0aWZpY2F0ZUZpbGVOYW1lCiAgICApCgogICAgJEVuZHBvaW50TmFtZSA9ICdNaXJyb3JpbmdFbmRwb2ludCcKCiAgICAkRm9sZGVyID0gR2V0LUl0ZW0gJFdvcmtEaXIKCiAgICAkSCA9ICRFbnY6Q09NUFVURVJOQU1FIC1yZXBsYWNlICdbXkEtWmEtejAtOV9dJywgJ18nCgogICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0IDQwMjIKCiAgICAkQ3JlYXRlTWFzdGVyS2V5ID0gIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5bW1ldHJpY19rZXlzIHdoZXJlIG5hbWUgPSAnIyNNU19EYXRhYmFzZU1hc3RlcktleSMjJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBNQVNURVIgS0VZIEVOQ1JZUFRJT04gQlkgUEFTU1dPUkQgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJEVuY3J5cHRpb25QYXNzd29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X2NlcnQgV0lUSCBTVUJKRUNUID0gJyR7SH0gZW5kcG9pbnQgY2VydGlmaWNhdGUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIEJBQ0tVUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQgVE8gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJENlcnRpZmljYXRlRmlsZU5hbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBwb3J0IGludAogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoU0VMRUNUICogRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSBwb3J0IEZST00gc3lzLnRjcF9lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIEVORCBFTFNFCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgRU5EUE9JTlQgJChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFID0gU1RBUlRFRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTIFRDUCAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJU1RFTkVSX1BPUlQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIExJU1RFTkVSX0lQID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0VfTUlSUk9SSU5HICggCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhFTlRJQ0FUSU9OID0gQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgRU5DUllQVElPTiA9IFJFUVVJUkVEIEFMR09SSVRITSBBRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBST0xFID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAncG9ydDooJyArIENPTlZFUlQoVkFSQ0hBUiwgYEBwb3J0KSArICcpJyBhcyBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRDcmVhdGVNYXN0ZXJLZXkKICAgIFtpbnRdJFBvcnQgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipwb3J0OlwoKFteKV0qKVwpLionLCAnJDEnCgogICAgIyBPcGVuIHBvcnQgaW4gV2luZG93cyBGaXJld2FsbAoKICAgICRQb3J0T3BlbiA9ICRmYWxzZQogICAgJFJ1bGVOYW1lID0gIkRhdGFiYXNlTWlycm9yaW5nLVRDUC0kUG9ydCIKICAgIEdldC1OZXRGaXJld2FsbFJ1bGUgfCBGb3JlYWNoLU9iamVjdCB7CiAgICAgICAgaWYgKCRfLk5hbWUgLWVxICRSdWxlTmFtZSkgewogICAgICAgICAgICAkUG9ydE9wZW4gPSAkdHJ1ZQogICAgICAgIH0KICAgIH0KICAgIGlmICgtbm90ICRQb3J0T3BlbikgewogICAgICAgICREaXNwbGF5TmFtZSA9ICJNUyBTUUwgRGF0YWJhc2UgTWlycm9yaW5nIEVuZHBvaW50IGF0IFRDUCBwb3J0ICRQb3J0IgogICAgICAgIE5ldy1OZXRGaXJld2FsbFJ1bGUgLU5hbWUgJFJ1bGVOYW1lIC1EaXNwbGF5TmFtZSAkRGlzcGxheU5hbWUgLURlc2NyaXB0aW9uICREaXNwbGF5TmFtZSAtUHJvdG9jb2wgVENQIC1Mb2NhbFBvcnQgJFBvcnQgLUVuYWJsZWQgVHJ1ZSAtUHJvZmlsZSBBbnkgLUFjdGlvbiBBbGxvdwogICAgfQogICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIENvbXBsZXRlLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBtaXJyb3JpbmcgZW5kcG9pbnQKCiAgICAuREVTQ1JJUFRJT04KICAgIEFsbG93cyBpbmJvdW5kIGNvbm5lY3Rpb25zIGZyb20gcmVtb3RlIGhvc3QKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TG9naW4sCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFVzZXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFBhc3N3b3JkCiAgICApCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRSZW1vdGVXb3JrRGlyCiAgICAkUmVtb3RlV29ya0RpciA9ICRGb2xkZXIuRnVsbE5hbWUKCiAgICAkSCA9ICRSZW1vdGVIb3N0TmFtZSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgIGlmICgtbm90ICRSZW1vdGVIb3N0TG9naW4pIHsKICAgICAgICAkUmVtb3RlSG9zdExvZ2luID0gIiR7SH1fbG9naW4iCiAgICB9CiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdFVzZXIpIHsKICAgICAgICAkUmVtb3RlSG9zdFVzZXIgPSAiJHtIfV91c2VyIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RQYXNzd29yZCkgewogICAgICAgICRSZW1vdGVIb3N0UGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKICAgIH0KCiAgICAkU1FMID0gICAgICAgICAgICAgIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnNxbF9sb2dpbnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RMb2dpbikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSBXSVRIIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0UGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuc3lzdXNlcnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RVc2VyKSkKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBVU0VSICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RVc2VyKSBGT1IgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWU9JyR7SH1fcmVtb3RlX2NlcnQnKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIENFUlRJRklDQVRFICR7SH1fcmVtb3RlX2NlcnQgQVVUSE9SSVpBVElPTiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRlJPTSBGSUxFID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAnbmFtZTooJyArIGBAbmFtZSArICcpJyBhcyBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICIKCiAgICAkcmF3ZGF0YSA9IEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTAogICAgJEVuZHBvaW50TmFtZSA9ICRyYXdkYXRhIC1yZXBsYWNlICcuKm5hbWU6XCgoW14pXSopXCkuKicsICckMScKICAgICRTUUwgPSAgICAgICAgICAgICAiR1JBTlQgQ09OTkVDVCBPTiBFTkRQT0lOVDo6JChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKSBUTyAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0TG9naW4pIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTCkKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMTWlycm9yIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBjcmVhdGlvbiBvZiBtaXJyb3JlZCBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSBmaXJzdCBleGVjdXRlZCBvbiBtaXJyb3Igc2VydmVyIGFuZCB0aGVuIG9uIHByaW5jaXBhbCBzZXJ2ZXIuCiAgICBPdGhlcndpc2UgaXQgd2lsbCBmYWlsIChob3dldmVyIGl0IG1heSBiZSBleGVjdXRlZCBhZ2FpbiB3aXRoIG5vIGhhcm0pLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbSW50XSRSZW1vdGVQb3J0LAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgICRVcmwgPSAiVENQOi8vJHtSZW1vdGVIb3N0TmFtZX06JHtSZW1vdGVQb3J0fSIKICAgICRBbHRlckRiID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIFBBUlRORVIgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJFVybCk7CiAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRiKQp9CgpmdW5jdGlvbiBOZXctU1FMRGF0YWJhc2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBlbXB0eSBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlIHdpdGggZGVmYXVsdCBzZXR0aW5ncy4gRmFpbHMgaW4gY2FzZSBpcyB0aGUgZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIERhdGFiYXNlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBtZGZGaWxlCiAgICBOYW1lIG9mIHRoZSBNREYgKGRhdGEpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX0ubWRmIgogICAgV2hlcmUge0RhdGFCYXNlUGF0aE5hbWV9IGlzIGRhdGFiYXNlIG5hbWUgd2l0aCBhbGwgYnV0IEEtWiwgYS16LCAwLTkgY2hhcmFjdGVycwogICAgcmVwbGFjZWQgYnkgdW5kZXJzY29yZS4KCiAgICAuUEFSQU1FVEVSIERhdGFCYXNlTmFtZQogICAgTmFtZSBvZiB0aGUgTERGICh0cmFuc2FjdGlvbiBsb2cpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZSwKICAgICAgICBbU3RyaW5nXSRtZGZGaWxlPSRudWxsLAogICAgICAgIFtTdHJpbmddJGxkZkZpbGU9JG51bGwKICAgICkKCiAgICAkRGF0YUJhc2VQYXRoTmFtZSA9ICREYXRhQmFzZU5hbWUgLXJlcGxhY2UgJ1teMC05YS16QS1aXScsICdfJwogICAgaWYgKC1ub3QgJG1kZkZpbGUpIHsKICAgICAgICAkbWRmRmlsZSA9ICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVwke0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIH0KICAgIGlmICgtbm90ICRsZGZGaWxlKSB7CiAgICAgICAgJGxkZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfV9sb2cubGRmIgogICAgfQoKICAgICROZXdEYXRhYmFzZSA9ICIKICAgICAgICBDUkVBVEUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgICAgICAgICAgQ09OVEFJTk1FTlQgPSBOT05FCiAgICAgICAgICAgICAgICBPTiAgUFJJTUFSWSAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkRGF0YUJhc2VOYW1lKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRtZGZGaWxlKSAsIFNJWkUgPSA0MDk2S0IgLCBGSUxFR1JPV1RIID0gMTAyNEtCICkKICAgICAgICAgICAgICAgIExPRyBPTiAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJHtEYXRhQmFzZU5hbWV9X2xvZyIpLCBGSUxFTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJGxkZkZpbGUpICwgU0laRSA9IDEwMjRLQiAsIEZJTEVHUk9XVEggPSAxMCUpCiAgICAgICAgR08KICAgICAgICBVU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgIEdPCiAgICAgICAgSUYgTk9UIEVYSVNUUyAoU0VMRUNUIG5hbWUgRlJPTSBzeXMuZmlsZWdyb3VwcyBXSEVSRSBpc19kZWZhdWx0PTEgQU5EIG5hbWUgPSBOJ1BSSU1BUlknKSBBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIE1PRElGWSBGSUxFR1JPVVAgW1BSSU1BUlldIERFRkFVTFQKICAgICAgICBHTyIKCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkTmV3RGF0YWJhc2UpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCAodGhpcyBpcyBhYnNvbHV0ZWx5IHN5bW1ldHJpYyBzdGVwIHRvIHRoZSBtaXJyb3IgaW5pdCkuIEluIGFkZGl0aW9uIHRvIHRoYXQgaXQgY3JlYXRlcwogICAgYSBkYXRhYmFzZSBhbmQgc3RvcmVzIGJhY2t1cHMgb2YgaXQgYW5kIGl0cyB0cmFuc2FjdGlvbiBsb2cgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBlbmRwb2ludCBjZXJ0aWZpY2F0ZS4KCiAgICBBIGZpcmV3YWxsIHJ1bGUgaXMgY3JlYXRlZCBmb3IgZW5kcG9pbnQgaWYgbmVjZXNzYXJ5LgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBtaXJyb3Igc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIGJlIHVzZSBhdCBtaXJyb3Igc2VydmVyIGVpdGhlci4KICAgIAogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQogICAgaWYgKChHZXQtQ2hpbGRJdGVtIC1QYXRoICRXb3JrRGlyKS5MZW5ndGggLWd0IDApIHsKICAgICAgICB0aHJvdyAiV29ya2luZyBkaXJlY3RvcnkgJFdvcmtEaXIgaXMgbm90IGVtcHR5IgogICAgfQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCiAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQoKICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsIE5BTUUgPSBOJ0Z1bGwgRGF0YWJhc2UgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAkQmFja3VwTG9nID0gIkJBQ0tVUCBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlX2xvZy5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCAgTkFNRSA9IE4nVHJhbnNhY3Rpb24gTG9nICBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAobWlycm9yKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIG1pcnJvciBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpcgogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAzKQoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIG1pcnJvciBjcmVhdGlvbi4gVGhpcyBzdGVwIG11c3QgYmUgZ2xvYmFsbHkgdGhlIGxhc3Qgb25lIGluIG1pcnJvciBjcmVhdGlvbiBzZXF1ZW5jZS4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZSBhbmQgbmFtZSBwcm92aWRlZCBvbiBzdGVwIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UxKQoKICAgIC5ERVNDUklQVElPTgogICAgSW5pdGlhbGl6ZXMgbWlycm9yaW5nIGVuZHBvaW50IGZvciBtaXJyb3Igc2VydmVyLiBTdG9yZXMgbWlycm9yaW5nIGVuZHBvaW50IGNlcnRpZmljYXRlIGluIFdvcmtkaXIuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5kIGRpcmVjdG9yeS4gVGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRyYW5mZXJyZWQgdG8gdGhlIHByaW5jaXBhbCBzZXJ2ZXIgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMikKCiAgICAuREVTQ1JJUFRJT04KICAgIEltcG9ydHMgcmVtb3RlIHNlcnZlciBjZXJ0aWZpY2F0ZSBhbmQgZ3JhbnRzIGl0IHdpdGggYWNjZXNzIHRvIHRoZSBtaXJyb3JpbmcgZW5kcG9pbnQuCiAgICBSZXN0b3JlcyBkYXRhYmFzZSBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBhbmQgbGVhdmVzIGl0IGluICdSZXN0b3JpbmcnIHN0YXRlLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKCiAgICAkUmVzdG9yZURiID0gIlJFU1RPUkUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2UuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRSZW1vdGVXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGV4ZWN1dGVkIHN0cmljdGx5IGJlZm9yZSBzeW1tZXRyaWMgc3RlcCBvbiB0aGUgcHJpbmNpcGFsLgoKICAgIE5vdGUgdGhhdCB0aGUgcmVtb3RlIGhvc3QgY2VydGlmaWNhdGUgaXMgdmFsaWQgZnJvbSB0aGUgdGltZSBpdCBpcyBjcmVhdGVkIHRoZXJlLiBTbwogICAgdGhpcyBzdGVwIHdpbGwgZmFpbCBpZiB0aGVyZSBpcyBub3RpY2FibGUgZGlmZmVyZW50IGluIHRpbWUgbG9jYWwgYW5kIHJlbW90ZSBtYWNoaW5lcy4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbaW50XSRwb3J0ID0gR2V0LUNvbnRlbnQgIiR7UmVtb3RlV29ya0Rpcn1cZW5kcG9pbnQtcG9ydC50eHQiCiAgICBDb21wbGV0ZS1TUUxNaXJyb3IgJFJlbW90ZUhvc3ROYW1lICRwb3J0ICREYXRhYmFzZU5hbWUKfQoKZnVuY3Rpb24gR2V0LU5leHRGcmVlUG9ydCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBSZXR1cm5zIHNwZWNpZmllZCBkZXNpcmVkIHBvcnQgb3IgY2xvc2VzdCBuZXh0IG9uZSB1bm9jY3VwaWVkLgoKICAgIC5QQVJBTUVURVIgUG9ydAogICAgRGVzaXJlZCBwb3J0IG51bWJlci4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtpbnRdJFBvcnQKICAgICkKICAgICRPcGVuUG9ydHMgPSBuZXRzdGF0IC1hb24gfCBzZWxlY3Qtc3RyaW5nICdMSVNURU5JTkcnIHwgRm9yZWFjaC1PYmplY3QgeyAoKCRfIC1yZXBsYWNlICdeXHMqJywgJycgLXNwbGl0ICdccysnKVsxXSAtc3BsaXQgJy4qOicpWzFdIH0gfCBTb3J0LU9iamVjdCB8IEdldC1VbmlxdWUKICAgIHdoaWxlICgkT3BlblBvcnRzLkNvbnRhaW5zKCR7UG9ydH0pKSB7CiAgICAgICAgJFBvcnQgPSAkUG9ydCArIDEKICAgIH0KICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluaXRpYWxpemVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlciBhbmQgY3JlYXRlcyBBbHdheXNPbiBlbmRwb2ludCBsaXN0ZW5lci4gUmV0dXJucyBBbHdheXNPbiBlbmRwb2ludCBwb3J0IG51bWJlci4KCiAgICAuREVTQ1JJUFRJT04KICAgIEVuYWJsZXMgQWx3YXlzT24gY2x1c3RlcmluZyBvbiBsb2NhbCBTUUwgc2VydmVyLiBDcmVhdGVzIEFsd2F5c09uIFRDUCBlbmRwb2ludCBvbiBwb3J0IDUwMjIgb3IgZ3JlYXRlciBpZiB0aGUgb25lIGlzIG9jY3VwaWVkLiAgIAogICAgIz4KCiAgICBpZiAoIShUZXN0LVBhdGggU1FMU0VSVkVSOlwpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBzcWxwcwogICAgfQogICAgJE1hY2hpbmVOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUwpWzBdLlBTQ2hpbGROYW1lCiAgICAkSW5zdGFuY2VOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lKS5QU0NoaWxkTmFtZQogICAgJEFsd2F5c09uRW5hYmxlZCA9ICgoR2V0LUl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lXCRJbnN0YW5jZU5hbWUpIHwgc2VsZWN0IElzSGFkckVuYWJsZWQpLklzSGFkckVuYWJsZWQKICAgIGlmICgtbm90ICRBbHdheXNPbkVuYWJsZWQpIHsKICAgICAgICBFbmFibGUtU3FsQWx3YXlzT24gLVBhdGggIlNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lIiAtRm9yY2UKICAgIH0KICAgICRJbnN0YW5jZSA9IEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICAkZW5kcG9pbnQgPSAkSW5zdGFuY2UuRW5kcG9pbnRzWyJBbHdheXNPbkVuZHBvaW50Il0KICAgIGlmICgtbm90ICRlbmRwb2ludCkgewogICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA1MDIyCiAgICAgICAgJGVuZHBvaW50ID0gTmV3LVNxbEhhZHJFbmRwb2ludCBBbHdheXNPbkVuZHBvaW50IC1Qb3J0ICRQb3J0IC1QYXRoIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICB9IGVsc2UgewogICAgICAgICRQb3J0ID0gJGVuZHBvaW50LlByb3RvY29sLlRjcC5MaXN0ZW5lclBvcnQKICAgIH0gCiAgICBpZiAoJGVuZHBvaW50LkVuZHBvaW50U3RhdGUgLW5lICJTdGFydGVkIikgewogICAgICAgICRlbmRwb2ludC5TdGFydCgpCiAgICB9ICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbmV3IEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBvbiBwcmltYXJ5IHJlcGxpY2EuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSByZXBsaWNhIHNlcnZlcihzKSBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgQXZhaWxhYmlsaXR5IGdyb3VwIG5hbWUuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWVzCiAgICBSZXBsaWNhIGRhdGFiYXNlKHMpIG5hbWVzLgoKICAgIC5QQVJBTUVURVIgUmVwbGljYURlZnMKICAgIEFycmF5IG9mIHJlcGxpY2EgZGVmaW5pdGlvbi4gRWFjaCBkZWZpbml0aW9uIGlzIGEgaGFzaCB0YWJsZSB3aXRoIHJlcGxpY2Etc3BlY2lmaWMgdmFsdWVzLgogICAgCiAgICBNYW5kYXRvcnkgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW1N0cmluZ10gU0VSVkVSX0lOU1RBTkNFICAgLSBSZXBsaWNhIHNlcnZlciBpbnN0YW5jZSBuYW1lCiAgICAgICAgKiBbU3RyaW5nXSBFTkRQT0lOVF9VUkwgICAgICAtIFJlcGxpY2Egc2VydmVyIGVuZHBvaW50IFVSTC4gTm9ybWFsbHkgaXQgaXMgVENQOi8vZnVsbHkucXVhbGlmaWVkLmRvbWFpbi5uYW1lOjUwMjIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQgbnVtYmVyIHNob3VsZCBiZSBvYnRhaW5lZCB3aXRoIEluaXRpYWxpemUtQWx3YXlzT24gYXQgdGhlIHJlcGxpY2Egc2VydmVyCiAgICAgICAgKiBbU3RyaW5nXSBBVkFJTEFCSUxJVFlfTU9ERSAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiU1lOQ0hST05PVVNfQ09NTUlUIiBvciAiQVNZTkNIUk9OT1VTX0NPTU1JVCIgb25seS4KICAgICAgICAqIFtTdHJpbmddIEZBSUxPVkVSX01PREUgICAgIC0gUmVwbGljYSBhdmFpbGFiaWxpdHkgbW9kZS4gQ2FuIGJlICJNQU5VQUwiIG9yICJBVVRPTUFUSUMiIG9ubHkuCgogICAgT3B0aW9uYWwgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW0ludGVnZXJdIEJBQ0tVUF9QUklPUklUWSAgICAgICAgICAtIEJhY2t1cCBwcmlvcml0eQogICAgICAgICogW0ludGVnZXJdIFNFU1NJT05fVElNRU9VVCAgICAgICAgICAtIFNlc3Npb24gdGltZW91dAogICAgICAgICogW1N0cmluZ10gIFBfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlByaW1hcnkiIHJlcGxpY2EgbW9kZS4gQ2FuIGJlICJSRUFEX1dSSVRFIiBvciAiQUxMIiBvbmx5LgogICAgICAgICogW0FycmF5XSAgIFBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCAtIExpc3Qgb2YgcmVwbGljYXMgcHJvdmlyaW5nIHJlYWRvbmx5IGFjY2VzcyB3aGVuIHRoaXMgb25lIGlzIHByaW1hcnkuCiAgICAgICAgKiBbU3RyaW5nXSAgU19BTExPV19DT05ORUNUSU9OUyAgICAgIC0gQWxsb3dlZCBjb25uZWN0aW9uIHR5cGVzIGZvciAiU2Vjb25kYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSBvbmUgb2YgIk5PIiwgIlJFQURfT05MWSIsICJBTEwiLgogICAgICAgICogW1N0cmluZ10gIFNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMICAtIFJlcGxpY2EgcmVhZC1vbmx5IHJlcXVlc3RzIGxpc3RlbmVyIFVSTC4gTm9ybWFsbHkgZGVmYXVsdCBzZXJ2ZXIgbGlzdGVuZXIgYXQgcG9ydCAxNDMzIGlzIHVzZWQuCgogICAgLlBBUkFNRVRFUiBQcmVmZXJlbmNlcwogICAgSGFzaCB0YWJsZSBvZiBnZW5lcmFsIGF2YWlsYWJpbGl0eSBncm91cCBwcmVmZXJlbmNlcy4gQWxsIHRoZSBrZXlzIGFyZSBvcHRpb25hbC4gU3VwcG9ydGVkIGVudHJ5IGtleXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddICBBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UgLSBBdXRvbWF0ZWQgYmFja3VwIHByZWZlcmVuY2UuIENhbiBiZSAiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiIG9yICJOT05FIi4KICAgICAgICAqIFtTdHJpbmddICBGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCAgICAgLSBGYWlsdXJlIGNvbmRpdGlvbiBsZXZlbC4gQ2FuIGJlICIxIiwgIjIiLCAiMyIsICI0IiBvciAiNSIuCiAgICAgICAgKiBbSW50ZWdlcl0gSEVBTFRIX0NIRUNLX1RJTUVPVVQgICAgICAgIC0gUmVwbGljYSBoZWFsdGggY2hlY2sgdGltZW91dC4KCiAgICAuUEFSQU1FVEVSIExpc3RlbmVyRGVmCiAgICBIYXNoIHRhYmxlIGNvbnRhaW5pbmcgYXZhaWxhYmlsaXR5IGdyb3VwIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24uCgogICAgTWFuZGF0b3J5IGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKCiAgICAgICAgW1N0cmluZ10gTkFNRSAtIExpc3RlbmVyIG5hbWUuCgogICAgT3B0aW9uYWwgbGlzdGVuZXIgY29uZmlndXJhdGlvbiB2YWx1ZXMgYXJlOgogICAgCiAgICAgICAgW1N0cmluZ10gUE9SVCAtIExpc3RlbmVyIHBvcnQgbnVtYmVyLiBJbnRlZ2VyIHZhbHVlIG1heSBiZSBzdWZmaXhlZCBieSBhICIrIiBzeW1vbCAoc3VjaCBhcyAiNTAyMisiKSB3aGljaCBhbGxvd3MgdGhlIHJvdXRpbmUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IG5leHQgZnJlZSBwb3J0IHdpdGggbnVtYmVyIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgICBbU3RyaW5nXSBESENQIC0gREhDUCBsaXN0ZW5lciBhZGRyZXNzIGNvbmZpZ3VyYXRpb24gZmxhZy4gV2hlbiBhbnkgdmFsdWUgc3BlY2lmaWVkLCBESENQIGlzIHVzZWQgdG8gY29uZmlndXJlIGxpc3RlbmVyCiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGlzIGFsc28gdGhlIGRlZmF1bHQgYmVoYXZpb3IpLiBBbHNvLCBhIHNwZWNpZmljIGludGVyZmFjZSBmb3IgREhDUCBtYXkgYmUgc3BlY2lmaWVkIGFzIElQX0FERFJFU1MvTUFTSwogICAgICAgICAgICAgICAgICAgICAgICAobGlrZSAiMTkyLjE2OC4xLjAvMjU1LjI1NS4yNTUuMCIpIGFzIGEgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KICAgICAgICBbQXJyYXldIFNUQVRJQyAtIFN0YXRpYyBJUCBhZGRyZXNzZXMgdG8gbGlzdGVuLiBJUCBhZGRyZXNzZXMgbWF5IGJlIElQdjQgYWRkcmVzc2VzIGluIHRoZSAiSVBfQUREUkVTUy9NQVNLIiBmb3JtIG9yIElQdjYKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VzIGluIHN0YW5kYXJkIElQdjYgbm90YXRpb24uCgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9mZjg3ODM5OS5hc3B4IHBhZ2UgZm9yIG1vcmUgZGV0YWlscyByZWdhcmRpbmcgYWxsIHRoZSBzdXBwb3J0ZWQgb3B0aW9ucy4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtBcnJheV0kRGF0YWJhc2VOYW1lcywKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJFJlcGxpY2FEZWZzLAogICAgICAgIFtwYXJhbWV0ZXJdCiAgICAgICAgW0hhc2h0YWJsZV0kUHJlZmVyZW5jZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0hhc2h0YWJsZV0kTGlzdGVuZXJEZWYKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkUXVvdGVkREJOYW1lcyA9ICgkRGF0YWJhc2VOYW1lcyB8IEZvckVhY2gtT2JqZWN0IHsgQ29udmVydFRvLVNRTE5hbWUgJF8gfSkgLWpvaW4gIiwgIgoKICAgIGlmICgkUHJlZmVyZW5jZXMgLWVxICRudWxsKSB7CiAgICAgICAgJFByZWZlcmVuY2VzID0gQCgpCiAgICB9CiAgICAkUHJlZnMgPSBAKCkKICAgIGZvcmVhY2goJFByZWYgaW4gJFByZWZlcmVuY2VzKSB7CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgJG51bGwpIHsKICAgICAgICAgICAgQ29udGludWUKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgIkFVVE9NQVRFRF9CQUNLVVBfUFJFRkVSRU5DRSIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCJQUklNQVJZIiwgIlNFQ09OREFSWV9PTkxZIiwgIlNFQ09OREFSWSIsICJOT05FIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAkUHJlZi5LZXkpCiAgICAgICAgfSBlbHNlaWYgKCRQcmVmLktleSAtZXEgIkZBSUxVUkVfQ09ORElUSU9OX0xFVkVMIikgewogICAgICAgICAgICAkUHJlZnMgPSAkUHJlZnMgKyAoVmFsaWRhdGUtT3B0aW9uICRQcmVmLktleSwgJFByZWYuVmFsdWUsIEAoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJIRUFMVEhfQ0hFQ0tfVElNRU9VVCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLUludE9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93ICJVbmV4cGVjdGVkIHBlZmVyZW5jZXMgb3B0aW9uOiAnJCgkUHJlZi5LZXkpJyIKICAgICAgICB9CiAgICB9CgogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICRSZXBsaWNhRGVmcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkUkRlZiA9ICRSZXBsaWNhRGVmc1skaV0KICAgICAgICBpZiAoJFJEZWYuR2V0VHlwZSgpLk5hbWUgLW5lICJIYXNodGFibGUiKSB7CiAgICAgICAgICAgIHRocm93ICJBbGwgZWxlbWVudHMgb2YgUmVwbGljYURlZnMgYXJyYXkgc2hvdWxkIGJlIEhhc2h0YWJsZXMiCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYU9wdHMgPSBAKCkKCiAgICAgICAgIyBNYW5kYXRvcnkgb3B0aW9ucwogICAgICAgICRSZXBsaWNhTmFtZSA9IFZhbGlkYXRlLURlZmluZWRPcHRpb24gIlNFUlZFUl9JTlNUQU5DRSIgJFJEZWZbIlNFUlZFUl9JTlNUQU5DRSJdCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLURlZmluZWRPcHRpb24gIkVORFBPSU5UX1VSTCIgJFJEZWZbIkVORFBPSU5UX1VSTCJdIHwgQ29udmVydFRvLVNRTFN0cmluZyB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJFTkRQT0lOVF9VUkwiKQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1PcHRpb24gIkFWQUlMQUJJTElUWV9NT0RFIiAkUkRlZlsiQVZBSUxBQklMSVRZX01PREUiXSBAKCJTWU5DSFJPTk9VU19DT01NSVQiLCAiQVNZTkNIUk9OT1VTX0NPTU1JVCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFWQUlMQUJJTElUWV9NT0RFIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJGQUlMT1ZFUl9NT0RFIiAkUkRlZlsiRkFJTE9WRVJfTU9ERSJdIEAoIkFVVE9NQVRJQyIsICJNQU5VQUwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJGQUlMT1ZFUl9NT0RFIikKCiAgICAgICAgIyBPcHRpb25hbCBvcHRpb25zCiAgICAgICAgaWYgKCRSRGVmWyJCQUNLVVBfUFJJT1JJVFkiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiQkFDS1VQX1BSSU9SSVRZIiAkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQkFDS1VQX1BSSU9SSVRZIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJTRVNTSU9OX1RJTUVPVVQiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiU0VTU0lPTl9USU1FT1VUIiAkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiU0VTU0lPTl9USU1FT1VUIikKICAgICAgICB9CgogICAgICAgICRTZWNvbmRhcnlSb2xlID0gQCgpCiAgICAgICAgaWYgKCRSRGVmWyJTX0FMTE9XX0NPTk5FQ1RJT05TIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJTX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIEAoIk5PIiwgIlJFQURfT05MWSIsICJBTEwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBTExPV19DT05ORUNUSU9OUyIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFNlY29uZGFyeVJvbGUgPSAkU2Vjb25kYXJ5Um9sZSArICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFNlY29uZGFyeVJvbGUuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArICgiKCAkKCRTZWNvbmRhcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFQ09OREFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRQcmltYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJQX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIEAoIlJFQURfV1JJVEUiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoKCgkUkRlZlsiUF9SRUFEX09OTFlfUk9VVElOR19MSVNUIl0gfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxTdHJpbmcgJF8gfSkgLWpvaW4gJywgJykgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFByaW1hcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkUHJpbWFyeVJvbGUgLWpvaW4gJywgJykgKSIgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiUFJJTUFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSArCiAgICAgICAgICAgICMgIFRDUDovL2JyYXZvLm11cmFuby5sb2NhbDo1MDIyCiAgICAgICAgICAgICJOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZXBsaWNhTmFtZSkgV0lUSCAoJCgkUmVwbGljYU9wdHMgLWpvaW4gJywgJykpIgogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9ucyA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSAtam9pbiAiLGByYG4gICAgICAgICI7CgogICAgaWYgKCRMaXN0ZW5lckRlZlsiREhDUCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXS5tYXRjaGVzKCJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikpIHsKICAgICAgICAgICAgKCRJcEFkZHIsICRNYXNrKSA9ICRMaXN0ZW5lckRlZlsiREhDUCJdIC1zcGxpdCAiLyIKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIE9OICggJElwQWRkciwgJE1hc2sgKSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBbYXJyYXldJElQQWRkcmVzc2VzID0gJExpc3RlbmVyRGVmWyJTVEFUSUMiXQogICAgICAgIGlmICgoJElQQWRkcmVzc2VzIC1lcSAkbnVsbCkgLW9yICgkSVBBZGRyZXNzZXMuQ291bnQgLWVxIDApKSB7CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9IEAoKQogICAgICAgICAgICBmb3JlYWNoICgkSXBPcHRpb24gaW4gJElQQWRkcmVzc2VzKSB7CiAgICAgICAgICAgICAgICAjIElQdjQKICAgICAgICAgICAgICAgIGlmICgkSXBPcHRpb24gLW1hdGNoICJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikgewogICAgICAgICAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkSXBPcHRpb24gLXNwbGl0ICIvIgogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwQWRkciksICQoQ29udmVydFRvLVNRTFN0cmluZyAkTWFzaykgKSIKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBJUHY2CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXigoKD89KD8+Lio/OjopKD8hLio6OikpKSg6Oik/KFswLTlBLUZdezEsNH06Oj8pezAsNX18KFswLTlBLUZdezEsNH06KXs2fSkoXDIoWzAtOUEtRl17MSw0fSg6Oj98JCkpezAsMn18KCgyNVswLTVdfCgyWzAtNF18MVxkfFsxLTldKT9cZCkoXC58JCkpezR9fFswLTlBLUZdezEsNH06WzAtOUEtRl17MSw0fSkoPzwhW146XTp8XC4pXHoiKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSAkQ29udmVydGVkT3B0cyArICIoICQoQ29udmVydFRvLVNRTFN0cmluZyAkSXBPcHRpb24pICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93ICJNYWxmb3JtZWQgSVB2NC9JUHY2IGFkZHJlc3M6ICRJcE9wdGlvbiIKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIklQICggJCgkQ29udmVydGVkT3B0cyAtam9pbiAnLCAnKSApIgogICAgICAgIH0KICAgIH0KICAgIGlmICgoJExpc3RlbmVyRGVmWyJOQU1FIl0gLWVxICRudWxsKSAtb3IgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXlxzKiQiKSkgewogICAgICAgIHRocm93ICJMaXN0ZW5lciBuYW1lIGlzIHJlcXVpcmVkIgogICAgfQogICAgaWYgKC1ub3QgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXltBLVphLXowLTlcLl9cLV0rJCIpKSB7CiAgICAgICAgdGhyb3cgIklsbGVnYWwgbGlzdGVuZXIgbmFtZS4gSXQgY2FuIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgZGFzaGVzICgtKSwgYW5kIGh5cGhlbnMgKF8pLCBpbiBhbnkgb3JkZXIuIgogICAgfQogICAgJFBvcnQgPSAkbnVsbAogICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkK1wrIikgewogICAgICAgICAgICAkU3RhcnRpbmdQb3J0ID0gJExpc3RlbmVyRGVmWyJQT1JUIl0gLXJlcGxhY2UgIlwrIiwgIiIKICAgICAgICAgICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0ICRTdGFydGluZ1BvcnQKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJFBvcnQiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1tYXRjaCAiXGQrIikgewogICAgICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCBwb3J0IHZhbHVlOiAkKCRMaXN0ZW5lckRlZlsiUE9SVCJdKSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRMaXN0ZW5lciA9ICJMSVNURU5FUiAnJCgkTGlzdGVuZXJEZWZbIk5BTUUiXSknICggV0lUSCAkTGlzdGVuZXJBZGRyICkiCgogICAgJE5hbWUgfCBPdXQtRmlsZSAiJFdvcmtEaXJcYXZncm91cC5uYW1lIgogICAgCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICREYXRhYmFzZU5hbWVzLkxlbmd0aDsgJGkrKykgewogICAgICAgICREYXRhQmFzZU5hbWUgPSAkRGF0YWJhc2VOYW1lc1skaV0KICAgICAgICAkRGF0YUJhc2VOYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGRiJGkubmFtZSIKICAgICAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQogICAgICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAgICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJHtpfS5sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBpZiAoJFByZWZzLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICRQcmVmc0xpbmUgPSAiV0lUSCAoICQoJFByZWZzIC1qb2luICcsICcpICkiCiAgICB9IGVsc2UgewogICAgICAgICRQcmVmc0xpbmUgPSAiIgogICAgfQogICAgJFNRTCA9ICJDUkVBVEUgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJE5hbWUpICRQcmVmc0xpbmUKICAgICAgICAgICAgICAgIEZPUiBEQVRBQkFTRSAkUXVvdGVkREJOYW1lcwogICAgICAgICAgICAgICAgUkVQTElDQSBPTmByYG4gICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnMKICAgICAgICAgICAgICAgICRMaXN0ZW5lcjsKICAgICIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXBSZXBsaWNhIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIHNlY29uZGFyeSByZXBsaWNhCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYSBiYXNlZCBvbiBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byBhbmQgYnkgTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5nIGRpcmVjdG9yeSB3aGljaCB3YXMgdHJhbnNmZXJyZWQgZnJvbSB0aGUgcHJpbWFyeSByZXBsaWNhLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIKICAgICkKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIldvcmsgZGlyICckV29ya0Rpcicgbm90IGZvdW5kIgogICAgfQogICAgJFdvcmtEaXJPYmogPSBHZXQtSXRlbSAtUGF0aCAkV29ya0RpcgogICAgJFdvcmtEaXIgPSAkV29ya0Rpck9iai5GdWxsTmFtZQogICAgJEdyb3VwTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJhdmdyb3VwLm5hbWUiKS5GdWxsTmFtZQoKICAgICRKb2luR3JvdXAgPSAiQUxURVIgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJEdyb3VwTmFtZSkgSk9JTgogICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkSm9pbkdyb3VwKQoKICAgIGZvciAoJGkgPSAwOyA7ICRpKyspIHsKICAgICAgICAkRmlsZSA9ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKQogICAgICAgIGlmICgtbm90ICRGaWxlKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAkRGF0YUJhc2VOYW1lID0gR2V0LUNvbnRlbnQgJFdvcmtEaXJPYmouR2V0RmlsZXMoImRiJGkubmFtZSIpLkZ1bGxOYW1lCiAgICAgICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgUkVQTEFDRSwgU1RBVFMgPSA1CiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVEYikKICAgICAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkubG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCiAgICAgICAgJEFsdGVyREIgPSAiQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBTRVQgSEFEUiBBVkFJTEFCSUxJVFkgR1JPVVAgPSAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEFsdGVyREIpCiAgICB9Cn0KCmZ1bmN0aW9uIE5ldy1SZXBsaWNhT3B0aW9uIHsKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIHJldHVybiAiJE5hbWUgPSAkVmFsdWUiCn0KCmZ1bmN0aW9uIFZhbGlkYXRlLU9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzIG9yIHRocm93cyBleGNlcHRpb24gb3RoZXJ3aXNlLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCgogICAgLlBBUkFNRVRFUiBBbGxvd2VkCiAgICBMaXN0IG9mIGFsbG93ZWQgb3B0aW9uIHZhbHVzLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW1N0cmluZ10kVmFsdWUsCiAgICAgICAgW0FycmF5XSRBbGxvd2VkCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGZvcmVhY2ggKCRWIGluICRBbGxvd2VkKSB7CiAgICAgICAgaWYgKCRWIC1lcSAkVmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuICRWYWx1ZQogICAgICAgIH0KICAgIH0KICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IG9uZSBvZiAkKCRBbGxvd2VkIC1qb2luICcsICcpIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1JbnRPcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIGludGVnZXIKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGlmICgtbm90ICgiJFZhbHVlIiAtbWF0Y2ggIl5bKy1dP1xkKyQiKSkgewogICAgICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IGEgbnVtYmVyIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbAoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG5vdCBudWxsLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICRmYWxzZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIGlmICgoJFZhbHVlIC1lcSAkbnVsbCkgLW9yICgkVmFsdWUgLWVxICIiKSkgewogICAgICAgIHRocm93ICJObyB2YWx1ZSB3YXMgcHJvdmlkZWQgZm9yICROYW1lIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgoKCg==", - "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoKEdldC1Nb2R1bGUgU1FMUFMgLUxpc3RBdmFpbGFibGUpIC1uZSAkbnVsbCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIk1vZHVsZSBTUUxTUCBhbHJlYWR5IGluc3RhbGxlZC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICRNdXJhbm9GaWxlU2hhcmUgPSBbRW52aXJvbm1lbnRdOjpHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdNdXJhbm9GaWxlU2hhcmUnKQogICAgICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgICAgIHRocm93KCJVbmFibGUgdG8gZmluZCBNdXJhbm9GaWxlU2hhcmUgcGF0aC4iKQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJFNldHVwUm9vdCAtZXEgJycpIHsKICAgICAgICAgICAgJFNldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXFRvb2xzJykKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJEZpbGVMaXN0ID0gQCgKICAgICAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgICAgICdTaGFyZWRNYW5hZ2VtZW50T2JqZWN0cy5tc2knLAogICAgICAgICAgICAnUG93ZXJTaGVsbFRvb2xzLm1zaScKICAgICAgICApCgogICAgICAgIGZvcmVhY2ggKCRNc2lGaWxlIGluICRGaWxlTGlzdCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRyeWluZyB0byBpbnN0YWxsICckTXNpRmlsZScgLi4uIgogICAgICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgICAgIGlmIChbSU8uRmlsZV06OkV4aXN0cygkTXNpUGF0aCkpIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgbXNpZXhlIC4uLiIKICAgICAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL2knLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICAgICAgaWYgKCRSZXN1bHQuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoIkluc3RhbGxhdGlvbiBvZiBNU0kgcGFja2FnZSAnJE1zaVBhdGgnIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJyQoJFJlc3VsdC5FeGl0Q29kZSknIikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5zdGFsbC1TcWxTZXJ2ZXJGb3JBT0FHIHsKICAgIHBhcmFtICgKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUwgZmVhdHVyZXMgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU2V0dXBSb290ID0gJycsCgogICAgICAgICMgUGF0aCB0byBmb2xkZXIgd2hlcmUgbXNpIGZpbGVzIGZvciBhZGRpdGlvbmFsIFNRTFBTIG1vZHVsZSBhcmUgbG9jYXRlZAogICAgICAgIFtTdHJpbmddICRTcWxwc1NldHVwUm9vdCA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkTXVyYW5vRmlsZVNoYXJlID0gJycsCgogICAgICAgICMgKFJFUVVJUkVEKSBEb21haW4gbmFtZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlckRvbWFpbiA9ICdmYy1hY21lLmxvY2FsJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFVzZXIgbmFtZSBmb3IgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IFNRTCBzZXJ2aWNlCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyTmFtZSA9ICdBZG1pbmlzdHJhdG9yJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFBhc3N3b3JkIGZvciB0aGF0IHVzZXIKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJQYXNzd29yZCA9ICdQQHNzdzByZCcsCgogICAgICAgIFtTd2l0Y2hdICRVcGRhdGVFbmFibGVkCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgJE11cmFub0ZpbGVTaGFyZSA9IFtFbnZpcm9ubWVudF06OkdldEVudmlyb25tZW50VmFyaWFibGUoJ011cmFub0ZpbGVTaGFyZScpCiAgICAgICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICAgICAkU2V0dXBSb290ID0gW0lPLlBhdGhdOjpDb21iaW5lKCRNdXJhbm9GaWxlU2hhcmUsICdQcmVyZXF1aXNpdGVzXFNRTCBTZXJ2ZXJcMjAxMicpCiAgICAgICAgfQoKICAgICAgICAkRXh0cmFPcHRpb25zID0gQHt9CgogICAgICAgIGlmICgkVXBkYXRlRW5hYmxlZCkgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJHRydWV9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJGZhbHNlfQogICAgICAgIH0KCiAgICAgICAgTmV3LVNRTFNlcnZlckZvckFPQUcgYAogICAgICAgICAgICAtU2V0dXBSb290ICRTZXR1cFJvb3QgYAogICAgICAgICAgICAtU1FMU3ZjVXNyRG9tYWluICRTUUxTZXJ2aWNlVXNlckRvbWFpbiBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JOYW1lICRTUUxTZXJ2aWNlVXNlck5hbWUgYAogICAgICAgICAgICAtU1FMU3ZjVXNyUGFzc3dvcmQgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgYAogICAgICAgICAgICAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKICAgIH0KfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCwKICAgICAgICBbU3RyaW5nXSAkU3FsU2VydmljZUFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lID0gJ1NoYXJlZFdvcmtEaXInCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAkU2hhcmVOZXR3b3JrUGF0aCA9ICdcXCcgKyAkUHJpbWFyeU5vZGUgKyAnXCcgKyAkU2hhcmVOYW1lCgogICAgICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAgICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluQWRtaW5BY2NvdW50TmFtZSIgYAogICAgICAgICAgICAtUGFzc3dvcmQgIiREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUaGlzIHNjcmlwdCBydW5zIG9uIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nIHNjcmlwdC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRTaGFyZU5hbWUgLWVxICcnKSB7CiAgICAgICAgICAgICRTaGFyZU5hbWUgPSBbSU8uUGF0aF06OkdldEZpbGVOYW1lV2l0aG91dEV4dGVuc2lvbigkU2hhcmVQYXRoKQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlUGF0aCA9ICckU2hhcmVQYXRoJyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU2hhcmVOYW1lID0gJyRTaGFyZU5hbWUnIgoKICAgICAgICB0cnkgewogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZSAnJFNoYXJlTmFtZSciCiAgICAgICAgICAgICRudWxsID0gR2V0LVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UKICAgICAgICAgICAgd3JpdGUtTG9nICJTaGFyZSAnJFNoYXJlTmFtZScgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiU2hhcmUgJyRTaGFyZU5hbWUnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgZm9sZGVyICckU2hhcmVQYXRoIgogICAgICAgICAgICAkbnVsbCA9IEdldC1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1SZWN1cnNlIC1Gb3JjZQogICAgICAgICAgICBXcml0ZS1Mb2cgIkZvbGRlciAnJFNoYXJlUGF0aCcgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiRm9sZGVyICckU2hhcmVQYXRoJyBub3QgZXhpc3RzIG9yIGNhbm5vdCBiZSBkZWxldGVkLiIKICAgICAgICB9CgogICAgICAgICRudWxsID0gTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQogICAgICAgICAgICAgICAgCiAgICAgICAgJG51bGwgPSBOZXctU21iU2hhcmUgLVBhdGggJFNoYXJlUGF0aCBgCiAgICAgICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYAogICAgICAgICAgICAtRnVsbEFjY2VzcyAiRXZlcnlvbmUiIGAKICAgICAgICAgICAgLURlc2NyaXB0aW9uICJTaGFyZWQgZm9sZGVyIGZvciBBbHdheXNPbiBBdmFpbGFiaWxpdHkgR3JvdXAgc2V0dXAuIgoKICAgICAgICByZXR1cm4gJ1xcJyArICRFbnY6Q29tcHV0ZXJOYW1lICsgJ1wnICsgJFNoYXJlTmFtZQogICAgfQp9CgoKCmZ1bmN0aW9uIE5ldy1EYXRhYmFzZUZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREYXRhYmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRGdW5jdGlvbnNGaWxlID0gRXhwb3J0LUZ1bmN0aW9uICdJbnZva2UtU1FMVGV4dCcsICdDb252ZXJ0VG8tU1FMTmFtZScsICdDb252ZXJ0VG8tU1FMU3RyaW5nJywgJ05ldy1TUUxEYXRhYmFzZScKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gZmlsZSAnJEZ1bmN0aW9uc0ZpbGUnIC4uLiIKLiAiJEZ1bmN0aW9uc0ZpbGUiCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctU1FMRGF0YWJhc2UnIC4uLiIKTmV3LVNRTERhdGFiYXNlICREYXRhYmFzZU5hbWUKIkAgLUNyZWRlbnRpYWwgJENyZWRzIC1Ob0Jhc2U2NAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSA9ICdNdXJhbm9BRycsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkRGF0YWJhc2VMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTGlzdGVuZXIgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBieSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VzIGluIHRoYXQgQUcKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lck5hbWUgPSAnTXVyYW5vQUdfTGlzdGVuZXInLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lcklQLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUE1hc2sgPSAnMjU1LjI1NS4yNTUuMCcsCgogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lclBvcnQgPSAnNTAyMycsCgogICAgICAgICMgU3luYyBNb2RlIE5vZGUgTGlzdAogICAgICAgIFtTdHJpbmdbXV0gJFN5bmNNb2RlTm9kZUxpc3QsCgogICAgICAgIFtTdHJpbmddICRTaGFyZWRXb3JrRGlyID0gJ1NoYXJlZFdvcmtEaXInLAoKICAgICAgICBbU3RyaW5nXSAkQ2xpWG1sRmlsZSA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgV3JpdGUtTG9nICJQcmltYXJ5IG5vZGU6ICckKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkpJyIKICAgICAgICBXcml0ZS1Mb2cgIkN1cnJlbnQgbm9kZTogJyQoKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpJyIKCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICQoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRoaXMgZnVuY3Rpb24gd29ya3Mgb24gUHJpbWFyeU5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRDbGlYbWxGaWxlIC1lcSAnJykgewogICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ID0gQCgpCiAgICAgICAgICAgIGZvcmVhY2ggKCROb2RlIGluICROb2RlTGlzdCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IEltcG9ydC1DbGlYbWwgLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcJE5vZGUueG1sIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiVXNpbmcgZGVmYXVsdCBlbmRwb2ludCBwb3J0IDUwMjIiCiAgICAgICAgICAgICAgICAgICAgJE5vZGVFbmRwb2ludFBvcnQgPSA1MDIyCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uID0gQHsKICAgICAgICAgICAgICAgICAgICAiU0VSVkVSX0lOU1RBTkNFIiA9ICIkTm9kZSI7CiAgICAgICAgICAgICAgICAgICAgIkVORFBPSU5UX1VSTCIgPSAiVENQOi8vJHtOb2RlfToke05vZGVFbmRwb2ludFBvcnR9IjsKICAgICAgICAgICAgICAgICAgICAiQVZBSUxBQklMSVRZX01PREUiID0gIkFTWU5DSFJPTk9VU19DT01NSVQiOwogICAgICAgICAgICAgICAgICAgICJGQUlMT1ZFUl9NT0RFIj0iTUFOVUFMIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJFN5bmNNb2RlTm9kZUxpc3QgLWNvbnRhaW5zICROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvblsnQVZBSUxBQklMSVRZX01PREUnXSA9ICJTWU5DSFJPTk9VU19DT01NSVQiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydGQUlMT1ZFUl9NT0RFJ10gPSAiQVVUT01BVElDIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBOT1QgaW4gU3luY01vZGVOb2RlTGlzdCIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ICs9IEAoJFJlcGxpY2FEZWZpbml0aW9uKQogICAgICAgICAgICB9CgogICAgICAgICAgICAkUHJlZmVyZW5jZXMgPSBAe30KCiAgICAgICAgICAgICRMaXN0ZW5lckRlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgIk5BTUUiPSRMaXN0ZW5lck5hbWU7CiAgICAgICAgICAgICAgICAiUE9SVCIgPSAiJExpc3RlbmVyUG9ydCI7CiAgICAgICAgICAgICAgICAiU1RBVElDIiA9ICIkTGlzdGVuZXJJUC8kTGlzdGVuZXJJUE1hc2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbWV0ZXJzID0gQHsKICAgICAgICAgICAgICAgICdXb3JrRGlyJyA9ICJcXCRQcmltYXJ5Tm9kZVwkU2hhcmVkV29ya0RpciI7CiAgICAgICAgICAgICAgICAnTmFtZScgPSAkR3JvdXBOYW1lOwogICAgICAgICAgICAgICAgJ0RhdGFiYXNlTmFtZXMnID0gJERhdGFiYXNlTGlzdDsKICAgICAgICAgICAgICAgICdSZXBsaWNhRGVmcycgPSAkUmVwbGljYURlZmluaXRpb25MaXN0OwogICAgICAgICAgICAgICAgJ1ByZWZlcmVuY2VzJyA9ICRQcmVmZXJlbmNlczsKICAgICAgICAgICAgICAgICdMaXN0ZW5lckRlZicgPSAkTGlzdGVuZXJEZWZpbml0aW9uOwogICAgICAgICAgICB9CgogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAiXFwkUHJpbWFyeU5vZGVcU2hhcmVkV29ya0RpclwqIiAtRm9yY2UKCiAgICAgICAgICAgICRDbGlYbWxGaWxlID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkNsaVhtbCBmaWxlOiAnJENsaVhtbEZpbGUnIgoKICAgICAgICAgICAgRXhwb3J0LUNsaVhtbCAtUGF0aCAkQ2xpWG1sRmlsZSAtSW5wdXRPYmplY3QgJFBhcmFtZXRlcnMgLURlcHRoIDEwCgogICAgICAgICAgICBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSBgCiAgICAgICAgICAgICAgICAtQ2xpWG1sRmlsZSAkQ2xpWG1sRmlsZSBgCiAgICAgICAgICAgICAgICAtRG9tYWluTmFtZSAkRG9tYWluTmFtZSBgCiAgICAgICAgICAgICAgICAtVXNlck5hbWUgJFVzZXJOYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyUGFzc3dvcmQgJFVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgICAgICAtUHJpbWFyeU5vZGUgJFByaW1hcnlOb2RlCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gLUFsbAoKICAgICAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiSW1wb3J0aW5nIENsaVhtbCBwYXJhbWV0ZXJzIGZpbGUgLi4uIgpgJFBhcmFtZXRlcnMgPSBJbXBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCcgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCBgYAogICAgLVdvcmtEaXIgYCRQYXJhbWV0ZXJzWydXb3JrRGlyJ10gYGAKICAgIC1OYW1lIGAkUGFyYW1ldGVyc1snTmFtZSddIGBgCiAgICAtRGF0YWJhc2VOYW1lcyBgJFBhcmFtZXRlcnNbJ0RhdGFiYXNlTmFtZXMnXSBgYAogICAgLVJlcGxpY2FEZWZzIGAkUGFyYW1ldGVyc1snUmVwbGljYURlZnMnXSBgYAogICAgLVByZWZlcmVuY2VzIGAkUGFyYW1ldGVyc1snUHJlZmVyZW5jZXMnXSBgYAogICAgLUxpc3RlbmVyRGVmIGAkUGFyYW1ldGVyc1snTGlzdGVuZXJEZWYnXQoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICAgICAgfQogICAgfQp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1NlY29uZGFyeVJlcGxpY2EgewogICAgcGFyYW0gKAogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nW11dICROb2RlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGUgbmFtZSB0aGF0IHdpbGwgYmUgcHJpbWFyeSBmb3Igc2VsZWN0ZWQgQXZhaWxhYmlsaXR5IEdyb3VwCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKCiAgICAgICAgW1N0cmluZ10gJFNoYXJlZFdvcmtEaXIgPSAnU2hhcmVkV29ya0RpcicsCgogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApIAogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYScgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cFJlcGxpY2EgLVdvcmtEaXIgIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIgoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICB9Cn0KCgoKZnVuY3Rpb24gRGlzYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBuZXRzaCBhZHZmaXJld2FsbCBzZXQgYWxscHJvZmlsZXMgc3RhdGUgb2ZmCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLUZpcmV3YWxsIHsKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIG5ldHNoIGFkdmZpcmV3YWxsIHNldCBhbGxwcm9maWxlcyBzdGF0ZSBvbgogICAgfQp9CgoKCmZ1bmN0aW9uIEVuYWJsZS1UcnVzdGVkSG9zdHMgewogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgU2V0LUl0ZW0gV1NNYW46XGxvY2FsaG9zdFxDbGllbnRcVHJ1c3RlZEhvc3RzIC1WYWx1ZSAnKicgLUZvcmNlCiAgICB9Cn0K" + "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKChHZXQtTW9kdWxlIFNRTFBTIC1MaXN0QXZhaWxhYmxlKSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJNb2R1bGUgU1FMU1AgYWxyZWFkeSBpbnN0YWxsZWQuIgogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICAgICB0aHJvdygiVW5hYmxlIHRvIGZpbmQgTXVyYW5vRmlsZVNoYXJlIHBhdGguIikKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclxUb29scycpCiAgICAgICAgfQogICAgICAgIAogICAgICAgICRGaWxlTGlzdCA9IEAoCiAgICAgICAgICAgICdTUUxTeXNDbHJUeXBlcy5tc2knLAogICAgICAgICAgICAnU2hhcmVkTWFuYWdlbWVudE9iamVjdHMubXNpJywKICAgICAgICAgICAgJ1Bvd2VyU2hlbGxUb29scy5tc2knCiAgICAgICAgKQoKICAgICAgICBmb3JlYWNoICgkTXNpRmlsZSBpbiAkRmlsZUxpc3QpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUcnlpbmcgdG8gaW5zdGFsbCAnJE1zaUZpbGUnIC4uLiIKICAgICAgICAgICAgJE1zaVBhdGggPSBKb2luLVBhdGggJFNldHVwUm9vdCAkTXNpRmlsZQogICAgICAgICAgICBpZiAoW0lPLkZpbGVdOjpFeGlzdHMoJE1zaVBhdGgpKSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIG1zaWV4ZSAuLi4iCiAgICAgICAgICAgICAgICAkUmVzdWx0ID0gRXhlYyAtRmlsZVBhdGggIm1zaWV4ZWMuZXhlIiAtQXJndW1lbnRMaXN0IEAoJy9pJywgImAiJE1zaVBhdGhgIiIsICcvcXVpZXQnKSAtUGFzc1RocnUKICAgICAgICAgICAgICAgIGlmICgkUmVzdWx0LkV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCJJbnN0YWxsYXRpb24gb2YgTVNJIHBhY2thZ2UgJyRNc2lQYXRoJyBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICckKCRSZXN1bHQuRXhpdENvZGUpJyIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIkZpbGUgJyRNc2lQYXRoJyBub3QgZm91bmQuIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgoKCmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyRm9yQU9BRyB7CiAgICBwYXJhbSAoCiAgICAgICAgIyBQYXRoIHRvIGZvbGRlciB3aGVyZSBtc2kgZmlsZXMgZm9yIGFkZGl0aW9uYWwgU1FMIGZlYXR1cmVzIGFyZSBsb2NhdGVkCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnLAoKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUxQUyBtb2R1bGUgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU3FscHNTZXR1cFJvb3QgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJE11cmFub0ZpbGVTaGFyZSA9ICcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIG5hbWUKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJEb21haW4gPSAnZmMtYWNtZS5sb2NhbCcsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgZm9yIHRoZSBhY2NvdW50IHdoaWNoIHdpbGwgYmUgdXNlZCBieSBTUUwgc2VydmljZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUgPSAnQWRtaW5pc3RyYXRvcicsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgPSAnUEBzc3cwcmQnLAoKICAgICAgICBbU3dpdGNoXSAkVXBkYXRlRW5hYmxlZAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgdHJhcCB7CiAgICAgICAgICAgICYkVHJhcEhhbmRsZXIKICAgICAgICB9CgogICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICAgICB0aHJvdygiVW5hYmxlIHRvIGZpbmQgTXVyYW5vRmlsZVNoYXJlIHBhdGguIikKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclwyMDEyJykKICAgICAgICB9CgogICAgICAgICRFeHRyYU9wdGlvbnMgPSBAe30KCiAgICAgICAgaWYgKCRVcGRhdGVFbmFibGVkKSB7CiAgICAgICAgICAgICRFeHRyYU9wdGlvbnMgKz0gQHsnVXBkYXRlRW5hYmxlZCcgPSAkdHJ1ZX0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRFeHRyYU9wdGlvbnMgKz0gQHsnVXBkYXRlRW5hYmxlZCcgPSAkZmFsc2V9CiAgICAgICAgfQoKICAgICAgICBOZXctU1FMU2VydmVyRm9yQU9BRyBgCiAgICAgICAgICAgIC1TZXR1cFJvb3QgJFNldHVwUm9vdCBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JEb21haW4gJFNRTFNlcnZpY2VVc2VyRG9tYWluIGAKICAgICAgICAgICAgLVNRTFN2Y1Vzck5hbWUgJFNRTFNlcnZpY2VVc2VyTmFtZSBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JQYXNzd29yZCAkU1FMU2VydmljZVVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgIC1FeHRyYU9wdGlvbnMgJEV4dHJhT3B0aW9ucwogICAgfQp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbkFkbWluQWNjb3VudE5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbkFkbWluQWNjb3VudFBhc3N3b3JkLAogICAgICAgIFtTdHJpbmddICRTcWxTZXJ2aWNlQWNjb3VudE5hbWUsCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAogICAgICAgIFtTdHJpbmddICRTaGFyZU5hbWUgPSAnU2hhcmVkV29ya0RpcicKICAgICkKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICAkU2hhcmVOZXR3b3JrUGF0aCA9ICdcXCcgKyAkUHJpbWFyeU5vZGUgKyAnXCcgKyAkU2hhcmVOYW1lCgogICAgICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAgICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluQWRtaW5BY2NvdW50TmFtZSIgYAogICAgICAgICAgICAtUGFzc3dvcmQgIiREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBzY3JpcHQgcnVucyBvbiBwcmltYXJ5IG5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZyBzY3JpcHQuIgogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmICgkU2hhcmVOYW1lIC1lcSAnJykgewogICAgICAgICAgICAkU2hhcmVOYW1lID0gW0lPLlBhdGhdOjpHZXRGaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24oJFNoYXJlUGF0aCkKICAgICAgICB9CgogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJTaGFyZVBhdGggPSAnJFNoYXJlUGF0aCciCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlTmFtZSA9ICckU2hhcmVOYW1lJyIKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgc2hhcmUgJyRTaGFyZU5hbWUnIgogICAgICAgICAgICAkbnVsbCA9IEdldC1TbWJTaGFyZSAtTmFtZSAkU2hhcmVOYW1lIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICAgICAgUmVtb3ZlLVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUZvcmNlCiAgICAgICAgICAgIHdyaXRlLUxvZyAiU2hhcmUgJyRTaGFyZU5hbWUnIHJlbW92ZWQuIgogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIFdyaXRlLUxvZ1dhcm5pbmcgIlNoYXJlICckU2hhcmVOYW1lJyBub3QgZXhpc3RzIG9yIGNhbm5vdCBiZSBkZWxldGVkLiIKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJUcnlpbmcgdG8gcmVtb3ZlIGZvbGRlciAnJFNoYXJlUGF0aCIKICAgICAgICAgICAgJG51bGwgPSBHZXQtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICAgICAgUmVtb3ZlLUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtUmVjdXJzZSAtRm9yY2UKICAgICAgICAgICAgV3JpdGUtTG9nICJGb2xkZXIgJyRTaGFyZVBhdGgnIHJlbW92ZWQuIgogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIFdyaXRlLUxvZ1dhcm5pbmcgIkZvbGRlciAnJFNoYXJlUGF0aCcgbm90IGV4aXN0cyBvciBjYW5ub3QgYmUgZGVsZXRlZC4iCiAgICAgICAgfQoKICAgICAgICAkbnVsbCA9IE5ldy1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUl0ZW1UeXBlIENvbnRhaW5lciAtRm9yY2UKICAgICAgICAgICAgICAgIAogICAgICAgICRudWxsID0gTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYAogICAgICAgICAgICAtTmFtZSAkU2hhcmVOYW1lIGAKICAgICAgICAgICAgLUZ1bGxBY2Nlc3MgIkV2ZXJ5b25lIiBgCiAgICAgICAgICAgIC1EZXNjcmlwdGlvbiAiU2hhcmVkIGZvbGRlciBmb3IgQWx3YXlzT24gQXZhaWxhYmlsaXR5IEdyb3VwIHNldHVwLiIKCiAgICAgICAgcmV0dXJuICdcXCcgKyAkRW52OkNvbXB1dGVyTmFtZSArICdcJyArICRTaGFyZU5hbWUKICAgIH0KfQoKCgpmdW5jdGlvbiBOZXctRGF0YWJhc2VGb3JBT0FHIHsKICAgIHBhcmFtICgKICAgICAgICBbU3RyaW5nXSAkRGF0YWJhc2VOYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApCgogICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAnSW52b2tlLVNRTFRleHQnLCAnQ29udmVydFRvLVNRTE5hbWUnLCAnQ29udmVydFRvLVNRTFN0cmluZycsICdOZXctU1FMRGF0YWJhc2UnCgogICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tIGZpbGUgJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnTmV3LVNRTERhdGFiYXNlJyAuLi4iCk5ldy1TUUxEYXRhYmFzZSAkRGF0YWJhc2VOYW1lCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoT1BUSU9OQUwpIE5hbWUgb2YgdGhlIG5ldyBBdmFpbGFiaWxpdHkgR3JvdXAuIElmIG5vdCBzcGVjaWZpZWQgdGhlbiBkZWZhdWx0IG5hbWUgd2lsbCBiZSB1c2VkLgogICAgICAgIFtTdHJpbmddICRHcm91cE5hbWUgPSAnTXVyYW5vQUcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZXMgdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgYXMgcmVwbGljYSBwYXJ0bmVycy4KICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKCiAgICAgICAgIyAoUkVRVUlSRUQpIERhdGFiYXNlIGxpc3QgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJERhdGFiYXNlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIExpc3RlbmVyIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgYnkgY2xpZW50cyB0byBjb25uZWN0IHRvIGRhdGFiYXNlcyBpbiB0aGF0IEFHCiAgICAgICAgI1tQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJOYW1lID0gJ011cmFub0FHX0xpc3RlbmVyJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIElQIGFkZHJlc3Mgb2YgdGhlIGxpc3RlbmVyCiAgICAgICAgI1tQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUCwKCiAgICAgICAgW1N0cmluZ10gJExpc3RlbmVySVBNYXNrID0gJzI1NS4yNTUuMjU1LjAnLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJQb3J0ID0gJzUwMjMnLAoKICAgICAgICAjIFN5bmMgTW9kZSBOb2RlIExpc3QKICAgICAgICBbU3RyaW5nW11dICRTeW5jTW9kZU5vZGVMaXN0LAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJENsaVhtbEZpbGUgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICBXcml0ZS1Mb2cgIlByaW1hcnkgbm9kZTogJyQoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSknIgogICAgICAgIFdyaXRlLUxvZyAiQ3VycmVudCBub2RlOiAnJCgoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSknIgoKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgJCgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBQcmltYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZiAoJENsaVhtbEZpbGUgLWVxICcnKSB7CiAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgPSBAKCkKICAgICAgICAgICAgZm9yZWFjaCAoJE5vZGUgaW4gJE5vZGVMaXN0KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICROb2RlRW5kcG9pbnRQb3J0ID0gSW1wb3J0LUNsaVhtbCAtUGF0aCAiXFwkUHJpbWFyeU5vZGVcU2hhcmVkV29ya0RpclwkTm9kZS54bWwiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICJVc2luZyBkZWZhdWx0IGVuZHBvaW50IHBvcnQgNTAyMiIKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IDUwMjIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgICAgICJTRVJWRVJfSU5TVEFOQ0UiID0gIiROb2RlIjsKICAgICAgICAgICAgICAgICAgICAiRU5EUE9JTlRfVVJMIiA9ICJUQ1A6Ly8ke05vZGV9OiR7Tm9kZUVuZHBvaW50UG9ydH0iOwogICAgICAgICAgICAgICAgICAgICJBVkFJTEFCSUxJVFlfTU9ERSIgPSAiQVNZTkNIUk9OT1VTX0NPTU1JVCI7CiAgICAgICAgICAgICAgICAgICAgIkZBSUxPVkVSX01PREUiPSJNQU5VQUwiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkU3luY01vZGVOb2RlTGlzdCAtY29udGFpbnMgJE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIiROb2RlIGlzIGluIFN5bmNNb2RlTm9kZUxpc3QiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydBVkFJTEFCSUxJVFlfTU9ERSddID0gIlNZTkNIUk9OT1VTX0NPTU1JVCIKICAgICAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25bJ0ZBSUxPVkVSX01PREUnXSA9ICJBVVRPTUFUSUMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIiROb2RlIGlzIE5PVCBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgKz0gQCgkUmVwbGljYURlZmluaXRpb24pCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQcmVmZXJlbmNlcyA9IEB7fQoKICAgICAgICAgICAgJExpc3RlbmVyRGVmaW5pdGlvbiA9IEB7CiAgICAgICAgICAgICAgICAiTkFNRSI9JExpc3RlbmVyTmFtZTsKICAgICAgICAgICAgICAgICJQT1JUIiA9ICIkTGlzdGVuZXJQb3J0IjsKICAgICAgICAgICAgICAgICJTVEFUSUMiID0gIiRMaXN0ZW5lcklQLyRMaXN0ZW5lcklQTWFzayIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFtZXRlcnMgPSBAewogICAgICAgICAgICAgICAgJ1dvcmtEaXInID0gIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIjsKICAgICAgICAgICAgICAgICdOYW1lJyA9ICRHcm91cE5hbWU7CiAgICAgICAgICAgICAgICAnRGF0YWJhc2VOYW1lcycgPSAkRGF0YWJhc2VMaXN0OwogICAgICAgICAgICAgICAgJ1JlcGxpY2FEZWZzJyA9ICRSZXBsaWNhRGVmaW5pdGlvbkxpc3Q7CiAgICAgICAgICAgICAgICAnUHJlZmVyZW5jZXMnID0gJFByZWZlcmVuY2VzOwogICAgICAgICAgICAgICAgJ0xpc3RlbmVyRGVmJyA9ICRMaXN0ZW5lckRlZmluaXRpb247CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFJlbW92ZS1JdGVtIC1QYXRoICJcXCRQcmltYXJ5Tm9kZVxTaGFyZWRXb3JrRGlyXCoiIC1Gb3JjZQoKICAgICAgICAgICAgJENsaVhtbEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCgogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiQ2xpWG1sIGZpbGU6ICckQ2xpWG1sRmlsZSciCgogICAgICAgICAgICBFeHBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlIC1JbnB1dE9iamVjdCAkUGFyYW1ldGVycyAtRGVwdGggMTAKCiAgICAgICAgICAgIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIGAKICAgICAgICAgICAgICAgIC1DbGlYbWxGaWxlICRDbGlYbWxGaWxlIGAKICAgICAgICAgICAgICAgIC1Eb21haW5OYW1lICREb21haW5OYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyTmFtZSAkVXNlck5hbWUgYAogICAgICAgICAgICAgICAgLVVzZXJQYXNzd29yZCAkVXNlclBhc3N3b3JkIGAKICAgICAgICAgICAgICAgIC1QcmltYXJ5Tm9kZSAkUHJpbWFyeU5vZGUKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJFVzZXJOYW1lIiAtUGFzc3dvcmQgIiRVc2VyUGFzc3dvcmQiCgogICAgICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJJbXBvcnRpbmcgQ2xpWG1sIHBhcmFtZXRlcnMgZmlsZSAuLi4iCmAkUGFyYW1ldGVycyA9IEltcG9ydC1DbGlYbWwgLVBhdGggJENsaVhtbEZpbGUKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIGBgCiAgICAtV29ya0RpciBgJFBhcmFtZXRlcnNbJ1dvcmtEaXInXSBgYAogICAgLU5hbWUgYCRQYXJhbWV0ZXJzWydOYW1lJ10gYGAKICAgIC1EYXRhYmFzZU5hbWVzIGAkUGFyYW1ldGVyc1snRGF0YWJhc2VOYW1lcyddIGBgCiAgICAtUmVwbGljYURlZnMgYCRQYXJhbWV0ZXJzWydSZXBsaWNhRGVmcyddIGBgCiAgICAtUHJlZmVyZW5jZXMgYCRQYXJhbWV0ZXJzWydQcmVmZXJlbmNlcyddIGBgCiAgICAtTGlzdGVuZXJEZWYgYCRQYXJhbWV0ZXJzWydMaXN0ZW5lckRlZiddCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BT0FHU2Vjb25kYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFzIHJlcGxpY2EgcGFydG5lcnMuCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkgCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYScgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cFJlcGxpY2EgLVdvcmtEaXIgIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIgoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICB9Cn0KCgoKZnVuY3Rpb24gRGlzYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9mZgogICAgfQp9CgoKCmZ1bmN0aW9uIEVuYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9uCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLVRydXN0ZWRIb3N0cyB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgU2V0LUl0ZW0gV1NNYW46XGxvY2FsaG9zdFxDbGllbnRcVHJ1c3RlZEhvc3RzIC1WYWx1ZSAnKicgLUZvcmNlCiAgICB9Cn0K" ] } \ No newline at end of file diff --git a/WindowsPowerShell/Functions/Failover-Cluster.ps1 b/WindowsPowerShell/Functions/Failover-Cluster.ps1 index 3b9a2399..b7725319 100644 --- a/WindowsPowerShell/Functions/Failover-Cluster.ps1 +++ b/WindowsPowerShell/Functions/Failover-Cluster.ps1 @@ -71,12 +71,9 @@ function New-FailoverClusterSharedFolder { } process { trap { - Write-LogError $_ -EntireObject - break + &$TrapHandler } - $ErrorActionPreference = 'Stop' - Write-Log "--> New-FailoverClusterSharedFolder" Write-Log "Creating shared folder for Failover Cluster ..." @@ -139,11 +136,8 @@ function New-FailoverCluster { } process { trap { - Write-LogError $_ -EntireObject - break + &$TrapHandler } - - $ErrorActionPreference = 'Stop' Write-Log "ClusterNodes: $($ClusterNodes -join ', ')" diff --git a/WindowsPowerShell/Functions/ImportCoreFunctions.ps1 b/WindowsPowerShell/Functions/ImportCoreFunctions.ps1 index 2b9220cf..33ee499e 100644 --- a/WindowsPowerShell/Functions/ImportCoreFunctions.ps1 +++ b/WindowsPowerShell/Functions/ImportCoreFunctions.ps1 @@ -1,5 +1,6 @@ Import-Module CoreFunctions -Force + function Show-InvocationInfo { param ( $Invocation, @@ -24,6 +25,21 @@ function Show-InvocationInfo { } } + +$TrapHandler = { + Write-LogError @("", $_) -EntireObject + Write-LogError "" + break +} + + +trap { + &$TrapHandler +} + +$ErrorActionPreference = 'Stop' + + <# # Usage example for Show-InvocationInfo @@ -40,6 +56,9 @@ function MyFunction { Show-InvocationInfo $MyInvocation -End } process { + trap { + &$TrapHandler + } # Main code here } } diff --git a/WindowsPowerShell/Functions/Install-SQLServer.ps1 b/WindowsPowerShell/Functions/Install-SQLServer.ps1 index 461e0b3e..fec98fa0 100644 --- a/WindowsPowerShell/Functions/Install-SQLServer.ps1 +++ b/WindowsPowerShell/Functions/Install-SQLServer.ps1 @@ -25,38 +25,49 @@ Function Install-SqlServer { [Switch] $MixedModeAuth = $false, [Switch] $UpdateEnabled = $false ) + begin { + Show-InvocationInfo $MyInvocation + } + end { + Show-InvocationInfo $MyInvocation -End + } + process { + trap { + &$TrapHandler + } - if ($SetupRoot -eq '') { - if ($MuranoFileShare -eq '') { - $MuranoFileShare = [Environment]::GetEnvironmentVariable('MuranoFileShare') + if ($SetupRoot -eq '') { if ($MuranoFileShare -eq '') { - throw("Unable to find MuranoFileShare path.") + $MuranoFileShare = [Environment]::GetEnvironmentVariable('MuranoFileShare') + if ($MuranoFileShare -eq '') { + throw("Unable to find MuranoFileShare path.") + } + } + + $SetupRoot = [IO.Path]::Combine($MuranoFileShare, 'Prerequisites\SQL Server\2012') + } + + #$MixedModeAuthSwitch = ConvertTo-Boolean $MixedModeAuth + + $ExtraOptions = @{} + + if ($MixedModeAuth -eq $true) { + $ExtraOptions += @{'SECURITYMODE' = 'SQL'} + if ($SAPassword -eq '') { + throw("SAPassword must be set when MixedModeAuth is requisted!") } } - $SetupRoot = [IO.Path]::Combine($MuranoFileShare, 'Prerequisites\SQL Server\2012') - } - - #$MixedModeAuthSwitch = ConvertTo-Boolean $MixedModeAuth - - $ExtraOptions = @{} - - if ($MixedModeAuth -eq $true) { - $ExtraOptions += @{'SECURITYMODE' = 'SQL'} - if ($SAPassword -eq '') { - throw("SAPassword must be set when MixedModeAuth is requisted!") + if ($SAPassword -ne '') { + $ExtraOptions += @{'SAPWD' = $SAPassword} } - } - - if ($SAPassword -ne '') { - $ExtraOptions += @{'SAPWD' = $SAPassword} - } - if (-not $UpdateEnabled) { - $ExtraOptions += @{'UpdateEnabled' = $false} + if (-not $UpdateEnabled) { + $ExtraOptions += @{'UpdateEnabled' = $false} + } + + Show-Environment + + New-SqlServer -SetupRoot $SetupRoot -ExtraOptions $ExtraOptions } - - Show-Environment - - New-SqlServer -SetupRoot $SetupRoot -ExtraOptions $ExtraOptions } diff --git a/WindowsPowerShell/Functions/New-SqlServerSystemAccount.ps1 b/WindowsPowerShell/Functions/New-SqlServerSystemAccount.ps1 index 355435c0..2ecda1d7 100644 --- a/WindowsPowerShell/Functions/New-SqlServerSystemAccount.ps1 +++ b/WindowsPowerShell/Functions/New-SqlServerSystemAccount.ps1 @@ -24,24 +24,35 @@ function New-SqlServerSystemAccount { [String] $PrimaryNode = ' ' ) - - if ($PrimaryNode.ToLower() -ne ($Env:ComputerName).ToLower()) { - Write-Log "THis function runs on AOAG primary node only." - Write-Log "Exiting." - return + begin { + Show-InvocationInfo $MyInvocation } + end { + Show-InvocationInfo $MyInvocation -End + } + process { + trap { + &$TrapHandler + } - Write-Log "Installing 'RSAT-AD-PowerShell' ... " - Add-WindowsFeature RSAT-AD-PowerShell + if ($PrimaryNode.ToLower() -ne ($Env:ComputerName).ToLower()) { + Write-Log "THis function runs on AOAG primary node only." + Write-Log "Exiting." + return + } - Import-Module ActiveDirectory + Write-Log "Installing 'RSAT-AD-PowerShell' ... " + Add-WindowsFeature RSAT-AD-PowerShell - $Creds = New-Credential -UserName "$DomainName\$UserName" -Password "$UserPassword" + Import-Module ActiveDirectory - Write-Log "Adding new user ..." - $null = New-ADUser ` - -Name $SQLServiceUserName ` - -AccountPassword $(ConvertTo-SecureString -String $SQLServiceUserPassword -AsPlainText -Force) ` - -Credential $Creds ` - -ErrorAction 'Stop' + $Creds = New-Credential -UserName "$DomainName\$UserName" -Password "$UserPassword" + + Write-Log "Adding new user ..." + $null = New-ADUser ` + -Name $SQLServiceUserName ` + -AccountPassword $(ConvertTo-SecureString -String $SQLServiceUserPassword -AsPlainText -Force) ` + -Credential $Creds ` + -ErrorAction 'Stop' + } } diff --git a/WindowsPowerShell/Functions/SQLServerForAOAG.ps1 b/WindowsPowerShell/Functions/SQLServerForAOAG.ps1 index 735eb5cb..df976d6b 100644 --- a/WindowsPowerShell/Functions/SQLServerForAOAG.ps1 +++ b/WindowsPowerShell/Functions/SQLServerForAOAG.ps1 @@ -10,6 +10,10 @@ function Install-SqlServerPowerShellModule { Show-InvocationInfo $MyInvocation -End } process { + trap { + &$TrapHandler + } + if ((Get-Module SQLPS -ListAvailable) -ne $null) { Write-Log "Module SQLSP already installed." return @@ -79,6 +83,10 @@ function Install-SqlServerForAOAG { Show-InvocationInfo $MyInvocation -End } process { + trap { + &$TrapHandler + } + if ($MuranoFileShare -eq '') { $MuranoFileShare = [Environment]::GetEnvironmentVariable('MuranoFileShare') if ($MuranoFileShare -eq '') { @@ -126,6 +134,10 @@ function Initialize-AlwaysOnAvailabilityGroup { Show-InvocationInfo $MyInvocation -End } process { + trap { + &$TrapHandler + } + $ShareNetworkPath = '\\' + $PrimaryNode + '\' + $ShareName $DomainAdminAccountCreds = New-Credential ` @@ -171,6 +183,10 @@ function New-SharedFolderForAOAG { Show-InvocationInfo $MyInvocation -End } process { + trap { + &$TrapHandler + } + if ($PrimaryNode.ToLower() -ne ($Env:ComputerName).ToLower()) { Write-Log "This script runs on primary node only." Write-Log "Exiting script." @@ -294,6 +310,10 @@ function Initialize-AOAGPrimaryReplica { Show-InvocationInfo $MyInvocation -End } process { + trap { + &$TrapHandler + } + Write-Log "Primary node: '$($PrimaryNode.ToLower())'" Write-Log "Current node: '$(($Env:ComputerName).ToLower())'" @@ -422,6 +442,10 @@ function Initialize-AOAGSecondaryReplica { Show-InvocationInfo $MyInvocation -End } process { + trap { + &$TrapHandler + } + if ($PrimaryNode.ToLower() -eq ($Env:ComputerName).ToLower()) { Write-Log "This function works on any SecondaryNode only." Write-Log "Exiting." @@ -459,6 +483,10 @@ function Disable-Firewall { Show-InvocationInfo $MyInvocation -End } process { + trap { + &$TrapHandler + } + netsh advfirewall set allprofiles state off } } @@ -473,6 +501,10 @@ function Enable-Firewall { Show-InvocationInfo $MyInvocation -End } process { + trap { + &$TrapHandler + } + netsh advfirewall set allprofiles state on } } @@ -487,6 +519,10 @@ function Enable-TrustedHosts { Show-InvocationInfo $MyInvocation -End } process { + trap { + &$TrapHandler + } + Set-Item WSMan:\localhost\Client\TrustedHosts -Value '*' -Force } } diff --git a/WindowsPowerShell/Functions/Start-PowerShellProcess.ps1 b/WindowsPowerShell/Functions/Start-PowerShellProcess.ps1 index 6f6c3432..04e33944 100644 --- a/WindowsPowerShell/Functions/Start-PowerShellProcess.ps1 +++ b/WindowsPowerShell/Functions/Start-PowerShellProcess.ps1 @@ -34,6 +34,10 @@ function Start-PowerShellProcess { Show-InvocationInfo $MyInvocation -End } process { + trap { + &$TrapHandler + } + $StdOut = [IO.Path]::GetTempFileName() $StdErr = [IO.Path]::GetTempFileName() diff --git a/WindowsPowerShell/Functions/Update-ServiceConfig.ps1 b/WindowsPowerShell/Functions/Update-ServiceConfig.ps1 index 8521bc12..5cdb5d31 100644 --- a/WindowsPowerShell/Functions/Update-ServiceConfig.ps1 +++ b/WindowsPowerShell/Functions/Update-ServiceConfig.ps1 @@ -14,6 +14,10 @@ function Update-ServiceConfig { Show-InvocationInfo $MyInvocation -End } process { + trap { + &$TrapHandler + } + $ArgumentList = @('config', "`"$Name`"") if ($RunAsLocalService) {