2018-06-19 20:55:12 +00:00
|
|
|
package visitor_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"os"
|
|
|
|
|
|
|
|
"github.com/z7zmey/php-parser/php7"
|
|
|
|
"github.com/z7zmey/php-parser/visitor"
|
|
|
|
)
|
|
|
|
|
|
|
|
func ExamplePrettyJsonDumper() {
|
|
|
|
src := `<?php
|
|
|
|
|
|
|
|
namespace Foo {
|
|
|
|
class Bar {
|
|
|
|
public function FunctionName(Type $var = null)
|
|
|
|
{
|
|
|
|
// some comment
|
|
|
|
// second comment
|
|
|
|
$var;
|
|
|
|
}
|
|
|
|
}
|
2018-06-29 21:51:11 +00:00
|
|
|
|
2018-07-29 08:44:38 +00:00
|
|
|
function foo() {
|
|
|
|
;
|
|
|
|
}
|
2018-06-29 21:51:11 +00:00
|
|
|
}
|
|
|
|
`
|
2018-06-19 20:55:12 +00:00
|
|
|
|
|
|
|
php7parser := php7.NewParser(bytes.NewBufferString(src), "test.php")
|
2018-06-29 21:51:11 +00:00
|
|
|
php7parser.WithMeta()
|
2018-06-19 20:55:12 +00:00
|
|
|
php7parser.Parse()
|
|
|
|
nodes := php7parser.GetRootNode()
|
|
|
|
|
|
|
|
nsResolver := visitor.NewNamespaceResolver()
|
|
|
|
nodes.Walk(nsResolver)
|
|
|
|
|
2018-06-29 21:51:11 +00:00
|
|
|
dumper := visitor.NewPrettyJsonDumper(os.Stdout, nsResolver)
|
2018-06-19 20:55:12 +00:00
|
|
|
nodes.Walk(dumper)
|
|
|
|
|
|
|
|
// Unordered output:
|
|
|
|
// {
|
|
|
|
// "type": "*node.Root",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 10,
|
2018-07-29 08:44:38 +00:00
|
|
|
// "endPos": 198,
|
2018-06-19 20:55:12 +00:00
|
|
|
// "startLine": 3,
|
2018-07-29 08:44:38 +00:00
|
|
|
// "endLine": 16
|
2018-06-19 20:55:12 +00:00
|
|
|
// },
|
2018-07-02 17:48:55 +00:00
|
|
|
// "meta": [
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-07-02 17:48:55 +00:00
|
|
|
// "value": "\n\t\t",
|
|
|
|
// "tokenName": "NodeEnd"
|
|
|
|
// }
|
|
|
|
// ],
|
2018-06-19 20:55:12 +00:00
|
|
|
// "Stmts": [
|
|
|
|
// {
|
|
|
|
// "type": "*stmt.Namespace",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 10,
|
2018-07-29 08:44:38 +00:00
|
|
|
// "endPos": 198,
|
2018-06-19 20:55:12 +00:00
|
|
|
// "startLine": 3,
|
2018-07-29 08:44:38 +00:00
|
|
|
// "endLine": 16
|
2018-06-19 20:55:12 +00:00
|
|
|
// },
|
2018-06-29 21:51:11 +00:00
|
|
|
// "meta": [
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.TokenType",
|
|
|
|
// "value": "<?php",
|
|
|
|
// "tokenName": "NamespaceToken"
|
|
|
|
// },
|
|
|
|
// {
|
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": "\n\n\t\t",
|
|
|
|
// "tokenName": "NamespaceToken"
|
|
|
|
// },
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": " ",
|
|
|
|
// "tokenName": "OpenCurlyBracesToken"
|
|
|
|
// },
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": "\n\t\t",
|
|
|
|
// "tokenName": "CloseCurlyBracesToken"
|
|
|
|
// }
|
|
|
|
// ],
|
2018-06-19 20:55:12 +00:00
|
|
|
// "NamespaceName": {
|
|
|
|
// "type": "*name.Name",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 20,
|
|
|
|
// "endPos": 22,
|
|
|
|
// "startLine": 3,
|
|
|
|
// "endLine": 3
|
|
|
|
// },
|
|
|
|
// "Parts": [
|
|
|
|
// {
|
|
|
|
// "type": "*name.NamePart",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 20,
|
|
|
|
// "endPos": 22,
|
|
|
|
// "startLine": 3,
|
|
|
|
// "endLine": 3
|
|
|
|
// },
|
2018-06-29 21:51:11 +00:00
|
|
|
// "meta": [
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": " ",
|
|
|
|
// "tokenName": "StringToken"
|
|
|
|
// }
|
|
|
|
// ],
|
2018-06-19 20:55:12 +00:00
|
|
|
// "Value": "Foo"
|
|
|
|
// }
|
|
|
|
// ]
|
|
|
|
// },
|
|
|
|
// "Stmts": [
|
|
|
|
// {
|
|
|
|
// "type": "*stmt.Class",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 29,
|
|
|
|
// "endPos": 162,
|
|
|
|
// "startLine": 4,
|
|
|
|
// "endLine": 11
|
|
|
|
// },
|
|
|
|
// "namespacedName": "Foo\\Bar",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "meta": [
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": "\n\t\t\t",
|
|
|
|
// "tokenName": "ClassToken"
|
|
|
|
// },
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": " ",
|
|
|
|
// "tokenName": "OpenCurlyBracesToken"
|
|
|
|
// },
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": "\n\t\t\t",
|
|
|
|
// "tokenName": "CloseCurlyBracesToken"
|
|
|
|
// }
|
|
|
|
// ],
|
2018-06-19 20:55:12 +00:00
|
|
|
// "PhpDocComment": "",
|
|
|
|
// "ClassName": {
|
|
|
|
// "type": "*node.Identifier",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 35,
|
|
|
|
// "endPos": 37,
|
|
|
|
// "startLine": 4,
|
|
|
|
// "endLine": 4
|
|
|
|
// },
|
2018-06-29 21:51:11 +00:00
|
|
|
// "meta": [
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": " ",
|
2018-07-02 17:48:55 +00:00
|
|
|
// "tokenName": "IdentifierToken"
|
2018-06-29 21:51:11 +00:00
|
|
|
// }
|
|
|
|
// ],
|
2018-06-19 20:55:12 +00:00
|
|
|
// "Value": "Bar"
|
|
|
|
// },
|
|
|
|
// "Stmts": [
|
|
|
|
// {
|
|
|
|
// "type": "*stmt.ClassMethod",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 45,
|
|
|
|
// "endPos": 157,
|
|
|
|
// "startLine": 5,
|
|
|
|
// "endLine": 10
|
|
|
|
// },
|
2018-06-29 21:51:11 +00:00
|
|
|
// "meta": [
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": " ",
|
|
|
|
// "tokenName": "FunctionToken"
|
|
|
|
// }
|
|
|
|
// ],
|
2018-06-19 20:55:12 +00:00
|
|
|
// "ReturnsRef": false,
|
|
|
|
// "PhpDocComment": "",
|
|
|
|
// "MethodName": {
|
|
|
|
// "type": "*node.Identifier",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 61,
|
|
|
|
// "endPos": 72,
|
|
|
|
// "startLine": 5,
|
|
|
|
// "endLine": 5
|
|
|
|
// },
|
2018-06-29 21:51:11 +00:00
|
|
|
// "meta": [
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": " ",
|
|
|
|
// "tokenName": "IdentifierToken"
|
|
|
|
// }
|
|
|
|
// ],
|
2018-06-19 20:55:12 +00:00
|
|
|
// "Value": "FunctionName"
|
|
|
|
// },
|
|
|
|
// "Modifiers": [
|
|
|
|
// {
|
|
|
|
// "type": "*node.Identifier",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 45,
|
|
|
|
// "endPos": 50,
|
|
|
|
// "startLine": 5,
|
|
|
|
// "endLine": 5
|
|
|
|
// },
|
2018-06-29 21:51:11 +00:00
|
|
|
// "meta": [
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": "\n\t\t\t\t",
|
2018-07-02 17:48:55 +00:00
|
|
|
// "tokenName": "IdentifierToken"
|
2018-06-29 21:51:11 +00:00
|
|
|
// }
|
|
|
|
// ],
|
2018-06-19 20:55:12 +00:00
|
|
|
// "Value": "public"
|
|
|
|
// }
|
|
|
|
// ],
|
|
|
|
// "Params": [
|
|
|
|
// {
|
|
|
|
// "type": "*node.Parameter",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 74,
|
|
|
|
// "endPos": 89,
|
|
|
|
// "startLine": 5,
|
|
|
|
// "endLine": 5
|
|
|
|
// },
|
2018-06-29 21:51:11 +00:00
|
|
|
// "meta": [
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": " ",
|
|
|
|
// "tokenName": "EqualToken"
|
|
|
|
// }
|
|
|
|
// ],
|
2018-06-19 20:55:12 +00:00
|
|
|
// "ByRef": false,
|
|
|
|
// "Variadic": false,
|
|
|
|
// "VariableType": {
|
|
|
|
// "type": "*name.Name",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 74,
|
|
|
|
// "endPos": 77,
|
|
|
|
// "startLine": 5,
|
|
|
|
// "endLine": 5
|
|
|
|
// },
|
|
|
|
// "namespacedName": "Foo\\Type",
|
|
|
|
// "Parts": [
|
|
|
|
// {
|
|
|
|
// "type": "*name.NamePart",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 74,
|
|
|
|
// "endPos": 77,
|
|
|
|
// "startLine": 5,
|
|
|
|
// "endLine": 5
|
|
|
|
// },
|
|
|
|
// "Value": "Type"
|
|
|
|
// }
|
|
|
|
// ]
|
|
|
|
// },
|
|
|
|
// "Variable": {
|
|
|
|
// "type": "*expr.Variable",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 79,
|
|
|
|
// "endPos": 82,
|
|
|
|
// "startLine": 5,
|
|
|
|
// "endLine": 5
|
|
|
|
// },
|
2018-06-29 21:51:11 +00:00
|
|
|
// "meta": [
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": " ",
|
|
|
|
// "tokenName": "VariableToken"
|
2018-10-24 14:04:13 +00:00
|
|
|
// },
|
|
|
|
// {
|
|
|
|
// "type": "*meta.TokenType",
|
|
|
|
// "value": "$",
|
|
|
|
// "tokenName": "DollarToken"
|
2018-06-29 21:51:11 +00:00
|
|
|
// }
|
|
|
|
// ],
|
2018-06-19 20:55:12 +00:00
|
|
|
// "VarName": {
|
|
|
|
// "type": "*node.Identifier",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 79,
|
|
|
|
// "endPos": 82,
|
|
|
|
// "startLine": 5,
|
|
|
|
// "endLine": 5
|
|
|
|
// },
|
|
|
|
// "Value": "var"
|
|
|
|
// }
|
|
|
|
// },
|
|
|
|
// "DefaultValue": {
|
|
|
|
// "type": "*expr.ConstFetch",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 86,
|
|
|
|
// "endPos": 89,
|
|
|
|
// "startLine": 5,
|
|
|
|
// "endLine": 5
|
|
|
|
// },
|
|
|
|
// "Constant": {
|
|
|
|
// "type": "*name.Name",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 86,
|
|
|
|
// "endPos": 89,
|
|
|
|
// "startLine": 5,
|
|
|
|
// "endLine": 5
|
|
|
|
// },
|
|
|
|
// "namespacedName": "null",
|
|
|
|
// "Parts": [
|
|
|
|
// {
|
|
|
|
// "type": "*name.NamePart",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 86,
|
|
|
|
// "endPos": 89,
|
|
|
|
// "startLine": 5,
|
|
|
|
// "endLine": 5
|
|
|
|
// },
|
2018-06-29 21:51:11 +00:00
|
|
|
// "meta": [
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": " ",
|
|
|
|
// "tokenName": "StringToken"
|
|
|
|
// }
|
|
|
|
// ],
|
2018-06-19 20:55:12 +00:00
|
|
|
// "Value": "null"
|
|
|
|
// }
|
|
|
|
// ]
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// ],
|
|
|
|
// "Stmt": {
|
|
|
|
// "type": "*stmt.StmtList",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 96,
|
|
|
|
// "endPos": 157,
|
|
|
|
// "startLine": 6,
|
|
|
|
// "endLine": 10
|
|
|
|
// },
|
2018-06-29 21:51:11 +00:00
|
|
|
// "meta": [
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": "\n\t\t\t\t",
|
|
|
|
// "tokenName": "OpenCurlyBracesToken"
|
|
|
|
// },
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": "\n\t\t\t\t",
|
|
|
|
// "tokenName": "CloseCurlyBracesToken"
|
|
|
|
// }
|
|
|
|
// ],
|
2018-06-19 20:55:12 +00:00
|
|
|
// "Stmts": [
|
|
|
|
// {
|
|
|
|
// "type": "*stmt.Expression",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 147,
|
|
|
|
// "endPos": 151,
|
|
|
|
// "startLine": 9,
|
|
|
|
// "endLine": 9
|
|
|
|
// },
|
2018-07-29 08:44:38 +00:00
|
|
|
// "meta": [
|
|
|
|
// {
|
|
|
|
// "type": "*meta.TokenType",
|
|
|
|
// "value": ";",
|
|
|
|
// "tokenName": "SemiColonToken"
|
|
|
|
// }
|
|
|
|
// ],
|
2018-06-19 20:55:12 +00:00
|
|
|
// "Expr": {
|
|
|
|
// "type": "*expr.Variable",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 147,
|
|
|
|
// "endPos": 150,
|
|
|
|
// "startLine": 9,
|
|
|
|
// "endLine": 9
|
|
|
|
// },
|
2018-06-29 21:51:11 +00:00
|
|
|
// "meta": [
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": "\n\t\t\t\t\t",
|
|
|
|
// "tokenName": "VariableToken"
|
|
|
|
// },
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.CommentType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": "// some comment\n",
|
|
|
|
// "tokenName": "VariableToken"
|
|
|
|
// },
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-07-02 17:48:55 +00:00
|
|
|
// "value": "\t\t\t\t\t",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "tokenName": "VariableToken"
|
|
|
|
// },
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.CommentType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": "// second comment\n",
|
|
|
|
// "tokenName": "VariableToken"
|
|
|
|
// },
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-07-02 17:48:55 +00:00
|
|
|
// "value": "\t\t\t\t\t",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "tokenName": "VariableToken"
|
2018-10-24 14:04:13 +00:00
|
|
|
// },
|
|
|
|
// {
|
|
|
|
// "type": "*meta.TokenType",
|
|
|
|
// "value": "$",
|
|
|
|
// "tokenName": "DollarToken"
|
2018-06-29 21:51:11 +00:00
|
|
|
// }
|
2018-06-19 20:55:12 +00:00
|
|
|
// ],
|
|
|
|
// "VarName": {
|
|
|
|
// "type": "*node.Identifier",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 147,
|
|
|
|
// "endPos": 150,
|
|
|
|
// "startLine": 9,
|
|
|
|
// "endLine": 9
|
|
|
|
// },
|
|
|
|
// "Value": "var"
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// ]
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// ]
|
2018-06-29 21:51:11 +00:00
|
|
|
// },
|
|
|
|
// {
|
|
|
|
// "type": "*stmt.Function",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 168,
|
2018-07-29 08:44:38 +00:00
|
|
|
// "endPos": 194,
|
2018-06-29 21:51:11 +00:00
|
|
|
// "startLine": 13,
|
2018-07-29 08:44:38 +00:00
|
|
|
// "endLine": 15
|
2018-06-29 21:51:11 +00:00
|
|
|
// },
|
|
|
|
// "namespacedName": "Foo\\foo",
|
|
|
|
// "meta": [
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": "\n\n\t\t\t",
|
|
|
|
// "tokenName": "FunctionToken"
|
|
|
|
// },
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": " ",
|
|
|
|
// "tokenName": "OpenCurlyBracesToken"
|
2018-07-29 08:44:38 +00:00
|
|
|
// },
|
|
|
|
// {
|
|
|
|
// "type": "*meta.WhiteSpaceType",
|
|
|
|
// "value": "\n\t\t\t",
|
|
|
|
// "tokenName": "CloseCurlyBracesToken"
|
2018-06-29 21:51:11 +00:00
|
|
|
// }
|
|
|
|
// ],
|
|
|
|
// "ReturnsRef": false,
|
|
|
|
// "PhpDocComment": "",
|
|
|
|
// "FunctionName": {
|
|
|
|
// "type": "*node.Identifier",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 177,
|
|
|
|
// "endPos": 179,
|
|
|
|
// "startLine": 13,
|
|
|
|
// "endLine": 13
|
|
|
|
// },
|
|
|
|
// "meta": [
|
|
|
|
// {
|
2018-07-29 08:44:38 +00:00
|
|
|
// "type": "*meta.WhiteSpaceType",
|
2018-06-29 21:51:11 +00:00
|
|
|
// "value": " ",
|
2018-07-02 17:48:55 +00:00
|
|
|
// "tokenName": "IdentifierToken"
|
2018-06-29 21:51:11 +00:00
|
|
|
// }
|
|
|
|
// ],
|
|
|
|
// "Value": "foo"
|
|
|
|
// },
|
|
|
|
// "Stmts": [
|
2018-07-29 08:44:38 +00:00
|
|
|
// {
|
|
|
|
// "type": "*stmt.Nop",
|
|
|
|
// "position": {
|
|
|
|
// "startPos": 189,
|
|
|
|
// "endPos": 189,
|
|
|
|
// "startLine": 14,
|
|
|
|
// "endLine": 14
|
|
|
|
// },
|
|
|
|
// "meta": [
|
|
|
|
// {
|
|
|
|
// "type": "*meta.WhiteSpaceType",
|
|
|
|
// "value": "\n\t\t\t\t",
|
|
|
|
// "tokenName": "SemiColonToken"
|
|
|
|
// },
|
|
|
|
// {
|
|
|
|
// "type": "*meta.TokenType",
|
|
|
|
// "value": ";",
|
|
|
|
// "tokenName": "SemiColonToken"
|
|
|
|
// }
|
|
|
|
// ]
|
|
|
|
// }
|
2018-06-29 21:51:11 +00:00
|
|
|
// ]
|
2018-06-19 20:55:12 +00:00
|
|
|
// }
|
|
|
|
// ]
|
|
|
|
// }
|
|
|
|
// ]
|
|
|
|
// }
|
|
|
|
}
|