@eui/cli 21.0.0-alpha.23 → 21.0.0-alpha.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/bin/eui-cli.js +60 -39
  2. package/bin/scripts/new.js +39 -0
  3. package/bin/scripts/serve-app.js +12 -0
  4. package/lib/app-utils/projects.js +41 -0
  5. package/lib/app-utils/serve.js +76 -0
  6. package/lib/build.js +0 -28
  7. package/lib/cli.js +0 -1
  8. package/lib/install.js +0 -3
  9. package/lib/skeletons/_angular/base/angular.json +0 -6
  10. package/lib/skeletons/_angular/base/package.json +23 -26
  11. package/lib/skeletons/_angular/base-mobile/package.json +1 -1
  12. package/lib/skeletons/web-symfony/myapp-web/package.json +2 -2
  13. package/lib/utils.js +2 -12
  14. package/package.json +4 -4
  15. package/lib/skeletons/_angular/base/.euirc.json +0 -8
  16. package/lib/skeletons/web-symfony/myapp-web/angular.json +0 -169
  17. package/lib/skeletons/web-symfony/myapp-web/src/app/app-routing.module.ts +0 -18
  18. package/lib/skeletons/web-symfony/myapp-web/src/app/app.component.ts +0 -77
  19. package/lib/skeletons/web-symfony/myapp-web/src/app/features/products/components/products.component.html +0 -160
  20. package/lib/skeletons/web-symfony/myapp-web/src/app/features/products/components/products.component.scss +0 -0
  21. package/lib/skeletons/web-symfony/myapp-web/src/app/features/products/components/products.component.ts +0 -104
  22. package/lib/skeletons/web-symfony/myapp-web/src/app/features/products/models/product.model.ts +0 -6
  23. package/lib/skeletons/web-symfony/myapp-web/src/app/features/products/products-routing.module.ts +0 -16
  24. package/lib/skeletons/web-symfony/myapp-web/src/app/features/products/products.module.ts +0 -16
  25. package/lib/skeletons/web-symfony/myapp-web/src/app/features/products/services/products.service.ts +0 -29
  26. package/lib/skeletons/web-symfony/myapp-web/src/environments/environment.ts +0 -17
  27. package/lib/skeletons/web-symfony/myapp-web-rest/.env +0 -28
  28. package/lib/skeletons/web-symfony/myapp-web-rest/bin/console +0 -42
  29. package/lib/skeletons/web-symfony/myapp-web-rest/composer.json +0 -67
  30. package/lib/skeletons/web-symfony/myapp-web-rest/composer.lock +0 -3572
  31. package/lib/skeletons/web-symfony/myapp-web-rest/config/bootstrap.php +0 -21
  32. package/lib/skeletons/web-symfony/myapp-web-rest/config/bundles.php +0 -12
  33. package/lib/skeletons/web-symfony/myapp-web-rest/config/config.yml +0 -0
  34. package/lib/skeletons/web-symfony/myapp-web-rest/config/packages/cache.yaml +0 -19
  35. package/lib/skeletons/web-symfony/myapp-web-rest/config/packages/dev/routing.yaml +0 -3
  36. package/lib/skeletons/web-symfony/myapp-web-rest/config/packages/doctrine.yaml +0 -29
  37. package/lib/skeletons/web-symfony/myapp-web-rest/config/packages/doctrine_migrations.yaml +0 -5
  38. package/lib/skeletons/web-symfony/myapp-web-rest/config/packages/framework.yaml +0 -17
  39. package/lib/skeletons/web-symfony/myapp-web-rest/config/packages/prod/doctrine.yaml +0 -32
  40. package/lib/skeletons/web-symfony/myapp-web-rest/config/packages/routing.yaml +0 -4
  41. package/lib/skeletons/web-symfony/myapp-web-rest/config/packages/sensio_framework_extra.yaml +0 -3
  42. package/lib/skeletons/web-symfony/myapp-web-rest/config/packages/test/framework.yaml +0 -4
  43. package/lib/skeletons/web-symfony/myapp-web-rest/config/packages/test/routing.yaml +0 -3
  44. package/lib/skeletons/web-symfony/myapp-web-rest/config/packages/twig.yaml +0 -4
  45. package/lib/skeletons/web-symfony/myapp-web-rest/config/routes/annotations.yaml +0 -3
  46. package/lib/skeletons/web-symfony/myapp-web-rest/config/routes/dev/twig.yaml +0 -3
  47. package/lib/skeletons/web-symfony/myapp-web-rest/config/routes.yaml +0 -3
  48. package/lib/skeletons/web-symfony/myapp-web-rest/config/services.yaml +0 -27
  49. package/lib/skeletons/web-symfony/myapp-web-rest/public/index.php +0 -27
  50. package/lib/skeletons/web-symfony/myapp-web-rest/src/Controller/ProductController.php +0 -196
  51. package/lib/skeletons/web-symfony/myapp-web-rest/src/Entity/Product.php +0 -99
  52. package/lib/skeletons/web-symfony/myapp-web-rest/src/Kernel.php +0 -53
  53. package/lib/skeletons/web-symfony/myapp-web-rest/src/Migrations/Version20190604101623.php +0 -31
  54. package/lib/skeletons/web-symfony/myapp-web-rest/src/Migrations/Version20190604101638.php +0 -35
  55. package/lib/skeletons/web-symfony/myapp-web-rest/src/Repository/ProductRepository.php +0 -51
  56. package/lib/skeletons/web-symfony/myapp-web-rest/symfony.lock +0 -274
  57. package/lib/skeletons/web-symfony/myapp-web-rest/templates/base.html.twig +0 -12
  58. package/lib/skeletons/web-symfony/myapp-web-rest/templates/lucky/number.html.twig +0 -1
  59. package/lib/skeletons/web-symfony/myapp-web-rest/templates/product/index.html.twig +0 -20
