UNPKG

@enterthenamehere/esdoc

Version:

Good Documentation Generator For JavaScript, updated for new decade

178 lines (171 loc) 21.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; /** * Param Type Parser class. */ class ParamParser { /** * parse param value. * @param {string} value - param value. * @param {boolean} [type=true] if true, contain param type. * @param {boolean} [name=true] if true, contain param name. * @param {boolean} [desc=true] if true, contain param description. * @return {{typeText: string, paramName: string, paramDesc: string}} parsed value. * * @example * let value = '{number} param - this is number param'; * let {typeText, paramName, paramDesc} = ParamParser.parseParamValue(value); * * let value = '{number} this is number return value'; * let {typeText, paramDesc} = ParamParser.parseParamValue(value, true, false, true); * * let value = '{number}'; * let {typeText} = ParamParser.parseParamValue(value, true, false, false); */ static parseParamValue(value) { var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var name = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; var desc = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; value = value.trim(); var match = []; var typeText = null; var paramName = null; var paramDesc = null; // e.g {number} if (type) { var reg = /^\{((?:[\0-\?A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?)\}([\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+|$)/; // ``@`` is special char in ``{@link foo}`` match = value.match(reg); if (match) { typeText = match[1]; value = value.replace(reg, ''); } else { typeText = '*'; } } // e.g. [p1=123] if (name) { if (value.charAt(0) === '[') { paramName = ''; var counter = 0; for (var c of value) { paramName += c; if (c === '[') counter++; if (c === ']') counter--; if (counter === 0) break; } if (paramName) { value = value.substr(paramName.length).trim(); } } else { match = value.match(/^((?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)/); if (match) { paramName = match[1]; value = value.replace(/^(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]*/, ''); } } } // e.g. this is p1 desc. if (desc) { paramDesc = value.startsWith('-') ? value.substring(1).trimStart() : value; } if (!(typeText || paramName || paramDesc)) { console.error("\x1B[31mParamParser::parseParamValue() - Param is invalid. param = \"".concat(value, "\"\x1B[0m")); throw new Error("ParamParser::parseParamValue() - Param is invalid. param = \"".concat(value, "\"")); } return { typeText, paramName, paramDesc }; } /** * parse param text and build formatted result. * @param {string} typeText - param type text. * @param {string} [paramName] - param name. * @param {string} [paramDesc] - param description. * @returns {ParsedParam} formatted result. * * @example * let value = '{number} param - this is number param'; * let {typeText, paramName, paramDesc} = ParamParser.parseParamValue(value); * let result = ParamParser.parseParam(typeText, paramName, paramDesc); */ static parseParam() { var typeText = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; var paramName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var paramDesc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; var result = {}; if (typeText) { // check nullable if (typeText[0] === '?') { result.nullable = true; } else if (typeText[0] === '!') { result.nullable = false; } else { result.nullable = null; } typeText = typeText.replace(/^[!\?]/, ''); // check record and union if (typeText[0] === '{') { result.types = [typeText]; } else if (typeText[0] === '(') { typeText = typeText.replace(/^\(/, '').replace(/\)$/, ''); result.types = typeText.split('|'); } else if (typeText.includes('|')) { if (typeText.match(/<(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?\|(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?>/)) { // union in generics. e.g. `Array<string|number>` // hack: in this case, process this type in DocBuilder#_buildTypeDocLinkHTML result.types = [typeText]; } else if (typeText.match(/^\.\.\.\((?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?\)/)) { // union with spread. e.g. `...(string|number)` // hack: in this case, process this type in DocBuilder#_buildTypeDocLinkHTML result.types = [typeText]; } else { result.types = typeText.split('|'); } } else { result.types = [typeText]; } if (typeText.indexOf('...') === 0) { result.spread = true; } else { result.spread = false; } } else { result.types = ['']; } if (result.types.some(t => { return !t; })) { throw new Error("Empty Type found name=".concat(paramName, " desc=").concat(paramDesc)); } if (paramName) { // check optional if (paramName[0] === '[') { result.optional = true; paramName = paramName.replace(/^\[/, '').replace(/\]$/, ''); } else { result.optional = false; } // check default value var pair = paramName.split('='); if (pair.length === 2) { result.defaultValue = pair[1]; try { var raw = JSON.parse(pair[1]); result.defaultRaw = raw; } catch (e) { result.defaultRaw = pair[1]; } } result.name = pair[0].trim(); } result.description = paramDesc; return result; } } exports.default = ParamParser; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQYXJhbVBhcnNlciIsInBhcnNlUGFyYW1WYWx1ZSIsInZhbHVlIiwidHlwZSIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIm5hbWUiLCJkZXNjIiwidHJpbSIsIm1hdGNoIiwidHlwZVRleHQiLCJwYXJhbU5hbWUiLCJwYXJhbURlc2MiLCJyZWciLCJyZXBsYWNlIiwiY2hhckF0IiwiY291bnRlciIsImMiLCJzdWJzdHIiLCJzdGFydHNXaXRoIiwic3Vic3RyaW5nIiwidHJpbVN0YXJ0IiwiY29uc29sZSIsImVycm9yIiwiY29uY2F0IiwiRXJyb3IiLCJwYXJzZVBhcmFtIiwicmVzdWx0IiwibnVsbGFibGUiLCJ0eXBlcyIsInNwbGl0IiwiaW5jbHVkZXMiLCJpbmRleE9mIiwic3ByZWFkIiwic29tZSIsInQiLCJvcHRpb25hbCIsInBhaXIiLCJkZWZhdWx0VmFsdWUiLCJyYXciLCJKU09OIiwicGFyc2UiLCJkZWZhdWx0UmF3IiwiZSIsImRlc2NyaXB0aW9uIiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvUGFyc2VyL1BhcmFtUGFyc2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBQYXJhbSBUeXBlIFBhcnNlciBjbGFzcy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcmFtUGFyc2VyIHtcclxuICAvKipcclxuICAgKiBwYXJzZSBwYXJhbSB2YWx1ZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBwYXJhbSB2YWx1ZS5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt0eXBlPXRydWVdIGlmIHRydWUsIGNvbnRhaW4gcGFyYW0gdHlwZS5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtuYW1lPXRydWVdIGlmIHRydWUsIGNvbnRhaW4gcGFyYW0gbmFtZS5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZXNjPXRydWVdIGlmIHRydWUsIGNvbnRhaW4gcGFyYW0gZGVzY3JpcHRpb24uXHJcbiAgICogQHJldHVybiB7e3R5cGVUZXh0OiBzdHJpbmcsIHBhcmFtTmFtZTogc3RyaW5nLCBwYXJhbURlc2M6IHN0cmluZ319IHBhcnNlZCB2YWx1ZS5cclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogbGV0IHZhbHVlID0gJ3tudW1iZXJ9IHBhcmFtIC0gdGhpcyBpcyBudW1iZXIgcGFyYW0nO1xyXG4gICAqIGxldCB7dHlwZVRleHQsIHBhcmFtTmFtZSwgcGFyYW1EZXNjfSA9IFBhcmFtUGFyc2VyLnBhcnNlUGFyYW1WYWx1ZSh2YWx1ZSk7XHJcbiAgICpcclxuICAgKiBsZXQgdmFsdWUgPSAne251bWJlcn0gdGhpcyBpcyBudW1iZXIgcmV0dXJuIHZhbHVlJztcclxuICAgKiBsZXQge3R5cGVUZXh0LCBwYXJhbURlc2N9ID0gUGFyYW1QYXJzZXIucGFyc2VQYXJhbVZhbHVlKHZhbHVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICpcclxuICAgKiBsZXQgdmFsdWUgPSAne251bWJlcn0nO1xyXG4gICAqIGxldCB7dHlwZVRleHR9ID0gUGFyYW1QYXJzZXIucGFyc2VQYXJhbVZhbHVlKHZhbHVlLCB0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAqL1xyXG4gIHN0YXRpYyBwYXJzZVBhcmFtVmFsdWUodmFsdWUsIHR5cGUgPSB0cnVlLCBuYW1lID0gdHJ1ZSwgZGVzYyA9IHRydWUpIHtcclxuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpO1xyXG5cclxuICAgIGxldCBtYXRjaCA9IFtdO1xyXG4gICAgbGV0IHR5cGVUZXh0ID0gbnVsbDtcclxuICAgIGxldCBwYXJhbU5hbWUgPSBudWxsO1xyXG4gICAgbGV0IHBhcmFtRGVzYyA9IG51bGw7XHJcblxyXG4gICAgLy8gZS5nIHtudW1iZXJ9XHJcbiAgICBpZiAodHlwZSkge1xyXG4gICAgICBjb25zdCByZWcgPSAvXlxceyhbXkBdKj8pXFx9KFxccyt8JCkvdTsgLy8gYGBAYGAgaXMgc3BlY2lhbCBjaGFyIGluIGBge0BsaW5rIGZvb31gYFxyXG4gICAgICBtYXRjaCA9IHZhbHVlLm1hdGNoKHJlZyk7XHJcbiAgICAgIGlmIChtYXRjaCkge1xyXG4gICAgICAgIHR5cGVUZXh0ID0gbWF0Y2hbMV07XHJcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlZywgJycpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHR5cGVUZXh0ID0gJyonO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZS5nLiBbcDE9MTIzXVxyXG4gICAgaWYgKG5hbWUpIHtcclxuICAgICAgaWYgKHZhbHVlLmNoYXJBdCgwKSA9PT0gJ1snKSB7XHJcbiAgICAgICAgcGFyYW1OYW1lID0gJyc7XHJcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xyXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiB2YWx1ZSkge1xyXG4gICAgICAgICAgcGFyYW1OYW1lICs9IGM7XHJcbiAgICAgICAgICBpZiAoYyA9PT0gJ1snKSBjb3VudGVyKys7XHJcbiAgICAgICAgICBpZiAoYyA9PT0gJ10nKSBjb3VudGVyLS07XHJcbiAgICAgICAgICBpZiAoY291bnRlciA9PT0gMCkgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGFyYW1OYW1lKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cihwYXJhbU5hbWUubGVuZ3RoKS50cmltKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1hdGNoID0gdmFsdWUubWF0Y2goL14oXFxTKykvdSk7XHJcbiAgICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgICBwYXJhbU5hbWUgPSBtYXRjaFsxXTtcclxuICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXlxcUytcXHMqL3UsICcnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBlLmcuIHRoaXMgaXMgcDEgZGVzYy5cclxuICAgIGlmIChkZXNjKSB7XHJcbiAgICAgIHBhcmFtRGVzYyA9ICggdmFsdWUuc3RhcnRzV2l0aCgnLScpID8gdmFsdWUuc3Vic3RyaW5nKDEpLnRyaW1TdGFydCgpIDogdmFsdWUgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiggISh0eXBlVGV4dCB8fCBwYXJhbU5hbWUgfHwgcGFyYW1EZXNjICkgKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgXHUwMDFiWzMxbVBhcmFtUGFyc2VyOjpwYXJzZVBhcmFtVmFsdWUoKSAtIFBhcmFtIGlzIGludmFsaWQuIHBhcmFtID0gXCIke3ZhbHVlfVwiXHUwMDFiWzBtYCk7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXJhbVBhcnNlcjo6cGFyc2VQYXJhbVZhbHVlKCkgLSBQYXJhbSBpcyBpbnZhbGlkLiBwYXJhbSA9IFwiJHt2YWx1ZX1cImApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7dHlwZVRleHQsIHBhcmFtTmFtZSwgcGFyYW1EZXNjfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHBhcnNlIHBhcmFtIHRleHQgYW5kIGJ1aWxkIGZvcm1hdHRlZCByZXN1bHQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVUZXh0IC0gcGFyYW0gdHlwZSB0ZXh0LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1OYW1lXSAtIHBhcmFtIG5hbWUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbURlc2NdIC0gcGFyYW0gZGVzY3JpcHRpb24uXHJcbiAgICogQHJldHVybnMge1BhcnNlZFBhcmFtfSBmb3JtYXR0ZWQgcmVzdWx0LlxyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBsZXQgdmFsdWUgPSAne251bWJlcn0gcGFyYW0gLSB0aGlzIGlzIG51bWJlciBwYXJhbSc7XHJcbiAgICogbGV0IHt0eXBlVGV4dCwgcGFyYW1OYW1lLCBwYXJhbURlc2N9ID0gUGFyYW1QYXJzZXIucGFyc2VQYXJhbVZhbHVlKHZhbHVlKTtcclxuICAgKiBsZXQgcmVzdWx0ID0gUGFyYW1QYXJzZXIucGFyc2VQYXJhbSh0eXBlVGV4dCwgcGFyYW1OYW1lLCBwYXJhbURlc2MpO1xyXG4gICAqL1xyXG4gIHN0YXRpYyBwYXJzZVBhcmFtKHR5cGVUZXh0ID0gbnVsbCwgcGFyYW1OYW1lID0gbnVsbCwgcGFyYW1EZXNjID0gbnVsbCkge1xyXG4gICAgY29uc3QgcmVzdWx0ID0ge307XHJcblxyXG4gICAgaWYgKHR5cGVUZXh0KSB7XHJcbiAgICAgIC8vIGNoZWNrIG51bGxhYmxlXHJcbiAgICAgIGlmICh0eXBlVGV4dFswXSA9PT0gJz8nKSB7XHJcbiAgICAgICAgcmVzdWx0Lm51bGxhYmxlID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIGlmICh0eXBlVGV4dFswXSA9PT0gJyEnKSB7XHJcbiAgICAgICAgcmVzdWx0Lm51bGxhYmxlID0gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0Lm51bGxhYmxlID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICB0eXBlVGV4dCA9IHR5cGVUZXh0LnJlcGxhY2UoL15bPyFdL3UsICcnKTtcclxuXHJcbiAgICAgIC8vIGNoZWNrIHJlY29yZCBhbmQgdW5pb25cclxuICAgICAgaWYgKHR5cGVUZXh0WzBdID09PSAneycpIHtcclxuICAgICAgICByZXN1bHQudHlwZXMgPSBbdHlwZVRleHRdO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVUZXh0WzBdID09PSAnKCcpIHtcclxuICAgICAgICB0eXBlVGV4dCA9IHR5cGVUZXh0LnJlcGxhY2UoL15bKF0vdSwgJycpLnJlcGxhY2UoL1spXSQvdSwgJycpO1xyXG4gICAgICAgIHJlc3VsdC50eXBlcyA9IHR5cGVUZXh0LnNwbGl0KCd8Jyk7XHJcbiAgICAgIH0gZWxzZSBpZiAodHlwZVRleHQuaW5jbHVkZXMoJ3wnKSkge1xyXG4gICAgICAgIGlmICh0eXBlVGV4dC5tYXRjaCgvPC4qP1xcfC4qPz4vdSkpIHtcclxuICAgICAgICAgIC8vIHVuaW9uIGluIGdlbmVyaWNzLiBlLmcuIGBBcnJheTxzdHJpbmd8bnVtYmVyPmBcclxuICAgICAgICAgIC8vIGhhY2s6IGluIHRoaXMgY2FzZSwgcHJvY2VzcyB0aGlzIHR5cGUgaW4gRG9jQnVpbGRlciNfYnVpbGRUeXBlRG9jTGlua0hUTUxcclxuICAgICAgICAgIHJlc3VsdC50eXBlcyA9IFt0eXBlVGV4dF07XHJcbiAgICAgIH0gZWxzZSBpZiAodHlwZVRleHQubWF0Y2goL15cXC5cXC5cXC5cXCguKj9cXCkvdSkpIHtcclxuICAgICAgICAgIC8vIHVuaW9uIHdpdGggc3ByZWFkLiBlLmcuIGAuLi4oc3RyaW5nfG51bWJlcilgXHJcbiAgICAgICAgICAvLyBoYWNrOiBpbiB0aGlzIGNhc2UsIHByb2Nlc3MgdGhpcyB0eXBlIGluIERvY0J1aWxkZXIjX2J1aWxkVHlwZURvY0xpbmtIVE1MXHJcbiAgICAgICAgICByZXN1bHQudHlwZXMgPSBbdHlwZVRleHRdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQudHlwZXMgPSB0eXBlVGV4dC5zcGxpdCgnfCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHQudHlwZXMgPSBbdHlwZVRleHRdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZVRleHQuaW5kZXhPZignLi4uJykgPT09IDApIHtcclxuICAgICAgICByZXN1bHQuc3ByZWFkID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHQuc3ByZWFkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlc3VsdC50eXBlcyA9IFsnJ107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdC50eXBlcy5zb21lKCh0KSA9PiB7IHJldHVybiAhdDsgfSkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbXB0eSBUeXBlIGZvdW5kIG5hbWU9JHtwYXJhbU5hbWV9IGRlc2M9JHtwYXJhbURlc2N9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHBhcmFtTmFtZSkge1xyXG4gICAgICAvLyBjaGVjayBvcHRpb25hbFxyXG4gICAgICBpZiAocGFyYW1OYW1lWzBdID09PSAnWycpIHtcclxuICAgICAgICByZXN1bHQub3B0aW9uYWwgPSB0cnVlO1xyXG4gICAgICAgIHBhcmFtTmFtZSA9IHBhcmFtTmFtZS5yZXBsYWNlKC9eW1tdL3UsICcnKS5yZXBsYWNlKC9bXFxdXSQvdSwgJycpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdC5vcHRpb25hbCA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjaGVjayBkZWZhdWx0IHZhbHVlXHJcbiAgICAgIGNvbnN0IHBhaXIgPSBwYXJhbU5hbWUuc3BsaXQoJz0nKTtcclxuICAgICAgaWYgKHBhaXIubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgICAgcmVzdWx0LmRlZmF1bHRWYWx1ZSA9IHBhaXJbMV07XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IHJhdyA9IEpTT04ucGFyc2UocGFpclsxXSk7XHJcbiAgICAgICAgICByZXN1bHQuZGVmYXVsdFJhdyA9IHJhdztcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICByZXN1bHQuZGVmYXVsdFJhdyA9IHBhaXJbMV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXN1bHQubmFtZSA9IHBhaXJbMF0udHJpbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc3VsdC5kZXNjcmlwdGlvbiA9IHBhcmFtRGVzYztcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxufVxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNlLE1BQU1BLFdBQVcsQ0FBQztFQUMvQjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRSxPQUFPQyxlQUFlQSxDQUFDQyxLQUFLLEVBQXlDO0lBQUEsSUFBdkNDLElBQUksR0FBQUMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsSUFBSTtJQUFBLElBQUVHLElBQUksR0FBQUgsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsSUFBSTtJQUFBLElBQUVJLElBQUksR0FBQUosU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsSUFBSTtJQUNqRUYsS0FBSyxHQUFHQSxLQUFLLENBQUNPLElBQUksQ0FBQyxDQUFDO0lBRXBCLElBQUlDLEtBQUssR0FBRyxFQUFFO0lBQ2QsSUFBSUMsUUFBUSxHQUFHLElBQUk7SUFDbkIsSUFBSUMsU0FBUyxHQUFHLElBQUk7SUFDcEIsSUFBSUMsU0FBUyxHQUFHLElBQUk7O0lBRXBCO0lBQ0EsSUFBSVYsSUFBSSxFQUFFO01BQ1IsSUFBTVcsR0FBRyxHQUFHLDJOQUF1QixDQUFDLENBQUM7TUFDckNKLEtBQUssR0FBR1IsS0FBSyxDQUFDUSxLQUFLLENBQUNJLEdBQUcsQ0FBQztNQUN4QixJQUFJSixLQUFLLEVBQUU7UUFDVEMsUUFBUSxHQUFHRCxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ25CUixLQUFLLEdBQUdBLEtBQUssQ0FBQ2EsT0FBTyxDQUFDRCxHQUFHLEVBQUUsRUFBRSxDQUFDO01BQ2hDLENBQUMsTUFBTTtRQUNMSCxRQUFRLEdBQUcsR0FBRztNQUNoQjtJQUNGOztJQUVBO0lBQ0EsSUFBSUosSUFBSSxFQUFFO01BQ1IsSUFBSUwsS0FBSyxDQUFDYyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1FBQzNCSixTQUFTLEdBQUcsRUFBRTtRQUNkLElBQUlLLE9BQU8sR0FBRyxDQUFDO1FBQ2YsS0FBSyxJQUFNQyxDQUFDLElBQUloQixLQUFLLEVBQUU7VUFDckJVLFNBQVMsSUFBSU0sQ0FBQztVQUNkLElBQUlBLENBQUMsS0FBSyxHQUFHLEVBQUVELE9BQU8sRUFBRTtVQUN4QixJQUFJQyxDQUFDLEtBQUssR0FBRyxFQUFFRCxPQUFPLEVBQUU7VUFDeEIsSUFBSUEsT0FBTyxLQUFLLENBQUMsRUFBRTtRQUNyQjtRQUVBLElBQUlMLFNBQVMsRUFBRTtVQUNiVixLQUFLLEdBQUdBLEtBQUssQ0FBQ2lCLE1BQU0sQ0FBQ1AsU0FBUyxDQUFDUCxNQUFNLENBQUMsQ0FBQ0ksSUFBSSxDQUFDLENBQUM7UUFDL0M7TUFDRixDQUFDLE1BQU07UUFDTEMsS0FBSyxHQUFHUixLQUFLLENBQUNRLEtBQUssQ0FBQyw2UEFBUyxDQUFDO1FBQzlCLElBQUlBLEtBQUssRUFBRTtVQUNURSxTQUFTLEdBQUdGLEtBQUssQ0FBQyxDQUFDLENBQUM7VUFDcEJSLEtBQUssR0FBR0EsS0FBSyxDQUFDYSxPQUFPLENBQUMsK1RBQVUsRUFBRSxFQUFFLENBQUM7UUFDdkM7TUFDRjtJQUNGOztJQUVBO0lBQ0EsSUFBSVAsSUFBSSxFQUFFO01BQ1JLLFNBQVMsR0FBS1gsS0FBSyxDQUFDa0IsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHbEIsS0FBSyxDQUFDbUIsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDQyxTQUFTLENBQUMsQ0FBQyxHQUFHcEIsS0FBTztJQUNoRjtJQUVBLElBQUksRUFBRVMsUUFBUSxJQUFJQyxTQUFTLElBQUlDLFNBQVMsQ0FBRSxFQUFHO01BQ3pDVSxPQUFPLENBQUNDLEtBQUsseUVBQUFDLE1BQUEsQ0FBcUV2QixLQUFLLGNBQU8sQ0FBQztNQUMvRixNQUFNLElBQUl3QixLQUFLLGlFQUFBRCxNQUFBLENBQWdFdkIsS0FBSyxPQUFHLENBQUM7SUFDNUY7SUFFQSxPQUFPO01BQUNTLFFBQVE7TUFBRUMsU0FBUztNQUFFQztJQUFTLENBQUM7RUFDekM7O0VBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0UsT0FBT2MsVUFBVUEsQ0FBQSxFQUFzRDtJQUFBLElBQXJEaEIsUUFBUSxHQUFBUCxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFJO0lBQUEsSUFBRVEsU0FBUyxHQUFBUixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFJO0lBQUEsSUFBRVMsU0FBUyxHQUFBVCxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFJO0lBQ25FLElBQU13QixNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRWpCLElBQUlqQixRQUFRLEVBQUU7TUFDWjtNQUNBLElBQUlBLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7UUFDdkJpQixNQUFNLENBQUNDLFFBQVEsR0FBRyxJQUFJO01BQ3hCLENBQUMsTUFBTSxJQUFJbEIsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtRQUM5QmlCLE1BQU0sQ0FBQ0MsUUFBUSxHQUFHLEtBQUs7TUFDekIsQ0FBQyxNQUFNO1FBQ0xELE1BQU0sQ0FBQ0MsUUFBUSxHQUFHLElBQUk7TUFDeEI7TUFDQWxCLFFBQVEsR0FBR0EsUUFBUSxDQUFDSSxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQzs7TUFFekM7TUFDQSxJQUFJSixRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1FBQ3ZCaUIsTUFBTSxDQUFDRSxLQUFLLEdBQUcsQ0FBQ25CLFFBQVEsQ0FBQztNQUMzQixDQUFDLE1BQU0sSUFBSUEsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtRQUM5QkEsUUFBUSxHQUFHQSxRQUFRLENBQUNJLE9BQU8sQ0FBQyxLQUFPLEVBQUUsRUFBRSxDQUFDLENBQUNBLE9BQU8sQ0FBQyxLQUFPLEVBQUUsRUFBRSxDQUFDO1FBQzdEYSxNQUFNLENBQUNFLEtBQUssR0FBR25CLFFBQVEsQ0FBQ29CLEtBQUssQ0FBQyxHQUFHLENBQUM7TUFDcEMsQ0FBQyxNQUFNLElBQUlwQixRQUFRLENBQUNxQixRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDakMsSUFBSXJCLFFBQVEsQ0FBQ0QsS0FBSyxDQUFDLHNVQUFhLENBQUMsRUFBRTtVQUNqQztVQUNBO1VBQ0FrQixNQUFNLENBQUNFLEtBQUssR0FBRyxDQUFDbkIsUUFBUSxDQUFDO1FBQzdCLENBQUMsTUFBTSxJQUFJQSxRQUFRLENBQUNELEtBQUssQ0FBQyw2S0FBaUIsQ0FBQyxFQUFFO1VBQzFDO1VBQ0E7VUFDQWtCLE1BQU0sQ0FBQ0UsS0FBSyxHQUFHLENBQUNuQixRQUFRLENBQUM7UUFDM0IsQ0FBQyxNQUFNO1VBQ0xpQixNQUFNLENBQUNFLEtBQUssR0FBR25CLFFBQVEsQ0FBQ29CLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDcEM7TUFDRixDQUFDLE1BQU07UUFDTEgsTUFBTSxDQUFDRSxLQUFLLEdBQUcsQ0FBQ25CLFFBQVEsQ0FBQztNQUMzQjtNQUVBLElBQUlBLFFBQVEsQ0FBQ3NCLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDakNMLE1BQU0sQ0FBQ00sTUFBTSxHQUFHLElBQUk7TUFDdEIsQ0FBQyxNQUFNO1FBQ0xOLE1BQU0sQ0FBQ00sTUFBTSxHQUFHLEtBQUs7TUFDdkI7SUFDRixDQUFDLE1BQU07TUFDTE4sTUFBTSxDQUFDRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDckI7SUFFQSxJQUFJRixNQUFNLENBQUNFLEtBQUssQ0FBQ0ssSUFBSSxDQUFFQyxDQUFDLElBQUs7TUFBRSxPQUFPLENBQUNBLENBQUM7SUFBRSxDQUFDLENBQUMsRUFBRTtNQUM1QyxNQUFNLElBQUlWLEtBQUssMEJBQUFELE1BQUEsQ0FBMEJiLFNBQVMsWUFBQWEsTUFBQSxDQUFTWixTQUFTLENBQUUsQ0FBQztJQUN6RTtJQUVBLElBQUlELFNBQVMsRUFBRTtNQUNiO01BQ0EsSUFBSUEsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtRQUN4QmdCLE1BQU0sQ0FBQ1MsUUFBUSxHQUFHLElBQUk7UUFDdEJ6QixTQUFTLEdBQUdBLFNBQVMsQ0FBQ0csT0FBTyxDQUFDLEtBQU8sRUFBRSxFQUFFLENBQUMsQ0FBQ0EsT0FBTyxDQUFDLEtBQVEsRUFBRSxFQUFFLENBQUM7TUFDbEUsQ0FBQyxNQUFNO1FBQ0xhLE1BQU0sQ0FBQ1MsUUFBUSxHQUFHLEtBQUs7TUFDekI7O01BRUE7TUFDQSxJQUFNQyxJQUFJLEdBQUcxQixTQUFTLENBQUNtQixLQUFLLENBQUMsR0FBRyxDQUFDO01BQ2pDLElBQUlPLElBQUksQ0FBQ2pDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDckJ1QixNQUFNLENBQUNXLFlBQVksR0FBR0QsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM3QixJQUFJO1VBQ0YsSUFBTUUsR0FBRyxHQUFHQyxJQUFJLENBQUNDLEtBQUssQ0FBQ0osSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1VBQy9CVixNQUFNLENBQUNlLFVBQVUsR0FBR0gsR0FBRztRQUN6QixDQUFDLENBQUMsT0FBT0ksQ0FBQyxFQUFFO1VBQ1ZoQixNQUFNLENBQUNlLFVBQVUsR0FBR0wsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM3QjtNQUNGO01BRUFWLE1BQU0sQ0FBQ3JCLElBQUksR0FBRytCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzdCLElBQUksQ0FBQyxDQUFDO0lBQzlCO0lBRUFtQixNQUFNLENBQUNpQixXQUFXLEdBQUdoQyxTQUFTO0lBRTlCLE9BQU9lLE1BQU07RUFDZjtBQUNGO0FBQUNrQixPQUFBLENBQUFDLE9BQUEsR0FBQS9DLFdBQUEifQ==