gamelet-cli 0.7.12 → 0.7.13

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 (49) hide show
  1. package/assets/package.json.twig +3 -3
  2. package/assets/tsconfig.json.twig +1 -1
  3. package/build/package.json +67 -67
  4. package/build/src/gamelet/download.js +773 -737
  5. package/build/src/gamelet/merges.js +181 -179
  6. package/build/src/gamelet/prepare.js +276 -277
  7. package/build/src/gamelet/upload.js +280 -279
  8. package/build/src/index.js +86 -86
  9. package/build/src/server/Constant.js +9 -9
  10. package/build/src/server/entities/Client.js +78 -78
  11. package/build/src/server/entities/ClientOwner.js +67 -67
  12. package/build/src/server/entities/ClientProject.js +84 -84
  13. package/build/src/server/entities/Gameroom.js +89 -89
  14. package/build/src/server/entities/GameroomBase.js +276 -276
  15. package/build/src/server/entities/Gamezone.js +73 -73
  16. package/build/src/server/entities/ListFilter.js +193 -193
  17. package/build/src/server/entities/Monitor.js +94 -94
  18. package/build/src/server/entities/Player.js +140 -140
  19. package/build/src/server/managers/ApiManager.js +75 -75
  20. package/build/src/server/managers/ClientManager.js +64 -64
  21. package/build/src/server/managers/Database.js +627 -627
  22. package/build/src/server/managers/GameroomManager.js +392 -392
  23. package/build/src/server/managers/ManagerBase.js +17 -17
  24. package/build/src/server/managers/MonitorManager.js +73 -73
  25. package/build/src/server/managers/PlayerManager.js +108 -108
  26. package/build/src/server/managers/SocketManager.js +60 -60
  27. package/build/src/server/managers/UserManager.js +58 -58
  28. package/build/src/server/messages/Message.js +143 -143
  29. package/build/src/server/server.js +112 -113
  30. package/build/src/server/services/ServiceBase.js +25 -25
  31. package/build/src/server/services/clientService.js +23 -23
  32. package/build/src/server/services/gameroomService.js +121 -121
  33. package/build/src/server/services/gltserver.service.js +23 -23
  34. package/build/src/server/services/playerService.js +32 -32
  35. package/build/src/server/startServer.js +32 -33
  36. package/build/src/server/types/BadgeStatus.js +25 -25
  37. package/build/src/server/types/OrderType.js +38 -38
  38. package/build/src/server/types/SubmitType.js +24 -24
  39. package/build/src/server/types/TimeRange.js +26 -26
  40. package/build/src/server/utils/ArrayUtil.js +126 -126
  41. package/build/src/server/utils/IntUtil.js +9 -9
  42. package/build/src/server/utils/ObjectUtil.js +191 -191
  43. package/build/src/server/utils/StringUtil.js +37 -37
  44. package/build/src/utils/cli.js +53 -53
  45. package/build/src/utils/file.js +350 -337
  46. package/build/src/utils/init.js +57 -42
  47. package/build/src/utils/log.js +18 -17
  48. package/build/src/utils/net.js +43 -39
  49. package/package.json +2 -2
@@ -1,737 +1,773 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.download = void 0;
7
- const file_1 = require("../utils/file");
8
- const net_1 = require("../utils/net");
9
- const merges_1 = require("./merges");
10
- const cli_progress_1 = __importDefault(require("cli-progress"));
11
- const inquirer_1 = __importDefault(require("inquirer"));
12
- const ArrayUtil_1 = require("../server/utils/ArrayUtil");
13
- const tempFolder = '/.temp';
14
- const cliFolder = __dirname + '/../../..';
15
- const dtsPrepend = "// @ts-nocheck\n";
16
- exports.download = ({ projectCode, folder, token, sourceHandler, targetItems, force, debug }) => {
17
- let fullProject;
18
- let engineInfo;
19
- net_1.apiSetToken(token);
20
- file_1.setFileCacheFolder(folder);
21
- return Promise.resolve()
22
- .then(() => {
23
- if (!projectCode) {
24
- return Promise.reject('Please specify a project code that is created on code.gamelet.com');
25
- }
26
- if (!folder) {
27
- return Promise.reject('Please specify a folder to install');
28
- }
29
- if (!token) {
30
- return Promise.reject('No valid token is provided');
31
- }
32
- return Promise.resolve();
33
- })
34
- .then(() => file_1.isEmptyFolder(folder))
35
- .then(empty => {
36
- if (sourceHandler == 'download') {
37
- if (debug) {
38
- // just do it
39
- }
40
- else if (!empty) {
41
- return inquirer_1.default.prompt([
42
- {
43
- type: 'list',
44
- name: 'confirm',
45
- message: 'The folder is not empty!',
46
- choices: [
47
- 'Quit',
48
- 'Force downloading project into this folder'
49
- ]
50
- }
51
- ])
52
- .then(choice => {
53
- if (choice.confirm == 'Quit') {
54
- return Promise.reject('Quit: The folder is not empty.');
55
- }
56
- else {
57
- return Promise.resolve();
58
- }
59
- });
60
- }
61
- else {
62
- console.log(`Create workspace in ${folder}/ ...`);
63
- }
64
- }
65
- else {
66
- console.log('sync workspace from CG ...');
67
- }
68
- })
69
- .then(() => file_1.rmdir(`${folder}${tempFolder}`).catch(_e => { }))
70
- .then(() => Promise.all([
71
- getEngineInfo().then(info => (engineInfo = info)),
72
- net_1.apiGet(`/get/full_project/${projectCode}`)
73
- .then(json => fullProject = json),
74
- ]))
75
- .then(() => updatePackageJsons(fullProject, folder))
76
- .then(() => saveToken(fullProject, token, folder))
77
- .then(() => secureSourcesBase(fullProject, folder, token))
78
- .then(() => includeItem(targetItems, 'source') && downloadSources(fullProject, folder, token, sourceHandler, force))
79
- .then(() => includeItem(targetItems, 'resource') && downloadResources(fullProject, folder, 3))
80
- .then(() => (includeItem(targetItems, 'source') || includeItem(targetItems, 'resource')) &&
81
- downloadStaticFiles(engineInfo, folder)
82
- .then(() => adjustStaticFiles(fullProject, folder)))
83
- .then(() => includeItem(targetItems, 'score') && downloadScoreModes(fullProject, folder))
84
- .then(() => includeItem(targetItems, 'item') && downloadItems(fullProject, folder))
85
- .then(() => includeItem(targetItems, 'badge') && downloadBadges(fullProject, folder))
86
- .then(() => file_1.wait(300))
87
- .then(() => file_1.rmdir(`${folder}${tempFolder}`).catch(_e => { }))
88
- .then(() => {
89
- console.log();
90
- console.log('done');
91
- })
92
- .catch(err => {
93
- console.log();
94
- console.error(err);
95
- })
96
- .then(() => console.log());
97
- };
98
- function secureSourcesBase(fullProject, folder, token) {
99
- let basePath = getSourceBasePath(folder);
100
- if (!file_1.fileExists(basePath)) {
101
- let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
102
- console.log('Missing sources.base, downloading from CG ...');
103
- let tempName = Date.now().toString(36) + '.' + Math.round(10 + Math.random() * 1000000).toString(36);
104
- return file_1.downloadFile(net_1.cgUrl(`/download/${fullProject.project.code}?token=${token}`), basePath, progressBar, {
105
- tempFile: `${folder}${tempFolder}/${tempName}.zip`,
106
- noCache: true,
107
- })
108
- .then(() => progressBar && progressBar.stop());
109
- }
110
- else {
111
- return Promise.resolve();
112
- }
113
- }
114
- function includeItem(targetItems, item) {
115
- return !targetItems || targetItems.includes(item);
116
- }
117
- function saveToken(fullProject, token, folder) {
118
- let filename = `${fullProject.project.code.toLowerCase()}.token`;
119
- let fullpath = `${folder}/.cg/${filename}`;
120
- return checkSavedToken(fullpath, token)
121
- .then(saved => {
122
- if (!saved) {
123
- console.log(`Building workspace: saving access token ...`);
124
- return file_1.saveData(fullpath, token)
125
- .then(() => deleteOldTokens(folder, filename))
126
- .then(() => { });
127
- }
128
- else {
129
- return Promise.resolve();
130
- }
131
- });
132
- }
133
- function deleteOldTokens(folder, currentTokenFile) {
134
- let path = `${folder}/.cg`;
135
- return file_1.listFiles(path)
136
- .then(files => {
137
- files = files.filter(f => f != currentTokenFile && f.toLowerCase().endsWith('.token'));
138
- return Promise.all(files.map(f => file_1.unlink(`${path}/${f}`)));
139
- });
140
- }
141
- function checkSavedToken(filename, token) {
142
- if (file_1.fileExists(filename)) {
143
- return file_1.getFileString(filename, true)
144
- .then(savedToken => token == savedToken);
145
- }
146
- else {
147
- return Promise.resolve(false);
148
- }
149
- }
150
- function getEngineInfo() {
151
- return net_1.apiGet(`/get/engine_info`);
152
- }
153
- function updatePackageJsons(fullProject, folder) {
154
- console.log(`Building workspace: update package configs ...`);
155
- return Promise.all([
156
- createPackageJson(fullProject.project, folder),
157
- createTsconfig(fullProject.project, folder),
158
- file_1.copyFile(cliFolder + '/assets/gitignore.txt', `${folder}/.gitignore`),
159
- file_1.copyFile(cliFolder + '/assets/common.d.ts', `${folder}/typings/common.d.ts`),
160
- mergeLaunchJson(folder),
161
- ]);
162
- }
163
- function mergeLaunchJson(folder) {
164
- let srcFile = cliFolder + '/assets/launch.json';
165
- let destFile = `${folder}/.vscode/launch.json`;
166
- if (file_1.fileExists(destFile)) {
167
- return Promise.all([file_1.getFileJson(srcFile, true), file_1.getFileJson(destFile, true)])
168
- .then(results => {
169
- let needSave = false;
170
- let srcJson = results[0];
171
- let destJson = results[1];
172
- srcJson.configurations = srcJson.configurations || [];
173
- srcJson.configurations.forEach(config => {
174
- let search = destJson.configurations.find(c => c.name == config.name);
175
- if (!search) {
176
- destJson.configurations.push(config);
177
- needSave = true;
178
- }
179
- });
180
- if (needSave) {
181
- return file_1.saveData(destFile, JSON.stringify(destJson, null, 4));
182
- }
183
- else {
184
- return Promise.resolve();
185
- }
186
- })
187
- .catch(_e => {
188
- return file_1.copyFile(srcFile, destFile);
189
- });
190
- }
191
- else {
192
- return file_1.copyFile(srcFile, destFile);
193
- }
194
- }
195
- function createPackageJson(projectJson, folder) {
196
- let lastBuildVer = projectJson.lastBuildVer || '0.0.0';
197
- let verArr = lastBuildVer.split('.').map(str => Number(str));
198
- verArr[2]++;
199
- let nextVer = verArr.join('.');
200
- return file_1.renderTwig(cliFolder + '/assets/package.json.twig', {
201
- CG_URL: net_1.cgUrl(''),
202
- project: projectJson,
203
- version: nextVer,
204
- })
205
- .then(content => file_1.saveData(folder + '/package.json', content));
206
- }
207
- function createTsconfig(projectJson, folder) {
208
- return file_1.renderTwig(cliFolder + '/assets/tsconfig.json.twig', {
209
- CG_URL: net_1.cgUrl(''),
210
- project: projectJson,
211
- })
212
- .then(content => file_1.saveData(folder + '/tsconfig.json', content));
213
- }
214
- let sourcesProcessing;
215
- function downloadSources(fullProject, folder, token, sourceHandler, force) {
216
- if (sourceHandler == 'skip') {
217
- return Promise.resolve();
218
- }
219
- console.log(`Building workspace: download sources ...`);
220
- return file_1.isGitCommitted(folder)
221
- .then(committed => {
222
- if (!committed && !force) {
223
- return Promise.reject('Please commit your current sources first.');
224
- }
225
- else {
226
- return Promise.resolve();
227
- }
228
- })
229
- .then(() => {
230
- let zipFilename = folder + tempFolder + '/sources.zip';
231
- let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
232
- sourcesProcessing = [];
233
- return file_1.downloadFile(net_1.cgUrl(`/download/${fullProject.project.code}?token=${token}`), zipFilename, progressBar, { noCache: true })
234
- .then(() => {
235
- progressBar.stop();
236
- return file_1.getFileZip(zipFilename);
237
- })
238
- .then(jszip => {
239
- if (sourceHandler == 'merge') {
240
- return mergeSources(jszip, folder);
241
- }
242
- else {
243
- return overwriteSources(jszip, folder);
244
- }
245
- })
246
- .then(result => result && file_1.moveFile(zipFilename, getSourceBasePath(folder)));
247
- });
248
- }
249
- function getSourceBasePath(folder) {
250
- return `${folder}/.cg/sources.base`;
251
- }
252
- function overwriteSources(jszip, folder) {
253
- let saveSrcFiles = [];
254
- let progressBar = new cli_progress_1.default.SingleBar({
255
- format: ` {bar} {percentage}% | Overwriting ({value}/{total})`
256
- }, cli_progress_1.default.Presets.shades_classic);
257
- for (let filename in jszip.files) {
258
- if (filename.startsWith('src/')) {
259
- saveSrcFiles.push(saveSrcFile(jszip.file(filename), folder, progressBar));
260
- }
261
- }
262
- progressBar.start(saveSrcFiles.length, 0);
263
- return Promise.all(saveSrcFiles)
264
- .then(() => {
265
- progressBar && progressBar.stop();
266
- return true;
267
- });
268
- }
269
- function saveSrcFile(file, dest, progressBar) {
270
- if (sourcesProcessing.length > 49) {
271
- return file_1.wait(10).then(() => saveSrcFile(file, dest, progressBar));
272
- }
273
- sourcesProcessing.push(file);
274
- return file.async('string')
275
- .then(content => {
276
- return file_1.saveData(dest + '/' + file.name, content);
277
- })
278
- .then(() => {
279
- progressBar && progressBar.increment(1);
280
- let index = sourcesProcessing.indexOf(file);
281
- sourcesProcessing.splice(index, 1);
282
- });
283
- }
284
- function mergeSources(jszip, folder) {
285
- let basezip = getSourceBasePath(folder);
286
- if (!file_1.fileExists(basezip)) {
287
- return Promise.reject('Cannot merge: source base missing.');
288
- }
289
- return file_1.getFileZip(basezip)
290
- .then(basezip => {
291
- let saveSrcFiles = [];
292
- let progressBar = new cli_progress_1.default.SingleBar({
293
- format: ` {bar} {percentage}% | Merging ({value}/{total})`
294
- }, cli_progress_1.default.Presets.shades_classic);
295
- for (let filename in jszip.files) {
296
- if (filename.startsWith('src/')) {
297
- saveSrcFiles.push(mergeSrcFile(jszip.file(filename), basezip.file(filename), folder, progressBar));
298
- }
299
- }
300
- return Promise.all(saveSrcFiles)
301
- //.then(results => !results.find(result => !result))
302
- .then(results => {
303
- progressBar && progressBar.stop();
304
- results.filter(result => result.name == 'deleted').forEach(result => {
305
- console.log(`Source deleted: ${result.filename}`);
306
- });
307
- results.filter(result => result.name == 'added').forEach(result => {
308
- console.log(`Source added: ${result.filename}`);
309
- });
310
- return true;
311
- });
312
- });
313
- }
314
- function mergeSrcFile(file, base, folder, progressBar) {
315
- if (sourcesProcessing.length > 19) {
316
- return file_1.wait(30).then(() => mergeSrcFile(file, base, folder, progressBar));
317
- }
318
- sourcesProcessing.push(file);
319
- return Promise.all([fileToText(file), fileToText(base)])
320
- .then(contents => {
321
- return merges_1.sourceMerge(file.name, contents[0], contents[1], folder);
322
- })
323
- .then(result => {
324
- progressBar && progressBar.increment(1);
325
- let index = sourcesProcessing.indexOf(file);
326
- sourcesProcessing.splice(index, 1);
327
- return result;
328
- });
329
- }
330
- function fileToText(file) {
331
- if (file) {
332
- return file.async('string');
333
- }
334
- else {
335
- return Promise.resolve(null);
336
- }
337
- }
338
- function isLibArchive(resource, file) {
339
- return resource.type.startsWith('build') && file.endsWith('archive.zip');
340
- }
341
- let resourceTotalBar;
342
- let resourceBars;
343
- function addResourceProgress() {
344
- resourceTotalBar && resourceTotalBar.increment(1);
345
- }
346
- function downloadResources(fullProject, folder, concurrent) {
347
- console.log(`Building workspace: download resources ...`);
348
- return Promise.resolve()
349
- .then(() => file_1.listFiles(`${folder}/resource`))
350
- .then(oldDirs => {
351
- let pack = fullProject.resourcePack;
352
- let resToLoad = [];
353
- let resIds = [];
354
- for (let alias in pack.aliasMap) {
355
- let resourceInfo = pack.aliasMap[alias];
356
- let resource = pack.resourceMap[resourceInfo.resourceId];
357
- resIds.push(resourceInfo.resourceId);
358
- for (let file of resource.meta.files) {
359
- let info = {
360
- file: file,
361
- resource: resource,
362
- alias: alias,
363
- };
364
- if (file.endsWith('.d.ts') || !isLibArchive(resource, file)) {
365
- resToLoad.push(info);
366
- }
367
- }
368
- let oldDirIndex = oldDirs.indexOf(resource.id.toString(36));
369
- if (oldDirIndex != -1) {
370
- oldDirs.splice(oldDirIndex, 1);
371
- }
372
- }
373
- resourceBars = new cli_progress_1.default.MultiBar({
374
- clearOnComplete: false,
375
- hideCursor: true,
376
- format: ` {bar} {percentage}% | {file} ({value}/{total})`
377
- }, cli_progress_1.default.Presets.shades_classic);
378
- let collectInfo = {};
379
- resourceTotalBar = resourceBars.create(resToLoad.length, 0, { file: 'Total' });
380
- return startDownloadResources(collectInfo, resToLoad, folder, concurrent)
381
- .then(() => resourceBars && resourceBars.stop())
382
- .then(() => logDownloadResourceResult(collectInfo))
383
- .then(() => deleteResDirs(folder, oldDirs))
384
- .then(() => deleteOldDtses(folder, resIds));
385
- });
386
- }
387
- function logDownloadResourceResult(collectInfo) {
388
- let list = ArrayUtil_1.ArrayUtil.listValuesOfObject(collectInfo);
389
- let files = 0;
390
- for (let info of list) {
391
- files += info.files.length;
392
- }
393
- console.log(` ${list.length} resource(s) added (${files} file(s))`);
394
- }
395
- function deleteOldDtses(folder, resIds) {
396
- return file_1.listFiles(`${folder}/typings`)
397
- .then(files => {
398
- let filesToDelete = [];
399
- files.forEach(f => {
400
- let search = f.match(/\.cg_([a-z0-9]+)\.d\.ts$/);
401
- if (search) {
402
- let resId = parseInt(search[1], 36);
403
- if (!resIds.includes(resId)) {
404
- filesToDelete.push(f);
405
- }
406
- }
407
- });
408
- sourcesProcessing = [];
409
- return Promise.all(filesToDelete.map(f => deleteFile(`${folder}/typings/${f}`)))
410
- .then(() => {
411
- console.log(` ${filesToDelete.length} old Dts removed`);
412
- });
413
- });
414
- }
415
- function deleteFile(file) {
416
- if (sourcesProcessing.length > 19) {
417
- return file_1.wait(30).then(() => deleteFile(file));
418
- }
419
- sourcesProcessing.push(file);
420
- return file_1.unlink(file)
421
- .then(() => {
422
- let index = sourcesProcessing.indexOf(file);
423
- sourcesProcessing.splice(index, 1);
424
- });
425
- }
426
- function deleteResDirs(folder, dirs) {
427
- sourcesProcessing = [];
428
- return Promise.all(dirs.map(dir => deleteResDir(folder, dir)))
429
- .then(() => console.log(` ${dirs.length} old resource(s) removed`));
430
- }
431
- function deleteResDir(folder, dir) {
432
- if (sourcesProcessing.length > 19) {
433
- return file_1.wait(30).then(() => deleteResDir(dir));
434
- }
435
- sourcesProcessing.push(dir);
436
- return file_1.rmdir(`${folder}/resource/${dir}`)
437
- .then(() => {
438
- let index = sourcesProcessing.indexOf(dir);
439
- sourcesProcessing.splice(index, 1);
440
- });
441
- }
442
- function startDownloadResources(collectInfo, resToLoad, folder, concurrent) {
443
- return Promise.all(resToLoad.map(info => {
444
- return downloadResource(collectInfo, info, folder, concurrent);
445
- }));
446
- }
447
- function getResourceFolder(folder, resource) {
448
- return `${folder}/resource/${resource.id.toString(36)}`;
449
- }
450
- function downloadResource(collectInfo, info, folder, concurrent) {
451
- if (resourceBars.bars.length > concurrent) {
452
- return file_1.wait(100).then(() => downloadResource(collectInfo, info, folder, concurrent));
453
- }
454
- let resource = info.resource;
455
- let file = info.file;
456
- let alias = info.alias;
457
- let url = net_1.cgUrl(`${resource.url}${file}`);
458
- let dest = getResourceFolder(folder, resource) + `/${file}`;
459
- let dispName = alias;
460
- let isDts = file.endsWith('.d.ts');
461
- let modifyContent = null;
462
- if (isDts) {
463
- let destFile = file.split('/').pop().replace(/\.d\.ts$/, `.cg_${resource.id.toString(36)}.d.ts`);
464
- dest = `${folder}/typings/${alias}_${destFile}`;
465
- dispName += '.d.ts';
466
- modifyContent = (content) => {
467
- if (!content.startsWith(dtsPrepend)) {
468
- content = dtsPrepend + content;
469
- }
470
- return content;
471
- };
472
- }
473
- let resourceBar = resourceBars.create(100, 0, { file: dispName });
474
- let tempName = Date.now().toString(36) + '.' + Math.round(10 + Math.random() * 1000000).toString(36);
475
- let tempFile = `${folder}${tempFolder}/${tempName}`;
476
- return file_1.downloadFile(url, dest, resourceBar, {
477
- dispName: dispName,
478
- tempFile: tempFile,
479
- appendSize: isDts ? dtsPrepend.length : 0,
480
- modifyContent: modifyContent,
481
- })
482
- .then(realDownload => {
483
- if (realDownload) {
484
- let resourceInfo = collectInfo[resource.id];
485
- if (!resourceInfo) {
486
- collectInfo[resource.id] = {
487
- resource: resource,
488
- files: [],
489
- };
490
- }
491
- collectInfo[resource.id].files.push(file);
492
- }
493
- addResourceProgress();
494
- resourceBars.remove(resourceBar);
495
- });
496
- }
497
- let staticBar;
498
- function downloadStaticFiles(engineInfo, folder) {
499
- console.log(`Building workspace: download static files ...`);
500
- let version = 'min';
501
- //version = 'debug' + parseInt(engineInfo.version, 36).toString(24);
502
- let tempStaticFolder = `${folder}/.cg/static`;
503
- let promises = [
504
- downloadStaticFile(`${engineInfo.url}static/css/preload.css`, `${folder}/static/css/preload.css`),
505
- downloadStaticFile(`${engineInfo.url}static/img/logo_42.png`, `${folder}/static/img/logo_42.png`),
506
- downloadStaticFile(`https://cdnjs.cloudflare.com/ajax/libs/pace/1.0.2/pace.min.js`, `${folder}/static/js/pace.min.js`),
507
- downloadStaticFile(`${engineInfo.url}static/js/index.offline.html`, `${tempStaticFolder}/index.html`),
508
- downloadStaticFile(`${engineInfo.url}static/js/systemjs-starter.offline.${version}.js`, `${tempStaticFolder}/systemjs-starter.offline.js`),
509
- downloadStaticFile(`${engineInfo.url}static/js/systemjs-starter.offline-dev.${version}.js`, `${tempStaticFolder}/systemjs-starter.offline-dev.js`),
510
- downloadStaticFile(`${engineInfo.url}static/js/boot.prod.${version}.js`, `${tempStaticFolder}/boot.prod.js`),
511
- ];
512
- staticBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
513
- staticBar.start(promises.length, 0);
514
- return Promise.all(promises)
515
- .then(() => staticBar && staticBar.stop());
516
- }
517
- function downloadStaticFile(url, dest) {
518
- return file_1.downloadFile(url, dest)
519
- .then(() => staticBar && staticBar.increment(1));
520
- }
521
- function adjustStaticFiles(fullProject, folder) {
522
- return Promise.all([
523
- adjustIndexHtml(fullProject, folder),
524
- generateScriptJs(fullProject, folder),
525
- ])
526
- .catch(err => {
527
- console.error(err);
528
- });
529
- }
530
- function adjustIndexHtml(fullProject, folder) {
531
- let project = fullProject.project;
532
- let filename = `${folder}/.cg/static/index.html`;
533
- return file_1.getFileString(filename)
534
- .then(text => {
535
- text = text.replace('%appName%', project.name);
536
- text = text.replace('</body>', ` <script src="output/build.js" type="text/javascript"></script>\n</body>`);
537
- return file_1.saveData(`${folder}/index.html`, text);
538
- });
539
- }
540
- function generateScriptJs(fullProject, folder) {
541
- let project = fullProject.project;
542
- let staticCacheFolder = `${folder}/.cg/static`;
543
- let starterFilename = `${staticCacheFolder}/systemjs-starter.offline.js`;
544
- let booterFilename = `${staticCacheFolder}/boot.prod.js`;
545
- let devFilename = `${staticCacheFolder}/systemjs-starter.offline-dev.js`;
546
- let starterScripts;
547
- let scripts = '';
548
- let appendScripts = (_scripts, text) => {
549
- if (_scripts && !_scripts.endsWith(';')) {
550
- _scripts += ';';
551
- }
552
- return _scripts + text.trim();
553
- };
554
- return net_1.apiGet(`/get/offlineDevRenderParameters/${project.code}`)
555
- .then(renderParams => {
556
- return Promise.resolve()
557
- .then(() => {
558
- return file_1.getFileString(starterFilename)
559
- .then(content => {
560
- starterScripts = content.replace('"%CG_CFG%"', JSON.stringify({ data: renderParams }));
561
- });
562
- })
563
- .then(() => {
564
- return file_1.getFileString(devFilename)
565
- .then(content => {
566
- scripts = appendScripts(scripts, content);
567
- });
568
- })
569
- .then(() => {
570
- return file_1.getFileString(booterFilename)
571
- .then(content => {
572
- scripts = appendScripts(scripts, content);
573
- });
574
- })
575
- .then(() => {
576
- return net_1.apiGet(`/list/resources/dependency/project/${project.code}`);
577
- })
578
- .then(data => {
579
- let libs = data.list;
580
- let libsPack = {};
581
- return Promise.all(libs.map(lib => prepareLibContent(lib, libsPack, folder)))
582
- .then(() => {
583
- let systemBootFuncs = libs.map(lib => `function(){${libsPack[lib.id]};CgLibs.bootModule('${lib.meta.pcode}')}`);
584
- systemBootFuncs.unshift(`function(){CgLibs.initBoots([${libs.map(lib => JSON.stringify(lib)).join(',')}])}`);
585
- scripts = appendScripts(scripts, 'var __cgSystemBoots=[' + systemBootFuncs.join(',') + '];');
586
- scripts = appendScripts(scripts, starterScripts);
587
- });
588
- })
589
- .then(() => file_1.saveData(`${folder}/static/js/scripts.js`, scripts));
590
- });
591
- }
592
- function prepareLibContent(lib, libsPack, folder) {
593
- let file = `${folder}/resource/${lib.id.toString(36)}/${lib.meta.main}`;
594
- return file_1.getFileString(file)
595
- .then(content => {
596
- libsPack[lib.id] = content;
597
- });
598
- }
599
- function downloadBadges(fullProject, folder) {
600
- console.log(`Building workspace: download badges ...`);
601
- let project = fullProject.project;
602
- let data;
603
- return net_1.apiPost(`/glt/client/${project.code}`, {
604
- api: '/list/game_badges',
605
- data: {
606
- start: 0,
607
- length: 1000,
608
- }
609
- })
610
- .then(_d => (data = _d))
611
- .then(() => {
612
- let list = data.list;
613
- if (list.length) {
614
- return downloadBadgeImages(list, folder, 3);
615
- }
616
- else {
617
- console.log(' no badges found');
618
- return Promise.resolve();
619
- }
620
- })
621
- .then(() => file_1.saveData(`${folder}/static/json/badges.json`, JSON.stringify(data, null, 4)));
622
- }
623
- let badgeBars;
624
- function downloadBadgeImages(badges, folder, concurrent) {
625
- badgeBars = new cli_progress_1.default.MultiBar({
626
- clearOnComplete: false,
627
- hideCursor: true,
628
- format: ` {bar} {percentage}% | {file} ({value}/{total})`
629
- }, cli_progress_1.default.Presets.shades_classic);
630
- let totalBar = badgeBars.create(badges.length, 0, { file: 'Total' });
631
- return Promise.all(badges.map(badge => {
632
- return downloadBadgeImage(badge, folder, concurrent)
633
- .then(() => totalBar && totalBar.increment(1));
634
- }))
635
- .then(() => badgeBars && badgeBars.stop());
636
- }
637
- function downloadBadgeImage(badge, folder, concurrent) {
638
- if (badgeBars.bars.length > concurrent) {
639
- return file_1.wait(100).then(() => downloadBadgeImage(badge, folder, concurrent));
640
- }
641
- let url = badge.iconUrl;
642
- let ext = url.split('.').pop();
643
- let dispName = badge.code;
644
- let localUri = `/static/img/badge/${badge.code}.${ext}`;
645
- let dest = `${folder}${localUri}`;
646
- badge.iconUrl = localUri;
647
- badge.aquired = 0;
648
- let badgeBar = badgeBars.create(100, 0, { file: dispName });
649
- let tempName = Date.now().toString(36) + '.' + Math.round(10 + Math.random() * 1000000).toString(36);
650
- let tempFile = `${folder}${tempFolder}/${tempName}`;
651
- return file_1.downloadFile(url, dest, badgeBar, {
652
- dispName: dispName,
653
- tempFile: tempFile,
654
- })
655
- .then(() => badgeBars.remove(badgeBar));
656
- }
657
- function downloadItems(fullProject, folder) {
658
- console.log(`Building workspace: download items ...`);
659
- let project = fullProject.project;
660
- let pack = fullProject.resourcePack;
661
- let refPcodes = [];
662
- let data;
663
- for (let id in pack.resourceMap) {
664
- let resource = pack.resourceMap[id];
665
- if (resource.type == 'buildLib' && resource.meta.gitems) {
666
- let pcode = resource.meta.pcode;
667
- if (!refPcodes.includes(pcode)) {
668
- refPcodes.push(pcode);
669
- }
670
- }
671
- }
672
- return net_1.apiPost(`/glt/client/${project.code}`, {
673
- api: '/list/game_items',
674
- data: {
675
- refPcodes: refPcodes.join(','),
676
- start: 0,
677
- length: 1000,
678
- }
679
- })
680
- .then(_d => (data = _d))
681
- .then(() => {
682
- let list = data.list;
683
- if (list.length) {
684
- return downloadItemImages(list, folder, 3);
685
- }
686
- else {
687
- console.log(' no items found');
688
- return Promise.resolve();
689
- }
690
- })
691
- .then(() => file_1.saveData(`${folder}/static/json/items.json`, JSON.stringify(data, null, 4)));
692
- }
693
- let itemBars;
694
- function downloadItemImages(items, folder, concurrent) {
695
- itemBars = new cli_progress_1.default.MultiBar({
696
- clearOnComplete: false,
697
- hideCursor: true,
698
- format: ` {bar} {percentage}% | {file} ({value}/{total})`
699
- }, cli_progress_1.default.Presets.shades_classic);
700
- let totalBar = itemBars.create(items.length, 0, { file: 'Total' });
701
- return Promise.all(items.map(item => {
702
- return downloadItemImage(item, folder, concurrent)
703
- .then(() => totalBar && totalBar.increment(1));
704
- }))
705
- .then(() => itemBars && itemBars.stop());
706
- }
707
- function downloadItemImage(item, folder, concurrent) {
708
- if (itemBars.bars.length > concurrent) {
709
- return file_1.wait(100).then(() => downloadItemImage(item, folder, concurrent));
710
- }
711
- let url = item.iconUrl;
712
- let ext = url.split('.').pop();
713
- let dispName = item.code;
714
- let localUri = `/static/img/item/${item.code}.${ext}`;
715
- let dest = `${folder}${localUri}`;
716
- item.iconUrl = localUri;
717
- let itemBar = itemBars.create(100, 0, { file: dispName });
718
- let tempName = Date.now().toString(36) + '.' + Math.round(10 + Math.random() * 1000000).toString(36);
719
- let tempFile = `${folder}${tempFolder}/${tempName}`;
720
- return file_1.downloadFile(url, dest, itemBar, {
721
- dispName: dispName,
722
- tempFile: tempFile,
723
- })
724
- .then(() => itemBars.remove(itemBar));
725
- }
726
- function downloadScoreModes(fullProject, folder) {
727
- console.log(`Building workspace: download score modes ...`);
728
- let project = fullProject.project;
729
- let data;
730
- return net_1.apiPost(`/glt/client/${project.code}`, {
731
- api: '/list/score_modes',
732
- data: {}
733
- })
734
- .then(_d => (data = _d))
735
- .then(() => file_1.saveData(`${folder}/static/json/score_modes.json`, JSON.stringify(data, null, 4)));
736
- }
737
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZWxldC9kb3dubG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx3Q0FBOE47QUFDOU4sc0NBQW1FO0FBQ25FLHFDQUEyRDtBQUMzRCxnRUFBdUM7QUFDdkMsd0RBQWdDO0FBQ2hDLHlEQUFzRDtBQUV0RCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUE7QUFDM0IsTUFBTSxTQUFTLEdBQUcsU0FBUyxHQUFHLFdBQVcsQ0FBQztBQUMxQyxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQztBQUV6QixRQUFBLFFBQVEsR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtJQUNqRyxJQUFJLFdBQVcsQ0FBQztJQUNoQixJQUFJLFVBQVUsQ0FBQztJQUNmLGlCQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkIseUJBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFM0IsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFO1NBQ25CLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDUCxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLG1FQUFtRSxDQUFDLENBQUM7U0FDOUY7UUFDRCxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDL0Q7UUFDRCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1IsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7U0FDdkQ7UUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3QixDQUFDLENBQUM7U0FDRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsb0JB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
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.download = void 0;
7
+ const file_1 = require("../utils/file");
8
+ const net_1 = require("../utils/net");
9
+ const merges_1 = require("./merges");
10
+ const cli_progress_1 = __importDefault(require("cli-progress"));
11
+ const inquirer_1 = __importDefault(require("inquirer"));
12
+ const ArrayUtil_1 = require("../server/utils/ArrayUtil");
13
+ const tempFolder = '/.temp';
14
+ const cliFolder = __dirname + '/../../..';
15
+ const dtsPrepend = "// @ts-nocheck\n";
16
+ const download = ({ projectCode, folder, token, sourceHandler, targetItems, force, debug }) => {
17
+ let fullProject;
18
+ let engineInfo;
19
+ (0, net_1.apiSetToken)(token);
20
+ (0, file_1.setFileCacheFolder)(folder);
21
+ return Promise.resolve()
22
+ .then(() => {
23
+ if (!projectCode) {
24
+ return Promise.reject('Please specify a project code that is created on code.gamelet.com');
25
+ }
26
+ if (!folder) {
27
+ return Promise.reject('Please specify a folder to install');
28
+ }
29
+ if (!token) {
30
+ return Promise.reject('No valid token is provided');
31
+ }
32
+ return Promise.resolve();
33
+ })
34
+ .then(() => (0, file_1.isEmptyFolder)(folder))
35
+ .then(empty => {
36
+ if (sourceHandler == 'download') {
37
+ if (debug) {
38
+ // just do it
39
+ }
40
+ else if (!empty) {
41
+ return inquirer_1.default.prompt([
42
+ {
43
+ type: 'list',
44
+ name: 'confirm',
45
+ message: 'The folder is not empty!',
46
+ choices: [
47
+ 'Quit',
48
+ 'Force downloading project into this folder'
49
+ ]
50
+ }
51
+ ])
52
+ .then(choice => {
53
+ if (choice.confirm == 'Quit') {
54
+ return Promise.reject('Quit: The folder is not empty.');
55
+ }
56
+ else {
57
+ return Promise.resolve();
58
+ }
59
+ });
60
+ }
61
+ else {
62
+ console.log(`Create workspace in ${folder}/ ...`);
63
+ }
64
+ }
65
+ else {
66
+ console.log('sync workspace from CG ...');
67
+ }
68
+ })
69
+ .then(() => (0, file_1.rmdir)(`${folder}${tempFolder}`).catch(_e => { }))
70
+ .then(() => Promise.all([
71
+ getEngineInfo().then(info => (engineInfo = info)),
72
+ (0, net_1.apiGet)(`/get/full_project/${projectCode}`)
73
+ .then(json => fullProject = json),
74
+ ]))
75
+ .then(() => updatePackageJsons(fullProject, folder))
76
+ .then(() => saveToken(fullProject, token, folder))
77
+ .then(() => secureSourcesBase(fullProject, folder, token))
78
+ .then(() => includeItem(targetItems, 'source') && downloadSources(fullProject, folder, token, sourceHandler, force))
79
+ .then(() => includeItem(targetItems, 'resource') && downloadResources(fullProject, folder, 3))
80
+ .then(() => (includeItem(targetItems, 'source') || includeItem(targetItems, 'resource')) &&
81
+ downloadStaticFiles(engineInfo, folder)
82
+ .then(() => adjustStaticFiles(fullProject, folder)))
83
+ .then(() => includeItem(targetItems, 'score') && downloadScoreModes(fullProject, folder))
84
+ .then(() => includeItem(targetItems, 'item') && downloadItems(fullProject, folder))
85
+ .then(() => includeItem(targetItems, 'badge') && downloadBadges(fullProject, folder))
86
+ .then(() => (0, file_1.wait)(300))
87
+ .then(() => (0, file_1.rmdir)(`${folder}${tempFolder}`).catch(_e => { }))
88
+ .then(() => {
89
+ console.log();
90
+ console.log('done');
91
+ })
92
+ .catch(err => {
93
+ console.log();
94
+ console.error(err);
95
+ })
96
+ .then(() => console.log());
97
+ };
98
+ exports.download = download;
99
+ function secureSourcesBase(fullProject, folder, token) {
100
+ let basePath = getSourceBasePath(folder);
101
+ if (!(0, file_1.fileExists)(basePath)) {
102
+ let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
103
+ console.log('Missing sources.base, downloading from CG ...');
104
+ let tempName = Date.now().toString(36) + '.' + Math.round(10 + Math.random() * 1000000).toString(36);
105
+ return (0, file_1.downloadFile)((0, net_1.cgUrl)(`/download/${fullProject.project.code}?token=${token}`), basePath, progressBar, {
106
+ tempFile: `${folder}${tempFolder}/${tempName}.zip`,
107
+ noCache: true,
108
+ })
109
+ .then(() => progressBar && progressBar.stop());
110
+ }
111
+ else {
112
+ return Promise.resolve();
113
+ }
114
+ }
115
+ function includeItem(targetItems, item) {
116
+ return !targetItems || targetItems.includes(item);
117
+ }
118
+ function saveToken(fullProject, token, folder) {
119
+ let filename = `${fullProject.project.code.toLowerCase()}.token`;
120
+ let fullpath = `${folder}/.cg/${filename}`;
121
+ return checkSavedToken(fullpath, token)
122
+ .then(saved => {
123
+ if (!saved) {
124
+ console.log(`Building workspace: saving access token ...`);
125
+ return (0, file_1.saveData)(fullpath, token)
126
+ .then(() => deleteOldTokens(folder, filename))
127
+ .then(() => { });
128
+ }
129
+ else {
130
+ return Promise.resolve();
131
+ }
132
+ });
133
+ }
134
+ function deleteOldTokens(folder, currentTokenFile) {
135
+ let path = `${folder}/.cg`;
136
+ return (0, file_1.listFiles)(path)
137
+ .then(files => {
138
+ files = files.filter(f => f != currentTokenFile && f.toLowerCase().endsWith('.token'));
139
+ return Promise.all(files.map(f => (0, file_1.unlink)(`${path}/${f}`)));
140
+ });
141
+ }
142
+ function checkSavedToken(filename, token) {
143
+ if ((0, file_1.fileExists)(filename)) {
144
+ return (0, file_1.getFileString)(filename, true)
145
+ .then(savedToken => token == savedToken);
146
+ }
147
+ else {
148
+ return Promise.resolve(false);
149
+ }
150
+ }
151
+ function getEngineInfo() {
152
+ return (0, net_1.apiGet)(`/get/engine_info`);
153
+ }
154
+ function updatePackageJsons(fullProject, folder) {
155
+ console.log(`Building workspace: update package configs ...`);
156
+ return Promise.all([
157
+ createPackageJson(fullProject.project, folder),
158
+ createTsconfig(fullProject.project, folder),
159
+ (0, file_1.copyFile)(cliFolder + '/assets/gitignore.txt', `${folder}/.gitignore`),
160
+ (0, file_1.copyFile)(cliFolder + '/assets/common.d.ts', `${folder}/typings/common.d.ts`),
161
+ mergeLaunchJson(folder),
162
+ ]);
163
+ }
164
+ function mergeLaunchJson(folder) {
165
+ let srcFile = cliFolder + '/assets/launch.json';
166
+ let destFile = `${folder}/.vscode/launch.json`;
167
+ if ((0, file_1.fileExists)(destFile)) {
168
+ return Promise.all([(0, file_1.getFileJson)(srcFile, true), (0, file_1.getFileJson)(destFile, true)])
169
+ .then(results => {
170
+ let needSave = false;
171
+ let srcJson = results[0];
172
+ let destJson = results[1];
173
+ srcJson.configurations = srcJson.configurations || [];
174
+ srcJson.configurations.forEach(config => {
175
+ let search = destJson.configurations.find(c => c.name == config.name);
176
+ if (!search) {
177
+ destJson.configurations.push(config);
178
+ needSave = true;
179
+ }
180
+ });
181
+ if (needSave) {
182
+ return (0, file_1.saveData)(destFile, JSON.stringify(destJson, null, 4));
183
+ }
184
+ else {
185
+ return Promise.resolve();
186
+ }
187
+ })
188
+ .catch(_e => {
189
+ return (0, file_1.copyFile)(srcFile, destFile);
190
+ });
191
+ }
192
+ else {
193
+ return (0, file_1.copyFile)(srcFile, destFile);
194
+ }
195
+ }
196
+ async function createPackageJson(projectJson, folder) {
197
+ let lastBuildVer = projectJson.lastBuildVer || '0.0.0';
198
+ let verArr = lastBuildVer.split('.').map(str => Number(str));
199
+ verArr[2]++;
200
+ let nextVer = verArr.join('.');
201
+ let content = await (0, file_1.renderTwig)(cliFolder + '/assets/package.json.twig', {
202
+ CG_URL: (0, net_1.cgUrl)(''),
203
+ project: projectJson,
204
+ version: nextVer,
205
+ });
206
+ if ((0, file_1.fileExists)(folder + '/package.json')) {
207
+ try {
208
+ const contentJson = JSON.parse(content);
209
+ let current = await (0, file_1.getFileJson)(folder + '/package.json', true);
210
+ contentJson.devDependencies = mergeDependencies(contentJson.devDependencies, current.devDependencies);
211
+ Object.assign(current, contentJson);
212
+ content = JSON.stringify(current, null, 4);
213
+ }
214
+ catch (e) {
215
+ }
216
+ }
217
+ await (0, file_1.saveData)(folder + '/package.json', content);
218
+ }
219
+ function mergeDependencies(list1, list2) {
220
+ const deps = [];
221
+ const codes1 = Object.keys(list1);
222
+ for (let lib in list1) {
223
+ deps.push({
224
+ lib: lib,
225
+ version: list1[lib],
226
+ });
227
+ }
228
+ for (let lib in list2) {
229
+ if (!codes1.includes(lib)) {
230
+ deps.push({
231
+ lib: lib,
232
+ version: list2[lib],
233
+ });
234
+ }
235
+ }
236
+ ArrayUtil_1.ArrayUtil.sortOn(deps, 'lib', true);
237
+ const result = {};
238
+ for (let dep of deps) {
239
+ result[dep.lib] = dep.version;
240
+ }
241
+ return result;
242
+ }
243
+ function createTsconfig(projectJson, folder) {
244
+ return (0, file_1.renderTwig)(cliFolder + '/assets/tsconfig.json.twig', {
245
+ CG_URL: (0, net_1.cgUrl)(''),
246
+ project: projectJson,
247
+ })
248
+ .then(content => (0, file_1.saveData)(folder + '/tsconfig.json', content));
249
+ }
250
+ let sourcesProcessing;
251
+ function downloadSources(fullProject, folder, token, sourceHandler, force) {
252
+ if (sourceHandler == 'skip') {
253
+ return Promise.resolve();
254
+ }
255
+ console.log(`Building workspace: download sources ...`);
256
+ return (0, file_1.isGitCommitted)(folder)
257
+ .then(committed => {
258
+ if (!committed && !force) {
259
+ return Promise.reject('Please commit your current sources first.');
260
+ }
261
+ else {
262
+ return Promise.resolve();
263
+ }
264
+ })
265
+ .then(() => {
266
+ let zipFilename = folder + tempFolder + '/sources.zip';
267
+ let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
268
+ sourcesProcessing = [];
269
+ return (0, file_1.downloadFile)((0, net_1.cgUrl)(`/download/${fullProject.project.code}?token=${token}`), zipFilename, progressBar, { noCache: true })
270
+ .then(() => {
271
+ progressBar.stop();
272
+ return (0, file_1.getFileZip)(zipFilename);
273
+ })
274
+ .then(jszip => {
275
+ if (sourceHandler == 'merge') {
276
+ return mergeSources(jszip, folder);
277
+ }
278
+ else {
279
+ return overwriteSources(jszip, folder);
280
+ }
281
+ })
282
+ .then(result => result && (0, file_1.moveFile)(zipFilename, getSourceBasePath(folder)));
283
+ });
284
+ }
285
+ function getSourceBasePath(folder) {
286
+ return `${folder}/.cg/sources.base`;
287
+ }
288
+ function overwriteSources(jszip, folder) {
289
+ let saveSrcFiles = [];
290
+ let progressBar = new cli_progress_1.default.SingleBar({
291
+ format: ` {bar} {percentage}% | Overwriting ({value}/{total})`
292
+ }, cli_progress_1.default.Presets.shades_classic);
293
+ for (let filename in jszip.files) {
294
+ if (filename.startsWith('src/')) {
295
+ saveSrcFiles.push(saveSrcFile(jszip.file(filename), folder, progressBar));
296
+ }
297
+ }
298
+ progressBar.start(saveSrcFiles.length, 0);
299
+ return Promise.all(saveSrcFiles)
300
+ .then(() => {
301
+ progressBar && progressBar.stop();
302
+ return true;
303
+ });
304
+ }
305
+ function saveSrcFile(file, dest, progressBar) {
306
+ if (sourcesProcessing.length > 49) {
307
+ return (0, file_1.wait)(10).then(() => saveSrcFile(file, dest, progressBar));
308
+ }
309
+ sourcesProcessing.push(file);
310
+ return file.async('string')
311
+ .then(content => {
312
+ return (0, file_1.saveData)(dest + '/' + file.name, content);
313
+ })
314
+ .then(() => {
315
+ progressBar && progressBar.increment(1);
316
+ let index = sourcesProcessing.indexOf(file);
317
+ sourcesProcessing.splice(index, 1);
318
+ });
319
+ }
320
+ function mergeSources(jszip, folder) {
321
+ let basezip = getSourceBasePath(folder);
322
+ if (!(0, file_1.fileExists)(basezip)) {
323
+ return Promise.reject('Cannot merge: source base missing.');
324
+ }
325
+ return (0, file_1.getFileZip)(basezip)
326
+ .then(basezip => {
327
+ let saveSrcFiles = [];
328
+ let progressBar = new cli_progress_1.default.SingleBar({
329
+ format: ` {bar} {percentage}% | Merging ({value}/{total})`
330
+ }, cli_progress_1.default.Presets.shades_classic);
331
+ for (let filename in jszip.files) {
332
+ if (filename.startsWith('src/')) {
333
+ saveSrcFiles.push(mergeSrcFile(jszip.file(filename), basezip.file(filename), folder, progressBar));
334
+ }
335
+ }
336
+ return Promise.all(saveSrcFiles)
337
+ //.then(results => !results.find(result => !result))
338
+ .then(results => {
339
+ progressBar && progressBar.stop();
340
+ results.filter(result => result.name == 'deleted').forEach(result => {
341
+ console.log(`Source deleted: ${result.filename}`);
342
+ });
343
+ results.filter(result => result.name == 'added').forEach(result => {
344
+ console.log(`Source added: ${result.filename}`);
345
+ });
346
+ return true;
347
+ });
348
+ });
349
+ }
350
+ function mergeSrcFile(file, base, folder, progressBar) {
351
+ if (sourcesProcessing.length > 19) {
352
+ return (0, file_1.wait)(30).then(() => mergeSrcFile(file, base, folder, progressBar));
353
+ }
354
+ sourcesProcessing.push(file);
355
+ return Promise.all([fileToText(file), fileToText(base)])
356
+ .then(contents => {
357
+ return (0, merges_1.sourceMerge)(file.name, contents[0], contents[1], folder);
358
+ })
359
+ .then(result => {
360
+ progressBar && progressBar.increment(1);
361
+ let index = sourcesProcessing.indexOf(file);
362
+ sourcesProcessing.splice(index, 1);
363
+ return result;
364
+ });
365
+ }
366
+ function fileToText(file) {
367
+ if (file) {
368
+ return file.async('string');
369
+ }
370
+ else {
371
+ return Promise.resolve(null);
372
+ }
373
+ }
374
+ function isLibArchive(resource, file) {
375
+ return resource.type.startsWith('build') && file.endsWith('archive.zip');
376
+ }
377
+ let resourceTotalBar;
378
+ let resourceBars;
379
+ function addResourceProgress() {
380
+ resourceTotalBar && resourceTotalBar.increment(1);
381
+ }
382
+ function downloadResources(fullProject, folder, concurrent) {
383
+ console.log(`Building workspace: download resources ...`);
384
+ return Promise.resolve()
385
+ .then(() => (0, file_1.listFiles)(`${folder}/resource`))
386
+ .then(oldDirs => {
387
+ let pack = fullProject.resourcePack;
388
+ let resToLoad = [];
389
+ let resIds = [];
390
+ for (let alias in pack.aliasMap) {
391
+ let resourceInfo = pack.aliasMap[alias];
392
+ let resource = pack.resourceMap[resourceInfo.resourceId];
393
+ resIds.push(resourceInfo.resourceId);
394
+ for (let file of resource.meta.files) {
395
+ let info = {
396
+ file: file,
397
+ resource: resource,
398
+ alias: alias,
399
+ };
400
+ if (file.endsWith('.d.ts') || !isLibArchive(resource, file)) {
401
+ resToLoad.push(info);
402
+ }
403
+ }
404
+ let oldDirIndex = oldDirs.indexOf(resource.id.toString(36));
405
+ if (oldDirIndex != -1) {
406
+ oldDirs.splice(oldDirIndex, 1);
407
+ }
408
+ }
409
+ resourceBars = new cli_progress_1.default.MultiBar({
410
+ clearOnComplete: false,
411
+ hideCursor: true,
412
+ format: ` {bar} {percentage}% | {file} ({value}/{total})`
413
+ }, cli_progress_1.default.Presets.shades_classic);
414
+ let collectInfo = {};
415
+ resourceTotalBar = resourceBars.create(resToLoad.length, 0, { file: 'Total' });
416
+ return startDownloadResources(collectInfo, resToLoad, folder, concurrent)
417
+ .then(() => resourceBars && resourceBars.stop())
418
+ .then(() => logDownloadResourceResult(collectInfo))
419
+ .then(() => deleteResDirs(folder, oldDirs))
420
+ .then(() => deleteOldDtses(folder, resIds));
421
+ });
422
+ }
423
+ function logDownloadResourceResult(collectInfo) {
424
+ let list = ArrayUtil_1.ArrayUtil.listValuesOfObject(collectInfo);
425
+ let files = 0;
426
+ for (let info of list) {
427
+ files += info.files.length;
428
+ }
429
+ console.log(` ${list.length} resource(s) added (${files} file(s))`);
430
+ }
431
+ function deleteOldDtses(folder, resIds) {
432
+ return (0, file_1.listFiles)(`${folder}/typings`)
433
+ .then(files => {
434
+ let filesToDelete = [];
435
+ files.forEach(f => {
436
+ let search = f.match(/\.cg_([a-z0-9]+)\.d\.ts$/);
437
+ if (search) {
438
+ let resId = parseInt(search[1], 36);
439
+ if (!resIds.includes(resId)) {
440
+ filesToDelete.push(f);
441
+ }
442
+ }
443
+ });
444
+ sourcesProcessing = [];
445
+ return Promise.all(filesToDelete.map(f => deleteFile(`${folder}/typings/${f}`)))
446
+ .then(() => {
447
+ console.log(` ${filesToDelete.length} old Dts removed`);
448
+ });
449
+ });
450
+ }
451
+ function deleteFile(file) {
452
+ if (sourcesProcessing.length > 19) {
453
+ return (0, file_1.wait)(30).then(() => deleteFile(file));
454
+ }
455
+ sourcesProcessing.push(file);
456
+ return (0, file_1.unlink)(file)
457
+ .then(() => {
458
+ let index = sourcesProcessing.indexOf(file);
459
+ sourcesProcessing.splice(index, 1);
460
+ });
461
+ }
462
+ function deleteResDirs(folder, dirs) {
463
+ sourcesProcessing = [];
464
+ return Promise.all(dirs.map(dir => deleteResDir(folder, dir)))
465
+ .then(() => console.log(` ${dirs.length} old resource(s) removed`));
466
+ }
467
+ function deleteResDir(folder, dir) {
468
+ if (sourcesProcessing.length > 19) {
469
+ return (0, file_1.wait)(30).then(() => deleteResDir(dir));
470
+ }
471
+ sourcesProcessing.push(dir);
472
+ return (0, file_1.rmdir)(`${folder}/resource/${dir}`)
473
+ .then(() => {
474
+ let index = sourcesProcessing.indexOf(dir);
475
+ sourcesProcessing.splice(index, 1);
476
+ });
477
+ }
478
+ function startDownloadResources(collectInfo, resToLoad, folder, concurrent) {
479
+ return Promise.all(resToLoad.map(info => {
480
+ return downloadResource(collectInfo, info, folder, concurrent);
481
+ }));
482
+ }
483
+ function getResourceFolder(folder, resource) {
484
+ return `${folder}/resource/${resource.id.toString(36)}`;
485
+ }
486
+ function downloadResource(collectInfo, info, folder, concurrent) {
487
+ if (resourceBars.bars.length > concurrent) {
488
+ return (0, file_1.wait)(100).then(() => downloadResource(collectInfo, info, folder, concurrent));
489
+ }
490
+ let resource = info.resource;
491
+ let file = info.file;
492
+ let alias = info.alias;
493
+ let url = (0, net_1.cgUrl)(`${resource.url}${file}`);
494
+ let dest = getResourceFolder(folder, resource) + `/${file}`;
495
+ let dispName = alias;
496
+ let isDts = file.endsWith('.d.ts');
497
+ let modifyContent = null;
498
+ if (isDts) {
499
+ let destFile = file.split('/').pop().replace(/\.d\.ts$/, `.cg_${resource.id.toString(36)}.d.ts`);
500
+ dest = `${folder}/typings/${alias}_${destFile}`;
501
+ dispName += '.d.ts';
502
+ modifyContent = (content) => {
503
+ if (!content.startsWith(dtsPrepend)) {
504
+ content = dtsPrepend + content;
505
+ }
506
+ return content;
507
+ };
508
+ }
509
+ let resourceBar = resourceBars.create(100, 0, { file: dispName });
510
+ let tempName = Date.now().toString(36) + '.' + Math.round(10 + Math.random() * 1000000).toString(36);
511
+ let tempFile = `${folder}${tempFolder}/${tempName}`;
512
+ return (0, file_1.downloadFile)(url, dest, resourceBar, {
513
+ dispName: dispName,
514
+ tempFile: tempFile,
515
+ appendSize: isDts ? dtsPrepend.length : 0,
516
+ modifyContent: modifyContent,
517
+ })
518
+ .then(realDownload => {
519
+ if (realDownload) {
520
+ let resourceInfo = collectInfo[resource.id];
521
+ if (!resourceInfo) {
522
+ collectInfo[resource.id] = {
523
+ resource: resource,
524
+ files: [],
525
+ };
526
+ }
527
+ collectInfo[resource.id].files.push(file);
528
+ }
529
+ addResourceProgress();
530
+ resourceBars.remove(resourceBar);
531
+ });
532
+ }
533
+ let staticBar;
534
+ function downloadStaticFiles(engineInfo, folder) {
535
+ console.log(`Building workspace: download static files ...`);
536
+ let version = 'min';
537
+ //version = 'debug' + parseInt(engineInfo.version, 36).toString(24);
538
+ let tempStaticFolder = `${folder}/.cg/static`;
539
+ let promises = [
540
+ downloadStaticFile(`${engineInfo.url}static/css/preload.css`, `${folder}/static/css/preload.css`),
541
+ downloadStaticFile(`${engineInfo.url}static/img/logo_42.png`, `${folder}/static/img/logo_42.png`),
542
+ downloadStaticFile(`https://cdnjs.cloudflare.com/ajax/libs/pace/1.0.2/pace.min.js`, `${folder}/static/js/pace.min.js`),
543
+ downloadStaticFile(`${engineInfo.url}static/js/index.offline.html`, `${tempStaticFolder}/index.html`),
544
+ downloadStaticFile(`${engineInfo.url}static/js/systemjs-starter.offline.${version}.js`, `${tempStaticFolder}/systemjs-starter.offline.js`),
545
+ downloadStaticFile(`${engineInfo.url}static/js/systemjs-starter.offline-dev.${version}.js`, `${tempStaticFolder}/systemjs-starter.offline-dev.js`),
546
+ downloadStaticFile(`${engineInfo.url}static/js/boot.prod.${version}.js`, `${tempStaticFolder}/boot.prod.js`),
547
+ ];
548
+ staticBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
549
+ staticBar.start(promises.length, 0);
550
+ return Promise.all(promises)
551
+ .then(() => staticBar && staticBar.stop());
552
+ }
553
+ function downloadStaticFile(url, dest) {
554
+ return (0, file_1.downloadFile)(url, dest)
555
+ .then(() => staticBar && staticBar.increment(1));
556
+ }
557
+ function adjustStaticFiles(fullProject, folder) {
558
+ return Promise.all([
559
+ adjustIndexHtml(fullProject, folder),
560
+ generateScriptJs(fullProject, folder),
561
+ ])
562
+ .catch(err => {
563
+ console.error(err);
564
+ });
565
+ }
566
+ function adjustIndexHtml(fullProject, folder) {
567
+ let project = fullProject.project;
568
+ let filename = `${folder}/.cg/static/index.html`;
569
+ return (0, file_1.getFileString)(filename)
570
+ .then(text => {
571
+ text = text.replace('%appName%', project.name);
572
+ text = text.replace('</body>', ` <script src="output/build.js" type="text/javascript"></script>\n</body>`);
573
+ return (0, file_1.saveData)(`${folder}/index.html`, text);
574
+ });
575
+ }
576
+ function generateScriptJs(fullProject, folder) {
577
+ let project = fullProject.project;
578
+ let staticCacheFolder = `${folder}/.cg/static`;
579
+ let starterFilename = `${staticCacheFolder}/systemjs-starter.offline.js`;
580
+ let booterFilename = `${staticCacheFolder}/boot.prod.js`;
581
+ let devFilename = `${staticCacheFolder}/systemjs-starter.offline-dev.js`;
582
+ let starterScripts;
583
+ let scripts = '';
584
+ let appendScripts = (_scripts, text) => {
585
+ if (_scripts && !_scripts.endsWith(';')) {
586
+ _scripts += ';';
587
+ }
588
+ return _scripts + text.trim();
589
+ };
590
+ return (0, net_1.apiGet)(`/get/offlineDevRenderParameters/${project.code}`)
591
+ .then(renderParams => {
592
+ return Promise.resolve()
593
+ .then(() => {
594
+ return (0, file_1.getFileString)(starterFilename)
595
+ .then(content => {
596
+ starterScripts = content.replace('"%CG_CFG%"', JSON.stringify({ data: renderParams }));
597
+ });
598
+ })
599
+ .then(() => {
600
+ return (0, file_1.getFileString)(devFilename)
601
+ .then(content => {
602
+ scripts = appendScripts(scripts, content);
603
+ });
604
+ })
605
+ .then(() => {
606
+ return (0, file_1.getFileString)(booterFilename)
607
+ .then(content => {
608
+ scripts = appendScripts(scripts, content);
609
+ });
610
+ })
611
+ .then(() => {
612
+ return (0, net_1.apiGet)(`/list/resources/dependency/project/${project.code}`);
613
+ })
614
+ .then(data => {
615
+ let libs = data.list;
616
+ let libsPack = {};
617
+ return Promise.all(libs.map(lib => prepareLibContent(lib, libsPack, folder)))
618
+ .then(() => {
619
+ let systemBootFuncs = libs.map(lib => `function(){${libsPack[lib.id]};CgLibs.bootModule('${lib.meta.pcode}')}`);
620
+ systemBootFuncs.unshift(`function(){CgLibs.initBoots([${libs.map(lib => JSON.stringify(lib)).join(',')}])}`);
621
+ scripts = appendScripts(scripts, 'var __cgSystemBoots=[' + systemBootFuncs.join(',') + '];');
622
+ scripts = appendScripts(scripts, starterScripts);
623
+ });
624
+ })
625
+ .then(() => (0, file_1.saveData)(`${folder}/static/js/scripts.js`, scripts));
626
+ });
627
+ }
628
+ function prepareLibContent(lib, libsPack, folder) {
629
+ let file = `${folder}/resource/${lib.id.toString(36)}/${lib.meta.main}`;
630
+ return (0, file_1.getFileString)(file)
631
+ .then(content => {
632
+ libsPack[lib.id] = content;
633
+ });
634
+ }
635
+ function downloadBadges(fullProject, folder) {
636
+ console.log(`Building workspace: download badges ...`);
637
+ let project = fullProject.project;
638
+ let data;
639
+ return (0, net_1.apiPost)(`/glt/client/${project.code}`, {
640
+ api: '/list/game_badges',
641
+ data: {
642
+ start: 0,
643
+ length: 1000,
644
+ }
645
+ })
646
+ .then(_d => (data = _d))
647
+ .then(() => {
648
+ let list = data.list;
649
+ if (list.length) {
650
+ return downloadBadgeImages(list, folder, 3);
651
+ }
652
+ else {
653
+ console.log(' no badges found');
654
+ return Promise.resolve();
655
+ }
656
+ })
657
+ .then(() => (0, file_1.saveData)(`${folder}/static/json/badges.json`, JSON.stringify(data, null, 4)));
658
+ }
659
+ let badgeBars;
660
+ function downloadBadgeImages(badges, folder, concurrent) {
661
+ badgeBars = new cli_progress_1.default.MultiBar({
662
+ clearOnComplete: false,
663
+ hideCursor: true,
664
+ format: ` {bar} {percentage}% | {file} ({value}/{total})`
665
+ }, cli_progress_1.default.Presets.shades_classic);
666
+ let totalBar = badgeBars.create(badges.length, 0, { file: 'Total' });
667
+ return Promise.all(badges.map(badge => {
668
+ return downloadBadgeImage(badge, folder, concurrent)
669
+ .then(() => totalBar && totalBar.increment(1));
670
+ }))
671
+ .then(() => badgeBars && badgeBars.stop());
672
+ }
673
+ function downloadBadgeImage(badge, folder, concurrent) {
674
+ if (badgeBars.bars.length > concurrent) {
675
+ return (0, file_1.wait)(100).then(() => downloadBadgeImage(badge, folder, concurrent));
676
+ }
677
+ let url = badge.iconUrl;
678
+ let ext = url.split('.').pop();
679
+ let dispName = badge.code;
680
+ let localUri = `/static/img/badge/${badge.code}.${ext}`;
681
+ let dest = `${folder}${localUri}`;
682
+ badge.iconUrl = localUri;
683
+ badge.aquired = 0;
684
+ let badgeBar = badgeBars.create(100, 0, { file: dispName });
685
+ let tempName = Date.now().toString(36) + '.' + Math.round(10 + Math.random() * 1000000).toString(36);
686
+ let tempFile = `${folder}${tempFolder}/${tempName}`;
687
+ return (0, file_1.downloadFile)(url, dest, badgeBar, {
688
+ dispName: dispName,
689
+ tempFile: tempFile,
690
+ })
691
+ .then(() => badgeBars.remove(badgeBar));
692
+ }
693
+ function downloadItems(fullProject, folder) {
694
+ console.log(`Building workspace: download items ...`);
695
+ let project = fullProject.project;
696
+ let pack = fullProject.resourcePack;
697
+ let refPcodes = [];
698
+ let data;
699
+ for (let id in pack.resourceMap) {
700
+ let resource = pack.resourceMap[id];
701
+ if (resource.type == 'buildLib' && resource.meta.gitems) {
702
+ let pcode = resource.meta.pcode;
703
+ if (!refPcodes.includes(pcode)) {
704
+ refPcodes.push(pcode);
705
+ }
706
+ }
707
+ }
708
+ return (0, net_1.apiPost)(`/glt/client/${project.code}`, {
709
+ api: '/list/game_items',
710
+ data: {
711
+ refPcodes: refPcodes.join(','),
712
+ start: 0,
713
+ length: 1000,
714
+ }
715
+ })
716
+ .then(_d => (data = _d))
717
+ .then(() => {
718
+ let list = data.list;
719
+ if (list.length) {
720
+ return downloadItemImages(list, folder, 3);
721
+ }
722
+ else {
723
+ console.log(' no items found');
724
+ return Promise.resolve();
725
+ }
726
+ })
727
+ .then(() => (0, file_1.saveData)(`${folder}/static/json/items.json`, JSON.stringify(data, null, 4)));
728
+ }
729
+ let itemBars;
730
+ function downloadItemImages(items, folder, concurrent) {
731
+ itemBars = new cli_progress_1.default.MultiBar({
732
+ clearOnComplete: false,
733
+ hideCursor: true,
734
+ format: ` {bar} {percentage}% | {file} ({value}/{total})`
735
+ }, cli_progress_1.default.Presets.shades_classic);
736
+ let totalBar = itemBars.create(items.length, 0, { file: 'Total' });
737
+ return Promise.all(items.map(item => {
738
+ return downloadItemImage(item, folder, concurrent)
739
+ .then(() => totalBar && totalBar.increment(1));
740
+ }))
741
+ .then(() => itemBars && itemBars.stop());
742
+ }
743
+ function downloadItemImage(item, folder, concurrent) {
744
+ if (itemBars.bars.length > concurrent) {
745
+ return (0, file_1.wait)(100).then(() => downloadItemImage(item, folder, concurrent));
746
+ }
747
+ let url = item.iconUrl;
748
+ let ext = url.split('.').pop();
749
+ let dispName = item.code;
750
+ let localUri = `/static/img/item/${item.code}.${ext}`;
751
+ let dest = `${folder}${localUri}`;
752
+ item.iconUrl = localUri;
753
+ let itemBar = itemBars.create(100, 0, { file: dispName });
754
+ let tempName = Date.now().toString(36) + '.' + Math.round(10 + Math.random() * 1000000).toString(36);
755
+ let tempFile = `${folder}${tempFolder}/${tempName}`;
756
+ return (0, file_1.downloadFile)(url, dest, itemBar, {
757
+ dispName: dispName,
758
+ tempFile: tempFile,
759
+ })
760
+ .then(() => itemBars.remove(itemBar));
761
+ }
762
+ function downloadScoreModes(fullProject, folder) {
763
+ console.log(`Building workspace: download score modes ...`);
764
+ let project = fullProject.project;
765
+ let data;
766
+ return (0, net_1.apiPost)(`/glt/client/${project.code}`, {
767
+ api: '/list/score_modes',
768
+ data: {}
769
+ })
770
+ .then(_d => (data = _d))
771
+ .then(() => (0, file_1.saveData)(`${folder}/static/json/score_modes.json`, JSON.stringify(data, null, 4)));
772
+ }
773
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZWxldC9kb3dubG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx3Q0FBOE47QUFDOU4sc0NBQW1FO0FBQ25FLHFDQUEyRDtBQUMzRCxnRUFBdUM7QUFDdkMsd0RBQWdDO0FBQ2hDLHlEQUFzRDtBQUV0RCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUE7QUFDM0IsTUFBTSxTQUFTLEdBQUcsU0FBUyxHQUFHLFdBQVcsQ0FBQztBQUMxQyxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQztBQUUvQixNQUFNLFFBQVEsR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtJQUNqRyxJQUFJLFdBQVcsQ0FBQztJQUNoQixJQUFJLFVBQVUsQ0FBQztJQUNmLElBQUEsaUJBQVcsRUFBQyxLQUFLLENBQUMsQ0FBQztJQUNuQixJQUFBLHlCQUFrQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTNCLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRTtTQUNuQixJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ1AsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2YsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLG1FQUFtRSxDQUFDLENBQUM7UUFDL0YsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNWLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDVCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDN0IsQ0FB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