@witnet/sdk 1.1.5 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/.env_witnet +13 -1
  2. package/dist/package.json +41 -24
  3. package/dist/src/bin/helpers.d.ts +59 -49
  4. package/dist/src/bin/helpers.d.ts.map +1 -1
  5. package/dist/src/bin/helpers.js +228 -229
  6. package/dist/src/index.d.ts +3 -4
  7. package/dist/src/index.d.ts.map +1 -1
  8. package/dist/src/index.js +4 -47
  9. package/dist/src/lib/crypto/account.d.ts +3 -3
  10. package/dist/src/lib/crypto/account.d.ts.map +1 -1
  11. package/dist/src/lib/crypto/account.js +31 -25
  12. package/dist/src/lib/crypto/coinbase.d.ts +4 -4
  13. package/dist/src/lib/crypto/coinbase.d.ts.map +1 -1
  14. package/dist/src/lib/crypto/coinbase.js +8 -13
  15. package/dist/src/lib/crypto/index.d.ts +7 -7
  16. package/dist/src/lib/crypto/index.d.ts.map +1 -1
  17. package/dist/src/lib/crypto/index.js +7 -30
  18. package/dist/src/lib/crypto/interfaces.d.ts +5 -5
  19. package/dist/src/lib/crypto/interfaces.d.ts.map +1 -1
  20. package/dist/src/lib/crypto/interfaces.js +2 -3
  21. package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts +5 -5
  22. package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts.map +1 -1
  23. package/dist/src/lib/crypto/payloads/DataRequestPayload.js +98 -85
  24. package/dist/src/lib/crypto/payloads/StakePayload.d.ts +3 -4
  25. package/dist/src/lib/crypto/payloads/StakePayload.d.ts.map +1 -1
  26. package/dist/src/lib/crypto/payloads/StakePayload.js +81 -71
  27. package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts +4 -5
  28. package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts.map +1 -1
  29. package/dist/src/lib/crypto/payloads/UnstakePayload.js +36 -43
  30. package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts +3 -4
  31. package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts.map +1 -1
  32. package/dist/src/lib/crypto/payloads/ValueTransferPayload.js +46 -48
  33. package/dist/src/lib/crypto/payloads.d.ts +5 -5
  34. package/dist/src/lib/crypto/payloads.d.ts.map +1 -1
  35. package/dist/src/lib/crypto/payloads.js +44 -45
  36. package/dist/src/lib/crypto/signer.d.ts +3 -3
  37. package/dist/src/lib/crypto/signer.d.ts.map +1 -1
  38. package/dist/src/lib/crypto/signer.js +45 -88
  39. package/dist/src/lib/crypto/transmitters/DataRequests.d.ts +6 -6
  40. package/dist/src/lib/crypto/transmitters/DataRequests.d.ts.map +1 -1
  41. package/dist/src/lib/crypto/transmitters/DataRequests.js +6 -10
  42. package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts +5 -5
  43. package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts.map +1 -1
  44. package/dist/src/lib/crypto/transmitters/StakeDeposits.js +7 -11
  45. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts +6 -7
  46. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts.map +1 -1
  47. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.js +9 -13
  48. package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts +5 -5
  49. package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts.map +1 -1
  50. package/dist/src/lib/crypto/transmitters/ValueTransfers.js +6 -10
  51. package/dist/src/lib/crypto/transmitters.d.ts +6 -6
  52. package/dist/src/lib/crypto/transmitters.d.ts.map +1 -1
  53. package/dist/src/lib/crypto/transmitters.js +89 -76
  54. package/dist/src/lib/crypto/types.d.ts +1 -2
  55. package/dist/src/lib/crypto/types.d.ts.map +1 -1
  56. package/dist/src/lib/crypto/types.js +71 -67
  57. package/dist/src/lib/crypto/utils.d.ts +5 -5
  58. package/dist/src/lib/crypto/utils.d.ts.map +1 -1
  59. package/dist/src/lib/crypto/utils.js +48 -66
  60. package/dist/src/lib/crypto/wallet.d.ts +3 -3
  61. package/dist/src/lib/crypto/wallet.d.ts.map +1 -1
  62. package/dist/src/lib/crypto/wallet.js +72 -89
  63. package/dist/src/lib/index.d.ts +5 -4
  64. package/dist/src/lib/index.d.ts.map +1 -1
  65. package/dist/src/lib/index.js +6 -44
  66. package/dist/src/lib/radon/ccdr/eth.d.ts +1 -1
  67. package/dist/src/lib/radon/ccdr/eth.d.ts.map +1 -1
  68. package/dist/src/lib/radon/ccdr/eth.js +95 -83
  69. package/dist/src/lib/radon/ccdr/index.d.ts +2 -2
  70. package/dist/src/lib/radon/ccdr/index.d.ts.map +1 -1
  71. package/dist/src/lib/radon/ccdr/index.js +3 -39
  72. package/dist/src/lib/radon/ccdr/wit.d.ts +2 -2
  73. package/dist/src/lib/radon/ccdr/wit.d.ts.map +1 -1
  74. package/dist/src/lib/radon/ccdr/wit.js +17 -19
  75. package/dist/src/lib/radon/filters.d.ts.map +1 -1
  76. package/dist/src/lib/radon/filters.js +23 -19
  77. package/dist/src/lib/radon/index.d.ts +10 -11
  78. package/dist/src/lib/radon/index.d.ts.map +1 -1
  79. package/dist/src/lib/radon/index.js +205 -187
  80. package/dist/src/lib/radon/reducers.d.ts +2 -2
  81. package/dist/src/lib/radon/reducers.d.ts.map +1 -1
  82. package/dist/src/lib/radon/reducers.js +48 -34
  83. package/dist/src/lib/radon/types.d.ts +2 -2
  84. package/dist/src/lib/radon/types.d.ts.map +1 -1
  85. package/dist/src/lib/radon/types.js +80 -110
  86. package/dist/src/lib/radon/utils.d.ts +3 -3
  87. package/dist/src/lib/radon/utils.d.ts.map +1 -1
  88. package/dist/src/lib/radon/utils.js +49 -52
  89. package/dist/src/lib/rest/kermit.d.ts +20 -0
  90. package/dist/src/lib/rest/kermit.d.ts.map +1 -0
  91. package/dist/src/lib/rest/kermit.js +68 -0
  92. package/dist/src/lib/rest/types.d.ts +5 -0
  93. package/dist/src/lib/rest/types.d.ts.map +1 -0
  94. package/dist/src/lib/rest/types.js +2 -0
  95. package/dist/src/lib/rpc/index.d.ts +2 -2
  96. package/dist/src/lib/rpc/index.d.ts.map +1 -1
  97. package/dist/src/lib/rpc/index.js +3 -19
  98. package/dist/src/lib/rpc/nodes.d.ts +13 -13
  99. package/dist/src/lib/rpc/nodes.d.ts.map +1 -1
  100. package/dist/src/lib/rpc/nodes.js +69 -98
  101. package/dist/src/lib/rpc/provider.d.ts +4 -4
  102. package/dist/src/lib/rpc/provider.d.ts.map +1 -1
  103. package/dist/src/lib/rpc/provider.js +106 -122
  104. package/dist/src/lib/rpc/types.d.ts +2 -2
  105. package/dist/src/lib/rpc/types.d.ts.map +1 -1
  106. package/dist/src/lib/rpc/types.js +13 -16
  107. package/dist/src/lib/types.d.ts +5 -4
  108. package/dist/src/lib/types.d.ts.map +1 -1
  109. package/dist/src/lib/types.js +3 -9
  110. package/dist/src/lib/utils.d.ts +5 -5
  111. package/dist/src/lib/utils.d.ts.map +1 -1
  112. package/dist/src/lib/utils.js +40 -99
  113. package/dist/witnet/assets/index.cjs +6 -0
  114. package/dist/witnet/assets/index.d.cts +29 -0
  115. package/dist/witnet/assets/index.d.cts.map +1 -0
  116. package/dist/witnet/assets/modals/index.cjs +9 -0
  117. package/dist/witnet/assets/modals/index.d.cts +16 -0
  118. package/dist/witnet/assets/modals/index.d.cts.map +1 -0
  119. package/dist/witnet/assets/modals/web3/eth.cjs +23 -0
  120. package/dist/witnet/assets/modals/web3/eth.d.cts +4 -0
  121. package/dist/witnet/assets/modals/web3/eth.d.cts.map +1 -0
  122. package/dist/witnet/assets/modals/web3/ipfs.cjs +18 -0
  123. package/dist/witnet/assets/modals/web3/ipfs.d.cts +3 -0
  124. package/dist/witnet/assets/modals/web3/ipfs.d.cts.map +1 -0
  125. package/dist/witnet/assets/modals/web3/wit.cjs +24 -0
  126. package/dist/witnet/assets/modals/web3/wit.d.cts +3 -0
  127. package/dist/witnet/assets/modals/web3/wit.d.cts.map +1 -0
  128. package/dist/witnet/assets/requests.cjs +43 -0
  129. package/dist/witnet/assets/requests.d.cts +10 -0
  130. package/dist/witnet/assets/requests.d.cts.map +1 -0
  131. package/package.json +41 -24
  132. package/src/bin/bots/watcher.cjs +354 -0
  133. package/src/bin/cli/history.cjs +31 -0
  134. package/src/bin/cli/inspect.js +545 -471
  135. package/src/bin/cli/network.js +658 -557
  136. package/src/bin/cli/nodes.js +392 -332
  137. package/src/bin/cli/radon.js +1071 -844
  138. package/src/bin/cli/wallet.js +1317 -1074
  139. package/src/bin/helpers.js +969 -868
  140. package/src/bin/index.js +329 -0
  141. package/witnet/assets/_index.cjs +5 -0
  142. package/witnet/assets/_requests.cjs +25 -0
  143. package/witnet/assets/_sources.cjs +36 -0
  144. package/witnet/assets/_templates.cjs +36 -0
  145. package/witnet/assets/index.cjs +4 -0
  146. package/witnet/assets/modals/index.cjs +7 -0
  147. package/witnet/assets/modals/web3/eth.cjs +27 -0
  148. package/witnet/assets/modals/web3/ipfs.cjs +22 -0
  149. package/witnet/assets/modals/web3/wit.cjs +28 -0
  150. package/witnet/assets/requests.cjs +49 -0
  151. package/witnet/witnet copy.proto +457 -0
  152. package/witnet/witnet.proto +456 -0
  153. package/witnet/witnet_toolkit-1.6.7-x86_64-pc-windows-msvc.exe +0 -0
  154. package/witnet/witnet_toolkit-1.7.1-x86_64-pc-windows-msvc.exe +0 -0
  155. package/witnet/witnet_toolkit-2.0.0-rc.7-x86_64-pc-windows-msvc.exe +0 -0
  156. package/witnet/witnet_toolkit-2.0.2-x86_64-pc-windows-msvc.exe +0 -0
  157. package/witnet/witnet_toolkit-2.0.21-x86_64-pc-windows-msvc.exe +0 -0
  158. package/witnet/witnet_toolkit-2.0.7-x86_64-pc-windows-msvc.exe +0 -0
  159. package/witnet/witnet_toolkit-2.0.8-x86_64-pc-windows-msvc.exe +0 -0
  160. package/dist/witnet/assets/index.d.ts +0 -29
  161. package/dist/witnet/assets/index.d.ts.map +0 -1
  162. package/dist/witnet/assets/index.js +0 -6
  163. package/dist/witnet/assets/modals/index.d.ts +0 -16
  164. package/dist/witnet/assets/modals/index.d.ts.map +0 -1
  165. package/dist/witnet/assets/modals/index.js +0 -11
  166. package/dist/witnet/assets/modals/web3/eth.d.ts +0 -5
  167. package/dist/witnet/assets/modals/web3/eth.d.ts.map +0 -1
  168. package/dist/witnet/assets/modals/web3/eth.js +0 -26
  169. package/dist/witnet/assets/modals/web3/ipfs.d.ts +0 -4
  170. package/dist/witnet/assets/modals/web3/ipfs.d.ts.map +0 -1
  171. package/dist/witnet/assets/modals/web3/ipfs.js +0 -18
  172. package/dist/witnet/assets/modals/web3/wit.d.ts +0 -4
  173. package/dist/witnet/assets/modals/web3/wit.d.ts.map +0 -1
  174. package/dist/witnet/assets/modals/web3/wit.js +0 -17
  175. package/dist/witnet/assets/requests.d.ts +0 -11
  176. package/dist/witnet/assets/requests.d.ts.map +0 -1
  177. package/dist/witnet/assets/requests.js +0 -43
  178. package/src/bin/cli/history.js +0 -31
  179. package/src/bin/postinstall.js +0 -9
  180. package/src/bin/toolkit.js +0 -290
  181. package/witnet/assets/_index.js +0 -8
  182. package/witnet/assets/_requests.js +0 -25
  183. package/witnet/assets/_sources.js +0 -36
  184. package/witnet/assets/_templates.js +0 -36
  185. package/witnet/assets/index.js +0 -4
  186. package/witnet/assets/modals/index.js +0 -9
  187. package/witnet/assets/modals/web3/eth.js +0 -29
  188. package/witnet/assets/modals/web3/ipfs.js +0 -22
  189. package/witnet/assets/modals/web3/wit.js +0 -21
  190. package/witnet/assets/requests.js +0 -49
  191. /package/witnet/assets/modals/web3/{btc.js → btc.cjs} +0 -0
  192. /package/witnet/assets/modals/web3/{sol.js → sol.cjs} +0 -0
