@decaf-ts/for-fabric 0.1.61 → 0.1.63

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 (423) hide show
  1. package/dist/for-fabric.cjs +2744 -2
  2. package/dist/for-fabric.js +2833 -2
  3. package/lib/bin/cli.cjs +2 -1
  4. package/lib/cli-module.cjs +151 -39
  5. package/lib/cli-utils.cjs +64 -2
  6. package/lib/cli-utils.d.ts +2 -0
  7. package/lib/client/FabricClientAdapter.cjs +1 -1
  8. package/lib/client/FabricClientDispatch.cjs +2 -1
  9. package/lib/client/FabricClientDispatch.d.ts +1 -1
  10. package/lib/client/FabricClientPaginator.cjs +1 -1
  11. package/lib/client/FabricClientRepository.cjs +1 -1
  12. package/lib/client/FabricClientStatement.cjs +1 -1
  13. package/lib/client/collections/generation.cjs +76 -108
  14. package/lib/client/collections/generation.d.ts +24 -5
  15. package/lib/client/collections/index.cjs +1 -1
  16. package/lib/client/constants.cjs +1 -1
  17. package/lib/client/crypto.cjs +1 -1
  18. package/lib/client/erc20/FabricERC20ClientRepository.cjs +1 -1
  19. package/lib/client/erc20/index.cjs +1 -1
  20. package/lib/client/fabric-fs.cjs +1 -1
  21. package/lib/client/fabric-hsm.cjs +1 -1
  22. package/lib/client/index.cjs +1 -1
  23. package/lib/client/indexes/generation.cjs +10 -7
  24. package/lib/client/indexes/generation.d.ts +1 -1
  25. package/lib/client/indexes/index.cjs +1 -1
  26. package/lib/client/logging.cjs +1 -1
  27. package/lib/client/services/FabricEnrollmentService.cjs +1 -1
  28. package/lib/client/services/FabricIdentityService.cjs +1 -1
  29. package/lib/client/services/RegistrationRequestBuilder.cjs +1 -1
  30. package/lib/client/services/constants.cjs +1 -1
  31. package/lib/client/services/index.cjs +1 -1
  32. package/lib/client/types.cjs +1 -1
  33. package/lib/client/utils.cjs +1 -1
  34. package/lib/contract/Address.cjs +1 -1
  35. package/lib/contract/AddressContract.cjs +1 -1
  36. package/lib/contract/BatchContract.cjs +1 -1
  37. package/lib/contract/OtherProductContract.cjs +30 -0
  38. package/lib/contract/OtherProductContract.d.ts +5 -0
  39. package/lib/contract/OtherProductSharedContract.cjs +30 -0
  40. package/lib/contract/OtherProductSharedContract.d.ts +5 -0
  41. package/lib/contract/Product.cjs +1 -1
  42. package/lib/contract/ProductContract.cjs +1 -1
  43. package/lib/contract/User.cjs +1 -1
  44. package/lib/contract/UserContract.cjs +1 -1
  45. package/lib/contract/index.cjs +3 -1
  46. package/lib/contract/models/Audit.cjs +21 -3
  47. package/lib/contract/models/Audit.d.ts +2 -1
  48. package/lib/contract/models/BaseIdentifiedModel.cjs +1 -1
  49. package/lib/contract/models/BaseModel.cjs +1 -1
  50. package/lib/contract/models/Batch.cjs +3 -3
  51. package/lib/contract/models/Leaflet.cjs +3 -3
  52. package/lib/contract/models/LeafletFile.cjs +1 -1
  53. package/lib/contract/models/Market.cjs +1 -1
  54. package/lib/contract/models/OtherProduct.cjs +74 -0
  55. package/lib/contract/models/OtherProduct.d.ts +12 -0
  56. package/lib/contract/models/OtherProductShared.cjs +75 -0
  57. package/lib/contract/models/OtherProductShared.d.ts +12 -0
  58. package/lib/contract/models/Product.cjs +5 -5
  59. package/lib/contract/models/ProductStrength.cjs +1 -1
  60. package/lib/contract/models/constants.cjs +1 -1
  61. package/lib/contract/models/decorators.cjs +16 -9
  62. package/lib/contract/models/decorators.d.ts +8 -5
  63. package/lib/contract/models/gtin.cjs +1 -1
  64. package/lib/contracts/ContractAdapter.cjs +1 -1
  65. package/lib/contracts/ContractContext.cjs +1 -1
  66. package/lib/contracts/ContractPrivateDataAdapter.cjs +1 -1
  67. package/lib/contracts/FabricConstruction.cjs +2 -2
  68. package/lib/contracts/FabricContractPaginator.cjs +1 -1
  69. package/lib/contracts/FabricContractRepository.cjs +1 -1
  70. package/lib/contracts/FabricContractRepository.d.ts +3 -1
  71. package/lib/contracts/FabricContractRepositoryObservableHandler.cjs +1 -1
  72. package/lib/contracts/FabricContractSequence.cjs +5 -5
  73. package/lib/contracts/FabricContractStatement.cjs +1 -1
  74. package/lib/contracts/PrivateSequence.cjs +1 -1
  75. package/lib/contracts/crud/crud-contract.cjs +1 -1
  76. package/lib/contracts/crud/index.cjs +1 -1
  77. package/lib/contracts/crud/serialized-crud-contract.cjs +1 -1
  78. package/lib/contracts/erc20/erc20contract.cjs +1 -1
  79. package/lib/contracts/erc20/index.cjs +1 -1
  80. package/lib/contracts/erc20/models.cjs +1 -1
  81. package/lib/contracts/index.cjs +8 -7
  82. package/lib/contracts/index.d.ts +1 -0
  83. package/lib/contracts/logging.cjs +1 -1
  84. package/lib/contracts/overrides.cjs +8 -0
  85. package/lib/contracts/overrides.d.ts +1 -0
  86. package/lib/contracts/private-data.cjs +1 -1
  87. package/lib/contracts/types.cjs +1 -1
  88. package/lib/contracts/types.d.ts +1 -0
  89. package/lib/contracts/uuid.cjs +75 -0
  90. package/lib/contracts/uuid.d.ts +2 -0
  91. package/lib/esm/bin/cli.js +1 -1
  92. package/lib/esm/cli-module.js +153 -41
  93. package/lib/esm/cli-utils.d.ts +2 -0
  94. package/lib/esm/cli-utils.js +60 -2
  95. package/lib/esm/client/FabricClientAdapter.js +1 -1
  96. package/lib/esm/client/FabricClientDispatch.d.ts +1 -1
  97. package/lib/esm/client/FabricClientDispatch.js +2 -1
  98. package/lib/esm/client/FabricClientPaginator.js +1 -1
  99. package/lib/esm/client/FabricClientRepository.js +1 -1
  100. package/lib/esm/client/FabricClientStatement.js +1 -1
  101. package/lib/esm/client/collections/generation.d.ts +24 -5
  102. package/lib/esm/client/collections/generation.js +71 -104
  103. package/lib/esm/client/collections/index.js +1 -1
  104. package/lib/esm/client/constants.js +1 -1
  105. package/lib/esm/client/crypto.js +1 -1
  106. package/lib/esm/client/erc20/FabricERC20ClientRepository.js +1 -1
  107. package/lib/esm/client/erc20/index.js +1 -1
  108. package/lib/esm/client/fabric-fs.js +1 -1
  109. package/lib/esm/client/fabric-hsm.js +1 -1
  110. package/lib/esm/client/index.js +1 -1
  111. package/lib/esm/client/indexes/generation.d.ts +1 -1
  112. package/lib/esm/client/indexes/generation.js +10 -7
  113. package/lib/esm/client/indexes/index.js +1 -1
  114. package/lib/esm/client/logging.js +1 -1
  115. package/lib/esm/client/services/FabricEnrollmentService.js +1 -1
  116. package/lib/esm/client/services/FabricIdentityService.js +1 -1
  117. package/lib/esm/client/services/RegistrationRequestBuilder.js +1 -1
  118. package/lib/esm/client/services/constants.js +1 -1
  119. package/lib/esm/client/services/index.js +1 -1
  120. package/lib/esm/client/types.js +1 -1
  121. package/lib/esm/client/utils.js +1 -1
  122. package/lib/esm/contract/Address.js +1 -1
  123. package/lib/esm/contract/AddressContract.js +1 -1
  124. package/lib/esm/contract/BatchContract.js +1 -1
  125. package/lib/esm/contract/OtherProductContract.d.ts +5 -0
  126. package/lib/esm/contract/OtherProductContract.js +27 -0
  127. package/lib/esm/contract/OtherProductSharedContract.d.ts +5 -0
  128. package/lib/esm/contract/OtherProductSharedContract.js +27 -0
  129. package/lib/esm/contract/Product.js +1 -1
  130. package/lib/esm/contract/ProductContract.js +1 -1
  131. package/lib/esm/contract/User.js +1 -1
  132. package/lib/esm/contract/UserContract.js +1 -1
  133. package/lib/esm/contract/index.js +3 -1
  134. package/lib/esm/contract/models/Audit.d.ts +2 -1
  135. package/lib/esm/contract/models/Audit.js +23 -5
  136. package/lib/esm/contract/models/BaseIdentifiedModel.js +1 -1
  137. package/lib/esm/contract/models/BaseModel.js +1 -1
  138. package/lib/esm/contract/models/Batch.js +3 -3
  139. package/lib/esm/contract/models/Leaflet.js +3 -3
  140. package/lib/esm/contract/models/LeafletFile.js +1 -1
  141. package/lib/esm/contract/models/Market.js +1 -1
  142. package/lib/esm/contract/models/OtherProduct.d.ts +12 -0
  143. package/lib/esm/contract/models/OtherProduct.js +71 -0
  144. package/lib/esm/contract/models/OtherProductShared.d.ts +12 -0
  145. package/lib/esm/contract/models/OtherProductShared.js +72 -0
  146. package/lib/esm/contract/models/Product.js +5 -5
  147. package/lib/esm/contract/models/ProductStrength.js +1 -1
  148. package/lib/esm/contract/models/constants.js +1 -1
  149. package/lib/esm/contract/models/decorators.d.ts +8 -5
  150. package/lib/esm/contract/models/decorators.js +16 -9
  151. package/lib/esm/contract/models/gtin.js +1 -1
  152. package/lib/esm/contracts/ContractAdapter.js +1 -1
  153. package/lib/esm/contracts/ContractContext.js +1 -1
  154. package/lib/esm/contracts/ContractPrivateDataAdapter.js +1 -1
  155. package/lib/esm/contracts/FabricConstruction.js +2 -2
  156. package/lib/esm/contracts/FabricContractPaginator.js +1 -1
  157. package/lib/esm/contracts/FabricContractRepository.d.ts +3 -1
  158. package/lib/esm/contracts/FabricContractRepository.js +1 -1
  159. package/lib/esm/contracts/FabricContractRepositoryObservableHandler.js +1 -1
  160. package/lib/esm/contracts/FabricContractSequence.js +5 -5
  161. package/lib/esm/contracts/FabricContractStatement.js +1 -1
  162. package/lib/esm/contracts/PrivateSequence.js +1 -1
  163. package/lib/esm/contracts/crud/crud-contract.js +1 -1
  164. package/lib/esm/contracts/crud/index.js +1 -1
  165. package/lib/esm/contracts/crud/serialized-crud-contract.js +1 -1
  166. package/lib/esm/contracts/erc20/erc20contract.js +1 -1
  167. package/lib/esm/contracts/erc20/index.js +1 -1
  168. package/lib/esm/contracts/erc20/models.js +1 -1
  169. package/lib/esm/contracts/index.d.ts +1 -0
  170. package/lib/esm/contracts/index.js +2 -1
  171. package/lib/esm/contracts/logging.js +1 -1
  172. package/lib/esm/contracts/overrides.d.ts +1 -0
  173. package/lib/esm/contracts/overrides.js +6 -0
  174. package/lib/esm/contracts/private-data.js +1 -1
  175. package/lib/esm/contracts/types.d.ts +1 -0
  176. package/lib/esm/contracts/types.js +1 -1
  177. package/lib/esm/contracts/uuid.d.ts +2 -0
  178. package/lib/esm/contracts/uuid.js +38 -0
  179. package/lib/esm/index.js +1 -1
  180. package/lib/esm/shared/ClientSerializer.js +1 -1
  181. package/lib/esm/shared/DeterministicSerializer.js +1 -1
  182. package/lib/esm/shared/SimpleDeterministicSerializer.js +1 -1
  183. package/lib/esm/shared/constants.d.ts +4 -3
  184. package/lib/esm/shared/constants.js +4 -3
  185. package/lib/esm/shared/decorators.d.ts +15 -2
  186. package/lib/esm/shared/decorators.js +115 -70
  187. package/lib/esm/shared/erc20/erc20-constants.js +1 -1
  188. package/lib/esm/shared/erc20/index.js +1 -1
  189. package/lib/esm/shared/errors.js +1 -1
  190. package/lib/esm/shared/events.js +1 -1
  191. package/lib/esm/shared/fabric-types.js +1 -1
  192. package/lib/esm/shared/index.js +1 -1
  193. package/lib/esm/shared/interfaces/Checkable.js +1 -1
  194. package/lib/esm/shared/interfaces/index.js +1 -1
  195. package/lib/esm/shared/math.js +1 -1
  196. package/lib/esm/shared/model/FabricBaseModel.js +1 -1
  197. package/lib/esm/shared/model/FabricIdentifiedBaseModel.js +1 -1
  198. package/lib/esm/shared/model/Identity.js +1 -1
  199. package/lib/esm/shared/model/IdentityCredentials.js +1 -1
  200. package/lib/esm/shared/model/index.js +1 -1
  201. package/lib/esm/shared/overrides/Model.d.ts +7 -0
  202. package/lib/esm/shared/overrides/Model.js +1 -1
  203. package/lib/esm/shared/overrides/index.js +1 -1
  204. package/lib/esm/shared/overrides/overrides.js +29 -16
  205. package/lib/esm/shared/types.js +1 -1
  206. package/lib/esm/version.d.ts +1 -1
  207. package/lib/esm/version.js +2 -2
  208. package/lib/index.cjs +1 -1
  209. package/lib/shared/ClientSerializer.cjs +1 -1
  210. package/lib/shared/DeterministicSerializer.cjs +1 -1
  211. package/lib/shared/SimpleDeterministicSerializer.cjs +1 -1
  212. package/lib/shared/constants.cjs +4 -3
  213. package/lib/shared/constants.d.ts +4 -3
  214. package/lib/shared/decorators.cjs +119 -69
  215. package/lib/shared/decorators.d.ts +15 -2
  216. package/lib/shared/erc20/erc20-constants.cjs +1 -1
  217. package/lib/shared/erc20/index.cjs +1 -1
  218. package/lib/shared/errors.cjs +1 -1
  219. package/lib/shared/events.cjs +1 -1
  220. package/lib/shared/fabric-types.cjs +1 -1
  221. package/lib/shared/index.cjs +1 -1
  222. package/lib/shared/interfaces/Checkable.cjs +1 -1
  223. package/lib/shared/interfaces/index.cjs +1 -1
  224. package/lib/shared/math.cjs +1 -1
  225. package/lib/shared/model/FabricBaseModel.cjs +1 -1
  226. package/lib/shared/model/FabricIdentifiedBaseModel.cjs +1 -1
  227. package/lib/shared/model/Identity.cjs +1 -1
  228. package/lib/shared/model/IdentityCredentials.cjs +1 -1
  229. package/lib/shared/model/index.cjs +1 -1
  230. package/lib/shared/overrides/Model.cjs +1 -1
  231. package/lib/shared/overrides/Model.d.ts +7 -0
  232. package/lib/shared/overrides/index.cjs +1 -1
  233. package/lib/shared/overrides/overrides.cjs +29 -16
  234. package/lib/shared/types.cjs +1 -1
  235. package/lib/version.cjs +2 -2
  236. package/lib/version.d.ts +1 -1
  237. package/package.json +4 -3
  238. package/dist/for-fabric.cjs.map +0 -1
  239. package/dist/for-fabric.js.map +0 -1
  240. package/lib/bin/cli.js.map +0 -1
  241. package/lib/cli-module.js.map +0 -1
  242. package/lib/cli-utils.js.map +0 -1
  243. package/lib/client/FabricClientAdapter.js.map +0 -1
  244. package/lib/client/FabricClientDispatch.js.map +0 -1
  245. package/lib/client/FabricClientPaginator.js.map +0 -1
  246. package/lib/client/FabricClientRepository.js.map +0 -1
  247. package/lib/client/FabricClientStatement.js.map +0 -1
  248. package/lib/client/collections/generation.js.map +0 -1
  249. package/lib/client/collections/index.js.map +0 -1
  250. package/lib/client/constants.js.map +0 -1
  251. package/lib/client/crypto.js.map +0 -1
  252. package/lib/client/erc20/FabricERC20ClientRepository.js.map +0 -1
  253. package/lib/client/erc20/index.js.map +0 -1
  254. package/lib/client/fabric-fs.js.map +0 -1
  255. package/lib/client/fabric-hsm.js.map +0 -1
  256. package/lib/client/index.js.map +0 -1
  257. package/lib/client/indexes/generation.js.map +0 -1
  258. package/lib/client/indexes/index.js.map +0 -1
  259. package/lib/client/logging.js.map +0 -1
  260. package/lib/client/services/FabricEnrollmentService.js.map +0 -1
  261. package/lib/client/services/FabricIdentityService.js.map +0 -1
  262. package/lib/client/services/RegistrationRequestBuilder.js.map +0 -1
  263. package/lib/client/services/constants.js.map +0 -1
  264. package/lib/client/services/index.js.map +0 -1
  265. package/lib/client/types.js.map +0 -1
  266. package/lib/client/utils.js.map +0 -1
  267. package/lib/contract/Address.js.map +0 -1
  268. package/lib/contract/AddressContract.js.map +0 -1
  269. package/lib/contract/BatchContract.js.map +0 -1
  270. package/lib/contract/Product.js.map +0 -1
  271. package/lib/contract/ProductContract.js.map +0 -1
  272. package/lib/contract/User.js.map +0 -1
  273. package/lib/contract/UserContract.js.map +0 -1
  274. package/lib/contract/index.js.map +0 -1
  275. package/lib/contract/models/Audit.js.map +0 -1
  276. package/lib/contract/models/BaseIdentifiedModel.js.map +0 -1
  277. package/lib/contract/models/BaseModel.js.map +0 -1
  278. package/lib/contract/models/Batch.js.map +0 -1
  279. package/lib/contract/models/Leaflet.js.map +0 -1
  280. package/lib/contract/models/LeafletFile.js.map +0 -1
  281. package/lib/contract/models/Market.js.map +0 -1
  282. package/lib/contract/models/Product.js.map +0 -1
  283. package/lib/contract/models/ProductStrength.js.map +0 -1
  284. package/lib/contract/models/constants.js.map +0 -1
  285. package/lib/contract/models/decorators.js.map +0 -1
  286. package/lib/contract/models/gtin.js.map +0 -1
  287. package/lib/contracts/ContractAdapter.js.map +0 -1
  288. package/lib/contracts/ContractContext.js.map +0 -1
  289. package/lib/contracts/ContractPrivateDataAdapter.js.map +0 -1
  290. package/lib/contracts/FabricConstruction.js.map +0 -1
  291. package/lib/contracts/FabricContractPaginator.js.map +0 -1
  292. package/lib/contracts/FabricContractRepository.js.map +0 -1
  293. package/lib/contracts/FabricContractRepositoryObservableHandler.js.map +0 -1
  294. package/lib/contracts/FabricContractSequence.js.map +0 -1
  295. package/lib/contracts/FabricContractStatement.js.map +0 -1
  296. package/lib/contracts/PrivateSequence.js.map +0 -1
  297. package/lib/contracts/crud/crud-contract.js.map +0 -1
  298. package/lib/contracts/crud/index.js.map +0 -1
  299. package/lib/contracts/crud/serialized-crud-contract.js.map +0 -1
  300. package/lib/contracts/erc20/erc20contract.js.map +0 -1
  301. package/lib/contracts/erc20/index.js.map +0 -1
  302. package/lib/contracts/erc20/models.js.map +0 -1
  303. package/lib/contracts/index.js.map +0 -1
  304. package/lib/contracts/logging.js.map +0 -1
  305. package/lib/contracts/private-data.js.map +0 -1
  306. package/lib/contracts/types.js.map +0 -1
  307. package/lib/esm/bin/cli.js.map +0 -1
  308. package/lib/esm/cli-module.js.map +0 -1
  309. package/lib/esm/cli-utils.js.map +0 -1
  310. package/lib/esm/client/FabricClientAdapter.js.map +0 -1
  311. package/lib/esm/client/FabricClientDispatch.js.map +0 -1
  312. package/lib/esm/client/FabricClientPaginator.js.map +0 -1
  313. package/lib/esm/client/FabricClientRepository.js.map +0 -1
  314. package/lib/esm/client/FabricClientStatement.js.map +0 -1
  315. package/lib/esm/client/collections/generation.js.map +0 -1
  316. package/lib/esm/client/collections/index.js.map +0 -1
  317. package/lib/esm/client/constants.js.map +0 -1
  318. package/lib/esm/client/crypto.js.map +0 -1
  319. package/lib/esm/client/erc20/FabricERC20ClientRepository.js.map +0 -1
  320. package/lib/esm/client/erc20/index.js.map +0 -1
  321. package/lib/esm/client/fabric-fs.js.map +0 -1
  322. package/lib/esm/client/fabric-hsm.js.map +0 -1
  323. package/lib/esm/client/index.js.map +0 -1
  324. package/lib/esm/client/indexes/generation.js.map +0 -1
  325. package/lib/esm/client/indexes/index.js.map +0 -1
  326. package/lib/esm/client/logging.js.map +0 -1
  327. package/lib/esm/client/services/FabricEnrollmentService.js.map +0 -1
  328. package/lib/esm/client/services/FabricIdentityService.js.map +0 -1
  329. package/lib/esm/client/services/RegistrationRequestBuilder.js.map +0 -1
  330. package/lib/esm/client/services/constants.js.map +0 -1
  331. package/lib/esm/client/services/index.js.map +0 -1
  332. package/lib/esm/client/types.js.map +0 -1
  333. package/lib/esm/client/utils.js.map +0 -1
  334. package/lib/esm/contract/Address.js.map +0 -1
  335. package/lib/esm/contract/AddressContract.js.map +0 -1
  336. package/lib/esm/contract/BatchContract.js.map +0 -1
  337. package/lib/esm/contract/Product.js.map +0 -1
  338. package/lib/esm/contract/ProductContract.js.map +0 -1
  339. package/lib/esm/contract/User.js.map +0 -1
  340. package/lib/esm/contract/UserContract.js.map +0 -1
  341. package/lib/esm/contract/index.js.map +0 -1
  342. package/lib/esm/contract/models/Audit.js.map +0 -1
  343. package/lib/esm/contract/models/BaseIdentifiedModel.js.map +0 -1
  344. package/lib/esm/contract/models/BaseModel.js.map +0 -1
  345. package/lib/esm/contract/models/Batch.js.map +0 -1
  346. package/lib/esm/contract/models/Leaflet.js.map +0 -1
  347. package/lib/esm/contract/models/LeafletFile.js.map +0 -1
  348. package/lib/esm/contract/models/Market.js.map +0 -1
  349. package/lib/esm/contract/models/Product.js.map +0 -1
  350. package/lib/esm/contract/models/ProductStrength.js.map +0 -1
  351. package/lib/esm/contract/models/constants.js.map +0 -1
  352. package/lib/esm/contract/models/decorators.js.map +0 -1
  353. package/lib/esm/contract/models/gtin.js.map +0 -1
  354. package/lib/esm/contracts/ContractAdapter.js.map +0 -1
  355. package/lib/esm/contracts/ContractContext.js.map +0 -1
  356. package/lib/esm/contracts/ContractPrivateDataAdapter.js.map +0 -1
  357. package/lib/esm/contracts/FabricConstruction.js.map +0 -1
  358. package/lib/esm/contracts/FabricContractPaginator.js.map +0 -1
  359. package/lib/esm/contracts/FabricContractRepository.js.map +0 -1
  360. package/lib/esm/contracts/FabricContractRepositoryObservableHandler.js.map +0 -1
  361. package/lib/esm/contracts/FabricContractSequence.js.map +0 -1
  362. package/lib/esm/contracts/FabricContractStatement.js.map +0 -1
  363. package/lib/esm/contracts/PrivateSequence.js.map +0 -1
  364. package/lib/esm/contracts/crud/crud-contract.js.map +0 -1
  365. package/lib/esm/contracts/crud/index.js.map +0 -1
  366. package/lib/esm/contracts/crud/serialized-crud-contract.js.map +0 -1
  367. package/lib/esm/contracts/erc20/erc20contract.js.map +0 -1
  368. package/lib/esm/contracts/erc20/index.js.map +0 -1
  369. package/lib/esm/contracts/erc20/models.js.map +0 -1
  370. package/lib/esm/contracts/index.js.map +0 -1
  371. package/lib/esm/contracts/logging.js.map +0 -1
  372. package/lib/esm/contracts/private-data.js.map +0 -1
  373. package/lib/esm/contracts/types.js.map +0 -1
  374. package/lib/esm/index.js.map +0 -1
  375. package/lib/esm/shared/ClientSerializer.js.map +0 -1
  376. package/lib/esm/shared/DeterministicSerializer.js.map +0 -1
  377. package/lib/esm/shared/SimpleDeterministicSerializer.js.map +0 -1
  378. package/lib/esm/shared/constants.js.map +0 -1
  379. package/lib/esm/shared/decorators.js.map +0 -1
  380. package/lib/esm/shared/erc20/erc20-constants.js.map +0 -1
  381. package/lib/esm/shared/erc20/index.js.map +0 -1
  382. package/lib/esm/shared/errors.js.map +0 -1
  383. package/lib/esm/shared/events.js.map +0 -1
  384. package/lib/esm/shared/fabric-types.js.map +0 -1
  385. package/lib/esm/shared/index.js.map +0 -1
  386. package/lib/esm/shared/interfaces/Checkable.js.map +0 -1
  387. package/lib/esm/shared/interfaces/index.js.map +0 -1
  388. package/lib/esm/shared/math.js.map +0 -1
  389. package/lib/esm/shared/model/FabricBaseModel.js.map +0 -1
  390. package/lib/esm/shared/model/FabricIdentifiedBaseModel.js.map +0 -1
  391. package/lib/esm/shared/model/Identity.js.map +0 -1
  392. package/lib/esm/shared/model/IdentityCredentials.js.map +0 -1
  393. package/lib/esm/shared/model/index.js.map +0 -1
  394. package/lib/esm/shared/overrides/Model.js.map +0 -1
  395. package/lib/esm/shared/overrides/index.js.map +0 -1
  396. package/lib/esm/shared/overrides/overrides.js.map +0 -1
  397. package/lib/esm/shared/types.js.map +0 -1
  398. package/lib/esm/version.js.map +0 -1
  399. package/lib/index.js.map +0 -1
  400. package/lib/shared/ClientSerializer.js.map +0 -1
  401. package/lib/shared/DeterministicSerializer.js.map +0 -1
  402. package/lib/shared/SimpleDeterministicSerializer.js.map +0 -1
  403. package/lib/shared/constants.js.map +0 -1
  404. package/lib/shared/decorators.js.map +0 -1
  405. package/lib/shared/erc20/erc20-constants.js.map +0 -1
  406. package/lib/shared/erc20/index.js.map +0 -1
  407. package/lib/shared/errors.js.map +0 -1
  408. package/lib/shared/events.js.map +0 -1
  409. package/lib/shared/fabric-types.js.map +0 -1
  410. package/lib/shared/index.js.map +0 -1
  411. package/lib/shared/interfaces/Checkable.js.map +0 -1
  412. package/lib/shared/interfaces/index.js.map +0 -1
  413. package/lib/shared/math.js.map +0 -1
  414. package/lib/shared/model/FabricBaseModel.js.map +0 -1
  415. package/lib/shared/model/FabricIdentifiedBaseModel.js.map +0 -1
  416. package/lib/shared/model/Identity.js.map +0 -1
  417. package/lib/shared/model/IdentityCredentials.js.map +0 -1
  418. package/lib/shared/model/index.js.map +0 -1
  419. package/lib/shared/overrides/Model.js.map +0 -1
  420. package/lib/shared/overrides/index.js.map +0 -1
  421. package/lib/shared/overrides/overrides.js.map +0 -1
  422. package/lib/shared/types.js.map +0 -1
  423. package/lib/version.js.map +0 -1