package/bin/eui-cli.js CHANGED
@@ -1,42 +1,63 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const figlet = require('figlet');
4
- const path = require('path');
5
- const generators = require('../lib/generators');
6
- const config = require('../lib/config');
7
- const utils = require('../lib/utils');
8
-
9
- // fetching cli arguments
10
- const args = utils.getArgs();
11
-
12
- // Print header and version
13
- utils.logBigTitle('eUI CLI');
14
- utils.logAccent(` --- v${config.version} ---\n`);
15
-
16
- // remapping config if passed as argument - automated mode
17
- let inputConfig = config.parseInputConfig(args.config);
18
-
19
- // Detecting targetPath and create it if present as argument - local and automated mode
20
- let targetPath;
21
-
22
- if (args.targetPath) {
23
- targetPath = path.join(config.targetPath, args.targetPath);
24
-
25
- if (!tools.isDirExists(targetPath)) {
26
- utils.mkdir(targetPath);
27
- }
28
-
29
- // otherwise taking the default config targetPath defined
30
- } else {
31
- targetPath = config.targetPath;
32
- }
33
-
34
- if (args.v) {
35
- console.info('Current eUI CLI version installed : ' + config.version);
36
-
37
- } else {
38
- return generators.appGenerate({
39
- inputConfig: inputConfig,
40
- targetPath: targetPath
41
- });
3
+ const spawn = require('cross-spawn');
4
+ const args = process.argv.slice(2);
5
+
6
+ const scriptIndex = args.findIndex(
7
+ (x) =>
8
+ x === 'new' ||
9
+ x === 'build-app' ||
10
+ x === 'serve-app' ||
11
+ x === 'lint-app' ||
12
+ x === 'start-symfony' ||
13
+ x === 'generate-translations' ||
14
+ x === 'generate-sprite' ||
15
+ x === 'generate-translations' ||
16
+ x === 'generate-app-metadata' ||
17
+ x === 'help' ||
18
+ x === 'inject-config-app'
19
+ );
20
+ const script = scriptIndex === -1 ? args[0] : args[scriptIndex];
21
+ const nodeArgs = scriptIndex > 0 ? args.slice(0, scriptIndex) : [];
22
+
23
+ switch (script) {
24
+ case 'new':
25
+ case 'build-app':
26
+ case 'serve-app':
27
+ case 'lint-app':
28
+ case 'start-symfony':
29
+ case 'generate-translations':
30
+ case 'generate-sprite':
31
+ case 'generate-app-metadata':
32
+ case 'help':
33
+ case 'inject-config-app': {
34
+ const result = spawn.sync(
35
+ 'node',
36
+ nodeArgs
37
+ .concat(require.resolve('./scripts/' + script))
38
+ .concat(args.slice(scriptIndex + 1)),
39
+ { stdio: 'inherit' }
40
+ );
41
+ if (result.signal) {
42
+ if (result.signal === 'SIGKILL') {
43
+ console.log(
44
+ 'The build failed because the process exited too early. '+
45
+ 'This probably means the system ran out of memory or someone called ' +
46
+ '`kill -9` on the process.'
47
+ );
48
+ } else if(result.signal === 'SIGTERM') {
49
+ console.log(
50
+ 'The build failed because the process exited too early. ' +
51
+ 'Someone might have called `kill` or `killall`, or the system could ' +
52
+ 'be shutting down.'
53
+ )
54
+ }
55
+ process.exit(1);
56
+ }
57
+ process.exit(result.status);
58
+ break;
59
+ }
60
+ default:
61
+ console.log('Unknown script "' + script + '".');
62
+ break;
42
63
  }
@@ -0,0 +1,39 @@
1
+ const path = require('path');
2
+ const generators = require('../../lib/generators');
3
+ const config = require('../../lib/config');
4
+ const utils = require('../../lib/utils');
5
+
6
+ // fetching cli arguments
7
+ const args = utils.getArgs();
8
+
9
+ // Print header and version
10
+ utils.logBigTitle('eUI CLI');
11
+ utils.logAccent(` --- v${config.version} ---\n`);
12
+
13
+ // remapping config if passed as argument - automated mode
14
+ let inputConfig = config.parseInputConfig(args.config);
15
+
16
+ // Detecting targetPath and create it if present as argument - local and automated mode
17
+ let targetPath;
18
+
19
+ if (args.targetPath) {
20
+ targetPath = path.join(config.targetPath, args.targetPath);
21
+
22
+ if (!tools.isDirExists(targetPath)) {
23
+ utils.mkdir(targetPath);
24
+ }
25
+
26
+ // otherwise taking the default config targetPath defined
27
+ } else {
28
+ targetPath = config.targetPath;
29
+ }
30
+
31
+ if (args.v) {
32
+ console.info('Current eUI CLI version installed : ' + config.version);
33
+
34
+ } else {
35
+ return generators.appGenerate({
36
+ inputConfig: inputConfig,
37
+ targetPath: targetPath
38
+ });
39
+ }
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ const serve = require('../../lib/app-utils/serve');
4
+
5
+ Promise.resolve()
6
+ .then(() => {
7
+ return serve.run();
8
+ })
9
+ .catch((e) => {
10
+ console.error(e);
11
+ process.exit(1);
12
+ });
@@ -0,0 +1,41 @@
1
+ // TODO v21 - for openid config injection extracted from eUI tools
2
+
3
+ // 'use strict';
4
+
5
+ // const path = require('path');
6
+
7
+ // const tools = require('../tools');
8
+
9
+ // const injectionUtils = require('./injection/injection-utils');
10
+ // const translationUtils = require('./translations/translation-utils');
11
+
12
+ // module.exports.preBuild = (project, envTarget, build, configEnvTarget) => {
13
+ // return Promise.resolve()
14
+ // .then(() => {
15
+ // tools.logTitle('PRE-BUILD : preparing the project...');
16
+ // })
17
+
18
+ // // openId files replacement and app config injection
19
+ // .then(() => {
20
+ // return injectionUtils.openid.injectConfig(project, configEnvTarget);
21
+ // })
22
+
23
+ // .catch((e) => {
24
+ // throw e;
25
+ // })
26
+ // };
27
+
28
+ // module.exports.processSvgAssets = (project) => {
29
+ // return Promise.resolve()
30
+ // .then(() => {
31
+ // const svgsInPath = path.join(project.paths.rootPath, 'src', 'assets', 'svg');
32
+ // const svgsSpritePath = path.join(svgsInPath, sprites);
33
+ // const svgsSpriteFile = 'sprite.svg';
34
+
35
+ // return svgUtils.generateSvgsSprite(svgsInPath, svgsSpritePath, svgsSpriteFile);
36
+ // })
37
+
38
+ // .catch((e) => {
39
+ // throw e;
40
+ // });
41
+ // };
@@ -0,0 +1,76 @@
1
+ const path = require('path');
2
+ const childProcess = require('child_process');
3
+ const execSync = childProcess.execSync;
4
+
5
+ const utils = require('../utils');
6
+
7
+ module.exports.run = () => {
8
+
9
+ let { configuration, baseHref, servePath, host, proxyConfig, maxSpaceSize, port, disableHostCheck, open, debug, configEnvTarget, noLiveReload } = utils.getArgs();
10
+
11
+ const ng = path.resolve(process.cwd(), 'node_modules', '@angular', 'cli', 'bin', 'ng');
12
+
13
+ const prjName = 'app';
14
+
15
+ return Promise.resolve()
16
+ // .then(() => {
17
+ // return preBuildUtils.projects.preBuild(prj, configuration, false, configEnvTarget);
18
+ // })
19
+
20
+
21
+ // trigger ng serve with parameters provided
22
+ .then(() => {
23
+ utils.logTitle(`Serving application : ${prjName}...`);
24
+
25
+ let args;
26
+
27
+ if (maxSpaceSize) {
28
+ args = ['--max_old_space_size=8192', ng, 'serve', prjName];
29
+ } else {
30
+ args = [ng, 'serve', prjName];
31
+ }
32
+
33
+ if (configuration) {
34
+ args.push(`--configuration=${configuration}`);
35
+ }
36
+
37
+ if (proxyConfig) {
38
+ args.push(`--proxy-config=${proxyConfig}`);
39
+ }
40
+
41
+ if (baseHref) {
42
+ args.push(`--base-href=${baseHref}`);
43
+ }
44
+
45
+ if (servePath) {
46
+ args.push(`--serve-path=${servePath}`);
47
+ }
48
+
49
+ if (host) {
50
+ args.push(`--host=${host}`);
51
+ }
52
+
53
+ if (port) {
54
+ args.push(`--port=${port}`);
55
+ }
56
+
57
+ if (disableHostCheck) {
58
+ args.push(`--disable-host-check`);
59
+ }
60
+
61
+ if (!(open === 'false')) {
62
+ args.push('--open=true');
63
+ }
64
+
65
+ if (noLiveReload) {
66
+ args.push('--live-reload=false');
67
+ }
68
+
69
+ utils.logInfo(`ng serve with args ${args}`);
70
+
71
+ return execSync(`node ${args.join(' ')}`, { cwd: process.cwd(), stdio: 'inherit' });
72
+ })
73
+ .catch((e) => {
74
+ throw e;
75
+ });
76
+ }
package/lib/build.js CHANGED
@@ -28,8 +28,6 @@ const build = (cliConfig, targetPath) => {
28
28
  if (!utils.isDirEmpty(target)) {
29
29
  utils.logError(`Target directory : ${target} is not empty, execute eUI CLI in a blank directory... quitting`);
30
30
  throw new Error('DIR_NOT_EMPTY');
31
- } else {
32
- return utils.rimraf(`${target}/**/*`);
33
31
  }
34
32
  })