@@ -1,57 +1,25 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.types = exports.retrievals = exports.reducers = exports.filters = exports.RadonRetrieval = exports.RadonModal = exports.RadonTemplate = exports.RadonRequest = void 0;
40
- exports.RadonRequestFromAssets = RadonRequestFromAssets;
41
- exports.RadonScript = RadonScript;
42
- const cbor_1 = require("cbor");
43
- const graphql_query_compress_1 = __importDefault(require("graphql-query-compress"));
44
- const protoBuf = require("protobufjs").Root.fromJSON(require("../../../witnet/witnet.proto.json"));
45
- const RADRequest = protoBuf.lookupType("RADRequest");
46
- const helpers_1 = require("../../bin/helpers");
47
- const utils_1 = require("../crypto/utils");
48
- const utils_2 = require("./utils");
49
- const filters_1 = require("./filters");
50
- const reducers_1 = require("./reducers");
51
- const types_1 = require("./types");
1
+ import { createRequire } from "node:module";
2
+ import cbor from "cbor";
3
+ import graphQlCompress from "graphql-query-compress";
4
+ const require = createRequire(import.meta.url);
5
+ import protobuf from "protobufjs";
6
+ const { Root: ProtoRoot } = protobuf;
7
+ const protoRoot = ProtoRoot.fromJSON(require("../../../witnet/witnet.proto.json"));
8
+ const RADRequest = protoRoot.lookupType("RADRequest");
9
+ import { execRadonBytecode, fromHexString, getWildcardsCountFromString, isHexString, isWildcard, parseURL, replaceWildcards, spliceWildcard, toHexString, toUtf8Array, utf8ArrayToStr, } from "../../bin/helpers.js";
10
+ import { sha256 } from "../crypto/utils.js";
11
+ import { Opcodes as Filters, RadonFilter } from "./filters.js";
12
+ import { RadonReducer, Opcodes as Reducers } from "./reducers.js";
13
+ import { RadonArray as _RadonArray, RadonBoolean as _RadonBoolean, RadonBytes as _RadonBytes, RadonEncodings as _RadonEncodings, RadonFloat as _RadonFloat, RadonInteger as _RadonInteger, RadonMap as _RadonMap, RadonScript as _RadonScript, RadonString as _RadonString, } from "./types.js";
14
+ import { parseRadonScript } from "./utils.js";
52
15
  class RadonArtifact {
16
+ sources;
17
+ sourcesReducer;
18
+ witnessReducer;
53
19
  constructor(specs) {
54
- if (!specs.sources || !Array.isArray(specs.sources) || specs.sources.length == 0) {
20
+ if (!specs.sources ||
21
+ !Array.isArray(specs.sources) ||
22
+ specs.sources.length === 0) {
55
23
  throw TypeError("RadonArtifact: cannot build if no retrievals are passed");
56
24
  }
57
25
  specs.sources?.forEach((retrieval, index) => {
@@ -67,12 +35,14 @@ class RadonArtifact {
67
35
  this.witnessReducer = specs.witnessReducer;
68
36
  }
69
37
  opsCount() {
70
- return (this.sources?.map(retrieval => retrieval.opsCount()).reduce((sum, a) => sum + a) || 0)
71
- + this.sourcesReducer?.opsCount()
72
- + this.witnessReducer?.opsCount();
38
+ return ((this.sources
39
+ ?.map((retrieval) => retrieval.opsCount())
40
+ .reduce((sum, a) => sum + a) || 0) +
41
+ this.sourcesReducer?.opsCount() +
42
+ this.witnessReducer?.opsCount());
73
43
  }
74
44
  }
75
- class RadonRequest extends RadonArtifact {
45
+ export class RadonRequest extends RadonArtifact {
76
46
  /**
77
47
  * Decodes a RadonRequest artifact out from a Protobuf-serialized bytecode.
78
48
  * @param bytecode Radon request bytecode.
@@ -80,8 +50,8 @@ class RadonRequest extends RadonArtifact {
80
50
  */
81
51
  static fromBytecode(bytecode) {
82
52
  let buffer;
83
- if ((0, helpers_1.isHexString)(bytecode)) {
84
- buffer = (0, helpers_1.fromHexString)(bytecode);
53
+ if (isHexString(bytecode)) {
54
+ buffer = fromHexString(bytecode);
85
55
  }
86
56
  else if (bytecode instanceof Uint8Array) {
87
57
  buffer = Buffer.from(bytecode);
@@ -109,37 +79,41 @@ class RadonRequest extends RadonArtifact {
109
79
  if (retrieval?.headers) {
110
80
  specs.headers = Object.fromEntries(retrieval.headers.map((stringPair) => [
111
81
  stringPair.left,
112
- stringPair.right
82
+ stringPair.right,
113
83
  ]));
114
84
  }
115
85
  if (retrieval?.body && retrieval.body.length > 0) {
116
- specs.body = (0, helpers_1.utf8ArrayToStr)(Object.values(retrieval.body));
86
+ specs.body = utf8ArrayToStr(Object.values(retrieval.body));
117
87
  }
118
88
  if (retrieval?.script)
119
- specs.script = (0, utils_2.parseRadonScript)((0, helpers_1.toHexString)(retrieval.script));
89
+ specs.script = parseRadonScript(toHexString(retrieval.script));
120
90
  specs.method = retrieval.kind;
121
91
  return new RadonRetrieval(specs);
122
92
  });
123
93
  const decodeFilter = (f) => {
124
94
  if (f?.args && f.args.length > 0)
125
- return new filters_1.RadonFilter(f.op, (0, cbor_1.decode)(Uint8Array.from(f.args)));
95
+ return new RadonFilter(f.op, cbor.decode(Uint8Array.from(f.args)));
126
96
  else
127
- return new filters_1.RadonFilter(f.op);
97
+ return new RadonFilter(f.op);
128
98
  };
129
99
  return new RadonRequest({
130
100
  sources,
131
- sourcesReducer: new reducers_1.RadonReducer(obj.aggregate.reducer, obj.aggregate.filters?.map(decodeFilter)),
132
- witnessReducer: new reducers_1.RadonReducer(obj.tally.reducer, obj.tally.filters?.map(decodeFilter))
101
+ sourcesReducer: new RadonReducer(obj.aggregate.reducer, obj.aggregate.filters?.map(decodeFilter)),
102
+ witnessReducer: new RadonReducer(obj.tally.reducer, obj.tally.filters?.map(decodeFilter)),
133
103
  });
134
104
  }
135
105
  constructor(specs) {
136
- const sources = Array.isArray(specs.sources) ? specs.sources : [specs.sources];
106
+ const sources = Array.isArray(specs.sources)
107
+ ? specs.sources
108
+ : [specs.sources];
137
109
  super({
138
110
  sources,
139
111
  sourcesReducer: specs?.sourcesReducer || reducers.Mode(),
140
112
  witnessReducer: specs?.witnessReducer || reducers.Mode(),
141
113
  });
142
- let argsCount = sources.map(retrieval => retrieval.argsCount).reduce((prev, curr) => prev + curr);
114
+ const argsCount = sources
115
+ .map((retrieval) => retrieval.argsCount)
116
+ .reduce((prev, curr) => prev + curr);
143
117
  if (argsCount > 0) {
144
118
  throw TypeError("RadonRequest: parameterized retrievals were passed");
145
119
  }
@@ -152,28 +126,28 @@ class RadonRequest extends RadonArtifact {
152
126
  }
153
127
  else {
154
128
  const message = RADRequest.fromObject(payload);
155
- return RADRequest.encode(message).finish();
129
+ return Buffer.from(RADRequest.encode(message).finish());
156
130
  }
157
131
  }
158
132
  async execDryRun(verbose = false) {
159
- return (await (0, helpers_1.execRadonBytecode)(this.toBytecode(), '--json', verbose ? '--verbose' : '')).trim();
133
+ return (await execRadonBytecode(this.toBytecode(), "--json", verbose ? "--verbose" : "")).trim();
160
134
  }
161
135
  get dataType() {
162
- return (this.sources[0].method === retrievals.Methods.RNG
136
+ return this.sources[0].method === retrievals.Methods.RNG
163
137
  ? "RadonBytes"
164
- : (this.sources && this.sources[0] && this.sources[0].script && this.sources[0].script.outputType
138
+ : this.sources?.[0]?.script?.outputType
165
139
  ? this.sources[0].script.outputType.constructor.name
166
- : "RadonAny"));
140
+ : "RadonAny";
167
141
  }
168
142
  get radHash() {
169
- return (0, helpers_1.toHexString)((0, utils_1.sha256)(this._encode()), false);
143
+ return toHexString(sha256(this._encode()), false);
170
144
  }
171
145
  toBytecode() {
172
- return (0, helpers_1.toHexString)(this._encode()); //encodeRADRequest(this.toProtobuf()), true)
146
+ return toHexString(this._encode()); //encodeRADRequest(this.toProtobuf()), true)
173
147
  }
174
148
  toJSON(humanize) {
175
149
  return {
176
- retrieve: this.sources.map(retrieval => retrieval.toJSON(humanize)),
150
+ retrieve: this.sources.map((retrieval) => retrieval.toJSON(humanize)),
177
151
  aggregate: this.sourcesReducer.toJSON(humanize),
178
152
  tally: this.witnessReducer.toJSON(humanize),
179
153
  ...(humanize ? {} : { time_lock: 0 }),
@@ -182,7 +156,7 @@ class RadonRequest extends RadonArtifact {
182
156
  toProtobuf() {
183
157
  return {
184
158
  //timeLock: 0,
185
- retrieve: this.sources.map(retrieval => retrieval.toProtobuf()),
159
+ retrieve: this.sources.map((retrieval) => retrieval.toProtobuf()),
186
160
  aggregate: this.sourcesReducer.toProtobuf(),
187
161
  tally: this.witnessReducer.toProtobuf(),
188
162
  };
@@ -191,12 +165,11 @@ class RadonRequest extends RadonArtifact {
191
165
  return this.toBytecode().slice(2).length / 2;
192
166
  }
193
167
  }
194
- exports.RadonRequest = RadonRequest;
195
- function RadonRequestFromAssets(specs) {
168
+ export function RadonRequestFromAssets(specs) {
196
169
  const sources = [];
197
170
  const dict = retrievals.fromRadonAssets(specs.assets);
198
171
  // const args: string[][] = []
199
- Object.keys(specs.argsMap).forEach(key => {
172
+ Object.keys(specs.argsMap).forEach((key) => {
200
173
  const retrieval = dict[key];
201
174
  const args = specs.argsMap[key];
202
175
  if (retrieval.argsCount > 0) {
@@ -211,29 +184,39 @@ function RadonRequestFromAssets(specs) {
211
184
  sources.push(retrieval);
212
185
  }
213
186
  });
214
- return new RadonRequest({ sources, sourcesReducer: specs?.sourcesReducer, witnessReducer: specs?.witnessReducer });
187
+ return new RadonRequest({
188
+ sources,
189
+ sourcesReducer: specs?.sourcesReducer,
190
+ witnessReducer: specs?.witnessReducer,
191
+ });
215
192
  }
216
- ;
217
- function RadonScript(inputType) {
193
+ export function RadonScript(inputType) {
218
194
  if (!inputType)
219
195
  throw TypeError("Input Radon data type must be specified when declaring a new Radon script.");
220
196
  return new inputType();
221
197
  }
222
- class RadonTemplate extends RadonArtifact {
198
+ export class RadonTemplate extends RadonArtifact {
199
+ _argsCount;
200
+ homogeneous;
201
+ samples;
223
202
  constructor(specs, samples) {
224
- const sources = Array.isArray(specs.sources) ? specs.sources : [specs.sources];
203
+ const sources = Array.isArray(specs.sources)
204
+ ? specs.sources
205
+ : [specs.sources];
225
206
  super({
226
207
  sources,
227
208
  sourcesReducer: specs?.sourcesReducer || reducers.Mode(),
228
209
  witnessReducer: specs?.witnessReducer || reducers.Mode(),
229
210
  });
230
- this._argsCount = sources.map(retrieval => retrieval?.argsCount).reduce((prev, curr) => Math.max(prev, curr), 0);
231
- if (this._argsCount == 0) {
211
+ this._argsCount = sources
212
+ .map((retrieval) => retrieval?.argsCount)
213
+ .reduce((prev, curr) => Math.max(prev, curr), 0);
214
+ if (this._argsCount === 0) {
232
215
  throw TypeError("RadonTemplate: no parameterized retrievals were passed");
233
216
  }
234
- this.homogeneous = !sources.find(retrieval => retrieval.argsCount !== this._argsCount);
217
+ this.homogeneous = !sources.find((retrieval) => retrieval.argsCount !== this._argsCount);
235
218
  if (samples) {
236
- Object.keys(samples).forEach(sample => {
219
+ Object.keys(samples).forEach((sample) => {
237
220
  let sampleArgs = Object(samples)[sample];
238
221
  if (typeof sampleArgs === "string") {
239
222
  sampleArgs = [sampleArgs];
@@ -243,7 +226,7 @@ class RadonTemplate extends RadonArtifact {
243
226
  Object(samples)[sample] = Array(sources.length).fill(sampleArgs);
244
227
  sampleArgs = Object(samples)[sample];
245
228
  }
246
- else if (sampleArgs?.length != sources.length) {
229
+ else if (sampleArgs?.length !== sources.length) {
247
230
  throw TypeError(`RadonTemplate: arguments mismatch in sample "${sample}": ${sampleArgs?.length} samples given vs. ${sources.length} expected`);
248
231
  }
249
232
  sampleArgs?.forEach((subargs, index) => {
@@ -262,7 +245,7 @@ class RadonTemplate extends RadonArtifact {
262
245
  buildRadonRequest(args) {
263
246
  const sources = [];
264
247
  if (this.homogeneous) {
265
- // args can be either any, string[] or string[0][]
248
+ // args can be either any, string[] or string[0][]
266
249
  if (Array.isArray(args) && args[0] && Array.isArray(args[0])) {
267
250
  if (args.length > 1) {
268
251
  throw new TypeError(`RadonTemplate: homogeneous template: args vector dimension ${args.length} > 1.`);
@@ -272,14 +255,15 @@ class RadonTemplate extends RadonArtifact {
272
255
  else if (Array.isArray(args) && args.length !== this.argsCount) {
273
256
  throw new TypeError(`RadonTemplate: homogenous template: missing ${this.argsCount - args.length} out of ${args.length} parameters.`);
274
257
  }
275
- this.sources.forEach(retrieval => sources.push(retrieval.foldArgs(args)));
258
+ this.sources.forEach((retrieval) => sources.push(retrieval.foldArgs(args)));
276
259
  }
277
260
  else {
278
261
  if (!Array.isArray(args) || args.length !== this.sources.length) {
279
262
  throw new TypeError(`RadonTemplate: args vector dimension ${args.length} != ${this.sources.length}`);
280
263
  }
281
264
  this.sources.forEach((retrieval, index) => {
282
- if (Array.isArray(args[index]) && retrieval.argsCount !== args[index].length) {
265
+ if (Array.isArray(args[index]) &&
266
+ retrieval.argsCount !== args[index].length) {
283
267
  throw new TypeError(`RadonTemplate: retrieval #${index + 1}: mismatching args count: ${args[index].length} != ${retrieval.argsCount} ([${args[index]})]`);
284
268
  }
285
269
  sources.push(retrieval.foldArgs(args[index]));
@@ -292,8 +276,8 @@ class RadonTemplate extends RadonArtifact {
292
276
  });
293
277
  }
294
278
  }
295
- exports.RadonTemplate = RadonTemplate;
296
- class RadonModal extends RadonTemplate {
279
+ export class RadonModal extends RadonTemplate {
280
+ _providers;
297
281
  constructor(specs) {
298
282
  if (!specs.retrieval.isModal()) {
299
283
  throw TypeError("RadonModal: no modal retrieval was passed.");
@@ -311,8 +295,10 @@ class RadonModal extends RadonTemplate {
311
295
  }
312
296
  }
313
297
  get argsCount() {
314
- const _providersArgsCount = Math.max(...this.providers.map(url => (0, helpers_1.getWildcardsCountFromString)(url)));
315
- return _providersArgsCount > 0 ? Math.max(this._argsCount, _providersArgsCount) : this._argsCount;
298
+ const _providersArgsCount = Math.max(...this.providers.map((url) => getWildcardsCountFromString(url)));
299
+ return _providersArgsCount > 0
300
+ ? Math.max(this._argsCount, _providersArgsCount)
301
+ : this._argsCount;
316
302
  }
317
303
  get providers() {
318
304
  return this._providers;
@@ -325,9 +311,9 @@ class RadonModal extends RadonTemplate {
325
311
  throw new TypeError(`RadonModal: no providers were previously settled.`);
326
312
  }
327
313
  const template = this.buildRadonTemplate(this.providers);
328
- return (template.homogeneous
314
+ return template.homogeneous
329
315
  ? template.buildRadonRequest(args)
330
- : template.buildRadonRequest(template.sources.map(source => args.slice(0, source.argsCount))));
316
+ : template.buildRadonRequest(template.sources.map((source) => args.slice(0, source.argsCount)));
331
317
  }
332
318
  buildRadonTemplate(providers) {
333
319
  if (!providers) {
@@ -346,8 +332,8 @@ class RadonModal extends RadonTemplate {
346
332
  });
347
333
  }
348
334
  _checkProviders(providers) {
349
- providers.forEach(provider => {
350
- const [schema,] = (0, helpers_1.parseURL)(provider);
335
+ providers.forEach((provider) => {
336
+ const [schema] = parseURL(provider);
351
337
  if (!schema.startsWith("http://") && !schema.startsWith("https://")) {
352
338
  throw TypeError(`RadonModal: invalid provider: ${provider}`);
353
339
  }
@@ -355,23 +341,35 @@ class RadonModal extends RadonTemplate {
355
341
  return providers;
356
342
  }
357
343
  }
358
- exports.RadonModal = RadonModal;
359
- class RadonRetrieval {
344
+ export class RadonRetrieval {
345
+ argsKeys;
346
+ argsCount;
347
+ method;
348
+ authority;
349
+ body;
350
+ headers;
351
+ path;
352
+ query;
353
+ schema;
354
+ script;
355
+ url;
356
+ samples;
360
357
  constructor(specs, samples) {
361
- if (specs.method === retrievals.Methods.RNG && (specs?.url || specs?.headers?.size || specs?.body)) {
358
+ if (specs.method === retrievals.Methods.RNG &&
359
+ (specs?.url || specs?.headers?.size || specs?.body)) {
362
360
  throw TypeError("RadonRetrieval: RNG accepts no URLs or headers");
363
361
  // } else if (!specs?.url && (method == Methods.HttpPost || method == Methods.HttpGet)) {
364
362
  // throw TypeError("RadonRetrieval: URL must be specified");
365
363
  }
366
- else if (specs?.body && specs.method == retrievals.Methods.HttpGet) {
364
+ else if (specs?.body && specs.method === retrievals.Methods.HttpGet) {
367
365
  throw TypeError("RadonRetrieval: body cannot be specified in HTTP-GET queries");
368
366
  }
369
367
  this.method = specs.method;
370
368
  if (specs?.url) {
371
369
  this.url = specs.url;
372
- if (!(0, helpers_1.isWildcard)(specs.url)) {
370
+ if (!isWildcard(specs.url)) {
373
371
  try {
374
- let parts = (0, helpers_1.parseURL)(specs.url);
372
+ const parts = parseURL(specs.url);
375
373
  this.schema = parts[0];
376
374
  if (parts[1] !== "")
377
375
  this.authority = parts[1];
@@ -383,21 +381,21 @@ class RadonRetrieval {
383
381
  catch { }
384
382
  }
385
383
  }
386
- else if (specs.method === retrievals.Methods.HttpGet
387
- || specs.method === retrievals.Methods.HttpPost
388
- || specs.method === retrievals.Methods.HttpHead) {
384
+ else if (specs.method === retrievals.Methods.HttpGet ||
385
+ specs.method === retrievals.Methods.HttpPost ||
386
+ specs.method === retrievals.Methods.HttpHead) {
389
387
  this.url = "\\0\\";
390
388
  }
391
389
  if (specs?.headers) {
392
- if (typeof specs.headers !== 'object' || Array.isArray(specs.headers)) {
390
+ if (typeof specs.headers !== "object" || Array.isArray(specs.headers)) {
393
391
  throw new TypeError("RadonRetrieval: HTTP headers must be of type Record<string, string>");
394
392
  }
395
393
  this.headers = specs?.headers;
396
394
  }
397
395
  this.body = specs?.body;
398
396
  if (specs?.script)
399
- this.script = new types_1.RadonScript(specs?.script);
400
- this.argsCount = Math.max((0, helpers_1.getWildcardsCountFromString)(this?.url), (0, helpers_1.getWildcardsCountFromString)(this?.body), ...Object.keys(this?.headers || {}).map(key => (0, helpers_1.getWildcardsCountFromString)(key)) ?? [], ...Object.values(this?.headers || {}).map(value => (0, helpers_1.getWildcardsCountFromString)(value)) ?? [], this.script?.argsCount() || 0);
397
+ this.script = new _RadonScript(specs?.script);
398
+ this.argsCount = Math.max(getWildcardsCountFromString(this?.url), getWildcardsCountFromString(this?.body), ...(Object.keys(this?.headers || {}).map((key) => getWildcardsCountFromString(key)) ?? []), ...(Object.values(this?.headers || {}).map((value) => getWildcardsCountFromString(value)) ?? []), this.script?.argsCount() || 0);
401
399
  if (samples && this.argsCount === 0) {
402
400
  throw new TypeError("RadonRetrieval: passed samples to non-parameterized retrieval.");
403
401
  }
@@ -413,7 +411,8 @@ class RadonRetrieval {
413
411
  }
414
412
  }
415
413
  isModal() {
416
- return this.method !== retrievals.Methods.RNG && (!this.url || this.url === "\\0\\");
414
+ return (this.method !== retrievals.Methods.RNG &&
415
+ (!this.url || this.url === "\\0\\"));
417
416
  }
418
417
  isParameterized() {
419
418
  return this.argsCount > 0;
@@ -433,12 +432,12 @@ class RadonRetrieval {
433
432
  }
434
433
  params.push(...args);
435
434
  }
436
- else if (typeof args === 'object') {
435
+ else if (typeof args === "object") {
437
436
  if (!this.argsKeys) {
438
437
  throw new TypeError(`RadonRetrieval: unexpected args map: undefined args keys.`);
439
438
  }
440
439
  else {
441
- this.argsKeys.forEach(key => {
440
+ this.argsKeys.forEach((key) => {
442
441
  if (!args[key]) {
443
442
  throw new TypeError(`RadonRetrieval: missing value for parameter "${key}".`);
444
443
  }
@@ -451,11 +450,11 @@ class RadonRetrieval {
451
450
  }
452
451
  return new RadonRetrieval({
453
452
  method: this.method,
454
- url: (0, helpers_1.replaceWildcards)(this.url, params),
455
- body: (0, helpers_1.replaceWildcards)(this.body, params),
453
+ url: replaceWildcards(this.url, params),
454
+ body: replaceWildcards(this.body, params),
456
455
  headers: Object.fromEntries(Object.entries(this.headers || {}).map(([key, value]) => [
457
- (0, helpers_1.replaceWildcards)(key, params),
458
- (0, helpers_1.replaceWildcards)(value, params),
456
+ replaceWildcards(key, params),
457
+ replaceWildcards(value, params),
459
458
  ])),
460
459
  script: this.script?.replaceWildcards(...params),
461
460
  });
@@ -467,7 +466,7 @@ class RadonRetrieval {
467
466
  spawnRetrievals(...values) {
468
467
  const _spawned = [];
469
468
  if (this.isModal()) {
470
- values.forEach(url => {
469
+ values.forEach((url) => {
471
470
  _spawned.push(new RadonRetrieval({
472
471
  argsKeys: this.argsKeys,
473
472
  body: this.body,
@@ -479,17 +478,17 @@ class RadonRetrieval {
479
478
  });
480
479
  }
481
480
  else {
482
- if (this.argsCount == 0) {
481
+ if (this.argsCount === 0) {
483
482
  throw new TypeError(`RadonRetrieval: cannot spawn from unparameterized retrieval`);
484
483
  }
485
- values.forEach(value => {
484
+ values.forEach((value) => {
486
485
  _spawned.push(new RadonRetrieval({
487
486
  method: this.method,
488
- url: (0, helpers_1.spliceWildcard)(this.url, 0, value, this.argsCount),
489
- body: (0, helpers_1.spliceWildcard)(this.body, 0, value, this.argsCount),
487
+ url: spliceWildcard(this.url, 0, value, this.argsCount),
488
+ body: spliceWildcard(this.body, 0, value, this.argsCount),
490
489
  headers: Object.fromEntries(Object.entries(this.headers || {}).map(([headerKey, headerValue]) => [
491
- (0, helpers_1.spliceWildcard)(headerKey, 0, value, this.argsCount),
492
- (0, helpers_1.spliceWildcard)(headerValue, 0, value, this.argsCount),
490
+ spliceWildcard(headerKey, 0, value, this.argsCount),
491
+ spliceWildcard(headerValue, 0, value, this.argsCount),
493
492
  ])),
494
493
  script: this.script?.spliceWildcard(0, value),
495
494
  argsKeys: this.argsKeys?.slice(1),
@@ -500,8 +499,8 @@ class RadonRetrieval {
500
499
  }
501
500
  toJSON(humanize) {
502
501
  const kind = ["", "HTTP-GET", "RNG", "HTTP-POST", "HTTP-HEAD"];
503
- let json = {
504
- kind: kind[this.method] // humanize ? Methods[this.method] : this.method,
502
+ const json = {
503
+ kind: kind[this.method], // humanize ? Methods[this.method] : this.method,
505
504
  };
506
505
  if (this.url)
507
506
  json.url = this.url;
@@ -509,18 +508,20 @@ class RadonRetrieval {
509
508
  json.headers = Object.entries(this.headers);
510
509
  }
511
510
  if (this.body) {
512
- if (typeof this.body === 'string') {
513
- json.body = humanize ? this.body : (0, helpers_1.toUtf8Array)(this.body);
511
+ if (typeof this.body === "string") {
512
+ json.body = humanize ? this.body : toUtf8Array(this.body);
514
513
  }
515
514
  else {
516
515
  json.body = this.body;
517
516
  }
518
517
  }
519
- json.script = humanize ? this.script?.toString() : Array.from((0, helpers_1.fromHexString)(this.script?.toBytecode() || '0x80'));
518
+ json.script = humanize
519
+ ? this.script?.toString()
520
+ : Array.from(fromHexString(this.script?.toBytecode() || "0x80"));
520
521
  return json;
521
522
  }
522
523
  toProtobuf() {
523
- let protobuf = {
524
+ const protobuf = {
524
525
  kind: this.method,
525
526
  };
526
527
  if (this.url)
@@ -534,50 +535,71 @@ class RadonRetrieval {
534
535
  });
535
536
  }
536
537
  if (this.body) {
537
- const utf8Array = (0, helpers_1.toUtf8Array)(this.body);
538
+ const utf8Array = toUtf8Array(this.body);
538
539
  protobuf.body = utf8Array;
539
540
  }
540
- protobuf.script = Object.values(Uint8Array.from((0, cbor_1.encode)(this.script?.encode() || [])));
541
+ protobuf.script = Object.values(Uint8Array.from(cbor.encode(this.script?.encode() || [])));
541
542
  return protobuf;
542
543
  }
543
544
  opsCount() {
544
545
  return this._countOps(this.script?.encode() || []);
545
546
  }
546
547
  _countOps(items) {
547
- return items.length > 0 ? items.map(item => Array.isArray(item) ? this._countOps(item) : 1).reduce((sum, a) => sum + a) : 0;
548
+ return items.length > 0
549
+ ? items
550
+ .map((item) => (Array.isArray(item) ? this._countOps(item) : 1))
551
+ .reduce((sum, a) => sum + a)
552
+ : 0;
548
553
  }
549
554
  }
550
- exports.RadonRetrieval = RadonRetrieval;
551
- var filters;
555
+ export var filters;
552
556
  (function (filters) {
553
- filters.Opcodes = filters_1.Opcodes;
554
- filters.Class = filters_1.RadonFilter;
555
- function Mode() { return new filters_1.RadonFilter(filters_1.Opcodes.Mode); }
557
+ filters.Opcodes = Filters;
558
+ filters.Class = RadonFilter;
559
+ function Mode() {
560
+ return new RadonFilter(Filters.Mode);
561
+ }
556
562
  filters.Mode = Mode;
557
- function Stdev(stdev) { return new filters_1.RadonFilter(filters_1.Opcodes.StandardDeviation, stdev); }
563
+ function Stdev(stdev) {
564
+ return new RadonFilter(Filters.StandardDeviation, stdev);
565
+ }
558
566
  filters.Stdev = Stdev;
559
- })(filters || (exports.filters = filters = {}));
560
- var reducers;
567
+ })(filters || (filters = {}));
568
+ export var reducers;
561
569
  (function (reducers) {
562
- reducers.Opcodes = reducers_1.Opcodes;
563
- reducers.Class = reducers_1.RadonReducer;
564
- function Mode(...filters) { return new reducers_1.RadonReducer(reducers_1.Opcodes.Mode, filters); }
570
+ reducers.Opcodes = Reducers;
571
+ reducers.Class = RadonReducer;
572
+ function Mode(...filters) {
573
+ return new RadonReducer(Reducers.Mode, filters);
574
+ }
565
575
  reducers.Mode = Mode;
566
- function Mean(...filters) { return new reducers_1.RadonReducer(reducers_1.Opcodes.MeanAverage, filters); }
576
+ function Mean(...filters) {
577
+ return new RadonReducer(Reducers.MeanAverage, filters);
578
+ }
567
579
  reducers.Mean = Mean;
568
- function Median(...filters) { return new reducers_1.RadonReducer(reducers_1.Opcodes.MedianAverage, filters); }
580
+ function Median(...filters) {
581
+ return new RadonReducer(Reducers.MedianAverage, filters);
582
+ }
569
583
  reducers.Median = Median;
570
- function Stdev(...filters) { return new reducers_1.RadonReducer(reducers_1.Opcodes.StandardDeviation, filters); }
584
+ function Stdev(...filters) {
585
+ return new RadonReducer(Reducers.StandardDeviation, filters);
586
+ }
571
587
  reducers.Stdev = Stdev;
572
- function ConcatHash(...filters) { return new reducers_1.RadonReducer(reducers_1.Opcodes.ConcatenateAndHash, filters); }
588
+ function ConcatHash(...filters) {
589
+ return new RadonReducer(Reducers.ConcatenateAndHash, filters);
590
+ }
573
591
  reducers.ConcatHash = ConcatHash;
574
- function PriceAggregate() { return new reducers_1.RadonReducer(reducers_1.Opcodes.MeanAverage, [filters.Stdev(1.4)]); }
592
+ function PriceAggregate() {
593
+ return new RadonReducer(Reducers.MeanAverage, [filters.Stdev(1.4)]);
594
+ }
575
595
  reducers.PriceAggregate = PriceAggregate;
576
- function PriceTally() { return new reducers_1.RadonReducer(reducers_1.Opcodes.MeanAverage, [filters.Stdev(2.5)]); }
596
+ function PriceTally() {
597
+ return new RadonReducer(Reducers.MeanAverage, [filters.Stdev(2.5)]);
598
+ }
577
599
  reducers.PriceTally = PriceTally;
578
- })(reducers || (exports.reducers = reducers = {}));
579
- const ccdr = __importStar(require("./ccdr"));
580
- var retrievals;
600
+ })(reducers || (reducers = {}));
601
+ import * as ccdr from "./ccdr/index.js";
602
+ export var retrievals;
581
603
  (function (retrievals) {
582
604
  retrievals.rpc = ccdr;
583
605
  function fromRadonAssets(assets) {
@@ -596,20 +618,20 @@ var retrievals;
596
618
  * Creates a Witnet randomness data source object.
597
619
  * @param script (Optional) Radon Script to apply to the random seed proposed by every single witness,
598
620
  * before aggregation.
599
- **/
621
+ **/
600
622
  function RNG(script) {
601
623
  const retrieval = new RadonRetrieval({ method: Methods.RNG, script });
602
- if (retrieval?.script && retrieval?.script?.inputType?.constructor.name !== "RadonBytes") {
624
+ if (retrieval?.script &&
625
+ retrieval?.script?.inputType?.constructor.name !== "RadonBytes") {
603
626
  throw new TypeError("RNG scripts require [RadonBytes] as input type");
604
627
  }
605
628
  return retrieval;
606
629
  }
607
630
  retrievals.RNG = RNG;
608
- ;
609
631
  /**
610
632
  * Creates a HTTP/GET data retrieval object.
611
633
  * @param specs Radon Retrieval specs.
612
- **/
634
+ **/
613
635
  function HttpGet(specs) {
614
636
  return new RadonRetrieval({
615
637
  method: Methods.HttpGet,
@@ -620,11 +642,10 @@ var retrievals;
620
642
  }, specs?.samples);
621
643
  }
622
644
  retrievals.HttpGet = HttpGet;
623
- ;
624
645
  /**
625
646
  * Creates a HTTP/HEAD data retrieval object.
626
647
  * @param specs Radon Retrieval specs.
627
- **/
648
+ **/
628
649
  function HttpHead(specs) {
629
650
  return new RadonRetrieval({
630
651
  method: Methods.HttpHead,
@@ -635,11 +656,10 @@ var retrievals;
635
656
  }, specs?.samples);
636
657
  }
637
658
  retrievals.HttpHead = HttpHead;
638
- ;
639
659
  /**
640
660
  * Creates a HTTP/POST data retrieval object.
641
661
  * @param specs Radon Retrieval specs.
642
- **/
662
+ **/
643
663
  function HttpPost(specs) {
644
664
  return new RadonRetrieval({
645
665
  method: Methods.HttpPost,
@@ -651,27 +671,25 @@ var retrievals;
651
671
  }, specs?.samples);
652
672
  }
653
673
  retrievals.HttpPost = HttpPost;
654
- ;
655
674
  /**
656
675
  * Creates a GraphQL-query data source object.
657
676
  * @param specs Radon Retrieval specs.
658
- **/
677
+ **/
659
678
  function GraphQLQuery(specs) {
660
679
  return new RadonRetrieval({
661
680
  method: Methods.HttpPost,
662
681
  url: specs.url,
663
- body: `{\"query\":\"${(0, graphql_query_compress_1.default)(specs.query).replaceAll('"', '\\"')}\"}`,
682
+ body: `{"query":"${graphQlCompress(specs.query).replaceAll('"', '\\"')}"}`,
664
683
  headers: { "Content-Type": "application/json;charset=UTF-8" },
665
684
  script: specs?.script,
666
685
  argsKeys: specs?.argsKeys,
667
686
  }, specs?.samples);
668
687
  }
669
688
  retrievals.GraphQLQuery = GraphQLQuery;
670
- ;
671
689
  /**
672
690
  * Creates a JSON-RPC data retrieval object.
673
691
  * @param specs Radon Retrieval specs.
674
- **/
692
+ **/
675
693
  function JsonRPC(specs) {
676
694
  return new RadonRetrieval({
677
695
  method: retrievals.Methods.HttpPost,
@@ -680,52 +698,52 @@ var retrievals;
680
698
  method: specs.rpc.method,
681
699
  params: specs.rpc?.params,
682
700
  id: 1,
683
- }).replaceAll('\\\\', '\\'),
701
+ }).replaceAll("\\\\", "\\"),
684
702
  headers: { "Content-Type": "application/json;charset=UTF-8" },
685
703
  script: specs?.script,
686
704
  argsKeys: specs?.argsKeys,
687
705
  }, specs?.samples);
688
706
  }
689
707
  retrievals.JsonRPC = JsonRPC;
690
- })(retrievals || (exports.retrievals = retrievals = {}));
691
- var types;
708
+ })(retrievals || (retrievals = {}));
709
+ export var types;
692
710
  (function (types) {
693
- types.RadonArray = types_1.RadonArray;
694
- types.RadonBoolean = types_1.RadonBoolean;
695
- types.RadonBytes = types_1.RadonBytes;
696
- types.RadonFloat = types_1.RadonFloat;
697
- types.RadonInteger = types_1.RadonInteger;
698
- types.RadonMap = types_1.RadonMap;
699
- types.RadonScript = types_1.RadonScript;
700
- types.RadonString = types_1.RadonString;
701
- types.RadonEncodings = types_1.RadonEncodings;
702
- })(types || (exports.types = types = {}));
711
+ types.RadonArray = _RadonArray;
712
+ types.RadonBoolean = _RadonBoolean;
713
+ types.RadonBytes = _RadonBytes;
714
+ types.RadonFloat = _RadonFloat;
715
+ types.RadonInteger = _RadonInteger;
716
+ types.RadonMap = _RadonMap;
717
+ types.RadonScript = _RadonScript;
718
+ types.RadonString = _RadonString;
719
+ types.RadonEncodings = _RadonEncodings;
720
+ })(types || (types = {}));
703
721
  function proxyHandler(t) {
704
722
  return {
705
723
  get(target, prop) {
706
- let found = target[prop] ?? findKeyInObject(target, prop);
724
+ const found = target[prop] ?? findKeyInObject(target, prop);
707
725
  // if (!found) {
708
726
  // throw EvalError(`['${prop}'] was not found in dictionary`)
709
- // } else
727
+ // } else
710
728
  if (found && !(found instanceof t)) {
711
729
  throw TypeError(`['${prop}'] was found with type ${found?.constructor?.name} instead of ${t.name}!`);
712
730
  }
713
731
  return found;
714
- }
732
+ },
715
733
  };
716
734
  }
717
735
  function findKeyInObject(dict, tag) {
718
736
  for (const key in dict) {
719
- if (typeof dict[key] === 'object') {
737
+ if (typeof dict[key] === "object") {
720
738
  if (key === tag) {
721
739
  return dict[key];
722
740
  }
723
741
  else {
724
- let found = findKeyInObject(dict[key], tag);
742
+ const found = findKeyInObject(dict[key], tag);
725
743
  if (found)
726
744
  return found;
727
745
  }
728
746
  }
729
747
  }
730
748
  }
731
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JhZG9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRNQSx3REF1QkM7QUFFRCxrQ0FHQztBQXhPRCwrQkFHYTtBQUNiLG9GQUFvRDtBQUVwRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxDQUFBO0FBQ2xHLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUE7QUFFcEQsK0NBWTBCO0FBRTFCLDJDQUF3QztBQUN4QyxtQ0FBMEM7QUFDMUMsdUNBQTJEO0FBQzNELHlDQUE4RDtBQUU5RCxtQ0FVZ0I7QUFJaEIsTUFBTSxhQUFhO0lBTWpCLFlBQVksS0FJWDtRQUNDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDakYsTUFBTSxTQUFTLENBQUMseURBQXlELENBQUMsQ0FBQTtRQUM1RSxDQUFDO1FBQ0QsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sU0FBUyxDQUFDLDZCQUE2QixLQUFLLGVBQWUsQ0FBQyxDQUFBO1lBQ3BFLENBQUM7aUJBQU0sSUFBSSxDQUFDLENBQUMsU0FBUyxZQUFZLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xELE1BQU0sU0FBUyxDQUFDLDZCQUE2QixLQUFLLGdCQUFn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QUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgZGVjb2RlIGFzIGNib3JEZWNvZGUsXHJcbiAgZW5jb2RlIGFzIGNib3JFbmNvZGUsXHJcbn0gZnJvbSAnY2JvcidcclxuaW1wb3J0IGdyYXBoUWxDb21wcmVzcyBmcm9tICdncmFwaHFsLXF1ZXJ5LWNvbXByZXNzJ1xyXG5cclxuY29uc3QgcHJvdG9CdWYgPSByZXF1aXJlKFwicHJvdG9idWZqc1wiKS5Sb290LmZyb21KU09OKHJlcXVpcmUoXCIuLi8uLi8uLi93aXRuZXQvd2l0bmV0LnByb3RvLmpzb25cIikpXHJcbmNvbnN0IFJBRFJlcXVlc3QgPSBwcm90b0J1Zi5sb29rdXBUeXBlKFwiUkFEUmVxdWVzdFwiKVxyXG5cclxuaW1wb3J0IHtcclxuICBleGVjUmFkb25CeXRlY29kZSxcclxuICBmcm9tSGV4U3RyaW5nLFxyXG4gIGdldFdpbGRjYXJkc0NvdW50RnJvbVN0cmluZyxcclxuICBpc0hleFN0cmluZyxcclxuICBpc1dpbGRjYXJkLFxyXG4gIHBhcnNlVVJMLFxyXG4gIHJlcGxhY2VXaWxkY2FyZHMsXHJcbiAgc3BsaWNlV2lsZGNhcmQsXHJcbiAgdG9IZXhTdHJpbmcsXHJcbiAgdG9VdGY4QXJyYXksXHJcbiAgdXRmOEFycmF5VG9TdHIsXHJcbn0gZnJvbSBcIi4uLy4uL2Jpbi9oZWxwZXJzXCJcclxuXHJcbmltcG9ydCB7IHNoYTI1NiB9IGZyb20gXCIuLi9jcnlwdG8vdXRpbHNcIlxyXG5pbXBvcnQgeyBwYXJzZVJhZG9uU2NyaXB0IH0gZnJvbSBcIi4vdXRpbHNcIlxyXG5pbXBvcnQgeyBPcGNvZGVzIGFzIEZpbHRlcnMsIFJhZG9uRmlsdGVyIH0gZnJvbSAnLi9maWx0ZXJzJ1xyXG5pbXBvcnQgeyBPcGNvZGVzIGFzIFJlZHVjZXJzLCBSYWRvblJlZHVjZXIgfSBmcm9tICcuL3JlZHVjZXJzJ1xyXG5pbXBvcnQgeyBSYWRvbkFueSwgUmFkb25TdHJpbmcsIFJhZG9uT3BlcmF0b3IgfSBmcm9tICcuL3R5cGVzJ1xyXG5pbXBvcnQge1xyXG4gIFJhZG9uQXJyYXkgYXMgX1JhZG9uQXJyYXksXHJcbiAgUmFkb25Cb29sZWFuIGFzIF9SYWRvbkJvb2xlYW4sXHJcbiAgUmFkb25CeXRlcyBhcyBfUmFkb25CeXRlcyxcclxuICBSYWRvbkZsb2F0IGFzIF9SYWRvbkZsb2F0LFxyXG4gIFJhZG9uSW50ZWdlciBhcyBfUmFkb25JbnRlZ2VyLFxyXG4gIFJhZG9uTWFwIGFzIF9SYWRvbk1hcCxcclxuICBSYWRvblN0cmluZyBhcyBfUmFkb25TdHJpbmcsXHJcbiAgUmFkb25TY3JpcHQgYXMgX1JhZG9uU2NyaXB0LFxyXG4gIFJhZG9uRW5jb2RpbmdzIGFzIF9SYWRvbkVuY29kaW5ncyxcclxufSBmcm9tICcuL3R5cGVzJ1xyXG5cclxudHlwZSBBcmdzID0gc3RyaW5nW10gfCBzdHJpbmdbXVtdO1xyXG5cclxuY2xhc3MgUmFkb25BcnRpZmFjdCB7XHJcblxyXG4gIHB1YmxpYyByZWFkb25seSBzb3VyY2VzOiBSYWRvblJldHJpZXZhbFtdO1xyXG4gIHB1YmxpYyByZWFkb25seSBzb3VyY2VzUmVkdWNlcjogUmFkb25SZWR1Y2VyO1xyXG4gIHB1YmxpYyByZWFkb25seSB3aXRuZXNzUmVkdWNlcjogUmFkb25SZWR1Y2VyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihzcGVjczoge1xyXG4gICAgc291cmNlczogUmFkb25SZXRyaWV2YWxbXSxcclxuICAgIHNvdXJjZXNSZWR1Y2VyOiBSYWRvblJlZHVjZXIsXHJcbiAgICB3aXRuZXNzUmVkdWNlcjogUmFkb25SZWR1Y2VyLFxyXG4gIH0pIHtcclxuICAgIGlmICghc3BlY3Muc291cmNlcyB8fCAhQXJyYXkuaXNBcnJheShzcGVjcy5zb3VyY2VzKSB8fCBzcGVjcy5zb3VyY2VzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHRocm93IFR5cGVFcnJvcihcIlJhZG9uQXJ0aWZhY3Q6IGNhbm5vdCBidWlsZCBpZiBubyByZXRyaWV2YWxzIGFyZSBwYXNzZWRcIilcclxuICAgIH1cclxuICAgIHNwZWNzLnNvdXJjZXM/LmZvckVhY2goKHJldHJpZXZhbCwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKHJldHJpZXZhbCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBSYWRvbkFydGlmYWN0OiByZXRyaWV2YWwgIyR7aW5kZXh9IGlzIHVuZGVmaW5lZGApXHJcbiAgICAgIH0gZWxzZSBpZiAoIShyZXRyaWV2YWwgaW5zdGFuY2VvZiBSYWRvblJldHJpZXZhbCkpIHtcclxuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYFJhZG9uQXJ0aWZhY3Q6IHJldHJpZXZhbCAjJHtpbmRleH06IGludmFsaWQgdHlwZWApXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICB0aGlzLnNvdXJjZXMgPSBzcGVjcy5zb3VyY2VzO1xyXG4gICAgdGhpcy5zb3VyY2VzUmVkdWNlciA9IHNwZWNzLnNvdXJjZXNSZWR1Y2VyO1xyXG4gICAgdGhpcy53aXRuZXNzUmVkdWNlciA9IHNwZWNzLndpdG5lc3NSZWR1Y2VyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wc0NvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKHRoaXMuc291cmNlcz8ubWFwKHJldHJpZXZhbCA9PiByZXRyaWV2YWwub3BzQ291bnQoKSkucmVkdWNlKChzdW0sIGEpID0+IHN1bSArIGEpIHx8IDApXHJcbiAgICAgICsgdGhpcy5zb3VyY2VzUmVkdWNlcj8ub3BzQ291bnQoKVxyXG4gICAgICArIHRoaXMud2l0bmVzc1JlZHVjZXI/Lm9wc0NvdW50KClcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRvblJlcXVlc3QgZXh0ZW5kcyBSYWRvbkFydGlmYWN0IHtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVjb2RlcyBhIFJhZG9uUmVxdWVzdCBhcnRpZmFjdCBvdXQgZnJvbSBhIFByb3RvYnVmLXNlcmlhbGl6ZWQgYnl0ZWNvZGUuXHJcbiAgICogQHBhcmFtIGJ5dGVjb2RlIFJhZG9uIHJlcXVlc3QgYnl0ZWNvZGUuXHJcbiAgICogQHJldHVybnMgUmFkb25SZXF1ZXN0IG9iamVjdC5cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIGZyb21CeXRlY29kZShieXRlY29kZTogYW55KSB7XHJcbiAgICBsZXQgYnVmZmVyXHJcbiAgICBpZiAoaXNIZXhTdHJpbmcoYnl0ZWNvZGUpKSB7XHJcbiAgICAgIGJ1ZmZlciA9IGZyb21IZXhTdHJpbmcoYnl0ZWNvZGUpXHJcbiAgICB9IGVsc2UgaWYgKGJ5dGVjb2RlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xyXG4gICAgICBidWZmZXIgPSBCdWZmZXIuZnJvbShieXRlY29kZSlcclxuICAgIH0gZWxzZSBpZiAoYnl0ZWNvZGUgaW5zdGFuY2VvZiBCdWZmZXIpIHtcclxuICAgICAgYnVmZmVyID0gYnl0ZWNvZGVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFJhZG9uUmVxdWVzdDogdW5zdXBwb3J0ZWQgYnl0ZWNvZGUgZm9ybWF0OiAke2J5dGVjb2RlfWApXHJcbiAgICB9XHJcbiAgICBjb25zdCBvYmo6IGFueSA9IFJBRFJlcXVlc3QuZGVjb2RlKGJ1ZmZlcilcclxuICAgIHJldHVybiBSYWRvblJlcXVlc3QuZnJvbVByb3RvYnVmKG9iailcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlY29kZXMgYSBSYWRvblJlcXVlc3QgYXJ0aWZhY3Qgb3V0IGZyb20gYSBQcm90b2J1ZiBvYmplY3QuXHJcbiAgICogQHBhcmFtIG9iaiBQcm90b2J1ZiBvYmplY3QuXHJcbiAgICogQHJldHVybnMgUmFkb25SZXF1ZXN0IG9iamVjdC5cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIGZyb21Qcm90b2J1ZihvYmo6IGFueSkge1xyXG4gICAgY29uc3Qgc291cmNlcyA9IG9iai5yZXRyaWV2ZS5tYXAoKHJldHJpZXZhbDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHNwZWNzOiBhbnkgPSB7fVxyXG4gICAgICBpZiAocmV0cmlldmFsPy51cmwpIHsgc3BlY3MudXJsID0gcmV0cmlldmFsLnVybCB9XHJcbiAgICAgIGlmIChyZXRyaWV2YWw/LmhlYWRlcnMpIHtcclxuICAgICAgICBzcGVjcy5oZWFkZXJzID0gT2JqZWN0LmZyb21FbnRyaWVzKHJldHJpZXZhbC5oZWFkZXJzLm1hcCgoc3RyaW5nUGFpcjogYW55KSA9PiBbXHJcbiAgICAgICAgICBzdHJpbmdQYWlyLmxlZnQsXHJcbiAgICAgICAgICBzdHJpbmdQYWlyLnJpZ2h0XHJcbiAgICAgICAgXSkpXHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJldHJpZXZhbD8uYm9keSAmJiByZXRyaWV2YWwuYm9keS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgc3BlY3MuYm9keSA9IHV0ZjhBcnJheVRvU3RyKE9iamVjdC52YWx1ZXMocmV0cmlldmFsLmJvZHkpKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChyZXRyaWV2YWw/LnNjcmlwdCkgc3BlY3Muc2NyaXB0ID0gcGFyc2VSYWRvblNjcmlwdCh0b0hleFN0cmluZyhyZXRyaWV2YWwuc2NyaXB0KSlcclxuICAgICAgc3BlY3MubWV0aG9kID0gcmV0cmlldmFsLmtpbmRcclxuICAgICAgcmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbChzcGVjcylcclxuICAgIH0pXHJcbiAgICBjb25zdCBkZWNvZGVGaWx0ZXIgPSAoZjogYW55KSA9PiB7XHJcbiAgICAgIGlmIChmPy5hcmdzICYmIGYuYXJncy5sZW5ndGggPiAwKSByZXR1cm4gbmV3IFJhZG9uRmlsdGVyKGYub3AsIGNib3JEZWNvZGUoVWludDhBcnJheS5mcm9tKGYuYXJncykpKVxyXG4gICAgICBlbHNlIHJldHVybiBuZXcgUmFkb25GaWx0ZXIoZi5vcCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFJhZG9uUmVxdWVzdCh7XHJcbiAgICAgIHNvdXJjZXMsXHJcbiAgICAgIHNvdXJjZXNSZWR1Y2VyOiBuZXcgUmFkb25SZWR1Y2VyKG9iai5hZ2dyZWdhdGUucmVkdWNlciwgb2JqLmFnZ3JlZ2F0ZS5maWx0ZXJzPy5tYXAoZGVjb2RlRmlsdGVyKSksXHJcbiAgICAgIHdpdG5lc3NSZWR1Y2VyOiBuZXcgUmFkb25SZWR1Y2VyKG9iai50YWxseS5yZWR1Y2VyLCBvYmoudGFsbHkuZmlsdGVycz8ubWFwKGRlY29kZUZpbHRlcikpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3Ioc3BlY3M6IHtcclxuICAgIHNvdXJjZXM6IFJhZG9uUmV0cmlldmFsIHwgUmFkb25SZXRyaWV2YWxbXSxcclxuICAgIHNvdXJjZXNSZWR1Y2VyPzogUmFkb25SZWR1Y2VyLFxyXG4gICAgd2l0bmVzc1JlZHVjZXI/OiBSYWRvblJlZHVjZXIsXHJcbiAgfSkge1xyXG4gICAgY29uc3Qgc291cmNlcyA9IEFycmF5LmlzQXJyYXkoc3BlY3Muc291cmNlcykgPyBzcGVjcy5zb3VyY2VzIGFzIFJhZG9uUmV0cmlldmFsW10gOiBbc3BlY3Muc291cmNlc11cclxuICAgIHN1cGVyKHtcclxuICAgICAgc291cmNlcyxcclxuICAgICAgc291cmNlc1JlZHVjZXI6IHNwZWNzPy5zb3VyY2VzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcbiAgICAgIHdpdG5lc3NSZWR1Y2VyOiBzcGVjcz8ud2l0bmVzc1JlZHVjZXIgfHwgcmVkdWNlcnMuTW9kZSgpLFxyXG4gICAgfSlcclxuICAgIGxldCBhcmdzQ291bnQgPSBzb3VyY2VzLm1hcChyZXRyaWV2YWwgPT4gcmV0cmlldmFsLmFyZ3NDb3VudCkucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2ICsgY3VycilcclxuICAgIGlmIChhcmdzQ291bnQgPiAwKSB7XHJcbiAgICAgIHRocm93IFR5cGVFcnJvcihcIlJhZG9uUmVxdWVzdDogcGFyYW1ldGVyaXplZCByZXRyaWV2YWxzIHdlcmUgcGFzc2VkXCIpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2VuY29kZSgpOiBCdWZmZXIge1xyXG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMudG9Qcm90b2J1ZigpXHJcbiAgICBjb25zdCBlcnJNc2cgPSBSQURSZXF1ZXN0LnZlcmlmeShwYXlsb2FkKVxyXG4gICAgaWYgKGVyck1zZykge1xyXG4gICAgICB0aHJvdyBFcnJvcihlcnJNc2cpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9IFJBRFJlcXVlc3QuZnJvbU9iamVjdChwYXlsb2FkKTtcclxuICAgICAgcmV0dXJuIFJBRFJlcXVlc3QuZW5jb2RlKG1lc3NhZ2UpLmZpbmlzaCgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZXhlY0RyeVJ1bih2ZXJib3NlID0gZmFsc2UpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIChhd2FpdCBleGVjUmFkb25CeXRlY29kZSh0aGlzLnRvQnl0ZWNvZGUoKSwgJy0tanNvbicsIHZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnKSkudHJpbSgpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IHN0cmluZyAge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5zb3VyY2VzWzBdLm1ldGhvZCA9PT0gcmV0cmlldmFscy5NZXRob2RzLlJORyBcclxuICAgICAgICA/IFwiUmFkb25CeXRlc1wiXHJcbiAgICAgICAgOiAodGhpcy5zb3VyY2VzICYmIHRoaXMuc291cmNlc1swXSAmJiB0aGlzLnNvdXJjZXNbMF0uc2NyaXB0ICYmIHRoaXMuc291cmNlc1swXS5zY3JpcHQub3V0cHV0VHlwZVxyXG4gICAgICAgICAgPyB0aGlzLnNvdXJjZXNbMF0uc2NyaXB0Lm91dHB1dFR5cGUuY29uc3RydWN0b3IubmFtZSBcclxuICAgICAgICAgIDogXCJSYWRvbkFueVwiXHJcbiAgICAgICAgKVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCByYWRIYXNoKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdG9IZXhTdHJpbmcoc2hhMjU2KHRoaXMuX2VuY29kZSgpKSwgZmFsc2UpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9CeXRlY29kZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRvSGV4U3RyaW5nKHRoaXMuX2VuY29kZSgpKS8vZW5jb2RlUkFEUmVxdWVzdCh0aGlzLnRvUHJvdG9idWYoKSksIHRydWUpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9KU09OKGh1bWFuaXplPzogYm9vbGVhbik6IGFueSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByZXRyaWV2ZTogdGhpcy5zb3VyY2VzLm1hcChyZXRyaWV2YWwgPT4gcmV0cmlldmFsLnRvSlNPTihodW1hbml6ZSkpLFxyXG4gICAgICBhZ2dyZWdhdGU6IHRoaXMuc291cmNlc1JlZHVjZXIudG9KU09OKGh1bWFuaXplKSxcclxuICAgICAgdGFsbHk6IHRoaXMud2l0bmVzc1JlZHVjZXIudG9KU09OKGh1bWFuaXplKSxcclxuICAgICAgLi4uKGh1bWFuaXplID8ge30gOiB7IHRpbWVfbG9jazogMCB9KSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b1Byb3RvYnVmKCk6IGFueSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAvL3RpbWVMb2NrOiAwLFxyXG4gICAgICByZXRyaWV2ZTogdGhpcy5zb3VyY2VzLm1hcChyZXRyaWV2YWwgPT4gcmV0cmlldmFsLnRvUHJvdG9idWYoKSksXHJcbiAgICAgIGFnZ3JlZ2F0ZTogdGhpcy5zb3VyY2VzUmVkdWNlci50b1Byb3RvYnVmKCksXHJcbiAgICAgIHRhbGx5OiB0aGlzLndpdG5lc3NSZWR1Y2VyLnRvUHJvdG9idWYoKSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB3ZWlnaHQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRvQnl0ZWNvZGUoKS5zbGljZSgyKS5sZW5ndGggLyAyO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIFJhZG9uUmVxdWVzdEZyb21Bc3NldHMoc3BlY3M6IHtcclxuICBhc3NldHM6IE9iamVjdCxcclxuICBhcmdzTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnkgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4sIFxyXG4gIHNvdXJjZXNSZWR1Y2VyPzogUmFkb25SZWR1Y2VyLFxyXG4gIHdpdG5lc3NSZWR1Y2VyPzogUmFkb25SZWR1Y2VyLFxyXG59KTogUmFkb25SZXF1ZXN0IHtcclxuICBjb25zdCBzb3VyY2VzOiBSYWRvblJldHJpZXZhbFtdID0gW11cclxuICBjb25zdCBkaWN0ID0gcmV0cmlldmFscy5mcm9tUmFkb25Bc3NldHMoc3BlY3MuYXNzZXRzKVxyXG4gIC8vIGNvbnN0IGFyZ3M6IHN0cmluZ1tdW10gPSBbXVxyXG4gIE9iamVjdC5rZXlzKHNwZWNzLmFyZ3NNYXApLmZvckVhY2goa2V5ID0+IHtcclxuICAgIGNvbnN0IHJldHJpZXZhbDogUmFkb25SZXRyaWV2YWwgPSBkaWN0W2tleV0gXHJcbiAgICBjb25zdCBhcmdzID0gKHNwZWNzLmFyZ3NNYXAgYXMgYW55KVtrZXldXHJcbiAgICBpZiAocmV0cmlldmFsLmFyZ3NDb3VudCA+IDApIHtcclxuICAgICAgaWYgKCFhcmdzIHx8IGFyZ3MubGVuZ3RoIDwgcmV0cmlldmFsLmFyZ3NDb3VudCkge1xyXG4gICAgICAgIHRocm93IFR5cGVFcnJvcihgSW5zdWZmaWNpZW50IGFyZ3MgcGFzc2VkIHRvIHJldHJpZXZhbCBuYW1lZCBhcyAnJHtrZXl9JzogJHthcmdzLmxlbmd0aH0gPCAke3JldHJpZXZhbC5hcmdzQ291bnR9YClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzb3VyY2VzLnB1c2gocmV0cmlldmFsLmZvbGRBcmdzKGFyZ3MpKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzb3VyY2VzLnB1c2gocmV0cmlldmFsKVxyXG4gICAgfVxyXG4gIH0pXHJcbiAgcmV0dXJuIG5ldyBSYWRvblJlcXVlc3QoeyBzb3VyY2VzLCBzb3VyY2VzUmVkdWNlcjogc3BlY3M/LnNvdXJjZXNSZWR1Y2VyLCB3aXRuZXNzUmVkdWNlcjogc3BlY3M/LndpdG5lc3NSZWR1Y2VyIH0pXHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gUmFkb25TY3JpcHQ8SW5wdXRUeXBlIGV4dGVuZHMgUmFkb25BbnkgPSBSYWRvblN0cmluZz4oaW5wdXRUeXBlOiB7IG5ldyhvcHM/OiBSYWRvbk9wZXJhdG9yKTogSW5wdXRUeXBlOyB9KTogSW5wdXRUeXBlIHtcclxuICBpZiAoIWlucHV0VHlwZSkgdGhyb3cgVHlwZUVycm9yKFwiSW5wdXQgUmFkb24gZGF0YSB0eXBlIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gZGVjbGFyaW5nIGEgbmV3IFJhZG9uIHNjcmlwdC5cIilcclxuICByZXR1cm4gbmV3IGlucHV0VHlwZSgpO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25UZW1wbGF0ZSBleHRlbmRzIFJhZG9uQXJ0aWZhY3Qge1xyXG5cclxuICBwcm90ZWN0ZWQgX2FyZ3NDb3VudDogbnVtYmVyO1xyXG4gIFxyXG4gIHB1YmxpYyByZWFkb25seSBob21vZ2VuZW91czogYm9vbGVhbjtcclxuICBwdWJsaWMgcmVhZG9ubHkgc2FtcGxlcz86IFJlY29yZDxzdHJpbmcsIEFyZ3M+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHNwZWNzOiB7XHJcbiAgICAgIHNvdXJjZXM6IFJhZG9uUmV0cmlldmFsIHwgUmFkb25SZXRyaWV2YWxbXSxcclxuICAgICAgc291cmNlc1JlZHVjZXI/OiBSYWRvblJlZHVjZXIsXHJcbiAgICAgIHdpdG5lc3NSZWR1Y2VyPzogUmFkb25SZWR1Y2VyLFxyXG4gICAgfSxcclxuICAgIHNhbXBsZXM/OiBSZWNvcmQ8c3RyaW5nLCBBcmdzPlxyXG4gICkge1xyXG4gICAgY29uc3Qgc291cmNlcyA9IEFycmF5LmlzQXJyYXkoc3BlY3Muc291cmNlcykgPyBzcGVjcy5zb3VyY2VzIGFzIFJhZG9uUmV0cmlldmFsW10gOiBbc3BlY3Muc291cmNlc11cclxuICAgIHN1cGVyKHtcclxuICAgICAgc291cmNlcyxcclxuICAgICAgc291cmNlc1JlZHVjZXI6IHNwZWNzPy5zb3VyY2VzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcbiAgICAgIHdpdG5lc3NSZWR1Y2VyOiBzcGVjcz8ud2l0bmVzc1JlZHVjZXIgfHwgcmVkdWNlcnMuTW9kZSgpLFxyXG4gICAgfSlcclxuICAgIHRoaXMuX2FyZ3NDb3VudCA9IHNvdXJjZXMubWFwKHJldHJpZXZhbCA9PiByZXRyaWV2YWw/LmFyZ3NDb3VudCkucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBNYXRoLm1heChwcmV2LCBjdXJyKSwgMClcclxuICAgIGlmICh0aGlzLl9hcmdzQ291bnQgPT0gMCkge1xyXG4gICAgICB0aHJvdyBUeXBlRXJyb3IoXCJSYWRvblRlbXBsYXRlOiBubyBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMgd2VyZSBwYXNzZWRcIilcclxuICAgIH1cclxuICAgIHRoaXMuaG9tb2dlbmVvdXMgPSAhc291cmNlcy5maW5kKHJldHJpZXZhbCA9PiByZXRyaWV2YWwuYXJnc0NvdW50ICE9PSB0aGlzLl9hcmdzQ291bnQpXHJcbiAgICBpZiAoc2FtcGxlcykge1xyXG4gICAgICBPYmplY3Qua2V5cyhzYW1wbGVzKS5mb3JFYWNoKHNhbXBsZSA9PiB7XHJcbiAgICAgICAgbGV0IHNhbXBsZUFyZ3M6IEFyZ3MgPSBPYmplY3Qoc2FtcGxlcylbc2FtcGxlXVxyXG4gICAgICAgIGlmICh0eXBlb2Ygc2FtcGxlQXJncyA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgc2FtcGxlQXJncyA9IFtzYW1wbGVBcmdzXVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2FtcGxlQXJncy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2FtcGxlQXJnc1swXSkpIHtcclxuICAgICAgICAgICAgT2JqZWN0KHNhbXBsZXMpW3NhbXBsZV0gPSBBcnJheShzb3VyY2VzLmxlbmd0aCkuZmlsbChzYW1wbGVBcmdzKVxyXG4gICAgICAgICAgICBzYW1wbGVBcmdzID0gT2JqZWN0KHNhbXBsZXMpW3NhbXBsZV1cclxuICAgICAgICAgIH0gZWxzZSBpZiAoc2FtcGxlQXJncz8ubGVuZ3RoICE9IHNvdXJjZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihgUmFkb25UZW1wbGF0ZTogYXJndW1lbnRzIG1pc21hdGNoIGluIHNhbXBsZSBcIiR7c2FtcGxlfVwiOiAke3NhbXBsZUFyZ3M/Lmxlbmd0aH0gc2FtcGxlcyBnaXZlbiB2cy4gJHtzb3VyY2VzLmxlbmd0aH0gZXhwZWN0ZWRgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc2FtcGxlQXJncz8uZm9yRWFjaCgoc3ViYXJncywgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHN1YmFyZ3MubGVuZ3RoIDwgc291cmNlc1tpbmRleF0uYXJnc0NvdW50KSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBcXHgxYlsxOzMzbVJhZG9uUmVxdWVzdFRlbXBsYXRlOiBhcmd1bWVudHMgbWlzbWF0Y2ggaW4gdGVzdCBcXHgxYlsxOzMxbScke3NhbXBsZX0nXFx4MWJbMTszM206IFxceDFiWzE7MzdtUmV0cmlldmFsICMke2luZGV4fVxceDFiWzE7MzNtOiAke3N1YmFyZ3M/Lmxlbmd0aH0gcGFyYW1ldGVycyBnaXZlbiB2cy4gJHtzb3VyY2VzW2luZGV4XS5hcmdzQ291bnR9IGV4cGVjdGVkXFx4MWJbMG1gKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgdGhpcy5zYW1wbGVzID0gc2FtcGxlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhcmdzQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9hcmdzQ291bnRcclxuICB9XHJcblxyXG4gIHB1YmxpYyBidWlsZFJhZG9uUmVxdWVzdChhcmdzOiBhbnkgfCBhbnlbXSB8IHN0cmluZ1tdIHwgc3RyaW5nW11bXSk6IFJhZG9uUmVxdWVzdCB7XHJcbiAgICBjb25zdCBzb3VyY2VzOiBSYWRvblJldHJpZXZhbFtdID0gW11cclxuICAgIGlmICh0aGlzLmhvbW9nZW5lb3VzKSB7XHJcbiAgICAgIC8vIGFyZ3MgY2FuIGJlIGVpdGhlciBhbnksIHN0cmluZ1tdIG9yIHN0cmluZ1swXVtdIFxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSAmJiBhcmdzWzBdICYmIEFycmF5LmlzQXJyYXkoYXJnc1swXSkpIHtcclxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAxKSAge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25UZW1wbGF0ZTogaG9tb2dlbmVvdXMgdGVtcGxhdGU6IGFyZ3MgdmVjdG9yIGRpbWVuc2lvbiAke2FyZ3MubGVuZ3RofSA+IDEuYClcclxuICAgICAgICB9XHJcbiAgICAgICAgYXJncyA9IGFyZ3NbMF1cclxuICAgICAgICBcclxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZ3MpICYmIGFyZ3MubGVuZ3RoICE9PSB0aGlzLmFyZ3NDb3VudCkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXHJcbiAgICAgICAgICBgUmFkb25UZW1wbGF0ZTogaG9tb2dlbm91cyB0ZW1wbGF0ZTogbWlzc2luZyAke3RoaXMuYXJnc0NvdW50IC0gYXJncy5sZW5ndGh9IG91dCBvZiAke2FyZ3MubGVuZ3RofSBwYXJhbWV0ZXJzLmBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc291cmNlcy5mb3JFYWNoKHJldHJpZXZhbCA9PiBzb3VyY2VzLnB1c2gocmV0cmlldmFsLmZvbGRBcmdzKGFyZ3MpKSlcclxuICAgIFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFyZ3MpIHx8IGFyZ3MubGVuZ3RoICE9PSB0aGlzLnNvdXJjZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25UZW1wbGF0ZTogYXJncyB2ZWN0b3IgZGltZW5zaW9uICR7YXJncy5sZW5ndGh9ICE9ICR7dGhpcy5zb3VyY2VzLmxlbmd0aH1gKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc291cmNlcy5mb3JFYWNoKChyZXRyaWV2YWwsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnc1tpbmRleF0pICYmIHJldHJpZXZhbC5hcmdzQ291bnQgIT09IGFyZ3NbaW5kZXhdLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcclxuICAgICAgICAgICAgYFJhZG9uVGVtcGxhdGU6IHJldHJpZXZhbCAjJHtcclxuICAgICAgICAgICAgICBpbmRleCArIDFcclxuICAgICAgICAgICAgfTogbWlzbWF0Y2hpbmcgYXJncyBjb3VudDogJHtcclxuICAgICAgICAgICAgICBhcmdzW2luZGV4XS5sZW5ndGhcclxuICAgICAgICAgICAgfSAhPSAke1xyXG4gICAgICAgICAgICAgIHJldHJpZXZhbC5hcmdzQ291bnRcclxuICAgICAgICAgICAgfSAoWyR7YXJnc1tpbmRleF19KV1gXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzb3VyY2VzLnB1c2gocmV0cmlldmFsLmZvbGRBcmdzKGFyZ3NbaW5kZXhdKSlcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUmFkb25SZXF1ZXN0KHtcclxuICAgICAgc291cmNlcyxcclxuICAgICAgc291cmNlc1JlZHVjZXI6IHRoaXMuc291cmNlc1JlZHVjZXIsXHJcbiAgICAgIHdpdG5lc3NSZWR1Y2VyOiB0aGlzLndpdG5lc3NSZWR1Y2VyLFxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRvbk1vZGFsIGV4dGVuZHMgUmFkb25UZW1wbGF0ZSB7XHJcblxyXG4gIHByb3RlY3RlZCBfcHJvdmlkZXJzOiBBcnJheTxzdHJpbmc+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihzcGVjczoge1xyXG4gICAgcHJvdmlkZXJzPzogQXJyYXk8c3RyaW5nPixcclxuICAgIHJldHJpZXZhbDogUmFkb25SZXRyaWV2YWwsXHJcbiAgICBzb3VyY2VzUmVkdWNlcj86IFJhZG9uUmVkdWNlcixcclxuICAgIHdpdG5lc3NSZWR1Y2VyPzogUmFkb25SZWR1Y2VyLFxyXG4gIH0pIHtcclxuICAgIGlmICghc3BlY3MucmV0cmlldmFsLmlzTW9kYWwoKSkge1xyXG4gICAgICB0aHJvdyBUeXBlRXJyb3IoXCJSYWRvbk1vZGFsOiBubyBtb2RhbCByZXRyaWV2YWwgd2FzIHBhc3NlZC5cIilcclxuICAgIH1cclxuICAgIHN1cGVyKFxyXG4gICAgICB7XHJcbiAgICAgICAgc291cmNlczogW3NwZWNzLnJldHJpZXZhbF0sXHJcbiAgICAgICAgc291cmNlc1JlZHVjZXI6IHNwZWNzPy5zb3VyY2VzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcbiAgICAgICAgd2l0bmVzc1JlZHVjZXI6IHNwZWNzPy53aXRuZXNzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcbiAgICAgIH0sIFxyXG4gICAgICBzcGVjcy5yZXRyaWV2YWw/LnNhbXBsZXNcclxuICAgIClcclxuICAgIGlmIChzcGVjcz8ucHJvdmlkZXJzKSB7XHJcbiAgICAgIHRoaXMuX3Byb3ZpZGVycyA9IHRoaXMuX2NoZWNrUHJvdmlkZXJzKHNwZWNzLnByb3ZpZGVycylcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3Byb3ZpZGVycyA9IFtdXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFyZ3NDb3VudCgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgX3Byb3ZpZGVyc0FyZ3NDb3VudCA9IE1hdGgubWF4KC4uLnRoaXMucHJvdmlkZXJzLm1hcCh1cmwgPT4gZ2V0V2lsZGNhcmRzQ291bnRGcm9tU3RyaW5nKHVybCkpKVxyXG4gICAgcmV0dXJuIF9wcm92aWRlcnNBcmdzQ291bnQgPiAwID8gTWF0aC5tYXgodGhpcy5fYXJnc0NvdW50LCBfcHJvdmlkZXJzQXJnc0NvdW50KSA6IHRoaXMuX2FyZ3NDb3VudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgcHJvdmlkZXJzKCk6IEFycmF5PHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb3ZpZGVyc1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBwcm92aWRlcnMocHJvdmlkZXJzOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICB0aGlzLl9wcm92aWRlcnMgPSB0aGlzLl9jaGVja1Byb3ZpZGVycyhwcm92aWRlcnMpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYnVpbGRSYWRvblJlcXVlc3QoYXJncz86IGFueSB8IHN0cmluZ1tdKTogUmFkb25SZXF1ZXN0IHtcclxuICAgIGlmICh0aGlzLnByb3ZpZGVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25Nb2RhbDogbm8gcHJvdmlkZXJzIHdlcmUgcHJldmlvdXNseSBzZXR0bGVkLmApXHJcbiAgICB9XHJcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuYnVpbGRSYWRvblRlbXBsYXRlKHRoaXMucHJvdmlkZXJzKVxyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGVtcGxhdGUuaG9tb2dlbmVvdXNcclxuICAgICAgICA/IHRlbXBsYXRlLmJ1aWxkUmFkb25SZXF1ZXN0KGFyZ3MpXHJcbiAgICAgICAgOiB0ZW1wbGF0ZS5idWlsZFJhZG9uUmVxdWVzdCh0ZW1wbGF0ZS5zb3VyY2VzLm1hcChzb3VyY2UgPT4gYXJncy5zbGljZSgwLCBzb3VyY2UuYXJnc0NvdW50KSkpXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYnVpbGRSYWRvblRlbXBsYXRlKHByb3ZpZGVycz86IEFycmF5PHN0cmluZz4pOiBSYWRvblRlbXBsYXRlIHtcclxuICAgIGlmICghcHJvdmlkZXJzKSB7XHJcbiAgICAgIHByb3ZpZGVycyA9IHRoaXMuX2NoZWNrUHJvdmlkZXJzKFsgLi4udGhpcy5fcHJvdmlkZXJzIF0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm92aWRlcnMgPSB0aGlzLl9jaGVja1Byb3ZpZGVycyhbIC4uLnByb3ZpZGVycyBdKVxyXG4gICAgfVxyXG4gICAgaWYgKCFwcm92aWRlcnMgfHwgcHJvdmlkZXJzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBSYWRvbk1vZGFsOiBubyBwcm92aWRlcnMgd2VyZSBzcGVjaWZpZWQuYClcclxuICAgIH0gXHJcbiAgICByZXR1cm4gbmV3IFJhZG9uVGVtcGxhdGUoe1xyXG4gICAgICBzb3VyY2VzOiB0aGlzLnNvdXJjZXNbMF0uc3Bhd25SZXRyaWV2YWxzKC4uLnByb3ZpZGVycyksXHJcbiAgICAgIHNvdXJjZXNSZWR1Y2VyOiB0aGlzLnNvdXJjZXNSZWR1Y2VyLFxyXG4gICAgICB3aXRuZXNzUmVkdWNlcjogdGhpcy53aXRuZXNzUmVkdWNlcixcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBfY2hlY2tQcm92aWRlcnMocHJvdmlkZXJzOiBBcnJheTxzdHJpbmc+KTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICBwcm92aWRlcnMuZm9yRWFjaChwcm92aWRlciA9PiB7XHJcbiAgICAgIGNvbnN0IFtzY2hlbWEsXSA9IHBhcnNlVVJMKHByb3ZpZGVyKVxyXG4gICAgICBpZiAoIXNjaGVtYS5zdGFydHNXaXRoKFwiaHR0cDovL1wiKSAmJiAhc2NoZW1hLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSkge1xyXG4gICAgICAgIHRocm93IFR5cGVFcnJvcihgUmFkb25Nb2RhbDogaW52YWxpZCBwcm92aWRlcjogJHtwcm92aWRlcn1gKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHByb3ZpZGVyc1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uUmV0cmlldmFsIHtcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IGFyZ3NLZXlzPzogQXJyYXk8c3RyaW5nPjtcclxuICBwdWJsaWMgcmVhZG9ubHkgYXJnc0NvdW50OiBudW1iZXI7XHJcbiAgcHVibGljIHJlYWRvbmx5IG1ldGhvZDogcmV0cmlldmFscy5NZXRob2RzO1xyXG4gIHB1YmxpYyByZWFkb25seSBhdXRob3JpdHk/OiBzdHJpbmc7XHJcbiAgcHVibGljIHJlYWRvbmx5IGJvZHk/OiBhbnk7XHJcbiAgcHVibGljIHJlYWRvbmx5IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIHB1YmxpYyByZWFkb25seSBwYXRoPzogc3RyaW5nO1xyXG4gIHB1YmxpYyByZWFkb25seSBxdWVyeT86IHN0cmluZztcclxuICBwdWJsaWMgcmVhZG9ubHkgc2NoZW1hPzogc3RyaW5nO1xyXG4gIHB1YmxpYyByZWFkb25seSBzY3JpcHQ/OiBfUmFkb25TY3JpcHQ7XHJcbiAgcHVibGljIHJlYWRvbmx5IHVybD86IHN0cmluZztcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IHNhbXBsZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgc3BlY3M6IHtcclxuICAgICAgbWV0aG9kOiByZXRyaWV2YWxzLk1ldGhvZHMsXHJcbiAgICAgIHVybD86IHN0cmluZyxcclxuICAgICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXHJcbiAgICAgIGJvZHk/OiBhbnksXHJcbiAgICAgIHNjcmlwdD86IFJhZG9uQW55LFxyXG4gICAgICBhcmdzS2V5cz86IEFycmF5PHN0cmluZz4sXHJcbiAgICB9LCBcclxuICAgIHNhbXBsZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cclxuICApIHtcclxuICAgIGlmIChzcGVjcy5tZXRob2QgPT09IHJldHJpZXZhbHMuTWV0aG9kcy5STkcgJiYgKHNwZWNzPy51cmwgfHwgc3BlY3M/LmhlYWRlcnM/LnNpemUgfHwgc3BlY3M/LmJvZHkpKSB7XHJcbiAgICAgIHRocm93IFR5cGVFcnJvcihcIlJhZG9uUmV0cmlldmFsOiBSTkcgYWNjZXB0cyBubyBVUkxzIG9yIGhlYWRlcnNcIik7XHJcbiAgICAgIC8vIH0gZWxzZSBpZiAoIXNwZWNzPy51cmwgJiYgKG1ldGhvZCA9PSBNZXRob2RzLkh0dHBQb3N0IHx8IG1ldGhvZCA9PSBNZXRob2RzLkh0dHBHZXQpKSB7XHJcbiAgICAgIC8vICAgICB0aHJvdyBUeXBlRXJyb3IoXCJSYWRvblJldHJpZXZhbDogVVJMIG11c3QgYmUgc3BlY2lmaWVkXCIpO1xyXG4gICAgfSBlbHNlIGlmIChzcGVjcz8uYm9keSAmJiBzcGVjcy5tZXRob2QgPT0gcmV0cmlldmFscy5NZXRob2RzLkh0dHBHZXQpIHtcclxuICAgICAgdGhyb3cgVHlwZUVycm9yKFwiUmFkb25SZXRyaWV2YWw6IGJvZHkgY2Fubm90IGJlIHNwZWNpZmllZCBpbiBIVFRQLUdFVCBxdWVyaWVzXCIpXHJcbiAgICB9XHJcbiAgICB0aGlzLm1ldGhvZCA9IHNwZWNzLm1ldGhvZFxyXG4gICAgaWYgKHNwZWNzPy51cmwpIHtcclxuICAgICAgdGhpcy51cmwgPSBzcGVjcy51cmxcclxuICAgICAgaWYgKCFpc1dpbGRjYXJkKHNwZWNzLnVybCkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgbGV0IHBhcnRzID0gcGFyc2VVUkwoc3BlY3MudXJsKVxyXG4gICAgICAgICAgdGhpcy5zY2hlbWEgPSBwYXJ0c1swXVxyXG4gICAgICAgICAgaWYgKHBhcnRzWzFdICE9PSBcIlwiKSB0aGlzLmF1dGhvcml0eSA9IHBhcnRzWzFdXHJcbiAgICAgICAgICBpZiAocGFydHNbMl0gIT09IFwiXCIpIHRoaXMucGF0aCA9IHBhcnRzWzJdXHJcbiAgICAgICAgICBpZiAocGFydHNbM10gIT09IFwiXCIpIHRoaXMucXVlcnkgPSBwYXJ0c1szXVxyXG4gICAgICAgIH0gY2F0Y2ggeyB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIHNwZWNzLm1ldGhvZCA9PT0gcmV0cmlldmFscy5NZXRob2RzLkh0dHBHZXRcclxuICAgICAgICB8fCBzcGVjcy5tZXRob2QgPT09IHJldHJpZXZhbHMuTWV0aG9kcy5IdHRwUG9zdCBcclxuICAgICAgICB8fCBzcGVjcy5tZXRob2QgPT09IHJldHJpZXZhbHMuTWV0aG9kcy5IdHRwSGVhZFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMudXJsID0gXCJcXFxcMFxcXFxcIlxyXG4gICAgfVxyXG4gICAgaWYgKHNwZWNzPy5oZWFkZXJzKSB7XHJcbiAgICAgIGlmICh0eXBlb2Ygc3BlY3MuaGVhZGVycyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShzcGVjcy5oZWFkZXJzKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJSYWRvblJldHJpZXZhbDogSFRUUCBoZWFkZXJzIG11c3QgYmUgb2YgdHlwZSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XCIpXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5oZWFkZXJzID0gc3BlY3M/LmhlYWRlcnNcclxuICAgIH1cclxuICAgIHRoaXMuYm9keSA9IHNwZWNzPy5ib2R5XHJcbiAgICBpZiAoc3BlY3M/LnNjcmlwdCkgdGhpcy5zY3JpcHQgPSBuZXcgX1JhZG9uU2NyaXB0KHNwZWNzPy5zY3JpcHQpXHJcbiAgICB0aGlzLmFyZ3NDb3VudCA9IE1hdGgubWF4KFxyXG4gICAgICBnZXRXaWxkY2FyZHNDb3VudEZyb21TdHJpbmcodGhpcz8udXJsKSxcclxuICAgICAgZ2V0V2lsZGNhcmRzQ291bnRGcm9tU3RyaW5nKHRoaXM/LmJvZHkpLFxyXG4gICAgICAuLi5PYmplY3Qua2V5cyh0aGlzPy5oZWFkZXJzIHx8IHt9KS5tYXAoa2V5ID0+IGdldFdpbGRjYXJkc0NvdW50RnJvbVN0cmluZyhrZXkpKSA/PyBbXSxcclxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyh0aGlzPy5oZWFkZXJzIHx8IHt9KS5tYXAodmFsdWUgPT4gZ2V0V2lsZGNhcmRzQ291bnRGcm9tU3RyaW5nKHZhbHVlKSkgPz8gW10sXHJcbiAgICAgIHRoaXMuc2NyaXB0Py5hcmdzQ291bnQoKSB8fCAwLFxyXG4gICAgKVxyXG4gICAgaWYgKHNhbXBsZXMgJiYgdGhpcy5hcmdzQ291bnQgPT09IDApIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlJhZG9uUmV0cmlldmFsOiBwYXNzZWQgc2FtcGxlcyB0byBub24tcGFyYW1ldGVyaXplZCByZXRyaWV2YWwuXCIpXHJcbiAgICB9XHJcbiAgICB0aGlzLnNhbXBsZXMgPSBzYW1wbGVzXHJcbiAgICBpZiAoc3BlY3M/LmFyZ3NLZXlzKSB7XHJcbiAgICAgIGlmICh0aGlzLmFyZ3NDb3VudCA9PT0gMCkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJSYWRvblJldHJpZXZhbDogcGFzc2VkIGFyZ3Mga2V5cyB0byBub24tcGFyYW1ldGVyaXplZCByZXRyaWV2YWxcIilcclxuICAgICAgfSBlbHNlIGlmIChzcGVjcy5hcmdzS2V5cy5sZW5ndGggIT09IHRoaXMuYXJnc0NvdW50KSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25SZXRyaWV2YWw6IHBhc3NlZCBpbnZhbGlkIG51bWJlciBvZiBhcmdzIGtleXM6ICR7c3BlY3MuYXJnc0tleXMubGVuZ3RofSAhPSAke3RoaXMuYXJnc0NvdW50fWApXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hcmdzS2V5cyA9IHNwZWNzLmFyZ3NLZXlzXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNNb2RhbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1ldGhvZCAhPT0gcmV0cmlldmFscy5NZXRob2RzLlJORyAmJiAoIXRoaXMudXJsIHx8IHRoaXMudXJsID09PSBcIlxcXFwwXFxcXFwiKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzUGFyYW1ldGVyaXplZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFyZ3NDb3VudCA+IDBcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBuZXcgUmFkb24gUmV0cmlldmFsIGJ5IG9yZGVybHkgcmVwbGFjaW5nIGluZGV4ZWQgd2lsZGNhcmRzIHdpdGggZ2l2ZW4gcGFyYW1ldGVycy5cclxuICAgKiBGYWlscyBpZiBub3QgcGFyYW1ldGVyaXplZCwgb2YgaWYgcGFzc2luZyB0b28gbWFueSBwYXJhbWV0ZXJzLiBcclxuICAgKi9cclxuICBwdWJsaWMgZm9sZEFyZ3MoYXJnczogYW55IHwgc3RyaW5nW10pOiBSYWRvblJldHJpZXZhbCB7XHJcbiAgICBpZiAodGhpcy5hcmdzQ291bnQgPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMvL3Rocm93IG5ldyBUeXBlRXJyb3IoYFJhZG9uUmV0cmlldmFsOiBjYW5ub3QgZm9sZCB1bnBhcmFtZXRlcml6ZWQgcmV0cmlldmFsYClcclxuICAgIH0gXHJcbiAgICBjb25zdCBwYXJhbXM6IHN0cmluZ1tdID0gW11cclxuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3MpKSB7XHJcbiAgICAgIGlmICgoYXJncyBhcyBhbnlbXSkubGVuZ3RoID4gdGhpcy5hcmdzQ291bnQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBSYWRvblJldHJpZXZhbDogdG9vIG1heSBhcmdzIHBhc3NlZDogJHthcmdzLmxlbmd0aH0gPiAke3RoaXMuYXJnc0NvdW50fWApXHJcbiAgICAgIH1cclxuICAgICAgcGFyYW1zLnB1c2goLi4uYXJncyBhcyBzdHJpbmdbXSlcclxuICAgIFxyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgaWYgKCF0aGlzLmFyZ3NLZXlzKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25SZXRyaWV2YWw6IHVuZXhwZWN0ZWQgYXJncyBtYXA6IHVuZGVmaW5lZCBhcmdzIGtleXMuYClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmFyZ3NLZXlzLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgIGlmICghYXJnc1trZXldKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFJhZG9uUmV0cmlldmFsOiBtaXNzaW5nIHZhbHVlIGZvciBwYXJhbWV0ZXIgXCIke2tleX1cIi5gKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcGFyYW1zLnB1c2goYXJnc1trZXldIGFzIHN0cmluZylcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBhcmFtcy5wdXNoKGFyZ3MgYXMgc3RyaW5nKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbCh7XHJcbiAgICAgIG1ldGhvZDogdGhpcy5tZXRob2QsXHJcbiAgICAgIHVybDogcmVwbGFjZVdpbGRjYXJkcyh0aGlzLnVybCwgcGFyYW1zKSxcclxuICAgICAgYm9keTogcmVwbGFjZVdpbGRjYXJkcyh0aGlzLmJvZHksIHBhcmFtcyksXHJcbiAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0aGlzLmhlYWRlcnMgfHwge30pLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXHJcbiAgICAgICAgcmVwbGFjZVdpbGRjYXJkcyhrZXksIHBhcmFtcyksXHJcbiAgICAgICAgcmVwbGFjZVdpbGRjYXJkcyh2YWx1ZSwgcGFyYW1zKSxcclxuICAgICAgXSkpLFxyXG4gICAgICBzY3JpcHQ6IHRoaXMuc2NyaXB0Py5yZXBsYWNlV2lsZGNhcmRzKC4uLnBhcmFtcyksXHJcbiAgICB9KVxyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBDcmVhdGVzIG9uZSBvciBtb3JlIGNsb25lcyBvZiB0aGlzIHJldHJpZXZhbCwgaW4gd2hpY2ggdGhlIGluZGV4LTAgd2lsZGNhcmRcclxuICAgKiB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiB2YWx1ZXMuIEZhaWxzIGlmIHRoZSByZXRyaWV2YWwgaXMgbm90IHBhcmFtZXRlcml6ZWQuXHJcbiAgICovXHJcbiAgcHVibGljIHNwYXduUmV0cmlldmFscyguLi52YWx1ZXM6IHN0cmluZ1tdKTogUmFkb25SZXRyaWV2YWxbXSB7XHJcbiAgICBjb25zdCBfc3Bhd25lZDogUmFkb25SZXRyaWV2YWxbXSA9IFtdXHJcbiAgICBpZiAodGhpcy5pc01vZGFsKCkpIHtcclxuICAgICAgdmFsdWVzLmZvckVhY2godXJsID0+IHtcclxuICAgICAgICBfc3Bhd25lZC5wdXNoKG5ldyBSYWRvblJldHJpZXZhbCh7XHJcbiAgICAgICAgICBhcmdzS2V5czogdGhpcy5hcmdzS2V5cyxcclxuICAgICAgICAgIGJvZHk6IHRoaXMuYm9keSxcclxuICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcclxuICAgICAgICAgIG1ldGhvZDogdGhpcy5tZXRob2QsXHJcbiAgICAgICAgICBzY3JpcHQ6IHRoaXMuc2NyaXB0Py5jbG9uZSgpLFxyXG4gICAgICAgICAgdXJsLFxyXG4gICAgICAgIH0pKVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuYXJnc0NvdW50ID09IDApIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBSYWRvblJldHJpZXZhbDogY2Fubm90IHNwYXduIGZyb20gdW5wYXJhbWV0ZXJpemVkIHJldHJpZXZhbGApO1xyXG4gICAgICB9XHJcbiAgICAgIHZhbHVlcy5mb3JFYWNoKHZhbHVlID0+IHtcclxuICAgICAgICBfc3Bhd25lZC5wdXNoKG5ldyBSYWRvblJldHJpZXZhbCh7XHJcbiAgICAgICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxyXG4gICAgICAgICAgdXJsOiBzcGxpY2VXaWxkY2FyZCh0aGlzLnVybCwgMCwgdmFsdWUsIHRoaXMuYXJnc0NvdW50KSxcclxuICAgICAgICAgIGJvZHk6IHNwbGljZVdpbGRjYXJkKHRoaXMuYm9keSwgMCwgdmFsdWUsIHRoaXMuYXJnc0NvdW50KSxcclxuICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0aGlzLmhlYWRlcnMgfHwge30pLm1hcCgoW2hlYWRlcktleSwgaGVhZGVyVmFsdWVdKSA9PiBbXHJcbiAgICAgICAgICAgIHNwbGljZVdpbGRjYXJkKGhlYWRlcktleSwgMCwgdmFsdWUsIHRoaXMuYXJnc0NvdW50KSxcclxuICAgICAgICAgICAgc3BsaWNlV2lsZGNhcmQoaGVhZGVyVmFsdWUsIDAsIHZhbHVlLCB0aGlzLmFyZ3NDb3VudCksXHJcbiAgICAgICAgICBdKSksXHJcbiAgICAgICAgICBzY3JpcHQ6IHRoaXMuc2NyaXB0Py5zcGxpY2VXaWxkY2FyZCgwLCB2YWx1ZSksXHJcbiAgICAgICAgICBhcmdzS2V5czogdGhpcy5hcmdzS2V5cz8uc2xpY2UoMSksXHJcbiAgICAgICAgfSkpXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICByZXR1cm4gX3NwYXduZWRcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b0pTT04oaHVtYW5pemU/OiBib29sZWFuKTogYW55IHtcclxuICAgIGNvbnN0IGtpbmQgPSBbXCJcIiwgXCJIVFRQLUdFVFwiLCBcIlJOR1wiLCBcIkhUVFAtUE9TVFwiLCBcIkhUVFAtSEVBRFwiXVxyXG4gICAgbGV0IGpzb246IGFueSA9IHtcclxuICAgICAga2luZDoga2luZFt0aGlzLm1ldGhvZF0gLy8gaHVtYW5pemUgPyBNZXRob2RzW3RoaXMubWV0aG9kXSA6IHRoaXMubWV0aG9kLFxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMudXJsKSBqc29uLnVybCA9IHRoaXMudXJsXHJcbiAgICBpZiAodGhpcy5oZWFkZXJzKSB7XHJcbiAgICAgIGpzb24uaGVhZGVycyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuaGVhZGVycyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5ib2R5KSB7XHJcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5ib2R5ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGpzb24uYm9keSA9IGh1bWFuaXplID8gdGhpcy5ib2R5IDogdG9VdGY4QXJyYXkodGhpcy5ib2R5KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGpzb24uYm9keSA9IHRoaXMuYm9keVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBqc29uLnNjcmlwdCA9IGh1bWFuaXplID8gdGhpcy5zY3JpcHQ/LnRvU3RyaW5nKCkgOiBBcnJheS5mcm9tKGZyb21IZXhTdHJpbmcodGhpcy5zY3JpcHQ/LnRvQnl0ZWNvZGUoKSB8fCAnMHg4MCcpKVxyXG4gICAgcmV0dXJuIGpzb25cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b1Byb3RvYnVmKCk6IGFueSB7XHJcbiAgICBsZXQgcHJvdG9idWY6IGFueSA9IHtcclxuICAgICAga2luZDogdGhpcy5tZXRob2QsXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy51cmwpIHByb3RvYnVmLnVybCA9IHRoaXMudXJsXHJcbiAgICBpZiAodGhpcy5oZWFkZXJzKSB7XHJcbiAgICAgIHByb3RvYnVmLmhlYWRlcnMgPSBPYmplY3QuZW50cmllcyh0aGlzLmhlYWRlcnMpLm1hcCgoW2hlYWRlcktleSwgaGVhZGVyVmFsdWVdKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGxlZnQ6IGhlYWRlcktleSxcclxuICAgICAgICAgIHJpZ2h0OiBoZWFkZXJWYWx1ZSxcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5ib2R5KSB7XHJcbiAgICAgIGNvbnN0IHV0ZjhBcnJheSA9IHRvVXRmOEFycmF5KHRoaXMuYm9keSlcclxuICAgICAgcHJvdG9idWYuYm9keSA9IHV0ZjhBcnJheVxyXG4gICAgfVxyXG4gICAgcHJvdG9idWYuc2NyaXB0ID0gT2JqZWN0LnZhbHVlcyhVaW50OEFycmF5LmZyb20oY2JvckVuY29kZSh0aGlzLnNjcmlwdD8uZW5jb2RlKCkgfHwgW10pKSlcclxuICAgIHJldHVybiBwcm90b2J1ZlxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wc0NvdW50KCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY291bnRPcHModGhpcy5zY3JpcHQ/LmVuY29kZSgpIHx8IFtdKVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9jb3VudE9wcyhpdGVtczogYW55W10pOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGl0ZW1zLmxlbmd0aCA+IDAgPyBpdGVtcy5tYXAoaXRlbSA9PiBBcnJheS5pc0FycmF5KGl0ZW0pID8gdGhpcy5fY291bnRPcHMoaXRlbSkgOiAxKS5yZWR1Y2UoKHN1bSwgYSkgPT4gc3VtICsgYSkgOiAwXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgbmFtZXNwYWNlIGZpbHRlcnMge1xyXG4gIGV4cG9ydCBjb25zdCBPcGNvZGVzID0gRmlsdGVyc1xyXG4gIGV4cG9ydCBjb25zdCBDbGFzcyA9IFJhZG9uRmlsdGVyXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIE1vZGUoKSB7IHJldHVybiBuZXcgUmFkb25GaWx0ZXIoRmlsdGVycy5Nb2RlKTsgfVxyXG4gIGV4cG9ydCBmdW5jdGlvbiBTdGRldihzdGRldjogbnVtYmVyKSB7IHJldHVybiBuZXcgUmFkb25GaWx0ZXIoRmlsdGVycy5TdGFuZGFyZERldmlhdGlvbiwgc3RkZXYpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBuYW1lc3BhY2UgcmVkdWNlcnMge1xyXG4gIGV4cG9ydCBjb25zdCBPcGNvZGVzID0gUmVkdWNlcnNcclxuICBleHBvcnQgY29uc3QgQ2xhc3MgPSBSYWRvblJlZHVjZXJcclxuICBleHBvcnQgZnVuY3Rpb24gTW9kZSguLi5maWx0ZXJzOiBSYWRvbkZpbHRlcltdKSB7IHJldHVybiBuZXcgUmFkb25SZWR1Y2VyKFJlZHVjZXJzLk1vZGUsIGZpbHRlcnMpOyB9XHJcbiAgZXhwb3J0IGZ1bmN0aW9uIE1lYW4oLi4uZmlsdGVyczogUmFkb25GaWx0ZXJbXSkgeyByZXR1cm4gbmV3IFJhZG9uUmVkdWNlcihSZWR1Y2Vycy5NZWFuQXZlcmFnZSwgZmlsdGVycyk7IH1cclxuICBleHBvcnQgZnVuY3Rpb24gTWVkaWFuKC4uLmZpbHRlcnM6IFJhZG9uRmlsdGVyW10pIHsgcmV0dXJuIG5ldyBSYWRvblJlZHVjZXIoUmVkdWNlcnMuTWVkaWFuQXZlcmFnZSwgZmlsdGVycyk7IH1cclxuICBleHBvcnQgZnVuY3Rpb24gU3RkZXYoLi4uZmlsdGVyczogUmFkb25GaWx0ZXJbXSkgeyByZXR1cm4gbmV3IFJhZG9uUmVkdWNlcihSZWR1Y2Vycy5TdGFuZGFyZERldmlhdGlvbiwgZmlsdGVycyk7IH1cclxuICBleHBvcnQgZnVuY3Rpb24gQ29uY2F0SGFzaCguLi5maWx0ZXJzOiBSYWRvbkZpbHRlcltdKSB7IHJldHVybiBuZXcgUmFkb25SZWR1Y2VyKFJlZHVjZXJzLkNvbmNhdGVuYXRlQW5kSGFzaCwgZmlsdGVycyk7IH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIFByaWNlQWdncmVnYXRlKCkgeyByZXR1cm4gbmV3IFJhZG9uUmVkdWNlcihSZWR1Y2Vycy5NZWFuQXZlcmFnZSwgW2ZpbHRlcnMuU3RkZXYoMS40KV0pOyB9XHJcbiAgZXhwb3J0IGZ1bmN0aW9uIFByaWNlVGFsbHkoKSB7IHJldHVybiBuZXcgUmFkb25SZWR1Y2VyKFJlZHVjZXJzLk1lYW5BdmVyYWdlLCBbZmlsdGVycy5TdGRldigyLjUpXSk7IH1cclxufVxyXG5cclxuaW1wb3J0ICogYXMgY2NkciBmcm9tICcuL2NjZHInXHJcbmV4cG9ydCBuYW1lc3BhY2UgcmV0cmlldmFscyB7XHJcblxyXG4gIGV4cG9ydCBjb25zdCBycGMgPSBjY2RyO1xyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZnJvbVJhZG9uQXNzZXRzKGFzc2V0czogT2JqZWN0KTogUmVjb3JkPHN0cmluZywgUmFkb25SZXRyaWV2YWw+IHtcclxuICAgIHJldHVybiBuZXcgUHJveHkoYXNzZXRzLCBwcm94eUhhbmRsZXIoUmFkb25SZXRyaWV2YWwpKVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGVudW0gTWV0aG9kcyB7XHJcbiAgICBOb25lID0gMHgwLFxyXG4gICAgSHR0cEdldCA9IDB4MDEsXHJcbiAgICBIdHRwSGVhZCA9IDB4MDQsXHJcbiAgICBIdHRwUG9zdCA9IDB4MDMsXHJcbiAgICBSTkcgPSAweDAyLFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIFdpdG5ldCByYW5kb21uZXNzIGRhdGEgc291cmNlIG9iamVjdC5cclxuICAgKiBAcGFyYW0gc2NyaXB0IChPcHRpb25hbCkgUmFkb24gU2NyaXB0IHRvIGFwcGx5IHRvIHRoZSByYW5kb20gc2VlZCBwcm9wb3NlZCBieSBldmVyeSBzaW5nbGUgd2l0bmVzcywgXHJcbiAgICogYmVmb3JlIGFnZ3JlZ2F0aW9uLlxyXG4gICoqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBSTkcoc2NyaXB0PzogUmFkb25BbnkpIHtcclxuICAgIGNvbnN0IHJldHJpZXZhbCA9IG5ldyBSYWRvblJldHJpZXZhbCh7IG1ldGhvZDogTWV0aG9kcy5STkcsIHNjcmlwdCB9KTtcclxuICAgIGlmIChyZXRyaWV2YWw/LnNjcmlwdCAmJiByZXRyaWV2YWw/LnNjcmlwdD8uaW5wdXRUeXBlPy5jb25zdHJ1Y3Rvci5uYW1lICE9PSBcIlJhZG9uQnl0ZXNcIikge1xyXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUk5HIHNjcmlwdHMgcmVxdWlyZSBbUmFkb25CeXRlc10gYXMgaW5wdXQgdHlwZVwiKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldHJpZXZhbFxyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBIVFRQL0dFVCBkYXRhIHJldHJpZXZhbCBvYmplY3QuXHJcbiAgICogQHBhcmFtIHNwZWNzIFJhZG9uIFJldHJpZXZhbCBzcGVjcy5cclxuICAqKi9cclxuICBleHBvcnQgZnVuY3Rpb24gSHR0cEdldChzcGVjczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiBIVFRQIHJlcXVlc3QgVVJMLlxyXG4gICAgICovXHJcbiAgICB1cmw/OiBzdHJpbmcsXHJcbiAgICAvKipcclxuICAgICAqIEhUVFAgcmVxdWVzdCBoZWFkZXJzLlxyXG4gICAgICovXHJcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgIC8qKlxyXG4gICAgICogUmFkb25TY3JpcHQgZm9yIHByb2Nlc3NpbmcgcmV0dXJuZWQgdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIHNjcmlwdD86IFJhZG9uQW55LFxyXG4gICAgLyoqXHJcbiAgICAgKiBOYW1lcyBvZiBpbmRleGVkIHBhcmFtZXRlcnMgKG9wdGlvbmFsLCBpZiBhbnkpLlxyXG4gICAgICovXHJcbiAgICBhcmdzS2V5cz86IHN0cmluZ1tdLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG4gICAgICovXHJcbiAgICBzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XHJcbiAgfSkge1xyXG4gICAgcmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbCh7XHJcbiAgICAgICAgbWV0aG9kOiBNZXRob2RzLkh0dHBHZXQsIFxyXG4gICAgICAgIHVybDogc3BlY3M/LnVybCxcclxuICAgICAgICBoZWFkZXJzOiBzcGVjcz8uaGVhZGVycyxcclxuICAgICAgICBzY3JpcHQ6IHNwZWNzPy5zY3JpcHQsXHJcbiAgICAgICAgYXJnc0tleXM6IHNwZWNzPy5hcmdzS2V5cyxcclxuICAgICAgfSxcclxuICAgICAgc3BlY3M/LnNhbXBsZXMsXHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBIVFRQL0hFQUQgZGF0YSByZXRyaWV2YWwgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBzcGVjcyBSYWRvbiBSZXRyaWV2YWwgc3BlY3MuXHJcbiAgKiovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIEh0dHBIZWFkKHNwZWNzOiB7XHJcbiAgICAvKipcclxuICAgICAqIEhUVFAgcmVxdWVzdCBVUkxcclxuICAgICAqL1xyXG4gICAgdXJsPzogc3RyaW5nLFxyXG4gICAgLyoqXHJcbiAgICAgKiBIVFRQIHJlcXVlc3QgaGVhZGVyc1xyXG4gICAgICovXHJcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgIC8qKlxyXG4gICAgICogUmFkb24gc2NyaXB0IGZvciBwcm9jZXNzaW5nIHJldHVybmVkIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBzY3JpcHQ/OiBSYWRvbkFueSxcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgaW5kZXhlZCBwYXJhbWV0ZXJzIChvcHRpb25hbCwgaWYgYW55KVxyXG4gICAgICovXHJcbiAgICBhcmdzS2V5cz86IHN0cmluZ1tdLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG4gICAgICovXHJcbiAgICBzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XHJcbiAgfSkge1xyXG4gICAgcmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbCh7XHJcbiAgICAgICAgbWV0aG9kOiBNZXRob2RzLkh0dHBIZWFkLFxyXG4gICAgICAgIHVybDogc3BlY3M/LnVybCxcclxuICAgICAgICBoZWFkZXJzOiBzcGVjcz8uaGVhZGVycyxcclxuICAgICAgICBzY3JpcHQ6IHNwZWNzPy5zY3JpcHQsXHJcbiAgICAgICAgYXJnc0tleXM6IHNwZWNzPy5hcmdzS2V5cyxcclxuICAgICAgfSxcclxuICAgICAgc3BlY3M/LnNhbXBsZXMsXHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBIVFRQL1BPU1QgZGF0YSByZXRyaWV2YWwgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBzcGVjcyBSYWRvbiBSZXRyaWV2YWwgc3BlY3MuXHJcbiAgKiovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIEh0dHBQb3N0KHNwZWNzOiB7XHJcbiAgICAvKipcclxuICAgICAqIEhUVFAgcmVxdWVzdCBVUkxcclxuICAgICAqL1xyXG4gICAgdXJsPzogc3RyaW5nLFxyXG4gICAgLyoqXHJcbiAgICAgKiBIVFRQIHJlcXVlc3QgYm9keVxyXG4gICAgICovXHJcbiAgICBib2R5Pzogc3RyaW5nLFxyXG4gICAgLyoqXHJcbiAgICAgKiBIVFRQIHJlcXVlc3QgaGVhZGVyc1xyXG4gICAgICovXHJcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgIC8qKlxyXG4gICAgICogUmFkb24gc2NyaXB0IGZvciBwcm9jZXNzaW5nIHJldHVybmVkIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBzY3JpcHQ/OiBSYWRvbkFueSxcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgaW5kZXhlZCBwYXJhbWV0ZXJzIChvcHRpb25hbCwgaWYgYW55KVxyXG4gICAgICovXHJcbiAgICBhcmdzS2V5cz86IHN0cmluZ1tdLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG4gICAgICovXHJcbiAgICBzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LFxyXG4gIH0pIHtcclxuICAgIHJldHVybiBuZXcgUmFkb25SZXRyaWV2YWwoXHJcbiAgICAgIHtcclxuICAgICAgICBtZXRob2Q6IE1ldGhvZHMuSHR0cFBvc3QsXHJcbiAgICAgICAgdXJsOiBzcGVjcz8udXJsLFxyXG4gICAgICAgIGhlYWRlcnM6IHNwZWNzPy5oZWFkZXJzLFxyXG4gICAgICAgIGJvZHk6IHNwZWNzPy5ib2R5LFxyXG4gICAgICAgIHNjcmlwdDogc3BlY3M/LnNjcmlwdCxcclxuICAgICAgICBhcmdzS2V5czogc3BlY3M/LmFyZ3NLZXlzLFxyXG4gICAgICB9LFxyXG4gICAgICBzcGVjcz8uc2FtcGxlcyxcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIEdyYXBoUUwtcXVlcnkgZGF0YSBzb3VyY2Ugb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBzcGVjcyBSYWRvbiBSZXRyaWV2YWwgc3BlY3MuXHJcbiAgKiovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIEdyYXBoUUxRdWVyeShzcGVjczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiBHcmFwaFFMIFVSTCBlbmRwb2ludFxyXG4gICAgICovXHJcbiAgICB1cmw/OiBzdHJpbmcsXHJcbiAgICAvKipcclxuICAgICAqIEdyYXBoUUwgcXVlcnlcclxuICAgICAqL1xyXG4gICAgcXVlcnk6IHN0cmluZyxcclxuICAgIC8qKlxyXG4gICAgICogUmFkb24gc2NyaXB0IGZvciBwcm9jZXNzaW5nIHJldHVybmVkIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBzY3JpcHQ/OiBSYWRvbkFueSxcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgaW5kZXhlZCBwYXJhbWV0ZXJzIChvcHRpb25hbCwgaWYgYW55KVxyXG4gICAgICovXHJcbiAgICBhcmdzS2V5cz86IHN0cmluZ1tdLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG4gICAgICovXHJcbiAgICBzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LFxyXG4gIH0pIHtcclxuICAgIHJldHVybiBuZXcgUmFkb25SZXRyaWV2YWwoXHJcbiAgICAgIHtcclxuICAgICAgICBtZXRob2Q6IE1ldGhvZHMuSHR0cFBvc3QsXHJcbiAgICAgICAgdXJsOiBzcGVjcy51cmwsXHJcbiAgICAgICAgYm9keTogYHtcXFwicXVlcnlcXFwiOlxcXCIke2dyYXBoUWxDb21wcmVzcyhzcGVjcy5xdWVyeSkucmVwbGFjZUFsbCgnXCInLCAnXFxcXFwiJyl9XFxcIn1gLFxyXG4gICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLThcIiB9LFxyXG4gICAgICAgIHNjcmlwdDogc3BlY3M/LnNjcmlwdCxcclxuICAgICAgICBhcmdzS2V5czogc3BlY3M/LmFyZ3NLZXlzLFxyXG4gICAgICB9LFxyXG4gICAgICBzcGVjcz8uc2FtcGxlc1xyXG4gICAgKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgSlNPTi1SUEMgZGF0YSByZXRyaWV2YWwgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBzcGVjcyBSYWRvbiBSZXRyaWV2YWwgc3BlY3MuXHJcbiAgKiovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIEpzb25SUEMoc3BlY3MgOiB7XHJcbiAgICAvKipcclxuICAgICAqIEpTT04tUlBDIG1ldGhvZCBhbmQgcGFyYW1ldGVycy5cclxuICAgICAqL1xyXG4gICAgcnBjOiB7IG1ldGhvZDogc3RyaW5nLCBwYXJhbXM/OiBhbnkgfSxcclxuICAgIC8qKlxyXG4gICAgICogUmFkb24gc2NyaXB0IGZvciBwcm9jZXNzaW5nIHJldHVybmVkIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBzY3JpcHQ/OiBSYWRvbkFueSxcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgaW5kZXhlZCBwYXJhbWV0ZXJzIChvcHRpb25hbCwgaWYgYW55KVxyXG4gICAgICovXHJcbiAgICBhcmdzS2V5cz86IHN0cmluZ1tdLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG4gICAgICovXHJcbiAgICBzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LFxyXG4gIH0pIHtcclxuICAgIHJldHVybiBuZXcgUmFkb25SZXRyaWV2YWwoXHJcbiAgICAgIHtcclxuICAgICAgICBtZXRob2Q6IHJldHJpZXZhbHMuTWV0aG9kcy5IdHRwUG9zdCxcclxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgIGpzb25ycGM6IFwiMi4wXCIsXHJcbiAgICAgICAgICAgIG1ldGhvZDogc3BlY3MucnBjLm1ldGhvZCxcclxuICAgICAgICAgICAgcGFyYW1zOiBzcGVjcy5ycGM/LnBhcmFtcyxcclxuICAgICAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgfSkucmVwbGFjZUFsbCgnXFxcXFxcXFwnLCAnXFxcXCcpLFxyXG4gICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLThcIiB9LFxyXG4gICAgICAgIHNjcmlwdDogc3BlY3M/LnNjcmlwdCxcclxuICAgICAgICBhcmdzS2V5czogc3BlY3M/LmFyZ3NLZXlzLFxyXG4gICAgICB9LFxyXG4gICAgICBzcGVjcz8uc2FtcGxlc1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuZXhwb3J0IG5hbWVzcGFjZSB0eXBlcyB7XHJcbiAgZXhwb3J0IGNvbnN0IFJhZG9uQXJyYXkgPSBfUmFkb25BcnJheTtcclxuICBleHBvcnQgY29uc3QgUmFkb25Cb29sZWFuID0gX1JhZG9uQm9vbGVhbjtcclxuICBleHBvcnQgY29uc3QgUmFkb25CeXRlcyA9IF9SYWRvbkJ5dGVzO1xyXG4gIGV4cG9ydCBjb25zdCBSYWRvbkZsb2F0ID0gX1JhZG9uRmxvYXQ7XHJcbiAgZXhwb3J0IGNvbnN0IFJhZG9uSW50ZWdlciA9IF9SYWRvbkludGVnZXI7XHJcbiAgZXhwb3J0IGNvbnN0IFJhZG9uTWFwID0gX1JhZG9uTWFwO1xyXG4gIGV4cG9ydCBjb25zdCBSYWRvblNjcmlwdCA9IF9SYWRvblNjcmlwdDtcclxuICBleHBvcnQgY29uc3QgUmFkb25TdHJpbmcgPSBfUmFkb25TdHJpbmc7XHJcbiAgZXhwb3J0IGNvbnN0IFJhZG9uRW5jb2RpbmdzID0gX1JhZG9uRW5jb2RpbmdzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwcm94eUhhbmRsZXI8VD4odDogeyBuZXcoc3BlY3M6IGFueSk6IFQ7IH0pIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZ2V0KHRhcmdldDogYW55LCBwcm9wOiBzdHJpbmcpIHtcclxuICAgICAgICAgICAgbGV0IGZvdW5kID0gdGFyZ2V0W3Byb3BdID8/IGZpbmRLZXlJbk9iamVjdCh0YXJnZXQsIHByb3ApXHJcbiAgICAgICAgICAgIC8vIGlmICghZm91bmQpIHtcclxuICAgICAgICAgICAgLy8gICAgIHRocm93IEV2YWxFcnJvcihgWycke3Byb3B9J10gd2FzIG5vdCBmb3VuZCBpbiBkaWN0aW9uYXJ5YClcclxuICAgICAgICAgICAgLy8gfSBlbHNlIFxyXG4gICAgICAgICAgICBpZiAoZm91bmQgJiYgIShmb3VuZCBpbnN0YW5jZW9mIHQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYFsnJHtwcm9wfSddIHdhcyBmb3VuZCB3aXRoIHR5cGUgJHtmb3VuZD8uY29uc3RydWN0b3I/Lm5hbWV9IGluc3RlYWQgb2YgJHt0Lm5hbWV9IWApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZvdW5kXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBmaW5kS2V5SW5PYmplY3QoZGljdDogYW55LCB0YWc6IHN0cmluZykge1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGljdCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZGljdFtrZXldID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSB0YWcpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkaWN0W2tleV1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBmb3VuZDogYW55ID0gZmluZEtleUluT2JqZWN0KGRpY3Rba2V5XSwgdGFnKVxyXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuIl19
749
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JhZG9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sZUFBZSxNQUFNLHdCQUF3QixDQUFDO0FBRXJELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRS9DLE9BQU8sUUFBUSxNQUFNLFlBQVksQ0FBQztBQUVsQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLFFBQVEsQ0FBQztBQUNyQyxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUNuQyxPQUFPLENBQUMsbUNBQW1DLENBQUMsQ0FDNUMsQ0FBQztBQUNGLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFdEQsT0FBTyxFQUNOLGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsMkJBQTJCLEVBQzNCLFdBQVcsRUFDWCxVQUFVLEVBQ1YsUUFBUSxFQUNSLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsV0FBVyxFQUNYLFdBQVcsRUFDWCxjQUFjLEdBQ2QsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxJQUFJLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRSxPQUFPLEVBQ04sVUFBVSxJQUFJLFdBQVcsRUFDekIsWUFBWSxJQUFJLGFBQWEsRUFDN0IsVUFBVSxJQUFJLFdBQVcsRUFDekIsY0FB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b2R1bGVcIjtcclxuaW1wb3J0IGNib3IgZnJvbSBcImNib3JcIjtcclxuaW1wb3J0IGdyYXBoUWxDb21wcmVzcyBmcm9tIFwiZ3JhcGhxbC1xdWVyeS1jb21wcmVzc1wiO1xyXG5cclxuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcclxuXHJcbmltcG9ydCBwcm90b2J1ZiBmcm9tIFwicHJvdG9idWZqc1wiO1xyXG5cclxuY29uc3QgeyBSb290OiBQcm90b1Jvb3QgfSA9IHByb3RvYnVmO1xyXG5jb25zdCBwcm90b1Jvb3QgPSBQcm90b1Jvb3QuZnJvbUpTT04oXHJcblx0cmVxdWlyZShcIi4uLy4uLy4uL3dpdG5ldC93aXRuZXQucHJvdG8uanNvblwiKSxcclxuKTtcclxuY29uc3QgUkFEUmVxdWVzdCA9IHByb3RvUm9vdC5sb29rdXBUeXBlKFwiUkFEUmVxdWVzdFwiKTtcclxuXHJcbmltcG9ydCB7XHJcblx0ZXhlY1JhZG9uQnl0ZWNvZGUsXHJcblx0ZnJvbUhleFN0cmluZyxcclxuXHRnZXRXaWxkY2FyZHNDb3VudEZyb21TdHJpbmcsXHJcblx0aXNIZXhTdHJpbmcsXHJcblx0aXNXaWxkY2FyZCxcclxuXHRwYXJzZVVSTCxcclxuXHRyZXBsYWNlV2lsZGNhcmRzLFxyXG5cdHNwbGljZVdpbGRjYXJkLFxyXG5cdHRvSGV4U3RyaW5nLFxyXG5cdHRvVXRmOEFycmF5LFxyXG5cdHV0ZjhBcnJheVRvU3RyLFxyXG59IGZyb20gXCIuLi8uLi9iaW4vaGVscGVycy5qc1wiO1xyXG5cclxuaW1wb3J0IHsgc2hhMjU2IH0gZnJvbSBcIi4uL2NyeXB0by91dGlscy5qc1wiO1xyXG5pbXBvcnQgeyBPcGNvZGVzIGFzIEZpbHRlcnMsIFJhZG9uRmlsdGVyIH0gZnJvbSBcIi4vZmlsdGVycy5qc1wiO1xyXG5pbXBvcnQgeyBSYWRvblJlZHVjZXIsIE9wY29kZXMgYXMgUmVkdWNlcnMgfSBmcm9tIFwiLi9yZWR1Y2Vycy5qc1wiO1xyXG5pbXBvcnQge1xyXG5cdFJhZG9uQXJyYXkgYXMgX1JhZG9uQXJyYXksXHJcblx0UmFkb25Cb29sZWFuIGFzIF9SYWRvbkJvb2xlYW4sXHJcblx0UmFkb25CeXRlcyBhcyBfUmFkb25CeXRlcyxcclxuXHRSYWRvbkVuY29kaW5ncyBhcyBfUmFkb25FbmNvZGluZ3MsXHJcblx0UmFkb25GbG9hdCBhcyBfUmFkb25GbG9hdCxcclxuXHRSYWRvbkludGVnZXIgYXMgX1JhZG9uSW50ZWdlcixcclxuXHRSYWRvbk1hcCBhcyBfUmFkb25NYXAsXHJcblx0UmFkb25TY3JpcHQgYXMgX1JhZG9uU2NyaXB0LFxyXG5cdFJhZG9uU3RyaW5nIGFzIF9SYWRvblN0cmluZyxcclxuXHR0eXBlIFJhZG9uQW55LFxyXG5cdHR5cGUgUmFkb25PcGVyYXRvcixcclxuXHR0eXBlIFJhZG9uU3RyaW5nLFxyXG59IGZyb20gXCIuL3R5cGVzLmpzXCI7XHJcbmltcG9ydCB7IHBhcnNlUmFkb25TY3JpcHQgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xyXG5cclxudHlwZSBBcmdzID0gc3RyaW5nW10gfCBzdHJpbmdbXVtdO1xyXG5cclxuY2xhc3MgUmFkb25BcnRpZmFjdCB7XHJcblx0cHVibGljIHJlYWRvbmx5IHNvdXJjZXM6IFJhZG9uUmV0cmlldmFsW107XHJcblx0cHVibGljIHJlYWRvbmx5IHNvdXJjZXNSZWR1Y2VyOiBSYWRvblJlZHVjZXI7XHJcblx0cHVibGljIHJlYWRvbmx5IHdpdG5lc3NSZWR1Y2VyOiBSYWRvblJlZHVjZXI7XHJcblxyXG5cdGNvbnN0cnVjdG9yKHNwZWNzOiB7XHJcblx0XHRzb3VyY2VzOiBSYWRvblJldHJpZXZhbFtdO1xyXG5cdFx0c291cmNlc1JlZHVjZXI6IFJhZG9uUmVkdWNlcjtcclxuXHRcdHdpdG5lc3NSZWR1Y2VyOiBSYWRvblJlZHVjZXI7XHJcblx0fSkge1xyXG5cdFx0aWYgKFxyXG5cdFx0XHQhc3BlY3Muc291cmNlcyB8fFxyXG5cdFx0XHQhQXJyYXkuaXNBcnJheShzcGVjcy5zb3VyY2VzKSB8fFxyXG5cdFx0XHRzcGVjcy5zb3VyY2VzLmxlbmd0aCA9PT0gMFxyXG5cdFx0KSB7XHJcblx0XHRcdHRocm93IFR5cGVFcnJvcihcclxuXHRcdFx0XHRcIlJhZG9uQXJ0aWZhY3Q6IGNhbm5vdCBidWlsZCBpZiBubyByZXRyaWV2YWxzIGFyZSBwYXNzZWRcIixcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHRcdHNwZWNzLnNvdXJjZXM/LmZvckVhY2goKHJldHJpZXZhbCwgaW5kZXgpID0+IHtcclxuXHRcdFx0aWYgKHJldHJpZXZhbCA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0dGhyb3cgVHlwZUVycm9yKGBSYWRvbkFydGlmYWN0OiByZXRyaWV2YWwgIyR7aW5kZXh9IGlzIHVuZGVmaW5lZGApO1xyXG5cdFx0XHR9IGVsc2UgaWYgKCEocmV0cmlldmFsIGluc3RhbmNlb2YgUmFkb25SZXRyaWV2YWwpKSB7XHJcblx0XHRcdFx0dGhyb3cgVHlwZUVycm9yKGBSYWRvbkFydGlmYWN0OiByZXRyaWV2YWwgIyR7aW5kZXh9OiBpbnZhbGlkIHR5cGVgKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLnNvdXJjZXMgPSBzcGVjcy5zb3VyY2VzO1xyXG5cdFx0dGhpcy5zb3VyY2VzUmVkdWNlciA9IHNwZWNzLnNvdXJjZXNSZWR1Y2VyO1xyXG5cdFx0dGhpcy53aXRuZXNzUmVkdWNlciA9IHNwZWNzLndpdG5lc3NSZWR1Y2VyO1xyXG5cdH1cclxuXHJcblx0cHVibGljIG9wc0NvdW50KCk6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHQodGhpcy5zb3VyY2VzXHJcblx0XHRcdFx0Py5tYXAoKHJldHJpZXZhbCkgPT4gcmV0cmlldmFsLm9wc0NvdW50KCkpXHJcblx0XHRcdFx0LnJlZHVjZSgoc3VtLCBhKSA9PiBzdW0gKyBhKSB8fCAwKSArXHJcblx0XHRcdHRoaXMuc291cmNlc1JlZHVjZXI/Lm9wc0NvdW50KCkgK1xyXG5cdFx0XHR0aGlzLndpdG5lc3NSZWR1Y2VyPy5vcHNDb3VudCgpXHJcblx0XHQpO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uUmVxdWVzdCBleHRlbmRzIFJhZG9uQXJ0aWZhY3Qge1xyXG5cdC8qKlxyXG5cdCAqIERlY29kZXMgYSBSYWRvblJlcXVlc3QgYXJ0aWZhY3Qgb3V0IGZyb20gYSBQcm90b2J1Zi1zZXJpYWxpemVkIGJ5dGVjb2RlLlxyXG5cdCAqIEBwYXJhbSBieXRlY29kZSBSYWRvbiByZXF1ZXN0IGJ5dGVjb2RlLlxyXG5cdCAqIEByZXR1cm5zIFJhZG9uUmVxdWVzdCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIHN0YXRpYyBmcm9tQnl0ZWNvZGUoYnl0ZWNvZGU6IGFueSkge1xyXG5cdFx0bGV0IGJ1ZmZlcjtcclxuXHRcdGlmIChpc0hleFN0cmluZyhieXRlY29kZSkpIHtcclxuXHRcdFx0YnVmZmVyID0gZnJvbUhleFN0cmluZyhieXRlY29kZSk7XHJcblx0XHR9IGVsc2UgaWYgKGJ5dGVjb2RlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xyXG5cdFx0XHRidWZmZXIgPSBCdWZmZXIuZnJvbShieXRlY29kZSk7XHJcblx0XHR9IGVsc2UgaWYgKGJ5dGVjb2RlIGluc3RhbmNlb2YgQnVmZmVyKSB7XHJcblx0XHRcdGJ1ZmZlciA9IGJ5dGVjb2RlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcclxuXHRcdFx0XHRgUmFkb25SZXF1ZXN0OiB1bnN1cHBvcnRlZCBieXRlY29kZSBmb3JtYXQ6ICR7Ynl0ZWNvZGV9YCxcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IG9iajogYW55ID0gUkFEUmVxdWVzdC5kZWNvZGUoYnVmZmVyKTtcclxuXHRcdHJldHVybiBSYWRvblJlcXVlc3QuZnJvbVByb3RvYnVmKG9iaik7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWNvZGVzIGEgUmFkb25SZXF1ZXN0IGFydGlmYWN0IG91dCBmcm9tIGEgUHJvdG9idWYgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSBvYmogUHJvdG9idWYgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm5zIFJhZG9uUmVxdWVzdCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIHN0YXRpYyBmcm9tUHJvdG9idWYob2JqOiBhbnkpIHtcclxuXHRcdGNvbnN0IHNvdXJjZXMgPSBvYmoucmV0cmlldmUubWFwKChyZXRyaWV2YWw6IGFueSkgPT4ge1xyXG5cdFx0XHRjb25zdCBzcGVjczogYW55ID0ge307XHJcblx0XHRcdGlmIChyZXRyaWV2YWw/LnVybCkge1xyXG5cdFx0XHRcdHNwZWNzLnVybCA9IHJldHJpZXZhbC51cmw7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHJldHJpZXZhbD8uaGVhZGVycykge1xyXG5cdFx0XHRcdHNwZWNzLmhlYWRlcnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXHJcblx0XHRcdFx0XHRyZXRyaWV2YWwuaGVhZGVycy5tYXAoKHN0cmluZ1BhaXI6IGFueSkgPT4gW1xyXG5cdFx0XHRcdFx0XHRzdHJpbmdQYWlyLmxlZnQsXHJcblx0XHRcdFx0XHRcdHN0cmluZ1BhaXIucmlnaHQsXHJcblx0XHRcdFx0XHRdKSxcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChyZXRyaWV2YWw/LmJvZHkgJiYgcmV0cmlldmFsLmJvZHkubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdHNwZWNzLmJvZHkgPSB1dGY4QXJyYXlUb1N0cihPYmplY3QudmFsdWVzKHJldHJpZXZhbC5ib2R5KSk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHJldHJpZXZhbD8uc2NyaXB0KVxyXG5cdFx0XHRcdHNwZWNzLnNjcmlwdCA9IHBhcnNlUmFkb25TY3JpcHQodG9IZXhTdHJpbmcocmV0cmlldmFsLnNjcmlwdCkpO1xyXG5cdFx0XHRzcGVjcy5tZXRob2QgPSByZXRyaWV2YWwua2luZDtcclxuXHRcdFx0cmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbChzcGVjcyk7XHJcblx0XHR9KTtcclxuXHRcdGNvbnN0IGRlY29kZUZpbHRlciA9IChmOiBhbnkpID0+IHtcclxuXHRcdFx0aWYgKGY/LmFyZ3MgJiYgZi5hcmdzLmxlbmd0aCA+IDApXHJcblx0XHRcdFx0cmV0dXJuIG5ldyBSYWRvbkZpbHRlcihmLm9wLCBjYm9yLmRlY29kZShVaW50OEFycmF5LmZyb20oZi5hcmdzKSkpO1xyXG5cdFx0XHRlbHNlIHJldHVybiBuZXcgUmFkb25GaWx0ZXIoZi5vcCk7XHJcblx0XHR9O1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvblJlcXVlc3Qoe1xyXG5cdFx0XHRzb3VyY2VzLFxyXG5cdFx0XHRzb3VyY2VzUmVkdWNlcjogbmV3IFJhZG9uUmVkdWNlcihcclxuXHRcdFx0XHRvYmouYWdncmVnYXRlLnJlZHVjZXIsXHJcblx0XHRcdFx0b2JqLmFnZ3JlZ2F0ZS5maWx0ZXJzPy5tYXAoZGVjb2RlRmlsdGVyKSxcclxuXHRcdFx0KSxcclxuXHRcdFx0d2l0bmVzc1JlZHVjZXI6IG5ldyBSYWRvblJlZHVjZXIoXHJcblx0XHRcdFx0b2JqLnRhbGx5LnJlZHVjZXIsXHJcblx0XHRcdFx0b2JqLnRhbGx5LmZpbHRlcnM/Lm1hcChkZWNvZGVGaWx0ZXIpLFxyXG5cdFx0XHQpLFxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRjb25zdHJ1Y3RvcihzcGVjczoge1xyXG5cdFx0c291cmNlczogUmFkb25SZXRyaWV2YWwgfCBSYWRvblJldHJpZXZhbFtdO1xyXG5cdFx0c291cmNlc1JlZHVjZXI/OiBSYWRvblJlZHVjZXI7XHJcblx0XHR3aXRuZXNzUmVkdWNlcj86IFJhZG9uUmVkdWNlcjtcclxuXHR9KSB7XHJcblx0XHRjb25zdCBzb3VyY2VzID0gQXJyYXkuaXNBcnJheShzcGVjcy5zb3VyY2VzKVxyXG5cdFx0XHQ/IChzcGVjcy5zb3VyY2VzIGFzIFJhZG9uUmV0cmlldmFsW10pXHJcblx0XHRcdDogW3NwZWNzLnNvdXJjZXNdO1xyXG5cdFx0c3VwZXIoe1xyXG5cdFx0XHRzb3VyY2VzLFxyXG5cdFx0XHRzb3VyY2VzUmVkdWNlcjogc3BlY3M/LnNvdXJjZXNSZWR1Y2VyIHx8IHJlZHVjZXJzLk1vZGUoKSxcclxuXHRcdFx0d2l0bmVzc1JlZHVjZXI6IHNwZWNzPy53aXRuZXNzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcblx0XHR9KTtcclxuXHRcdGNvbnN0IGFyZ3NDb3VudCA9IHNvdXJjZXNcclxuXHRcdFx0Lm1hcCgocmV0cmlldmFsKSA9PiByZXRyaWV2YWwuYXJnc0NvdW50KVxyXG5cdFx0XHQucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2ICsgY3Vycik7XHJcblx0XHRpZiAoYXJnc0NvdW50ID4gMCkge1xyXG5cdFx0XHR0aHJvdyBUeXBlRXJyb3IoXCJSYWRvblJlcXVlc3Q6IHBhcmFtZXRlcml6ZWQgcmV0cmlldmFscyB3ZXJlIHBhc3NlZFwiKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBfZW5jb2RlKCk6IEJ1ZmZlciB7XHJcblx0XHRjb25zdCBwYXlsb2FkID0gdGhpcy50b1Byb3RvYnVmKCk7XHJcblx0XHRjb25zdCBlcnJNc2cgPSBSQURSZXF1ZXN0LnZlcmlmeShwYXlsb2FkKTtcclxuXHRcdGlmIChlcnJNc2cpIHtcclxuXHRcdFx0dGhyb3cgRXJyb3IoZXJyTXNnKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBSQURSZXF1ZXN0LmZyb21PYmplY3QocGF5bG9hZCk7XHJcblx0XHRcdHJldHVybiBCdWZmZXIuZnJvbShSQURSZXF1ZXN0LmVuY29kZShtZXNzYWdlKS5maW5pc2goKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYXN5bmMgZXhlY0RyeVJ1bih2ZXJib3NlID0gZmFsc2UpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cdFx0cmV0dXJuIChcclxuXHRcdFx0YXdhaXQgZXhlY1JhZG9uQnl0ZWNvZGUoXHJcblx0XHRcdFx0dGhpcy50b0J5dGVjb2RlKCksXHJcblx0XHRcdFx0XCItLWpzb25cIixcclxuXHRcdFx0XHR2ZXJib3NlID8gXCItLXZlcmJvc2VcIiA6IFwiXCIsXHJcblx0XHRcdClcclxuXHRcdCkudHJpbSgpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGdldCBkYXRhVHlwZSgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMuc291cmNlc1swXS5tZXRob2QgPT09IHJldHJpZXZhbHMuTWV0aG9kcy5STkdcclxuXHRcdFx0PyBcIlJhZG9uQnl0ZXNcIlxyXG5cdFx0XHQ6IHRoaXMuc291cmNlcz8uWzBdPy5zY3JpcHQ/Lm91dHB1dFR5cGVcclxuXHRcdFx0XHQ/IHRoaXMuc291cmNlc1swXS5zY3JpcHQub3V0cHV0VHlwZS5jb25zdHJ1Y3Rvci5uYW1lXHJcblx0XHRcdFx0OiBcIlJhZG9uQW55XCI7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZ2V0IHJhZEhhc2goKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiB0b0hleFN0cmluZyhzaGEyNTYodGhpcy5fZW5jb2RlKCkpLCBmYWxzZSk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgdG9CeXRlY29kZSgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRvSGV4U3RyaW5nKHRoaXMuX2VuY29kZSgpKTsgLy9lbmNvZGVSQURSZXF1ZXN0KHRoaXMudG9Qcm90b2J1ZigpKSwgdHJ1ZSlcclxuXHR9XHJcblxyXG5cdHB1YmxpYyB0b0pTT04oaHVtYW5pemU/OiBib29sZWFuKTogYW55IHtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdHJldHJpZXZlOiB0aGlzLnNvdXJjZXMubWFwKChyZXRyaWV2YWwpID0+IHJldHJpZXZhbC50b0pTT04oaHVtYW5pemUpKSxcclxuXHRcdFx0YWdncmVnYXRlOiB0aGlzLnNvdXJjZXNSZWR1Y2VyLnRvSlNPTihodW1hbml6ZSksXHJcblx0XHRcdHRhbGx5OiB0aGlzLndpdG5lc3NSZWR1Y2VyLnRvSlNPTihodW1hbml6ZSksXHJcblx0XHRcdC4uLihodW1hbml6ZSA/IHt9IDogeyB0aW1lX2xvY2s6IDAgfSksXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0cHVibGljIHRvUHJvdG9idWYoKTogYW55IHtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdC8vdGltZUxvY2s6IDAsXHJcblx0XHRcdHJldHJpZXZlOiB0aGlzLnNvdXJjZXMubWFwKChyZXRyaWV2YWwpID0+IHJldHJpZXZhbC50b1Byb3RvYnVmKCkpLFxyXG5cdFx0XHRhZ2dyZWdhdGU6IHRoaXMuc291cmNlc1JlZHVjZXIudG9Qcm90b2J1ZigpLFxyXG5cdFx0XHR0YWxseTogdGhpcy53aXRuZXNzUmVkdWNlci50b1Byb3RvYnVmKCksXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0cHVibGljIHdlaWdodCgpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIHRoaXMudG9CeXRlY29kZSgpLnNsaWNlKDIpLmxlbmd0aCAvIDI7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gUmFkb25SZXF1ZXN0RnJvbUFzc2V0cyhzcGVjczoge1xyXG5cdGFzc2V0czogT2JqZWN0O1xyXG5cdGFyZ3NNYXA6IFJlY29yZDxzdHJpbmcsIGFueSB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPjtcclxuXHRzb3VyY2VzUmVkdWNlcj86IFJhZG9uUmVkdWNlcjtcclxuXHR3aXRuZXNzUmVkdWNlcj86IFJhZG9uUmVkdWNlcjtcclxufSk6IFJhZG9uUmVxdWVzdCB7XHJcblx0Y29uc3Qgc291cmNlczogUmFkb25SZXRyaWV2YWxbXSA9IFtdO1xyXG5cdGNvbnN0IGRpY3QgPSByZXRyaWV2YWxzLmZyb21SYWRvbkFzc2V0cyhzcGVjcy5hc3NldHMpO1xyXG5cdC8vIGNvbnN0IGFyZ3M6IHN0cmluZ1tdW10gPSBbXVxyXG5cdE9iamVjdC5rZXlzKHNwZWNzLmFyZ3NNYXApLmZvckVhY2goKGtleSkgPT4ge1xyXG5cdFx0Y29uc3QgcmV0cmlldmFsOiBSYWRvblJldHJpZXZhbCA9IGRpY3Rba2V5XTtcclxuXHRcdGNvbnN0IGFyZ3MgPSAoc3BlY3MuYXJnc01hcCBhcyBhbnkpW2tleV07XHJcblx0XHRpZiAocmV0cmlldmFsLmFyZ3NDb3VudCA+IDApIHtcclxuXHRcdFx0aWYgKCFhcmdzIHx8IGFyZ3MubGVuZ3RoIDwgcmV0cmlldmFsLmFyZ3NDb3VudCkge1xyXG5cdFx0XHRcdHRocm93IFR5cGVFcnJvcihcclxuXHRcdFx0XHRcdGBJbnN1ZmZpY2llbnQgYXJncyBwYXNzZWQgdG8gcmV0cmlldmFsIG5hbWVkIGFzICcke2tleX0nOiAke2FyZ3MubGVuZ3RofSA8ICR7cmV0cmlldmFsLmFyZ3NDb3VudH1gLFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0c291cmNlcy5wdXNoKHJldHJpZXZhbC5mb2xkQXJncyhhcmdzKSk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHNvdXJjZXMucHVzaChyZXRyaWV2YWwpO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cdHJldHVybiBuZXcgUmFkb25SZXF1ZXN0KHtcclxuXHRcdHNvdXJjZXMsXHJcblx0XHRzb3VyY2VzUmVkdWNlcjogc3BlY3M/LnNvdXJjZXNSZWR1Y2VyLFxyXG5cdFx0d2l0bmVzc1JlZHVjZXI6IHNwZWNzPy53aXRuZXNzUmVkdWNlcixcclxuXHR9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIFJhZG9uU2NyaXB0PFxyXG5cdElucHV0VHlwZSBleHRlbmRzIFJhZG9uQW55ID0gUmFkb25TdHJpbmcsXHJcbj4oaW5wdXRUeXBlOiB7IG5ldyAob3BzPzogUmFkb25PcGVyYXRvcik6IElucHV0VHlwZSB9KTogSW5wdXRUeXBlIHtcclxuXHRpZiAoIWlucHV0VHlwZSlcclxuXHRcdHRocm93IFR5cGVFcnJvcihcclxuXHRcdFx0XCJJbnB1dCBSYWRvbiBkYXRhIHR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBkZWNsYXJpbmcgYSBuZXcgUmFkb24gc2NyaXB0LlwiLFxyXG5cdFx0KTtcclxuXHRyZXR1cm4gbmV3IGlucHV0VHlwZSgpO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25UZW1wbGF0ZSBleHRlbmRzIFJhZG9uQXJ0aWZhY3Qge1xyXG5cdHByb3RlY3RlZCBfYXJnc0NvdW50OiBudW1iZXI7XHJcblxyXG5cdHB1YmxpYyByZWFkb25seSBob21vZ2VuZW91czogYm9vbGVhbjtcclxuXHRwdWJsaWMgcmVhZG9ubHkgc2FtcGxlcz86IFJlY29yZDxzdHJpbmcsIEFyZ3M+O1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHNwZWNzOiB7XHJcblx0XHRcdHNvdXJjZXM6IFJhZG9uUmV0cmlldmFsIHwgUmFkb25SZXRyaWV2YWxbXTtcclxuXHRcdFx0c291cmNlc1JlZHVjZXI/OiBSYWRvblJlZHVjZXI7XHJcblx0XHRcdHdpdG5lc3NSZWR1Y2VyPzogUmFkb25SZWR1Y2VyO1xyXG5cdFx0fSxcclxuXHRcdHNhbXBsZXM/OiBSZWNvcmQ8c3RyaW5nLCBBcmdzPixcclxuXHQpIHtcclxuXHRcdGNvbnN0IHNvdXJjZXMgPSBBcnJheS5pc0FycmF5KHNwZWNzLnNvdXJjZXMpXHJcblx0XHRcdD8gKHNwZWNzLnNvdXJjZXMgYXMgUmFkb25SZXRyaWV2YWxbXSlcclxuXHRcdFx0OiBbc3BlY3Muc291cmNlc107XHJcblx0XHRzdXBlcih7XHJcblx0XHRcdHNvdXJjZXMsXHJcblx0XHRcdHNvdXJjZXNSZWR1Y2VyOiBzcGVjcz8uc291cmNlc1JlZHVjZXIgfHwgcmVkdWNlcnMuTW9kZSgpLFxyXG5cdFx0XHR3aXRuZXNzUmVkdWNlcjogc3BlY3M/LndpdG5lc3NSZWR1Y2VyIHx8IHJlZHVjZXJzLk1vZGUoKSxcclxuXHRcdH0pO1xyXG5cdFx0dGhpcy5fYXJnc0NvdW50ID0gc291cmNlc1xyXG5cdFx0XHQubWFwKChyZXRyaWV2YWwpID0+IHJldHJpZXZhbD8uYXJnc0NvdW50KVxyXG5cdFx0XHQucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBNYXRoLm1heChwcmV2LCBjdXJyKSwgMCk7XHJcblx0XHRpZiAodGhpcy5fYXJnc0NvdW50ID09PSAwKSB7XHJcblx0XHRcdHRocm93IFR5cGVFcnJvcihcIlJhZG9uVGVtcGxhdGU6IG5vIHBhcmFtZXRlcml6ZWQgcmV0cmlldmFscyB3ZXJlIHBhc3NlZFwiKTtcclxuXHRcdH1cclxuXHRcdHRoaXMuaG9tb2dlbmVvdXMgPSAhc291cmNlcy5maW5kKFxyXG5cdFx0XHQocmV0cmlldmFsKSA9PiByZXRyaWV2YWwuYXJnc0NvdW50ICE9PSB0aGlzLl9hcmdzQ291bnQsXHJcblx0XHQpO1xyXG5cdFx0aWYgKHNhbXBsZXMpIHtcclxuXHRcdFx0T2JqZWN0LmtleXMoc2FtcGxlcykuZm9yRWFjaCgoc2FtcGxlKSA9PiB7XHJcblx0XHRcdFx0bGV0IHNhbXBsZUFyZ3M6IEFyZ3MgPSBPYmplY3Qoc2FtcGxlcylbc2FtcGxlXTtcclxuXHRcdFx0XHRpZiAodHlwZW9mIHNhbXBsZUFyZ3MgPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0XHRcdHNhbXBsZUFyZ3MgPSBbc2FtcGxlQXJnc107XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChzYW1wbGVBcmdzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdGlmICghQXJyYXkuaXNBcnJheShzYW1wbGVBcmdzWzBdKSkge1xyXG5cdFx0XHRcdFx0XHRPYmplY3Qoc2FtcGxlcylbc2FtcGxlXSA9IEFycmF5KHNvdXJjZXMubGVuZ3RoKS5maWxsKHNhbXBsZUFyZ3MpO1xyXG5cdFx0XHRcdFx0XHRzYW1wbGVBcmdzID0gT2JqZWN0KHNhbXBsZXMpW3NhbXBsZV07XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNhbXBsZUFyZ3M/Lmxlbmd0aCAhPT0gc291cmNlcy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0dGhyb3cgVHlwZUVycm9yKFxyXG5cdFx0XHRcdFx0XHRcdGBSYWRvblRlbXBsYXRlOiBhcmd1bWVudHMgbWlzbWF0Y2ggaW4gc2FtcGxlIFwiJHtzYW1wbGV9XCI6ICR7c2FtcGxlQXJncz8ubGVuZ3RofSBzYW1wbGVzIGdpdmVuIHZzLiAke3NvdXJjZXMubGVuZ3RofSBleHBlY3RlZGAsXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRzYW1wbGVBcmdzPy5mb3JFYWNoKChzdWJhcmdzLCBpbmRleCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRpZiAoc3ViYXJncy5sZW5ndGggPCBzb3VyY2VzW2luZGV4XS5hcmdzQ291bnQpIHtcclxuXHRcdFx0XHRcdFx0XHR0aHJvdyBUeXBlRXJyb3IoXHJcblx0XHRcdFx0XHRcdFx0XHRgXFx4MWJbMTszM21SYWRvblJlcXVlc3RUZW1wbGF0ZTogYXJndW1lbnRzIG1pc21hdGNoIGluIHRlc3QgXFx4MWJbMTszMW0nJHtzYW1wbGV9J1xceDFiWzE7MzNtOiBcXHgxYlsxOzM3bVJldHJpZXZhbCAjJHtpbmRleH1cXHgxYlsxOzMzbTogJHtzdWJhcmdzPy5sZW5ndGh9IHBhcmFtZXRlcnMgZ2l2ZW4gdnMuICR7c291cmNlc1tpbmRleF0uYXJnc0NvdW50fSBleHBlY3RlZFxceDFiWzBtYCxcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLnNhbXBsZXMgPSBzYW1wbGVzO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIGdldCBhcmdzQ291bnQoKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiB0aGlzLl9hcmdzQ291bnQ7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYnVpbGRSYWRvblJlcXVlc3QoXHJcblx0XHRhcmdzOiBhbnkgfCBhbnlbXSB8IHN0cmluZ1tdIHwgc3RyaW5nW11bXSxcclxuXHQpOiBSYWRvblJlcXVlc3Qge1xyXG5cdFx0Y29uc3Qgc291cmNlczogUmFkb25SZXRyaWV2YWxbXSA9IFtdO1xyXG5cdFx0aWYgKHRoaXMuaG9tb2dlbmVvdXMpIHtcclxuXHRcdFx0Ly8gYXJncyBjYW4gYmUgZWl0aGVyIGFueSwgc3RyaW5nW10gb3Igc3RyaW5nWzBdW11cclxuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoYXJncykgJiYgYXJnc1swXSAmJiBBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7XHJcblx0XHRcdFx0aWYgKGFyZ3MubGVuZ3RoID4gMSkge1xyXG5cdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcclxuXHRcdFx0XHRcdFx0YFJhZG9uVGVtcGxhdGU6IGhvbW9nZW5lb3VzIHRlbXBsYXRlOiBhcmdzIHZlY3RvciBkaW1lbnNpb24gJHthcmdzLmxlbmd0aH0gPiAxLmAsXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRhcmdzID0gYXJnc1swXTtcclxuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZ3MpICYmIGFyZ3MubGVuZ3RoICE9PSB0aGlzLmFyZ3NDb3VudCkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXHJcblx0XHRcdFx0XHRgUmFkb25UZW1wbGF0ZTogaG9tb2dlbm91cyB0ZW1wbGF0ZTogbWlzc2luZyAke3RoaXMuYXJnc0NvdW50IC0gYXJncy5sZW5ndGh9IG91dCBvZiAke2FyZ3MubGVuZ3RofSBwYXJhbWV0ZXJzLmAsXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLnNvdXJjZXMuZm9yRWFjaCgocmV0cmlldmFsKSA9PlxyXG5cdFx0XHRcdHNvdXJjZXMucHVzaChyZXRyaWV2YWwuZm9sZEFyZ3MoYXJncykpLFxyXG5cdFx0XHQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0aWYgKCFBcnJheS5pc0FycmF5KGFyZ3MpIHx8IGFyZ3MubGVuZ3RoICE9PSB0aGlzLnNvdXJjZXMubGVuZ3RoKSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcclxuXHRcdFx0XHRcdGBSYWRvblRlbXBsYXRlOiBhcmdzIHZlY3RvciBkaW1lbnNpb24gJHthcmdzLmxlbmd0aH0gIT0gJHt0aGlzLnNvdXJjZXMubGVuZ3RofWAsXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLnNvdXJjZXMuZm9yRWFjaCgocmV0cmlldmFsLCBpbmRleCkgPT4ge1xyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdEFycmF5LmlzQXJyYXkoYXJnc1tpbmRleF0pICYmXHJcblx0XHRcdFx0XHRyZXRyaWV2YWwuYXJnc0NvdW50ICE9PSBhcmdzW2luZGV4XS5sZW5ndGhcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXHJcblx0XHRcdFx0XHRcdGBSYWRvblRlbXBsYXRlOiByZXRyaWV2YWwgIyR7aW5kZXggKyAxfTogbWlzbWF0Y2hpbmcgYXJncyBjb3VudDogJHtcclxuXHRcdFx0XHRcdFx0XHRhcmdzW2luZGV4XS5sZW5ndGhcclxuXHRcdFx0XHRcdFx0fSAhPSAke3JldHJpZXZhbC5hcmdzQ291bnR9IChbJHthcmdzW2luZGV4XX0pXWAsXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRzb3VyY2VzLnB1c2gocmV0cmlldmFsLmZvbGRBcmdzKGFyZ3NbaW5kZXhdKSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG5ldyBSYWRvblJlcXVlc3Qoe1xyXG5cdFx0XHRzb3VyY2VzLFxyXG5cdFx0XHRzb3VyY2VzUmVkdWNlcjogdGhpcy5zb3VyY2VzUmVkdWNlcixcclxuXHRcdFx0d2l0bmVzc1JlZHVjZXI6IHRoaXMud2l0bmVzc1JlZHVjZXIsXHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRvbk1vZGFsIGV4dGVuZHMgUmFkb25UZW1wbGF0ZSB7XHJcblx0cHJvdGVjdGVkIF9wcm92aWRlcnM6IEFycmF5PHN0cmluZz47XHJcblxyXG5cdGNvbnN0cnVjdG9yKHNwZWNzOiB7XHJcblx0XHRwcm92aWRlcnM/OiBBcnJheTxzdHJpbmc+O1xyXG5cdFx0cmV0cmlldmFsOiBSYWRvblJldHJpZXZhbDtcclxuXHRcdHNvdXJjZXNSZWR1Y2VyPzogUmFkb25SZWR1Y2VyO1xyXG5cdFx0d2l0bmVzc1JlZHVjZXI/OiBSYWRvblJlZHVjZXI7XHJcblx0fSkge1xyXG5cdFx0aWYgKCFzcGVjcy5yZXRyaWV2YWwuaXNNb2RhbCgpKSB7XHJcblx0XHRcdHRocm93IFR5cGVFcnJvcihcIlJhZG9uTW9kYWw6IG5vIG1vZGFsIHJldHJpZXZhbCB3YXMgcGFzc2VkLlwiKTtcclxuXHRcdH1cclxuXHRcdHN1cGVyKFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0c291cmNlczogW3NwZWNzLnJldHJpZXZhbF0sXHJcblx0XHRcdFx0c291cmNlc1JlZHVjZXI6IHNwZWNzPy5zb3VyY2VzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcblx0XHRcdFx0d2l0bmVzc1JlZHVjZXI6IHNwZWNzPy53aXRuZXNzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcblx0XHRcdH0sXHJcblx0XHRcdHNwZWNzLnJldHJpZXZhbD8uc2FtcGxlcyxcclxuXHRcdCk7XHJcblx0XHRpZiAoc3BlY3M/LnByb3ZpZGVycykge1xyXG5cdFx0XHR0aGlzLl9wcm92aWRlcnMgPSB0aGlzLl9jaGVja1Byb3ZpZGVycyhzcGVjcy5wcm92aWRlcnMpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5fcHJvdmlkZXJzID0gW107XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZ2V0IGFyZ3NDb3VudCgpOiBudW1iZXIge1xyXG5cdFx0Y29uc3QgX3Byb3ZpZGVyc0FyZ3NDb3VudCA9IE1hdGgubWF4KFxyXG5cdFx0XHQuLi50aGlzLnByb3ZpZGVycy5tYXAoKHVybCkgPT4gZ2V0V2lsZGNhcmRzQ291bnRGcm9tU3RyaW5nKHVybCkpLFxyXG5cdFx0KTtcclxuXHRcdHJldHVybiBfcHJvdmlkZXJzQXJnc0NvdW50ID4gMFxyXG5cdFx0XHQ/IE1hdGgubWF4KHRoaXMuX2FyZ3NDb3VudCwgX3Byb3ZpZGVyc0FyZ3NDb3VudClcclxuXHRcdFx0OiB0aGlzLl9hcmdzQ291bnQ7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZ2V0IHByb3ZpZGVycygpOiBBcnJheTxzdHJpbmc+IHtcclxuXHRcdHJldHVybiB0aGlzLl9wcm92aWRlcnM7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgc2V0IHByb3ZpZGVycyhwcm92aWRlcnM6IEFycmF5PHN0cmluZz4pIHtcclxuXHRcdHRoaXMuX3Byb3ZpZGVycyA9IHRoaXMuX2NoZWNrUHJvdmlkZXJzKHByb3ZpZGVycyk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYnVpbGRSYWRvblJlcXVlc3QoYXJncz86IGFueSB8IHN0cmluZ1tdKTogUmFkb25SZXF1ZXN0IHtcclxuXHRcdGlmICh0aGlzLnByb3ZpZGVycy5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25Nb2RhbDogbm8gcHJvdmlkZXJzIHdlcmUgcHJldmlvdXNseSBzZXR0bGVkLmApO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgdGVtcGxhdGUgPSB0aGlzLmJ1aWxkUmFkb25UZW1wbGF0ZSh0aGlzLnByb3ZpZGVycyk7XHJcblx0XHRyZXR1cm4gdGVtcGxhdGUuaG9tb2dlbmVvdXNcclxuXHRcdFx0PyB0ZW1wbGF0ZS5idWlsZFJhZG9uUmVxdWVzdChhcmdzKVxyXG5cdFx0XHQ6IHRlbXBsYXRlLmJ1aWxkUmFkb25SZXF1ZXN0KFxyXG5cdFx0XHRcdFx0dGVtcGxhdGUuc291cmNlcy5tYXAoKHNvdXJjZSkgPT4gYXJncy5zbGljZSgwLCBzb3VyY2UuYXJnc0NvdW50KSksXHJcblx0XHRcdFx0KTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBidWlsZFJhZG9uVGVtcGxhdGUocHJvdmlkZXJzPzogQXJyYXk8c3RyaW5nPik6IFJhZG9uVGVtcGxhdGUge1xyXG5cdFx0aWYgKCFwcm92aWRlcnMpIHtcclxuXHRcdFx0cHJvdmlkZXJzID0gdGhpcy5fY2hlY2tQcm92aWRlcnMoWy4uLnRoaXMuX3Byb3ZpZGVyc10pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cHJvdmlkZXJzID0gdGhpcy5fY2hlY2tQcm92aWRlcnMoWy4uLnByb3ZpZGVyc10pO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCFwcm92aWRlcnMgfHwgcHJvdmlkZXJzLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBSYWRvbk1vZGFsOiBubyBwcm92aWRlcnMgd2VyZSBzcGVjaWZpZWQuYCk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbmV3IFJhZG9uVGVtcGxhdGUoe1xyXG5cdFx0XHRzb3VyY2VzOiB0aGlzLnNvdXJjZXNbMF0uc3Bhd25SZXRyaWV2YWxzKC4uLnByb3ZpZGVycyksXHJcblx0XHRcdHNvdXJjZXNSZWR1Y2VyOiB0aGlzLnNvdXJjZXNSZWR1Y2VyLFxyXG5cdFx0XHR3aXRuZXNzUmVkdWNlcjogdGhpcy53aXRuZXNzUmVkdWNlcixcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0X2NoZWNrUHJvdmlkZXJzKHByb3ZpZGVyczogQXJyYXk8c3RyaW5nPik6IEFycmF5PHN0cmluZz4ge1xyXG5cdFx0cHJvdmlkZXJzLmZvckVhY2goKHByb3ZpZGVyKSA9PiB7XHJcblx0XHRcdGNvbnN0IFtzY2hlbWFdID0gcGFyc2VVUkwocHJvdmlkZXIpO1xyXG5cdFx0XHRpZiAoIXNjaGVtYS5zdGFydHNXaXRoKFwiaHR0cDovL1wiKSAmJiAhc2NoZW1hLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSkge1xyXG5cdFx0XHRcdHRocm93IFR5cGVFcnJvcihgUmFkb25Nb2RhbDogaW52YWxpZCBwcm92aWRlcjogJHtwcm92aWRlcn1gKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gcHJvdmlkZXJzO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uUmV0cmlldmFsIHtcclxuXHRwdWJsaWMgcmVhZG9ubHkgYXJnc0tleXM/OiBBcnJheTxzdHJpbmc+O1xyXG5cdHB1YmxpYyByZWFkb25seSBhcmdzQ291bnQ6IG51bWJlcjtcclxuXHRwdWJsaWMgcmVhZG9ubHkgbWV0aG9kOiByZXRyaWV2YWxzLk1ldGhvZHM7XHJcblx0cHVibGljIHJlYWRvbmx5IGF1dGhvcml0eT86IHN0cmluZztcclxuXHRwdWJsaWMgcmVhZG9ubHkgYm9keT86IGFueTtcclxuXHRwdWJsaWMgcmVhZG9ubHkgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XHJcblx0cHVibGljIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XHJcblx0cHVibGljIHJlYWRvbmx5IHF1ZXJ5Pzogc3RyaW5nO1xyXG5cdHB1YmxpYyByZWFkb25seSBzY2hlbWE/OiBzdHJpbmc7XHJcblx0cHVibGljIHJlYWRvbmx5IHNjcmlwdD86IF9SYWRvblNjcmlwdDtcclxuXHRwdWJsaWMgcmVhZG9ubHkgdXJsPzogc3RyaW5nO1xyXG5cclxuXHRwdWJsaWMgcmVhZG9ubHkgc2FtcGxlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRzcGVjczoge1xyXG5cdFx0XHRtZXRob2Q6IHJldHJpZXZhbHMuTWV0aG9kcztcclxuXHRcdFx0dXJsPzogc3RyaW5nO1xyXG5cdFx0XHRoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuXHRcdFx0Ym9keT86IGFueTtcclxuXHRcdFx0c2NyaXB0PzogUmFkb25Bbnk7XHJcblx0XHRcdGFyZ3NLZXlzPzogQXJyYXk8c3RyaW5nPjtcclxuXHRcdH0sXHJcblx0XHRzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LFxyXG5cdCkge1xyXG5cdFx0aWYgKFxyXG5cdFx0XHRzcGVjcy5tZXRob2QgPT09IHJldHJpZXZhbHMuTWV0aG9kcy5STkcgJiZcclxuXHRcdFx0KHNwZWNzPy51cmwgfHwgc3BlY3M/LmhlYWRlcnM/LnNpemUgfHwgc3BlY3M/LmJvZHkpXHJcblx0XHQpIHtcclxuXHRcdFx0dGhyb3cgVHlwZUVycm9yKFwiUmFkb25SZXRyaWV2YWw6IFJORyBhY2NlcHRzIG5vIFVSTHMgb3IgaGVhZGVyc1wiKTtcclxuXHRcdFx0Ly8gfSBlbHNlIGlmICghc3BlY3M/LnVybCAmJiAobWV0aG9kID09IE1ldGhvZHMuSHR0cFBvc3QgfHwgbWV0aG9kID09IE1ldGhvZHMuSHR0cEdldCkpIHtcclxuXHRcdFx0Ly8gICAgIHRocm93IFR5cGVFcnJvcihcIlJhZG9uUmV0cmlldmFsOiBVUkwgbXVzdCBiZSBzcGVjaWZpZWRcIik7XHJcblx0XHR9IGVsc2UgaWYgKHNwZWNzPy5ib2R5ICYmIHNwZWNzLm1ldGhvZCA9PT0gcmV0cmlldmFscy5NZXRob2RzLkh0dHBHZXQpIHtcclxuXHRcdFx0dGhyb3cgVHlwZUVycm9yKFxyXG5cdFx0XHRcdFwiUmFkb25SZXRyaWV2YWw6IGJvZHkgY2Fubm90IGJlIHNwZWNpZmllZCBpbiBIVFRQLUdFVCBxdWVyaWVzXCIsXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblx0XHR0aGlzLm1ldGhvZCA9IHNwZWNzLm1ldGhvZDtcclxuXHRcdGlmIChzcGVjcz8udXJsKSB7XHJcblx0XHRcdHRoaXMudXJsID0gc3BlY3MudXJsO1xyXG5cdFx0XHRpZiAoIWlzV2lsZGNhcmQoc3BlY3MudXJsKSkge1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRjb25zdCBwYXJ0cyA9IHBhcnNlVVJMKHNwZWNzLnVybCk7XHJcblx0XHRcdFx0XHR0aGlzLnNjaGVtYSA9IHBhcnRzWzBdO1xyXG5cdFx0XHRcdFx0aWYgKHBhcnRzWzFdICE9PSBcIlwiKSB0aGlzLmF1dGhvcml0eSA9IHBhcnRzWzFdO1xyXG5cdFx0XHRcdFx0aWYgKHBhcnRzWzJdICE9PSBcIlwiKSB0aGlzLnBhdGggPSBwYXJ0c1syXTtcclxuXHRcdFx0XHRcdGlmIChwYXJ0c1szXSAhPT0gXCJcIikgdGhpcy5xdWVyeSA9IHBhcnRzWzNdO1xyXG5cdFx0XHRcdH0gY2F0Y2gge31cclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0c3BlY3MubWV0aG9kID09PSByZXRyaWV2YWxzLk1ldGhvZHMuSHR0cEdldCB8fFxyXG5cdFx0XHRzcGVjcy5tZXRob2QgPT09IHJldHJpZXZhbHMuTWV0aG9kcy5IdHRwUG9zdCB8fFxyXG5cdFx0XHRzcGVjcy5tZXRob2QgPT09IHJldHJpZXZhbHMuTWV0aG9kcy5IdHRwSGVhZFxyXG5cdFx0KSB7XHJcblx0XHRcdHRoaXMudXJsID0gXCJcXFxcMFxcXFxcIjtcclxuXHRcdH1cclxuXHRcdGlmIChzcGVjcz8uaGVhZGVycykge1xyXG5cdFx0XHRpZiAodHlwZW9mIHNwZWNzLmhlYWRlcnMgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzcGVjcy5oZWFkZXJzKSkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXHJcblx0XHRcdFx0XHRcIlJhZG9uUmV0cmlldmFsOiBIVFRQIGhlYWRlcnMgbXVzdCBiZSBvZiB0eXBlIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cIixcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuaGVhZGVycyA9IHNwZWNzPy5oZWFkZXJzO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5ib2R5ID0gc3BlY3M/LmJvZHk7XHJcblx0XHRpZiAoc3BlY3M/LnNjcmlwdCkgdGhpcy5zY3JpcHQgPSBuZXcgX1JhZG9uU2NyaXB0KHNwZWNzPy5zY3JpcHQpO1xyXG5cdFx0dGhpcy5hcmdzQ291bnQgPSBNYXRoLm1heChcclxuXHRcdFx0Z2V0V2lsZGNhcmRzQ291bnRGcm9tU3RyaW5nKHRoaXM/LnVybCksXHJcblx0XHRcdGdldFdpbGRjYXJkc0NvdW50RnJvbVN0cmluZyh0aGlzPy5ib2R5KSxcclxuXHRcdFx0Li4uKE9iamVjdC5rZXlzKHRoaXM/LmhlYWRlcnMgfHwge30pLm1hcCgoa2V5KSA9PlxyXG5cdFx0XHRcdGdldFdpbGRjYXJkc0NvdW50RnJvbVN0cmluZyhrZXkpLFxyXG5cdFx0XHQpID8/IFtdKSxcclxuXHRcdFx0Li4uKE9iamVjdC52YWx1ZXModGhpcz8uaGVhZGVycyB8fCB7fSkubWFwKCh2YWx1ZSkgPT5cclxuXHRcdFx0XHRnZXRXaWxkY2FyZHNDb3VudEZyb21TdHJpbmcodmFsdWUpLFxyXG5cdFx0XHQpID8/IFtdKSxcclxuXHRcdFx0dGhpcy5zY3JpcHQ/LmFyZ3NDb3VudCgpIHx8IDAsXHJcblx0XHQpO1xyXG5cdFx0aWYgKHNhbXBsZXMgJiYgdGhpcy5hcmdzQ291bnQgPT09IDApIHtcclxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcclxuXHRcdFx0XHRcIlJhZG9uUmV0cmlldmFsOiBwYXNzZWQgc2FtcGxlcyB0byBub24tcGFyYW1ldGVyaXplZCByZXRyaWV2YWwuXCIsXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblx0XHR0aGlzLnNhbXBsZXMgPSBzYW1wbGVzO1xyXG5cdFx0aWYgKHNwZWNzPy5hcmdzS2V5cykge1xyXG5cdFx0XHRpZiAodGhpcy5hcmdzQ291bnQgPT09IDApIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG5cdFx0XHRcdFx0XCJSYWRvblJldHJpZXZhbDogcGFzc2VkIGFyZ3Mga2V5cyB0byBub24tcGFyYW1ldGVyaXplZCByZXRyaWV2YWxcIixcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHNwZWNzLmFyZ3NLZXlzLmxlbmd0aCAhPT0gdGhpcy5hcmdzQ291bnQpIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG5cdFx0XHRcdFx0YFJhZG9uUmV0cmlldmFsOiBwYXNzZWQgaW52YWxpZCBudW1iZXIgb2YgYXJncyBrZXlzOiAke3NwZWNzLmFyZ3NLZXlzLmxlbmd0aH0gIT0gJHt0aGlzLmFyZ3NDb3VudH1gLFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5hcmdzS2V5cyA9IHNwZWNzLmFyZ3NLZXlzO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIGlzTW9kYWwoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHR0aGlzLm1ldGhvZCAhPT0gcmV0cmlldmFscy5NZXRob2RzLlJORyAmJlxyXG5cdFx0XHQoIXRoaXMudXJsIHx8IHRoaXMudXJsID09PSBcIlxcXFwwXFxcXFwiKVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBpc1BhcmFtZXRlcml6ZWQoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5hcmdzQ291bnQgPiAwO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIG5ldyBSYWRvbiBSZXRyaWV2YWwgYnkgb3JkZXJseSByZXBsYWNpbmcgaW5kZXhlZCB3aWxkY2FyZHMgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzLlxyXG5cdCAqIEZhaWxzIGlmIG5vdCBwYXJhbWV0ZXJpemVkLCBvZiBpZiBwYXNzaW5nIHRvbyBtYW55IHBhcmFtZXRlcnMuXHJcblx0ICovXHJcblx0cHVibGljIGZvbGRBcmdzKGFyZ3M6IGFueSB8IHN0cmluZ1tdKTogUmFkb25SZXRyaWV2YWwge1xyXG5cdFx0aWYgKHRoaXMuYXJnc0NvdW50ID09PSAwKSB7XHJcblx0XHRcdHJldHVybiB0aGlzOyAvL3Rocm93IG5ldyBUeXBlRXJyb3IoYFJhZG9uUmV0cmlldmFsOiBjYW5ub3QgZm9sZCB1bnBhcmFtZXRlcml6ZWQgcmV0cmlldmFsYClcclxuXHRcdH1cclxuXHRcdGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSBbXTtcclxuXHRcdGlmIChBcnJheS5pc0FycmF5KGFyZ3MpKSB7XHJcblx0XHRcdGlmICgoYXJncyBhcyBhbnlbXSkubGVuZ3RoID4gdGhpcy5hcmdzQ291bnQpIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG5cdFx0XHRcdFx0YFJhZG9uUmV0cmlldmFsOiB0b28gbWF5IGFyZ3MgcGFzc2VkOiAke2FyZ3MubGVuZ3RofSA+ICR7dGhpcy5hcmdzQ291bnR9YCxcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHBhcmFtcy5wdXNoKC4uLihhcmdzIGFzIHN0cmluZ1tdKSk7XHJcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBhcmdzID09PSBcIm9iamVjdFwiKSB7XHJcblx0XHRcdGlmICghdGhpcy5hcmdzS2V5cykge1xyXG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXHJcblx0XHRcdFx0XHRgUmFkb25SZXRyaWV2YWw6IHVuZXhwZWN0ZWQgYXJncyBtYXA6IHVuZGVmaW5lZCBhcmdzIGtleXMuYCxcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuYXJnc0tleXMuZm9yRWFjaCgoa2V5KSA9PiB7XHJcblx0XHRcdFx0XHRpZiAoIWFyZ3Nba2V5XSkge1xyXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG5cdFx0XHRcdFx0XHRcdGBSYWRvblJldHJpZXZhbDogbWlzc2luZyB2YWx1ZSBmb3IgcGFyYW1ldGVyIFwiJHtrZXl9XCIuYCxcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHBhcmFtcy5wdXNoKGFyZ3Nba2V5XSBhcyBzdHJpbmcpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRwYXJhbXMucHVzaChhcmdzIGFzIHN0cmluZyk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbmV3IFJhZG9uUmV0cmlldmFsKHtcclxuXHRcdFx0bWV0aG9kOiB0aGlzLm1ldGhvZCxcclxuXHRcdFx0dXJsOiByZXBsYWNlV2lsZGNhcmRzKHRoaXMudXJsLCBwYXJhbXMpLFxyXG5cdFx0XHRib2R5OiByZXBsYWNlV2lsZGNhcmRzKHRoaXMuYm9keSwgcGFyYW1zKSxcclxuXHRcdFx0aGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKFxyXG5cdFx0XHRcdE9iamVjdC5lbnRyaWVzKHRoaXMuaGVhZGVycyB8fCB7fSkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcclxuXHRcdFx0XHRcdHJlcGxhY2VXaWxkY2FyZHMoa2V5LCBwYXJhbXMpLFxyXG5cdFx0XHRcdFx0cmVwbGFjZVdpbGRjYXJkcyh2YWx1ZSwgcGFyYW1zKSxcclxuXHRcdFx0XHRdKSxcclxuXHRcdFx0KSxcclxuXHRcdFx0c2NyaXB0OiB0aGlzLnNjcmlwdD8ucmVwbGFjZVdpbGRjYXJkcyguLi5wYXJhbXMpLFxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIG9uZSBvciBtb3JlIGNsb25lcyBvZiB0aGlzIHJldHJpZXZhbCwgaW4gd2hpY2ggdGhlIGluZGV4LTAgd2lsZGNhcmRcclxuXHQgKiB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiB2YWx1ZXMuIEZhaWxzIGlmIHRoZSByZXRyaWV2YWwgaXMgbm90IHBhcmFtZXRlcml6ZWQuXHJcblx0ICovXHJcblx0cHVibGljIHNwYXduUmV0cmlldmFscyguLi52YWx1ZXM6IHN0cmluZ1tdKTogUmFkb25SZXRyaWV2YWxbXSB7XHJcblx0XHRjb25zdCBfc3Bhd25lZDogUmFkb25SZXRyaWV2YWxbXSA9IFtdO1xyXG5cdFx0aWYgKHRoaXMuaXNNb2RhbCgpKSB7XHJcblx0XHRcdHZhbHVlcy5mb3JFYWNoKCh1cmwpID0+IHtcclxuXHRcdFx0XHRfc3Bhd25lZC5wdXNoKFxyXG5cdFx0XHRcdFx0bmV3IFJhZG9uUmV0cmlldmFsKHtcclxuXHRcdFx0XHRcdFx0YXJnc0tleXM6IHRoaXMuYXJnc0tleXMsXHJcblx0XHRcdFx0XHRcdGJvZHk6IHRoaXMuYm9keSxcclxuXHRcdFx0XHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxyXG5cdFx0XHRcdFx0XHRtZXRob2Q6IHRoaXMubWV0aG9kLFxyXG5cdFx0XHRcdFx0XHRzY3JpcHQ6IHRoaXMuc2NyaXB0Py5jbG9uZSgpLFxyXG5cdFx0XHRcdFx0XHR1cmwsXHJcblx0XHRcdFx0XHR9KSxcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmICh0aGlzLmFyZ3NDb3VudCA9PT0gMCkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXHJcblx0XHRcdFx0XHRgUmFkb25SZXRyaWV2YWw6IGNhbm5vdCBzcGF3biBmcm9tIHVucGFyYW1ldGVyaXplZCByZXRyaWV2YWxgLFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0X3NwYXduZWQucHVzaChcclxuXHRcdFx0XHRcdG5ldyBSYWRvblJldHJpZXZhbCh7XHJcblx0XHRcdFx0XHRcdG1ldGhvZDogdGhpcy5tZXRob2QsXHJcblx0XHRcdFx0XHRcdHVybDogc3BsaWNlV2lsZGNhcmQodGhpcy51cmwsIDAsIHZhbHVlLCB0aGlzLmFyZ3NDb3VudCksXHJcblx0XHRcdFx0XHRcdGJvZHk6IHNwbGljZVdpbGRjYXJkKHRoaXMuYm9keSwgMCwgdmFsdWUsIHRoaXMuYXJnc0NvdW50KSxcclxuXHRcdFx0XHRcdFx0aGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKFxyXG5cdFx0XHRcdFx0XHRcdE9iamVjdC5lbnRyaWVzKHRoaXMuaGVhZGVycyB8fCB7fSkubWFwKFxyXG5cdFx0XHRcdFx0XHRcdFx0KFtoZWFkZXJLZXksIGhlYWRlclZhbHVlXSkgPT4gW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRzcGxpY2VXaWxkY2FyZChoZWFkZXJLZXksIDAsIHZhbHVlLCB0aGlzLmFyZ3NDb3VudCksXHJcblx0XHRcdFx0XHRcdFx0XHRcdHNwbGljZVdpbGRjYXJkKGhlYWRlclZhbHVlLCAwLCB2YWx1ZSwgdGhpcy5hcmdzQ291bnQpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XSxcclxuXHRcdFx0XHRcdFx0XHQpLFxyXG5cdFx0XHRcdFx0XHQpLFxyXG5cdFx0XHRcdFx0XHRzY3JpcHQ6IHRoaXMuc2NyaXB0Py5zcGxpY2VXaWxkY2FyZCgwLCB2YWx1ZSksXHJcblx0XHRcdFx0XHRcdGFyZ3NLZXlzOiB0aGlzLmFyZ3NLZXlzPy5zbGljZSgxKSxcclxuXHRcdFx0XHRcdH0pLFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIF9zcGF3bmVkO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHRvSlNPTihodW1hbml6ZT86IGJvb2xlYW4pOiBhbnkge1xyXG5cdFx0Y29uc3Qga2luZCA9IFtcIlwiLCBcIkhUVFAtR0VUXCIsIFwiUk5HXCIsIFwiSFRUUC1QT1NUXCIsIFwiSFRUUC1IRUFEXCJdO1xyXG5cdFx0Y29uc3QganNvbjogYW55ID0ge1xyXG5cdFx0XHRraW5kOiBraW5kW3RoaXMubWV0aG9kXSwgLy8gaHVtYW5pemUgPyBNZXRob2RzW3RoaXMubWV0aG9kXSA6IHRoaXMubWV0aG9kLFxyXG5cdFx0fTtcclxuXHRcdGlmICh0aGlzLnVybCkganNvbi51cmwgPSB0aGlzLnVybDtcclxuXHRcdGlmICh0aGlzLmhlYWRlcnMpIHtcclxuXHRcdFx0anNvbi5oZWFkZXJzID0gT2JqZWN0LmVudHJpZXModGhpcy5oZWFkZXJzKTtcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLmJvZHkpIHtcclxuXHRcdFx0aWYgKHR5cGVvZiB0aGlzLmJvZHkgPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0XHRqc29uLmJvZHkgPSBodW1hbml6ZSA/IHRoaXMuYm9keSA6IHRvVXRmOEFycmF5KHRoaXMuYm9keSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0anNvbi5ib2R5ID0gdGhpcy5ib2R5O1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRqc29uLnNjcmlwdCA9IGh1bWFuaXplXHJcblx0XHRcdD8gdGhpcy5zY3JpcHQ/LnRvU3RyaW5nKClcclxuXHRcdFx0OiBBcnJheS5mcm9tKGZyb21IZXhTdHJpbmcodGhpcy5zY3JpcHQ/LnRvQnl0ZWNvZGUoKSB8fCBcIjB4ODBcIikpO1xyXG5cdFx0cmV0dXJuIGpzb247XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgdG9Qcm90b2J1ZigpOiBhbnkge1xyXG5cdFx0Y29uc3QgcHJvdG9idWY6IGFueSA9IHtcclxuXHRcdFx0a2luZDogdGhpcy5tZXRob2QsXHJcblx0XHR9O1xyXG5cdFx0aWYgKHRoaXMudXJsKSBwcm90b2J1Zi51cmwgPSB0aGlzLnVybDtcclxuXHRcdGlmICh0aGlzLmhlYWRlcnMpIHtcclxuXHRcdFx0cHJvdG9idWYuaGVhZGVycyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuaGVhZGVycykubWFwKFxyXG5cdFx0XHRcdChbaGVhZGVyS2V5LCBoZWFkZXJWYWx1ZV0pID0+IHtcclxuXHRcdFx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0XHRcdGxlZnQ6IGhlYWRlcktleSxcclxuXHRcdFx0XHRcdFx0cmlnaHQ6IGhlYWRlclZhbHVlLFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuYm9keSkge1xyXG5cdFx0XHRjb25zdCB1dGY4QXJyYXkgPSB0b1V0ZjhBcnJheSh0aGlzLmJvZHkpO1xyXG5cdFx0XHRwcm90b2J1Zi5ib2R5ID0gdXRmOEFycmF5O1xyXG5cdFx0fVxyXG5cdFx0cHJvdG9idWYuc2NyaXB0ID0gT2JqZWN0LnZhbHVlcyhcclxuXHRcdFx0VWludDhBcnJheS5mcm9tKGNib3IuZW5jb2RlKHRoaXMuc2NyaXB0Py5lbmNvZGUoKSB8fCBbXSkpLFxyXG5cdFx0KTtcclxuXHRcdHJldHVybiBwcm90b2J1ZjtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBvcHNDb3VudCgpOiBhbnkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2NvdW50T3BzKHRoaXMuc2NyaXB0Py5lbmNvZGUoKSB8fCBbXSk7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgX2NvdW50T3BzKGl0ZW1zOiBhbnlbXSk6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gaXRlbXMubGVuZ3RoID4gMFxyXG5cdFx0XHQ/IGl0ZW1zXHJcblx0XHRcdFx0XHQubWFwKChpdGVtKSA9PiAoQXJyYXkuaXNBcnJheShpdGVtKSA/IHRoaXMuX2NvdW50T3BzKGl0ZW0pIDogMSkpXHJcblx0XHRcdFx0XHQucmVkdWNlKChzdW0sIGEpID0+IHN1bSArIGEpXHJcblx0XHRcdDogMDtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBuYW1lc3BhY2UgZmlsdGVycyB7XHJcblx0ZXhwb3J0IGNvbnN0IE9wY29kZXMgPSBGaWx0ZXJzO1xyXG5cdGV4cG9ydCBjb25zdCBDbGFzcyA9IFJhZG9uRmlsdGVyO1xyXG5cdGV4cG9ydCBmdW5jdGlvbiBNb2RlKCkge1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvbkZpbHRlcihGaWx0ZXJzLk1vZGUpO1xyXG5cdH1cclxuXHRleHBvcnQgZnVuY3Rpb24gU3RkZXYoc3RkZXY6IG51bWJlcikge1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvbkZpbHRlcihGaWx0ZXJzLlN0YW5kYXJkRGV2aWF0aW9uLCBzdGRldik7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgbmFtZXNwYWNlIHJlZHVjZXJzIHtcclxuXHRleHBvcnQgY29uc3QgT3Bjb2RlcyA9IFJlZHVjZXJzO1xyXG5cdGV4cG9ydCBjb25zdCBDbGFzcyA9IFJhZG9uUmVkdWNlcjtcclxuXHRleHBvcnQgZnVuY3Rpb24gTW9kZSguLi5maWx0ZXJzOiBSYWRvbkZpbHRlcltdKSB7XHJcblx0XHRyZXR1cm4gbmV3IFJhZG9uUmVkdWNlcihSZWR1Y2Vycy5Nb2RlLCBmaWx0ZXJzKTtcclxuXHR9XHJcblx0ZXhwb3J0IGZ1bmN0aW9uIE1lYW4oLi4uZmlsdGVyczogUmFkb25GaWx0ZXJbXSkge1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvblJlZHVjZXIoUmVkdWNlcnMuTWVhbkF2ZXJhZ2UsIGZpbHRlcnMpO1xyXG5cdH1cclxuXHRleHBvcnQgZnVuY3Rpb24gTWVkaWFuKC4uLmZpbHRlcnM6IFJhZG9uRmlsdGVyW10pIHtcclxuXHRcdHJldHVybiBuZXcgUmFkb25SZWR1Y2VyKFJlZHVjZXJzLk1lZGlhbkF2ZXJhZ2UsIGZpbHRlcnMpO1xyXG5cdH1cclxuXHRleHBvcnQgZnVuY3Rpb24gU3RkZXYoLi4uZmlsdGVyczogUmFkb25GaWx0ZXJbXSkge1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvblJlZHVjZXIoUmVkdWNlcnMuU3RhbmRhcmREZXZpYXRpb24sIGZpbHRlcnMpO1xyXG5cdH1cclxuXHRleHBvcnQgZnVuY3Rpb24gQ29uY2F0SGFzaCguLi5maWx0ZXJzOiBSYWRvbkZpbHRlcltdKSB7XHJcblx0XHRyZXR1cm4gbmV3IFJhZG9uUmVkdWNlcihSZWR1Y2Vycy5Db25jYXRlbmF0ZUFuZEhhc2gsIGZpbHRlcnMpO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0IGZ1bmN0aW9uIFByaWNlQWdncmVnYXRlKCkge1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvblJlZHVjZXIoUmVkdWNlcnMuTWVhbkF2ZXJhZ2UsIFtmaWx0ZXJzLlN0ZGV2KDEuNCldKTtcclxuXHR9XHJcblx0ZXhwb3J0IGZ1bmN0aW9uIFByaWNlVGFsbHkoKSB7XHJcblx0XHRyZXR1cm4gbmV3IFJhZG9uUmVkdWNlcihSZWR1Y2Vycy5NZWFuQXZlcmFnZSwgW2ZpbHRlcnMuU3RkZXYoMi41KV0pO1xyXG5cdH1cclxufVxyXG5cclxuaW1wb3J0ICogYXMgY2NkciBmcm9tIFwiLi9jY2RyL2luZGV4LmpzXCI7XHJcbmV4cG9ydCBuYW1lc3BhY2UgcmV0cmlldmFscyB7XHJcblx0ZXhwb3J0IGNvbnN0IHJwYyA9IGNjZHI7XHJcblxyXG5cdGV4cG9ydCBmdW5jdGlvbiBmcm9tUmFkb25Bc3NldHMoXHJcblx0XHRhc3NldHM6IE9iamVjdCxcclxuXHQpOiBSZWNvcmQ8c3RyaW5nLCBSYWRvblJldHJpZXZhbD4ge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm94eShhc3NldHMsIHByb3h5SGFuZGxlcihSYWRvblJldHJpZXZhbCkpO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0IGVudW0gTWV0aG9kcyB7XHJcblx0XHROb25lID0gMHgwLFxyXG5cdFx0SHR0cEdldCA9IDB4MDEsXHJcblx0XHRIdHRwSGVhZCA9IDB4MDQsXHJcblx0XHRIdHRwUG9zdCA9IDB4MDMsXHJcblx0XHRSTkcgPSAweDAyLFxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIFdpdG5ldCByYW5kb21uZXNzIGRhdGEgc291cmNlIG9iamVjdC5cclxuXHQgKiBAcGFyYW0gc2NyaXB0IChPcHRpb25hbCkgUmFkb24gU2NyaXB0IHRvIGFwcGx5IHRvIHRoZSByYW5kb20gc2VlZCBwcm9wb3NlZCBieSBldmVyeSBzaW5nbGUgd2l0bmVzcyxcclxuXHQgKiBiZWZvcmUgYWdncmVnYXRpb24uXHJcblx0ICoqL1xyXG5cdGV4cG9ydCBmdW5jdGlvbiBSTkcoc2NyaXB0PzogUmFkb25BbnkpIHtcclxuXHRcdGNvbnN0IHJldHJpZXZhbCA9IG5ldyBSYWRvblJldHJpZXZhbCh7IG1ldGhvZDogTWV0aG9kcy5STkcsIHNjcmlwdCB9KTtcclxuXHRcdGlmIChcclxuXHRcdFx0cmV0cmlldmFsPy5zY3JpcHQgJiZcclxuXHRcdFx0cmV0cmlldmFsPy5zY3JpcHQ/LmlucHV0VHlwZT8uY29uc3RydWN0b3IubmFtZSAhPT0gXCJSYWRvbkJ5dGVzXCJcclxuXHRcdCkge1xyXG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwiUk5HIHNjcmlwdHMgcmVxdWlyZSBbUmFkb25CeXRlc10gYXMgaW5wdXQgdHlwZVwiKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiByZXRyaWV2YWw7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgSFRUUC9HRVQgZGF0YSByZXRyaWV2YWwgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSBzcGVjcyBSYWRvbiBSZXRyaWV2YWwgc3BlY3MuXHJcblx0ICoqL1xyXG5cdGV4cG9ydCBmdW5jdGlvbiBIdHRwR2V0KHNwZWNzOiB7XHJcblx0XHQvKipcclxuXHRcdCAqIEhUVFAgcmVxdWVzdCBVUkwuXHJcblx0XHQgKi9cclxuXHRcdHVybD86IHN0cmluZztcclxuXHRcdC8qKlxyXG5cdFx0ICogSFRUUCByZXF1ZXN0IGhlYWRlcnMuXHJcblx0XHQgKi9cclxuXHRcdGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG5cdFx0LyoqXHJcblx0XHQgKiBSYWRvblNjcmlwdCBmb3IgcHJvY2Vzc2luZyByZXR1cm5lZCB2YWx1ZS5cclxuXHRcdCAqL1xyXG5cdFx0c2NyaXB0PzogUmFkb25Bbnk7XHJcblx0XHQvKipcclxuXHRcdCAqIE5hbWVzIG9mIGluZGV4ZWQgcGFyYW1ldGVycyAob3B0aW9uYWwsIGlmIGFueSkuXHJcblx0XHQgKi9cclxuXHRcdGFyZ3NLZXlzPzogc3RyaW5nW107XHJcblx0XHQvKipcclxuXHRcdCAqIE1hcCBvZiBwcmUtc2V0IHBhcmFtZXRlcnMgKG9uIHBhcmFtZXRlcml6ZWQgcmV0cmlldmFscywgb25seSkuXHJcblx0XHQgKi9cclxuXHRcdHNhbXBsZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XHJcblx0fSkge1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbChcclxuXHRcdFx0e1xyXG5cdFx0XHRcdG1ldGhvZDogTWV0aG9kcy5IdHRwR2V0LFxyXG5cdFx0XHRcdHVybDogc3BlY3M/LnVybCxcclxuXHRcdFx0XHRoZWFkZXJzOiBzcGVjcz8uaGVhZGVycyxcclxuXHRcdFx0XHRzY3JpcHQ6IHNwZWNzPy5zY3JpcHQsXHJcblx0XHRcdFx0YXJnc0tleXM6IHNwZWNzPy5hcmdzS2V5cyxcclxuXHRcdFx0fSxcclxuXHRcdFx0c3BlY3M/LnNhbXBsZXMsXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIEhUVFAvSEVBRCBkYXRhIHJldHJpZXZhbCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHNwZWNzIFJhZG9uIFJldHJpZXZhbCBzcGVjcy5cclxuXHQgKiovXHJcblx0ZXhwb3J0IGZ1bmN0aW9uIEh0dHBIZWFkKHNwZWNzOiB7XHJcblx0XHQvKipcclxuXHRcdCAqIEhUVFAgcmVxdWVzdCBVUkxcclxuXHRcdCAqL1xyXG5cdFx0dXJsPzogc3RyaW5nO1xyXG5cdFx0LyoqXHJcblx0XHQgKiBIVFRQIHJlcXVlc3QgaGVhZGVyc1xyXG5cdFx0ICovXHJcblx0XHRoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuXHRcdC8qKlxyXG5cdFx0ICogUmFkb24gc2NyaXB0IGZvciBwcm9jZXNzaW5nIHJldHVybmVkIHZhbHVlLlxyXG5cdFx0ICovXHJcblx0XHRzY3JpcHQ/OiBSYWRvbkFueTtcclxuXHRcdC8qKlxyXG5cdFx0ICogTmFtZXMgb2YgaW5kZXhlZCBwYXJhbWV0ZXJzIChvcHRpb25hbCwgaWYgYW55KVxyXG5cdFx0ICovXHJcblx0XHRhcmdzS2V5cz86IHN0cmluZ1tdO1xyXG5cdFx0LyoqXHJcblx0XHQgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG5cdFx0ICovXHJcblx0XHRzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xyXG5cdH0pIHtcclxuXHRcdHJldHVybiBuZXcgUmFkb25SZXRyaWV2YWwoXHJcblx0XHRcdHtcclxuXHRcdFx0XHRtZXRob2Q6IE1ldGhvZHMuSHR0cEhlYWQsXHJcblx0XHRcdFx0dXJsOiBzcGVjcz8udXJsLFxyXG5cdFx0XHRcdGhlYWRlcnM6IHNwZWNzPy5oZWFkZXJzLFxyXG5cdFx0XHRcdHNjcmlwdDogc3BlY3M/LnNjcmlwdCxcclxuXHRcdFx0XHRhcmdzS2V5czogc3BlY3M/LmFyZ3NLZXlzLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRzcGVjcz8uc2FtcGxlcyxcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgSFRUUC9QT1NUIGRhdGEgcmV0cmlldmFsIG9iamVjdC5cclxuXHQgKiBAcGFyYW0gc3BlY3MgUmFkb24gUmV0cmlldmFsIHNwZWNzLlxyXG5cdCAqKi9cclxuXHRleHBvcnQgZnVuY3Rpb24gSHR0cFBvc3Qoc3BlY3M6IHtcclxuXHRcdC8qKlxyXG5cdFx0ICogSFRUUCByZXF1ZXN0IFVSTFxyXG5cdFx0ICovXHJcblx0XHR1cmw/OiBzdHJpbmc7XHJcblx0XHQvKipcclxuXHRcdCAqIEhUVFAgcmVxdWVzdCBib2R5XHJcblx0XHQgKi9cclxuXHRcdGJvZHk/OiBzdHJpbmc7XHJcblx0XHQvKipcclxuXHRcdCAqIEhUVFAgcmVxdWVzdCBoZWFkZXJzXHJcblx0XHQgKi9cclxuXHRcdGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG5cdFx0LyoqXHJcblx0XHQgKiBSYWRvbiBzY3JpcHQgZm9yIHByb2Nlc3NpbmcgcmV0dXJuZWQgdmFsdWUuXHJcblx0XHQgKi9cclxuXHRcdHNjcmlwdD86IFJhZG9uQW55O1xyXG5cdFx0LyoqXHJcblx0XHQgKiBOYW1lcyBvZiBpbmRleGVkIHBhcmFtZXRlcnMgKG9wdGlvbmFsLCBpZiBhbnkpXHJcblx0XHQgKi9cclxuXHRcdGFyZ3NLZXlzPzogc3RyaW5nW107XHJcblx0XHQvKipcclxuXHRcdCAqIE1hcCBvZiBwcmUtc2V0IHBhcmFtZXRlcnMgKG9uIHBhcmFtZXRlcml6ZWQgcmV0cmlldmFscywgb25seSkuXHJcblx0XHQgKi9cclxuXHRcdHNhbXBsZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XHJcblx0fSkge1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbChcclxuXHRcdFx0e1xyXG5cdFx0XHRcdG1ldGhvZDogTWV0aG9kcy5IdHRwUG9zdCxcclxuXHRcdFx0XHR1cmw6IHNwZWNzPy51cmwsXHJcblx0XHRcdFx0aGVhZGVyczogc3BlY3M/LmhlYWRlcnMsXHJcblx0XHRcdFx0Ym9keTogc3BlY3M/LmJvZHksXHJcblx0XHRcdFx0c2NyaXB0OiBzcGVjcz8uc2NyaXB0LFxyXG5cdFx0XHRcdGFyZ3NLZXlzOiBzcGVjcz8uYXJnc0tleXMsXHJcblx0XHRcdH0sXHJcblx0XHRcdHNwZWNzPy5zYW1wbGVzLFxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBHcmFwaFFMLXF1ZXJ5IGRhdGEgc291cmNlIG9iamVjdC5cclxuXHQgKiBAcGFyYW0gc3BlY3MgUmFkb24gUmV0cmlldmFsIHNwZWNzLlxyXG5cdCAqKi9cclxuXHRleHBvcnQgZnVuY3Rpb24gR3JhcGhRTFF1ZXJ5KHNwZWNzOiB7XHJcblx0XHQvKipcclxuXHRcdCAqIEdyYXBoUUwgVVJMIGVuZHBvaW50XHJcblx0XHQgKi9cclxuXHRcdHVybD86IHN0cmluZztcclxuXHRcdC8qKlxyXG5cdFx0ICogR3JhcGhRTCBxdWVyeVxyXG5cdFx0ICovXHJcblx0XHRxdWVyeTogc3RyaW5nO1xyXG5cdFx0LyoqXHJcblx0XHQgKiBSYWRvbiBzY3JpcHQgZm9yIHByb2Nlc3NpbmcgcmV0dXJuZWQgdmFsdWUuXHJcblx0XHQgKi9cclxuXHRcdHNjcmlwdD86IFJhZG9uQW55O1xyXG5cdFx0LyoqXHJcblx0XHQgKiBOYW1lcyBvZiBpbmRleGVkIHBhcmFtZXRlcnMgKG9wdGlvbmFsLCBpZiBhbnkpXHJcblx0XHQgKi9cclxuXHRcdGFyZ3NLZXlzPzogc3RyaW5nW107XHJcblx0XHQvKipcclxuXHRcdCAqIE1hcCBvZiBwcmUtc2V0IHBhcmFtZXRlcnMgKG9uIHBhcmFtZXRlcml6ZWQgcmV0cmlldmFscywgb25seSkuXHJcblx0XHQgKi9cclxuXHRcdHNhbXBsZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XHJcblx0fSkge1xyXG5cdFx0cmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbChcclxuXHRcdFx0e1xyXG5cdFx0XHRcdG1ldGhvZDogTWV0aG9kcy5IdHRwUG9zdCxcclxuXHRcdFx0XHR1cmw6IHNwZWNzLnVybCxcclxuXHRcdFx0XHRib2R5OiBge1wicXVlcnlcIjpcIiR7Z3JhcGhRbENvbXByZXNzKHNwZWNzLnF1ZXJ5KS5yZXBsYWNlQWxsKCdcIicsICdcXFxcXCInKX1cIn1gLFxyXG5cdFx0XHRcdGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLThcIiB9LFxyXG5cdFx0XHRcdHNjcmlwdDogc3BlY3M/LnNjcmlwdCxcclxuXHRcdFx0XHRhcmdzS2V5czogc3BlY3M/LmFyZ3NLZXlzLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRzcGVjcz8uc2FtcGxlcyxcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgSlNPTi1SUEMgZGF0YSByZXRyaWV2YWwgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSBzcGVjcyBSYWRvbiBSZXRyaWV2YWwgc3BlY3MuXHJcblx0ICoqL1xyXG5cdGV4cG9ydCBmdW5jdGlvbiBKc29uUlBDKHNwZWNzOiB7XHJcblx0XHQvKipcclxuXHRcdCAqIEpTT04tUlBDIG1ldGhvZCBhbmQgcGFyYW1ldGVycy5cclxuXHRcdCAqL1xyXG5cdFx0cnBjOiB7IG1ldGhvZDogc3RyaW5nOyBwYXJhbXM/OiBhbnkgfTtcclxuXHRcdC8qKlxyXG5cdFx0ICogUmFkb24gc2NyaXB0IGZvciBwcm9jZXNzaW5nIHJldHVybmVkIHZhbHVlLlxyXG5cdFx0ICovXHJcblx0XHRzY3JpcHQ/OiBSYWRvbkFueTtcclxuXHRcdC8qKlxyXG5cdFx0ICogTmFtZXMgb2YgaW5kZXhlZCBwYXJhbWV0ZXJzIChvcHRpb25hbCwgaWYgYW55KVxyXG5cdFx0ICovXHJcblx0XHRhcmdzS2V5cz86IHN0cmluZ1tdO1xyXG5cdFx0LyoqXHJcblx0XHQgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG5cdFx0ICovXHJcblx0XHRzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xyXG5cdH0pIHtcclxuXHRcdHJldHVybiBuZXcgUmFkb25SZXRyaWV2YWwoXHJcblx0XHRcdHtcclxuXHRcdFx0XHRtZXRob2Q6IHJldHJpZXZhbHMuTWV0aG9kcy5IdHRwUG9zdCxcclxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7XHJcblx0XHRcdFx0XHRqc29ucnBjOiBcIjIuMFwiLFxyXG5cdFx0XHRcdFx0bWV0aG9kOiBzcGVjcy5ycGMubWV0aG9kLFxyXG5cdFx0XHRcdFx0cGFyYW1zOiBzcGVjcy5ycGM/LnBhcmFtcyxcclxuXHRcdFx0XHRcdGlkOiAxLFxyXG5cdFx0XHRcdH0pLnJlcGxhY2VBbGwoXCJcXFxcXFxcXFwiLCBcIlxcXFxcIiksXHJcblx0XHRcdFx0aGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOFwiIH0sXHJcblx0XHRcdFx0c2NyaXB0OiBzcGVjcz8uc2NyaXB0LFxyXG5cdFx0XHRcdGFyZ3NLZXlzOiBzcGVjcz8uYXJnc0tleXMsXHJcblx0XHRcdH0sXHJcblx0XHRcdHNwZWNzPy5zYW1wbGVzLFxyXG5cdFx0KTtcclxuXHR9XHJcbn1cclxuZXhwb3J0IG5hbWVzcGFjZSB0eXBlcyB7XHJcblx0ZXhwb3J0IGNvbnN0IFJhZG9uQXJyYXkgPSBfUmFkb25BcnJheTtcclxuXHRleHBvcnQgY29uc3QgUmFkb25Cb29sZWFuID0gX1JhZG9uQm9vbGVhbjtcclxuXHRleHBvcnQgY29uc3QgUmFkb25CeXRlcyA9IF9SYWRvbkJ5dGVzO1xyXG5cdGV4cG9ydCBjb25zdCBSYWRvbkZsb2F0ID0gX1JhZG9uRmxvYXQ7XHJcblx0ZXhwb3J0IGNvbnN0IFJhZG9uSW50ZWdlciA9IF9SYWRvbkludGVnZXI7XHJcblx0ZXhwb3J0IGNvbnN0IFJhZG9uTWFwID0gX1JhZG9uTWFwO1xyXG5cdGV4cG9ydCBjb25zdCBSYWRvblNjcmlwdCA9IF9SYWRvblNjcmlwdDtcclxuXHRleHBvcnQgY29uc3QgUmFkb25TdHJpbmcgPSBfUmFkb25TdHJpbmc7XHJcblx0ZXhwb3J0IGNvbnN0IFJhZG9uRW5jb2RpbmdzID0gX1JhZG9uRW5jb2RpbmdzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwcm94eUhhbmRsZXI8VD4odDogeyBuZXcgKHNwZWNzOiBhbnkpOiBUIH0pIHtcclxuXHRyZXR1cm4ge1xyXG5cdFx0Z2V0KHRhcmdldDogYW55LCBwcm9wOiBzdHJpbmcpIHtcclxuXHRcdFx0Y29uc3QgZm91bmQgPSB0YXJnZXRbcHJvcF0gPz8gZmluZEtleUluT2JqZWN0KHRhcmdldCwgcHJvcCk7XHJcblx0XHRcdC8vIGlmICghZm91bmQpIHtcclxuXHRcdFx0Ly8gICAgIHRocm93IEV2YWxFcnJvcihgWycke3Byb3B9J10gd2FzIG5vdCBmb3VuZCBpbiBkaWN0aW9uYXJ5YClcclxuXHRcdFx0Ly8gfSBlbHNlXHJcblx0XHRcdGlmIChmb3VuZCAmJiAhKGZvdW5kIGluc3RhbmNlb2YgdCkpIHtcclxuXHRcdFx0XHR0aHJvdyBUeXBlRXJyb3IoXHJcblx0XHRcdFx0XHRgWycke3Byb3B9J10gd2FzIGZvdW5kIHdpdGggdHlwZSAke2ZvdW5kPy5jb25zdHJ1Y3Rvcj8ubmFtZX0gaW5zdGVhZCBvZiAke3QubmFtZX0hYCxcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBmb3VuZDtcclxuXHRcdH0sXHJcblx0fTtcclxufVxyXG5cclxuZnVuY3Rpb24gZmluZEtleUluT2JqZWN0KGRpY3Q6IGFueSwgdGFnOiBzdHJpbmcpIHtcclxuXHRmb3IgKGNvbnN0IGtleSBpbiBkaWN0KSB7XHJcblx0XHRpZiAodHlwZW9mIGRpY3Rba2V5XSA9PT0gXCJvYmplY3RcIikge1xyXG5cdFx0XHRpZiAoa2V5ID09PSB0YWcpIHtcclxuXHRcdFx0XHRyZXR1cm4gZGljdFtrZXldO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGNvbnN0IGZvdW5kOiBhbnkgPSBmaW5kS2V5SW5PYmplY3QoZGljdFtrZXldLCB0YWcpO1xyXG5cdFx0XHRcdGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbiJdfQ==