@nmshd/runtime 1.0.8 → 1.1.0

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 (57) hide show
  1. package/dist/Runtime.d.ts +1 -1
  2. package/dist/Runtime.js +3 -4
  3. package/dist/Runtime.js.map +1 -1
  4. package/dist/buildInformation.js +4 -4
  5. package/dist/events/index.d.ts +1 -0
  6. package/dist/events/index.js +1 -0
  7. package/dist/events/index.js.map +1 -1
  8. package/dist/events/transport/MessageSentEvent.d.ts +6 -0
  9. package/dist/events/transport/MessageSentEvent.js +12 -0
  10. package/dist/events/transport/MessageSentEvent.js.map +1 -0
  11. package/dist/index.d.ts +0 -1
  12. package/dist/index.js +0 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/types/transport/RelationshipDTO.d.ts +9 -1
  15. package/dist/types/transport/RelationshipDTO.js +10 -0
  16. package/dist/types/transport/RelationshipDTO.js.map +1 -1
  17. package/dist/useCases/transport/account/SyncEverything.d.ts +1 -2
  18. package/dist/useCases/transport/account/SyncEverything.js +1 -2
  19. package/dist/useCases/transport/account/SyncEverything.js.map +1 -1
  20. package/dist/useCases/transport/messages/SendMessage.d.ts +3 -2
  21. package/dist/useCases/transport/messages/SendMessage.js +7 -1
  22. package/dist/useCases/transport/messages/SendMessage.js.map +1 -1
  23. package/dist/useCases/transport/relationships/AcceptRelationshipChange.d.ts +3 -2
  24. package/dist/useCases/transport/relationships/AcceptRelationshipChange.js +9 -3
  25. package/dist/useCases/transport/relationships/AcceptRelationshipChange.js.map +1 -1
  26. package/dist/useCases/transport/relationships/CreateRelationship.d.ts +3 -2
  27. package/dist/useCases/transport/relationships/CreateRelationship.js +8 -2
  28. package/dist/useCases/transport/relationships/CreateRelationship.js.map +1 -1
  29. package/dist/useCases/transport/relationships/RejectRelationshipChange.d.ts +3 -2
  30. package/dist/useCases/transport/relationships/RejectRelationshipChange.js +9 -3
  31. package/dist/useCases/transport/relationships/RejectRelationshipChange.js.map +1 -1
  32. package/dist/useCases/transport/relationships/RevokeRelationshipChange.d.ts +3 -2
  33. package/dist/useCases/transport/relationships/RevokeRelationshipChange.js +9 -3
  34. package/dist/useCases/transport/relationships/RevokeRelationshipChange.js.map +1 -1
  35. package/lib-web/nmshd.runtime.js +83 -183
  36. package/lib-web/nmshd.runtime.js.map +1 -1
  37. package/lib-web/nmshd.runtime.min.js +1 -1
  38. package/lib-web/nmshd.runtime.min.js.map +1 -1
  39. package/package.json +3 -3
  40. package/dist/eventBus/EventBus.d.ts +0 -14
  41. package/dist/eventBus/EventBus.js +0 -11
  42. package/dist/eventBus/EventBus.js.map +0 -1
  43. package/dist/eventBus/SubscriptionTargetInfo.d.ts +0 -6
  44. package/dist/eventBus/SubscriptionTargetInfo.js +0 -36
  45. package/dist/eventBus/SubscriptionTargetInfo.js.map +0 -1
  46. package/dist/eventBus/eventEmitter2/EventEmitter2EventBus.d.ts +0 -15
  47. package/dist/eventBus/eventEmitter2/EventEmitter2EventBus.js +0 -58
  48. package/dist/eventBus/eventEmitter2/EventEmitter2EventBus.js.map +0 -1
  49. package/dist/eventBus/index.d.ts +0 -2
  50. package/dist/eventBus/index.js +0 -15
  51. package/dist/eventBus/index.js.map +0 -1
  52. package/dist/eventBus/reflection/Constants.d.ts +0 -1
  53. package/dist/eventBus/reflection/Constants.js +0 -5
  54. package/dist/eventBus/reflection/Constants.js.map +0 -1
  55. package/dist/eventBus/reflection/Reflection.d.ts +0 -5
  56. package/dist/eventBus/reflection/Reflection.js +0 -21
  57. package/dist/eventBus/reflection/Reflection.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nmshd/runtime",
