@semapps/semantic-data-provider 0.6.4 → 0.6.6
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/dist/index.cjs.js +136 -81
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +105 -69
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +135 -81
- package/dist/index.es.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
var $bkNnK$urljoin = require("url-join");
|
|
2
2
|
var $bkNnK$jsonld = require("jsonld");
|
|
3
|
-
var $bkNnK$isobject = require("isobject");
|
|
4
3
|
var $bkNnK$rdfjsdatamodel = require("@rdfjs/data-model");
|
|
5
4
|
var $bkNnK$sparqljs = require("sparqljs");
|
|
6
5
|
var $bkNnK$cryptojsmd5 = require("crypto-js/md5");
|
|
@@ -25,9 +24,10 @@ $parcel$export(module.exports, "buildBlankNodesQuery", () => $64d4ce40c79d1509$e
|
|
|
25
24
|
$parcel$export(module.exports, "useGetExternalLink", () => $85e9a897c6d7c14a$export$2e2bcd8739ae039);
|
|
26
25
|
$parcel$export(module.exports, "useContainers", () => $3158e0dc13ffffaa$export$2e2bcd8739ae039);
|
|
27
26
|
$parcel$export(module.exports, "useCreateContainer", () => $99ed32cbdb76cb50$export$2e2bcd8739ae039);
|
|
27
|
+
$parcel$export(module.exports, "useCreateContainerUri", () => $298b78bb7d4a3358$export$2e2bcd8739ae039);
|
|
28
28
|
$parcel$export(module.exports, "useDataModel", () => $63a32f1a35c6f80e$export$2e2bcd8739ae039);
|
|
29
|
-
$parcel$export(module.exports, "useDataModels", () => $
|
|
30
|
-
$parcel$export(module.exports, "useDataServers", () => $
|
|
29
|
+
$parcel$export(module.exports, "useDataModels", () => $20621bc841a5205a$export$2e2bcd8739ae039);
|
|
30
|
+
$parcel$export(module.exports, "useDataServers", () => $c9933a88e2acc4da$export$2e2bcd8739ae039);
|
|
31
31
|
$parcel$export(module.exports, "FilterHandler", () => $f763906f9b20f2d8$export$2e2bcd8739ae039);
|
|
32
32
|
$parcel$export(module.exports, "GroupedReferenceHandler", () => $b4703fef6d6af456$export$2e2bcd8739ae039);
|
|
33
33
|
$parcel$export(module.exports, "ReificationArrayInput", () => $030f1232f6810456$export$2e2bcd8739ae039);
|
|
@@ -196,7 +196,7 @@ const $047a107b0d203793$var$findContainersWithTypes = (types, serverKeys, dataSe
|
|
|
196
196
|
const existingContainers = [];
|
|
197
197
|
const parsedServerKeys = (0, $982f4f2fb185d606$export$2e2bcd8739ae039)(serverKeys, dataServers);
|
|
198
198
|
Object.keys(dataServers).filter((dataServerKey)=>dataServers[dataServerKey].containers).forEach((dataServerKey)=>{
|
|
199
|
-
Object.keys(dataServers[dataServerKey].containers).forEach((containerKey)=>{
|
|
199
|
+
Object.keys(dataServers[dataServerKey].containers || {}).forEach((containerKey)=>{
|
|
200
200
|
if (!parsedServerKeys || parsedServerKeys.includes(containerKey)) Object.keys(dataServers[dataServerKey].containers[containerKey]).forEach((type)=>{
|
|
201
201
|
if (types.includes(type)) dataServers[dataServerKey].containers[containerKey][type].map((path)=>{
|
|
202
202
|
const containerUri = (0, ($parcel$interopDefault($bkNnK$urljoin)))(dataServers[containerKey].baseUrl, path);
|
|
@@ -327,8 +327,7 @@ var $241c41c6f6021c7a$export$2e2bcd8739ae039 = $241c41c6f6021c7a$var$getDataMode
|
|
|
327
327
|
|
|
328
328
|
|
|
329
329
|
|
|
330
|
-
|
|
331
|
-
const $4d160872c02aa8d3$var$arrayOf = (value)=>{
|
|
330
|
+
const $e6fbab1f303bdb93$var$arrayOf = (value)=>{
|
|
332
331
|
// If the field is null-ish, we suppose there are no values.
|
|
333
332
|
if (!value) return [];
|
|
334
333
|
// Return as is.
|
|
@@ -338,86 +337,110 @@ const $4d160872c02aa8d3$var$arrayOf = (value)=>{
|
|
|
338
337
|
value
|
|
339
338
|
];
|
|
340
339
|
};
|
|
341
|
-
var $
|
|
340
|
+
var $e6fbab1f303bdb93$export$2e2bcd8739ae039 = $e6fbab1f303bdb93$var$arrayOf;
|
|
342
341
|
|
|
343
342
|
|
|
344
|
-
const $
|
|
345
|
-
const resourceType =
|
|
346
|
-
return Array.isArray(resourceType) ? resourceType.includes(
|
|
343
|
+
const $8c999cc29c8d6a6c$var$isValidLDPContainer = (container)=>{
|
|
344
|
+
const resourceType = container.type || container["@type"];
|
|
345
|
+
return Array.isArray(resourceType) ? resourceType.includes("ldp:Container") : resourceType === "ldp:Container";
|
|
347
346
|
};
|
|
348
|
-
const $
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
serverKey
|
|
356
|
-
]))
|
|
357
|
-
}), {});
|
|
358
|
-
const fetchPromises = Object.keys(containersServers).map((containerUri)=>httpClient(containerUri).then(({ json: json })=>{
|
|
347
|
+
const $8c999cc29c8d6a6c$var$isObject = (val)=>{
|
|
348
|
+
return val != null && typeof val === "object" && !Array.isArray(val);
|
|
349
|
+
};
|
|
350
|
+
const $8c999cc29c8d6a6c$var$fetchContainers = async (containers, params, { httpClient: httpClient, jsonContext: jsonContext })=>{
|
|
351
|
+
const containersUri = Object.values(containers).flat();
|
|
352
|
+
const fetchPromises = containersUri.map((containerUri)=>httpClient(containerUri).then(async ({ json: json })=>{
|
|
353
|
+
const jsonResponse = json;
|
|
359
354
|
// If container's context is different, compact it to have an uniform result
|
|
360
355
|
// TODO deep compare if the context is an object
|
|
361
|
-
if (
|
|
362
|
-
return
|
|
356
|
+
if (jsonResponse["@context"] !== jsonContext) return (0, ($parcel$interopDefault($bkNnK$jsonld))).compact(jsonResponse, jsonContext);
|
|
357
|
+
return jsonResponse;
|
|
363
358
|
}).then((json)=>{
|
|
364
|
-
if ($
|
|
359
|
+
if (!$8c999cc29c8d6a6c$var$isValidLDPContainer(json)) throw new Error(`${containerUri} is not a LDP container`);
|
|
360
|
+
return (0, $e6fbab1f303bdb93$export$2e2bcd8739ae039)(json["ldp:contains"]).map((resource)=>({
|
|
365
361
|
"@context": json["@context"],
|
|
366
362
|
...resource
|
|
367
363
|
}));
|
|
368
|
-
throw new Error(`${containerUri} is not a LDP container`);
|
|
369
364
|
}));
|
|
370
365
|
// Fetch simultaneously all containers
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
// Merge all results in one array
|
|
377
|
-
results = [].concat.apply(...results);
|
|
378
|
-
let returnData = results.map((item)=>{
|
|
379
|
-
item.id = item.id || item["@id"];
|
|
380
|
-
return item;
|
|
366
|
+
const results = await Promise.all(fetchPromises);
|
|
367
|
+
let resources = results.flat();
|
|
368
|
+
resources = resources.map((resource)=>{
|
|
369
|
+
resource.id = resource.id || resource["@id"];
|
|
370
|
+
return resource;
|
|
381
371
|
});
|
|
382
372
|
// Apply filter to results
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
});
|
|
402
|
-
if (resource[k]) return Array.isArray(resource[k]) ? resource[k].some((va)=>va.includes(v)) : resource[k].includes(v);
|
|
403
|
-
return false;
|
|
373
|
+
const filters = params.filter;
|
|
374
|
+
// For SPARQL queries, we use "a" to filter types, but in containers it must be "type"
|
|
375
|
+
if (filters.a) {
|
|
376
|
+
filters.type = filters.a;
|
|
377
|
+
delete filters.a;
|
|
378
|
+
}
|
|
379
|
+
// Filter resources attributes according to _predicates list
|
|
380
|
+
if (filters._predicates && Array.isArray(filters._predicates)) {
|
|
381
|
+
const predicates = filters._predicates;
|
|
382
|
+
const mandatoryAttributes = [
|
|
383
|
+
"id"
|
|
384
|
+
];
|
|
385
|
+
resources = resources.map((resource)=>{
|
|
386
|
+
return Object.keys(resource).filter((key)=>predicates.includes(key) || mandatoryAttributes.includes(key)).reduce((filteredResource, key)=>{
|
|
387
|
+
filteredResource[key] = resource[key];
|
|
388
|
+
return filteredResource;
|
|
389
|
+
}, {
|
|
390
|
+
"@context": []
|
|
404
391
|
});
|
|
405
392
|
});
|
|
406
393
|
}
|
|
407
|
-
if (
|
|
394
|
+
if (Object.keys(filters).filter((f)=>![
|
|
395
|
+
"_predicates",
|
|
396
|
+
"_servers"
|
|
397
|
+
].includes(f)).length > 0) resources = resources.filter((resource)=>{
|
|
398
|
+
// Full text filtering
|
|
399
|
+
if (filters.q) return Object.values(resource).some((attributeValue)=>{
|
|
400
|
+
if (!$8c999cc29c8d6a6c$var$isObject(attributeValue)) {
|
|
401
|
+
const arrayValues = Array.isArray(attributeValue) ? attributeValue : [
|
|
402
|
+
attributeValue
|
|
403
|
+
];
|
|
404
|
+
return arrayValues.some((value)=>{
|
|
405
|
+
if (typeof value === "string") return value.toLowerCase().normalize("NFD").includes(filters.q.toLowerCase().normalize("NFD"));
|
|
406
|
+
return false;
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
return false;
|
|
410
|
+
});
|
|
411
|
+
// Attribute filtering
|
|
412
|
+
const attributesFilters = Object.keys(filters).filter((f)=>![
|
|
413
|
+
"_predicates",
|
|
414
|
+
"_servers",
|
|
415
|
+
"q"
|
|
416
|
+
].includes(f));
|
|
417
|
+
return attributesFilters.every((attribute)=>{
|
|
418
|
+
if (resource[attribute]) {
|
|
419
|
+
const arrayValues = Array.isArray(resource[attribute]) ? resource[attribute] : [
|
|
420
|
+
resource[attribute]
|
|
421
|
+
];
|
|
422
|
+
return arrayValues.some((value)=>typeof value === "string" && value.includes(filters[attribute]));
|
|
423
|
+
}
|
|
424
|
+
return false;
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
// Sorting
|
|
428
|
+
if (params.sort) resources = resources.sort((a, b)=>{
|
|
408
429
|
if (a[params.sort.field] && b[params.sort.field]) {
|
|
409
430
|
if (params.sort.order === "ASC") return a[params.sort.field].localeCompare(b[params.sort.field]);
|
|
410
431
|
return b[params.sort.field].localeCompare(a[params.sort.field]);
|
|
411
432
|
}
|
|
412
433
|
return true;
|
|
413
434
|
});
|
|
414
|
-
|
|
435
|
+
// Pagination
|
|
436
|
+
const total = resources.length;
|
|
437
|
+
if (params.pagination) resources = resources.slice((params.pagination.page - 1) * params.pagination.perPage, params.pagination.page * params.pagination.perPage);
|
|
415
438
|
return {
|
|
416
|
-
data:
|
|
417
|
-
total:
|
|
439
|
+
data: resources,
|
|
440
|
+
total: total
|
|
418
441
|
};
|
|
419
442
|
};
|
|
420
|
-
var $
|
|
443
|
+
var $8c999cc29c8d6a6c$export$2e2bcd8739ae039 = $8c999cc29c8d6a6c$var$fetchContainers;
|
|
421
444
|
|
|
422
445
|
|
|
423
446
|
|
|
@@ -882,7 +905,7 @@ const $b6ed253f3374f5d4$var$getListMethod = (config)=>async (resourceId, params
|
|
|
882
905
|
containers = (0, $e3a78b3d48a0a0fb$export$2e2bcd8739ae039)(dataModel.list.containers, dataServers);
|
|
883
906
|
} else // Otherwise find the container URIs on the given servers (either in the filter or the data model)
|
|
884
907
|
containers = (0, $047a107b0d203793$export$2e2bcd8739ae039)(dataModel.types, params.filter?._servers || dataModel.list?.servers, dataServers);
|
|
885
|
-
if (dataModel.list?.fetchContainer) return (0, $
|
|
908
|
+
if (dataModel.list?.fetchContainer) return (0, $8c999cc29c8d6a6c$export$2e2bcd8739ae039)(containers, params, config);
|
|
886
909
|
return (0, $1e7a94d745f8597b$export$2e2bcd8739ae039)(containers, resourceId, params, config);
|
|
887
910
|
};
|
|
888
911
|
var $b6ed253f3374f5d4$export$2e2bcd8739ae039 = $b6ed253f3374f5d4$var$getListMethod;
|
|
@@ -1220,25 +1243,26 @@ var $63a32f1a35c6f80e$export$2e2bcd8739ae039 = $63a32f1a35c6f80e$var$useDataMode
|
|
|
1220
1243
|
|
|
1221
1244
|
|
|
1222
1245
|
|
|
1223
|
-
const $
|
|
1224
|
-
|
|
1225
|
-
const dataProvider = (0, $bkNnK$react.useContext)((0, $bkNnK$reactadmin.DataProviderContext));
|
|
1246
|
+
const $c9933a88e2acc4da$var$useDataServers = ()=>{
|
|
1247
|
+
const dataProvider = (0, $bkNnK$reactadmin.useDataProvider)();
|
|
1226
1248
|
const [dataServers, setDataServers] = (0, $bkNnK$react.useState)();
|
|
1227
1249
|
(0, $bkNnK$react.useEffect)(()=>{
|
|
1228
|
-
dataProvider.getDataServers().then((results)=>
|
|
1250
|
+
dataProvider.getDataServers().then((results)=>{
|
|
1251
|
+
setDataServers(results);
|
|
1252
|
+
});
|
|
1229
1253
|
}, [
|
|
1230
1254
|
dataProvider,
|
|
1231
1255
|
setDataServers
|
|
1232
1256
|
]);
|
|
1233
1257
|
return dataServers;
|
|
1234
1258
|
};
|
|
1235
|
-
var $
|
|
1259
|
+
var $c9933a88e2acc4da$export$2e2bcd8739ae039 = $c9933a88e2acc4da$var$useDataServers;
|
|
1236
1260
|
|
|
1237
1261
|
|
|
1238
1262
|
|
|
1239
1263
|
const $3158e0dc13ffffaa$var$useContainers = (resourceId, serverKeys = "@all")=>{
|
|
1240
1264
|
const dataModel = (0, $63a32f1a35c6f80e$export$2e2bcd8739ae039)(resourceId);
|
|
1241
|
-
const dataServers = (0, $
|
|
1265
|
+
const dataServers = (0, $c9933a88e2acc4da$export$2e2bcd8739ae039)();
|
|
1242
1266
|
const [containers, setContainers] = (0, $bkNnK$react.useState)();
|
|
1243
1267
|
(0, $bkNnK$react.useEffect)(()=>{
|
|
1244
1268
|
if (dataModel && dataServers) setContainers((0, $047a107b0d203793$export$2e2bcd8739ae039)(dataModel.types, serverKeys, dataServers));
|
|
@@ -1257,10 +1281,10 @@ var $3158e0dc13ffffaa$export$2e2bcd8739ae039 = $3158e0dc13ffffaa$var$useContaine
|
|
|
1257
1281
|
|
|
1258
1282
|
|
|
1259
1283
|
|
|
1260
|
-
const $
|
|
1284
|
+
const $ff3623bf1421ebcc$var$findCreateContainerWithTypes = (types, createServerKey, dataServers)=>{
|
|
1261
1285
|
const containers = [];
|
|
1262
|
-
|
|
1263
|
-
if (types.includes(type)) dataServers[createServerKey].containers[createServerKey][type].
|
|
1286
|
+
Object.keys(dataServers[createServerKey].containers?.[createServerKey] || {}).forEach((type)=>{
|
|
1287
|
+
if (types.includes(type)) dataServers[createServerKey].containers[createServerKey][type].forEach((path)=>{
|
|
1264
1288
|
const containerUri = (0, ($parcel$interopDefault($bkNnK$urljoin)))(dataServers[createServerKey].baseUrl, path);
|
|
1265
1289
|
if (!containers.includes(containerUri)) containers.push(containerUri);
|
|
1266
1290
|
});
|
|
@@ -1269,13 +1293,13 @@ const $b32fd11d6aa83d1c$var$findCreateContainerWithTypes = (types, createServerK
|
|
|
1269
1293
|
else if (containers.length > 1) throw new Error(`More than one container found matching with types ${JSON.stringify(types)}. You must set the create.server or create.container property for the resource.`);
|
|
1270
1294
|
return containers[0];
|
|
1271
1295
|
};
|
|
1272
|
-
var $
|
|
1296
|
+
var $ff3623bf1421ebcc$export$2e2bcd8739ae039 = $ff3623bf1421ebcc$var$findCreateContainerWithTypes;
|
|
1273
1297
|
|
|
1274
1298
|
|
|
1275
1299
|
|
|
1276
|
-
const $99ed32cbdb76cb50$var$useCreateContainer = (resourceId)=>{
|
|
1300
|
+
/** @deprecated Use "useCreateContainerUri" instead */ const $99ed32cbdb76cb50$var$useCreateContainer = (resourceId)=>{
|
|
1277
1301
|
const dataModel = (0, $63a32f1a35c6f80e$export$2e2bcd8739ae039)(resourceId);
|
|
1278
|
-
const dataServers = (0, $
|
|
1302
|
+
const dataServers = (0, $c9933a88e2acc4da$export$2e2bcd8739ae039)();
|
|
1279
1303
|
const [createContainer, setCreateContainer] = (0, $bkNnK$react.useState)();
|
|
1280
1304
|
(0, $bkNnK$react.useEffect)(()=>{
|
|
1281
1305
|
if (dataModel && dataServers) {
|
|
@@ -1283,10 +1307,10 @@ const $99ed32cbdb76cb50$var$useCreateContainer = (resourceId)=>{
|
|
|
1283
1307
|
const [serverKey, path] = Object.entries(dataModel.create.container)[0];
|
|
1284
1308
|
if (!serverKey || !dataServers[serverKey]) throw new Error(`Wrong key for the dataModel.create.container config of resource ${resourceId}`);
|
|
1285
1309
|
setCreateContainer((0, ($parcel$interopDefault($bkNnK$urljoin)))(dataServers[serverKey].baseUrl, path));
|
|
1286
|
-
} else if (dataModel.create?.server) setCreateContainer((0, $
|
|
1310
|
+
} else if (dataModel.create?.server) setCreateContainer((0, $ff3623bf1421ebcc$export$2e2bcd8739ae039)(dataModel.types, dataModel.create?.server, dataServers));
|
|
1287
1311
|
else {
|
|
1288
1312
|
const defaultServerKey = (0, $8f44b7c15b8b8e1d$export$2e2bcd8739ae039)("default", dataServers);
|
|
1289
|
-
setCreateContainer((0, $
|
|
1313
|
+
setCreateContainer((0, $ff3623bf1421ebcc$export$2e2bcd8739ae039)(dataModel.types, defaultServerKey, dataServers));
|
|
1290
1314
|
}
|
|
1291
1315
|
}
|
|
1292
1316
|
}, [
|
|
@@ -1302,19 +1326,50 @@ var $99ed32cbdb76cb50$export$2e2bcd8739ae039 = $99ed32cbdb76cb50$var$useCreateCo
|
|
|
1302
1326
|
|
|
1303
1327
|
|
|
1304
1328
|
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1329
|
+
|
|
1330
|
+
|
|
1331
|
+
|
|
1332
|
+
|
|
1333
|
+
const $20621bc841a5205a$var$useDataModels = ()=>{
|
|
1334
|
+
const dataProvider = (0, $bkNnK$reactadmin.useDataProvider)();
|
|
1308
1335
|
const [dataModels, setDataModels] = (0, $bkNnK$react.useState)();
|
|
1309
1336
|
(0, $bkNnK$react.useEffect)(()=>{
|
|
1310
|
-
dataProvider.getDataModels().then((results)=>
|
|
1337
|
+
dataProvider.getDataModels().then((results)=>{
|
|
1338
|
+
setDataModels(results);
|
|
1339
|
+
});
|
|
1311
1340
|
}, [
|
|
1312
1341
|
dataProvider,
|
|
1313
1342
|
setDataModels
|
|
1314
1343
|
]);
|
|
1315
1344
|
return dataModels;
|
|
1316
1345
|
};
|
|
1317
|
-
var $
|
|
1346
|
+
var $20621bc841a5205a$export$2e2bcd8739ae039 = $20621bc841a5205a$var$useDataModels;
|
|
1347
|
+
|
|
1348
|
+
|
|
1349
|
+
const $298b78bb7d4a3358$var$useCreateContainerUri = ()=>{
|
|
1350
|
+
const dataModels = (0, $20621bc841a5205a$export$2e2bcd8739ae039)();
|
|
1351
|
+
const dataServers = (0, $c9933a88e2acc4da$export$2e2bcd8739ae039)();
|
|
1352
|
+
const getContainerUri = (0, $bkNnK$react.useCallback)((resourceId)=>{
|
|
1353
|
+
if (!dataModels || !dataServers || !dataModels[resourceId]) return undefined;
|
|
1354
|
+
const dataModel = dataModels[resourceId];
|
|
1355
|
+
if (dataModel.create?.container) {
|
|
1356
|
+
const [serverKey, path] = Object.entries(dataModel.create.container)[0];
|
|
1357
|
+
if (!serverKey || !dataServers[serverKey]) throw new Error(`Wrong key for the dataModel.create.container config of resource ${resourceId}`);
|
|
1358
|
+
return (0, ($parcel$interopDefault($bkNnK$urljoin)))(dataServers[serverKey].baseUrl, path);
|
|
1359
|
+
}
|
|
1360
|
+
if (dataModel.create?.server) return (0, $ff3623bf1421ebcc$export$2e2bcd8739ae039)(dataModel.types, dataModel.create?.server, dataServers);
|
|
1361
|
+
const defaultServerKey = (0, $8f44b7c15b8b8e1d$export$2e2bcd8739ae039)("default", dataServers);
|
|
1362
|
+
if (!defaultServerKey) throw new Error(`No default dataServer found. You can set explicitly one setting the "default" attribute to true`);
|
|
1363
|
+
return (0, $ff3623bf1421ebcc$export$2e2bcd8739ae039)(dataModel.types, defaultServerKey, dataServers);
|
|
1364
|
+
}, [
|
|
1365
|
+
dataModels,
|
|
1366
|
+
dataServers
|
|
1367
|
+
]);
|
|
1368
|
+
return getContainerUri;
|
|
1369
|
+
};
|
|
1370
|
+
var $298b78bb7d4a3358$export$2e2bcd8739ae039 = $298b78bb7d4a3358$var$useCreateContainerUri;
|
|
1371
|
+
|
|
1372
|
+
|
|
1318
1373
|
|
|
1319
1374
|
|
|
1320
1375
|
|