35
33
 
@@ -83,32 +81,6 @@ const build = (cliConfig, targetPath) => {
83
81
  throw e;
84
82
  })
85
83
  }
86
-
87
-
88
- // BUILD symfony
89
- if (appType === 'web-symfony') {
90
-
91
- return Promise.resolve()
92
- .then(() => {
93
- console.log('--cloning eui php starter repository')
94
- execSync(`git clone https://${config.webPhpStarterRepo} ${targetPath}`);
95
- })
96
- .then(() => {
97
- console.log('--building web-symfony');
98
- const angularPath = utils.getAngularPath(targetPath, appName, appType, artifactId);
99
- return copyAngular(angularPath, cliConfig, false);
100
- })
101
- .then(() => {
102
- execSync(`npm run init`, { cwd: path.join(targetPath, 'server'), stdio: "inherit" });
103
- })
104
- .catch((e) => {
105
- throw e;
106
- })
107
- .finally(() => {
108
- return utils.rimraf(`${targetPath}/.git`);
109
- })
110
- }
111
-
112
84
  })
113
85
  .catch((e) => {
114
86
  console.log(e);
package/lib/cli.js CHANGED
@@ -35,7 +35,6 @@ module.exports.start = (options) => {
35
35
  { name: 'eUI Angular - Mobile Ionic', value: 'mobile' },
36
36
  { name: 'eUI Angular + Spring Boot web module - JDK + Maven required !!!', value: 'web-spring-boot' },
37
37
  { name: 'eUI Angular + Maven web module (JEE Spring maven web module) - JDK + Maven required !!!', value: 'web-maven' },
38
- { name: 'eUI Angular + PHP/Symfony starter - PHP7 and composer required !!!', value: 'web-symfony' },
39
38
  ],
40
39
  default: 0,
41
40
  validate: function (value) {
package/lib/install.js CHANGED
@@ -29,9 +29,6 @@ const install = (cliConfig, targetPath) => {
29
29
  console.log('*****************************************************');
30
30
 
31
31
  return Promise.resolve()
32
- .then(() => {
33
- return tools.remove(path.join(wd, 'yarn.lock'));
34
- })
35
32
  .then(() => {
36
33
  return execSync("yarn", { cwd: wd, stdio: "inherit" });
37
34
  })
@@ -46,7 +46,6 @@
46
46
  "styles": [
47
47
  "node_modules/@eui/styles/dist/eui.css",
48
48
  "node_modules/@eui/styles/dist/eui-utilities.css",
49
- "node_modules/@eui/styles/dist/eui-theme-eui-legacy.css",
50
49
  "src/styles.scss"
51
50
  ]
52
51
  },
@@ -143,11 +142,6 @@
143
142
  "glob": "**/*",
144
143
  "input": "node_modules/@eui/core/assets/",
145
144
  "output": "./assets"
146
- },
147
- {
148
- "glob": "**/*",
149
- "input": "node_modules/@eui/styles/dist/assets/",
150
- "output": "./assets"
151
145
  }
152
146
  ]
153
147
  }