3
- "version": "1.0.8",
3
+ "version": "1.1.0",
4
4
  "description": "The Enmeshed client runtime.",
5
5
  "homepage": "https://enmeshed.eu",
6
6
  "license": "MIT",
@@ -78,13 +78,13 @@
78
78
  "jest": "^27.3.1",
79
79
  "madge": "^5.0.1",
80
80
  "nodemon": "^2.0.15",
81
- "prettier": "^2.4.1",
81
+ "prettier": "^2.5.0",
82
82
  "ts-jest": "^27.0.7",
83
83
  "ts-node": "^10.4.0",
84
84
  "ts-json-schema-generator": "^0.97.0",
85
85
  "tsconfig-paths": "^3.12.0",
86
86
  "typescript": "^4.5.2",
87
- "webpack": "^5.64.2",
87
+ "webpack": "^5.64.4",
88
88
  "webpack-cli": "^4.9.1"
89
89
  },
90
90
  "publishConfig": {
@@ -1,14 +0,0 @@
1
- import { Event } from "../events/Event";
2
- export declare type EventHandler<TEvent> = (event: TEvent) => void;
3
- export declare type SubscriptionTarget = string | Function;
4
- export declare abstract class EventBus {
5
- abstract subscribe<TEvent = any>(namespace: string, handler: EventHandler<TEvent>): number;
6
- abstract subscribe<TEvent = any>(eventConstructor: Function, handler: EventHandler<TEvent>): number;
7
- abstract subscribe<TEvent = any>(subscriptionTarget: SubscriptionTarget, handler: EventHandler<TEvent>): number;
8
- abstract subscribeOnce<TEvent = any>(namespace: string, handler: EventHandler<TEvent>): number;
9
- abstract subscribeOnce<TEvent = any>(eventConstructor: Function, handler: EventHandler<TEvent>): number;
10
- abstract subscribeOnce<TEvent = any>(subscriptionTarget: SubscriptionTarget, handler: EventHandler<TEvent>): number;
11
- abstract unsubscribe(subscriptionTarget: SubscriptionTarget, subscriptionId: number): boolean;
12
- abstract publish(event: object): void;
13
- }
14
- export declare function getEventNamespaceFromObject(targetObject: Event): string;
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getEventNamespaceFromObject = exports.EventBus = void 0;
4
- class EventBus {
5
- }
6
- exports.EventBus = EventBus;
7
- function getEventNamespaceFromObject(targetObject) {
8
- return targetObject.namespace;
9
- }
10
- exports.getEventNamespaceFromObject = getEventNamespaceFromObject;
11
- //# sourceMappingURL=EventBus.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventBus.js","sourceRoot":"","sources":["../../src/eventBus/EventBus.ts"],"names":[],"mappings":";;;AAKA,MAAsB,QAAQ;CAY7B;AAZD,4BAYC;AAED,SAAgB,2BAA2B,CAAC,YAAmB;IAC3D,OAAO,YAAY,CAAC,SAAS,CAAC;AAClC,CAAC;AAFD,kEAEC"}
@@ -1,6 +0,0 @@
1
- export declare abstract class SubscriptionTargetInfo {
2
- namespace: string;
3
- protected constructor(namespace: string);
4
- static from(target: string | Function): SubscriptionTargetInfo;
5
- abstract isCompatibleWith(event: any): boolean;
6
- }
@@ -1,36 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SubscriptionTargetInfo = void 0;
4
- class SubscriptionTargetInfo {
5
- constructor(namespace) {
6
- this.namespace = namespace;
7
- }
8
- static from(target) {
9
- if (target instanceof Function) {
10
- return new ConstructorSubscriptionTargetInfo(target);
11
- }
12
- return new NamespaceSubscriptionTargetInfo(target);
13
- }
14
- }
15
- exports.SubscriptionTargetInfo = SubscriptionTargetInfo;
16
- class ConstructorSubscriptionTargetInfo extends SubscriptionTargetInfo {
17
- constructor(constructorFunction) {
18
- super(getEventNamespaceFromClass(constructorFunction));
19
- this.constructorFunction = constructorFunction;
20
- }
21
- isCompatibleWith(event) {
22
- return event instanceof this.constructorFunction;
23
- }
24
- }
25
- class NamespaceSubscriptionTargetInfo extends SubscriptionTargetInfo {
26
- constructor(namespace) {
27
- super(namespace);
28
- }
29
- isCompatibleWith(_event) {
30
- return true;
31
- }
32
- }
33
- function getEventNamespaceFromClass(targetClass) {
34
- return targetClass.namespace;
35
- }
36
- //# sourceMappingURL=SubscriptionTargetInfo.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SubscriptionTargetInfo.js","sourceRoot":"","sources":["../../src/eventBus/SubscriptionTargetInfo.ts"],"names":[],"mappings":";;;AAAA,MAAsB,sBAAsB;IACxC,YAA6B,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;IAAG,CAAC;IAE3C,MAAM,CAAC,IAAI,CAAC,MAAyB;QACxC,IAAI,MAAM,YAAY,QAAQ,EAAE;YAC5B,OAAO,IAAI,iCAAiC,CAAC,MAAM,CAAC,CAAC;SACxD;QAED,OAAO,IAAI,+BAA+B,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;CAGJ;AAZD,wDAYC;AAED,MAAM,iCAAkC,SAAQ,sBAAsB;IAClE,YAA0B,mBAA6B;QACnD,KAAK,CAAC,0BAA0B,CAAC,mBAAmB,CAAC,CAAC,CAAC;QADjC,wBAAmB,GAAnB,mBAAmB,CAAU;IAEvD,CAAC;IAEM,gBAAgB,CAAC,KAAU;QAC9B,OAAO,KAAK,YAAY,IAAI,CAAC,mBAAmB,CAAC;IACrD,CAAC;CACJ;AAED,MAAM,+BAAgC,SAAQ,sBAAsB;IAChE,YAAmB,SAAiB;QAChC,KAAK,CAAC,SAAS,CAAC,CAAC;IACrB,CAAC;IAEM,gBAAgB,CAAC,MAAW;QAC/B,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAED,SAAS,0BAA0B,CAAC,WAAqB;IACrD,OAAQ,WAAmB,CAAC,SAAS,CAAC;AAC1C,CAAC"}
@@ -1,15 +0,0 @@
1
- import "reflect-metadata";
2
- import { Event } from "../../events/Event";
3
- import { EventBus, EventHandler, SubscriptionTarget } from "../EventBus";
4
- export declare class EventEmitter2EventBus implements EventBus {
5
- private readonly emitter;
6
- private readonly wrappers;
7
- private nextId;
8
- constructor();
9
- subscribe<TEvent = any>(subscriptionTarget: SubscriptionTarget, handler: EventHandler<TEvent>): number;
10
- subscribeOnce<TEvent = any>(subscriptionTarget: SubscriptionTarget, handler: EventHandler<TEvent>): number;
11
- unsubscribe(subscriptionTarget: SubscriptionTarget, subscriptionId: number): boolean;
12
- private registerHandler;
13
- private unregisterHandler;
14
- publish(event: Event): void;
15
- }
@@ -1,58 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EventEmitter2EventBus = void 0;
4
- const eventemitter2_1 = require("eventemitter2");
5
- require("reflect-metadata");
6
- const EventBus_1 = require("../EventBus");
7
- const SubscriptionTargetInfo_1 = require("../SubscriptionTargetInfo");
8
- class EventEmitter2EventBus {
9
- constructor() {
10
- this.wrappers = new Map();
11
- this.nextId = 0;
12
- this.emitter = new eventemitter2_1.EventEmitter2({ wildcard: true, maxListeners: 50, verboseMemoryLeak: true });
13
- }
14
- subscribe(subscriptionTarget, handler) {
15
- return this.registerHandler(subscriptionTarget, handler);
16
- }
17
- subscribeOnce(subscriptionTarget, handler) {
18
- return this.registerHandler(subscriptionTarget, handler, true);
19
- }
20
- unsubscribe(subscriptionTarget, subscriptionId) {
21
- return this.unregisterHandler(subscriptionTarget, subscriptionId);
22
- }
23
- registerHandler(subscriptionTarget, handler, isOneTimeHandler = false) {
24
- const subscriptionTargetInfo = SubscriptionTargetInfo_1.SubscriptionTargetInfo.from(subscriptionTarget);
25
- const handlerId = this.nextId++;
26
- const handlerWrapper = (event) => {
27
- if (!subscriptionTargetInfo.isCompatibleWith(event)) {
28
- return;
29
- }
30
- handler(event);
31
- if (isOneTimeHandler) {
32
- this.unsubscribe(subscriptionTarget, handlerId);
33
- }
34
- };
35
- this.wrappers.set(handlerId, handlerWrapper);
36
- this.emitter.on(subscriptionTargetInfo.namespace, handlerWrapper);
37
- return handlerId;
38
- }
39
- unregisterHandler(subscriptionTarget, handlerId) {
40
- const subscriptionTargetInfo = SubscriptionTargetInfo_1.SubscriptionTargetInfo.from(subscriptionTarget);
41
- const handlerWrapper = this.wrappers.get(handlerId);
42
- if (!handlerWrapper) {
43
- return false;
44
- }
45
- this.emitter.off(subscriptionTargetInfo.namespace, handlerWrapper);
46
- this.wrappers.delete(handlerId);
47
- return true;
48
- }
49
- publish(event) {
50
- const namespace = (0, EventBus_1.getEventNamespaceFromObject)(event);
51
- if (!namespace) {
52
- throw Error("The event needs a namespace. Use the EventNamespace-decorator in order to define a namespace for a event.");
53
- }
54
- this.emitter.emit(namespace, event);
55
- }
56
- }
57
- exports.EventEmitter2EventBus = EventEmitter2EventBus;
58
- //# sourceMappingURL=EventEmitter2EventBus.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventEmitter2EventBus.js","sourceRoot":"","sources":["../../../src/eventBus/eventEmitter2/EventEmitter2EventBus.ts"],"names":[],"mappings":";;;AAAA,iDAA0D;AAC1D,4BAA0B;AAE1B,0CAAsG;AACtG,sEAAmE;AAEnE,MAAa,qBAAqB;IAM9B;QAHiB,aAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;QAClD,WAAM,GAAG,CAAC,CAAC;QAGf,IAAI,CAAC,OAAO,GAAG,IAAI,6BAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;IACpG,CAAC;IAEM,SAAS,CAAe,kBAAsC,EAAE,OAA6B;QAChG,OAAO,IAAI,CAAC,eAAe,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;IAEM,aAAa,CAAe,kBAAsC,EAAE,OAA6B;QACpG,OAAO,IAAI,CAAC,eAAe,CAAC,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACnE,CAAC;IAEM,WAAW,CAAC,kBAAsC,EAAE,cAAsB;QAC7E,OAAO,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;IACtE,CAAC;IAEO,eAAe,CAAS,kBAAsC,EAAE,OAA6B,EAAE,gBAAgB,GAAG,KAAK;QAC3H,MAAM,sBAAsB,GAAG,+CAAsB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/E,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAEhC,MAAM,cAAc,GAAG,CAAC,KAAa,EAAE,EAAE;YACrC,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE;gBACjD,OAAO;aACV;YAED,OAAO,CAAC,KAAK,CAAC,CAAC;YAEf,IAAI,gBAAgB,EAAE;gBAClB,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;aACnD;QACL,CAAC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAE7C,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,sBAAsB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAClE,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,iBAAiB,CAAC,kBAAsC,EAAE,SAAiB;QAC/E,MAAM,sBAAsB,GAAG,+CAAsB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/E,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,cAAc,EAAE;YACjB,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,OAAO,CAAC,KAAY;QACvB,MAAM,SAAS,GAAG,IAAA,sCAA2B,EAAC,KAAK,CAAC,CAAC;QAErD,IAAI,CAAC,SAAS,EAAE;YACZ,MAAM,KAAK,CAAC,2GAA2G,CAAC,CAAC;SAC5H;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;CACJ;AAjED,sDAiEC"}
@@ -1,2 +0,0 @@
1
- export * from "./EventBus";
2
- export * from "./eventEmitter2/EventEmitter2EventBus";
@@ -1,15 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
- };
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- __exportStar(require("./EventBus"), exports);
14
- __exportStar(require("./eventEmitter2/EventEmitter2EventBus"), exports);
15
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/eventBus/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAA2B;AAC3B,wEAAsD"}
@@ -1 +0,0 @@
1
- export declare const CUSTOM_METADATA_NAMESPACE = "custom:annotations";
@@ -1,5 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CUSTOM_METADATA_NAMESPACE = void 0;
4
- exports.CUSTOM_METADATA_NAMESPACE = "custom:annotations";
5
- //# sourceMappingURL=Constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Constants.js","sourceRoot":"","sources":["../../../src/eventBus/reflection/Constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,yBAAyB,GAAG,oBAAoB,CAAC"}
@@ -1,5 +0,0 @@
1
- export declare function getCustomClassDecoratorValue<T>(decoratorKey: string, targetClass: Function): T | undefined;
2
- export declare function getCustomClassDecorators(targetClass: Function): {
3
- key: string;
4
- value: any;
5
- }[];
@@ -1,21 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getCustomClassDecorators = exports.getCustomClassDecoratorValue = void 0;
4
- const Constants_1 = require("./Constants");
5
- function getCustomClassDecoratorValue(decoratorKey, targetClass) {
6
- const decorators = getCustomClassDecorators(targetClass);
7
- const decorator = decorators.find((d) => d.key.endsWith(decoratorKey));
8
- return decorator ? decorator.value : undefined;
9
- }
10
- exports.getCustomClassDecoratorValue = getCustomClassDecoratorValue;
11
- function getCustomClassDecorators(targetClass) {
12
- const keys = Reflect.getMetadataKeys(targetClass);
13
- const decorators = keys
14
- .filter((key) => key.toString().startsWith(Constants_1.CUSTOM_METADATA_NAMESPACE))
15
- .map((key) => {
16
- return { key: key, value: Reflect.getMetadata(key, targetClass) };
17
- });
18
- return decorators;
19
- }
20
- exports.getCustomClassDecorators = getCustomClassDecorators;
21
- //# sourceMappingURL=Reflection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Reflection.js","sourceRoot":"","sources":["../../../src/eventBus/reflection/Reflection.ts"],"names":[],"mappings":";;;AAAA,2CAAwD;AAExD,SAAgB,4BAA4B,CAAI,YAAoB,EAAE,WAAqB;IACvF,MAAM,UAAU,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAEzD,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACvE,OAAO,SAAS,CAAC,CAAC,CAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AALD,oEAKC;AAED,SAAgB,wBAAwB,CAAC,WAAqB;IAC1D,MAAM,IAAI,GAAa,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IAE5D,MAAM,UAAU,GAAG,IAAI;SAClB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,qCAAyB,CAAC,CAAC;SACrE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACT,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC;IACtE,CAAC,CAAC,CAAC;IAEP,OAAO,UAAU,CAAC;AACtB,CAAC;AAVD,4DAUC"}