UNPKG

christine

Version:

Syntactic sugar for HTML/CSS + CoffeeScript

617 lines (565 loc) 60.8 kB
(function() { var Path, analiseType, checkSelfClosing, chrisRootFolder, cleanUpFile, cleanUpLines, coffee, commentFilter, countSpaces, debugMode, emptyFilter, formatHtml, formatProperty, formatString, formatStyleProperty, formatTag, formatVariable, fs, getHierarchy, headTagFilter, headTagType, headTags, ignorableType, loadChrisModule, moduleFilter, moduleType, processHead, processModules, processStyleTag, processTag, processVariables, scriptType, selfClosingTags, shtml, stringFilter, stringType, styleClassFilter, styleClassType, stylePropertyFilter, stylePropertyType, tagFilter, tagPropertyFilter, tagPropertyType, tagType, variableFilter, variableType; selfClosingTags = ['br', 'img', 'input', 'hr', 'meta', 'link']; headTags = ['meta', 'title', 'style', 'class', 'link']; formatHtml = false; debugMode = false; chrisRootFolder = ''; fs = require('fs'); Path = require('path'); coffee = require('coffee-script'); // LINE TYPES tagType = 0; //if no another type found and this is not a script tagFilter = /^\s*[\w\-]+ *(( +\w+)?( *)?( +is( +.*)?)?)?$/i; tagPropertyType = 1; //if found property "something" tagPropertyFilter = /^\s*[\w\-]+ *".*"/; styleClassType = 2; //if this is tag and the tag is style styleClassFilter = /^\s*(style|class)\s+[\w:_-]+/i; stylePropertyType = 3; //if found property: something stylePropertyFilter = /^\s*[^"' ]+ *: *.*/i; stringType = 4; //if found "string" stringFilter = /^\s*".*"/i; scriptType = 5; //if it is under the script tag variableType = 6; // if found name = something variableFilter = /^\s*\w+\s*=\s*[\w\W]+/i; headTagType = 7; headTagFilter = /^\s*(meta|title|link|base)/i; moduleType = 8; moduleFilter = /^\s*include\s*".+.chris"/i; ignorableType = -2; emptyFilter = /^[\W\s_]*$/; commentFilter = /^\s*#/i; countSpaces = function(l) { var x; x = 0; if (l[0] === " ") { while (l[x] === " ") { x += 1; } } return x; }; analiseType = function(l) { var ln; ln = -1; if (commentFilter.test(l)) { ln = ignorableType; } if (emptyFilter.test(l)) { ln = ignorableType; } if (stylePropertyFilter.test(l)) { ln = stylePropertyType; } if (tagFilter.test(l)) { ln = tagType; } if (headTagFilter.test(l)) { ln = headTagType; } if (styleClassFilter.test(l)) { ln = styleClassType; } if (tagPropertyFilter.test(l)) { ln = tagPropertyType; } if (stringFilter.test(l)) { ln = stringType; } if (variableFilter.test(l)) { ln = variableType; } if (moduleFilter.test(l)) { ln = moduleType; } return ln; }; getHierarchy = function(lines) { var currentLevel, currentRealLevel, j, lastLineOfLevel, lineLevels, lineParents, n, ref, x; lineLevels = []; lineParents = []; lastLineOfLevel = [-1]; currentLevel = [0]; currentRealLevel = 0; for (x = j = 0, ref = lines.length; (0 <= ref ? j < ref : j > ref); x = 0 <= ref ? ++j : --j) { n = countSpaces(lines[x]); //lines[x] = lines[x].slice(n) if (n > currentLevel[currentRealLevel]) { lastLineOfLevel.push(x - 1); currentLevel.push(n); currentRealLevel += 1; } while (n < currentLevel[currentRealLevel]) { if (n < currentLevel[currentRealLevel]) { currentLevel.pop(); lastLineOfLevel.pop(); currentRealLevel -= 1; } } lineLevels.push(currentRealLevel); lineParents[x] = lastLineOfLevel[lastLineOfLevel.length - 1]; } return lineParents; }; formatVariable = function(l) { var c, exportArray, varContent, varName, w; exportArray = []; varContent = ''; varName = l.split('=')[0]; w = 0; while (varName.split(' ')[w] === '') { w += 1; } varName = varName.split(' ')[w]; c = l.split('='); c = c[1].split(' '); w = 0; while (w < c.length) { if (c[w] !== '') { if (varContent !== '') { varContent += ' '; } varContent += c[w]; } w += 1; } exportArray[0] = varName; exportArray[1] = varContent; return exportArray; }; processVariables = function(ls, tps) { var f, j, k, ref, ref1, varContents, varNames, x; varNames = []; varContents = []; for (x = j = 0, ref = ls.length; (0 <= ref ? j < ref : j > ref); x = 0 <= ref ? ++j : --j) { if (tps[x] === variableType) { varNames.push(formatVariable(ls[x])[0]); varContents.push(formatVariable(ls[x])[1]); } if (tps[x] === stylePropertyType) { for (f = k = 0, ref1 = varNames.length; (0 <= ref1 ? k < ref1 : k > ref1); f = 0 <= ref1 ? ++k : --k) { ls[x] = ls[x].replace(varNames[f], varContents[f]).replace(varNames[f], varContents[f]).replace(varNames[f], varContents[f]).replace(varNames[f], varContents[f]); } } } return ls; }; // Module processing functions loadChrisModule = function(moduleFilePath) { var mls, msls; msls = fs.readFileSync(moduleFilePath, 'utf8'); msls = cleanUpFile(msls); mls = msls.split('\n'); return mls; }; processModules = function(ls, f) { var chrisModulePath, j, k, l, moduleLevel, moduleLevelFilter, moduleLines, ref, ref1, resultLs, x; resultLs = []; moduleLevelFilter = /^\s*/; for (x = j = 0, ref = ls.length; (0 <= ref ? j < ref : j > ref); x = 0 <= ref ? ++j : --j) { if (moduleFilter.test(ls[x])) { chrisModulePath = ls[x].split('"')[1]; moduleLines = loadChrisModule(f + '/' + chrisModulePath); moduleLevel = moduleLevelFilter.exec(ls[x]); for (l = k = 0, ref1 = moduleLines.length; (0 <= ref1 ? k < ref1 : k > ref1); l = 0 <= ref1 ? ++k : --k) { moduleLines[l] = moduleLevel + moduleLines[l]; } moduleLines = processModules(moduleLines, Path.dirname(f + '/' + chrisModulePath)); resultLs = resultLs.concat(moduleLines); } else { resultLs.push(ls[x]); } } return resultLs; }; // MAIN CHRISTINE FUNCTION exports.christinize = function(st) { return shtml(st); }; cleanUpLines = function(ls) { var j, newLs, ref, x; newLs = []; for (x = j = 0, ref = ls.length; (0 <= ref ? j < ref : j > ref); x = 0 <= ref ? ++j : --j) { if (analiseType(ls[x]) !== -2) { newLs.push(ls[x]); } } return newLs; }; shtml = function(sourceText) { var j, k, lineNums, lineParents, lineTypes, lines, m, ref, ref1, ref2, resultLines, resultText, t, x; lines = []; resultLines = []; lineTypes = []; lineParents = []; lineNums = []; resultText = ''; lines = sourceText.split('\n'); lines = processModules(lines, chrisRootFolder); lines = cleanUpLines(lines, lineTypes); // process types and filter lines for (x = j = 0, ref = lines.length; (0 <= ref ? j < ref : j > ref); x = 0 <= ref ? ++j : --j) { t = analiseType(lines[x]); lineTypes.push(t); resultLines.push(lines[x]); } resultLines = processVariables(resultLines, lineTypes); lineParents = getHierarchy(resultLines); for (x = k = 0, ref1 = resultLines.length; (0 <= ref1 ? k < ref1 : k > ref1); x = 0 <= ref1 ? ++k : --k) { lineNums.push(x); } if (debugMode) { for (x = m = 0, ref2 = resultLines.length; (0 <= ref2 ? m < ref2 : m > ref2); x = 0 <= ref2 ? ++m : --m) { resultText += `#${lineNums[x]} ${lineTypes[x]} ${resultLines[x]} - ${lineParents[x]}\n`; } } resultText += '<!doctype html>'; resultText += '<html>'; resultText += processHead(resultLines, lineParents, lineTypes, lineNums); resultText += processTag("body", -1, resultLines, lineParents, lineTypes, lineNums); resultText += '</html>'; return resultText; }; formatTag = function(l) { var cleanTag, collectClasses, finalTag, j, ref, sp, tagArray, tagClass, x; // get rid of indentation sp = countSpaces(l); l = l.slice(sp); tagArray = l.split(' '); cleanTag = []; for (x = j = 0, ref = tagArray.length; (0 <= ref ? j < ref : j > ref); x = 0 <= ref ? ++j : --j) { if (tagArray[x] !== "") { cleanTag.push(tagArray[x]); } } finalTag = '<' + cleanTag[0]; if (cleanTag.length > 1) { if (cleanTag[1] !== 'is') { finalTag += ' id="' + cleanTag[1] + '"'; } x = 0; tagClass = ""; collectClasses = false; while (x < cleanTag.length) { if (collectClasses) { tagClass += cleanTag[x]; if (x < cleanTag.length - 1) { tagClass += ' '; } } else { if (cleanTag[x] === 'is') { if (x < cleanTag.length - 1) { collectClasses = true; } } } x += 1; } if (tagClass.length > 0) { finalTag += ' class="' + tagClass + '"'; } } return finalTag; }; formatProperty = function(l) { var cleanProperty, propertyNameSearch, sp, t; // get rid of indentation sp = countSpaces(l); l = l.slice(sp); cleanProperty = '="'; propertyNameSearch = /^[\w\-]+( *)?"/i; t = l.match(propertyNameSearch)[0]; t = t.split(" ")[0]; t = t.split('"')[0]; cleanProperty = t + cleanProperty; t = l.split('"')[1]; cleanProperty += t + '"'; return cleanProperty; }; formatStyleProperty = function(l) { var afterArray, cleanStyleProperty, dividerPosition, j, propertyAfter, ref, sp, x; // get rid of indentation sp = countSpaces(l); l = l.slice(sp); dividerPosition = l.indexOf(':'); propertyAfter = l.slice(dividerPosition + 1); cleanStyleProperty = l.split(':')[0] + ':'; afterArray = propertyAfter.split(' '); for (x = j = 0, ref = afterArray.length; (0 <= ref ? j < ref : j > ref); x = 0 <= ref ? ++j : --j) { if (afterArray[x] !== '') { cleanStyleProperty += afterArray[x]; if (x < afterArray.length - 1) { cleanStyleProperty += ' '; } } } return cleanStyleProperty; }; formatString = function(l) { var cleanString; cleanString = l.split('"')[1]; return cleanString; }; checkSelfClosing = function(t) { var i, j, ref, selfClosing; selfClosing = true; for (i = j = 0, ref = selfClosingTags.length; (0 <= ref ? j <= ref : j >= ref); i = 0 <= ref ? ++j : --j) { if (t === selfClosingTags[i]) { selfClosing = false; } } return selfClosing; }; // the main recursive machines! processHead = function(lines = [], links, types, lineNums) { var childStyleNums, childTagNums, finalHead, j, p, ref, styleChildLines, styleChildTypes, tagChildLineNums, tagChildLines, tagChildLinks, tagChildTypes, tn, x; finalHead = '<head>'; // collect children childStyleNums = []; childTagNums = []; if (lines.length > 0) { for (x = j = 0, ref = lines.length; (0 <= ref ? j < ref : j > ref); x = 0 <= ref ? ++j : --j) { if (links[x] === -1) { if (types[x] === styleClassType) { childStyleNums.push(x); } if (types[x] === headTagType) { childTagNums.push(x); } } } } // process head styles if (childStyleNums.length > 0) { finalHead += '<style>'; x = 0; while (x < childStyleNums.length) { if (formatHtml) { finalHead += '\n'; } styleChildLines = []; styleChildTypes = []; p = childStyleNums[x] + 1; while (links[p] >= childStyleNums[x]) { if (p < lines.length) { styleChildLines.push(lines[p]); styleChildTypes.push(types[p]); p += 1; } else { break; } } finalHead += processStyleTag(lines[childStyleNums[x]], styleChildLines, styleChildTypes); x += 1; } finalHead += '</style>'; } // process head tags if (childTagNums.length > 0) { x = 0; while (x < childTagNums.length) { if (formatHtml) { finalHead += '\n'; } tagChildLines = []; tagChildLinks = []; tagChildTypes = []; tagChildLineNums = []; p = childTagNums[x] + 1; while (links[p] >= childTagNums[x]) { if (p < lines.length) { tagChildLines.push(lines[p]); tagChildLinks.push(links[p]); tagChildTypes.push(types[p]); tagChildLineNums.push(lineNums[p]); p += 1; } else { break; } } tn = childTagNums[x]; finalHead += processTag(lines[tn], lineNums[tn], tagChildLines, tagChildLinks, tagChildTypes, tagChildLineNums); x += 1; } } finalHead += '</head>'; return finalHead; }; processStyleTag = function(tagLine, childLines = [], childTypes) { var finalTag, j, ref, x; finalTag = '#'; if (tagLine.split(' ')[0] === 'class') { finalTag = '.'; } if (tagLine.split(' ')[1] === 'tag') { //if styling tag, not the id or class finalTag = ''; finalTag += tagLine.split(' ')[2] + '{'; } else { finalTag += tagLine.split(' ')[1] + '{'; } for (x = j = 0, ref = childLines.length; (0 <= ref ? j < ref : j > ref); x = 0 <= ref ? ++j : --j) { if (childTypes[x] === stylePropertyType) { finalTag += formatStyleProperty(childLines[x]) + ';'; } } finalTag += '}'; return finalTag; }; processTag = function(tagLine, selfLink, childLines = [], childLinks, childTypes, lineNums) { var childStrings, childs, closable, finalTag, j, k, l, m, o, p, ref, ref1, ref2, ref3, scriptBefore, sp, styleChildLines, styleChildTypes, tagChildLineNums, tagChildLines, tagChildLinks, tagChildTypes, tagName, tagProperties, tagStyles, tl, variables, x; // get rid of indentation sp = countSpaces(tagLine); tagLine = tagLine.slice(sp); tagName = tagLine.split(' ')[0]; finalTag = formatTag(tagLine); closable = checkSelfClosing(tagLine.split(' ')[0]); // collect all the children tagProperties = []; tagStyles = []; childs = []; childStrings = []; variables = []; if (childLines.length > 0) { for (x = j = 0, ref = childLines.length; (0 <= ref ? j < ref : j > ref); x = 0 <= ref ? ++j : --j) { if (childLinks[x] === selfLink) { if (childTypes[x] === tagPropertyType) { tagProperties.push(childLines[x]); } if (childTypes[x] === stylePropertyType) { tagStyles.push(childLines[x]); } if (childTypes[x] === tagType) { childs.push(x); } if (childTypes[x] === stringType) { childs.push(x); } if (childTypes[x] === styleClassType) { childs.push(x); } if (childTypes[x] === variableType) { childs.push(x); } } } } // add tag properties if (tagProperties.length > 0) { for (x = k = 0, ref1 = tagProperties.length; (0 <= ref1 ? k < ref1 : k > ref1); x = 0 <= ref1 ? ++k : --k) { tagProperties[x] = formatProperty(tagProperties[x]); finalTag += ' ' + tagProperties[x]; } } // add tag style if (tagStyles.length > 0) { finalTag += ' style="'; for (x = m = 0, ref2 = tagStyles.length; (0 <= ref2 ? m < ref2 : m > ref2); x = 0 <= ref2 ? ++m : --m) { finalTag += formatStyleProperty(tagStyles[x]) + ';'; } finalTag += '"'; } finalTag += '>'; //... process child tags, strings, styleTags x = 0; if (tagName !== 'coffeescript') { while (x < childs.length) { tl = childs[x]; if (childTypes[tl] === stringType) { finalTag += formatString(childLines[tl]); } if (childTypes[tl] === styleClassType) { if (childLinks[tl] !== -1) { if (formatHtml) { finalTag += '\n'; } styleChildLines = []; styleChildTypes = []; p = tl + 1; while (childLinks[p] >= tl) { if (p < childLines.length) { styleChildLines.push(childLines[p]); styleChildTypes.push(childTypes[p]); p += 1; } else { break; } } finalTag += processStyleTag(childLines[tl], styleChildLines, styleChildTypes); } } if (childTypes[tl] === tagType) { if (formatHtml) { finalTag += '\n'; } tagChildLines = []; tagChildLinks = []; tagChildTypes = []; tagChildLineNums = []; p = tl + 1; while (childLinks[p] >= tl) { if (p < childLines.length) { tagChildLines.push(childLines[p]); tagChildLinks.push(childLinks[p]); tagChildTypes.push(childTypes[p]); tagChildLineNums.push(lineNums[p]); p += 1; } else { break; } } finalTag += processTag(childLines[tl], lineNums[tl], tagChildLines, tagChildLinks, tagChildTypes, tagChildLineNums); } x += 1; } } else { scriptBefore = ''; for (l = o = 0, ref3 = childLines.length; (0 <= ref3 ? o < ref3 : o > ref3); l = 0 <= ref3 ? ++o : --o) { scriptBefore += childLines[l] + '\n'; } finalTag = '<script>'; tagName = 'script'; finalTag += coffee.compile(scriptBefore); } // close tag and return final string if (closable) { finalTag += '</' + tagName + '>'; } if (formatHtml) { finalTag += '\n'; } return finalTag; }; cleanUpFile = function(sFile) { var carriageTabTest, rFile; carriageTabTest = /[\r\t]/gmi; rFile = sFile; while (carriageTabTest.test(rFile)) { rFile = rFile.replace('\r', '\n').replace('\t', ' '); } return rFile; }; exports.christinizeFile = function(chrisFilePath) { var christinizedFile, sourceFile; sourceFile = fs.readFileSync(chrisFilePath, 'utf8'); sourceFile = cleanUpFile(sourceFile); chrisRootFolder = Path.dirname(chrisFilePath); christinizedFile = shtml(sourceFile); fs.writeFile(chrisFilePath + '.html', christinizedFile, function() { return console.log('ok'); }); return christinizedFile; }; exports.christinizeAndSave = function(chrisSource) { var christinizedFile; christinizedFile = shtml(chrisSource); return fs.writeFile('./chrisPreview.html', christinizedFile); }; exports.christinizeFileWithoutSaving = function(chrisFilePath) { var sourceFile; sourceFile = fs.readFileSync(chrisFilePath, 'utf8'); sourceFile = cleanUpFile(sourceFile); chrisRootFolder = Path.dirname(chrisFilePath); return shtml(sourceFile); }; }).call(this); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiPGFub255bW91cz4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQSxNQUFBLElBQUEsRUFBQSxXQUFBLEVBQUEsZ0JBQUEsRUFBQSxlQUFBLEVBQUEsV0FBQSxFQUFBLFlBQUEsRUFBQSxNQUFBLEVBQUEsYUFBQSxFQUFBLFdBQUEsRUFBQSxTQUFBLEVBQUEsV0FBQSxFQUFBLFVBQUEsRUFBQSxjQUFBLEVBQUEsWUFBQSxFQUFBLG1CQUFBLEVBQUEsU0FBQSxFQUFBLGNBQUEsRUFBQSxFQUFBLEVBQUEsWUFBQSxFQUFBLGFBQUEsRUFBQSxXQUFBLEVBQUEsUUFBQSxFQUFBLGFBQUEsRUFBQSxlQUFBLEVBQUEsWUFBQSxFQUFBLFVBQUEsRUFBQSxXQUFBLEVBQUEsY0FBQSxFQUFBLGVBQUEsRUFBQSxVQUFBLEVBQUEsZ0JBQUEsRUFBQSxVQUFBLEVBQUEsZUFBQSxFQUFBLEtBQUEsRUFBQSxZQUFBLEVBQUEsVUFBQSxFQUFBLGdCQUFBLEVBQUEsY0FBQSxFQUFBLG1CQUFBLEVBQUEsaUJBQUEsRUFBQSxTQUFBLEVBQUEsaUJBQUEsRUFBQSxlQUFBLEVBQUEsT0FBQSxFQUFBLGNBQUEsRUFBQTs7RUFBQSxlQUFBLEdBQWtCLENBQUMsSUFBRCxFQUFPLEtBQVAsRUFBYyxPQUFkLEVBQXVCLElBQXZCLEVBQTZCLE1BQTdCLEVBQXFDLE1BQXJDOztFQUNsQixRQUFBLEdBQVcsQ0FBQyxNQUFELEVBQVMsT0FBVCxFQUFrQixPQUFsQixFQUEyQixPQUEzQixFQUFvQyxNQUFwQzs7RUFFWCxVQUFBLEdBQWE7O0VBQ2IsU0FBQSxHQUFZOztFQUVaLGVBQUEsR0FBa0I7O0VBRWxCLEVBQUEsR0FBSyxPQUFBLENBQVEsSUFBUjs7RUFDTCxJQUFBLEdBQU8sT0FBQSxDQUFRLE1BQVI7O0VBQ1AsTUFBQSxHQUFTLE9BQUEsQ0FBUSxlQUFSLEVBVlQ7OztFQWVBLE9BQUEsR0FBc0IsRUFmdEI7O0VBZ0JBLFNBQUEs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QUFDdEIsUUFBQSxnQkFBQSxFQUFBO0lBQUEsVUFBQSxHQUFhLEVBQUUsQ0FBQyxZQUFILENBQWdCLGFBQWhCLEVBQStCLE1BQS9CO0lBQ2IsVUFBQSxHQUFhLFdBQUEsQ0FBWSxVQUFaO0lBRWIsZUFBQSxHQUFrQixJQUFJLENBQUMsT0FBTCxDQUFhLGFBQWI7SUFDbEIsZ0JBQUEsR0FBbUIsS0FBQSxDQUFNLFVBQU47SUFFbkIsRUFBRSxDQUFDLFNBQUgsQ0FBYSxhQUFBLEdBQWdCLE9BQTdCLEVBQXNDLGdCQUF0QyxFQUF3RCxRQUFBLENBQUEsQ0FBQTthQUFHLE9BQU8sQ0FBQyxHQUFSLENBQVksSUFBWjtJQUFILENBQXhEO1dBQ0E7RUFSc0I7O0VBVzFCLE9BQU8sQ0FBQyxrQkFBUixHQUE2QixRQUFBLENBQUMsV0FBRCxDQUFBO0FBQ3pCLFFBQUE7SUFBQSxnQkFBQSxHQUFtQixLQUFBLENBQU0sV0FBTjtXQUNuQixFQUFFLENBQUMsU0FBSCxDQUFhLHFCQUFiLEVBQW9DLGdCQUFwQztFQUZ5Qjs7RUFLN0IsT0FBTyxDQUFDLDRCQUFSLEdBQXVDLFFBQUEsQ0FBQyxhQUFELENBQUE7QUFDbkMsUUFBQTtJQUFBLFVBQUEsR0FBYSxFQUFFLENBQUMsWUFBSCxDQUFnQixhQUFoQixFQUErQixNQUEvQjtJQUNiLFVBQUEsR0FBYSxXQUFBLENBQVksVUFBWjtJQUViLGVBQUEsR0FBa0IsSUFBSSxDQUFDLE9BQUwsQ0FBYSxhQUFiO1dBQ2xCLEtBQUEsQ0FBTSxVQUFOO0VBTG1DO0FBOWhCdkMiLCJzb3VyY2VzQ29udGVudCI6WyJzZWxmQ2xvc2luZ1RhZ3MgPSBbJ2JyJywgJ2ltZycsICdpbnB1dCcsICdocicsICdtZXRhJywgJ2xpbmsnXVxuaGVhZFRhZ3MgPSBbJ21ldGEnLCAndGl0bGUnLCAnc3R5bGUnLCAnY2xhc3MnLCAnbGluayddXG5cbmZvcm1hdEh0bWwgPSBmYWxzZVxuZGVidWdNb2RlID0gZmFsc2VcblxuY2hyaXNSb290Rm9sZGVyID0gJydcblxuZnMgPSByZXF1aXJlICdmcydcblBhdGggPSByZXF1aXJlICdwYXRoJ1xuY29mZmVlID0gcmVxdWlyZSAnY29mZmVlLXNjcmlwdCdcblxuXG5cbiMgTElORSBUWVBFU1xudGFnVHlwZSAgICAgICAgICAgICA9IDAgI2lmIG5vIGFub3RoZXIgdHlwZSBmb3VuZCBhbmQgdGhpcyBpcyBub3QgYSBzY3JpcHRcbnRhZ0ZpbHRlciAgICAgICAgICAgPSAvXlxccypbXFx3XFwtXSsgKigoICtcXHcrKT8oICopPyggK2lzKCArLiopPyk/KT8kL2lcblxudGFnUHJvcGVydHlUeXBlICAgICA9IDEgI2lmIGZvdW5kIHByb3BlcnR5IFwic29tZXRoaW5nXCJcbnRhZ1Byb3BlcnR5RmlsdGVyICAgPSAvXlxccypbXFx3XFwtXSsgKlwiLipcIi9cblxuc3R5bGVDbGFzc1R5cGUgICAgICA9IDIgI2lmIHRoaXMgaXMgdGFnIGFuZCB0aGUgdGFnIGlzIHN0eWxlXG5zdHlsZUNsYXNzRmlsdGVyICAgID0gL15cXHMqKHN0eWxlfGNsYXNzKVxccytbXFx3Ol8tXSsvaVxuXG5zdHlsZVByb3BlcnR5VHlwZSAgID0gMyAjaWYgZm91bmQgcHJvcGVydHk6IHNvbWV0aGluZ1xuc3R5bGVQcm9wZXJ0eUZpbHRlciA9IC9eXFxzKlteXCInIF0rICo6ICouKi9pXG5cbnN0cmluZ1R5cGUgICAgICAgICAgPSA0ICNpZiBmb3VuZCBcInN0cmluZ1wiXG5zdHJpbmdGaWx0ZXIgICAgICAgID0gL15cXHMqXCIuKlwiL2lcblxuc2NyaXB0VHlwZSAgICAgICAgICA9IDUgI2lmIGl0IGlzIHVuZGVyIHRoZSBzY3JpcHQgdGFnXG5cbnZhcmlhYmxlVHlwZSAgICAgICAgPSA2ICMgaWYgZm91bmQgbmFtZSA9IHNvbWV0aGluZ1xudmFyaWFibGVGaWx0ZXIgICAgICA9IC9eXFxzKlxcdytcXHMqPVxccypbXFx3XFxXXSsvaVxuXG5oZWFkVGFnVHlwZSAgICAgICAgID0gN1xuaGVhZFRhZ0ZpbHRlciAgICAgICA9IC9eXFxzKihtZXRhfHRpdGxlfGxpbmt8YmFzZSkvaVxuXG5tb2R1bGVUeXBlICAgICAgICAgID0gOFxubW9kdWxlRmlsdGVyICAgICAgICA9IC9eXFxzKmluY2x1ZGVcXHMqXCIuKy5jaHJpc1wiL2lcblxuaWdub3JhYmxlVHlwZSAgICAgICA9IC0yXG5lbXB0eUZpbHRlciAgICAgICAgID0gL15bXFxXXFxzX10qJC9cbmNvbW1lbnRGaWx0ZXIgICAgICAgPSAvXlxccyojL2lcblxuXG5cblxuXG5jb3VudFNwYWNlcyA9IChsKSAtPlxuICAgIHggPSAwXG4gICAgaWYgbFswXSA9PSBcIiBcIlxuICAgICAgICB3aGlsZSBsW3hdID09IFwiIFwiXG4gICAgICAgICAgICB4Kz0xXG4gICAgeFxuXG5cblxuYW5hbGlzZVR5cGUgPSAobCkgLT5cbiAgICBsbiA9IC0xXG5cbiAgICBsbiA9IGlnbm9yYWJsZVR5cGUgaWYgY29tbWVudEZpbHRlci50ZXN0IGxcbiAgICBsbiA9IGlnbm9yYWJsZVR5cGUgaWYgZW1wdHlGaWx0ZXIudGVzdCBsXG4gICAgbG4gPSBzdHlsZVByb3BlcnR5VHlwZSBpZiBzdHlsZVByb3BlcnR5RmlsdGVyLnRlc3QgbFxuICAgIGxuID0gdGFnVHlwZSBpZiB0YWdGaWx0ZXIudGVzdCBsXG4gICAgbG4gPSBoZWFkVGFnVHlwZSBpZiBoZWFkVGFnRmlsdGVyLnRlc3QgbFxuICAgIGxuID0gc3R5bGVDbGFzc1R5cGUgaWYgc3R5bGVDbGFzc0ZpbHRlci50ZXN0IGxcbiAgICBsbiA9IHRhZ1Byb3BlcnR5VHlwZSBpZiB0YWdQcm9wZXJ0eUZpbHRlci50ZXN0IGxcbiAgICBsbiA9IHN0cmluZ1R5cGUgaWYgc3RyaW5nRmlsdGVyLnRlc3QgbFxuICAgIGxuID0gdmFyaWFibGVUeXBlIGlmIHZhcmlhYmxlRmlsdGVyLnRlc3QgbFxuICAgIGxuID0gbW9kdWxlVHlwZSBpZiBtb2R1bGVGaWx0ZXIudGVzdCBsXG4gICAgbG5cblxuXG5nZXRIaWVyYXJjaHkgPSAobGluZXMpIC0+XG4gICAgbGluZUxldmVscyA9IFtdXG4gICAgbGluZVBhcmVudHM9W11cblxuICAgIGxhc3RMaW5lT2ZMZXZlbCA9IFstMV1cbiAgICBjdXJyZW50TGV2ZWwgPSBbMF1cbiAgICBjdXJyZW50UmVhbExldmVsID0gMFxuXG4gICAgZm9yIHggaW4gWzAuLi5saW5lcy5sZW5ndGhdXG4gICAgICAgIG4gPSBjb3VudFNwYWNlcyBsaW5lc1t4XVxuICAgICAgICAjbGluZXNbeF0gPSBsaW5lc1t4XS5zbGljZShuKVxuXG4gICAgICAgIGlmIG4gPiBjdXJyZW50TGV2ZWxbY3VycmVudFJlYWxMZXZlbF1cbiAgICAgICAgICAgIGxhc3RMaW5lT2ZMZXZlbC5wdXNoIHggLSAxXG4gICAgICAgICAgICBjdXJyZW50TGV2ZWwucHVzaCBuXG4gICAgICAgICAgICBjdXJyZW50UmVhbExldmVsICs9IDFcblxuICAgICAgICB3aGlsZSBuIDwgY3VycmVudExldmVsW2N1cnJlbnRSZWFsTGV2ZWxdXG4gICAgICAgICAgICBpZiBuIDwgY3VycmVudExldmVsW2N1cnJlbnRSZWFsTGV2ZWxdXG4gICAgICAgICAgICAgICAgY3VycmVudExldmVsLnBvcCgpXG4gICAgICAgICAgICAgICAgbGFzdExpbmVPZkxldmVsLnBvcCgpXG4gICAgICAgICAgICAgICAgY3VycmVudFJlYWxMZXZlbCAtPSAxXG5cbiAgICAgICAgbGluZUxldmVscy5wdXNoIGN1cnJlbnRSZWFsTGV2ZWxcbiAgICAgICAgbGluZVBhcmVudHNbeF0gPSBsYXN0TGluZU9mTGV2ZWxbbGFzdExpbmVPZkxldmVsLmxlbmd0aC0xXVxuXG4gICAgbGluZVBhcmVudHNcblxuXG5mb3JtYXRWYXJpYWJsZSA9IChsKSAtPlxuICAgIGV4cG9ydEFycmF5ID0gW11cbiAgICB2YXJDb250ZW50ID0gJydcblxuICAgIHZhck5hbWUgPSBsLnNwbGl0KCc9JylbMF1cbiAgICB3ID0gMFxuICAgIHdoaWxlIHZhck5hbWUuc3BsaXQoJyAnKVt3XSA9PSAnJ1xuICAgICAgICB3ICs9IDFcbiAgICB2YXJOYW1lID0gdmFyTmFtZS5zcGxpdCgnICcpW3ddXG5cbiAgICBjID0gbC5zcGxpdCgnPScpXG4gICAgYyA9IGNbMV0uc3BsaXQoJyAnKVxuICAgIHcgPSAwXG4gICAgd2hpbGUgdyA8IGMubGVuZ3RoXG4gICAgICAgIGlmIGNbd10gIT0gJydcbiAgICAgICAgICAgIHZhckNvbnRlbnQgKz0gJyAnIGlmIHZhckNvbnRlbnQgIT0gJydcbiAgICAgICAgICAgIHZhckNvbnRlbnQgKz0gY1t3XVxuICAgICAgICB3ICs9IDFcblxuICAgIGV4cG9ydEFycmF5WzBdID0gdmFyTmFtZVxuICAgIGV4cG9ydEFycmF5WzFdID0gdmFyQ29udGVudFxuICAgIGV4cG9ydEFycmF5XG5cblxucHJvY2Vzc1ZhcmlhYmxlcyA9IChscywgdHBzKSAtPlxuICAgIHZhck5hbWVzICAgID0gW11cbiAgICB2YXJDb250ZW50cyA9IFtdXG5cbiAgICBmb3IgeCBpbiBbMC4uLmxzLmxlbmd0aF1cbiAgICAgICAgaWYgdHBzW3hdID09IHZhcmlhYmxlVHlwZVxuICAgICAgICAgICAgdmFyTmFtZXMucHVzaCBmb3JtYXRWYXJpYWJsZShsc1t4XSlbMF1cbiAgICAgICAgICAgIHZhckNvbnRlbnRzLnB1c2ggZm9ybWF0VmFyaWFibGUobHNbeF0pWzFdXG5cbiAgICAgICAgaWYgdHBzW3hdID09IHN0eWxlUHJvcGVydHlUeXBlXG4gICAgICAgICAgICBmb3IgZiBpbiBbMC4uLnZhck5hbWVzLmxlbmd0aF1cbiAgICAgICAgICAgICAgICBsc1t4XSA9IGxzW3hdLnJlcGxhY2UodmFyTmFtZXNbZl0sIHZhckNvbnRlbnRzW2ZdKS5yZXBsYWNlKHZhck5hbWVzW2ZdLCB2YXJDb250ZW50c1tmXSkucmVwbGFjZSh2YXJOYW1lc1tmXSwgdmFyQ29udGVudHNbZl0pLnJlcGxhY2UodmFyTmFtZXNbZl0sIHZhckNvbnRlbnRzW2ZdKVxuXG4gICAgbHNcblxuXG4gIyBNb2R1bGUgcHJvY2Vzc2luZyBmdW5jdGlvbnNcblxubG9hZENocmlzTW9kdWxlID0gKG1vZHVsZUZpbGVQYXRoKSAtPlxuICAgIG1zbHMgPSBmcy5yZWFkRmlsZVN5bmMobW9kdWxlRmlsZVBhdGgsICd1dGY4JylcbiAgICBtc2xzID0gY2xlYW5VcEZpbGUobXNscylcbiAgICBtbHMgPSBtc2xzLnNwbGl0ICdcXG4nXG4gICAgbWxzXG5cbnByb2Nlc3NNb2R1bGVzID0gKGxzLCBmKSAtPlxuICAgIHJlc3VsdExzID0gW11cbiAgICBtb2R1bGVMZXZlbEZpbHRlciA9IC9eXFxzKi9cblxuICAgIGZvciB4IGluIFswLi4ubHMubGVuZ3RoXVxuICAgICAgICBpZiBtb2R1bGVGaWx0ZXIudGVzdCBsc1t4XVxuICAgICAgICAgICAgY2hyaXNNb2R1bGVQYXRoID0gbHNbeF0uc3BsaXQoJ1wiJylbMV1cbiAgICAgICAgICAgIG1vZHVsZUxpbmVzID0gbG9hZENocmlzTW9kdWxlKGYgKyAnLycgKyBjaHJpc01vZHVsZVBhdGgpXG5cbiAgICAgICAgICAgIG1vZHVsZUxldmVsID0gbW9kdWxlTGV2ZWxGaWx0ZXIuZXhlYyhsc1t4XSlcbiAgICAgICAgICAgIG1vZHVsZUxpbmVzW2xdID0gbW9kdWxlTGV2ZWwgKyBtb2R1bGVMaW5lc1tsXSBmb3IgbCBpbiBbMC4uLm1vZHVsZUxpbmVzLmxlbmd0aF1cblxuICAgICAgICAgICAgbW9kdWxlTGluZXMgPSBwcm9jZXNzTW9kdWxlcyhtb2R1bGVMaW5lcywgUGF0aC5kaXJuYW1lKGYgKyAnLycgKyBjaHJpc01vZHVsZVBhdGgpKVxuICAgICAgICAgICAgcmVzdWx0THMgPSByZXN1bHRMcy5jb25jYXQobW9kdWxlTGluZXMpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlc3VsdExzLnB1c2ggbHNbeF1cblxuICAgIHJlc3VsdExzXG5cblxuXG4jIE1BSU4gQ0hSSVNUSU5FIEZVTkNUSU9OXG5cbmV4cG9ydHMuY2hyaXN0aW5pemUgPSAoc3QpIC0+XG4gICAgc2h0bWwoc3QpXG5cbiAgICBcbmNsZWFuVXBMaW5lcyA9IChscykgLT5cbiAgICBuZXdMcyA9IFtdXG4gICAgXG4gICAgZm9yIHggaW4gWzAuLi5scy5sZW5ndGhdXG4gICAgICAgIGlmIGFuYWxpc2VUeXBlKGxzW3hdKSAhPSAtMlxuICAgICAgICAgICAgICAgIG5ld0xzLnB1c2ggbHNbeF1cbiAgICAgICAgICBcbiAgICBuZXdMc1xuXG5cbnNodG1sID0gKHNvdXJjZVRleHQpIC0+XG5cbiAgICBsaW5lcyAgICAgICA9IFtdXG4gICAgcmVzdWx0TGluZXMgPSBbXVxuICAgIGxpbmVUeXBlcyAgID0gW11cbiAgICBsaW5lUGFyZW50cyA9IFtdXG4gICAgbGluZU51bXMgICAgPSBbXVxuICAgIHJlc3VsdFRleHQgID0gJydcblxuICAgIGxpbmVzID0gc291cmNlVGV4dC5zcGxpdCAnXFxuJ1xuXG4gICAgbGluZXMgPSBwcm9jZXNzTW9kdWxlcyhsaW5lcywgY2hyaXNSb290Rm9sZGVyKVxuXG5cbiAgICBsaW5lcyA9IGNsZWFuVXBMaW5lcyhsaW5lcywgbGluZVR5cGVzKVxuXG4gICAgIyBwcm9jZXNzIHR5cGVzIGFuZCBmaWx0ZXIgbGluZXNcbiAgICBmb3IgeCBpbiBbMC4uLmxpbmVzLmxlbmd0aF1cbiAgICAgICAgdCA9IGFuYWxpc2VUeXBlKGxpbmVzW3hdKVxuICAgICAgICBsaW5lVHlwZXMucHVzaCB0XG4gICAgICAgIHJlc3VsdExpbmVzLnB1c2ggbGluZXNbeF1cblxuICAgIHJlc3VsdExpbmVzID0gcHJvY2Vzc1ZhcmlhYmxlcyhyZXN1bHRMaW5lcywgbGluZVR5cGVzKVxuXG4gICAgbGluZVBhcmVudHMgPSBnZXRIaWVyYXJjaHkgcmVzdWx0TGluZXNcblxuICAgIGxpbmVOdW1zLnB1c2goeCkgZm9yIHggaW4gWzAuLi5yZXN1bHRMaW5lcy5sZW5ndGhdXG5cbiAgICByZXN1bHRUZXh0ICs9IFwiIyN7bGluZU51bXNbeF19ICN7bGluZVR5cGVzW3hdfSAje3Jlc3VsdExpbmVzW3hdfSAtICN7bGluZVBhcmVudHNbeF19XFxuXCIgZm9yIHggaW4gWzAuLi5yZXN1bHRMaW5lcy5sZW5ndGhdIGlmIGRlYnVnTW9kZVxuXG4gICAgcmVzdWx0VGV4dCArPSAnPCFkb2N0eXBlIGh0bWw+J1xuICAgIHJlc3VsdFRleHQgKz0gJzxodG1sPidcbiAgICByZXN1bHRUZXh0ICs9IHByb2Nlc3NIZWFkKHJlc3VsdExpbmVzLCBsaW5lUGFyZW50cywgbGluZVR5cGVzLCBsaW5lTnVtcylcbiAgICByZXN1bHRUZXh0ICs9IHByb2Nlc3NUYWcoXCJib2R5XCIsIC0xLCByZXN1bHRMaW5lcywgbGluZVBhcmVudHMsIGxpbmVUeXBlcywgbGluZU51bXMpXG4gICAgcmVzdWx0VGV4dCArPSAnPC9odG1sPidcblxuICAgIHJlc3VsdFRleHRcblxuXG5cblxuZm9ybWF0VGFnID0gKGwpIC0+XG5cbiAgICAjIGdldCByaWQgb2YgaW5kZW50YXRpb25cbiAgICBzcCA9IGNvdW50U3BhY2VzIGxcbiAgICBsID0gbC5zbGljZShzcClcblxuICAgIHRhZ0FycmF5ID0gbC5zcGxpdCAnICdcbiAgICBjbGVhblRhZyA9IFtdXG5cbiAgICBmb3IgeCBpbiBbMC4uLnRhZ0FycmF5Lmxlbmd0aF1cbiAgICAgICAgY2xlYW5UYWcucHVzaCB0YWdBcnJheVt4XSBpZiB0YWdBcnJheVt4XSAhPSBcIlwiXG5cbiAgICBmaW5hbFRhZyA9ICc8JyArIGNsZWFuVGFnWzBdXG5cbiAgICBpZiBjbGVhblRhZy5sZW5ndGggPiAxXG4gICAgICAgIGlmIGNsZWFuVGFnWzFdICE9ICdpcydcbiAgICAgICAgICAgIGZpbmFsVGFnICs9ICcgaWQ9XCInICsgY2xlYW5UYWdbMV0gKyAnXCInXG5cbiAgICAgICAgeCA9IDBcbiAgICAgICAgdGFnQ2xhc3MgPSBcIlwiXG4gICAgICAgIGNvbGxlY3RDbGFzc2VzID0gZmFsc2VcbiAgICAgICAgd2hpbGUgeCA8IGNsZWFuVGFnLmxlbmd0aFxuICAgICAgICAgICAgaWYgY29sbGVjdENsYXNzZXNcbiAgICAgICAgICAgICAgICB0YWdDbGFzcyArPSBjbGVhblRhZ1t4XVxuICAgICAgICAgICAgICAgIHRhZ0NsYXNzICs9ICcgJyBpZiB4IDwgY2xlYW5UYWcubGVuZ3RoIC0gMVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGlmIGNsZWFuVGFnW3hdID09ICdpcydcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdENsYXNzZXMgPSB0cnVlIGlmIHggPCBjbGVhblRhZy5sZW5ndGggLSAxXG4gICAgICAgICAgICB4ICs9IDFcbiAgICAgICAgZmluYWxUYWcgKz0gJyBjbGFzcz1cIicgKyB0YWdDbGFzcyArICdcIicgaWYgdGFnQ2xhc3MubGVuZ3RoID4gMFxuXG4gICAgZmluYWxUYWdcblxuXG5cblxuZm9ybWF0UHJvcGVydHkgPSAobCkgLT5cblxuICAgICMgZ2V0IHJpZCBvZiBpbmRlbnRhdGlvblxuICAgIHNwID0gY291bnRTcGFjZXMgbFxuICAgIGwgPSBsLnNsaWNlKHNwKVxuXG4gICAgY2xlYW5Qcm9wZXJ0eSA9ICc9XCInXG4gICAgcHJvcGVydHlOYW1lU2VhcmNoID0gL15bXFx3XFwtXSsoICopP1wiL2lcbiAgICB0ID0gbC5tYXRjaChwcm9wZXJ0eU5hbWVTZWFyY2gpWzBdXG4gICAgdCA9IHQuc3BsaXQoXCIgXCIpWzBdXG4gICAgdCA9IHQuc3BsaXQoJ1wiJylbMF1cbiAgICBjbGVhblByb3BlcnR5ID0gdCArIGNsZWFuUHJvcGVydHlcbiAgICB0ID0gbC5zcGxpdCgnXCInKVsxXVxuICAgIGNsZWFuUH