@@ -1,38 +1,35 @@
1
1
  {
2
2
  "name": "eui-angular-app",
3
- "version": "21.0.0-alpha.23",
3
+ "version": "21.0.0-alpha.25",
4
4
  "license": "EUPL-1.1",
5
5
  "scripts": {
6
6
  "ng": "ng",
7
7
  "start-mock-server": "nodemon --watch ./mock ./mock/server.js",
8
- "start-serve": "eui-scripts serve-app --configuration=proxy-mock",
8
+ "start-serve": "eui-cli serve-app --configuration=proxy-mock",
9
9
  "start": "npm-run-all --parallel start-mock-server start-serve",
10
- "start-proxy": "eui-scripts serve-app --configuration=proxy",
11
- "start-local": "eui-scripts serve-app",
12
- "build": "eui-scripts build-app",
13
- "build-dev": "eui-scripts build-app --configuration=development --configEnvTarget=dev",
14
- "build-prod": "eui-scripts build-app --configuration=production-optimized --configEnvTarget=prod",
15
- "build-prod-skip-test": "eui-scripts build-app --configuration=production-optimized --configEnvTarget=prod --skipTest",
16
- "build-prod-stats": "eui-scripts build-app --configuration=production-optimized --configEnvTarget=prod --statsJson",
17
- "app:build": "eui-scripts build-app",
18
- "app:inject-config": "eui-scripts inject-config-app",
19
- "generate-changelog": "eui-scripts generate-changelog",
20
- "generate-sprite": "eui-scripts generate-sprite"
10
+ "start-proxy": "eui-cli serve-app --configuration=proxy",
11
+ "start-local": "eui-cli serve-app",
12
+ "build": "eui-cli build-app",
13
+ "build-dev": "eui-cli build-app --configuration=development --configEnvTarget=dev",
14
+ "build-prod": "eui-cli build-app --configuration=production-optimized --configEnvTarget=prod",
15
+ "build-prod-skip-test": "eui-cli build-app --configuration=production-optimized --configEnvTarget=prod --skipTest",
16
+ "build-prod-stats": "eui-cli build-app --configuration=production-optimized --configEnvTarget=prod --statsJson",
17
+ "app:build": "eui-cli build-app",
18
+ "app:inject-config": "eui-cli inject-config-app",
19
+ "generate-changelog": "eui-cli generate-changelog",
20
+ "generate-sprite": "eui-cli generate-sprite"
21
21
  },
22
22
  "private": true,
23
23
  "dependencies": {
24
- "@eui/deps-base": "21.0.0-alpha.23"
24
+ "@eui/deps-base": "21.0.0-alpha.25"
25
25
  },
26
- "resolutions": {
27
- "js-yaml": ">=3.13.1",
28
- "pdfjs-dist": "4.10.38",
29
- "tar": ">=6.2.1",
30
- "katex": ">=0.16.10",
31
- "follow-redirects": ">=1.15.4",
32
- "word-wrap": ">=1.2.4",
33
- "postcss": ">=8.4.31",
34
- "semver": ">=7.5.2",
35
- "express": "4.21.2",
36
- "path-to-regexp": "1.9.0"
37
- }
26
+ "devDependencies": {
27
+ "npm-run-all": "4.1.5",
28
+ "json-server": "1.0.0-beta.3",
29
+ "nodemon": "2.0.22",
30
+ "lowdb": "1.0.0",
31
+ "body-parser": "1.20.3",
32
+ "express": "4.21.2"
33
+ },
34
+ "resolutions": {}
38
35
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eui-angular-app",
3
- "version": "21.0.0-alpha.23",
3
+ "version": "21.0.0-alpha.25",
4
4
  "license": "EUPL-1.1",
5
5
  "scripts": {
6
6
  "ng": "ng",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eui-angular-app",
3
- "version": "21.0.0-alpha.23",
3
+ "version": "21.0.0-alpha.24",
4
4
  "license": "EUPL-1.1",
5
5
  "description": "eUI JEE Symfony app scripts",
6
6
  "scripts": {
@@ -18,6 +18,6 @@
18
18
  },
19
19
  "private": true,
20
20
  "dependencies": {
21
- "@eui/deps-base": "21.0.0-alpha.23"
21
+ "@eui/deps-base": "21.0.0-alpha.24"
22
22
  }
23
23
  }
package/lib/utils.js CHANGED
@@ -169,18 +169,8 @@ module.exports.move = (from, to) => {
169
169
  fse.moveSync(from, to, );
170
170
  }
171
171
 
172
- module.exports.rimraf = (inputPath) => {
173
- this.logInfo(`Removing ${inputPath}...`);
174
- let exec = path.resolve(process.cwd(), 'node_modules', 'rimraf', 'bin.js');
175
- if (!isFileExists(exec)) {
176
- // special location when used within eUI CLI
177
- exec = path.resolve(__dirname, '../../../..', 'rimraf', 'bin.js');
178
- }
179
- try {
180
- execSync(`node ${exec} ${inputPath}`, { cwd: process.cwd(), stdio: 'inherit' });
181
- } catch(e) {
182
- console.log(e);
183
- }
172
+ module.exports.remove = (path) => {
173
+ fse.removeSync(path);
184
174
  }
185
175
 
186
176
  const log = (msg, type) => {
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@eui/cli",
3
- "version": "21.0.0-alpha.23",
3
+ "version": "21.0.0-alpha.25",
4
4
  "tag": "next",
5
5
  "license": "EUPL-1.1",
6
- "description": "eUI CLI app generator",
6
+ "description": "eUI CLI app generator & tools",
7
7
  "bin": {
8
8
  "eui-cli": "bin/eui-cli.js"
9
9
  },
@@ -17,8 +17,8 @@
17
17
  "inquirer": "6.5.0",
18
18
  "yargs": "17.7.2",
19
19
  "fs-extra": "9.0.0",
20
- "rimraf": "3.0.2",
21
- "glob": "7.2.3"
20
+ "glob": "7.2.3",
21
+ "cross-spawn": "7.0.6"
22
22
  },
23
23
  "preferGlobal": true,
24
24
  "homepage": "https://eui.ecdevops.eu",
@@ -1,8 +0,0 @@
1
- {
2
- "projects": {
3
- "app": {
4
- "name": "app",
5
- "folder": "."
6
- }
7
- }
8
- }