@decaf-ts/for-fabric 0.0.2

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 (205) hide show
  1. package/LICENSE.md +22 -0
  2. package/README.md +647 -0
  3. package/dist/for-fabric.cjs +6223 -0
  4. package/dist/for-fabric.esm.cjs +6180 -0
  5. package/lib/client/FabricClientAdapter.cjs +760 -0
  6. package/lib/client/FabricClientAdapter.d.ts +381 -0
  7. package/lib/client/FabricClientDispatch.cjs +186 -0
  8. package/lib/client/FabricClientDispatch.d.ts +125 -0
  9. package/lib/client/FabricClientRepository.cjs +131 -0
  10. package/lib/client/FabricClientRepository.d.ts +100 -0
  11. package/lib/client/erc20/erc20ClientRepository.cjs +343 -0
  12. package/lib/client/erc20/erc20ClientRepository.d.ts +254 -0
  13. package/lib/client/fabric-fs.cjs +234 -0
  14. package/lib/client/fabric-fs.d.ts +92 -0
  15. package/lib/client/index.cjs +30 -0
  16. package/lib/client/index.d.ts +13 -0
  17. package/lib/client/logging.cjs +102 -0
  18. package/lib/client/logging.d.ts +60 -0
  19. package/lib/client/services/LoggedService.cjs +47 -0
  20. package/lib/client/services/LoggedService.d.ts +42 -0
  21. package/lib/client/services/constants.cjs +3 -0
  22. package/lib/client/services/constants.d.ts +15 -0
  23. package/lib/client/services/enrollementService.cjs +344 -0
  24. package/lib/client/services/enrollementService.d.ts +176 -0
  25. package/lib/client/services/index.cjs +18 -0
  26. package/lib/client/services/index.d.ts +1 -0
  27. package/lib/contracts/ContractAdapter.cjs +730 -0
  28. package/lib/contracts/ContractAdapter.d.ts +296 -0
  29. package/lib/contracts/ContractContext.cjs +85 -0
  30. package/lib/contracts/ContractContext.d.ts +64 -0
  31. package/lib/contracts/ContractPrivateDataAdapter.cjs +281 -0
  32. package/lib/contracts/ContractPrivateDataAdapter.d.ts +74 -0
  33. package/lib/contracts/FabricConstruction.cjs +441 -0
  34. package/lib/contracts/FabricConstruction.d.ts +304 -0
  35. package/lib/contracts/FabricContractRepository.cjs +306 -0
  36. package/lib/contracts/FabricContractRepository.d.ts +162 -0
  37. package/lib/contracts/FabricContractRepositoryObservableHandler.cjs +85 -0
  38. package/lib/contracts/FabricContractRepositoryObservableHandler.d.ts +62 -0
  39. package/lib/contracts/FabricContractSequence.cjs +139 -0
  40. package/lib/contracts/FabricContractSequence.d.ts +61 -0
  41. package/lib/contracts/FabricContractStatement.cjs +119 -0
  42. package/lib/contracts/FabricContractStatement.d.ts +34 -0
  43. package/lib/contracts/PrivateSequence.cjs +36 -0
  44. package/lib/contracts/PrivateSequence.d.ts +15 -0
  45. package/lib/contracts/crud/crud-contract.cjs +257 -0
  46. package/lib/contracts/crud/crud-contract.d.ts +168 -0
  47. package/lib/contracts/crud/index.cjs +19 -0
  48. package/lib/contracts/crud/index.d.ts +2 -0
  49. package/lib/contracts/crud/serialized-crud-contract.cjs +172 -0
  50. package/lib/contracts/crud/serialized-crud-contract.d.ts +37 -0
  51. package/lib/contracts/erc20/erc20contract.cjs +569 -0
  52. package/lib/contracts/erc20/erc20contract.d.ts +151 -0
  53. package/lib/contracts/erc20/index.cjs +21 -0
  54. package/lib/contracts/erc20/index.d.ts +2 -0
  55. package/lib/contracts/erc20/models.cjs +209 -0
  56. package/lib/contracts/erc20/models.d.ts +114 -0
  57. package/lib/contracts/index.cjs +32 -0
  58. package/lib/contracts/index.d.ts +15 -0
  59. package/lib/contracts/logging.cjs +96 -0
  60. package/lib/contracts/logging.d.ts +49 -0
  61. package/lib/contracts/private-data.cjs +121 -0
  62. package/lib/contracts/private-data.d.ts +16 -0
  63. package/lib/contracts/types.cjs +3 -0
  64. package/lib/contracts/types.d.ts +26 -0
  65. package/lib/esm/client/FabricClientAdapter.d.ts +381 -0
  66. package/lib/esm/client/FabricClientAdapter.js +723 -0
  67. package/lib/esm/client/FabricClientDispatch.d.ts +125 -0
  68. package/lib/esm/client/FabricClientDispatch.js +182 -0
  69. package/lib/esm/client/FabricClientRepository.d.ts +100 -0
  70. package/lib/esm/client/FabricClientRepository.js +127 -0
  71. package/lib/esm/client/erc20/erc20ClientRepository.d.ts +254 -0
  72. package/lib/esm/client/erc20/erc20ClientRepository.js +339 -0
  73. package/lib/esm/client/fabric-fs.d.ts +92 -0
  74. package/lib/esm/client/fabric-fs.js +191 -0
  75. package/lib/esm/client/index.d.ts +13 -0
  76. package/lib/esm/client/index.js +14 -0
  77. package/lib/esm/client/logging.d.ts +60 -0
  78. package/lib/esm/client/logging.js +98 -0
  79. package/lib/esm/client/services/LoggedService.d.ts +42 -0
  80. package/lib/esm/client/services/LoggedService.js +43 -0
  81. package/lib/esm/client/services/constants.d.ts +15 -0
  82. package/lib/esm/client/services/constants.js +2 -0
  83. package/lib/esm/client/services/enrollementService.d.ts +176 -0
  84. package/lib/esm/client/services/enrollementService.js +337 -0
  85. package/lib/esm/client/services/index.d.ts +1 -0
  86. package/lib/esm/client/services/index.js +2 -0
  87. package/lib/esm/contracts/ContractAdapter.d.ts +296 -0
  88. package/lib/esm/contracts/ContractAdapter.js +724 -0
  89. package/lib/esm/contracts/ContractContext.d.ts +64 -0
  90. package/lib/esm/contracts/ContractContext.js +81 -0
  91. package/lib/esm/contracts/ContractPrivateDataAdapter.d.ts +74 -0
  92. package/lib/esm/contracts/ContractPrivateDataAdapter.js +277 -0
  93. package/lib/esm/contracts/FabricConstruction.d.ts +304 -0
  94. package/lib/esm/contracts/FabricConstruction.js +433 -0
  95. package/lib/esm/contracts/FabricContractRepository.d.ts +162 -0
  96. package/lib/esm/contracts/FabricContractRepository.js +302 -0
  97. package/lib/esm/contracts/FabricContractRepositoryObservableHandler.d.ts +62 -0
  98. package/lib/esm/contracts/FabricContractRepositoryObservableHandler.js +81 -0
  99. package/lib/esm/contracts/FabricContractSequence.d.ts +61 -0
  100. package/lib/esm/contracts/FabricContractSequence.js +135 -0
  101. package/lib/esm/contracts/FabricContractStatement.d.ts +34 -0
  102. package/lib/esm/contracts/FabricContractStatement.js +115 -0
  103. package/lib/esm/contracts/PrivateSequence.d.ts +15 -0
  104. package/lib/esm/contracts/PrivateSequence.js +33 -0
  105. package/lib/esm/contracts/crud/crud-contract.d.ts +168 -0
  106. package/lib/esm/contracts/crud/crud-contract.js +253 -0
  107. package/lib/esm/contracts/crud/index.d.ts +2 -0
  108. package/lib/esm/contracts/crud/index.js +3 -0
  109. package/lib/esm/contracts/crud/serialized-crud-contract.d.ts +37 -0
  110. package/lib/esm/contracts/crud/serialized-crud-contract.js +168 -0
  111. package/lib/esm/contracts/erc20/erc20contract.d.ts +151 -0
  112. package/lib/esm/contracts/erc20/erc20contract.js +565 -0
  113. package/lib/esm/contracts/erc20/index.d.ts +2 -0
  114. package/lib/esm/contracts/erc20/index.js +4 -0
  115. package/lib/esm/contracts/erc20/models.d.ts +114 -0
  116. package/lib/esm/contracts/erc20/models.js +206 -0
  117. package/lib/esm/contracts/index.d.ts +15 -0
  118. package/lib/esm/contracts/index.js +16 -0
  119. package/lib/esm/contracts/logging.d.ts +49 -0
  120. package/lib/esm/contracts/logging.js +92 -0
  121. package/lib/esm/contracts/private-data.d.ts +16 -0
  122. package/lib/esm/contracts/private-data.js +113 -0
  123. package/lib/esm/contracts/types.d.ts +26 -0
  124. package/lib/esm/contracts/types.js +2 -0
  125. package/lib/esm/index.d.ts +8 -0
  126. package/lib/esm/index.js +9 -0
  127. package/lib/esm/shared/ClientSerializer.d.ts +52 -0
  128. package/lib/esm/shared/ClientSerializer.js +80 -0
  129. package/lib/esm/shared/DeterministicSerializer.d.ts +40 -0
  130. package/lib/esm/shared/DeterministicSerializer.js +50 -0
  131. package/lib/esm/shared/SimpleDeterministicSerializer.d.ts +7 -0
  132. package/lib/esm/shared/SimpleDeterministicSerializer.js +42 -0
  133. package/lib/esm/shared/constants.d.ts +39 -0
  134. package/lib/esm/shared/constants.js +42 -0
  135. package/lib/esm/shared/crypto.d.ts +107 -0
  136. package/lib/esm/shared/crypto.js +331 -0
  137. package/lib/esm/shared/decorators.d.ts +24 -0
  138. package/lib/esm/shared/decorators.js +98 -0
  139. package/lib/esm/shared/erc20/erc20-constants.d.ts +25 -0
  140. package/lib/esm/shared/erc20/erc20-constants.js +27 -0
  141. package/lib/esm/shared/errors.d.ts +116 -0
  142. package/lib/esm/shared/errors.js +132 -0
  143. package/lib/esm/shared/events.d.ts +39 -0
  144. package/lib/esm/shared/events.js +47 -0
  145. package/lib/esm/shared/fabric-types.d.ts +33 -0
  146. package/lib/esm/shared/fabric-types.js +2 -0
  147. package/lib/esm/shared/index.d.ts +13 -0
  148. package/lib/esm/shared/index.js +14 -0
  149. package/lib/esm/shared/interfaces/Checkable.d.ts +21 -0
  150. package/lib/esm/shared/interfaces/Checkable.js +2 -0
  151. package/lib/esm/shared/math.d.ts +34 -0
  152. package/lib/esm/shared/math.js +61 -0
  153. package/lib/esm/shared/model/Identity.d.ts +42 -0
  154. package/lib/esm/shared/model/Identity.js +78 -0
  155. package/lib/esm/shared/model/IdentityCredentials.d.ts +41 -0
  156. package/lib/esm/shared/model/IdentityCredentials.js +74 -0
  157. package/lib/esm/shared/model/index.d.ts +1 -0
  158. package/lib/esm/shared/model/index.js +2 -0
  159. package/lib/esm/shared/model/utils.d.ts +60 -0
  160. package/lib/esm/shared/model/utils.js +108 -0
  161. package/lib/esm/shared/types.d.ts +79 -0
  162. package/lib/esm/shared/types.js +2 -0
  163. package/lib/esm/shared/utils.d.ts +55 -0
  164. package/lib/esm/shared/utils.js +148 -0
  165. package/lib/index.cjs +25 -0
  166. package/lib/index.d.ts +8 -0
  167. package/lib/shared/ClientSerializer.cjs +84 -0
  168. package/lib/shared/ClientSerializer.d.ts +52 -0
  169. package/lib/shared/DeterministicSerializer.cjs +54 -0
  170. package/lib/shared/DeterministicSerializer.d.ts +40 -0
  171. package/lib/shared/SimpleDeterministicSerializer.cjs +46 -0
  172. package/lib/shared/SimpleDeterministicSerializer.d.ts +7 -0
  173. package/lib/shared/constants.cjs +45 -0
  174. package/lib/shared/constants.d.ts +39 -0
  175. package/lib/shared/crypto.cjs +369 -0
  176. package/lib/shared/crypto.d.ts +107 -0
  177. package/lib/shared/decorators.cjs +105 -0
  178. package/lib/shared/decorators.d.ts +24 -0
  179. package/lib/shared/erc20/erc20-constants.cjs +30 -0
  180. package/lib/shared/erc20/erc20-constants.d.ts +25 -0
  181. package/lib/shared/errors.cjs +142 -0
  182. package/lib/shared/errors.d.ts +116 -0
  183. package/lib/shared/events.cjs +51 -0
  184. package/lib/shared/events.d.ts +39 -0
  185. package/lib/shared/fabric-types.cjs +4 -0
  186. package/lib/shared/fabric-types.d.ts +33 -0
  187. package/lib/shared/index.cjs +30 -0
  188. package/lib/shared/index.d.ts +13 -0
  189. package/lib/shared/interfaces/Checkable.cjs +3 -0
  190. package/lib/shared/interfaces/Checkable.d.ts +21 -0
  191. package/lib/shared/math.cjs +66 -0
  192. package/lib/shared/math.d.ts +34 -0
  193. package/lib/shared/model/Identity.cjs +81 -0
  194. package/lib/shared/model/Identity.d.ts +42 -0
  195. package/lib/shared/model/IdentityCredentials.cjs +77 -0
  196. package/lib/shared/model/IdentityCredentials.d.ts +41 -0
  197. package/lib/shared/model/index.cjs +18 -0
  198. package/lib/shared/model/index.d.ts +1 -0
  199. package/lib/shared/model/utils.cjs +114 -0
  200. package/lib/shared/model/utils.d.ts +60 -0
  201. package/lib/shared/types.cjs +3 -0
  202. package/lib/shared/types.d.ts +79 -0
  203. package/lib/shared/utils.cjs +185 -0
  204. package/lib/shared/utils.d.ts +55 -0
  205. package/package.json +166 -0
