@bitgo/utxo-bin 1.0.1-rc.16 → 1.0.1-rc.17

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 ADDED
@@ -0,0 +1,16 @@
1
+ # Change Log
2
+
3
+ All notable changes to this project will be documented in this file.
4
+ See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
+
6
+ ## [1.0.1-rc.17](https://github.com/BitGo/BitGoJS/compare/@bitgo/utxo-bin@1.0.1-rc.15...@bitgo/utxo-bin@1.0.1-rc.17) (2022-04-06)
7
+
8
+ **Note:** Version bump only for package @bitgo/utxo-bin
9
+
10
+
11
+
12
+
13
+
14
+ ## [1.0.1-rc.16](https://github.com/BitGo/BitGoJS/compare/@bitgo/utxo-bin@1.0.1-rc.15...@bitgo/utxo-bin@1.0.1-rc.16) (2022-04-05)
15
+
16
+ **Note:** Version bump only for package @bitgo/utxo-bin
package/dist/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bitgo/utxo-bin",
3
3
  "description": "Command-line utility for BitGo UTXO transactions",
4
- "version": "1.0.1-rc.16",
4
+ "version": "1.0.1-rc.17",
5
5
  "files": [
6
6
  "dist/**/*"
7
7
  ],
@@ -13,7 +13,7 @@
13
13
  ],
14
14
  "scripts": {
15
15
  "prepare": "npm run build",
16
- "build": "tsc",
16
+ "build": "yarn tsc",
17
17
  "lint": "eslint --quiet .",
18
18
  "unit-test": "mocha",
19
19
  "fmt": "prettier --write '{bin,src,test}/**/*.{ts,js}'"
@@ -26,7 +26,7 @@
26
26
  "bin": "./dist/bin/index.js",
27
27
  "dependencies": {
28
28
  "@bitgo/blockapis": "^1.0.1-rc.5",
29
- "@bitgo/statics": "^6.17.0-rc.16",
29
+ "@bitgo/statics": "^6.17.0-rc.17",
30
30
  "@bitgo/utxo-lib": "^2.2.2-rc.5",
31
31
  "archy": "^1.0.0",
32
32
  "chalk": "4",
@@ -42,5 +42,5 @@
42
42
  "access": "public"
43
43
  },
44
44
  "license": "MIT",
45
- "gitHead": "8108d8f1dcb4235c836914d69e1eb18746de1c7d"
45
+ "gitHead": "baab278e7dc4d3b142d0910fc38642c918d88cef"
46
46
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bitgo/utxo-bin",
3
3
  "description": "Command-line utility for BitGo UTXO transactions",
4
- "version": "1.0.1-rc.16",
4
+ "version": "1.0.1-rc.17",
5
5
  "files": [
6
6
  "dist/**/*"
7
7
  ],
@@ -13,7 +13,7 @@
13
13
  ],
