@camunda/e2e-test-suite 0.0.310 → 0.0.312
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.
- package/README.md +35 -11
- package/dist/pages/8.10/ClusterDetailsPage.d.ts +6 -0
- package/dist/pages/8.10/ClusterDetailsPage.js +22 -0
- package/dist/pages/8.6/ClusterDetailsPage.d.ts +6 -0
- package/dist/pages/8.6/ClusterDetailsPage.js +22 -0
- package/dist/pages/8.7/ClusterDetailsPage.d.ts +6 -0
- package/dist/pages/8.7/ClusterDetailsPage.js +22 -0
- package/dist/pages/8.8/ClusterDetailsPage.d.ts +6 -0
- package/dist/pages/8.8/ClusterDetailsPage.js +22 -0
- package/dist/pages/8.8/ClusterPage.js +1 -1
- package/dist/pages/8.8/OperateHomePage.js +2 -2
- package/dist/pages/8.8/UtilitiesPage.js +1 -1
- package/dist/pages/8.9/ClusterDetailsPage.d.ts +6 -0
- package/dist/pages/8.9/ClusterDetailsPage.js +22 -0
- package/dist/tests/8.10/saas-migration-path-user-flows.spec.d.ts +1 -0
- package/dist/tests/8.10/saas-migration-path-user-flows.spec.js +176 -0
- package/dist/tests/8.6/smoke-tests.spec.js +8 -2
- package/dist/tests/8.7/saas-migration-path-user-flows.spec.d.ts +1 -0
- package/dist/tests/8.7/saas-migration-path-user-flows.spec.js +150 -0
- package/dist/tests/8.7/smoke-tests.spec.js +8 -2
- package/dist/tests/8.8/saas-migration-path-user-flows.spec.d.ts +1 -0
- package/dist/tests/8.8/saas-migration-path-user-flows.spec.js +173 -0
- package/dist/tests/8.8/smoke-tests.spec.js +13 -3
- package/dist/tests/8.8/test-setup.spec.js +2 -1
- package/dist/tests/8.9/saas-migration-path-user-flows.spec.d.ts +1 -0
- package/dist/tests/8.9/saas-migration-path-user-flows.spec.js +176 -0
- package/dist/tests/8.9/smoke-tests.spec.js +11 -3
- package/dist/tests/c8Run-8.10/api-tests-v1.spec.js +67 -70
- package/dist/tests/c8Run-8.9/api-tests-v1.spec.js +67 -70
- package/package.json +1 -1
|
@@ -7,77 +7,74 @@ const zeebeClient_1 = require("../../utils/zeebeClient");
|
|
|
7
7
|
const test_1 = require("@playwright/test");
|
|
8
8
|
const constants_1 = require("../../utils/constants");
|
|
9
9
|
if (process.env.DATABASE != 'RDBMS') {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
10
|
+
c8Run_8_10_1.test.beforeAll(async () => {
|
|
11
|
+
await Promise.all([
|
|
12
|
+
(0, zeebeClient_1.deploy)('./resources/User_Task_Process_With_Form.bpmn'),
|
|
13
|
+
(0, zeebeClient_1.deploy)('./resources/New Form.form'),
|
|
14
|
+
(0, zeebeClient_1.deploy)('./resources/User_Task_Process_With_Form.bpmn'),
|
|
15
|
+
(0, zeebeClient_1.deploy)('./resources/Start_Form_Process.bpmn'),
|
|
16
|
+
]);
|
|
17
|
+
await Promise.all([
|
|
18
|
+
(0, zeebeClient_1.createInstances)('Form_User_Task', 1, 3),
|
|
19
|
+
(0, zeebeClient_1.createInstances)('Start_Form_Process', 1, 1),
|
|
20
|
+
]);
|
|
21
|
+
await (0, sleep_1.sleep)(10000);
|
|
22
|
+
});
|
|
23
|
+
c8Run_8_10_1.test.describe('API tests for v1', () => {
|
|
24
|
+
const auth = Buffer.from(`demo:demo`).toString('base64');
|
|
25
|
+
const requestHeaders = {
|
|
26
|
+
headers: {
|
|
27
|
+
'Content-Type': 'application/json',
|
|
28
|
+
Authorization: `Basic ${auth}`,
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
(0, c8Run_8_10_1.test)('Search for process definitions @tasklistV2', async ({ request }) => {
|
|
32
|
+
const processDefinitionsList = await request.post('/v1/process-definitions/search', requestHeaders);
|
|
33
|
+
await (0, apiHelpers_1.assertResponseStatus)(processDefinitionsList, 200);
|
|
24
34
|
});
|
|
25
|
-
c8Run_8_10_1.test
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
(0, c8Run_8_10_1.test)('Search for process definitions @tasklistV2', async ({ request }) => {
|
|
34
|
-
const processDefinitionsList = await request.post('/v1/process-definitions/search', requestHeaders);
|
|
35
|
-
await (0, apiHelpers_1.assertResponseStatus)(processDefinitionsList, 200);
|
|
36
|
-
});
|
|
37
|
-
(0, c8Run_8_10_1.test)('Get a process definition via key @tasklistV2', async ({ request, }) => {
|
|
38
|
-
await (0, test_1.expect)(async () => {
|
|
39
|
-
const searchProcessDefinitions = await request.post(`/v1/process-definitions/search`, requestHeaders);
|
|
40
|
-
const processKey = await searchProcessDefinitions.json();
|
|
41
|
-
(0, test_1.expect)(processKey.items.length).toBeGreaterThan(0);
|
|
42
|
-
const response = await request.get(`/v1/process-definitions/` + processKey.items[0].key, requestHeaders);
|
|
43
|
-
await (0, apiHelpers_1.assertResponseStatus)(response, 200);
|
|
44
|
-
}).toPass(constants_1.defaultAssertionOptions);
|
|
45
|
-
});
|
|
46
|
-
(0, c8Run_8_10_1.test)('Search for process instances @tasklistV2', async ({ request }) => {
|
|
47
|
-
const processInstancesList = await request.post('/v1/process-instances/search', requestHeaders);
|
|
48
|
-
await (0, apiHelpers_1.assertResponseStatus)(processInstancesList, 200);
|
|
49
|
-
});
|
|
50
|
-
(0, c8Run_8_10_1.test)('Search for flownode-instances @tasklistV2', async ({ request }) => {
|
|
51
|
-
const flowNodeInstancesList = await request.post('/v1/flownode-instances/search', requestHeaders);
|
|
52
|
-
await (0, apiHelpers_1.assertResponseStatus)(flowNodeInstancesList, 200);
|
|
53
|
-
});
|
|
54
|
-
(0, c8Run_8_10_1.test)('Search for variables for process instances @tasklistV2', async ({ request, }) => {
|
|
55
|
-
const variablesInstancesList = await request.post('/v1/variables/search', requestHeaders);
|
|
56
|
-
await (0, apiHelpers_1.assertResponseStatus)(variablesInstancesList, 200);
|
|
57
|
-
});
|
|
58
|
-
(0, c8Run_8_10_1.test)('Search for incidents @tasklistV2', async ({ request }) => {
|
|
59
|
-
const incidentsList = await request.post('/v1/incidents/search', requestHeaders);
|
|
60
|
-
await (0, apiHelpers_1.assertResponseStatus)(incidentsList, 200);
|
|
61
|
-
});
|
|
62
|
-
(0, c8Run_8_10_1.test)('Get connectors status @tasklistV2', async ({ request }) => {
|
|
63
|
-
await (0, sleep_1.sleep)(10000);
|
|
64
|
-
const connectorsStatus = await request.get(process.env.C8RUN_CONNECTORS_API_URL_LATEST + '/actuator/health', requestHeaders);
|
|
65
|
-
await (0, apiHelpers_1.assertResponseStatus)(connectorsStatus, 200);
|
|
66
|
-
});
|
|
67
|
-
(0, c8Run_8_10_1.test)('Get a inbound connectors list @tasklistV2', async ({ request }) => {
|
|
68
|
-
const connectorsInboundList = await request.get(process.env.C8RUN_CONNECTORS_API_URL_LATEST + '/inbound', requestHeaders);
|
|
69
|
-
await (0, apiHelpers_1.assertResponseStatus)(connectorsInboundList, 200);
|
|
70
|
-
});
|
|
71
|
-
(0, c8Run_8_10_1.test)('Search for tasks', async ({ request }) => {
|
|
72
|
-
const taskList = await request.post('/v1/tasks/search', requestHeaders);
|
|
73
|
-
await (0, apiHelpers_1.assertResponseStatus)(taskList, 200);
|
|
74
|
-
});
|
|
75
|
-
(0, c8Run_8_10_1.test)('Get a task via ID', async ({ request }) => {
|
|
76
|
-
const searchTasks = await request.post(`/v1/tasks/search`, requestHeaders);
|
|
77
|
-
const taskID = await searchTasks.json();
|
|
78
|
-
const response = await request.get('/v1/tasks/' + taskID[0].id, requestHeaders);
|
|
35
|
+
(0, c8Run_8_10_1.test)('Get a process definition via key @tasklistV2', async ({ request }) => {
|
|
36
|
+
await (0, test_1.expect)(async () => {
|
|
37
|
+
const searchProcessDefinitions = await request.post(`/v1/process-definitions/search`, requestHeaders);
|
|
38
|
+
const processKey = await searchProcessDefinitions.json();
|
|
39
|
+
(0, test_1.expect)(processKey.items.length).toBeGreaterThan(0);
|
|
40
|
+
const response = await request.get(`/v1/process-definitions/` + processKey.items[0].key, requestHeaders);
|
|
79
41
|
await (0, apiHelpers_1.assertResponseStatus)(response, 200);
|
|
80
|
-
});
|
|
42
|
+
}).toPass(constants_1.defaultAssertionOptions);
|
|
43
|
+
});
|
|
44
|
+
(0, c8Run_8_10_1.test)('Search for process instances @tasklistV2', async ({ request }) => {
|
|
45
|
+
const processInstancesList = await request.post('/v1/process-instances/search', requestHeaders);
|
|
46
|
+
await (0, apiHelpers_1.assertResponseStatus)(processInstancesList, 200);
|
|
47
|
+
});
|
|
48
|
+
(0, c8Run_8_10_1.test)('Search for flownode-instances @tasklistV2', async ({ request }) => {
|
|
49
|
+
const flowNodeInstancesList = await request.post('/v1/flownode-instances/search', requestHeaders);
|
|
50
|
+
await (0, apiHelpers_1.assertResponseStatus)(flowNodeInstancesList, 200);
|
|
51
|
+
});
|
|
52
|
+
(0, c8Run_8_10_1.test)('Search for variables for process instances @tasklistV2', async ({ request, }) => {
|
|
53
|
+
const variablesInstancesList = await request.post('/v1/variables/search', requestHeaders);
|
|
54
|
+
await (0, apiHelpers_1.assertResponseStatus)(variablesInstancesList, 200);
|
|
55
|
+
});
|
|
56
|
+
(0, c8Run_8_10_1.test)('Search for incidents @tasklistV2', async ({ request }) => {
|
|
57
|
+
const incidentsList = await request.post('/v1/incidents/search', requestHeaders);
|
|
58
|
+
await (0, apiHelpers_1.assertResponseStatus)(incidentsList, 200);
|
|
59
|
+
});
|
|
60
|
+
(0, c8Run_8_10_1.test)('Get connectors status @tasklistV2', async ({ request }) => {
|
|
61
|
+
await (0, sleep_1.sleep)(10000);
|
|
62
|
+
const connectorsStatus = await request.get(process.env.C8RUN_CONNECTORS_API_URL_LATEST + '/actuator/health', requestHeaders);
|
|
63
|
+
await (0, apiHelpers_1.assertResponseStatus)(connectorsStatus, 200);
|
|
64
|
+
});
|
|
65
|
+
(0, c8Run_8_10_1.test)('Get a inbound connectors list @tasklistV2', async ({ request }) => {
|
|
66
|
+
const connectorsInboundList = await request.get(process.env.C8RUN_CONNECTORS_API_URL_LATEST + '/inbound', requestHeaders);
|
|
67
|
+
await (0, apiHelpers_1.assertResponseStatus)(connectorsInboundList, 200);
|
|
68
|
+
});
|
|
69
|
+
(0, c8Run_8_10_1.test)('Search for tasks', async ({ request }) => {
|
|
70
|
+
const taskList = await request.post('/v1/tasks/search', requestHeaders);
|
|
71
|
+
await (0, apiHelpers_1.assertResponseStatus)(taskList, 200);
|
|
72
|
+
});
|
|
73
|
+
(0, c8Run_8_10_1.test)('Get a task via ID', async ({ request }) => {
|
|
74
|
+
const searchTasks = await request.post(`/v1/tasks/search`, requestHeaders);
|
|
75
|
+
const taskID = await searchTasks.json();
|
|
76
|
+
const response = await request.get('/v1/tasks/' + taskID[0].id, requestHeaders);
|
|
77
|
+
await (0, apiHelpers_1.assertResponseStatus)(response, 200);
|
|
81
78
|
});
|
|
82
|
-
}
|
|
79
|
+
});
|
|
83
80
|
}
|
|
@@ -7,77 +7,74 @@ const zeebeClient_1 = require("../../utils/zeebeClient");
|
|
|
7
7
|
const test_1 = require("@playwright/test");
|
|
8
8
|
const constants_1 = require("../../utils/constants");
|
|
9
9
|
if (process.env.DATABASE != 'RDBMS') {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
10
|
+
c8Run_8_9_1.test.beforeAll(async () => {
|
|
11
|
+
await Promise.all([
|
|
12
|
+
(0, zeebeClient_1.deploy)('./resources/User_Task_Process_With_Form.bpmn'),
|
|
13
|
+
(0, zeebeClient_1.deploy)('./resources/New Form.form'),
|
|
14
|
+
(0, zeebeClient_1.deploy)('./resources/User_Task_Process_With_Form.bpmn'),
|
|
15
|
+
(0, zeebeClient_1.deploy)('./resources/Start_Form_Process.bpmn'),
|
|
16
|
+
]);
|
|
17
|
+
await Promise.all([
|
|
18
|
+
(0, zeebeClient_1.createInstances)('Form_User_Task', 1, 3),
|
|
19
|
+
(0, zeebeClient_1.createInstances)('Start_Form_Process', 1, 1),
|
|
20
|
+
]);
|
|
21
|
+
await (0, sleep_1.sleep)(10000);
|
|
22
|
+
});
|
|
23
|
+
c8Run_8_9_1.test.describe('API tests for v1', () => {
|
|
24
|
+
const auth = Buffer.from(`demo:demo`).toString('base64');
|
|
25
|
+
const requestHeaders = {
|
|
26
|
+
headers: {
|
|
27
|
+
'Content-Type': 'application/json',
|
|
28
|
+
Authorization: `Basic ${auth}`,
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
(0, c8Run_8_9_1.test)('Search for process definitions @tasklistV2', async ({ request }) => {
|
|
32
|
+
const processDefinitionsList = await request.post('/v1/process-definitions/search', requestHeaders);
|
|
33
|
+
await (0, apiHelpers_1.assertResponseStatus)(processDefinitionsList, 200);
|
|
24
34
|
});
|
|
25
|
-
c8Run_8_9_1.test
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
(0, c8Run_8_9_1.test)('Search for process definitions @tasklistV2', async ({ request }) => {
|
|
34
|
-
const processDefinitionsList = await request.post('/v1/process-definitions/search', requestHeaders);
|
|
35
|
-
await (0, apiHelpers_1.assertResponseStatus)(processDefinitionsList, 200);
|
|
36
|
-
});
|
|
37
|
-
(0, c8Run_8_9_1.test)('Get a process definition via key @tasklistV2', async ({ request, }) => {
|
|
38
|
-
await (0, test_1.expect)(async () => {
|
|
39
|
-
const searchProcessDefinitions = await request.post(`/v1/process-definitions/search`, requestHeaders);
|
|
40
|
-
const processKey = await searchProcessDefinitions.json();
|
|
41
|
-
(0, test_1.expect)(processKey.items.length).toBeGreaterThan(0);
|
|
42
|
-
const response = await request.get(`/v1/process-definitions/` + processKey.items[0].key, requestHeaders);
|
|
43
|
-
await (0, apiHelpers_1.assertResponseStatus)(response, 200);
|
|
44
|
-
}).toPass(constants_1.defaultAssertionOptions);
|
|
45
|
-
});
|
|
46
|
-
(0, c8Run_8_9_1.test)('Search for process instances @tasklistV2', async ({ request }) => {
|
|
47
|
-
const processInstancesList = await request.post('/v1/process-instances/search', requestHeaders);
|
|
48
|
-
await (0, apiHelpers_1.assertResponseStatus)(processInstancesList, 200);
|
|
49
|
-
});
|
|
50
|
-
(0, c8Run_8_9_1.test)('Search for flownode-instances @tasklistV2', async ({ request }) => {
|
|
51
|
-
const flowNodeInstancesList = await request.post('/v1/flownode-instances/search', requestHeaders);
|
|
52
|
-
await (0, apiHelpers_1.assertResponseStatus)(flowNodeInstancesList, 200);
|
|
53
|
-
});
|
|
54
|
-
(0, c8Run_8_9_1.test)('Search for variables for process instances @tasklistV2', async ({ request, }) => {
|
|
55
|
-
const variablesInstancesList = await request.post('/v1/variables/search', requestHeaders);
|
|
56
|
-
await (0, apiHelpers_1.assertResponseStatus)(variablesInstancesList, 200);
|
|
57
|
-
});
|
|
58
|
-
(0, c8Run_8_9_1.test)('Search for incidents @tasklistV2', async ({ request }) => {
|
|
59
|
-
const incidentsList = await request.post('/v1/incidents/search', requestHeaders);
|
|
60
|
-
await (0, apiHelpers_1.assertResponseStatus)(incidentsList, 200);
|
|
61
|
-
});
|
|
62
|
-
(0, c8Run_8_9_1.test)('Get connectors status @tasklistV2', async ({ request }) => {
|
|
63
|
-
await (0, sleep_1.sleep)(10000);
|
|
64
|
-
const connectorsStatus = await request.get(process.env.C8RUN_CONNECTORS_API_URL_LATEST + '/actuator/health', requestHeaders);
|
|
65
|
-
await (0, apiHelpers_1.assertResponseStatus)(connectorsStatus, 200);
|
|
66
|
-
});
|
|
67
|
-
(0, c8Run_8_9_1.test)('Get a inbound connectors list @tasklistV2', async ({ request }) => {
|
|
68
|
-
const connectorsInboundList = await request.get(process.env.C8RUN_CONNECTORS_API_URL_LATEST + '/inbound', requestHeaders);
|
|
69
|
-
await (0, apiHelpers_1.assertResponseStatus)(connectorsInboundList, 200);
|
|
70
|
-
});
|
|
71
|
-
(0, c8Run_8_9_1.test)('Search for tasks', async ({ request }) => {
|
|
72
|
-
const taskList = await request.post('/v1/tasks/search', requestHeaders);
|
|
73
|
-
await (0, apiHelpers_1.assertResponseStatus)(taskList, 200);
|
|
74
|
-
});
|
|
75
|
-
(0, c8Run_8_9_1.test)('Get a task via ID', async ({ request }) => {
|
|
76
|
-
const searchTasks = await request.post(`/v1/tasks/search`, requestHeaders);
|
|
77
|
-
const taskID = await searchTasks.json();
|
|
78
|
-
const response = await request.get('/v1/tasks/' + taskID[0].id, requestHeaders);
|
|
35
|
+
(0, c8Run_8_9_1.test)('Get a process definition via key @tasklistV2', async ({ request }) => {
|
|
36
|
+
await (0, test_1.expect)(async () => {
|
|
37
|
+
const searchProcessDefinitions = await request.post(`/v1/process-definitions/search`, requestHeaders);
|
|
38
|
+
const processKey = await searchProcessDefinitions.json();
|
|
39
|
+
(0, test_1.expect)(processKey.items.length).toBeGreaterThan(0);
|
|
40
|
+
const response = await request.get(`/v1/process-definitions/` + processKey.items[0].key, requestHeaders);
|
|
79
41
|
await (0, apiHelpers_1.assertResponseStatus)(response, 200);
|
|
80
|
-
});
|
|
42
|
+
}).toPass(constants_1.defaultAssertionOptions);
|
|
43
|
+
});
|
|
44
|
+
(0, c8Run_8_9_1.test)('Search for process instances @tasklistV2', async ({ request }) => {
|
|
45
|
+
const processInstancesList = await request.post('/v1/process-instances/search', requestHeaders);
|
|
46
|
+
await (0, apiHelpers_1.assertResponseStatus)(processInstancesList, 200);
|
|
47
|
+
});
|
|
48
|
+
(0, c8Run_8_9_1.test)('Search for flownode-instances @tasklistV2', async ({ request }) => {
|
|
49
|
+
const flowNodeInstancesList = await request.post('/v1/flownode-instances/search', requestHeaders);
|
|
50
|
+
await (0, apiHelpers_1.assertResponseStatus)(flowNodeInstancesList, 200);
|
|
51
|
+
});
|
|
52
|
+
(0, c8Run_8_9_1.test)('Search for variables for process instances @tasklistV2', async ({ request, }) => {
|
|
53
|
+
const variablesInstancesList = await request.post('/v1/variables/search', requestHeaders);
|
|
54
|
+
await (0, apiHelpers_1.assertResponseStatus)(variablesInstancesList, 200);
|
|
55
|
+
});
|
|
56
|
+
(0, c8Run_8_9_1.test)('Search for incidents @tasklistV2', async ({ request }) => {
|
|
57
|
+
const incidentsList = await request.post('/v1/incidents/search', requestHeaders);
|
|
58
|
+
await (0, apiHelpers_1.assertResponseStatus)(incidentsList, 200);
|
|
59
|
+
});
|
|
60
|
+
(0, c8Run_8_9_1.test)('Get connectors status @tasklistV2', async ({ request }) => {
|
|
61
|
+
await (0, sleep_1.sleep)(10000);
|
|
62
|
+
const connectorsStatus = await request.get(process.env.C8RUN_CONNECTORS_API_URL_LATEST + '/actuator/health', requestHeaders);
|
|
63
|
+
await (0, apiHelpers_1.assertResponseStatus)(connectorsStatus, 200);
|
|
64
|
+
});
|
|
65
|
+
(0, c8Run_8_9_1.test)('Get a inbound connectors list @tasklistV2', async ({ request }) => {
|
|
66
|
+
const connectorsInboundList = await request.get(process.env.C8RUN_CONNECTORS_API_URL_LATEST + '/inbound', requestHeaders);
|
|
67
|
+
await (0, apiHelpers_1.assertResponseStatus)(connectorsInboundList, 200);
|
|
68
|
+
});
|
|
69
|
+
(0, c8Run_8_9_1.test)('Search for tasks', async ({ request }) => {
|
|
70
|
+
const taskList = await request.post('/v1/tasks/search', requestHeaders);
|
|
71
|
+
await (0, apiHelpers_1.assertResponseStatus)(taskList, 200);
|
|
72
|
+
});
|
|
73
|
+
(0, c8Run_8_9_1.test)('Get a task via ID', async ({ request }) => {
|
|
74
|
+
const searchTasks = await request.post(`/v1/tasks/search`, requestHeaders);
|
|
75
|
+
const taskID = await searchTasks.json();
|
|
76
|
+
const response = await request.get('/v1/tasks/' + taskID[0].id, requestHeaders);
|
|
77
|
+
await (0, apiHelpers_1.assertResponseStatus)(response, 200);
|
|
81
78
|
});
|
|
82
|
-
}
|
|
79
|
+
});
|
|
83
80
|
}
|