\n !nameHasComments || n.attributes.length) && !lastAttrHasTrailingComments; // We should print the opening element expanded if any prop value is a\n // string literal with newlines\n\n const shouldBreak = n.attributes && n.attributes.some(attr => attr.value && isStringLiteral$1(attr.value) && attr.value.value.includes(\"\\n\"));\n return group$b(concat$d([\"<\", path.call(print, \"name\"), path.call(print, \"typeParameters\"), concat$d([indent$7(concat$d(path.map(attr => concat$d([line$9, print(attr)]), \"attributes\"))), n.selfClosing ? line$9 : bracketSameLine ? \">\" : softline$6]), n.selfClosing ? \"/>\" : bracketSameLine ? \"\" : \">\"]), {\n shouldBreak\n });\n }\n\n case \"JSXClosingElement\":\n return concat$d([\"\", path.call(print, \"name\"), \">\"]);\n\n case \"JSXOpeningFragment\":\n case \"JSXClosingFragment\":\n {\n const hasComment = n.comments && n.comments.length;\n const hasOwnLineComment = hasComment && !n.comments.every(comments$1.isBlockComment);\n const isOpeningFragment = n.type === \"JSXOpeningFragment\";\n return concat$d([isOpeningFragment ? \"<\" : \"\", indent$7(concat$d([hasOwnLineComment ? hardline$9 : hasComment && !isOpeningFragment ? \" \" : \"\", comments.printDanglingComments(path, options, true)])), hasOwnLineComment ? hardline$9 : \"\", \">\"]);\n }\n\n case \"JSXText\":\n /* istanbul ignore next */\n throw new Error(\"JSXTest should be handled by JSXElement\");\n\n case \"JSXEmptyExpression\":\n {\n const requiresHardline = n.comments && !n.comments.every(comments$1.isBlockComment);\n return concat$d([comments.printDanglingComments(path, options,\n /* sameIndent */\n !requiresHardline), requiresHardline ? hardline$9 : \"\"]);\n }\n\n case \"ClassBody\":\n if (!n.comments && n.body.length === 0) {\n return \"{}\";\n }\n\n return concat$d([\"{\", n.body.length > 0 ? indent$7(concat$d([hardline$9, path.call(bodyPath => {\n return printStatementSequence(bodyPath, options, print);\n }, \"body\")])) : comments.printDanglingComments(path, options), hardline$9, \"}\"]);\n\n case \"ClassProperty\":\n case \"TSAbstractClassProperty\":\n case \"ClassPrivateProperty\":\n {\n if (n.decorators && n.decorators.length !== 0) {\n parts.push(printDecorators(path, options, print));\n }\n\n if (n.accessibility) {\n parts.push(n.accessibility + \" \");\n }\n\n if (n.declare) {\n parts.push(\"declare \");\n }\n\n if (n.static) {\n parts.push(\"static \");\n }\n\n if (n.type === \"TSAbstractClassProperty\" || n.abstract) {\n parts.push(\"abstract \");\n }\n\n if (n.readonly) {\n parts.push(\"readonly \");\n }\n\n const variance = getFlowVariance$1(n);\n\n if (variance) {\n parts.push(variance);\n }\n\n parts.push(printPropertyKey(path, options, print), printOptionalToken(path), printTypeAnnotation(path, options, print));\n\n if (n.value) {\n parts.push(\" =\", printAssignmentRight(n.key, n.value, path.call(print, \"value\"), options));\n }\n\n parts.push(semi);\n return group$b(concat$d(parts));\n }\n\n case \"ClassDeclaration\":\n case \"ClassExpression\":\n if (n.declare) {\n parts.push(\"declare \");\n }\n\n parts.push(concat$d(printClass(path, options, print)));\n return concat$d(parts);\n\n case \"TSInterfaceHeritage\":\n case \"TSExpressionWithTypeArguments\":\n // Babel AST\n parts.push(path.call(print, \"expression\"));\n\n if (n.typeParameters) {\n parts.push(path.call(print, \"typeParameters\"));\n }\n\n return concat$d(parts);\n\n case \"TemplateElement\":\n return join$9(literalline$4, n.value.raw.split(/\\r?\\n/g));\n\n case \"TemplateLiteral\":\n {\n let expressions = path.map(print, \"expressions\");\n const parentNode = path.getParentNode();\n\n if (isJestEachTemplateLiteral$1(n, parentNode)) {\n const printed = printJestEachTemplateLiteral(n, expressions, options);\n\n if (printed) {\n return printed;\n }\n }\n\n const isSimple = isSimpleTemplateLiteral$1(n);\n\n if (isSimple) {\n expressions = expressions.map(doc => printDocToString$2(doc, Object.assign({}, options, {\n printWidth: Infinity\n })).formatted);\n }\n\n parts.push(lineSuffixBoundary$1, \"`\");\n path.each(childPath => {\n const i = childPath.getName();\n parts.push(print(childPath));\n\n if (i < expressions.length) {\n // For a template literal of the following form:\n // `someQuery {\n // ${call({\n // a,\n // b,\n // })}\n // }`\n // the expression is on its own line (there is a \\n in the previous\n // quasi literal), therefore we want to indent the JavaScript\n // expression inside at the beginning of ${ instead of the beginning\n // of the `.\n const {\n tabWidth\n } = options;\n const quasi = childPath.getValue();\n const indentSize = getIndentSize$2(quasi.value.raw, tabWidth);\n let printed = expressions[i];\n\n if (!isSimple) {\n // Breaks at the template element boundaries (${ and }) are preferred to breaking\n // in the middle of a MemberExpression\n if (n.expressions[i].comments && n.expressions[i].comments.length || n.expressions[i].type === \"MemberExpression\" || n.expressions[i].type === \"OptionalMemberExpression\" || n.expressions[i].type === \"ConditionalExpression\" || n.expressions[i].type === \"SequenceExpression\" || n.expressions[i].type === \"TSAsExpression\" || isBinaryish$1(n.expressions[i])) {\n printed = concat$d([indent$7(concat$d([softline$6, printed])), softline$6]);\n }\n }\n\n const aligned = indentSize === 0 && quasi.value.raw.endsWith(\"\\n\") ? align$1(-Infinity, printed) : addAlignmentToDoc$2(printed, indentSize, tabWidth);\n parts.push(group$b(concat$d([\"${\", aligned, lineSuffixBoundary$1, \"}\"])));\n }\n }, \"quasis\");\n parts.push(\"`\");\n return concat$d(parts);\n }\n // These types are unprintable because they serve as abstract\n // supertypes for other (printable) types.\n\n case \"TaggedTemplateExpression\":\n return concat$d([path.call(print, \"tag\"), path.call(print, \"typeParameters\"), path.call(print, \"quasi\")]);\n\n case \"Node\":\n case \"Printable\":\n case \"SourceLocation\":\n case \"Position\":\n case \"Statement\":\n case \"Function\":\n case \"Pattern\":\n case \"Expression\":\n case \"Declaration\":\n case \"Specifier\":\n case \"NamedSpecifier\":\n case \"Comment\":\n case \"MemberTypeAnnotation\": // Flow\n\n case \"Type\":\n /* istanbul ignore next */\n throw new Error(\"unprintable type: \" + JSON.stringify(n.type));\n // Type Annotations for Facebook Flow, typically stripped out or\n // transformed away before printing.\n\n case \"TypeAnnotation\":\n case \"TSTypeAnnotation\":\n if (n.typeAnnotation) {\n return path.call(print, \"typeAnnotation\");\n }\n /* istanbul ignore next */\n\n\n return \"\";\n\n case \"TSTupleType\":\n case \"TupleTypeAnnotation\":\n {\n const typesField = n.type === \"TSTupleType\" ? \"elementTypes\" : \"types\";\n const hasRest = n[typesField].length > 0 && getLast$3(n[typesField]).type === \"TSRestType\";\n return group$b(concat$d([\"[\", indent$7(concat$d([softline$6, printArrayItems(path, options, typesField, print)])), ifBreak$6(shouldPrintComma$1(options, \"all\") && !hasRest ? \",\" : \"\"), comments.printDanglingComments(path, options,\n /* sameIndent */\n true), softline$6, \"]\"]));\n }\n\n case \"ExistsTypeAnnotation\":\n return \"*\";\n\n case \"EmptyTypeAnnotation\":\n return \"empty\";\n\n case \"AnyTypeAnnotation\":\n return \"any\";\n\n case \"MixedTypeAnnotation\":\n return \"mixed\";\n\n case \"ArrayTypeAnnotation\":\n return concat$d([path.call(print, \"elementType\"), \"[]\"]);\n\n case \"BooleanTypeAnnotation\":\n return \"boolean\";\n\n case \"BooleanLiteralTypeAnnotation\":\n return \"\" + n.value;\n\n case \"DeclareClass\":\n return printFlowDeclaration(path, printClass(path, options, print));\n\n case \"TSDeclareFunction\":\n // For TypeScript the TSDeclareFunction node shares the AST\n // structure with FunctionDeclaration\n return concat$d([n.declare ? \"declare \" : \"\", printFunctionDeclaration(path, print, options), semi]);\n\n case \"DeclareFunction\":\n return printFlowDeclaration(path, [\"function \", path.call(print, \"id\"), n.predicate ? \" \" : \"\", path.call(print, \"predicate\"), semi]);\n\n case \"DeclareModule\":\n return printFlowDeclaration(path, [\"module \", path.call(print, \"id\"), \" \", path.call(print, \"body\")]);\n\n case \"DeclareModuleExports\":\n return printFlowDeclaration(path, [\"module.exports\", \": \", path.call(print, \"typeAnnotation\"), semi]);\n\n case \"DeclareVariable\":\n return printFlowDeclaration(path, [\"var \", path.call(print, \"id\"), semi]);\n\n case \"DeclareExportAllDeclaration\":\n return concat$d([\"declare export * from \", path.call(print, \"source\")]);\n\n case \"DeclareExportDeclaration\":\n return concat$d([\"declare \", printExportDeclaration(path, options, print)]);\n\n case \"DeclareOpaqueType\":\n case \"OpaqueType\":\n {\n parts.push(\"opaque type \", path.call(print, \"id\"), path.call(print, \"typeParameters\"));\n\n if (n.supertype) {\n parts.push(\": \", path.call(print, \"supertype\"));\n }\n\n if (n.impltype) {\n parts.push(\" = \", path.call(print, \"impltype\"));\n }\n\n parts.push(semi);\n\n if (n.type === \"DeclareOpaqueType\") {\n return printFlowDeclaration(path, parts);\n }\n\n return concat$d(parts);\n }\n\n case \"EnumDeclaration\":\n return concat$d([\"enum \", path.call(print, \"id\"), \" \", path.call(print, \"body\")]);\n\n case \"EnumBooleanBody\":\n case \"EnumNumberBody\":\n case \"EnumStringBody\":\n case \"EnumSymbolBody\":\n {\n if (n.type === \"EnumSymbolBody\" || n.explicitType) {\n let type = null;\n\n switch (n.type) {\n case \"EnumBooleanBody\":\n type = \"boolean\";\n break;\n\n case \"EnumNumberBody\":\n type = \"number\";\n break;\n\n case \"EnumStringBody\":\n type = \"string\";\n break;\n\n case \"EnumSymbolBody\":\n type = \"symbol\";\n break;\n }\n\n parts.push(\"of \", type, \" \");\n }\n\n if (n.members.length === 0) {\n parts.push(group$b(concat$d([\"{\", comments.printDanglingComments(path, options), softline$6, \"}\"])));\n } else {\n parts.push(group$b(concat$d([\"{\", indent$7(concat$d([hardline$9, printArrayItems(path, options, \"members\", print), shouldPrintComma$1(options) ? \",\" : \"\"])), comments.printDanglingComments(path, options,\n /* sameIndent */\n true), hardline$9, \"}\"])));\n }\n\n return concat$d(parts);\n }\n\n case \"EnumBooleanMember\":\n case \"EnumNumberMember\":\n case \"EnumStringMember\":\n return concat$d([path.call(print, \"id\"), \" = \", typeof n.init === \"object\" ? path.call(print, \"init\") : String(n.init)]);\n\n case \"EnumDefaultedMember\":\n return path.call(print, \"id\");\n\n case \"FunctionTypeAnnotation\":\n case \"TSFunctionType\":\n {\n // FunctionTypeAnnotation is ambiguous:\n // declare function foo(a: B): void; OR\n // var A: (a: B) => void;\n const parent = path.getParentNode(0);\n const parentParent = path.getParentNode(1);\n const parentParentParent = path.getParentNode(2);\n let isArrowFunctionTypeAnnotation = n.type === \"TSFunctionType\" || !((parent.type === \"ObjectTypeProperty\" || parent.type === \"ObjectTypeInternalSlot\") && !getFlowVariance$1(parent) && !parent.optional && options.locStart(parent) === options.locStart(n) || parent.type === \"ObjectTypeCallProperty\" || parentParentParent && parentParentParent.type === \"DeclareFunction\");\n let needsColon = isArrowFunctionTypeAnnotation && (parent.type === \"TypeAnnotation\" || parent.type === \"TSTypeAnnotation\"); // Sadly we can't put it inside of FastPath::needsColon because we are\n // printing \":\" as part of the expression and it would put parenthesis\n // around :(\n\n const needsParens = needsColon && isArrowFunctionTypeAnnotation && (parent.type === \"TypeAnnotation\" || parent.type === \"TSTypeAnnotation\") && parentParent.type === \"ArrowFunctionExpression\";\n\n if (isObjectTypePropertyAFunction$1(parent, options)) {\n isArrowFunctionTypeAnnotation = true;\n needsColon = true;\n }\n\n if (needsParens) {\n parts.push(\"(\");\n }\n\n parts.push(printFunctionParams(path, print, options,\n /* expandArg */\n false,\n /* printTypeParams */\n true)); // The returnType is not wrapped in a TypeAnnotation, so the colon\n // needs to be added separately.\n\n if (n.returnType || n.predicate || n.typeAnnotation) {\n parts.push(isArrowFunctionTypeAnnotation ? \" => \" : \": \", path.call(print, \"returnType\"), path.call(print, \"predicate\"), path.call(print, \"typeAnnotation\"));\n }\n\n if (needsParens) {\n parts.push(\")\");\n }\n\n return group$b(concat$d(parts));\n }\n\n case \"TSRestType\":\n return concat$d([\"...\", path.call(print, \"typeAnnotation\")]);\n\n case \"TSOptionalType\":\n return concat$d([path.call(print, \"typeAnnotation\"), \"?\"]);\n\n case \"FunctionTypeParam\":\n return concat$d([path.call(print, \"name\"), printOptionalToken(path), n.name ? \": \" : \"\", path.call(print, \"typeAnnotation\")]);\n\n case \"GenericTypeAnnotation\":\n return concat$d([path.call(print, \"id\"), path.call(print, \"typeParameters\")]);\n\n case \"DeclareInterface\":\n case \"InterfaceDeclaration\":\n case \"InterfaceTypeAnnotation\":\n {\n if (n.type === \"DeclareInterface\" || n.declare) {\n parts.push(\"declare \");\n }\n\n parts.push(\"interface\");\n\n if (n.type === \"DeclareInterface\" || n.type === \"InterfaceDeclaration\") {\n parts.push(\" \", path.call(print, \"id\"), path.call(print, \"typeParameters\"));\n }\n\n if (n.extends.length > 0) {\n parts.push(group$b(indent$7(concat$d([line$9, \"extends \", (n.extends.length === 1 ? identity$2 : indent$7)(join$9(concat$d([\",\", line$9]), path.map(print, \"extends\")))]))));\n }\n\n parts.push(\" \", path.call(print, \"body\"));\n return group$b(concat$d(parts));\n }\n\n case \"ClassImplements\":\n case \"InterfaceExtends\":\n return concat$d([path.call(print, \"id\"), path.call(print, \"typeParameters\")]);\n\n case \"TSClassImplements\":\n return concat$d([path.call(print, \"expression\"), path.call(print, \"typeParameters\")]);\n\n case \"TSIntersectionType\":\n case \"IntersectionTypeAnnotation\":\n {\n const types = path.map(print, \"types\");\n const result = [];\n let wasIndented = false;\n\n for (let i = 0; i < types.length; ++i) {\n if (i === 0) {\n result.push(types[i]);\n } else if (isObjectType$1(n.types[i - 1]) && isObjectType$1(n.types[i])) {\n // If both are objects, don't indent\n result.push(concat$d([\" & \", wasIndented ? indent$7(types[i]) : types[i]]));\n } else if (!isObjectType$1(n.types[i - 1]) && !isObjectType$1(n.types[i])) {\n // If no object is involved, go to the next line if it breaks\n result.push(indent$7(concat$d([\" &\", line$9, types[i]])));\n } else {\n // If you go from object to non-object or vis-versa, then inline it\n if (i > 1) {\n wasIndented = true;\n }\n\n result.push(\" & \", i > 1 ? indent$7(types[i]) : types[i]);\n }\n }\n\n return group$b(concat$d(result));\n }\n\n case \"TSUnionType\":\n case \"UnionTypeAnnotation\":\n {\n // single-line variation\n // A | B | C\n // multi-line variation\n // | A\n // | B\n // | C\n const parent = path.getParentNode(); // If there's a leading comment, the parent is doing the indentation\n\n const shouldIndent = parent.type !== \"TypeParameterInstantiation\" && parent.type !== \"TSTypeParameterInstantiation\" && parent.type !== \"GenericTypeAnnotation\" && parent.type !== \"TSTypeReference\" && parent.type !== \"TSTypeAssertion\" && parent.type !== \"TupleTypeAnnotation\" && parent.type !== \"TSTupleType\" && !(parent.type === \"FunctionTypeParam\" && !parent.name) && !((parent.type === \"TypeAlias\" || parent.type === \"VariableDeclarator\" || parent.type === \"TSTypeAliasDeclaration\") && hasLeadingOwnLineComment$1(options.originalText, n, options)); // {\n // a: string\n // } | null | void\n // should be inlined and not be printed in the multi-line variant\n\n const shouldHug = shouldHugType(n); // We want to align the children but without its comment, so it looks like\n // | child1\n // // comment\n // | child2\n\n const printed = path.map(typePath => {\n let printedType = typePath.call(print);\n\n if (!shouldHug) {\n printedType = align$1(2, printedType);\n }\n\n return comments.printComments(typePath, () => printedType, options);\n }, \"types\");\n\n if (shouldHug) {\n return join$9(\" | \", printed);\n }\n\n const shouldAddStartLine = shouldIndent && !hasLeadingOwnLineComment$1(options.originalText, n, options);\n const code = concat$d([ifBreak$6(concat$d([shouldAddStartLine ? line$9 : \"\", \"| \"])), join$9(concat$d([line$9, \"| \"]), printed)]);\n\n if (needsParens_1(path, options)) {\n return group$b(concat$d([indent$7(code), softline$6]));\n }\n\n if (parent.type === \"TupleTypeAnnotation\" && parent.types.length > 1 || parent.type === \"TSTupleType\" && parent.elementTypes.length > 1) {\n return group$b(concat$d([indent$7(concat$d([ifBreak$6(concat$d([\"(\", softline$6])), code])), softline$6, ifBreak$6(\")\")]));\n }\n\n return group$b(shouldIndent ? indent$7(code) : code);\n }\n\n case \"NullableTypeAnnotation\":\n return concat$d([\"?\", path.call(print, \"typeAnnotation\")]);\n\n case \"TSNullKeyword\":\n case \"NullLiteralTypeAnnotation\":\n return \"null\";\n\n case \"ThisTypeAnnotation\":\n return \"this\";\n\n case \"NumberTypeAnnotation\":\n return \"number\";\n\n case \"SymbolTypeAnnotation\":\n return \"symbol\";\n\n case \"ObjectTypeCallProperty\":\n if (n.static) {\n parts.push(\"static \");\n }\n\n parts.push(path.call(print, \"value\"));\n return concat$d(parts);\n\n case \"ObjectTypeIndexer\":\n {\n const variance = getFlowVariance$1(n);\n return concat$d([variance || \"\", \"[\", path.call(print, \"id\"), n.id ? \": \" : \"\", path.call(print, \"key\"), \"]: \", path.call(print, \"value\")]);\n }\n\n case \"ObjectTypeProperty\":\n {\n const variance = getFlowVariance$1(n);\n let modifier = \"\";\n\n if (n.proto) {\n modifier = \"proto \";\n } else if (n.static) {\n modifier = \"static \";\n }\n\n return concat$d([modifier, isGetterOrSetter$1(n) ? n.kind + \" \" : \"\", variance || \"\", printPropertyKey(path, options, print), printOptionalToken(path), isFunctionNotation$1(n, options) ? \"\" : \": \", path.call(print, \"value\")]);\n }\n\n case \"QualifiedTypeIdentifier\":\n return concat$d([path.call(print, \"qualification\"), \".\", path.call(print, \"id\")]);\n\n case \"StringLiteralTypeAnnotation\":\n return nodeStr(n, options);\n\n case \"NumberLiteralTypeAnnotation\":\n assert.strictEqual(typeof n.value, \"number\");\n\n if (n.extra != null) {\n return printNumber$2(n.extra.raw);\n }\n\n return printNumber$2(n.raw);\n\n case \"StringTypeAnnotation\":\n return \"string\";\n\n case \"DeclareTypeAlias\":\n case \"TypeAlias\":\n {\n if (n.type === \"DeclareTypeAlias\" || n.declare) {\n parts.push(\"declare \");\n }\n\n const printed = printAssignmentRight(n.id, n.right, path.call(print, \"right\"), options);\n parts.push(\"type \", path.call(print, \"id\"), path.call(print, \"typeParameters\"), \" =\", printed, semi);\n return group$b(concat$d(parts));\n }\n\n case \"TypeCastExpression\":\n {\n return concat$d([\"(\", path.call(print, \"expression\"), printTypeAnnotation(path, options, print), \")\"]);\n }\n\n case \"TypeParameterDeclaration\":\n case \"TypeParameterInstantiation\":\n {\n const value = path.getValue();\n const commentStart = value.range ? options.originalText.slice(0, value.range[0]).lastIndexOf(\"/*\") : -1; // As noted in the TypeCastExpression comments above, we're able to use a normal whitespace regex here\n // because we know for sure that this is a type definition.\n\n const commentSyntax = commentStart >= 0 && options.originalText.slice(commentStart).match(/^\\/\\*\\s*::/);\n\n if (commentSyntax) {\n return concat$d([\"/*:: \", printTypeParameters(path, options, print, \"params\"), \" */\"]);\n }\n\n return printTypeParameters(path, options, print, \"params\");\n }\n\n case \"TSTypeParameterDeclaration\":\n case \"TSTypeParameterInstantiation\":\n return printTypeParameters(path, options, print, \"params\");\n\n case \"TSTypeParameter\":\n case \"TypeParameter\":\n {\n const parent = path.getParentNode();\n\n if (parent.type === \"TSMappedType\") {\n parts.push(\"[\", path.call(print, \"name\"));\n\n if (n.constraint) {\n parts.push(\" in \", path.call(print, \"constraint\"));\n }\n\n parts.push(\"]\");\n return concat$d(parts);\n }\n\n const variance = getFlowVariance$1(n);\n\n if (variance) {\n parts.push(variance);\n }\n\n parts.push(path.call(print, \"name\"));\n\n if (n.bound) {\n parts.push(\": \");\n parts.push(path.call(print, \"bound\"));\n }\n\n if (n.constraint) {\n parts.push(\" extends \", path.call(print, \"constraint\"));\n }\n\n if (n.default) {\n parts.push(\" = \", path.call(print, \"default\"));\n } // Keep comma if the file extension is .tsx and\n // has one type parameter that isn't extend with any types.\n // Because, otherwise formatted result will be invalid as tsx.\n\n\n const grandParent = path.getNode(2);\n\n if (parent.params && parent.params.length === 1 && isTSXFile$1(options) && !n.constraint && grandParent.type === \"ArrowFunctionExpression\") {\n parts.push(\",\");\n }\n\n return concat$d(parts);\n }\n\n case \"TypeofTypeAnnotation\":\n return concat$d([\"typeof \", path.call(print, \"argument\")]);\n\n case \"VoidTypeAnnotation\":\n return \"void\";\n\n case \"InferredPredicate\":\n return \"%checks\";\n // Unhandled types below. If encountered, nodes of these types should\n // be either left alone or desugared into AST types that are fully\n // supported by the pretty-printer.\n\n case \"DeclaredPredicate\":\n return concat$d([\"%checks(\", path.call(print, \"value\"), \")\"]);\n\n case \"TSAbstractKeyword\":\n return \"abstract\";\n\n case \"TSAnyKeyword\":\n return \"any\";\n\n case \"TSAsyncKeyword\":\n return \"async\";\n\n case \"TSBooleanKeyword\":\n return \"boolean\";\n\n case \"TSBigIntKeyword\":\n return \"bigint\";\n\n case \"TSConstKeyword\":\n return \"const\";\n\n case \"TSDeclareKeyword\":\n return \"declare\";\n\n case \"TSExportKeyword\":\n return \"export\";\n\n case \"TSNeverKeyword\":\n return \"never\";\n\n case \"TSNumberKeyword\":\n return \"number\";\n\n case \"TSObjectKeyword\":\n return \"object\";\n\n case \"TSProtectedKeyword\":\n return \"protected\";\n\n case \"TSPrivateKeyword\":\n return \"private\";\n\n case \"TSPublicKeyword\":\n return \"public\";\n\n case \"TSReadonlyKeyword\":\n return \"readonly\";\n\n case \"TSSymbolKeyword\":\n return \"symbol\";\n\n case \"TSStaticKeyword\":\n return \"static\";\n\n case \"TSStringKeyword\":\n return \"string\";\n\n case \"TSUndefinedKeyword\":\n return \"undefined\";\n\n case \"TSUnknownKeyword\":\n return \"unknown\";\n\n case \"TSVoidKeyword\":\n return \"void\";\n\n case \"TSAsExpression\":\n return concat$d([path.call(print, \"expression\"), \" as \", path.call(print, \"typeAnnotation\")]);\n\n case \"TSArrayType\":\n return concat$d([path.call(print, \"elementType\"), \"[]\"]);\n\n case \"TSPropertySignature\":\n {\n if (n.export) {\n parts.push(\"export \");\n }\n\n if (n.accessibility) {\n parts.push(n.accessibility + \" \");\n }\n\n if (n.static) {\n parts.push(\"static \");\n }\n\n if (n.readonly) {\n parts.push(\"readonly \");\n }\n\n parts.push(printPropertyKey(path, options, print), printOptionalToken(path));\n\n if (n.typeAnnotation) {\n parts.push(\": \");\n parts.push(path.call(print, \"typeAnnotation\"));\n } // This isn't valid semantically, but it's in the AST so we can print it.\n\n\n if (n.initializer) {\n parts.push(\" = \", path.call(print, \"initializer\"));\n }\n\n return concat$d(parts);\n }\n\n case \"TSParameterProperty\":\n if (n.accessibility) {\n parts.push(n.accessibility + \" \");\n }\n\n if (n.export) {\n parts.push(\"export \");\n }\n\n if (n.static) {\n parts.push(\"static \");\n }\n\n if (n.readonly) {\n parts.push(\"readonly \");\n }\n\n parts.push(path.call(print, \"parameter\"));\n return concat$d(parts);\n\n case \"TSTypeReference\":\n return concat$d([path.call(print, \"typeName\"), printTypeParameters(path, options, print, \"typeParameters\")]);\n\n case \"TSTypeQuery\":\n return concat$d([\"typeof \", path.call(print, \"exprName\")]);\n\n case \"TSIndexSignature\":\n {\n const parent = path.getParentNode(); // The typescript parser accepts multiple parameters here. If you're\n // using them, it makes sense to have a trailing comma. But if you\n // aren't, this is more like a computed property name than an array.\n // So we leave off the trailing comma when there's just one parameter.\n\n const trailingComma = n.parameters.length > 1 ? ifBreak$6(shouldPrintComma$1(options) ? \",\" : \"\") : \"\";\n const parametersGroup = group$b(concat$d([indent$7(concat$d([softline$6, join$9(concat$d([\", \", softline$6]), path.map(print, \"parameters\"))])), trailingComma, softline$6]));\n return concat$d([n.export ? \"export \" : \"\", n.accessibility ? concat$d([n.accessibility, \" \"]) : \"\", n.static ? \"static \" : \"\", n.readonly ? \"readonly \" : \"\", \"[\", n.parameters ? parametersGroup : \"\", n.typeAnnotation ? \"]: \" : \"]\", n.typeAnnotation ? path.call(print, \"typeAnnotation\") : \"\", parent.type === \"ClassBody\" ? semi : \"\"]);\n }\n\n case \"TSTypePredicate\":\n return concat$d([n.asserts ? \"asserts \" : \"\", path.call(print, \"parameterName\"), n.typeAnnotation ? concat$d([\" is \", path.call(print, \"typeAnnotation\")]) : \"\"]);\n\n case \"TSNonNullExpression\":\n return concat$d([path.call(print, \"expression\"), \"!\"]);\n\n case \"TSThisType\":\n return \"this\";\n\n case \"TSImportType\":\n return concat$d([!n.isTypeOf ? \"\" : \"typeof \", \"import(\", path.call(print, n.parameter ? \"parameter\" : \"argument\"), \")\", !n.qualifier ? \"\" : concat$d([\".\", path.call(print, \"qualifier\")]), printTypeParameters(path, options, print, \"typeParameters\")]);\n\n case \"TSLiteralType\":\n return path.call(print, \"literal\");\n\n case \"TSIndexedAccessType\":\n return concat$d([path.call(print, \"objectType\"), \"[\", path.call(print, \"indexType\"), \"]\"]);\n\n case \"TSConstructSignatureDeclaration\":\n case \"TSCallSignatureDeclaration\":\n case \"TSConstructorType\":\n {\n if (n.type !== \"TSCallSignatureDeclaration\") {\n parts.push(\"new \");\n }\n\n parts.push(group$b(printFunctionParams(path, print, options,\n /* expandArg */\n false,\n /* printTypeParams */\n true)));\n\n if (n.returnType || n.typeAnnotation) {\n const isType = n.type === \"TSConstructorType\";\n parts.push(isType ? \" => \" : \": \", path.call(print, \"returnType\"), path.call(print, \"typeAnnotation\"));\n }\n\n return concat$d(parts);\n }\n\n case \"TSTypeOperator\":\n return concat$d([n.operator, \" \", path.call(print, \"typeAnnotation\")]);\n\n case \"TSMappedType\":\n {\n const shouldBreak = hasNewlineInRange$3(options.originalText, options.locStart(n), options.locEnd(n));\n return group$b(concat$d([\"{\", indent$7(concat$d([options.bracketSpacing ? line$9 : softline$6, n.readonly ? concat$d([getTypeScriptMappedTypeModifier$1(n.readonly, \"readonly\"), \" \"]) : \"\", printTypeScriptModifiers(path, options, print), path.call(print, \"typeParameter\"), n.optional ? getTypeScriptMappedTypeModifier$1(n.optional, \"?\") : \"\", n.typeAnnotation ? \": \" : \"\", path.call(print, \"typeAnnotation\"), ifBreak$6(semi, \"\")])), comments.printDanglingComments(path, options,\n /* sameIndent */\n true), options.bracketSpacing ? line$9 : softline$6, \"}\"]), {\n shouldBreak\n });\n }\n\n case \"TSMethodSignature\":\n parts.push(n.accessibility ? concat$d([n.accessibility, \" \"]) : \"\", n.export ? \"export \" : \"\", n.static ? \"static \" : \"\", n.readonly ? \"readonly \" : \"\", n.computed ? \"[\" : \"\", path.call(print, \"key\"), n.computed ? \"]\" : \"\", printOptionalToken(path), printFunctionParams(path, print, options,\n /* expandArg */\n false,\n /* printTypeParams */\n true));\n\n if (n.returnType || n.typeAnnotation) {\n parts.push(\": \", path.call(print, \"returnType\"), path.call(print, \"typeAnnotation\"));\n }\n\n return group$b(concat$d(parts));\n\n case \"TSNamespaceExportDeclaration\":\n parts.push(\"export as namespace \", path.call(print, \"id\"));\n\n if (options.semi) {\n parts.push(\";\");\n }\n\n return group$b(concat$d(parts));\n\n case \"TSEnumDeclaration\":\n if (n.declare) {\n parts.push(\"declare \");\n }\n\n if (n.modifiers) {\n parts.push(printTypeScriptModifiers(path, options, print));\n }\n\n if (n.const) {\n parts.push(\"const \");\n }\n\n parts.push(\"enum \", path.call(print, \"id\"), \" \");\n\n if (n.members.length === 0) {\n parts.push(group$b(concat$d([\"{\", comments.printDanglingComments(path, options), softline$6, \"}\"])));\n } else {\n parts.push(group$b(concat$d([\"{\", indent$7(concat$d([hardline$9, printArrayItems(path, options, \"members\", print), shouldPrintComma$1(options, \"es5\") ? \",\" : \"\"])), comments.printDanglingComments(path, options,\n /* sameIndent */\n true), hardline$9, \"}\"])));\n }\n\n return concat$d(parts);\n\n case \"TSEnumMember\":\n parts.push(path.call(print, \"id\"));\n\n if (n.initializer) {\n parts.push(\" = \", path.call(print, \"initializer\"));\n }\n\n return concat$d(parts);\n\n case \"TSImportEqualsDeclaration\":\n if (n.isExport) {\n parts.push(\"export \");\n }\n\n parts.push(\"import \", path.call(print, \"id\"), \" = \", path.call(print, \"moduleReference\"));\n\n if (options.semi) {\n parts.push(\";\");\n }\n\n return group$b(concat$d(parts));\n\n case \"TSExternalModuleReference\":\n return concat$d([\"require(\", path.call(print, \"expression\"), \")\"]);\n\n case \"TSModuleDeclaration\":\n {\n const parent = path.getParentNode();\n const isExternalModule = isLiteral$1(n.id);\n const parentIsDeclaration = parent.type === \"TSModuleDeclaration\";\n const bodyIsDeclaration = n.body && n.body.type === \"TSModuleDeclaration\";\n\n if (parentIsDeclaration) {\n parts.push(\".\");\n } else {\n if (n.declare) {\n parts.push(\"declare \");\n }\n\n parts.push(printTypeScriptModifiers(path, options, print));\n const textBetweenNodeAndItsId = options.originalText.slice(options.locStart(n), options.locStart(n.id)); // Global declaration looks like this:\n // (declare)? global { ... }\n\n const isGlobalDeclaration = n.id.type === \"Identifier\" && n.id.name === \"global\" && !/namespace|module/.test(textBetweenNodeAndItsId);\n\n if (!isGlobalDeclaration) {\n parts.push(isExternalModule || /(^|\\s)module(\\s|$)/.test(textBetweenNodeAndItsId) ? \"module \" : \"namespace \");\n }\n }\n\n parts.push(path.call(print, \"id\"));\n\n if (bodyIsDeclaration) {\n parts.push(path.call(print, \"body\"));\n } else if (n.body) {\n parts.push(\" \", group$b(path.call(print, \"body\")));\n } else {\n parts.push(semi);\n }\n\n return concat$d(parts);\n }\n\n case \"PrivateName\":\n return concat$d([\"#\", path.call(print, \"id\")]);\n // TODO: Temporary auto-generated node type. To remove when typescript-estree has proper support for private fields.\n\n case \"TSPrivateIdentifier\":\n return n.escapedText;\n\n case \"TSConditionalType\":\n return printTernaryOperator(path, options, print, {\n beforeParts: () => [path.call(print, \"checkType\"), \" \", \"extends\", \" \", path.call(print, \"extendsType\")],\n afterParts: () => [],\n shouldCheckJsx: false,\n conditionalNodeType: \"TSConditionalType\",\n consequentNodePropertyName: \"trueType\",\n alternateNodePropertyName: \"falseType\",\n testNodePropertyNames: [\"checkType\", \"extendsType\"]\n });\n\n case \"TSInferType\":\n return concat$d([\"infer\", \" \", path.call(print, \"typeParameter\")]);\n\n case \"InterpreterDirective\":\n parts.push(\"#!\", n.value, hardline$9);\n\n if (isNextLineEmpty$4(options.originalText, n, options.locEnd)) {\n parts.push(hardline$9);\n }\n\n return concat$d(parts);\n\n case \"NGRoot\":\n return concat$d([].concat(path.call(print, \"node\"), !n.node.comments || n.node.comments.length === 0 ? [] : concat$d([\" //\", n.node.comments[0].value.trimEnd()])));\n\n case \"NGChainedExpression\":\n return group$b(join$9(concat$d([\";\", line$9]), path.map(childPath => hasNgSideEffect$1(childPath) ? print(childPath) : concat$d([\"(\", print(childPath), \")\"]), \"expressions\")));\n\n case \"NGEmptyExpression\":\n return \"\";\n\n case \"NGQuotedExpression\":\n return concat$d([n.prefix, \": \", n.value.trim()]);\n\n case \"NGMicrosyntax\":\n return concat$d(path.map((childPath, index) => concat$d([index === 0 ? \"\" : isNgForOf$1(childPath.getValue(), index, n) ? \" \" : concat$d([\";\", line$9]), print(childPath)]), \"body\"));\n\n case \"NGMicrosyntaxKey\":\n return /^[a-z_$][a-z0-9_$]*(-[a-z_$][a-z0-9_$])*$/i.test(n.name) ? n.name : JSON.stringify(n.name);\n\n case \"NGMicrosyntaxExpression\":\n return concat$d([path.call(print, \"expression\"), n.alias === null ? \"\" : concat$d([\" as \", path.call(print, \"alias\")])]);\n\n case \"NGMicrosyntaxKeyedExpression\":\n {\n const index = path.getName();\n const parentNode = path.getParentNode();\n const shouldNotPrintColon = isNgForOf$1(n, index, parentNode) || (index === 1 && (n.key.name === \"then\" || n.key.name === \"else\") || index === 2 && n.key.name === \"else\" && parentNode.body[index - 1].type === \"NGMicrosyntaxKeyedExpression\" && parentNode.body[index - 1].key.name === \"then\") && parentNode.body[0].type === \"NGMicrosyntaxExpression\";\n return concat$d([path.call(print, \"key\"), shouldNotPrintColon ? \" \" : \": \", path.call(print, \"expression\")]);\n }\n\n case \"NGMicrosyntaxLet\":\n return concat$d([\"let \", path.call(print, \"key\"), n.value === null ? \"\" : concat$d([\" = \", path.call(print, \"value\")])]);\n\n case \"NGMicrosyntaxAs\":\n return concat$d([path.call(print, \"key\"), \" as \", path.call(print, \"alias\")]);\n\n case \"ArgumentPlaceholder\":\n return \"?\";\n // These are not valid TypeScript. Printing them just for the sake of error recovery.\n\n case \"TSJSDocAllType\":\n return \"*\";\n\n case \"TSJSDocUnknownType\":\n return \"?\";\n\n case \"TSJSDocNullableType\":\n return concat$d([\"?\", path.call(print, \"typeAnnotation\")]);\n\n case \"TSJSDocNonNullableType\":\n return concat$d([\"!\", path.call(print, \"typeAnnotation\")]);\n\n case \"TSJSDocFunctionType\":\n return concat$d([\"function(\", // The parameters could be here, but typescript-estree doesn't convert them anyway (throws an error).\n \"): \", path.call(print, \"typeAnnotation\")]);\n\n default:\n /* istanbul ignore next */\n throw new Error(\"unknown type: \" + JSON.stringify(n.type));\n }\n }\n\n function printStatementSequence(path, options, print) {\n const printed = [];\n const bodyNode = path.getNode();\n const isClass = bodyNode.type === \"ClassBody\";\n path.map((stmtPath, i) => {\n const stmt = stmtPath.getValue(); // Just in case the AST has been modified to contain falsy\n // \"statements,\" it's safer simply to skip them.\n\n /* istanbul ignore if */\n\n if (!stmt) {\n return;\n } // Skip printing EmptyStatement nodes to avoid leaving stray\n // semicolons lying around.\n\n\n if (stmt.type === \"EmptyStatement\") {\n return;\n }\n\n const stmtPrinted = print(stmtPath);\n const text = options.originalText;\n const parts = []; // in no-semi mode, prepend statement with semicolon if it might break ASI\n // don't prepend the only JSX element in a program with semicolon\n\n if (!options.semi && !isClass && !isTheOnlyJSXElementInMarkdown$1(options, stmtPath) && stmtNeedsASIProtection(stmtPath, options)) {\n if (stmt.comments && stmt.comments.some(comment => comment.leading)) {\n parts.push(print(stmtPath, {\n needsSemi: true\n }));\n } else {\n parts.push(\";\", stmtPrinted);\n }\n } else {\n parts.push(stmtPrinted);\n }\n\n if (!options.semi && isClass) {\n if (classPropMayCauseASIProblems$1(stmtPath)) {\n parts.push(\";\");\n } else if (stmt.type === \"ClassProperty\") {\n const nextChild = bodyNode.body[i + 1];\n\n if (classChildNeedsASIProtection$1(nextChild)) {\n parts.push(\";\");\n }\n }\n }\n\n if (isNextLineEmpty$4(text, stmt, options.locEnd) && !isLastStatement$1(stmtPath)) {\n parts.push(hardline$9);\n }\n\n printed.push(concat$d(parts));\n });\n return join$9(hardline$9, printed);\n }\n\n function printPropertyKey(path, options, print) {\n const node = path.getNode();\n\n if (node.computed) {\n return concat$d([\"[\", path.call(print, \"key\"), \"]\"]);\n }\n\n const parent = path.getParentNode();\n const {\n key\n } = node;\n\n if (node.type === \"ClassPrivateProperty\" && // flow has `Identifier` key, and babel has `PrivateName` key\n key.type === \"Identifier\") {\n return concat$d([\"#\", path.call(print, \"key\")]);\n }\n\n if (options.quoteProps === \"consistent\" && !needsQuoteProps.has(parent)) {\n const objectHasStringProp = (parent.properties || parent.body || parent.members).some(prop => !prop.computed && prop.key && isStringLiteral$1(prop.key) && !isStringPropSafeToCoerceToIdentifier$1(prop, options));\n needsQuoteProps.set(parent, objectHasStringProp);\n }\n\n if (key.type === \"Identifier\" && (options.parser === \"json\" || options.quoteProps === \"consistent\" && needsQuoteProps.get(parent))) {\n // a -> \"a\"\n const prop = printString$2(JSON.stringify(key.name), options);\n return path.call(keyPath => comments.printComments(keyPath, () => prop, options), \"key\");\n }\n\n if (isStringPropSafeToCoerceToIdentifier$1(node, options) && (options.quoteProps === \"as-needed\" || options.quoteProps === \"consistent\" && !needsQuoteProps.get(parent))) {\n // 'a' -> a\n return path.call(keyPath => comments.printComments(keyPath, () => key.value, options), \"key\");\n }\n\n return path.call(print, \"key\");\n }\n\n function printMethod(path, options, print) {\n const node = path.getNode();\n const {\n kind\n } = node;\n const value = node.value || node;\n const parts = [];\n\n if (!kind || kind === \"init\" || kind === \"method\" || kind === \"constructor\") {\n if (value.async) {\n parts.push(\"async \");\n }\n\n if (value.generator) {\n parts.push(\"*\");\n }\n } else {\n assert.ok(kind === \"get\" || kind === \"set\");\n parts.push(kind, \" \");\n }\n\n parts.push(printPropertyKey(path, options, print), node.optional || node.key.optional ? \"?\" : \"\", node === value ? printMethodInternal(path, options, print) : path.call(path => printMethodInternal(path, options, print), \"value\"));\n return concat$d(parts);\n }\n\n function printMethodInternal(path, options, print) {\n const parts = [printFunctionTypeParameters(path, options, print), group$b(concat$d([printFunctionParams(path, print, options), printReturnType(path, print, options)]))];\n\n if (path.getNode().body) {\n parts.push(\" \", path.call(print, \"body\"));\n } else {\n parts.push(options.semi ? \";\" : \"\");\n }\n\n return concat$d(parts);\n }\n\n function couldGroupArg(arg) {\n return arg.type === \"ObjectExpression\" && (arg.properties.length > 0 || arg.comments) || arg.type === \"ArrayExpression\" && (arg.elements.length > 0 || arg.comments) || arg.type === \"TSTypeAssertion\" && couldGroupArg(arg.expression) || arg.type === \"TSAsExpression\" && couldGroupArg(arg.expression) || arg.type === \"FunctionExpression\" || arg.type === \"ArrowFunctionExpression\" && ( // we want to avoid breaking inside composite return types but not simple keywords\n // https://github.com/prettier/prettier/issues/4070\n // export class Thing implements OtherThing {\n // do: (type: Type) => Provider
= memoize(\n // (type: ObjectType): Provider => {}\n // );\n // }\n // https://github.com/prettier/prettier/issues/6099\n // app.get(\"/\", (req, res): void => {\n // res.send(\"Hello World!\");\n // });\n !arg.returnType || !arg.returnType.typeAnnotation || arg.returnType.typeAnnotation.type !== \"TSTypeReference\") && (arg.body.type === \"BlockStatement\" || arg.body.type === \"ArrowFunctionExpression\" || arg.body.type === \"ObjectExpression\" || arg.body.type === \"ArrayExpression\" || arg.body.type === \"CallExpression\" || arg.body.type === \"OptionalCallExpression\" || arg.body.type === \"ConditionalExpression\" || isJSXNode$1(arg.body));\n }\n\n function shouldGroupLastArg(args) {\n const lastArg = getLast$3(args);\n const penultimateArg = getPenultimate$1(args);\n return !hasLeadingComment$3(lastArg) && !hasTrailingComment$1(lastArg) && couldGroupArg(lastArg) && ( // If the last two arguments are of the same type,\n // disable last element expansion.\n !penultimateArg || penultimateArg.type !== lastArg.type);\n }\n\n function shouldGroupFirstArg(args) {\n if (args.length !== 2) {\n return false;\n }\n\n const [firstArg, secondArg] = args;\n return (!firstArg.comments || !firstArg.comments.length) && (firstArg.type === \"FunctionExpression\" || firstArg.type === \"ArrowFunctionExpression\" && firstArg.body.type === \"BlockStatement\") && secondArg.type !== \"FunctionExpression\" && secondArg.type !== \"ArrowFunctionExpression\" && secondArg.type !== \"ConditionalExpression\" && !couldGroupArg(secondArg);\n }\n\n function printJestEachTemplateLiteral(node, expressions, options) {\n /**\n * a | b | expected\n * ${1} | ${1} | ${2}\n * ${1} | ${2} | ${3}\n * ${2} | ${1} | ${3}\n */\n const headerNames = node.quasis[0].value.raw.trim().split(/\\s*\\|\\s*/);\n\n if (headerNames.length > 1 || headerNames.some(headerName => headerName.length !== 0)) {\n const parts = [];\n const stringifiedExpressions = expressions.map(doc => \"${\" + printDocToString$2(doc, Object.assign({}, options, {\n printWidth: Infinity,\n endOfLine: \"lf\"\n })).formatted + \"}\");\n const tableBody = [{\n hasLineBreak: false,\n cells: []\n }];\n\n for (let i = 1; i < node.quasis.length; i++) {\n const row = tableBody[tableBody.length - 1];\n const correspondingExpression = stringifiedExpressions[i - 1];\n row.cells.push(correspondingExpression);\n\n if (correspondingExpression.includes(\"\\n\")) {\n row.hasLineBreak = true;\n }\n\n if (node.quasis[i].value.raw.includes(\"\\n\")) {\n tableBody.push({\n hasLineBreak: false,\n cells: []\n });\n }\n }\n\n const maxColumnCount = Math.max(headerNames.length, ...tableBody.map(row => row.cells.length));\n const maxColumnWidths = Array.from({\n length: maxColumnCount\n }).fill(0);\n const table = [{\n cells: headerNames\n }, ...tableBody.filter(row => row.cells.length !== 0)];\n\n for (const {\n cells\n } of table.filter(row => !row.hasLineBreak)) {\n cells.forEach((cell, index) => {\n maxColumnWidths[index] = Math.max(maxColumnWidths[index], getStringWidth$3(cell));\n });\n }\n\n parts.push(lineSuffixBoundary$1, \"`\", indent$7(concat$d([hardline$9, join$9(hardline$9, table.map(row => join$9(\" | \", row.cells.map((cell, index) => row.hasLineBreak ? cell : cell + \" \".repeat(maxColumnWidths[index] - getStringWidth$3(cell))))))])), hardline$9, \"`\");\n return concat$d(parts);\n }\n }\n\n function printArgumentsList(path, options, print) {\n const node = path.getValue();\n const args = node.arguments;\n\n if (args.length === 0) {\n return concat$d([\"(\", comments.printDanglingComments(path, options,\n /* sameIndent */\n true), \")\"]);\n } // useEffect(() => { ... }, [foo, bar, baz])\n\n\n if (args.length === 2 && args[0].type === \"ArrowFunctionExpression\" && args[0].params.length === 0 && args[0].body.type === \"BlockStatement\" && args[1].type === \"ArrayExpression\" && !args.find(arg => arg.comments)) {\n return concat$d([\"(\", path.call(print, \"arguments\", 0), \", \", path.call(print, \"arguments\", 1), \")\"]);\n } // func(\n // ({\n // a,\n // b\n // }) => {}\n // );\n\n\n function shouldBreakForArrowFunctionInArguments(arg, argPath) {\n if (!arg || arg.type !== \"ArrowFunctionExpression\" || !arg.body || arg.body.type !== \"BlockStatement\" || !arg.params || arg.params.length < 1) {\n return false;\n }\n\n let shouldBreak = false;\n argPath.each(paramPath => {\n const printed = concat$d([print(paramPath)]);\n shouldBreak = shouldBreak || willBreak$1(printed);\n }, \"params\");\n return shouldBreak;\n }\n\n let anyArgEmptyLine = false;\n let shouldBreakForArrowFunction = false;\n let hasEmptyLineFollowingFirstArg = false;\n const lastArgIndex = args.length - 1;\n const printedArguments = path.map((argPath, index) => {\n const arg = argPath.getNode();\n const parts = [print(argPath)];\n\n if (index === lastArgIndex) ; else if (isNextLineEmpty$4(options.originalText, arg, options.locEnd)) {\n if (index === 0) {\n hasEmptyLineFollowingFirstArg = true;\n }\n\n anyArgEmptyLine = true;\n parts.push(\",\", hardline$9, hardline$9);\n } else {\n parts.push(\",\", line$9);\n }\n\n shouldBreakForArrowFunction = shouldBreakForArrowFunctionInArguments(arg, argPath);\n return concat$d(parts);\n }, \"arguments\");\n const maybeTrailingComma = // Dynamic imports cannot have trailing commas\n !(node.callee && node.callee.type === \"Import\") && shouldPrintComma$1(options, \"all\") ? \",\" : \"\";\n\n function allArgsBrokenOut() {\n return group$b(concat$d([\"(\", indent$7(concat$d([line$9, concat$d(printedArguments)])), maybeTrailingComma, line$9, \")\"]), {\n shouldBreak: true\n });\n }\n\n if (path.getParentNode().type !== \"Decorator\" && isFunctionCompositionArgs$1(args)) {\n return allArgsBrokenOut();\n }\n\n const shouldGroupFirst = shouldGroupFirstArg(args);\n const shouldGroupLast = shouldGroupLastArg(args);\n\n if (shouldGroupFirst || shouldGroupLast) {\n const shouldBreak = (shouldGroupFirst ? printedArguments.slice(1).some(willBreak$1) : printedArguments.slice(0, -1).some(willBreak$1)) || anyArgEmptyLine || shouldBreakForArrowFunction; // We want to print the last argument with a special flag\n\n let printedExpanded;\n let i = 0;\n path.each(argPath => {\n if (shouldGroupFirst && i === 0) {\n printedExpanded = [concat$d([argPath.call(p => print(p, {\n expandFirstArg: true\n })), printedArguments.length > 1 ? \",\" : \"\", hasEmptyLineFollowingFirstArg ? hardline$9 : line$9, hasEmptyLineFollowingFirstArg ? hardline$9 : \"\"])].concat(printedArguments.slice(1));\n }\n\n if (shouldGroupLast && i === args.length - 1) {\n printedExpanded = printedArguments.slice(0, -1).concat(argPath.call(p => print(p, {\n expandLastArg: true\n })));\n }\n\n i++;\n }, \"arguments\");\n const somePrintedArgumentsWillBreak = printedArguments.some(willBreak$1);\n const simpleConcat = concat$d([\"(\", concat$d(printedExpanded), \")\"]);\n return concat$d([somePrintedArgumentsWillBreak ? breakParent$3 : \"\", conditionalGroup$1([!somePrintedArgumentsWillBreak && !node.typeArguments && !node.typeParameters ? simpleConcat : ifBreak$6(allArgsBrokenOut(), simpleConcat), shouldGroupFirst ? concat$d([\"(\", group$b(printedExpanded[0], {\n shouldBreak: true\n }), concat$d(printedExpanded.slice(1)), \")\"]) : concat$d([\"(\", concat$d(printedArguments.slice(0, -1)), group$b(getLast$3(printedExpanded), {\n shouldBreak: true\n }), \")\"]), allArgsBrokenOut()], {\n shouldBreak\n })]);\n }\n\n const contents = concat$d([\"(\", indent$7(concat$d([softline$6, concat$d(printedArguments)])), ifBreak$6(maybeTrailingComma), softline$6, \")\"]);\n\n if (isLongCurriedCallExpression$1(path)) {\n // By not wrapping the arguments in a group, the printer prioritizes\n // breaking up these arguments rather than the args of the parent call.\n return contents;\n }\n\n return group$b(contents, {\n shouldBreak: printedArguments.some(willBreak$1) || anyArgEmptyLine\n });\n }\n\n function printTypeAnnotation(path, options, print) {\n const node = path.getValue();\n\n if (!node.typeAnnotation) {\n return \"\";\n }\n\n const parentNode = path.getParentNode();\n const isDefinite = node.definite || parentNode && parentNode.type === \"VariableDeclarator\" && parentNode.definite;\n const isFunctionDeclarationIdentifier = parentNode.type === \"DeclareFunction\" && parentNode.id === node;\n\n if (isFlowAnnotationComment$1(options.originalText, node.typeAnnotation, options)) {\n return concat$d([\" /*: \", path.call(print, \"typeAnnotation\"), \" */\"]);\n }\n\n return concat$d([isFunctionDeclarationIdentifier ? \"\" : isDefinite ? \"!: \" : \": \", path.call(print, \"typeAnnotation\")]);\n }\n\n function printFunctionTypeParameters(path, options, print) {\n const fun = path.getValue();\n\n if (fun.typeArguments) {\n return path.call(print, \"typeArguments\");\n }\n\n if (fun.typeParameters) {\n return path.call(print, \"typeParameters\");\n }\n\n return \"\";\n }\n\n function printFunctionParams(path, print, options, expandArg, printTypeParams) {\n const fun = path.getValue();\n const parent = path.getParentNode();\n const paramsField = fun.parameters ? \"parameters\" : \"params\";\n const isParametersInTestCall = isTestCall$1(parent);\n const shouldHugParameters = shouldHugArguments(fun);\n const shouldExpandParameters = expandArg && !(fun[paramsField] && fun[paramsField].some(n => n.comments));\n const typeParams = printTypeParams ? printFunctionTypeParameters(path, options, print) : \"\";\n let printed = [];\n\n if (fun[paramsField]) {\n const lastArgIndex = fun[paramsField].length - 1;\n printed = path.map((childPath, index) => {\n const parts = [];\n const param = childPath.getValue();\n parts.push(print(childPath));\n\n if (index === lastArgIndex) {\n if (fun.rest) {\n parts.push(\",\", line$9);\n }\n } else if (isParametersInTestCall || shouldHugParameters || shouldExpandParameters) {\n parts.push(\", \");\n } else if (isNextLineEmpty$4(options.originalText, param, options.locEnd)) {\n parts.push(\",\", hardline$9, hardline$9);\n } else {\n parts.push(\",\", line$9);\n }\n\n return concat$d(parts);\n }, paramsField);\n }\n\n if (fun.rest) {\n printed.push(concat$d([\"...\", path.call(print, \"rest\")]));\n }\n\n if (printed.length === 0) {\n return concat$d([typeParams, \"(\", comments.printDanglingComments(path, options,\n /* sameIndent */\n true, comment => getNextNonSpaceNonCommentCharacter$1(options.originalText, comment, options.locEnd) === \")\"), \")\"]);\n }\n\n const lastParam = getLast$3(fun[paramsField]); // If the parent is a call with the first/last argument expansion and this is the\n // params of the first/last argument, we don't want the arguments to break and instead\n // want the whole expression to be on a new line.\n //\n // Good: Bad:\n // verylongcall( verylongcall((\n // (a, b) => { a,\n // } b,\n // }) ) => {\n // })\n\n if (shouldExpandParameters) {\n return group$b(concat$d([removeLines$2(typeParams), \"(\", concat$d(printed.map(removeLines$2)), \")\"]));\n } // Single object destructuring should hug\n //\n // function({\n // a,\n // b,\n // c\n // }) {}\n\n\n const hasNotParameterDecorator = fun[paramsField].every(param => !param.decorators);\n\n if (shouldHugParameters && hasNotParameterDecorator) {\n return concat$d([typeParams, \"(\", concat$d(printed), \")\"]);\n } // don't break in specs, eg; `it(\"should maintain parens around done even when long\", (done) => {})`\n\n\n if (isParametersInTestCall) {\n return concat$d([typeParams, \"(\", concat$d(printed), \")\"]);\n }\n\n const isFlowShorthandWithOneArg = (isObjectTypePropertyAFunction$1(parent, options) || isTypeAnnotationAFunction$1(parent, options) || parent.type === \"TypeAlias\" || parent.type === \"UnionTypeAnnotation\" || parent.type === \"TSUnionType\" || parent.type === \"IntersectionTypeAnnotation\" || parent.type === \"FunctionTypeAnnotation\" && parent.returnType === fun) && fun[paramsField].length === 1 && fun[paramsField][0].name === null && fun[paramsField][0].typeAnnotation && fun.typeParameters === null && isSimpleFlowType$1(fun[paramsField][0].typeAnnotation) && !fun.rest;\n\n if (isFlowShorthandWithOneArg) {\n if (options.arrowParens === \"always\") {\n return concat$d([\"(\", concat$d(printed), \")\"]);\n }\n\n return concat$d(printed);\n }\n\n const canHaveTrailingComma = !(lastParam && lastParam.type === \"RestElement\") && !fun.rest;\n return concat$d([typeParams, \"(\", indent$7(concat$d([softline$6, concat$d(printed)])), ifBreak$6(canHaveTrailingComma && shouldPrintComma$1(options, \"all\") ? \",\" : \"\"), softline$6, \")\"]);\n }\n\n function shouldPrintParamsWithoutParens(path, options) {\n if (options.arrowParens === \"always\") {\n return false;\n }\n\n if (options.arrowParens === \"avoid\") {\n const node = path.getValue();\n return canPrintParamsWithoutParens(node);\n } // Fallback default; should be unreachable\n\n\n return false;\n }\n\n function canPrintParamsWithoutParens(node) {\n return node.params.length === 1 && !node.rest && !node.typeParameters && !hasDanglingComments$1(node) && node.params[0].type === \"Identifier\" && !node.params[0].typeAnnotation && !node.params[0].comments && !node.params[0].optional && !node.predicate && !node.returnType;\n }\n\n function printFunctionDeclaration(path, print, options) {\n const n = path.getValue();\n const parts = [];\n\n if (n.async) {\n parts.push(\"async \");\n }\n\n if (n.generator) {\n parts.push(\"function* \");\n } else {\n parts.push(\"function \");\n }\n\n if (n.id) {\n parts.push(path.call(print, \"id\"));\n }\n\n parts.push(printFunctionTypeParameters(path, options, print), group$b(concat$d([printFunctionParams(path, print, options), printReturnType(path, print, options)])), n.body ? \" \" : \"\", path.call(print, \"body\"));\n return concat$d(parts);\n }\n\n function printReturnType(path, print, options) {\n const n = path.getValue();\n const returnType = path.call(print, \"returnType\");\n\n if (n.returnType && isFlowAnnotationComment$1(options.originalText, n.returnType, options)) {\n return concat$d([\" /*: \", returnType, \" */\"]);\n }\n\n const parts = [returnType]; // prepend colon to TypeScript type annotation\n\n if (n.returnType && n.returnType.typeAnnotation) {\n parts.unshift(\": \");\n }\n\n if (n.predicate) {\n // The return type will already add the colon, but otherwise we\n // need to do it ourselves\n parts.push(n.returnType ? \" \" : \": \", path.call(print, \"predicate\"));\n }\n\n return concat$d(parts);\n }\n\n function printExportDeclaration(path, options, print) {\n const decl = path.getValue();\n const semi = options.semi ? \";\" : \"\";\n const parts = [\"export \"];\n const isDefault = decl.default || decl.type === \"ExportDefaultDeclaration\";\n\n if (isDefault) {\n parts.push(\"default \");\n }\n\n parts.push(comments.printDanglingComments(path, options,\n /* sameIndent */\n true));\n\n if (needsHardlineAfterDanglingComment$1(decl)) {\n parts.push(hardline$9);\n }\n\n if (decl.declaration) {\n parts.push(path.call(print, \"declaration\"));\n\n if (isDefault && decl.declaration.type !== \"ClassDeclaration\" && decl.declaration.type !== \"FunctionDeclaration\" && decl.declaration.type !== \"TSInterfaceDeclaration\" && decl.declaration.type !== \"DeclareClass\" && decl.declaration.type !== \"DeclareFunction\" && decl.declaration.type !== \"TSDeclareFunction\") {\n parts.push(semi);\n }\n } else {\n if (decl.specifiers && decl.specifiers.length > 0) {\n const specifiers = [];\n const defaultSpecifiers = [];\n const namespaceSpecifiers = [];\n path.each(specifierPath => {\n const specifierType = path.getValue().type;\n\n if (specifierType === \"ExportSpecifier\") {\n specifiers.push(print(specifierPath));\n } else if (specifierType === \"ExportDefaultSpecifier\") {\n defaultSpecifiers.push(print(specifierPath));\n } else if (specifierType === \"ExportNamespaceSpecifier\") {\n namespaceSpecifiers.push(concat$d([\"* as \", print(specifierPath)]));\n }\n }, \"specifiers\");\n const isNamespaceFollowed = namespaceSpecifiers.length !== 0 && specifiers.length !== 0;\n const isDefaultFollowed = defaultSpecifiers.length !== 0 && (namespaceSpecifiers.length !== 0 || specifiers.length !== 0);\n const canBreak = specifiers.length > 1 || defaultSpecifiers.length > 0 || decl.specifiers && decl.specifiers.some(node => node.comments);\n let printed = \"\";\n\n if (specifiers.length !== 0) {\n if (canBreak) {\n printed = group$b(concat$d([\"{\", indent$7(concat$d([options.bracketSpacing ? line$9 : softline$6, join$9(concat$d([\",\", line$9]), specifiers)])), ifBreak$6(shouldPrintComma$1(options) ? \",\" : \"\"), options.bracketSpacing ? line$9 : softline$6, \"}\"]));\n } else {\n printed = concat$d([\"{\", options.bracketSpacing ? \" \" : \"\", concat$d(specifiers), options.bracketSpacing ? \" \" : \"\", \"}\"]);\n }\n }\n\n parts.push(decl.exportKind === \"type\" ? \"type \" : \"\", concat$d(defaultSpecifiers), concat$d([isDefaultFollowed ? \", \" : \"\"]), concat$d(namespaceSpecifiers), concat$d([isNamespaceFollowed ? \", \" : \"\"]), printed);\n } else {\n parts.push(\"{}\");\n }\n\n if (decl.source) {\n parts.push(\" from \", path.call(print, \"source\"));\n }\n\n parts.push(semi);\n }\n\n return concat$d(parts);\n }\n\n function printFlowDeclaration(path, parts) {\n const parentExportDecl = getParentExportDeclaration$1(path);\n\n if (parentExportDecl) {\n assert.strictEqual(parentExportDecl.type, \"DeclareExportDeclaration\");\n } else {\n // If the parent node has type DeclareExportDeclaration, then it\n // will be responsible for printing the \"declare\" token. Otherwise\n // it needs to be printed with this non-exported declaration node.\n parts.unshift(\"declare \");\n }\n\n return concat$d(parts);\n }\n\n function printTypeScriptModifiers(path, options, print) {\n const n = path.getValue();\n\n if (!n.modifiers || !n.modifiers.length) {\n return \"\";\n }\n\n return concat$d([join$9(\" \", path.map(print, \"modifiers\")), \" \"]);\n }\n\n function printTypeParameters(path, options, print, paramsKey) {\n const n = path.getValue();\n\n if (!n[paramsKey]) {\n return \"\";\n } // for TypeParameterDeclaration typeParameters is a single node\n\n\n if (!Array.isArray(n[paramsKey])) {\n return path.call(print, paramsKey);\n }\n\n const grandparent = path.getNode(2);\n const greatGrandParent = path.getNode(3);\n const greatGreatGrandParent = path.getNode(4);\n const isParameterInTestCall = grandparent != null && isTestCall$1(grandparent);\n const shouldInline = isParameterInTestCall || n[paramsKey].length === 0 || n[paramsKey].length === 1 && (shouldHugType(n[paramsKey][0]) || n[paramsKey][0].type === \"GenericTypeAnnotation\" && shouldHugType(n[paramsKey][0].id) || n[paramsKey][0].type === \"TSTypeReference\" && shouldHugType(n[paramsKey][0].typeName) || n[paramsKey][0].type === \"NullableTypeAnnotation\" || // See https://github.com/prettier/prettier/pull/6467 for the context.\n greatGreatGrandParent && greatGreatGrandParent.type === \"VariableDeclarator\" && grandparent.type === \"TSTypeAnnotation\" && greatGrandParent.type !== \"ArrowFunctionExpression\" && n[paramsKey][0].type !== \"TSUnionType\" && n[paramsKey][0].type !== \"UnionTypeAnnotation\" && n[paramsKey][0].type !== \"TSIntersectionType\" && n[paramsKey][0].type !== \"IntersectionTypeAnnotation\" && n[paramsKey][0].type !== \"TSConditionalType\" && n[paramsKey][0].type !== \"TSMappedType\" && n[paramsKey][0].type !== \"TSTypeOperator\" && n[paramsKey][0].type !== \"TSIndexedAccessType\" && n[paramsKey][0].type !== \"TSArrayType\");\n\n function printDanglingCommentsForInline(n) {\n if (!hasDanglingComments$1(n)) {\n return \"\";\n }\n\n const hasOnlyBlockComments = n.comments.every(comments$1.isBlockComment);\n const printed = comments.printDanglingComments(path, options,\n /* sameIndent */\n hasOnlyBlockComments);\n\n if (hasOnlyBlockComments) {\n return printed;\n }\n\n return concat$d([printed, hardline$9]);\n }\n\n if (shouldInline) {\n return concat$d([\"<\", join$9(\", \", path.map(print, paramsKey)), printDanglingCommentsForInline(n), \">\"]);\n }\n\n return group$b(concat$d([\"<\", indent$7(concat$d([softline$6, join$9(concat$d([\",\", line$9]), path.map(print, paramsKey))])), ifBreak$6(options.parser !== \"typescript\" && options.parser !== \"babel-ts\" && shouldPrintComma$1(options, \"all\") ? \",\" : \"\"), softline$6, \">\"]));\n }\n\n function printClass(path, options, print) {\n const n = path.getValue();\n const parts = [];\n\n if (n.abstract) {\n parts.push(\"abstract \");\n }\n\n parts.push(\"class\");\n\n if (n.id) {\n parts.push(\" \", path.call(print, \"id\"));\n }\n\n parts.push(path.call(print, \"typeParameters\"));\n const partsGroup = [];\n\n if (n.superClass) {\n const printed = concat$d([\"extends \", path.call(print, \"superClass\"), path.call(print, \"superTypeParameters\")]); // Keep old behaviour of extends in same line\n // If there is only on extends and there are not comments\n\n if ((!n.implements || n.implements.length === 0) && (!n.superClass.comments || n.superClass.comments.length === 0)) {\n parts.push(concat$d([\" \", path.call(superClass => comments.printComments(superClass, () => printed, options), \"superClass\")]));\n } else {\n partsGroup.push(group$b(concat$d([line$9, path.call(superClass => comments.printComments(superClass, () => printed, options), \"superClass\")])));\n }\n } else if (n.extends && n.extends.length > 0) {\n parts.push(\" extends \", join$9(\", \", path.map(print, \"extends\")));\n }\n\n if (n.mixins && n.mixins.length > 0) {\n partsGroup.push(line$9, \"mixins \", group$b(indent$7(join$9(concat$d([\",\", line$9]), path.map(print, \"mixins\")))));\n }\n\n if (n.implements && n.implements.length > 0) {\n partsGroup.push(line$9, \"implements\", group$b(indent$7(concat$d([line$9, join$9(concat$d([\",\", line$9]), path.map(print, \"implements\"))]))));\n }\n\n if (partsGroup.length > 0) {\n parts.push(group$b(indent$7(concat$d(partsGroup))));\n }\n\n if (n.body && n.body.comments && hasLeadingOwnLineComment$1(options.originalText, n.body, options)) {\n parts.push(hardline$9);\n } else {\n parts.push(\" \");\n }\n\n parts.push(path.call(print, \"body\"));\n return parts;\n }\n\n function printOptionalToken(path) {\n const node = path.getValue();\n\n if (!node.optional || // It's an optional computed method parsed by typescript-estree.\n // \"?\" is printed in `printMethod`.\n node.type === \"Identifier\" && node === path.getParentNode().key) {\n return \"\";\n }\n\n if (node.type === \"OptionalCallExpression\" || node.type === \"OptionalMemberExpression\" && node.computed) {\n return \"?.\";\n }\n\n return \"?\";\n }\n\n function printMemberLookup(path, options, print) {\n const property = path.call(print, \"property\");\n const n = path.getValue();\n const optional = printOptionalToken(path);\n\n if (!n.computed) {\n return concat$d([optional, \".\", property]);\n }\n\n if (!n.property || isNumericLiteral$1(n.property)) {\n return concat$d([optional, \"[\", property, \"]\"]);\n }\n\n return group$b(concat$d([optional, \"[\", indent$7(concat$d([softline$6, property])), softline$6, \"]\"]));\n }\n\n function printBindExpressionCallee(path, options, print) {\n return concat$d([\"::\", path.call(print, \"callee\")]);\n } // We detect calls on member expressions specially to format a\n // common pattern better. The pattern we are looking for is this:\n //\n // arr\n // .map(x => x + 1)\n // .filter(x => x > 10)\n // .some(x => x % 2)\n //\n // The way it is structured in the AST is via a nested sequence of\n // MemberExpression and CallExpression. We need to traverse the AST\n // and make groups out of it to print it in the desired way.\n\n\n function printMemberChain(path, options, print) {\n // The first phase is to linearize the AST by traversing it down.\n //\n // a().b()\n // has the following AST structure:\n // CallExpression(MemberExpression(CallExpression(Identifier)))\n // and we transform it into\n // [Identifier, CallExpression, MemberExpression, CallExpression]\n const printedNodes = []; // Here we try to retain one typed empty line after each call expression or\n // the first group whether it is in parentheses or not\n\n function shouldInsertEmptyLineAfter(node) {\n const {\n originalText\n } = options;\n const nextCharIndex = getNextNonSpaceNonCommentCharacterIndex$3(originalText, node, options.locEnd);\n const nextChar = originalText.charAt(nextCharIndex); // if it is cut off by a parenthesis, we only account for one typed empty\n // line after that parenthesis\n\n if (nextChar === \")\") {\n return isNextLineEmptyAfterIndex$2(originalText, nextCharIndex + 1, options.locEnd);\n }\n\n return isNextLineEmpty$4(originalText, node, options.locEnd);\n }\n\n function rec(path) {\n const node = path.getValue();\n\n if ((node.type === \"CallExpression\" || node.type === \"OptionalCallExpression\") && (isMemberish$1(node.callee) || node.callee.type === \"CallExpression\" || node.callee.type === \"OptionalCallExpression\")) {\n printedNodes.unshift({\n node,\n printed: concat$d([comments.printComments(path, () => concat$d([printOptionalToken(path), printFunctionTypeParameters(path, options, print), printArgumentsList(path, options, print)]), options), shouldInsertEmptyLineAfter(node) ? hardline$9 : \"\"])\n });\n path.call(callee => rec(callee), \"callee\");\n } else if (isMemberish$1(node)) {\n printedNodes.unshift({\n node,\n needsParens: needsParens_1(path, options),\n printed: comments.printComments(path, () => node.type === \"OptionalMemberExpression\" || node.type === \"MemberExpression\" ? printMemberLookup(path, options, print) : printBindExpressionCallee(path, options, print), options)\n });\n path.call(object => rec(object), \"object\");\n } else if (node.type === \"TSNonNullExpression\") {\n printedNodes.unshift({\n node,\n printed: comments.printComments(path, () => \"!\", options)\n });\n path.call(expression => rec(expression), \"expression\");\n } else {\n printedNodes.unshift({\n node,\n printed: path.call(print)\n });\n }\n } // Note: the comments of the root node have already been printed, so we\n // need to extract this first call without printing them as they would\n // if handled inside of the recursive call.\n\n\n const node = path.getValue();\n printedNodes.unshift({\n node,\n printed: concat$d([printOptionalToken(path), printFunctionTypeParameters(path, options, print), printArgumentsList(path, options, print)])\n });\n path.call(callee => rec(callee), \"callee\"); // Once we have a linear list of printed nodes, we want to create groups out\n // of it.\n //\n // a().b.c().d().e\n // will be grouped as\n // [\n // [Identifier, CallExpression],\n // [MemberExpression, MemberExpression, CallExpression],\n // [MemberExpression, CallExpression],\n // [MemberExpression],\n // ]\n // so that we can print it as\n // a()\n // .b.c()\n // .d()\n // .e\n // The first group is the first node followed by\n // - as many CallExpression as possible\n // < fn()()() >.something()\n // - as many array accessors as possible\n // < fn()[0][1][2] >.something()\n // - then, as many MemberExpression as possible but the last one\n // < this.items >.something()\n\n const groups = [];\n let currentGroup = [printedNodes[0]];\n let i = 1;\n\n for (; i < printedNodes.length; ++i) {\n if (printedNodes[i].node.type === \"TSNonNullExpression\" || printedNodes[i].node.type === \"OptionalCallExpression\" || printedNodes[i].node.type === \"CallExpression\" || (printedNodes[i].node.type === \"MemberExpression\" || printedNodes[i].node.type === \"OptionalMemberExpression\") && printedNodes[i].node.computed && isNumericLiteral$1(printedNodes[i].node.property)) {\n currentGroup.push(printedNodes[i]);\n } else {\n break;\n }\n }\n\n if (printedNodes[0].node.type !== \"CallExpression\" && printedNodes[0].node.type !== \"OptionalCallExpression\") {\n for (; i + 1 < printedNodes.length; ++i) {\n if (isMemberish$1(printedNodes[i].node) && isMemberish$1(printedNodes[i + 1].node)) {\n currentGroup.push(printedNodes[i]);\n } else {\n break;\n }\n }\n }\n\n groups.push(currentGroup);\n currentGroup = []; // Then, each following group is a sequence of MemberExpression followed by\n // a sequence of CallExpression. To compute it, we keep adding things to the\n // group until we has seen a CallExpression in the past and reach a\n // MemberExpression\n\n let hasSeenCallExpression = false;\n\n for (; i < printedNodes.length; ++i) {\n if (hasSeenCallExpression && isMemberish$1(printedNodes[i].node)) {\n // [0] should be appended at the end of the group instead of the\n // beginning of the next one\n if (printedNodes[i].node.computed && isNumericLiteral$1(printedNodes[i].node.property)) {\n currentGroup.push(printedNodes[i]);\n continue;\n }\n\n groups.push(currentGroup);\n currentGroup = [];\n hasSeenCallExpression = false;\n }\n\n if (printedNodes[i].node.type === \"CallExpression\" || printedNodes[i].node.type === \"OptionalCallExpression\") {\n hasSeenCallExpression = true;\n }\n\n currentGroup.push(printedNodes[i]);\n\n if (printedNodes[i].node.comments && printedNodes[i].node.comments.some(comment => comment.trailing)) {\n groups.push(currentGroup);\n currentGroup = [];\n hasSeenCallExpression = false;\n }\n }\n\n if (currentGroup.length > 0) {\n groups.push(currentGroup);\n } // There are cases like Object.keys(), Observable.of(), _.values() where\n // they are the subject of all the chained calls and therefore should\n // be kept on the same line:\n //\n // Object.keys(items)\n // .filter(x => x)\n // .map(x => x)\n //\n // In order to detect those cases, we use an heuristic: if the first\n // node is an identifier with the name starting with a capital\n // letter or just a sequence of _$. The rationale is that they are\n // likely to be factories.\n\n\n function isFactory(name) {\n return /^[A-Z]|^[_$]+$/.test(name);\n } // In case the Identifier is shorter than tab width, we can keep the\n // first call in a single line, if it's an ExpressionStatement.\n //\n // d3.scaleLinear()\n // .domain([0, 100])\n // .range([0, width]);\n //\n\n\n function isShort(name) {\n return name.length <= options.tabWidth;\n }\n\n function shouldNotWrap(groups) {\n const parent = path.getParentNode();\n const isExpression = parent && parent.type === \"ExpressionStatement\";\n const hasComputed = groups[1].length && groups[1][0].node.computed;\n\n if (groups[0].length === 1) {\n const firstNode = groups[0][0].node;\n return firstNode.type === \"ThisExpression\" || firstNode.type === \"Identifier\" && (isFactory(firstNode.name) || isExpression && isShort(firstNode.name) || hasComputed);\n }\n\n const lastNode = getLast$3(groups[0]).node;\n return (lastNode.type === \"MemberExpression\" || lastNode.type === \"OptionalMemberExpression\") && lastNode.property.type === \"Identifier\" && (isFactory(lastNode.property.name) || hasComputed);\n }\n\n const shouldMerge = groups.length >= 2 && !groups[1][0].node.comments && shouldNotWrap(groups);\n\n function printGroup(printedGroup) {\n const printed = printedGroup.map(tuple => tuple.printed); // Checks if the last node (i.e. the parent node) needs parens and print\n // accordingly\n\n if (printedGroup.length > 0 && printedGroup[printedGroup.length - 1].needsParens) {\n return concat$d([\"(\", ...printed, \")\"]);\n }\n\n return concat$d(printed);\n }\n\n function printIndentedGroup(groups) {\n if (groups.length === 0) {\n return \"\";\n }\n\n return indent$7(group$b(concat$d([hardline$9, join$9(hardline$9, groups.map(printGroup))])));\n }\n\n const printedGroups = groups.map(printGroup);\n const oneLine = concat$d(printedGroups);\n const cutoff = shouldMerge ? 3 : 2;\n const flatGroups = groups.reduce((res, group) => res.concat(group), []);\n const hasComment = flatGroups.slice(1, -1).some(node => hasLeadingComment$3(node.node)) || flatGroups.slice(0, -1).some(node => hasTrailingComment$1(node.node)) || groups[cutoff] && hasLeadingComment$3(groups[cutoff][0].node); // If we only have a single `.`, we shouldn't do anything fancy and just\n // render everything concatenated together.\n\n if (groups.length <= cutoff && !hasComment) {\n if (isLongCurriedCallExpression$1(path)) {\n return oneLine;\n }\n\n return group$b(oneLine);\n } // Find out the last node in the first group and check if it has an\n // empty line after\n\n\n const lastNodeBeforeIndent = getLast$3(shouldMerge ? groups.slice(1, 2)[0] : groups[0]).node;\n const shouldHaveEmptyLineBeforeIndent = lastNodeBeforeIndent.type !== \"CallExpression\" && lastNodeBeforeIndent.type !== \"OptionalCallExpression\" && shouldInsertEmptyLineAfter(lastNodeBeforeIndent);\n const expanded = concat$d([printGroup(groups[0]), shouldMerge ? concat$d(groups.slice(1, 2).map(printGroup)) : \"\", shouldHaveEmptyLineBeforeIndent ? hardline$9 : \"\", printIndentedGroup(groups.slice(shouldMerge ? 2 : 1))]);\n const callExpressions = printedNodes.map(({\n node\n }) => node).filter(isCallOrOptionalCallExpression$1); // We don't want to print in one line if the chain has:\n // * A comment.\n // * Non-trivial arguments.\n // * Any group but the last one has a hard line.\n // If the last group is a function it's okay to inline if it fits.\n\n if (hasComment || callExpressions.length > 2 && callExpressions.some(expr => !expr.arguments.every(arg => isSimpleCallArgument$1(arg, 0))) || printedGroups.slice(0, -1).some(willBreak$1) ||\n /**\n * scopes.filter(scope => scope.value !== '').map((scope, i) => {\n * // multi line content\n * })\n */\n ((lastGroupDoc, lastGroupNode) => isCallOrOptionalCallExpression$1(lastGroupNode) && willBreak$1(lastGroupDoc))(getLast$3(printedGroups), getLast$3(getLast$3(groups)).node) && callExpressions.slice(0, -1).some(n => n.arguments.some(isFunctionOrArrowExpression$1))) {\n return group$b(expanded);\n }\n\n return concat$d([// We only need to check `oneLine` because if `expanded` is chosen\n // that means that the parent group has already been broken\n // naturally\n willBreak$1(oneLine) || shouldHaveEmptyLineBeforeIndent ? breakParent$3 : \"\", conditionalGroup$1([oneLine, expanded])]);\n }\n\n function separatorNoWhitespace(isFacebookTranslationTag, child, childNode, nextNode) {\n if (isFacebookTranslationTag) {\n return \"\";\n }\n\n if (childNode.type === \"JSXElement\" && !childNode.closingElement || nextNode && nextNode.type === \"JSXElement\" && !nextNode.closingElement) {\n return child.length === 1 ? softline$6 : hardline$9;\n }\n\n return softline$6;\n }\n\n function separatorWithWhitespace(isFacebookTranslationTag, child, childNode, nextNode) {\n if (isFacebookTranslationTag) {\n return hardline$9;\n }\n\n if (child.length === 1) {\n return childNode.type === \"JSXElement\" && !childNode.closingElement || nextNode && nextNode.type === \"JSXElement\" && !nextNode.closingElement ? hardline$9 : softline$6;\n }\n\n return hardline$9;\n } // JSX Children are strange, mostly for two reasons:\n // 1. JSX reads newlines into string values, instead of skipping them like JS\n // 2. up to one whitespace between elements within a line is significant,\n // but not between lines.\n //\n // Leading, trailing, and lone whitespace all need to\n // turn themselves into the rather ugly `{' '}` when breaking.\n //\n // We print JSX using the `fill` doc primitive.\n // This requires that we give it an array of alternating\n // content and whitespace elements.\n // To ensure this we add dummy `\"\"` content elements as needed.\n\n\n function printJSXChildren(path, options, print, jsxWhitespace, isFacebookTranslationTag) {\n const n = path.getValue();\n const children = []; // using `map` instead of `each` because it provides `i`\n\n path.map((childPath, i) => {\n const child = childPath.getValue();\n\n if (isLiteral$1(child)) {\n const text = rawText$1(child); // Contains a non-whitespace character\n\n if (isMeaningfulJSXText$1(child)) {\n const words = text.split(matchJsxWhitespaceRegex$1); // Starts with whitespace\n\n if (words[0] === \"\") {\n children.push(\"\");\n words.shift();\n\n if (/\\n/.test(words[0])) {\n const next = n.children[i + 1];\n children.push(separatorWithWhitespace(isFacebookTranslationTag, words[1], child, next));\n } else {\n children.push(jsxWhitespace);\n }\n\n words.shift();\n }\n\n let endWhitespace; // Ends with whitespace\n\n if (getLast$3(words) === \"\") {\n words.pop();\n endWhitespace = words.pop();\n } // This was whitespace only without a new line.\n\n\n if (words.length === 0) {\n return;\n }\n\n words.forEach((word, i) => {\n if (i % 2 === 1) {\n children.push(line$9);\n } else {\n children.push(word);\n }\n });\n\n if (endWhitespace !== undefined) {\n if (/\\n/.test(endWhitespace)) {\n const next = n.children[i + 1];\n children.push(separatorWithWhitespace(isFacebookTranslationTag, getLast$3(children), child, next));\n } else {\n children.push(jsxWhitespace);\n }\n } else {\n const next = n.children[i + 1];\n children.push(separatorNoWhitespace(isFacebookTranslationTag, getLast$3(children), child, next));\n }\n } else if (/\\n/.test(text)) {\n // Keep (up to one) blank line between tags/expressions/text.\n // Note: We don't keep blank lines between text elements.\n if (text.match(/\\n/g).length > 1) {\n children.push(\"\");\n children.push(hardline$9);\n }\n } else {\n children.push(\"\");\n children.push(jsxWhitespace);\n }\n } else {\n const printedChild = print(childPath);\n children.push(printedChild);\n const next = n.children[i + 1];\n const directlyFollowedByMeaningfulText = next && isMeaningfulJSXText$1(next);\n\n if (directlyFollowedByMeaningfulText) {\n const firstWord = rawText$1(next).trim().split(matchJsxWhitespaceRegex$1)[0];\n children.push(separatorNoWhitespace(isFacebookTranslationTag, firstWord, child, next));\n } else {\n children.push(hardline$9);\n }\n }\n }, \"children\");\n return children;\n } // JSX expands children from the inside-out, instead of the outside-in.\n // This is both to break children before attributes,\n // and to ensure that when children break, their parents do as well.\n //\n // Any element that is written without any newlines and fits on a single line\n // is left that way.\n // Not only that, any user-written-line containing multiple JSX siblings\n // should also be kept on one line if possible,\n // so each user-written-line is wrapped in its own group.\n //\n // Elements that contain newlines or don't fit on a single line (recursively)\n // are fully-split, using hardline and shouldBreak: true.\n //\n // To support that case properly, all leading and trailing spaces\n // are stripped from the list of children, and replaced with a single hardline.\n\n\n function printJSXElement(path, options, print) {\n const n = path.getValue();\n\n if (n.type === \"JSXElement\" && isEmptyJSXElement$1(n)) {\n return concat$d([path.call(print, \"openingElement\"), path.call(print, \"closingElement\")]);\n }\n\n const openingLines = n.type === \"JSXElement\" ? path.call(print, \"openingElement\") : path.call(print, \"openingFragment\");\n const closingLines = n.type === \"JSXElement\" ? path.call(print, \"closingElement\") : path.call(print, \"closingFragment\");\n\n if (n.children.length === 1 && n.children[0].type === \"JSXExpressionContainer\" && (n.children[0].expression.type === \"TemplateLiteral\" || n.children[0].expression.type === \"TaggedTemplateExpression\")) {\n return concat$d([openingLines, concat$d(path.map(print, \"children\")), closingLines]);\n } // Convert `{\" \"}` to text nodes containing a space.\n // This makes it easy to turn them into `jsxWhitespace` which\n // can then print as either a space or `{\" \"}` when breaking.\n\n\n n.children = n.children.map(child => {\n if (isJSXWhitespaceExpression$1(child)) {\n return {\n type: \"JSXText\",\n value: \" \",\n raw: \" \"\n };\n }\n\n return child;\n });\n const containsTag = n.children.filter(isJSXNode$1).length > 0;\n const containsMultipleExpressions = n.children.filter(child => child.type === \"JSXExpressionContainer\").length > 1;\n const containsMultipleAttributes = n.type === \"JSXElement\" && n.openingElement.attributes.length > 1; // Record any breaks. Should never go from true to false, only false to true.\n\n let forcedBreak = willBreak$1(openingLines) || containsTag || containsMultipleAttributes || containsMultipleExpressions;\n const isMdxBlock = path.getParentNode().rootMarker === \"mdx\";\n const rawJsxWhitespace = options.singleQuote ? \"{' '}\" : '{\" \"}';\n const jsxWhitespace = isMdxBlock ? concat$d([\" \"]) : ifBreak$6(concat$d([rawJsxWhitespace, softline$6]), \" \");\n const isFacebookTranslationTag = n.openingElement && n.openingElement.name && n.openingElement.name.name === \"fbt\";\n const children = printJSXChildren(path, options, print, jsxWhitespace, isFacebookTranslationTag);\n const containsText = n.children.some(child => isMeaningfulJSXText$1(child)); // We can end up we multiple whitespace elements with empty string\n // content between them.\n // We need to remove empty whitespace and softlines before JSX whitespace\n // to get the correct output.\n\n for (let i = children.length - 2; i >= 0; i--) {\n const isPairOfEmptyStrings = children[i] === \"\" && children[i + 1] === \"\";\n const isPairOfHardlines = children[i] === hardline$9 && children[i + 1] === \"\" && children[i + 2] === hardline$9;\n const isLineFollowedByJSXWhitespace = (children[i] === softline$6 || children[i] === hardline$9) && children[i + 1] === \"\" && children[i + 2] === jsxWhitespace;\n const isJSXWhitespaceFollowedByLine = children[i] === jsxWhitespace && children[i + 1] === \"\" && (children[i + 2] === softline$6 || children[i + 2] === hardline$9);\n const isDoubleJSXWhitespace = children[i] === jsxWhitespace && children[i + 1] === \"\" && children[i + 2] === jsxWhitespace;\n const isPairOfHardOrSoftLines = children[i] === softline$6 && children[i + 1] === \"\" && children[i + 2] === hardline$9 || children[i] === hardline$9 && children[i + 1] === \"\" && children[i + 2] === softline$6;\n\n if (isPairOfHardlines && containsText || isPairOfEmptyStrings || isLineFollowedByJSXWhitespace || isDoubleJSXWhitespace || isPairOfHardOrSoftLines) {\n children.splice(i, 2);\n } else if (isJSXWhitespaceFollowedByLine) {\n children.splice(i + 1, 2);\n }\n } // Trim trailing lines (or empty strings)\n\n\n while (children.length && (isLineNext$1(getLast$3(children)) || isEmpty$1(getLast$3(children)))) {\n children.pop();\n } // Trim leading lines (or empty strings)\n\n\n while (children.length && (isLineNext$1(children[0]) || isEmpty$1(children[0])) && (isLineNext$1(children[1]) || isEmpty$1(children[1]))) {\n children.shift();\n children.shift();\n } // Tweak how we format children if outputting this element over multiple lines.\n // Also detect whether we will force this element to output over multiple lines.\n\n\n const multilineChildren = [];\n children.forEach((child, i) => {\n // There are a number of situations where we need to ensure we display\n // whitespace as `{\" \"}` when outputting this element over multiple lines.\n if (child === jsxWhitespace) {\n if (i === 1 && children[i - 1] === \"\") {\n if (children.length === 2) {\n // Solitary whitespace\n multilineChildren.push(rawJsxWhitespace);\n return;\n } // Leading whitespace\n\n\n multilineChildren.push(concat$d([rawJsxWhitespace, hardline$9]));\n return;\n } else if (i === children.length - 1) {\n // Trailing whitespace\n multilineChildren.push(rawJsxWhitespace);\n return;\n } else if (children[i - 1] === \"\" && children[i - 2] === hardline$9) {\n // Whitespace after line break\n multilineChildren.push(rawJsxWhitespace);\n return;\n }\n }\n\n multilineChildren.push(child);\n\n if (willBreak$1(child)) {\n forcedBreak = true;\n }\n }); // If there is text we use `fill` to fit as much onto each line as possible.\n // When there is no text (just tags and expressions) we use `group`\n // to output each on a separate line.\n\n const content = containsText ? fill$4(multilineChildren) : group$b(concat$d(multilineChildren), {\n shouldBreak: true\n });\n\n if (isMdxBlock) {\n return content;\n }\n\n const multiLineElem = group$b(concat$d([openingLines, indent$7(concat$d([hardline$9, content])), hardline$9, closingLines]));\n\n if (forcedBreak) {\n return multiLineElem;\n }\n\n return conditionalGroup$1([group$b(concat$d([openingLines, concat$d(children), closingLines])), multiLineElem]);\n }\n\n function maybeWrapJSXElementInParens(path, elem, options) {\n const parent = path.getParentNode();\n\n if (!parent) {\n return elem;\n }\n\n const NO_WRAP_PARENTS = {\n ArrayExpression: true,\n JSXAttribute: true,\n JSXElement: true,\n JSXExpressionContainer: true,\n JSXFragment: true,\n ExpressionStatement: true,\n CallExpression: true,\n OptionalCallExpression: true,\n ConditionalExpression: true,\n JsExpressionRoot: true\n };\n\n if (NO_WRAP_PARENTS[parent.type]) {\n return elem;\n }\n\n const shouldBreak = path.match(undefined, node => node.type === \"ArrowFunctionExpression\", isCallOrOptionalCallExpression$1, node => node.type === \"JSXExpressionContainer\");\n const needsParens = needsParens_1(path, options);\n return group$b(concat$d([needsParens ? \"\" : ifBreak$6(\"(\"), indent$7(concat$d([softline$6, elem])), softline$6, needsParens ? \"\" : ifBreak$6(\")\")]), {\n shouldBreak\n });\n }\n\n function shouldInlineLogicalExpression(node) {\n if (node.type !== \"LogicalExpression\") {\n return false;\n }\n\n if (node.right.type === \"ObjectExpression\" && node.right.properties.length !== 0) {\n return true;\n }\n\n if (node.right.type === \"ArrayExpression\" && node.right.elements.length !== 0) {\n return true;\n }\n\n if (isJSXNode$1(node.right)) {\n return true;\n }\n\n return false;\n } // For binary expressions to be consistent, we need to group\n // subsequent operators with the same precedence level under a single\n // group. Otherwise they will be nested such that some of them break\n // onto new lines but not all. Operators with the same precedence\n // level should either all break or not. Because we group them by\n // precedence level and the AST is structured based on precedence\n // level, things are naturally broken up correctly, i.e. `&&` is\n // broken before `+`.\n\n\n function printBinaryishExpressions(path, print, options, isNested, isInsideParenthesis) {\n let parts = [];\n const node = path.getValue(); // We treat BinaryExpression and LogicalExpression nodes the same.\n\n if (isBinaryish$1(node)) {\n // Put all operators with the same precedence level in the same\n // group. The reason we only need to do this with the `left`\n // expression is because given an expression like `1 + 2 - 3`, it\n // is always parsed like `((1 + 2) - 3)`, meaning the `left` side\n // is where the rest of the expression will exist. Binary\n // expressions on the right side mean they have a difference\n // precedence level and should be treated as a separate group, so\n // print them normally. (This doesn't hold for the `**` operator,\n // which is unique in that it is right-associative.)\n if (shouldFlatten$1(node.operator, node.left.operator)) {\n // Flatten them out by recursively calling this function.\n parts = parts.concat(path.call(left => printBinaryishExpressions(left, print, options,\n /* isNested */\n true, isInsideParenthesis), \"left\"));\n } else {\n parts.push(path.call(print, \"left\"));\n }\n\n const shouldInline = shouldInlineLogicalExpression(node);\n const lineBeforeOperator = (node.operator === \"|>\" || node.type === \"NGPipeExpression\" || node.operator === \"|\" && options.parser === \"__vue_expression\") && !hasLeadingOwnLineComment$1(options.originalText, node.right, options);\n const operator = node.type === \"NGPipeExpression\" ? \"|\" : node.operator;\n const rightSuffix = node.type === \"NGPipeExpression\" && node.arguments.length !== 0 ? group$b(indent$7(concat$d([softline$6, \": \", join$9(concat$d([softline$6, \":\", ifBreak$6(\" \")]), path.map(print, \"arguments\").map(arg => align$1(2, group$b(arg))))]))) : \"\";\n const right = shouldInline ? concat$d([operator, \" \", path.call(print, \"right\"), rightSuffix]) : concat$d([lineBeforeOperator ? softline$6 : \"\", operator, lineBeforeOperator ? \" \" : line$9, path.call(print, \"right\"), rightSuffix]); // If there's only a single binary expression, we want to create a group\n // in order to avoid having a small right part like -1 be on its own line.\n\n const parent = path.getParentNode();\n const shouldGroup = !(isInsideParenthesis && node.type === \"LogicalExpression\") && parent.type !== node.type && node.left.type !== node.type && node.right.type !== node.type;\n parts.push(\" \", shouldGroup ? group$b(right) : right); // The root comments are already printed, but we need to manually print\n // the other ones since we don't call the normal print on BinaryExpression,\n // only for the left and right parts\n\n if (isNested && node.comments) {\n parts = comments.printComments(path, () => concat$d(parts), options);\n }\n } else {\n // Our stopping case. Simply print the node normally.\n parts.push(path.call(print));\n }\n\n return parts;\n }\n\n function printAssignmentRight(leftNode, rightNode, printedRight, options) {\n if (hasLeadingOwnLineComment$1(options.originalText, rightNode, options)) {\n return indent$7(concat$d([line$9, printedRight]));\n }\n\n const canBreak = isBinaryish$1(rightNode) && !shouldInlineLogicalExpression(rightNode) || rightNode.type === \"ConditionalExpression\" && isBinaryish$1(rightNode.test) && !shouldInlineLogicalExpression(rightNode.test) || rightNode.type === \"StringLiteralTypeAnnotation\" || rightNode.type === \"ClassExpression\" && rightNode.decorators && rightNode.decorators.length || (leftNode.type === \"Identifier\" || isStringLiteral$1(leftNode) || leftNode.type === \"MemberExpression\") && (isStringLiteral$1(rightNode) || isMemberExpressionChain$1(rightNode)) && // do not put values on a separate line from the key in json\n options.parser !== \"json\" && options.parser !== \"json5\" || rightNode.type === \"SequenceExpression\";\n\n if (canBreak) {\n return group$b(indent$7(concat$d([line$9, printedRight])));\n }\n\n return concat$d([\" \", printedRight]);\n }\n\n function printAssignment(leftNode, printedLeft, operator, rightNode, printedRight, options) {\n if (!rightNode) {\n return printedLeft;\n }\n\n const printed = printAssignmentRight(leftNode, rightNode, printedRight, options);\n return group$b(concat$d([printedLeft, operator, printed]));\n }\n\n function adjustClause(node, clause, forceSpace) {\n if (node.type === \"EmptyStatement\") {\n return \";\";\n }\n\n if (node.type === \"BlockStatement\" || forceSpace) {\n return concat$d([\" \", clause]);\n }\n\n return indent$7(concat$d([line$9, clause]));\n }\n\n function nodeStr(node, options, isFlowOrTypeScriptDirectiveLiteral) {\n const raw = rawText$1(node);\n const isDirectiveLiteral = isFlowOrTypeScriptDirectiveLiteral || node.type === \"DirectiveLiteral\";\n return printString$2(raw, options, isDirectiveLiteral);\n }\n\n function printRegex(node) {\n const flags = node.flags.split(\"\").sort().join(\"\");\n return \"/\".concat(node.pattern, \"/\").concat(flags);\n }\n\n function exprNeedsASIProtection(path, options) {\n const node = path.getValue();\n const maybeASIProblem = needsParens_1(path, options) || node.type === \"ParenthesizedExpression\" || node.type === \"TypeCastExpression\" || node.type === \"ArrowFunctionExpression\" && !shouldPrintParamsWithoutParens(path, options) || node.type === \"ArrayExpression\" || node.type === \"ArrayPattern\" || node.type === \"UnaryExpression\" && node.prefix && (node.operator === \"+\" || node.operator === \"-\") || node.type === \"TemplateLiteral\" || node.type === \"TemplateElement\" || isJSXNode$1(node) || node.type === \"BindExpression\" && !node.object || node.type === \"RegExpLiteral\" || node.type === \"Literal\" && node.pattern || node.type === \"Literal\" && node.regex;\n\n if (maybeASIProblem) {\n return true;\n }\n\n if (!hasNakedLeftSide$2(node)) {\n return false;\n }\n\n return path.call(childPath => exprNeedsASIProtection(childPath, options), ...getLeftSidePathName$2(path, node));\n }\n\n function stmtNeedsASIProtection(path, options) {\n const node = path.getNode();\n\n if (node.type !== \"ExpressionStatement\") {\n return false;\n }\n\n return path.call(childPath => exprNeedsASIProtection(childPath, options), \"expression\");\n }\n\n function shouldHugType(node) {\n if (isSimpleFlowType$1(node) || isObjectType$1(node)) {\n return true;\n }\n\n if (node.type === \"UnionTypeAnnotation\" || node.type === \"TSUnionType\") {\n const voidCount = node.types.filter(n => n.type === \"VoidTypeAnnotation\" || n.type === \"TSVoidKeyword\" || n.type === \"NullLiteralTypeAnnotation\" || n.type === \"TSNullKeyword\").length;\n const hasObject = node.types.some(n => n.type === \"ObjectTypeAnnotation\" || n.type === \"TSTypeLiteral\" || // This is a bit aggressive but captures Array<{x}>\n n.type === \"GenericTypeAnnotation\" || n.type === \"TSTypeReference\");\n\n if (node.types.length - 1 === voidCount && hasObject) {\n return true;\n }\n }\n\n return false;\n }\n\n function shouldHugArguments(fun) {\n if (!fun || fun.rest) {\n return false;\n }\n\n const params = fun.params || fun.parameters;\n\n if (!params || params.length !== 1) {\n return false;\n }\n\n const param = params[0];\n return !param.comments && (param.type === \"ObjectPattern\" || param.type === \"ArrayPattern\" || param.type === \"Identifier\" && param.typeAnnotation && (param.typeAnnotation.type === \"TypeAnnotation\" || param.typeAnnotation.type === \"TSTypeAnnotation\") && isObjectType$1(param.typeAnnotation.typeAnnotation) || param.type === \"FunctionTypeParam\" && isObjectType$1(param.typeAnnotation) || param.type === \"AssignmentPattern\" && (param.left.type === \"ObjectPattern\" || param.left.type === \"ArrayPattern\") && (param.right.type === \"Identifier\" || param.right.type === \"ObjectExpression\" && param.right.properties.length === 0 || param.right.type === \"ArrayExpression\" && param.right.elements.length === 0));\n }\n\n function printArrayItems(path, options, printPath, print) {\n const printedElements = [];\n let separatorParts = [];\n path.each(childPath => {\n printedElements.push(concat$d(separatorParts));\n printedElements.push(group$b(print(childPath)));\n separatorParts = [\",\", line$9];\n\n if (childPath.getValue() && isNextLineEmpty$4(options.originalText, childPath.getValue(), options.locEnd)) {\n separatorParts.push(softline$6);\n }\n }, printPath);\n return concat$d(printedElements);\n }\n\n function printReturnAndThrowArgument(path, options, print) {\n const node = path.getValue();\n const semi = options.semi ? \";\" : \"\";\n const parts = [];\n\n if (node.argument) {\n if (returnArgumentHasLeadingComment$1(options, node.argument)) {\n parts.push(concat$d([\" (\", indent$7(concat$d([hardline$9, path.call(print, \"argument\")])), hardline$9, \")\"]));\n } else if (isBinaryish$1(node.argument) || node.argument.type === \"SequenceExpression\") {\n parts.push(group$b(concat$d([ifBreak$6(\" (\", \" \"), indent$7(concat$d([softline$6, path.call(print, \"argument\")])), softline$6, ifBreak$6(\")\")])));\n } else {\n parts.push(\" \", path.call(print, \"argument\"));\n }\n }\n\n const lastComment = Array.isArray(node.comments) && node.comments[node.comments.length - 1];\n const isLastCommentLine = lastComment && (lastComment.type === \"CommentLine\" || lastComment.type === \"Line\");\n\n if (isLastCommentLine) {\n parts.push(semi);\n }\n\n if (hasDanglingComments$1(node)) {\n parts.push(\" \", comments.printDanglingComments(path, options,\n /* sameIndent */\n true));\n }\n\n if (!isLastCommentLine) {\n parts.push(semi);\n }\n\n return concat$d(parts);\n }\n\n function willPrintOwnComments(path\n /*, options */\n ) {\n const node = path.getValue();\n const parent = path.getParentNode();\n return (node && (isJSXNode$1(node) || hasFlowShorthandAnnotationComment$2(node) || parent && (parent.type === \"CallExpression\" || parent.type === \"OptionalCallExpression\") && (hasFlowAnnotationComment$1(node.leadingComments) || hasFlowAnnotationComment$1(node.trailingComments))) || parent && (parent.type === \"JSXSpreadAttribute\" || parent.type === \"JSXSpreadChild\" || parent.type === \"UnionTypeAnnotation\" || parent.type === \"TSUnionType\" || (parent.type === \"ClassDeclaration\" || parent.type === \"ClassExpression\") && parent.superClass === node)) && (!hasIgnoreComment$4(path) || parent.type === \"UnionTypeAnnotation\" || parent.type === \"TSUnionType\");\n }\n\n function canAttachComment$1(node) {\n return node.type && node.type !== \"CommentBlock\" && node.type !== \"CommentLine\" && node.type !== \"Line\" && node.type !== \"Block\" && node.type !== \"EmptyStatement\" && node.type !== \"TemplateElement\" && node.type !== \"Import\";\n }\n\n function printComment$2(commentPath, options) {\n const comment = commentPath.getValue();\n\n switch (comment.type) {\n case \"CommentBlock\":\n case \"Block\":\n {\n if (isIndentableBlockComment(comment)) {\n const printed = printIndentableBlockComment(comment); // We need to prevent an edge case of a previous trailing comment\n // printed as a `lineSuffix` which causes the comments to be\n // interleaved. See https://github.com/prettier/prettier/issues/4412\n\n if (comment.trailing && !hasNewline$5(options.originalText, options.locStart(comment), {\n backwards: true\n })) {\n return concat$d([hardline$9, printed]);\n }\n\n return printed;\n }\n\n const commentEnd = options.locEnd(comment);\n const isInsideFlowComment = options.originalText.slice(commentEnd - 3, commentEnd) === \"*-/\";\n return \"/*\" + comment.value + (isInsideFlowComment ? \"*-/\" : \"*/\");\n }\n\n case \"CommentLine\":\n case \"Line\":\n // Print shebangs with the proper comment characters\n if (options.originalText.slice(options.locStart(comment)).startsWith(\"#!\")) {\n return \"#!\" + comment.value.trimEnd();\n }\n\n return \"//\" + comment.value.trimEnd();\n\n default:\n throw new Error(\"Not a comment: \" + JSON.stringify(comment));\n }\n }\n\n function isIndentableBlockComment(comment) {\n // If the comment has multiple lines and every line starts with a star\n // we can fix the indentation of each line. The stars in the `/*` and\n // `*/` delimiters are not included in the comment value, so add them\n // back first.\n const lines = \"*\".concat(comment.value, \"*\").split(\"\\n\");\n return lines.length > 1 && lines.every(line => line.trim()[0] === \"*\");\n }\n\n function printIndentableBlockComment(comment) {\n const lines = comment.value.split(\"\\n\");\n return concat$d([\"/*\", join$9(hardline$9, lines.map((line, index) => index === 0 ? line.trimEnd() : \" \" + (index < lines.length - 1 ? line.trim() : line.trimStart()))), \"*/\"]);\n }\n\n var printerEstree = {\n preprocess: preprocess_1$1,\n print: genericPrint$3,\n embed: embed_1$1,\n insertPragma: insertPragma$7,\n massageAstNode: clean_1$1,\n hasPrettierIgnore: hasPrettierIgnore$5,\n willPrintOwnComments,\n canAttachComment: canAttachComment$1,\n printComment: printComment$2,\n isBlockComment: comments$1.isBlockComment,\n handleComments: {\n ownLine: comments$1.handleOwnLineComment,\n endOfLine: comments$1.handleEndOfLineComment,\n remaining: comments$1.handleRemainingComment\n },\n getGapRegex: comments$1.getGapRegex,\n getCommentChildNodes: comments$1.getCommentChildNodes\n };\n\n const {\n concat: concat$e,\n hardline: hardline$a,\n indent: indent$8,\n join: join$a\n } = document.builders;\n\n function genericPrint$4(path, options, print) {\n const node = path.getValue();\n\n switch (node.type) {\n case \"JsonRoot\":\n return concat$e([path.call(print, \"node\"), hardline$a]);\n\n case \"ArrayExpression\":\n return node.elements.length === 0 ? \"[]\" : concat$e([\"[\", indent$8(concat$e([hardline$a, join$a(concat$e([\",\", hardline$a]), path.map(print, \"elements\"))])), hardline$a, \"]\"]);\n\n case \"ObjectExpression\":\n return node.properties.length === 0 ? \"{}\" : concat$e([\"{\", indent$8(concat$e([hardline$a, join$a(concat$e([\",\", hardline$a]), path.map(print, \"properties\"))])), hardline$a, \"}\"]);\n\n case \"ObjectProperty\":\n return concat$e([path.call(print, \"key\"), \": \", path.call(print, \"value\")]);\n\n case \"UnaryExpression\":\n return concat$e([node.operator === \"+\" ? \"\" : node.operator, path.call(print, \"argument\")]);\n\n case \"NullLiteral\":\n return \"null\";\n\n case \"BooleanLiteral\":\n return node.value ? \"true\" : \"false\";\n\n case \"StringLiteral\":\n case \"NumericLiteral\":\n return JSON.stringify(node.value);\n\n case \"Identifier\":\n return JSON.stringify(node.name);\n\n default:\n /* istanbul ignore next */\n throw new Error(\"unknown type: \" + JSON.stringify(node.type));\n }\n }\n\n function clean$5(node, newNode\n /*, parent*/\n ) {\n delete newNode.start;\n delete newNode.end;\n delete newNode.extra;\n delete newNode.loc;\n delete newNode.comments;\n delete newNode.errors;\n\n if (node.type === \"Identifier\") {\n return {\n type: \"StringLiteral\",\n value: node.name\n };\n }\n\n if (node.type === \"UnaryExpression\" && node.operator === \"+\") {\n return newNode.argument;\n }\n }\n\n var printerEstreeJson = {\n preprocess: preprocess_1$1,\n print: genericPrint$4,\n massageAstNode: clean$5\n };\n\n const CATEGORY_JAVASCRIPT = \"JavaScript\"; // format based on https://github.com/prettier/prettier/blob/master/src/main/core-options.js\n\n var options$5 = {\n arrowParens: {\n since: \"1.9.0\",\n category: CATEGORY_JAVASCRIPT,\n type: \"choice\",\n default: [{\n since: \"1.9.0\",\n value: \"avoid\"\n }, {\n since: \"2.0.0\",\n value: \"always\"\n }],\n description: \"Include parentheses around a sole arrow function parameter.\",\n choices: [{\n value: \"always\",\n description: \"Always include parens. Example: `(x) => x`\"\n }, {\n value: \"avoid\",\n description: \"Omit parens when possible. Example: `x => x`\"\n }]\n },\n bracketSpacing: commonOptions.bracketSpacing,\n jsxBracketSameLine: {\n since: \"0.17.0\",\n category: CATEGORY_JAVASCRIPT,\n type: \"boolean\",\n default: false,\n description: \"Put > on the last line instead of at a new line.\"\n },\n semi: {\n since: \"1.0.0\",\n category: CATEGORY_JAVASCRIPT,\n type: \"boolean\",\n default: true,\n description: \"Print semicolons.\",\n oppositeDescription: \"Do not print semicolons, except at the beginning of lines which may need them.\"\n },\n singleQuote: commonOptions.singleQuote,\n jsxSingleQuote: {\n since: \"1.15.0\",\n category: CATEGORY_JAVASCRIPT,\n type: \"boolean\",\n default: false,\n description: \"Use single quotes in JSX.\"\n },\n quoteProps: {\n since: \"1.17.0\",\n category: CATEGORY_JAVASCRIPT,\n type: \"choice\",\n default: \"as-needed\",\n description: \"Change when properties in objects are quoted.\",\n choices: [{\n value: \"as-needed\",\n description: \"Only add quotes around object properties where required.\"\n }, {\n value: \"consistent\",\n description: \"If at least one property in an object requires quotes, quote all properties.\"\n }, {\n value: \"preserve\",\n description: \"Respect the input use of quotes in object properties.\"\n }]\n },\n trailingComma: {\n since: \"0.0.0\",\n category: CATEGORY_JAVASCRIPT,\n type: \"choice\",\n default: [{\n since: \"0.0.0\",\n value: false\n }, {\n since: \"0.19.0\",\n value: \"none\"\n }, {\n since: \"2.0.0\",\n value: \"es5\"\n }],\n description: \"Print trailing commas wherever possible when multi-line.\",\n choices: [{\n value: \"es5\",\n description: \"Trailing commas where valid in ES5 (objects, arrays, etc.)\"\n }, {\n value: \"none\",\n description: \"No trailing commas.\"\n }, {\n value: \"all\",\n description: \"Trailing commas wherever possible (including function arguments).\"\n }]\n }\n };\n\n var name$9 = \"JavaScript\";\n var type$8 = \"programming\";\n var tmScope$8 = \"source.js\";\n var aceMode$8 = \"javascript\";\n var codemirrorMode$4 = \"javascript\";\n var codemirrorMimeType$4 = \"text/javascript\";\n var color$3 = \"#f1e05a\";\n var aliases$2 = [\n \t\"js\",\n \t\"node\"\n ];\n var extensions$8 = [\n \t\".js\",\n \t\"._js\",\n \t\".bones\",\n \t\".cjs\",\n \t\".es\",\n \t\".es6\",\n \t\".frag\",\n \t\".gs\",\n \t\".jake\",\n \t\".jsb\",\n \t\".jscad\",\n \t\".jsfl\",\n \t\".jsm\",\n \t\".jss\",\n \t\".mjs\",\n \t\".njs\",\n \t\".pac\",\n \t\".sjs\",\n \t\".ssjs\",\n \t\".xsjs\",\n \t\".xsjslib\"\n ];\n var filenames = [\n \t\"Jakefile\"\n ];\n var interpreters = [\n \t\"chakra\",\n \t\"d8\",\n \t\"gjs\",\n \t\"js\",\n \t\"node\",\n \t\"qjs\",\n \t\"rhino\",\n \t\"v8\",\n \t\"v8-shell\"\n ];\n var languageId$8 = 183;\n var JavaScript = {\n \tname: name$9,\n \ttype: type$8,\n \ttmScope: tmScope$8,\n \taceMode: aceMode$8,\n \tcodemirrorMode: codemirrorMode$4,\n \tcodemirrorMimeType: codemirrorMimeType$4,\n \tcolor: color$3,\n \taliases: aliases$2,\n \textensions: extensions$8,\n \tfilenames: filenames,\n \tinterpreters: interpreters,\n \tlanguageId: languageId$8\n };\n\n var JavaScript$1 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n name: name$9,\n type: type$8,\n tmScope: tmScope$8,\n aceMode: aceMode$8,\n codemirrorMode: codemirrorMode$4,\n codemirrorMimeType: codemirrorMimeType$4,\n color: color$3,\n aliases: aliases$2,\n extensions: extensions$8,\n filenames: filenames,\n interpreters: interpreters,\n languageId: languageId$8,\n 'default': JavaScript\n });\n\n var name$a = \"JSX\";\n var type$9 = \"programming\";\n var group$c = \"JavaScript\";\n var extensions$9 = [\n \t\".jsx\"\n ];\n var tmScope$9 = \"source.js.jsx\";\n var aceMode$9 = \"javascript\";\n var codemirrorMode$5 = \"jsx\";\n var codemirrorMimeType$5 = \"text/jsx\";\n var languageId$9 = 178;\n var JSX = {\n \tname: name$a,\n \ttype: type$9,\n \tgroup: group$c,\n \textensions: extensions$9,\n \ttmScope: tmScope$9,\n \taceMode: aceMode$9,\n \tcodemirrorMode: codemirrorMode$5,\n \tcodemirrorMimeType: codemirrorMimeType$5,\n \tlanguageId: languageId$9\n };\n\n var JSX$1 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n name: name$a,\n type: type$9,\n group: group$c,\n extensions: extensions$9,\n tmScope: tmScope$9,\n aceMode: aceMode$9,\n codemirrorMode: codemirrorMode$5,\n codemirrorMimeType: codemirrorMimeType$5,\n languageId: languageId$9,\n 'default': JSX\n });\n\n var name$b = \"TypeScript\";\n var type$a = \"programming\";\n var color$4 = \"#2b7489\";\n var aliases$3 = [\n \t\"ts\"\n ];\n var interpreters$1 = [\n \t\"deno\",\n \t\"ts-node\"\n ];\n var extensions$a = [\n \t\".ts\"\n ];\n var tmScope$a = \"source.ts\";\n var aceMode$a = \"typescript\";\n var codemirrorMode$6 = \"javascript\";\n var codemirrorMimeType$6 = \"application/typescript\";\n var languageId$a = 378;\n var TypeScript = {\n \tname: name$b,\n \ttype: type$a,\n \tcolor: color$4,\n \taliases: aliases$3,\n \tinterpreters: interpreters$1,\n \textensions: extensions$a,\n \ttmScope: tmScope$a,\n \taceMode: aceMode$a,\n \tcodemirrorMode: codemirrorMode$6,\n \tcodemirrorMimeType: codemirrorMimeType$6,\n \tlanguageId: languageId$a\n };\n\n var TypeScript$1 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n name: name$b,\n type: type$a,\n color: color$4,\n aliases: aliases$3,\n interpreters: interpreters$1,\n extensions: extensions$a,\n tmScope: tmScope$a,\n aceMode: aceMode$a,\n codemirrorMode: codemirrorMode$6,\n codemirrorMimeType: codemirrorMimeType$6,\n languageId: languageId$a,\n 'default': TypeScript\n });\n\n var name$c = \"TSX\";\n var type$b = \"programming\";\n var group$d = \"TypeScript\";\n var extensions$b = [\n \t\".tsx\"\n ];\n var tmScope$b = \"source.tsx\";\n var aceMode$b = \"javascript\";\n var codemirrorMode$7 = \"jsx\";\n var codemirrorMimeType$7 = \"text/jsx\";\n var languageId$b = 94901924;\n var TSX = {\n \tname: name$c,\n \ttype: type$b,\n \tgroup: group$d,\n \textensions: extensions$b,\n \ttmScope: tmScope$b,\n \taceMode: aceMode$b,\n \tcodemirrorMode: codemirrorMode$7,\n \tcodemirrorMimeType: codemirrorMimeType$7,\n \tlanguageId: languageId$b\n };\n\n var TSX$1 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n name: name$c,\n type: type$b,\n group: group$d,\n extensions: extensions$b,\n tmScope: tmScope$b,\n aceMode: aceMode$b,\n codemirrorMode: codemirrorMode$7,\n codemirrorMimeType: codemirrorMimeType$7,\n languageId: languageId$b,\n 'default': TSX\n });\n\n var name$d = \"JSON\";\n var type$c = \"data\";\n var tmScope$c = \"source.json\";\n var aceMode$c = \"json\";\n var codemirrorMode$8 = \"javascript\";\n var codemirrorMimeType$8 = \"application/json\";\n var searchable = false;\n var extensions$c = [\n \t\".json\",\n \t\".avsc\",\n \t\".geojson\",\n \t\".gltf\",\n \t\".har\",\n \t\".ice\",\n \t\".JSON-tmLanguage\",\n \t\".jsonl\",\n \t\".mcmeta\",\n \t\".tfstate\",\n \t\".tfstate.backup\",\n \t\".topojson\",\n \t\".webapp\",\n \t\".webmanifest\",\n \t\".yy\",\n \t\".yyp\"\n ];\n var filenames$1 = [\n \t\".arcconfig\",\n \t\".htmlhintrc\",\n \t\".tern-config\",\n \t\".tern-project\",\n \t\".watchmanconfig\",\n \t\"composer.lock\",\n \t\"mcmod.info\"\n ];\n var languageId$c = 174;\n var _JSON = {\n \tname: name$d,\n \ttype: type$c,\n \ttmScope: tmScope$c,\n \taceMode: aceMode$c,\n \tcodemirrorMode: codemirrorMode$8,\n \tcodemirrorMimeType: codemirrorMimeType$8,\n \tsearchable: searchable,\n \textensions: extensions$c,\n \tfilenames: filenames$1,\n \tlanguageId: languageId$c\n };\n\n var _JSON$1 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n name: name$d,\n type: type$c,\n tmScope: tmScope$c,\n aceMode: aceMode$c,\n codemirrorMode: codemirrorMode$8,\n codemirrorMimeType: codemirrorMimeType$8,\n searchable: searchable,\n extensions: extensions$c,\n filenames: filenames$1,\n languageId: languageId$c,\n 'default': _JSON\n });\n\n var name$e = \"JSON with Comments\";\n var type$d = \"data\";\n var group$e = \"JSON\";\n var tmScope$d = \"source.js\";\n var aceMode$d = \"javascript\";\n var codemirrorMode$9 = \"javascript\";\n var codemirrorMimeType$9 = \"text/javascript\";\n var aliases$4 = [\n \t\"jsonc\"\n ];\n var extensions$d = [\n \t\".jsonc\",\n \t\".sublime-build\",\n \t\".sublime-commands\",\n \t\".sublime-completions\",\n \t\".sublime-keymap\",\n \t\".sublime-macro\",\n \t\".sublime-menu\",\n \t\".sublime-mousemap\",\n \t\".sublime-project\",\n \t\".sublime-settings\",\n \t\".sublime-theme\",\n \t\".sublime-workspace\",\n \t\".sublime_metrics\",\n \t\".sublime_session\"\n ];\n var filenames$2 = [\n \t\".babelrc\",\n \t\".eslintrc.json\",\n \t\".jscsrc\",\n \t\".jshintrc\",\n \t\".jslintrc\",\n \t\"jsconfig.json\",\n \t\"language-configuration.json\",\n \t\"tsconfig.json\"\n ];\n var languageId$d = 423;\n var JSON_with_Comments = {\n \tname: name$e,\n \ttype: type$d,\n \tgroup: group$e,\n \ttmScope: tmScope$d,\n \taceMode: aceMode$d,\n \tcodemirrorMode: codemirrorMode$9,\n \tcodemirrorMimeType: codemirrorMimeType$9,\n \taliases: aliases$4,\n \textensions: extensions$d,\n \tfilenames: filenames$2,\n \tlanguageId: languageId$d\n };\n\n var JSON_with_Comments$1 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n name: name$e,\n type: type$d,\n group: group$e,\n tmScope: tmScope$d,\n aceMode: aceMode$d,\n codemirrorMode: codemirrorMode$9,\n codemirrorMimeType: codemirrorMimeType$9,\n aliases: aliases$4,\n extensions: extensions$d,\n filenames: filenames$2,\n languageId: languageId$d,\n 'default': JSON_with_Comments\n });\n\n var name$f = \"JSON5\";\n var type$e = \"data\";\n var extensions$e = [\n \t\".json5\"\n ];\n var tmScope$e = \"source.js\";\n var aceMode$e = \"javascript\";\n var codemirrorMode$a = \"javascript\";\n var codemirrorMimeType$a = \"application/json\";\n var languageId$e = 175;\n var JSON5 = {\n \tname: name$f,\n \ttype: type$e,\n \textensions: extensions$e,\n \ttmScope: tmScope$e,\n \taceMode: aceMode$e,\n \tcodemirrorMode: codemirrorMode$a,\n \tcodemirrorMimeType: codemirrorMimeType$a,\n \tlanguageId: languageId$e\n };\n\n var JSON5$1 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n name: name$f,\n type: type$e,\n extensions: extensions$e,\n tmScope: tmScope$e,\n aceMode: aceMode$e,\n codemirrorMode: codemirrorMode$a,\n codemirrorMimeType: codemirrorMimeType$a,\n languageId: languageId$e,\n 'default': JSON5\n });\n\n var require$$0$6 = getCjsExportFromNamespace(JavaScript$1);\n\n var require$$1$2 = getCjsExportFromNamespace(JSX$1);\n\n var require$$2$1 = getCjsExportFromNamespace(TypeScript$1);\n\n var require$$3$1 = getCjsExportFromNamespace(TSX$1);\n\n var require$$4 = getCjsExportFromNamespace(_JSON$1);\n\n var require$$5 = getCjsExportFromNamespace(JSON_with_Comments$1);\n\n var require$$6 = getCjsExportFromNamespace(JSON5$1);\n\n const languages$4 = [createLanguage(require$$0$6, data => ({\n since: \"0.0.0\",\n parsers: [\"babel\", \"flow\"],\n vscodeLanguageIds: [\"javascript\", \"mongo\"],\n interpreters: data.interpreters.concat([\"nodejs\"])\n })), createLanguage(require$$0$6, () => ({\n name: \"Flow\",\n since: \"0.0.0\",\n parsers: [\"babel\", \"flow\"],\n vscodeLanguageIds: [\"javascript\"],\n aliases: [],\n filenames: [],\n extensions: [\".js.flow\"]\n })), createLanguage(require$$1$2, () => ({\n since: \"0.0.0\",\n parsers: [\"babel\", \"flow\"],\n vscodeLanguageIds: [\"javascriptreact\"]\n })), createLanguage(require$$2$1, () => ({\n since: \"1.4.0\",\n parsers: [\"typescript\", \"babel-ts\"],\n vscodeLanguageIds: [\"typescript\"]\n })), createLanguage(require$$3$1, () => ({\n since: \"1.4.0\",\n parsers: [\"typescript\", \"babel-ts\"],\n vscodeLanguageIds: [\"typescriptreact\"]\n })), createLanguage(require$$4, () => ({\n name: \"JSON.stringify\",\n since: \"1.13.0\",\n parsers: [\"json-stringify\"],\n vscodeLanguageIds: [\"json\"],\n extensions: [],\n // .json file defaults to json instead of json-stringify\n filenames: [\"package.json\", \"package-lock.json\", \"composer.json\"]\n })), createLanguage(require$$4, data => ({\n since: \"1.5.0\",\n parsers: [\"json\"],\n vscodeLanguageIds: [\"json\"],\n filenames: data.filenames.concat([\".prettierrc\"])\n })), createLanguage(require$$5, data => ({\n since: \"1.5.0\",\n parsers: [\"json\"],\n vscodeLanguageIds: [\"jsonc\"],\n filenames: data.filenames.concat([\".eslintrc\"])\n })), createLanguage(require$$6, () => ({\n since: \"1.13.0\",\n parsers: [\"json5\"],\n vscodeLanguageIds: [\"json5\"]\n }))];\n const printers$4 = {\n estree: printerEstree,\n \"estree-json\": printerEstreeJson\n };\n var languageJs = {\n languages: languages$4,\n options: options$5,\n printers: printers$4\n };\n\n var json$1 = {\n \"cjkPattern\": \"[\\\\u02ea-\\\\u02eb\\\\u1100-\\\\u11ff\\\\u2e80-\\\\u2e99\\\\u2e9b-\\\\u2ef3\\\\u2f00-\\\\u2fd5\\\\u3000-\\\\u303f\\\\u3041-\\\\u3096\\\\u3099-\\\\u309f\\\\u30a1-\\\\u30fa\\\\u30fc-\\\\u30ff\\\\u3105-\\\\u312f\\\\u3131-\\\\u318e\\\\u3190-\\\\u3191\\\\u3196-\\\\u31ba\\\\u31c0-\\\\u31e3\\\\u31f0-\\\\u321e\\\\u322a-\\\\u3247\\\\u3260-\\\\u327e\\\\u328a-\\\\u32b0\\\\u32c0-\\\\u32cb\\\\u32d0-\\\\u3370\\\\u337b-\\\\u337f\\\\u33e0-\\\\u33fe\\\\u3400-\\\\u4db5\\\\u4e00-\\\\u9fef\\\\ua960-\\\\ua97c\\\\uac00-\\\\ud7a3\\\\ud7b0-\\\\ud7c6\\\\ud7cb-\\\\ud7fb\\\\uf900-\\\\ufa6d\\\\ufa70-\\\\ufad9\\\\ufe10-\\\\ufe1f\\\\ufe30-\\\\ufe6f\\\\uff00-\\\\uffef]|[\\\\ud840-\\\\ud868\\\\ud86a-\\\\ud86c\\\\ud86f-\\\\ud872\\\\ud874-\\\\ud879][\\\\udc00-\\\\udfff]|\\\\ud82c[\\\\udc00-\\\\udd1e\\\\udd50-\\\\udd52\\\\udd64-\\\\udd67]|\\\\ud83c[\\\\ude00\\\\ude50-\\\\ude51]|\\\\ud869[\\\\udc00-\\\\uded6\\\\udf00-\\\\udfff]|\\\\ud86d[\\\\udc00-\\\\udf34\\\\udf40-\\\\udfff]|\\\\ud86e[\\\\udc00-\\\\udc1d\\\\udc20-\\\\udfff]|\\\\ud873[\\\\udc00-\\\\udea1\\\\udeb0-\\\\udfff]|\\\\ud87a[\\\\udc00-\\\\udfe0]|\\\\ud87e[\\\\udc00-\\\\ude1d]\",\n \"kPattern\": \"[\\\\u1100-\\\\u11ff\\\\u3001-\\\\u3003\\\\u3008-\\\\u3011\\\\u3013-\\\\u301f\\\\u302e-\\\\u3030\\\\u3037\\\\u30fb\\\\u3131-\\\\u318e\\\\u3200-\\\\u321e\\\\u3260-\\\\u327e\\\\ua960-\\\\ua97c\\\\uac00-\\\\ud7a3\\\\ud7b0-\\\\ud7c6\\\\ud7cb-\\\\ud7fb\\\\ufe45-\\\\ufe46\\\\uff61-\\\\uff65\\\\uffa0-\\\\uffbe\\\\uffc2-\\\\uffc7\\\\uffca-\\\\uffcf\\\\uffd2-\\\\uffd7\\\\uffda-\\\\uffdc]\",\n \"punctuationPattern\": \"[\\\\u0021-\\\\u002f\\\\u003a-\\\\u0040\\\\u005b-\\\\u0060\\\\u007b-\\\\u007e\\\\u00a1\\\\u00a7\\\\u00ab\\\\u00b6-\\\\u00b7\\\\u00bb\\\\u00bf\\\\u037e\\\\u0387\\\\u055a-\\\\u055f\\\\u0589-\\\\u058a\\\\u05be\\\\u05c0\\\\u05c3\\\\u05c6\\\\u05f3-\\\\u05f4\\\\u0609-\\\\u060a\\\\u060c-\\\\u060d\\\\u061b\\\\u061e-\\\\u061f\\\\u066a-\\\\u066d\\\\u06d4\\\\u0700-\\\\u070d\\\\u07f7-\\\\u07f9\\\\u0830-\\\\u083e\\\\u085e\\\\u0964-\\\\u0965\\\\u0970\\\\u09fd\\\\u0a76\\\\u0af0\\\\u0c77\\\\u0c84\\\\u0df4\\\\u0e4f\\\\u0e5a-\\\\u0e5b\\\\u0f04-\\\\u0f12\\\\u0f14\\\\u0f3a-\\\\u0f3d\\\\u0f85\\\\u0fd0-\\\\u0fd4\\\\u0fd9-\\\\u0fda\\\\u104a-\\\\u104f\\\\u10fb\\\\u1360-\\\\u1368\\\\u1400\\\\u166e\\\\u169b-\\\\u169c\\\\u16eb-\\\\u16ed\\\\u1735-\\\\u1736\\\\u17d4-\\\\u17d6\\\\u17d8-\\\\u17da\\\\u1800-\\\\u180a\\\\u1944-\\\\u1945\\\\u1a1e-\\\\u1a1f\\\\u1aa0-\\\\u1aa6\\\\u1aa8-\\\\u1aad\\\\u1b5a-\\\\u1b60\\\\u1bfc-\\\\u1bff\\\\u1c3b-\\\\u1c3f\\\\u1c7e-\\\\u1c7f\\\\u1cc0-\\\\u1cc7\\\\u1cd3\\\\u2010-\\\\u2027\\\\u2030-\\\\u2043\\\\u2045-\\\\u2051\\\\u2053-\\\\u205e\\\\u207d-\\\\u207e\\\\u208d-\\\\u208e\\\\u2308-\\\\u230b\\\\u2329-\\\\u232a\\\\u2768-\\\\u2775\\\\u27c5-\\\\u27c6\\\\u27e6-\\\\u27ef\\\\u2983-\\\\u2998\\\\u29d8-\\\\u29db\\\\u29fc-\\\\u29fd\\\\u2cf9-\\\\u2cfc\\\\u2cfe-\\\\u2cff\\\\u2d70\\\\u2e00-\\\\u2e2e\\\\u2e30-\\\\u2e4f\\\\u3001-\\\\u3003\\\\u3008-\\\\u3011\\\\u3014-\\\\u301f\\\\u3030\\\\u303d\\\\u30a0\\\\u30fb\\\\ua4fe-\\\\ua4ff\\\\ua60d-\\\\ua60f\\\\ua673\\\\ua67e\\\\ua6f2-\\\\ua6f7\\\\ua874-\\\\ua877\\\\ua8ce-\\\\ua8cf\\\\ua8f8-\\\\ua8fa\\\\ua8fc\\\\ua92e-\\\\ua92f\\\\ua95f\\\\ua9c1-\\\\ua9cd\\\\ua9de-\\\\ua9df\\\\uaa5c-\\\\uaa5f\\\\uaade-\\\\uaadf\\\\uaaf0-\\\\uaaf1\\\\uabeb\\\\ufd3e-\\\\ufd3f\\\\ufe10-\\\\ufe19\\\\ufe30-\\\\ufe52\\\\ufe54-\\\\ufe61\\\\ufe63\\\\ufe68\\\\ufe6a-\\\\ufe6b\\\\uff01-\\\\uff03\\\\uff05-\\\\uff0a\\\\uff0c-\\\\uff0f\\\\uff1a-\\\\uff1b\\\\uff1f-\\\\uff20\\\\uff3b-\\\\uff3d\\\\uff3f\\\\uff5b\\\\uff5d\\\\uff5f-\\\\uff65]|\\\\ud800[\\\\udd00-\\\\udd02\\\\udf9f\\\\udfd0]|\\\\ud801[\\\\udd6f]|\\\\ud802[\\\\udc57\\\\udd1f\\\\udd3f\\\\ude50-\\\\ude58\\\\ude7f\\\\udef0-\\\\udef6\\\\udf39-\\\\udf3f\\\\udf99-\\\\udf9c]|\\\\ud803[\\\\udf55-\\\\udf59]|\\\\ud804[\\\\udc47-\\\\udc4d\\\\udcbb-\\\\udcbc\\\\udcbe-\\\\udcc1\\\\udd40-\\\\udd43\\\\udd74-\\\\udd75\\\\uddc5-\\\\uddc8\\\\uddcd\\\\udddb\\\\udddd-\\\\udddf\\\\ude38-\\\\ude3d\\\\udea9]|\\\\ud805[\\\\udc4b-\\\\udc4f\\\\udc5b\\\\udc5d\\\\udcc6\\\\uddc1-\\\\uddd7\\\\ude41-\\\\ude43\\\\ude60-\\\\ude6c\\\\udf3c-\\\\udf3e]|\\\\ud806[\\\\udc3b\\\\udde2\\\\ude3f-\\\\ude46\\\\ude9a-\\\\ude9c\\\\ude9e-\\\\udea2]|\\\\ud807[\\\\udc41-\\\\udc45\\\\udc70-\\\\udc71\\\\udef7-\\\\udef8\\\\udfff]|\\\\ud809[\\\\udc70-\\\\udc74]|\\\\ud81a[\\\\ude6e-\\\\ude6f\\\\udef5\\\\udf37-\\\\udf3b\\\\udf44]|\\\\ud81b[\\\\ude97-\\\\ude9a\\\\udfe2]|\\\\ud82f[\\\\udc9f]|\\\\ud836[\\\\ude87-\\\\ude8b]|\\\\ud83a[\\\\udd5e-\\\\udd5f]\"\n };\n\n const {\n cjkPattern,\n kPattern,\n punctuationPattern\n } = json$1;\n const {\n getLast: getLast$4\n } = util$1;\n const INLINE_NODE_TYPES = [\"liquidNode\", \"inlineCode\", \"emphasis\", \"strong\", \"delete\", \"link\", \"linkReference\", \"image\", \"imageReference\", \"footnote\", \"footnoteReference\", \"sentence\", \"whitespace\", \"word\", \"break\", \"inlineMath\"];\n const INLINE_NODE_WRAPPER_TYPES = INLINE_NODE_TYPES.concat([\"tableCell\", \"paragraph\", \"heading\"]);\n const kRegex = new RegExp(kPattern);\n const punctuationRegex = new RegExp(punctuationPattern);\n /**\n * split text into whitespaces and words\n * @param {string} text\n * @return {Array<{ type: \"whitespace\", value: \" \" | \"\\n\" | \"\" } | { type: \"word\", value: string }>}\n */\n\n function splitText(text, options) {\n const KIND_NON_CJK = \"non-cjk\";\n const KIND_CJ_LETTER = \"cj-letter\";\n const KIND_K_LETTER = \"k-letter\";\n const KIND_CJK_PUNCTUATION = \"cjk-punctuation\";\n const nodes = [];\n (options.proseWrap === \"preserve\" ? text : text.replace(new RegExp(\"(\".concat(cjkPattern, \")\\n(\").concat(cjkPattern, \")\"), \"g\"), \"$1$2\")).split(/([ \\t\\n]+)/).forEach((token, index, tokens) => {\n // whitespace\n if (index % 2 === 1) {\n nodes.push({\n type: \"whitespace\",\n value: /\\n/.test(token) ? \"\\n\" : \" \"\n });\n return;\n } // word separated by whitespace\n\n\n if ((index === 0 || index === tokens.length - 1) && token === \"\") {\n return;\n }\n\n token.split(new RegExp(\"(\".concat(cjkPattern, \")\"))).forEach((innerToken, innerIndex, innerTokens) => {\n if ((innerIndex === 0 || innerIndex === innerTokens.length - 1) && innerToken === \"\") {\n return;\n } // non-CJK word\n\n\n if (innerIndex % 2 === 0) {\n if (innerToken !== \"\") {\n appendNode({\n type: \"word\",\n value: innerToken,\n kind: KIND_NON_CJK,\n hasLeadingPunctuation: punctuationRegex.test(innerToken[0]),\n hasTrailingPunctuation: punctuationRegex.test(getLast$4(innerToken))\n });\n }\n\n return;\n } // CJK character\n\n\n appendNode(punctuationRegex.test(innerToken) ? {\n type: \"word\",\n value: innerToken,\n kind: KIND_CJK_PUNCTUATION,\n hasLeadingPunctuation: true,\n hasTrailingPunctuation: true\n } : {\n type: \"word\",\n value: innerToken,\n kind: kRegex.test(innerToken) ? KIND_K_LETTER : KIND_CJ_LETTER,\n hasLeadingPunctuation: false,\n hasTrailingPunctuation: false\n });\n });\n });\n return nodes;\n\n function appendNode(node) {\n const lastNode = getLast$4(nodes);\n\n if (lastNode && lastNode.type === \"word\") {\n if (lastNode.kind === KIND_NON_CJK && node.kind === KIND_CJ_LETTER && !lastNode.hasTrailingPunctuation || lastNode.kind === KIND_CJ_LETTER && node.kind === KIND_NON_CJK && !node.hasLeadingPunctuation) {\n nodes.push({\n type: \"whitespace\",\n value: \" \"\n });\n } else if (!isBetween(KIND_NON_CJK, KIND_CJK_PUNCTUATION) && // disallow leading/trailing full-width whitespace\n ![lastNode.value, node.value].some(value => /\\u3000/.test(value))) {\n nodes.push({\n type: \"whitespace\",\n value: \"\"\n });\n }\n }\n\n nodes.push(node);\n\n function isBetween(kind1, kind2) {\n return lastNode.kind === kind1 && node.kind === kind2 || lastNode.kind === kind2 && node.kind === kind1;\n }\n }\n }\n\n function getOrderedListItemInfo(orderListItem, originalText) {\n const [, numberText, marker, leadingSpaces] = originalText.slice(orderListItem.position.start.offset, orderListItem.position.end.offset).match(/^\\s*(\\d+)(\\.|\\))(\\s*)/);\n return {\n numberText,\n marker,\n leadingSpaces\n };\n }\n\n function hasGitDiffFriendlyOrderedList(node, options) {\n if (!node.ordered) {\n return false;\n }\n\n if (node.children.length < 2) {\n return false;\n }\n\n const firstNumber = Number(getOrderedListItemInfo(node.children[0], options.originalText).numberText);\n const secondNumber = Number(getOrderedListItemInfo(node.children[1], options.originalText).numberText);\n\n if (firstNumber === 0 && node.children.length > 2) {\n const thirdNumber = Number(getOrderedListItemInfo(node.children[2], options.originalText).numberText);\n return secondNumber === 1 && thirdNumber === 1;\n }\n\n return secondNumber === 1;\n } // workaround for https://github.com/remarkjs/remark/issues/351\n // leading and trailing newlines are stripped by remark\n\n\n function getFencedCodeBlockValue(node, originalText) {\n const text = originalText.slice(node.position.start.offset, node.position.end.offset);\n const leadingSpaceCount = text.match(/^\\s*/)[0].length;\n const replaceRegex = new RegExp(\"^\\\\s{0,\".concat(leadingSpaceCount, \"}\"));\n const lineContents = text.split(\"\\n\");\n const markerStyle = text[leadingSpaceCount]; // ` or ~\n\n const marker = text.slice(leadingSpaceCount).match(new RegExp(\"^[\".concat(markerStyle, \"]+\")))[0]; // https://spec.commonmark.org/0.28/#example-104: Closing fences may be indented by 0-3 spaces\n // https://spec.commonmark.org/0.28/#example-93: The closing code fence must be at least as long as the opening fence\n\n const hasEndMarker = new RegExp(\"^\\\\s{0,3}\".concat(marker)).test(lineContents[lineContents.length - 1].slice(getIndent(lineContents.length - 1)));\n return lineContents.slice(1, hasEndMarker ? -1 : undefined).map((x, i) => x.slice(getIndent(i + 1)).replace(replaceRegex, \"\")).join(\"\\n\");\n\n function getIndent(lineIndex) {\n return node.position.indent[lineIndex - 1] - 1;\n }\n }\n\n function mapAst(ast, handler) {\n return function preorder(node, index, parentStack) {\n parentStack = parentStack || [];\n const newNode = Object.assign({}, handler(node, index, parentStack));\n\n if (newNode.children) {\n newNode.children = newNode.children.map((child, index) => {\n return preorder(child, index, [newNode].concat(parentStack));\n });\n }\n\n return newNode;\n }(ast, null, null);\n }\n\n var utils$6 = {\n mapAst,\n splitText,\n punctuationPattern,\n getFencedCodeBlockValue,\n getOrderedListItemInfo,\n hasGitDiffFriendlyOrderedList,\n INLINE_NODE_TYPES,\n INLINE_NODE_WRAPPER_TYPES\n };\n\n const {\n builders: {\n hardline: hardline$b,\n literalline: literalline$5,\n concat: concat$f,\n markAsRoot: markAsRoot$3\n },\n utils: {\n mapDoc: mapDoc$4\n }\n } = document;\n const {\n getFencedCodeBlockValue: getFencedCodeBlockValue$1\n } = utils$6;\n\n function embed$4(path, print, textToDoc, options) {\n const node = path.getValue();\n\n if (node.type === \"code\" && node.lang !== null) {\n // only look for the first string so as to support [markdown-preview-enhanced](https://shd101wyy.github.io/markdown-preview-enhanced/#/code-chunk)\n const langMatch = node.lang.match(/^[A-Za-z0-9_-]+/);\n const lang = langMatch ? langMatch[0] : \"\";\n const parser = getParserName(lang);\n\n if (parser) {\n const styleUnit = options.__inJsTemplate ? \"~\" : \"`\";\n const style = styleUnit.repeat(Math.max(3, util$1.getMaxContinuousCount(node.value, styleUnit) + 1));\n const doc = textToDoc(getFencedCodeBlockValue$1(node, options.originalText), {\n parser\n });\n return markAsRoot$3(concat$f([style, node.lang, hardline$b, replaceNewlinesWithLiterallines(doc), style]));\n }\n }\n\n if (node.type === \"yaml\") {\n return markAsRoot$3(concat$f([\"---\", hardline$b, node.value && node.value.trim() ? replaceNewlinesWithLiterallines(textToDoc(node.value, {\n parser: \"yaml\"\n })) : \"\", \"---\"]));\n } // MDX\n\n\n switch (node.type) {\n case \"importExport\":\n return textToDoc(node.value, {\n parser: \"babel\"\n });\n\n case \"jsx\":\n return textToDoc(\"<$>\".concat(node.value, \"$>\"), {\n parser: \"__js_expression\",\n rootMarker: \"mdx\"\n });\n }\n\n return null;\n\n function getParserName(lang) {\n const supportInfo = support.getSupportInfo({\n plugins: options.plugins\n });\n const language = supportInfo.languages.find(language => language.name.toLowerCase() === lang || language.aliases && language.aliases.includes(lang) || language.extensions && language.extensions.find(ext => ext === \".\".concat(lang)));\n\n if (language) {\n return language.parsers[0];\n }\n\n return null;\n }\n\n function replaceNewlinesWithLiterallines(doc) {\n return mapDoc$4(doc, currentDoc => typeof currentDoc === \"string\" && currentDoc.includes(\"\\n\") ? concat$f(currentDoc.split(/(\\n)/g).map((v, i) => i % 2 === 0 ? v : literalline$5)) : currentDoc);\n }\n }\n\n var embed_1$2 = embed$4;\n\n const pragmas = [\"format\", \"prettier\"];\n\n function startWithPragma(text) {\n const pragma = \"@(\".concat(pragmas.join(\"|\"), \")\");\n const regex = new RegExp([\"\"), \"\")].join(\"|\"), \"m\");\n const matched = text.match(regex);\n return matched && matched.index === 0;\n }\n\n var pragma$4 = {\n startWithPragma,\n hasPragma: text => startWithPragma(frontMatter(text).content.trimStart()),\n insertPragma: text => {\n const extracted = frontMatter(text);\n const pragma = \"\");\n return extracted.frontMatter ? \"\".concat(extracted.frontMatter.raw, \"\\n\\n\").concat(pragma, \"\\n\\n\").concat(extracted.content) : \"\".concat(pragma, \"\\n\\n\").concat(extracted.content);\n }\n };\n\n const {\n getOrderedListItemInfo: getOrderedListItemInfo$1,\n mapAst: mapAst$1,\n splitText: splitText$1\n } = utils$6; // 0x0 ~ 0x10ffff\n // eslint-disable-next-line no-control-regex\n\n const isSingleCharRegex = /^([\\u0000-\\uffff]|[\\ud800-\\udbff][\\udc00-\\udfff])$/;\n\n function preprocess$2(ast, options) {\n ast = restoreUnescapedCharacter(ast, options);\n ast = mergeContinuousTexts(ast);\n ast = transformInlineCode(ast);\n ast = transformIndentedCodeblockAndMarkItsParentList(ast, options);\n ast = markAlignedList(ast, options);\n ast = splitTextIntoSentences(ast, options);\n ast = transformImportExport(ast);\n ast = mergeContinuousImportExport(ast);\n return ast;\n }\n\n function transformImportExport(ast) {\n return mapAst$1(ast, node => {\n if (node.type !== \"import\" && node.type !== \"export\") {\n return node;\n }\n\n return Object.assign({}, node, {\n type: \"importExport\"\n });\n });\n }\n\n function transformInlineCode(ast) {\n return mapAst$1(ast, node => {\n if (node.type !== \"inlineCode\") {\n return node;\n }\n\n return Object.assign({}, node, {\n value: node.value.replace(/\\s+/g, \" \")\n });\n });\n }\n\n function restoreUnescapedCharacter(ast, options) {\n return mapAst$1(ast, node => {\n return node.type !== \"text\" ? node : Object.assign({}, node, {\n value: node.value !== \"*\" && node.value !== \"_\" && node.value !== \"$\" && // handle these cases in printer\n isSingleCharRegex.test(node.value) && node.position.end.offset - node.position.start.offset !== node.value.length ? options.originalText.slice(node.position.start.offset, node.position.end.offset) : node.value\n });\n });\n }\n\n function mergeContinuousImportExport(ast) {\n return mergeChildren(ast, (prevNode, node) => prevNode.type === \"importExport\" && node.type === \"importExport\", (prevNode, node) => ({\n type: \"importExport\",\n value: prevNode.value + \"\\n\\n\" + node.value,\n position: {\n start: prevNode.position.start,\n end: node.position.end\n }\n }));\n }\n\n function mergeChildren(ast, shouldMerge, mergeNode) {\n return mapAst$1(ast, node => {\n if (!node.children) {\n return node;\n }\n\n const children = node.children.reduce((current, child) => {\n const lastChild = current[current.length - 1];\n\n if (lastChild && shouldMerge(lastChild, child)) {\n current.splice(-1, 1, mergeNode(lastChild, child));\n } else {\n current.push(child);\n }\n\n return current;\n }, []);\n return Object.assign({}, node, {\n children\n });\n });\n }\n\n function mergeContinuousTexts(ast) {\n return mergeChildren(ast, (prevNode, node) => prevNode.type === \"text\" && node.type === \"text\", (prevNode, node) => ({\n type: \"text\",\n value: prevNode.value + node.value,\n position: {\n start: prevNode.position.start,\n end: node.position.end\n }\n }));\n }\n\n function splitTextIntoSentences(ast, options) {\n return mapAst$1(ast, (node, index, [parentNode]) => {\n if (node.type !== \"text\") {\n return node;\n }\n\n let {\n value\n } = node;\n\n if (parentNode.type === \"paragraph\") {\n if (index === 0) {\n value = value.trimStart();\n }\n\n if (index === parentNode.children.length - 1) {\n value = value.trimEnd();\n }\n }\n\n return {\n type: \"sentence\",\n position: node.position,\n children: splitText$1(value, options)\n };\n });\n }\n\n function transformIndentedCodeblockAndMarkItsParentList(ast, options) {\n return mapAst$1(ast, (node, index, parentStack) => {\n if (node.type === \"code\") {\n // the first char may point to `\\n`, e.g. `\\n\\t\\tbar`, just ignore it\n const isIndented = /^\\n?( {4,}|\\t)/.test(options.originalText.slice(node.position.start.offset, node.position.end.offset));\n node.isIndented = isIndented;\n\n if (isIndented) {\n for (let i = 0; i < parentStack.length; i++) {\n const parent = parentStack[i]; // no need to check checked items\n\n if (parent.hasIndentedCodeblock) {\n break;\n }\n\n if (parent.type === \"list\") {\n parent.hasIndentedCodeblock = true;\n }\n }\n }\n }\n\n return node;\n });\n }\n\n function markAlignedList(ast, options) {\n return mapAst$1(ast, (node, index, parentStack) => {\n if (node.type === \"list\" && node.children.length !== 0) {\n // if one of its parents is not aligned, it's not possible to be aligned in sub-lists\n for (let i = 0; i < parentStack.length; i++) {\n const parent = parentStack[i];\n\n if (parent.type === \"list\" && !parent.isAligned) {\n node.isAligned = false;\n return node;\n }\n }\n\n node.isAligned = isAligned(node);\n }\n\n return node;\n });\n\n function getListItemStart(listItem) {\n return listItem.children.length === 0 ? -1 : listItem.children[0].position.start.column - 1;\n }\n\n function isAligned(list) {\n if (!list.ordered) {\n /**\n * - 123\n * - 123\n */\n return true;\n }\n\n const [firstItem, secondItem] = list.children;\n const firstInfo = getOrderedListItemInfo$1(firstItem, options.originalText);\n\n if (firstInfo.leadingSpaces.length > 1) {\n /**\n * 1. 123\n *\n * 1. 123\n * 1. 123\n */\n return true;\n }\n\n const firstStart = getListItemStart(firstItem);\n\n if (firstStart === -1) {\n /**\n * 1.\n *\n * 1.\n * 1.\n */\n return false;\n }\n\n if (list.children.length === 1) {\n /**\n * aligned:\n *\n * 11. 123\n *\n * not aligned:\n *\n * 1. 123\n */\n return firstStart % options.tabWidth === 0;\n }\n\n const secondStart = getListItemStart(secondItem);\n\n if (firstStart !== secondStart) {\n /**\n * 11. 123\n * 1. 123\n *\n * 1. 123\n * 11. 123\n */\n return false;\n }\n\n if (firstStart % options.tabWidth === 0) {\n /**\n * 11. 123\n * 12. 123\n */\n return true;\n }\n /**\n * aligned:\n *\n * 11. 123\n * 1. 123\n *\n * not aligned:\n *\n * 1. 123\n * 2. 123\n */\n\n\n const secondInfo = getOrderedListItemInfo$1(secondItem, options.originalText);\n return secondInfo.leadingSpaces.length > 1;\n }\n }\n\n var preprocess_1$2 = preprocess$2;\n\n const {\n builders: {\n breakParent: breakParent$4,\n concat: concat$g,\n join: join$b,\n line: line$a,\n literalline: literalline$6,\n markAsRoot: markAsRoot$4,\n hardline: hardline$c,\n softline: softline$7,\n ifBreak: ifBreak$7,\n fill: fill$5,\n align: align$2,\n indent: indent$9,\n group: group$f\n },\n utils: {\n mapDoc: mapDoc$5\n },\n printer: {\n printDocToString: printDocToString$3\n }\n } = document;\n const {\n getFencedCodeBlockValue: getFencedCodeBlockValue$2,\n hasGitDiffFriendlyOrderedList: hasGitDiffFriendlyOrderedList$1,\n splitText: splitText$2,\n punctuationPattern: punctuationPattern$1,\n INLINE_NODE_TYPES: INLINE_NODE_TYPES$1,\n INLINE_NODE_WRAPPER_TYPES: INLINE_NODE_WRAPPER_TYPES$1\n } = utils$6;\n const {\n replaceEndOfLineWith: replaceEndOfLineWith$2\n } = util$1;\n const TRAILING_HARDLINE_NODES = [\"importExport\"];\n const SINGLE_LINE_NODE_TYPES = [\"heading\", \"tableCell\", \"link\"];\n const SIBLING_NODE_TYPES = [\"listItem\", \"definition\", \"footnoteDefinition\"];\n\n function genericPrint$5(path, options, print) {\n const node = path.getValue();\n\n if (shouldRemainTheSameContent(path)) {\n return concat$g(splitText$2(options.originalText.slice(node.position.start.offset, node.position.end.offset), options).map(node => node.type === \"word\" ? node.value : node.value === \"\" ? \"\" : printLine(path, node.value, options)));\n }\n\n switch (node.type) {\n case \"root\":\n if (node.children.length === 0) {\n return \"\";\n }\n\n return concat$g([normalizeDoc(printRoot(path, options, print)), !TRAILING_HARDLINE_NODES.includes(getLastDescendantNode(node).type) ? hardline$c : \"\"]);\n\n case \"paragraph\":\n return printChildren$2(path, options, print, {\n postprocessor: fill$5\n });\n\n case \"sentence\":\n return printChildren$2(path, options, print);\n\n case \"word\":\n return node.value.replace(/[*$]/g, \"\\\\$&\") // escape all `*` and `$` (math)\n .replace(new RegExp([\"(^|\".concat(punctuationPattern$1, \")(_+)\"), \"(_+)(\".concat(punctuationPattern$1, \"|$)\")].join(\"|\"), \"g\"), (_, text1, underscore1, underscore2, text2) => (underscore1 ? \"\".concat(text1).concat(underscore1) : \"\".concat(underscore2).concat(text2)).replace(/_/g, \"\\\\_\"));\n // escape all `_` except concating with non-punctuation, e.g. `1_2_3` is not considered emphasis\n\n case \"whitespace\":\n {\n const parentNode = path.getParentNode();\n const index = parentNode.children.indexOf(node);\n const nextNode = parentNode.children[index + 1];\n const proseWrap = // leading char that may cause different syntax\n nextNode && /^>|^([-+*]|#{1,6}|[0-9]+[.)])$/.test(nextNode.value) ? \"never\" : options.proseWrap;\n return printLine(path, node.value, {\n proseWrap\n });\n }\n\n case \"emphasis\":\n {\n const parentNode = path.getParentNode();\n const index = parentNode.children.indexOf(node);\n const prevNode = parentNode.children[index - 1];\n const nextNode = parentNode.children[index + 1];\n const hasPrevOrNextWord = // `1*2*3` is considered emphasis but `1_2_3` is not\n prevNode && prevNode.type === \"sentence\" && prevNode.children.length > 0 && util$1.getLast(prevNode.children).type === \"word\" && !util$1.getLast(prevNode.children).hasTrailingPunctuation || nextNode && nextNode.type === \"sentence\" && nextNode.children.length > 0 && nextNode.children[0].type === \"word\" && !nextNode.children[0].hasLeadingPunctuation;\n const style = hasPrevOrNextWord || getAncestorNode$2(path, \"emphasis\") ? \"*\" : \"_\";\n return concat$g([style, printChildren$2(path, options, print), style]);\n }\n\n case \"strong\":\n return concat$g([\"**\", printChildren$2(path, options, print), \"**\"]);\n\n case \"delete\":\n return concat$g([\"~~\", printChildren$2(path, options, print), \"~~\"]);\n\n case \"inlineCode\":\n {\n const backtickCount = util$1.getMinNotPresentContinuousCount(node.value, \"`\");\n const style = \"`\".repeat(backtickCount || 1);\n const gap = backtickCount ? \" \" : \"\";\n return concat$g([style, gap, node.value, gap, style]);\n }\n\n case \"link\":\n switch (options.originalText[node.position.start.offset]) {\n case \"<\":\n {\n const mailto = \"mailto:\";\n const url = // is parsed as { url: \"mailto:hello@example.com\" }\n node.url.startsWith(mailto) && options.originalText.slice(node.position.start.offset + 1, node.position.start.offset + 1 + mailto.length) !== mailto ? node.url.slice(mailto.length) : node.url;\n return concat$g([\"<\", url, \">\"]);\n }\n\n case \"[\":\n return concat$g([\"[\", printChildren$2(path, options, print), \"](\", printUrl(node.url, \")\"), printTitle(node.title, options), \")\"]);\n\n default:\n return options.originalText.slice(node.position.start.offset, node.position.end.offset);\n }\n\n case \"image\":\n return concat$g([\"![\", node.alt || \"\", \"](\", printUrl(node.url, \")\"), printTitle(node.title, options), \")\"]);\n\n case \"blockquote\":\n return concat$g([\"> \", align$2(\"> \", printChildren$2(path, options, print))]);\n\n case \"heading\":\n return concat$g([\"#\".repeat(node.depth) + \" \", printChildren$2(path, options, print)]);\n\n case \"code\":\n {\n if (node.isIndented) {\n // indented code block\n const alignment = \" \".repeat(4);\n return align$2(alignment, concat$g([alignment, concat$g(replaceEndOfLineWith$2(node.value, hardline$c))]));\n } // fenced code block\n\n\n const styleUnit = options.__inJsTemplate ? \"~\" : \"`\";\n const style = styleUnit.repeat(Math.max(3, util$1.getMaxContinuousCount(node.value, styleUnit) + 1));\n return concat$g([style, node.lang || \"\", hardline$c, concat$g(replaceEndOfLineWith$2(getFencedCodeBlockValue$2(node, options.originalText), hardline$c)), hardline$c, style]);\n }\n\n case \"yaml\":\n case \"toml\":\n return options.originalText.slice(node.position.start.offset, node.position.end.offset);\n\n case \"html\":\n {\n const parentNode = path.getParentNode();\n const value = parentNode.type === \"root\" && util$1.getLast(parentNode.children) === node ? node.value.trimEnd() : node.value;\n const isHtmlComment = /^$/.test(value);\n return concat$g(replaceEndOfLineWith$2(value, isHtmlComment ? hardline$c : markAsRoot$4(literalline$6)));\n }\n\n case \"list\":\n {\n const nthSiblingIndex = getNthListSiblingIndex(node, path.getParentNode());\n const isGitDiffFriendlyOrderedList = hasGitDiffFriendlyOrderedList$1(node, options);\n return printChildren$2(path, options, print, {\n processor: (childPath, index) => {\n const prefix = getPrefix();\n const childNode = childPath.getValue();\n\n if (childNode.children.length === 2 && childNode.children[1].type === \"html\" && childNode.children[0].position.start.column !== childNode.children[1].position.start.column) {\n return concat$g([prefix, printListItem(childPath, options, print, prefix)]);\n }\n\n return concat$g([prefix, align$2(\" \".repeat(prefix.length), printListItem(childPath, options, print, prefix))]);\n\n function getPrefix() {\n const rawPrefix = node.ordered ? (index === 0 ? node.start : isGitDiffFriendlyOrderedList ? 1 : node.start + index) + (nthSiblingIndex % 2 === 0 ? \". \" : \") \") : nthSiblingIndex % 2 === 0 ? \"- \" : \"* \";\n return node.isAligned ||\n /* workaround for https://github.com/remarkjs/remark/issues/315 */\n node.hasIndentedCodeblock ? alignListPrefix(rawPrefix, options) : rawPrefix;\n }\n }\n });\n }\n\n case \"thematicBreak\":\n {\n const counter = getAncestorCounter$1(path, \"list\");\n\n if (counter === -1) {\n return \"---\";\n }\n\n const nthSiblingIndex = getNthListSiblingIndex(path.getParentNode(counter), path.getParentNode(counter + 1));\n return nthSiblingIndex % 2 === 0 ? \"***\" : \"---\";\n }\n\n case \"linkReference\":\n return concat$g([\"[\", printChildren$2(path, options, print), \"]\", node.referenceType === \"full\" ? concat$g([\"[\", node.identifier, \"]\"]) : node.referenceType === \"collapsed\" ? \"[]\" : \"\"]);\n\n case \"imageReference\":\n switch (node.referenceType) {\n case \"full\":\n return concat$g([\"![\", node.alt || \"\", \"][\", node.identifier, \"]\"]);\n\n default:\n return concat$g([\"![\", node.alt, \"]\", node.referenceType === \"collapsed\" ? \"[]\" : \"\"]);\n }\n\n case \"definition\":\n {\n const lineOrSpace = options.proseWrap === \"always\" ? line$a : \" \";\n return group$f(concat$g([concat$g([\"[\", node.identifier, \"]:\"]), indent$9(concat$g([lineOrSpace, printUrl(node.url), node.title === null ? \"\" : concat$g([lineOrSpace, printTitle(node.title, options, false)])]))]));\n }\n\n case \"footnote\":\n return concat$g([\"[^\", printChildren$2(path, options, print), \"]\"]);\n\n case \"footnoteReference\":\n return concat$g([\"[^\", node.identifier, \"]\"]);\n\n case \"footnoteDefinition\":\n {\n const nextNode = path.getParentNode().children[path.getName() + 1];\n const shouldInlineFootnote = node.children.length === 1 && node.children[0].type === \"paragraph\" && (options.proseWrap === \"never\" || options.proseWrap === \"preserve\" && node.children[0].position.start.line === node.children[0].position.end.line);\n return concat$g([\"[^\", node.identifier, \"]: \", shouldInlineFootnote ? printChildren$2(path, options, print) : group$f(concat$g([align$2(\" \".repeat(options.tabWidth), printChildren$2(path, options, print, {\n processor: (childPath, index) => {\n return index === 0 ? group$f(concat$g([softline$7, childPath.call(print)])) : childPath.call(print);\n }\n })), nextNode && nextNode.type === \"footnoteDefinition\" ? softline$7 : \"\"]))]);\n }\n\n case \"table\":\n return printTable(path, options, print);\n\n case \"tableCell\":\n return printChildren$2(path, options, print);\n\n case \"break\":\n return /\\s/.test(options.originalText[node.position.start.offset]) ? concat$g([\" \", markAsRoot$4(literalline$6)]) : concat$g([\"\\\\\", hardline$c]);\n\n case \"liquidNode\":\n return concat$g(replaceEndOfLineWith$2(node.value, hardline$c));\n // MDX\n\n case \"importExport\":\n case \"jsx\":\n return node.value;\n // fallback to the original text if multiparser failed\n\n case \"math\":\n return concat$g([\"$$\", hardline$c, node.value ? concat$g([concat$g(replaceEndOfLineWith$2(node.value, hardline$c)), hardline$c]) : \"\", \"$$\"]);\n\n case \"inlineMath\":\n {\n // remark-math trims content but we don't want to remove whitespaces\n // since it's very possible that it's recognized as math accidentally\n return options.originalText.slice(options.locStart(node), options.locEnd(node));\n }\n\n case \"tableRow\": // handled in \"table\"\n\n case \"listItem\": // handled in \"list\"\n\n default:\n throw new Error(\"Unknown markdown type \".concat(JSON.stringify(node.type)));\n }\n }\n\n function printListItem(path, options, print, listPrefix) {\n const node = path.getValue();\n const prefix = node.checked === null ? \"\" : node.checked ? \"[x] \" : \"[ ] \";\n return concat$g([prefix, printChildren$2(path, options, print, {\n processor: (childPath, index) => {\n if (index === 0 && childPath.getValue().type !== \"list\") {\n return align$2(\" \".repeat(prefix.length), childPath.call(print));\n }\n\n const alignment = \" \".repeat(clamp(options.tabWidth - listPrefix.length, 0, 3) // 4+ will cause indented code block\n );\n return concat$g([alignment, align$2(alignment, childPath.call(print))]);\n }\n })]);\n }\n\n function alignListPrefix(prefix, options) {\n const additionalSpaces = getAdditionalSpaces();\n return prefix + \" \".repeat(additionalSpaces >= 4 ? 0 : additionalSpaces // 4+ will cause indented code block\n );\n\n function getAdditionalSpaces() {\n const restSpaces = prefix.length % options.tabWidth;\n return restSpaces === 0 ? 0 : options.tabWidth - restSpaces;\n }\n }\n\n function getNthListSiblingIndex(node, parentNode) {\n return getNthSiblingIndex(node, parentNode, siblingNode => siblingNode.ordered === node.ordered);\n }\n\n function getNthSiblingIndex(node, parentNode, condition) {\n condition = condition || (() => true);\n\n let index = -1;\n\n for (const childNode of parentNode.children) {\n if (childNode.type === node.type && condition(childNode)) {\n index++;\n } else {\n index = -1;\n }\n\n if (childNode === node) {\n return index;\n }\n }\n }\n\n function getAncestorCounter$1(path, typeOrTypes) {\n const types = [].concat(typeOrTypes);\n let counter = -1;\n let ancestorNode;\n\n while (ancestorNode = path.getParentNode(++counter)) {\n if (types.includes(ancestorNode.type)) {\n return counter;\n }\n }\n\n return -1;\n }\n\n function getAncestorNode$2(path, typeOrTypes) {\n const counter = getAncestorCounter$1(path, typeOrTypes);\n return counter === -1 ? null : path.getParentNode(counter);\n }\n\n function printLine(path, value, options) {\n if (options.proseWrap === \"preserve\" && value === \"\\n\") {\n return hardline$c;\n }\n\n const isBreakable = options.proseWrap === \"always\" && !getAncestorNode$2(path, SINGLE_LINE_NODE_TYPES);\n return value !== \"\" ? isBreakable ? line$a : \" \" : isBreakable ? softline$7 : \"\";\n }\n\n function printTable(path, options, print) {\n const hardlineWithoutBreakParent = hardline$c.parts[0];\n const node = path.getValue();\n const contents = []; // { [rowIndex: number]: { [columnIndex: number]: string } }\n\n path.map(rowPath => {\n const rowContents = [];\n rowPath.map(cellPath => {\n rowContents.push(printDocToString$3(cellPath.call(print), options).formatted);\n }, \"children\");\n contents.push(rowContents);\n }, \"children\"); // Get the width of each column\n\n const columnMaxWidths = contents.reduce((currentWidths, rowContents) => currentWidths.map((width, columnIndex) => Math.max(width, util$1.getStringWidth(rowContents[columnIndex]))), contents[0].map(() => 3) // minimum width = 3 (---, :--, :-:, --:)\n );\n const alignedTable = join$b(hardlineWithoutBreakParent, [printRow(contents[0]), printSeparator(), join$b(hardlineWithoutBreakParent, contents.slice(1).map(rowContents => printRow(rowContents)))]);\n\n if (options.proseWrap !== \"never\") {\n return concat$g([breakParent$4, alignedTable]);\n } // Only if the --prose-wrap never is set and it exceeds the print width.\n\n\n const compactTable = join$b(hardlineWithoutBreakParent, [printRow(contents[0],\n /* isCompact */\n true), printSeparator(\n /* isCompact */\n true), join$b(hardlineWithoutBreakParent, contents.slice(1).map(rowContents => printRow(rowContents,\n /* isCompact */\n true)))]);\n return concat$g([breakParent$4, group$f(ifBreak$7(compactTable, alignedTable))]);\n\n function printSeparator(isCompact) {\n return concat$g([\"| \", join$b(\" | \", columnMaxWidths.map((width, index) => {\n const spaces = isCompact ? 3 : width;\n\n switch (node.align[index]) {\n case \"left\":\n return \":\" + \"-\".repeat(spaces - 1);\n\n case \"right\":\n return \"-\".repeat(spaces - 1) + \":\";\n\n case \"center\":\n return \":\" + \"-\".repeat(spaces - 2) + \":\";\n\n default:\n return \"-\".repeat(spaces);\n }\n })), \" |\"]);\n }\n\n function printRow(rowContents, isCompact) {\n return concat$g([\"| \", join$b(\" | \", isCompact ? rowContents : rowContents.map((rowContent, columnIndex) => {\n switch (node.align[columnIndex]) {\n case \"right\":\n return alignRight(rowContent, columnMaxWidths[columnIndex]);\n\n case \"center\":\n return alignCenter(rowContent, columnMaxWidths[columnIndex]);\n\n default:\n return alignLeft(rowContent, columnMaxWidths[columnIndex]);\n }\n })), \" |\"]);\n }\n\n function alignLeft(text, width) {\n const spaces = width - util$1.getStringWidth(text);\n return concat$g([text, \" \".repeat(spaces)]);\n }\n\n function alignRight(text, width) {\n const spaces = width - util$1.getStringWidth(text);\n return concat$g([\" \".repeat(spaces), text]);\n }\n\n function alignCenter(text, width) {\n const spaces = width - util$1.getStringWidth(text);\n const left = Math.floor(spaces / 2);\n const right = spaces - left;\n return concat$g([\" \".repeat(left), text, \" \".repeat(right)]);\n }\n }\n\n function printRoot(path, options, print) {\n /** @typedef {{ index: number, offset: number }} IgnorePosition */\n\n /** @type {Array<{start: IgnorePosition, end: IgnorePosition}>} */\n const ignoreRanges = [];\n /** @type {IgnorePosition | null} */\n\n let ignoreStart = null;\n const {\n children\n } = path.getValue();\n children.forEach((childNode, index) => {\n switch (isPrettierIgnore$1(childNode)) {\n case \"start\":\n if (ignoreStart === null) {\n ignoreStart = {\n index,\n offset: childNode.position.end.offset\n };\n }\n\n break;\n\n case \"end\":\n if (ignoreStart !== null) {\n ignoreRanges.push({\n start: ignoreStart,\n end: {\n index,\n offset: childNode.position.start.offset\n }\n });\n ignoreStart = null;\n }\n\n break;\n }\n });\n return printChildren$2(path, options, print, {\n processor: (childPath, index) => {\n if (ignoreRanges.length !== 0) {\n const ignoreRange = ignoreRanges[0];\n\n if (index === ignoreRange.start.index) {\n return concat$g([children[ignoreRange.start.index].value, options.originalText.slice(ignoreRange.start.offset, ignoreRange.end.offset), children[ignoreRange.end.index].value]);\n }\n\n if (ignoreRange.start.index < index && index < ignoreRange.end.index) {\n return false;\n }\n\n if (index === ignoreRange.end.index) {\n ignoreRanges.shift();\n return false;\n }\n }\n\n return childPath.call(print);\n }\n });\n }\n\n function printChildren$2(path, options, print, events) {\n events = events || {};\n const postprocessor = events.postprocessor || concat$g;\n\n const processor = events.processor || (childPath => childPath.call(print));\n\n const node = path.getValue();\n const parts = [];\n let lastChildNode;\n path.map((childPath, index) => {\n const childNode = childPath.getValue();\n const result = processor(childPath, index);\n\n if (result !== false) {\n const data = {\n parts,\n prevNode: lastChildNode,\n parentNode: node,\n options\n };\n\n if (!shouldNotPrePrintHardline(childNode, data)) {\n parts.push(hardline$c);\n\n if (lastChildNode && TRAILING_HARDLINE_NODES.includes(lastChildNode.type)) {\n if (shouldPrePrintTripleHardline(childNode, data)) {\n parts.push(hardline$c);\n }\n } else {\n if (shouldPrePrintDoubleHardline(childNode, data) || shouldPrePrintTripleHardline(childNode, data)) {\n parts.push(hardline$c);\n }\n\n if (shouldPrePrintTripleHardline(childNode, data)) {\n parts.push(hardline$c);\n }\n }\n }\n\n parts.push(result);\n lastChildNode = childNode;\n }\n }, \"children\");\n return postprocessor(parts);\n }\n\n function getLastDescendantNode(node) {\n let current = node;\n\n while (current.children && current.children.length !== 0) {\n current = current.children[current.children.length - 1];\n }\n\n return current;\n }\n /** @return {false | 'next' | 'start' | 'end'} */\n\n\n function isPrettierIgnore$1(node) {\n if (node.type !== \"html\") {\n return false;\n }\n\n const match = node.value.match(/^$/);\n return match === null ? false : match[1] ? match[1] : \"next\";\n }\n\n function shouldNotPrePrintHardline(node, data) {\n const isFirstNode = data.parts.length === 0;\n const isInlineNode = INLINE_NODE_TYPES$1.includes(node.type);\n const isInlineHTML = node.type === \"html\" && INLINE_NODE_WRAPPER_TYPES$1.includes(data.parentNode.type);\n return isFirstNode || isInlineNode || isInlineHTML;\n }\n\n function shouldPrePrintDoubleHardline(node, data) {\n const isSequence = (data.prevNode && data.prevNode.type) === node.type;\n const isSiblingNode = isSequence && SIBLING_NODE_TYPES.includes(node.type);\n const isInTightListItem = data.parentNode.type === \"listItem\" && !data.parentNode.loose;\n const isPrevNodeLooseListItem = data.prevNode && data.prevNode.type === \"listItem\" && data.prevNode.loose;\n const isPrevNodePrettierIgnore = isPrettierIgnore$1(data.prevNode) === \"next\";\n const isBlockHtmlWithoutBlankLineBetweenPrevHtml = node.type === \"html\" && data.prevNode && data.prevNode.type === \"html\" && data.prevNode.position.end.line + 1 === node.position.start.line;\n const isHtmlDirectAfterListItem = node.type === \"html\" && data.parentNode.type === \"listItem\" && data.prevNode && data.prevNode.type === \"paragraph\" && data.prevNode.position.end.line + 1 === node.position.start.line;\n return isPrevNodeLooseListItem || !(isSiblingNode || isInTightListItem || isPrevNodePrettierIgnore || isBlockHtmlWithoutBlankLineBetweenPrevHtml || isHtmlDirectAfterListItem);\n }\n\n function shouldPrePrintTripleHardline(node, data) {\n const isPrevNodeList = data.prevNode && data.prevNode.type === \"list\";\n const isIndentedCode = node.type === \"code\" && node.isIndented;\n return isPrevNodeList && isIndentedCode;\n }\n\n function shouldRemainTheSameContent(path) {\n const ancestorNode = getAncestorNode$2(path, [\"linkReference\", \"imageReference\"]);\n return ancestorNode && (ancestorNode.type !== \"linkReference\" || ancestorNode.referenceType !== \"full\");\n }\n\n function normalizeDoc(doc) {\n return mapDoc$5(doc, currentDoc => {\n if (!currentDoc.parts) {\n return currentDoc;\n }\n\n if (currentDoc.type === \"concat\" && currentDoc.parts.length === 1) {\n return currentDoc.parts[0];\n }\n\n const parts = currentDoc.parts.reduce((parts, part) => {\n if (part.type === \"concat\") {\n parts.push(...part.parts);\n } else if (part !== \"\") {\n parts.push(part);\n }\n\n return parts;\n }, []);\n return Object.assign({}, currentDoc, {\n parts: normalizeParts$2(parts)\n });\n });\n }\n\n function printUrl(url, dangerousCharOrChars) {\n const dangerousChars = [\" \"].concat(dangerousCharOrChars || []);\n return new RegExp(dangerousChars.map(x => \"\\\\\".concat(x)).join(\"|\")).test(url) ? \"<\".concat(url, \">\") : url;\n }\n\n function printTitle(title, options, printSpace) {\n if (printSpace == null) {\n printSpace = true;\n }\n\n if (!title) {\n return \"\";\n }\n\n if (printSpace) {\n return \" \" + printTitle(title, options, false);\n }\n\n if (title.includes('\"') && title.includes(\"'\") && !title.includes(\")\")) {\n return \"(\".concat(title, \")\"); // avoid escaped quotes\n } // faster than using RegExps: https://jsperf.com/performance-of-match-vs-split\n\n\n const singleCount = title.split(\"'\").length - 1;\n const doubleCount = title.split('\"').length - 1;\n const quote = singleCount > doubleCount ? '\"' : doubleCount > singleCount ? \"'\" : options.singleQuote ? \"'\" : '\"';\n title = title.replace(new RegExp(\"(\".concat(quote, \")\"), \"g\"), \"\\\\$1\");\n return \"\".concat(quote).concat(title).concat(quote);\n }\n\n function normalizeParts$2(parts) {\n return parts.reduce((current, part) => {\n const lastPart = util$1.getLast(current);\n\n if (typeof lastPart === \"string\" && typeof part === \"string\") {\n current.splice(-1, 1, lastPart + part);\n } else {\n current.push(part);\n }\n\n return current;\n }, []);\n }\n\n function clamp(value, min, max) {\n return value < min ? min : value > max ? max : value;\n }\n\n function clean$6(ast, newObj, parent) {\n delete newObj.position;\n delete newObj.raw; // front-matter\n // for codeblock\n\n if (ast.type === \"code\" || ast.type === \"yaml\" || ast.type === \"import\" || ast.type === \"export\" || ast.type === \"jsx\") {\n delete newObj.value;\n }\n\n if (ast.type === \"list\") {\n delete newObj.isAligned;\n } // texts can be splitted or merged\n\n\n if (ast.type === \"text\") {\n return null;\n }\n\n if (ast.type === \"inlineCode\") {\n newObj.value = ast.value.replace(/[ \\t\\n]+/g, \" \");\n } // for insert pragma\n\n\n if (parent && parent.type === \"root\" && parent.children.length > 0 && (parent.children[0] === ast || (parent.children[0].type === \"yaml\" || parent.children[0].type === \"toml\") && parent.children[1] === ast) && ast.type === \"html\" && pragma$4.startWithPragma(ast.value)) {\n return null;\n }\n }\n\n function hasPrettierIgnore$6(path) {\n const index = +path.getName();\n\n if (index === 0) {\n return false;\n }\n\n const prevNode = path.getParentNode().children[index - 1];\n return isPrettierIgnore$1(prevNode) === \"next\";\n }\n\n var printerMarkdown = {\n preprocess: preprocess_1$2,\n print: genericPrint$5,\n embed: embed_1$2,\n massageAstNode: clean$6,\n hasPrettierIgnore: hasPrettierIgnore$6,\n insertPragma: pragma$4.insertPragma\n };\n\n var options$6 = {\n proseWrap: commonOptions.proseWrap,\n singleQuote: commonOptions.singleQuote\n };\n\n var name$g = \"Markdown\";\n var type$f = \"prose\";\n var aliases$5 = [\n \t\"pandoc\"\n ];\n var aceMode$f = \"markdown\";\n var codemirrorMode$b = \"gfm\";\n var codemirrorMimeType$b = \"text/x-gfm\";\n var wrap = true;\n var extensions$f = [\n \t\".md\",\n \t\".markdown\",\n \t\".mdown\",\n \t\".mdwn\",\n \t\".mdx\",\n \t\".mkd\",\n \t\".mkdn\",\n \t\".mkdown\",\n \t\".ronn\",\n \t\".workbook\"\n ];\n var filenames$3 = [\n \t\"contents.lr\"\n ];\n var tmScope$f = \"source.gfm\";\n var languageId$f = 222;\n var Markdown = {\n \tname: name$g,\n \ttype: type$f,\n \taliases: aliases$5,\n \taceMode: aceMode$f,\n \tcodemirrorMode: codemirrorMode$b,\n \tcodemirrorMimeType: codemirrorMimeType$b,\n \twrap: wrap,\n \textensions: extensions$f,\n \tfilenames: filenames$3,\n \ttmScope: tmScope$f,\n \tlanguageId: languageId$f\n };\n\n var Markdown$1 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n name: name$g,\n type: type$f,\n aliases: aliases$5,\n aceMode: aceMode$f,\n codemirrorMode: codemirrorMode$b,\n codemirrorMimeType: codemirrorMimeType$b,\n wrap: wrap,\n extensions: extensions$f,\n filenames: filenames$3,\n tmScope: tmScope$f,\n languageId: languageId$f,\n 'default': Markdown\n });\n\n var require$$0$7 = getCjsExportFromNamespace(Markdown$1);\n\n const languages$5 = [createLanguage(require$$0$7, data => ({\n since: \"1.8.0\",\n parsers: [\"markdown\"],\n vscodeLanguageIds: [\"markdown\"],\n filenames: data.filenames.concat([\"README\"]),\n extensions: data.extensions.filter(extension => extension !== \".mdx\")\n })), createLanguage(require$$0$7, () => ({\n name: \"MDX\",\n since: \"1.15.0\",\n parsers: [\"mdx\"],\n vscodeLanguageIds: [\"mdx\"],\n filenames: [],\n extensions: [\".mdx\"]\n }))];\n const printers$5 = {\n mdast: printerMarkdown\n };\n var languageMarkdown = {\n languages: languages$5,\n options: options$6,\n printers: printers$5\n };\n\n function isPragma(text) {\n return /^\\s*@(prettier|format)\\s*$/.test(text);\n }\n\n function hasPragma$4(text) {\n return /^\\s*#[^\\n\\S]*@(prettier|format)\\s*?(\\n|$)/.test(text);\n }\n\n function insertPragma$8(text) {\n return \"# @format\\n\\n\".concat(text);\n }\n\n var pragma$5 = {\n isPragma,\n hasPragma: hasPragma$4,\n insertPragma: insertPragma$8\n };\n\n const {\n getLast: getLast$5\n } = util$1;\n\n function getAncestorCount(path, filter) {\n let counter = 0;\n const pathStackLength = path.stack.length - 1;\n\n for (let i = 0; i < pathStackLength; i++) {\n const value = path.stack[i];\n\n if (isNode(value) && filter(value)) {\n counter++;\n }\n }\n\n return counter;\n }\n /**\n * @param {any} value\n * @param {string[]=} types\n */\n\n\n function isNode(value, types) {\n return value && typeof value.type === \"string\" && (!types || types.includes(value.type));\n }\n\n function mapNode(node, callback, parent) {\n return callback(\"children\" in node ? Object.assign({}, node, {\n children: node.children.map(childNode => mapNode(childNode, callback, node))\n }) : node, parent);\n }\n\n function defineShortcut(x, key, getter) {\n Object.defineProperty(x, key, {\n get: getter,\n enumerable: false\n });\n }\n\n function isNextLineEmpty$5(node, text) {\n let newlineCount = 0;\n const textLength = text.length;\n\n for (let i = node.position.end.offset - 1; i < textLength; i++) {\n const char = text[i];\n\n if (char === \"\\n\") {\n newlineCount++;\n }\n\n if (newlineCount === 1 && /\\S/.test(char)) {\n return false;\n }\n\n if (newlineCount === 2) {\n return true;\n }\n }\n\n return false;\n }\n\n function isLastDescendantNode(path) {\n const node = path.getValue();\n\n switch (node.type) {\n case \"tag\":\n case \"anchor\":\n case \"comment\":\n return false;\n }\n\n const pathStackLength = path.stack.length;\n\n for (let i = 1; i < pathStackLength; i++) {\n const item = path.stack[i];\n const parentItem = path.stack[i - 1];\n\n if (Array.isArray(parentItem) && typeof item === \"number\" && item !== parentItem.length - 1) {\n return false;\n }\n }\n\n return true;\n }\n\n function getLastDescendantNode$1(node) {\n return \"children\" in node && node.children.length !== 0 ? getLastDescendantNode$1(getLast$5(node.children)) : node;\n }\n\n function isPrettierIgnore$2(comment) {\n return comment.value.trim() === \"prettier-ignore\";\n }\n\n function hasPrettierIgnore$7(path) {\n const node = path.getValue();\n\n if (node.type === \"documentBody\") {\n const document = path.getParentNode();\n return hasEndComments(document.head) && isPrettierIgnore$2(getLast$5(document.head.endComments));\n }\n\n return hasLeadingComments(node) && isPrettierIgnore$2(getLast$5(node.leadingComments));\n }\n\n function isEmptyNode(node) {\n return (!node.children || node.children.length === 0) && !hasComments(node);\n }\n\n function hasComments(node) {\n return hasLeadingComments(node) || hasMiddleComments(node) || hasIndicatorComment(node) || hasTrailingComment$2(node) || hasEndComments(node);\n }\n\n function hasLeadingComments(node) {\n return node && node.leadingComments && node.leadingComments.length !== 0;\n }\n\n function hasMiddleComments(node) {\n return node && node.middleComments && node.middleComments.length !== 0;\n }\n\n function hasIndicatorComment(node) {\n return node && node.indicatorComment;\n }\n\n function hasTrailingComment$2(node) {\n return node && node.trailingComment;\n }\n\n function hasEndComments(node) {\n return node && node.endComments && node.endComments.length !== 0;\n }\n /**\n * \" a b c d e f \" -> [\" a b\", \"c d\", \"e f \"]\n */\n\n\n function splitWithSingleSpace(text) {\n const parts = [];\n let lastPart = undefined;\n\n for (const part of text.split(/( +)/g)) {\n if (part !== \" \") {\n if (lastPart === \" \") {\n parts.push(part);\n } else {\n parts.push((parts.pop() || \"\") + part);\n }\n } else if (lastPart === undefined) {\n parts.unshift(\"\");\n }\n\n lastPart = part;\n }\n\n if (lastPart === \" \") {\n parts.push((parts.pop() || \"\") + \" \");\n }\n\n if (parts[0] === \"\") {\n parts.shift();\n parts.unshift(\" \" + (parts.shift() || \"\"));\n }\n\n return parts;\n }\n\n function getFlowScalarLineContents(nodeType, content, options) {\n const rawLineContents = content.split(\"\\n\").map((lineContent, index, lineContents) => index === 0 && index === lineContents.length - 1 ? lineContent : index !== 0 && index !== lineContents.length - 1 ? lineContent.trim() : index === 0 ? lineContent.trimEnd() : lineContent.trimStart());\n\n if (options.proseWrap === \"preserve\") {\n return rawLineContents.map(lineContent => lineContent.length === 0 ? [] : [lineContent]);\n }\n\n return rawLineContents.map(lineContent => lineContent.length === 0 ? [] : splitWithSingleSpace(lineContent)).reduce((reduced, lineContentWords, index) => index !== 0 && rawLineContents[index - 1].length !== 0 && lineContentWords.length !== 0 && !( // trailing backslash in quoteDouble should be preserved\n nodeType === \"quoteDouble\" && getLast$5(getLast$5(reduced)).endsWith(\"\\\\\")) ? reduced.concat([reduced.pop().concat(lineContentWords)]) : reduced.concat([lineContentWords]), []).map(lineContentWords => options.proseWrap === \"never\" ? [lineContentWords.join(\" \")] : lineContentWords);\n }\n\n function getBlockValueLineContents(node, {\n parentIndent,\n isLastDescendant,\n options\n }) {\n const content = node.position.start.line === node.position.end.line ? \"\" : options.originalText.slice(node.position.start.offset, node.position.end.offset) // exclude open line `>` or `|`\n .match(/^[^\\n]*?\\n([\\s\\S]*)$/)[1];\n const leadingSpaceCount = node.indent === null ? (match => match ? match[1].length : Infinity)(content.match(/^( *)\\S/m)) : node.indent - 1 + parentIndent;\n const rawLineContents = content.split(\"\\n\").map(lineContent => lineContent.slice(leadingSpaceCount));\n\n if (options.proseWrap === \"preserve\" || node.type === \"blockLiteral\") {\n return removeUnnecessaryTrailingNewlines(rawLineContents.map(lineContent => lineContent.length === 0 ? [] : [lineContent]));\n }\n\n return removeUnnecessaryTrailingNewlines(rawLineContents.map(lineContent => lineContent.length === 0 ? [] : splitWithSingleSpace(lineContent)).reduce((reduced, lineContentWords, index) => index !== 0 && rawLineContents[index - 1].length !== 0 && lineContentWords.length !== 0 && !/^\\s/.test(lineContentWords[0]) && !/^\\s|\\s$/.test(getLast$5(reduced)) ? reduced.concat([reduced.pop().concat(lineContentWords)]) : reduced.concat([lineContentWords]), []).map(lineContentWords => lineContentWords.reduce((reduced, word) => // disallow trailing spaces\n reduced.length !== 0 && /\\s$/.test(getLast$5(reduced)) ? reduced.concat(reduced.pop() + \" \" + word) : reduced.concat(word), [])).map(lineContentWords => options.proseWrap === \"never\" ? [lineContentWords.join(\" \")] : lineContentWords));\n\n function removeUnnecessaryTrailingNewlines(lineContents) {\n if (node.chomping === \"keep\") {\n return getLast$5(lineContents).length === 0 ? lineContents.slice(0, -1) : lineContents;\n }\n\n let trailingNewlineCount = 0;\n\n for (let i = lineContents.length - 1; i >= 0; i--) {\n if (lineContents[i].length === 0) {\n trailingNewlineCount++;\n } else {\n break;\n }\n }\n\n return trailingNewlineCount === 0 ? lineContents : trailingNewlineCount >= 2 && !isLastDescendant ? // next empty line\n lineContents.slice(0, -(trailingNewlineCount - 1)) : lineContents.slice(0, -trailingNewlineCount);\n }\n }\n\n var utils$7 = {\n getLast: getLast$5,\n getAncestorCount,\n isNode,\n isEmptyNode,\n mapNode,\n defineShortcut,\n isNextLineEmpty: isNextLineEmpty$5,\n isLastDescendantNode,\n getBlockValueLineContents,\n getFlowScalarLineContents,\n getLastDescendantNode: getLastDescendantNode$1,\n hasPrettierIgnore: hasPrettierIgnore$7,\n hasLeadingComments,\n hasMiddleComments,\n hasIndicatorComment,\n hasTrailingComment: hasTrailingComment$2,\n hasEndComments\n };\n\n const {\n insertPragma: insertPragma$9,\n isPragma: isPragma$1\n } = pragma$5;\n const {\n getAncestorCount: getAncestorCount$1,\n getBlockValueLineContents: getBlockValueLineContents$1,\n getFlowScalarLineContents: getFlowScalarLineContents$1,\n getLast: getLast$6,\n getLastDescendantNode: getLastDescendantNode$2,\n hasLeadingComments: hasLeadingComments$1,\n hasMiddleComments: hasMiddleComments$1,\n hasIndicatorComment: hasIndicatorComment$1,\n hasTrailingComment: hasTrailingComment$3,\n hasEndComments: hasEndComments$1,\n hasPrettierIgnore: hasPrettierIgnore$8,\n isLastDescendantNode: isLastDescendantNode$1,\n isNextLineEmpty: isNextLineEmpty$6,\n isNode: isNode$1,\n isEmptyNode: isEmptyNode$1,\n defineShortcut: defineShortcut$1,\n mapNode: mapNode$1\n } = utils$7;\n const docBuilders$2 = document.builders;\n const {\n conditionalGroup: conditionalGroup$2,\n breakParent: breakParent$5,\n concat: concat$h,\n dedent: dedent$3,\n dedentToRoot: dedentToRoot$3,\n fill: fill$6,\n group: group$g,\n hardline: hardline$d,\n ifBreak: ifBreak$8,\n join: join$c,\n line: line$b,\n lineSuffix: lineSuffix$2,\n literalline: literalline$7,\n markAsRoot: markAsRoot$5,\n softline: softline$8\n } = docBuilders$2;\n const {\n replaceEndOfLineWith: replaceEndOfLineWith$3\n } = util$1;\n\n function preprocess$3(ast) {\n return mapNode$1(ast, defineShortcuts);\n }\n\n function defineShortcuts(node) {\n switch (node.type) {\n case \"document\":\n defineShortcut$1(node, \"head\", () => node.children[0]);\n defineShortcut$1(node, \"body\", () => node.children[1]);\n break;\n\n case \"documentBody\":\n case \"sequenceItem\":\n case \"flowSequenceItem\":\n case \"mappingKey\":\n case \"mappingValue\":\n defineShortcut$1(node, \"content\", () => node.children[0]);\n break;\n\n case \"mappingItem\":\n case \"flowMappingItem\":\n defineShortcut$1(node, \"key\", () => node.children[0]);\n defineShortcut$1(node, \"value\", () => node.children[1]);\n break;\n }\n\n return node;\n }\n\n function genericPrint$6(path, options, print) {\n const node = path.getValue();\n const parentNode = path.getParentNode();\n const tag = !node.tag ? \"\" : path.call(print, \"tag\");\n const anchor = !node.anchor ? \"\" : path.call(print, \"anchor\");\n const nextEmptyLine = isNode$1(node, [\"mapping\", \"sequence\", \"comment\", \"directive\", \"mappingItem\", \"sequenceItem\"]) && !isLastDescendantNode$1(path) ? printNextEmptyLine(path, options.originalText) : \"\";\n return concat$h([node.type !== \"mappingValue\" && hasLeadingComments$1(node) ? concat$h([join$c(hardline$d, path.map(print, \"leadingComments\")), hardline$d]) : \"\", tag, tag && anchor ? \" \" : \"\", anchor, tag || anchor ? isNode$1(node, [\"sequence\", \"mapping\"]) && !hasMiddleComments$1(node) ? hardline$d : \" \" : \"\", hasMiddleComments$1(node) ? concat$h([node.middleComments.length === 1 ? \"\" : hardline$d, join$c(hardline$d, path.map(print, \"middleComments\")), hardline$d]) : \"\", hasPrettierIgnore$8(path) ? concat$h(replaceEndOfLineWith$3(options.originalText.slice(node.position.start.offset, node.position.end.offset), literalline$7)) : group$g(_print(node, parentNode, path, options, print)), hasTrailingComment$3(node) && !isNode$1(node, [\"document\", \"documentHead\"]) ? lineSuffix$2(concat$h([node.type === \"mappingValue\" && !node.content ? \"\" : \" \", parentNode.type === \"mappingKey\" && path.getParentNode(2).type === \"mapping\" && isInlineNode(node) ? \"\" : breakParent$5, path.call(print, \"trailingComment\")])) : \"\", nextEmptyLine, hasEndComments$1(node) && !isNode$1(node, [\"documentHead\", \"documentBody\"]) ? align$3(node.type === \"sequenceItem\" ? 2 : 0, concat$h([hardline$d, join$c(hardline$d, path.map(print, \"endComments\"))])) : \"\"]);\n }\n\n function _print(node, parentNode, path, options, print) {\n switch (node.type) {\n case \"root\":\n return concat$h([join$c(hardline$d, path.map((childPath, index) => {\n const document = node.children[index];\n const nextDocument = node.children[index + 1];\n return concat$h([print(childPath), shouldPrintDocumentEndMarker(document, nextDocument) ? concat$h([hardline$d, \"...\", hasTrailingComment$3(document) ? concat$h([\" \", path.call(print, \"trailingComment\")]) : \"\"]) : !nextDocument || hasTrailingComment$3(nextDocument.head) ? \"\" : concat$h([hardline$d, \"---\"])]);\n }, \"children\")), node.children.length === 0 || (lastDescendantNode => isNode$1(lastDescendantNode, [\"blockLiteral\", \"blockFolded\"]) && lastDescendantNode.chomping === \"keep\")(getLastDescendantNode$2(node)) ? \"\" : hardline$d]);\n\n case \"document\":\n {\n const nextDocument = parentNode.children[path.getName() + 1];\n return join$c(hardline$d, [shouldPrintDocumentHeadEndMarker(node, nextDocument, parentNode, options) === \"head\" ? join$c(hardline$d, [node.head.children.length === 0 && node.head.endComments.length === 0 ? \"\" : path.call(print, \"head\"), concat$h([\"---\", hasTrailingComment$3(node.head) ? concat$h([\" \", path.call(print, \"head\", \"trailingComment\")]) : \"\"])].filter(Boolean)) : \"\", shouldPrintDocumentBody(node) ? path.call(print, \"body\") : \"\"].filter(Boolean));\n }\n\n case \"documentHead\":\n return join$c(hardline$d, [].concat(path.map(print, \"children\"), path.map(print, \"endComments\")));\n\n case \"documentBody\":\n {\n const children = join$c(hardline$d, path.map(print, \"children\")).parts;\n const endComments = join$c(hardline$d, path.map(print, \"endComments\")).parts;\n const separator = children.length === 0 || endComments.length === 0 ? \"\" : (lastDescendantNode => isNode$1(lastDescendantNode, [\"blockFolded\", \"blockLiteral\"]) ? lastDescendantNode.chomping === \"keep\" ? // there's already a newline printed at the end of blockValue (chomping=keep, lastDescendant=true)\n \"\" : // an extra newline for better readability\n concat$h([hardline$d, hardline$d]) : hardline$d)(getLastDescendantNode$2(node));\n return concat$h([].concat(children, separator, endComments));\n }\n\n case \"directive\":\n return concat$h([\"%\", join$c(\" \", [node.name].concat(node.parameters))]);\n\n case \"comment\":\n return concat$h([\"#\", node.value]);\n\n case \"alias\":\n return concat$h([\"*\", node.value]);\n\n case \"tag\":\n return options.originalText.slice(node.position.start.offset, node.position.end.offset);\n\n case \"anchor\":\n return concat$h([\"&\", node.value]);\n\n case \"plain\":\n return printFlowScalarContent(node.type, options.originalText.slice(node.position.start.offset, node.position.end.offset), options);\n\n case \"quoteDouble\":\n case \"quoteSingle\":\n {\n const singleQuote = \"'\";\n const doubleQuote = '\"';\n const raw = options.originalText.slice(node.position.start.offset + 1, node.position.end.offset - 1);\n\n if (node.type === \"quoteSingle\" && raw.includes(\"\\\\\") || node.type === \"quoteDouble\" && /\\\\[^\"]/.test(raw)) {\n // only quoteDouble can use escape chars\n // and quoteSingle do not need to escape backslashes\n const originalQuote = node.type === \"quoteDouble\" ? doubleQuote : singleQuote;\n return concat$h([originalQuote, printFlowScalarContent(node.type, raw, options), originalQuote]);\n } else if (raw.includes(doubleQuote)) {\n return concat$h([singleQuote, printFlowScalarContent(node.type, node.type === \"quoteDouble\" ? raw // double quote needs to be escaped by backslash in quoteDouble\n .replace(/\\\\\"/g, doubleQuote).replace(/'/g, singleQuote.repeat(2)) : raw, options), singleQuote]);\n }\n\n if (raw.includes(singleQuote)) {\n return concat$h([doubleQuote, printFlowScalarContent(node.type, node.type === \"quoteSingle\" ? // single quote needs to be escaped by 2 single quotes in quoteSingle\n raw.replace(/''/g, singleQuote) : raw, options), doubleQuote]);\n }\n\n const quote = options.singleQuote ? singleQuote : doubleQuote;\n return concat$h([quote, printFlowScalarContent(node.type, raw, options), quote]);\n }\n\n case \"blockFolded\":\n case \"blockLiteral\":\n {\n const parentIndent = getAncestorCount$1(path, ancestorNode => isNode$1(ancestorNode, [\"sequence\", \"mapping\"]));\n const isLastDescendant = isLastDescendantNode$1(path);\n return concat$h([node.type === \"blockFolded\" ? \">\" : \"|\", node.indent === null ? \"\" : node.indent.toString(), node.chomping === \"clip\" ? \"\" : node.chomping === \"keep\" ? \"+\" : \"-\", hasIndicatorComment$1(node) ? concat$h([\" \", path.call(print, \"indicatorComment\")]) : \"\", (node.indent === null ? dedent$3 : dedentToRoot$3)(align$3(node.indent === null ? options.tabWidth : node.indent - 1 + parentIndent, concat$h(getBlockValueLineContents$1(node, {\n parentIndent,\n isLastDescendant,\n options\n }).reduce((reduced, lineWords, index, lineContents) => reduced.concat(index === 0 ? hardline$d : \"\", fill$6(join$c(line$b, lineWords).parts), index !== lineContents.length - 1 ? lineWords.length === 0 ? hardline$d : markAsRoot$5(literalline$7) : node.chomping === \"keep\" && isLastDescendant ? lineWords.length === 0 ? dedentToRoot$3(hardline$d) : dedentToRoot$3(literalline$7) : \"\"), []))))]);\n }\n\n case \"sequence\":\n return join$c(hardline$d, path.map(print, \"children\"));\n\n case \"sequenceItem\":\n return concat$h([\"- \", align$3(2, !node.content ? \"\" : path.call(print, \"content\"))]);\n\n case \"mappingKey\":\n return !node.content ? \"\" : path.call(print, \"content\");\n\n case \"mappingValue\":\n return !node.content ? \"\" : path.call(print, \"content\");\n\n case \"mapping\":\n return join$c(hardline$d, path.map(print, \"children\"));\n\n case \"mappingItem\":\n case \"flowMappingItem\":\n {\n const isEmptyMappingKey = isEmptyNode$1(node.key);\n const isEmptyMappingValue = isEmptyNode$1(node.value);\n\n if (isEmptyMappingKey && isEmptyMappingValue) {\n return concat$h([\": \"]);\n }\n\n const key = path.call(print, \"key\");\n const value = path.call(print, \"value\");\n\n if (isEmptyMappingValue) {\n return node.type === \"flowMappingItem\" && parentNode.type === \"flowMapping\" ? key : node.type === \"mappingItem\" && isAbsolutelyPrintedAsSingleLineNode(node.key.content, options) && !hasTrailingComment$3(node.key.content) && (!parentNode.tag || parentNode.tag.value !== \"tag:yaml.org,2002:set\") ? concat$h([key, needsSpaceInFrontOfMappingValue(node) ? \" \" : \"\", \":\"]) : concat$h([\"? \", align$3(2, key)]);\n }\n\n if (isEmptyMappingKey) {\n return concat$h([\": \", align$3(2, value)]);\n }\n\n const groupId = Symbol(\"mappingKey\");\n const forceExplicitKey = hasLeadingComments$1(node.value) || !isInlineNode(node.key.content);\n return forceExplicitKey ? concat$h([\"? \", align$3(2, key), hardline$d, join$c(\"\", path.map(print, \"value\", \"leadingComments\").map(comment => concat$h([comment, hardline$d]))), \": \", align$3(2, value)]) : // force singleline\n isSingleLineNode(node.key.content) && !hasLeadingComments$1(node.key.content) && !hasMiddleComments$1(node.key.content) && !hasTrailingComment$3(node.key.content) && !hasEndComments$1(node.key) && !hasLeadingComments$1(node.value.content) && !hasMiddleComments$1(node.value.content) && !hasEndComments$1(node.value) && isAbsolutelyPrintedAsSingleLineNode(node.value.content, options) ? concat$h([key, needsSpaceInFrontOfMappingValue(node) ? \" \" : \"\", \": \", value]) : conditionalGroup$2([concat$h([group$g(concat$h([ifBreak$8(\"? \"), group$g(align$3(2, key), {\n id: groupId\n })])), ifBreak$8(concat$h([hardline$d, \": \", align$3(2, value)]), indent(concat$h([needsSpaceInFrontOfMappingValue(node) ? \" \" : \"\", \":\", hasLeadingComments$1(node.value.content) || hasEndComments$1(node.value) && node.value.content && !isNode$1(node.value.content, [\"mapping\", \"sequence\"]) || parentNode.type === \"mapping\" && hasTrailingComment$3(node.key.content) && isInlineNode(node.value.content) || isNode$1(node.value.content, [\"mapping\", \"sequence\"]) && node.value.content.tag === null && node.value.content.anchor === null ? hardline$d : !node.value.content ? \"\" : line$b, value])), {\n groupId\n })])]);\n }\n\n case \"flowMapping\":\n case \"flowSequence\":\n {\n const openMarker = node.type === \"flowMapping\" ? \"{\" : \"[\";\n const closeMarker = node.type === \"flowMapping\" ? \"}\" : \"]\";\n const bracketSpacing = node.type === \"flowMapping\" && node.children.length !== 0 && options.bracketSpacing ? line$b : softline$8;\n\n const isLastItemEmptyMappingItem = node.children.length !== 0 && (lastItem => lastItem.type === \"flowMappingItem\" && isEmptyNode$1(lastItem.key) && isEmptyNode$1(lastItem.value))(getLast$6(node.children));\n\n return concat$h([openMarker, indent(concat$h([bracketSpacing, concat$h(path.map((childPath, index) => concat$h([print(childPath), index === node.children.length - 1 ? \"\" : concat$h([\",\", line$b, node.children[index].position.start.line !== node.children[index + 1].position.start.line ? printNextEmptyLine(childPath, options.originalText) : \"\"])]), \"children\")), ifBreak$8(\",\", \"\")])), isLastItemEmptyMappingItem ? \"\" : bracketSpacing, closeMarker]);\n }\n\n case \"flowSequenceItem\":\n return path.call(print, \"content\");\n // istanbul ignore next\n\n default:\n throw new Error(\"Unexpected node type \".concat(node.type));\n }\n\n function indent(doc) {\n return docBuilders$2.align(\" \".repeat(options.tabWidth), doc);\n }\n }\n\n function align$3(n, doc) {\n return typeof n === \"number\" && n > 0 ? docBuilders$2.align(\" \".repeat(n), doc) : docBuilders$2.align(n, doc);\n }\n\n function isInlineNode(node) {\n if (!node) {\n return true;\n }\n\n switch (node.type) {\n case \"plain\":\n case \"quoteDouble\":\n case \"quoteSingle\":\n case \"alias\":\n case \"flowMapping\":\n case \"flowSequence\":\n return true;\n\n default:\n return false;\n }\n }\n\n function isSingleLineNode(node) {\n if (!node) {\n return true;\n }\n\n switch (node.type) {\n case \"plain\":\n case \"quoteDouble\":\n case \"quoteSingle\":\n return node.position.start.line === node.position.end.line;\n\n case \"alias\":\n return true;\n\n default:\n return false;\n }\n }\n\n function shouldPrintDocumentBody(document) {\n return document.body.children.length !== 0 || hasEndComments$1(document.body);\n }\n\n function shouldPrintDocumentEndMarker(document, nextDocument) {\n return (\n /**\n *... # trailingComment\n */\n hasTrailingComment$3(document) || nextDocument && (\n /**\n * ...\n * %DIRECTIVE\n * ---\n */\n nextDocument.head.children.length !== 0 ||\n /**\n * ...\n * # endComment\n * ---\n */\n hasEndComments$1(nextDocument.head))\n );\n }\n\n function shouldPrintDocumentHeadEndMarker(document, nextDocument, root, options) {\n if (\n /**\n * ---\n * preserve the first document head end marker\n */\n root.children[0] === document && /---(\\s|$)/.test(options.originalText.slice(options.locStart(document), options.locStart(document) + 4)) ||\n /**\n * %DIRECTIVE\n * ---\n */\n document.head.children.length !== 0 ||\n /**\n * # end comment\n * ---\n */\n hasEndComments$1(document.head) ||\n /**\n * --- # trailing comment\n */\n hasTrailingComment$3(document.head)) {\n return \"head\";\n }\n\n if (shouldPrintDocumentEndMarker(document, nextDocument)) {\n return false;\n }\n\n return nextDocument ? \"root\" : false;\n }\n\n function isAbsolutelyPrintedAsSingleLineNode(node, options) {\n if (!node) {\n return true;\n }\n\n switch (node.type) {\n case \"plain\":\n case \"quoteSingle\":\n case \"quoteDouble\":\n break;\n\n case \"alias\":\n return true;\n\n default:\n return false;\n }\n\n if (options.proseWrap === \"preserve\") {\n return node.position.start.line === node.position.end.line;\n }\n\n if ( // backslash-newline\n /\\\\$/m.test(options.originalText.slice(node.position.start.offset, node.position.end.offset))) {\n return false;\n }\n\n switch (options.proseWrap) {\n case \"never\":\n return !node.value.includes(\"\\n\");\n\n case \"always\":\n return !/[\\n ]/.test(node.value);\n // istanbul ignore next\n\n default:\n return false;\n }\n }\n\n function needsSpaceInFrontOfMappingValue(node) {\n return node.key.content && node.key.content.type === \"alias\";\n }\n\n function printNextEmptyLine(path, originalText) {\n const node = path.getValue();\n const root = path.stack[0];\n root.isNextEmptyLinePrintedChecklist = root.isNextEmptyLinePrintedChecklist || [];\n\n if (!root.isNextEmptyLinePrintedChecklist[node.position.end.line]) {\n if (isNextLineEmpty$6(node, originalText)) {\n root.isNextEmptyLinePrintedChecklist[node.position.end.line] = true;\n return softline$8;\n }\n }\n\n return \"\";\n }\n\n function printFlowScalarContent(nodeType, content, options) {\n const lineContents = getFlowScalarLineContents$1(nodeType, content, options);\n return join$c(hardline$d, lineContents.map(lineContentWords => fill$6(join$c(line$b, lineContentWords).parts)));\n }\n\n function clean$7(node, newNode\n /*, parent */\n ) {\n if (isNode$1(newNode)) {\n delete newNode.position;\n\n switch (newNode.type) {\n case \"comment\":\n // insert pragma\n if (isPragma$1(newNode.value)) {\n return null;\n }\n\n break;\n\n case \"quoteDouble\":\n case \"quoteSingle\":\n newNode.type = \"quote\";\n break;\n }\n }\n }\n\n var printerYaml = {\n preprocess: preprocess$3,\n print: genericPrint$6,\n massageAstNode: clean$7,\n insertPragma: insertPragma$9\n };\n\n var options$7 = {\n bracketSpacing: commonOptions.bracketSpacing,\n singleQuote: commonOptions.singleQuote,\n proseWrap: commonOptions.proseWrap\n };\n\n var name$h = \"YAML\";\n var type$g = \"data\";\n var tmScope$g = \"source.yaml\";\n var aliases$6 = [\n \t\"yml\"\n ];\n var extensions$g = [\n \t\".yml\",\n \t\".mir\",\n \t\".reek\",\n \t\".rviz\",\n \t\".sublime-syntax\",\n \t\".syntax\",\n \t\".yaml\",\n \t\".yaml-tmlanguage\",\n \t\".yaml.sed\",\n \t\".yml.mysql\"\n ];\n var filenames$4 = [\n \t\".clang-format\",\n \t\".clang-tidy\",\n \t\".gemrc\",\n \t\"glide.lock\",\n \t\"yarn.lock\"\n ];\n var aceMode$g = \"yaml\";\n var codemirrorMode$c = \"yaml\";\n var codemirrorMimeType$c = \"text/x-yaml\";\n var languageId$g = 407;\n var YAML = {\n \tname: name$h,\n \ttype: type$g,\n \ttmScope: tmScope$g,\n \taliases: aliases$6,\n \textensions: extensions$g,\n \tfilenames: filenames$4,\n \taceMode: aceMode$g,\n \tcodemirrorMode: codemirrorMode$c,\n \tcodemirrorMimeType: codemirrorMimeType$c,\n \tlanguageId: languageId$g\n };\n\n var YAML$1 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n name: name$h,\n type: type$g,\n tmScope: tmScope$g,\n aliases: aliases$6,\n extensions: extensions$g,\n filenames: filenames$4,\n aceMode: aceMode$g,\n codemirrorMode: codemirrorMode$c,\n codemirrorMimeType: codemirrorMimeType$c,\n languageId: languageId$g,\n 'default': YAML\n });\n\n var require$$0$8 = getCjsExportFromNamespace(YAML$1);\n\n const languages$6 = [createLanguage(require$$0$8, data => ({\n since: \"1.14.0\",\n parsers: [\"yaml\"],\n vscodeLanguageIds: [\"yaml\"],\n // yarn.lock is not YAML: https://github.com/yarnpkg/yarn/issues/5629\n filenames: data.filenames.filter(filename => filename !== \"yarn.lock\")\n }))];\n var languageYaml = {\n languages: languages$6,\n printers: {\n yaml: printerYaml\n },\n options: options$7\n };\n\n const {\n version: version$2\n } = require$$0;\n const {\n getSupportInfo: getSupportInfo$2\n } = support;\n const internalPlugins = [languageCss, languageGraphql, languageHandlebars, languageHtml, languageJs, languageMarkdown, languageYaml];\n\n function withPlugins(fn, optsArgIdx = 1 // Usually `opts` is the 2nd argument\n ) {\n return (...args) => {\n const opts = args[optsArgIdx] || {};\n const plugins = opts.plugins || [];\n args[optsArgIdx] = Object.assign({}, opts, {\n plugins: [...internalPlugins, ...(Array.isArray(plugins) ? plugins : Object.values(plugins))]\n });\n return fn(...args);\n };\n }\n\n const formatWithCursor = withPlugins(core.formatWithCursor);\n var standalone = {\n formatWithCursor,\n\n format(text, opts) {\n return formatWithCursor(text, opts).formatted;\n },\n\n check(text, opts) {\n const {\n formatted\n } = formatWithCursor(text, opts);\n return formatted === text;\n },\n\n doc: document,\n getSupportInfo: withPlugins(getSupportInfo$2, 0),\n version: version$2,\n util: utilShared,\n __debug: {\n parse: withPlugins(core.parse),\n formatAST: withPlugins(core.formatAST),\n formatDoc: withPlugins(core.formatDoc),\n printToDoc: withPlugins(core.printToDoc),\n printDocToString: withPlugins(core.printDocToString)\n }\n };\n\n var standalone$1 = standalone;\n\n return standalone$1;\n\n})));\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","'use strict';\n\n/**\n * Module dependencies.\n */\nvar cheerio = require('cheerio');\nvar utils = require('./utils');\n\nvar cheerioLoad = function(html, options, encodeEntities) {\n options = utils.extend({decodeEntities: false}, options || {});\n html = encodeEntities(html);\n return cheerio.load(html,options);\n};\n\nvar createEntityConverters = function () {\n var codeBlockLookup = [];\n\n var encodeCodeBlocks = function(html) {\n var blocks = module.exports.codeBlocks;\n Object.keys(blocks).forEach(function(key) {\n var re = new RegExp(blocks[key].start + '([\\\\S\\\\s]*?)' + blocks[key].end, 'g');\n html = html.replace(re, function(match, subMatch) {\n codeBlockLookup.push(match);\n return 'JUICE_CODE_BLOCK_' + (codeBlockLookup.length - 1) + '_';\n });\n });\n return html;\n };\n\n var decodeCodeBlocks = function(html) {\n for(var index = 0; index < codeBlockLookup.length; index++) {\n var re = new RegExp('JUICE_CODE_BLOCK_' + index + '_(=\"\")?', 'gi');\n html = html.replace(re, function() {\n return codeBlockLookup[index];\n });\n }\n return html;\n };\n\n return {\n encodeEntities: encodeCodeBlocks,\n decodeEntities: decodeCodeBlocks,\n };\n};\n\n/**\n * Parses the input, calls the callback on the parsed DOM, and generates the output\n *\n * @param {String} html input html to be processed\n * @param {Object} options for the parser\n * @param {Function} callback to be invoked on the DOM\n * @param {Array} callbackExtraArguments to be passed to the callback\n * @return {String} resulting html\n */\nmodule.exports = function(html, options, callback, callbackExtraArguments) {\n var entityConverters = createEntityConverters();\n\n var $ = cheerioLoad(html, options, entityConverters.encodeEntities);\n var args = [ $ ];\n args.push.apply(args, callbackExtraArguments);\n var doc = callback.apply(undefined, args) || $;\n\n if (options && options.xmlMode) {\n return entityConverters.decodeEntities(doc.xml());\n }\n return entityConverters.decodeEntities(doc.html());\n};\n\nmodule.exports.codeBlocks = {\n EJS: { start: '<%', end: '%>' },\n HBS: { start: '{{', end: '}}' }\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","var classof = require('../internals/classof');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used to compose bitmasks for comparison styles. */\nvar UNORDERED_COMPARE_FLAG = 1,\n PARTIAL_COMPARE_FLAG = 2;\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n reLeadingDot = /^\\./,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n return freeProcess && freeProcess.binding('util');\n } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array ? array.length : 0,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\n/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array ? array.length : 0;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol,\n Uint8Array = root.Uint8Array,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView'),\n Map = getNative(root, 'Map'),\n Promise = getNative(root, 'Promise'),\n Set = getNative(root, 'Set'),\n WeakMap = getNative(root, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values ? values.length : 0;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n this.__data__ = new ListCache(entries);\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n return this.__data__['delete'](key);\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var cache = this.__data__;\n if (cache instanceof ListCache) {\n var pairs = cache.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n return this;\n }\n cache = this.__data__ = new MapCache(pairs);\n }\n cache.set(key, value);\n return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n // Safari 9 makes `arguments.length` enumerable in strict mode.\n var result = (isArray(value) || isArguments(value))\n ? baseTimes(value.length, String)\n : [];\n\n var length = result.length,\n skipIndexes = !!length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = isKey(path, object) ? [path] : castPath(path);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\n/**\n * The base implementation of `getTag`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n return objectToString.call(value);\n}\n\n/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {boolean} [bitmask] The bitmask of comparison flags.\n * The bitmask may be composed of the following flags:\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, customizer, bitmask, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack);\n}\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = arrayTag,\n othTag = arrayTag;\n\n if (!objIsArr) {\n objTag = getTag(object);\n objTag = objTag == argsTag ? objectTag : objTag;\n }\n if (!othIsArr) {\n othTag = getTag(other);\n othTag = othTag == argsTag ? objectTag : othTag;\n }\n var objIsObj = objTag == objectTag && !isHostObject(object),\n othIsObj = othTag == objectTag && !isHostObject(other),\n isSameTag = objTag == othTag;\n\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, equalFunc, customizer, bitmask, stack)\n : equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack);\n }\n if (!(bitmask & PARTIAL_COMPARE_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, equalFunc, customizer, bitmask, stack);\n}\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[objectToString.call(value)];\n}\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG);\n };\n}\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value) {\n return isArray(value) ? value : stringToPath(value);\n}\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\n/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, equalFunc, customizer, bitmask, stack) {\n var isPartial = bitmask & PARTIAL_COMPARE_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!seen.has(othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) {\n return seen.add(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, customizer, bitmask, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & PARTIAL_COMPARE_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= UNORDERED_COMPARE_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, equalFunc, customizer, bitmask, stack) {\n var isPartial = bitmask & PARTIAL_COMPARE_FLAG,\n objProps = keys(object),\n objLength = objProps.length,\n othProps = keys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11,\n// for data views in Edge < 14, and promises in Node.js.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = objectToString.call(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : undefined;\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = isKey(path, object) ? [path] : castPath(path);\n\n var result,\n index = -1,\n length = path.length;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result) {\n return result;\n }\n var length = object ? object.length : 0;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\n/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoize(function(string) {\n string = toString(string);\n\n var result = [];\n if (reLeadingDot.test(string)) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee, 3));\n}\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result);\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Assign cache to `_.memoize`.\nmemoize.Cache = MapCache;\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = map;\n","var ElementType = require(\"domelementtype\");\n\nvar re_whitespace = /\\s+/g;\nvar NodePrototype = require(\"./lib/node\");\nvar ElementPrototype = require(\"./lib/element\");\n\nfunction DomHandler(callback, options, elementCB){\n\tif(typeof callback === \"object\"){\n\t\telementCB = options;\n\t\toptions = callback;\n\t\tcallback = null;\n\t} else if(typeof options === \"function\"){\n\t\telementCB = options;\n\t\toptions = defaultOpts;\n\t}\n\tthis._callback = callback;\n\tthis._options = options || defaultOpts;\n\tthis._elementCB = elementCB;\n\tthis.dom = [];\n\tthis._done = false;\n\tthis._tagStack = [];\n\tthis._parser = this._parser || null;\n}\n\n//default options\nvar defaultOpts = {\n\tnormalizeWhitespace: false, //Replace all whitespace with single spaces\n\twithStartIndices: false, //Add startIndex properties to nodes\n\twithEndIndices: false, //Add endIndex properties to nodes\n};\n\nDomHandler.prototype.onparserinit = function(parser){\n\tthis._parser = parser;\n};\n\n//Resets the handler back to starting state\nDomHandler.prototype.onreset = function(){\n\tDomHandler.call(this, this._callback, this._options, this._elementCB);\n};\n\n//Signals the handler that parsing is done\nDomHandler.prototype.onend = function(){\n\tif(this._done) return;\n\tthis._done = true;\n\tthis._parser = null;\n\tthis._handleCallback(null);\n};\n\nDomHandler.prototype._handleCallback =\nDomHandler.prototype.onerror = function(error){\n\tif(typeof this._callback === \"function\"){\n\t\tthis._callback(error, this.dom);\n\t} else {\n\t\tif(error) throw error;\n\t}\n};\n\nDomHandler.prototype.onclosetag = function(){\n\t//if(this._tagStack.pop().name !== name) this._handleCallback(Error(\"Tagname didn't match!\"));\n\t\n\tvar elem = this._tagStack.pop();\n\n\tif(this._options.withEndIndices && elem){\n\t\telem.endIndex = this._parser.endIndex;\n\t}\n\n\tif(this._elementCB) this._elementCB(elem);\n};\n\nDomHandler.prototype._createDomElement = function(properties){\n\tif (!this._options.withDomLvl1) return properties;\n\n\tvar element;\n\tif (properties.type === \"tag\") {\n\t\telement = Object.create(ElementPrototype);\n\t} else {\n\t\telement = Object.create(NodePrototype);\n\t}\n\n\tfor (var key in properties) {\n\t\tif (properties.hasOwnProperty(key)) {\n\t\t\telement[key] = properties[key];\n\t\t}\n\t}\n\n\treturn element;\n};\n\nDomHandler.prototype._addDomElement = function(element){\n\tvar parent = this._tagStack[this._tagStack.length - 1];\n\tvar siblings = parent ? parent.children : this.dom;\n\tvar previousSibling = siblings[siblings.length - 1];\n\n\telement.next = null;\n\n\tif(this._options.withStartIndices){\n\t\telement.startIndex = this._parser.startIndex;\n\t}\n\tif(this._options.withEndIndices){\n\t\telement.endIndex = this._parser.endIndex;\n\t}\n\n\tif(previousSibling){\n\t\telement.prev = previousSibling;\n\t\tpreviousSibling.next = element;\n\t} else {\n\t\telement.prev = null;\n\t}\n\n\tsiblings.push(element);\n\telement.parent = parent || null;\n};\n\nDomHandler.prototype.onopentag = function(name, attribs){\n\tvar properties = {\n\t\ttype: name === \"script\" ? ElementType.Script : name === \"style\" ? ElementType.Style : ElementType.Tag,\n\t\tname: name,\n\t\tattribs: attribs,\n\t\tchildren: []\n\t};\n\n\tvar element = this._createDomElement(properties);\n\n\tthis._addDomElement(element);\n\n\tthis._tagStack.push(element);\n};\n\nDomHandler.prototype.ontext = function(data){\n\t//the ignoreWhitespace is officially dropped, but for now,\n\t//it's an alias for normalizeWhitespace\n\tvar normalize = this._options.normalizeWhitespace || this._options.ignoreWhitespace;\n\n\tvar lastTag;\n\n\tif(!this._tagStack.length && this.dom.length && (lastTag = this.dom[this.dom.length-1]).type === ElementType.Text){\n\t\tif(normalize){\n\t\t\tlastTag.data = (lastTag.data + data).replace(re_whitespace, \" \");\n\t\t} else {\n\t\t\tlastTag.data += data;\n\t\t}\n\t} else {\n\t\tif(\n\t\t\tthis._tagStack.length &&\n\t\t\t(lastTag = this._tagStack[this._tagStack.length - 1]) &&\n\t\t\t(lastTag = lastTag.children[lastTag.children.length - 1]) &&\n\t\t\tlastTag.type === ElementType.Text\n\t\t){\n\t\t\tif(normalize){\n\t\t\t\tlastTag.data = (lastTag.data + data).replace(re_whitespace, \" \");\n\t\t\t} else {\n\t\t\t\tlastTag.data += data;\n\t\t\t}\n\t\t} else {\n\t\t\tif(normalize){\n\t\t\t\tdata = data.replace(re_whitespace, \" \");\n\t\t\t}\n\n\t\t\tvar element = this._createDomElement({\n\t\t\t\tdata: data,\n\t\t\t\ttype: ElementType.Text\n\t\t\t});\n\n\t\t\tthis._addDomElement(element);\n\t\t}\n\t}\n};\n\nDomHandler.prototype.oncomment = function(data){\n\tvar lastTag = this._tagStack[this._tagStack.length - 1];\n\n\tif(lastTag && lastTag.type === ElementType.Comment){\n\t\tlastTag.data += data;\n\t\treturn;\n\t}\n\n\tvar properties = {\n\t\tdata: data,\n\t\ttype: ElementType.Comment\n\t};\n\n\tvar element = this._createDomElement(properties);\n\n\tthis._addDomElement(element);\n\tthis._tagStack.push(element);\n};\n\nDomHandler.prototype.oncdatastart = function(){\n\tvar properties = {\n\t\tchildren: [{\n\t\t\tdata: \"\",\n\t\t\ttype: ElementType.Text\n\t\t}],\n\t\ttype: ElementType.CDATA\n\t};\n\n\tvar element = this._createDomElement(properties);\n\n\tthis._addDomElement(element);\n\tthis._tagStack.push(element);\n};\n\nDomHandler.prototype.oncommentend = DomHandler.prototype.oncdataend = function(){\n\tthis._tagStack.pop();\n};\n\nDomHandler.prototype.onprocessinginstruction = function(name, data){\n\tvar element = this._createDomElement({\n\t\tname: name,\n\t\tdata: data,\n\t\ttype: ElementType.Directive\n\t});\n\n\tthis._addDomElement(element);\n};\n\nmodule.exports = DomHandler;\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n","'use strict';\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n\n error.request = request;\n error.response = response;\n error.isAxiosError = true;\n\n error.toJSON = function() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code\n };\n };\n return error;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n","'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n return Array.isArray(val) ? [] : {}\n}\n\nfunction cloneIfNecessary(value, optionsArgument) {\n var clone = optionsArgument && optionsArgument.clone === true;\n return (clone && isMergeableObject(value)) ? deepmerge(emptyTarget(value), value, optionsArgument) : value\n}\n\nfunction defaultArrayMerge(target, source, optionsArgument) {\n var destination = target.slice();\n source.forEach(function(e, i) {\n if (typeof destination[i] === 'undefined') {\n destination[i] = cloneIfNecessary(e, optionsArgument);\n } else if (isMergeableObject(e)) {\n destination[i] = deepmerge(target[i], e, optionsArgument);\n } else if (target.indexOf(e) === -1) {\n destination.push(cloneIfNecessary(e, optionsArgument));\n }\n });\n return destination\n}\n\nfunction mergeObject(target, source, optionsArgument) {\n var destination = {};\n if (isMergeableObject(target)) {\n Object.keys(target).forEach(function(key) {\n destination[key] = cloneIfNecessary(target[key], optionsArgument);\n });\n }\n Object.keys(source).forEach(function(key) {\n if (!isMergeableObject(source[key]) || !target[key]) {\n destination[key] = cloneIfNecessary(source[key], optionsArgument);\n } else {\n destination[key] = deepmerge(target[key], source[key], optionsArgument);\n }\n });\n return destination\n}\n\nfunction deepmerge(target, source, optionsArgument) {\n var sourceIsArray = Array.isArray(source);\n var targetIsArray = Array.isArray(target);\n var options = optionsArgument || { arrayMerge: defaultArrayMerge };\n var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n if (!sourceAndTargetTypesMatch) {\n return cloneIfNecessary(source, optionsArgument)\n } else if (sourceIsArray) {\n var arrayMerge = options.arrayMerge || defaultArrayMerge;\n return arrayMerge(target, source, optionsArgument)\n } else {\n return mergeObject(target, source, optionsArgument)\n }\n}\n\ndeepmerge.all = function deepmergeAll(array, optionsArgument) {\n if (!Array.isArray(array) || array.length < 2) {\n throw new Error('first argument should be an array with at least two elements')\n }\n\n // we are sure there are at least 2 values, so it is safe to have no initial value\n return array.reduce(function(prev, next) {\n return deepmerge(prev, next, optionsArgument)\n })\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n","module.exports = { \"default\": require(\"core-js/library/fn/object/assign\"), __esModule: true };","module.exports = {};\n","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n })\n }\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n }\n}\n","'use strict';\n\nexports.__esModule = true;\nexports.removeResizeListener = exports.addResizeListener = undefined;\n\nvar _resizeObserverPolyfill = require('resize-observer-polyfill');\n\nvar _resizeObserverPolyfill2 = _interopRequireDefault(_resizeObserverPolyfill);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar isServer = typeof window === 'undefined';\n\n/* istanbul ignore next */\nvar resizeHandler = function resizeHandler(entries) {\n for (var _iterator = entries, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n var _ref;\n\n if (_isArray) {\n if (_i >= _iterator.length) break;\n _ref = _iterator[_i++];\n } else {\n _i = _iterator.next();\n if (_i.done) break;\n _ref = _i.value;\n }\n\n var entry = _ref;\n\n var listeners = entry.target.__resizeListeners__ || [];\n if (listeners.length) {\n listeners.forEach(function (fn) {\n fn();\n });\n }\n }\n};\n\n/* istanbul ignore next */\nvar addResizeListener = exports.addResizeListener = function addResizeListener(element, fn) {\n if (isServer) return;\n if (!element.__resizeListeners__) {\n element.__resizeListeners__ = [];\n element.__ro__ = new _resizeObserverPolyfill2.default(resizeHandler);\n element.__ro__.observe(element);\n }\n element.__resizeListeners__.push(fn);\n};\n\n/* istanbul ignore next */\nvar removeResizeListener = exports.removeResizeListener = function removeResizeListener(element, fn) {\n if (!element || !element.__resizeListeners__) return;\n element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);\n if (!element.__resizeListeners__.length) {\n element.__ro__.disconnect();\n }\n};","'use strict';\nvar $ = require('../internals/export');\nvar forEach = require('../internals/array-for-each');\n\n// `Array.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {\n forEach: forEach\n});\n","'use strict';\n\nexports.__esModule = true;\n\nvar _vue = require('vue');\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nvar _dom = require('element-ui/lib/utils/dom');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar nodeList = [];\nvar ctx = '@@clickoutsideContext';\n\nvar startClick = void 0;\nvar seed = 0;\n\n!_vue2.default.prototype.$isServer && (0, _dom.on)(document, 'mousedown', function (e) {\n return startClick = e;\n});\n\n!_vue2.default.prototype.$isServer && (0, _dom.on)(document, 'mouseup', function (e) {\n nodeList.forEach(function (node) {\n return node[ctx].documentHandler(e, startClick);\n });\n});\n\nfunction createDocumentHandler(el, binding, vnode) {\n return function () {\n var mouseup = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var mousedown = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!vnode || !vnode.context || !mouseup.target || !mousedown.target || el.contains(mouseup.target) || el.contains(mousedown.target) || el === mouseup.target || vnode.context.popperElm && (vnode.context.popperElm.contains(mouseup.target) || vnode.context.popperElm.contains(mousedown.target))) return;\n\n if (binding.expression && el[ctx].methodName && vnode.context[el[ctx].methodName]) {\n vnode.context[el[ctx].methodName]();\n } else {\n el[ctx].bindingFn && el[ctx].bindingFn();\n }\n };\n}\n\n/**\n * v-clickoutside\n * @desc 点击元素外面才会触发的事件\n * @example\n * ```vue\n * \n * ```\n */\nexports.default = {\n bind: function bind(el, binding, vnode) {\n nodeList.push(el);\n var id = seed++;\n el[ctx] = {\n id: id,\n documentHandler: createDocumentHandler(el, binding, vnode),\n methodName: binding.expression,\n bindingFn: binding.value\n };\n },\n update: function update(el, binding, vnode) {\n el[ctx].documentHandler = createDocumentHandler(el, binding, vnode);\n el[ctx].methodName = binding.expression;\n el[ctx].bindingFn = binding.value;\n },\n unbind: function unbind(el) {\n var len = nodeList.length;\n\n for (var i = 0; i < len; i++) {\n if (nodeList[i][ctx].id === el[ctx].id) {\n nodeList.splice(i, 1);\n break;\n }\n }\n delete el[ctx];\n }\n};","\"use strict\";\n\nexports.__esModule = true;\n\nvar _assign = require(\"../core-js/object/assign\");\n\nvar _assign2 = _interopRequireDefault(_assign);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _assign2.default || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};","'use strict';\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.isVNode = isVNode;\n\nvar _util = require('element-ui/lib/utils/util');\n\nfunction isVNode(node) {\n return node !== null && (typeof node === 'undefined' ? 'undefined' : _typeof(node)) === 'object' && (0, _util.hasOwn)(node, 'componentOptions');\n};","var global = require('../internals/global');\n\nmodule.exports = global;\n","exports.nextTick = function nextTick(fn) {\n var args = Array.prototype.slice.call(arguments);\n args.shift();\n setTimeout(function () {\n fn.apply(null, args);\n }, 0);\n};\n\nexports.platform = exports.arch = \nexports.execPath = exports.title = 'browser';\nexports.pid = 1;\nexports.browser = true;\nexports.env = {};\nexports.argv = [];\n\nexports.binding = function (name) {\n\tthrow new Error('No such module. (Possibly not yet loaded)')\n};\n\n(function () {\n var cwd = '/';\n var path;\n exports.cwd = function () { return cwd };\n exports.chdir = function (dir) {\n if (!path) path = require('path');\n cwd = path.resolve(dir, cwd);\n };\n})();\n\nexports.exit = exports.kill = \nexports.umask = exports.dlopen = \nexports.uptime = exports.memoryUsage = \nexports.uvCounters = function() {};\nexports.features = {};\n","var parse = require(\"./parse.js\"),\n compile = require(\"./compile.js\");\n\nmodule.exports = function nthCheck(formula){\n\treturn compile(parse(formula));\n};\n\nmodule.exports.parse = parse;\nmodule.exports.compile = compile;","var fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n","'use strict';\n\n/**\n * Module dependencies.\n */\n\nvar mensch = require('mensch');\nvar own = {}.hasOwnProperty;\nvar Selector = require('./selector');\nvar Property = require('./property');\n\nexports.Selector = Selector;\nexports.Property = Property;\n\n/**\n * Returns an array of the selectors.\n *\n * @license Sizzle CSS Selector Engine - MIT\n * @param {String} selectorText from mensch\n * @api public\n */\n\nexports.extract = function extract(selectorText) {\n var attr = 0;\n var sels = [];\n var sel = '';\n\n for (var i = 0, l = selectorText.length; i < l; i++) {\n var c = selectorText.charAt(i);\n\n if (attr) {\n if (']' === c || ')' === c) { attr--; }\n sel += c;\n } else {\n if (',' === c) {\n sels.push(sel);\n sel = '';\n } else {\n if ('[' === c || '(' === c) { attr++; }\n if (sel.length || (c !== ',' && c !== '\\n' && c !== ' ')) { sel += c; }\n }\n }\n }\n\n if (sel.length) {\n sels.push(sel);\n }\n\n return sels;\n};\n\n/**\n * Returns a parse tree for a CSS source.\n * If it encounters multiple selectors separated by a comma, it splits the\n * tree.\n *\n * @param {String} css source\n * @api public\n */\n\nexports.parseCSS = function(css) {\n var parsed = mensch.parse(css, {position: true, comments: true});\n var rules = typeof parsed.stylesheet != 'undefined' && parsed.stylesheet.rules ? parsed.stylesheet.rules : [];\n var ret = [];\n\n for (var i = 0, l = rules.length; i < l; i++) {\n if (rules[i].type == 'rule') {\n var rule = rules[i];\n var selectors = rule.selectors;\n\n for (var ii = 0, ll = selectors.length; ii < ll; ii++) {\n ret.push([selectors[ii], rule.declarations]);\n }\n }\n }\n\n return ret;\n};\n\n/**\n * Returns preserved text for a CSS source.\n *\n * @param {String} css source\n * @param {Object} options\n * @api public\n */\n\nexports.getPreservedText = function(css, options, ignoredPseudos) {\n var parsed = mensch.parse(css, {position: true, comments: true});\n var rules = typeof parsed.stylesheet != 'undefined' && parsed.stylesheet.rules ? parsed.stylesheet.rules : [];\n var preserved = [];\n var lastStart = null;\n\n for (var i = rules.length - 1; i >= 0; i--) {\n if ((options.fontFaces && rules[i].type === 'font-face') ||\n (options.mediaQueries && rules[i].type === 'media') ||\n (options.keyFrames && rules[i].type === 'keyframes') ||\n (options.pseudos && rules[i].selectors && this.matchesPseudo(rules[i].selectors[0], ignoredPseudos))) {\n preserved.unshift(\n mensch.stringify(\n { stylesheet: { rules: [ rules[i] ] }},\n { comments: false, indentation: ' ' }\n )\n );\n }\n lastStart = rules[i].position.start;\n }\n\n if (preserved.length === 0) {\n return false;\n }\n return '\\n' + preserved.join('\\n') + '\\n';\n};\n\nexports.normalizeLineEndings = function(text) {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\n/g, '\\r\\n');\n};\n\nexports.matchesPseudo = function(needle, haystack) {\n return haystack.find(function (element) {\n return needle.indexOf(element) > -1;\n })\n}\n\n/**\n * Compares two specificity vectors, returning the winning one.\n *\n * @param {Array} vector a\n * @param {Array} vector b\n * @return {Array}\n * @api public\n */\n\nexports.compareFunc = function(a, b) {\n var min = Math.min(a.length, b.length);\n for (var i = 0; i < min; i++) {\n if (a[i] === b[i]) { continue; }\n if (a[i] > b[i]) { return 1; }\n return -1;\n }\n\n return a.length - b.length;\n};\n\nexports.compare = function(a, b) {\n return exports.compareFunc(a, b) == 1 ? a : b;\n};\n\nexports.extend = function(obj, src) {\n for (var key in src) {\n if (own.call(src, key)) {\n obj[key] = src[key];\n }\n }\n return obj;\n};\n\nexports.getDefaultOptions = function(options) {\n var result = exports.extend({\n extraCss: '',\n insertPreservedExtraCss: true,\n applyStyleTags: true,\n removeStyleTags: true,\n preserveMediaQueries: true,\n preserveFontFaces: true,\n preserveKeyFrames: true,\n preservePseudos: true,\n applyWidthAttributes: true,\n applyHeightAttributes: true,\n applyAttributesTableElements: true,\n url: ''\n }, options);\n\n result.webResources = result.webResources || {};\n\n return result;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar definePropertyModule = require('../internals/object-define-property');\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","var global = require('../internals/global');\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n","var isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n","'use strict';\n\nvar cheerio = require('./lib/cheerio');\nvar makeJuiceClient = require('./lib/inline');\n\n/**\n * Note that makeJuiceClient will take a base object (in this case a function) and enhance it\n * with a lot of useful properties and functions.\n *\n * This client adopts cheerio as a DOM parser and adds an \"inlineContent\" function that let\n * users to specify the CSS to be inlined instead of extracting it from the html.\n * \n * The weird \"makeJuiceClient\" behaviour is there in order to keep backward API compatibility.\n */\nvar juiceClient = makeJuiceClient(function(html,options) {\n return cheerio(html, { xmlMode: options && options.xmlMode}, juiceDocument, [options]);\n});\n\nvar juiceDocument = function(html, options) {\n return juiceClient.juiceDocument(html, options);\n}\n\njuiceClient.inlineContent = function(html, css, options) {\n return cheerio(html, { xmlMode: options && options.xmlMode}, juiceClient.inlineDocument, [css, options]);\n};\n\nmodule.exports = juiceClient;\n","'use strict';\n\nvar createError = require('./createError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n if (!validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n","module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/dist/\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 59);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return normalizeComponent; });\n/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nfunction normalizeComponent (\n scriptExports,\n render,\n staticRenderFns,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier, /* server only */\n shadowMode /* vue-cli only */\n) {\n // Vue.extend constructor export interop\n var options = typeof scriptExports === 'function'\n ? scriptExports.options\n : scriptExports\n\n // render functions\n if (render) {\n options.render = render\n options.staticRenderFns = staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = 'data-v-' + scopeId\n }\n\n var hook\n if (moduleIdentifier) { // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () { injectStyles.call(this, this.$root.$options.shadowRoot) }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functioal component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection (h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing\n ? [].concat(existing, hook)\n : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n\n\n/***/ }),\n\n/***/ 14:\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"element-ui/lib/scrollbar\");\n\n/***/ }),\n\n/***/ 18:\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"element-ui/lib/checkbox\");\n\n/***/ }),\n\n/***/ 21:\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"element-ui/lib/utils/shared\");\n\n/***/ }),\n\n/***/ 26:\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"babel-helper-vue-jsx-merge-props\");\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"element-ui/lib/utils/util\");\n\n/***/ }),\n\n/***/ 31:\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"element-ui/lib/utils/scroll-into-view\");\n\n/***/ }),\n\n/***/ 32:\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"element-ui/lib/utils/aria-utils\");\n\n/***/ }),\n\n/***/ 51:\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"element-ui/lib/radio\");\n\n/***/ }),\n\n/***/ 59:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader-panel/src/cascader-panel.vue?vue&type=template&id=34932346&\nvar cascader_panelvue_type_template_id_34932346_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n class: [\"el-cascader-panel\", _vm.border && \"is-bordered\"],\n on: { keydown: _vm.handleKeyDown }\n },\n _vm._l(_vm.menus, function(menu, index) {\n return _c(\"cascader-menu\", {\n key: index,\n ref: \"menu\",\n refInFor: true,\n attrs: { index: index, nodes: menu }\n })\n }),\n 1\n )\n}\nvar staticRenderFns = []\ncascader_panelvue_type_template_id_34932346_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-panel.vue?vue&type=template&id=34932346&\n\n// EXTERNAL MODULE: external \"babel-helper-vue-jsx-merge-props\"\nvar external_babel_helper_vue_jsx_merge_props_ = __webpack_require__(26);\nvar external_babel_helper_vue_jsx_merge_props_default = /*#__PURE__*/__webpack_require__.n(external_babel_helper_vue_jsx_merge_props_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/scrollbar\"\nvar scrollbar_ = __webpack_require__(14);\nvar scrollbar_default = /*#__PURE__*/__webpack_require__.n(scrollbar_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/checkbox\"\nvar checkbox_ = __webpack_require__(18);\nvar checkbox_default = /*#__PURE__*/__webpack_require__.n(checkbox_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/radio\"\nvar radio_ = __webpack_require__(51);\nvar radio_default = /*#__PURE__*/__webpack_require__.n(radio_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/util\"\nvar util_ = __webpack_require__(3);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader-panel/src/cascader-node.vue?vue&type=script&lang=js&\n\n\n\n\n\n\nvar stopPropagation = function stopPropagation(e) {\n return e.stopPropagation();\n};\n\n/* harmony default export */ var cascader_nodevue_type_script_lang_js_ = ({\n inject: ['panel'],\n\n components: {\n ElCheckbox: checkbox_default.a,\n ElRadio: radio_default.a\n },\n\n props: {\n node: {\n required: true\n },\n nodeId: String\n },\n\n computed: {\n config: function config() {\n return this.panel.config;\n },\n isLeaf: function isLeaf() {\n return this.node.isLeaf;\n },\n isDisabled: function isDisabled() {\n return this.node.isDisabled;\n },\n checkedValue: function checkedValue() {\n return this.panel.checkedValue;\n },\n isChecked: function isChecked() {\n return this.node.isSameNode(this.checkedValue);\n },\n inActivePath: function inActivePath() {\n return this.isInPath(this.panel.activePath);\n },\n inCheckedPath: function inCheckedPath() {\n var _this = this;\n\n if (!this.config.checkStrictly) return false;\n\n return this.panel.checkedNodePaths.some(function (checkedPath) {\n return _this.isInPath(checkedPath);\n });\n },\n value: function value() {\n return this.node.getValueByOption();\n }\n },\n\n methods: {\n handleExpand: function handleExpand() {\n var _this2 = this;\n\n var panel = this.panel,\n node = this.node,\n isDisabled = this.isDisabled,\n config = this.config;\n var multiple = config.multiple,\n checkStrictly = config.checkStrictly;\n\n\n if (!checkStrictly && isDisabled || node.loading) return;\n\n if (config.lazy && !node.loaded) {\n panel.lazyLoad(node, function () {\n // do not use cached leaf value here, invoke this.isLeaf to get new value.\n var isLeaf = _this2.isLeaf;\n\n\n if (!isLeaf) _this2.handleExpand();\n if (multiple) {\n // if leaf sync checked state, else clear checked state\n var checked = isLeaf ? node.checked : false;\n _this2.handleMultiCheckChange(checked);\n }\n });\n } else {\n panel.handleExpand(node);\n }\n },\n handleCheckChange: function handleCheckChange() {\n var panel = this.panel,\n value = this.value,\n node = this.node;\n\n panel.handleCheckChange(value);\n panel.handleExpand(node);\n },\n handleMultiCheckChange: function handleMultiCheckChange(checked) {\n this.node.doCheck(checked);\n this.panel.calculateMultiCheckedValue();\n },\n isInPath: function isInPath(pathNodes) {\n var node = this.node;\n\n var selectedPathNode = pathNodes[node.level - 1] || {};\n return selectedPathNode.uid === node.uid;\n },\n renderPrefix: function renderPrefix(h) {\n var isLeaf = this.isLeaf,\n isChecked = this.isChecked,\n config = this.config;\n var checkStrictly = config.checkStrictly,\n multiple = config.multiple;\n\n\n if (multiple) {\n return this.renderCheckbox(h);\n } else if (checkStrictly) {\n return this.renderRadio(h);\n } else if (isLeaf && isChecked) {\n return this.renderCheckIcon(h);\n }\n\n return null;\n },\n renderPostfix: function renderPostfix(h) {\n var node = this.node,\n isLeaf = this.isLeaf;\n\n\n if (node.loading) {\n return this.renderLoadingIcon(h);\n } else if (!isLeaf) {\n return this.renderExpandIcon(h);\n }\n\n return null;\n },\n renderCheckbox: function renderCheckbox(h) {\n var node = this.node,\n config = this.config,\n isDisabled = this.isDisabled;\n\n var events = {\n on: { change: this.handleMultiCheckChange },\n nativeOn: {}\n };\n\n if (config.checkStrictly) {\n // when every node is selectable, click event should not trigger expand event.\n events.nativeOn.click = stopPropagation;\n }\n\n return h('el-checkbox', external_babel_helper_vue_jsx_merge_props_default()([{\n attrs: {\n value: node.checked,\n indeterminate: node.indeterminate,\n disabled: isDisabled\n }\n }, events]));\n },\n renderRadio: function renderRadio(h) {\n var checkedValue = this.checkedValue,\n value = this.value,\n isDisabled = this.isDisabled;\n\n // to keep same reference if value cause radio's checked state is calculated by reference comparision;\n\n if (Object(util_[\"isEqual\"])(value, checkedValue)) {\n value = checkedValue;\n }\n\n return h(\n 'el-radio',\n {\n attrs: {\n value: checkedValue,\n label: value,\n disabled: isDisabled\n },\n on: {\n 'change': this.handleCheckChange\n },\n nativeOn: {\n 'click': stopPropagation\n }\n },\n [h('span')]\n );\n },\n renderCheckIcon: function renderCheckIcon(h) {\n return h('i', { 'class': 'el-icon-check el-cascader-node__prefix' });\n },\n renderLoadingIcon: function renderLoadingIcon(h) {\n return h('i', { 'class': 'el-icon-loading el-cascader-node__postfix' });\n },\n renderExpandIcon: function renderExpandIcon(h) {\n return h('i', { 'class': 'el-icon-arrow-right el-cascader-node__postfix' });\n },\n renderContent: function renderContent(h) {\n var panel = this.panel,\n node = this.node;\n\n var render = panel.renderLabelFn;\n var vnode = render ? render({ node: node, data: node.data }) : null;\n\n return h(\n 'span',\n { 'class': 'el-cascader-node__label' },\n [vnode || node.label]\n );\n }\n },\n\n render: function render(h) {\n var _this3 = this;\n\n var inActivePath = this.inActivePath,\n inCheckedPath = this.inCheckedPath,\n isChecked = this.isChecked,\n isLeaf = this.isLeaf,\n isDisabled = this.isDisabled,\n config = this.config,\n nodeId = this.nodeId;\n var expandTrigger = config.expandTrigger,\n checkStrictly = config.checkStrictly,\n multiple = config.multiple;\n\n var disabled = !checkStrictly && isDisabled;\n var events = { on: {} };\n\n if (expandTrigger === 'click') {\n events.on.click = this.handleExpand;\n } else {\n events.on.mouseenter = function (e) {\n _this3.handleExpand();\n _this3.$emit('expand', e);\n };\n events.on.focus = function (e) {\n _this3.handleExpand();\n _this3.$emit('expand', e);\n };\n }\n if (isLeaf && !isDisabled && !checkStrictly && !multiple) {\n events.on.click = this.handleCheckChange;\n }\n\n return h(\n 'li',\n external_babel_helper_vue_jsx_merge_props_default()([{\n attrs: {\n role: 'menuitem',\n id: nodeId,\n 'aria-expanded': inActivePath,\n tabindex: disabled ? null : -1\n },\n 'class': {\n 'el-cascader-node': true,\n 'is-selectable': checkStrictly,\n 'in-active-path': inActivePath,\n 'in-checked-path': inCheckedPath,\n 'is-active': isChecked,\n 'is-disabled': disabled\n }\n }, events]),\n [this.renderPrefix(h), this.renderContent(h), this.renderPostfix(h)]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-node.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_cascader_nodevue_type_script_lang_js_ = (cascader_nodevue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-node.vue\nvar cascader_node_render, cascader_node_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer[\"a\" /* default */])(\n src_cascader_nodevue_type_script_lang_js_,\n cascader_node_render,\n cascader_node_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"packages/cascader-panel/src/cascader-node.vue\"\n/* harmony default export */ var cascader_node = (component.exports);\n// EXTERNAL MODULE: external \"element-ui/lib/mixins/locale\"\nvar locale_ = __webpack_require__(6);\nvar locale_default = /*#__PURE__*/__webpack_require__.n(locale_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader-panel/src/cascader-menu.vue?vue&type=script&lang=js&\n\n\n\n\n\n\n\n/* harmony default export */ var cascader_menuvue_type_script_lang_js_ = ({\n name: 'ElCascaderMenu',\n\n mixins: [locale_default.a],\n\n inject: ['panel'],\n\n components: {\n ElScrollbar: scrollbar_default.a,\n CascaderNode: cascader_node\n },\n\n props: {\n nodes: {\n type: Array,\n required: true\n },\n index: Number\n },\n\n data: function data() {\n return {\n activeNode: null,\n hoverTimer: null,\n id: Object(util_[\"generateId\"])()\n };\n },\n\n\n computed: {\n isEmpty: function isEmpty() {\n return !this.nodes.length;\n },\n menuId: function menuId() {\n return 'cascader-menu-' + this.id + '-' + this.index;\n }\n },\n\n methods: {\n handleExpand: function handleExpand(e) {\n this.activeNode = e.target;\n },\n handleMouseMove: function handleMouseMove(e) {\n var activeNode = this.activeNode,\n hoverTimer = this.hoverTimer;\n var hoverZone = this.$refs.hoverZone;\n\n\n if (!activeNode || !hoverZone) return;\n\n if (activeNode.contains(e.target)) {\n clearTimeout(hoverTimer);\n\n var _$el$getBoundingClien = this.$el.getBoundingClientRect(),\n left = _$el$getBoundingClien.left;\n\n var startX = e.clientX - left;\n var _$el = this.$el,\n offsetWidth = _$el.offsetWidth,\n offsetHeight = _$el.offsetHeight;\n\n var top = activeNode.offsetTop;\n var bottom = top + activeNode.offsetHeight;\n\n hoverZone.innerHTML = '\\n
\\n
\\n ';\n } else if (!hoverTimer) {\n this.hoverTimer = setTimeout(this.clearHoverZone, this.panel.config.hoverThreshold);\n }\n },\n clearHoverZone: function clearHoverZone() {\n var hoverZone = this.$refs.hoverZone;\n\n if (!hoverZone) return;\n hoverZone.innerHTML = '';\n },\n renderEmptyText: function renderEmptyText(h) {\n return h(\n 'div',\n { 'class': 'el-cascader-menu__empty-text' },\n [this.t('el.cascader.noData')]\n );\n },\n renderNodeList: function renderNodeList(h) {\n var menuId = this.menuId;\n var isHoverMenu = this.panel.isHoverMenu;\n\n var events = { on: {} };\n\n if (isHoverMenu) {\n events.on.expand = this.handleExpand;\n }\n\n var nodes = this.nodes.map(function (node, index) {\n var hasChildren = node.hasChildren;\n\n return h('cascader-node', external_babel_helper_vue_jsx_merge_props_default()([{\n key: node.uid,\n attrs: { node: node,\n 'node-id': menuId + '-' + index,\n 'aria-haspopup': hasChildren,\n 'aria-owns': hasChildren ? menuId : null\n }\n }, events]));\n });\n\n return [].concat(nodes, [isHoverMenu ? h('svg', { ref: 'hoverZone', 'class': 'el-cascader-menu__hover-zone' }) : null]);\n }\n },\n\n render: function render(h) {\n var isEmpty = this.isEmpty,\n menuId = this.menuId;\n\n var events = { nativeOn: {} };\n\n // optimize hover to expand experience (#8010)\n if (this.panel.isHoverMenu) {\n events.nativeOn.mousemove = this.handleMouseMove;\n // events.nativeOn.mouseleave = this.clearHoverZone;\n }\n\n return h(\n 'el-scrollbar',\n external_babel_helper_vue_jsx_merge_props_default()([{\n attrs: {\n tag: 'ul',\n role: 'menu',\n id: menuId,\n\n 'wrap-class': 'el-cascader-menu__wrap',\n 'view-class': {\n 'el-cascader-menu__list': true,\n 'is-empty': isEmpty\n }\n },\n 'class': 'el-cascader-menu' }, events]),\n [isEmpty ? this.renderEmptyText(h) : this.renderNodeList(h)]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-menu.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_cascader_menuvue_type_script_lang_js_ = (cascader_menuvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-menu.vue\nvar cascader_menu_render, cascader_menu_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar cascader_menu_component = Object(componentNormalizer[\"a\" /* default */])(\n src_cascader_menuvue_type_script_lang_js_,\n cascader_menu_render,\n cascader_menu_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var cascader_menu_api; }\ncascader_menu_component.options.__file = \"packages/cascader-panel/src/cascader-menu.vue\"\n/* harmony default export */ var cascader_menu = (cascader_menu_component.exports);\n// EXTERNAL MODULE: external \"element-ui/lib/utils/shared\"\nvar shared_ = __webpack_require__(21);\n\n// CONCATENATED MODULE: ./packages/cascader-panel/src/node.js\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\nvar uid = 0;\n\nvar node_Node = function () {\n function Node(data, config, parentNode) {\n _classCallCheck(this, Node);\n\n this.data = data;\n this.config = config;\n this.parent = parentNode || null;\n this.level = !this.parent ? 1 : this.parent.level + 1;\n this.uid = uid++;\n\n this.initState();\n this.initChildren();\n }\n\n Node.prototype.initState = function initState() {\n var _config = this.config,\n valueKey = _config.value,\n labelKey = _config.label;\n\n\n this.value = this.data[valueKey];\n this.label = this.data[labelKey];\n this.pathNodes = this.calculatePathNodes();\n this.path = this.pathNodes.map(function (node) {\n return node.value;\n });\n this.pathLabels = this.pathNodes.map(function (node) {\n return node.label;\n });\n\n // lazy load\n this.loading = false;\n this.loaded = false;\n };\n\n Node.prototype.initChildren = function initChildren() {\n var _this = this;\n\n var config = this.config;\n\n var childrenKey = config.children;\n var childrenData = this.data[childrenKey];\n this.hasChildren = Array.isArray(childrenData);\n this.children = (childrenData || []).map(function (child) {\n return new Node(child, config, _this);\n });\n };\n\n Node.prototype.calculatePathNodes = function calculatePathNodes() {\n var nodes = [this];\n var parent = this.parent;\n\n while (parent) {\n nodes.unshift(parent);\n parent = parent.parent;\n }\n\n return nodes;\n };\n\n Node.prototype.getPath = function getPath() {\n return this.path;\n };\n\n Node.prototype.getValue = function getValue() {\n return this.value;\n };\n\n Node.prototype.getValueByOption = function getValueByOption() {\n return this.config.emitPath ? this.getPath() : this.getValue();\n };\n\n Node.prototype.getText = function getText(allLevels, separator) {\n return allLevels ? this.pathLabels.join(separator) : this.label;\n };\n\n Node.prototype.isSameNode = function isSameNode(checkedValue) {\n var value = this.getValueByOption();\n return this.config.multiple && Array.isArray(checkedValue) ? checkedValue.some(function (val) {\n return Object(util_[\"isEqual\"])(val, value);\n }) : Object(util_[\"isEqual\"])(checkedValue, value);\n };\n\n Node.prototype.broadcast = function broadcast(event) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var handlerName = 'onParent' + Object(util_[\"capitalize\"])(event);\n\n this.children.forEach(function (child) {\n if (child) {\n // bottom up\n child.broadcast.apply(child, [event].concat(args));\n child[handlerName] && child[handlerName].apply(child, args);\n }\n });\n };\n\n Node.prototype.emit = function emit(event) {\n var parent = this.parent;\n\n var handlerName = 'onChild' + Object(util_[\"capitalize\"])(event);\n if (parent) {\n for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n parent[handlerName] && parent[handlerName].apply(parent, args);\n parent.emit.apply(parent, [event].concat(args));\n }\n };\n\n Node.prototype.onParentCheck = function onParentCheck(checked) {\n if (!this.isDisabled) {\n this.setCheckState(checked);\n }\n };\n\n Node.prototype.onChildCheck = function onChildCheck() {\n var children = this.children;\n\n var validChildren = children.filter(function (child) {\n return !child.isDisabled;\n });\n var checked = validChildren.length ? validChildren.every(function (child) {\n return child.checked;\n }) : false;\n\n this.setCheckState(checked);\n };\n\n Node.prototype.setCheckState = function setCheckState(checked) {\n var totalNum = this.children.length;\n var checkedNum = this.children.reduce(function (c, p) {\n var num = p.checked ? 1 : p.indeterminate ? 0.5 : 0;\n return c + num;\n }, 0);\n\n this.checked = checked;\n this.indeterminate = checkedNum !== totalNum && checkedNum > 0;\n };\n\n Node.prototype.syncCheckState = function syncCheckState(checkedValue) {\n var value = this.getValueByOption();\n var checked = this.isSameNode(checkedValue, value);\n\n this.doCheck(checked);\n };\n\n Node.prototype.doCheck = function doCheck(checked) {\n if (this.checked !== checked) {\n if (this.config.checkStrictly) {\n this.checked = checked;\n } else {\n // bottom up to unify the calculation of the indeterminate state\n this.broadcast('check', checked);\n this.setCheckState(checked);\n this.emit('check');\n }\n }\n };\n\n _createClass(Node, [{\n key: 'isDisabled',\n get: function get() {\n var data = this.data,\n parent = this.parent,\n config = this.config;\n\n var disabledKey = config.disabled;\n var checkStrictly = config.checkStrictly;\n\n return data[disabledKey] || !checkStrictly && parent && parent.isDisabled;\n }\n }, {\n key: 'isLeaf',\n get: function get() {\n var data = this.data,\n loaded = this.loaded,\n hasChildren = this.hasChildren,\n children = this.children;\n var _config2 = this.config,\n lazy = _config2.lazy,\n leafKey = _config2.leaf;\n\n if (lazy) {\n var isLeaf = Object(shared_[\"isDef\"])(data[leafKey]) ? data[leafKey] : loaded ? !children.length : false;\n this.hasChildren = !isLeaf;\n return isLeaf;\n }\n return !hasChildren;\n }\n }]);\n\n return Node;\n}();\n\n/* harmony default export */ var src_node = (node_Node);\n// CONCATENATED MODULE: ./packages/cascader-panel/src/store.js\nfunction store_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\nvar flatNodes = function flatNodes(data, leafOnly) {\n return data.reduce(function (res, node) {\n if (node.isLeaf) {\n res.push(node);\n } else {\n !leafOnly && res.push(node);\n res = res.concat(flatNodes(node.children, leafOnly));\n }\n return res;\n }, []);\n};\n\nvar store_Store = function () {\n function Store(data, config) {\n store_classCallCheck(this, Store);\n\n this.config = config;\n this.initNodes(data);\n }\n\n Store.prototype.initNodes = function initNodes(data) {\n var _this = this;\n\n data = Object(util_[\"coerceTruthyValueToArray\"])(data);\n this.nodes = data.map(function (nodeData) {\n return new src_node(nodeData, _this.config);\n });\n this.flattedNodes = this.getFlattedNodes(false, false);\n this.leafNodes = this.getFlattedNodes(true, false);\n };\n\n Store.prototype.appendNode = function appendNode(nodeData, parentNode) {\n var node = new src_node(nodeData, this.config, parentNode);\n var children = parentNode ? parentNode.children : this.nodes;\n\n children.push(node);\n };\n\n Store.prototype.appendNodes = function appendNodes(nodeDataList, parentNode) {\n var _this2 = this;\n\n nodeDataList = Object(util_[\"coerceTruthyValueToArray\"])(nodeDataList);\n nodeDataList.forEach(function (nodeData) {\n return _this2.appendNode(nodeData, parentNode);\n });\n };\n\n Store.prototype.getNodes = function getNodes() {\n return this.nodes;\n };\n\n Store.prototype.getFlattedNodes = function getFlattedNodes(leafOnly) {\n var cached = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n var cachedNodes = leafOnly ? this.leafNodes : this.flattedNodes;\n return cached ? cachedNodes : flatNodes(this.nodes, leafOnly);\n };\n\n Store.prototype.getNodeByValue = function getNodeByValue(value) {\n if (value) {\n var nodes = this.getFlattedNodes(false, !this.config.lazy).filter(function (node) {\n return Object(util_[\"valueEquals\"])(node.path, value) || node.value === value;\n });\n return nodes && nodes.length ? nodes[0] : null;\n }\n return null;\n };\n\n return Store;\n}();\n\n/* harmony default export */ var src_store = (store_Store);\n// EXTERNAL MODULE: external \"element-ui/lib/utils/merge\"\nvar merge_ = __webpack_require__(9);\nvar merge_default = /*#__PURE__*/__webpack_require__.n(merge_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/aria-utils\"\nvar aria_utils_ = __webpack_require__(32);\nvar aria_utils_default = /*#__PURE__*/__webpack_require__.n(aria_utils_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/scroll-into-view\"\nvar scroll_into_view_ = __webpack_require__(31);\nvar scroll_into_view_default = /*#__PURE__*/__webpack_require__.n(scroll_into_view_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader-panel/src/cascader-panel.vue?vue&type=script&lang=js&\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\nvar KeyCode = aria_utils_default.a.keys;\n\nvar DefaultProps = {\n expandTrigger: 'click', // or hover\n multiple: false,\n checkStrictly: false, // whether all nodes can be selected\n emitPath: true, // wether to emit an array of all levels value in which node is located\n lazy: false,\n lazyLoad: util_[\"noop\"],\n value: 'value',\n label: 'label',\n children: 'children',\n leaf: 'leaf',\n disabled: 'disabled',\n hoverThreshold: 500\n};\n\nvar cascader_panelvue_type_script_lang_js_isLeaf = function isLeaf(el) {\n return !el.getAttribute('aria-owns');\n};\n\nvar getSibling = function getSibling(el, distance) {\n var parentNode = el.parentNode;\n\n if (parentNode) {\n var siblings = parentNode.querySelectorAll('.el-cascader-node[tabindex=\"-1\"]');\n var index = Array.prototype.indexOf.call(siblings, el);\n return siblings[index + distance] || null;\n }\n return null;\n};\n\nvar getMenuIndex = function getMenuIndex(el, distance) {\n if (!el) return;\n var pieces = el.id.split('-');\n return Number(pieces[pieces.length - 2]);\n};\n\nvar focusNode = function focusNode(el) {\n if (!el) return;\n el.focus();\n !cascader_panelvue_type_script_lang_js_isLeaf(el) && el.click();\n};\n\nvar checkNode = function checkNode(el) {\n if (!el) return;\n\n var input = el.querySelector('input');\n if (input) {\n input.click();\n } else if (cascader_panelvue_type_script_lang_js_isLeaf(el)) {\n el.click();\n }\n};\n\n/* harmony default export */ var cascader_panelvue_type_script_lang_js_ = ({\n name: 'ElCascaderPanel',\n\n components: {\n CascaderMenu: cascader_menu\n },\n\n props: {\n value: {},\n options: Array,\n props: Object,\n border: {\n type: Boolean,\n default: true\n },\n renderLabel: Function\n },\n\n provide: function provide() {\n return {\n panel: this\n };\n },\n data: function data() {\n return {\n checkedValue: null,\n checkedNodePaths: [],\n store: [],\n menus: [],\n activePath: [],\n loadCount: 0\n };\n },\n\n\n computed: {\n config: function config() {\n return merge_default()(_extends({}, DefaultProps), this.props || {});\n },\n multiple: function multiple() {\n return this.config.multiple;\n },\n checkStrictly: function checkStrictly() {\n return this.config.checkStrictly;\n },\n leafOnly: function leafOnly() {\n return !this.checkStrictly;\n },\n isHoverMenu: function isHoverMenu() {\n return this.config.expandTrigger === 'hover';\n },\n renderLabelFn: function renderLabelFn() {\n return this.renderLabel || this.$scopedSlots.default;\n }\n },\n\n watch: {\n options: {\n handler: function handler() {\n this.initStore();\n },\n immediate: true,\n deep: true\n },\n value: function value() {\n this.syncCheckedValue();\n this.checkStrictly && this.calculateCheckedNodePaths();\n },\n checkedValue: function checkedValue(val) {\n if (!Object(util_[\"isEqual\"])(val, this.value)) {\n this.checkStrictly && this.calculateCheckedNodePaths();\n this.$emit('input', val);\n this.$emit('change', val);\n }\n }\n },\n\n mounted: function mounted() {\n if (!Object(util_[\"isEmpty\"])(this.value)) {\n this.syncCheckedValue();\n }\n },\n\n\n methods: {\n initStore: function initStore() {\n var config = this.config,\n options = this.options;\n\n if (config.lazy && Object(util_[\"isEmpty\"])(options)) {\n this.lazyLoad();\n } else {\n this.store = new src_store(options, config);\n this.menus = [this.store.getNodes()];\n this.syncMenuState();\n }\n },\n syncCheckedValue: function syncCheckedValue() {\n var value = this.value,\n checkedValue = this.checkedValue;\n\n if (!Object(util_[\"isEqual\"])(value, checkedValue)) {\n this.checkedValue = value;\n this.syncMenuState();\n }\n },\n syncMenuState: function syncMenuState() {\n var multiple = this.multiple,\n checkStrictly = this.checkStrictly;\n\n this.syncActivePath();\n multiple && this.syncMultiCheckState();\n checkStrictly && this.calculateCheckedNodePaths();\n this.$nextTick(this.scrollIntoView);\n },\n syncMultiCheckState: function syncMultiCheckState() {\n var _this = this;\n\n var nodes = this.getFlattedNodes(this.leafOnly);\n\n nodes.forEach(function (node) {\n node.syncCheckState(_this.checkedValue);\n });\n },\n syncActivePath: function syncActivePath() {\n var _this2 = this;\n\n var store = this.store,\n multiple = this.multiple,\n activePath = this.activePath,\n checkedValue = this.checkedValue;\n\n\n if (!Object(util_[\"isEmpty\"])(activePath)) {\n var nodes = activePath.map(function (node) {\n return _this2.getNodeByValue(node.getValue());\n });\n this.expandNodes(nodes);\n } else if (!Object(util_[\"isEmpty\"])(checkedValue)) {\n var value = multiple ? checkedValue[0] : checkedValue;\n var checkedNode = this.getNodeByValue(value) || {};\n var _nodes = (checkedNode.pathNodes || []).slice(0, -1);\n this.expandNodes(_nodes);\n } else {\n this.activePath = [];\n this.menus = [store.getNodes()];\n }\n },\n expandNodes: function expandNodes(nodes) {\n var _this3 = this;\n\n nodes.forEach(function (node) {\n return _this3.handleExpand(node, true /* silent */);\n });\n },\n calculateCheckedNodePaths: function calculateCheckedNodePaths() {\n var _this4 = this;\n\n var checkedValue = this.checkedValue,\n multiple = this.multiple;\n\n var checkedValues = multiple ? Object(util_[\"coerceTruthyValueToArray\"])(checkedValue) : [checkedValue];\n this.checkedNodePaths = checkedValues.map(function (v) {\n var checkedNode = _this4.getNodeByValue(v);\n return checkedNode ? checkedNode.pathNodes : [];\n });\n },\n handleKeyDown: function handleKeyDown(e) {\n var target = e.target,\n keyCode = e.keyCode;\n\n\n switch (keyCode) {\n case KeyCode.up:\n var prev = getSibling(target, -1);\n focusNode(prev);\n break;\n case KeyCode.down:\n var next = getSibling(target, 1);\n focusNode(next);\n break;\n case KeyCode.left:\n var preMenu = this.$refs.menu[getMenuIndex(target) - 1];\n if (preMenu) {\n var expandedNode = preMenu.$el.querySelector('.el-cascader-node[aria-expanded=\"true\"]');\n focusNode(expandedNode);\n }\n break;\n case KeyCode.right:\n var nextMenu = this.$refs.menu[getMenuIndex(target) + 1];\n if (nextMenu) {\n var firstNode = nextMenu.$el.querySelector('.el-cascader-node[tabindex=\"-1\"]');\n focusNode(firstNode);\n }\n break;\n case KeyCode.enter:\n checkNode(target);\n break;\n case KeyCode.esc:\n case KeyCode.tab:\n this.$emit('close');\n break;\n default:\n return;\n }\n },\n handleExpand: function handleExpand(node, silent) {\n var activePath = this.activePath;\n var level = node.level;\n\n var path = activePath.slice(0, level - 1);\n var menus = this.menus.slice(0, level);\n\n if (!node.isLeaf) {\n path.push(node);\n menus.push(node.children);\n }\n\n this.activePath = path;\n this.menus = menus;\n\n if (!silent) {\n var pathValues = path.map(function (node) {\n return node.getValue();\n });\n var activePathValues = activePath.map(function (node) {\n return node.getValue();\n });\n if (!Object(util_[\"valueEquals\"])(pathValues, activePathValues)) {\n this.$emit('active-item-change', pathValues); // Deprecated\n this.$emit('expand-change', pathValues);\n }\n }\n },\n handleCheckChange: function handleCheckChange(value) {\n this.checkedValue = value;\n },\n lazyLoad: function lazyLoad(node, onFullfiled) {\n var _this5 = this;\n\n var config = this.config;\n\n if (!node) {\n node = node || { root: true, level: 0 };\n this.store = new src_store([], config);\n this.menus = [this.store.getNodes()];\n }\n node.loading = true;\n var resolve = function resolve(dataList) {\n var parent = node.root ? null : node;\n dataList && dataList.length && _this5.store.appendNodes(dataList, parent);\n node.loading = false;\n node.loaded = true;\n\n // dispose default value on lazy load mode\n if (Array.isArray(_this5.checkedValue)) {\n var nodeValue = _this5.checkedValue[_this5.loadCount++];\n var valueKey = _this5.config.value;\n var leafKey = _this5.config.leaf;\n\n if (Array.isArray(dataList) && dataList.filter(function (item) {\n return item[valueKey] === nodeValue;\n }).length > 0) {\n var checkedNode = _this5.store.getNodeByValue(nodeValue);\n\n if (!checkedNode.data[leafKey]) {\n _this5.lazyLoad(checkedNode, function () {\n _this5.handleExpand(checkedNode);\n });\n }\n\n if (_this5.loadCount === _this5.checkedValue.length) {\n _this5.$parent.computePresentText();\n }\n }\n }\n\n onFullfiled && onFullfiled(dataList);\n };\n config.lazyLoad(node, resolve);\n },\n\n\n /**\n * public methods\n */\n calculateMultiCheckedValue: function calculateMultiCheckedValue() {\n this.checkedValue = this.getCheckedNodes(this.leafOnly).map(function (node) {\n return node.getValueByOption();\n });\n },\n scrollIntoView: function scrollIntoView() {\n if (this.$isServer) return;\n\n var menus = this.$refs.menu || [];\n menus.forEach(function (menu) {\n var menuElement = menu.$el;\n if (menuElement) {\n var container = menuElement.querySelector('.el-scrollbar__wrap');\n var activeNode = menuElement.querySelector('.el-cascader-node.is-active') || menuElement.querySelector('.el-cascader-node.in-active-path');\n scroll_into_view_default()(container, activeNode);\n }\n });\n },\n getNodeByValue: function getNodeByValue(val) {\n return this.store.getNodeByValue(val);\n },\n getFlattedNodes: function getFlattedNodes(leafOnly) {\n var cached = !this.config.lazy;\n return this.store.getFlattedNodes(leafOnly, cached);\n },\n getCheckedNodes: function getCheckedNodes(leafOnly) {\n var checkedValue = this.checkedValue,\n multiple = this.multiple;\n\n if (multiple) {\n var nodes = this.getFlattedNodes(leafOnly);\n return nodes.filter(function (node) {\n return node.checked;\n });\n } else {\n return Object(util_[\"isEmpty\"])(checkedValue) ? [] : [this.getNodeByValue(checkedValue)];\n }\n },\n clearCheckedNodes: function clearCheckedNodes() {\n var config = this.config,\n leafOnly = this.leafOnly;\n var multiple = config.multiple,\n emitPath = config.emitPath;\n\n if (multiple) {\n this.getCheckedNodes(leafOnly).filter(function (node) {\n return !node.isDisabled;\n }).forEach(function (node) {\n return node.doCheck(false);\n });\n this.calculateMultiCheckedValue();\n } else {\n this.checkedValue = emitPath ? [] : null;\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-panel.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_cascader_panelvue_type_script_lang_js_ = (cascader_panelvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-panel.vue\n\n\n\n\n\n/* normalize component */\n\nvar cascader_panel_component = Object(componentNormalizer[\"a\" /* default */])(\n src_cascader_panelvue_type_script_lang_js_,\n cascader_panelvue_type_template_id_34932346_render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var cascader_panel_api; }\ncascader_panel_component.options.__file = \"packages/cascader-panel/src/cascader-panel.vue\"\n/* harmony default export */ var cascader_panel = (cascader_panel_component.exports);\n// CONCATENATED MODULE: ./packages/cascader-panel/index.js\n\n\n/* istanbul ignore next */\ncascader_panel.install = function (Vue) {\n Vue.component(cascader_panel.name, cascader_panel);\n};\n\n/* harmony default export */ var packages_cascader_panel = __webpack_exports__[\"default\"] = (cascader_panel);\n\n/***/ }),\n\n/***/ 6:\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"element-ui/lib/mixins/locale\");\n\n/***/ }),\n\n/***/ 9:\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"element-ui/lib/utils/merge\");\n\n/***/ })\n\n/******/ });","var anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n","/**\n * lodash (Custom Build)
\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors
\n * Released under MIT license
\n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used to compose bitmasks for comparison styles. */\nvar UNORDERED_COMPARE_FLAG = 1,\n PARTIAL_COMPARE_FLAG = 2;\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n reLeadingDot = /^\\./,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n return freeProcess && freeProcess.binding('util');\n } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array ? array.length : 0;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\n/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array ? array.length : 0;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\nfunction baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol,\n Uint8Array = root.Uint8Array,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView'),\n Map = getNative(root, 'Map'),\n Promise = getNative(root, 'Promise'),\n Set = getNative(root, 'Set'),\n WeakMap = getNative(root, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values ? values.length : 0;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n this.__data__ = new ListCache(entries);\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n return this.__data__['delete'](key);\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var cache = this.__data__;\n if (cache instanceof ListCache) {\n var pairs = cache.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n return this;\n }\n cache = this.__data__ = new MapCache(pairs);\n }\n cache.set(key, value);\n return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n // Safari 9 makes `arguments.length` enumerable in strict mode.\n var result = (isArray(value) || isArguments(value))\n ? baseTimes(value.length, String)\n : [];\n\n var length = result.length,\n skipIndexes = !!length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = isKey(path, object) ? [path] : castPath(path);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\n/**\n * The base implementation of `getTag`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n return objectToString.call(value);\n}\n\n/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {boolean} [bitmask] The bitmask of comparison flags.\n * The bitmask may be composed of the following flags:\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, customizer, bitmask, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack);\n}\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = arrayTag,\n othTag = arrayTag;\n\n if (!objIsArr) {\n objTag = getTag(object);\n objTag = objTag == argsTag ? objectTag : objTag;\n }\n if (!othIsArr) {\n othTag = getTag(other);\n othTag = othTag == argsTag ? objectTag : othTag;\n }\n var objIsObj = objTag == objectTag && !isHostObject(object),\n othIsObj = othTag == objectTag && !isHostObject(other),\n isSameTag = objTag == othTag;\n\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, equalFunc, customizer, bitmask, stack)\n : equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack);\n }\n if (!(bitmask & PARTIAL_COMPARE_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, equalFunc, customizer, bitmask, stack);\n}\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[objectToString.call(value)];\n}\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG);\n };\n}\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value) {\n return isArray(value) ? value : stringToPath(value);\n}\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\n/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, equalFunc, customizer, bitmask, stack) {\n var isPartial = bitmask & PARTIAL_COMPARE_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!seen.has(othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) {\n return seen.add(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, customizer, bitmask, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & PARTIAL_COMPARE_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= UNORDERED_COMPARE_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, equalFunc, customizer, bitmask, stack) {\n var isPartial = bitmask & PARTIAL_COMPARE_FLAG,\n objProps = keys(object),\n objLength = objProps.length,\n othProps = keys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11,\n// for data views in Edge < 14, and promises in Node.js.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = objectToString.call(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : undefined;\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = isKey(path, object) ? [path] : castPath(path);\n\n var result,\n index = -1,\n length = path.length;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result) {\n return result;\n }\n var length = object ? object.length : 0;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\n/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoize(function(string) {\n string = toString(string);\n\n var result = [];\n if (reLeadingDot.test(string)) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\nfunction reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n}\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result);\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Assign cache to `_.memoize`.\nmemoize.Cache = MapCache;\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = reduce;\n","'use strict';\n\nexports.__esModule = true;\nexports.i18n = exports.use = exports.t = undefined;\n\nvar _zhCN = require('element-ui/lib/locale/lang/zh-CN');\n\nvar _zhCN2 = _interopRequireDefault(_zhCN);\n\nvar _vue = require('vue');\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nvar _deepmerge = require('deepmerge');\n\nvar _deepmerge2 = _interopRequireDefault(_deepmerge);\n\nvar _format = require('./format');\n\nvar _format2 = _interopRequireDefault(_format);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar format = (0, _format2.default)(_vue2.default);\nvar lang = _zhCN2.default;\nvar merged = false;\nvar i18nHandler = function i18nHandler() {\n var vuei18n = Object.getPrototypeOf(this || _vue2.default).$t;\n if (typeof vuei18n === 'function' && !!_vue2.default.locale) {\n if (!merged) {\n merged = true;\n _vue2.default.locale(_vue2.default.config.lang, (0, _deepmerge2.default)(lang, _vue2.default.locale(_vue2.default.config.lang) || {}, { clone: true }));\n }\n return vuei18n.apply(this, arguments);\n }\n};\n\nvar t = exports.t = function t(path, options) {\n var value = i18nHandler.apply(this, arguments);\n if (value !== null && value !== undefined) return value;\n\n var array = path.split('.');\n var current = lang;\n\n for (var i = 0, j = array.length; i < j; i++) {\n var property = array[i];\n value = current[property];\n if (i === j - 1) return format(value, options);\n if (!value) return '';\n current = value;\n }\n return '';\n};\n\nvar use = exports.use = function use(l) {\n lang = l || lang;\n};\n\nvar i18n = exports.i18n = function i18n(fn) {\n i18nHandler = fn || i18nHandler;\n};\n\nexports.default = { use: use, t: t, i18n: i18n };","'use strict';\n\nvar utils = require('./utils');\n\nmodule.exports = function makeJuiceClient(juiceClient) {\n\njuiceClient.ignoredPseudos = ['hover', 'active', 'focus', 'visited', 'link'];\njuiceClient.widthElements = ['TABLE', 'TD', 'TH', 'IMG'];\njuiceClient.heightElements = ['TABLE', 'TD', 'TH', 'IMG'];\njuiceClient.tableElements = ['TABLE', 'TH', 'TR', 'TD', 'CAPTION', 'COLGROUP', 'COL', 'THEAD', 'TBODY', 'TFOOT'];\njuiceClient.nonVisualElements = [ 'HEAD', 'TITLE', 'BASE', 'LINK', 'STYLE', 'META', 'SCRIPT', 'NOSCRIPT' ];\njuiceClient.styleToAttribute = {\n 'background-color': 'bgcolor',\n 'background-image': 'background',\n 'text-align': 'align',\n 'vertical-align': 'valign'\n};\njuiceClient.excludedProperties = [];\n\njuiceClient.juiceDocument = juiceDocument;\njuiceClient.inlineDocument = inlineDocument;\n\nfunction inlineDocument($, css, options) {\n\n options = options || {};\n var rules = utils.parseCSS(css);\n var editedElements = [];\n var styleAttributeName = 'style';\n\n if (options.styleAttributeName) {\n styleAttributeName = options.styleAttributeName;\n }\n\n rules.forEach(handleRule);\n editedElements.forEach(setStyleAttrs);\n\n if (options.inlinePseudoElements) {\n editedElements.forEach(inlinePseudoElements);\n }\n\n if (options.applyWidthAttributes) {\n editedElements.forEach(function(el) {\n setDimensionAttrs(el, 'width');\n });\n }\n\n if (options.applyHeightAttributes) {\n editedElements.forEach(function(el) {\n setDimensionAttrs(el, 'height');\n });\n }\n\n if (options.applyAttributesTableElements) {\n editedElements.forEach(setAttributesOnTableElements);\n }\n\n if (options.insertPreservedExtraCss && options.extraCss) {\n var preservedText = utils.getPreservedText(options.extraCss, {\n mediaQueries: options.preserveMediaQueries,\n fontFaces: options.preserveFontFaces,\n keyFrames: options.preserveKeyFrames\n });\n if (preservedText) {\n var $appendTo = null;\n if (options.insertPreservedExtraCss !== true) {\n $appendTo = $(options.insertPreservedExtraCss);\n } else {\n $appendTo = $('head');\n if (!$appendTo.length) { $appendTo = $('body'); }\n if (!$appendTo.length) { $appendTo = $.root(); }\n }\n\n $appendTo.first().append('');\n }\n }\n\n function handleRule(rule) {\n var sel = rule[0];\n var style = rule[1];\n var selector = new utils.Selector(sel);\n var parsedSelector = selector.parsed();\n var pseudoElementType = getPseudoElementType(parsedSelector);\n\n // skip rule if the selector has any pseudos which are ignored\n for (var i = 0; i < parsedSelector.length; ++i) {\n var subSel = parsedSelector[i];\n if (subSel.pseudos) {\n for (var j = 0; j < subSel.pseudos.length; ++j) {\n var subSelPseudo = subSel.pseudos[j];\n if (juiceClient.ignoredPseudos.indexOf(subSelPseudo.name) >= 0) {\n return;\n }\n }\n }\n }\n\n if (pseudoElementType) {\n var last = parsedSelector[parsedSelector.length - 1];\n var pseudos = last.pseudos;\n last.pseudos = filterElementPseudos(last.pseudos);\n sel = parsedSelector.toString();\n last.pseudos = pseudos;\n }\n\n var els;\n try {\n els = $(sel);\n } catch (err) {\n // skip invalid selector\n return;\n }\n\n els.each(function() {\n var el = this;\n\n if (el.name && juiceClient.nonVisualElements.indexOf(el.name.toUpperCase()) >= 0) {\n return;\n }\n\n if (pseudoElementType) {\n var pseudoElPropName = 'pseudo' + pseudoElementType;\n var pseudoEl = el[pseudoElPropName];\n if (!pseudoEl) {\n pseudoEl = el[pseudoElPropName] = $('').get(0);\n pseudoEl.pseudoElementType = pseudoElementType;\n pseudoEl.pseudoElementParent = el;\n el[pseudoElPropName] = pseudoEl;\n }\n el = pseudoEl;\n }\n\n if (!el.styleProps) {\n el.styleProps = {};\n\n // if the element has inline styles, fake selector with topmost specificity\n if ($(el).attr(styleAttributeName)) {\n var cssText = '* { ' + $(el).attr(styleAttributeName) + ' } ';\n addProps(utils.parseCSS(cssText)[0][1], new utils.Selector('