14
14
  "scripts": {
15
15
  "prepare": "npm run build",
16
- "build": "tsc",
16
+ "build": "yarn tsc",
17
17
  "lint": "eslint --quiet .",
18
18
  "unit-test": "mocha",
19
19
  "fmt": "prettier --write '{bin,src,test}/**/*.{ts,js}'"
@@ -26,7 +26,7 @@
26
26
  "bin": "./dist/bin/index.js",
27
27
  "dependencies": {
28
28
  "@bitgo/blockapis": "^1.0.1-rc.5",
29
- "@bitgo/statics": "^6.17.0-rc.16",
29
+ "@bitgo/statics": "^6.17.0-rc.17",
30
30
  "@bitgo/utxo-lib": "^2.2.2-rc.5",
31
31
  "archy": "^1.0.0",
32
32
  "chalk": "4",
@@ -42,5 +42,5 @@
42
42
  "access": "public"
43
43
  },
44
44
  "license": "MIT",
45
- "gitHead": "8108d8f1dcb4235c836914d69e1eb18746de1c7d"
45
+ "gitHead": "baab278e7dc4d3b142d0910fc38642c918d88cef"
46
46
  }
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../bin/index.ts"],"names":[],"mappings":""}
package/dist/bin/index.js DELETED
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- const yargs = require("yargs");
5
- const commands_1 = require("../src/commands");
6
- yargs.command(commands_1.cmdParse).help().parse();
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9iaW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsK0JBQStCO0FBQy9CLDhDQUEyQztBQUMzQyxLQUFLLENBQUMsT0FBTyxDQUFDLG1CQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCAqIGFzIHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGNtZFBhcnNlIH0gZnJvbSAnLi4vc3JjL2NvbW1hbmRzJztcbnlhcmdzLmNvbW1hbmQoY21kUGFyc2UpLmhlbHAoKS5wYXJzZSgpO1xuIl19
@@ -1,23 +0,0 @@
1
- import * as yargs from 'yargs';
2
- import { Parser, ParserArgs } from './parse';
3
- declare type Args = {
4
- network: string;
5
- stdin: boolean;
6
- path?: string;
7
- txid?: string;
8
- all: boolean;
9
- format: 'tree' | 'json';
10
- fetchAll: boolean;
11
- fetchStatus: boolean;
12
- fetchInputs: boolean;
13
- fetchSpends: boolean;
14
- } & ParserArgs;
15
- export declare function getParser(argv: yargs.Arguments<Args>): Parser;
16
- export declare const cmdParse: {
17
- command: string;
18
- describe: string;
19
- builder(b: yargs.Argv<unknown>): yargs.Argv<Args>;
20
- handler(argv: yargs.Arguments<Args>): Promise<void>;
21
- };
22
- export {};
23
- //# sourceMappingURL=commands.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/commands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAU7C,aAAK,IAAI,GAAG;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACtB,GAAG,UAAU,CAAC;AAEf,wBAAgB,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAE7D;AAED,eAAO,MAAM,QAAQ;;;eAIR,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;kBAkB7B,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC;CA0D1D,CAAC"}
@@ -1,87 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.cmdParse = exports.getParser = void 0;
4
- const fs = require("fs");
5
- const process = require("process");
6
- const utxolib = require("@bitgo/utxo-lib");
7
- const parse_1 = require("./parse");
8
- const format_1 = require("./format");
9
- const fetch_1 = require("./fetch");
10
- function getParser(argv) {
11
- return new parse_1.Parser(argv.all ? parse_1.Parser.PARSE_ALL : argv);
12
- }
13
- exports.getParser = getParser;
14
- exports.cmdParse = {
15
- command: 'parse [path]',
16
- describe: 'display transaction components in human-readable form',
17
- builder(b) {
18
- return b
19
- .option('path', { type: 'string', nargs: 1, default: '' })
20
- .option('stdin', { type: 'boolean', default: false })
21
- .option('txid', { type: 'string' })
22
- .option('fetchAll', { type: 'boolean', default: false })
23
- .option('fetchStatus', { type: 'boolean', default: false })
24
- .option('fetchInputs', { type: 'boolean', default: false })
25
- .option('fetchSpends', { type: 'boolean', default: false })
26
- .option('network', { alias: 'n', type: 'string', demandOption: true })
27
- .option('parseScriptAsm', { alias: 'scriptasm', type: 'boolean', default: false })
28
- .option('parseScriptData', { alias: 'scriptdata', type: 'boolean', default: false })
29
- .option('parseSignatureData', { alias: 'sigdata', type: 'boolean', default: false })
30
- .option('maxOutputs', { type: 'number' })
31
- .option('all', { type: 'boolean', default: false })
32
- .option('format', { choices: ['tree', 'json'], default: 'tree' });
33
- },
34
- async handler(argv) {
35
- const network = utxolib.networks[argv.network];
36
- if (!network) {
37
- throw new Error(`invalid network ${network}`);
38
- }
39
- let data;
40
- if (argv.txid) {
41
- console.log('fetching txHex via blockapi...');
42
- data = await (0, fetch_1.fetchTransactionHex)(argv.txid, network);
43
- }
44
- if (argv.stdin || argv.path === '-') {
45
- if (data) {
46
- throw new Error(`conflicting arguments`);
47
- }
48
- console.log('reading from stdin');
49
- data = fs.readFileSync(process.stdin.fd, 'utf8');
50
- }
51
- else if (argv.path) {
52
- if (data) {
53
- throw new Error(`conflicting arguments`);
54
- }
55
- data = (await fs.promises.readFile(argv.path, 'utf8')).toString();
56
- }
57
- if (!data) {
58
- throw new Error(`no txdata`);
59
- }
60
- data = data.replace(/\s*/g, '');
61
- const tx = utxolib.bitgo.createTransactionFromHex(data, network);
62
- const txid = tx.getId();
63
- if (argv.txid && txid !== argv.txid) {
64
- throw new Error(`computed txid does not match txid argument`);
65
- }
66
- if (argv.fetchAll) {
67
- argv.fetchStatus = true;
68
- argv.fetchInputs = true;
69
- argv.fetchSpends = true;
70
- }
71
- const parsed = getParser(argv).parse(tx, {
72
- status: argv.fetchStatus ? await (0, fetch_1.fetchTransactionStatus)(txid, network) : undefined,
73
- prevOutputs: argv.fetchInputs ? await (0, fetch_1.fetchPrevOutputs)(tx) : undefined,
74
- prevOutputSpends: argv.fetchSpends ? await (0, fetch_1.fetchPrevOutputSpends)(tx) : undefined,
75
- outputSpends: argv.fetchSpends ? await (0, fetch_1.fetchOutputSpends)(tx) : undefined,
76
- });
77
- switch (argv.format) {
78
- case 'json':
79
- console.log(JSON.stringify(parsed, null, 2));
80
- break;
81
- case 'tree':
82
- console.log((0, format_1.formatTree)(parsed, { hide: argv.all ? [] : undefined }));
83
- break;
84
- }
85
- },
86
- };
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEseUJBQXlCO0FBQ3pCLG1DQUFtQztBQUVuQywyQ0FBMkM7QUFFM0MsbUNBQTZDO0FBQzdDLHFDQUFzQztBQUN0QyxtQ0FNaUI7QUFlakIsU0FBZ0IsU0FBUyxDQUFDLElBQTJCO0lBQ25ELE9BQU8sSUFBSSxjQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsY0FBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUZELDhCQUVDO0FBRVksUUFBQSxRQUFRLEdBQUc7SUFDdEIsT0FBTyxFQUFFLGNBQWM7SUFDdkIsUUFBUSxFQUFFLHVEQUF1RDtJQUVqRSxPQUFPLENBQUMsQ0FBc0I7UUFDNUIsT0FBTyxDQUFDO2FBQ0wsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7YUFDekQsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO2FBQ3BELE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7YUFDbEMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO2FBQ3ZELE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQzthQUMxRCxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7YUFD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QUFDLEdBQUcsQ0FBQyxJQUFBLG1CQUFVLEVBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNyRSxNQUFNO1NBQ1Q7SUFDSCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCAqIGFzIHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHByb2Nlc3MgZnJvbSAncHJvY2Vzcyc7XG5cbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcblxuaW1wb3J0IHsgUGFyc2VyLCBQYXJzZXJBcmdzIH0gZnJvbSAnLi9wYXJzZSc7XG5pbXBvcnQgeyBmb3JtYXRUcmVlIH0gZnJvbSAnLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgZmV0Y2hPdXRwdXRTcGVuZHMsXG4gIGZldGNoUHJldk91dHB1dHMsXG4gIGZldGNoUHJldk91dHB1dFNwZW5kcyxcbiAgZmV0Y2hUcmFuc2FjdGlvbkhleCxcbiAgZmV0Y2hUcmFuc2FjdGlvblN0YXR1cyxcbn0gZnJvbSAnLi9mZXRjaCc7XG5cbnR5cGUgQXJncyA9IHtcbiAgbmV0d29yazogc3RyaW5nO1xuICBzdGRpbjogYm9vbGVhbjtcbiAgcGF0aD86IHN0cmluZztcbiAgdHhpZD86IHN0cmluZztcbiAgYWxsOiBib29sZWFuO1xuICBmb3JtYXQ6ICd0cmVlJyB8ICdqc29uJztcbiAgZmV0Y2hBbGw6IGJvb2xlYW47XG4gIGZldGNoU3RhdHVzOiBib29sZWFuO1xuICBmZXRjaElucHV0czogYm9vbGVhbjtcbiAgZmV0Y2hTcGVuZHM6IGJvb2xlYW47XG59ICYgUGFyc2VyQXJncztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcnNlcihhcmd2OiB5YXJncy5Bcmd1bWVudHM8QXJncz4pOiBQYXJzZXIge1xuICByZXR1cm4gbmV3IFBhcnNlcihhcmd2LmFsbCA/IFBhcnNlci5QQVJTRV9BTEwgOiBhcmd2KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNtZFBhcnNlID0ge1xuICBjb21tYW5kOiAncGFyc2UgW3BhdGhdJyxcbiAgZGVzY3JpYmU6ICdkaXNwbGF5IHRyYW5zYWN0aW9uIGNvbXBvbmVudHMgaW4gaHVtYW4tcmVhZGFibGUgZm9ybScsXG5cbiAgYnVpbGRlcihiOiB5YXJncy5Bcmd2PHVua25vd24+KTogeWFyZ3MuQXJndjxBcmdzPiB7XG4gICAgcmV0dXJuIGJcbiAgICAgIC5vcHRpb24oJ3BhdGgnLCB7IHR5cGU6ICdzdHJpbmcnLCBuYXJnczogMSwgZGVmYXVsdDogJycgfSlcbiAgICAgIC5vcHRpb24oJ3N0ZGluJywgeyB0eXBlOiAnYm9vbGVhbicsIGRlZmF1bHQ6IGZhbHNlIH0pXG4gICAgICAub3B0aW9uKCd0eGlkJywgeyB0eXBlOiAnc3RyaW5nJyB9KVxuICAgICAgLm9wdGlvbignZmV0Y2hBbGwnLCB7IHR5cGU6ICdib29sZWFuJywgZGVmYXVsdDogZmFsc2UgfSlcbiAgICAgIC5vcHRpb24oJ2ZldGNoU3RhdHVzJywgeyB0eXBlOiAnYm9vbGVhbicsIGRlZmF1bHQ6IGZhbHNlIH0pXG4gICAgICAub3B0aW9uKCdmZXRjaElucHV0cycsIHsgdHlwZTogJ2Jvb2xlYW4nLCBkZWZhdWx0OiBmYWxzZSB9KVxuICAgICAgLm9wdGlvbignZmV0Y2hTcGVuZHMnLCB7IHR5cGU6ICdib29sZWFuJywgZGVmYXVsdDogZmFsc2UgfSlcbiAgICAgIC5vcHRpb24oJ25ldHdvcmsnLCB7IGFsaWFzOiAnbicsIHR5cGU6ICdzdHJpbmcnLCBkZW1hbmRPcHRpb246IHRydWUgfSlcbiAgICAgIC5vcHRpb24oJ3BhcnNlU2NyaXB0QXNtJywgeyBhbGlhczogJ3NjcmlwdGFzbScsIHR5cGU6ICdib29sZWFuJywgZGVmYXVsdDogZmFsc2UgfSlcbiAgICAgIC5vcHRpb24oJ3BhcnNlU2NyaXB0RGF0YScsIHsgYWxpYXM6ICdzY3JpcHRkYXRhJywgdHlwZTogJ2Jvb2xlYW4nLCBkZWZhdWx0OiBmYWxzZSB9KVxuICAgICAgLm9wdGlvbigncGFyc2VTaWduYXR1cmVEYXRhJywgeyBhbGlhczogJ3NpZ2RhdGEnLCB0eXBlOiAnYm9vbGVhbicsIGRlZmF1bHQ6IGZhbHNlIH0pXG4gICAgICAub3B0aW9uKCdtYXhPdXRwdXRzJywgeyB0eXBlOiAnbnVtYmVyJyB9KVxuICAgICAgLm9wdGlvbignYWxsJywgeyB0eXBlOiAnYm9vbGVhbicsIGRlZmF1bHQ6IGZhbHNlIH0pXG4gICAgICAub3B0aW9uKCdmb3JtYXQnLCB7IGNob2ljZXM6IFsndHJlZScsICdqc29uJ10sIGRlZmF1bHQ6ICd0cmVlJyB9IGFzIGNvbnN0KTtcbiAgfSxcblxuICBhc3luYyBoYW5kbGVyKGFyZ3Y6IHlhcmdzLkFyZ3VtZW50czxBcmdzPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5ldHdvcmsgPSB1dHhvbGliLm5ldHdvcmtzW2FyZ3YubmV0d29yayBhcyB1dHhvbGliLk5ldHdvcmtOYW1lXTtcbiAgICBpZiAoIW5ldHdvcmspIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBuZXR3b3JrICR7bmV0d29ya31gKTtcbiAgICB9XG5cbiAgICBsZXQgZGF0YTtcblxuICAgIGlmIChhcmd2LnR4aWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdmZXRjaGluZyB0eEhleCB2aWEgYmxvY2thcGkuLi4nKTtcbiAgICAgIGRhdGEgPSBhd2FpdCBmZXRjaFRyYW5zYWN0aW9uSGV4KGFyZ3YudHhpZCwgbmV0d29yayk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3Yuc3RkaW4gfHwgYXJndi5wYXRoID09PSAnLScpIHtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgY29uZmxpY3RpbmcgYXJndW1lbnRzYCk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZygncmVhZGluZyBmcm9tIHN0ZGluJyk7XG4gICAgICBkYXRhID0gZnMucmVhZEZpbGVTeW5jKHByb2Nlc3Muc3RkaW4uZmQsICd1dGY4Jyk7XG4gICAgfSBlbHNlIGlmIChhcmd2LnBhdGgpIHtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgY29uZmxpY3RpbmcgYXJndW1lbnRzYCk7XG4gICAgICB9XG4gICAgICBkYXRhID0gKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGFyZ3YucGF0aCwgJ3V0ZjgnKSkudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gdHhkYXRhYCk7XG4gICAgfVxuICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoL1xccyovZywgJycpO1xuXG4gICAgY29uc3QgdHggPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleChkYXRhLCBuZXR3b3JrKTtcbiAgICBjb25zdCB0eGlkID0gdHguZ2V0SWQoKTtcbiAgICBpZiAoYXJndi50eGlkICYmIHR4aWQgIT09IGFyZ3YudHhpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb21wdXRlZCB0eGlkIGRvZXMgbm90IG1hdGNoIHR4aWQgYXJndW1lbnRgKTtcbiAgICB9XG5cbiAgICBpZiAoYXJndi5mZXRjaEFsbCkge1xuICAgICAgYXJndi5mZXRjaFN0YXR1cyA9IHRydWU7XG4gICAgICBhcmd2LmZldGNoSW5wdXRzID0gdHJ1ZTtcbiAgICAgIGFyZ3YuZmV0Y2hTcGVuZHMgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IGdldFBhcnNlcihhcmd2KS5wYXJzZSh0eCwge1xuICAgICAgc3RhdHVzOiBhcmd2LmZldGNoU3RhdHVzID8gYXdhaXQgZmV0Y2hUcmFuc2FjdGlvblN0YXR1cyh0eGlkLCBuZXR3b3JrKSA6IHVuZGVmaW5lZCxcbiAgICAgIHByZXZPdXRwdXRzOiBhcmd2LmZldGNoSW5wdXRzID8gYXdhaXQgZmV0Y2hQcmV2T3V0cHV0cyh0eCkgOiB1bmRlZmluZWQsXG4gICAgICBwcmV2T3V0cHV0U3BlbmRzOiBhcmd2LmZldGNoU3BlbmRzID8gYXdhaXQgZmV0Y2hQcmV2T3V0cHV0U3BlbmRzKHR4KSA6IHVuZGVmaW5lZCxcbiAgICAgIG91dHB1dFNwZW5kczogYXJndi5mZXRjaFNwZW5kcyA/IGF3YWl0IGZldGNoT3V0cHV0U3BlbmRzKHR4KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICBzd2l0Y2ggKGFyZ3YuZm9ybWF0KSB7XG4gICAgICBjYXNlICdqc29uJzpcbiAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCAyKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndHJlZSc6XG4gICAgICAgIGNvbnNvbGUubG9nKGZvcm1hdFRyZWUocGFyc2VkLCB7IGhpZGU6IGFyZ3YuYWxsID8gW10gOiB1bmRlZmluZWQgfSkpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0sXG59O1xuIl19
@@ -1,8 +0,0 @@
1
- import * as utxolib from '@bitgo/utxo-lib';
2
- import * as blockapis from '@bitgo/blockapis';
3
- export declare function fetchTransactionHex(txid: string, network: utxolib.Network): Promise<string>;
4
- export declare function fetchTransactionStatus(txid: string, network: utxolib.Network): Promise<blockapis.TransactionStatus>;
5
- export declare function fetchPrevOutputs(tx: utxolib.bitgo.UtxoTransaction): Promise<utxolib.TxOutput[]>;
6
- export declare function fetchPrevOutputSpends(tx: utxolib.bitgo.UtxoTransaction): Promise<blockapis.OutputSpend[]>;
7
- export declare function fetchOutputSpends(tx: utxolib.bitgo.UtxoTransaction): Promise<blockapis.OutputSpend[]>;
8
- //# sourceMappingURL=fetch.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAC;AAyB9C,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAEjG;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,CAAC,OAAO,GACvB,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAEtC;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAErG;AAED,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAK/G;AAED,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAM3G"}
package/dist/src/fetch.js DELETED
@@ -1,50 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fetchOutputSpends = exports.fetchPrevOutputSpends = exports.fetchPrevOutputs = exports.fetchTransactionStatus = exports.fetchTransactionHex = void 0;
4
- const utxolib = require("@bitgo/utxo-lib");
5
- const blockapis = require("@bitgo/blockapis");
6
- const statics_1 = require("@bitgo/statics");
7
- function getCoinName(network) {
8
- const networkName = utxolib.getNetworkName(network);
9
- const matches = [...statics_1.coins].flatMap(([, coin]) => coin instanceof statics_1.UtxoCoin && coin.network.utxolibName === networkName ? [coin] : []);
10
- if (matches.length === 1) {
11
- return matches[0].name;
12
- }
13
- throw new Error(`no coin for network ${networkName}`);
14
- }
15
- function getApi(network) {
16
- const coinName = getCoinName(network);
17
- switch (coinName) {
18
- case 'btc':
19
- case 'tbtc':
20
- return blockapis.BlockstreamApi.forCoin(coinName);
21
- default:
22
- return blockapis.BlockchairApi.forCoin(coinName);
23
- }
24
- }
25
- async function fetchTransactionHex(txid, network) {
26
- return await getApi(network).getTransactionHex(txid);
27
- }
28
- exports.fetchTransactionHex = fetchTransactionHex;
29
- async function fetchTransactionStatus(txid, network) {
30
- return await getApi(network).getTransactionStatus(txid);
31
- }
32
- exports.fetchTransactionStatus = fetchTransactionStatus;
33
- async function fetchPrevOutputs(tx) {
34
- return await blockapis.fetchInputs(tx.ins, getApi(tx.network), tx.network);
35
- }
36
- exports.fetchPrevOutputs = fetchPrevOutputs;
37
- async function fetchPrevOutputSpends(tx) {
38
- return await blockapis.fetchTransactionSpends(tx.ins.map((i) => utxolib.bitgo.getOutputIdForInput(i)), getApi(tx.network));
39
- }
40
- exports.fetchPrevOutputSpends = fetchPrevOutputSpends;
41
- async function fetchOutputSpends(tx) {
42
- try {
43
- return await getApi(tx.network).getTransactionSpends(tx.getId());
44
- }
45
- catch (e) {
46
- return [];
47
- }
48
- }
49
- exports.fetchOutputSpends = fetchOutputSpends;
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmV0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmV0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQTJDO0FBQzNDLDhDQUE4QztBQUM5Qyw0Q0FBaUQ7QUFFakQsU0FBUyxXQUFXLENBQUMsT0FBd0I7SUFDM0MsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRCxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsZUFBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FDOUMsSUFBSSxZQUFZLGtCQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ25GLENBQUM7SUFDRixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3hCLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztLQUN4QjtJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLE9BQXdCO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxRQUFRLFFBQVEsRUFBRTtRQUNoQixLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssTUFBTTtZQUNULE9BQU8sU0FBUyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEQ7WUFDRSxPQUFPLFNBQVMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ3BEO0FBQ0gsQ0FBQztBQUVNLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsT0FBd0I7SUFDOUUsT0FBTyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRkQsa0RBRUM7QUFFTSxLQUFLLFVBQVUsc0JBQXNCLENBQzFDLElBQVksRUFDWixPQUF3QjtJQUV4QixPQUFPLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFMRCx3REFLQztBQUVNLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxFQUFpQztJQUN0RSxPQUFPLE1BQU0sU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdFLENBQUM7QUFGRCw0Q0FFQztBQUVNLEtBQUssVUFBVSxxQkFBcUIsQ0FBQyxFQUFpQztJQUMzRSxPQUFPLE1BQU0sU0FBUyxDQUFDLHNCQUFzQixDQUMzQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUN2RCxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUNuQixDQUFDO0FBQ0osQ0FBQztBQUxELHNEQUtDO0FBRU0sS0FBSyxVQUFVLGlCQUFpQixDQUFDLEVBQWlDO0lBQ3ZFLElBQUk7UUFDRixPQUFPLE1BQU0sTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUNsRTtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsT0FBTyxFQUFFLENBQUM7S0FDWDtBQUNILENBQUM7QUFORCw4Q0FNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIGJsb2NrYXBpcyBmcm9tICdAYml0Z28vYmxvY2thcGlzJztcbmltcG9ydCB7IGNvaW5zLCBVdHhvQ29pbiB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcblxuZnVuY3Rpb24gZ2V0Q29pbk5hbWUobmV0d29yazogdXR4b2xpYi5OZXR3b3JrKTogc3RyaW5nIHtcbiAgY29uc3QgbmV0d29ya05hbWUgPSB1dHhvbGliLmdldE5ldHdvcmtOYW1lKG5ldHdvcmspO1xuICBjb25zdCBtYXRjaGVzID0gWy4uLmNvaW5zXS5mbGF0TWFwKChbLCBjb2luXSkgPT5cbiAgICBjb2luIGluc3RhbmNlb2YgVXR4b0NvaW4gJiYgY29pbi5uZXR3b3JrLnV0eG9saWJOYW1lID09PSBuZXR3b3JrTmFtZSA/IFtjb2luXSA6IFtdXG4gICk7XG4gIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBtYXRjaGVzWzBdLm5hbWU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBubyBjb2luIGZvciBuZXR3b3JrICR7bmV0d29ya05hbWV9YCk7XG59XG5cbmZ1bmN0aW9uIGdldEFwaShuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmspOiBibG9ja2FwaXMuVXR4b0FwaSB7XG4gIGNvbnN0IGNvaW5OYW1lID0gZ2V0Q29pbk5hbWUobmV0d29yayk7XG4gIHN3aXRjaCAoY29pbk5hbWUpIHtcbiAgICBjYXNlICdidGMnOlxuICAgIGNhc2UgJ3RidGMnOlxuICAgICAgcmV0dXJuIGJsb2NrYXBpcy5CbG9ja3N0cmVhbUFwaS5mb3JDb2luKGNvaW5OYW1lKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGJsb2NrYXBpcy5CbG9ja2NoYWlyQXBpLmZvckNvaW4oY29pbk5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaFRyYW5zYWN0aW9uSGV4KHR4aWQ6IHN0cmluZywgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIGF3YWl0IGdldEFwaShuZXR3b3JrKS5nZXRUcmFuc2FjdGlvbkhleCh0eGlkKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoVHJhbnNhY3Rpb25TdGF0dXMoXG4gIHR4aWQ6IHN0cmluZyxcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrXG4pOiBQcm9taXNlPGJsb2NrYXBpcy5UcmFuc2FjdGlvblN0YXR1cz4ge1xuICByZXR1cm4gYXdhaXQgZ2V0QXBpKG5ldHdvcmspLmdldFRyYW5zYWN0aW9uU3RhdHVzKHR4aWQpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hQcmV2T3V0cHV0cyh0eDogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb24pOiBQcm9taXNlPHV0eG9saWIuVHhPdXRwdXRbXT4ge1xuICByZXR1cm4gYXdhaXQgYmxvY2thcGlzLmZldGNoSW5wdXRzKHR4LmlucywgZ2V0QXBpKHR4Lm5ldHdvcmspLCB0eC5uZXR3b3JrKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoUHJldk91dHB1dFNwZW5kcyh0eDogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb24pOiBQcm9taXNlPGJsb2NrYXBpcy5PdXRwdXRTcGVuZFtdPiB7XG4gIHJldHVybiBhd2FpdCBibG9ja2FwaXMuZmV0Y2hUcmFuc2FjdGlvblNwZW5kcyhcbiAgICB0eC5pbnMubWFwKChpKSA9PiB1dHhvbGliLmJpdGdvLmdldE91dHB1dElkRm9ySW5wdXQoaSkpLFxuICAgIGdldEFwaSh0eC5uZXR3b3JrKVxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hPdXRwdXRTcGVuZHModHg6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uKTogUHJvbWlzZTxibG9ja2FwaXMuT3V0cHV0U3BlbmRbXT4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBnZXRBcGkodHgubmV0d29yaykuZ2V0VHJhbnNhY3Rpb25TcGVuZHModHguZ2V0SWQoKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cbiJdfQ==
@@ -1,7 +0,0 @@
1
- import { Chalk } from 'chalk';
2
- import { TxNode } from './parse';
3
- export declare function formatTree(n: TxNode, { hide, chalk }?: {
4
- hide?: string[];
5
- chalk?: Chalk;
6
- }): string;
7
- //# sourceMappingURL=format.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAY,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,MAAM,EAAe,MAAM,SAAS,CAAC;AAI9C,wBAAgB,UAAU,CACxB,CAAC,EAAE,MAAM,EACT,EAAE,IAAkB,EAAE,KAAsB,EAAE,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAO,GACtF,MAAM,CAoCR"}
@@ -1,42 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.formatTree = void 0;
4
- const chalk_1 = require("chalk");
5
- const archy = require("archy");
6
- const hideDefault = ['pubkeys', 'sequence', 'locktime', 'script', 'witness'];
7
- function formatTree(n, { hide = hideDefault, chalk = new chalk_1.Instance() } = {}) {
8
- function getLabel(label, v) {
9
- const arr = [chalk.bold(label)];
10
- if (v !== undefined) {
11
- arr.push(String(v));
12
- }
13
- return arr.join(': ');
14
- }
15
- function getLabelFromValue(v) {
16
- switch (typeof v) {
17
- case 'undefined':
18
- return undefined;
19
- case 'boolean':
20
- case 'number':
21
- case 'string':
22
- return String(v);
23
- case 'object':
24
- if (v === null) {
25
- return String(v);
26
- }
27
- if (Buffer.isBuffer(v)) {
28
- return v.length === 0 ? '[]' : v.toString('hex');
29
- }
30
- }
31
- throw new Error(`could not get lavel from value`);
32
- }
33
- function toArchy(n) {
34
- return {
35
- label: getLabel(n.label, getLabelFromValue(n.value)),
36
- nodes: n.nodes ? n.nodes.flatMap((e) => (hide.includes(e.label) ? [] : [toArchy(e)])) : undefined,
37
- };
38
- }
39
- return archy(toArchy(n));
40
- }
41
- exports.formatTree = formatTree;
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Zvcm1hdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpQ0FBd0M7QUFDeEMsK0JBQStCO0FBRy9CLE1BQU0sV0FBVyxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRTdFLFNBQWdCLFVBQVUsQ0FDeEIsQ0FBUyxFQUNULEVBQUUsSUFBSSxHQUFHLFdBQVcsRUFBRSxLQUFLLEdBQUcsSUFBSSxnQkFBUSxFQUFFLEtBQXlDLEVBQUU7SUFFdkYsU0FBUyxRQUFRLENBQUMsS0FBc0IsRUFBRSxDQUFXO1FBQ25ELE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUNuQixHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxTQUFTLGlCQUFpQixDQUFDLENBQWM7UUFDdkMsUUFBUSxPQUFPLENBQUMsRUFBRTtZQUNoQixLQUFLLFdBQVc7Z0JBQ2QsT0FBTyxTQUFTLENBQUM7WUFDbkIsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssUUFBUTtnQkFDWCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQixLQUFLLFFBQVE7Z0JBQ1gsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO29CQUNkLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNsQjtnQkFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ3RCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDbEQ7U0FDSjtRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsU0FBUyxPQUFPLENBQUMsQ0FBUztRQUN4QixPQUFPO1lBQ0wsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDbEcsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBdkNELGdDQXVDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYWxrLCBJbnN0YW5jZSB9IGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIGFyY2h5IGZyb20gJ2FyY2h5JztcbmltcG9ydCB7IFR4Tm9kZSwgVHhOb2RlVmFsdWUgfSBmcm9tICcuL3BhcnNlJztcblxuY29uc3QgaGlkZURlZmF1bHQgPSBbJ3B1YmtleXMnLCAnc2VxdWVuY2UnLCAnbG9ja3RpbWUnLCAnc2NyaXB0JywgJ3dpdG5lc3MnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRyZWUoXG4gIG46IFR4Tm9kZSxcbiAgeyBoaWRlID0gaGlkZURlZmF1bHQsIGNoYWxrID0gbmV3IEluc3RhbmNlKCkgfTogeyBoaWRlPzogc3RyaW5nW107IGNoYWxrPzogQ2hhbGsgfSA9IHt9XG4pOiBzdHJpbmcge1xuICBmdW5jdGlvbiBnZXRMYWJlbChsYWJlbDogc3RyaW5nIHwgbnVtYmVyLCB2PzogdW5rbm93bik6IHN0cmluZyB7XG4gICAgY29uc3QgYXJyID0gW2NoYWxrLmJvbGQobGFiZWwpXTtcbiAgICBpZiAodiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcnIucHVzaChTdHJpbmcodikpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyLmpvaW4oJzogJyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRMYWJlbEZyb21WYWx1ZSh2OiBUeE5vZGVWYWx1ZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoICh0eXBlb2Ygdikge1xuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiBTdHJpbmcodik7XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBpZiAodiA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcodik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2KSkge1xuICAgICAgICAgIHJldHVybiB2Lmxlbmd0aCA9PT0gMCA/ICdbXScgOiB2LnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNvdWxkIG5vdCBnZXQgbGF2ZWwgZnJvbSB2YWx1ZWApO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9BcmNoeShuOiBUeE5vZGUpOiBhcmNoeS5EYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGdldExhYmVsKG4ubGFiZWwsIGdldExhYmVsRnJvbVZhbHVlKG4udmFsdWUpKSxcbiAgICAgIG5vZGVzOiBuLm5vZGVzID8gbi5ub2Rlcy5mbGF0TWFwKChlKSA9PiAoaGlkZS5pbmNsdWRlcyhlLmxhYmVsKSA/IFtdIDogW3RvQXJjaHkoZSldKSkgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBhcmNoeSh0b0FyY2h5KG4pKTtcbn1cbiJdfQ==
@@ -1,49 +0,0 @@
1
- /// <reference types="node" />
2
- import * as utxolib from '@bitgo/utxo-lib';
3
- import { OutputSpend } from '@bitgo/blockapis';
4
- import { TransactionStatus } from '@bitgo/blockapis/dist/src/TransactionApi';
5
- export declare type InputFormat = 'asm' | 'parseSignature';
6
- export declare type TxNodeValue = number | string | Buffer | boolean | undefined | null;
7
- export declare type TxNode = {
8
- type: 'node';
9
- label: string;
10
- value: TxNodeValue | undefined;
11
- nodes: TxNode[] | undefined;
12
- };
13
- export declare type ParserArgs = {
14
- parseScriptData: boolean;
15
- parseScriptAsm: boolean;
16
- parseSignatureData: boolean;
17
- hide?: string[];
18
- maxOutputs?: number;
19
- };
20
- export declare type ChainInfo = {
21
- status?: TransactionStatus;
22
- outputSpends?: OutputSpend[];
23
- prevOutputs?: utxolib.TxOutput[];
24
- prevOutputSpends?: OutputSpend[];
25
- };
26
- export declare class Parser {
27
- private params;
28
- static PARSE_ALL: ParserArgs;
29
- constructor(params: ParserArgs);
30
- node(label: string | number, value: TxNodeValue, nodes?: TxNode[]): TxNode;
31
- parseScriptAsm(type: string, part: Buffer, i: number, n: number): string | undefined;
32
- parseScriptParts(type: string, parts: Array<Buffer | number>): TxNode[];
33
- parseScript(buffer: Buffer): TxNode;
34
- parseWitness(script: Buffer[]): TxNode;
35
- parsePubkeys(parsed: utxolib.bitgo.ParsedSignatureScript2Of3): TxNode;
36
- parseSignatures(parsed: utxolib.bitgo.ParsedSignatureScript2Of3, tx: utxolib.bitgo.UtxoTransaction, inputIndex: number, prevOutputs?: utxolib.TxOutput[]): TxNode;
37
- parseSigScript(tx: utxolib.bitgo.UtxoTransaction, inputIndex: number, prevOutputs?: utxolib.TxOutput[]): TxNode;
38
- parsePrevOut(input: utxolib.TxInput, i: number, network: utxolib.Network, prevOutputs?: utxolib.TxOutput[]): TxNode[];
39
- parseSpend(txid: string, index: number, spends: OutputSpend[] | undefined, params: {
40
- conflict: boolean;
41
- }): TxNode[];
42
- parseIns(ins: utxolib.TxInput[], tx: utxolib.bitgo.UtxoTransaction, outputInfo: ChainInfo): TxNode[];
43
- tryParseOpReturn(script: Buffer): TxNode[];
44
- tryFormatAddress(script: Buffer, network: utxolib.Network): string | Buffer;
45
- parseOuts(outs: utxolib.TxOutput[], tx: utxolib.bitgo.UtxoTransaction, params: ChainInfo): TxNode[];
46
- parseStatus(tx: utxolib.bitgo.UtxoTransaction, status?: TransactionStatus): TxNode[];
47
- parse(tx: utxolib.bitgo.UtxoTransaction, chainInfo?: ChainInfo): TxNode;
48
- }
49
- //# sourceMappingURL=parse.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/parse.ts"],"names":[],"mappings":"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"}
package/dist/src/parse.js DELETED
@@ -1,245 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Parser = void 0;
4
- const utxolib = require("@bitgo/utxo-lib");
5
- function formatSat(v) {
6
- return (v / 1e8).toFixed(8);
7
- }
8
- function toBufferUInt32BE(n) {
9
- const buf = Buffer.alloc(4);
10
- buf.writeUInt32LE(n);
11
- return buf;
12
- }
13
- function isPrintable(s) {
14
- // https://stackoverflow.com/a/66447494
15
- return !s.match(/[\p{Cc}\p{Cn}\p{Cs}]+/gu);
16
- }
17
- class Parser {
18
- constructor(params) {
19
- this.params = params;
20
- }
21
- node(label, value, nodes = []) {
22
- return {
23
- type: 'node',
24
- label: String(label),
25
- value,
26
- nodes,
27
- };
28
- }
29
- parseScriptAsm(type, part, i, n) {
30
- if ((type === 'taproot' && i === n - 2) ||
31
- ((type === 'scripthash' || type === 'witnessscripthash') && i === n - 1)) {
32
- let parsed;
33
- try {
34
- parsed = utxolib.script.toASM(part);
35
- }
36
- catch (e) {
37
- return 'error';
38
- }
39
- if (parsed) {
40
- return ['', ...parsed.split(' ')].join('\n');
41
- }
42
- }
43
- }
44
- parseScriptParts(type, parts) {
45
- return parts.map((v, i) => {
46
- let asmNode;
47
- if (this.params.parseScriptAsm && Buffer.isBuffer(v)) {
48
- const parsed = this.parseScriptAsm(type, v, i, parts.length);
49
- asmNode = parsed ? this.node('asm', parsed) : undefined;
50
- }
51
- return this.node(i, this.params.parseScriptData ? v : undefined, asmNode ? [asmNode] : undefined);
52
- });
53
- }
54
- parseScript(buffer) {
55
- var _a;
56
- let value;
57
- let nodes;
58
- if (buffer.length && this.params.parseSignatureData) {
59
- const type = (_a = utxolib.classify.input(buffer, true)) !== null && _a !== void 0 ? _a : 'unknown';
60
- const decompiled = utxolib.script.decompile(buffer);
61
- if (decompiled) {
62
- nodes = this.parseScriptParts(type, decompiled);
63
- }
64
- value = type;
65
- }
66
- else {
67
- value = buffer;
68
- }
69
- return this.node('script', value, nodes);
70
- }
71
- parseWitness(script) {
72
- var _a;
73
- if (script.length === 0) {
74
- return this.node('witness', '[]');
75
- }
76
- const type = (_a = utxolib.classify.witness(script, true)) !== null && _a !== void 0 ? _a : 'unknown';
77
- return this.node('witness', type, this.params.parseScriptData ? this.parseScriptParts(type, script) : undefined);
78
- }
79
- parsePubkeys(parsed) {
80
- return this.node('pubkeys', parsed.publicKeys.length, parsed.publicKeys.map((k, i) => this.node(i, k)));
81
- }
82
- parseSignatures(parsed, tx, inputIndex, prevOutputs) {
83
- const nodes = [];
84
- if (prevOutputs) {
85
- const signedBy = utxolib.bitgo.verifySignatureWithPublicKeys(tx, inputIndex, prevOutputs, parsed.publicKeys);
86
- nodes.push(this.node('signed by', signedBy.flatMap((v, i) => (v ? [i] : [])).join(', ')));
87
- }
88
- return this.node('signatures', parsed.signatures
89
- .map((s) => utxolib.bitgo.isPlaceholderSignature(s) ? '[]' : Buffer.isBuffer(s) ? `[${s.length}byte]` : `[${s}]`)
90
- .join(' '), nodes);
91
- }
92
- parseSigScript(tx, inputIndex, prevOutputs) {
93
- var _a;
94
- try {
95
- const parsed = utxolib.bitgo.parseSignatureScript(tx.ins[inputIndex]);
96
- return this.node('sigScript', (_a = parsed.scriptType) !== null && _a !== void 0 ? _a : 'unknown', parsed.scriptType && utxolib.bitgo.outputScripts.isScriptType2Of3(parsed.scriptType)
97
- ? [
98
- this.parsePubkeys(parsed),
99
- this.parseSignatures(parsed, tx, inputIndex, prevOutputs),
100
- ]
101
- : []);
102
- }
103
- catch (e) {
104
- return this.node('error', String(e));
105
- }
106
- }
107
- parsePrevOut(input, i, network, prevOutputs) {
108
- if (!prevOutputs || !prevOutputs[i]) {
109
- return [];
110
- }
111
- const { script, value } = prevOutputs[i];
112
- let address;
113
- try {
114
- address = utxolib.address.fromOutputScript(script, network);
115
- }
116
- catch (e) {
117
- address = '(error)';
118
- }
119
- return [
120
- this.node('value', value / 1e8),
121
- this.node('pubScript', script, address ? [this.node('address', address)] : undefined),
122
- ];
123
- }
124
- parseSpend(txid, index, spends, params) {
125
- if (!spends || !spends[index]) {
126
- // no spend data available
127
- return [];
128
- }
129
- const spend = spends[index];
130
- if (spend.txid === undefined) {
131
- return [this.node('spent', false)];
132
- }
133
- if (spend.txid === txid) {
134
- // if input is spent by this transaction we don't display it
135
- return [];
136
- }
137
- return [this.node('spent', `${spend.txid}:${spend.vin}`, params.conflict ? [this.node('conflict', true)] : [])];
138
- }
139
- parseIns(ins, tx, outputInfo) {
140
- const txid = tx.getId();
141
- return ins.map((input, i) => {
142
- return this.node(i, utxolib.bitgo.formatOutputId(utxolib.bitgo.getOutputIdForInput(input)), [
143
- this.node('sequence', toBufferUInt32BE(input.sequence)),
144
- this.parseScript(input.script),
145
- this.parseWitness(input.witness),
146
- this.parseSigScript(tx, i, outputInfo.prevOutputs),
147
- ...this.parsePrevOut(input, i, tx.network, outputInfo.prevOutputs),
148
- ...this.parseSpend(txid, i, outputInfo.prevOutputSpends, { conflict: true }),
149
- ]);
150
- });
151
- }
152
- tryParseOpReturn(script) {
153
- let data;
154
- try {
155
- ({ data } = utxolib.payments.embed({ output: script }));
156
- }
157
- catch (e) {
158
- // ignore
159
- }
160
- if (!data) {
161
- return [];
162
- }
163
- return data.map((buf, i) => {
164
- let utf8;
165
- try {
166
- utf8 = buf.toString('utf8');
167
- }
168
- catch (e) {
169
- // ignore
170
- }
171
- return this.node(i, `${buf.length} bytes`, [
172
- this.node('hex', buf),
173
- ...(utf8 && isPrintable(utf8) ? [this.node('utf8', utf8)] : []),
174
- ]);
175
- });
176
- }
177
- tryFormatAddress(script, network) {
178
- const opReturnNodes = this.tryParseOpReturn(script);
179
- if (opReturnNodes.length) {
180
- return `OP_RETURN`;
181
- }
182
- try {
183
- return utxolib.address.fromOutputScript(script, network);
184
- }
185
- catch (e) {
186
- return script;
187
- }
188
- }
189
- parseOuts(outs, tx, params) {
190
- var _a;
191
- if (outs.length > ((_a = this.params.maxOutputs) !== null && _a !== void 0 ? _a : 200)) {
192
- return [this.node('(omitted)', undefined)];
193
- }
194
- const txid = tx.getId();
195
- return outs.map((o, i) => this.node(i, this.tryFormatAddress(o.script, tx.network), [
196
- ...this.tryParseOpReturn(o.script),
197
- this.node(`value`, o.value / 1e8),
198
- ...this.parseSpend(txid, i, params.outputSpends, { conflict: false }),
199
- ]));
200
- }
201
- parseStatus(tx, status) {
202
- if (!status) {
203
- return [this.node('status', 'unknown')];
204
- }
205
- return [
206
- this.node('status', status.found ? 'found' : 'not found', status.found
207
- ? status.confirmed
208
- ? [
209
- this.node('confirmed', `block ${status.blockHeight}` + (status.date ? ` date=${status.date.toISOString()}` : '')),
210
- ]
211
- : [this.node('confirmed', false)]
212
- : []),
213
- ];
214
- }
215
- parse(tx, chainInfo = {}) {
216
- var _a;
217
- const weight = tx.weight();
218
- const vsize = tx.virtualSize();
219
- const outputSum = tx.outs.reduce((sum, o) => sum + o.value, 0);
220
- const inputSum = (_a = chainInfo.prevOutputs) === null || _a === void 0 ? void 0 : _a.reduce((sum, o) => sum + o.value, 0);
221
- const fee = inputSum ? inputSum - outputSum : undefined;
222
- const feeRate = fee ? fee / vsize : undefined;
223
- return this.node('transaction', tx.getId(), [
224
- this.node('parsedAs', `${utxolib.getNetworkName(utxolib.getMainnet(tx.network))} ` +
225
- `${utxolib.isMainnet(tx.network) ? 'mainnet' : 'testnet'}`),
226
- this.node('version', tx.version),
227
- this.node('locktime', tx.locktime),
228
- this.node('hasWitnesses', tx.hasWitnesses()),
229
- ...this.parseStatus(tx, chainInfo.status),
230
- this.node('vsize', `${vsize}vbytes (${weight}wu)`),
231
- ...(fee && feeRate
232
- ? [this.node('fee [btc]', formatSat(fee)), this.node('feeRate [sat/vbyte]', feeRate.toFixed(2))]
233
- : []),
234
- this.node(`inputs`, [String(tx.ins.length)].concat(inputSum ? ['sum=' + formatSat(inputSum)] : []).join(' '), this.parseIns(tx.ins, tx, chainInfo)),
235
- this.node(`outputs`, [String(tx.outs.length), 'sum=' + formatSat(outputSum)].join(' '), this.parseOuts(tx.outs, tx, chainInfo)),
236
- ]);
237
- }
238
- }
239
- exports.Parser = Parser;
240
- Parser.PARSE_ALL = {
241
- parseScriptData: true,
242
- parseScriptAsm: true,
243
- parseSignatureData: true,
244
- };
245
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQTJDO0FBUTNDLFNBQVMsU0FBUyxDQUFDLENBQVM7SUFDMUIsT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQXdCRCxTQUFTLGdCQUFnQixDQUFDLENBQVM7SUFDakMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLENBQVM7SUFDNUIsdUNBQXVDO0lBQ3ZDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELE1BQWEsTUFBTTtJQU9qQixZQUFvQixNQUFrQjtRQUFsQixXQUFNLEdBQU4sTUFBTSxDQUFZO0lBQUcsQ0FBQztJQUUxQyxJQUFJLENBQUMsS0FBc0IsRUFBRSxLQUFrQixFQUFFLFFBQWtCLEVBQUU7UUFDbkUsT0FBTztZQUNMLElBQUksRUFBRSxNQUFNO1lBQ1osS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDcEIsS0FBSztZQUNMLEtBQUs7U0FDTixDQUFDO0lBQ0osQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLENBQVMsRUFBRSxDQUFTO1FBQzdELElBQ0UsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxJQUFJLEtBQUssWUFBWSxJQUFJLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdB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RUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQ3hGLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQ3JDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FDUCxTQUFTLEVBQ1QsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUNqRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUN2QztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBeFJILHdCQXlSQztBQXhSUSxnQkFBUyxHQUFlO0lBQzdCLGVBQWUsRUFBRSxJQUFJO0lBQ3JCLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLGtCQUFrQixFQUFFLElBQUk7Q0FDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IE91dHB1dFNwZW5kIH0gZnJvbSAnQGJpdGdvL2Jsb2NrYXBpcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblN0YXR1cyB9IGZyb20gJ0BiaXRnby9ibG9ja2FwaXMvZGlzdC9zcmMvVHJhbnNhY3Rpb25BcGknO1xuXG5leHBvcnQgdHlwZSBJbnB1dEZvcm1hdCA9ICdhc20nIHwgJ3BhcnNlU2lnbmF0dXJlJztcblxuZXhwb3J0IHR5cGUgVHhOb2RlVmFsdWUgPSBudW1iZXIgfCBzdHJpbmcgfCBCdWZmZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbDtcblxuZnVuY3Rpb24gZm9ybWF0U2F0KHY6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiAodiAvIDFlOCkudG9GaXhlZCg4KTtcbn1cblxuZXhwb3J0IHR5cGUgVHhOb2RlID0ge1xuICB0eXBlOiAnbm9kZSc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBUeE5vZGVWYWx1ZSB8IHVuZGVmaW5lZDtcbiAgbm9kZXM6IFR4Tm9kZVtdIHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IHR5cGUgUGFyc2VyQXJncyA9IHtcbiAgcGFyc2VTY3JpcHREYXRhOiBib29sZWFuO1xuICBwYXJzZVNjcmlwdEFzbTogYm9vbGVhbjtcbiAgcGFyc2VTaWduYXR1cmVEYXRhOiBib29sZWFuO1xuICBoaWRlPzogc3RyaW5nW107XG4gIG1heE91dHB1dHM/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBDaGFpbkluZm8gPSB7XG4gIHN0YXR1cz86IFRyYW5zYWN0aW9uU3RhdHVzO1xuICBvdXRwdXRTcGVuZHM/OiBPdXRwdXRTcGVuZFtdO1xuICBwcmV2T3V0cHV0cz86IHV0eG9saWIuVHhPdXRwdXRbXTtcbiAgcHJldk91dHB1dFNwZW5kcz86IE91dHB1dFNwZW5kW107XG59O1xuXG5mdW5jdGlvbiB0b0J1ZmZlclVJbnQzMkJFKG46IG51bWJlcik6IEJ1ZmZlciB7XG4gIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgYnVmLndyaXRlVUludDMyTEUobik7XG4gIHJldHVybiBidWY7XG59XG5cbmZ1bmN0aW9uIGlzUHJpbnRhYmxlKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNjY0NDc0OTRcbiAgcmV0dXJuICFzLm1hdGNoKC9bXFxwe0NjfVxccHtDbn1cXHB7Q3N9XSsvZ3UpO1xufVxuXG5leHBvcnQgY2xhc3MgUGFyc2VyIHtcbiAgc3RhdGljIFBBUlNFX0FMTDogUGFyc2VyQXJncyA9IHtcbiAgICBwYXJzZVNjcmlwdERhdGE6IHRydWUsXG4gICAgcGFyc2VTY3JpcHRBc206IHRydWUsXG4gICAgcGFyc2VTaWduYXR1cmVEYXRhOiB0cnVlLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFyYW1zOiBQYXJzZXJBcmdzKSB7fVxuXG4gIG5vZGUobGFiZWw6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IFR4Tm9kZVZhbHVlLCBub2RlczogVHhOb2RlW10gPSBbXSk6IFR4Tm9kZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdub2RlJyxcbiAgICAgIGxhYmVsOiBTdHJpbmcobGFiZWwpLFxuICAgICAgdmFsdWUsXG4gICAgICBub2RlcyxcbiAgICB9O1xuICB9XG5cbiAgcGFyc2VTY3JpcHRBc20odHlwZTogc3RyaW5nLCBwYXJ0OiBCdWZmZXIsIGk6IG51bWJlciwgbjogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoXG4gICAgICAodHlwZSA9PT0gJ3RhcHJvb3QnICYmIGkgPT09IG4gLSAyKSB8fFxuICAgICAgKCh0eXBlID09PSAnc2NyaXB0aGFzaCcgfHwgdHlwZSA9PT0gJ3dpdG5lc3NzY3JpcHRoYXNoJykgJiYgaSA9PT0gbiAtIDEpXG4gICAgKSB7XG4gICAgICBsZXQgcGFyc2VkO1xuXG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZWQgPSB1dHhvbGliLnNjcmlwdC50b0FTTShwYXJ0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuICdlcnJvcic7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgcmV0dXJuIFsnJywgLi4ucGFyc2VkLnNwbGl0KCcgJyldLmpvaW4oJ1xcbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHBhcnNlU2NyaXB0UGFydHModHlwZTogc3RyaW5nLCBwYXJ0czogQXJyYXk8QnVmZmVyIHwgbnVtYmVyPik6IFR4Tm9kZVtdIHtcbiAgICByZXR1cm4gcGFydHMubWFwKCh2LCBpKSA9PiB7XG4gICAgICBsZXQgYXNtTm9kZTogVHhOb2RlIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHRoaXMucGFyYW1zLnBhcnNlU2NyaXB0QXNtICYmIEJ1ZmZlci5pc0J1ZmZlcih2KSkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU2NyaXB0QXNtKHR5cGUsIHYsIGksIHBhcnRzLmxlbmd0aCk7XG4gICAgICAgIGFzbU5vZGUgPSBwYXJzZWQgPyB0aGlzLm5vZGUoJ2FzbScsIHBhcnNlZCkgOiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm5vZGUoaSwgdGhpcy5wYXJhbXMucGFyc2VTY3JpcHREYXRhID8gdiA6IHVuZGVmaW5lZCwgYXNtTm9kZSA/IFthc21Ob2RlXSA6IHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH1cblxuICBwYXJzZVNjcmlwdChidWZmZXI6IEJ1ZmZlcik6IFR4Tm9kZSB7XG4gICAgbGV0IHZhbHVlO1xuICAgIGxldCBub2RlcztcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCAmJiB0aGlzLnBhcmFtcy5wYXJzZVNpZ25hdHVyZURhdGEpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSB1dHhvbGliLmNsYXNzaWZ5LmlucHV0KGJ1ZmZlciwgdHJ1ZSkgPz8gJ3Vua25vd24nO1xuICAgICAgY29uc3QgZGVjb21waWxlZCA9IHV0eG9saWIuc2NyaXB0LmRlY29tcGlsZShidWZmZXIpO1xuICAgICAgaWYgKGRlY29tcGlsZWQpIHtcbiAgICAgICAgbm9kZXMgPSB0aGlzLnBhcnNlU2NyaXB0UGFydHModHlwZSwgZGVjb21waWxlZCk7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gYnVmZmVyO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm5vZGUoJ3NjcmlwdCcsIHZhbHVlLCBub2Rlcyk7XG4gIH1cblxuICBwYXJzZVdpdG5lc3Moc2NyaXB0OiBCdWZmZXJbXSk6IFR4Tm9kZSB7XG4gICAgaWYgKHNjcmlwdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUoJ3dpdG5lc3MnLCAnW10nKTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHV0eG9saWIuY2xhc3NpZnkud2l0bmVzcyhzY3JpcHQsIHRydWUpID8/ICd1bmtub3duJztcbiAgICByZXR1cm4gdGhpcy5ub2RlKCd3aXRuZXNzJywgdHlwZSwgdGhpcy5wYXJhbXMucGFyc2VTY3JpcHREYXRhID8gdGhpcy5wYXJzZVNjcmlwdFBhcnRzKHR5cGUsIHNjcmlwdCkgOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgcGFyc2VQdWJrZXlzKHBhcnNlZDogdXR4b2xpYi5iaXRnby5QYXJzZWRTaWduYXR1cmVTY3JpcHQyT2YzKTogVHhOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlKFxuICAgICAgJ3B1YmtleXMnLFxuICAgICAgcGFyc2VkLnB1YmxpY0tleXMubGVuZ3RoLFxuICAgICAgcGFyc2VkLnB1YmxpY0tleXMubWFwKChrLCBpKSA9PiB0aGlzLm5vZGUoaSwgaykpXG4gICAgKTtcbiAgfVxuXG4gIHBhcnNlU2lnbmF0dXJlcyhcbiAgICBwYXJzZWQ6IHV0eG9saWIuYml0Z28uUGFyc2VkU2lnbmF0dXJlU2NyaXB0Mk9mMyxcbiAgICB0eDogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb24sXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIHByZXZPdXRwdXRzPzogdXR4b2xpYi5UeE91dHB1dFtdXG4gICk6IFR4Tm9kZSB7XG4gICAgY29uc3Qgbm9kZXMgPSBbXTtcbiAgICBpZiAocHJldk91dHB1dHMpIHtcbiAgICAgIGNvbnN0IHNpZ25lZEJ5ID0gdXR4b2xpYi5iaXRnby52ZXJpZnlTaWduYXR1cmVXaXRoUHVibGljS2V5cyh0eCwgaW5wdXRJbmRleCwgcHJldk91dHB1dHMsIHBhcnNlZC5wdWJsaWNLZXlzKTtcbiAgICAgIG5vZGVzLnB1c2godGhpcy5ub2RlKCdzaWduZWQgYnknLCBzaWduZWRCeS5mbGF0TWFwKCh2LCBpKSA9PiAodiA/IFtpXSA6IFtdKSkuam9pbignLCAnKSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ub2RlKFxuICAgICAgJ3NpZ25hdHVyZXMnLFxuICAgICAgcGFyc2VkLnNpZ25hdHVyZXNcbiAgICAgICAgLm1hcCgoczogQnVmZmVyIHwgMCkgPT5cbiAgICAgICAgICB1dHhvbGliLmJpdGdvLmlzUGxhY2Vob2xkZXJTaWduYXR1cmUocykgPyAnW10nIDogQnVmZmVyLmlzQnVmZmVyKHMpID8gYFske3MubGVuZ3RofWJ5dGVdYCA6IGBbJHtzfV1gXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oJyAnKSxcbiAgICAgIG5vZGVzXG4gICAgKTtcbiAgfVxuXG4gIHBhcnNlU2lnU2NyaXB0KHR4OiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbiwgaW5wdXRJbmRleDogbnVtYmVyLCBwcmV2T3V0cHV0cz86IHV0eG9saWIuVHhPdXRwdXRbXSk6IFR4Tm9kZSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHV0eG9saWIuYml0Z28ucGFyc2VTaWduYXR1cmVTY3JpcHQodHguaW5zW2lucHV0SW5kZXhdKTtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUoXG4gICAgICAgICdzaWdTY3JpcHQnLFxuICAgICAgICBwYXJzZWQuc2NyaXB0VHlwZSA/PyAndW5rbm93bicsXG4gICAgICAgIHBhcnNlZC5zY3JpcHRUeXBlICYmIHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5pc1NjcmlwdFR5cGUyT2YzKHBhcnNlZC5zY3JpcHRUeXBlKVxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICB0aGlzLnBhcnNlUHVia2V5cyhwYXJzZWQgYXMgdXR4b2xpYi5iaXRnby5QYXJzZWRTaWduYXR1cmVTY3JpcHQyT2YzKSxcbiAgICAgICAgICAgICAgdGhpcy5wYXJzZVNpZ25hdHVyZXMocGFyc2VkIGFzIHV0eG9saWIuYml0Z28uUGFyc2VkU2lnbmF0dXJlU2NyaXB0Mk9mMywgdHgsIGlucHV0SW5kZXgsIHByZXZPdXRwdXRzKSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUoJ2Vycm9yJywgU3RyaW5nKGUpKTtcbiAgICB9XG4gIH1cblxuICBwYXJzZVByZXZPdXQoXG4gICAgaW5wdXQ6IHV0eG9saWIuVHhJbnB1dCxcbiAgICBpOiBudW1iZXIsXG4gICAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrLFxuICAgIHByZXZPdXRwdXRzPzogdXR4b2xpYi5UeE91dHB1dFtdXG4gICk6IFR4Tm9kZVtdIHtcbiAgICBpZiAoIXByZXZPdXRwdXRzIHx8ICFwcmV2T3V0cHV0c1tpXSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCB7IHNjcmlwdCwgdmFsdWUgfSA9IHByZXZPdXRwdXRzW2ldO1xuICAgIGxldCBhZGRyZXNzO1xuICAgIHRyeSB7XG4gICAgICBhZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQoc2NyaXB0LCBuZXR3b3JrKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhZGRyZXNzID0gJyhlcnJvciknO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5ub2RlKCd2YWx1ZScsIHZhbHVlIC8gMWU4KSxcbiAgICAgIHRoaXMubm9kZSgncHViU2NyaXB0Jywgc2NyaXB0LCBhZGRyZXNzID8gW3RoaXMubm9kZSgnYWRkcmVzcycsIGFkZHJlc3MpXSA6IHVuZGVmaW5lZCksXG4gICAgXTtcbiAgfVxuXG4gIHBhcnNlU3BlbmQodHhpZDogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBzcGVuZHM6IE91dHB1dFNwZW5kW10gfCB1bmRlZmluZWQsIHBhcmFtczogeyBjb25mbGljdDogYm9vbGVhbiB9KTogVHhOb2RlW10ge1xuICAgIGlmICghc3BlbmRzIHx8ICFzcGVuZHNbaW5kZXhdKSB7XG4gICAgICAvLyBubyBzcGVuZCBkYXRhIGF2YWlsYWJsZVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBzcGVuZCA9IHNwZW5kc1tpbmRleF07XG4gICAgaWYgKHNwZW5kLnR4aWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFt0aGlzLm5vZGUoJ3NwZW50JywgZmFsc2UpXTtcbiAgICB9XG4gICAgaWYgKHNwZW5kLnR4aWQgPT09IHR4aWQpIHtcbiAgICAgIC8vIGlmIGlucHV0IGlzIHNwZW50IGJ5IHRoaXMgdHJhbnNhY3Rpb24gd2UgZG9uJ3QgZGlzcGxheSBpdFxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gW3RoaXMubm9kZSgnc3BlbnQnLCBgJHtzcGVuZC50eGlkfToke3NwZW5kLnZpbn1gLCBwYXJhbXMuY29uZmxpY3QgPyBbdGhpcy5ub2RlKCdjb25mbGljdCcsIHRydWUpXSA6IFtdKV07XG4gIH1cblxuICBwYXJzZUlucyhpbnM6IHV0eG9saWIuVHhJbnB1dFtdLCB0eDogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb24sIG91dHB1dEluZm86IENoYWluSW5mbyk6IFR4Tm9kZVtdIHtcbiAgICBjb25zdCB0eGlkID0gdHguZ2V0SWQoKTtcbiAgICByZXR1cm4gaW5zLm1hcCgoaW5wdXQsIGkpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUoaSwgdXR4b2xpYi5iaXRnby5mb3JtYXRPdXRwdXRJZCh1dHhvbGliLmJpdGdvLmdldE91dHB1dElkRm9ySW5wdXQoaW5wdXQpKSwgW1xuICAgICAgICB0aGlzLm5vZGUoJ3NlcXVlbmNlJywgdG9CdWZmZXJVSW50MzJCRShpbnB1dC5zZXF1ZW5jZSkpLFxuICAgICAgICB0aGlzLnBhcnNlU2NyaXB0KGlucHV0LnNjcmlwdCksXG4gICAgICAgIHRoaXMucGFyc2VXaXRuZXNzKGlucHV0LndpdG5lc3MpLFxuICAgICAgICB0aGlzLnBhcnNlU2lnU2NyaXB0KHR4LCBpLCBvdXRwdXRJbmZvLnByZXZPdXRwdXRzKSxcbiAgICAgICAgLi4udGhpcy5wYXJzZVByZXZPdXQoaW5wdXQsIGksIHR4Lm5ldHdvcmssIG91dHB1dEluZm8ucHJldk91dHB1dHMpLFxuICAgICAgICAuLi50aGlzLnBhcnNlU3BlbmQodHhpZCwgaSwgb3V0cHV0SW5mby5wcmV2T3V0cHV0U3BlbmRzLCB7IGNvbmZsaWN0OiB0cnVlIH0pLFxuICAgICAgXSk7XG4gICAgfSk7XG4gIH1cblxuICB0cnlQYXJzZU9wUmV0dXJuKHNjcmlwdDogQnVmZmVyKTogVHhOb2RlW10ge1xuICAgIGxldCBkYXRhOiBCdWZmZXJbXSB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgKHsgZGF0YSB9ID0gdXR4b2xpYi5wYXltZW50cy5lbWJlZCh7IG91dHB1dDogc2NyaXB0IH0pKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBkYXRhLm1hcCgoYnVmLCBpKSA9PiB7XG4gICAgICBsZXQgdXRmODtcbiAgICAgIHRyeSB7XG4gICAgICAgIHV0ZjggPSBidWYudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5ub2RlKGksIGAke2J1Zi5sZW5ndGh9IGJ5dGVzYCwgW1xuICAgICAgICB0aGlzLm5vZGUoJ2hleCcsIGJ1ZiksXG4gICAgICAgIC4uLih1dGY4ICYmIGlzUHJpbnRhYmxlKHV0ZjgpID8gW3RoaXMubm9kZSgndXRmOCcsIHV0ZjgpXSA6IFtdKSxcbiAgICAgIF0pO1xuICAgIH0pO1xuICB9XG5cbiAgdHJ5Rm9ybWF0QWRkcmVzcyhzY3JpcHQ6IEJ1ZmZlciwgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrKTogc3RyaW5nIHwgQnVmZmVyIHtcbiAgICBjb25zdCBvcFJldHVybk5vZGVzID0gdGhpcy50cnlQYXJzZU9wUmV0dXJuKHNjcmlwdCk7XG4gICAgaWYgKG9wUmV0dXJuTm9kZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gYE9QX1JFVFVSTmA7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChzY3JpcHQsIG5ldHdvcmspO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBzY3JpcHQ7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VPdXRzKG91dHM6IHV0eG9saWIuVHhPdXRwdXRbXSwgdHg6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uLCBwYXJhbXM6IENoYWluSW5mbyk6IFR4Tm9kZVtdIHtcbiAgICBpZiAob3V0cy5sZW5ndGggPiAodGhpcy5wYXJhbXMubWF4T3V0cHV0cyA/PyAyMDApKSB7XG4gICAgICByZXR1cm4gW3RoaXMubm9kZSgnKG9taXR0ZWQpJywgdW5kZWZpbmVkKV07XG4gICAgfVxuXG4gICAgY29uc3QgdHhpZCA9IHR4LmdldElkKCk7XG4gICAgcmV0dXJuIG91dHMubWFwKChvLCBpKSA9PlxuICAgICAgdGhpcy5ub2RlKGksIHRoaXMudHJ5Rm9ybWF0QWRkcmVzcyhvLnNjcmlwdCwgdHgubmV0d29yayksIFtcbiAgICAgICAgLi4udGhpcy50cnlQYXJzZU9wUmV0dXJuKG8uc2NyaXB0KSxcbiAgICAgICAgdGhpcy5ub2RlKGB2YWx1ZWAsIG8udmFsdWUgLyAxZTgpLFxuICAgICAgICAuLi50aGlzLnBhcnNlU3BlbmQodHhpZCwgaSwgcGFyYW1zLm91dHB1dFNwZW5kcywgeyBjb25mbGljdDogZmFsc2UgfSksXG4gICAgICBdKVxuICAgICk7XG4gIH1cblxuICBwYXJzZVN0YXR1cyh0eDogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb24sIHN0YXR1cz86IFRyYW5zYWN0aW9uU3RhdHVzKTogVHhOb2RlW10ge1xuICAgIGlmICghc3RhdHVzKSB7XG4gICAgICByZXR1cm4gW3RoaXMubm9kZSgnc3RhdHVzJywgJ3Vua25vd24nKV07XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICB0aGlzLm5vZGUoXG4gICAgICAgICdzdGF0dXMnLFxuICAgICAgICBzdGF0dXMuZm91bmQgPyAnZm91bmQnIDogJ25vdCBmb3VuZCcsXG4gICAgICAgIHN0YXR1cy5mb3VuZFxuICAgICAgICAgID8gc3RhdHVzLmNvbmZpcm1lZFxuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlKFxuICAgICAgICAgICAgICAgICAgJ2NvbmZpcm1lZCcsXG4gICAgICAgICAgICAgICAgICBgYmxvY2sgJHtzdGF0dXMuYmxvY2tIZWlnaHR9YCArIChzdGF0dXMuZGF0ZSA/IGAgZGF0ZT0ke3N0YXR1cy5kYXRlLnRvSVNPU3RyaW5nKCl9YCA6ICcnKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW3RoaXMubm9kZSgnY29uZmlybWVkJywgZmFsc2UpXVxuICAgICAgICAgIDogW11cbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIHBhcnNlKHR4OiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbiwgY2hhaW5JbmZvOiBDaGFpbkluZm8gPSB7fSk6IFR4Tm9kZSB7XG4gICAgY29uc3Qgd2VpZ2h0ID0gdHgud2VpZ2h0KCk7XG4gICAgY29uc3QgdnNpemUgPSB0eC52aXJ0dWFsU2l6ZSgpO1xuICAgIGNvbnN0IG91dHB1dFN1bSA9IHR4Lm91dHMucmVkdWNlKChzdW0sIG8pID0+IHN1bSArIG8udmFsdWUsIDApO1xuICAgIGNvbnN0IGlucHV0U3VtID0gY2hhaW5JbmZvLnByZXZPdXRwdXRzPy5yZWR1Y2UoKHN1bSwgbykgPT4gc3VtICsgby52YWx1ZSwgMCk7XG4gICAgY29uc3QgZmVlID0gaW5wdXRTdW0gPyBpbnB1dFN1bSAtIG91dHB1dFN1bSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBmZWVSYXRlID0gZmVlID8gZmVlIC8gdnNpemUgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMubm9kZSgndHJhbnNhY3Rpb24nLCB0eC5nZXRJZCgpLCBbXG4gICAgICB0aGlzLm5vZGUoXG4gICAgICAgICdwYXJzZWRBcycsXG4gICAgICAgIGAke3V0eG9saWIuZ2V0TmV0d29ya05hbWUodXR4b2xpYi5nZXRNYWlubmV0KHR4Lm5ldHdvcmspKX0gYCArXG4gICAgICAgICAgYCR7dXR4b2xpYi5pc01haW5uZXQodHgubmV0d29yaykgPyAnbWFpbm5ldCcgOiAndGVzdG5ldCd9YFxuICAgICAgKSxcbiAgICAgIHRoaXMubm9kZSgndmVyc2lvbicsIHR4LnZlcnNpb24pLFxuICAgICAgdGhpcy5ub2RlKCdsb2NrdGltZScsIHR4LmxvY2t0aW1lKSxcbiAgICAgIHRoaXMubm9kZSgnaGFzV2l0bmVzc2VzJywgdHguaGFzV2l0bmVzc2VzKCkpLFxuICAgICAgLi4udGhpcy5wYXJzZVN0YXR1cyh0eCwgY2hhaW5JbmZvLnN0YXR1cyksXG4gICAgICB0aGlzLm5vZGUoJ3ZzaXplJywgYCR7dnNpemV9dmJ5dGVzICgke3dlaWdodH13dSlgKSxcbiAgICAgIC4uLihmZWUgJiYgZmVlUmF0ZVxuICAgICAgICA/IFt0aGlzLm5vZGUoJ2ZlZSBbYnRjXScsIGZvcm1hdFNhdChmZWUpKSwgdGhpcy5ub2RlKCdmZWVSYXRlIFtzYXQvdmJ5dGVdJywgZmVlUmF0ZS50b0ZpeGVkKDIpKV1cbiAgICAgICAgOiBbXSksXG4gICAgICB0aGlzLm5vZGUoXG4gICAgICAgIGBpbnB1dHNgLFxuICAgICAgICBbU3RyaW5nKHR4Lmlucy5sZW5ndGgpXS5jb25jYXQoaW5wdXRTdW0gPyBbJ3N1bT0nICsgZm9ybWF0U2F0KGlucHV0U3VtKV0gOiBbXSkuam9pbignICcpLFxuICAgICAgICB0aGlzLnBhcnNlSW5zKHR4LmlucywgdHgsIGNoYWluSW5mbylcbiAgICAgICksXG4gICAgICB0aGlzLm5vZGUoXG4gICAgICAgIGBvdXRwdXRzYCxcbiAgICAgICAgW1N0cmluZyh0eC5vdXRzLmxlbmd0aCksICdzdW09JyArIGZvcm1hdFNhdChvdXRwdXRTdW0pXS5qb2luKCcgJyksXG4gICAgICAgIHRoaXMucGFyc2VPdXRzKHR4Lm91dHMsIHR4LCBjaGFpbkluZm8pXG4gICAgICApLFxuICAgIF0pO1xuICB9XG59XG4iXX0=