{"action":"created","comment":{"url":"https://api.github.com/repos/strongloop/loopback-next/pulls/comments/183918426","pull_request_review_id":115009953,"id":183918426,"diff_hunk":"@@ -12,64 +12,117 @@ const debug = require('../lib/debug')();\n const minimist = require('minimist');\n const path = require('path');\n const yeoman = require('yeoman-environment');\n+const PREFIX = 'loopback4:';\n \n-const opts = minimist(process.argv.slice(2), {\n-  alias: {\n-    version: 'v',\n-    commands: 'l',\n-  },\n-});\n-\n-if (opts.version) {\n-  const ver = require('../package.json').version;\n-  console.log('Version: %s', ver);\n-  return;\n+/**\n+ * Parse arguments and run corresponding command\n+ * @param env Yeoman env\n+ * @param {*} opts Command options\n+ * @param log Log function\n+ * @param dryRun flag for dryRun (for testing)\n+ */\n+function runCommand(env, opts, log, dryRun) {\n+  const args = opts._;\n+  const originalCommand = args.shift();\n+  let command = PREFIX + (originalCommand || 'app');\n+  const supportedCommands = env.getGeneratorsMeta();\n+  if (!(command in supportedCommands)) {\n+    command = PREFIX + 'app';\n+    args.unshift(originalCommand);\n+    args.unshift(command);\n+  } else {\n+    args.unshift(command);\n+  }\n+  debug('invoking generator', args);\n+  // `yo` is adding flags converted to CamelCase\n+  const options = camelCaseKeys(opts, {exclude: ['--', /^\\w$/, 'argv']});\n+  Object.assign(options, opts);\n+  debug('env.run %j %j', args, options);\n+  if (!dryRun) {\n+    env.run(args, options);\n+  }\n+  // list generators\n+  if (opts.help && !originalCommand) {\n+    printCommands(env, log);\n+  }\n }\n \n-var env = yeoman.createEnv();\n+/**\n+ * Set up yeoman generators\n+ */\n+function setupGenerators() {\n+  var env = yeoman.createEnv();\n+  env.register(path.join(__dirname, '../generators/app'), PREFIX + 'app');\n+  env.register(\n+    path.join(__dirname, '../generators/extension'),\n+    PREFIX + 'extension'\n+  );\n+  env.register(\n+    path.join(__dirname, '../generators/controller'),\n+    PREFIX + 'controller'\n+  );\n+  env.register(\n+    path.join(__dirname, '../generators/example'),\n+    PREFIX + 'example'\n+  );\n+  return env;\n+}\n \n-env.register(path.join(__dirname, '../generators/app'), 'loopback4:app');\n-env.register(\n-  path.join(__dirname, '../generators/extension'),\n-  'loopback4:extension'\n-);\n-env.register(\n-  path.join(__dirname, '../generators/controller'),\n-  'loopback4:controller'\n-);\n-env.register(\n-  path.join(__dirname, '../generators/example'),\n-  'loopback4:example'\n-);\n+/**\n+ * Print @loopback/* versions\n+ */\n+function printVersions(log) {\n+  const pkg = require('../package.json');\n+  const ver = pkg.version;\n+  log('@loopback/cli version: %s', ver);\n+  const deps = pkg.config.templateDependencies;\n+  log('\\n@loopback/* dependencies:');\n+  for (const d in deps) {\n+    if (d.startsWith('@loopback/') && d !== '@loopback/cli') {\n+      log('  - %s: %s', d, deps[d]);\n+    }\n+  }\n+}\n \n-// list generators\n-if (opts.commands) {\n-  console.log('Available commands: ');\n+/**\n+ * Print a list of available commands\n+ * @param {*} env Yeoman env\n+ * @param log Log function\n+ */\n+function printCommands(env, log) {\n+  log('Available commands: ');\n   var list = Object.keys(env.getGeneratorsMeta())\n     .filter(name => /^loopback4:/.test(name))\n     .map(name => name.replace(/^loopback4:/, '  lb4 '));\n-  console.log(list.join('\\n'));\n-  return;\n+  log(list.join('\\n'));\n }\n \n-const args = opts._;\n-const originalCommand = args.shift();\n-let command = 'loopback4:' + (originalCommand || 'app');\n-const supportedCommands = env.getGeneratorsMeta();\n+function main(opts, log) {\n+  log = log || console.log;\n+  if (opts.version) {\n+    printVersions(log);\n+    return;\n+  }\n \n-if (!(command in supportedCommands)) {\n-  command = 'loopback4:app';\n-  args.unshift(originalCommand);\n-  args.unshift(command);\n-} else {\n-  args.unshift(command);\n-}\n+  var env = setupGenerators();\n \n-debug('invoking generator', args);\n+  // list generators\n+  if (opts.commands) {\n+    printCommands(env, log);\n+    return;\n+  }\n \n-// `yo` is adding flags converted to CamelCase\n-const options = camelCaseKeys(opts, {exclude: ['--', /^\\w$/, 'argv']});\n-Object.assign(options, opts);\n+  runCommand(env, opts, log, log !== console.log);","path":"packages/cli/bin/cli.js","position":149,"original_position":149,"commit_id":"d24a9730eeb44939e0f1d48b4a3f2ef7e78517e8","original_commit_id":"d24a9730eeb44939e0f1d48b4a3f2ef7e78517e8","user":{"login":"raymondfeng","id":540892,"avatar_url":"https://avatars0.githubusercontent.com/u/540892?v=4","gravatar_id":"","url":"https://api.github.com/users/raymondfeng","html_url":"https://github.com/raymondfeng","followers_url":"https://api.github.com/users/raymondfeng/followers","following_url":"https://api.github.com/users/raymondfeng/following{/other_user}","gists_url":"https://api.github.com/users/raymondfeng/gists{/gist_id}","starred_url":"https://api.github.com/users/raymondfeng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/raymondfeng/subscriptions","organizations_url":"https://api.github.com/users/raymondfeng/orgs","repos_url":"https://api.github.com/users/raymondfeng/repos","events_url":"https://api.github.com/users/raymondfeng/events{/privacy}","received_events_url":"https://api.github.com/users/raymondfeng/received_events","type":"User","site_admin":false},"body":"Just for testing. I configure `log` to be in-memory for dry run so that we don't produce console.log.","created_at":"2018-04-25T00:40:17Z","updated_at":"2018-04-25T00:40:17Z","html_url":"https://github.com/strongloop/loopback-next/pull/1279#discussion_r183918426","pull_request_url":"https://api.github.com/repos/strongloop/loopback-next/pulls/1279","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/strongloop/loopback-next/pulls/comments/183918426"},"html":{"href":"https://github.com/strongloop/loopback-next/pull/1279#discussion_r183918426"},"pull_request":{"href":"https://api.github.com/repos/strongloop/loopback-next/pulls/1279"}},"in_reply_to_id":183912778},"pull_request":{"url":"https://api.github.com/repos/strongloop/loopback-next/pulls/1279","id":183877171,"html_url":"https://github.com/strongloop/loopback-next/pull/1279","diff_url":"https://github.com/strongloop/loopback-next/pull/1279.diff","patch_url":"https://github.com/strongloop/loopback-next/pull/1279.patch","issue_url":"https://api.github.com/repos/strongloop/loopback-next/issues/1279","number":1279,"state":"open","locked":false,"title":"feat(cli): improve cli help/version/commands options","user":{"login":"raymondfeng","id":540892,"avatar_url":"https://avatars0.githubusercontent.com/u/540892?v=4","gravatar_id":"","url":"https://api.github.com/users/raymondfeng","html_url":"https://github.com/raymondfeng","followers_url":"https://api.github.com/users/raymondfeng/followers","following_url":"https://api.github.com/users/raymondfeng/following{/other_user}","gists_url":"https://api.github.com/users/raymondfeng/gists{/gist_id}","starred_url":"https://api.github.com/users/raymondfeng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/raymondfeng/subscriptions","organizations_url":"https://api.github.com/users/raymondfeng/orgs","repos_url":"https://api.github.com/users/raymondfeng/repos","events_url":"https://api.github.com/users/raymondfeng/events{/privacy}","received_events_url":"https://api.github.com/users/raymondfeng/received_events","type":"User","site_admin":false},"body":"Implements https://github.com/strongloop/loopback-next/issues/934\r\n\r\n## Checklist\r\n\r\n- [x] `npm test` passes on your machine\r\n- [x] New tests added or existing tests modified to cover all changes\r\n- [x] Code conforms with the [style guide](http://loopback.io/doc/en/contrib/style-guide.html)\r\n- [ ] API Documentation in code was updated\r\n- [ ] Documentation in [/docs/site](../tree/master/docs/site) was updated\r\n- [x] Affected artifact templates in `packages/cli` were updated\r\n- [ ] Affected example projects in `examples/*` were updated\r\n","created_at":"2018-04-24T22:03:59Z","updated_at":"2018-04-25T00:40:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4e44467834e2c71e8125aaf44f39418d3bfe0abf","assignee":null,"assignees":[],"requested_reviewers":[{"login":"bajtos","id":1140553,"avatar_url":"https://avatars1.githubusercontent.com/u/1140553?v=4","gravatar_id":"","url":"https://api.github.com/users/bajtos","html_url":"https://github.com/bajtos","followers_url":"https://api.github.com/users/bajtos/followers","following_url":"https://api.github.com/users/bajtos/following{/other_user}","gists_url":"https://api.github.com/users/bajtos/gists{/gist_id}","starred_url":"https://api.github.com/users/bajtos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bajtos/subscriptions","organizations_url":"https://api.github.com/users/bajtos/orgs","repos_url":"https://api.github.com/users/bajtos/repos","events_url":"https://api.github.com/users/bajtos/events{/privacy}","received_events_url":"https://api.github.com/users/bajtos/received_events","type":"User","site_admin":false},{"login":"shimks","id":18518689,"avatar_url":"https://avatars2.githubusercontent.com/u/18518689?v=4","gravatar_id":"","url":"https://api.github.com/users/shimks","html_url":"https://github.com/shimks","followers_url":"https://api.github.com/users/shimks/followers","following_url":"https://api.github.com/users/shimks/following{/other_user}","gists_url":"https://api.github.com/users/shimks/gists{/gist_id}","starred_url":"https://api.github.com/users/shimks/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shimks/subscriptions","organizations_url":"https://api.github.com/users/shimks/orgs","repos_url":"https://api.github.com/users/shimks/repos","events_url":"https://api.github.com/users/shimks/events{/privacy}","received_events_url":"https://api.github.com/users/shimks/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":570635292,"url":"https://api.github.com/repos/strongloop/loopback-next/labels/review","name":"review","color":"eeeeee","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/strongloop/loopback-next/pulls/1279/commits","review_comments_url":"https://api.github.com/repos/strongloop/loopback-next/pulls/1279/comments","review_comment_url":"https://api.github.com/repos/strongloop/loopback-next/pulls/comments{/number}","comments_url":"https://api.github.com/repos/strongloop/loopback-next/issues/1279/comments","statuses_url":"https://api.github.com/repos/strongloop/loopback-next/statuses/d24a9730eeb44939e0f1d48b4a3f2ef7e78517e8","head":{"label":"strongloop:improve-cli-help","ref":"improve-cli-help","sha":"d24a9730eeb44939e0f1d48b4a3f2ef7e78517e8","user":{"login":"strongloop","id":3020012,"avatar_url":"https://avatars1.githubusercontent.com/u/3020012?v=4","gravatar_id":"","url":"https://api.github.com/users/strongloop","html_url":"https://github.com/strongloop","followers_url":"https://api.github.com/users/strongloop/followers","following_url":"https://api.github.com/users/strongloop/following{/other_user}","gists_url":"https://api.github.com/users/strongloop/gists{/gist_id}","starred_url":"https://api.github.com/users/strongloop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/strongloop/subscriptions","organizations_url":"https://api.github.com/users/strongloop/orgs","repos_url":"https://api.github.com/users/strongloop/repos","events_url":"https://api.github.com/users/strongloop/events{/privacy}","received_events_url":"https://api.github.com/users/strongloop/received_events","type":"Organization","site_admin":false},"repo":{"id":78452015,"name":"loopback-next","full_name":"strongloop/loopback-next","owner":{"login":"strongloop","id":3020012,"avatar_url":"https://avatars1.githubusercontent.com/u/3020012?v=4","gravatar_id":"","url":"https://api.github.com/users/strongloop","html_url":"https://github.com/strongloop","followers_url":"https://api.github.com/users/strongloop/followers","following_url":"https://api.github.com/users/strongloop/following{/other_user}","gists_url":"https://api.github.com/users/strongloop/gists{/gist_id}","starred_url":"https://api.github.com/users/strongloop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/strongloop/subscriptions","organizations_url":"https://api.github.com/users/strongloop/orgs","repos_url":"https://api.github.com/users/strongloop/repos","events_url":"https://api.github.com/users/strongloop/events{/privacy}","received_events_url":"https://api.github.com/users/strongloop/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/strongloop/loopback-next","description":"LoopBack makes it easy to build modern API applications that require complex integrations.","fork":false,"url":"https://api.github.com/repos/strongloop/loopback-next","forks_url":"https://api.github.com/repos/strongloop/loopback-next/forks","keys_url":"https://api.github.com/repos/strongloop/loopback-next/keys{/key_id}","collaborators_url":"https://api.github.com/repos/strongloop/loopback-next/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/strongloop/loopback-next/teams","hooks_url":"https://api.github.com/repos/strongloop/loopback-next/hooks","issue_events_url":"https://api.github.com/repos/strongloop/loopback-next/issues/events{/number}","events_url":"https://api.github.com/repos/strongloop/loopback-next/events","assignees_url":"https://api.github.com/repos/strongloop/loopback-next/assignees{/user}","branches_url":"https://api.github.com/repos/strongloop/loopback-next/branches{/branch}","tags_url":"https://api.github.com/repos/strongloop/loopback-next/tags","blobs_url":"https://api.github.com/repos/strongloop/loopback-next/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/strongloop/loopback-next/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/strongloop/loopback-next/git/refs{/sha}","trees_url":"https://api.github.com/repos/strongloop/loopback-next/git/trees{/sha}","statuses_url":"https://api.github.com/repos/strongloop/loopback-next/statuses/{sha}","languages_url":"https://api.github.com/repos/strongloop/loopback-next/languages","stargazers_url":"https://api.github.com/repos/strongloop/loopback-next/stargazers","contributors_url":"https://api.github.com/repos/strongloop/loopback-next/contributors","subscribers_url":"https://api.github.com/repos/strongloop/loopback-next/subscribers","subscription_url":"https://api.github.com/repos/strongloop/loopback-next/subscription","commits_url":"https://api.github.com/repos/strongloop/loopback-next/commits{/sha}","git_commits_url":"https://api.github.com/repos/strongloop/loopback-next/git/commits{/sha}","comments_url":"https://api.github.com/repos/strongloop/loopback-next/comments{/number}","issue_comment_url":"https://api.github.com/repos/strongloop/loopback-next/issues/comments{/number}","contents_url":"https://api.github.com/repos/strongloop/loopback-next/contents/{+path}","compare_url":"https://api.github.com/repos/strongloop/loopback-next/compare/{base}...{head}","merges_url":"https://api.github.com/repos/strongloop/loopback-next/merges","archive_url":"https://api.github.com/repos/strongloop/loopback-next/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/strongloop/loopback-next/downloads","issues_url":"https://api.github.com/repos/strongloop/loopback-next/issues{/number}","pulls_url":"https://api.github.com/repos/strongloop/loopback-next/pulls{/number}","milestones_url":"https://api.github.com/repos/strongloop/loopback-next/milestones{/number}","notifications_url":"https://api.github.com/repos/strongloop/loopback-next/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/strongloop/loopback-next/labels{/name}","releases_url":"https://api.github.com/repos/strongloop/loopback-next/releases{/id}","deployments_url":"https://api.github.com/repos/strongloop/loopback-next/deployments","created_at":"2017-01-09T17:27:14Z","updated_at":"2018-04-24T22:28:34Z","pushed_at":"2018-04-24T22:28:37Z","git_url":"git://github.com/strongloop/loopback-next.git","ssh_url":"git@github.com:strongloop/loopback-next.git","clone_url":"https://github.com/strongloop/loopback-next.git","svn_url":"https://github.com/strongloop/loopback-next","homepage":"http://loopback.io","size":5938,"stargazers_count":578,"watchers_count":578,"language":"TypeScript","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":55,"mirror_url":null,"archived":false,"open_issues_count":228,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":55,"open_issues":228,"watchers":578,"default_branch":"master"}},"base":{"label":"strongloop:master","ref":"master","sha":"5dc4724a7eaabde3e8e940799f17139c1b97bd0a","user":{"login":"strongloop","id":3020012,"avatar_url":"https://avatars1.githubusercontent.com/u/3020012?v=4","gravatar_id":"","url":"https://api.github.com/users/strongloop","html_url":"https://github.com/strongloop","followers_url":"https://api.github.com/users/strongloop/followers","following_url":"https://api.github.com/users/strongloop/following{/other_user}","gists_url":"https://api.github.com/users/strongloop/gists{/gist_id}","starred_url":"https://api.github.com/users/strongloop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/strongloop/subscriptions","organizations_url":"https://api.github.com/users/strongloop/orgs","repos_url":"https://api.github.com/users/strongloop/repos","events_url":"https://api.github.com/users/strongloop/events{/privacy}","received_events_url":"https://api.github.com/users/strongloop/received_events","type":"Organization","site_admin":false},"repo":{"id":78452015,"name":"loopback-next","full_name":"strongloop/loopback-next","owner":{"login":"strongloop","id":3020012,"avatar_url":"https://avatars1.githubusercontent.com/u/3020012?v=4","gravatar_id":"","url":"https://api.github.com/users/strongloop","html_url":"https://github.com/strongloop","followers_url":"https://api.github.com/users/strongloop/followers","following_url":"https://api.github.com/users/strongloop/following{/other_user}","gists_url":"https://api.github.com/users/strongloop/gists{/gist_id}","starred_url":"https://api.github.com/users/strongloop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/strongloop/subscriptions","organizations_url":"https://api.github.com/users/strongloop/orgs","repos_url":"https://api.github.com/users/strongloop/repos","events_url":"https://api.github.com/users/strongloop/events{/privacy}","received_events_url":"https://api.github.com/users/strongloop/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/strongloop/loopback-next","description":"LoopBack makes it easy to build modern API applications that require complex integrations.","fork":false,"url":"https://api.github.com/repos/strongloop/loopback-next","forks_url":"https://api.github.com/repos/strongloop/loopback-next/forks","keys_url":"https://api.github.com/repos/strongloop/loopback-next/keys{/key_id}","collaborators_url":"https://api.github.com/repos/strongloop/loopback-next/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/strongloop/loopback-next/teams","hooks_url":"https://api.github.com/repos/strongloop/loopback-next/hooks","issue_events_url":"https://api.github.com/repos/strongloop/loopback-next/issues/events{/number}","events_url":"https://api.github.com/repos/strongloop/loopback-next/events","assignees_url":"https://api.github.com/repos/strongloop/loopback-next/assignees{/user}","branches_url":"https://api.github.com/repos/strongloop/loopback-next/branches{/branch}","tags_url":"https://api.github.com/repos/strongloop/loopback-next/tags","blobs_url":"https://api.github.com/repos/strongloop/loopback-next/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/strongloop/loopback-next/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/strongloop/loopback-next/git/refs{/sha}","trees_url":"https://api.github.com/repos/strongloop/loopback-next/git/trees{/sha}","statuses_url":"https://api.github.com/repos/strongloop/loopback-next/statuses/{sha}","languages_url":"https://api.github.com/repos/strongloop/loopback-next/languages","stargazers_url":"https://api.github.com/repos/strongloop/loopback-next/stargazers","contributors_url":"https://api.github.com/repos/strongloop/loopback-next/contributors","subscribers_url":"https://api.github.com/repos/strongloop/loopback-next/subscribers","subscription_url":"https://api.github.com/repos/strongloop/loopback-next/subscription","commits_url":"https://api.github.com/repos/strongloop/loopback-next/commits{/sha}","git_commits_url":"https://api.github.com/repos/strongloop/loopback-next/git/commits{/sha}","comments_url":"https://api.github.com/repos/strongloop/loopback-next/comments{/number}","issue_comment_url":"https://api.github.com/repos/strongloop/loopback-next/issues/comments{/number}","contents_url":"https://api.github.com/repos/strongloop/loopback-next/contents/{+path}","compare_url":"https://api.github.com/repos/strongloop/loopback-next/compare/{base}...{head}","merges_url":"https://api.github.com/repos/strongloop/loopback-next/merges","archive_url":"https://api.github.com/repos/strongloop/loopback-next/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/strongloop/loopback-next/downloads","issues_url":"https://api.github.com/repos/strongloop/loopback-next/issues{/number}","pulls_url":"https://api.github.com/repos/strongloop/loopback-next/pulls{/number}","milestones_url":"https://api.github.com/repos/strongloop/loopback-next/milestones{/number}","notifications_url":"https://api.github.com/repos/strongloop/loopback-next/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/strongloop/loopback-next/labels{/name}","releases_url":"https://api.github.com/repos/strongloop/loopback-next/releases{/id}","deployments_url":"https://api.github.com/repos/strongloop/loopback-next/deployments","created_at":"2017-01-09T17:27:14Z","updated_at":"2018-04-24T22:28:34Z","pushed_at":"2018-04-24T22:28:37Z","git_url":"git://github.com/strongloop/loopback-next.git","ssh_url":"git@github.com:strongloop/loopback-next.git","clone_url":"https://github.com/strongloop/loopback-next.git","svn_url":"https://github.com/strongloop/loopback-next","homepage":"http://loopback.io","size":5938,"stargazers_count":578,"watchers_count":578,"language":"TypeScript","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":55,"mirror_url":null,"archived":false,"open_issues_count":228,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":55,"open_issues":228,"watchers":578,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/strongloop/loopback-next/pulls/1279"},"html":{"href":"https://github.com/strongloop/loopback-next/pull/1279"},"issue":{"href":"https://api.github.com/repos/strongloop/loopback-next/issues/1279"},"comments":{"href":"https://api.github.com/repos/strongloop/loopback-next/issues/1279/comments"},"review_comments":{"href":"https://api.github.com/repos/strongloop/loopback-next/pulls/1279/comments"},"review_comment":{"href":"https://api.github.com/repos/strongloop/loopback-next/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/strongloop/loopback-next/pulls/1279/commits"},"statuses":{"href":"https://api.github.com/repos/strongloop/loopback-next/statuses/d24a9730eeb44939e0f1d48b4a3f2ef7e78517e8"}},"author_association":"OWNER"}}
{"actor":{"display_login":"raymondfeng"}}