@@ -0,0 +1,125 @@
1
+ import { Dispatch } from "@decaf-ts/core";
2
+ import { Client } from "@grpc/grpc-js";
3
+ import { FabricClientAdapter } from "./FabricClientAdapter";
4
+ /**
5
+ * @description Event dispatcher for Hyperledger Fabric chaincode events
6
+ * @summary Listens for and processes events emitted by Fabric chaincode, dispatching them to registered observers
7
+ * @template PeerConfig - Configuration type for connecting to a Fabric peer
8
+ * @param client - gRPC client for connecting to the Fabric network
9
+ * @class FabricClientDispatch
10
+ * @example
11
+ * ```typescript
12
+ * // Create a new FabricDispatch instance
13
+ * const client = await FabricAdapter.getClient(peerConfig);
14
+ * const dispatch = new FabricDispatch(client);
15
+ *
16
+ * // Configure the dispatch with peer configuration
17
+ * dispatch.configure(peerConfig);
18
+ *
19
+ * // Register an observer for a specific table and event
20
+ * dispatch.observe('users', 'create', (id) => {
21
+ * console.log(`User created: ${id}`);
22
+ * });
23
+ *
24
+ * // Start listening for events
25
+ * await dispatch.start();
26
+ * ```
27
+ * @mermaid
28
+ * sequenceDiagram
29
+ * participant Client
30
+ * participant FabricDispatch
31
+ * participant Gateway
32
+ * participant Network
33
+ * participant Chaincode
34
+ *
35
+ * Client->>FabricDispatch: new FabricDispatch(client)
36
+ * Client->>FabricDispatch: configure(peerConfig)
37
+ * Client->>FabricDispatch: observe(table, event, callback)
38
+ * Client->>FabricDispatch: start()
39
+ * FabricDispatch->>FabricDispatch: initialize()
40
+ * FabricDispatch->>Gateway: getGateway(config, client)
41
+ * Gateway->>Network: getNetwork(channel)
42
+ * Network->>Network: getChaincodeEvents(chaincodeName)
43
+ * FabricDispatch->>FabricDispatch: handleEvents()
44
+ * loop For each event
45
+ * Chaincode-->>FabricDispatch: ChaincodeEvent
46
+ * FabricDispatch->>FabricDispatch: parseEventName(eventName)
47
+ * FabricDispatch->>FabricDispatch: parsePayload(payload)
48
+ * FabricDispatch->>FabricDispatch: updateObservers(table, event, id)
49
+ * FabricDispatch-->>Client: callback(id)
50
+ * end
51
+ */
52
+ export declare class FabricClientDispatch extends Dispatch {
53
+ protected client: Client;
54
+ /**
55
+ * @description Event listening stack for chaincode events
56
+ */
57
+ private listeningStack?;
58
+ /**
59
+ * @description Text decoder for converting event payloads from bytes to strings
60
+ */
61
+ private decoder;
62
+ /**
63
+ * @description Creates a new FabricDispatch instance
64
+ * @summary Initializes a dispatcher for Fabric chaincode events
65
+ * @param {Client} client - gRPC client for connecting to the Fabric network
66
+ */
67
+ constructor(client: Client);
68
+ /**
69
+ * @description Closes the event listening connection
70
+ * @summary Stops listening for chaincode events and releases resources
71
+ * @return {Promise<void>} Promise that resolves when the connection is closed
72
+ */
73
+ close(): Promise<void>;
74
+ /**
75
+ * @description Parses event payload from binary format
76
+ * @summary Converts a Uint8Array containing JSON to an object with an id property
77
+ * @param {Uint8Array} jsonBytes - The binary payload from the chaincode event
78
+ * @return {{ id: string }} The parsed payload containing the record ID
79
+ */
80
+ private parsePayload;
81
+ /**
82
+ * @description Starts observing an adapter
83
+ * @summary Connects this dispatch to an adapter to monitor its operations
84
+ * @param {Adapter<any, any, any, any>} observer - The adapter to observe
85
+ * @return {void}
86
+ */
87
+ observe(observer: FabricClientAdapter): void;
88
+ /**
89
+ * @description Updates observers about a database event
90
+ * @summary Notifies observers about a change in the database
91
+ * @param {string} table - The name of the table where the change occurred
92
+ * @param {OperationKeys|BulkCrudOperationKeys|string} event - The type of operation that occurred
93
+ * @param {any} payload - The event payload
94
+ * @return {Promise<void>} A promise that resolves when all observers have been notified
95
+ */
96
+ updateObservers(table: string, event: string, payload: any): Promise<void>;
97
+ /**
98
+ * @description Processes incoming chaincode events
99
+ * @summary Listens for events from the chaincode and dispatches them to registered observers
100
+ * @return {Promise<void>} Promise that resolves when event handling stops
101
+ * @mermaid
102
+ * sequenceDiagram
103
+ * participant FabricDispatch
104
+ * participant EventStack
105
+ * participant EventParser
106
+ * participant Observers
107
+ *
108
+ * FabricDispatch->>FabricDispatch: handleEvents()
109
+ * FabricDispatch->>EventStack: for await (const evt of listeningStack)
110
+ * EventStack-->>FabricDispatch: ChaincodeEvent
111
+ * FabricDispatch->>EventParser: parseEventName(evt.eventName)
112
+ * EventParser-->>FabricDispatch: { table, event, owner }
113
+ * FabricDispatch->>FabricDispatch: Check if event is for this MSP
114
+ * FabricDispatch->>FabricDispatch: parsePayload(evt.payload)
115
+ * FabricDispatch->>Observers: updateObservers(table, event, payload.id)
116
+ * Observers-->>FabricDispatch: Callbacks executed
117
+ */
118
+ protected handleEvents(): Promise<void>;
119
+ /**
120
+ * @description Initializes the event listener
121
+ * @summary Sets up the connection to the Fabric network and starts listening for chaincode events
122
+ * @return {Promise<void>} Promise that resolves when initialization is complete
123
+ */
124
+ protected initialize(): Promise<void>;
125
+ }
@@ -0,0 +1,182 @@
1
+ import { Adapter, Dispatch, UnsupportedError } from "@decaf-ts/core";
2
+ import { FabricClientAdapter } from "./FabricClientAdapter.js";
3
+ import { InternalError } from "@decaf-ts/db-decorators";
4
+ import { parseEventName } from "./../shared/events.js";
5
+ /**
6
+ * @description Event dispatcher for Hyperledger Fabric chaincode events
7
+ * @summary Listens for and processes events emitted by Fabric chaincode, dispatching them to registered observers
8
+ * @template PeerConfig - Configuration type for connecting to a Fabric peer
9
+ * @param client - gRPC client for connecting to the Fabric network
10
+ * @class FabricClientDispatch
11
+ * @example
12
+ * ```typescript
13
+ * // Create a new FabricDispatch instance
14
+ * const client = await FabricAdapter.getClient(peerConfig);
15
+ * const dispatch = new FabricDispatch(client);
16
+ *
17
+ * // Configure the dispatch with peer configuration
18
+ * dispatch.configure(peerConfig);
19
+ *
20
+ * // Register an observer for a specific table and event
21
+ * dispatch.observe('users', 'create', (id) => {
22
+ * console.log(`User created: ${id}`);
23
+ * });
24
+ *
25
+ * // Start listening for events
26
+ * await dispatch.start();
27
+ * ```
28
+ * @mermaid
29
+ * sequenceDiagram
30
+ * participant Client
31
+ * participant FabricDispatch
32
+ * participant Gateway
33
+ * participant Network
34
+ * participant Chaincode
35
+ *
36
+ * Client->>FabricDispatch: new FabricDispatch(client)
37
+ * Client->>FabricDispatch: configure(peerConfig)
38
+ * Client->>FabricDispatch: observe(table, event, callback)
39
+ * Client->>FabricDispatch: start()
40
+ * FabricDispatch->>FabricDispatch: initialize()
41
+ * FabricDispatch->>Gateway: getGateway(config, client)
42
+ * Gateway->>Network: getNetwork(channel)
43
+ * Network->>Network: getChaincodeEvents(chaincodeName)
44
+ * FabricDispatch->>FabricDispatch: handleEvents()
45
+ * loop For each event
46
+ * Chaincode-->>FabricDispatch: ChaincodeEvent
47
+ * FabricDispatch->>FabricDispatch: parseEventName(eventName)
48
+ * FabricDispatch->>FabricDispatch: parsePayload(payload)
49
+ * FabricDispatch->>FabricDispatch: updateObservers(table, event, id)
50
+ * FabricDispatch-->>Client: callback(id)
51
+ * end
52
+ */
53
+ export class FabricClientDispatch extends Dispatch {
54
+ /**
55
+ * @description Creates a new FabricDispatch instance
56
+ * @summary Initializes a dispatcher for Fabric chaincode events
57
+ * @param {Client} client - gRPC client for connecting to the Fabric network
58
+ */
59
+ constructor(client) {
60
+ super();
61
+ this.client = client;
62
+ /**
63
+ * @description Text decoder for converting event payloads from bytes to strings
64
+ */
65
+ this.decoder = new TextDecoder("utf8");
66
+ }
67
+ /**
68
+ * @description Closes the event listening connection
69
+ * @summary Stops listening for chaincode events and releases resources
70
+ * @return {Promise<void>} Promise that resolves when the connection is closed
71
+ */
72
+ async close() {
73
+ if (this.listeningStack)
74
+ this.listeningStack.close();
75
+ }
76
+ /**
77
+ * @description Parses event payload from binary format
78
+ * @summary Converts a Uint8Array containing JSON to an object with an id property
79
+ * @param {Uint8Array} jsonBytes - The binary payload from the chaincode event
80
+ * @return {{ id: string }} The parsed payload containing the record ID
81
+ */
82
+ parsePayload(jsonBytes) {
83
+ const json = this.decoder.decode(jsonBytes);
84
+ return JSON.parse(json);
85
+ }
86
+ /**
87
+ * @description Starts observing an adapter
88
+ * @summary Connects this dispatch to an adapter to monitor its operations
89
+ * @param {Adapter<any, any, any, any>} observer - The adapter to observe
90
+ * @return {void}
91
+ */
92
+ observe(observer) {
93
+ if (!(observer instanceof FabricClientAdapter))
94
+ throw new UnsupportedError("Only FabricClientAdapter can be observed by dispatch");
95
+ this.adapter = observer;
96
+ this.models = Adapter.models(this.adapter.alias);
97
+ this.initialize().then(() => this.log.verbose(`Dispatch initialized for ${this.adapter.alias} adapter`));
98
+ }
99
+ /**
100
+ * @description Updates observers about a database event
101
+ * @summary Notifies observers about a change in the database
102
+ * @param {string} table - The name of the table where the change occurred
103
+ * @param {OperationKeys|BulkCrudOperationKeys|string} event - The type of operation that occurred
104
+ * @param {any} payload - The event payload
105
+ * @return {Promise<void>} A promise that resolves when all observers have been notified
106
+ */
107
+ async updateObservers(table, event, payload) {
108
+ if (!this.adapter) {
109
+ this.log.verbose(`No adapter observed for dispatch; skipping observer update for ${table}:${event}`);
110
+ return;
111
+ }
112
+ try {
113
+ await this.adapter.refresh(table, event, payload.id ? payload.id : undefined, payload);
114
+ }
115
+ catch (e) {
116
+ throw new InternalError(`Failed to refresh dispatch: ${e}`);
117
+ }
118
+ }
119
+ /**
120
+ * @description Processes incoming chaincode events
121
+ * @summary Listens for events from the chaincode and dispatches them to registered observers
122
+ * @return {Promise<void>} Promise that resolves when event handling stops
123
+ * @mermaid
124
+ * sequenceDiagram
125
+ * participant FabricDispatch
126
+ * participant EventStack
127
+ * participant EventParser
128
+ * participant Observers
129
+ *
130
+ * FabricDispatch->>FabricDispatch: handleEvents()
131
+ * FabricDispatch->>EventStack: for await (const evt of listeningStack)
132
+ * EventStack-->>FabricDispatch: ChaincodeEvent
133
+ * FabricDispatch->>EventParser: parseEventName(evt.eventName)
134
+ * EventParser-->>FabricDispatch: { table, event, owner }
135
+ * FabricDispatch->>FabricDispatch: Check if event is for this MSP
136
+ * FabricDispatch->>FabricDispatch: parsePayload(evt.payload)
137
+ * FabricDispatch->>Observers: updateObservers(table, event, payload.id)
138
+ * Observers-->>FabricDispatch: Callbacks executed
139
+ */
140
+ async handleEvents() {
141
+ if (!this.listeningStack)
142
+ throw new InternalError(`Event stack not initialized. Ensure that "startListening" is called before attempting this operation.`);
143
+ if (!this.adapter || !this.adapter.config)
144
+ throw new InternalError(`No adapter found. should be impossible`);
145
+ const log = this.log.for(this.handleEvents);
146
+ log.info(`Listening for incoming events on chaincode "${this.adapter.config.chaincodeName}" on channel "${this.adapter.config.channel}"...`);
147
+ try {
148
+ for await (const evt of this.listeningStack) {
149
+ const { table, event, owner } = parseEventName(evt.eventName);
150
+ if (owner && owner !== this.adapter.config?.mspId)
151
+ continue;
152
+ const payload = this.parsePayload(evt.payload);
153
+ try {
154
+ await this.updateObservers(table ? table : this.models[0].name, event, payload);
155
+ }
156
+ catch (e) {
157
+ log.error(`Failed update observables for table ${table} event ${event} id: ${payload.id}: ${e}`);
158
+ }
159
+ }
160
+ }
161
+ catch (e) {
162
+ log.error(`Failed to read event for chaincode "${this.adapter.config.chaincodeName}" on channel "${this.adapter.config.channel}": ${e}`);
163
+ await this.close();
164
+ }
165
+ }
166
+ /**
167
+ * @description Initializes the event listener
168
+ * @summary Sets up the connection to the Fabric network and starts listening for chaincode events
169
+ * @return {Promise<void>} Promise that resolves when initialization is complete
170
+ */
171
+ async initialize() {
172
+ if (!this.adapter)
173
+ throw new InternalError(`No adapter or config observed for dispatch`);
174
+ const gateway = await FabricClientAdapter.getGateway(this.adapter.config, this.client);
175
+ const network = gateway.getNetwork(this.adapter.config.channel);
176
+ if (!this.adapter)
177
+ throw new InternalError(`No adapter observed for dispatch`);
178
+ this.listeningStack = await network.getChaincodeEvents(this.adapter.config.chaincodeName);
179
+ this.handleEvents();
180
+ }
181
+ }
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmFicmljQ2xpZW50RGlzcGF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudERpc3BhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGlDQUE4QjtBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFLeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSw4QkFBeUI7QUFFbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0NHO0FBQ0gsTUFBTSxPQUFPLG9CQUFxQixTQUFRLFFBQVE7SUFXaEQ7Ozs7T0FJRztJQUNILFlBQXNCLE1BQWM7UUFDbEMsS0FBSyxFQUFFLENBQUM7UUFEWSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBVnBDOztXQUVHO1FBQ0ssWUFBTyxHQUFHLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBUzFDLENBQUM7SUFFRDs7OztPQUlHO0lBQ00sS0FBSyxDQUFDLEtBQUs7UUFDbEIsSUFBSSxJQUFJLENBQUMsY0FBYztZQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssWUFBWSxDQUFDLFNBQXFCO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTSxPQUFPLENBQUMsUUFBNkI7UUFDNUMsSUFBSSxDQUFDLENBQUMsUUFBUSxZQUFZLG1CQUFtQixDQUFDO1lB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QUMsRUFBRSxDQUN0RixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsR0FBRyxDQUFDLEtBQUssQ0FDUCx1Q0FBdUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxpQkFBaUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxNQUFNLENBQUMsRUFBRSxDQUM5SCxDQUFDO1lBQ0YsTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ2dCLEtBQUssQ0FBQyxVQUFVO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUNmLE1BQU0sSUFBSSxhQUFhLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUN4RSxNQUFNLE9BQU8sR0FBRyxNQUFNLG1CQUFtQixDQUFDLFVBQVUsQ0FDbEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFvQixFQUNqQyxJQUFJLENBQUMsTUFBTSxDQUNaLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUNmLE1BQU0sSUFBSSxhQUFhLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sT0FBTyxDQUFDLGtCQUFrQixDQUNwRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQ2xDLENBQUM7UUFDRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWRhcHRlciwgRGlzcGF0Y2gsIFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFBlZXJDb25maWcgfSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENoYWluY29kZUV2ZW50LFxuICBDbG9zZWFibGVBc3luY0l0ZXJhYmxlLFxufSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBwYXJzZUV2ZW50TmFtZSB9IGZyb20gXCIuLi9zaGFyZWQvZXZlbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV2ZW50IGRpc3BhdGNoZXIgZm9yIEh5cGVybGVkZ2VyIEZhYnJpYyBjaGFpbmNvZGUgZXZlbnRzXG4gKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBhbmQgcHJvY2Vzc2VzIGV2ZW50cyBlbWl0dGVkIGJ5IEZhYnJpYyBjaGFpbmNvZGUsIGRpc3BhdGNoaW5nIHRoZW0gdG8gcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAqIEB0ZW1wbGF0ZSBQZWVyQ29uZmlnIC0gQ29uZmlndXJhdGlvbiB0eXBlIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAqIEBwYXJhbSBjbGllbnQgLSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAqIEBjbGFzcyBGYWJyaWNDbGllbnREaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBGYWJyaWNEaXNwYXRjaCBpbnN0YW5jZVxuICogY29uc3QgY2xpZW50ID0gYXdhaXQgRmFicmljQWRhcHRlci5nZXRDbGllbnQocGVlckNvbmZpZyk7XG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBGYWJyaWNEaXNwYXRjaChjbGllbnQpO1xuICpcbiAqIC8vIENvbmZpZ3VyZSB0aGUgZGlzcGF0Y2ggd2l0aCBwZWVyIGNvbmZpZ3VyYXRpb25cbiAqIGRpc3BhdGNoLmNvbmZpZ3VyZShwZWVyQ29uZmlnKTtcbiAqXG4gKiAvLyBSZWdpc3RlciBhbiBvYnNlcnZlciBmb3IgYSBzcGVjaWZpYyB0YWJsZSBhbmQgZXZlbnRcbiAqIGRpc3BhdGNoLm9ic2VydmUoJ3VzZXJzJywgJ2NyZWF0ZScsIChpZCkgPT4ge1xuICogICBjb25zb2xlLmxvZyhgVXNlciBjcmVhdGVkOiAke2lkfWApO1xuICogfSk7XG4gKlxuICogLy8gU3RhcnQgbGlzdGVuaW5nIGZvciBldmVudHNcbiAqIGF3YWl0IGRpc3BhdGNoLnN0YXJ0KCk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEZhYnJpY0Rpc3BhdGNoXG4gKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAqICAgcGFydGljaXBhbnQgTmV0d29ya1xuICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAqXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBuZXcgRmFicmljRGlzcGF0Y2goY2xpZW50KVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogY29uZmlndXJlKHBlZXJDb25maWcpXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBvYnNlcnZlKHRhYmxlLCBldmVudCwgY2FsbGJhY2spXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBzdGFydCgpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGluaXRpYWxpemUoKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkdhdGV3YXk6IGdldEdhdGV3YXkoY29uZmlnLCBjbGllbnQpXG4gKiAgIEdhdGV3YXktPj5OZXR3b3JrOiBnZXROZXR3b3JrKGNoYW5uZWwpXG4gKiAgIE5ldHdvcmstPj5OZXR3b3JrOiBnZXRDaGFpbmNvZGVFdmVudHMoY2hhaW5jb2RlTmFtZSlcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogaGFuZGxlRXZlbnRzKClcbiAqICAgbG9vcCBGb3IgZWFjaCBldmVudFxuICogICAgIENoYWluY29kZS0tPj5GYWJyaWNEaXNwYXRjaDogQ2hhaW5jb2RlRXZlbnRcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBwYXJzZUV2ZW50TmFtZShldmVudE5hbWUpXG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VQYXlsb2FkKHBheWxvYWQpXG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQpXG4gKiAgICAgRmFicmljRGlzcGF0Y2gtLT4+Q2xpZW50OiBjYWxsYmFjayhpZClcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnREaXNwYXRjaCBleHRlbmRzIERpc3BhdGNoIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBsaXN0ZW5pbmcgc3RhY2sgZm9yIGNoYWluY29kZSBldmVudHNcbiAgICovXG4gIHByaXZhdGUgbGlzdGVuaW5nU3RhY2s/OiBDbG9zZWFibGVBc3luY0l0ZXJhYmxlPENoYWluY29kZUV2ZW50PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRleHQgZGVjb2RlciBmb3IgY29udmVydGluZyBldmVudCBwYXlsb2FkcyBmcm9tIGJ5dGVzIHRvIHN0cmluZ3NcbiAgICovXG4gIHByaXZhdGUgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IEZhYnJpY0Rpc3BhdGNoIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgZGlzcGF0Y2hlciBmb3IgRmFicmljIGNoYWluY29kZSBldmVudHNcbiAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCAtIGdSUEMgY2xpZW50IGZvciBjb25uZWN0aW5nIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNsaWVudDogQ2xpZW50KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xvc2VzIHRoZSBldmVudCBsaXN0ZW5pbmcgY29ubmVjdGlvblxuICAgKiBAc3VtbWFyeSBTdG9wcyBsaXN0ZW5pbmcgZm9yIGNoYWluY29kZSBldmVudHMgYW5kIHJlbGVhc2VzIHJlc291cmNlc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLmxpc3RlbmluZ1N0YWNrKSB0aGlzLmxpc3RlbmluZ1N0YWNrLmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBldmVudCBwYXlsb2FkIGZyb20gYmluYXJ5IGZvcm1hdFxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIFVpbnQ4QXJyYXkgY29udGFpbmluZyBKU09OIHRvIGFuIG9iamVjdCB3aXRoIGFuIGlkIHByb3BlcnR5XG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ganNvbkJ5dGVzIC0gVGhlIGJpbmFyeSBwYXlsb2FkIGZyb20gdGhlIGNoYWluY29kZSBldmVudFxuICAgKiBAcmV0dXJuIHt7IGlkOiBzdHJpbmcgfX0gVGhlIHBhcnNlZCBwYXlsb2FkIGNvbnRhaW5pbmcgdGhlIHJlY29yZCBJRFxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVBheWxvYWQoanNvbkJ5dGVzOiBVaW50OEFycmF5KTogeyBpZDogc3RyaW5nIH0ge1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLmRlY29kZXIuZGVjb2RlKGpzb25CeXRlcyk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXJ0cyBvYnNlcnZpbmcgYW4gYWRhcHRlclxuICAgKiBAc3VtbWFyeSBDb25uZWN0cyB0aGlzIGRpc3BhdGNoIHRvIGFuIGFkYXB0ZXIgdG8gbW9uaXRvciBpdHMgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pn0gb2JzZXJ2ZXIgLSBUaGUgYWRhcHRlciB0byBvYnNlcnZlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBvdmVycmlkZSBvYnNlcnZlKG9ic2VydmVyOiBGYWJyaWNDbGllbnRBZGFwdGVyKTogdm9pZCB7XG4gICAgaWYgKCEob2JzZXJ2ZXIgaW5zdGFuY2VvZiBGYWJyaWNDbGllbnRBZGFwdGVyKSlcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBcIk9ubHkgRmFicmljQ2xpZW50QWRhcHRlciBjYW4gYmUgb2JzZXJ2ZWQgYnkgZGlzcGF0Y2hcIlxuICAgICAgKTtcbiAgICB0aGlzLmFkYXB0ZXIgPSBvYnNlcnZlcjtcbiAgICB0aGlzLm1vZGVscyA9IEFkYXB0ZXIubW9kZWxzKHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgdGhpcy5pbml0aWFsaXplKCkudGhlbigoKSA9PlxuICAgICAgdGhpcy5sb2cudmVyYm9zZShcbiAgICAgICAgYERpc3BhdGNoIGluaXRpYWxpemVkIGZvciAke3RoaXMuYWRhcHRlciEuYWxpYXN9IGFkYXB0ZXJgXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBjaGFuZ2UgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7YW55fSBwYXlsb2FkIC0gVGhlIGV2ZW50IHBheWxvYWRcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZXZlbnQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBhbnlcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpIHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgb2JzZXJ2ZXIgdXBkYXRlIGZvciAke3RhYmxlfToke2V2ZW50fWBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIucmVmcmVzaChcbiAgICAgICAgdGFibGUsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBwYXlsb2FkLmlkID8gcGF5bG9hZC5pZCA6IHVuZGVmaW5lZCxcbiAgICAgICAgcGF5bG9hZFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggZGlzcGF0Y2g6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBpbmNvbWluZyBjaGFpbmNvZGUgZXZlbnRzXG4gICAqIEBzdW1tYXJ5IExpc3RlbnMgZm9yIGV2ZW50cyBmcm9tIHRoZSBjaGFpbmNvZGUgYW5kIGRpc3BhdGNoZXMgdGhlbSB0byByZWdpc3RlcmVkIG9ic2VydmVyc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVudCBoYW5kbGluZyBzdG9wc1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNEaXNwYXRjaFxuICAgKiAgIHBhcnRpY2lwYW50IEV2ZW50U3RhY2tcbiAgICogICBwYXJ0aWNpcGFudCBFdmVudFBhcnNlclxuICAgKiAgIHBhcnRpY2lwYW50IE9ic2VydmVyc1xuICAgKlxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGhhbmRsZUV2ZW50cygpXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5FdmVudFN0YWNrOiBmb3IgYXdhaXQgKGNvbnN0IGV2dCBvZiBsaXN0ZW5pbmdTdGFjaylcbiAgICogICBFdmVudFN0YWNrLS0+PkZhYnJpY0Rpc3BhdGNoOiBDaGFpbmNvZGVFdmVudFxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RXZlbnRQYXJzZXI6IHBhcnNlRXZlbnROYW1lKGV2dC5ldmVudE5hbWUpXG4gICAqICAgRXZlbnRQYXJzZXItLT4+RmFicmljRGlzcGF0Y2g6IHsgdGFibGUsIGV2ZW50LCBvd25lciB9XG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogQ2hlY2sgaWYgZXZlbnQgaXMgZm9yIHRoaXMgTVNQXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VQYXlsb2FkKGV2dC5wYXlsb2FkKVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+T2JzZXJ2ZXJzOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBwYXlsb2FkLmlkKVxuICAgKiAgIE9ic2VydmVycy0tPj5GYWJyaWNEaXNwYXRjaDogQ2FsbGJhY2tzIGV4ZWN1dGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlRXZlbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5saXN0ZW5pbmdTdGFjaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgRXZlbnQgc3RhY2sgbm90IGluaXRpYWxpemVkLiBFbnN1cmUgdGhhdCBcInN0YXJ0TGlzdGVuaW5nXCIgaXMgY2FsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRoaXMgb3BlcmF0aW9uLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIXRoaXMuYWRhcHRlciB8fCAhdGhpcy5hZGFwdGVyLmNvbmZpZylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIGZvdW5kLiBzaG91bGQgYmUgaW1wb3NzaWJsZWApO1xuXG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuaGFuZGxlRXZlbnRzKTtcbiAgICBsb2cuaW5mbyhcbiAgICAgIGBMaXN0ZW5pbmcgZm9yIGluY29taW5nIGV2ZW50cyBvbiBjaGFpbmNvZGUgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZX1cIiBvbiBjaGFubmVsIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWx9XCIuLi5gXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGV2dCBvZiB0aGlzLmxpc3RlbmluZ1N0YWNrKSB7XG4gICAgICAgIGNvbnN0IHsgdGFibGUsIGV2ZW50LCBvd25lciB9ID0gcGFyc2VFdmVudE5hbWUoZXZ0LmV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChvd25lciAmJiBvd25lciAhPT0gdGhpcy5hZGFwdGVyLmNvbmZpZz8ubXNwSWQpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiB7IGlkOiBzdHJpbmcgfSA9IHRoaXMucGFyc2VQYXlsb2FkKGV2dC5wYXlsb2FkKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIHRhYmxlID8gdGFibGUgOiB0aGlzLm1vZGVsc1swXS5uYW1lLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdXBkYXRlIG9ic2VydmFibGVzIGZvciB0YWJsZSAke3RhYmxlfSBldmVudCAke2V2ZW50fSBpZDogJHtwYXlsb2FkLmlkfTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBsb2cuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmVhZCBldmVudCBmb3IgY2hhaW5jb2RlIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWV9XCIgb24gY2hhbm5lbCBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFubmVsfVwiOiAke2V9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBldmVudCBsaXN0ZW5lclxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29yayBhbmQgc3RhcnRzIGxpc3RlbmluZyBmb3IgY2hhaW5jb2RlIGV2ZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvciBjb25maWcgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShcbiAgICAgIHRoaXMuYWRhcHRlci5jb25maWcgYXMgUGVlckNvbmZpZyxcbiAgICAgIHRoaXMuY2xpZW50XG4gICAgKTtcbiAgICBjb25zdCBuZXR3b3JrID0gZ2F0ZXdheS5nZXROZXR3b3JrKHRoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbCk7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcbiAgICB0aGlzLmxpc3RlbmluZ1N0YWNrID0gYXdhaXQgbmV0d29yay5nZXRDaGFpbmNvZGVFdmVudHMoXG4gICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWVcbiAgICApO1xuICAgIHRoaXMuaGFuZGxlRXZlbnRzKCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,100 @@
1
+ import { Adapter, Repository } from "@decaf-ts/core";
2
+ import { Constructor, Model } from "@decaf-ts/decorator-validation";
3
+ import { MangoQuery } from "@decaf-ts/for-couchdb";
4
+ import { Context } from "@decaf-ts/db-decorators";
5
+ import { FabricFlags } from "../shared";
6
+ /**
7
+ * @description Repository implementation for Fabric client operations
8
+ * @summary Extends the generic Repository to prepare context and arguments for CRUD operations executed via a Fabric client Adapter, wiring RepositoryFlags and Fabric-specific overrides.
9
+ * @template M extends Model - The model type handled by this repository
10
+ * @param {Adapter<any, MangoQuery, FabricFlags, Context<FabricFlags>>} [adapter] - Optional adapter instance used to execute operations
11
+ * @param {Constructor<M>} [clazz] - Optional model constructor used by the repository
12
+ * @return {void}
13
+ * @class FabricClientRepository
14
+ * @example
15
+ * import { Repository } from "@decaf-ts/core";
16
+ * import { FabricClientRepository } from "@decaf-ts/for-fabric";
17
+ *
18
+ * class User extends Model { id!: string; name!: string; }
19
+ * const repo = new FabricClientRepository<User>();
20
+ * const created = await repo.create(new User({ id: "1", name: "Alice" }));
21
+ * const loaded = await repo.read("1");
22
+ *
23
+ * @mermaid
24
+ * sequenceDiagram
25
+ * participant App
26
+ * participant Repo as FabricClientRepository
27
+ * participant Adapter
28
+ * App->>Repo: create(model)
29
+ * Repo->>Repo: createPrefix(model, ...args)
30
+ * Repo->>Adapter: create(table, id, model, flags)
31
+ * Adapter-->>Repo: result
32
+ * Repo-->>App: model
33
+ */
34
+ export declare class FabricClientRepository<M extends Model> extends Repository<M, MangoQuery, Adapter<any, any, MangoQuery, FabricFlags, Context<FabricFlags>>> {
35
+ constructor(adapter?: Adapter<any, any, MangoQuery, FabricFlags, Context<FabricFlags>>, clazz?: Constructor<M>);
36
+ /**
37
+ * @description Prepare arguments and context for create
38
+ * @summary Builds repository context and ensures the model is instantiated with the repository's class before delegating to the adapter
39
+ * @param {M} model - The model instance to create
40
+ * @param {...any[]} args - Additional operation arguments and flags
41
+ * @return {...any[]} Tuple containing the prepared model and the processed arguments
42
+ */
43
+ protected createPrefix(model: M, ...args: any[]): Promise<[M, ...any[]]>;
44
+ /**
45
+ * @description Prepare arguments and context for bulk create
46
+ * @summary Resolves repository context for a createAll operation passing through models and processed arguments
47
+ * @param {M[]} models - Array of model instances to create
48
+ * @param {...any} args - Additional operation arguments and flags
49
+ * @return {...any[]} Tuple containing the models array and processed arguments
50
+ */
51
+ protected createAllPrefix(models: M[], ...args: any[]): Promise<any[]>;
52
+ /**
53
+ * @description Prepare arguments and context for read
54
+ * @summary Resolves repository context for a read operation and forwards the key and processed arguments
55
+ * @param {string} key - The model primary key to read
56
+ * @param {...any} args - Additional operation arguments and flags
57
+ * @return {...any[]} Tuple containing the key and processed arguments
58
+ */
59
+ protected readPrefix(key: string, ...args: any[]): Promise<any[]>;
60
+ /**
61
+ * @description Prepare arguments and context for bulk read
62
+ * @summary Resolves repository context for a readAll operation and forwards the keys and processed arguments
63
+ * @param {(string[]|number[])} keys - Array of model primary keys to read
64
+ * @param {...any} args - Additional operation arguments and flags
65
+ * @return {...any[]} Tuple containing the keys and processed arguments
66
+ */
67
+ protected readAllPrefix(keys: string[] | number[], ...args: any[]): Promise<any[]>;
68
+ /**
69
+ * @description Prepare arguments and context for update
70
+ * @summary Resolves repository context for an update operation and forwards the model and processed arguments
71
+ * @param {M} model - The model instance to update
72
+ * @param {...any[]} args - Additional operation arguments and flags
73
+ * @return {...any[]} Tuple containing the model and processed arguments
74
+ */
75
+ protected updatePrefix(model: M, ...args: any[]): Promise<[M, ...args: any[]]>;
76
+ /**
77
+ * @description Prepare arguments and context for bulk update
78
+ * @summary Resolves repository context for an updateAll operation and forwards the models and processed arguments
79
+ * @param {M[]} models - The model instances to update
80
+ * @param {...any} args - Additional operation arguments and flags
81
+ * @return {...any[]} Tuple containing the models and processed arguments
82
+ */
83
+ protected updateAllPrefix(models: M[], ...args: any[]): Promise<any[]>;
84
+ /**
85
+ * @description Prepare arguments and context for delete
86
+ * @summary Resolves repository context for a delete operation, ensures the target exists via read, then forwards key and processed arguments
87
+ * @param {string|number} key - The model primary key to delete
88
+ * @param {...any} args - Additional operation arguments and flags
89
+ * @return {...any[]} Tuple containing the key and processed arguments
90
+ */
91
+ protected deletePrefix(key: any, ...args: any[]): Promise<any[]>;
92
+ /**
93
+ * @description Prepare arguments and context for bulk delete
94
+ * @summary Resolves repository context for a deleteAll operation, validates existence via readAll, then forwards keys and processed arguments
95
+ * @param {(string[]|number[])} keys - The model primary keys to delete
96
+ * @param {...any} args - Additional operation arguments and flags
97
+ * @return {...any[]} Tuple containing the keys and processed arguments
98
+ */
99
+ protected deleteAllPrefix(keys: string[] | number[], ...args: any[]): Promise<any[]>;
100
+ }
@@ -0,0 +1,127 @@
1
+ import { Repository } from "@decaf-ts/core";
2
+ import { Context, OperationKeys, } from "@decaf-ts/db-decorators";
3
+ /**
4
+ * @description Repository implementation for Fabric client operations
5
+ * @summary Extends the generic Repository to prepare context and arguments for CRUD operations executed via a Fabric client Adapter, wiring RepositoryFlags and Fabric-specific overrides.
6
+ * @template M extends Model - The model type handled by this repository
7
+ * @param {Adapter<any, MangoQuery, FabricFlags, Context<FabricFlags>>} [adapter] - Optional adapter instance used to execute operations
8
+ * @param {Constructor<M>} [clazz] - Optional model constructor used by the repository
9
+ * @return {void}
10
+ * @class FabricClientRepository
11
+ * @example
12
+ * import { Repository } from "@decaf-ts/core";
13
+ * import { FabricClientRepository } from "@decaf-ts/for-fabric";
14
+ *
15
+ * class User extends Model { id!: string; name!: string; }
16
+ * const repo = new FabricClientRepository<User>();
17
+ * const created = await repo.create(new User({ id: "1", name: "Alice" }));
18
+ * const loaded = await repo.read("1");
19
+ *
20
+ * @mermaid
21
+ * sequenceDiagram
22
+ * participant App
23
+ * participant Repo as FabricClientRepository
24
+ * participant Adapter
25
+ * App->>Repo: create(model)
26
+ * Repo->>Repo: createPrefix(model, ...args)
27
+ * Repo->>Adapter: create(table, id, model, flags)
28
+ * Adapter-->>Repo: result
29
+ * Repo-->>App: model
30
+ */
31
+ export class FabricClientRepository extends Repository {
32
+ constructor(adapter, clazz) {
33
+ super(adapter, clazz);
34
+ }
35
+ /**
36
+ * @description Prepare arguments and context for create
37
+ * @summary Builds repository context and ensures the model is instantiated with the repository's class before delegating to the adapter
38
+ * @param {M} model - The model instance to create
39
+ * @param {...any[]} args - Additional operation arguments and flags
40
+ * @return {...any[]} Tuple containing the prepared model and the processed arguments
41
+ */
42
+ async createPrefix(model, ...args) {
43
+ const contextArgs = await Context.args(OperationKeys.CREATE, this.class, args, this.adapter, this._overrides || {});
44
+ model = new this.class(model);
45
+ return [model, ...contextArgs.args];
46
+ }
47
+ /**
48
+ * @description Prepare arguments and context for bulk create
49
+ * @summary Resolves repository context for a createAll operation passing through models and processed arguments
50
+ * @param {M[]} models - Array of model instances to create
51
+ * @param {...any} args - Additional operation arguments and flags
52
+ * @return {...any[]} Tuple containing the models array and processed arguments
53
+ */
54
+ async createAllPrefix(models, ...args) {
55
+ const contextArgs = await Context.args(OperationKeys.CREATE, this.class, args, this.adapter, this._overrides || {});
56
+ return [models, ...contextArgs.args];
57
+ }
58
+ /**
59
+ * @description Prepare arguments and context for read
60
+ * @summary Resolves repository context for a read operation and forwards the key and processed arguments
61
+ * @param {string} key - The model primary key to read
62
+ * @param {...any} args - Additional operation arguments and flags
63
+ * @return {...any[]} Tuple containing the key and processed arguments
64
+ */
65
+ async readPrefix(key, ...args) {
66
+ const contextArgs = await Context.args(OperationKeys.READ, this.class, args, this.adapter, this._overrides || {});
67
+ return [key, ...contextArgs.args];
68
+ }
69
+ /**
70
+ * @description Prepare arguments and context for bulk read
71
+ * @summary Resolves repository context for a readAll operation and forwards the keys and processed arguments
72
+ * @param {(string[]|number[])} keys - Array of model primary keys to read
73
+ * @param {...any} args - Additional operation arguments and flags
74
+ * @return {...any[]} Tuple containing the keys and processed arguments
75
+ */
76
+ async readAllPrefix(keys, ...args) {
77
+ const contextArgs = await Context.args(OperationKeys.READ, this.class, args, this.adapter, this._overrides || {});
78
+ return [keys, ...contextArgs.args];
79
+ }
80
+ /**
81
+ * @description Prepare arguments and context for update
82
+ * @summary Resolves repository context for an update operation and forwards the model and processed arguments
83
+ * @param {M} model - The model instance to update
84
+ * @param {...any[]} args - Additional operation arguments and flags
85
+ * @return {...any[]} Tuple containing the model and processed arguments
86
+ */
87
+ async updatePrefix(model, ...args) {
88
+ const contextArgs = await Context.args(OperationKeys.UPDATE, this.class, args, this.adapter, this._overrides || {});
89
+ return [model, ...contextArgs.args];
90
+ }
91
+ /**
92
+ * @description Prepare arguments and context for bulk update
93
+ * @summary Resolves repository context for an updateAll operation and forwards the models and processed arguments
94
+ * @param {M[]} models - The model instances to update
95
+ * @param {...any} args - Additional operation arguments and flags
96
+ * @return {...any[]} Tuple containing the models and processed arguments
97
+ */
98
+ async updateAllPrefix(models, ...args) {
99
+ const contextArgs = await Context.args(OperationKeys.UPDATE, this.class, args, this.adapter, this._overrides || {});
100
+ return [models, ...contextArgs.args];
101
+ }
102
+ /**
103
+ * @description Prepare arguments and context for delete
104
+ * @summary Resolves repository context for a delete operation, ensures the target exists via read, then forwards key and processed arguments
105
+ * @param {string|number} key - The model primary key to delete
106
+ * @param {...any} args - Additional operation arguments and flags
107
+ * @return {...any[]} Tuple containing the key and processed arguments
108
+ */
109
+ async deletePrefix(key, ...args) {
110
+ const contextArgs = await Context.args(OperationKeys.DELETE, this.class, args, this.adapter, this._overrides || {});
111
+ await this.read(key, ...contextArgs.args);
112
+ return [key, ...contextArgs.args];
113
+ }
114
+ /**
115
+ * @description Prepare arguments and context for bulk delete
116
+ * @summary Resolves repository context for a deleteAll operation, validates existence via readAll, then forwards keys and processed arguments
117
+ * @param {(string[]|number[])} keys - The model primary keys to delete
118
+ * @param {...any} args - Additional operation arguments and flags
119
+ * @return {...any[]} Tuple containing the keys and processed arguments
120
+ */
121
+ async deleteAllPrefix(keys, ...args) {
122
+ const contextArgs = await Context.args(OperationKeys.DELETE, this.class, args, this.adapter, this._overrides || {});
123
+ await this.readAll(keys, ...contextArgs.args);
124
+ return [keys, ...contextArgs.args];
125
+ }
126
+ }
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmFicmljQ2xpZW50UmVwb3NpdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbGllbnQvRmFicmljQ2xpZW50UmVwb3NpdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVcsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHckQsT0FBTyxFQUNMLE9BQU8sRUFDUCxhQUFhLEdBRWQsTUFBTSx5QkFBeUIsQ0FBQztBQUdqQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsTUFBTSxPQUFPLHNCQUF3QyxTQUFRLFVBSTVEO0lBQ0MsWUFDRSxPQUEwRSxFQUMxRSxLQUFzQjtRQUV0QixLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDZ0IsS0FBSyxDQUFDLFlBQVksQ0FDbkMsS0FBUSxFQUNSLEdBQUcsSUFBVztRQUVkLE1BQU0sV0FBVyxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FLcEMsYUFBYSxDQUFDLE1BQU0sRUFDcEIsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLEVBQ0osSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FDdEIsQ0FBQztRQUNGLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ2dCLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBVyxFQUFFLEdBQUcsSUFBVztRQUNsRSxNQUFNLFdBQVcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQ3BDLGFBQWEsQ0FBQyxNQUFNLEVBQ3BCLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxFQUNKLElBQUksQ0FBQyxP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LENBQUM7UUFDRixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWRhcHRlciwgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTWFuZ29RdWVyeSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIE9wZXJhdGlvbktleXMsXG4gIFJlcG9zaXRvcnlGbGFncyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGFncyB9IGZyb20gXCIuLi9zaGFyZWRcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbiBmb3IgRmFicmljIGNsaWVudCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBnZW5lcmljIFJlcG9zaXRvcnkgdG8gcHJlcGFyZSBjb250ZXh0IGFuZCBhcmd1bWVudHMgZm9yIENSVUQgb3BlcmF0aW9ucyBleGVjdXRlZCB2aWEgYSBGYWJyaWMgY2xpZW50IEFkYXB0ZXIsIHdpcmluZyBSZXBvc2l0b3J5RmxhZ3MgYW5kIEZhYnJpYy1zcGVjaWZpYyBvdmVycmlkZXMuXG4gKiBAdGVtcGxhdGUgTSBleHRlbmRzIE1vZGVsIC0gVGhlIG1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIHJlcG9zaXRvcnlcbiAqIEBwYXJhbSB7QWRhcHRlcjxhbnksIE1hbmdvUXVlcnksIEZhYnJpY0ZsYWdzLCBDb250ZXh0PEZhYnJpY0ZsYWdzPj59IFthZGFwdGVyXSAtIE9wdGlvbmFsIGFkYXB0ZXIgaW5zdGFuY2UgdXNlZCB0byBleGVjdXRlIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IFtjbGF6el0gLSBPcHRpb25hbCBtb2RlbCBjb25zdHJ1Y3RvciB1c2VkIGJ5IHRoZSByZXBvc2l0b3J5XG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnlcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG4gKiBpbXBvcnQgeyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItZmFicmljXCI7XG4gKlxuICogY2xhc3MgVXNlciBleHRlbmRzIE1vZGVsIHsgaWQhOiBzdHJpbmc7IG5hbWUhOiBzdHJpbmc7IH1cbiAqIGNvbnN0IHJlcG8gPSBuZXcgRmFicmljQ2xpZW50UmVwb3NpdG9yeTxVc2VyPigpO1xuICogY29uc3QgY3JlYXRlZCA9IGF3YWl0IHJlcG8uY3JlYXRlKG5ldyBVc2VyKHsgaWQ6IFwiMVwiLCBuYW1lOiBcIkFsaWNlXCIgfSkpO1xuICogY29uc3QgbG9hZGVkID0gYXdhaXQgcmVwby5yZWFkKFwiMVwiKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBSZXBvIGFzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobW9kZWwpXG4gKiAgIFJlcG8tPj5SZXBvOiBjcmVhdGVQcmVmaXgobW9kZWwsIC4uLmFyZ3MpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkLCBtb2RlbCwgZmxhZ3MpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogcmVzdWx0XG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50UmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgUmVwb3NpdG9yeTxcbiAgTSxcbiAgTWFuZ29RdWVyeSxcbiAgQWRhcHRlcjxhbnksIGFueSwgTWFuZ29RdWVyeSwgRmFicmljRmxhZ3MsIENvbnRleHQ8RmFicmljRmxhZ3M+PlxuPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGFkYXB0ZXI/OiBBZGFwdGVyPGFueSwgYW55LCBNYW5nb1F1ZXJ5LCBGYWJyaWNGbGFncywgQ29udGV4dDxGYWJyaWNGbGFncz4+LFxuICAgIGNsYXp6PzogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgY2xhenopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlIGFyZ3VtZW50cyBhbmQgY29udGV4dCBmb3IgY3JlYXRlXG4gICAqIEBzdW1tYXJ5IEJ1aWxkcyByZXBvc2l0b3J5IGNvbnRleHQgYW5kIGVuc3VyZXMgdGhlIG1vZGVsIGlzIGluc3RhbnRpYXRlZCB3aXRoIHRoZSByZXBvc2l0b3J5J3MgY2xhc3MgYmVmb3JlIGRlbGVnYXRpbmcgdG8gdGhlIGFkYXB0ZXJcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjcmVhdGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgb3BlcmF0aW9uIGFyZ3VtZW50cyBhbmQgZmxhZ3NcbiAgICogQHJldHVybiB7Li4uYW55W119IFR1cGxlIGNvbnRhaW5pbmcgdGhlIHByZXBhcmVkIG1vZGVsIGFuZCB0aGUgcHJvY2Vzc2VkIGFyZ3VtZW50c1xuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxcbiAgICAgIE0sXG4gICAgICBDb250ZXh0PFJlcG9zaXRvcnlGbGFncz4sXG4gICAgICBSZXBvc2l0b3J5RmxhZ3NcbiAgICA+KFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgbW9kZWwgPSBuZXcgdGhpcy5jbGFzcyhtb2RlbCk7XG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmUgYXJndW1lbnRzIGFuZCBjb250ZXh0IGZvciBidWxrIGNyZWF0ZVxuICAgKiBAc3VtbWFyeSBSZXNvbHZlcyByZXBvc2l0b3J5IGNvbnRleHQgZm9yIGEgY3JlYXRlQWxsIG9wZXJhdGlvbiBwYXNzaW5nIHRocm91Z2ggbW9kZWxzIGFuZCBwcm9jZXNzZWQgYXJndW1lbnRzXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBBcnJheSBvZiBtb2RlbCBpbnN0YW5jZXMgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzIC0gQWRkaXRpb25hbCBvcGVyYXRpb24gYXJndW1lbnRzIGFuZCBmbGFnc1xuICAgKiBAcmV0dXJuIHsuLi5hbnlbXX0gVHVwbGUgY29udGFpbmluZyB0aGUgbW9kZWxzIGFycmF5IGFuZCBwcm9jZXNzZWQgYXJndW1lbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsUHJlZml4KG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlIGFyZ3VtZW50cyBhbmQgY29udGV4dCBmb3IgcmVhZFxuICAgKiBAc3VtbWFyeSBSZXNvbHZlcyByZXBvc2l0b3J5IGNvbnRleHQgZm9yIGEgcmVhZCBvcGVyYXRpb24gYW5kIGZvcndhcmRzIHRoZSBrZXkgYW5kIHByb2Nlc3NlZCBhcmd1bWVudHNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBtb2RlbCBwcmltYXJ5IGtleSB0byByZWFkXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzIC0gQWRkaXRpb25hbCBvcGVyYXRpb24gYXJndW1lbnRzIGFuZCBmbGFnc1xuICAgKiBAcmV0dXJuIHsuLi5hbnlbXX0gVHVwbGUgY29udGFpbmluZyB0aGUga2V5IGFuZCBwcm9jZXNzZWQgYXJndW1lbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcmVhZFByZWZpeChrZXk6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICByZXR1cm4gW2tleSwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmUgYXJndW1lbnRzIGFuZCBjb250ZXh0IGZvciBidWxrIHJlYWRcbiAgICogQHN1bW1hcnkgUmVzb2x2ZXMgcmVwb3NpdG9yeSBjb250ZXh0IGZvciBhIHJlYWRBbGwgb3BlcmF0aW9uIGFuZCBmb3J3YXJkcyB0aGUga2V5cyBhbmQgcHJvY2Vzc2VkIGFyZ3VtZW50c1xuICAgKiBAcGFyYW0geyhzdHJpbmdbXXxudW1iZXJbXSl9IGtleXMgLSBBcnJheSBvZiBtb2RlbCBwcmltYXJ5IGtleXMgdG8gcmVhZFxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJncyAtIEFkZGl0aW9uYWwgb3BlcmF0aW9uIGFyZ3VtZW50cyBhbmQgZmxhZ3NcbiAgICogQHJldHVybiB7Li4uYW55W119IFR1cGxlIGNvbnRhaW5pbmcgdGhlIGtleXMgYW5kIHByb2Nlc3NlZCBhcmd1bWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkQWxsUHJlZml4KFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgcmV0dXJuIFtrZXlzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZSBhcmd1bWVudHMgYW5kIGNvbnRleHQgZm9yIHVwZGF0ZVxuICAgKiBAc3VtbWFyeSBSZXNvbHZlcyByZXBvc2l0b3J5IGNvbnRleHQgZm9yIGFuIHVwZGF0ZSBvcGVyYXRpb24gYW5kIGZvcndhcmRzIHRoZSBtb2RlbCBhbmQgcHJvY2Vzc2VkIGFyZ3VtZW50c1xuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBvcGVyYXRpb24gYXJndW1lbnRzIGFuZCBmbGFnc1xuICAgKiBAcmV0dXJuIHsuLi5hbnlbXX0gVHVwbGUgY29udGFpbmluZyB0aGUgbW9kZWwgYW5kIHByb2Nlc3NlZCBhcmd1bWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB1cGRhdGVQcmVmaXgoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxbTSwgLi4uYXJnczogYW55W11dPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICByZXR1cm4gW21vZGVsLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZSBhcmd1bWVudHMgYW5kIGNvbnRleHQgZm9yIGJ1bGsgdXBkYXRlXG4gICAqIEBzdW1tYXJ5IFJlc29sdmVzIHJlcG9zaXRvcnkgY29udGV4dCBmb3IgYW4gdXBkYXRlQWxsIG9wZXJhdGlvbiBhbmQgZm9yd2FyZHMgdGhlIG1vZGVscyBhbmQgcHJvY2Vzc2VkIGFyZ3VtZW50c1xuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVsIGluc3RhbmNlcyB0byB1cGRhdGVcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgLSBBZGRpdGlvbmFsIG9wZXJhdGlvbiBhcmd1bWVudHMgYW5kIGZsYWdzXG4gICAqIEByZXR1cm4gey4uLmFueVtdfSBUdXBsZSBjb250YWluaW5nIHRoZSBtb2RlbHMgYW5kIHByb2Nlc3NlZCBhcmd1bWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGxQcmVmaXgoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlIGFyZ3VtZW50cyBhbmQgY29udGV4dCBmb3IgZGVsZXRlXG4gICAqIEBzdW1tYXJ5IFJlc29sdmVzIHJlcG9zaXRvcnkgY29udGV4dCBmb3IgYSBkZWxldGUgb3BlcmF0aW9uLCBlbnN1cmVzIHRoZSB0YXJnZXQgZXhpc3RzIHZpYSByZWFkLCB0aGVuIGZvcndhcmRzIGtleSBhbmQgcHJvY2Vzc2VkIGFyZ3VtZW50c1xuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGtleSAtIFRoZSBtb2RlbCBwcmltYXJ5IGtleSB0byBkZWxldGVcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgLSBBZGRpdGlvbmFsIG9wZXJhdGlvbiBhcmd1bWVudHMgYW5kIGZsYWdzXG4gICAqIEByZXR1cm4gey4uLmFueVtdfSBUdXBsZSBjb250YWluaW5nIHRoZSBrZXkgYW5kIHByb2Nlc3NlZCBhcmd1bWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBkZWxldGVQcmVmaXgoa2V5OiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnJlYWQoa2V5LCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICByZXR1cm4gW2tleSwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmUgYXJndW1lbnRzIGFuZCBjb250ZXh0IGZvciBidWxrIGRlbGV0ZVxuICAgKiBAc3VtbWFyeSBSZXNvbHZlcyByZXBvc2l0b3J5IGNvbnRleHQgZm9yIGEgZGVsZXRlQWxsIG9wZXJhdGlvbiwgdmFsaWRhdGVzIGV4aXN0ZW5jZSB2aWEgcmVhZEFsbCwgdGhlbiBmb3J3YXJkcyBrZXlzIGFuZCBwcm9jZXNzZWQgYXJndW1lbnRzXG4gICAqIEBwYXJhbSB7KHN0cmluZ1tdfG51bWJlcltdKX0ga2V5cyAtIFRoZSBtb2RlbCBwcmltYXJ5IGtleXMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzIC0gQWRkaXRpb25hbCBvcGVyYXRpb24gYXJndW1lbnRzIGFuZCBmbGFnc1xuICAgKiBAcmV0dXJuIHsuLi5hbnlbXX0gVHVwbGUgY29udGFpbmluZyB0aGUga2V5cyBhbmQgcHJvY2Vzc2VkIGFyZ3VtZW50c1xuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbFByZWZpeChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5yZWFkQWxsKGtleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIHJldHVybiBba2V5cywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cbn1cbiJdfQ==