@@ -6,19 +6,24 @@ import path from "path";
6
6
  import { rollup } from "rollup";
7
7
  import replace from "@rollup/plugin-replace";
8
8
  import typescript from "@rollup/plugin-typescript";
9
- import { InternalError } from "@decaf-ts/db-decorators";
9
+ import { InternalError, SerializationError } from "@decaf-ts/db-decorators";
10
10
  import { generateModelIndexes, readModelFile, readModelFolders, writeIndexes, } from "./client/indexes/index.js";
11
11
  import { Model } from "@decaf-ts/decorator-validation";
12
- import { approveContract, ensureInfrastructureBooted, installContract, packageContract, commitChaincode, getContractStartCommand, } from "./cli-utils.js";
12
+ import { approveContract, ensureInfrastructureBooted, installContract, packageContract, commitChaincode, getContractStartCommand, compileWithTsconfigOverrides, } from "./cli-utils.js";
13
13
  import "./shared/overrides/index.js";
14
+ import ts from "typescript";
15
+ import { extractCollections as exCollections, writeCollections, } from "./client/collections/index.js";
16
+ import { Metadata } from "@decaf-ts/decoration";
14
17
  const logger = Logging.for("fabric");
15
18
  const compileCommand = new Command()
16
19
  .name("compile-contract")
17
20
  .description("Creates a global contract")
18
21
  .option("--dev", "compiles contracts without minification", false)
19
22
  .option("--debug", "makes attaching debugger possible", false)
20
- .option("--ccaas", "makes attaching debugger possible", false)
23
+ .option("--ccaas", "Ajusts the package commands to be deployed as ccaas", false)
21
24
  .option("--name <String>", "contract name", "global-contract")
25
+ .option("--bundle", "Bundles with rollup instead of using tsc", false)
26
+ .option("--ts-config-file <string>", "relative path to the ts config file based on cwd or absolute path", "./tsconfig.json")
22
27
  .option("--description <String>", "contract description", "Global contract implementation")
23
28
  .option("--strip-contract-name", "strip contract name from output", false)
24
29
  .option("--input <String>", "input folder for contracts", "lib/contracts")
@@ -40,37 +45,53 @@ const compileCommand = new Command()
40
45
  // eslint-disable-next-line prefer-const
41
46
  stripContractName,
42
47
  // eslint-disable-next-line prefer-const
43
- ccaas, } = options;
48
+ ccaas,
49
+ // eslint-disable-next-line prefer-const
50
+ bundle, tsConfigFile, } = options;
44
51
  const log = logger.for("compile-contract");
45
52
  log.debug(`running with options: ${JSON.stringify(options)} for ${pkg.name} version ${version}`);
53
+ tsConfigFile = path.isAbsolute(tsConfigFile)
54
+ ? tsConfigFile
55
+ : path.join(process.cwd(), tsConfigFile);
46
56
  output = stripContractName ? output : path.join(output, name);
47
57
  log.info(`Deleting existing output folder (if exists) under ${output}`);
48
58
  execSync(`rm -rf ${output}`);
