@rosen-bridge/fraud-extractor 2.2.2 → 3.0.0-7b38188a

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/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # @rosen-bridge/fraud-extractor
2
2
 
3
+ ## 3.0.0-7b38188a
4
+
5
+ ### Major Changes
6
+
7
+ - Refactor fraud extractor to extend AbstractErgoBoxExtractor
8
+ - Update AbstractExtractor interface; use `BlockInfo` in `processTransactions` and rename `initializeBoxes` to `initializeData`
9
+
10
+ ### Patch Changes
11
+
12
+ - Update dependencies
13
+ - @rosen-bridge/abstract-logger@4.0.0
14
+
15
+ - Update dependencies
16
+ - Update dependencies
17
+ - Update dependencies
18
+ - Update dependencies
19
+ - Update dependencies
20
+ - @rosen-bridge/abstract-extractor@3.0.0-7b38188a
21
+
22
+ ## 2.2.3
23
+
24
+ ### Patch Changes
25
+
26
+ - Fixed type definitions in entities based migrations
27
+
3
28
  ## 2.2.2
4
29
 
5
30
  ### Patch Changes
@@ -1,64 +1,24 @@
1
+ import { AbstractErgoBoxAction } from '@rosen-bridge/abstract-extractor';
1
2
  import { AbstractLogger } from '@rosen-bridge/abstract-logger';
2
3
  import { DataSource } from '@rosen-bridge/extended-typeorm';
3
- import { Block } from '@rosen-bridge/scanner-interfaces';
4
+ import { BlockInfo } from '@rosen-bridge/scanner-interfaces';
5
+ import { FraudEntity } from '../entities/fraudEntity';
4
6
  import { ExtractedFraud } from '../interfaces/types';
