@rosen-bridge/abstract-scanner 1.1.0-db631ff1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { AbstractLogger } from '@rosen-bridge/abstract-logger';
2
- import { DataSource, DeleteResult, Repository, ObjectLiteral, SelectQueryBuilder } from '@rosen-bridge/extended-typeorm';
2
+ import { DataSource, DeleteResult, Repository } from '@rosen-bridge/extended-typeorm';
3
3
  import { Block } from '@rosen-bridge/scanner-interfaces';
4
4
  import { BlockEntity } from '../entities/blockEntity';
5
5
  import { ExtractorStatusEntity } from '../entities/extractorStatusEntity';
@@ -79,26 +79,5 @@ export declare class BlockDbAction {
79
79
  * @returns extractors` status
80
80
  */
81
81
  getExtractorsStatus: (extractorIds: string[]) => Promise<ExtractorStatusEntity[]>;
82
- /**
83
- * Generates queries with unique parameters
84
- *
85
- * @param queryBuilders
86
- * @returns queries and their unique parameters
87
- */
88
- generateQueriesWithUniqueParams: (queryBuilders: SelectQueryBuilder<ObjectLiteral>[]) => {
89
- queryParts: string[];
90
- parameters: Record<string, unknown>;
91
- };
92
- /**
93
- * Removes unused blocks based on the queries retrieving used blocks
94
- *
95
- * @param extractorUsedBlocksQueries
96
- * @param deletedBlockCount
97
- * @param scannerName
98
- * @param blockAgeThreshold
99
- * @param lastSavedBlock
100
- * @returns The hashes of the removed unused blocks
101
- */
102
- removeUnusedBlocksInBatches: (extractorUsedBlocksQueries: SelectQueryBuilder<ObjectLiteral>[], deletedBlockCount: number, scannerName: string, blockAgeThreshold: number, lastSavedBlock: BlockEntity | undefined) => Promise<string[]>;
103
82
  }
104
83
  //# sourceMappingURL=action.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../lib/scanner/action.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EACL,UAAU,EACV,YAAY,EAEZ,UAAU,EAEV,aAAa,EACb,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAuB,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,qBAAa,aAAa;IACxB,QAAQ,CAAC,eAAe,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IAClD,QAAQ,CAAC,yBAAyB,EAAE,UAAU,CAAC,qBAAqB,CAAC,CAAC;IACtE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;gBAG9B,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,cAAc;IAWzB,QAAQ,CAAC,IAAI,eAA0B;IAEvC;;;OAGG;IACH,iBAAiB,QAAa,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAW5D;IAEF;;;;OAIG;IACH,kBAAkB,GAChB,MAAM,MAAM,EACZ,OAAO,MAAM,KACZ,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAO5B;IAEF;;;OAGG;IACH,kBAAkB,QAAa,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAW7D;IAEF;;;;;OAKG;IACH,gBAAgB,GACd,QAAQ,MAAM,EACd,SAAQ,MAAgB,KACvB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAWjC;IAEF;;;;OAIG;IACH,gBAAgB,GAAU,MAAM,MAAM,EAAE,SAAQ,MAAgB,iCAM9D;IAEF;;;;OAIG;IACH,sBAAsB,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,YAAY,CAAC,CAMpE;IAEF;;;OAGG;IACH,SAAS,GAAU,OAAO,KAAK,KAAG,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,CA0C9D;IAEF;;;OAGG;IACH,iBAAiB,GACf,QAAQ,MAAM,EACd,WAAW,MAAM,EACjB,cAAc,MAAM,EAAE,KACrB,OAAO,CAAC,OAAO,CAAC,CAqCjB;IAEF;;;OAGG;IACH,iBAAiB,GACf,QAAQ,MAAM,EACd,YAAY,MAAM,EAClB,cAAc,MAAM,EAAE,KACrB,OAAO,CAAC,OAAO,CAAC,CAsCjB;IAEF;;;;;OAKG;IACH,6BAA6B,GAC3B,aAAa,MAAM,EACnB,QAAQ,MAAM,EACd,WAAW,MAAM;;;;;+BAgBjB;IAEF;;;;OAIG;IACH,mBAAmB,GACjB,cAAc,MAAM,EAAE,KACrB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAKjC;IAEF;;;;;OAKG;IACH,+BAA+B,GAC7B,eAAe,kBAAkB,CAAC,aAAa,CAAC,EAAE,KACjD;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAwB9D;IAEF;;;;;;;;;OASG;IACH,2BAA2B,GACzB,4BAA4B,kBAAkB,CAAC,aAAa,CAAC,EAAE,EAC/D,mBAAmB,MAAM,EACzB,aAAa,MAAM,EACnB,mBAAmB,MAAM,EACzB,gBAAgB,WAAW,GAAG,SAAS,KACtC,OAAO,CAAC,MAAM,EAAE,CAAC,CA+BlB;CACH"}
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../lib/scanner/action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EACL,UAAU,EACV,YAAY,EAEZ,UAAU,EAEX,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAuB,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,qBAAa,aAAa;IACxB,QAAQ,CAAC,eAAe,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IAClD,QAAQ,CAAC,yBAAyB,EAAE,UAAU,CAAC,qBAAqB,CAAC,CAAC;IACtE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;gBAG9B,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,cAAc;IAWzB,QAAQ,CAAC,IAAI,eAA0B;IAEvC;;;OAGG;IACH,iBAAiB,QAAa,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAW5D;IAEF;;;;OAIG;IACH,kBAAkB,GAChB,MAAM,MAAM,EACZ,OAAO,MAAM,KACZ,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAO5B;IAEF;;;OAGG;IACH,kBAAkB,QAAa,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAW7D;IAEF;;;;;OAKG;IACH,gBAAgB,GACd,QAAQ,MAAM,EACd,SAAQ,MAAgB,KACvB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAWjC;IAEF;;;;OAIG;IACH,gBAAgB,GAAU,MAAM,MAAM,EAAE,SAAQ,MAAgB,iCAM9D;IAEF;;;;OAIG;IACH,sBAAsB,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,YAAY,CAAC,CAMpE;IAEF;;;OAGG;IACH,SAAS,GAAU,OAAO,KAAK,KAAG,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,CA0C9D;IAEF;;;OAGG;IACH,iBAAiB,GACf,QAAQ,MAAM,EACd,WAAW,MAAM,EACjB,cAAc,MAAM,EAAE,KACrB,OAAO,CAAC,OAAO,CAAC,CAqCjB;IAEF;;;OAGG;IACH,iBAAiB,GACf,QAAQ,MAAM,EACd,YAAY,MAAM,EAClB,cAAc,MAAM,EAAE,KACrB,OAAO,CAAC,OAAO,CAAC,CAsCjB;IAEF;;;;;OAKG;IACH,6BAA6B,GAC3B,aAAa,MAAM,EACnB,QAAQ,MAAM,EACd,WAAW,MAAM;;;;;+BAgBjB;IAEF;;;;OAIG;IACH,mBAAmB,GACjB,cAAc,MAAM,EAAE,KACrB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAKjC;CACH"}
@@ -1,4 +1,3 @@
1
- import { uniqueId } from 'lodash-es';
2
1
  import { DummyLogger } from '@rosen-bridge/abstract-logger';
3
2
  import { MoreThanOrEqual, In, } from '@rosen-bridge/extended-typeorm';
4
3
  import { BlockEntity, PROCEED, PROCESSING } from '../entities/blockEntity';
@@ -248,63 +247,5 @@ export class BlockDbAction {
248
247
  extractorId: In(extractorIds),
249
248
  });
250
249
  };
251
- /**
252
- * Generates queries with unique parameters
253
- *
254
- * @param queryBuilders
255
- * @returns queries and their unique parameters
256
- */
257
- generateQueriesWithUniqueParams = (queryBuilders) => {
258
- let queryParts = [], parameters = {};
259
- queryBuilders.forEach((queryBuilder) => {
260
- const prefix = uniqueId('query');
261
- const queryWithUniqueParams = queryBuilder
262
- .getQuery()
263
- .replace(/:(\w+)/g, (_, key) => `:${prefix}${key}`);
264
- queryParts.push(queryWithUniqueParams);
265
- const queryParams = queryBuilder.getParameters();
266
- const prefixedParams = Object.fromEntries(Object.entries(queryParams).map(([key, value]) => [
267
- `${prefix}${key}`,
268
- value,
269
- ]));
270
- parameters = { ...parameters, ...prefixedParams };
271
- });
272
- return { queryParts, parameters };
273
- };
274
- /**
275
- * Removes unused blocks based on the queries retrieving used blocks
276
- *
277
- * @param extractorUsedBlocksQueries
278
- * @param deletedBlockCount
279
- * @param scannerName
280
- * @param blockAgeThreshold
281
- * @param lastSavedBlock
282
- * @returns The hashes of the removed unused blocks
283
- */
284
- removeUnusedBlocksInBatches = async (extractorUsedBlocksQueries, deletedBlockCount, scannerName, blockAgeThreshold, lastSavedBlock) => {
285
- const { queryParts, parameters } = this.generateQueriesWithUniqueParams(extractorUsedBlocksQueries);
286
- const unionQuery = queryParts.map((sql) => `${sql}`).join(' UNION ');
287
- const thresholdTimestamp = lastSavedBlock
288
- ? lastSavedBlock.timestamp - blockAgeThreshold
289
- : 0;
290
- const blocksToDelete = await this.blockRepository
291
- .createQueryBuilder('blockEntity')
292
- .addSelect('blockEntity.hash', 'hash')
293
- .where(`blockEntity.hash NOT IN (${unionQuery})`)
294
- .andWhere(`blockEntity.scanner = :scannerName`, { scannerName })
295
- .andWhere('blockEntity.timestamp < :thresholdTimestamp', {
296
- thresholdTimestamp,
297
- })
298
- .setParameters({ ...parameters })
299
- .distinct(true)
300
- .orderBy('blockEntity.height', 'ASC')
301
- .take(deletedBlockCount)
302
- .getRawMany();
303
- const unusedBlockHashes = blocksToDelete.map((row) => row.hash);
304
- await this.blockRepository.delete({
305
- hash: In(unusedBlockHashes),
306
- });
307
- return unusedBlockHashes;
308
- };
309
250
  }
310
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL3NjYW5uZXIvYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckMsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RSxPQUFPLEVBR0wsZUFBZSxFQUVmLEVBQUUsR0FHSCxNQUFNLGdDQUFnQyxDQUFDO0FBR3hDLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRTFFLE1BQU0sT0FBTyxhQUFhO0lBQ2YsZUFBZSxDQUEwQjtJQUN6Qyx5QkFBeUIsQ0FBb0M7SUFDN0QsVUFBVSxDQUFhO0lBQ3ZCLFdBQVcsQ0FBUztJQUNwQixNQUFNLENBQWlCO0lBRWhDLFlBQ0UsVUFBc0IsRUFDdEIsV0FBbUIsRUFDbkIsTUFBdUI7UUFFdkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyx5QkFBeUIsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUN2RCxxQkFBcUIsQ0FDdEIsQ0FBQztRQUNGLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVRLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBRXZDOzs7T0FHRztJQUNILGlCQUFpQixHQUFHLEtBQUssSUFBc0MsRUFBRTtRQUMv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TUFBTSxJQUFJLENBQUMsZUFBZTthQUM5QyxrQkFBa0IsQ0FBQyxhQUFhLENBQUM7YUFDakMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQzthQUNyQyxLQUFLLENBQUMsNEJBQTRCLFVBQVUsR0FBRyxDQUFDO2FBQ2hELFFBQVEsQ0FBQyxvQ0FBb0MsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDO2FBQy9ELFFBQVEsQ0FBQyw2Q0FBNkMsRUFBRTtZQUN2RCxrQkFBa0I7U0FDbkIsQ0FBQzthQUNELGFBQWEsQ0FBQyxFQUFFLEdBQUcsVUFBVSxFQUFFLENBQUM7YUFDaEMsUUFBUSxDQUFDLElBQUksQ0FBQzthQUNkLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUM7YUFDcEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2FBQ3ZCLFVBQVUsRUFBRSxDQUFDO1FBRWhCLE1BQU0saUJBQWlCLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhFLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7WUFDaEMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztTQUM1QixDQUFDLENBQUM7UUFFSCxPQUFPLGlCQUFpQixDQUFDO0lBQzNCLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdW5pcXVlSWQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdExvZ2dlciwgRHVtbXlMb2dnZXIgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LWxvZ2dlcic7XG5pbXBvcnQge1xuICBEYXRhU291cmNlLFxuICBEZWxldGVSZXN1bHQsXG4gIE1vcmVUaGFuT3JFcXVhbCxcbiAgUmVwb3NpdG9yeSxcbiAgSW4sXG4gIE9iamVjdExpdGVyYWwsXG4gIFNlbGVjdFF1ZXJ5QnVpbGRlcixcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcbmltcG9ydCB7IEJsb2NrIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuXG5pbXBvcnQgeyBCbG9ja0VudGl0eSwgUFJPQ0VFRCwgUFJPQ0VTU0lORyB9IGZyb20gJy4uL2VudGl0aWVzL2Jsb2NrRW50aXR5JztcbmltcG9ydCB7IEV4dHJhY3RvclN0YXR1c0VudGl0eSB9IGZyb20gJy4uL2VudGl0aWVzL2V4dHJhY3RvclN0YXR1c0VudGl0eSc7XG5cbmV4cG9ydCBjbGFzcyBCbG9ja0RiQWN0aW9uIHtcbiAgcmVhZG9ubHkgYmxvY2tSZXBvc2l0b3J5OiBSZXBvc2l0b3J5PEJsb2NrRW50aXR5PjtcbiAgcmVhZG9ubHkgZXh0cmFjdG9yU3RhdHVzUmVwb3NpdG9yeTogUmVwb3NpdG9yeTxFeHRyYWN0b3JTdGF0dXNFbnRpdHk+O1xuICByZWFkb25seSBkYXRhU291cmNlOiBEYXRhU291cmNlO1xuICByZWFkb25seSBzY2FubmVyTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsb2dnZXI6IEFic3RyYWN0TG9nZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgc2Nhbm5lck5hbWU6IHN0cmluZyxcbiAgICBsb2dnZXI/OiBBYnN0cmFjdExvZ2dlcixcbiAgKSB7XG4gICAgdGhpcy5ibG9ja1JlcG9zaXRvcnkgPSBkYXRhU291cmNlLmdldFJlcG9zaXRvcnkoQmxvY2tFbnRpdHkpO1xuICAgIHRoaXMuZXh0cmFjdG9yU3RhdHVzUmVwb3NpdG9yeSA9IGRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShcbiAgICAgIEV4dHJhY3RvclN0YXR1c0VudGl0eSxcbiAgICApO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7XG4gICAgdGhpcy5zY2FubmVyTmFtZSA9IHNjYW5uZXJOYW1lO1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyID8gbG9nZ2VyIDogbmV3IER1bW15TG9nZ2VyKCk7XG4gIH1cblxuICByZWFkb25seSBuYW1lID0gKCkgPT4gdGhpcy5zY2FubmVyTmFtZTtcblxuICAvKipcbiAgICogZ2V0IGxhc3Qgc2F2ZWQgYmxvY2tcbiAgICogQHJldHVybiBQcm9taXNlPEJsb2NrRW50aXR5IG9yIHVuZGVmaW5lZD5cbiAgICovXG4gIGdldExhc3RTYXZlZEJsb2NrID0gYXN5bmMgKCk6IFByb21pc2U8QmxvY2tFbnRpdHkgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICBjb25zdCBsYXN0QmxvY2sgPSBhd2FpdCB0aGlzLmJsb2NrUmVwb3NpdG9yeS5maW5kKHtcbiAgICAgIHdoZXJlOiB7IHN0YXR1czogUFJPQ0VFRCwgc2Nhbm5lcjogdGhpcy5uYW1lKCkgfSxcbiAgICAgIG9yZGVyOiB7IGhlaWdodDogJ0RFU0MnIH0sXG4gICAgICB0YWtlOiAxLFxuICAgIH0pO1xuICAgIGlmIChsYXN0QmxvY2subGVuZ3RoICE9PSAwKSB7XG4gICAgICByZXR1cm4gbGFzdEJsb2NrWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogZ2V0IGxhc3QgbiBzdG9yZWQgYmxvY2tzIGluIGRhdGFiYXNlXG4gICAqIEBwYXJhbSBza2lwXG4gICAqIEBwYXJhbSBjb3VudFxuICAgKi9cbiAgZ2V0TGFzdFNhdmVkQmxvY2tzID0gYXN5bmMgKFxuICAgIHNraXA6IG51bWJlcixcbiAgICBjb3VudDogbnVtYmVyLFxuICApOiBQcm9taXNlPEFycmF5PEJsb2NrRW50aXR5Pj4gPT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJsb2NrUmVwb3NpdG9yeS5maW5kKHtcbiAgICAgIHdoZXJlOiB7IHN0YXR1czogUFJPQ0VFRCwgc2Nhbm5lcjogdGhpcy5uYW1lKCkgfSxcbiAgICAgIG9yZGVyOiB7IGhlaWdodDogJ0RFU0MnIH0sXG4gICAgICBza2lwOiBza2lwLFxuICAgICAgdGFrZTogY291bnQsXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGdldCBmaXJzdCBzYXZlZCBibG9ja1xuICAgKiBAcmV0dXJuIFByb21pc2U8QmxvY2tFbnRpdHkgb3IgdW5kZWZpbmVkPlxuICAgKi9cbiAgZ2V0Rmlyc3RTYXZlZEJsb2NrID0gYXN5bmMgKCk6IFByb21pc2U8QmxvY2tFbnRpdHkgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICBjb25zdCBsYXN0QmxvY2sgPSBhd2FpdCB0aGlzLmJsb2NrUmVwb3NpdG9yeS5maW5kKHtcbiAgICAgIHdoZXJlOiB7IHN0YXR1czogUFJPQ0VFRCwgc2Nhbm5lcjogdGhpcy5uYW1lKCkgfSxcbiAgICAgIG9yZGVyOiB7IGhlaWdodDogJ0FTQycgfSxcbiAgICAgIHRha2U6IDEsXG4gICAgfSk7XG4gICAgaWYgKGxhc3RCbG9jay5sZW5ndGggIT09IDApIHtcbiAgICAgIHJldHVybiBsYXN0QmxvY2tbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBnZXQgYmxvY2sgaGFzaCBhbmQgaGVpZ2h0XG4gICAqIEBwYXJhbSBoZWlnaHRcbiAgICogQHBhcmFtIHN0YXR1c1xuICAgKiBAcmV0dXJuIFByb21pc2U8QmxvY2tFbnRpdHl8dW5kZWZpbmVkPlxuICAgKi9cbiAgZ2V0QmxvY2tBdEhlaWdodCA9IGFzeW5jIChcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBzdGF0dXM6IHN0cmluZyA9IFBST0NFRUQsXG4gICk6IFByb21pc2U8QmxvY2tFbnRpdHkgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICBjb25zdCBibG9jayA9IGF3YWl0IHRoaXMuYmxvY2tSZXBvc2l0b3J5LmZpbmRPbmVCeSh7XG4gICAgICBzdGF0dXM6IHN0YXR1cyxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgc2Nhbm5lcjogdGhpcy5uYW1lKCksXG4gICAgfSk7XG4gICAgaWYgKGJsb2NrICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gYmxvY2s7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBnZXQgYmxvY2sgd2l0aCBlbnRlcmVkIGJsb2NraGFzaFxuICAgKiBAcGFyYW0gaGFzaFxuICAgKiBAcGFyYW0gc3RhdHVzXG4gICAqL1xuICBnZXRCbG9ja1dpdGhIYXNoID0gYXN5bmMgKGhhc2g6IHN0cmluZywgc3RhdHVzOiBzdHJpbmcgPSBQUk9DRUVEKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2tSZXBvc2l0b3J5LmZpbmRPbmVCeSh7XG4gICAgICBoYXNoOiBoYXNoLFxuICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICBzY2FubmVyOiB0aGlzLm5hbWUoKSxcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogaXQgZGVsZXRlcyBldmVyeSBibG9jayB0aGF0IG1vcmUgdGhhbiBvciBlcXVhbCBoZWlnaHRcbiAgICogQHBhcmFtIGhlaWdodFxuICAgKiBAcmV0dXJuIFByb21pc2U8RGVsZXRlUmVzdWx0PlxuICAgKi9cbiAgcmVtb3ZlQmxvY2tzRnJvbUhlaWdodCA9IGFzeW5jIChoZWlnaHQ6IG51bWJlcik6IFByb21pc2U8RGVsZXRlUmVzdWx0PiA9PiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFJlbW92aW5nIGJsb2NrcyBmcm9tIGhlaWdodCAke2hlaWdodH1gKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ibG9ja1JlcG9zaXRvcnkuZGVsZXRlKHtcbiAgICAgIGhlaWdodDogTW9yZVRoYW5PckVxdWFsKGhlaWdodCksXG4gICAgICBzY2FubmVyOiB0aGlzLm5hbWUoKSxcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogc3RvcmUgYSBibG9jayBpbnRvIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gYmxvY2tcbiAgICovXG4gIHNhdmVCbG9jayA9IGFzeW5jIChibG9jazogQmxvY2spOiBQcm9taXNlPEJsb2NrRW50aXR5IHwgYm9vbGVhbj4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IHRoaXMuYmxvY2tSZXBvc2l0b3J5LmZpbmRPbmVCeSh7XG4gICAgICAgIGhlaWdodDogYmxvY2suaGVpZ2h0LFxuICAgICAgICBzY2FubmVyOiB0aGlzLm5hbWUoKSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGJsb2NrLnRpbWVzdGFtcCAqIDEwMDApO1xuICAgICAgY29uc3QgYmxvY2tJbmZvID0ge1xuICAgICAgICBoZWlnaHQ6IGJsb2NrLmhlaWdodCxcbiAgICAgICAgaGFzaDogYmxvY2suaGFzaCxcbiAgICAgICAgcGFyZW50SGFzaDogYmxvY2sucGFyZW50SGFzaCxcbiAgICAgICAgc3RhdHVzOiBQUk9DRVNTSU5HLFxuICAgICAgICBzY2FubmVyOiB0aGlzLm5hbWUoKSxcbiAgICAgICAgZXh0cmE6IGJsb2NrLmV4dHJhLFxuICAgICAgICB0aW1lc3RhbXA6IGJsb2NrLnRpbWVzdGFtcCxcbiAgICAgICAgeWVhcjogZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBtb250aDogZGF0ZS5nZXRNb250aCgpICsgMSxcbiAgICAgICAgZGF5OiBkYXRlLmdldERhdGUoKSxcbiAgICAgIH07XG4gICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGBJbnNlcnRpbmcgYmxvY2sgd2l0aCBpbmZvOiAke0pTT04uc3RyaW5naWZ5KGJsb2NrSW5mbyl9YCxcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5ibG9ja1JlcG9zaXRvcnkuaW5zZXJ0KGJsb2NrSW5mbyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgVXBkYXRpbmcgYmxvY2sgd2l0aCBpbmZvOiAke0pTT04uc3RyaW5naWZ5KGJsb2NrSW5mbyl9YCxcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5ibG9ja1JlcG9zaXRvcnkudXBkYXRlKFxuICAgICAgICAgIHsgaGVpZ2h0OiBibG9jay5oZWlnaHQsIHNjYW5uZXI6IHRoaXMubmFtZSgpIH0sXG4gICAgICAgICAgYmxvY2tJbmZvLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5ibG9ja1JlcG9zaXRvcnkuZmluZE9uZUJ5KHtcbiAgICAgICAgaGVpZ2h0OiBibG9jay5oZWlnaHQsXG4gICAgICAgIHNjYW5uZXI6IHRoaXMubmFtZSgpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzID8gcmVzIDogZmFsc2U7XG4gICAgfSBjYXRjaCAoZXhwKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHNhdmUgbmV3IGJsb2NrOiAke2V4cH1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzdGF0dXMgb2YgYSBibG9jayB0byBwcm9jZWVkXG4gICAqIEBwYXJhbSBoZWlnaHQ6IGhlaWdodCBvZiBleHBlY3RlZCBibG9ja1xuICAgKi9cbiAgdXBkYXRlQmxvY2tTdGF0dXMgPSBhc3luYyAoXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgYmxvY2tIYXNoOiBzdHJpbmcsXG4gICAgZXh0cmFjdG9ySWRzOiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgbGV0IHN1Y2Nlc3MgPSB0cnVlO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgYEJsb2NrIGF0IGhlaWdodCAke2hlaWdodH0gaGFzIGJlZW4gcHJvY2VlZCBpbiBzY2FubmVyICR7dGhpcy5uYW1lKCl9LCB1cGRhdGluZyBzdGF0dXNgLFxuICAgICk7XG4gICAgY29uc3QgcnVubmVyID0gdGhpcy5kYXRhU291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XG4gICAgYXdhaXQgcnVubmVyLmNvbm5lY3QoKTtcbiAgICBhd2FpdCBydW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBydW5uZXIubWFuYWdlci5nZXRSZXBvc2l0b3J5KEJsb2NrRW50aXR5KS51cGRhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICBzdGF0dXM6IFBST0NFU1NJTkcsXG4gICAgICAgICAgc2Nhbm5lcjogdGhpcy5uYW1lKCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0dXM6IFBST0NFRUQsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnVXBkYXRpbmcgZXh0cmFjdG9ycyBzdGF0dXMnLCB7XG4gICAgICAgIGV4dHJhY3RvcklkcyxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgcnVubmVyLm1hbmFnZXJcbiAgICAgICAgLmdldFJlcG9zaXRvcnkoRXh0cmFjdG9yU3RhdHVzRW50aXR5KVxuICAgICAgICAudXBkYXRlKFxuICAgICAgICAgIHsgZXh0cmFjdG9ySWQ6IEluKGV4dHJhY3RvcklkcyksIHNjYW5uZXJJZDogdGhpcy5uYW1lKCkgfSxcbiAgICAgICAgICB7IHVwZGF0ZUhlaWdodDogaGVpZ2h0LCB1cGRhdGVCbG9ja0hhc2g6IGJsb2NrSGFzaCB9LFxuICAgICAgICApO1xuICAgICAgYXdhaXQgcnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBhd2FpdCBydW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpO1xuICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBydW5uZXIucmVsZWFzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHN0YXR1cyBvZiBhIGJsb2NrIHRvIHByb2Nlc3NpbmcgaW4gY2FzZSBvZiBmb3JrXG4gICAqIEBwYXJhbSBoZWlnaHQ6IGhlaWdodCBvZiBleHBlY3RlZCBibG9ja1xuICAgKi9cbiAgcmV2ZXJ0QmxvY2tTdGF0dXMgPSBhc3luYyAoXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgcGFyZW50SGFzaDogc3RyaW5nLFxuICAgIGV4dHJhY3Rvcklkczogc3RyaW5nW10sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGxldCBzdWNjZXNzID0gdHJ1ZTtcbiAgICBjb25zdCBydW5uZXIgPSB0aGlzLmRhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIoKTtcbiAgICBhd2FpdCBydW5uZXIuY29ubmVjdCgpO1xuICAgIGF3YWl0IHJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBSZXZlcnRpbmcgYmxvY2sgc3RhdHVzIGF0IGhlaWdodCAke2hlaWdodH1gKTtcbiAgICAgIGF3YWl0IHJ1bm5lci5tYW5hZ2VyLmdldFJlcG9zaXRvcnkoQmxvY2tFbnRpdHkpLnVwZGF0ZShcbiAgICAgICAge1xuICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgIHN0YXR1czogUFJPQ0VFRCxcbiAgICAgICAgICBzY2FubmVyOiB0aGlzLm5hbWUoKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHN0YXR1czogUFJPQ0VTU0lORyxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgUmV2ZXJ0aW5nIGV4dHJhY3RvcnMgdXBkYXRlIGhlaWdodCB0byBwcmV2aW91cyBibG9jayBhdCBoZWlnaHQgJHtcbiAgICAgICAgICBoZWlnaHQgLSAxXG4gICAgICAgIH1gLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHJ1bm5lci5tYW5hZ2VyXG4gICAgICAgIC5nZXRSZXBvc2l0b3J5KEV4dHJhY3RvclN0YXR1c0VudGl0eSlcbiAgICAgICAgLnVwZGF0ZShcbiAgICAgICAgICB7IGV4dHJhY3RvcklkOiBJbihleHRyYWN0b3JJZHMpLCBzY2FubmVySWQ6IHRoaXMubmFtZSgpIH0sXG4gICAgICAgICAgeyB1cGRhdGVIZWlnaHQ6IGhlaWdodCAtIDEsIHVwZGF0ZUJsb2NrSGFzaDogcGFyZW50SGFzaCB9LFxuICAgICAgICApO1xuICAgICAgYXdhaXQgcnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihgQW4gRXJyb3Igb2NjdXJyZWQgd2hpbGUgcmV2ZXJ0aW5nIGJsb2NrIHN0YXR1czogJHtlfWApO1xuICAgICAgYXdhaXQgcnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKTtcbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcnVubmVyLnJlbGVhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc2VydCBhIG5ld2x5IGluaXRpYWxpemVkIGV4dHJhY3RvciBvciB1cGRhdGUgYW4gZXhpc3RpbmcgZXh0cmFjdG9yIHN0YXR1c1xuICAgKiBAcGFyYW0gZXh0cmFjdG9ySWRcbiAgICogQHBhcmFtIGhlaWdodFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgdXBkYXRlT3JJbnNlcnRFeHRyYWN0b3JTdGF0dXMgPSBhc3luYyAoXG4gICAgZXh0cmFjdG9ySWQ6IHN0cmluZyxcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBibG9ja0hhc2g6IHN0cmluZyxcbiAgKSA9PiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAnSW5zZXJ0aW5nIG5ldyBleHRyYWN0b3Igc3RhdHVzIG9yIFVwZGF0aW5nIGV4aXN0aW5nIHJlc3luY2VkIGV4dHJhY3RvciBzdGF0dXMnLFxuICAgICAge1xuICAgICAgICBleHRyYWN0b3JJZCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBibG9ja0hhc2gsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0cmFjdG9yU3RhdHVzUmVwb3NpdG9yeS5zYXZlKHtcbiAgICAgIHNjYW5uZXJJZDogdGhpcy5uYW1lKCksXG4gICAgICBleHRyYWN0b3JJZCxcbiAgICAgIHVwZGF0ZUhlaWdodDogaGVpZ2h0LFxuICAgICAgdXBkYXRlQmxvY2tIYXNoOiBibG9ja0hhc2gsXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiBleHRyYWN0b3JzYCBzdGF0dXMgc3BlY2lmaWVkIGJ5IGlkXG4gICAqIEBwYXJhbSBleHRyYWN0b3JJZHNcbiAgICogQHJldHVybnMgZXh0cmFjdG9yc2Agc3RhdHVzXG4gICAqL1xuICBnZXRFeHRyYWN0b3JzU3RhdHVzID0gYXN5bmMgKFxuICAgIGV4dHJhY3Rvcklkczogc3RyaW5nW10sXG4gICk6IFByb21pc2U8RXh0cmFjdG9yU3RhdHVzRW50aXR5W10+ID0+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRyYWN0b3JTdGF0dXNSZXBvc2l0b3J5LmZpbmRCeSh7XG4gICAgICBzY2FubmVySWQ6IHRoaXMubmFtZSgpLFxuICAgICAgZXh0cmFjdG9ySWQ6IEluKGV4dHJhY3RvcklkcyksXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBxdWVyaWVzIHdpdGggdW5pcXVlIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQHBhcmFtIHF1ZXJ5QnVpbGRlcnNcbiAgICogQHJldHVybnMgcXVlcmllcyBhbmQgdGhlaXIgdW5pcXVlIHBhcmFtZXRlcnNcbiAgICovXG4gIGdlbmVyYXRlUXVlcmllc1dpdGhVbmlxdWVQYXJhbXMgPSAoXG4gICAgcXVlcnlCdWlsZGVyczogU2VsZWN0UXVlcnlCdWlsZGVyPE9iamVjdExpdGVyYWw+W10sXG4gICk6IHsgcXVlcnlQYXJ0czogc3RyaW5nW107IHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0gPT4ge1xuICAgIGxldCBxdWVyeVBhcnRzOiBzdHJpbmdbXSA9IFtdLFxuICAgICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIHF1ZXJ5QnVpbGRlcnMuZm9yRWFjaCgocXVlcnlCdWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBwcmVmaXggPSB1bmlxdWVJZCgncXVlcnknKTtcblxuICAgICAgY29uc3QgcXVlcnlXaXRoVW5pcXVlUGFyYW1zID0gcXVlcnlCdWlsZGVyXG4gICAgICAgIC5nZXRRdWVyeSgpXG4gICAgICAgIC5yZXBsYWNlKC86KFxcdyspL2csIChfLCBrZXkpID0+IGA6JHtwcmVmaXh9JHtrZXl9YCk7XG5cbiAgICAgIHF1ZXJ5UGFydHMucHVzaChxdWVyeVdpdGhVbmlxdWVQYXJhbXMpO1xuXG4gICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHF1ZXJ5QnVpbGRlci5nZXRQYXJhbWV0ZXJzKCk7XG4gICAgICBjb25zdCBwcmVmaXhlZFBhcmFtcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocXVlcnlQYXJhbXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICAgICAgYCR7cHJlZml4fSR7a2V5fWAsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgIF0pLFxuICAgICAgKTtcbiAgICAgIHBhcmFtZXRlcnMgPSB7IC4uLnBhcmFtZXRlcnMsIC4uLnByZWZpeGVkUGFyYW1zIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBxdWVyeVBhcnRzLCBwYXJhbWV0ZXJzIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdW51c2VkIGJsb2NrcyBiYXNlZCBvbiB0aGUgcXVlcmllcyByZXRyaWV2aW5nIHVzZWQgYmxvY2tzXG4gICAqXG4gICAqIEBwYXJhbSBleHRyYWN0b3JVc2VkQmxvY2tzUXVlcmllc1xuICAgKiBAcGFyYW0gZGVsZXRlZEJsb2NrQ291bnRcbiAgICogQHBhcmFtIHNjYW5uZXJOYW1lXG4gICAqIEBwYXJhbSBibG9ja0FnZVRocmVzaG9sZFxuICAgKiBAcGFyYW0gbGFzdFNhdmVkQmxvY2tcbiAgICogQHJldHVybnMgVGhlIGhhc2hlcyBvZiB0aGUgcmVtb3ZlZCB1bnVzZWQgYmxvY2tzXG4gICAqL1xuICByZW1vdmVVbnVzZWRCbG9ja3NJbkJhdGNoZXMgPSBhc3luYyAoXG4gICAgZXh0cmFjdG9yVXNlZEJsb2Nrc1F1ZXJpZXM6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxPYmplY3RMaXRlcmFsPltdLFxuICAgIGRlbGV0ZWRCbG9ja0NvdW50OiBudW1iZXIsXG4gICAgc2Nhbm5lck5hbWU6IHN0cmluZyxcbiAgICBibG9ja0FnZVRocmVzaG9sZDogbnVtYmVyLFxuICAgIGxhc3RTYXZlZEJsb2NrOiBCbG9ja0VudGl0eSB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICAgIGNvbnN0IHsgcXVlcnlQYXJ0cywgcGFyYW1ldGVycyB9ID0gdGhpcy5nZW5lcmF0ZVF1ZXJpZXNXaXRoVW5pcXVlUGFyYW1zKFxuICAgICAgZXh0cmFjdG9yVXNlZEJsb2Nrc1F1ZXJpZXMsXG4gICAgKTtcblxuICAgIGNvbnN0IHVuaW9uUXVlcnkgPSBxdWVyeVBhcnRzLm1hcCgoc3FsKSA9PiBgJHtzcWx9YCkuam9pbignIFVOSU9OICcpO1xuICAgIGNvbnN0IHRocmVzaG9sZFRpbWVzdGFtcCA9IGxhc3RTYXZlZEJsb2NrXG4gICAgICA/IGxhc3RTYXZlZEJsb2NrLnRpbWVzdGFtcCAtIGJsb2NrQWdlVGhyZXNob2xkXG4gICAgICA6IDA7XG5cbiAgICBjb25zdCBibG9ja3NUb0RlbGV0ZSA9IGF3YWl0IHRoaXMuYmxvY2tSZXBvc2l0b3J5XG4gICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKCdibG9ja0VudGl0eScpXG4gICAgICAuYWRkU2VsZWN0KCdibG9ja0VudGl0eS5oYXNoJywgJ2hhc2gnKVxuICAgICAgLndoZXJlKGBibG9ja0VudGl0eS5oYXNoIE5PVCBJTiAoJHt1bmlvblF1ZXJ5fSlgKVxuICAgICAgLmFuZFdoZXJlKGBibG9ja0VudGl0eS5zY2FubmVyID0gOnNjYW5uZXJOYW1lYCwgeyBzY2FubmVyTmFtZSB9KVxuICAgICAgLmFuZFdoZXJlKCdibG9ja0VudGl0eS50aW1lc3RhbXAgPCA6dGhyZXNob2xkVGltZXN0YW1wJywge1xuICAgICAgICB0aHJlc2hvbGRUaW1lc3RhbXAsXG4gICAgICB9KVxuICAgICAgLnNldFBhcmFtZXRlcnMoeyAuLi5wYXJhbWV0ZXJzIH0pXG4gICAgICAuZGlzdGluY3QodHJ1ZSlcbiAgICAgIC5vcmRlckJ5KCdibG9ja0VudGl0eS5oZWlnaHQnLCAnQVNDJylcbiAgICAgIC50YWtlKGRlbGV0ZWRCbG9ja0NvdW50KVxuICAgICAgLmdldFJhd01hbnkoKTtcblxuICAgIGNvbnN0IHVudXNlZEJsb2NrSGFzaGVzID0gYmxvY2tzVG9EZWxldGUubWFwKChyb3cpID0+IHJvdy5oYXNoKTtcblxuICAgIGF3YWl0IHRoaXMuYmxvY2tSZXBvc2l0b3J5LmRlbGV0ZSh7XG4gICAgICBoYXNoOiBJbih1bnVzZWRCbG9ja0hhc2hlcyksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdW51c2VkQmxvY2tIYXNoZXM7XG4gIH07XG59XG4iXX0=
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL3NjYW5uZXIvYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBa0IsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUUsT0FBTyxFQUdMLGVBQWUsRUFFZixFQUFFLEdBQ0gsTUFBTSxnQ0FBZ0MsQ0FBQztBQUd4QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUxRSxNQUFNLE9BQU8sYUFBYTtJQUNmLGVBQWUsQ0FBMEI7SUFDekMseUJBQXlCLENBQW9DO0lBQzdELFVBQVUsQ0FBYTtJQUN2QixXQUFXLENBQVM7SUFDcEIsTUFBTSxDQUFpQjtJQUVoQyxZQUNFLFVBQXNCLEVBQ3RCLFdBQW1CLEVBQ25CLE1BQXVCO1FBRXZCLElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMseUJBQXlCLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FDdkQscUJBQXFCLENBQ3RCLENBQUM7UUFDRixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFUSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUV2Qzs7O09BR0c7SUFDSCxpQkFBaUIsR0FBRyxLQUFLLElBQXNDLEVBQUU7UUFDL0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFD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LE9BQU8sQ0FBQztJQUNqQixDQUFDLENBQUM7SUFFRjs7Ozs7T0FLRztJQUNILDZCQUE2QixHQUFHLEtBQUssRUFDbkMsV0FBbUIsRUFDbkIsTUFBYyxFQUNkLFNBQWlCLEVBQ2pCLEVBQUU7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZiwrRUFBK0UsRUFDL0U7WUFDRSxXQUFXO1lBQ1gsTUFBTTtZQUNOLFNBQVM7U0FDVixDQUNGLENBQUM7UUFDRixPQUFPLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQztZQUMvQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRTtZQUN0QixXQUFXO1lBQ1gsWUFBWSxFQUFFLE1BQU07WUFDcEIsZUFBZSxFQUFFLFNBQVM7U0FDM0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBRUY7Ozs7T0FJRztJQUNILG1CQUFtQixHQUFHLEtBQUssRUFDekIsWUFBc0IsRUFDWSxFQUFFO1FBQ3BDLE9BQU8sTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDO1lBQ2pELFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3RCLFdBQVcsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDO1NBQzlCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIsIER1bW15TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHtcbiAgRGF0YVNvdXJjZSxcbiAgRGVsZXRlUmVzdWx0LFxuICBNb3JlVGhhbk9yRXF1YWwsXG4gIFJlcG9zaXRvcnksXG4gIEluLFxufSBmcm9tICdAcm9zZW4tYnJpZGdlL2V4dGVuZGVkLXR5cGVvcm0nO1xuaW1wb3J0IHsgQmxvY2sgfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IEJsb2NrRW50aXR5LCBQUk9DRUVELCBQUk9DRVNTSU5HIH0gZnJvbSAnLi4vZW50aXRpZXMvYmxvY2tFbnRpdHknO1xuaW1wb3J0IHsgRXh0cmFjdG9yU3RhdHVzRW50aXR5IH0gZnJvbSAnLi4vZW50aXRpZXMvZXh0cmFjdG9yU3RhdHVzRW50aXR5JztcblxuZXhwb3J0IGNsYXNzIEJsb2NrRGJBY3Rpb24ge1xuICByZWFkb25seSBibG9ja1JlcG9zaXRvcnk6IFJlcG9zaXRvcnk8QmxvY2tFbnRpdHk+O1xuICByZWFkb25seSBleHRyYWN0b3JTdGF0dXNSZXBvc2l0b3J5OiBSZXBvc2l0b3J5PEV4dHJhY3RvclN0YXR1c0VudGl0eT47XG4gIHJlYWRvbmx5IGRhdGFTb3VyY2U6IERhdGFTb3VyY2U7XG4gIHJlYWRvbmx5IHNjYW5uZXJOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxvZ2dlcjogQWJzdHJhY3RMb2dnZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICBzY2FubmVyTmFtZTogc3RyaW5nLFxuICAgIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyLFxuICApIHtcbiAgICB0aGlzLmJsb2NrUmVwb3NpdG9yeSA9IGRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShCbG9ja0VudGl0eSk7XG4gICAgdGhpcy5leHRyYWN0b3JTdGF0dXNSZXBvc2l0b3J5ID0gZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFxuICAgICAgRXh0cmFjdG9yU3RhdHVzRW50aXR5LFxuICAgICk7XG4gICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcbiAgICB0aGlzLnNjYW5uZXJOYW1lID0gc2Nhbm5lck5hbWU7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXIgPyBsb2dnZXIgOiBuZXcgRHVtbXlMb2dnZXIoKTtcbiAgfVxuXG4gIHJlYWRvbmx5IG5hbWUgPSAoKSA9PiB0aGlzLnNjYW5uZXJOYW1lO1xuXG4gIC8qKlxuICAgKiBnZXQgbGFzdCBzYXZlZCBibG9ja1xuICAgKiBAcmV0dXJuIFByb21pc2U8QmxvY2tFbnRpdHkgb3IgdW5kZWZpbmVkPlxuICAgKi9cbiAgZ2V0TGFzdFNhdmVkQmxvY2sgPSBhc3luYyAoKTogUHJvbWlzZTxCbG9ja0VudGl0eSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IGxhc3RCbG9jayA9IGF3YWl0IHRoaXMuYmxvY2tSZXBvc2l0b3J5LmZpbmQoe1xuICAgICAgd2hlcmU6IHsgc3RhdHVzOiBQUk9DRUVELCBzY2FubmVyOiB0aGlzLm5hbWUoKSB9LFxuICAgICAgb3JkZXI6IHsgaGVpZ2h0OiAnREVTQycgfSxcbiAgICAgIHRha2U6IDEsXG4gICAgfSk7XG4gICAgaWYgKGxhc3RCbG9jay5sZW5ndGggIT09IDApIHtcbiAgICAgIHJldHVybiBsYXN0QmxvY2tbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBnZXQgbGFzdCBuIHN0b3JlZCBibG9ja3MgaW4gZGF0YWJhc2VcbiAgICogQHBhcmFtIHNraXBcbiAgICogQHBhcmFtIGNvdW50XG4gICAqL1xuICBnZXRMYXN0U2F2ZWRCbG9ja3MgPSBhc3luYyAoXG4gICAgc2tpcDogbnVtYmVyLFxuICAgIGNvdW50OiBudW1iZXIsXG4gICk6IFByb21pc2U8QXJyYXk8QmxvY2tFbnRpdHk+PiA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYmxvY2tSZXBvc2l0b3J5LmZpbmQoe1xuICAgICAgd2hlcmU6IHsgc3RhdHVzOiBQUk9DRUVELCBzY2FubmVyOiB0aGlzLm5hbWUoKSB9LFxuICAgICAgb3JkZXI6IHsgaGVpZ2h0OiAnREVTQycgfSxcbiAgICAgIHNraXA6IHNraXAsXG4gICAgICB0YWtlOiBjb3VudCxcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogZ2V0IGZpcnN0IHNhdmVkIGJsb2NrXG4gICAqIEByZXR1cm4gUHJvbWlzZTxCbG9ja0VudGl0eSBvciB1bmRlZmluZWQ+XG4gICAqL1xuICBnZXRGaXJzdFNhdmVkQmxvY2sgPSBhc3luYyAoKTogUHJvbWlzZTxCbG9ja0VudGl0eSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IGxhc3RCbG9jayA9IGF3YWl0IHRoaXMuYmxvY2tSZXBvc2l0b3J5LmZpbmQoe1xuICAgICAgd2hlcmU6IHsgc3RhdHVzOiBQUk9DRUVELCBzY2FubmVyOiB0aGlzLm5hbWUoKSB9LFxuICAgICAgb3JkZXI6IHsgaGVpZ2h0OiAnQVNDJyB9LFxuICAgICAgdGFrZTogMSxcbiAgICB9KTtcbiAgICBpZiAobGFzdEJsb2NrLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmV0dXJuIGxhc3RCbG9ja1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIGdldCBibG9jayBoYXNoIGFuZCBoZWlnaHRcbiAgICogQHBhcmFtIGhlaWdodFxuICAgKiBAcGFyYW0gc3RhdHVzXG4gICAqIEByZXR1cm4gUHJvbWlzZTxCbG9ja0VudGl0eXx1bmRlZmluZWQ+XG4gICAqL1xuICBnZXRCbG9ja0F0SGVpZ2h0ID0gYXN5bmMgKFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIHN0YXR1czogc3RyaW5nID0gUFJPQ0VFRCxcbiAgKTogUHJvbWlzZTxCbG9ja0VudGl0eSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IGJsb2NrID0gYXdhaXQgdGhpcy5ibG9ja1JlcG9zaXRvcnkuZmluZE9uZUJ5KHtcbiAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBzY2FubmVyOiB0aGlzLm5hbWUoKSxcbiAgICB9KTtcbiAgICBpZiAoYmxvY2sgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBibG9jaztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIGdldCBibG9jayB3aXRoIGVudGVyZWQgYmxvY2toYXNoXG4gICAqIEBwYXJhbSBoYXNoXG4gICAqIEBwYXJhbSBzdGF0dXNcbiAgICovXG4gIGdldEJsb2NrV2l0aEhhc2ggPSBhc3luYyAoaGFzaDogc3RyaW5nLCBzdGF0dXM6IHN0cmluZyA9IFBST0NFRUQpID0+IHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja1JlcG9zaXRvcnkuZmluZE9uZUJ5KHtcbiAgICAgIGhhc2g6IGhhc2gsXG4gICAgICBzdGF0dXM6IHN0YXR1cyxcbiAgICAgIHNjYW5uZXI6IHRoaXMubmFtZSgpLFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBpdCBkZWxldGVzIGV2ZXJ5IGJsb2NrIHRoYXQgbW9yZSB0aGFuIG9yIGVxdWFsIGhlaWdodFxuICAgKiBAcGFyYW0gaGVpZ2h0XG4gICAqIEByZXR1cm4gUHJvbWlzZTxEZWxldGVSZXN1bHQ+XG4gICAqL1xuICByZW1vdmVCbG9ja3NGcm9tSGVpZ2h0ID0gYXN5bmMgKGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTxEZWxldGVSZXN1bHQ+ID0+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgUmVtb3ZpbmcgYmxvY2tzIGZyb20gaGVpZ2h0ICR7aGVpZ2h0fWApO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJsb2NrUmVwb3NpdG9yeS5kZWxldGUoe1xuICAgICAgaGVpZ2h0OiBNb3JlVGhhbk9yRXF1YWwoaGVpZ2h0KSxcbiAgICAgIHNjYW5uZXI6IHRoaXMubmFtZSgpLFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBzdG9yZSBhIGJsb2NrIGludG8gZGF0YWJhc2UuXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKi9cbiAgc2F2ZUJsb2NrID0gYXN5bmMgKGJsb2NrOiBCbG9jayk6IFByb21pc2U8QmxvY2tFbnRpdHkgfCBib29sZWFuPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgdGhpcy5ibG9ja1JlcG9zaXRvcnkuZmluZE9uZUJ5KHtcbiAgICAgICAgaGVpZ2h0OiBibG9jay5oZWlnaHQsXG4gICAgICAgIHNjYW5uZXI6IHRoaXMubmFtZSgpLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoYmxvY2sudGltZXN0YW1wICogMTAwMCk7XG4gICAgICBjb25zdCBibG9ja0luZm8gPSB7XG4gICAgICAgIGhlaWdodDogYmxvY2suaGVpZ2h0LFxuICAgICAgICBoYXNoOiBibG9jay5oYXNoLFxuICAgICAgICBwYXJlbnRIYXNoOiBibG9jay5wYXJlbnRIYXNoLFxuICAgICAgICBzdGF0dXM6IFBST0NFU1NJTkcsXG4gICAgICAgIHNjYW5uZXI6IHRoaXMubmFtZSgpLFxuICAgICAgICBleHRyYTogYmxvY2suZXh0cmEsXG4gICAgICAgIHRpbWVzdGFtcDogYmxvY2sudGltZXN0YW1wLFxuICAgICAgICB5ZWFyOiBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIG1vbnRoOiBkYXRlLmdldE1vbnRoKCkgKyAxLFxuICAgICAgICBkYXk6IGRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgfTtcbiAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYEluc2VydGluZyBibG9jayB3aXRoIGluZm86ICR7SlNPTi5zdHJpbmdpZnkoYmxvY2tJbmZvKX1gLFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aGlzLmJsb2NrUmVwb3NpdG9yeS5pbnNlcnQoYmxvY2tJbmZvKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGBVcGRhdGluZyBibG9jayB3aXRoIGluZm86ICR7SlNPTi5zdHJpbmdpZnkoYmxvY2tJbmZvKX1gLFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aGlzLmJsb2NrUmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICAgICAgeyBoZWlnaHQ6IGJsb2NrLmhlaWdodCwgc2Nhbm5lcjogdGhpcy5uYW1lKCkgfSxcbiAgICAgICAgICBibG9ja0luZm8sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmJsb2NrUmVwb3NpdG9yeS5maW5kT25lQnkoe1xuICAgICAgICBoZWlnaHQ6IGJsb2NrLmhlaWdodCxcbiAgICAgICAgc2Nhbm5lcjogdGhpcy5uYW1lKCksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXMgPyByZXMgOiBmYWxzZTtcbiAgICB9IGNhdGNoIChleHApIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgc2F2ZSBuZXcgYmxvY2s6ICR7ZXhwfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHN0YXR1cyBvZiBhIGJsb2NrIHRvIHByb2NlZWRcbiAgICogQHBhcmFtIGhlaWdodDogaGVpZ2h0IG9mIGV4cGVjdGVkIGJsb2NrXG4gICAqL1xuICB1cGRhdGVCbG9ja1N0YXR1cyA9IGFzeW5jIChcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBibG9ja0hhc2g6IHN0cmluZyxcbiAgICBleHRyYWN0b3JJZHM6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgQmxvY2sgYXQgaGVpZ2h0ICR7aGVpZ2h0fSBoYXMgYmVlbiBwcm9jZWVkIGluIHNjYW5uZXIgJHt0aGlzLm5hbWUoKX0sIHVwZGF0aW5nIHN0YXR1c2AsXG4gICAgKTtcbiAgICBjb25zdCBydW5uZXIgPSB0aGlzLmRhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIoKTtcbiAgICBhd2FpdCBydW5uZXIuY29ubmVjdCgpO1xuICAgIGF3YWl0IHJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJ1bm5lci5tYW5hZ2VyLmdldFJlcG9zaXRvcnkoQmxvY2tFbnRpdHkpLnVwZGF0ZShcbiAgICAgICAge1xuICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgIHN0YXR1czogUFJPQ0VTU0lORyxcbiAgICAgICAgICBzY2FubmVyOiB0aGlzLm5hbWUoKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHN0YXR1czogUFJPQ0VFRCxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdVcGRhdGluZyBleHRyYWN0b3JzIHN0YXR1cycsIHtcbiAgICAgICAgZXh0cmFjdG9ySWRzLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBydW5uZXIubWFuYWdlclxuICAgICAgICAuZ2V0UmVwb3NpdG9yeShFeHRyYWN0b3JTdGF0dXNFbnRpdHkpXG4gICAgICAgIC51cGRhdGUoXG4gICAgICAgICAgeyBleHRyYWN0b3JJZDogSW4oZXh0cmFjdG9ySWRzKSwgc2Nhbm5lcklkOiB0aGlzLm5hbWUoKSB9LFxuICAgICAgICAgIHsgdXBkYXRlSGVpZ2h0OiBoZWlnaHQsIHVwZGF0ZUJsb2NrSGFzaDogYmxvY2tIYXNoIH0sXG4gICAgICAgICk7XG4gICAgICBhd2FpdCBydW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGF3YWl0IHJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCk7XG4gICAgICBzdWNjZXNzID0gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHJ1bm5lci5yZWxlYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgc3RhdHVzIG9mIGEgYmxvY2sgdG8gcHJvY2Vzc2luZyBpbiBjYXNlIG9mIGZvcmtcbiAgICogQHBhcmFtIGhlaWdodDogaGVpZ2h0IG9mIGV4cGVjdGVkIGJsb2NrXG4gICAqL1xuICByZXZlcnRCbG9ja1N0YXR1cyA9IGFzeW5jIChcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBwYXJlbnRIYXNoOiBzdHJpbmcsXG4gICAgZXh0cmFjdG9ySWRzOiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgbGV0IHN1Y2Nlc3MgPSB0cnVlO1xuICAgIGNvbnN0IHJ1bm5lciA9IHRoaXMuZGF0YVNvdXJjZS5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgIGF3YWl0IHJ1bm5lci5jb25uZWN0KCk7XG4gICAgYXdhaXQgcnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFJldmVydGluZyBibG9jayBzdGF0dXMgYXQgaGVpZ2h0ICR7aGVpZ2h0fWApO1xuICAgICAgYXdhaXQgcnVubmVyLm1hbmFnZXIuZ2V0UmVwb3NpdG9yeShCbG9ja0VudGl0eSkudXBkYXRlKFxuICAgICAgICB7XG4gICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgc3RhdHVzOiBQUk9DRUVELFxuICAgICAgICAgIHNjYW5uZXI6IHRoaXMubmFtZSgpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc3RhdHVzOiBQUk9DRVNTSU5HLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgIGBSZXZlcnRpbmcgZXh0cmFjdG9ycyB1cGRhdGUgaGVpZ2h0IHRvIHByZXZpb3VzIGJsb2NrIGF0IGhlaWdodCAke1xuICAgICAgICAgIGhlaWdodCAtIDFcbiAgICAgICAgfWAsXG4gICAgICApO1xuICAgICAgYXdhaXQgcnVubmVyLm1hbmFnZXJcbiAgICAgICAgLmdldFJlcG9zaXRvcnkoRXh0cmFjdG9yU3RhdHVzRW50aXR5KVxuICAgICAgICAudXBkYXRlKFxuICAgICAgICAgIHsgZXh0cmFjdG9ySWQ6IEluKGV4dHJhY3RvcklkcyksIHNjYW5uZXJJZDogdGhpcy5uYW1lKCkgfSxcbiAgICAgICAgICB7IHVwZGF0ZUhlaWdodDogaGVpZ2h0IC0gMSwgdXBkYXRlQmxvY2tIYXNoOiBwYXJlbnRIYXNoIH0sXG4gICAgICAgICk7XG4gICAgICBhd2FpdCBydW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKGBBbiBFcnJvciBvY2N1cnJlZCB3aGlsZSByZXZlcnRpbmcgYmxvY2sgc3RhdHVzOiAke2V9YCk7XG4gICAgICBhd2FpdCBydW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpO1xuICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBydW5uZXIucmVsZWFzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfTtcblxuICAvKipcbiAgICogSW5zZXJ0IGEgbmV3bHkgaW5pdGlhbGl6ZWQgZXh0cmFjdG9yIG9yIHVwZGF0ZSBhbiBleGlzdGluZyBleHRyYWN0b3Igc3RhdHVzXG4gICAqIEBwYXJhbSBleHRyYWN0b3JJZFxuICAgKiBAcGFyYW0gaGVpZ2h0XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICB1cGRhdGVPckluc2VydEV4dHJhY3RvclN0YXR1cyA9IGFzeW5jIChcbiAgICBleHRyYWN0b3JJZDogc3RyaW5nLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIGJsb2NrSGFzaDogc3RyaW5nLFxuICApID0+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICdJbnNlcnRpbmcgbmV3IGV4dHJhY3RvciBzdGF0dXMgb3IgVXBkYXRpbmcgZXhpc3RpbmcgcmVzeW5jZWQgZXh0cmFjdG9yIHN0YXR1cycsXG4gICAgICB7XG4gICAgICAgIGV4dHJhY3RvcklkLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIGJsb2NrSGFzaCxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRyYWN0b3JTdGF0dXNSZXBvc2l0b3J5LnNhdmUoe1xuICAgICAgc2Nhbm5lcklkOiB0aGlzLm5hbWUoKSxcbiAgICAgIGV4dHJhY3RvcklkLFxuICAgICAgdXBkYXRlSGVpZ2h0OiBoZWlnaHQsXG4gICAgICB1cGRhdGVCbG9ja0hhc2g6IGJsb2NrSGFzaCxcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIGV4dHJhY3RvcnNgIHN0YXR1cyBzcGVjaWZpZWQgYnkgaWRcbiAgICogQHBhcmFtIGV4dHJhY3Rvcklkc1xuICAgKiBAcmV0dXJucyBleHRyYWN0b3JzYCBzdGF0dXNcbiAgICovXG4gIGdldEV4dHJhY3RvcnNTdGF0dXMgPSBhc3luYyAoXG4gICAgZXh0cmFjdG9ySWRzOiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTxFeHRyYWN0b3JTdGF0dXNFbnRpdHlbXT4gPT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dHJhY3RvclN0YXR1c1JlcG9zaXRvcnkuZmluZEJ5KHtcbiAgICAgIHNjYW5uZXJJZDogdGhpcy5uYW1lKCksXG4gICAgICBleHRyYWN0b3JJZDogSW4oZXh0cmFjdG9ySWRzKSxcbiAgICB9KTtcbiAgfTtcbn1cbiJdfQ==
@@ -6,13 +6,8 @@ export interface ScannerConfig<TransactionType> {
6
6
  initialHeight: number;
7
7
  network: AbstractNetworkConnector<TransactionType>;
8
8
  blockRetrieveGap?: number;
9
- blockTimeConfig: BlockTimeConfig;
10
9
  suffix?: string;
10
+ heightGap?: number;
11
11
  logger?: AbstractLogger;
12
12
  }
13
- export interface BlockTimeConfig {
14
- blockTime: number;
15
- blockAgeThreshold?: number;
16
- blockTrimCountInRound?: number;
17
- }
18
13
  //# sourceMappingURL=interfaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../lib/scanner/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,MAAM,WAAW,aAAa,CAAC,eAAe;IAC5C,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,wBAAwB,CAAC,eAAe,CAAC,CAAC;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,eAAe,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../lib/scanner/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,MAAM,WAAW,aAAa,CAAC,eAAe;IAC5C,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,wBAAwB,CAAC,eAAe,CAAC,CAAC;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB"}
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9zY2FubmVyL2ludGVyZmFjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5pbXBvcnQgeyBBYnN0cmFjdE5ldHdvcmtDb25uZWN0b3IgfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nhbm5lckNvbmZpZzxUcmFuc2FjdGlvblR5cGU+IHtcbiAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcbiAgaW5pdGlhbEhlaWdodDogbnVtYmVyO1xuICBuZXR3b3JrOiBBYnN0cmFjdE5ldHdvcmtDb25uZWN0b3I8VHJhbnNhY3Rpb25UeXBlPjtcbiAgYmxvY2tSZXRyaWV2ZUdhcD86IG51bWJlcjtcbiAgYmxvY2tUaW1lQ29uZmlnOiBCbG9ja1RpbWVDb25maWc7XG4gIHN1ZmZpeD86IHN0cmluZztcbiAgbG9nZ2VyPzogQWJzdHJhY3RMb2dnZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmxvY2tUaW1lQ29uZmlnIHtcbiAgYmxvY2tUaW1lOiBudW1iZXI7XG4gIGJsb2NrQWdlVGhyZXNob2xkPzogbnVtYmVyO1xuICBibG9ja1RyaW1Db3VudEluUm91bmQ/OiBudW1iZXI7XG59XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9zY2FubmVyL2ludGVyZmFjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5pbXBvcnQgeyBBYnN0cmFjdE5ldHdvcmtDb25uZWN0b3IgfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nhbm5lckNvbmZpZzxUcmFuc2FjdGlvblR5cGU+IHtcbiAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcbiAgaW5pdGlhbEhlaWdodDogbnVtYmVyO1xuICBuZXR3b3JrOiBBYnN0cmFjdE5ldHdvcmtDb25uZWN0b3I8VHJhbnNhY3Rpb25UeXBlPjtcbiAgYmxvY2tSZXRyaWV2ZUdhcD86IG51bWJlcjtcbiAgc3VmZml4Pzogc3RyaW5nO1xuICBoZWlnaHRHYXA/OiBudW1iZXI7XG4gIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyO1xufVxuIl19
@@ -47,9 +47,10 @@ export declare class NetworkConnectorManager<TransactionType> implements Abstrac
47
47
  /**
48
48
  * Get all transactions in a block
49
49
  * @param blockHash The hash of the block to get transactions from
50
+ * @param height The height of the block to get transactions from
50
51
  * @returns Array of transactions in the block
51
52
  */
52
- getBlockTxs: (blockHash: string) => Promise<Array<TransactionType>>;
53
+ getBlockTxs: (blockHash: string, height: number) => Promise<Array<TransactionType>>;
53
54
  /**
54
55
  * Get the number of available connectors
55
56
  * @returns The number of connectors
@@ -1 +1 @@
1
- {"version":3,"file":"networkConnectorManager.d.ts","sourceRoot":"","sources":["../../../lib/scanner/network/networkConnectorManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EACL,wBAAwB,EACxB,KAAK,EACN,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,0BAA0B,EAE3B,MAAM,gCAAgC,CAAC;AAExC;;;GAGG;AACH,qBAAa,uBAAuB,CAAC,eAAe,CAClD,YAAW,wBAAwB,CAAC,eAAe,CAAC;IAMlD,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IALhB,OAAO,CAAC,UAAU,CAAmD;IACrE,OAAO,CAAC,qBAAqB,CAAS;gBAG5B,QAAQ,GAAE,0BAA0B,CAAC,eAAe,CAA2C,EAC/F,MAAM,GAAE,cAAkC;IAQpD;;;OAGG;IACI,YAAY,CACjB,SAAS,EAAE,wBAAwB,CAAC,eAAe,CAAC,GACnD,IAAI;IAOP;;;;OAIG;IACH,mBAAmB,IAAI,wBAAwB,CAAC,eAAe,CAAC;IAQhE;;;;OAIG;YACW,mBAAmB;IA8CjC;;;OAGG;IACI,WAAW,CAChB,QAAQ,EAAE,0BAA0B,CAAC,eAAe,CAAC,GACpD,IAAI;IAKP;;;;OAIG;IACH,gBAAgB,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,KAAK,CAAC,CAIvD;IAEF;;;OAGG;IACH,gBAAgB,QAAa,OAAO,CAAC,MAAM,CAAC,CAI1C;IAEF;;;;OAIG;IACH,WAAW,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAItE;IAEF;;;OAGG;IACI,iBAAiB,IAAI,MAAM;IAMlC;;;OAGG;IACI,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAU5C"}
1
+ {"version":3,"file":"networkConnectorManager.d.ts","sourceRoot":"","sources":["../../../lib/scanner/network/networkConnectorManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EACL,wBAAwB,EACxB,KAAK,EACN,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,0BAA0B,EAE3B,MAAM,gCAAgC,CAAC;AAExC;;;GAGG;AACH,qBAAa,uBAAuB,CAAC,eAAe,CAClD,YAAW,wBAAwB,CAAC,eAAe,CAAC;IAMlD,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IALhB,OAAO,CAAC,UAAU,CAAmD;IACrE,OAAO,CAAC,qBAAqB,CAAS;gBAG5B,QAAQ,GAAE,0BAA0B,CAAC,eAAe,CAA2C,EAC/F,MAAM,GAAE,cAAkC;IAQpD;;;OAGG;IACI,YAAY,CACjB,SAAS,EAAE,wBAAwB,CAAC,eAAe,CAAC,GACnD,IAAI;IAOP;;;;OAIG;IACH,mBAAmB,IAAI,wBAAwB,CAAC,eAAe,CAAC;IAQhE;;;;OAIG;YACW,mBAAmB;IA8CjC;;;OAGG;IACI,WAAW,CAChB,QAAQ,EAAE,0BAA0B,CAAC,eAAe,CAAC,GACpD,IAAI;IAKP;;;;OAIG;IACH,gBAAgB,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,KAAK,CAAC,CAIvD;IAEF;;;OAGG;IACH,gBAAgB,QAAa,OAAO,CAAC,MAAM,CAAC,CAI1C;IAEF;;;;;OAKG;IACH,WAAW,GACT,WAAW,MAAM,EACjB,QAAQ,MAAM,KACb,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAIhC;IAEF;;;OAGG;IACI,iBAAiB,IAAI,MAAM;IAMlC;;;OAGG;IACI,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAU5C"}
@@ -93,10 +93,11 @@ export class NetworkConnectorManager {
93
93
  /**
94
94
  * Get all transactions in a block
95
95
  * @param blockHash The hash of the block to get transactions from
96
+ * @param height The height of the block to get transactions from
96
97
  * @returns Array of transactions in the block
97
98
  */
98
- getBlockTxs = async (blockHash) => {
99
- return this.executeWithStrategy((connector) => connector.getBlockTxs(blockHash));
99
+ getBlockTxs = async (blockHash, height) => {
100
+ return this.executeWithStrategy((connector) => connector.getBlockTxs(blockHash, height));
100
101
  };
101
102
  /**
102
103
  * Get the number of available connectors
@@ -122,4 +123,4 @@ export class NetworkConnectorManager {
122
123
  }
123
124
  }
124
125
  }
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29ya0Nvbm5lY3Rvck1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvc2Nhbm5lci9uZXR3b3JrL25ldHdvcmtDb25uZWN0b3JNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBa0IsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFNNUUsT0FBTyxFQUVMLGdCQUFnQixHQUNqQixNQUFNLGdDQUFnQyxDQUFDO0FBRXhDOzs7R0FHRztBQUNILE1BQU0sT0FBTyx1QkFBdUI7SUFPeEI7SUFDQTtJQUxGLFVBQVUsQ0FBbUQ7SUFDN0QscUJBQXFCLENBQVM7SUFFdEMsWUFDVSxXQUF3RCxJQUFJLGdCQUFnQixFQUFtQixFQUMvRixTQUF5QixJQUFJLFdBQVcsRUFBRTtRQUQxQyxhQUFRLEdBQVIsUUFBUSxDQUF1RjtRQUMvRixXQUFNLEdBQU4sTUFBTSxDQUFvQztRQUVsRCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFlBQVksQ0FDakIsU0FBb0Q7UUFFcEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2QsMENBQTBDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQ25FLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG1CQUFtQjtRQUNqQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENB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RUFBbUMsRUFBRTtRQUN6RSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQzVDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQ2pDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRjs7O09BR0c7SUFDSSxpQkFBaUI7UUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksZUFBZSxDQUFDLEtBQWE7UUFDbEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIsIER1bW15TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3ROZXR3b3JrQ29ubmVjdG9yLFxuICBCbG9jayxcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuXG5pbXBvcnQge1xuICBDb25uZWN0b3JTZWxlY3Rpb25TdHJhdGVneSxcbiAgRmFpbG92ZXJTdHJhdGVneSxcbn0gZnJvbSAnLi9jb25uZWN0b3JTZWxlY3Rpb25TdHJhdGVnaWVzJztcblxuLyoqXG4gKiBOZXR3b3JrIGNvbm5lY3RvciBtYW5hZ2VyIHRoYXQgY2FuIGhhbmRsZSBtdWx0aXBsZSBjb25uZWN0b3JzXG4gKiBmb3IgYSBzaW5nbGUgbmV0d29yayB3aXRoIHBsdWdnYWJsZSBzZWxlY3Rpb24gc3RyYXRlZ3lcbiAqL1xuZXhwb3J0IGNsYXNzIE5ldHdvcmtDb25uZWN0b3JNYW5hZ2VyPFRyYW5zYWN0aW9uVHlwZT5cbiAgaW1wbGVtZW50cyBBYnN0cmFjdE5ldHdvcmtDb25uZWN0b3I8VHJhbnNhY3Rpb25UeXBlPlxue1xuICBwcml2YXRlIGNvbm5lY3RvcnM6IEFycmF5PEFic3RyYWN0TmV0d29ya0Nvbm5lY3RvcjxUcmFuc2FjdGlvblR5cGU+PjtcbiAgcHJpdmF0ZSBjdXJyZW50Q29ubmVjdG9ySW5kZXg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN0cmF0ZWd5OiBDb25uZWN0b3JTZWxlY3Rpb25TdHJhdGVneTxUcmFuc2FjdGlvblR5cGU+ID0gbmV3IEZhaWxvdmVyU3RyYXRlZ3k8VHJhbnNhY3Rpb25UeXBlPigpLFxuICAgIHByaXZhdGUgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlciA9IG5ldyBEdW1teUxvZ2dlcigpLFxuICApIHtcbiAgICB0aGlzLmNvbm5lY3RvcnMgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRDb25uZWN0b3JJbmRleCA9IDA7XG4gICAgdGhpcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdOZXR3b3JrQ29ubmVjdG9yTWFuYWdlciBpbml0aWFsaXplZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBjb25uZWN0b3IgdG8gdGhlIG1hbmFnZXJcbiAgICogQHBhcmFtIGNvbm5lY3RvciBUaGUgbmV0d29yayBjb25uZWN0b3IgaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBhZGRDb25uZWN0b3IoXG4gICAgY29ubmVjdG9yOiBBYnN0cmFjdE5ldHdvcmtDb25uZWN0b3I8VHJhbnNhY3Rpb25UeXBlPixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0b3JzLnB1c2goY29ubmVjdG9yKTtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgYEFkZGVkIG5ldyBjb25uZWN0b3IuIFRvdGFsIGNvbm5lY3RvcnM6ICR7dGhpcy5jb25uZWN0b3JzLmxlbmd0aH1gLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGFjdGl2ZSBjb25uZWN0b3JcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgbmV0d29yayBjb25uZWN0b3IgaW5zdGFuY2VcbiAgICogQHRocm93cyBFcnJvciBpZiBubyBjb25uZWN0b3JzIGFyZSBhdmFpbGFibGVcbiAgICovXG4gIGdldEN1cnJlbnRDb25uZWN0b3IoKTogQWJzdHJhY3ROZXR3b3JrQ29ubmVjdG9yPFRyYW5zYWN0aW9uVHlwZT4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3RvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbm5lY3RvcnMgYXZhaWxhYmxlJyk7XG4gICAgfVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBVc2luZyBjb25uZWN0b3IgYXQgaW5kZXggJHt0aGlzLmN1cnJlbnRDb25uZWN0b3JJbmRleH1gKTtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JzW3RoaXMuY3VycmVudENvbm5lY3RvckluZGV4XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFuIG9wZXJhdGlvbiB1c2luZyB0aGUgY29uZmlndXJlZCBzdHJhdGVneVxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gdG8gZXhlY3V0ZVxuICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZVdpdGhTdHJhdGVneTxUPihcbiAgICBvcGVyYXRpb246IChcbiAgICAgIGNvbm5lY3RvcjogQWJzdHJhY3ROZXR3b3JrQ29ubmVjdG9yPFRyYW5zYWN0aW9uVHlwZT4sXG4gICAgKSA9PiBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAodGhpcy5jb25uZWN0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBjb25uZWN0b3JzIGF2YWlsYWJsZSBmb3Igb3BlcmF0aW9uJyk7XG4gICAgfVxuXG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICBjb25zdCBtYXhBdHRlbXB0cyA9IHRoaXMuY29ubmVjdG9ycy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoYXR0ZW1wdHMgPCBtYXhBdHRlbXB0cykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29ubmVjdG9yID0gdGhpcy5jb25uZWN0b3JzW3RoaXMuY3VycmVudENvbm5lY3RvckluZGV4XTtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYEF0dGVtcHQgJHthdHRlbXB0cyArIDF9LyR7bWF4QXR0ZW1wdHN9IHdpdGggY29ubmVjdG9yIGF0IGluZGV4ICR7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDb25uZWN0b3JJbmRleFxuICAgICAgICAgIH1gLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcGVyYXRpb24oY29ubmVjdG9yKTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q29ubmVjdG9ySW5kZXggPSB0aGlzLnN0cmF0ZWd5LnNlbGVjdE5leHRDb25uZWN0b3IoXG4gICAgICAgICAgdGhpcy5jb25uZWN0b3JzLFxuICAgICAgICAgIHRoaXMuY3VycmVudENvbm5lY3RvckluZGV4LFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgT3BlcmF0aW9uIHN1Y2Nlc3NmdWwsIG5leHQgY29ubmVjdG9yIGluZGV4OiAke3RoaXMuY3VycmVudENvbm5lY3RvckluZGV4fWAsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBhcyBFcnJvcjtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgT3BlcmF0aW9uIGZhaWxlZCB3aXRoIGNvbm5lY3RvciBhdCBpbmRleCAke3RoaXMuY3VycmVudENvbm5lY3RvckluZGV4fTogJHtsYXN0RXJyb3IubWVzc2FnZX1gLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmN1cnJlbnRDb25uZWN0b3JJbmRleCA9IHRoaXMuc3RyYXRlZ3kuc2VsZWN0TmV4dENvbm5lY3RvcihcbiAgICAgICAgICB0aGlzLmNvbm5lY3RvcnMsXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q29ubmVjdG9ySW5kZXgsXG4gICAgICAgICAgbGFzdEVycm9yLFxuICAgICAgICApO1xuICAgICAgICBhdHRlbXB0cysrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBsYXN0RXJyb3IgfHwgbmV3IEVycm9yKCdBbGwgY29ubmVjdG9ycyBmYWlsZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHN0cmF0ZWd5IHRvIHVzZSBmb3IgY29ubmVjdG9yIHNlbGVjdGlvblxuICAgKiBAcGFyYW0gc3RyYXRlZ3kgVGhlIHN0cmF0ZWd5IHRvIHVzZVxuICAgKi9cbiAgcHVibGljIHNldFN0cmF0ZWd5KFxuICAgIHN0cmF0ZWd5OiBDb25uZWN0b3JTZWxlY3Rpb25TdHJhdGVneTxUcmFuc2FjdGlvblR5cGU+LFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKCdTZXR0aW5nIG5ldyBjb25uZWN0b3Igc2VsZWN0aW9uIHN0cmF0ZWd5Jyk7XG4gICAgdGhpcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGJsb2NrIGF0IGEgc3BlY2lmaWMgaGVpZ2h0XG4gICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgYmxvY2sgdG8gZ2V0XG4gICAqIEByZXR1cm5zIFRoZSBibG9jayBhdCB0aGUgc3BlY2lmaWVkIGhlaWdodFxuICAgKi9cbiAgZ2V0QmxvY2tBdEhlaWdodCA9IGFzeW5jIChoZWlnaHQ6IG51bWJlcik6IFByb21pc2U8QmxvY2s+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlV2l0aFN0cmF0ZWd5KChjb25uZWN0b3IpID0+XG4gICAgICBjb25uZWN0b3IuZ2V0QmxvY2tBdEhlaWdodChoZWlnaHQpLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBoZWlnaHQgb2YgdGhlIGJsb2NrY2hhaW5cbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgaGVpZ2h0XG4gICAqL1xuICBnZXRDdXJyZW50SGVpZ2h0ID0gYXN5bmMgKCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVdpdGhTdHJhdGVneSgoY29ubmVjdG9yKSA9PlxuICAgICAgY29ubmVjdG9yLmdldEN1cnJlbnRIZWlnaHQoKSxcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRyYW5zYWN0aW9ucyBpbiBhIGJsb2NrXG4gICAqIEBwYXJhbSBibG9ja0hhc2ggVGhlIGhhc2ggb2YgdGhlIGJsb2NrIHRvIGdldCB0cmFuc2FjdGlvbnMgZnJvbVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiB0cmFuc2FjdGlvbnMgaW4gdGhlIGJsb2NrXG4gICAqL1xuICBnZXRCbG9ja1R4cyA9IGFzeW5jIChibG9ja0hhc2g6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8VHJhbnNhY3Rpb25UeXBlPj4gPT4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVXaXRoU3RyYXRlZ3koKGNvbm5lY3RvcikgPT5cbiAgICAgIGNvbm5lY3Rvci5nZXRCbG9ja1R4cyhibG9ja0hhc2gpLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb25uZWN0b3JzXG4gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgY29ubmVjdG9yc1xuICAgKi9cbiAgcHVibGljIGdldENvbm5lY3RvckNvdW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLmNvbm5lY3RvcnMubGVuZ3RoO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDdXJyZW50IGNvbm5lY3RvciBjb3VudDogJHtjb3VudH1gKTtcbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgY29ubmVjdG9yIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29ubmVjdG9yIHRvIHJlbW92ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZUNvbm5lY3RvcihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmNvbm5lY3RvcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29ubmVjdG9yIGluZGV4Jyk7XG4gICAgfVxuICAgIHRoaXMubG9nZ2VyLmluZm8oYFJlbW92aW5nIGNvbm5lY3RvciBhdCBpbmRleCAke2luZGV4fWApO1xuICAgIHRoaXMuY29ubmVjdG9ycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRDb25uZWN0b3JJbmRleCA+PSB0aGlzLmNvbm5lY3RvcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmN1cnJlbnRDb25uZWN0b3JJbmRleCA9IDA7XG4gICAgfVxuICB9XG59XG4iXX0=
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29ya0Nvbm5lY3Rvck1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvc2Nhbm5lci9uZXR3b3JrL25ldHdvcmtDb25uZWN0b3JNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBa0IsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFNNUUsT0FBTyxFQUVMLGdCQUFnQixHQUNqQixNQUFNLGdDQUFnQyxDQUFDO0FBRXhDOzs7R0FHRztBQUNILE1BQU0sT0FBTyx1QkFBdUI7SUFPeEI7SUFDQTtJQUxGLFVBQVUsQ0FBbUQ7SUFDN0QscUJBQXFCLENBQVM7SUFFdEMsWUFDVSxXQUF3RCxJQUFJLGdCQUFnQixFQUFtQixFQUMvRixTQUF5QixJQUFJLFdBQVcsRUFBRTtRQUQxQyxhQUFRLEdBQVIsUUFBUSxDQUF1RjtRQUMvRixXQUFNLEdBQU4sTUFBTSxDQUFvQztRQUVsRCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFlBQVksQ0FDakIsU0FBb0Q7UUFFcEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2QsMENBQTBDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQ25FLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG1CQUFtQjtRQUNqQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7UUFDNUUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLG1CQUFtQixDQUMvQixTQUVlO1FBRWYsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUVELElBQUksU0FBNEIsQ0FBQztRQUNqQyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFFM0MsT0FBTyxRQUFRLEdBQUcsV0FBVyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDO2dCQUNILE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLFdBQVcsUUFBUSxHQUFHLENBQUMsSUFBSSxXQUFXLDRCQUNwQyxJQUFJLENBQUMscUJBQ1AsRUFBRSxDQUNILENBQUM7Z0JBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUM1RCxJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxxQkFBcUIsQ0FDM0IsQ0FBQztnQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZiwrQ0FBK0MsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQzVFLENBQUM7Z0JBQ0YsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsU0FBUyxHQUFHLEtBQWMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2QsNENBQTRDLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQy9GLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQzVELElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLHFCQUFxQixFQUMxQixTQUFTLENBQ1YsQ0FBQztnQkFDRixRQUFRLEVBQUUsQ0FBQztZQUNiLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxTQUFTLElBQUksSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksV0FBVyxDQUNoQixRQUFxRDtRQUVyRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCLEdBQUcsS0FBSyxFQUFFLE1BQWMsRUFBa0IsRUFBRTtRQUMxRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQzVDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FDbkMsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGOzs7T0FHRztJQUNILGdCQUFnQixHQUFHLEtBQUssSUFBcUIsRUFBRTtRQUM3QyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQzVDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUM3QixDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUY7Ozs7O09BS0c7SUFDSCxXQUFXLEdBQUcsS0FBSyxFQUNqQixTQUFpQixFQUNqQixNQUFjLEVBQ21CLEVBQUU7UUFDbkMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUM1QyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FDekMsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGOzs7T0FHRztJQUNJLGlCQUFpQjtRQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN2RCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSSxlQUFlLENBQUMsS0FBYTtRQUNsQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywrQkFBK0IsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6RCxJQUFJLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdExvZ2dlciwgRHVtbXlMb2dnZXIgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LWxvZ2dlcic7XG5pbXBvcnQge1xuICBBYnN0cmFjdE5ldHdvcmtDb25uZWN0b3IsXG4gIEJsb2NrLFxufSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7XG4gIENvbm5lY3RvclNlbGVjdGlvblN0cmF0ZWd5LFxuICBGYWlsb3ZlclN0cmF0ZWd5LFxufSBmcm9tICcuL2Nvbm5lY3RvclNlbGVjdGlvblN0cmF0ZWdpZXMnO1xuXG4vKipcbiAqIE5ldHdvcmsgY29ubmVjdG9yIG1hbmFnZXIgdGhhdCBjYW4gaGFuZGxlIG11bHRpcGxlIGNvbm5lY3RvcnNcbiAqIGZvciBhIHNpbmdsZSBuZXR3b3JrIHdpdGggcGx1Z2dhYmxlIHNlbGVjdGlvbiBzdHJhdGVneVxuICovXG5leHBvcnQgY2xhc3MgTmV0d29ya0Nvbm5lY3Rvck1hbmFnZXI8VHJhbnNhY3Rpb25UeXBlPlxuICBpbXBsZW1lbnRzIEFic3RyYWN0TmV0d29ya0Nvbm5lY3RvcjxUcmFuc2FjdGlvblR5cGU+XG57XG4gIHByaXZhdGUgY29ubmVjdG9yczogQXJyYXk8QWJzdHJhY3ROZXR3b3JrQ29ubmVjdG9yPFRyYW5zYWN0aW9uVHlwZT4+O1xuICBwcml2YXRlIGN1cnJlbnRDb25uZWN0b3JJbmRleDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc3RyYXRlZ3k6IENvbm5lY3RvclNlbGVjdGlvblN0cmF0ZWd5PFRyYW5zYWN0aW9uVHlwZT4gPSBuZXcgRmFpbG92ZXJTdHJhdGVneTxUcmFuc2FjdGlvblR5cGU+KCksXG4gICAgcHJpdmF0ZSBsb2dnZXI6IEFic3RyYWN0TG9nZ2VyID0gbmV3IER1bW15TG9nZ2VyKCksXG4gICkge1xuICAgIHRoaXMuY29ubmVjdG9ycyA9IFtdO1xuICAgIHRoaXMuY3VycmVudENvbm5lY3RvckluZGV4ID0gMDtcbiAgICB0aGlzLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ05ldHdvcmtDb25uZWN0b3JNYW5hZ2VyIGluaXRpYWxpemVkJyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGNvbm5lY3RvciB0byB0aGUgbWFuYWdlclxuICAgKiBAcGFyYW0gY29ubmVjdG9yIFRoZSBuZXR3b3JrIGNvbm5lY3RvciBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIGFkZENvbm5lY3RvcihcbiAgICBjb25uZWN0b3I6IEFic3RyYWN0TmV0d29ya0Nvbm5lY3RvcjxUcmFuc2FjdGlvblR5cGU+LFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3RvcnMucHVzaChjb25uZWN0b3IpO1xuICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICBgQWRkZWQgbmV3IGNvbm5lY3Rvci4gVG90YWwgY29ubmVjdG9yczogJHt0aGlzLmNvbm5lY3RvcnMubGVuZ3RofWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgYWN0aXZlIGNvbm5lY3RvclxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBuZXR3b3JrIGNvbm5lY3RvciBpbnN0YW5jZVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIG5vIGNvbm5lY3RvcnMgYXJlIGF2YWlsYWJsZVxuICAgKi9cbiAgZ2V0Q3VycmVudENvbm5lY3RvcigpOiBBYnN0cmFjdE5ldHdvcmtDb25uZWN0b3I8VHJhbnNhY3Rpb25UeXBlPiB7XG4gICAgaWYgKHRoaXMuY29ubmVjdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY29ubmVjdG9ycyBhdmFpbGFibGUnKTtcbiAgICB9XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFVzaW5nIGNvbm5lY3RvciBhdCBpbmRleCAke3RoaXMuY3VycmVudENvbm5lY3RvckluZGV4fWApO1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3RvcnNbdGhpcy5jdXJyZW50Q29ubmVjdG9ySW5kZXhdO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYW4gb3BlcmF0aW9uIHVzaW5nIHRoZSBjb25maWd1cmVkIHN0cmF0ZWd5XG4gICAqIEBwYXJhbSBvcGVyYXRpb24gVGhlIG9wZXJhdGlvbiB0byBleGVjdXRlXG4gICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlV2l0aFN0cmF0ZWd5PFQ+KFxuICAgIG9wZXJhdGlvbjogKFxuICAgICAgY29ubmVjdG9yOiBBYnN0cmFjdE5ldHdvcmtDb25uZWN0b3I8VHJhbnNhY3Rpb25UeXBlPixcbiAgICApID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3RvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbm5lY3RvcnMgYXZhaWxhYmxlIGZvciBvcGVyYXRpb24nKTtcbiAgICB9XG5cbiAgICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuICAgIGNvbnN0IG1heEF0dGVtcHRzID0gdGhpcy5jb25uZWN0b3JzLmxlbmd0aDtcblxuICAgIHdoaWxlIChhdHRlbXB0cyA8IG1heEF0dGVtcHRzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb25uZWN0b3IgPSB0aGlzLmNvbm5lY3RvcnNbdGhpcy5jdXJyZW50Q29ubmVjdG9ySW5kZXhdO1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgQXR0ZW1wdCAke2F0dGVtcHRzICsgMX0vJHttYXhBdHRlbXB0c30gd2l0aCBjb25uZWN0b3IgYXQgaW5kZXggJHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENvbm5lY3RvckluZGV4XG4gICAgICAgICAgfWAsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wZXJhdGlvbihjb25uZWN0b3IpO1xuICAgICAgICB0aGlzLmN1cnJlbnRDb25uZWN0b3JJbmRleCA9IHRoaXMuc3RyYXRlZ3kuc2VsZWN0TmV4dENvbm5lY3RvcihcbiAgICAgICAgICB0aGlzLmNvbm5lY3RvcnMsXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q29ubmVjdG9ySW5kZXgsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGBPcGVyYXRpb24gc3VjY2Vzc2Z1bCwgbmV4dCBjb25uZWN0b3IgaW5kZXg6ICR7dGhpcy5jdXJyZW50Q29ubmVjdG9ySW5kZXh9YCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGFzIEVycm9yO1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBPcGVyYXRpb24gZmFpbGVkIHdpdGggY29ubmVjdG9yIGF0IGluZGV4ICR7dGhpcy5jdXJyZW50Q29ubmVjdG9ySW5kZXh9OiAke2xhc3RFcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY3VycmVudENvbm5lY3RvckluZGV4ID0gdGhpcy5zdHJhdGVneS5zZWxlY3ROZXh0Q29ubmVjdG9yKFxuICAgICAgICAgIHRoaXMuY29ubmVjdG9ycyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDb25uZWN0b3JJbmRleCxcbiAgICAgICAgICBsYXN0RXJyb3IsXG4gICAgICAgICk7XG4gICAgICAgIGF0dGVtcHRzKys7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IGxhc3RFcnJvciB8fCBuZXcgRXJyb3IoJ0FsbCBjb25uZWN0b3JzIGZhaWxlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc3RyYXRlZ3kgdG8gdXNlIGZvciBjb25uZWN0b3Igc2VsZWN0aW9uXG4gICAqIEBwYXJhbSBzdHJhdGVneSBUaGUgc3RyYXRlZ3kgdG8gdXNlXG4gICAqL1xuICBwdWJsaWMgc2V0U3RyYXRlZ3koXG4gICAgc3RyYXRlZ3k6IENvbm5lY3RvclNlbGVjdGlvblN0cmF0ZWd5PFRyYW5zYWN0aW9uVHlwZT4sXG4gICk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmluZm8oJ1NldHRpbmcgbmV3IGNvbm5lY3RvciBzZWxlY3Rpb24gc3RyYXRlZ3knKTtcbiAgICB0aGlzLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgYmxvY2sgYXQgYSBzcGVjaWZpYyBoZWlnaHRcbiAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBibG9jayB0byBnZXRcbiAgICogQHJldHVybnMgVGhlIGJsb2NrIGF0IHRoZSBzcGVjaWZpZWQgaGVpZ2h0XG4gICAqL1xuICBnZXRCbG9ja0F0SGVpZ2h0ID0gYXN5bmMgKGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTxCbG9jaz4gPT4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVXaXRoU3RyYXRlZ3koKGNvbm5lY3RvcikgPT5cbiAgICAgIGNvbm5lY3Rvci5nZXRCbG9ja0F0SGVpZ2h0KGhlaWdodCksXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGhlaWdodCBvZiB0aGUgYmxvY2tjaGFpblxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBoZWlnaHRcbiAgICovXG4gIGdldEN1cnJlbnRIZWlnaHQgPSBhc3luYyAoKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlV2l0aFN0cmF0ZWd5KChjb25uZWN0b3IpID0+XG4gICAgICBjb25uZWN0b3IuZ2V0Q3VycmVudEhlaWdodCgpLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdHJhbnNhY3Rpb25zIGluIGEgYmxvY2tcbiAgICogQHBhcmFtIGJsb2NrSGFzaCBUaGUgaGFzaCBvZiB0aGUgYmxvY2sgdG8gZ2V0IHRyYW5zYWN0aW9ucyBmcm9tXG4gICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgYmxvY2sgdG8gZ2V0IHRyYW5zYWN0aW9ucyBmcm9tXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHRyYW5zYWN0aW9ucyBpbiB0aGUgYmxvY2tcbiAgICovXG4gIGdldEJsb2NrVHhzID0gYXN5bmMgKFxuICAgIGJsb2NrSGFzaDogc3RyaW5nLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApOiBQcm9taXNlPEFycmF5PFRyYW5zYWN0aW9uVHlwZT4+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlV2l0aFN0cmF0ZWd5KChjb25uZWN0b3IpID0+XG4gICAgICBjb25uZWN0b3IuZ2V0QmxvY2tUeHMoYmxvY2tIYXNoLCBoZWlnaHQpLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb25uZWN0b3JzXG4gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgY29ubmVjdG9yc1xuICAgKi9cbiAgcHVibGljIGdldENvbm5lY3RvckNvdW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLmNvbm5lY3RvcnMubGVuZ3RoO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDdXJyZW50IGNvbm5lY3RvciBjb3VudDogJHtjb3VudH1gKTtcbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgY29ubmVjdG9yIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29ubmVjdG9yIHRvIHJlbW92ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZUNvbm5lY3RvcihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmNvbm5lY3RvcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29ubmVjdG9yIGluZGV4Jyk7XG4gICAgfVxuICAgIHRoaXMubG9nZ2VyLmluZm8oYFJlbW92aW5nIGNvbm5lY3RvciBhdCBpbmRleCAke2luZGV4fWApO1xuICAgIHRoaXMuY29ubmVjdG9ycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRDb25uZWN0b3JJbmRleCA+PSB0aGlzLmNvbm5lY3RvcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmN1cnJlbnRDb25uZWN0b3JJbmRleCA9IDA7XG4gICAgfVxuICB9XG59XG4iXX0=