49
- log.info(`bundling contract from ${input}`);
50
- const bundle = await rollup({
51
- input: `${input}/index.ts`,
52
- plugins: [
53
- replace({
54
- preventAssignment: true,
55
- delimiters: ["", ""],
56
- values: { "##VERSION##": version, "##PACKAGE##": pkg.name },
57
- }),
58
- typescript({
59
- tsconfig: "./tsconfig.json",
60
- compilerOptions: {
61
- outDir: output,
62
- },
63
- module: "esnext",
64
- declaration: false,
65
- }),
66
- ],
67
- });
68
- log.info(`withing contract to ${output} with name ${toPascalCase(name)}.js`);
69
- await bundle.write({
70
- file: `${output}/${toPascalCase(name)}.js`,
71
- format: "umd",
72
- name: `${toPascalCase(name)}.js`,
73
- });
59
+ if (bundle) {
60
+ log.info(`bundling contract from ${input}`);
61
+ const bundle = await rollup({
62
+ input: `${input}/index.ts`,
63
+ plugins: [
64
+ replace({
65
+ preventAssignment: true,
66
+ delimiters: ["", ""],
67
+ values: { "##VERSION##": version, "##PACKAGE##": pkg.name },
68
+ }),
69
+ typescript({
70
+ tsconfig: tsConfigFile,
71
+ compilerOptions: {
72
+ outDir: output,
73
+ },
74
+ module: "esnext",
75
+ declaration: false,
76
+ }),
77
+ ],
78
+ });
79
+ log.info(`withing contract to ${output} with name ${toPascalCase(name)}.js`);
80
+ await bundle.write({
81
+ file: `${output}/${toPascalCase(name)}.js`,
82
+ format: "umd",
83
+ name: `${toPascalCase(name)}.js`,
84
+ });
85
+ }
86
+ else {
87
+ compileWithTsconfigOverrides(tsConfigFile, {
88
+ outDir: output,
89
+ module: ts.ModuleKind.ESNext,
90
+ declaration: false,
91
+ sourceMap: false,
92
+ // rootDir: input,
93
+ });
94
+ }
74
95
  const scripts = {
75
96
  start: getContractStartCommand(debug, ccaas),
76
97
  "start:dev": "fabric-chaincode-node start --tls.enabled false",
@@ -85,7 +106,9 @@ const compileCommand = new Command()
85
106
  delete contractPackage.type;
86
107
  delete contractPackage.types;
87
108
  delete contractPackage.exports;
88
- contractPackage.main = `${toPascalCase(name)}.js`;
109
+ contractPackage.main = bundle
110
+ ? `${toPascalCase(name)}.js`
111
+ : `${input}/index.js`;
89
112
  fs.writeFileSync(path.join(output, "package.json"), JSON.stringify(contractPackage));
90
113
  log.info(`Installing and shrinkwrapping dependencies`);
91
114
  execSync(`npm install`, { cwd: output });
@@ -139,14 +162,32 @@ const extractCollections = new Command()
139
162
  .option("--file [String]", "the model file")
140
163
  .option("--folder [String]", "the model folder")
141
164
  .option("--outDir <String>", "the outdir. should match your contract folder")
165
+ .option("--mspIds <String>", "single mspId or stringified array")
166
+ .option("--mainMspId <String>", "single mspId")
167
+ .option("--overrides [String]", "stringified override object {requiredPeerCount: number, maxPeerCount: number, blockToLive: number, memberOnlyRead: number, memberOnlyWrite: number, endorsementPolicy: {}}")
142
168
  .description("Creates a the JSON index files to be submitted to along with the contract")
143
169
  .action(async (options) => {
144
170
  const pkg = JSON.parse(fs.readFileSync(path.join(process.cwd(), "package.json"), "utf-8"));
145
171
  const version = pkg.version;
146
- const log = logger.for("extract-indexes");
172
+ const log = logger.for("extract-collections");
147
173
  log.debug(`running with options: ${JSON.stringify(options)} for ${pkg.name} version ${version}`);
148
174
  // eslint-disable-next-line prefer-const
149
- let { file, folder, outDir } = options;
175
+ let { file, folder, outDir, mspIds, overrides, mainMspId } = options;
176
+ try {
177
+ try {
178
+ mspIds = mspIds ? JSON.parse(mspIds) : undefined;
179
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
180
+ }
181
+ catch (e) {
182
+ // do nothing
183
+ }
184
+ overrides = overrides
185
+ ? JSON.parse(overrides)
186
+ : { privateCols: {}, sharedCols: {} };
187
+ }
188
+ catch (e) {
189
+ throw new SerializationError(`Unable to extract mspids or overrides: ${e}`);
190
+ }
150
191
  const models = [];
151
192
  if (file) {
152
193
  models.push(...readModelFile(file));
@@ -155,17 +196,86 @@ const extractCollections = new Command()
155
196
  log.info(`Loading models from ${folder}...`);
156
197
  models.push(...(await readModelFolders(folder)));
157
198
  }
158
- const result = {};
159
199
  if (!file && !folder)
160
200
  throw new InternalError(`Must pass a file or a folder`);
161
- const privateOrShared = models.filter((m) => Model.isPrivate(m) || Model.isShared(m));
162
- for (const m of privateOrShared) {
163
- log.verbose(`Extracting collections for table ${Model.tableName(m)}`);
164
- generateModelIndexes(m, result);
201
+ const cols = await Promise.all(models.map(async (clazz) => {
202
+ const tableName = Model.tableName(clazz);
203
+ const meta = Metadata.get(clazz);
204
+ const mirrorMeta = Model.mirroredAt(clazz);
205
+ console.log(tableName);
206
+ const collections = {};
207
+ for (const msp of mspIds) {
208
+ collections[msp] = await exCollections(clazz, [msp, mainMspId], {},
209
+ // {
210
+ // sharedCols: Object.assign({}, overrides.sharedCols),
211
+ // privateCols: Object.assign({}, overrides.privateCols),
212
+ // },
213
+ !!mirrorMeta);
214
+ }
215
+ let mirrorCollection = undefined;
216
+ if (mirrorMeta) {
217
+ collections[mainMspId] = collections[mainMspId] || {};
218
+ Object.keys(collections).forEach((msp) => {
219
+ collections[mainMspId].privates = collections[msp].privates?.filter((p) => {
220
+ if (p.name !== mirrorMeta.resolver)
221
+ return true;
222
+ mirrorCollection = p;
223
+ return false;
224
+ });
225
+ });
226
+ }
227
+ const privatesCount = Object.values(collections)
228
+ .map((c) => c.privates)
229
+ .flat().length;
230
+ if (privatesCount)
231
+ log
232
+ .for(Model.tableName(clazz))
233
+ .info(`Found ${privatesCount} private collections to create`);
234
+ const sharedCount = Object.values(collections)
235
+ .map((c) => c.shared)
236
+ .flat().length;
237
+ log
238
+ .for(Model.tableName(clazz))
239
+ .info(`Found ${sharedCount} shared collections to create`);
240
+ if (mirrorCollection)
241
+ log
242
+ .for(Model.tableName(clazz))
243
+ .info(`Found one mirror collection ${mirrorMeta?.resolver}`);
244
+ const colList = Object.values(collections)
245
+ .map((c) => [...(c.privates || []), ...(c.shared || [])])
246
+ .flat();
247
+ let indexes;
248
+ if (colList.length) {
249
+ log
250
+ .for(Model.tableName(clazz))
251
+ .verbose(`generating indexes for collections`);
252
+ indexes = generateModelIndexes(clazz);
253
+ log
254
+ .for(Model.tableName(clazz))
255
+ .info(`found ${indexes.length} indexes`);
256
+ }
257
+ return {
258
+ indexes: indexes,
259
+ collections: colList,
260
+ mirror: mirrorCollection,
261
+ };
262
+ }));
263
+ const collectionsTo = [
264
+ ...cols.map((c) => c.collections).flat(),
265
+ ...cols.filter((c) => c.mirror).map((c) => c.mirror),
266
+ ];
267
+ if (collectionsTo.length) {
268
+ writeCollections(collectionsTo, outDir);
269
+ log.info(`Stored ${collectionsTo.length} collections to ${outDir}/collection_config.json`);
270
+ cols.forEach((c, i) => {
271
+ const { indexes, collections, mirror } = c;
272
+ const toIndex = [...collections, mirror].filter(Boolean);
273
+ toIndex.forEach((i) => {
274
+ writeIndexes(indexes, outDir, i.name);
275
+ log.info(`Stored ${toIndex.length} indexes to collection ${i.name}`);
276
+ });
277
+ });
165
278
  }
166
- log.verbose(`Found ${Object.keys(result).length} indexes to create`);
167
- log.debug(`Indexes: ${JSON.stringify(result)}`);
168
- writeIndexes(Object.values(result), outDir);
169
279
  });
170
280
  const ensureInfra = new Command()
171
281
  .name("await-infra")
@@ -198,6 +308,7 @@ const deployContract = new Command()
198
308
  const version = pkg.version;
199
309
  const log = logger.for("deploy-contract");
200
310
  log.debug(`running with options: ${JSON.stringify(options)} for ${pkg.name} version ${version}`);
311
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
201
312
  const { name, input, peers, trackerFolder, incrementVersion } = options;
202
313
  const peerIds = peers.split(",");
203
314
  const countPath = path.resolve(path.join(trackerFolder, `${name}.count`));
@@ -256,7 +367,8 @@ fabricCmd.addCommand(extractIndexes);
256
367
  fabricCmd.addCommand(ensureInfra);
257
368
  fabricCmd.addCommand(deployContract);
258
369
  fabricCmd.addCommand(getCryptoMaterial);
370
+ fabricCmd.addCommand(extractCollections);
259
371
  export default function fabric() {
260
372
  return fabricCmd;
261
373
  }
262
- //# sourceMappingURL=cli-module.js.map
374
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLW1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGktbW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNoQyxPQUFPLE9BQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLFVBQVUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUUsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLFlBQVksR0FDYixrQ0FBeUI7QUFDMUIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZELE9BQU8sRUFDTCxlQUFlLEVBQ2YsMEJBQTBCLEVBQzFCLGVBQWUsRUFDZixlQUFlLEVBQ2YsZUFBZSxFQUNmLHVCQUF1QixFQUN2Qiw0QkFBNEIsR0FDN0IsdUJBQW9CO0FBQ3JCLHFDQUE0QjtBQUM1QixPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUIsT0FBTyxFQUNMLGtCQUFrQixJQUFJLGFBQWEsRUFHbkMsZ0JBQWdCLEdBQ2pCLHNDQUFtQztBQUNwQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFaEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVyQyxNQUFNLGNB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M0IsUUFBUSxDQUFDLG9DQUFvQyxNQUFNLEVBQUUsRUFBRTtRQUNyRCxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRTtLQUNuQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVMLE1BQU0sU0FBUyxHQUFHLElBQUksT0FBTyxFQUFFO0tBQzVCLElBQUksQ0FBQyxZQUFZLENBQUM7S0FDbEIsT0FBTyxDQUFDLFFBQVEsQ0FBQztLQUNqQixXQUFXLENBQ1YsbUVBQW1FLENBQ3BFLENBQUM7QUFFSixTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3JDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDckMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNsQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3JDLFNBQVMsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUN4QyxTQUFTLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFekMsTUFBTSxDQUFDLE9BQU8sVUFBVSxNQUFNO0lBQzVCLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgTG9nZ2luZywgdG9QYXNjYWxDYXNlIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgcm9sbHVwIH0gZnJvbSBcInJvbGx1cFwiO1xuaW1wb3J0IHJlcGxhY2UgZnJvbSBcIkByb2xsdXAvcGx1Z2luLXJlcGxhY2VcIjtcbmltcG9ydCB0eXBlc2NyaXB0IGZyb20gXCJAcm9sbHVwL3BsdWdpbi10eXBlc2NyaXB0XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIGdlbmVyYXRlTW9kZWxJbmRleGVzLFxuICByZWFkTW9kZWxGaWxlLFxuICByZWFkTW9kZWxGb2xkZXJzLFxuICB3cml0ZUluZGV4ZXMsXG59IGZyb20gXCIuL2NsaWVudC9pbmRleGVzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIGFwcHJvdmVDb250cmFjdCxcbiAgZW5zdXJlSW5mcmFzdHJ1Y3R1cmVCb290ZWQsXG4gIGluc3RhbGxDb250cmFjdCxcbiAgcGFja2FnZUNvbnRyYWN0LFxuICBjb21taXRDaGFpbmNvZGUsXG4gIGdldENvbnRyYWN0U3RhcnRDb21tYW5kLFxuICBjb21waWxlV2l0aFRzY29uZmlnT3ZlcnJpZGVzLFxufSBmcm9tIFwiLi9jbGktdXRpbHNcIjtcbmltcG9ydCBcIi4vc2hhcmVkL292ZXJyaWRlc1wiO1xuaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5pbXBvcnQge1xuICBleHRyYWN0Q29sbGVjdGlvbnMgYXMgZXhDb2xsZWN0aW9ucyxcbiAgSW5kZXgsXG4gIFByaXZhdGVDb2xsZWN0aW9uLFxuICB3cml0ZUNvbGxlY3Rpb25zLFxufSBmcm9tIFwiLi9jbGllbnQvY29sbGVjdGlvbnMvaW5kZXhcIjtcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbmNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKFwiZmFicmljXCIpO1xuXG5jb25zdCBjb21waWxlQ29tbWFuZCA9IG5ldyBDb21tYW5kKClcbiAgLm5hbWUoXCJjb21waWxlLWNvbnRyYWN0XCIpXG4gIC5kZXNjcmlwdGlvbihcIkNyZWF0ZXMgYSBnbG9iYWwgY29udHJhY3RcIilcbiAgLm9wdGlvbihcIi0tZGV2XCIsIFwiY29tcGlsZXMgY29udHJhY3RzIHdpdGhvdXQgbWluaWZpY2F0aW9uXCIsIGZhbHNlKVxuICAub3B0aW9uKFwiLS1kZWJ1Z1wiLCBcIm1ha2VzIGF0dGFjaGluZyBkZWJ1Z2dlciBwb3NzaWJsZVwiLCBmYWxzZSlcbiAgLm9wdGlvbihcbiAgICBcIi0tY2NhYXNcIixcbiAgICBcIkFqdXN0cyB0aGUgcGFja2FnZSBjb21tYW5kcyB0byBiZSBkZXBsb3llZCBhcyBjY2Fhc1wiLFxuICAgIGZhbHNlXG4gIClcbiAgLm9wdGlvbihcIi0tbmFtZSA8U3RyaW5nPlwiLCBcImNvbnRyYWN0IG5hbWVcIiwgXCJnbG9iYWwtY29udHJhY3RcIilcbiAgLm9wdGlvbihcIi0tYnVuZGxlXCIsIFwiQnVuZGxlcyB3aXRoIHJvbGx1cCBpbnN0ZWFkIG9mIHVzaW5nIHRzY1wiLCBmYWxzZSlcbiAgLm9wdGlvbihcbiAgICBcIi0tdHMtY29uZmlnLWZpbGUgPHN0cmluZz5cIixcbiAgICBcInJlbGF0aXZlIHBhdGggdG8gdGhlIHRzIGNvbmZpZyBmaWxlIGJhc2VkIG9uIGN3ZCBvciBhYnNvbHV0ZSBwYXRoXCIsXG4gICAgXCIuL3RzY29uZmlnLmpzb25cIlxuICApXG4gIC5vcHRpb24oXG4gICAgXCItLWRlc2NyaXB0aW9uIDxTdHJpbmc+XCIsXG4gICAgXCJjb250cmFjdCBkZXNjcmlwdGlvblwiLFxuICAgIFwiR2xvYmFsIGNvbnRyYWN0IGltcGxlbWVudGF0aW9uXCJcbiAgKVxuICAub3B0aW9uKFwiLS1zdHJpcC1jb250cmFjdC1uYW1lXCIsIFwic3RyaXAgY29udHJhY3QgbmFtZSBmcm9tIG91dHB1dFwiLCBmYWxzZSlcbiAgLm9wdGlvbihcIi0taW5wdXQgPFN0cmluZz5cIiwgXCJpbnB1dCBmb2xkZXIgZm9yIGNvbnRyYWN0c1wiLCBcImxpYi9jb250cmFjdHNcIilcbiAgLm9wdGlvbihcIi0tb3V0cHV0IDxTdHJpbmc+XCIsIFwib3V0cHV0IGZvbGRlciBmb3IgY29udHJhY3RzXCIsIFwiLi9jb250cmFjdHNcIilcbiAgLmFjdGlvbihhc3luYyAob3B0aW9uczogYW55KSA9PiB7XG4gICAgY29uc3QgcGtnID0gSlNPTi5wYXJzZShcbiAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICApO1xuXG4gICAgY29uc3QgdmVyc2lvbiA9IHBrZy52ZXJzaW9uO1xuXG4gICAgbGV0IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgIGRldixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgIGRlYnVnLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgICAgbmFtZSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgb3V0cHV0LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgICAgaW5wdXQsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICBzdHJpcENvbnRyYWN0TmFtZSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgIGNjYWFzLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgICAgYnVuZGxlLFxuXG4gICAgICB0c0NvbmZpZ0ZpbGUsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihcImNvbXBpbGUtY29udHJhY3RcIik7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYHJ1bm5pbmcgd2l0aCBvcHRpb25zOiAke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMpfSBmb3IgJHtwa2cubmFtZX0gdmVyc2lvbiAke3ZlcnNpb259YFxuICAgICk7XG5cbiAgICB0c0NvbmZpZ0ZpbGUgPSBwYXRoLmlzQWJzb2x1dGUodHNDb25maWdGaWxlKVxuICAgICAgPyB0c0NvbmZpZ0ZpbGVcbiAgICAgIDogcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIHRzQ29uZmlnRmlsZSk7XG5cbiAgICBvdXRwdXQgPSBzdHJpcENvbnRyYWN0TmFtZSA/IG91dHB1dCA6IHBhdGguam9pbihvdXRwdXQsIG5hbWUpO1xuICAgIGxvZy5pbmZvKGBEZWxldGluZyBleGlzdGluZyBvdXRwdXQgZm9sZGVyIChpZiBleGlzdHMpIHVuZGVyICR7b3V0cHV0fWApO1xuICAgIGV4ZWNTeW5jKGBybSAtcmYgJHtvdXRwdXR9YCk7XG4gICAgaWYgKGJ1bmRsZSkge1xuICAgICAgbG9nLmluZm8oYGJ1bmRsaW5nIGNvbnRyYWN0IGZyb20gJHtpbnB1dH1gKTtcbiAgICAgIGNvbnN0IGJ1bmRsZSA9IGF3YWl0IHJvbGx1cCh7XG4gICAgICAgIGlucHV0OiBgJHtpbnB1dH0vaW5kZXgudHNgLFxuICAgICAgICBwbHVnaW5zOiBbXG4gICAgICAgICAgcmVwbGFjZSh7XG4gICAgICAgICAgICBwcmV2ZW50QXNzaWdubWVudDogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGltaXRlcnM6IFtcIlwiLCBcIlwiXSxcbiAgICAgICAgICAgIHZhbHVlczogeyBcIiMjVkVSU0lPTiMjXCI6IHZlcnNpb24sIFwiIyNQQUNLQUdFIyNcIjogcGtnLm5hbWUgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0eXBlc2NyaXB0KHtcbiAgICAgICAgICAgIHRzY29uZmlnOiB0c0NvbmZpZ0ZpbGUsXG4gICAgICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgb3V0RGlyOiBvdXRwdXQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW9kdWxlOiBcImVzbmV4dFwiLFxuICAgICAgICAgICAgZGVjbGFyYXRpb246IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgICBsb2cuaW5mbyhcbiAgICAgICAgYHdpdGhpbmcgY29udHJhY3QgdG8gJHtvdXRwdXR9IHdpdGggbmFtZSAke3RvUGFzY2FsQ2FzZShuYW1lKX0uanNgXG4gICAgICApO1xuICAgICAgYXdhaXQgYnVuZGxlLndyaXRlKHtcbiAgICAgICAgZmlsZTogYCR7b3V0cHV0fS8ke3RvUGFzY2FsQ2FzZShuYW1lKX0uanNgLFxuICAgICAgICBmb3JtYXQ6IFwidW1kXCIsXG4gICAgICAgIG5hbWU6IGAke3RvUGFzY2FsQ2FzZShuYW1lKX0uanNgLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBpbGVXaXRoVHNjb25maWdPdmVycmlkZXModHNDb25maWdGaWxlLCB7XG4gICAgICAgIG91dERpcjogb3V0cHV0LFxuICAgICAgICBtb2R1bGU6IHRzLk1vZHVsZUtpbmQuRVNOZXh0LFxuICAgICAgICBkZWNsYXJhdGlvbjogZmFsc2UsXG4gICAgICAgIHNvdXJjZU1hcDogZmFsc2UsXG4gICAgICAgIC8vIHJvb3REaXI6IGlucHV0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NyaXB0cyA9IHtcbiAgICAgIHN0YXJ0OiBnZXRDb250cmFjdFN0YXJ0Q29tbWFuZChkZWJ1ZywgY2NhYXMpLFxuICAgICAgXCJzdGFydDpkZXZcIjogXCJmYWJyaWMtY2hhaW5jb2RlLW5vZGUgc3RhcnQgLS10bHMuZW5hYmxlZCBmYWxzZVwiLFxuICAgICAgXCJzdGFydDp3YXRjaFwiOiAnbm9kZW1vbiAtLWV4ZWMgXCJucG0gcnVuIHN0YXJ0OmRldlwiJyxcbiAgICAgIGJ1aWxkOiAnZWNobyBcIk5vIG5lZWQgdG8gYnVpbGQgdGhlIGNoYWluY29kZVwiJyxcbiAgICAgIGxpbnQ6IFwiZXNsaW50IC4gLS1maXggLS1leHQgLmpzXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGNvbnRyYWN0UGFja2FnZSA9IHBrZztcblxuICAgIGNvbnRyYWN0UGFja2FnZS5uYW1lID0gbmFtZTtcbiAgICBjb250cmFjdFBhY2thZ2UuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBjb250cmFjdFBhY2thZ2Uuc2NyaXB0cyA9IHNjcmlwdHM7XG5cbiAgICBkZWxldGUgY29udHJhY3RQYWNrYWdlLnR5cGU7XG4gICAgZGVsZXRlIGNvbnRyYWN0UGFja2FnZS50eXBlcztcbiAgICBkZWxldGUgY29udHJhY3RQYWNrYWdlLmV4cG9ydHM7XG4gICAgY29udHJhY3RQYWNrYWdlLm1haW4gPSBidW5kbGVcbiAgICAgID8gYCR7dG9QYXNjYWxDYXNlKG5hbWUpfS5qc2BcbiAgICAgIDogYCR7aW5wdXR9L2luZGV4LmpzYDtcblxuICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICBwYXRoLmpvaW4ob3V0cHV0LCBcInBhY2thZ2UuanNvblwiKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KGNvbnRyYWN0UGFja2FnZSlcbiAgICApO1xuXG4gICAgbG9nLmluZm8oYEluc3RhbGxpbmcgYW5kIHNocmlua3dyYXBwaW5nIGRlcGVuZGVuY2llc2ApO1xuICAgIGV4ZWNTeW5jKGBucG0gaW5zdGFsbGAsIHsgY3dkOiBvdXRwdXQgfSk7XG4gICAgZXhlY1N5bmMoYG5wbSBzaHJpbmt3cmFwYCwgeyBjd2Q6IG91dHB1dCB9KTtcbiAgICBleGVjU3luYyhcInJtIC1yZiBub2RlX21vZHVsZXNcIiwgeyBjd2Q6IG91dHB1dCB9KTtcbiAgICBsb2cuaW5mbyhgZGVsZXRpbmcgdGVtcCBmb2xkZXJzYCk7XG4gICAgZXhlY1N5bmMoYHJtIC1yZiAuL2xpYiAmJiBybSAtcmYgLi9kaXN0YCwgeyBjd2Q6IG91dHB1dCB9KTtcbiAgICBsb2cuaW5mbyhcbiAgICAgIGBDb250cmFjdCAke25hbWV9IGNvbXBpbGVkIHN1Y2Nlc3NmdWxseSEgaW4gJHtwYXRoLnJlc29sdmUob3V0cHV0KX1gXG4gICAgKTtcbiAgICBpZiAoZGV2KSB7XG4gICAgICBsb2cuaW5mbyhgZGV2IG1vZGUgZW5hYmxlZC4gaW5zdGFsbGluZyBkZXBlbmRlbmNpZXMgZm9yIGRlYnVnZ2luZ2ApO1xuICAgICAgZXhlY1N5bmMoYG5wbSBpbnN0YWxsYCwge1xuICAgICAgICBjd2Q6IG91dHB1dCxcbiAgICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCBOT0RFX0VOVjogXCJwcm9kdWN0aW9uXCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbmNvbnN0IGV4dHJhY3RJbmRleGVzID0gbmV3IENvbW1hbmQoKVxuICAuY29tbWFuZChcImV4dHJhY3QtaW5kZXhlc1wiKVxuICAub3B0aW9uKFwiLS1maWxlIFtTdHJpbmddXCIsIFwidGhlIG1vZGVsIGZpbGVcIilcbiAgLm9wdGlvbihcIi0tZm9sZGVyIFtTdHJpbmddXCIsIFwidGhlIG1vZGVsIGZvbGRlclwiKVxuICAub3B0aW9uKFwiLS1vdXREaXIgPFN0cmluZz5cIiwgXCJ0aGUgb3V0ZGlyLiBzaG91bGQgbWF0Y2ggeW91ciBjb250cmFjdCBmb2xkZXJcIilcbiAgLmRlc2NyaXB0aW9uKFxuICAgIFwiQ3JlYXRlcyBhIHRoZSBKU09OIGluZGV4IGZpbGVzIHRvIGJlIHN1Ym1pdHRlZCB0byBhbG9uZyB3aXRoIHRoZSBjb250cmFjdFwiXG4gIClcbiAgLmFjdGlvbihhc3luYyAob3B0aW9uczogYW55KSA9PiB7XG4gICAgY29uc3QgcGtnID0gSlNPTi5wYXJzZShcbiAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICApO1xuXG4gICAgY29uc3QgdmVyc2lvbiA9IHBrZy52ZXJzaW9uO1xuXG4gICAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihcImV4dHJhY3QtaW5kZXhlc1wiKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgcnVubmluZyB3aXRoIG9wdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9IGZvciAke3BrZy5uYW1lfSB2ZXJzaW9uICR7dmVyc2lvbn1gXG4gICAgKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyBmaWxlLCBmb2xkZXIsIG91dERpciB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IG1vZGVsczogYW55W10gPSBbXTtcbiAgICBpZiAoZmlsZSkge1xuICAgICAgbW9kZWxzLnB1c2goLi4ucmVhZE1vZGVsRmlsZShmaWxlKSk7XG4gICAgfVxuXG4gICAgaWYgKGZvbGRlcikge1xuICAgICAgbG9nLmluZm8oYExvYWRpbmcgbW9kZWxzIGZyb20gJHtmb2xkZXJ9Li4uYCk7XG4gICAgICBtb2RlbHMucHVzaCguLi4oYXdhaXQgcmVhZE1vZGVsRm9sZGVycyhmb2xkZXIpKSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gICAgaWYgKCFmaWxlICYmICFmb2xkZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTXVzdCBwYXNzIGEgZmlsZSBvciBhIGZvbGRlcmApO1xuXG4gICAgZm9yIChjb25zdCBtIG9mIG1vZGVscykge1xuICAgICAgbG9nLnZlcmJvc2UoYEV4dHJhY3RpbmcgaW5kZXhlcyBmb3IgdGFibGUgJHtNb2RlbC50YWJsZU5hbWUobSl9YCk7XG4gICAgICBnZW5lcmF0ZU1vZGVsSW5kZXhlcyhtLCByZXN1bHQpO1xuICAgIH1cbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtPYmplY3Qua2V5cyhyZXN1bHQpLmxlbmd0aH0gaW5kZXhlcyB0byBjcmVhdGVgKTtcbiAgICBsb2cuZGVidWcoYEluZGV4ZXM6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKTtcbiAgICB3cml0ZUluZGV4ZXMoT2JqZWN0LnZhbHVlcyhyZXN1bHQpLCBvdXREaXIpO1xuICB9KTtcblxuY29uc3QgZXh0cmFjdENvbGxlY3Rpb25zID0gbmV3IENvbW1hbmQoKVxuICAuY29tbWFuZChcImV4dHJhY3QtY29sbGVjdGlvbnNcIilcbiAgLm9wdGlvbihcIi0tZmlsZSBbU3RyaW5nXVwiLCBcInRoZSBtb2RlbCBmaWxlXCIpXG4gIC5vcHRpb24oXCItLWZvbGRlciBbU3RyaW5nXVwiLCBcInRoZSBtb2RlbCBmb2xkZXJcIilcbiAgLm9wdGlvbihcIi0tb3V0RGlyIDxTdHJpbmc+XCIsIFwidGhlIG91dGRpci4gc2hvdWxkIG1hdGNoIHlvdXIgY29udHJhY3QgZm9sZGVyXCIpXG4gIC5vcHRpb24oXCItLW1zcElkcyA8U3RyaW5nPlwiLCBcInNpbmdsZSBtc3BJZCBvciBzdHJpbmdpZmllZCBhcnJheVwiKVxuICAub3B0aW9uKFwiLS1tYWluTXNwSWQgPFN0cmluZz5cIiwgXCJzaW5nbGUgbXNwSWRcIilcbiAgLm9wdGlvbihcbiAgICBcIi0tb3ZlcnJpZGVzIFtTdHJpbmddXCIsXG4gICAgXCJzdHJpbmdpZmllZCBvdmVycmlkZSBvYmplY3Qge3JlcXVpcmVkUGVlckNvdW50OiBudW1iZXIsIG1heFBlZXJDb3VudDogbnVtYmVyLCBibG9ja1RvTGl2ZTogbnVtYmVyLCBtZW1iZXJPbmx5UmVhZDogbnVtYmVyLCBtZW1iZXJPbmx5V3JpdGU6IG51bWJlciwgZW5kb3JzZW1lbnRQb2xpY3k6ICB7fX1cIlxuICApXG4gIC5kZXNjcmlwdGlvbihcbiAgICBcIkNyZWF0ZXMgYSB0aGUgSlNPTiBpbmRleCBmaWxlcyB0byBiZSBzdWJtaXR0ZWQgdG8gYWxvbmcgd2l0aCB0aGUgY29udHJhY3RcIlxuICApXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IGFueSkgPT4ge1xuICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UoXG4gICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwicGFja2FnZS5qc29uXCIpLCBcInV0Zi04XCIpXG4gICAgKTtcblxuICAgIGNvbnN0IHZlcnNpb24gPSBwa2cudmVyc2lvbjtcblxuICAgIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IoXCJleHRyYWN0LWNvbGxlY3Rpb25zXCIpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBydW5uaW5nIHdpdGggb3B0aW9uczogJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX0gZm9yICR7cGtnLm5hbWV9IHZlcnNpb24gJHt2ZXJzaW9ufWBcbiAgICApO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IGZpbGUsIGZvbGRlciwgb3V0RGlyLCBtc3BJZHMsIG92ZXJyaWRlcywgbWFpbk1zcElkIH0gPSBvcHRpb25zO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1zcElkcyA9IG1zcElkcyA/IEpTT04ucGFyc2UobXNwSWRzKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAvLyAgZG8gbm90aGluZ1xuICAgICAgfVxuICAgICAgb3ZlcnJpZGVzID0gb3ZlcnJpZGVzXG4gICAgICAgID8gSlNPTi5wYXJzZShvdmVycmlkZXMpXG4gICAgICAgIDogeyBwcml2YXRlQ29sczoge30sIHNoYXJlZENvbHM6IHt9IH07XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgYFVuYWJsZSB0byBleHRyYWN0IG1zcGlkcyBvciBvdmVycmlkZXM6ICAke2V9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbHM6IGFueVtdID0gW107XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIG1vZGVscy5wdXNoKC4uLnJlYWRNb2RlbEZpbGUoZmlsZSkpO1xuICAgIH1cblxuICAgIGlmIChmb2xkZXIpIHtcbiAgICAgIGxvZy5pbmZvKGBMb2FkaW5nIG1vZGVscyBmcm9tICR7Zm9sZGVyfS4uLmApO1xuICAgICAgbW9kZWxzLnB1c2goLi4uKGF3YWl0IHJlYWRNb2RlbEZvbGRlcnMoZm9sZGVyKSkpO1xuICAgIH1cblxuICAgIGlmICghZmlsZSAmJiAhZm9sZGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE11c3QgcGFzcyBhIGZpbGUgb3IgYSBmb2xkZXJgKTtcblxuICAgIGNvbnN0IGNvbHM6IHtcbiAgICAgIGluZGV4ZXM6IEluZGV4W107XG4gICAgICBtaXJyb3I/OiBQcml2YXRlQ29sbGVjdGlvbjtcbiAgICAgIGNvbGxlY3Rpb25zOiBQcml2YXRlQ29sbGVjdGlvbltdO1xuICAgIH1bXSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAoY2xhenopID0+IHtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICAgICAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLmdldChjbGF6eik7XG4gICAgICAgIGNvbnN0IG1pcnJvck1ldGEgPSBNb2RlbC5taXJyb3JlZEF0KGNsYXp6KTtcblxuICAgICAgICBjb25zb2xlLmxvZyh0YWJsZU5hbWUpO1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IG1zcCBvZiBtc3BJZHMpIHtcbiAgICAgICAgICBjb2xsZWN0aW9uc1ttc3BdID0gYXdhaXQgZXhDb2xsZWN0aW9ucyhcbiAgICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgICAgW21zcCwgbWFpbk1zcElkXSxcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgLy8ge1xuICAgICAgICAgICAgLy8gICBzaGFyZWRDb2xzOiBPYmplY3QuYXNzaWduKHt9LCBvdmVycmlkZXMuc2hhcmVkQ29scyksXG4gICAgICAgICAgICAvLyAgIHByaXZhdGVDb2xzOiBPYmplY3QuYXNzaWduKHt9LCBvdmVycmlkZXMucHJpdmF0ZUNvbHMpLFxuICAgICAgICAgICAgLy8gfSxcbiAgICAgICAgICAgICEhbWlycm9yTWV0YVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWlycm9yQ29sbGVjdGlvbjogUHJpdmF0ZUNvbGxlY3Rpb24gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG1pcnJvck1ldGEpIHtcbiAgICAgICAgICBjb2xsZWN0aW9uc1ttYWluTXNwSWRdID0gY29sbGVjdGlvbnNbbWFpbk1zcElkXSB8fCB7fTtcbiAgICAgICAgICBPYmplY3Qua2V5cyhjb2xsZWN0aW9ucykuZm9yRWFjaCgobXNwOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25zW21haW5Nc3BJZF0ucHJpdmF0ZXMgPSBjb2xsZWN0aW9uc1ttc3BdLnByaXZhdGVzPy5maWx0ZXIoXG4gICAgICAgICAgICAgIChwOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocC5uYW1lICE9PSAobWlycm9yTWV0YS5yZXNvbHZlciBhcyBzdHJpbmcpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBtaXJyb3JDb2xsZWN0aW9uID0gcCBhcyBhbnk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpdmF0ZXNDb3VudCA9IE9iamVjdC52YWx1ZXMoY29sbGVjdGlvbnMpXG4gICAgICAgICAgLm1hcCgoYykgPT4gYy5wcml2YXRlcylcbiAgICAgICAgICAuZmxhdCgpLmxlbmd0aDtcbiAgICAgICAgaWYgKHByaXZhdGVzQ291bnQpXG4gICAgICAgICAgbG9nXG4gICAgICAgICAgICAuZm9yKE1vZGVsLnRhYmxlTmFtZShjbGF6eikpXG4gICAgICAgICAgICAuaW5mbyhgRm91bmQgJHtwcml2YXRlc0NvdW50fSBwcml2YXRlIGNvbGxlY3Rpb25zIHRvIGNyZWF0ZWApO1xuICAgICAgICBjb25zdCBzaGFyZWRDb3VudCA9IE9iamVjdC52YWx1ZXMoY29sbGVjdGlvbnMpXG4gICAgICAgICAgLm1hcCgoYykgPT4gYy5zaGFyZWQpXG4gICAgICAgICAgLmZsYXQoKS5sZW5ndGg7XG5cbiAgICAgICAgbG9nXG4gICAgICAgICAgLmZvcihNb2RlbC50YWJsZU5hbWUoY2xhenopKVxuICAgICAgICAgIC5pbmZvKGBGb3VuZCAke3NoYXJlZENvdW50fSBzaGFyZWQgY29sbGVjdGlvbnMgdG8gY3JlYXRlYCk7XG4gICAgICAgIGlmIChtaXJyb3JDb2xsZWN0aW9uKVxuICAgICAgICAgIGxvZ1xuICAgICAgICAgICAgLmZvcihNb2RlbC50YWJsZU5hbWUoY2xhenopKVxuICAgICAgICAgICAgLmluZm8oXG4gICAgICAgICAgICAgIGBGb3VuZCBvbmUgbWlycm9yIGNvbGxlY3Rpb24gJHttaXJyb3JNZXRhPy5yZXNvbHZlciBhcyBzdHJpbmd9YFxuICAgICAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBjb2xMaXN0ID0gT2JqZWN0LnZhbHVlcyhjb2xsZWN0aW9ucylcbiAgICAgICAgICAubWFwKChjKSA9PiBbLi4uKGMucHJpdmF0ZXMgfHwgW10pLCAuLi4oYy5zaGFyZWQgfHwgW10pXSlcbiAgICAgICAgICAuZmxhdCgpO1xuICAgICAgICBsZXQgaW5kZXhlczogYW55O1xuICAgICAgICBpZiAoY29sTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICBsb2dcbiAgICAgICAgICAgIC5mb3IoTW9kZWwudGFibGVOYW1lKGNsYXp6KSlcbiAgICAgICAgICAgIC52ZXJib3NlKGBnZW5lcmF0aW5nIGluZGV4ZXMgZm9yIGNvbGxlY3Rpb25zYCk7XG4gICAgICAgICAgaW5kZXhlcyA9IGdlbmVyYXRlTW9kZWxJbmRleGVzKGNsYXp6KTtcbiAgICAgICAgICBsb2dcbiAgICAgICAgICAgIC5mb3IoTW9kZWwudGFibGVOYW1lKGNsYXp6KSlcbiAgICAgICAgICAgIC5pbmZvKGBmb3VuZCAke2luZGV4ZXMubGVuZ3RofSBpbmRleGVzYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpbmRleGVzOiBpbmRleGVzLFxuICAgICAgICAgIGNvbGxlY3Rpb25zOiBjb2xMaXN0LFxuICAgICAgICAgIG1pcnJvcjogbWlycm9yQ29sbGVjdGlvbixcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbGxlY3Rpb25zVG8gPSBbXG4gICAgICAuLi5jb2xzLm1hcCgoYykgPT4gYy5jb2xsZWN0aW9ucykuZmxhdCgpLFxuICAgICAgLi4uY29scy5maWx0ZXIoKGMpID0+IGMubWlycm9yKS5tYXAoKGMpID0+IGMubWlycm9yKSxcbiAgICBdIGFzIFByaXZhdGVDb2xsZWN0aW9uW107XG5cbiAgICBpZiAoY29sbGVjdGlvbnNUby5sZW5ndGgpIHtcbiAgICAgIHdyaXRlQ29sbGVjdGlvbnMoY29sbGVjdGlvbnNUbywgb3V0RGlyKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgU3RvcmVkICR7Y29sbGVjdGlvbnNUby5sZW5ndGh9IGNvbGxlY3Rpb25zIHRvICR7b3V0RGlyfS9jb2xsZWN0aW9uX2NvbmZpZy5qc29uYFxuICAgICAgKTtcblxuICAgICAgY29scy5mb3JFYWNoKChjLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXhlcywgY29sbGVjdGlvbnMsIG1pcnJvciB9ID0gYztcbiAgICAgICAgY29uc3QgdG9JbmRleDogUHJpdmF0ZUNvbGxlY3Rpb25bXSA9IFsuLi5jb2xsZWN0aW9ucywgbWlycm9yXS5maWx0ZXIoXG4gICAgICAgICAgQm9vbGVhblxuICAgICAgICApIGFzIFByaXZhdGVDb2xsZWN0aW9uW107XG4gICAgICAgIHRvSW5kZXguZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgICAgIHdyaXRlSW5kZXhlcyhpbmRleGVzLCBvdXREaXIsIGkubmFtZSk7XG4gICAgICAgICAgbG9nLmluZm8oYFN0b3JlZCAke3RvSW5kZXgubGVuZ3RofSBpbmRleGVzIHRvIGNvbGxlY3Rpb24gJHtpLm5hbWV9YCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuY29uc3QgZW5zdXJlSW5mcmEgPSBuZXcgQ29tbWFuZCgpXG4gIC5uYW1lKFwiYXdhaXQtaW5mcmFcIilcbiAgLmRlc2NyaXB0aW9uKFwid2FpdHMgZm9yIHRoZSBpbmZyYXN0cnVjdHVyZSB0byBiZSB1cCBhbmQgcnVubmluZ1wiKVxuICAub3B0aW9uKFxuICAgIFwiLS1jb250YWluZXIgPFN0cmluZz5cIixcbiAgICBcImRvY2tlciBjb250YWluZXIgbmFtZSB0byB0ZXN0ICh1c3VhbGx5IGxhc3QgcGVlcilcIixcbiAgICBcImJvb3Qtb3JnLWMtcGVlci0wXCJcbiAgKVxuICAub3B0aW9uKFwiLS10aW1lb3V0IDxTdHJpbmc+XCIsIFwidGltZW91dCBiZXR3ZWVuIHRlc3RzIGluIG1pbGxpc2Vjb25kc1wiLCBcIjUwMDBcIilcbiAgLm9wdGlvbihcIi0tYXR0ZW1wdHMgPFN0cmluZz5cIiwgXCJudW1iZXIgb2YgYXR0ZW1wdHMgYmVmb3JlIGdpdmluZyB1cFwiLCBcIjEwXCIpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IGFueSkgPT4ge1xuICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UoXG4gICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwicGFja2FnZS5qc29uXCIpLCBcInV0Zi04XCIpXG4gICAgKTtcblxuICAgIGNvbnN0IHZlcnNpb24gPSBwa2cudmVyc2lvbjtcblxuICAgIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IoXCJhd2FpdC1pbmZyYVwiKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgcnVubmluZyB3aXRoIG9wdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9IGZvciAke3BrZy5uYW1lfSB2ZXJzaW9uICR7dmVyc2lvbn1gXG4gICAgKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgY29udGFpbmVyLCB0aW1lb3V0LCBhdHRlbXB0cyB9ID0gb3B0aW9ucztcbiAgICB0aW1lb3V0ID0gcGFyc2VJbnQodGltZW91dCkgfHwgNTAwMDtcbiAgICBhdHRlbXB0cyA9IHBhcnNlSW50KGF0dGVtcHRzKSB8fCAxMDtcblxuICAgIGF3YWl0IGVuc3VyZUluZnJhc3RydWN0dXJlQm9vdGVkKFwiYm9vdC1vcmctYy1wZWVyLTBcIiwgdGltZW91dCwgYXR0ZW1wdHMpO1xuXG4gICAgbG9nLmluZm8oXG4gICAgICBgSW5mcmFzdHJ1Y3R1cmUgYm9vdGVkIHN1Y2Nlc3NmdWxseSAoYWNjb3JkaW5nIHRvIGNvbnRhaW5lciAke2NvbnRhaW5lcn0pIWBcbiAgICApO1xuICB9KTtcblxuY29uc3QgZGVwbG95Q29udHJhY3QgPSBuZXcgQ29tbWFuZCgpXG4gIC5uYW1lKFwiZGVwbG95LWNvbnRyYWN0XCIpXG4gIC5kZXNjcmlwdGlvbihcImRlcGxveXMgdGhlIHNlbGVjdGVkIGNvbnRyYWN0XCIpXG4gIC5vcHRpb24oXCItLW5hbWUgPFN0cmluZz5cIiwgXCJDb250cmFjdCBOYW1lIChhbmQgZm9sZGVyKVwiKVxuICAub3B0aW9uKFwiLS1pbnB1dCA8U3RyaW5nPlwiLCBcImlucHV0IGZvbGRlclwiKVxuICAub3B0aW9uKFxuICAgIFwiLS1pbmNyZW1lbnRWZXJzaW9uIDxTdHJpbmc+XCIsXG4gICAgXCIodHJ1ZSB8IGZhbHNlKSBpZiBzaG91bGQgdXNlIHZlcnNpb24gb3Igc2VxdWVuY2UgdG8gdXBkYXRlIGNvbnRyYWN0c1wiLFxuICAgIGZhbHNlXG4gIClcbiAgLm9wdGlvbihcbiAgICBcIi0tdHJhY2tlckZvbGRlciA8U3RyaW5nPlwiLFxuICAgIFwiY29udHJhY3QgdmVyc2lvbiB0cmFja2VyIGZvbGRlciAoc2hvdWxkIGJlIGRlbGV0ZWQgb24gaW5mcmFzdHJ1Y3R1cmU6ZG93bilcIixcbiAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJ0ZXN0c1wiLCBcImludGVncmF0aW9uXCIsIFwiY2hhaW5jb2RlVHJhY2tlcnNcIilcbiAgKVxuICAub3B0aW9uKFxuICAgIFwiLS1wZWVycyA8U3RyaW5nPlwiLFxuICAgIFwiY29tbWEgc2VwYXJhdGVkIHBlZXIgaWRzXCIsXG4gICAgXCJvcmctYS1wZWVyLTAsb3JnLWItcGVlci0wLG9yZy1jLXBlZXItMFwiXG4gIClcbiAgLmFjdGlvbihhc3luYyAob3B0aW9uczogYW55KSA9PiB7XG4gICAgY29uc3QgcGtnID0gSlNPTi5wYXJzZShcbiAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICApO1xuXG4gICAgY29uc3QgdmVyc2lvbiA9IHBrZy52ZXJzaW9uO1xuXG4gICAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihcImRlcGxveS1jb250cmFjdFwiKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgcnVubmluZyB3aXRoIG9wdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9IGZvciAke3BrZy5uYW1lfSB2ZXJzaW9uICR7dmVyc2lvbn1gXG4gICAgKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgY29uc3QgeyBuYW1lLCBpbnB1dCwgcGVlcnMsIHRyYWNrZXJGb2xkZXIsIGluY3JlbWVudFZlcnNpb24gfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgcGVlcklkcyA9IHBlZXJzLnNwbGl0KFwiLFwiKTtcblxuICAgIGNvbnN0IGNvdW50UGF0aCA9IHBhdGgucmVzb2x2ZShwYXRoLmpvaW4odHJhY2tlckZvbGRlciwgYCR7bmFtZX0uY291bnRgKSk7XG5cbiAgICBsZXQgc2VxdWVuY2U6IG51bWJlcjtcblxuICAgIHRyeSB7XG4gICAgICBzZXF1ZW5jZSA9IHBhcnNlSW50KGZzLnJlYWRGaWxlU3luYyhjb3VudFBhdGgpLnRvU3RyaW5nKFwidXRmLThcIikpO1xuICAgICAgaWYgKGlzTmFOKHNlcXVlbmNlKSkgc2VxdWVuY2UgPSAxO1xuICAgICAgZWxzZSBzZXF1ZW5jZSArPSAxO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHNlcXVlbmNlID0gMTtcbiAgICB9XG4gICAgLy9cbiAgICAvLyBpZiAoaW5jcmVtZW50VmVyc2lvbikge1xuICAgIC8vICAgdmVyc2lvbiA9IHZlcnNpb24gKyBgLSR7c2VxdWVuY2V9YDtcbiAgICAvLyAgIC8vIHNlcXVlbmNlID0gMTtcbiAgICAvLyB9XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBwZWVyIG9mIHBlZXJJZHMpIHtcbiAgICAgICAgcGFja2FnZUNvbnRyYWN0KHBlZXIsIGlucHV0LCBuYW1lLCB2ZXJzaW9uKTtcbiAgICAgICAgaW5zdGFsbENvbnRyYWN0KHBlZXIsIG5hbWUpO1xuICAgICAgICBhcHByb3ZlQ29udHJhY3QoXG4gICAgICAgICAgcGVlcixcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHBlZXIgPT09IFwib3JnLWEtcGVlci0wXCJcbiAgICAgICAgICAgID8gXCJ0bHMtY2EtY2VydC5wZW1cIlxuICAgICAgICAgICAgOiBcIm9yZGVyZXItdGxzLWNhLWNlcnQucGVtXCIsXG4gICAgICAgICAgc2VxdWVuY2UsXG4gICAgICAgICAgdmVyc2lvblxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhjb3VudFBhdGgsIHNlcXVlbmNlLnRvU3RyaW5nKCkpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBsb2cuZXJyb3IoXCJFcnJvciBkZXBsb3lpbmcgY29udHJhY3Q6XCIsIGVycik7XG4gICAgfVxuICAgIGNvbW1pdENoYWluY29kZShuYW1lLCBzZXF1ZW5jZSwgdmVyc2lvbik7XG4gIH0pO1xuXG5jb25zdCBnZXRDcnlwdG9NYXRlcmlhbCA9IG5ldyBDb21tYW5kKClcbiAgLm5hbWUoXCJnZXQtY3J5cHRvLW1hdGVyaWFsXCIpXG4gIC5kZXNjcmlwdGlvbihcImNvcGllcyB0aGUgY3J5cHRvIG1hdGVyaWFsIHRvIHRoZSBzZWxlY3RlZCBmb2xkZXJcIilcbiAgLm9wdGlvbihcIi0tZm9sZGVyIDxTdHJpbmc+XCIsIFwib3V0cHV0IGZvbGRlclwiLCBcImRvY2tlci9kb2NrZXItZGF0YVwiKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zOiBhbnkpID0+IHtcbiAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICk7XG5cbiAgICBjb25zdCB2ZXJzaW9uID0gcGtnLnZlcnNpb247XG5cbiAgICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKFwiZ2V0LWNyeXB0by1tYXRlcmlhbFwiKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgcnVubmluZyB3aXRoIG9wdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9IGZvciAke3BrZy5uYW1lfSB2ZXJzaW9uICR7dmVyc2lvbn1gXG4gICAgKTtcbiAgICBjb25zdCB7IGZvbGRlciB9ID0gb3B0aW9ucztcbiAgICBleGVjU3luYyhgZG9ja2VyIGNwIG9yZy1hOi93ZWF2ZXIvY2xpZW50Ly4gJHtmb2xkZXJ9YCwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIH0pO1xuICB9KTtcblxuY29uc3QgZmFicmljQ21kID0gbmV3IENvbW1hbmQoKVxuICAubmFtZShcImZvci1mYWJyaWNcIilcbiAgLmNvbW1hbmQoXCJmYWJyaWNcIilcbiAgLmRlc2NyaXB0aW9uKFxuICAgIFwiZXhwb3NlcyBzZXZlcmFsIGNvbW1hbmRzIHRvIGhlbHAgbWFuYWdlIHRoZSBmYWJyaWMgaW5mcmFzdHJ1Y3R1cmVcIlxuICApO1xuXG5mYWJyaWNDbWQuYWRkQ29tbWFuZChjb21waWxlQ29tbWFuZCk7XG5mYWJyaWNDbWQuYWRkQ29tbWFuZChleHRyYWN0SW5kZXhlcyk7XG5mYWJyaWNDbWQuYWRkQ29tbWFuZChlbnN1cmVJbmZyYSk7XG5mYWJyaWNDbWQuYWRkQ29tbWFuZChkZXBsb3lDb250cmFjdCk7XG5mYWJyaWNDbWQuYWRkQ29tbWFuZChnZXRDcnlwdG9NYXRlcmlhbCk7XG5mYWJyaWNDbWQuYWRkQ29tbWFuZChleHRyYWN0Q29sbGVjdGlvbnMpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmYWJyaWMoKSB7XG4gIHJldHVybiBmYWJyaWNDbWQ7XG59XG4iXX0=
@@ -1,3 +1,4 @@
1
+ import ts from "typescript";
1
2
  export declare function didInfrastructureBoot(containerName?: string): boolean;
2
3
  export declare function ensureInfrastructureBooted(containerName?: string, timeout?: number, attempts?: number): Promise<void>;
3
4
  export declare function packageContract(dockerName: string, contractFolder: string, contractName: string, version?: string): void;
@@ -17,3 +18,4 @@ export declare enum ScriptCommands {
17
18
  START_DEBUG = "node --inspect=0.0.0.0:9229 /usr/local/src/node_modules/.bin/fabric-chaincode-node start --grpc.max_receive_message_length ${CHAINCODE_MAXRECVMSGSIZE-15728640} --grpc.max_send_message_length ${CHAINCODE_MAXSENDMSGSIZE-15728640}"
18
19
  }
19
20
  export declare function getContractStartCommand(debug: boolean, ccaas: boolean): string;
21
+ export declare function compileWithTsconfigOverrides(tsconfigPath: string, overrides: Partial<ts.CompilerOptions>): void;
@@ -2,6 +2,7 @@ import { execSync } from "child_process";
2
2
  import * as fs from "fs";
3
3
  import * as path from "path";
4
4
  import { InternalError } from "@decaf-ts/db-decorators";
5
+ import ts from "typescript";
5
6
  export function didInfrastructureBoot(containerName = "boot-org-c-peer-0") {
6
7
  try {
7
8
  const output = execSync(`docker inspect ${containerName} --format='{{.State.ExitCode}}'`)
@@ -185,8 +186,65 @@ export var ScriptCommands;
185
186
  })(ScriptCommands || (ScriptCommands = {}));
186
187
  export function getContractStartCommand(debug, ccaas) {
187
188
  if (ccaas) {
188
- return debug ? ScriptCommands.START_CCAAS_DEBUG : ScriptCommands.START_CCAAS;
189
+ return debug
190
+ ? ScriptCommands.START_CCAAS_DEBUG
191
+ : ScriptCommands.START_CCAAS;
189
192
  }
190
193
  return debug ? ScriptCommands.START_DEBUG : ScriptCommands.START;
191
194
  }
192
- //# sourceMappingURL=cli-utils.js.map
195
+ function formatDiagnostics(diags) {
196
+ const host = {
197
+ getCanonicalFileName: (f) => f,
198
+ getCurrentDirectory: ts.sys.getCurrentDirectory,
199
+ getNewLine: () => ts.sys.newLine,
200
+ };
201
+ return ts.formatDiagnosticsWithColorAndContext(diags, host);
202
+ }
203
+ export function compileWithTsconfigOverrides(tsconfigPath, overrides) {
204
+ const absConfigPath = path.isAbsolute(tsconfigPath)
205
+ ? tsconfigPath
206
+ : path.resolve(process.cwd(), tsconfigPath);
207
+ // 1) Read the tsconfig.json
208
+ const configFile = ts.readConfigFile(absConfigPath, ts.sys.readFile);
209
+ if (configFile.error) {
210
+ throw new Error(formatDiagnostics([configFile.error]));
211
+ }
212
+ // 2) Parse it (resolves "extends", include/exclude/files, etc.)
213
+ const configDir = path.dirname(absConfigPath);
214
+ const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, configDir,
215
+ /*existingOptions*/ undefined, absConfigPath);
216
+ if (parsed.errors.length) {
217
+ throw new Error(formatDiagnostics(parsed.errors));
218
+ }
219
+ // 3) Override compiler options in-memory
220
+ const options = {
221
+ ...parsed.options,
222
+ ...overrides,
223
+ };
224
+ // Optional: If you override outDir/rootDir, ensure they’re absolute
225
+ // to avoid surprises depending on CWD.
226
+ if (options.outDir)
227
+ options.outDir = path.resolve(configDir, options.outDir);
228
+ if (options.rootDir)
229
+ options.rootDir = path.resolve(configDir, options.rootDir);
230
+ // 4) Create program + emit
231
+ const program = ts.createProgram({
232
+ rootNames: parsed.fileNames,
233
+ options,
234
+ projectReferences: parsed.projectReferences,
235
+ });
236
+ const preEmit = ts.getPreEmitDiagnostics(program);
237
+ if (preEmit.length) {
238
+ // If you want "transpile anyway", you can choose to not throw here.
239
+ throw new Error(formatDiagnostics(preEmit));
240
+ }
241
+ const emitResult = program.emit();
242
+ const emitDiagnostics = emitResult.diagnostics ?? [];
243
+ if (emitDiagnostics.length) {
244
+ throw new Error(formatDiagnostics(emitDiagnostics));
245
+ }
246
+ if (emitResult.emitSkipped) {
247
+ throw new Error("Emit was skipped (check diagnostics above).");
248
+ }
249
+ }
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFNUIsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxnQkFBd0IsbUJBQW1CO0lBRTNDLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FDckIsa0JBQWtCLGFBQWEsaUNBQWlDLENBQ2pFO2FBQ0UsUUFBUSxFQUFFO2FBQ1YsSUFBSSxFQUFFLENBQUM7UUFFVixPQUFPLE1BQU0sS0FBSyxHQUFHLENBQUM7SUFDeEIsQ0FBQztJQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCLENBQzlDLGdCQUF3QixtQkFBbUIsRUFDM0MsVUFBa0IsSUFBSSxFQUN0QixXQUFtQixFQUFFO0lBRXJCLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQzdDLElBQUksRUFBRSxRQUFRLElBQUksQ0FBQztZQUFFLE1BQU0sSUFBSSxhQUFhLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUUxRSxPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDckQsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMscUNBQXFDO0lBQ3pGLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsVUFBa0IsRUFDbEIsY0FBc0IsRUFDdEIsWUFBb0IsRUFDcEIsVUFBa0IsS0FBSztJQUV2QixRQUFRLENBQUMsZUFBZSxVQUFVOzBDQUNNLGNBQWM7O3NDQUVsQixZQUFZO3VCQUMzQixZQUFZOzBCQUNULE9BQU87S0FDNUIsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsVUFBa0IsRUFBRSxZQUFvQjtJQUN0RSxRQUFRLENBQ04sZUFBZSxVQUFVLDBGQUEwRixZQUFZLFNBQVMsQ0FDekksQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUM3QixVQUFrQixFQUNsQixZQUFvQixFQUNwQixXQUFtQixFQUNuQixXQUFtQixDQUFDLEVBQ3BCLFVBQWtCLEtBQUs7SUFFdkIsUUFBUSxDQUFDLGVBQWUsVUFBVTs7O3VCQUdiLFlBQVk7MEJBQ1QsT0FBTztpQkFDaEIsUUFBUTs7c0NBRWEsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsY0FBc0IsRUFDdEIsWUFBb0IsRUFDcEIsVUFBa0IsS0FBSyxFQUN2QixRQUFrQixDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsY0FBYyxDQUFDO0lBRWxFLElBQUksUUFBZ0IsQ0FBQztJQUNyQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUM1QixJQUFJLENBQUMsSUFBSSxDQUNQLEdBQUcsU0FBUyxFQUFFLEVBQ2QsSUFBSSxFQUNKLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsR0FBRyxZQUFZLFFBQVEsQ0FDeEIsQ0FDRixDQUFDO0lBQ0YsSUFBSSxDQUFDO1FBQ0gsUUFBUSxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLDZEQUE2RDtJQUMvRCxDQUFDO0lBQUMsT0FBTyxDQUFVLEVBQUUsQ0FBQztRQUNwQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUNELEVBQUUsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBRWpELElBQUksQ0FBQztRQUNILEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsZUFBZSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdELGVBQWUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDcEMsZUFBZSxDQUNiLElBQUksRUFDSixZQUFZLEVBQ1osSUFBSSxLQUFLLGNBQWMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixFQUN2RSxRQUFRLEVBQ1IsT0FBTyxDQUNSLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEQsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUM3QixZQUFvQixFQUNwQixXQUFtQixDQUFDLEVBQ3BCLFVBQWtCLEtBQUs7SUFFdkIsUUFBUSxDQUFDOzs7dUJBR1ksWUFBWTswQkFDVCxPQUFPO2lCQUNoQixRQUFROzs7OzBIQUlpRyxDQUFDLENBQUM7QUFDNUgsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLFlBQW9CLEVBQ3BCLGFBQXFCLGNBQWMsRUFDbkMsVUFBa0IsaUJBQWlCLEVBQ25DLE9BQU8sR0FBRyxDQUFDO0lBRVgsSUFBSSxDQUFDO1FBQ0gsOENBQThDO1FBQzlDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDbkMsUUFBUSxFQUFFLGFBQWE7WUFDdkIsSUFBSSxFQUFFLEVBQUU7U0FDVCxDQUFDLENBQUM7UUFFSCxJQUFJLE9BQU8sR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNqQixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCx1QkFBdUI7UUFDdkIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUNsQixlQUFlLFVBQVU7O2FBRWxCLFlBQVk7Y0FDWCxhQUFhO3NDQUNXLE9BQU8sRUFBRSxDQUMxQyxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUUxQyxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckMsNkRBQTZEO0lBQy9ELENBQUM7SUFBQyxPQUFPLEdBQVEsRUFBRSxDQUFDO1FBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUNoRCxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQ0FBcUM7UUFDcEYsT0FBTyx1QkFBdUIsQ0FDNUIsWUFBWSxFQUNaLFVBQVUsRUFDVixPQUFPLEVBQ1AsT0FBTyxFQUFFLENBQ1YsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLElBQUksQ0FBQyxHQUFXO0lBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0QsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQzdCLFlBQW9CLEVBQ3BCLFlBQW9CLEVBQ3BCLElBQVcsRUFDWCxZQUFpQixFQUFFLEVBQ25CLGFBQXFCLGNBQWMsRUFDbkMsTUFBYyxpQkFBaUI7SUFFL0IsOENBQThDO0lBQzlDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDbkMsUUFBUSxFQUFFLFlBQVk7UUFDdEIsSUFBSSxFQUFFLElBQUk7S0FDWCxDQUFDLENBQUM7SUFFSCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixhQUFhLEdBQUcsQ0FBQztJQUV6RCx1QkFBdUI7SUFDdkIsT0FBTyxRQUFRLENBQ2IsZUFBZSxVQUFVOztTQUVwQixZQUFZO1VBQ1gsYUFBYTs7Ozs7Ozs7a0NBUVcsR0FBRztNQUMvQixTQUFTLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3JDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsWUFBb0IsRUFDcEIsWUFBb0IsRUFDcEIsSUFBVyxFQUNYLGFBQXFCLGNBQWMsRUFDbkMsTUFBYyxpQkFBaUI7SUFFL0IsSUFBSSxDQUFDO1FBQ0gsOENBQThDO1FBQzlDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDbkMsUUFBUSxFQUFFLFlBQVk7WUFDdEIsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDLENBQUM7UUFFSCx1QkFBdUI7UUFDdkIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUNsQixlQUFlLFVBQVU7O2FBRWxCLFlBQVk7Y0FDWCxhQUFhO3lCQUNGLEdBQUcsRUFBRSxDQUN6QixDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFM0MsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLFlBQW9CLEVBQ3BCLFlBQW9CLEVBQ3BCLElBQVcsRUFDWCxZQUFpQixFQUFFLEVBQ25CLGFBQXFCLGNBQWMsRUFDbkMsTUFBYyxpQkFBaUI7SUFFL0IsOENBQThDO0lBQzlDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDbkMsUUFBUSxFQUFFLFlBQVk7UUFDdEIsSUFBSSxFQUFFLElBQUk7S0FDWCxDQUFDLENBQUM7SUFFSCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixhQUFhLEdBQUcsQ0FBQztJQUV6RCx1QkFBdUI7SUFDdkIsT0FBTyxRQUFRLENBQ2IsZUFBZSxVQUFVOztTQUVwQixZQUFZO1VBQ1gsYUFBYTs7OztrQ0FJVyxHQUFHO01BQy9CLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDckMsQ0FBQztJQUVGLHdDQUF3QztJQUN4QywwREFBMEQ7SUFDMUQsc0NBQXNDO0lBQ3RDLDBEQUEwRDtBQUM1RCxDQUFDO0FBRUQsTUFBTSxDQUFOLElBQVksY0F1Qlg7QUF2QkQsV0FBWSxjQUFjO0lBQ3hCLHVOQUU2RSxDQUFBO0lBQzdFLDJjQU8yQixDQUFBO0lBQzNCLGlnQkFPMkIsQ0FBQTtJQUMzQix5UkFFNEUsQ0FBQTtBQUM5RSxDQUFDLEVBdkJXLGNBQWMsS0FBZCxjQUFjLFFBdUJ6QjtBQUVELE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMsS0FBYyxFQUNkLEtBQWM7SUFFZCxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsT0FBTyxLQUFLO1lBQ1YsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUI7WUFDbEMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO0FBQ25FLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLEtBQStCO0lBQ3hELE1BQU0sSUFBSSxHQUE2QjtRQUNyQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM5QixtQkFBbUIsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtRQUMvQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPO0tBQ2pDLENBQUM7SUFDRixPQUFPLEVBQUUsQ0FBQyxvQ0FBb0MsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVELE1BQU0sVUFBVSw0QkFBNEIsQ0FDMUMsWUFBb0IsRUFDcEIsU0FBc0M7SUFFdEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUM7UUFDakQsQ0FBQyxDQUFDLFlBQVk7UUFDZCxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFOUMsNEJBQTRCO0lBQzVCLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckUsSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELGdFQUFnRTtJQUNoRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQywwQkFBMEIsQ0FDMUMsVUFBVSxDQUFDLE1BQU0sRUFDakIsRUFBRSxDQUFDLEdBQUcsRUFDTixTQUFTO0lBQ1QsbUJBQW1CLENBQUMsU0FBUyxFQUM3QixhQUFhLENBQ2QsQ0FBQztJQUVGLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsTUFBTSxPQUFPLEdBQXVCO1FBQ2xDLEdBQUcsTUFBTSxDQUFDLE9BQU87UUFDakIsR0FBRyxTQUFTO0tBQ2IsQ0FBQztJQUVGLG9FQUFvRTtJQUNwRSx1Q0FBdUM7SUFDdkMsSUFBSSxPQUFPLENBQUMsTUFBTTtRQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdFLElBQUksT0FBTyxDQUFDLE9BQU87UUFDakIsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFN0QsMkJBQTJCO0lBQzNCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDL0IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1FBQzNCLE9BQU87UUFDUCxpQkFBaUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCO0tBQzVDLENBQUMsQ0FBQztJQUVILE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNuQixvRUFBb0U7UUFDcEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbEMsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7SUFDckQsSUFBSSxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7SUFDakUsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZGlkSW5mcmFzdHJ1Y3R1cmVCb290KFxuICBjb250YWluZXJOYW1lOiBzdHJpbmcgPSBcImJvb3Qtb3JnLWMtcGVlci0wXCJcbik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IG91dHB1dCA9IGV4ZWNTeW5jKFxuICAgICAgYGRvY2tlciBpbnNwZWN0ICR7Y29udGFpbmVyTmFtZX0gLS1mb3JtYXQ9J3t7LlN0YXRlLkV4aXRDb2RlfX0nYFxuICAgIClcbiAgICAgIC50b1N0cmluZygpXG4gICAgICAudHJpbSgpO1xuXG4gICAgcmV0dXJuIG91dHB1dCA9PT0gXCIwXCI7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluc3BlY3RpbmcgY29udGFpbmVyOlwiLCBlcnIubWVzc2FnZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVJbmZyYXN0cnVjdHVyZUJvb3RlZChcbiAgY29udGFpbmVyTmFtZTogc3RyaW5nID0gXCJib290LW9yZy1jLXBlZXItMFwiLFxuICB0aW1lb3V0OiBudW1iZXIgPSA1MDAwLFxuICBhdHRlbXB0czogbnVtYmVyID0gMTBcbik6IFByb21pc2U8dm9pZD4ge1xuICB3aGlsZSAoIWRpZEluZnJhc3RydWN0dXJlQm9vdChjb250YWluZXJOYW1lKSkge1xuICAgIGlmICgtLWF0dGVtcHRzIDw9IDApIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiZXhjZWVkZWQgYWxsb3dlZCBhdHRlbXB0c1wiKTtcblxuICAgIGNvbnNvbGUubG9nKFwiV2FpdGluZyBmb3IgaW5mcmFzdHJ1Y3R1cmUgdG8gYm9vdC4uLlwiKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCB0aW1lb3V0KSk7IC8vIFdhaXQgZm9yIDUgc2Vjb25kcyBiZWZvcmUgcmV0cnlpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFja2FnZUNvbnRyYWN0KFxuICBkb2NrZXJOYW1lOiBzdHJpbmcsXG4gIGNvbnRyYWN0Rm9sZGVyOiBzdHJpbmcsXG4gIGNvbnRyYWN0TmFtZTogc3RyaW5nLFxuICB2ZXJzaW9uOiBzdHJpbmcgPSBcIjEuMFwiXG4pOiB2b2lkIHtcbiAgZXhlY1N5bmMoYGRvY2tlciBleGVjICR7ZG9ja2VyTmFtZX0gbm9kZSAuL3dlYXZlci9saWIvY29yZS9jbGkuY2pzIHBhY2thZ2UtY2hhaW5jb2RlIC1kIFxcXG4gICAgLS1jaGFpbmNvZGUtcGF0aCAuL3dlYXZlci9jaGFpbmNvZGUvJHtjb250cmFjdEZvbGRlcn0gXFxcbiAgICAtLWxhbmcgbm9kZSBcXFxuICAgIC0tY2hhaW5jb2RlLW91dHB1dCAvd2VhdmVyL3BlZXIvJHtjb250cmFjdE5hbWV9LnRhci5neiBcXFxuICAgIC0tY2hhaW5jb2RlLW5hbWUgJHtjb250cmFjdE5hbWV9IFxcXG4gICAgLS1jaGFpbmNvZGUtdmVyc2lvbiAke3ZlcnNpb259IC1zXG4gICAgYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsQ29udHJhY3QoZG9ja2VyTmFtZTogc3RyaW5nLCBjb250cmFjdE5hbWU6IHN0cmluZykge1xuICBleGVjU3luYyhcbiAgICBgZG9ja2VyIGV4ZWMgJHtkb2NrZXJOYW1lfSBub2RlIC4vd2VhdmVyL2xpYi9jb3JlL2NsaS5janMgaW5zdGFsbC1jaGFpbmNvZGUgLWQgLXMgLS1jaGFpbmNvZGUtcGF0aCAuL3dlYXZlci9wZWVyLyR7Y29udHJhY3ROYW1lfS50YXIuZ3pgXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHByb3ZlQ29udHJhY3QoXG4gIGRvY2tlck5hbWU6IHN0cmluZyxcbiAgY29udHJhY3ROYW1lOiBzdHJpbmcsXG4gIHRsc0NlcnROYW1lOiBzdHJpbmcsXG4gIHNlcXVlbmNlOiBudW1iZXIgPSAxLFxuICB2ZXJzaW9uOiBzdHJpbmcgPSBcIjEuMFwiXG4pIHtcbiAgZXhlY1N5bmMoYGRvY2tlciBleGVjICR7ZG9ja2VyTmFtZX0gbm9kZSAuL3dlYXZlci9saWIvY29yZS9jbGkuY2pzIGFwcHJvdmUtY2hhaW5jb2RlIC1kIC1zIFxcXG4gICAgLS1vcmRlcmVyLWFkZHJlc3Mgb3JnLWEtb3JkZXJlci0wOjcwMjEgXFxcbiAgICAtLWNoYW5uZWwtaWQgc2ltcGxlLWNoYW5uZWwgXFxcbiAgICAtLWNoYWluY29kZS1uYW1lICR7Y29udHJhY3ROYW1lfSBcXFxuICAgIC0tY2hhaW5jb2RlLXZlcnNpb24gJHt2ZXJzaW9ufSBcXFxuICAgIC0tc2VxdWVuY2UgJHtzZXF1ZW5jZX0gXFxcbiAgICAtLWVuYWJsZS10bHMgXFxcbiAgICAtLXRscy1jYS1jZXJ0LWZpbGUgL3dlYXZlci9wZWVyLyR7dGxzQ2VydE5hbWV9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXBsb3lDb250cmFjdChcbiAgY29udHJhY3RGb2xkZXI6IHN0cmluZyxcbiAgY29udHJhY3ROYW1lOiBzdHJpbmcsXG4gIHZlcnNpb246IHN0cmluZyA9IFwiMS4wXCIsXG4gIHBlZXJzOiBzdHJpbmdbXSA9IFtcIm9yZy1hLXBlZXItMFwiLCBcIm9yZy1iLXBlZXItMFwiLCBcIm9yZy1jLXBlZXItMFwiXVxuKSB7XG4gIGxldCBzZXF1ZW5jZTogbnVtYmVyO1xuICBjb25zdCBjb3VudFBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgcGF0aC5qb2luKFxuICAgICAgYCR7X19kaXJuYW1lfWAsXG4gICAgICBcIi4uXCIsXG4gICAgICBcImludGVncmF0aW9uXCIsXG4gICAgICBcImNoYWluY29kZVRyYWNrZXJzXCIsXG4gICAgICBgJHtjb250cmFjdE5hbWV9LmNvdW50YFxuICAgIClcbiAgKTtcbiAgdHJ5IHtcbiAgICBzZXF1ZW5jZSA9IHBhcnNlSW50KGZzLnJlYWRGaWxlU3luYyhjb3VudFBhdGgpLnRvU3RyaW5nKFwidXRmLThcIikpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHNlcXVlbmNlID0gMTtcbiAgfVxuICBmcy53cml0ZUZpbGVTeW5jKGNvdW50UGF0aCwgc2VxdWVuY2UudG9TdHJpbmcoKSk7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IHBlZXIgb2YgcGVlcnMpIHtcbiAgICAgIHBhY2thZ2VDb250cmFjdChwZWVyLCBjb250cmFjdEZvbGRlciwgY29udHJhY3ROYW1lLCB2ZXJzaW9uKTtcbiAgICAgIGluc3RhbGxDb250cmFjdChwZWVyLCBjb250cmFjdE5hbWUpO1xuICAgICAgYXBwcm92ZUNvbnRyYWN0KFxuICAgICAgICBwZWVyLFxuICAgICAgICBjb250cmFjdE5hbWUsXG4gICAgICAgIHBlZXIgPT09IFwib3JnLWEtcGVlci0wXCIgPyBcInRscy1jYS1jZXJ0LnBlbVwiIDogXCJvcmRlcmVyLXRscy1jYS1jZXJ0LnBlbVwiLFxuICAgICAgICBzZXF1ZW5jZSxcbiAgICAgICAgdmVyc2lvblxuICAgICAgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgY29uc29sZS5sb2coXCJFcnJvciBkZXBsb3lpbmcgY29udHJhY3Q6XCIsIGVyci5tZXNzYWdlKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tbWl0Q2hhaW5jb2RlKFxuICBjb250cmFjdE5hbWU6IHN0cmluZyxcbiAgc2VxdWVuY2U6IG51bWJlciA9IDEsXG4gIHZlcnNpb246IHN0cmluZyA9IFwiMS4wXCJcbik6IHZvaWQge1xuICBleGVjU3luYyhgZG9ja2VyIGV4ZWMgb3JnLWEtcGVlci0wIG5vZGUgLi93ZWF2ZXIvbGliL2NvcmUvY2xpLmNqcyBjb21taXQtY2hhaW5jb2RlIC1kIC1zIFxcXG4gICAgLS1vcmRlcmVyLWFkZHJlc3Mgb3JnLWEtb3JkZXJlci0wOjcwMjEgXFxcbiAgICAtLWNoYW5uZWwtaWQgc2ltcGxlLWNoYW5uZWwgXFxcbiAgICAtLWNoYWluY29kZS1uYW1lICR7Y29udHJhY3ROYW1lfSBcXFxuICAgIC0tY2hhaW5jb2RlLXZlcnNpb24gJHt2ZXJzaW9ufSBcXFxuICAgIC0tc2VxdWVuY2UgJHtzZXF1ZW5jZX0gXFxcbiAgICAtLWVuYWJsZS10bHMgXFxcbiAgICAtLXRscy1jYS1jZXJ0LWZpbGUgL3dlYXZlci9wZWVyL3Rscy1jYS1jZXJ0LnBlbSBcXFxuICAgIC0tcGVlci1hZGRyZXNzZXMgb3JnLWEtcGVlci0wOjcwMzEsb3JnLWItcGVlci0wOjcwMzIsb3JnLWMtcGVlci0wOjcwMzMgXFxcbiAgICAtLXBlZXItcm9vdC10bHMgLi93ZWF2ZXIvcGVlci90bHMtY2EtY2VydC5wZW0sLi93ZWF2ZXIvcGVlci9vcmctYi10bHMtY2EtY2VydC5wZW0sLi93ZWF2ZXIvcGVlci9vcmctYy10bHMtY2EtY2VydC5wZW1gKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUNvbnRyYWN0UmVhZGluZXNzKFxuICBjb250cmFjdE5hbWU6IHN0cmluZyxcbiAgZG9ja2VyTmFtZTogc3RyaW5nID0gXCJvcmctYS1wZWVyLTBcIixcbiAgdGxzQ2VydDogc3RyaW5nID0gXCJ0bHMtY2EtY2VydC5wZW1cIixcbiAgY291bnRlciA9IDBcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgLy8gUHJlcGFyZSB0aGUgSlNPTiBhcmd1bWVudCBmb3IgdGhlIGNoYWluY29kZVxuICAgIGNvbnN0IGNoYWluY29kZUFyZ3MgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBmdW5jdGlvbjogXCJoZWFsdGhjaGVja1wiLFxuICAgICAgQXJnczogW10sXG4gICAgfSk7XG5cbiAgICBpZiAoY291bnRlciA+IDEwKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICAvLyBJbnZva2UgdGhlIGNoYWluY29kZVxuICAgIGNvbnN0IHJlcyA9IGV4ZWNTeW5jKFxuICAgICAgYGRvY2tlciBleGVjICR7ZG9ja2VyTmFtZX0gcGVlciBjaGFpbmNvZGUgcXVlcnkgXFxcbiAgICAgICAgLUMgc2ltcGxlLWNoYW5uZWwgXFxcbiAgICAgICAgLW4gJHtjb250cmFjdE5hbWV9IFxcXG4gICAgICAgIC1jICcke2NoYWluY29kZUFyZ3N9JyBcXFxuICAgICAgICAtLXRscyAtLWNhZmlsZSAvd2VhdmVyL3BlZXIvJHt0bHNDZXJ0fWBcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXMudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0LmhlYWx0aGNoZWNrLnRvU3RyaW5nKCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKFwiQ2hhaW5jb2RlIG5vdCByZWFkeS4gUmV0cnlpbmcuLi5cIik7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgNTAwMCkpOyAvLyBXYWl0IGZvciA1IHNlY29uZHMgYmVmb3JlIHJldHJ5aW5nXG4gICAgcmV0dXJuIGVuc3VyZUNvbnRyYWN0UmVhZGluZXNzKFxuICAgICAgY29udHJhY3ROYW1lLFxuICAgICAgZG9ja2VyTmFtZSxcbiAgICAgIHRsc0NlcnQsXG4gICAgICBjb3VudGVyKytcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmltKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc29sZS53YXJuKFwiQ29udHJhY3Qgbm90IHRyaW1taW5nIHJlc3BvbnNlIHByb3Blcmx5OiBcIiwgc3RyKTtcbiAgcmV0dXJuIHN0ci50cmltKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZva2VDaGFpbmNvZGUoXG4gIGNvbnRyYWN0TmFtZTogc3RyaW5nLFxuICBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgYXJnczogYW55W10sXG4gIHRyYW5zaWVudDogYW55ID0ge30sXG4gIGRvY2tlck5hbWU6IHN0cmluZyA9IFwib3JnLWEtcGVlci0wXCIsXG4gIHRsczogc3RyaW5nID0gXCJ0bHMtY2EtY2VydC5wZW1cIlxuKSB7XG4gIC8vIFByZXBhcmUgdGhlIEpTT04gYXJndW1lbnQgZm9yIHRoZSBjaGFpbmNvZGVcbiAgY29uc3QgY2hhaW5jb2RlQXJncyA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBmdW5jdGlvbjogZnVuY3Rpb25OYW1lLFxuICAgIEFyZ3M6IGFyZ3MsXG4gIH0pO1xuXG4gIGNvbnN0IHRyYW5zaWVudERhdGEgPSBKU09OLnN0cmluZ2lmeSh0cmFuc2llbnQpO1xuICBjb25zdCB0cmFuc2llbnRTdHJpbmcgPSBgLS10cmFuc2llbnQgJyR7dHJhbnNpZW50RGF0YX0nYDtcblxuICAvLyBJbnZva2UgdGhlIGNoYWluY29kZVxuICByZXR1cm4gZXhlY1N5bmMoXG4gICAgYGRvY2tlciBleGVjICR7ZG9ja2VyTmFtZX0gcGVlciBjaGFpbmNvZGUgaW52b2tlIFxcXG4gICAgLUMgc2ltcGxlLWNoYW5uZWwgXFxcbiAgICAtbiAke2NvbnRyYWN0TmFtZX0gXFxcbiAgICAtYyAnJHtjaGFpbmNvZGVBcmdzfScgXFxcbiAgICAtLXBlZXJBZGRyZXNzZXMgb3JnLWEtcGVlci0wOjcwMzEgXFxcbiAgICAtLXRsc1Jvb3RDZXJ0RmlsZXMgL3dlYXZlci9wZWVyL3Rscy1jYS1jZXJ0LnBlbSBcXFxuICAgIC0tcGVlckFkZHJlc3NlcyBvcmctYi1wZWVyLTA6NzAzMiBcXFxuICAgIC0tdGxzUm9vdENlcnRGaWxlcyAvd2VhdmVyL3BlZXIvb3JnLWItdGxzLWNhLWNlcnQucGVtIFxcXG4gICAgLS1wZWVyQWRkcmVzc2VzIG9yZy1jLXBlZXItMDo3MDMzIFxcXG4gICAgLS10bHNSb290Q2VydEZpbGVzIC93ZWF2ZXIvcGVlci9vcmctYy10bHMtY2EtY2VydC5wZW0gXFxcbiAgICAtbyBvcmctYS1vcmRlcmVyLTA6NzAyMSBcXFxuICAgIC0tdGxzIC0tY2FmaWxlIC93ZWF2ZXIvcGVlci8ke3Rsc30gXFxcbiAgICAke3RyYW5zaWVudCA/IHRyYW5zaWVudFN0cmluZyA6IFwiXCJ9YFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlDaGFpbmNvZGUoXG4gIGNvbnRyYWN0TmFtZTogc3RyaW5nLFxuICBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgYXJnczogYW55W10sXG4gIGRvY2tlck5hbWU6IHN0cmluZyA9IFwib3JnLWEtcGVlci0wXCIsXG4gIHRsczogc3RyaW5nID0gXCJ0bHMtY2EtY2VydC5wZW1cIlxuKSB7XG4gIHRyeSB7XG4gICAgLy8gUHJlcGFyZSB0aGUgSlNPTiBhcmd1bWVudCBmb3IgdGhlIGNoYWluY29kZVxuICAgIGNvbnN0IGNoYWluY29kZUFyZ3MgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBmdW5jdGlvbjogZnVuY3Rpb25OYW1lLFxuICAgICAgQXJnczogYXJncyxcbiAgICB9KTtcblxuICAgIC8vIEludm9rZSB0aGUgY2hhaW5jb2RlXG4gICAgY29uc3QgcmVzID0gZXhlY1N5bmMoXG4gICAgICBgZG9ja2VyIGV4ZWMgJHtkb2NrZXJOYW1lfSBwZWVyIGNoYWluY29kZSBxdWVyeSBcXFxuICAgICAgICAtQyBzaW1wbGUtY2hhbm5lbCBcXFxuICAgICAgICAtbiAke2NvbnRyYWN0TmFtZX0gXFxcbiAgICAgICAgLWMgJyR7Y2hhaW5jb2RlQXJnc30nIFxcXG4gICAgICAgIC0tdGxzIC0tY2FmaWxlICR7dGxzfWBcbiAgICApO1xuXG4gICAgY29uc3QgcHJvY2Vzc2VkID0gcmVzLnRvU3RyaW5nKCk7XG4gICAgY29uc29sZS5sb2coXCJCbG9ja2NoYWluIHJlYWQ6XCIsIHByb2Nlc3NlZCk7XG5cbiAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKFwiRmFpbGVkIHRvIHJlYWQgYmxvY2tjaGFpblwiKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludm9rZVByaXZhdGVDaGFpbmNvZGUoXG4gIGNvbnRyYWN0TmFtZTogc3RyaW5nLFxuICBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgYXJnczogYW55W10sXG4gIHRyYW5zaWVudDogYW55ID0ge30sXG4gIGRvY2tlck5hbWU6IHN0cmluZyA9IFwib3JnLWEtcGVlci0wXCIsXG4gIHRsczogc3RyaW5nID0gXCJ0bHMtY2EtY2VydC5wZW1cIlxuKSB7XG4gIC8vIFByZXBhcmUgdGhlIEpTT04gYXJndW1lbnQgZm9yIHRoZSBjaGFpbmNvZGVcbiAgY29uc3QgY2hhaW5jb2RlQXJncyA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBmdW5jdGlvbjogZnVuY3Rpb25OYW1lLFxuICAgIEFyZ3M6IGFyZ3MsXG4gIH0pO1xuXG4gIGNvbnN0IHRyYW5zaWVudERhdGEgPSBKU09OLnN0cmluZ2lmeSh0cmFuc2llbnQpO1xuICBjb25zdCB0cmFuc2llbnRTdHJpbmcgPSBgLS10cmFuc2llbnQgJyR7dHJhbnNpZW50RGF0YX0nYDtcblxuICAvLyBJbnZva2UgdGhlIGNoYWluY29kZVxuICByZXR1cm4gZXhlY1N5bmMoXG4gICAgYGRvY2tlciBleGVjICR7ZG9ja2VyTmFtZX0gcGVlciBjaGFpbmNvZGUgaW52b2tlIFxcXG4gICAgLUMgc2ltcGxlLWNoYW5uZWwgXFxcbiAgICAtbiAke2NvbnRyYWN0TmFtZX0gXFxcbiAgICAtYyAnJHtjaGFpbmNvZGVBcmdzfScgXFxcbiAgICAtLXBlZXJBZGRyZXNzZXMgb3JnLWEtcGVlci0wOjcwMzEgXFxcbiAgICAtLXRsc1Jvb3RDZXJ0RmlsZXMgL3dlYXZlci9wZWVyL3Rscy1jYS1jZXJ0LnBlbSBcXFxuICAgIC1vIG9yZy1hLW9yZGVyZXItMDo3MDIxIFxcXG4gICAgLS10bHMgLS1jYWZpbGUgL3dlYXZlci9wZWVyLyR7dGxzfSBcXFxuICAgICR7dHJhbnNpZW50ID8gdHJhbnNpZW50U3RyaW5nIDogXCJcIn1gXG4gICk7XG5cbiAgLy8gICAtLXBlZXJBZGRyZXNzZXMgb3JnLWItcGVlci0wOjcwMzIgXFxcbiAgLy8gLS10bHNSb290Q2VydEZpbGVzIC93ZWF2ZXIvcGVlci9vcmctYi10bHMtY2EtY2VydC5wZW0gXFxcbiAgLy8gLS1wZWVyQWRkcmVzc2VzIG9yZy1jLXBlZXItMDo3MDMzIFxcXG4gIC8vIC0tdGxzUm9vdENlcnRGaWxlcyAvd2VhdmVyL3BlZXIvb3JnLWMtdGxzLWNhLWNlcnQucGVtIFxcXG59XG5cbmV4cG9ydCBlbnVtIFNjcmlwdENvbW1hbmRzIHtcbiAgU1RBUlQgPSBcImZhYnJpYy1jaGFpbmNvZGUtbm9kZSBzdGFydCBcXFxuICAgICAgICAgIC0tZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aCAke0NIQUlOQ09ERV9NQVhSRUNWTVNHU0laRS0xNTcyODY0MH0gXFxcbiAgICAgICAgICAtLWdycGMubWF4X3NlbmRfbWVzc2FnZV9sZW5ndGggJHtDSEFJTkNPREVfTUFYU0VORE1TR1NJWkUtMTU3Mjg2NDB9IFwiLFxuICBTVEFSVF9DQ0FBUyA9IFwiZmFicmljLWNoYWluY29kZS1ub2RlIHNlcnZlciBcXFxuICAgICAgICAgIC0tY2hhaW5jb2RlLWFkZHJlc3M9JENIQUlOQ09ERV9TRVJWRVJfQUREUkVTUyBcXFxuICAgICAgICAgIC0tY2hhaW5jb2RlLWlkPSRDSEFJTkNPREVfSUQgXFxcbiAgICAgICAgICAtLWNoYWluY29kZS10bHMtY2VydC1maWxlPSR7Q0hBSU5DT0RFX1RMU19DRVJUfSBcXFxuICAgICAgICAgIC0tY2hhaW5jb2RlLXRscy1rZXktZmlsZT0ke0NIQUlOQ09ERV9UTFNfS0VZfSBcXFxuICAgICAgICAgIC0tZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aCAke0NIQUlOQ09ERV9NQVhSRUNWTVNHU0laRS0xNTcyODY0MH0gXFxcbiAgICAgICAgICAtLWdycGMubWF4X3NlbmRfbWVzc2FnZV9sZW5ndGggJHtDSEFJTkNPREVfTUFYU0VORE1TR1NJWkUtMTU3Mjg2NDB9IFxcXG4gICAgICAgICAgLS10bHMuZW5hYmxlZD10cnVlXCIsXG4gIFNUQVJUX0NDQUFTX0RFQlVHID0gXCJub2RlIC0taW5zcGVjdD0wLjAuMC4wOjkyMjkgLi9ub2RlX21vZHVsZXMvLmJpbi9mYWJyaWMtY2hhaW5jb2RlLW5vZGUgc2VydmVyIFxcXG4gICAgICAgICAgLS1jaGFpbmNvZGUtYWRkcmVzcz0kQ0hBSU5DT0RFX1NFUlZFUl9BRERSRVNTIFxcXG4gICAgICAgICAgLS1jaGFpbmNvZGUtaWQ9JENIQUlOQ09ERV9JRCBcXFxuICAgICAgICAgIC0tY2hhaW5jb2RlLXRscy1jZXJ0LWZpbGU9JHtDSEFJTkNPREVfVExTX0NFUlR9IFxcXG4gICAgICAgICAgLS1jaGFpbmNvZGUtdGxzLWtleS1maWxlPSR7Q0hBSU5DT0RFX1RMU19LRVl9IFxcXG4gICAgICAgICAgLS1ncnBjLm1heF9yZWNlaXZlX21lc3NhZ2VfbGVuZ3RoICR7Q0hBSU5DT0RFX01BWFJFQ1ZNU0dTSVpFLTE1NzI4NjQwfSBcXFxuICAgICAgICAgIC0tZ3JwYy5tYXhfc2VuZF9tZXNzYWdlX2xlbmd0aCAke0NIQUlOQ09ERV9NQVhTRU5ETVNHU0laRS0xNTcyODY0MH0gXFxcbiAgICAgICAgICAtLXRscy5lbmFibGVkPXRydWVcIixcbiAgU1RBUlRfREVCVUcgPSBcIm5vZGUgLS1pbnNwZWN0PTAuMC4wLjA6OTIyOSAvdXNyL2xvY2FsL3NyYy9ub2RlX21vZHVsZXMvLmJpbi9mYWJyaWMtY2hhaW5jb2RlLW5vZGUgc3RhcnQgXFxcbiAgICAgICAgICAtLWdycGMubWF4X3JlY2VpdmVfbWVzc2FnZV9sZW5ndGggJHtDSEFJTkNPREVfTUFYUkVDVk1TR1NJWkUtMTU3Mjg2NDB9IFxcXG4gICAgICAgICAgLS1ncnBjLm1heF9zZW5kX21lc3NhZ2VfbGVuZ3RoICR7Q0hBSU5DT0RFX01BWFNFTkRNU0dTSVpFLTE1NzI4NjQwfVwiLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udHJhY3RTdGFydENvbW1hbmQoXG4gIGRlYnVnOiBib29sZWFuLFxuICBjY2FhczogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgaWYgKGNjYWFzKSB7XG4gICAgcmV0dXJuIGRlYnVnXG4gICAgICA/IFNjcmlwdENvbW1hbmRzLlNUQVJUX0NDQUFTX0RFQlVHXG4gICAgICA6IFNjcmlwdENvbW1hbmRzLlNUQVJUX0NDQUFTO1xuICB9XG4gIHJldHVybiBkZWJ1ZyA/IFNjcmlwdENvbW1hbmRzLlNUQVJUX0RFQlVHIDogU2NyaXB0Q29tbWFuZHMuU1RBUlQ7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERpYWdub3N0aWNzKGRpYWdzOiByZWFkb25seSB0cy5EaWFnbm9zdGljW10pOiBzdHJpbmcge1xuICBjb25zdCBob3N0OiB0cy5Gb3JtYXREaWFnbm9zdGljc0hvc3QgPSB7XG4gICAgZ2V0Q2Fub25pY2FsRmlsZU5hbWU6IChmKSA9PiBmLFxuICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6IHRzLnN5cy5nZXRDdXJyZW50RGlyZWN0b3J5LFxuICAgIGdldE5ld0xpbmU6ICgpID0+IHRzLnN5cy5uZXdMaW5lLFxuICB9O1xuICByZXR1cm4gdHMuZm9ybWF0RGlhZ25vc3RpY3NXaXRoQ29sb3JBbmRDb250ZXh0KGRpYWdzLCBob3N0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVXaXRoVHNjb25maWdPdmVycmlkZXMoXG4gIHRzY29uZmlnUGF0aDogc3RyaW5nLFxuICBvdmVycmlkZXM6IFBhcnRpYWw8dHMuQ29tcGlsZXJPcHRpb25zPlxuKTogdm9pZCB7XG4gIGNvbnN0IGFic0NvbmZpZ1BhdGggPSBwYXRoLmlzQWJzb2x1dGUodHNjb25maWdQYXRoKVxuICAgID8gdHNjb25maWdQYXRoXG4gICAgOiBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgdHNjb25maWdQYXRoKTtcblxuICAvLyAxKSBSZWFkIHRoZSB0c2NvbmZpZy5qc29uXG4gIGNvbnN0IGNvbmZpZ0ZpbGUgPSB0cy5yZWFkQ29uZmlnRmlsZShhYnNDb25maWdQYXRoLCB0cy5zeXMucmVhZEZpbGUpO1xuICBpZiAoY29uZmlnRmlsZS5lcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihmb3JtYXREaWFnbm9zdGljcyhbY29uZmlnRmlsZS5lcnJvcl0pKTtcbiAgfVxuXG4gIC8vIDIpIFBhcnNlIGl0IChyZXNvbHZlcyBcImV4dGVuZHNcIiwgaW5jbHVkZS9leGNsdWRlL2ZpbGVzLCBldGMuKVxuICBjb25zdCBjb25maWdEaXIgPSBwYXRoLmRpcm5hbWUoYWJzQ29uZmlnUGF0aCk7XG4gIGNvbnN0IHBhcnNlZCA9IHRzLnBhcnNlSnNvbkNvbmZpZ0ZpbGVDb250ZW50KFxuICAgIGNvbmZpZ0ZpbGUuY29uZmlnLFxuICAgIHRzLnN5cyxcbiAgICBjb25maWdEaXIsXG4gICAgLypleGlzdGluZ09wdGlvbnMqLyB1bmRlZmluZWQsXG4gICAgYWJzQ29uZmlnUGF0aFxuICApO1xuXG4gIGlmIChwYXJzZWQuZXJyb3JzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihmb3JtYXREaWFnbm9zdGljcyhwYXJzZWQuZXJyb3JzKSk7XG4gIH1cblxuICAvLyAzKSBPdmVycmlkZSBjb21waWxlciBvcHRpb25zIGluLW1lbW9yeVxuICBjb25zdCBvcHRpb25zOiB0cy5Db21waWxlck9wdGlvbnMgPSB7XG4gICAgLi4ucGFyc2VkLm9wdGlvbnMsXG4gICAgLi4ub3ZlcnJpZGVzLFxuICB9O1xuXG4gIC8vIE9wdGlvbmFsOiBJZiB5b3Ugb3ZlcnJpZGUgb3V0RGlyL3Jvb3REaXIsIGVuc3VyZSB0aGV54oCZcmUgYWJzb2x1dGVcbiAgLy8gdG8gYXZvaWQgc3VycHJpc2VzIGRlcGVuZGluZyBvbiBDV0QuXG4gIGlmIChvcHRpb25zLm91dERpcikgb3B0aW9ucy5vdXREaXIgPSBwYXRoLnJlc29sdmUoY29uZmlnRGlyLCBvcHRpb25zLm91dERpcik7XG4gIGlmIChvcHRpb25zLnJvb3REaXIpXG4gICAgb3B0aW9ucy5yb290RGlyID0gcGF0aC5yZXNvbHZlKGNvbmZpZ0Rpciwgb3B0aW9ucy5yb290RGlyKTtcblxuICAvLyA0KSBDcmVhdGUgcHJvZ3JhbSArIGVtaXRcbiAgY29uc3QgcHJvZ3JhbSA9IHRzLmNyZWF0ZVByb2dyYW0oe1xuICAgIHJvb3ROYW1lczogcGFyc2VkLmZpbGVOYW1lcyxcbiAgICBvcHRpb25zLFxuICAgIHByb2plY3RSZWZlcmVuY2VzOiBwYXJzZWQucHJvamVjdFJlZmVyZW5jZXMsXG4gIH0pO1xuXG4gIGNvbnN0IHByZUVtaXQgPSB0cy5nZXRQcmVFbWl0RGlhZ25vc3RpY3MocHJvZ3JhbSk7XG4gIGlmIChwcmVFbWl0Lmxlbmd0aCkge1xuICAgIC8vIElmIHlvdSB3YW50IFwidHJhbnNwaWxlIGFueXdheVwiLCB5b3UgY2FuIGNob29zZSB0byBub3QgdGhyb3cgaGVyZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoZm9ybWF0RGlhZ25vc3RpY3MocHJlRW1pdCkpO1xuICB9XG5cbiAgY29uc3QgZW1pdFJlc3VsdCA9IHByb2dyYW0uZW1pdCgpO1xuICBjb25zdCBlbWl0RGlhZ25vc3RpY3MgPSBlbWl0UmVzdWx0LmRpYWdub3N0aWNzID8/IFtdO1xuICBpZiAoZW1pdERpYWdub3N0aWNzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihmb3JtYXREaWFnbm9zdGljcyhlbWl0RGlhZ25vc3RpY3MpKTtcbiAgfVxuXG4gIGlmIChlbWl0UmVzdWx0LmVtaXRTa2lwcGVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRW1pdCB3YXMgc2tpcHBlZCAoY2hlY2sgZGlhZ25vc3RpY3MgYWJvdmUpLlwiKTtcbiAgfVxufVxuIl19