5
- export declare class FraudAction {
6
- private readonly datasource;
7
- private readonly logger;
8
- private readonly repository;
7
+ export declare class FraudAction extends AbstractErgoBoxAction<ExtractedFraud, FraudEntity> {
9
8
  constructor(dataSource: DataSource, logger?: AbstractLogger);
10
9
  /**
11
- * Store a list of frauds in a specific block
10
+ * create the fraud entity from extracted data and block information
12
11
  * @param frauds
13
- * @param spendBoxes
14
12
  * @param block
15
13
  * @param extractor
14
+ * @returns the fraud entities (without the id)
16
15
  */
17
- storeBlockFrauds: (frauds: Array<ExtractedFraud>, block: Block, extractor: string) => Promise<boolean>;
16
+ protected createEntity: (frauds: ExtractedFraud[], block: BlockInfo, extractor: string) => Array<Omit<FraudEntity, "id">>;
18
17
  /**
19
- * Insert a new fraud into database
20
- * @param fraud
21
- * @param extractor
22
- */
23
- insertFraud: (fraud: ExtractedFraud, extractor: string) => Promise<import("@rosen-bridge/extended-typeorm").InsertResult>;
24
- /**
25
- * Update an unspent fraud information in the database
26
- * @param fraud
27
- * @param extractor
28
- */
29
- updateFraud: (fraud: ExtractedFraud, extractor: string) => Promise<import("@rosen-bridge/extended-typeorm").UpdateResult>;
30
- /**
31
- * Update spendBlock and spendHeight of frauds spent on the block
32
- * @param spendIds
33
- * @param block
34
- * @param extractor
35
- */
36
- spendFrauds: (spendIds: Array<string>, block: Block, extractor: string, txId: string) => Promise<void>;
37
- /**
38
- * Update all frauds related to an specific invalid block
39
- * if box had been spent in the block mark it as unspent,
40
- * and if it was created within the block remove it from database
41
- * @param block
42
- * @param extractor
43
- */
44
- deleteBlock: (block: string, extractor: string) => Promise<void>;
45
- /**
46
- * Return all stored fraud box ids
47
- */
48
- getAllBoxIds: (extractor: string) => Promise<Array<string>>;
49
- /**
50
- * Remove an specified fraud
51
- * @param boxId
52
- * @param extractor
53
- */
54
- removeFraud: (boxId: string, extractor: string) => Promise<import("@rosen-bridge/extended-typeorm").DeleteResult>;
55
- /**
56
- * Update the fraud spending information
57
- * @param boxId
58
- * @param extractor
59
- * @param blockId
60
- * @param blockHeight
18
+ * convert the database entity back to raw data
19
+ * @param entities
20
+ * @returns the extracted fraud data
61
21
  */
62
- updateSpendBlock: (boxId: string, extractor: string, blockId: string, blockHeight: number) => Promise<import("@rosen-bridge/extended-typeorm").UpdateResult>;
22
+ protected convertEntityToData: (entities: FraudEntity[]) => ExtractedFraud[];
63
23
  }
64
24
  //# sourceMappingURL=fraudAction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fraudAction.d.ts","sourceRoot":"","sources":["../../lib/actions/fraudAction.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAkB,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AAIzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;gBAEzC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,cAAc;IAK3D;;;;;;OAMG;IACH,gBAAgB,GACd,QAAQ,KAAK,CAAC,cAAc,CAAC,EAC7B,OAAO,KAAK,EACZ,WAAW,MAAM,sBAgDjB;IAEF;;;;OAIG;IACH,WAAW,GAAU,OAAO,cAAc,EAAE,WAAW,MAAM,oEAY3D;IAEF;;;;OAIG;IACH,WAAW,GAAU,OAAO,cAAc,EAAE,WAAW,MAAM,oEAe3D;IAEF;;;;;OAKG;IACH,WAAW,GACT,UAAU,KAAK,CAAC,MAAM,CAAC,EACvB,OAAO,KAAK,EACZ,WAAW,MAAM,EACjB,MAAM,MAAM,KACX,OAAO,CAAC,IAAI,CAAC,CAqBd;IAEF;;;;;;OAMG;IACH,WAAW,GAAU,OAAO,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CAgCnE;IAEF;;OAEG;IACH,YAAY,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAU9D;IAEF;;;;OAIG;IACH,WAAW,GAAU,OAAO,MAAM,EAAE,WAAW,MAAM,oEAEnD;IAEF;;;;;;OAMG;IACH,gBAAgB,GACd,OAAO,MAAM,EACb,WAAW,MAAM,EACjB,SAAS,MAAM,EACf,aAAa,MAAM,oEAMnB;CACH"}
1
+ {"version":3,"file":"fraudAction.d.ts","sourceRoot":"","sources":["../../lib/actions/fraudAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,WAAY,SAAQ,qBAAqB,CACpD,cAAc,EACd,WAAW,CACZ;gBACa,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,cAAc;IAI3D;;;;;;OAMG;IACH,SAAS,CAAC,YAAY,GACpB,QAAQ,cAAc,EAAE,EACxB,OAAO,SAAS,EAChB,WAAW,MAAM,KAChB,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAU/B;IAEF;;;;OAIG;IACH,SAAS,CAAC,mBAAmB,GAC3B,UAAU,WAAW,EAAE,KACtB,cAAc,EAAE,CAEjB;CACH"}
@@ -1,197 +1,34 @@
1
- import { chunk } from 'lodash-es';
2
- import { DummyLogger } from '@rosen-bridge/abstract-logger';
3
- import { In } from '@rosen-bridge/extended-typeorm';
4
- import { dbIdChunkSize } from '../constants';
1
+ import { AbstractErgoBoxAction } from '@rosen-bridge/abstract-extractor';
5
2
  import { FraudEntity } from '../entities/fraudEntity';
6
- export class FraudAction {
7
- datasource;
8
- logger;
9
- repository;
3
+ export class FraudAction extends AbstractErgoBoxAction {
10
4
  constructor(dataSource, logger) {
11
- this.datasource = dataSource;
12
- this.logger = logger ? logger : new DummyLogger();
13
- this.repository = dataSource.getRepository(FraudEntity);
5
+ super(dataSource, FraudEntity, logger);
14
6
  }
15
7
  /**
16
- * Store a list of frauds in a specific block
8
+ * create the fraud entity from extracted data and block information
17
9
  * @param frauds
18
- * @param spendBoxes
19
10
  * @param block
20
11
  * @param extractor
12
+ * @returns the fraud entities (without the id)
21
13
  */
22
- storeBlockFrauds = async (frauds, block, extractor) => {
23
- const boxIds = frauds.map((item) => item.boxId);
24
- const dbBoxes = await this.repository.findBy({
25
- boxId: In(boxIds),
26
- extractor: extractor,
27
- });
28
- let success = true;
29
- const queryRunner = this.datasource.createQueryRunner();
30
- await queryRunner.connect();
31
- await queryRunner.startTransaction();
32
- const repository = await queryRunner.manager.getRepository(FraudEntity);
33
- try {
34
- for (const fraud of frauds) {
35
- const entity = {
36
- triggerBoxId: fraud.triggerBoxId,
37
- boxId: fraud.boxId,
38
- wid: fraud.wid,
39
- rwtCount: fraud.rwtCount,
40
- creationBlock: block.hash,
41
- creationHeight: block.height,
42
- creationTxId: fraud.txId,
43
- serialized: fraud.serialized,
44
- extractor: extractor,
45
- spendBlock: undefined,
46
- spendHeight: undefined,
47
- spendTxId: undefined,
48
- };
49
- const dbBox = dbBoxes.filter((item) => item.boxId === fraud.boxId);
50
- if (dbBox.length > 0) {
51
- this.logger.info(`Updating fraud with boxId [${fraud.boxId}]`);
52
- this.logger.debug(`Updated fraud: [${JSON.stringify(entity)}]`);
53
- await repository.update({ id: dbBox[0].id }, entity);
54
- }
55
- else {
56
- this.logger.info(`Storing fraud with boxId: [${fraud.boxId}]`);
57
- this.logger.debug(`Inserted fraud: [${JSON.stringify(entity)}]`);
58
- await repository.insert(entity);
59
- }
60
- }
61
- await queryRunner.commitTransaction();
62
- }
63
- catch (e) {
64
- this.logger.error(`An error occurred during storing fraud boxes: ${e}`);
65
- await queryRunner.rollbackTransaction();
66
- success = false;
67
- }
68
- finally {
69
- await queryRunner.release();
70
- }
71
- return success;
14
+ createEntity = (frauds, block, extractor) => {
15
+ return frauds.map((fraud) => ({
16
+ ...fraud,
17
+ block: block.hash,
18
+ height: block.height,
19
+ extractor,
20
+ spendBlock: fraud.spendBlock ?? null,
21
+ spendHeight: fraud.spendHeight ?? null,
22
+ spendTxId: fraud.spendTxId ?? null,
23
+ }));
72
24
  };
73
25
  /**
74
- * Insert a new fraud into database
75
- * @param fraud
76
- * @param extractor
77
- */
78
- insertFraud = async (fraud, extractor) => {
79
- return this.repository.insert({
80
- boxId: fraud.boxId,
81
- triggerBoxId: fraud.triggerBoxId,
82
- wid: fraud.wid,
83
- rwtCount: fraud.rwtCount,
84
- creationBlock: fraud.blockId,
85
- creationHeight: fraud.height,
86
- creationTxId: fraud.txId,
87
- serialized: fraud.serialized,
88
- extractor: extractor,
89
- });
90
- };
91
- /**
92
- * Update an unspent fraud information in the database
93
- * @param fraud
94
- * @param extractor
95
- */
96
- updateFraud = async (fraud, extractor) => {
97
- return this.repository.update({ boxId: fraud.boxId, extractor: extractor }, {
98
- triggerBoxId: fraud.triggerBoxId,
99
- creationBlock: fraud.blockId,
100
- creationHeight: fraud.height,
101
- creationTxId: fraud.txId,
102
- serialized: fraud.serialized,
103
- wid: fraud.wid,
104
- rwtCount: fraud.rwtCount,
105
- spendBlock: null,
106
- spendHeight: 0,
107
- });
108
- };
109
- /**
110
- * Update spendBlock and spendHeight of frauds spent on the block
111
- * @param spendIds
112
- * @param block
113
- * @param extractor
114
- */
115
- spendFrauds = async (spendIds, block, extractor, txId) => {
116
- const spendIdChunks = chunk(spendIds, dbIdChunkSize);
117
- for (const spendIdChunk of spendIdChunks) {
118
- const updateResult = await this.repository.update({ boxId: In(spendIdChunk), extractor: extractor }, { spendBlock: block.hash, spendHeight: block.height, spendTxId: txId });
119
- if (updateResult.affected && updateResult.affected > 0) {
120
- const spentRows = await this.repository.findBy({
121
- boxId: In(spendIdChunk),
122
- spendBlock: block.hash,
123
- spendTxId: txId,
124
- });
125
- for (const row of spentRows) {
126
- this.logger.debug(`Spent box with boxId [${row.boxId}] at transaction [${txId}] at height ${block.height}`);
127
- }
128
- }
129
- }
130
- };
131
- /**
132
- * Update all frauds related to an specific invalid block
133
- * if box had been spent in the block mark it as unspent,
134
- * and if it was created within the block remove it from database
135
- * @param block
136
- * @param extractor
137
- */
138
- deleteBlock = async (block, extractor) => {
139
- this.logger.info(`Deleting frauds in block [${block}]`);
140
- const invalidRows = await this.repository.findBy({
141
- extractor: extractor,
142
- creationBlock: block,
143
- });
144
- if (invalidRows.length > 0) {
145
- await this.repository.delete({
146
- extractor: extractor,
147
- creationBlock: block,
148
- });
149
- for (const row of invalidRows) {
150
- this.logger.debug(`deleted invalid fraud with boxId [${row.boxId}] at the forked block [${block}]`);
151
- }
152
- }
153
- const updatingRows = await this.repository.findBy({
154
- extractor: extractor,
155
- spendBlock: block,
156
- });
157
- if (updatingRows.length > 0) {
158
- await this.repository.update({ spendBlock: block, extractor: extractor }, { spendBlock: null, spendHeight: 0, spendTxId: null });
159
- for (const row of updatingRows) {
160
- this.logger.debug(`removed spending information of the fraud with boxId [${row.boxId}], spent at the forked block [${block}]`);
161
- }
162
- }
163
- };
164
- /**
165
- * Return all stored fraud box ids
166
- */
167
- getAllBoxIds = async (extractor) => {
168
- const boxIds = await this.repository.find({
169
- select: {
170
- boxId: true,
171
- },
172
- where: {
173
- extractor: extractor,
174
- },
175
- });
176
- return boxIds.map((item) => item.boxId);
177
- };
178
- /**
179
- * Remove an specified fraud
180
- * @param boxId
181
- * @param extractor
182
- */
183
- removeFraud = async (boxId, extractor) => {
184
- return await this.repository.delete({ boxId: boxId, extractor: extractor });
185
- };
186
- /**
187
- * Update the fraud spending information
188
- * @param boxId
189
- * @param extractor
190
- * @param blockId
191
- * @param blockHeight
26
+ * convert the database entity back to raw data
27
+ * @param entities
28
+ * @returns the extracted fraud data
192
29
  */
193
- updateSpendBlock = async (boxId, extractor, blockId, blockHeight) => {
194
- return await this.repository.update({ boxId: boxId, extractor: extractor }, { spendBlock: blockId, spendHeight: blockHeight });
30
+ convertEntityToData = (entities) => {
31
+ return entities;
195
32
  };
196
33
  }
197
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhdWRBY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYWN0aW9ucy9mcmF1ZEFjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE9BQU8sRUFBa0IsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUUsT0FBTyxFQUFjLEVBQUUsRUFBYyxNQUFNLGdDQUFnQyxDQUFDO0FBRzVFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBR3RELE1BQU0sT0FBTyxXQUFXO0lBQ0wsVUFBVSxDQUFhO0lBQ3ZCLE1BQU0sQ0FBaUI7SUFDdkIsVUFBVSxDQUEwQjtJQUVyRCxZQUFZLFVBQXNCLEVBQUUsTUFBdUI7UUFDekQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUNEOzs7Ozs7T0FNRztJQUNILGdCQUFnQixHQUFHLEtBQUssRUFDdEIsTUFBNkIsRUFDN0IsS0FBWSxFQUNaLFNBQWlCLEVBQ2pCLEVBQUU7UUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUMzQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqQixTQUFT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QyxNQUFNLEVBQUU7Z0JBQ04sS0FBSyxFQUFFLElBQUk7YUFDWjtZQUNELEtBQUssRUFBRTtnQkFDTCxTQUFTLEVBQUUsU0FBUzthQUNyQjtTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQXVCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RCxDQUFDLENBQUM7SUFFRjs7OztPQUlHO0lBQ0gsV0FBVyxHQUFHLEtBQUssRUFBRSxLQUFhLEVBQUUsU0FBaUIsRUFBRSxFQUFFO1FBQ3ZELE9BQU8sTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQyxDQUFDO0lBRUY7Ozs7OztPQU1HO0lBQ0gsZ0JBQWdCLEdBQUcsS0FBSyxFQUN0QixLQUFhLEVBQ2IsU0FBaUIsRUFDakIsT0FBZSxFQUNmLFdBQW1CLEVBQ25CLEVBQUU7UUFDRixPQUFPLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQ2pDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQ3RDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQ2xELENBQUM7SUFDSixDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNodW5rIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIsIER1bW15TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSwgSW4sIFJlcG9zaXRvcnkgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2V4dGVuZGVkLXR5cGVvcm0nO1xuaW1wb3J0IHsgQmxvY2sgfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IGRiSWRDaHVua1NpemUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgRnJhdWRFbnRpdHkgfSBmcm9tICcuLi9lbnRpdGllcy9mcmF1ZEVudGl0eSc7XG5pbXBvcnQgeyBFeHRyYWN0ZWRGcmF1ZCB9IGZyb20gJy4uL2ludGVyZmFjZXMvdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgRnJhdWRBY3Rpb24ge1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFzb3VyY2U6IERhdGFTb3VyY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvc2l0b3J5OiBSZXBvc2l0b3J5PEZyYXVkRW50aXR5PjtcblxuICBjb25zdHJ1Y3RvcihkYXRhU291cmNlOiBEYXRhU291cmNlLCBsb2dnZXI/OiBBYnN0cmFjdExvZ2dlcikge1xuICAgIHRoaXMuZGF0YXNvdXJjZSA9IGRhdGFTb3VyY2U7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXIgPyBsb2dnZXIgOiBuZXcgRHVtbXlMb2dnZXIoKTtcbiAgICB0aGlzLnJlcG9zaXRvcnkgPSBkYXRhU291cmNlLmdldFJlcG9zaXRvcnkoRnJhdWRFbnRpdHkpO1xuICB9XG4gIC8qKlxuICAgKiBTdG9yZSBhIGxpc3Qgb2YgZnJhdWRzIGluIGEgc3BlY2lmaWMgYmxvY2tcbiAgICogQHBhcmFtIGZyYXVkc1xuICAgKiBAcGFyYW0gc3BlbmRCb3hlc1xuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgc3RvcmVCbG9ja0ZyYXVkcyA9IGFzeW5jIChcbiAgICBmcmF1ZHM6IEFycmF5PEV4dHJhY3RlZEZyYXVkPixcbiAgICBibG9jazogQmxvY2ssXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICkgPT4ge1xuICAgIGNvbnN0IGJveElkcyA9IGZyYXVkcy5tYXAoKGl0ZW0pID0+IGl0ZW0uYm94SWQpO1xuICAgIGNvbnN0IGRiQm94ZXMgPSBhd2FpdCB0aGlzLnJlcG9zaXRvcnkuZmluZEJ5KHtcbiAgICAgIGJveElkOiBJbihib3hJZHMpLFxuICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgfSk7XG4gICAgbGV0IHN1Y2Nlc3MgPSB0cnVlO1xuICAgIGNvbnN0IHF1ZXJ5UnVubmVyID0gdGhpcy5kYXRhc291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XG4gICAgYXdhaXQgcXVlcnlSdW5uZXIuY29ubmVjdCgpO1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKTtcbiAgICBjb25zdCByZXBvc2l0b3J5ID0gYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5nZXRSZXBvc2l0b3J5KEZyYXVkRW50aXR5KTtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBmcmF1ZCBvZiBmcmF1ZHMpIHtcbiAgICAgICAgY29uc3QgZW50aXR5ID0ge1xuICAgICAgICAgIHRyaWdnZXJCb3hJZDogZnJhdWQudHJpZ2dlckJveElkLFxuICAgICAgICAgIGJveElkOiBmcmF1ZC5ib3hJZCxcbiAgICAgICAgICB3aWQ6IGZyYXVkLndpZCxcbiAgICAgICAgICByd3RDb3VudDogZnJhdWQucnd0Q291bnQsXG4gICAgICAgICAgY3JlYXRpb25CbG9jazogYmxvY2suaGFzaCxcbiAgICAgICAgICBjcmVhdGlvbkhlaWdodDogYmxvY2suaGVpZ2h0LFxuICAgICAgICAgIGNyZWF0aW9uVHhJZDogZnJhdWQudHhJZCxcbiAgICAgICAgICBzZXJpYWxpemVkOiBmcmF1ZC5zZXJpYWxpemVkLFxuICAgICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgICAgIHNwZW5kQmxvY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzcGVuZEhlaWdodDogdW5kZWZpbmVkLFxuICAgICAgICAgIHNwZW5kVHhJZDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBkYkJveCA9IGRiQm94ZXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmJveElkID09PSBmcmF1ZC5ib3hJZCk7XG4gICAgICAgIGlmIChkYkJveC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgVXBkYXRpbmcgZnJhdWQgd2l0aCBib3hJZCBbJHtmcmF1ZC5ib3hJZH1dYCk7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFVwZGF0ZWQgZnJhdWQ6IFske0pTT04uc3RyaW5naWZ5KGVudGl0eSl9XWApO1xuICAgICAgICAgIGF3YWl0IHJlcG9zaXRvcnkudXBkYXRlKHsgaWQ6IGRiQm94WzBdLmlkIH0sIGVudGl0eSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgU3RvcmluZyBmcmF1ZCB3aXRoIGJveElkOiBbJHtmcmF1ZC5ib3hJZH1dYCk7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEluc2VydGVkIGZyYXVkOiBbJHtKU09OLnN0cmluZ2lmeShlbnRpdHkpfV1gKTtcbiAgICAgICAgICBhd2FpdCByZXBvc2l0b3J5Lmluc2VydChlbnRpdHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgc3RvcmluZyBmcmF1ZCBib3hlczogJHtlfWApO1xuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpO1xuICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yZWxlYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJbnNlcnQgYSBuZXcgZnJhdWQgaW50byBkYXRhYmFzZVxuICAgKiBAcGFyYW0gZnJhdWRcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgaW5zZXJ0RnJhdWQgPSBhc3luYyAoZnJhdWQ6IEV4dHJhY3RlZEZyYXVkLCBleHRyYWN0b3I6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG9zaXRvcnkuaW5zZXJ0KHtcbiAgICAgIGJveElkOiBmcmF1ZC5ib3hJZCxcbiAgICAgIHRyaWdnZXJCb3hJZDogZnJhdWQudHJpZ2dlckJveElkLFxuICAgICAgd2lkOiBmcmF1ZC53aWQsXG4gICAgICByd3RDb3VudDogZnJhdWQucnd0Q291bnQsXG4gICAgICBjcmVhdGlvbkJsb2NrOiBmcmF1ZC5ibG9ja0lkLFxuICAgICAgY3JlYXRpb25IZWlnaHQ6IGZyYXVkLmhlaWdodCxcbiAgICAgIGNyZWF0aW9uVHhJZDogZnJhdWQudHhJZCxcbiAgICAgIHNlcmlhbGl6ZWQ6IGZyYXVkLnNlcmlhbGl6ZWQsXG4gICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIGFuIHVuc3BlbnQgZnJhdWQgaW5mb3JtYXRpb24gaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSBmcmF1ZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqL1xuICB1cGRhdGVGcmF1ZCA9IGFzeW5jIChmcmF1ZDogRXh0cmFjdGVkRnJhdWQsIGV4dHJhY3Rvcjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICB7IGJveElkOiBmcmF1ZC5ib3hJZCwgZXh0cmFjdG9yOiBleHRyYWN0b3IgfSxcbiAgICAgIHtcbiAgICAgICAgdHJpZ2dlckJveElkOiBmcmF1ZC50cmlnZ2VyQm94SWQsXG4gICAgICAgIGNyZWF0aW9uQmxvY2s6IGZyYXVkLmJsb2NrSWQsXG4gICAgICAgIGNyZWF0aW9uSGVpZ2h0OiBmcmF1ZC5oZWlnaHQsXG4gICAgICAgIGNyZWF0aW9uVHhJZDogZnJhdWQudHhJZCxcbiAgICAgICAgc2VyaWFsaXplZDogZnJhdWQuc2VyaWFsaXplZCxcbiAgICAgICAgd2lkOiBmcmF1ZC53aWQsXG4gICAgICAgIHJ3dENvdW50OiBmcmF1ZC5yd3RDb3VudCxcbiAgICAgICAgc3BlbmRCbG9jazogbnVsbCxcbiAgICAgICAgc3BlbmRIZWlnaHQ6IDAsXG4gICAgICB9LFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzcGVuZEJsb2NrIGFuZCBzcGVuZEhlaWdodCBvZiBmcmF1ZHMgc3BlbnQgb24gdGhlIGJsb2NrXG4gICAqIEBwYXJhbSBzcGVuZElkc1xuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgc3BlbmRGcmF1ZHMgPSBhc3luYyAoXG4gICAgc3BlbmRJZHM6IEFycmF5PHN0cmluZz4sXG4gICAgYmxvY2s6IEJsb2NrLFxuICAgIGV4dHJhY3Rvcjogc3RyaW5nLFxuICAgIHR4SWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3Qgc3BlbmRJZENodW5rcyA9IGNodW5rKHNwZW5kSWRzLCBkYklkQ2h1bmtTaXplKTtcbiAgICBmb3IgKGNvbnN0IHNwZW5kSWRDaHVuayBvZiBzcGVuZElkQ2h1bmtzKSB7XG4gICAgICBjb25zdCB1cGRhdGVSZXN1bHQgPSBhd2FpdCB0aGlzLnJlcG9zaXRvcnkudXBkYXRlKFxuICAgICAgICB7IGJveElkOiBJbihzcGVuZElkQ2h1bmspLCBleHRyYWN0b3I6IGV4dHJhY3RvciB9LFxuICAgICAgICB7IHNwZW5kQmxvY2s6IGJsb2NrLmhhc2gsIHNwZW5kSGVpZ2h0OiBibG9jay5oZWlnaHQsIHNwZW5kVHhJZDogdHhJZCB9LFxuICAgICAgKTtcblxuICAgICAgaWYgKHVwZGF0ZVJlc3VsdC5hZmZlY3RlZCAmJiB1cGRhdGVSZXN1bHQuYWZmZWN0ZWQgPiAwKSB7XG4gICAgICAgIGNvbnN0IHNwZW50Um93cyA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeS5maW5kQnkoe1xuICAgICAgICAgIGJveElkOiBJbihzcGVuZElkQ2h1bmspLFxuICAgICAgICAgIHNwZW5kQmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICAgICAgc3BlbmRUeElkOiB0eElkLFxuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChjb25zdCByb3cgb2Ygc3BlbnRSb3dzKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgU3BlbnQgYm94IHdpdGggYm94SWQgWyR7cm93LmJveElkfV0gYXQgdHJhbnNhY3Rpb24gWyR7dHhJZH1dIGF0IGhlaWdodCAke2Jsb2NrLmhlaWdodH1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbGwgZnJhdWRzIHJlbGF0ZWQgdG8gYW4gc3BlY2lmaWMgaW52YWxpZCBibG9ja1xuICAgKiBpZiBib3ggaGFkIGJlZW4gc3BlbnQgaW4gdGhlIGJsb2NrIG1hcmsgaXQgYXMgdW5zcGVudCxcbiAgICogYW5kIGlmIGl0IHdhcyBjcmVhdGVkIHdpdGhpbiB0aGUgYmxvY2sgcmVtb3ZlIGl0IGZyb20gZGF0YWJhc2VcbiAgICogQHBhcmFtIGJsb2NrXG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICovXG4gIGRlbGV0ZUJsb2NrID0gYXN5bmMgKGJsb2NrOiBzdHJpbmcsIGV4dHJhY3Rvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdGhpcy5sb2dnZXIuaW5mbyhgRGVsZXRpbmcgZnJhdWRzIGluIGJsb2NrIFske2Jsb2NrfV1gKTtcbiAgICBjb25zdCBpbnZhbGlkUm93cyA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeS5maW5kQnkoe1xuICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICBjcmVhdGlvbkJsb2NrOiBibG9jayxcbiAgICB9KTtcbiAgICBpZiAoaW52YWxpZFJvd3MubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5LmRlbGV0ZSh7XG4gICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgICBjcmVhdGlvbkJsb2NrOiBibG9jayxcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgaW52YWxpZFJvd3MpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYGRlbGV0ZWQgaW52YWxpZCBmcmF1ZCB3aXRoIGJveElkIFske3Jvdy5ib3hJZH1dIGF0IHRoZSBmb3JrZWQgYmxvY2sgWyR7YmxvY2t9XWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0aW5nUm93cyA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeS5maW5kQnkoe1xuICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICBzcGVuZEJsb2NrOiBibG9jayxcbiAgICB9KTtcbiAgICBpZiAodXBkYXRpbmdSb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMucmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICAgIHsgc3BlbmRCbG9jazogYmxvY2ssIGV4dHJhY3RvcjogZXh0cmFjdG9yIH0sXG4gICAgICAgIHsgc3BlbmRCbG9jazogbnVsbCwgc3BlbmRIZWlnaHQ6IDAsIHNwZW5kVHhJZDogbnVsbCB9LFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHVwZGF0aW5nUm93cykge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgcmVtb3ZlZCBzcGVuZGluZyBpbmZvcm1hdGlvbiBvZiB0aGUgZnJhdWQgd2l0aCBib3hJZCBbJHtyb3cuYm94SWR9XSwgc3BlbnQgYXQgdGhlIGZvcmtlZCBibG9jayBbJHtibG9ja31dYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbGwgc3RvcmVkIGZyYXVkIGJveCBpZHNcbiAgICovXG4gIGdldEFsbEJveElkcyA9IGFzeW5jIChleHRyYWN0b3I6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8c3RyaW5nPj4gPT4ge1xuICAgIGNvbnN0IGJveElkcyA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeS5maW5kKHtcbiAgICAgIHNlbGVjdDoge1xuICAgICAgICBib3hJZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB3aGVyZToge1xuICAgICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGJveElkcy5tYXAoKGl0ZW06IHsgYm94SWQ6IHN0cmluZyB9KSA9PiBpdGVtLmJveElkKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIGFuIHNwZWNpZmllZCBmcmF1ZFxuICAgKiBAcGFyYW0gYm94SWRcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgcmVtb3ZlRnJhdWQgPSBhc3luYyAoYm94SWQ6IHN0cmluZywgZXh0cmFjdG9yOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXBvc2l0b3J5LmRlbGV0ZSh7IGJveElkOiBib3hJZCwgZXh0cmFjdG9yOiBleHRyYWN0b3IgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgZnJhdWQgc3BlbmRpbmcgaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIGJveElkXG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICogQHBhcmFtIGJsb2NrSWRcbiAgICogQHBhcmFtIGJsb2NrSGVpZ2h0XG4gICAqL1xuICB1cGRhdGVTcGVuZEJsb2NrID0gYXN5bmMgKFxuICAgIGJveElkOiBzdHJpbmcsXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICAgYmxvY2tJZDogc3RyaW5nLFxuICAgIGJsb2NrSGVpZ2h0OiBudW1iZXIsXG4gICkgPT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcG9zaXRvcnkudXBkYXRlKFxuICAgICAgeyBib3hJZDogYm94SWQsIGV4dHJhY3RvcjogZXh0cmFjdG9yIH0sXG4gICAgICB7IHNwZW5kQmxvY2s6IGJsb2NrSWQsIHNwZW5kSGVpZ2h0OiBibG9ja0hlaWdodCB9LFxuICAgICk7XG4gIH07XG59XG4iXX0=
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhdWRBY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYWN0aW9ucy9mcmF1ZEFjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUt6RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHdEQsTUFBTSxPQUFPLFdBQVksU0FBUSxxQkFHaEM7SUFDQyxZQUFZLFVBQXNCLEVBQUUsTUFBdUI7UUFDekQsS0FBSyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNPLFlBQVksR0FBRyxDQUN2QixNQUF3QixFQUN4QixLQUFnQixFQUNoQixTQUFpQixFQUNlLEVBQUU7UUFDbEMsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLEdBQUcsS0FBSztZQUNSLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNqQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDcEIsU0FBUztZQUNULFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxJQUFJLElBQUk7WUFDcEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLElBQUksSUFBSTtZQUN0QyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsSUFBSSxJQUFJO1NBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQyxDQUFDO0lBRUY7Ozs7T0FJRztJQUNPLG1CQUFtQixHQUFHLENBQzlCLFFBQXVCLEVBQ0wsRUFBRTtRQUNwQixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0RXJnb0JveEFjdGlvbiB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtZXh0cmFjdG9yJztcbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5pbXBvcnQgeyBCbG9ja0luZm8gfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IEZyYXVkRW50aXR5IH0gZnJvbSAnLi4vZW50aXRpZXMvZnJhdWRFbnRpdHknO1xuaW1wb3J0IHsgRXh0cmFjdGVkRnJhdWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIEZyYXVkQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RFcmdvQm94QWN0aW9uPFxuICBFeHRyYWN0ZWRGcmF1ZCxcbiAgRnJhdWRFbnRpdHlcbj4ge1xuICBjb25zdHJ1Y3RvcihkYXRhU291cmNlOiBEYXRhU291cmNlLCBsb2dnZXI/OiBBYnN0cmFjdExvZ2dlcikge1xuICAgIHN1cGVyKGRhdGFTb3VyY2UsIEZyYXVkRW50aXR5LCBsb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSB0aGUgZnJhdWQgZW50aXR5IGZyb20gZXh0cmFjdGVkIGRhdGEgYW5kIGJsb2NrIGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSBmcmF1ZHNcbiAgICogQHBhcmFtIGJsb2NrXG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICogQHJldHVybnMgdGhlIGZyYXVkIGVudGl0aWVzICh3aXRob3V0IHRoZSBpZClcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVFbnRpdHkgPSAoXG4gICAgZnJhdWRzOiBFeHRyYWN0ZWRGcmF1ZFtdLFxuICAgIGJsb2NrOiBCbG9ja0luZm8sXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICk6IEFycmF5PE9taXQ8RnJhdWRFbnRpdHksICdpZCc+PiA9PiB7XG4gICAgcmV0dXJuIGZyYXVkcy5tYXAoKGZyYXVkKSA9PiAoe1xuICAgICAgLi4uZnJhdWQsXG4gICAgICBibG9jazogYmxvY2suaGFzaCxcbiAgICAgIGhlaWdodDogYmxvY2suaGVpZ2h0LFxuICAgICAgZXh0cmFjdG9yLFxuICAgICAgc3BlbmRCbG9jazogZnJhdWQuc3BlbmRCbG9jayA/PyBudWxsLFxuICAgICAgc3BlbmRIZWlnaHQ6IGZyYXVkLnNwZW5kSGVpZ2h0ID8/IG51bGwsXG4gICAgICBzcGVuZFR4SWQ6IGZyYXVkLnNwZW5kVHhJZCA/PyBudWxsLFxuICAgIH0pKTtcbiAgfTtcblxuICAvKipcbiAgICogY29udmVydCB0aGUgZGF0YWJhc2UgZW50aXR5IGJhY2sgdG8gcmF3IGRhdGFcbiAgICogQHBhcmFtIGVudGl0aWVzXG4gICAqIEByZXR1cm5zIHRoZSBleHRyYWN0ZWQgZnJhdWQgZGF0YVxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnZlcnRFbnRpdHlUb0RhdGEgPSAoXG4gICAgZW50aXRpZXM6IEZyYXVkRW50aXR5W10sXG4gICk6IEV4dHJhY3RlZEZyYXVkW10gPT4ge1xuICAgIHJldHVybiBlbnRpdGllcztcbiAgfTtcbn1cbiJdfQ==
@@ -1,16 +1,8 @@
1
- export declare class FraudEntity {
2
- id: number;
3
- boxId: string;
4
- creationBlock: string;
5
- creationHeight: number;
6
- creationTxId: string;
7
- serialized: string;
1
+ import { AbstractErgoBoxEntity } from '@rosen-bridge/abstract-extractor';
2
+ export declare class FraudEntity extends AbstractErgoBoxEntity {
8
3
  triggerBoxId: string;
4
+ txId: string;
9
5
  wid: string;
10
6
  rwtCount: string;
11
- spendBlock?: string | null;
12
- spendHeight?: number;
13
- spendTxId?: string | null;
14
- extractor: string;
15
7
  }
16
8
  //# sourceMappingURL=fraudEntity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fraudEntity.d.ts","sourceRoot":"","sources":["../../lib/entities/fraudEntity.ts"],"names":[],"mappings":"AAMA,qBACa,WAAW;IAEtB,EAAE,EAAE,MAAM,CAAC;IAGX,KAAK,EAAE,MAAM,CAAC;IAGd,aAAa,EAAE,MAAM,CAAC;IAGtB,cAAc,EAAE,MAAM,CAAC;IAGvB,YAAY,EAAE,MAAM,CAAC;IAGrB,UAAU,EAAE,MAAM,CAAC;IAGnB,YAAY,EAAE,MAAM,CAAC;IAGrB,GAAG,EAAE,MAAM,CAAC;IAGZ,QAAQ,EAAE,MAAM,CAAC;IAGjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAG3B,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAG1B,SAAS,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"fraudEntity.d.ts","sourceRoot":"","sources":["../../lib/entities/fraudEntity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAGzE,qBACa,WAAY,SAAQ,qBAAqB;IAEpD,YAAY,EAAE,MAAM,CAAC;IAGrB,IAAI,EAAE,MAAM,CAAC;IAGb,GAAG,EAAE,MAAM,CAAC;IAGZ,QAAQ,EAAE,MAAM,CAAC;CAClB"}
@@ -7,50 +7,22 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
- import { Column, Entity, PrimaryGeneratedColumn, } from '@rosen-bridge/extended-typeorm';
11
- let FraudEntity = class FraudEntity {
12
- id;
13
- boxId;
14
- creationBlock;
15
- creationHeight;
16
- creationTxId;
17
- serialized;
10
+ import { AbstractErgoBoxEntity } from '@rosen-bridge/abstract-extractor';
11
+ import { Column, Entity } from '@rosen-bridge/extended-typeorm';
12
+ let FraudEntity = class FraudEntity extends AbstractErgoBoxEntity {
18
13
  triggerBoxId;
14
+ txId;
19
15
  wid;
20
16
  rwtCount;
21
- spendBlock;
22
- spendHeight;
23
- spendTxId;
24
- extractor;
25
17
  };
26
- __decorate([
27
- PrimaryGeneratedColumn(),
28
- __metadata("design:type", Number)
29
- ], FraudEntity.prototype, "id", void 0);
30
18
  __decorate([
31
19
  Column({ type: 'varchar' }),
32
20
  __metadata("design:type", String)
33
- ], FraudEntity.prototype, "boxId", void 0);
34
- __decorate([
35
- Column({ type: 'varchar' }),
36
- __metadata("design:type", String)
37
- ], FraudEntity.prototype, "creationBlock", void 0);
38
- __decorate([
39
- Column({ type: 'int' }),
40
- __metadata("design:type", Number)
41
- ], FraudEntity.prototype, "creationHeight", void 0);
42
- __decorate([
43
- Column({ type: 'varchar' }),
44
- __metadata("design:type", String)
45
- ], FraudEntity.prototype, "creationTxId", void 0);
46
- __decorate([
47
- Column({ type: 'text' }),
48
- __metadata("design:type", String)
49
- ], FraudEntity.prototype, "serialized", void 0);
21
+ ], FraudEntity.prototype, "triggerBoxId", void 0);
50
22
  __decorate([
51
23
  Column({ type: 'varchar' }),
52
24
  __metadata("design:type", String)
53
- ], FraudEntity.prototype, "triggerBoxId", void 0);
25
+ ], FraudEntity.prototype, "txId", void 0);
54
26
  __decorate([
55
27
  Column({ type: 'varchar' }),
56
28
  __metadata("design:type", String)
@@ -59,24 +31,8 @@ __decorate([
59
31
  Column({ type: 'varchar' }),
60
32
  __metadata("design:type", String)
61
33
  ], FraudEntity.prototype, "rwtCount", void 0);
62
- __decorate([
63
- Column({ nullable: true, type: 'text' }),
64
- __metadata("design:type", Object)
65
- ], FraudEntity.prototype, "spendBlock", void 0);
66
- __decorate([
67
- Column({ nullable: true, type: 'int' }),
68
- __metadata("design:type", Number)
69
- ], FraudEntity.prototype, "spendHeight", void 0);
70
- __decorate([
71
- Column({ nullable: true, type: 'text' }),
72
- __metadata("design:type", Object)
73
- ], FraudEntity.prototype, "spendTxId", void 0);
74
- __decorate([
75
- Column({ type: 'varchar' }),
76
- __metadata("design:type", String)
77
- ], FraudEntity.prototype, "extractor", void 0);
78
34
  FraudEntity = __decorate([
79
35
  Entity('fraud_entity')
80
36
  ], FraudEntity);
81
37
  export { FraudEntity };
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhdWRFbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZW50aXRpZXMvZnJhdWRFbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sc0JBQXNCLEdBQ3ZCLE1BQU0sZ0NBQWdDLENBQUM7QUFHakMsSUFBTSxXQUFXLEdBQWpCLE1BQU0sV0FBVztJQUV0QixFQUFFLENBQVM7SUFHWCxLQUFLLENBQVM7SUFHZCxhQUFhLENBQVM7SUFHdEIsY0FBYyxDQUFTO0lBR3ZCLFlBQVksQ0FBUztJQUdyQixVQUFVLENBQVM7SUFHbkIsWUFBWSxDQUFTO0lBR3JCLEdBQUcsQ0FBUztJQUdaLFFBQVEsQ0FBUztJQUdqQixVQUFVLENBQWlCO0lBRzNCLFdBQVcsQ0FBVTtJQUdyQixTQUFTLENBQWlCO0lBRzFCLFNBQVMsQ0FBUztDQUNuQixDQUFBO0FBckNDO0lBREMsc0JBQXNCLEVBQUU7O3VDQUNkO0FBR1g7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7OzBDQUNkO0FBR2Q7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O2tEQUNOO0FBR3RCO0lBREMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDOzttREFDRDtBQUd2QjtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7aURBQ1A7QUFHckI7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7OytDQUNOO0FBR25CO0lBREMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOztpREFDUDtBQUdyQjtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7d0NBQ2hCO0FBR1o7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7OzZDQUNYO0FBR2pCO0lBREMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7OytDQUNkO0FBRzNCO0lBREMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7O2dEQUNuQjtBQUdyQjtJQURDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOzs4Q0FDZjtBQUcxQjtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7OENBQ1Y7QUF0Q1AsV0FBVztJQUR2QixNQUFNLENBQUMsY0FBYyxDQUFDO0dBQ1YsV0FBVyxDQXVDdkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb2x1bW4sXG4gIEVudGl0eSxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcblxuQEVudGl0eSgnZnJhdWRfZW50aXR5JylcbmV4cG9ydCBjbGFzcyBGcmF1ZEVudGl0eSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgaWQ6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgdHlwZTogJ3ZhcmNoYXInIH0pXG4gIGJveElkOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBjcmVhdGlvbkJsb2NrOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICdpbnQnIH0pXG4gIGNyZWF0aW9uSGVpZ2h0OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBjcmVhdGlvblR4SWQ6IHN0cmluZztcblxuICBAQ29sdW1uKHsgdHlwZTogJ3RleHQnIH0pXG4gIHNlcmlhbGl6ZWQ6IHN0cmluZztcblxuICBAQ29sdW1uKHsgdHlwZTogJ3ZhcmNoYXInIH0pXG4gIHRyaWdnZXJCb3hJZDogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndmFyY2hhcicgfSlcbiAgd2lkOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICByd3RDb3VudDogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBudWxsYWJsZTogdHJ1ZSwgdHlwZTogJ3RleHQnIH0pXG4gIHNwZW5kQmxvY2s/OiBzdHJpbmcgfCBudWxsO1xuXG4gIEBDb2x1bW4oeyBudWxsYWJsZTogdHJ1ZSwgdHlwZTogJ2ludCcgfSlcbiAgc3BlbmRIZWlnaHQ/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG51bGxhYmxlOiB0cnVlLCB0eXBlOiAndGV4dCcgfSlcbiAgc3BlbmRUeElkPzogc3RyaW5nIHwgbnVsbDtcblxuICBAQ29sdW1uKHsgdHlwZTogJ3ZhcmNoYXInIH0pXG4gIGV4dHJhY3Rvcjogc3RyaW5nO1xufVxuIl19
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhdWRFbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZW50aXRpZXMvZnJhdWRFbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDekUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUd6RCxJQUFNLFdBQVcsR0FBakIsTUFBTSxXQUFZLFNBQVEscUJBQXFCO0lBRXBELFlBQVksQ0FBUztJQUdyQixJQUFJLENBQVM7SUFHYixHQUFHLENBQVM7SUFHWixRQUFRLENBQVM7Q0FDbEIsQ0FBQTtBQVZDO0lBREMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOztpREFDUDtBQUdyQjtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7eUNBQ2Y7QUFHYjtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7d0NBQ2hCO0FBR1o7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7OzZDQUNYO0FBWE4sV0FBVztJQUR2QixNQUFNLENBQUMsY0FBYyxDQUFDO0dBQ1YsV0FBVyxDQVl2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0RXJnb0JveEVudGl0eSB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtZXh0cmFjdG9yJztcbmltcG9ydCB7IENvbHVtbiwgRW50aXR5IH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcblxuQEVudGl0eSgnZnJhdWRfZW50aXR5JylcbmV4cG9ydCBjbGFzcyBGcmF1ZEVudGl0eSBleHRlbmRzIEFic3RyYWN0RXJnb0JveEVudGl0eSB7XG4gIEBDb2x1bW4oeyB0eXBlOiAndmFyY2hhcicgfSlcbiAgdHJpZ2dlckJveElkOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICB0eElkOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICB3aWQ6IHN0cmluZztcblxuICBAQ29sdW1uKHsgdHlwZTogJ3ZhcmNoYXInIH0pXG4gIHJ3dENvdW50OiBzdHJpbmc7XG59XG4iXX0=