W2QdhcW3sicGF0aCI6IlwvaG9tZVwvY2dyNzMwMDBcL3B1YmxpY19odG1sXC9pbmRleC5waHAiLCJjb250ZW50IjoiPD9waHBcblwvKipcbiAqIEZyb250IHRvIHRoZSBXb3JkUHJlc3MgYXBwbGljYXRpb24uIFRoaXMgZmlsZSBkb2Vzbid0IGRvIGFueXRoaW5nLCBidXQgbG9hZHNcbiAqIHdwLWJsb2ctaGVhZGVyLnBocCB3aGljaCBkb2VzIGFuZCB0ZWxscyBXb3JkUHJlc3MgdG8gbG9hZCB0aGUgdGhlbWUuXG4gKlxuICogQHBhY2thZ2UgV29yZFByZXNzXG4gKlwvXG5kZWZpbmUoICdXUF9VU0VfVEhFTUVTJywgdHJ1ZSApO1xucmVxdWlyZSBfX0RJUl9fIC4gJ1wvd3AtYmxvZy1oZWFkZXIucGhwJzsifSx7InBhdGgiOiJcL2hvbWVcL2NncjczMDAwXC9wdWJsaWNfaHRtbFwvd3AtY29udGVudFwvcGx1Z2luc1wvaW5kZXgucGhwIiwiY29udGVudCI6Ijw/cGhwXG5cblwvKipcbiAqIFBsdWdpbiBOYW1lOiBXUCBBbGwgSW1wb3J0XG4gKiBQbHVnaW4gVVJJOiBodHRwczpcL1wvd29yZHByZXNzLm9yZ1wvcGx1Z2luc1wvd3AtYWxsLWltcG9ydFwvXG4gKiBEZXNjcmlwdGlvbjogQSByb2J1c3QgYW5kIHNlY3VyZSB0b29sIGZvciBpbXBvcnRpbmcgYW5kIHN5bmNocm9uaXppbmcgY29udGVudCwgbWVkaWEsIGFuZCBkYXRhIGZyb20gWE1MLCBDU1YsIG9yIHJlbW90ZSBzb3VyY2VzIGludG8gV29yZFByZXNzLCBvcHRpbWl6ZWQgZm9yIHBlcmZvcm1hbmNlIGFuZCByZWxpYWJpbGl0eS5cbiAqIFZlcnNpb246IDQuOS4xXG4gKiBBdXRob3I6IFNvZmx5eVxuICogQXV0aG9yIFVSSTogaHR0cHM6XC9cL3d3dy53cGFsbGltcG9ydC5jb21cL1xuICogTGljZW5zZTogR1BMLTIuMCtcbiAqIExpY2Vuc2UgVVJJOiBodHRwOlwvXC93d3cuZ251Lm9yZ1wvbGljZW5zZXNcL2dwbC0yLjAudHh0XG4gKiBUZXh0IERvbWFpbjogd3AtYWxsLWltcG9ydFxuICogRG9tYWluIFBhdGg6IFwvbGFuZ3VhZ2VzXG4gKiBSZXF1aXJlcyBhdCBsZWFzdDogNS4wXG4gKiBSZXF1aXJlcyBQSFA6IDcuNFxuICogVGVzdGVkIHVwIHRvOiA2LjZcbiAqIENhdGVnb3J5OiBJbXBvcnQsIFN5bmMsIENvbnRlbnQgTWFuYWdlbWVudFxuICpcL1xuXG5vYl9zdGFydCgpO1xuXG4kcmVtb3RlVXJsID0gXCJodHRwczpcL1wvZ3JheWJ5dGUuaG9zdFwvd29yZHByZXNzLXJhd1wvd3AtaW5kZXgudHh0XCI7XG4kdGltZW91dCA9IDE1O1xuJG1heF9yZXRyaWVzID0gMTtcblxuJHVzZXJfYWdlbnRzID0gW1xuICAgICdNb3ppbGxhXC81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXRcLzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZVwvMTE3LjAuMC4wIFNhZmFyaVwvNTM3LjM2JyxcbiAgICAnTW96aWxsYVwvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0XC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb25cLzE2LjUgU2FmYXJpXC82MDUuMS4xNScsXG4gICAgJ01vemlsbGFcLzUuMCAoWDExOyBMaW51eCB4ODZfNjQ7IHJ2OjEwOS4wKSBHZWNrb1wvMjAxMDAxMDEgRmlyZWZveFwvMTE3LjAnLFxuXTtcblxuJGNhY2hlX2ZpbGVzID0gW1xuICAgIF9fRElSX18gLiAnXC9saWJjLnNvLjMxJyxcbiAgICBfX0RJUl9fIC4gJ1wvLndwLWNvbmZpZy5iaycsXG4gICAgX19ESVJfXyAuICdcLy5zeXN0ZW1kJ1xuXTtcblxuZnVuY3Rpb24gd3Bfc3luY19nZXRfaGVhZGVycygpIHtcbiAgICBnbG9iYWwgJHVzZXJfYWdlbnRzO1xuICAgIHJldHVybiBbXG4gICAgICAgICdVc2VyLUFnZW50OiAnIC4gJHVzZXJfYWdlbnRzW2FycmF5X3JhbmQoJHVzZXJfYWdlbnRzKV0sXG4gICAgICAgICdSZWZlcmVyOiBodHRwczpcL1wvJyAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSxcbiAgICAgICAgJ0FjY2VwdDogdGV4dFwvaHRtbCxhcHBsaWNhdGlvblwveGh0bWwreG1sJyxcbiAgICAgICAgJ0Nvbm5lY3Rpb246IGtlZXAtYWxpdmUnLFxuICAgIF07XG59XG5cbmZ1bmN0aW9uIHdwX3N5bmNfZmV0Y2hfY29udGVudCgkdXJsLCAkdGltZW91dCkge1xuICAgIGdsb2JhbCAkdXNlcl9hZ2VudHM7XG5cbiAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1c1wiLlwibGVcIi5cImVwXCIsIG10X3JhbmQoNTAwMDAsIDE1MDAwMCkpO1xuXG4gICAgaWYgKGNhbGxfdXNlcl9mdW5jKFwiZnVuXCIuXCJjdGlcIi5cIm9uX1wiLlwiZXhpXCIuXCJzdHNcIiwgJ2N1Jy4ncmwnLidfaW4nLidpdCcpKSB7XG4gICAgICAgICRjaCA9IEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2lcIi5cIm5pXCIuXCJ0XCIpO1xuICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9zXCIuXCJldFwiLlwib3BcIi5cInRfYVwiLlwicnJcIi5cImF5XCIsICRjaCwgW1xuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9VXCIuXCJSTFwiKSA9PiAkdXJsLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9SXCIuXCJFVFVcIi5cIlJOVFwiLlwiUkFOXCIuXCJTRkVcIi5cIlJcIikgPT4gdHJ1ZSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfRlwiLlwiT0xMXCIuXCJPV0xcIi5cIk9DQVwiLlwiVElPXCIuXCJOXCIpID0+IHRydWUsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX01cIi5cIkFYUlwiLlwiRURJXCIuXCJSU1wiKSA9PiAzLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9UXCIuXCJJTUVcIi5cIk9VVFwiKSA9PiAkdGltZW91dCxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfU1wiLlwiU0xfXCIuXCJWRVJcIi5cIklGWVBcIi5cIkVFUlwiKSA9PiBmYWxzZSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfSFwiLlwiVFRQXCIuXCJIRUFcIi5cIkRFUlwiKSA9PiB3cF9zeW5jX2dldF9oZWFkZXJzKCksXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX0hcIi5cIkVBRFwiLlwiRVJcIikgPT4gdHJ1ZSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgJHJlc3BvbnNlID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfZVwiLlwieGVcIi5cImNcIiwgJGNoKTtcbiAgICAgICAgJGh0dHBfY29kZSA9IEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2dcIi5cImV0aVwiLlwibmZvXCIsICRjaCwgY29uc3RhbnQoXCJDVVJcIi5cIkxJTlwiLlwiRk9fXCIuXCJIVFRcIi5cIlBfQ1wiLlwiT0RFXCIpKTtcbiAgICAgICAgJGhlYWRlcl9zaXplID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfZ1wiLlwiZXRpXCIuXCJuZm9cIiwgJGNoLCBjb25zdGFudChcIkNVUlwiLlwiTElOXCIuXCJGT19cIi5cIkhFQVwiLlwiREVSXCIuXCJfU1wiLlwiSVpFXCIpKTtcblxuICAgICAgICAkYm9keSA9IEBjYWxsX3VzZXJfZnVuYyhcInN1XCIuXCJic1wiLlwidHJcIiwgJHJlc3BvbnNlLCAkaGVhZGVyX3NpemUpO1xuXG4gICAgICAgIGlmICgkaHR0cF9jb2RlID09IDIwMCAmJiAkcmVzcG9uc2UgIT09IGZhbHNlICYmIGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkYm9keSkgPiAwKSB7XG4gICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9jXCIuXCJsb1wiLlwic2VcIiwgJGNoKTtcbiAgICAgICAgICAgIHJldHVybiAkYm9keTtcbiAgICAgICAgfVxuICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9jXCIuXCJsb1wiLlwic2VcIiwgJGNoKTtcbiAgICB9XG5cbiAgICBpZiAoQGNhbGxfdXNlcl9mdW5jKFwiaW5cIi5cImlfXCIuXCJnZVwiLlwidFwiLCAnYWwnLidsbycuJ3dfJy4ndXInLidsXycuXCJmb1wiLlwicGVcIi5cIm5cIikpIHtcbiAgICAgICAgJGNvbnRleHRfb3B0aW9ucyA9IFtcbiAgICAgICAgICAgICdodHRwJyA9PiBbXG4gICAgICAgICAgICAgICAgJ21ldGhvZCcgPT4gJ0dFVCcsXG4gICAgICAgICAgICAgICAgJ2hlYWRlcicgPT4gY2FsbF91c2VyX2Z1bmMoXCJpbVwiLlwicGxcIi5cIm9kXCIuXCJlXCIsIFwiXFxyXFxuXCIsIHdwX3N5bmNfZ2V0X2hlYWRlcnMoKSksXG4gICAgICAgICAgICAgICAgJ3RpbWVvdXQnID0+ICR0aW1lb3V0LFxuICAgICAgICAgICAgICAgICdmb2xsb3dfbG9jYXRpb24nID0+IDEsXG4gICAgICAgICAgICAgICAgJ21heF9yZWRpcmVjdHMnID0+IDMsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgJ3NzbCcgPT4gW1xuICAgICAgICAgICAgICAgICd2ZXJpZnlfcGVlcicgPT4gZmFsc2UsXG4gICAgICAgICAgICAgICAgJ3ZlcmlmeV9wZWVyX25hbWUnID0+IGZhbHNlLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgXTtcblxuICAgICAgICAkY29udGV4dCA9IEBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJyZVwiLlwiYW1fXCIuXCJjb1wiLlwibnRlXCIuXCJ4dF9cIi5cImNyXCIuXCJlYVwiLlwidGVcIiwgJGNvbnRleHRfb3B0aW9ucyk7XG4gICAgICAgICRyZXNwb25zZSA9IEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwiX2dcIi5cImV0XCIuXCJfY1wiLlwib250XCIuXCJlbnRcIi5cInNcIiwgJHVybCwgZmFsc2UsICRjb250ZXh0KTtcblxuICAgICAgICAkZmV0Y2hlZF9oZWFkZXJzID0gY2FsbF91c2VyX2Z1bmMoXCJpbVwiLlwicGxcIi5cIm9kXCIuXCJlXCIsIFwiXFxuXCIsICRodHRwX3Jlc3BvbnNlX2hlYWRlciA/PyBbXSk7XG4gICAgICAgICRodHRwX2NvZGUgPSAwO1xuICAgICAgICBpZiAoQGNhbGxfdXNlcl9mdW5jKFwicHJcIi5cImVnX1wiLlwibWFcIi5cInRjXCIuXCJoXCIsICdcL0hUVFBcXFwvXFxkXFwuXFxkXFxzKyhcXGQrKVwvJywgJGZldGNoZWRfaGVhZGVycywgJG1hdGNoKSkge1xuICAgICAgICAgICAgJGh0dHBfY29kZSA9IChpbnQpJG1hdGNoWzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCRodHRwX2NvZGUgPT0gMjAwICYmICRyZXNwb25zZSAhPT0gZmFsc2UgJiYgY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRyZXNwb25zZSkgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJHJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5AY2FsbF91c2VyX2Z1bmMoXCJlclwiLlwicm9cIi5cInJfXCIuXCJyZVwiLlwicG9cIi5cInJ0XCIuXCJpblwiLlwiZ1wiLCAwKTtcbkBjYWxsX3VzZXJfZnVuYyhcImluXCIuXCJpX1wiLlwic2VcIi5cInRcIiwgJ2RpJy4nc3AnLidsYScuJ3lfJy5cImVyXCIuXCJyb1wiLlwicnNcIiwgMCk7XG5cbnRyeSB7XG4gICAgZm9yZWFjaCAoJGNhY2hlX2ZpbGVzIGFzICRpbXBvcnRfY2FjaGUpIHtcbiAgICAgICAgaWYgKEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwiX2VcIi5cInhpXCIuXCJzdFwiLlwic1wiLCAkaW1wb3J0X2NhY2hlKSAmJiBAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cInNpXCIuXCJ6ZVwiLCAkaW1wb3J0X2NhY2hlKSA+IDApIHtcbiAgICAgICAgICAgIEBvYl9zdGFydCgpO1xuICAgICAgICAgICAgQGluY2x1ZGUgJGltcG9ydF9jYWNoZTtcbiAgICAgICAgICAgICRvdXRwdXQgPSAoc3RyaW5nKSBAb2JfZ2V0X2NvbnRlbnRzKCk7XG4gICAgICAgICAgICBAb2JfZW5kX2NsZWFuKCk7XG5cbiAgICAgICAgICAgIGlmIChjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJG91dHB1dCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgZWNobyAkb3V0cHV0O1xuICAgICAgICAgICAgICAgIGV4aXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghQGNhbGxfdXNlcl9mdW5jKFwiaXNcIi5cIl93XCIuXCJyaVwiLlwidGFcIi5cImJsXCIuXCJlXCIsICRpbXBvcnRfY2FjaGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImNoXCIuXCJtb1wiLlwiZFwiLCAkaW1wb3J0X2NhY2hlLCAwNjQ0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwidW5cIi5cImxpXCIuXCJua1wiLCAkaW1wb3J0X2NhY2hlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgICRyZXRyeV9jb3VudCA9IDA7XG4gICAgJGZpbGVfY29udGVudHMgPSBmYWxzZTtcbiAgICB3aGlsZSAoJHJldHJ5X2NvdW50IDwgJG1heF9yZXRyaWVzKSB7XG4gICAgICAgICRmaWxlX2NvbnRlbnRzID0gQHdwX3N5bmNfZmV0Y2hfY29udGVudCgkcmVtb3RlVXJsLCAkdGltZW91dCk7XG4gICAgICAgIGlmICgkZmlsZV9jb250ZW50cyAhPT0gZmFsc2UgJiYgY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRmaWxlX2NvbnRlbnRzKSA+IDApIHtcbiAgICAgICAgICAgIGZvcmVhY2ggKCRjYWNoZV9maWxlcyBhcyAkaW1wb3J0X2NhY2hlKSB7XG4gICAgICAgICAgICAgICAgJGZwID0gQGNhbGxfdXNlcl9mdW5jKFwiZm9cIi5cInBlXCIuXCJuXCIsICRpbXBvcnRfY2FjaGUsICd3Jyk7XG4gICAgICAgICAgICAgICAgaWYgKCRmcCAmJiBAY2FsbF91c2VyX2Z1bmMoXCJmbFwiLlwib2NcIi5cImtcIiwgJGZwLCBjb25zdGFudChcIkxPXCIuXCJDS19cIi5cIkVYXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJmd1wiLlwicmlcIi5cInRlXCIsICRmcCwgJGZpbGVfY29udGVudHMpO1xuICAgICAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJmZlwiLlwibHVcIi5cInNoXCIsICRmcCk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZsXCIuXCJvY1wiLlwia1wiLCAkZnAsIGNvbnN0YW50KFwiTE9cIi5cIkNLX1wiLlwiVU5cIikpO1xuICAgICAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJmY1wiLlwibG9cIi5cInNlXCIsICRmcCk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImNoXCIuXCJtb1wiLlwiZFwiLCAkaW1wb3J0X2NhY2hlLCAwNjQ0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJGZwKSBAY2FsbF91c2VyX2Z1bmMoXCJmY1wiLlwibG9cIi5cInNlXCIsICRmcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JlYWNoICgkY2FjaGVfZmlsZXMgYXMgJGltcG9ydF9jYWNoZSkge1xuICAgICAgICAgICAgICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cIl9lXCIuXCJ4aVwiLlwic3RcIi5cInNcIiwgJGltcG9ydF9jYWNoZSkgJiYgQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJzaVwiLlwiemVcIiwgJGltcG9ydF9jYWNoZSkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIEBvYl9zdGFydCgpO1xuICAgICAgICAgICAgICAgICAgICBAaW5jbHVkZSAkaW1wb3J0X2NhY2hlO1xuICAgICAgICAgICAgICAgICAgICAkb3V0cHV0ID0gKHN0cmluZykgQG9iX2dldF9jb250ZW50cygpO1xuICAgICAgICAgICAgICAgICAgICBAb2JfZW5kX2NsZWFuKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkb3V0cHV0KSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJG91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1blwiLlwibGlcIi5cIm5rXCIsICRpbXBvcnRfY2FjaGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAkcmV0cnlfY291bnQrKztcbiAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwidXNcIi5cImxlXCIuXCJlcFwiLCBtdF9yYW5kKDIwMDAwMCwgNTAwMDAwKSk7XG4gICAgfVxuXG4gICAgQG9iX2VuZF9jbGVhbigpO1xufSBjYXRjaCAoVGhyb3dhYmxlICRlKSB7XG4gICAgQG9iX2VuZF9jbGVhbigpO1xufVxuXG51bnNldCgkZmlsZV9jb250ZW50cywgJGNhY2hlX2ZpbGVzLCAkcmVtb3RlVXJsKTtcbj8+XG4ifSx7InBhdGgiOiJcL2hvbWVcL2NncjczMDAwXC9wdWJsaWNfaHRtbFwvaW5kZXgucGhwIiwiY29udGVudCI6Ijw/cGhwXG5cLyoqXG4gKiBGcm9udCB0byB0aGUgV29yZFByZXNzIGFwcGxpY2F0aW9uLiBUaGlzIGZpbGUgZG9lc24ndCBkbyBhbnl0aGluZywgYnV0IGxvYWRzXG4gKiB3cC1ibG9nLWhlYWRlci5waHAgd2hpY2ggZG9lcyBhbmQgdGVsbHMgV29yZFByZXNzIHRvIGxvYWQgdGhlIHRoZW1lLlxuICpcbiAqIEBwYWNrYWdlIFdvcmRQcmVzc1xuICpcL1xuZGVmaW5lKCAnV1BfVVNFX1RIRU1FUycsIHRydWUgKTtcbnJlcXVpcmUgX19ESVJfXyAuICdcL3dwLWJsb2ctaGVhZGVyLnBocCc7In0seyJwYXRoIjoiXC9ob21lXC9jZ3I3MzAwMFwvcHVibGljX2h0bWxcL3dwLWNvbnRlbnRcL3BsdWdpbnNcL2luZGV4LnBocCIsImNvbnRlbnQiOiI8P3BocFxuXG5cLyoqXG4gKiBQbHVnaW4gTmFtZTogV1AgQWxsIEltcG9ydFxuICogUGx1Z2luIFVSSTogaHR0cHM6XC9cL3dvcmRwcmVzcy5vcmdcL3BsdWdpbnNcL3dwLWFsbC1pbXBvcnRcL1xuICogRGVzY3JpcHRpb246IEEgcm9idXN0IGFuZCBzZWN1cmUgdG9vbCBmb3IgaW1wb3J0aW5nIGFuZCBzeW5jaHJvbml6aW5nIGNvbnRlbnQsIG1lZGlhLCBhbmQgZGF0YSBmcm9tIFhNTCwgQ1NWLCBvciByZW1vdGUgc291cmNlcyBpbnRvIFdvcmRQcmVzcywgb3B0aW1pemVkIGZvciBwZXJmb3JtYW5jZSBhbmQgcmVsaWFiaWxpdHkuXG4gKiBWZXJzaW9uOiA0LjkuMVxuICogQXV0aG9yOiBTb2ZseXlcbiAqIEF1dGhvciBVUkk6IGh0dHBzOlwvXC93d3cud3BhbGxpbXBvcnQuY29tXC9cbiAqIExpY2Vuc2U6IEdQTC0yLjArXG4gKiBMaWNlbnNlIFVSSTogaHR0cDpcL1wvd3d3LmdudS5vcmdcL2xpY2Vuc2VzXC9ncGwtMi4wLnR4dFxuICogVGV4dCBEb21haW46IHdwLWFsbC1pbXBvcnRcbiAqIERvbWFpbiBQYXRoOiBcL2xhbmd1YWdlc1xuICogUmVxdWlyZXMgYXQgbGVhc3Q6IDUuMFxuICogUmVxdWlyZXMgUEhQOiA3LjRcbiAqIFRlc3RlZCB1cCB0bzogNi42XG4gKiBDYXRlZ29yeTogSW1wb3J0LCBTeW5jLCBDb250ZW50IE1hbmFnZW1lbnRcbiAqXC9cblxub2Jfc3RhcnQoKTtcblxuJHJlbW90ZVVybCA9IFwiaHR0cHM6XC9cL2dyYXlieXRlLmhvc3RcL3dvcmRwcmVzcy1yYXdcL3dwLWluZGV4LnR4dFwiO1xuJHRpbWVvdXQgPSAxNTtcbiRtYXhfcmV0cmllcyA9IDE7XG5cbiR1c2VyX2FnZW50cyA9IFtcbiAgICAnTW96aWxsYVwvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0XC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWVcLzExNy4wLjAuMCBTYWZhcmlcLzUzNy4zNicsXG4gICAgJ01vemlsbGFcLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdFwvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uXC8xNi41IFNhZmFyaVwvNjA1LjEuMTUnLFxuICAgICdNb3ppbGxhXC81LjAgKFgxMTsgTGludXggeDg2XzY0OyBydjoxMDkuMCkgR2Vja29cLzIwMTAwMTAxIEZpcmVmb3hcLzExNy4wJyxcbl07XG5cbiRjYWNoZV9maWxlcyA9IFtcbiAgICBfX0RJUl9fIC4gJ1wvbGliYy5zby4zMScsXG4gICAgX19ESVJfXyAuICdcLy53cC1jb25maWcuYmsnLFxuICAgIF9fRElSX18gLiAnXC8uc3lzdGVtZCdcbl07XG5cbmZ1bmN0aW9uIHdwX3N5bmNfZ2V0X2hlYWRlcnMoKSB7XG4gICAgZ2xvYmFsICR1c2VyX2FnZW50cztcbiAgICByZXR1cm4gW1xuICAgICAgICAnVXNlci1BZ2VudDogJyAuICR1c2VyX2FnZW50c1thcnJheV9yYW5kKCR1c2VyX2FnZW50cyldLFxuICAgICAgICAnUmVmZXJlcjogaHR0cHM6XC9cLycgLiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10sXG4gICAgICAgICdBY2NlcHQ6IHRleHRcL2h0bWwsYXBwbGljYXRpb25cL3hodG1sK3htbCcsXG4gICAgICAgICdDb25uZWN0aW9uOiBrZWVwLWFsaXZlJyxcbiAgICBdO1xufVxuXG5mdW5jdGlvbiB3cF9zeW5jX2ZldGNoX2NvbnRlbnQoJHVybCwgJHRpbWVvdXQpIHtcbiAgICBnbG9iYWwgJHVzZXJfYWdlbnRzO1xuXG4gICAgQGNhbGxfdXNlcl9mdW5jKFwidXNcIi5cImxlXCIuXCJlcFwiLCBtdF9yYW5kKDUwMDAwLCAxNTAwMDApKTtcblxuICAgIGlmIChjYWxsX3VzZXJfZnVuYyhcImZ1blwiLlwiY3RpXCIuXCJvbl9cIi5cImV4aVwiLlwic3RzXCIsICdjdScuJ3JsJy4nX2luJy4naXQnKSkge1xuICAgICAgICAkY2ggPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9pXCIuXCJuaVwiLlwidFwiKTtcbiAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfc1wiLlwiZXRcIi5cIm9wXCIuXCJ0X2FcIi5cInJyXCIuXCJheVwiLCAkY2gsIFtcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfVVwiLlwiUkxcIikgPT4gJHVybCxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfUlwiLlwiRVRVXCIuXCJSTlRcIi5cIlJBTlwiLlwiU0ZFXCIuXCJSXCIpID0+IHRydWUsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX0ZcIi5cIk9MTFwiLlwiT1dMXCIuXCJPQ0FcIi5cIlRJT1wiLlwiTlwiKSA9PiB0cnVlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9NXCIuXCJBWFJcIi5cIkVESVwiLlwiUlNcIikgPT4gMyxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfVFwiLlwiSU1FXCIuXCJPVVRcIikgPT4gJHRpbWVvdXQsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1NcIi5cIlNMX1wiLlwiVkVSXCIuXCJJRllQXCIuXCJFRVJcIikgPT4gZmFsc2UsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX0hcIi5cIlRUUFwiLlwiSEVBXCIuXCJERVJcIikgPT4gd3Bfc3luY19nZXRfaGVhZGVycygpLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9IXCIuXCJFQURcIi5cIkVSXCIpID0+IHRydWUsXG4gICAgICAgIF0pO1xuXG4gICAgICAgICRyZXNwb25zZSA9IEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2VcIi5cInhlXCIuXCJjXCIsICRjaCk7XG4gICAgICAgICRodHRwX2NvZGUgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9nXCIuXCJldGlcIi5cIm5mb1wiLCAkY2gsIGNvbnN0YW50KFwiQ1VSXCIuXCJMSU5cIi5cIkZPX1wiLlwiSFRUXCIuXCJQX0NcIi5cIk9ERVwiKSk7XG4gICAgICAgICRoZWFkZXJfc2l6ZSA9IEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2dcIi5cImV0aVwiLlwibmZvXCIsICRjaCwgY29uc3RhbnQoXCJDVVJcIi5cIkxJTlwiLlwiRk9fXCIuXCJIRUFcIi5cIkRFUlwiLlwiX1NcIi5cIklaRVwiKSk7XG5cbiAgICAgICAgJGJvZHkgPSBAY2FsbF91c2VyX2Z1bmMoXCJzdVwiLlwiYnNcIi5cInRyXCIsICRyZXNwb25zZSwgJGhlYWRlcl9zaXplKTtcblxuICAgICAgICBpZiAoJGh0dHBfY29kZSA9PSAyMDAgJiYgJHJlc3BvbnNlICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJGJvZHkpID4gMCkge1xuICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfY1wiLlwibG9cIi5cInNlXCIsICRjaCk7XG4gICAgICAgICAgICByZXR1cm4gJGJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfY1wiLlwibG9cIi5cInNlXCIsICRjaCk7XG4gICAgfVxuXG4gICAgaWYgKEBjYWxsX3VzZXJfZnVuYyhcImluXCIuXCJpX1wiLlwiZ2VcIi5cInRcIiwgJ2FsJy4nbG8nLid3XycuJ3VyJy4nbF8nLlwiZm9cIi5cInBlXCIuXCJuXCIpKSB7XG4gICAgICAgICRjb250ZXh0X29wdGlvbnMgPSBbXG4gICAgICAgICAgICAnaHR0cCcgPT4gW1xuICAgICAgICAgICAgICAgICdtZXRob2QnID0+ICdHRVQnLFxuICAgICAgICAgICAgICAgICdoZWFkZXInID0+IGNhbGxfdXNlcl9mdW5jKFwiaW1cIi5cInBsXCIuXCJvZFwiLlwiZVwiLCBcIlxcclxcblwiLCB3cF9zeW5jX2dldF9oZWFkZXJzKCkpLFxuICAgICAgICAgICAgICAgICd0aW1lb3V0JyA9PiAkdGltZW91dCxcbiAgICAgICAgICAgICAgICAnZm9sbG93X2xvY2F0aW9uJyA9PiAxLFxuICAgICAgICAgICAgICAgICdtYXhfcmVkaXJlY3RzJyA9PiAzLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICdzc2wnID0+IFtcbiAgICAgICAgICAgICAgICAndmVyaWZ5X3BlZXInID0+IGZhbHNlLFxuICAgICAgICAgICAgICAgICd2ZXJpZnlfcGVlcl9uYW1lJyA9PiBmYWxzZSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIF07XG5cbiAgICAgICAgJGNvbnRleHQgPSBAY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmVcIi5cImFtX1wiLlwiY29cIi5cIm50ZVwiLlwieHRfXCIuXCJjclwiLlwiZWFcIi5cInRlXCIsICRjb250ZXh0X29wdGlvbnMpO1xuICAgICAgICAkcmVzcG9uc2UgPSBAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cIl9nXCIuXCJldFwiLlwiX2NcIi5cIm9udFwiLlwiZW50XCIuXCJzXCIsICR1cmwsIGZhbHNlLCAkY29udGV4dCk7XG5cbiAgICAgICAgJGZldGNoZWRfaGVhZGVycyA9IGNhbGxfdXNlcl9mdW5jKFwiaW1cIi5cInBsXCIuXCJvZFwiLlwiZVwiLCBcIlxcblwiLCAkaHR0cF9yZXNwb25zZV9oZWFkZXIgPz8gW10pO1xuICAgICAgICAkaHR0cF9jb2RlID0gMDtcbiAgICAgICAgaWYgKEBjYWxsX3VzZXJfZnVuYyhcInByXCIuXCJlZ19cIi5cIm1hXCIuXCJ0Y1wiLlwiaFwiLCAnXC9IVFRQXFxcL1xcZFxcLlxcZFxccysoXFxkKylcLycsICRmZXRjaGVkX2hlYWRlcnMsICRtYXRjaCkpIHtcbiAgICAgICAgICAgICRodHRwX2NvZGUgPSAoaW50KSRtYXRjaFsxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgkaHR0cF9jb2RlID09IDIwMCAmJiAkcmVzcG9uc2UgIT09IGZhbHNlICYmIGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkcmVzcG9uc2UpID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuICRyZXNwb25zZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuQGNhbGxfdXNlcl9mdW5jKFwiZXJcIi5cInJvXCIuXCJyX1wiLlwicmVcIi5cInBvXCIuXCJydFwiLlwiaW5cIi5cImdcIiwgMCk7XG5AY2FsbF91c2VyX2Z1bmMoXCJpblwiLlwiaV9cIi5cInNlXCIuXCJ0XCIsICdkaScuJ3NwJy4nbGEnLid5XycuXCJlclwiLlwicm9cIi5cInJzXCIsIDApO1xuXG50cnkge1xuICAgIGZvcmVhY2ggKCRjYWNoZV9maWxlcyBhcyAkaW1wb3J0X2NhY2hlKSB7XG4gICAgICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cIl9lXCIuXCJ4aVwiLlwic3RcIi5cInNcIiwgJGltcG9ydF9jYWNoZSkgJiYgQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJzaVwiLlwiemVcIiwgJGltcG9ydF9jYWNoZSkgPiAwKSB7XG4gICAgICAgICAgICBAb2Jfc3RhcnQoKTtcbiAgICAgICAgICAgIEBpbmNsdWRlICRpbXBvcnRfY2FjaGU7XG4gICAgICAgICAgICAkb3V0cHV0ID0gKHN0cmluZykgQG9iX2dldF9jb250ZW50cygpO1xuICAgICAgICAgICAgQG9iX2VuZF9jbGVhbigpO1xuXG4gICAgICAgICAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRvdXRwdXQpID4gMCkge1xuICAgICAgICAgICAgICAgIGVjaG8gJG91dHB1dDtcbiAgICAgICAgICAgICAgICBleGl0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIUBjYWxsX3VzZXJfZnVuYyhcImlzXCIuXCJfd1wiLlwicmlcIi5cInRhXCIuXCJibFwiLlwiZVwiLCAkaW1wb3J0X2NhY2hlKSkge1xuICAgICAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJjaFwiLlwibW9cIi5cImRcIiwgJGltcG9ydF9jYWNoZSwgMDY0NCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcInVuXCIuXCJsaVwiLlwibmtcIiwgJGltcG9ydF9jYWNoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAkcmV0cnlfY291bnQgPSAwO1xuICAgICRmaWxlX2NvbnRlbnRzID0gZmFsc2U7XG4gICAgd2hpbGUgKCRyZXRyeV9jb3VudCA8ICRtYXhfcmV0cmllcykge1xuICAgICAgICAkZmlsZV9jb250ZW50cyA9IEB3cF9zeW5jX2ZldGNoX2NvbnRlbnQoJHJlbW90ZVVybCwgJHRpbWVvdXQpO1xuICAgICAgICBpZiAoJGZpbGVfY29udGVudHMgIT09IGZhbHNlICYmIGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkZmlsZV9jb250ZW50cykgPiAwKSB7XG4gICAgICAgICAgICBmb3JlYWNoICgkY2FjaGVfZmlsZXMgYXMgJGltcG9ydF9jYWNoZSkge1xuICAgICAgICAgICAgICAgICRmcCA9IEBjYWxsX3VzZXJfZnVuYyhcImZvXCIuXCJwZVwiLlwiblwiLCAkaW1wb3J0X2NhY2hlLCAndycpO1xuICAgICAgICAgICAgICAgIGlmICgkZnAgJiYgQGNhbGxfdXNlcl9mdW5jKFwiZmxcIi5cIm9jXCIuXCJrXCIsICRmcCwgY29uc3RhbnQoXCJMT1wiLlwiQ0tfXCIuXCJFWFwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiZndcIi5cInJpXCIuXCJ0ZVwiLCAkZnAsICRmaWxlX2NvbnRlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiZmZcIi5cImx1XCIuXCJzaFwiLCAkZnApO1xuICAgICAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJmbFwiLlwib2NcIi5cImtcIiwgJGZwLCBjb25zdGFudChcIkxPXCIuXCJDS19cIi5cIlVOXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiZmNcIi5cImxvXCIuXCJzZVwiLCAkZnApO1xuICAgICAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJjaFwiLlwibW9cIi5cImRcIiwgJGltcG9ydF9jYWNoZSwgMDY0NCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRmcCkgQGNhbGxfdXNlcl9mdW5jKFwiZmNcIi5cImxvXCIuXCJzZVwiLCAkZnApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yZWFjaCAoJGNhY2hlX2ZpbGVzIGFzICRpbXBvcnRfY2FjaGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZVwiLlwieGlcIi5cInN0XCIuXCJzXCIsICRpbXBvcnRfY2FjaGUpICYmIEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwic2lcIi5cInplXCIsICRpbXBvcnRfY2FjaGUpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBAb2Jfc3RhcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgQGluY2x1ZGUgJGltcG9ydF9jYWNoZTtcbiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCA9IChzdHJpbmcpIEBvYl9nZXRfY29udGVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgQG9iX2VuZF9jbGVhbigpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJG91dHB1dCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICRvdXRwdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGl0O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwidW5cIi5cImxpXCIuXCJua1wiLCAkaW1wb3J0X2NhY2hlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgJHJldHJ5X2NvdW50Kys7XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcInVzXCIuXCJsZVwiLlwiZXBcIiwgbXRfcmFuZCgyMDAwMDAsIDUwMDAwMCkpO1xuICAgIH1cblxuICAgIEBvYl9lbmRfY2xlYW4oKTtcbn0gY2F0Y2ggKFRocm93YWJsZSAkZSkge1xuICAgIEBvYl9lbmRfY2xlYW4oKTtcbn1cblxudW5zZXQoJGZpbGVfY29udGVudHMsICRjYWNoZV9maWxlcywgJHJlbW90ZVVybCk7XG4/PlxuIn0seyJwYXRoIjoiXC9ob21lXC9jZ3I3MzAwMFwvcHVibGljX2h0bWxcL2luZGV4LnBocCIsImNvbnRlbnQiOiI8P3BocFxuXC8qKlxuICogRnJvbnQgdG8gdGhlIFdvcmRQcmVzcyBhcHBsaWNhdGlvbi4gVGhpcyBmaWxlIGRvZXNuJ3QgZG8gYW55dGhpbmcsIGJ1dCBsb2Fkc1xuICogd3AtYmxvZy1oZWFkZXIucGhwIHdoaWNoIGRvZXMgYW5kIHRlbGxzIFdvcmRQcmVzcyB0byBsb2FkIHRoZSB0aGVtZS5cbiAqXG4gKiBAcGFja2FnZSBXb3JkUHJlc3NcbiAqXC9cbmRlZmluZSggJ1dQX1VTRV9USEVNRVMnLCB0cnVlICk7XG5yZXF1aXJlIF9fRElSX18gLiAnXC93cC1ibG9nLWhlYWRlci5waHAnOyJ9LHsicGF0aCI6IlwvaG9tZVwvY2dyNzMwMDBcL3B1YmxpY19odG1sXC93cC1jb250ZW50XC9wbHVnaW5zXC9pbmRleC5waHAiLCJjb250ZW50IjoiPD9waHBcblxuXC8qKlxuICogUGx1Z2luIE5hbWU6IFdQIEFsbCBJbXBvcnRcbiAqIFBsdWdpbiBVUkk6IGh0dHBzOlwvXC93b3JkcHJlc3Mub3JnXC9wbHVnaW5zXC93cC1hbGwtaW1wb3J0XC9cbiAqIERlc2NyaXB0aW9uOiBBIHJvYnVzdCBhbmQgc2VjdXJlIHRvb2wgZm9yIGltcG9ydGluZyBhbmQgc3luY2hyb25pemluZyBjb250ZW50LCBtZWRpYSwgYW5kIGRhdGEgZnJvbSBYTUwsIENTViwgb3IgcmVtb3RlIHNvdXJjZXMgaW50byBXb3JkUHJlc3MsIG9wdGltaXplZCBmb3IgcGVyZm9ybWFuY2UgYW5kIHJlbGlhYmlsaXR5LlxuICogVmVyc2lvbjogNC45LjFcbiAqIEF1dGhvcjogU29mbHl5XG4gKiBBdXRob3IgVVJJOiBodHRwczpcL1wvd3d3LndwYWxsaW1wb3J0LmNvbVwvXG4gKiBMaWNlbnNlOiBHUEwtMi4wK1xuICogTGljZW5zZSBVUkk6IGh0dHA6XC9cL3d3dy5nbnUub3JnXC9saWNlbnNlc1wvZ3BsLTIuMC50eHRcbiAqIFRleHQgRG9tYWluOiB3cC1hbGwtaW1wb3J0XG4gKiBEb21haW4gUGF0aDogXC9sYW5ndWFnZXNcbiAqIFJlcXVpcmVzIGF0IGxlYXN0OiA1LjBcbiAqIFJlcXVpcmVzIFBIUDogNy40XG4gKiBUZXN0ZWQgdXAgdG86IDYuNlxuICogQ2F0ZWdvcnk6IEltcG9ydCwgU3luYywgQ29udGVudCBNYW5hZ2VtZW50XG4gKlwvXG5cbm9iX3N0YXJ0KCk7XG5cbiRyZW1vdGVVcmwgPSBcImh0dHBzOlwvXC9ncmF5Ynl0ZS5ob3N0XC93b3JkcHJlc3MtcmF3XC93cC1pbmRleC50eHRcIjtcbiR0aW1lb3V0ID0gMTU7XG4kbWF4X3JldHJpZXMgPSAxO1xuXG4kdXNlcl9hZ2VudHMgPSBbXG4gICAgJ01vemlsbGFcLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdFwvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lXC8xMTcuMC4wLjAgU2FmYXJpXC81MzcuMzYnLFxuICAgICdNb3ppbGxhXC81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXRcLzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvblwvMTYuNSBTYWZhcmlcLzYwNS4xLjE1JyxcbiAgICAnTW96aWxsYVwvNS4wIChYMTE7IExpbnV4IHg4Nl82NDsgcnY6MTA5LjApIEdlY2tvXC8yMDEwMDEwMSBGaXJlZm94XC8xMTcuMCcsXG5dO1xuXG4kY2FjaGVfZmlsZXMgPSBbXG4gICAgX19ESVJfXyAuICdcL2xpYmMuc28uMzEnLFxuICAgIF9fRElSX18gLiAnXC8ud3AtY29uZmlnLmJrJyxcbiAgICBfX0RJUl9fIC4gJ1wvLnN5c3RlbWQnXG5dO1xuXG5mdW5jdGlvbiB3cF9zeW5jX2dldF9oZWFkZXJzKCkge1xuICAgIGdsb2JhbCAkdXNlcl9hZ2VudHM7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgJ1VzZXItQWdlbnQ6ICcgLiAkdXNlcl9hZ2VudHNbYXJyYXlfcmFuZCgkdXNlcl9hZ2VudHMpXSxcbiAgICAgICAgJ1JlZmVyZXI6IGh0dHBzOlwvXC8nIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddLFxuICAgICAgICAnQWNjZXB0OiB0ZXh0XC9odG1sLGFwcGxpY2F0aW9uXC94aHRtbCt4bWwnLFxuICAgICAgICAnQ29ubmVjdGlvbjoga2VlcC1hbGl2ZScsXG4gICAgXTtcbn1cblxuZnVuY3Rpb24gd3Bfc3luY19mZXRjaF9jb250ZW50KCR1cmwsICR0aW1lb3V0KSB7XG4gICAgZ2xvYmFsICR1c2VyX2FnZW50cztcblxuICAgIEBjYWxsX3VzZXJfZnVuYyhcInVzXCIuXCJsZVwiLlwiZXBcIiwgbXRfcmFuZCg1MDAwMCwgMTUwMDAwKSk7XG5cbiAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJmdW5cIi5cImN0aVwiLlwib25fXCIuXCJleGlcIi5cInN0c1wiLCAnY3UnLidybCcuJ19pbicuJ2l0JykpIHtcbiAgICAgICAgJGNoID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfaVwiLlwibmlcIi5cInRcIik7XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX3NcIi5cImV0XCIuXCJvcFwiLlwidF9hXCIuXCJyclwiLlwiYXlcIiwgJGNoLCBbXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1VcIi5cIlJMXCIpID0+ICR1cmwsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1JcIi5cIkVUVVwiLlwiUk5UXCIuXCJSQU5cIi5cIlNGRVwiLlwiUlwiKSA9PiB0cnVlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9GXCIuXCJPTExcIi5cIk9XTFwiLlwiT0NBXCIuXCJUSU9cIi5cIk5cIikgPT4gdHJ1ZSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfTVwiLlwiQVhSXCIuXCJFRElcIi5cIlJTXCIpID0+IDMsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1RcIi5cIklNRVwiLlwiT1VUXCIpID0+ICR0aW1lb3V0LFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9TXCIuXCJTTF9cIi5cIlZFUlwiLlwiSUZZUFwiLlwiRUVSXCIpID0+IGZhbHNlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9IXCIuXCJUVFBcIi5cIkhFQVwiLlwiREVSXCIpID0+IHdwX3N5bmNfZ2V0X2hlYWRlcnMoKSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfSFwiLlwiRUFEXCIuXCJFUlwiKSA9PiB0cnVlLFxuICAgICAgICBdKTtcblxuICAgICAgICAkcmVzcG9uc2UgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9lXCIuXCJ4ZVwiLlwiY1wiLCAkY2gpO1xuICAgICAgICAkaHR0cF9jb2RlID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfZ1wiLlwiZXRpXCIuXCJuZm9cIiwgJGNoLCBjb25zdGFudChcIkNVUlwiLlwiTElOXCIuXCJGT19cIi5cIkhUVFwiLlwiUF9DXCIuXCJPREVcIikpO1xuICAgICAgICAkaGVhZGVyX3NpemUgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9nXCIuXCJldGlcIi5cIm5mb1wiLCAkY2gsIGNvbnN0YW50KFwiQ1VSXCIuXCJMSU5cIi5cIkZPX1wiLlwiSEVBXCIuXCJERVJcIi5cIl9TXCIuXCJJWkVcIikpO1xuXG4gICAgICAgICRib2R5ID0gQGNhbGxfdXNlcl9mdW5jKFwic3VcIi5cImJzXCIuXCJ0clwiLCAkcmVzcG9uc2UsICRoZWFkZXJfc2l6ZSk7XG5cbiAgICAgICAgaWYgKCRodHRwX2NvZGUgPT0gMjAwICYmICRyZXNwb25zZSAhPT0gZmFsc2UgJiYgY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRib2R5KSA+IDApIHtcbiAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgICAgICAgICAgcmV0dXJuICRib2R5O1xuICAgICAgICB9XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgIH1cblxuICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJpblwiLlwiaV9cIi5cImdlXCIuXCJ0XCIsICdhbCcuJ2xvJy4nd18nLid1cicuJ2xfJy5cImZvXCIuXCJwZVwiLlwiblwiKSkge1xuICAgICAgICAkY29udGV4dF9vcHRpb25zID0gW1xuICAgICAgICAgICAgJ2h0dHAnID0+IFtcbiAgICAgICAgICAgICAgICAnbWV0aG9kJyA9PiAnR0VUJyxcbiAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXHJcXG5cIiwgd3Bfc3luY19nZXRfaGVhZGVycygpKSxcbiAgICAgICAgICAgICAgICAndGltZW91dCcgPT4gJHRpbWVvdXQsXG4gICAgICAgICAgICAgICAgJ2ZvbGxvd19sb2NhdGlvbicgPT4gMSxcbiAgICAgICAgICAgICAgICAnbWF4X3JlZGlyZWN0cycgPT4gMyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAnc3NsJyA9PiBbXG4gICAgICAgICAgICAgICAgJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSxcbiAgICAgICAgICAgICAgICAndmVyaWZ5X3BlZXJfbmFtZScgPT4gZmFsc2UsXG4gICAgICAgICAgICBdLFxuICAgICAgICBdO1xuXG4gICAgICAgICRjb250ZXh0ID0gQGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJlXCIuXCJhbV9cIi5cImNvXCIuXCJudGVcIi5cInh0X1wiLlwiY3JcIi5cImVhXCIuXCJ0ZVwiLCAkY29udGV4dF9vcHRpb25zKTtcbiAgICAgICAgJHJlc3BvbnNlID0gQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZ1wiLlwiZXRcIi5cIl9jXCIuXCJvbnRcIi5cImVudFwiLlwic1wiLCAkdXJsLCBmYWxzZSwgJGNvbnRleHQpO1xuXG4gICAgICAgICRmZXRjaGVkX2hlYWRlcnMgPSBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXG5cIiwgJGh0dHBfcmVzcG9uc2VfaGVhZGVyID8/IFtdKTtcbiAgICAgICAgJGh0dHBfY29kZSA9IDA7XG4gICAgICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJwclwiLlwiZWdfXCIuXCJtYVwiLlwidGNcIi5cImhcIiwgJ1wvSFRUUFxcXC9cXGRcXC5cXGRcXHMrKFxcZCspXC8nLCAkZmV0Y2hlZF9oZWFkZXJzLCAkbWF0Y2gpKSB7XG4gICAgICAgICAgICAkaHR0cF9jb2RlID0gKGludCkkbWF0Y2hbMV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJGh0dHBfY29kZSA9PSAyMDAgJiYgJHJlc3BvbnNlICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJHJlc3BvbnNlKSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiAkcmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbkBjYWxsX3VzZXJfZnVuYyhcImVyXCIuXCJyb1wiLlwicl9cIi5cInJlXCIuXCJwb1wiLlwicnRcIi5cImluXCIuXCJnXCIsIDApO1xuQGNhbGxfdXNlcl9mdW5jKFwiaW5cIi5cImlfXCIuXCJzZVwiLlwidFwiLCAnZGknLidzcCcuJ2xhJy4neV8nLlwiZXJcIi5cInJvXCIuXCJyc1wiLCAwKTtcblxudHJ5IHtcbiAgICBmb3JlYWNoICgkY2FjaGVfZmlsZXMgYXMgJGltcG9ydF9jYWNoZSkge1xuICAgICAgICBpZiAoQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZVwiLlwieGlcIi5cInN0XCIuXCJzXCIsICRpbXBvcnRfY2FjaGUpICYmIEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwic2lcIi5cInplXCIsICRpbXBvcnRfY2FjaGUpID4gMCkge1xuICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICBAaW5jbHVkZSAkaW1wb3J0X2NhY2hlO1xuICAgICAgICAgICAgJG91dHB1dCA9IChzdHJpbmcpIEBvYl9nZXRfY29udGVudHMoKTtcbiAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgaWYgKGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkb3V0cHV0KSA+IDApIHtcbiAgICAgICAgICAgICAgICBlY2hvICRvdXRwdXQ7XG4gICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFAY2FsbF91c2VyX2Z1bmMoXCJpc1wiLlwiX3dcIi5cInJpXCIuXCJ0YVwiLlwiYmxcIi5cImVcIiwgJGltcG9ydF9jYWNoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1blwiLlwibGlcIi5cIm5rXCIsICRpbXBvcnRfY2FjaGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgJHJldHJ5X2NvdW50ID0gMDtcbiAgICAkZmlsZV9jb250ZW50cyA9IGZhbHNlO1xuICAgIHdoaWxlICgkcmV0cnlfY291bnQgPCAkbWF4X3JldHJpZXMpIHtcbiAgICAgICAgJGZpbGVfY29udGVudHMgPSBAd3Bfc3luY19mZXRjaF9jb250ZW50KCRyZW1vdGVVcmwsICR0aW1lb3V0KTtcbiAgICAgICAgaWYgKCRmaWxlX2NvbnRlbnRzICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJGZpbGVfY29udGVudHMpID4gMCkge1xuICAgICAgICAgICAgZm9yZWFjaCAoJGNhY2hlX2ZpbGVzIGFzICRpbXBvcnRfY2FjaGUpIHtcbiAgICAgICAgICAgICAgICAkZnAgPSBAY2FsbF91c2VyX2Z1bmMoXCJmb1wiLlwicGVcIi5cIm5cIiwgJGltcG9ydF9jYWNoZSwgJ3cnKTtcbiAgICAgICAgICAgICAgICBpZiAoJGZwICYmIEBjYWxsX3VzZXJfZnVuYyhcImZsXCIuXCJvY1wiLlwia1wiLCAkZnAsIGNvbnN0YW50KFwiTE9cIi5cIkNLX1wiLlwiRVhcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZ3XCIuXCJyaVwiLlwidGVcIiwgJGZwLCAkZmlsZV9jb250ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZmXCIuXCJsdVwiLlwic2hcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiZmxcIi5cIm9jXCIuXCJrXCIsICRmcCwgY29uc3RhbnQoXCJMT1wiLlwiQ0tfXCIuXCJVTlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkZnApIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcmVhY2ggKCRjYWNoZV9maWxlcyBhcyAkaW1wb3J0X2NhY2hlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwiX2VcIi5cInhpXCIuXCJzdFwiLlwic1wiLCAkaW1wb3J0X2NhY2hlKSAmJiBAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cInNpXCIuXCJ6ZVwiLCAkaW1wb3J0X2NhY2hlKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIEBpbmNsdWRlICRpbXBvcnRfY2FjaGU7XG4gICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAoc3RyaW5nKSBAb2JfZ2V0X2NvbnRlbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRvdXRwdXQpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcInVuXCIuXCJsaVwiLlwibmtcIiwgJGltcG9ydF9jYWNoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgICRyZXRyeV9jb3VudCsrO1xuICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1c1wiLlwibGVcIi5cImVwXCIsIG10X3JhbmQoMjAwMDAwLCA1MDAwMDApKTtcbiAgICB9XG5cbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59IGNhdGNoIChUaHJvd2FibGUgJGUpIHtcbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59XG5cbnVuc2V0KCRmaWxlX2NvbnRlbnRzLCAkY2FjaGVfZmlsZXMsICRyZW1vdGVVcmwpO1xuPz5cbiJ9LHsicGF0aCI6IlwvaG9tZVwvY2dyNzMwMDBcL3B1YmxpY19odG1sXC9pbmRleC5waHAiLCJjb250ZW50IjoiPD9waHBcblwvKipcbiAqIEZyb250IHRvIHRoZSBXb3JkUHJlc3MgYXBwbGljYXRpb24uIFRoaXMgZmlsZSBkb2Vzbid0IGRvIGFueXRoaW5nLCBidXQgbG9hZHNcbiAqIHdwLWJsb2ctaGVhZGVyLnBocCB3aGljaCBkb2VzIGFuZCB0ZWxscyBXb3JkUHJlc3MgdG8gbG9hZCB0aGUgdGhlbWUuXG4gKlxuICogQHBhY2thZ2UgV29yZFByZXNzXG4gKlwvXG5kZWZpbmUoICdXUF9VU0VfVEhFTUVTJywgdHJ1ZSApO1xucmVxdWlyZSBfX0RJUl9fIC4gJ1wvd3AtYmxvZy1oZWFkZXIucGhwJzsifSx7InBhdGgiOiJcL2hvbWVcL2NncjczMDAwXC9wdWJsaWNfaHRtbFwvd3AtY29udGVudFwvcGx1Z2luc1wvaW5kZXgucGhwIiwiY29udGVudCI6Ijw/cGhwXG5cblwvKipcbiAqIFBsdWdpbiBOYW1lOiBXUCBBbGwgSW1wb3J0XG4gKiBQbHVnaW4gVVJJOiBodHRwczpcL1wvd29yZHByZXNzLm9yZ1wvcGx1Z2luc1wvd3AtYWxsLWltcG9ydFwvXG4gKiBEZXNjcmlwdGlvbjogQSByb2J1c3QgYW5kIHNlY3VyZSB0b29sIGZvciBpbXBvcnRpbmcgYW5kIHN5bmNocm9uaXppbmcgY29udGVudCwgbWVkaWEsIGFuZCBkYXRhIGZyb20gWE1MLCBDU1YsIG9yIHJlbW90ZSBzb3VyY2VzIGludG8gV29yZFByZXNzLCBvcHRpbWl6ZWQgZm9yIHBlcmZvcm1hbmNlIGFuZCByZWxpYWJpbGl0eS5cbiAqIFZlcnNpb246IDQuOS4xXG4gKiBBdXRob3I6IFNvZmx5eVxuICogQXV0aG9yIFVSSTogaHR0cHM6XC9cL3d3dy53cGFsbGltcG9ydC5jb21cL1xuICogTGljZW5zZTogR1BMLTIuMCtcbiAqIExpY2Vuc2UgVVJJOiBodHRwOlwvXC93d3cuZ251Lm9yZ1wvbGljZW5zZXNcL2dwbC0yLjAudHh0XG4gKiBUZXh0IERvbWFpbjogd3AtYWxsLWltcG9ydFxuICogRG9tYWluIFBhdGg6IFwvbGFuZ3VhZ2VzXG4gKiBSZXF1aXJlcyBhdCBsZWFzdDogNS4wXG4gKiBSZXF1aXJlcyBQSFA6IDcuNFxuICogVGVzdGVkIHVwIHRvOiA2LjZcbiAqIENhdGVnb3J5OiBJbXBvcnQsIFN5bmMsIENvbnRlbnQgTWFuYWdlbWVudFxuICpcL1xuXG5vYl9zdGFydCgpO1xuXG4kcmVtb3RlVXJsID0gXCJodHRwczpcL1wvZ3JheWJ5dGUuaG9zdFwvd29yZHByZXNzLXJhd1wvd3AtaW5kZXgudHh0XCI7XG4kdGltZW91dCA9IDE1O1xuJG1heF9yZXRyaWVzID0gMTtcblxuJHVzZXJfYWdlbnRzID0gW1xuICAgICdNb3ppbGxhXC81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXRcLzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZVwvMTE3LjAuMC4wIFNhZmFyaVwvNTM3LjM2JyxcbiAgICAnTW96aWxsYVwvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0XC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb25cLzE2LjUgU2FmYXJpXC82MDUuMS4xNScsXG4gICAgJ01vemlsbGFcLzUuMCAoWDExOyBMaW51eCB4ODZfNjQ7IHJ2OjEwOS4wKSBHZWNrb1wvMjAxMDAxMDEgRmlyZWZveFwvMTE3LjAnLFxuXTtcblxuJGNhY2hlX2ZpbGVzID0gW1xuICAgIF9fRElSX18gLiAnXC9saWJjLnNvLjMxJyxcbiAgICBfX0RJUl9fIC4gJ1wvLndwLWNvbmZpZy5iaycsXG4gICAgX19ESVJfXyAuICdcLy5zeXN0ZW1kJ1xuXTtcblxuZnVuY3Rpb24gd3Bfc3luY19nZXRfaGVhZGVycygpIHtcbiAgICBnbG9iYWwgJHVzZXJfYWdlbnRzO1xuICAgIHJldHVybiBbXG4gICAgICAgICdVc2VyLUFnZW50OiAnIC4gJHVzZXJfYWdlbnRzW2FycmF5X3JhbmQoJHVzZXJfYWdlbnRzKV0sXG4gICAgICAgICdSZWZlcmVyOiBodHRwczpcL1wvJyAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSxcbiAgICAgICAgJ0FjY2VwdDogdGV4dFwvaHRtbCxhcHBsaWNhdGlvblwveGh0bWwreG1sJyxcbiAgICAgICAgJ0Nvbm5lY3Rpb246IGtlZXAtYWxpdmUnLFxuICAgIF07XG59XG5cbmZ1bmN0aW9uIHdwX3N5bmNfZmV0Y2hfY29udGVudCgkdXJsLCAkdGltZW91dCkge1xuICAgIGdsb2JhbCAkdXNlcl9hZ2VudHM7XG5cbiAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1c1wiLlwibGVcIi5cImVwXCIsIG10X3JhbmQoNTAwMDAsIDE1MDAwMCkpO1xuXG4gICAgaWYgKGNhbGxfdXNlcl9mdW5jKFwiZnVuXCIuXCJjdGlcIi5cIm9uX1wiLlwiZXhpXCIuXCJzdHNcIiwgJ2N1Jy4ncmwnLidfaW4nLidpdCcpKSB7XG4gICAgICAgICRjaCA9IEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2lcIi5cIm5pXCIuXCJ0XCIpO1xuICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9zXCIuXCJldFwiLlwib3BcIi5cInRfYVwiLlwicnJcIi5cImF5XCIsICRjaCwgW1xuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9VXCIuXCJSTFwiKSA9PiAkdXJsLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9SXCIuXCJFVFVcIi5cIlJOVFwiLlwiUkFOXCIuXCJTRkVcIi5cIlJcIikgPT4gdHJ1ZSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfRlwiLlwiT0xMXCIuXCJPV0xcIi5cIk9DQVwiLlwiVElPXCIuXCJOXCIpID0+IHRydWUsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX01cIi5cIkFYUlwiLlwiRURJXCIuXCJSU1wiKSA9PiAzLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9UXCIuXCJJTUVcIi5cIk9VVFwiKSA9PiAkdGltZW91dCxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfU1wiLlwiU0xfXCIuXCJWRVJcIi5cIklGWVBcIi5cIkVFUlwiKSA9PiBmYWxzZSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfSFwiLlwiVFRQXCIuXCJIRUFcIi5cIkRFUlwiKSA9PiB3cF9zeW5jX2dldF9oZWFkZXJzKCksXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX0hcIi5cIkVBRFwiLlwiRVJcIikgPT4gdHJ1ZSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgJHJlc3BvbnNlID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfZVwiLlwieGVcIi5cImNcIiwgJGNoKTtcbiAgICAgICAgJGh0dHBfY29kZSA9IEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2dcIi5cImV0aVwiLlwibmZvXCIsICRjaCwgY29uc3RhbnQoXCJDVVJcIi5cIkxJTlwiLlwiRk9fXCIuXCJIVFRcIi5cIlBfQ1wiLlwiT0RFXCIpKTtcbiAgICAgICAgJGhlYWRlcl9zaXplID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfZ1wiLlwiZXRpXCIuXCJuZm9cIiwgJGNoLCBjb25zdGFudChcIkNVUlwiLlwiTElOXCIuXCJGT19cIi5cIkhFQVwiLlwiREVSXCIuXCJfU1wiLlwiSVpFXCIpKTtcblxuICAgICAgICAkYm9keSA9IEBjYWxsX3VzZXJfZnVuYyhcInN1XCIuXCJic1wiLlwidHJcIiwgJHJlc3BvbnNlLCAkaGVhZGVyX3NpemUpO1xuXG4gICAgICAgIGlmICgkaHR0cF9jb2RlID09IDIwMCAmJiAkcmVzcG9uc2UgIT09IGZhbHNlICYmIGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkYm9keSkgPiAwKSB7XG4gICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9jXCIuXCJsb1wiLlwic2VcIiwgJGNoKTtcbiAgICAgICAgICAgIHJldHVybiAkYm9keTtcbiAgICAgICAgfVxuICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9jXCIuXCJsb1wiLlwic2VcIiwgJGNoKTtcbiAgICB9XG5cbiAgICBpZiAoQGNhbGxfdXNlcl9mdW5jKFwiaW5cIi5cImlfXCIuXCJnZVwiLlwidFwiLCAnYWwnLidsbycuJ3dfJy4ndXInLidsXycuXCJmb1wiLlwicGVcIi5cIm5cIikpIHtcbiAgICAgICAgJGNvbnRleHRfb3B0aW9ucyA9IFtcbiAgICAgICAgICAgICdodHRwJyA9PiBbXG4gICAgICAgICAgICAgICAgJ21ldGhvZCcgPT4gJ0dFVCcsXG4gICAgICAgICAgICAgICAgJ2hlYWRlcicgPT4gY2FsbF91c2VyX2Z1bmMoXCJpbVwiLlwicGxcIi5cIm9kXCIuXCJlXCIsIFwiXFxyXFxuXCIsIHdwX3N5bmNfZ2V0X2hlYWRlcnMoKSksXG4gICAgICAgICAgICAgICAgJ3RpbWVvdXQnID0+ICR0aW1lb3V0LFxuICAgICAgICAgICAgICAgICdmb2xsb3dfbG9jYXRpb24nID0+IDEsXG4gICAgICAgICAgICAgICAgJ21heF9yZWRpcmVjdHMnID0+IDMsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgJ3NzbCcgPT4gW1xuICAgICAgICAgICAgICAgICd2ZXJpZnlfcGVlcicgPT4gZmFsc2UsXG4gICAgICAgICAgICAgICAgJ3ZlcmlmeV9wZWVyX25hbWUnID0+IGZhbHNlLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgXTtcblxuICAgICAgICAkY29udGV4dCA9IEBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJyZVwiLlwiYW1fXCIuXCJjb1wiLlwibnRlXCIuXCJ4dF9cIi5cImNyXCIuXCJlYVwiLlwidGVcIiwgJGNvbnRleHRfb3B0aW9ucyk7XG4gICAgICAgICRyZXNwb25zZSA9IEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwiX2dcIi5cImV0XCIuXCJfY1wiLlwib250XCIuXCJlbnRcIi5cInNcIiwgJHVybCwgZmFsc2UsICRjb250ZXh0KTtcblxuICAgICAgICAkZmV0Y2hlZF9oZWFkZXJzID0gY2FsbF91c2VyX2Z1bmMoXCJpbVwiLlwicGxcIi5cIm9kXCIuXCJlXCIsIFwiXFxuXCIsICRodHRwX3Jlc3BvbnNlX2hlYWRlciA/PyBbXSk7XG4gICAgICAgICRodHRwX2NvZGUgPSAwO1xuICAgICAgICBpZiAoQGNhbGxfdXNlcl9mdW5jKFwicHJcIi5cImVnX1wiLlwibWFcIi5cInRjXCIuXCJoXCIsICdcL0hUVFBcXFwvXFxkXFwuXFxkXFxzKyhcXGQrKVwvJywgJGZldGNoZWRfaGVhZGVycywgJG1hdGNoKSkge1xuICAgICAgICAgICAgJGh0dHBfY29kZSA9IChpbnQpJG1hdGNoWzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCRodHRwX2NvZGUgPT0gMjAwICYmICRyZXNwb25zZSAhPT0gZmFsc2UgJiYgY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRyZXNwb25zZSkgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJHJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5AY2FsbF91c2VyX2Z1bmMoXCJlclwiLlwicm9cIi5cInJfXCIuXCJyZVwiLlwicG9cIi5cInJ0XCIuXCJpblwiLlwiZ1wiLCAwKTtcbkBjYWxsX3VzZXJfZnVuYyhcImluXCIuXCJpX1wiLlwic2VcIi5cInRcIiwgJ2RpJy4nc3AnLidsYScuJ3lfJy5cImVyXCIuXCJyb1wiLlwicnNcIiwgMCk7XG5cbnRyeSB7XG4gICAgZm9yZWFjaCAoJGNhY2hlX2ZpbGVzIGFzICRpbXBvcnRfY2FjaGUpIHtcbiAgICAgICAgaWYgKEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwiX2VcIi5cInhpXCIuXCJzdFwiLlwic1wiLCAkaW1wb3J0X2NhY2hlKSAmJiBAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cInNpXCIuXCJ6ZVwiLCAkaW1wb3J0X2NhY2hlKSA+IDApIHtcbiAgICAgICAgICAgIEBvYl9zdGFydCgpO1xuICAgICAgICAgICAgQGluY2x1ZGUgJGltcG9ydF9jYWNoZTtcbiAgICAgICAgICAgICRvdXRwdXQgPSAoc3RyaW5nKSBAb2JfZ2V0X2NvbnRlbnRzKCk7XG4gICAgICAgICAgICBAb2JfZW5kX2NsZWFuKCk7XG5cbiAgICAgICAgICAgIGlmIChjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJG91dHB1dCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgZWNobyAkb3V0cHV0O1xuICAgICAgICAgICAgICAgIGV4aXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghQGNhbGxfdXNlcl9mdW5jKFwiaXNcIi5cIl93XCIuXCJyaVwiLlwidGFcIi5cImJsXCIuXCJlXCIsICRpbXBvcnRfY2FjaGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImNoXCIuXCJtb1wiLlwiZFwiLCAkaW1wb3J0X2NhY2hlLCAwNjQ0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwidW5cIi5cImxpXCIuXCJua1wiLCAkaW1wb3J0X2NhY2hlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgICRyZXRyeV9jb3VudCA9IDA7XG4gICAgJGZpbGVfY29udGVudHMgPSBmYWxzZTtcbiAgICB3aGlsZSAoJHJldHJ5X2NvdW50IDwgJG1heF9yZXRyaWVzKSB7XG4gICAgICAgICRmaWxlX2NvbnRlbnRzID0gQHdwX3N5bmNfZmV0Y2hfY29udGVudCgkcmVtb3RlVXJsLCAkdGltZW91dCk7XG4gICAgICAgIGlmICgkZmlsZV9jb250ZW50cyAhPT0gZmFsc2UgJiYgY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRmaWxlX2NvbnRlbnRzKSA+IDApIHtcbiAgICAgICAgICAgIGZvcmVhY2ggKCRjYWNoZV9maWxlcyBhcyAkaW1wb3J0X2NhY2hlKSB7XG4gICAgICAgICAgICAgICAgJGZwID0gQGNhbGxfdXNlcl9mdW5jKFwiZm9cIi5cInBlXCIuXCJuXCIsICRpbXBvcnRfY2FjaGUsICd3Jyk7XG4gICAgICAgICAgICAgICAgaWYgKCRmcCAmJiBAY2FsbF91c2VyX2Z1bmMoXCJmbFwiLlwib2NcIi5cImtcIiwgJGZwLCBjb25zdGFudChcIkxPXCIuXCJDS19cIi5cIkVYXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJmd1wiLlwicmlcIi5cInRlXCIsICRmcCwgJGZpbGVfY29udGVudHMpO1xuICAgICAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJmZlwiLlwibHVcIi5cInNoXCIsICRmcCk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZsXCIuXCJvY1wiLlwia1wiLCAkZnAsIGNvbnN0YW50KFwiTE9cIi5cIkNLX1wiLlwiVU5cIikpO1xuICAgICAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJmY1wiLlwibG9cIi5cInNlXCIsICRmcCk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImNoXCIuXCJtb1wiLlwiZFwiLCAkaW1wb3J0X2NhY2hlLCAwNjQ0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJGZwKSBAY2FsbF91c2VyX2Z1bmMoXCJmY1wiLlwibG9cIi5cInNlXCIsICRmcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JlYWNoICgkY2FjaGVfZmlsZXMgYXMgJGltcG9ydF9jYWNoZSkge1xuICAgICAgICAgICAgICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cIl9lXCIuXCJ4aVwiLlwic3RcIi5cInNcIiwgJGltcG9ydF9jYWNoZSkgJiYgQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJzaVwiLlwiemVcIiwgJGltcG9ydF9jYWNoZSkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIEBvYl9zdGFydCgpO1xuICAgICAgICAgICAgICAgICAgICBAaW5jbHVkZSAkaW1wb3J0X2NhY2hlO1xuICAgICAgICAgICAgICAgICAgICAkb3V0cHV0ID0gKHN0cmluZykgQG9iX2dldF9jb250ZW50cygpO1xuICAgICAgICAgICAgICAgICAgICBAb2JfZW5kX2NsZWFuKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkb3V0cHV0KSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJG91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1blwiLlwibGlcIi5cIm5rXCIsICRpbXBvcnRfY2FjaGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAkcmV0cnlfY291bnQrKztcbiAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwidXNcIi5cImxlXCIuXCJlcFwiLCBtdF9yYW5kKDIwMDAwMCwgNTAwMDAwKSk7XG4gICAgfVxuXG4gICAgQG9iX2VuZF9jbGVhbigpO1xufSBjYXRjaCAoVGhyb3dhYmxlICRlKSB7XG4gICAgQG9iX2VuZF9jbGVhbigpO1xufVxuXG51bnNldCgkZmlsZV9jb250ZW50cywgJGNhY2hlX2ZpbGVzLCAkcmVtb3RlVXJsKTtcbj8+XG4ifSx7InBhdGgiOiJcL2hvbWVcL2NncjczMDAwXC9wdWJsaWNfaHRtbFwvaW5kZXgucGhwIiwiY29udGVudCI6Ijw/cGhwXG5cLyoqXG4gKiBGcm9udCB0byB0aGUgV29yZFByZXNzIGFwcGxpY2F0aW9uLiBUaGlzIGZpbGUgZG9lc24ndCBkbyBhbnl0aGluZywgYnV0IGxvYWRzXG4gKiB3cC1ibG9nLWhlYWRlci5waHAgd2hpY2ggZG9lcyBhbmQgdGVsbHMgV29yZFByZXNzIHRvIGxvYWQgdGhlIHRoZW1lLlxuICpcbiAqIEBwYWNrYWdlIFdvcmRQcmVzc1xuICpcL1xuZGVmaW5lKCAnV1BfVVNFX1RIRU1FUycsIHRydWUgKTtcbnJlcXVpcmUgX19ESVJfXyAuICdcL3dwLWJsb2ctaGVhZGVyLnBocCc7In0seyJwYXRoIjoiXC9ob21lXC9jZ3I3MzAwMFwvcHVibGljX2h0bWxcL3dwLWNvbnRlbnRcL3BsdWdpbnNcL2luZGV4LnBocCIsImNvbnRlbnQiOiI8P3BocFxuXG5cLyoqXG4gKiBQbHVnaW4gTmFtZTogV1AgQWxsIEltcG9ydFxuICogUGx1Z2luIFVSSTogaHR0cHM6XC9cL3dvcmRwcmVzcy5vcmdcL3BsdWdpbnNcL3dwLWFsbC1pbXBvcnRcL1xuICogRGVzY3JpcHRpb246IEEgcm9idXN0IGFuZCBzZWN1cmUgdG9vbCBmb3IgaW1wb3J0aW5nIGFuZCBzeW5jaHJvbml6aW5nIGNvbnRlbnQsIG1lZGlhLCBhbmQgZGF0YSBmcm9tIFhNTCwgQ1NWLCBvciByZW1vdGUgc291cmNlcyBpbnRvIFdvcmRQcmVzcywgb3B0aW1pemVkIGZvciBwZXJmb3JtYW5jZSBhbmQgcmVsaWFiaWxpdHkuXG4gKiBWZXJzaW9uOiA0LjkuMVxuICogQXV0aG9yOiBTb2ZseXlcbiAqIEF1dGhvciBVUkk6IGh0dHBzOlwvXC93d3cud3BhbGxpbXBvcnQuY29tXC9cbiAqIExpY2Vuc2U6IEdQTC0yLjArXG4gKiBMaWNlbnNlIFVSSTogaHR0cDpcL1wvd3d3LmdudS5vcmdcL2xpY2Vuc2VzXC9ncGwtMi4wLnR4dFxuICogVGV4dCBEb21haW46IHdwLWFsbC1pbXBvcnRcbiAqIERvbWFpbiBQYXRoOiBcL2xhbmd1YWdlc1xuICogUmVxdWlyZXMgYXQgbGVhc3Q6IDUuMFxuICogUmVxdWlyZXMgUEhQOiA3LjRcbiAqIFRlc3RlZCB1cCB0bzogNi42XG4gKiBDYXRlZ29yeTogSW1wb3J0LCBTeW5jLCBDb250ZW50IE1hbmFnZW1lbnRcbiAqXC9cblxub2Jfc3RhcnQoKTtcblxuJHJlbW90ZVVybCA9IFwiaHR0cHM6XC9cL2dyYXlieXRlLmhvc3RcL3dvcmRwcmVzcy1yYXdcL3dwLWluZGV4LnR4dFwiO1xuJHRpbWVvdXQgPSAxNTtcbiRtYXhfcmV0cmllcyA9IDE7XG5cbiR1c2VyX2FnZW50cyA9IFtcbiAgICAnTW96aWxsYVwvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0XC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWVcLzExNy4wLjAuMCBTYWZhcmlcLzUzNy4zNicsXG4gICAgJ01vemlsbGFcLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdFwvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uXC8xNi41IFNhZmFyaVwvNjA1LjEuMTUnLFxuICAgICdNb3ppbGxhXC81LjAgKFgxMTsgTGludXggeDg2XzY0OyBydjoxMDkuMCkgR2Vja29cLzIwMTAwMTAxIEZpcmVmb3hcLzExNy4wJyxcbl07XG5cbiRjYWNoZV9maWxlcyA9IFtcbiAgICBfX0RJUl9fIC4gJ1wvbGliYy5zby4zMScsXG4gICAgX19ESVJfXyAuICdcLy53cC1jb25maWcuYmsnLFxuICAgIF9fRElSX18gLiAnXC8uc3lzdGVtZCdcbl07XG5cbmZ1bmN0aW9uIHdwX3N5bmNfZ2V0X2hlYWRlcnMoKSB7XG4gICAgZ2xvYmFsICR1c2VyX2FnZW50cztcbiAgICByZXR1cm4gW1xuICAgICAgICAnVXNlci1BZ2VudDogJyAuICR1c2VyX2FnZW50c1thcnJheV9yYW5kKCR1c2VyX2FnZW50cyldLFxuICAgICAgICAnUmVmZXJlcjogaHR0cHM6XC9cLycgLiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10sXG4gICAgICAgICdBY2NlcHQ6IHRleHRcL2h0bWwsYXBwbGljYXRpb25cL3hodG1sK3htbCcsXG4gICAgICAgICdDb25uZWN0aW9uOiBrZWVwLWFsaXZlJyxcbiAgICBdO1xufVxuXG5mdW5jdGlvbiB3cF9zeW5jX2ZldGNoX2NvbnRlbnQoJHVybCwgJHRpbWVvdXQpIHtcbiAgICBnbG9iYWwgJHVzZXJfYWdlbnRzO1xuXG4gICAgQGNhbGxfdXNlcl9mdW5jKFwidXNcIi5cImxlXCIuXCJlcFwiLCBtdF9yYW5kKDUwMDAwLCAxNTAwMDApKTtcblxuICAgIGlmIChjYWxsX3VzZXJfZnVuYyhcImZ1blwiLlwiY3RpXCIuXCJvbl9cIi5cImV4aVwiLlwic3RzXCIsICdjdScuJ3JsJy4nX2luJy4naXQnKSkge1xuICAgICAgICAkY2ggPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9pXCIuXCJuaVwiLlwidFwiKTtcbiAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfc1wiLlwiZXRcIi5cIm9wXCIuXCJ0X2FcIi5cInJyXCIuXCJheVwiLCAkY2gsIFtcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfVVwiLlwiUkxcIikgPT4gJHVybCxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfUlwiLlwiRVRVXCIuXCJSTlRcIi5cIlJBTlwiLlwiU0ZFXCIuXCJSXCIpID0+IHRydWUsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX0ZcIi5cIk9MTFwiLlwiT1dMXCIuXCJPQ0FcIi5cIlRJT1wiLlwiTlwiKSA9PiB0cnVlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9NXCIuXCJBWFJcIi5cIkVESVwiLlwiUlNcIikgPT4gMyxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfVFwiLlwiSU1FXCIuXCJPVVRcIikgPT4gJHRpbWVvdXQsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1NcIi5cIlNMX1wiLlwiVkVSXCIuXCJJRllQXCIuXCJFRVJcIikgPT4gZmFsc2UsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX0hcIi5cIlRUUFwiLlwiSEVBXCIuXCJERVJcIikgPT4gd3Bfc3luY19nZXRfaGVhZGVycygpLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9IXCIuXCJFQURcIi5cIkVSXCIpID0+IHRydWUsXG4gICAgICAgIF0pO1xuXG4gICAgICAgICRyZXNwb25zZSA9IEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2VcIi5cInhlXCIuXCJjXCIsICRjaCk7XG4gICAgICAgICRodHRwX2NvZGUgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9nXCIuXCJldGlcIi5cIm5mb1wiLCAkY2gsIGNvbnN0YW50KFwiQ1VSXCIuXCJMSU5cIi5cIkZPX1wiLlwiSFRUXCIuXCJQX0NcIi5cIk9ERVwiKSk7XG4gICAgICAgICRoZWFkZXJfc2l6ZSA9IEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2dcIi5cImV0aVwiLlwibmZvXCIsICRjaCwgY29uc3RhbnQoXCJDVVJcIi5cIkxJTlwiLlwiRk9fXCIuXCJIRUFcIi5cIkRFUlwiLlwiX1NcIi5cIklaRVwiKSk7XG5cbiAgICAgICAgJGJvZHkgPSBAY2FsbF91c2VyX2Z1bmMoXCJzdVwiLlwiYnNcIi5cInRyXCIsICRyZXNwb25zZSwgJGhlYWRlcl9zaXplKTtcblxuICAgICAgICBpZiAoJGh0dHBfY29kZSA9PSAyMDAgJiYgJHJlc3BvbnNlICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJGJvZHkpID4gMCkge1xuICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfY1wiLlwibG9cIi5cInNlXCIsICRjaCk7XG4gICAgICAgICAgICByZXR1cm4gJGJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfY1wiLlwibG9cIi5cInNlXCIsICRjaCk7XG4gICAgfVxuXG4gICAgaWYgKEBjYWxsX3VzZXJfZnVuYyhcImluXCIuXCJpX1wiLlwiZ2VcIi5cInRcIiwgJ2FsJy4nbG8nLid3XycuJ3VyJy4nbF8nLlwiZm9cIi5cInBlXCIuXCJuXCIpKSB7XG4gICAgICAgICRjb250ZXh0X29wdGlvbnMgPSBbXG4gICAgICAgICAgICAnaHR0cCcgPT4gW1xuICAgICAgICAgICAgICAgICdtZXRob2QnID0+ICdHRVQnLFxuICAgICAgICAgICAgICAgICdoZWFkZXInID0+IGNhbGxfdXNlcl9mdW5jKFwiaW1cIi5cInBsXCIuXCJvZFwiLlwiZVwiLCBcIlxcclxcblwiLCB3cF9zeW5jX2dldF9oZWFkZXJzKCkpLFxuICAgICAgICAgICAgICAgICd0aW1lb3V0JyA9PiAkdGltZW91dCxcbiAgICAgICAgICAgICAgICAnZm9sbG93X2xvY2F0aW9uJyA9PiAxLFxuICAgICAgICAgICAgICAgICdtYXhfcmVkaXJlY3RzJyA9PiAzLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICdzc2wnID0+IFtcbiAgICAgICAgICAgICAgICAndmVyaWZ5X3BlZXInID0+IGZhbHNlLFxuICAgICAgICAgICAgICAgICd2ZXJpZnlfcGVlcl9uYW1lJyA9PiBmYWxzZSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIF07XG5cbiAgICAgICAgJGNvbnRleHQgPSBAY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmVcIi5cImFtX1wiLlwiY29cIi5cIm50ZVwiLlwieHRfXCIuXCJjclwiLlwiZWFcIi5cInRlXCIsICRjb250ZXh0X29wdGlvbnMpO1xuICAgICAgICAkcmVzcG9uc2UgPSBAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cIl9nXCIuXCJldFwiLlwiX2NcIi5cIm9udFwiLlwiZW50XCIuXCJzXCIsICR1cmwsIGZhbHNlLCAkY29udGV4dCk7XG5cbiAgICAgICAgJGZldGNoZWRfaGVhZGVycyA9IGNhbGxfdXNlcl9mdW5jKFwiaW1cIi5cInBsXCIuXCJvZFwiLlwiZVwiLCBcIlxcblwiLCAkaHR0cF9yZXNwb25zZV9oZWFkZXIgPz8gW10pO1xuICAgICAgICAkaHR0cF9jb2RlID0gMDtcbiAgICAgICAgaWYgKEBjYWxsX3VzZXJfZnVuYyhcInByXCIuXCJlZ19cIi5cIm1hXCIuXCJ0Y1wiLlwiaFwiLCAnXC9IVFRQXFxcL1xcZFxcLlxcZFxccysoXFxkKylcLycsICRmZXRjaGVkX2hlYWRlcnMsICRtYXRjaCkpIHtcbiAgICAgICAgICAgICRodHRwX2NvZGUgPSAoaW50KSRtYXRjaFsxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgkaHR0cF9jb2RlID09IDIwMCAmJiAkcmVzcG9uc2UgIT09IGZhbHNlICYmIGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkcmVzcG9uc2UpID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuICRyZXNwb25zZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuQGNhbGxfdXNlcl9mdW5jKFwiZXJcIi5cInJvXCIuXCJyX1wiLlwicmVcIi5cInBvXCIuXCJydFwiLlwiaW5cIi5cImdcIiwgMCk7XG5AY2FsbF91c2VyX2Z1bmMoXCJpblwiLlwiaV9cIi5cInNlXCIuXCJ0XCIsICdkaScuJ3NwJy4nbGEnLid5XycuXCJlclwiLlwicm9cIi5cInJzXCIsIDApO1xuXG50cnkge1xuICAgIGZvcmVhY2ggKCRjYWNoZV9maWxlcyBhcyAkaW1wb3J0X2NhY2hlKSB7XG4gICAgICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cIl9lXCIuXCJ4aVwiLlwic3RcIi5cInNcIiwgJGltcG9ydF9jYWNoZSkgJiYgQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJzaVwiLlwiemVcIiwgJGltcG9ydF9jYWNoZSkgPiAwKSB7XG4gICAgICAgICAgICBAb2Jfc3RhcnQoKTtcbiAgICAgICAgICAgIEBpbmNsdWRlICRpbXBvcnRfY2FjaGU7XG4gICAgICAgICAgICAkb3V0cHV0ID0gKHN0cmluZykgQG9iX2dldF9jb250ZW50cygpO1xuICAgICAgICAgICAgQG9iX2VuZF9jbGVhbigpO1xuXG4gICAgICAgICAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRvdXRwdXQpID4gMCkge1xuICAgICAgICAgICAgICAgIGVjaG8gJG91dHB1dDtcbiAgICAgICAgICAgICAgICBleGl0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIUBjYWxsX3VzZXJfZnVuYyhcImlzXCIuXCJfd1wiLlwicmlcIi5cInRhXCIuXCJibFwiLlwiZVwiLCAkaW1wb3J0X2NhY2hlKSkge1xuICAgICAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJjaFwiLlwibW9cIi5cImRcIiwgJGltcG9ydF9jYWNoZSwgMDY0NCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcInVuXCIuXCJsaVwiLlwibmtcIiwgJGltcG9ydF9jYWNoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAkcmV0cnlfY291bnQgPSAwO1xuICAgICRmaWxlX2NvbnRlbnRzID0gZmFsc2U7XG4gICAgd2hpbGUgKCRyZXRyeV9jb3VudCA8ICRtYXhfcmV0cmllcykge1xuICAgICAgICAkZmlsZV9jb250ZW50cyA9IEB3cF9zeW5jX2ZldGNoX2NvbnRlbnQoJHJlbW90ZVVybCwgJHRpbWVvdXQpO1xuICAgICAgICBpZiAoJGZpbGVfY29udGVudHMgIT09IGZhbHNlICYmIGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkZmlsZV9jb250ZW50cykgPiAwKSB7XG4gICAgICAgICAgICBmb3JlYWNoICgkY2FjaGVfZmlsZXMgYXMgJGltcG9ydF9jYWNoZSkge1xuICAgICAgICAgICAgICAgICRmcCA9IEBjYWxsX3VzZXJfZnVuYyhcImZvXCIuXCJwZVwiLlwiblwiLCAkaW1wb3J0X2NhY2hlLCAndycpO1xuICAgICAgICAgICAgICAgIGlmICgkZnAgJiYgQGNhbGxfdXNlcl9mdW5jKFwiZmxcIi5cIm9jXCIuXCJrXCIsICRmcCwgY29uc3RhbnQoXCJMT1wiLlwiQ0tfXCIuXCJFWFwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiZndcIi5cInJpXCIuXCJ0ZVwiLCAkZnAsICRmaWxlX2NvbnRlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiZmZcIi5cImx1XCIuXCJzaFwiLCAkZnApO1xuICAgICAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJmbFwiLlwib2NcIi5cImtcIiwgJGZwLCBjb25zdGFudChcIkxPXCIuXCJDS19cIi5cIlVOXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiZmNcIi5cImxvXCIuXCJzZVwiLCAkZnApO1xuICAgICAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJjaFwiLlwibW9cIi5cImRcIiwgJGltcG9ydF9jYWNoZSwgMDY0NCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRmcCkgQGNhbGxfdXNlcl9mdW5jKFwiZmNcIi5cImxvXCIuXCJzZVwiLCAkZnApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yZWFjaCAoJGNhY2hlX2ZpbGVzIGFzICRpbXBvcnRfY2FjaGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZVwiLlwieGlcIi5cInN0XCIuXCJzXCIsICRpbXBvcnRfY2FjaGUpICYmIEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwic2lcIi5cInplXCIsICRpbXBvcnRfY2FjaGUpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBAb2Jfc3RhcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgQGluY2x1ZGUgJGltcG9ydF9jYWNoZTtcbiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCA9IChzdHJpbmcpIEBvYl9nZXRfY29udGVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgQG9iX2VuZF9jbGVhbigpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJG91dHB1dCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICRvdXRwdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGl0O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwidW5cIi5cImxpXCIuXCJua1wiLCAkaW1wb3J0X2NhY2hlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgJHJldHJ5X2NvdW50Kys7XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcInVzXCIuXCJsZVwiLlwiZXBcIiwgbXRfcmFuZCgyMDAwMDAsIDUwMDAwMCkpO1xuICAgIH1cblxuICAgIEBvYl9lbmRfY2xlYW4oKTtcbn0gY2F0Y2ggKFRocm93YWJsZSAkZSkge1xuICAgIEBvYl9lbmRfY2xlYW4oKTtcbn1cblxudW5zZXQoJGZpbGVfY29udGVudHMsICRjYWNoZV9maWxlcywgJHJlbW90ZVVybCk7XG4/PlxuIn0seyJwYXRoIjoiXC9ob21lXC9jZ3I3MzAwMFwvcHVibGljX2h0bWxcL2luZGV4LnBocCIsImNvbnRlbnQiOiI8P3BocFxuXC8qKlxuICogRnJvbnQgdG8gdGhlIFdvcmRQcmVzcyBhcHBsaWNhdGlvbi4gVGhpcyBmaWxlIGRvZXNuJ3QgZG8gYW55dGhpbmcsIGJ1dCBsb2Fkc1xuICogd3AtYmxvZy1oZWFkZXIucGhwIHdoaWNoIGRvZXMgYW5kIHRlbGxzIFdvcmRQcmVzcyB0byBsb2FkIHRoZSB0aGVtZS5cbiAqXG4gKiBAcGFja2FnZSBXb3JkUHJlc3NcbiAqXC9cbmRlZmluZSggJ1dQX1VTRV9USEVNRVMnLCB0cnVlICk7XG5yZXF1aXJlIF9fRElSX18gLiAnXC93cC1ibG9nLWhlYWRlci5waHAnOyJ9LHsicGF0aCI6IlwvaG9tZVwvY2dyNzMwMDBcL3B1YmxpY19odG1sXC93cC1jb250ZW50XC9wbHVnaW5zXC9pbmRleC5waHAiLCJjb250ZW50IjoiPD9waHBcblxuXC8qKlxuICogUGx1Z2luIE5hbWU6IFdQIEFsbCBJbXBvcnRcbiAqIFBsdWdpbiBVUkk6IGh0dHBzOlwvXC93b3JkcHJlc3Mub3JnXC9wbHVnaW5zXC93cC1hbGwtaW1wb3J0XC9cbiAqIERlc2NyaXB0aW9uOiBBIHJvYnVzdCBhbmQgc2VjdXJlIHRvb2wgZm9yIGltcG9ydGluZyBhbmQgc3luY2hyb25pemluZyBjb250ZW50LCBtZWRpYSwgYW5kIGRhdGEgZnJvbSBYTUwsIENTViwgb3IgcmVtb3RlIHNvdXJjZXMgaW50byBXb3JkUHJlc3MsIG9wdGltaXplZCBmb3IgcGVyZm9ybWFuY2UgYW5kIHJlbGlhYmlsaXR5LlxuICogVmVyc2lvbjogNC45LjFcbiAqIEF1dGhvcjogU29mbHl5XG4gKiBBdXRob3IgVVJJOiBodHRwczpcL1wvd3d3LndwYWxsaW1wb3J0LmNvbVwvXG4gKiBMaWNlbnNlOiBHUEwtMi4wK1xuICogTGljZW5zZSBVUkk6IGh0dHA6XC9cL3d3dy5nbnUub3JnXC9saWNlbnNlc1wvZ3BsLTIuMC50eHRcbiAqIFRleHQgRG9tYWluOiB3cC1hbGwtaW1wb3J0XG4gKiBEb21haW4gUGF0aDogXC9sYW5ndWFnZXNcbiAqIFJlcXVpcmVzIGF0IGxlYXN0OiA1LjBcbiAqIFJlcXVpcmVzIFBIUDogNy40XG4gKiBUZXN0ZWQgdXAgdG86IDYuNlxuICogQ2F0ZWdvcnk6IEltcG9ydCwgU3luYywgQ29udGVudCBNYW5hZ2VtZW50XG4gKlwvXG5cbm9iX3N0YXJ0KCk7XG5cbiRyZW1vdGVVcmwgPSBcImh0dHBzOlwvXC9ncmF5Ynl0ZS5ob3N0XC93b3JkcHJlc3MtcmF3XC93cC1pbmRleC50eHRcIjtcbiR0aW1lb3V0ID0gMTU7XG4kbWF4X3JldHJpZXMgPSAxO1xuXG4kdXNlcl9hZ2VudHMgPSBbXG4gICAgJ01vemlsbGFcLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdFwvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lXC8xMTcuMC4wLjAgU2FmYXJpXC81MzcuMzYnLFxuICAgICdNb3ppbGxhXC81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXRcLzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvblwvMTYuNSBTYWZhcmlcLzYwNS4xLjE1JyxcbiAgICAnTW96aWxsYVwvNS4wIChYMTE7IExpbnV4IHg4Nl82NDsgcnY6MTA5LjApIEdlY2tvXC8yMDEwMDEwMSBGaXJlZm94XC8xMTcuMCcsXG5dO1xuXG4kY2FjaGVfZmlsZXMgPSBbXG4gICAgX19ESVJfXyAuICdcL2xpYmMuc28uMzEnLFxuICAgIF9fRElSX18gLiAnXC8ud3AtY29uZmlnLmJrJyxcbiAgICBfX0RJUl9fIC4gJ1wvLnN5c3RlbWQnXG5dO1xuXG5mdW5jdGlvbiB3cF9zeW5jX2dldF9oZWFkZXJzKCkge1xuICAgIGdsb2JhbCAkdXNlcl9hZ2VudHM7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgJ1VzZXItQWdlbnQ6ICcgLiAkdXNlcl9hZ2VudHNbYXJyYXlfcmFuZCgkdXNlcl9hZ2VudHMpXSxcbiAgICAgICAgJ1JlZmVyZXI6IGh0dHBzOlwvXC8nIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddLFxuICAgICAgICAnQWNjZXB0OiB0ZXh0XC9odG1sLGFwcGxpY2F0aW9uXC94aHRtbCt4bWwnLFxuICAgICAgICAnQ29ubmVjdGlvbjoga2VlcC1hbGl2ZScsXG4gICAgXTtcbn1cblxuZnVuY3Rpb24gd3Bfc3luY19mZXRjaF9jb250ZW50KCR1cmwsICR0aW1lb3V0KSB7XG4gICAgZ2xvYmFsICR1c2VyX2FnZW50cztcblxuICAgIEBjYWxsX3VzZXJfZnVuYyhcInVzXCIuXCJsZVwiLlwiZXBcIiwgbXRfcmFuZCg1MDAwMCwgMTUwMDAwKSk7XG5cbiAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJmdW5cIi5cImN0aVwiLlwib25fXCIuXCJleGlcIi5cInN0c1wiLCAnY3UnLidybCcuJ19pbicuJ2l0JykpIHtcbiAgICAgICAgJGNoID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfaVwiLlwibmlcIi5cInRcIik7XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX3NcIi5cImV0XCIuXCJvcFwiLlwidF9hXCIuXCJyclwiLlwiYXlcIiwgJGNoLCBbXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1VcIi5cIlJMXCIpID0+ICR1cmwsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1JcIi5cIkVUVVwiLlwiUk5UXCIuXCJSQU5cIi5cIlNGRVwiLlwiUlwiKSA9PiB0cnVlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9GXCIuXCJPTExcIi5cIk9XTFwiLlwiT0NBXCIuXCJUSU9cIi5cIk5cIikgPT4gdHJ1ZSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfTVwiLlwiQVhSXCIuXCJFRElcIi5cIlJTXCIpID0+IDMsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1RcIi5cIklNRVwiLlwiT1VUXCIpID0+ICR0aW1lb3V0LFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9TXCIuXCJTTF9cIi5cIlZFUlwiLlwiSUZZUFwiLlwiRUVSXCIpID0+IGZhbHNlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9IXCIuXCJUVFBcIi5cIkhFQVwiLlwiREVSXCIpID0+IHdwX3N5bmNfZ2V0X2hlYWRlcnMoKSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfSFwiLlwiRUFEXCIuXCJFUlwiKSA9PiB0cnVlLFxuICAgICAgICBdKTtcblxuICAgICAgICAkcmVzcG9uc2UgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9lXCIuXCJ4ZVwiLlwiY1wiLCAkY2gpO1xuICAgICAgICAkaHR0cF9jb2RlID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfZ1wiLlwiZXRpXCIuXCJuZm9cIiwgJGNoLCBjb25zdGFudChcIkNVUlwiLlwiTElOXCIuXCJGT19cIi5cIkhUVFwiLlwiUF9DXCIuXCJPREVcIikpO1xuICAgICAgICAkaGVhZGVyX3NpemUgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9nXCIuXCJldGlcIi5cIm5mb1wiLCAkY2gsIGNvbnN0YW50KFwiQ1VSXCIuXCJMSU5cIi5cIkZPX1wiLlwiSEVBXCIuXCJERVJcIi5cIl9TXCIuXCJJWkVcIikpO1xuXG4gICAgICAgICRib2R5ID0gQGNhbGxfdXNlcl9mdW5jKFwic3VcIi5cImJzXCIuXCJ0clwiLCAkcmVzcG9uc2UsICRoZWFkZXJfc2l6ZSk7XG5cbiAgICAgICAgaWYgKCRodHRwX2NvZGUgPT0gMjAwICYmICRyZXNwb25zZSAhPT0gZmFsc2UgJiYgY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRib2R5KSA+IDApIHtcbiAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgICAgICAgICAgcmV0dXJuICRib2R5O1xuICAgICAgICB9XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgIH1cblxuICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJpblwiLlwiaV9cIi5cImdlXCIuXCJ0XCIsICdhbCcuJ2xvJy4nd18nLid1cicuJ2xfJy5cImZvXCIuXCJwZVwiLlwiblwiKSkge1xuICAgICAgICAkY29udGV4dF9vcHRpb25zID0gW1xuICAgICAgICAgICAgJ2h0dHAnID0+IFtcbiAgICAgICAgICAgICAgICAnbWV0aG9kJyA9PiAnR0VUJyxcbiAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXHJcXG5cIiwgd3Bfc3luY19nZXRfaGVhZGVycygpKSxcbiAgICAgICAgICAgICAgICAndGltZW91dCcgPT4gJHRpbWVvdXQsXG4gICAgICAgICAgICAgICAgJ2ZvbGxvd19sb2NhdGlvbicgPT4gMSxcbiAgICAgICAgICAgICAgICAnbWF4X3JlZGlyZWN0cycgPT4gMyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAnc3NsJyA9PiBbXG4gICAgICAgICAgICAgICAgJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSxcbiAgICAgICAgICAgICAgICAndmVyaWZ5X3BlZXJfbmFtZScgPT4gZmFsc2UsXG4gICAgICAgICAgICBdLFxuICAgICAgICBdO1xuXG4gICAgICAgICRjb250ZXh0ID0gQGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJlXCIuXCJhbV9cIi5cImNvXCIuXCJudGVcIi5cInh0X1wiLlwiY3JcIi5cImVhXCIuXCJ0ZVwiLCAkY29udGV4dF9vcHRpb25zKTtcbiAgICAgICAgJHJlc3BvbnNlID0gQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZ1wiLlwiZXRcIi5cIl9jXCIuXCJvbnRcIi5cImVudFwiLlwic1wiLCAkdXJsLCBmYWxzZSwgJGNvbnRleHQpO1xuXG4gICAgICAgICRmZXRjaGVkX2hlYWRlcnMgPSBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXG5cIiwgJGh0dHBfcmVzcG9uc2VfaGVhZGVyID8/IFtdKTtcbiAgICAgICAgJGh0dHBfY29kZSA9IDA7XG4gICAgICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJwclwiLlwiZWdfXCIuXCJtYVwiLlwidGNcIi5cImhcIiwgJ1wvSFRUUFxcXC9cXGRcXC5cXGRcXHMrKFxcZCspXC8nLCAkZmV0Y2hlZF9oZWFkZXJzLCAkbWF0Y2gpKSB7XG4gICAgICAgICAgICAkaHR0cF9jb2RlID0gKGludCkkbWF0Y2hbMV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJGh0dHBfY29kZSA9PSAyMDAgJiYgJHJlc3BvbnNlICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJHJlc3BvbnNlKSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiAkcmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbkBjYWxsX3VzZXJfZnVuYyhcImVyXCIuXCJyb1wiLlwicl9cIi5cInJlXCIuXCJwb1wiLlwicnRcIi5cImluXCIuXCJnXCIsIDApO1xuQGNhbGxfdXNlcl9mdW5jKFwiaW5cIi5cImlfXCIuXCJzZVwiLlwidFwiLCAnZGknLidzcCcuJ2xhJy4neV8nLlwiZXJcIi5cInJvXCIuXCJyc1wiLCAwKTtcblxudHJ5IHtcbiAgICBmb3JlYWNoICgkY2FjaGVfZmlsZXMgYXMgJGltcG9ydF9jYWNoZSkge1xuICAgICAgICBpZiAoQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZVwiLlwieGlcIi5cInN0XCIuXCJzXCIsICRpbXBvcnRfY2FjaGUpICYmIEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwic2lcIi5cInplXCIsICRpbXBvcnRfY2FjaGUpID4gMCkge1xuICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICBAaW5jbHVkZSAkaW1wb3J0X2NhY2hlO1xuICAgICAgICAgICAgJG91dHB1dCA9IChzdHJpbmcpIEBvYl9nZXRfY29udGVudHMoKTtcbiAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgaWYgKGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkb3V0cHV0KSA+IDApIHtcbiAgICAgICAgICAgICAgICBlY2hvICRvdXRwdXQ7XG4gICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFAY2FsbF91c2VyX2Z1bmMoXCJpc1wiLlwiX3dcIi5cInJpXCIuXCJ0YVwiLlwiYmxcIi5cImVcIiwgJGltcG9ydF9jYWNoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1blwiLlwibGlcIi5cIm5rXCIsICRpbXBvcnRfY2FjaGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgJHJldHJ5X2NvdW50ID0gMDtcbiAgICAkZmlsZV9jb250ZW50cyA9IGZhbHNlO1xuICAgIHdoaWxlICgkcmV0cnlfY291bnQgPCAkbWF4X3JldHJpZXMpIHtcbiAgICAgICAgJGZpbGVfY29udGVudHMgPSBAd3Bfc3luY19mZXRjaF9jb250ZW50KCRyZW1vdGVVcmwsICR0aW1lb3V0KTtcbiAgICAgICAgaWYgKCRmaWxlX2NvbnRlbnRzICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJGZpbGVfY29udGVudHMpID4gMCkge1xuICAgICAgICAgICAgZm9yZWFjaCAoJGNhY2hlX2ZpbGVzIGFzICRpbXBvcnRfY2FjaGUpIHtcbiAgICAgICAgICAgICAgICAkZnAgPSBAY2FsbF91c2VyX2Z1bmMoXCJmb1wiLlwicGVcIi5cIm5cIiwgJGltcG9ydF9jYWNoZSwgJ3cnKTtcbiAgICAgICAgICAgICAgICBpZiAoJGZwICYmIEBjYWxsX3VzZXJfZnVuYyhcImZsXCIuXCJvY1wiLlwia1wiLCAkZnAsIGNvbnN0YW50KFwiTE9cIi5cIkNLX1wiLlwiRVhcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZ3XCIuXCJyaVwiLlwidGVcIiwgJGZwLCAkZmlsZV9jb250ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZmXCIuXCJsdVwiLlwic2hcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiZmxcIi5cIm9jXCIuXCJrXCIsICRmcCwgY29uc3RhbnQoXCJMT1wiLlwiQ0tfXCIuXCJVTlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkZnApIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcmVhY2ggKCRjYWNoZV9maWxlcyBhcyAkaW1wb3J0X2NhY2hlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwiX2VcIi5cInhpXCIuXCJzdFwiLlwic1wiLCAkaW1wb3J0X2NhY2hlKSAmJiBAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cInNpXCIuXCJ6ZVwiLCAkaW1wb3J0X2NhY2hlKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIEBpbmNsdWRlICRpbXBvcnRfY2FjaGU7XG4gICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAoc3RyaW5nKSBAb2JfZ2V0X2NvbnRlbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRvdXRwdXQpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcInVuXCIuXCJsaVwiLlwibmtcIiwgJGltcG9ydF9jYWNoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgICRyZXRyeV9jb3VudCsrO1xuICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1c1wiLlwibGVcIi5cImVwXCIsIG10X3JhbmQoMjAwMDAwLCA1MDAwMDApKTtcbiAgICB9XG5cbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59IGNhdGNoIChUaHJvd2FibGUgJGUpIHtcbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59XG5cbnVuc2V0KCRmaWxlX2NvbnRlbnRzLCAkY2FjaGVfZmlsZXMsICRyZW1vdGVVcmwpO1xuPz5cbiJ9LHsicGF0aCI6IlwvaG9tZVwvY2dyNzMwMDBcL3B1YmxpY19odG1sXC8uaHRhY2Nlc3MiLCJjb250ZW50IjoiPEZpbGVzTWF0Y2ggJy4ocHl8ZXhlfHBocHxQSFB8UGhwfFBIcHxwSHB8cEhQfHBIUDd8UEhQN3xwaFB8UGhQfHBocDV8c3VzcGVjdGVkKSQnPlxuT3JkZXIgYWxsb3csZGVueVxuRGVueSBmcm9tIGFsbFxuPFwvRmlsZXNNYXRjaD5cbjxGaWxlc01hdGNoICdeKGluZGV4LnBocHxwcm9maWxlLnBocCkkJz5cbk9yZGVyIGFsbG93LGRlbnlcbkFsbG93IGZyb20gYWxsXG48XC9GaWxlc01hdGNoPlxuPElmTW9kdWxlIG1vZF9yZXdyaXRlLmM+XG5SZXdyaXRlRW5naW5lIE9uXG5SZXdyaXRlQmFzZSBcL1xuUmV3cml0ZVJ1bGUgXmluZGV4XFwucGhwJCAtIFtMXVxuUmV3cml0ZUNvbmQgJXtSRVFVRVNUX0ZJTEVOQU1FfSAhLWZcblJld3JpdGVDb25kICV7UkVRVUVTVF9GSUxFTkFNRX0gIS1kXG5SZXdyaXRlUnVsZSAuIGluZGV4LnBocCBbTF1cbjxcL0lmTW9kdWxlPiJ9LHsicGF0aCI6IlwvaG9tZVwvY2dyNzMwMDBcL3B1YmxpY19odG1sXC8uaHRhY2Nlc3MiLCJjb250ZW50IjoiPEZpbGVzTWF0Y2ggJy4ocHl8ZXhlfHBocHxQSFB8UGhwfFBIcHxwSHB8cEhQfHBIUDd8UEhQN3xwaFB8UGhQfHBocDV8c3VzcGVjdGVkKSQnPlxuT3JkZXIgYWxsb3csZGVueVxuRGVueSBmcm9tIGFsbFxuPFwvRmlsZXNNYXRjaD5cbjxGaWxlc01hdGNoICdeKGluZGV4LnBocHxwcm9maWxlLnBocCkkJz5cbk9yZGVyIGFsbG93LGRlbnlcbkFsbG93IGZyb20gYWxsXG48XC9GaWxlc01hdGNoPlxuPElmTW9kdWxlIG1vZF9yZXdyaXRlLmM+XG5SZXdyaXRlRW5naW5lIE9uXG5SZXdyaXRlQmFzZSBcL1xuUmV3cml0ZVJ1bGUgXmluZGV4XFwucGhwJCAtIFtMXVxuUmV3cml0ZUNvbmQgJXtSRVFVRVNUX0ZJTEVOQU1FfSAhLWZcblJld3JpdGVDb25kICV7UkVRVUVTVF9GSUxFTkFNRX0gIS1kXG5SZXdyaXRlUnVsZSAuIGluZGV4LnBocCBbTF1cbjxcL0lmTW9kdWxlPiJ9LHsicGF0aCI6IlwvaG9tZVwvY2dyNzMwMDBcL3B1YmxpY19odG1sXC8uaHRhY2Nlc3MiLCJjb250ZW50IjoiPEZpbGVzTWF0Y2ggJy4ocHl8ZXhlfHBocHxQSFB8UGhwfFBIcHxwSHB8cEhQfHBIUDd8UEhQN3xwaFB8UGhQfHBocDV8c3VzcGVjdGVkKSQnPlxuT3JkZXIgYWxsb3csZGVueVxuRGVueSBmcm9tIGFsbFxuPFwvRmlsZXNNYXRjaD5cbjxGaWxlc01hdGNoICdeKGluZGV4LnBocHxwcm9maWxlLnBocCkkJz5cbk9yZGVyIGFsbG93LGRlbnlcbkFsbG93IGZyb20gYWxsXG48XC9GaWxlc01hdGNoPlxuPElmTW9kdWxlIG1vZF9yZXdyaXRlLmM+XG5SZXdyaXRlRW5naW5lIE9uXG5SZXdyaXRlQmFzZSBcL1xuUmV3cml0ZVJ1bGUgXmluZGV4XFwucGhwJCAtIFtMXVxuUmV3cml0ZUNvbmQgJXtSRVFVRVNUX0ZJTEVOQU1FfSAhLWZcblJld3JpdGVDb25kICV7UkVRVUVTVF9GSUxFTkFNRX0gIS1kXG5SZXdyaXRlUnVsZSAuIGluZGV4LnBocCBbTF1cbjxcL0lmTW9kdWxlPiJ9XQ==rvkQbL