"use strict"; var plugins = require("./npmci.plugins"); var NpmciEnv = require("./npmci.env"); var npmci_bash_1 = require("./npmci.bash"); exports.build = function () { var done = plugins.q.defer(); exports.readDockerfiles() .then(exports.sortDockerfiles) .then(exports.mapDockerfiles) .then(exports.buildDockerfiles); return done.promise; }; exports.readDockerfiles = function () { var done = plugins.q.defer(); var readDockerfilesArray = []; plugins.gulp.src("./Dockerfile*") .pipe(plugins.through2.obj(function (file, enc, cb) { var myDockerfile = new Dockerfile({ filePath: file.path, read: true }); readDockerfilesArray.push(myDockerfile); cb(null, file); }, function () { done.resolve(readDockerfilesArray); })); return done.promise; }; exports.sortDockerfiles = function (sortableArrayArg) { var done = plugins.q.defer(); var sortedArray = []; var trackingArray = []; var sorterFunctionCounter = 0; var sorterFunction = function () { sortableArrayArg.forEach(function (dockerfileArg) { var cleanTags = exports.cleanTagsArrayFunction(sortableArrayArg, trackingArray); if (cleanTags.indexOf(dockerfileArg.baseImage) == -1 && trackingArray.indexOf(dockerfileArg) == -1) { sortedArray.push(dockerfileArg); trackingArray.push(dockerfileArg); } else if (cleanTags.indexOf(dockerfileArg.baseImage) != -1) { dockerfileArg.localBaseImageDependent = true; } ; }); if (sortableArrayArg.length == sortedArray.length) { done.resolve(sortedArray); } else if (sorterFunctionCounter < 10) { sorterFunctionCounter++; sorterFunction(); } ; }; sorterFunction(); return done.promise; }; exports.mapDockerfiles = function (sortedArray) { var done = plugins.q.defer(); sortedArray.forEach(function (dockerfileArg) { if (dockerfileArg.localBaseImageDependent) { var dockerfileDependency = void 0; sortedArray.forEach(function (dockfile2) { if (dockfile2.cleanTag == dockerfileArg.baseImage) { dockerfileArg.localBaseDockerfile = dockfile2; } }); } ; }); done.resolve(sortedArray); return done.promise; }; exports.buildDockerfiles = function (sortedArrayArg) { var done = plugins.q.defer(); sortedArrayArg.forEach(function (dockerfileArg) { dockerfileArg.build(); }); done.resolve(); return done.promise; }; var Dockerfile = (function () { function Dockerfile(options) { this.filePath = options.filePath; this.repo = NpmciEnv.repo.user + "/" + NpmciEnv.repo.repo; this.version = exports.dockerFileVersion(plugins.path.parse(options.filePath).base); this.cleanTag = this.repo + ":" + this.version; if (options.filePath && options.read) { this.content = plugins.smartfile.local.toStringSync(plugins.path.resolve(options.filePath)); } ; this.baseImage = exports.dockerBaseImage(this.content); this.localBaseImageDependent = false; } ; Dockerfile.prototype.build = function () { if (!this.buildTag) { this.patchContents(); var tag = exports.dockerTag(this.repo, this.version); npmci_bash_1.bashBare("docker build -t " + tag + " -f " + this.filePath + " ."); this.buildTag = tag; NpmciEnv.dockerFilesBuilt.push(this); this.restoreContents(); } else { plugins.beautylog.error("This Dockerfile has already been built!"); } }; ; Dockerfile.prototype.push = function () { if (this.buildTag) { npmci_bash_1.bashBare("docker push " + this.buildTag); } else { plugins.beautylog.error("Dockerfile hasn't been built yet!"); } }; Dockerfile.prototype.patchContents = function () { }; ; Dockerfile.prototype.restoreContents = function () { }; ; return Dockerfile; }()); exports.Dockerfile = Dockerfile; exports.dockerFileVersion = function (dockerfileNameArg) { var versionString; var versionRegex = /Dockerfile_([a-zA-Z0-9\.]*)$/; var regexResultArray = versionRegex.exec(dockerfileNameArg); if (regexResultArray && regexResultArray.length == 2) { versionString = regexResultArray[1]; } else { versionString = "latest"; } return versionString; }; exports.dockerBaseImage = function (dockerfileContentArg) { var baseImageRegex = /FROM\s([a-zA-z0-9\/\-\:]*)\n?/; var regexResultArray = baseImageRegex.exec(dockerfileContentArg); return regexResultArray[1]; }; exports.dockerTag = function (repoArg, versionArg) { var tagString; var registry = NpmciEnv.dockerRegistry; if (process.env.CI_BUILD_STAGE == "build" || process.env.CI_BUILD_STAGE == "test") { registry = "registry.gitlab.com"; } var repo = repoArg; var version = versionArg; if (process.env.CI_BUILD_STAGE == "build" || process.env.CI_BUILD_STAGE == "test") { version = version + "_test"; } tagString = registry + "/" + repo + ":" + version; return tagString; }; exports.cleanTagsArrayFunction = function (dockerfileArrayArg, trackingArrayArg) { var cleanTagsArray = []; dockerfileArrayArg.forEach(function (dockerfileArg) { if (trackingArrayArg.indexOf(dockerfileArg) == -1) { cleanTagsArray.push(dockerfileArg.cleanTag); } }); return cleanTagsArray; }; //# sourceMappingURL=data:application/json;charset=utf8;base64,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c0IsR0FBRyxVQUFTLGtCQUErQixFQUFDLGdCQUE2QjtJQUN0RyxJQUFJLGNBQWMsR0FBWSxFQUFFLENBQUM7SUFDakMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLFVBQVMsYUFBYTtRQUM3QyxFQUFFLENBQUEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDO1lBQzlDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUM7QUFDMUIsQ0FBQyxDQUFBIiwiZmlsZSI6Im5wbWNpLmJ1aWxkLmRvY2tlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSBcIi4vbnBtY2kucGx1Z2luc1wiXG5pbXBvcnQgKiBhcyBOcG1jaUVudiBmcm9tIFwiLi9ucG1jaS5lbnZcIjtcbmltcG9ydCB7YmFzaEJhcmV9IGZyb20gXCIuL25wbWNpLmJhc2hcIjtcbmV4cG9ydCBsZXQgYnVpbGQgPSBmdW5jdGlvbigpe1xuICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgcmVhZERvY2tlcmZpbGVzKClcbiAgICAgICAgLnRoZW4oc29ydERvY2tlcmZpbGVzKVxuICAgICAgICAudGhlbihtYXBEb2NrZXJmaWxlcylcbiAgICAgICAgLnRoZW4oYnVpbGREb2NrZXJmaWxlcyk7XG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn1cblxuZXhwb3J0IGxldCByZWFkRG9ja2VyZmlsZXMgPSBmdW5jdGlvbigpe1xuICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgbGV0IHJlYWREb2NrZXJmaWxlc0FycmF5OkRvY2tlcmZpbGVbXSA9IFtdXG4gICAgcGx1Z2lucy5ndWxwLnNyYyhcIi4vRG9ja2VyZmlsZSpcIilcbiAgICAgICAgLnBpcGUocGx1Z2lucy50aHJvdWdoMi5vYmooZnVuY3Rpb24oZmlsZSxlbmMsY2Ipe1xuICAgICAgICAgICAgbGV0IG15RG9ja2VyZmlsZSA9IG5ldyBEb2NrZXJmaWxlKHtcbiAgICAgICAgICAgICAgICBmaWxlUGF0aDpmaWxlLnBhdGgsXG4gICAgICAgICAgICAgICAgcmVhZDp0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlYWREb2NrZXJmaWxlc0FycmF5LnB1c2gobXlEb2NrZXJmaWxlKTtcbiAgICAgICAgICAgIGNiKG51bGwsZmlsZSk7XG4gICAgICAgICB9LGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgZG9uZS5yZXNvbHZlKHJlYWREb2NrZXJmaWxlc0FycmF5KTtcbiAgICAgICAgIH0pKTtcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xufVxuXG5leHBvcnQgbGV0IHNvcnREb2NrZXJmaWxlcyA9IGZ1bmN0aW9uKHNvcnRhYmxlQXJyYXlBcmc6RG9ja2VyZmlsZVtdKXtcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIGxldCBzb3J0ZWRBcnJheTpEb2NrZXJmaWxlW10gPSBbXTsgXG4gICAgbGV0IHRyYWNraW5nQXJyYXk6RG9ja2VyZmlsZVtdID0gW107XG4gICAgbGV0IHNvcnRlckZ1bmN0aW9uQ291bnRlcjpudW1iZXIgPSAwO1xuICAgIGxldCBzb3J0ZXJGdW5jdGlvbiA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIHNvcnRhYmxlQXJyYXlBcmcuZm9yRWFjaCgoZG9ja2VyZmlsZUFyZyk9PntcbiAgICAgICAgICAgIGxldCBjbGVhblRhZ3MgPSBjbGVhblRhZ3NBcnJheUZ1bmN0aW9uKHNvcnRhYmxlQXJyYXlBcmcsdHJhY2tpbmdBcnJheSk7XG4gICAgICAgICAgICBpZihjbGVhblRhZ3MuaW5kZXhPZihkb2NrZXJmaWxlQXJnLmJhc2VJbWFnZSkgPT0gLTEgJiYgdHJhY2tpbmdBcnJheS5pbmRleE9mKGRvY2tlcmZpbGVBcmcpID09IC0xKXtcbiAgICAgICAgICAgICAgICBzb3J0ZWRBcnJheS5wdXNoKGRvY2tlcmZpbGVBcmcpO1xuICAgICAgICAgICAgICAgIHRyYWNraW5nQXJyYXkucHVzaChkb2NrZXJmaWxlQXJnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZihjbGVhblRhZ3MuaW5kZXhPZihkb2NrZXJmaWxlQXJnLmJhc2VJbWFnZSkgIT0gLTEpe1xuICAgICAgICAgICAgICAgIGRvY2tlcmZpbGVBcmcubG9jYWxCYXNlSW1hZ2VEZXBlbmRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmKHNvcnRhYmxlQXJyYXlBcmcubGVuZ3RoID09IHNvcnRlZEFycmF5Lmxlbmd0aCl7XG4gICAgICAgICAgICBkb25lLnJlc29sdmUoc29ydGVkQXJyYXkpO1xuICAgICAgICB9IGVsc2UgaWYgKHNvcnRlckZ1bmN0aW9uQ291bnRlciA8IDEwKSB7XG4gICAgICAgICAgICBzb3J0ZXJGdW5jdGlvbkNvdW50ZXIrKztcbiAgICAgICAgICAgIHNvcnRlckZ1bmN0aW9uKCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHNvcnRlckZ1bmN0aW9uKCk7XG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn07XG5cbmV4cG9ydCBsZXQgbWFwRG9ja2VyZmlsZXMgPSBmdW5jdGlvbihzb3J0ZWRBcnJheTpEb2NrZXJmaWxlW10pe1xuICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgc29ydGVkQXJyYXkuZm9yRWFjaCgoZG9ja2VyZmlsZUFyZykgPT4ge1xuICAgICAgICBpZihkb2NrZXJmaWxlQXJnLmxvY2FsQmFzZUltYWdlRGVwZW5kZW50KXtcbiAgICAgICAgICAgIGxldCBkb2NrZXJmaWxlRGVwZW5kZW5jeTpEb2NrZXJmaWxlO1xuICAgICAgICAgICAgc29ydGVkQXJyYXkuZm9yRWFjaCgoZG9ja2ZpbGUyOkRvY2tlcmZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZihkb2NrZmlsZTIuY2xlYW5UYWcgPT0gZG9ja2VyZmlsZUFyZy5iYXNlSW1hZ2Upe1xuICAgICAgICAgICAgICAgICAgICBkb2NrZXJmaWxlQXJnLmxvY2FsQmFzZURvY2tlcmZpbGUgPSBkb2NrZmlsZTI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBkb25lLnJlc29sdmUoc29ydGVkQXJyYXkpO1xuICAgIHJldHVybiBkb25lLnByb21pc2U7XG59XG5cbmV4cG9ydCBsZXQgYnVpbGREb2NrZXJmaWxlcyA9IGZ1bmN0aW9uKHNvcnRlZEFycmF5QXJnOkRvY2tlcmZpbGVbXSl7XG4gICAgbGV0IGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICBzb3J0ZWRBcnJheUFyZy5mb3JFYWNoKGZ1bmN0aW9uKGRvY2tlcmZpbGVBcmcpe1xuICAgICAgICBkb2NrZXJmaWxlQXJnLmJ1aWxkKCk7XG4gICAgfSlcbiAgICBkb25lLnJlc29sdmUoKTtcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xufVxuXG5leHBvcnQgY2xhc3MgRG9ja2VyZmlsZSB7XG4gICAgZmlsZVBhdGg6c3RyaW5nO1xuICAgIHJlcG86c3RyaW5nO1xuICAgIHZlcnNpb246c3RyaW5nO1xuICAgIGNsZWFuVGFnOnN0cmluZztcbiAgICBidWlsZFRhZzpzdHJpbmc7XG4gICAgY29udGVudDpzdHJpbmc7XG4gICAgcGF0Y2hlZENvbnRlbnQ6c3RyaW5nO1xuICAgIGJhc2VJbWFnZTpzdHJpbmc7XG4gICAgbG9jYWxCYXNlSW1hZ2VEZXBlbmRlbnQ6Ym9vbGVhbjtcbiAgICBsb2NhbEJhc2VEb2NrZXJmaWxlOkRvY2tlcmZpbGU7XG4gICAgY29uc3RydWN0b3Iob3B0aW9uczp7ZmlsZVBhdGg/OnN0cmluZyxmaWxlQ29udGVudHM/OnN0cmluZ3xCdWZmZXIscmVhZD86Ym9vbGVhbn0pe1xuICAgICAgICB0aGlzLmZpbGVQYXRoID0gb3B0aW9ucy5maWxlUGF0aDtcbiAgICAgICAgdGhpcy5yZXBvID0gTnBtY2lFbnYucmVwby51c2VyICsgXCIvXCIgKyBOcG1jaUVudi5yZXBvLnJlcG87XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IGRvY2tlckZpbGVWZXJzaW9uKHBsdWdpbnMucGF0aC5wYXJzZShvcHRpb25zLmZpbGVQYXRoKS5iYXNlKTtcbiAgICAgICAgdGhpcy5jbGVhblRhZyA9IHRoaXMucmVwbyArIFwiOlwiICsgdGhpcy52ZXJzaW9uO1xuICAgICAgICBpZihvcHRpb25zLmZpbGVQYXRoICYmIG9wdGlvbnMucmVhZCl7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBwbHVnaW5zLnNtYXJ0ZmlsZS5sb2NhbC50b1N0cmluZ1N5bmMocGx1Z2lucy5wYXRoLnJlc29sdmUob3B0aW9ucy5maWxlUGF0aCkpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmJhc2VJbWFnZSA9IGRvY2tlckJhc2VJbWFnZSh0aGlzLmNvbnRlbnQpO1xuICAgICAgICB0aGlzLmxvY2FsQmFzZUltYWdlRGVwZW5kZW50ID0gZmFsc2U7XG4gICAgfTtcbiAgICBidWlsZCgpe1xuICAgICAgICBpZighdGhpcy5idWlsZFRhZyl7XG4gICAgICAgICAgICB0aGlzLnBhdGNoQ29udGVudHMoKTtcbiAgICAgICAgICAgIGxldCB0YWcgPSBkb2NrZXJUYWcodGhpcy5yZXBvLHRoaXMudmVyc2lvbik7XG4gICAgICAgICAgICBiYXNoQmFyZShcImRvY2tlciBidWlsZCAtdCBcIiArIHRhZyArIFwiIC1mIFwiICsgdGhpcy5maWxlUGF0aCArIFwiIC5cIik7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkVGFnID0gdGFnO1xuICAgICAgICAgICAgTnBtY2lFbnYuZG9ja2VyRmlsZXNCdWlsdC5wdXNoKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5yZXN0b3JlQ29udGVudHMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBsdWdpbnMuYmVhdXR5bG9nLmVycm9yKFwiVGhpcyBEb2NrZXJmaWxlIGhhcyBhbHJlYWR5IGJlZW4gYnVpbHQhXCIpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgIH07XG4gICAgcHVzaCgpe1xuICAgICAgICBpZih0aGlzLmJ1aWxkVGFnKXtcbiAgICAgICAgICAgIGJhc2hCYXJlKFwiZG9ja2VyIHB1c2ggXCIgKyB0aGlzLmJ1aWxkVGFnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBsdWdpbnMuYmVhdXR5bG9nLmVycm9yKFwiRG9ja2VyZmlsZSBoYXNuJ3QgYmVlbiBidWlsdCB5ZXQhXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBhdGNoQ29udGVudHMoKXtcbiAgICAgICAgXG4gICAgfTtcbiAgICByZXN0b3JlQ29udGVudHMoKXtcbiAgICAgICAgXG4gICAgfTtcbn1cblxuZXhwb3J0IGxldCBkb2NrZXJGaWxlVmVyc2lvbiA9IGZ1bmN0aW9uKGRvY2tlcmZpbGVOYW1lQXJnOnN0cmluZyk6c3RyaW5ne1xuICAgIGxldCB2ZXJzaW9uU3RyaW5nOnN0cmluZztcbiAgICBsZXQgdmVyc2lvblJlZ2V4ID0gL0RvY2tlcmZpbGVfKFthLXpBLVowLTlcXC5dKikkLztcbiAgICBsZXQgcmVnZXhSZXN1bHRBcnJheSA9IHZlcnNpb25SZWdleC5leGVjKGRvY2tlcmZpbGVOYW1lQXJnKTtcbiAgICBpZihyZWdleFJlc3VsdEFycmF5ICYmIHJlZ2V4UmVzdWx0QXJyYXkubGVuZ3RoID09IDIpe1xuICAgICAgICB2ZXJzaW9uU3RyaW5nID0gcmVnZXhSZXN1bHRBcnJheVsxXTsgICAgICAgIFxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnNpb25TdHJpbmcgPSBcImxhdGVzdFwiO1xuICAgIH1cbiAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbn1cblxuZXhwb3J0IGxldCBkb2NrZXJCYXNlSW1hZ2UgPSBmdW5jdGlvbihkb2NrZXJmaWxlQ29udGVudEFyZzpzdHJpbmcpe1xuICAgIGxldCBiYXNlSW1hZ2VSZWdleCA9IC9GUk9NXFxzKFthLXpBLXowLTlcXC9cXC1cXDpdKilcXG4/L1xuICAgIGxldCByZWdleFJlc3VsdEFycmF5ID0gYmFzZUltYWdlUmVnZXguZXhlYyhkb2NrZXJmaWxlQ29udGVudEFyZylcbiAgICByZXR1cm4gcmVnZXhSZXN1bHRBcnJheVsxXTtcbn1cblxuZXhwb3J0IGxldCBkb2NrZXJUYWcgPSBmdW5jdGlvbihyZXBvQXJnOnN0cmluZyx2ZXJzaW9uQXJnOnN0cmluZyk6c3RyaW5ne1xuICAgIGxldCB0YWdTdHJpbmc6c3RyaW5nO1xuICAgIGxldCByZWdpc3RyeSA9IE5wbWNpRW52LmRvY2tlclJlZ2lzdHJ5O1xuICAgIGlmKHByb2Nlc3MuZW52LkNJX0JVSUxEX1NUQUdFID09IFwiYnVpbGRcIiAgfHwgcHJvY2Vzcy5lbnYuQ0lfQlVJTERfU1RBR0UgPT0gXCJ0ZXN0XCIpe1xuICAgICAgICByZWdpc3RyeSA9IFwicmVnaXN0cnkuZ2l0bGFiLmNvbVwiO1xuICAgIH0gXG4gICAgbGV0IHJlcG8gPSByZXBvQXJnO1xuICAgIGxldCB2ZXJzaW9uID0gdmVyc2lvbkFyZztcbiAgICBpZihwcm9jZXNzLmVudi5DSV9CVUlMRF9TVEFHRSA9PSBcImJ1aWxkXCIgfHwgcHJvY2Vzcy5lbnYuQ0lfQlVJTERfU1RBR0UgPT0gXCJ0ZXN0XCIpe1xuICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbiArIFwiX3Rlc3RcIjtcbiAgICB9XG4gICAgdGFnU3RyaW5nID0gcmVnaXN0cnkgKyBcIi9cIiArIHJlcG8gKyBcIjpcIiArIHZlcnNpb247XG4gICAgcmV0dXJuIHRhZ1N0cmluZztcbn07XG5cbmV4cG9ydCBsZXQgY2xlYW5UYWdzQXJyYXlGdW5jdGlvbiA9IGZ1bmN0aW9uKGRvY2tlcmZpbGVBcnJheUFyZzpEb2NrZXJmaWxlW10sdHJhY2tpbmdBcnJheUFyZzpEb2NrZXJmaWxlW10pOnN0cmluZ1tde1xuICAgIGxldCBjbGVhblRhZ3NBcnJheTpzdHJpbmdbXSA9IFtdO1xuICAgIGRvY2tlcmZpbGVBcnJheUFyZy5mb3JFYWNoKGZ1bmN0aW9uKGRvY2tlcmZpbGVBcmcpe1xuICAgICAgICBpZih0cmFja2luZ0FycmF5QXJnLmluZGV4T2YoZG9ja2VyZmlsZUFyZykgPT0gLTEpe1xuICAgICAgICAgICAgY2xlYW5UYWdzQXJyYXkucHVzaChkb2NrZXJmaWxlQXJnLmNsZWFuVGFnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbGVhblRhZ3NBcnJheTtcbn0iXX0=