@veeroute/lss-studio-angular 7.33.3222 → 7.35.3290

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 (608) hide show
  1. package/README.md +3 -3
  2. package/cfg/entity_error_type.yaml +9 -9
  3. package/cfg/table_settings.json +11 -20
  4. package/fesm2022/veeroute-lss-studio-angular.mjs +220 -159
  5. package/fesm2022/veeroute-lss-studio-angular.mjs.map +1 -1
  6. package/package.json +5 -6
  7. package/types/veeroute-lss-studio-angular.d.ts +13407 -0
  8. package/api/api.d.ts +0 -46
  9. package/api/backupsService.d.ts +0 -56
  10. package/api/backupsServiceInterface.d.ts +0 -35
  11. package/api/customFieldsService.d.ts +0 -145
  12. package/api/customFieldsServiceInterface.d.ts +0 -70
  13. package/api/customIconsService.d.ts +0 -144
  14. package/api/customIconsServiceInterface.d.ts +0 -69
  15. package/api/experimentsService.d.ts +0 -546
  16. package/api/experimentsServiceInterface.d.ts +0 -272
  17. package/api/explorerService.d.ts +0 -279
  18. package/api/explorerServiceInterface.d.ts +0 -132
  19. package/api/externalRoutingService.d.ts +0 -101
  20. package/api/externalRoutingServiceInterface.d.ts +0 -55
  21. package/api/factsService.d.ts +0 -213
  22. package/api/factsServiceInterface.d.ts +0 -119
  23. package/api/hardlinksService.d.ts +0 -213
  24. package/api/hardlinksServiceInterface.d.ts +0 -119
  25. package/api/locationsService.d.ts +0 -192
  26. package/api/locationsServiceInterface.d.ts +0 -112
  27. package/api/ordersService.d.ts +0 -236
  28. package/api/ordersServiceInterface.d.ts +0 -132
  29. package/api/performersService.d.ts +0 -236
  30. package/api/performersServiceInterface.d.ts +0 -132
  31. package/api/systemService.d.ts +0 -78
  32. package/api/systemServiceInterface.d.ts +0 -37
  33. package/api/transportsService.d.ts +0 -236
  34. package/api/transportsServiceInterface.d.ts +0 -132
  35. package/api/tripsService.d.ts +0 -372
  36. package/api/tripsServiceInterface.d.ts +0 -218
  37. package/api/userService.d.ts +0 -162
  38. package/api/userServiceInterface.d.ts +0 -79
  39. package/api.base.service.d.ts +0 -21
  40. package/api.module.d.ts +0 -11
  41. package/configuration.d.ts +0 -106
  42. package/encoder.d.ts +0 -11
  43. package/esm2022/api/api.mjs +0 -47
  44. package/esm2022/api/backupsService.mjs +0 -135
  45. package/esm2022/api/backupsServiceInterface.mjs +0 -2
  46. package/esm2022/api/customFieldsService.mjs +0 -312
  47. package/esm2022/api/customFieldsServiceInterface.mjs +0 -2
  48. package/esm2022/api/customIconsService.mjs +0 -313
  49. package/esm2022/api/customIconsServiceInterface.mjs +0 -2
  50. package/esm2022/api/experimentsService.mjs +0 -1163
  51. package/esm2022/api/experimentsServiceInterface.mjs +0 -2
  52. package/esm2022/api/explorerService.mjs +0 -594
  53. package/esm2022/api/explorerServiceInterface.mjs +0 -2
  54. package/esm2022/api/externalRoutingService.mjs +0 -227
  55. package/esm2022/api/externalRoutingServiceInterface.mjs +0 -2
  56. package/esm2022/api/factsService.mjs +0 -509
  57. package/esm2022/api/factsServiceInterface.mjs +0 -2
  58. package/esm2022/api/hardlinksService.mjs +0 -509
  59. package/esm2022/api/hardlinksServiceInterface.mjs +0 -2
  60. package/esm2022/api/locationsService.mjs +0 -459
  61. package/esm2022/api/locationsServiceInterface.mjs +0 -2
  62. package/esm2022/api/ordersService.mjs +0 -565
  63. package/esm2022/api/ordersServiceInterface.mjs +0 -2
  64. package/esm2022/api/performersService.mjs +0 -565
  65. package/esm2022/api/performersServiceInterface.mjs +0 -2
  66. package/esm2022/api/systemService.mjs +0 -149
  67. package/esm2022/api/systemServiceInterface.mjs +0 -2
  68. package/esm2022/api/transportsService.mjs +0 -565
  69. package/esm2022/api/transportsServiceInterface.mjs +0 -2
  70. package/esm2022/api/tripsService.mjs +0 -900
  71. package/esm2022/api/tripsServiceInterface.mjs +0 -2
  72. package/esm2022/api/userService.mjs +0 -312
  73. package/esm2022/api/userServiceInterface.mjs +0 -2
  74. package/esm2022/api.base.service.mjs +0 -79
  75. package/esm2022/api.module.mjs +0 -40
  76. package/esm2022/configuration.mjs +0 -145
  77. package/esm2022/encoder.mjs +0 -19
  78. package/esm2022/index.mjs +0 -8
  79. package/esm2022/model/actualizeSettings.mjs +0 -11
  80. package/esm2022/model/assignedPerformer.mjs +0 -2
  81. package/esm2022/model/assignedTransport.mjs +0 -2
  82. package/esm2022/model/attribute.mjs +0 -11
  83. package/esm2022/model/basicProcess.mjs +0 -19
  84. package/esm2022/model/basicState.mjs +0 -20
  85. package/esm2022/model/box.mjs +0 -2
  86. package/esm2022/model/boxCompatibilities.mjs +0 -11
  87. package/esm2022/model/boxLimits.mjs +0 -2
  88. package/esm2022/model/break.mjs +0 -11
  89. package/esm2022/model/breakRules.mjs +0 -7
  90. package/esm2022/model/calculationHistoryElement.mjs +0 -2
  91. package/esm2022/model/calculationInfo.mjs +0 -2
  92. package/esm2022/model/calculationSettings.mjs +0 -11
  93. package/esm2022/model/calculationState.mjs +0 -2
  94. package/esm2022/model/calculationStatus.mjs +0 -24
  95. package/esm2022/model/capacity.mjs +0 -11
  96. package/esm2022/model/capacityCost.mjs +0 -11
  97. package/esm2022/model/capacityLimit.mjs +0 -11
  98. package/esm2022/model/capacityMultiplier.mjs +0 -11
  99. package/esm2022/model/capacityStatisticsLoad.mjs +0 -11
  100. package/esm2022/model/capacityStatisticsRatio.mjs +0 -11
  101. package/esm2022/model/capacityStatisticsSum.mjs +0 -11
  102. package/esm2022/model/cargo.mjs +0 -2
  103. package/esm2022/model/cargoAction.mjs +0 -2
  104. package/esm2022/model/cargoActionType.mjs +0 -18
  105. package/esm2022/model/cargoCompatibilities.mjs +0 -2
  106. package/esm2022/model/cargoInvoice.mjs +0 -2
  107. package/esm2022/model/cargoInvoiceDetail.mjs +0 -2
  108. package/esm2022/model/cargoInvoiceHonestSign.mjs +0 -11
  109. package/esm2022/model/cargoInvoiceReceipt.mjs +0 -11
  110. package/esm2022/model/cargoInvoiceTax.mjs +0 -28
  111. package/esm2022/model/cargoRotationType.mjs +0 -20
  112. package/esm2022/model/checkResult.mjs +0 -11
  113. package/esm2022/model/compatibilityPenalty.mjs +0 -11
  114. package/esm2022/model/customfieldConvertRule.mjs +0 -2
  115. package/esm2022/model/customfieldEntityType.mjs +0 -28
  116. package/esm2022/model/customfieldsSettings.mjs +0 -2
  117. package/esm2022/model/demand.mjs +0 -2
  118. package/esm2022/model/demandExtraDuration.mjs +0 -11
  119. package/esm2022/model/demandType.mjs +0 -21
  120. package/esm2022/model/entityError.mjs +0 -2
  121. package/esm2022/model/entityErrorType.mjs +0 -36
  122. package/esm2022/model/entityPath.mjs +0 -2
  123. package/esm2022/model/entityType.mjs +0 -44
  124. package/esm2022/model/entityWarning.mjs +0 -2
  125. package/esm2022/model/entityWarningType.mjs +0 -58
  126. package/esm2022/model/experiment.mjs +0 -2
  127. package/esm2022/model/experimentCheck.mjs +0 -2
  128. package/esm2022/model/experimentList.mjs +0 -2
  129. package/esm2022/model/experimentNeighbors.mjs +0 -11
  130. package/esm2022/model/experimentSettings.mjs +0 -2
  131. package/esm2022/model/experimentStatistics.mjs +0 -2
  132. package/esm2022/model/extensionSettings.mjs +0 -11
  133. package/esm2022/model/fact.mjs +0 -2
  134. package/esm2022/model/factEssences.mjs +0 -2
  135. package/esm2022/model/factStatus.mjs +0 -19
  136. package/esm2022/model/factType.mjs +0 -25
  137. package/esm2022/model/featureLifetime.mjs +0 -2
  138. package/esm2022/model/fileNamePath.mjs +0 -11
  139. package/esm2022/model/fileSpecification.mjs +0 -11
  140. package/esm2022/model/filesystem.mjs +0 -2
  141. package/esm2022/model/filesystemColumnType.mjs +0 -23
  142. package/esm2022/model/filesystemCounters.mjs +0 -2
  143. package/esm2022/model/filesystemPath.mjs +0 -2
  144. package/esm2022/model/folder.mjs +0 -2
  145. package/esm2022/model/folderCounters.mjs +0 -11
  146. package/esm2022/model/folderSpecification.mjs +0 -2
  147. package/esm2022/model/folderType.mjs +0 -18
  148. package/esm2022/model/general400.mjs +0 -2
  149. package/esm2022/model/general402.mjs +0 -2
  150. package/esm2022/model/general403.mjs +0 -2
  151. package/esm2022/model/general404.mjs +0 -2
  152. package/esm2022/model/general404Detail.mjs +0 -2
  153. package/esm2022/model/general429.mjs +0 -2
  154. package/esm2022/model/general500.mjs +0 -2
  155. package/esm2022/model/generalStatistics.mjs +0 -2
  156. package/esm2022/model/geoSettings.mjs +0 -2
  157. package/esm2022/model/geopoint.mjs +0 -11
  158. package/esm2022/model/hardlink.mjs +0 -2
  159. package/esm2022/model/hardlinkElement.mjs +0 -2
  160. package/esm2022/model/hardlinkElementType.mjs +0 -19
  161. package/esm2022/model/importSample.mjs +0 -18
  162. package/esm2022/model/importSource.mjs +0 -18
  163. package/esm2022/model/linkedEssence.mjs +0 -23
  164. package/esm2022/model/loadStatistics.mjs +0 -2
  165. package/esm2022/model/location.mjs +0 -2
  166. package/esm2022/model/locationCargosLimit.mjs +0 -2
  167. package/esm2022/model/locationCompatibilities.mjs +0 -11
  168. package/esm2022/model/locationLimit.mjs +0 -2
  169. package/esm2022/model/locationLimitStatistics.mjs +0 -2
  170. package/esm2022/model/locationStatistics.mjs +0 -2
  171. package/esm2022/model/locationTimetableElement.mjs +0 -2
  172. package/esm2022/model/locationTransportsLimit.mjs +0 -11
  173. package/esm2022/model/measurements.mjs +0 -2
  174. package/esm2022/model/models.mjs +0 -261
  175. package/esm2022/model/order.mjs +0 -2
  176. package/esm2022/model/orderCompatibilities.mjs +0 -11
  177. package/esm2022/model/performer.mjs +0 -2
  178. package/esm2022/model/performerCompatibilities.mjs +0 -2
  179. package/esm2022/model/performerLimits.mjs +0 -2
  180. package/esm2022/model/performerShift.mjs +0 -2
  181. package/esm2022/model/performerTariff.mjs +0 -2
  182. package/esm2022/model/performerTariffConstraint.mjs +0 -11
  183. package/esm2022/model/planSettings.mjs +0 -2
  184. package/esm2022/model/planStatistics.mjs +0 -2
  185. package/esm2022/model/possibleEvent.mjs +0 -2
  186. package/esm2022/model/quality.mjs +0 -2
  187. package/esm2022/model/removedItems.mjs +0 -11
  188. package/esm2022/model/replanSettings.mjs +0 -2
  189. package/esm2022/model/replanStrategy.mjs +0 -11
  190. package/esm2022/model/rest.mjs +0 -11
  191. package/esm2022/model/restRules.mjs +0 -2
  192. package/esm2022/model/roundtripStatistics.mjs +0 -2
  193. package/esm2022/model/routingMatrix.mjs +0 -2
  194. package/esm2022/model/routingMatrixWaypoint.mjs +0 -2
  195. package/esm2022/model/routingTransportMatrix.mjs +0 -2
  196. package/esm2022/model/schemaError.mjs +0 -11
  197. package/esm2022/model/service.mjs +0 -26
  198. package/esm2022/model/settingsKeyList.mjs +0 -11
  199. package/esm2022/model/stopDemand.mjs +0 -2
  200. package/esm2022/model/stopStatistics.mjs +0 -2
  201. package/esm2022/model/tableCustomfields.mjs +0 -11
  202. package/esm2022/model/tableCustomfieldsColumnType.mjs +0 -76
  203. package/esm2022/model/tableDataStats.mjs +0 -11
  204. package/esm2022/model/tableExperimentColumnType.mjs +0 -21
  205. package/esm2022/model/tableFact.mjs +0 -2
  206. package/esm2022/model/tableFactColumnType.mjs +0 -27
  207. package/esm2022/model/tableFactFields.mjs +0 -6
  208. package/esm2022/model/tableFactFilter.mjs +0 -2
  209. package/esm2022/model/tableFactFilterList.mjs +0 -2
  210. package/esm2022/model/tableFactList.mjs +0 -2
  211. package/esm2022/model/tableFactMetrics.mjs +0 -2
  212. package/esm2022/model/tableFactMetricsFilterList.mjs +0 -2
  213. package/esm2022/model/tableFilterBoolList.mjs +0 -11
  214. package/esm2022/model/tableFilterDatetimeRange.mjs +0 -11
  215. package/esm2022/model/tableFilterDurationRange.mjs +0 -11
  216. package/esm2022/model/tableFilterEnumList.mjs +0 -11
  217. package/esm2022/model/tableFilterFloatRange.mjs +0 -11
  218. package/esm2022/model/tableFilterIntRange.mjs +0 -11
  219. package/esm2022/model/tableFilterStringList.mjs +0 -11
  220. package/esm2022/model/tableFilterStringSearch.mjs +0 -11
  221. package/esm2022/model/tableFilterType.mjs +0 -24
  222. package/esm2022/model/tableHardlink.mjs +0 -2
  223. package/esm2022/model/tableHardlinkColumnType.mjs +0 -24
  224. package/esm2022/model/tableHardlinkFields.mjs +0 -7
  225. package/esm2022/model/tableHardlinkFilter.mjs +0 -2
  226. package/esm2022/model/tableHardlinkFilterList.mjs +0 -2
  227. package/esm2022/model/tableHardlinkList.mjs +0 -2
  228. package/esm2022/model/tableHardlinkMetrics.mjs +0 -2
  229. package/esm2022/model/tableHardlinkMetricsFilterList.mjs +0 -2
  230. package/esm2022/model/tableListCounters.mjs +0 -2
  231. package/esm2022/model/tableListCountersDetail.mjs +0 -11
  232. package/esm2022/model/tableLocation.mjs +0 -2
  233. package/esm2022/model/tableLocationColumnType.mjs +0 -23
  234. package/esm2022/model/tableLocationFields.mjs +0 -7
  235. package/esm2022/model/tableLocationFilter.mjs +0 -2
  236. package/esm2022/model/tableLocationFilterList.mjs +0 -2
  237. package/esm2022/model/tableLocationList.mjs +0 -2
  238. package/esm2022/model/tableLocationMetrics.mjs +0 -2
  239. package/esm2022/model/tableLocationMetricsFilterList.mjs +0 -2
  240. package/esm2022/model/tableOrder.mjs +0 -2
  241. package/esm2022/model/tableOrderColumnType.mjs +0 -49
  242. package/esm2022/model/tableOrderFields.mjs +0 -7
  243. package/esm2022/model/tableOrderFilter.mjs +0 -2
  244. package/esm2022/model/tableOrderFilterList.mjs +0 -2
  245. package/esm2022/model/tableOrderList.mjs +0 -2
  246. package/esm2022/model/tableOrderMetrics.mjs +0 -2
  247. package/esm2022/model/tableOrderMetricsFilterList.mjs +0 -2
  248. package/esm2022/model/tablePerformer.mjs +0 -2
  249. package/esm2022/model/tablePerformerColumnType.mjs +0 -31
  250. package/esm2022/model/tablePerformerFields.mjs +0 -7
  251. package/esm2022/model/tablePerformerFilter.mjs +0 -2
  252. package/esm2022/model/tablePerformerFilterList.mjs +0 -2
  253. package/esm2022/model/tablePerformerList.mjs +0 -2
  254. package/esm2022/model/tablePerformerMetrics.mjs +0 -2
  255. package/esm2022/model/tablePerformerMetricsFilterList.mjs +0 -2
  256. package/esm2022/model/tableRoundtrip.mjs +0 -2
  257. package/esm2022/model/tableRoundtripColumnType.mjs +0 -51
  258. package/esm2022/model/tableRoundtripFields.mjs +0 -7
  259. package/esm2022/model/tableRoundtripFilter.mjs +0 -2
  260. package/esm2022/model/tableRoundtripFilterList.mjs +0 -2
  261. package/esm2022/model/tableRoundtripList.mjs +0 -2
  262. package/esm2022/model/tableRoundtripMetrics.mjs +0 -2
  263. package/esm2022/model/tableRoundtripMetricsFilterList.mjs +0 -2
  264. package/esm2022/model/tableTransport.mjs +0 -2
  265. package/esm2022/model/tableTransportColumnType.mjs +0 -37
  266. package/esm2022/model/tableTransportFields.mjs +0 -7
  267. package/esm2022/model/tableTransportFilter.mjs +0 -2
  268. package/esm2022/model/tableTransportFilterList.mjs +0 -2
  269. package/esm2022/model/tableTransportList.mjs +0 -2
  270. package/esm2022/model/tableTransportMetrics.mjs +0 -2
  271. package/esm2022/model/tableTransportMetricsFilterList.mjs +0 -2
  272. package/esm2022/model/tableTrip.mjs +0 -2
  273. package/esm2022/model/tableTripColumnType.mjs +0 -53
  274. package/esm2022/model/tableTripFields.mjs +0 -7
  275. package/esm2022/model/tableTripFilter.mjs +0 -2
  276. package/esm2022/model/tableTripFilterList.mjs +0 -2
  277. package/esm2022/model/tableTripList.mjs +0 -2
  278. package/esm2022/model/tableTripMetrics.mjs +0 -2
  279. package/esm2022/model/tableTripMetricsFilterList.mjs +0 -2
  280. package/esm2022/model/tableTripStop.mjs +0 -2
  281. package/esm2022/model/tableTripStopColumnType.mjs +0 -33
  282. package/esm2022/model/tableTripStopFields.mjs +0 -7
  283. package/esm2022/model/tableTripStopFilter.mjs +0 -2
  284. package/esm2022/model/tableTripStopFilterList.mjs +0 -2
  285. package/esm2022/model/tableTripStopList.mjs +0 -2
  286. package/esm2022/model/taskStatistics.mjs +0 -2
  287. package/esm2022/model/timeWindow.mjs +0 -11
  288. package/esm2022/model/timeWindowViolationDetail.mjs +0 -11
  289. package/esm2022/model/timeWindowViolations.mjs +0 -2
  290. package/esm2022/model/tracedata.mjs +0 -2
  291. package/esm2022/model/track.mjs +0 -2
  292. package/esm2022/model/trackList.mjs +0 -2
  293. package/esm2022/model/trackListCustom.mjs +0 -2
  294. package/esm2022/model/trackType.mjs +0 -19
  295. package/esm2022/model/trackpoint.mjs +0 -11
  296. package/esm2022/model/translations.mjs +0 -11
  297. package/esm2022/model/transport.mjs +0 -2
  298. package/esm2022/model/transportCapacityMultiplier.mjs +0 -2
  299. package/esm2022/model/transportCompatibilities.mjs +0 -2
  300. package/esm2022/model/transportLimits.mjs +0 -2
  301. package/esm2022/model/transportLoad.mjs +0 -2
  302. package/esm2022/model/transportShift.mjs +0 -2
  303. package/esm2022/model/transportSpeedMultiplier.mjs +0 -2
  304. package/esm2022/model/transportTariff.mjs +0 -2
  305. package/esm2022/model/transportTariffConstraint.mjs +0 -11
  306. package/esm2022/model/transportType.mjs +0 -32
  307. package/esm2022/model/trip.mjs +0 -2
  308. package/esm2022/model/tripAssumptions.mjs +0 -2
  309. package/esm2022/model/tripExpectations.mjs +0 -2
  310. package/esm2022/model/tripPenalties.mjs +0 -2
  311. package/esm2022/model/tripStartTimeStrategy.mjs +0 -18
  312. package/esm2022/model/tripState.mjs +0 -2
  313. package/esm2022/model/tripStateFlag.mjs +0 -30
  314. package/esm2022/model/tripStatistics.mjs +0 -2
  315. package/esm2022/model/tripStatus.mjs +0 -25
  316. package/esm2022/model/tripsSettings.mjs +0 -2
  317. package/esm2022/model/universal400WithErrorsAndWarnings.mjs +0 -2
  318. package/esm2022/model/universalData.mjs +0 -2
  319. package/esm2022/model/unplannedItems.mjs +0 -11
  320. package/esm2022/model/versionResult.mjs +0 -11
  321. package/esm2022/model/webFact.mjs +0 -2
  322. package/esm2022/model/webHardlink.mjs +0 -2
  323. package/esm2022/model/webLocation.mjs +0 -2
  324. package/esm2022/model/webLocationGeopoint.mjs +0 -2
  325. package/esm2022/model/webLocationGeopointList.mjs +0 -2
  326. package/esm2022/model/webOrder.mjs +0 -2
  327. package/esm2022/model/webOrderGeopoint.mjs +0 -2
  328. package/esm2022/model/webOrderGeopointList.mjs +0 -2
  329. package/esm2022/model/webPerformer.mjs +0 -2
  330. package/esm2022/model/webPerformerGeopoint.mjs +0 -7
  331. package/esm2022/model/webPerformerGeopointList.mjs +0 -2
  332. package/esm2022/model/webTransport.mjs +0 -2
  333. package/esm2022/model/webTransportGeopoint.mjs +0 -7
  334. package/esm2022/model/webTransportGeopointList.mjs +0 -2
  335. package/esm2022/model/webTrip.mjs +0 -2
  336. package/esm2022/model/webTripChart.mjs +0 -2
  337. package/esm2022/model/webTripChartDemand.mjs +0 -2
  338. package/esm2022/model/webTripChartList.mjs +0 -2
  339. package/esm2022/model/workAndRestRules.mjs +0 -2
  340. package/esm2022/param.mjs +0 -2
  341. package/esm2022/provide-api.mjs +0 -15
  342. package/esm2022/variables.mjs +0 -9
  343. package/esm2022/veeroute-lss-studio-angular.mjs +0 -5
  344. package/index.d.ts +0 -7
  345. package/model/actualizeSettings.d.ts +0 -23
  346. package/model/assignedPerformer.d.ts +0 -25
  347. package/model/assignedTransport.d.ts +0 -25
  348. package/model/attribute.d.ts +0 -23
  349. package/model/basicProcess.d.ts +0 -17
  350. package/model/basicState.d.ts +0 -18
  351. package/model/box.d.ts +0 -30
  352. package/model/boxCompatibilities.d.ts +0 -31
  353. package/model/boxLimits.d.ts +0 -17
  354. package/model/break.d.ts +0 -27
  355. package/model/breakRules.d.ts +0 -29
  356. package/model/calculationHistoryElement.d.ts +0 -21
  357. package/model/calculationInfo.d.ts +0 -49
  358. package/model/calculationSettings.d.ts +0 -39
  359. package/model/calculationState.d.ts +0 -23
  360. package/model/calculationStatus.d.ts +0 -22
  361. package/model/capacity.d.ts +0 -35
  362. package/model/capacityCost.d.ts +0 -35
  363. package/model/capacityLimit.d.ts +0 -35
  364. package/model/capacityMultiplier.d.ts +0 -35
  365. package/model/capacityStatisticsLoad.d.ts +0 -35
  366. package/model/capacityStatisticsRatio.d.ts +0 -35
  367. package/model/capacityStatisticsSum.d.ts +0 -35
  368. package/model/cargo.d.ts +0 -34
  369. package/model/cargoAction.d.ts +0 -25
  370. package/model/cargoActionType.d.ts +0 -16
  371. package/model/cargoCompatibilities.d.ts +0 -44
  372. package/model/cargoInvoice.d.ts +0 -30
  373. package/model/cargoInvoiceDetail.d.ts +0 -55
  374. package/model/cargoInvoiceHonestSign.d.ts +0 -23
  375. package/model/cargoInvoiceReceipt.d.ts +0 -27
  376. package/model/cargoInvoiceTax.d.ts +0 -26
  377. package/model/cargoRotationType.d.ts +0 -18
  378. package/model/checkResult.d.ts +0 -19
  379. package/model/compatibilityPenalty.d.ts +0 -23
  380. package/model/customfieldConvertRule.d.ts +0 -25
  381. package/model/customfieldEntityType.d.ts +0 -26
  382. package/model/customfieldsSettings.d.ts +0 -20
  383. package/model/demand.d.ts +0 -47
  384. package/model/demandExtraDuration.d.ts +0 -23
  385. package/model/demandType.d.ts +0 -19
  386. package/model/entityError.d.ts +0 -26
  387. package/model/entityErrorType.d.ts +0 -34
  388. package/model/entityPath.d.ts +0 -22
  389. package/model/entityType.d.ts +0 -42
  390. package/model/entityWarning.d.ts +0 -26
  391. package/model/entityWarningType.d.ts +0 -56
  392. package/model/experiment.d.ts +0 -49
  393. package/model/experimentCheck.d.ts +0 -25
  394. package/model/experimentList.d.ts +0 -22
  395. package/model/experimentNeighbors.d.ts +0 -23
  396. package/model/experimentSettings.d.ts +0 -21
  397. package/model/experimentStatistics.d.ts +0 -31
  398. package/model/extensionSettings.d.ts +0 -35
  399. package/model/fact.d.ts +0 -58
  400. package/model/factEssences.d.ts +0 -20
  401. package/model/factStatus.d.ts +0 -17
  402. package/model/factType.d.ts +0 -23
  403. package/model/featureLifetime.d.ts +0 -24
  404. package/model/fileNamePath.d.ts +0 -23
  405. package/model/fileSpecification.d.ts +0 -27
  406. package/model/filesystem.d.ts +0 -23
  407. package/model/filesystemColumnType.d.ts +0 -21
  408. package/model/filesystemCounters.d.ts +0 -24
  409. package/model/filesystemPath.d.ts +0 -20
  410. package/model/folder.d.ts +0 -60
  411. package/model/folderCounters.d.ts +0 -23
  412. package/model/folderSpecification.d.ts +0 -40
  413. package/model/folderType.d.ts +0 -16
  414. package/model/general400.d.ts +0 -26
  415. package/model/general402.d.ts +0 -21
  416. package/model/general403.d.ts +0 -21
  417. package/model/general404.d.ts +0 -21
  418. package/model/general404Detail.d.ts +0 -17
  419. package/model/general429.d.ts +0 -21
  420. package/model/general500.d.ts +0 -21
  421. package/model/generalStatistics.d.ts +0 -96
  422. package/model/geoSettings.d.ts +0 -40
  423. package/model/geopoint.d.ts +0 -23
  424. package/model/hardlink.d.ts +0 -29
  425. package/model/hardlinkElement.d.ts +0 -21
  426. package/model/hardlinkElementType.d.ts +0 -17
  427. package/model/importSample.d.ts +0 -16
  428. package/model/importSource.d.ts +0 -16
  429. package/model/linkedEssence.d.ts +0 -34
  430. package/model/loadStatistics.d.ts +0 -28
  431. package/model/location.d.ts +0 -49
  432. package/model/locationCargosLimit.d.ts +0 -25
  433. package/model/locationCompatibilities.d.ts +0 -19
  434. package/model/locationLimit.d.ts +0 -42
  435. package/model/locationLimitStatistics.d.ts +0 -33
  436. package/model/locationStatistics.d.ts +0 -40
  437. package/model/locationTimetableElement.d.ts +0 -25
  438. package/model/locationTransportsLimit.d.ts +0 -23
  439. package/model/measurements.d.ts +0 -53
  440. package/model/models.d.ts +0 -260
  441. package/model/order.d.ts +0 -40
  442. package/model/orderCompatibilities.d.ts +0 -31
  443. package/model/performer.d.ts +0 -42
  444. package/model/performerCompatibilities.d.ts +0 -28
  445. package/model/performerLimits.d.ts +0 -24
  446. package/model/performerShift.d.ts +0 -57
  447. package/model/performerTariff.d.ts +0 -28
  448. package/model/performerTariffConstraint.d.ts +0 -23
  449. package/model/planSettings.d.ts +0 -23
  450. package/model/planStatistics.d.ts +0 -31
  451. package/model/possibleEvent.d.ts +0 -42
  452. package/model/quality.d.ts +0 -28
  453. package/model/removedItems.d.ts +0 -63
  454. package/model/replanSettings.d.ts +0 -17
  455. package/model/replanStrategy.d.ts +0 -27
  456. package/model/rest.d.ts +0 -27
  457. package/model/restRules.d.ts +0 -20
  458. package/model/roundtripStatistics.d.ts +0 -24
  459. package/model/routingMatrix.d.ts +0 -28
  460. package/model/routingMatrixWaypoint.d.ts +0 -21
  461. package/model/routingTransportMatrix.d.ts +0 -19
  462. package/model/schemaError.d.ts +0 -23
  463. package/model/service.d.ts +0 -24
  464. package/model/settingsKeyList.d.ts +0 -23
  465. package/model/stopDemand.d.ts +0 -28
  466. package/model/stopStatistics.d.ts +0 -60
  467. package/model/tableCustomfields.d.ts +0 -255
  468. package/model/tableCustomfieldsColumnType.d.ts +0 -74
  469. package/model/tableDataStats.d.ts +0 -47
  470. package/model/tableExperimentColumnType.d.ts +0 -19
  471. package/model/tableFact.d.ts +0 -21
  472. package/model/tableFactColumnType.d.ts +0 -25
  473. package/model/tableFactFields.d.ts +0 -68
  474. package/model/tableFactFilter.d.ts +0 -37
  475. package/model/tableFactFilterList.d.ts +0 -20
  476. package/model/tableFactList.d.ts +0 -22
  477. package/model/tableFactMetrics.d.ts +0 -26
  478. package/model/tableFactMetricsFilterList.d.ts +0 -24
  479. package/model/tableFilterBoolList.d.ts +0 -19
  480. package/model/tableFilterDatetimeRange.d.ts +0 -23
  481. package/model/tableFilterDurationRange.d.ts +0 -23
  482. package/model/tableFilterEnumList.d.ts +0 -19
  483. package/model/tableFilterFloatRange.d.ts +0 -23
  484. package/model/tableFilterIntRange.d.ts +0 -23
  485. package/model/tableFilterStringList.d.ts +0 -23
  486. package/model/tableFilterStringSearch.d.ts +0 -23
  487. package/model/tableFilterType.d.ts +0 -22
  488. package/model/tableHardlink.d.ts +0 -21
  489. package/model/tableHardlinkColumnType.d.ts +0 -22
  490. package/model/tableHardlinkFields.d.ts +0 -57
  491. package/model/tableHardlinkFilter.d.ts +0 -37
  492. package/model/tableHardlinkFilterList.d.ts +0 -20
  493. package/model/tableHardlinkList.d.ts +0 -22
  494. package/model/tableHardlinkMetrics.d.ts +0 -26
  495. package/model/tableHardlinkMetricsFilterList.d.ts +0 -24
  496. package/model/tableListCounters.d.ts +0 -24
  497. package/model/tableListCountersDetail.d.ts +0 -19
  498. package/model/tableLocation.d.ts +0 -21
  499. package/model/tableLocationColumnType.d.ts +0 -21
  500. package/model/tableLocationFields.d.ts +0 -47
  501. package/model/tableLocationFilter.d.ts +0 -37
  502. package/model/tableLocationFilterList.d.ts +0 -20
  503. package/model/tableLocationList.d.ts +0 -22
  504. package/model/tableLocationMetrics.d.ts +0 -26
  505. package/model/tableLocationMetricsFilterList.d.ts +0 -24
  506. package/model/tableOrder.d.ts +0 -21
  507. package/model/tableOrderColumnType.d.ts +0 -47
  508. package/model/tableOrderFields.d.ts +0 -137
  509. package/model/tableOrderFilter.d.ts +0 -37
  510. package/model/tableOrderFilterList.d.ts +0 -20
  511. package/model/tableOrderList.d.ts +0 -22
  512. package/model/tableOrderMetrics.d.ts +0 -26
  513. package/model/tableOrderMetricsFilterList.d.ts +0 -24
  514. package/model/tablePerformer.d.ts +0 -21
  515. package/model/tablePerformerColumnType.d.ts +0 -29
  516. package/model/tablePerformerFields.d.ts +0 -76
  517. package/model/tablePerformerFilter.d.ts +0 -37
  518. package/model/tablePerformerFilterList.d.ts +0 -20
  519. package/model/tablePerformerList.d.ts +0 -22
  520. package/model/tablePerformerMetrics.d.ts +0 -26
  521. package/model/tablePerformerMetricsFilterList.d.ts +0 -24
  522. package/model/tableRoundtrip.d.ts +0 -21
  523. package/model/tableRoundtripColumnType.d.ts +0 -49
  524. package/model/tableRoundtripFields.d.ts +0 -159
  525. package/model/tableRoundtripFilter.d.ts +0 -37
  526. package/model/tableRoundtripFilterList.d.ts +0 -20
  527. package/model/tableRoundtripList.d.ts +0 -22
  528. package/model/tableRoundtripMetrics.d.ts +0 -26
  529. package/model/tableRoundtripMetricsFilterList.d.ts +0 -24
  530. package/model/tableTransport.d.ts +0 -21
  531. package/model/tableTransportColumnType.d.ts +0 -35
  532. package/model/tableTransportFields.d.ts +0 -101
  533. package/model/tableTransportFilter.d.ts +0 -37
  534. package/model/tableTransportFilterList.d.ts +0 -20
  535. package/model/tableTransportList.d.ts +0 -22
  536. package/model/tableTransportMetrics.d.ts +0 -26
  537. package/model/tableTransportMetricsFilterList.d.ts +0 -24
  538. package/model/tableTrip.d.ts +0 -21
  539. package/model/tableTripColumnType.d.ts +0 -51
  540. package/model/tableTripFields.d.ts +0 -165
  541. package/model/tableTripFilter.d.ts +0 -37
  542. package/model/tableTripFilterList.d.ts +0 -20
  543. package/model/tableTripList.d.ts +0 -22
  544. package/model/tableTripMetrics.d.ts +0 -26
  545. package/model/tableTripMetricsFilterList.d.ts +0 -24
  546. package/model/tableTripStop.d.ts +0 -21
  547. package/model/tableTripStopColumnType.d.ts +0 -31
  548. package/model/tableTripStopFields.d.ts +0 -90
  549. package/model/tableTripStopFilter.d.ts +0 -37
  550. package/model/tableTripStopFilterList.d.ts +0 -20
  551. package/model/tableTripStopList.d.ts +0 -22
  552. package/model/taskStatistics.d.ts +0 -20
  553. package/model/timeWindow.d.ts +0 -23
  554. package/model/timeWindowViolationDetail.d.ts +0 -23
  555. package/model/timeWindowViolations.d.ts +0 -24
  556. package/model/tracedata.d.ts +0 -49
  557. package/model/track.d.ts +0 -44
  558. package/model/trackList.d.ts +0 -22
  559. package/model/trackListCustom.d.ts +0 -20
  560. package/model/trackType.d.ts +0 -17
  561. package/model/trackpoint.d.ts +0 -27
  562. package/model/translations.d.ts +0 -23
  563. package/model/transport.d.ts +0 -44
  564. package/model/transportCapacityMultiplier.d.ts +0 -19
  565. package/model/transportCompatibilities.d.ts +0 -28
  566. package/model/transportLimits.d.ts +0 -21
  567. package/model/transportLoad.d.ts +0 -21
  568. package/model/transportShift.d.ts +0 -43
  569. package/model/transportSpeedMultiplier.d.ts +0 -21
  570. package/model/transportTariff.d.ts +0 -26
  571. package/model/transportTariffConstraint.d.ts +0 -23
  572. package/model/transportType.d.ts +0 -30
  573. package/model/trip.d.ts +0 -41
  574. package/model/tripAssumptions.d.ts +0 -45
  575. package/model/tripExpectations.d.ts +0 -26
  576. package/model/tripPenalties.d.ts +0 -24
  577. package/model/tripStartTimeStrategy.d.ts +0 -16
  578. package/model/tripState.d.ts +0 -66
  579. package/model/tripStateFlag.d.ts +0 -28
  580. package/model/tripStatistics.d.ts +0 -41
  581. package/model/tripStatus.d.ts +0 -23
  582. package/model/tripsSettings.d.ts +0 -25
  583. package/model/universal400WithErrorsAndWarnings.d.ts +0 -36
  584. package/model/universalData.d.ts +0 -67
  585. package/model/unplannedItems.d.ts +0 -47
  586. package/model/versionResult.d.ts +0 -27
  587. package/model/webFact.d.ts +0 -24
  588. package/model/webHardlink.d.ts +0 -24
  589. package/model/webLocation.d.ts +0 -26
  590. package/model/webLocationGeopoint.d.ts +0 -33
  591. package/model/webLocationGeopointList.d.ts +0 -30
  592. package/model/webOrder.d.ts +0 -24
  593. package/model/webOrderGeopoint.d.ts +0 -43
  594. package/model/webOrderGeopointList.d.ts +0 -30
  595. package/model/webPerformer.d.ts +0 -24
  596. package/model/webPerformerGeopoint.d.ts +0 -45
  597. package/model/webPerformerGeopointList.d.ts +0 -30
  598. package/model/webTransport.d.ts +0 -24
  599. package/model/webTransportGeopoint.d.ts +0 -45
  600. package/model/webTransportGeopointList.d.ts +0 -30
  601. package/model/webTrip.d.ts +0 -26
  602. package/model/webTripChart.d.ts +0 -22
  603. package/model/webTripChartDemand.d.ts +0 -21
  604. package/model/webTripChartList.d.ts +0 -22
  605. package/model/workAndRestRules.d.ts +0 -27
  606. package/param.d.ts +0 -37
  607. package/provide-api.d.ts +0 -3
  608. package/variables.d.ts +0 -8
@@ -1,565 +0,0 @@
1
- /**
2
- * VRt.Studio [ST]
3
- *
4
- * The version of the OpenAPI document: 7.33.3222
5
- * Contact: support@veeroute.com
6
- *
7
- * NOTE: This class is auto generated by OpenAPI Generator.
8
- * Do not edit the class manually.
9
- */
10
- /* tslint:disable:no-unused-variable member-ordering */
11
- import { Inject, Injectable, Optional } from '@angular/core';
12
- import { HttpParams, HttpContext } from '@angular/common/http';
13
- // @ts-ignore
14
- import { BASE_PATH } from '../variables';
15
- import { BaseService } from '../api.base.service';
16
- import * as i0 from "@angular/core";
17
- import * as i1 from "@angular/common/http";
18
- import * as i2 from "../configuration";
19
- export class TransportsService extends BaseService {
20
- httpClient;
21
- constructor(httpClient, basePath, configuration) {
22
- super(basePath, configuration);
23
- this.httpClient = httpClient;
24
- }
25
- createTransport(requestParameters, observe = 'body', reportProgress = false, options) {
26
- const fileKey = requestParameters?.fileKey;
27
- if (fileKey === null || fileKey === undefined) {
28
- throw new Error('Required parameter fileKey was null or undefined when calling createTransport.');
29
- }
30
- const transportStudio = requestParameters?.transportStudio;
31
- if (transportStudio === null || transportStudio === undefined) {
32
- throw new Error('Required parameter transportStudio was null or undefined when calling createTransport.');
33
- }
34
- let localVarHeaders = this.defaultHeaders;
35
- // authentication (ApiKeyAuth) required
36
- localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
37
- const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
38
- 'application/json'
39
- ]);
40
- if (localVarHttpHeaderAcceptSelected !== undefined) {
41
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
42
- }
43
- const localVarHttpContext = options?.context ?? new HttpContext();
44
- const localVarTransferCache = options?.transferCache ?? true;
45
- // to determine the Content-Type header
46
- const consumes = [
47
- 'application/json'
48
- ];
49
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
50
- if (httpContentTypeSelected !== undefined) {
51
- localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
52
- }
53
- let responseType_ = 'json';
54
- if (localVarHttpHeaderAcceptSelected) {
55
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
56
- responseType_ = 'text';
57
- }
58
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
59
- responseType_ = 'json';
60
- }
61
- else {
62
- responseType_ = 'blob';
63
- }
64
- }
65
- let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/transports`;
66
- const { basePath, withCredentials } = this.configuration;
67
- return this.httpClient.request('post', `${basePath}${localVarPath}`, {
68
- context: localVarHttpContext,
69
- body: transportStudio,
70
- responseType: responseType_,
71
- ...(withCredentials ? { withCredentials } : {}),
72
- headers: localVarHeaders,
73
- observe: observe,
74
- transferCache: localVarTransferCache,
75
- reportProgress: reportProgress
76
- });
77
- }
78
- deleteTransport(requestParameters, observe = 'body', reportProgress = false, options) {
79
- const fileKey = requestParameters?.fileKey;
80
- if (fileKey === null || fileKey === undefined) {
81
- throw new Error('Required parameter fileKey was null or undefined when calling deleteTransport.');
82
- }
83
- const essenceKey = requestParameters?.essenceKey;
84
- if (essenceKey === null || essenceKey === undefined) {
85
- throw new Error('Required parameter essenceKey was null or undefined when calling deleteTransport.');
86
- }
87
- let localVarHeaders = this.defaultHeaders;
88
- // authentication (ApiKeyAuth) required
89
- localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
90
- const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
91
- 'application/json'
92
- ]);
93
- if (localVarHttpHeaderAcceptSelected !== undefined) {
94
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
95
- }
96
- const localVarHttpContext = options?.context ?? new HttpContext();
97
- const localVarTransferCache = options?.transferCache ?? true;
98
- let responseType_ = 'json';
99
- if (localVarHttpHeaderAcceptSelected) {
100
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
101
- responseType_ = 'text';
102
- }
103
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
104
- responseType_ = 'json';
105
- }
106
- else {
107
- responseType_ = 'blob';
108
- }
109
- }
110
- let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/transports/${this.configuration.encodeParam({ name: "essenceKey", value: essenceKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined })}`;
111
- const { basePath, withCredentials } = this.configuration;
112
- return this.httpClient.request('delete', `${basePath}${localVarPath}`, {
113
- context: localVarHttpContext,
114
- responseType: responseType_,
115
- ...(withCredentials ? { withCredentials } : {}),
116
- headers: localVarHeaders,
117
- observe: observe,
118
- transferCache: localVarTransferCache,
119
- reportProgress: reportProgress
120
- });
121
- }
122
- deleteTransportsBatch(requestParameters, observe = 'body', reportProgress = false, options) {
123
- const fileKey = requestParameters?.fileKey;
124
- if (fileKey === null || fileKey === undefined) {
125
- throw new Error('Required parameter fileKey was null or undefined when calling deleteTransportsBatch.');
126
- }
127
- const requestBody = requestParameters?.requestBody;
128
- if (requestBody === null || requestBody === undefined) {
129
- throw new Error('Required parameter requestBody was null or undefined when calling deleteTransportsBatch.');
130
- }
131
- let localVarHeaders = this.defaultHeaders;
132
- // authentication (ApiKeyAuth) required
133
- localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
134
- const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
135
- 'application/json'
136
- ]);
137
- if (localVarHttpHeaderAcceptSelected !== undefined) {
138
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
139
- }
140
- const localVarHttpContext = options?.context ?? new HttpContext();
141
- const localVarTransferCache = options?.transferCache ?? true;
142
- // to determine the Content-Type header
143
- const consumes = [
144
- 'application/json'
145
- ];
146
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
147
- if (httpContentTypeSelected !== undefined) {
148
- localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
149
- }
150
- let responseType_ = 'json';
151
- if (localVarHttpHeaderAcceptSelected) {
152
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
153
- responseType_ = 'text';
154
- }
155
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
156
- responseType_ = 'json';
157
- }
158
- else {
159
- responseType_ = 'blob';
160
- }
161
- }
162
- let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/transports/batch/table`;
163
- const { basePath, withCredentials } = this.configuration;
164
- return this.httpClient.request('delete', `${basePath}${localVarPath}`, {
165
- context: localVarHttpContext,
166
- body: requestBody,
167
- responseType: responseType_,
168
- ...(withCredentials ? { withCredentials } : {}),
169
- headers: localVarHeaders,
170
- observe: observe,
171
- transferCache: localVarTransferCache,
172
- reportProgress: reportProgress
173
- });
174
- }
175
- disableTransportsBatch(requestParameters, observe = 'body', reportProgress = false, options) {
176
- const fileKey = requestParameters?.fileKey;
177
- if (fileKey === null || fileKey === undefined) {
178
- throw new Error('Required parameter fileKey was null or undefined when calling disableTransportsBatch.');
179
- }
180
- const requestBody = requestParameters?.requestBody;
181
- if (requestBody === null || requestBody === undefined) {
182
- throw new Error('Required parameter requestBody was null or undefined when calling disableTransportsBatch.');
183
- }
184
- let localVarHeaders = this.defaultHeaders;
185
- // authentication (ApiKeyAuth) required
186
- localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
187
- const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
188
- 'application/json'
189
- ]);
190
- if (localVarHttpHeaderAcceptSelected !== undefined) {
191
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
192
- }
193
- const localVarHttpContext = options?.context ?? new HttpContext();
194
- const localVarTransferCache = options?.transferCache ?? true;
195
- // to determine the Content-Type header
196
- const consumes = [
197
- 'application/json'
198
- ];
199
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
200
- if (httpContentTypeSelected !== undefined) {
201
- localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
202
- }
203
- let responseType_ = 'json';
204
- if (localVarHttpHeaderAcceptSelected) {
205
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
206
- responseType_ = 'text';
207
- }
208
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
209
- responseType_ = 'json';
210
- }
211
- else {
212
- responseType_ = 'blob';
213
- }
214
- }
215
- let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/transports/batch/ability`;
216
- const { basePath, withCredentials } = this.configuration;
217
- return this.httpClient.request('delete', `${basePath}${localVarPath}`, {
218
- context: localVarHttpContext,
219
- body: requestBody,
220
- responseType: responseType_,
221
- ...(withCredentials ? { withCredentials } : {}),
222
- headers: localVarHeaders,
223
- observe: observe,
224
- transferCache: localVarTransferCache,
225
- reportProgress: reportProgress
226
- });
227
- }
228
- enableTransportsBatch(requestParameters, observe = 'body', reportProgress = false, options) {
229
- const fileKey = requestParameters?.fileKey;
230
- if (fileKey === null || fileKey === undefined) {
231
- throw new Error('Required parameter fileKey was null or undefined when calling enableTransportsBatch.');
232
- }
233
- const requestBody = requestParameters?.requestBody;
234
- if (requestBody === null || requestBody === undefined) {
235
- throw new Error('Required parameter requestBody was null or undefined when calling enableTransportsBatch.');
236
- }
237
- let localVarHeaders = this.defaultHeaders;
238
- // authentication (ApiKeyAuth) required
239
- localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
240
- const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
241
- 'application/json'
242
- ]);
243
- if (localVarHttpHeaderAcceptSelected !== undefined) {
244
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
245
- }
246
- const localVarHttpContext = options?.context ?? new HttpContext();
247
- const localVarTransferCache = options?.transferCache ?? true;
248
- // to determine the Content-Type header
249
- const consumes = [
250
- 'application/json'
251
- ];
252
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
253
- if (httpContentTypeSelected !== undefined) {
254
- localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
255
- }
256
- let responseType_ = 'json';
257
- if (localVarHttpHeaderAcceptSelected) {
258
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
259
- responseType_ = 'text';
260
- }
261
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
262
- responseType_ = 'json';
263
- }
264
- else {
265
- responseType_ = 'blob';
266
- }
267
- }
268
- let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/transports/batch/ability`;
269
- const { basePath, withCredentials } = this.configuration;
270
- return this.httpClient.request('put', `${basePath}${localVarPath}`, {
271
- context: localVarHttpContext,
272
- body: requestBody,
273
- responseType: responseType_,
274
- ...(withCredentials ? { withCredentials } : {}),
275
- headers: localVarHeaders,
276
- observe: observe,
277
- transferCache: localVarTransferCache,
278
- reportProgress: reportProgress
279
- });
280
- }
281
- readTransport(requestParameters, observe = 'body', reportProgress = false, options) {
282
- const fileKey = requestParameters?.fileKey;
283
- if (fileKey === null || fileKey === undefined) {
284
- throw new Error('Required parameter fileKey was null or undefined when calling readTransport.');
285
- }
286
- const essenceKey = requestParameters?.essenceKey;
287
- if (essenceKey === null || essenceKey === undefined) {
288
- throw new Error('Required parameter essenceKey was null or undefined when calling readTransport.');
289
- }
290
- let localVarHeaders = this.defaultHeaders;
291
- // authentication (ApiKeyAuth) required
292
- localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
293
- const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
294
- 'application/json'
295
- ]);
296
- if (localVarHttpHeaderAcceptSelected !== undefined) {
297
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
298
- }
299
- const localVarHttpContext = options?.context ?? new HttpContext();
300
- const localVarTransferCache = options?.transferCache ?? true;
301
- let responseType_ = 'json';
302
- if (localVarHttpHeaderAcceptSelected) {
303
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
304
- responseType_ = 'text';
305
- }
306
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
307
- responseType_ = 'json';
308
- }
309
- else {
310
- responseType_ = 'blob';
311
- }
312
- }
313
- let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/transports/${this.configuration.encodeParam({ name: "essenceKey", value: essenceKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined })}`;
314
- const { basePath, withCredentials } = this.configuration;
315
- return this.httpClient.request('get', `${basePath}${localVarPath}`, {
316
- context: localVarHttpContext,
317
- responseType: responseType_,
318
- ...(withCredentials ? { withCredentials } : {}),
319
- headers: localVarHeaders,
320
- observe: observe,
321
- transferCache: localVarTransferCache,
322
- reportProgress: reportProgress
323
- });
324
- }
325
- readTransportsGeopoints(requestParameters, observe = 'body', reportProgress = false, options) {
326
- const fileKey = requestParameters?.fileKey;
327
- if (fileKey === null || fileKey === undefined) {
328
- throw new Error('Required parameter fileKey was null or undefined when calling readTransportsGeopoints.');
329
- }
330
- const offset = requestParameters?.offset;
331
- const limit = requestParameters?.limit;
332
- const tableTransportFilterListStudio = requestParameters?.tableTransportFilterListStudio;
333
- let localVarQueryParameters = new HttpParams({ encoder: this.encoder });
334
- localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, offset, 'offset');
335
- localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, limit, 'limit');
336
- let localVarHeaders = this.defaultHeaders;
337
- // authentication (ApiKeyAuth) required
338
- localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
339
- const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
340
- 'application/json'
341
- ]);
342
- if (localVarHttpHeaderAcceptSelected !== undefined) {
343
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
344
- }
345
- const localVarHttpContext = options?.context ?? new HttpContext();
346
- const localVarTransferCache = options?.transferCache ?? true;
347
- // to determine the Content-Type header
348
- const consumes = [
349
- 'application/json'
350
- ];
351
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
352
- if (httpContentTypeSelected !== undefined) {
353
- localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
354
- }
355
- let responseType_ = 'json';
356
- if (localVarHttpHeaderAcceptSelected) {
357
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
358
- responseType_ = 'text';
359
- }
360
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
361
- responseType_ = 'json';
362
- }
363
- else {
364
- responseType_ = 'blob';
365
- }
366
- }
367
- let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/transports/batch/geopoints`;
368
- const { basePath, withCredentials } = this.configuration;
369
- return this.httpClient.request('post', `${basePath}${localVarPath}`, {
370
- context: localVarHttpContext,
371
- body: tableTransportFilterListStudio,
372
- params: localVarQueryParameters,
373
- responseType: responseType_,
374
- ...(withCredentials ? { withCredentials } : {}),
375
- headers: localVarHeaders,
376
- observe: observe,
377
- transferCache: localVarTransferCache,
378
- reportProgress: reportProgress
379
- });
380
- }
381
- readTransportsMetrics(requestParameters, observe = 'body', reportProgress = false, options) {
382
- const fileKey = requestParameters?.fileKey;
383
- if (fileKey === null || fileKey === undefined) {
384
- throw new Error('Required parameter fileKey was null or undefined when calling readTransportsMetrics.');
385
- }
386
- const tableTransportMetricsFilterListStudio = requestParameters?.tableTransportMetricsFilterListStudio;
387
- if (tableTransportMetricsFilterListStudio === null || tableTransportMetricsFilterListStudio === undefined) {
388
- throw new Error('Required parameter tableTransportMetricsFilterListStudio was null or undefined when calling readTransportsMetrics.');
389
- }
390
- let localVarHeaders = this.defaultHeaders;
391
- // authentication (ApiKeyAuth) required
392
- localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
393
- const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
394
- 'application/json'
395
- ]);
396
- if (localVarHttpHeaderAcceptSelected !== undefined) {
397
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
398
- }
399
- const localVarHttpContext = options?.context ?? new HttpContext();
400
- const localVarTransferCache = options?.transferCache ?? true;
401
- // to determine the Content-Type header
402
- const consumes = [
403
- 'application/json'
404
- ];
405
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
406
- if (httpContentTypeSelected !== undefined) {
407
- localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
408
- }
409
- let responseType_ = 'json';
410
- if (localVarHttpHeaderAcceptSelected) {
411
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
412
- responseType_ = 'text';
413
- }
414
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
415
- responseType_ = 'json';
416
- }
417
- else {
418
- responseType_ = 'blob';
419
- }
420
- }
421
- let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/transports/batch/metrics`;
422
- const { basePath, withCredentials } = this.configuration;
423
- return this.httpClient.request('post', `${basePath}${localVarPath}`, {
424
- context: localVarHttpContext,
425
- body: tableTransportMetricsFilterListStudio,
426
- responseType: responseType_,
427
- ...(withCredentials ? { withCredentials } : {}),
428
- headers: localVarHeaders,
429
- observe: observe,
430
- transferCache: localVarTransferCache,
431
- reportProgress: reportProgress
432
- });
433
- }
434
- readTransportsTable(requestParameters, observe = 'body', reportProgress = false, options) {
435
- const fileKey = requestParameters?.fileKey;
436
- if (fileKey === null || fileKey === undefined) {
437
- throw new Error('Required parameter fileKey was null or undefined when calling readTransportsTable.');
438
- }
439
- const offset = requestParameters?.offset;
440
- const limit = requestParameters?.limit;
441
- const sortField = requestParameters?.sortField;
442
- const sortCustomfield = requestParameters?.sortCustomfield;
443
- const sortDirection = requestParameters?.sortDirection;
444
- const tableTransportFilterListStudio = requestParameters?.tableTransportFilterListStudio;
445
- let localVarQueryParameters = new HttpParams({ encoder: this.encoder });
446
- localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, offset, 'offset');
447
- localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, limit, 'limit');
448
- localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, sortField, 'sort_field');
449
- localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, sortCustomfield, 'sort_customfield');
450
- localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, sortDirection, 'sort_direction');
451
- let localVarHeaders = this.defaultHeaders;
452
- // authentication (ApiKeyAuth) required
453
- localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
454
- const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
455
- 'application/json'
456
- ]);
457
- if (localVarHttpHeaderAcceptSelected !== undefined) {
458
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
459
- }
460
- const localVarHttpContext = options?.context ?? new HttpContext();
461
- const localVarTransferCache = options?.transferCache ?? true;
462
- // to determine the Content-Type header
463
- const consumes = [
464
- 'application/json'
465
- ];
466
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
467
- if (httpContentTypeSelected !== undefined) {
468
- localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
469
- }
470
- let responseType_ = 'json';
471
- if (localVarHttpHeaderAcceptSelected) {
472
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
473
- responseType_ = 'text';
474
- }
475
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
476
- responseType_ = 'json';
477
- }
478
- else {
479
- responseType_ = 'blob';
480
- }
481
- }
482
- let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/transports/batch/table`;
483
- const { basePath, withCredentials } = this.configuration;
484
- return this.httpClient.request('post', `${basePath}${localVarPath}`, {
485
- context: localVarHttpContext,
486
- body: tableTransportFilterListStudio,
487
- params: localVarQueryParameters,
488
- responseType: responseType_,
489
- ...(withCredentials ? { withCredentials } : {}),
490
- headers: localVarHeaders,
491
- observe: observe,
492
- transferCache: localVarTransferCache,
493
- reportProgress: reportProgress
494
- });
495
- }
496
- updateTransport(requestParameters, observe = 'body', reportProgress = false, options) {
497
- const fileKey = requestParameters?.fileKey;
498
- if (fileKey === null || fileKey === undefined) {
499
- throw new Error('Required parameter fileKey was null or undefined when calling updateTransport.');
500
- }
501
- const transportStudio = requestParameters?.transportStudio;
502
- if (transportStudio === null || transportStudio === undefined) {
503
- throw new Error('Required parameter transportStudio was null or undefined when calling updateTransport.');
504
- }
505
- let localVarHeaders = this.defaultHeaders;
506
- // authentication (ApiKeyAuth) required
507
- localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
508
- const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
509
- 'application/json'
510
- ]);
511
- if (localVarHttpHeaderAcceptSelected !== undefined) {
512
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
513
- }
514
- const localVarHttpContext = options?.context ?? new HttpContext();
515
- const localVarTransferCache = options?.transferCache ?? true;
516
- // to determine the Content-Type header
517
- const consumes = [
518
- 'application/json'
519
- ];
520
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
521
- if (httpContentTypeSelected !== undefined) {
522
- localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
523
- }
524
- let responseType_ = 'json';
525
- if (localVarHttpHeaderAcceptSelected) {
526
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
527
- responseType_ = 'text';
528
- }
529
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
530
- responseType_ = 'json';
531
- }
532
- else {
533
- responseType_ = 'blob';
534
- }
535
- }
536
- let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/transports`;
537
- const { basePath, withCredentials } = this.configuration;
538
- return this.httpClient.request('put', `${basePath}${localVarPath}`, {
539
- context: localVarHttpContext,
540
- body: transportStudio,
541
- responseType: responseType_,
542
- ...(withCredentials ? { withCredentials } : {}),
543
- headers: localVarHeaders,
544
- observe: observe,
545
- transferCache: localVarTransferCache,
546
- reportProgress: reportProgress
547
- });
548
- }
549
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TransportsService, deps: [{ token: i1.HttpClient }, { token: BASE_PATH, optional: true }, { token: i2.Configuration, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
550
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TransportsService, providedIn: 'root' });
551
- }
552
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TransportsService, decorators: [{
553
- type: Injectable,
554
- args: [{
555
- providedIn: 'root'
556
- }]
557
- }], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
558
- type: Optional
559
- }, {
560
- type: Inject,
561
- args: [BASE_PATH]
562
- }] }, { type: i2.Configuration, decorators: [{
563
- type: Optional
564
- }] }] });
565
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3J0c1NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hcGkvdHJhbnNwb3J0c1NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFDSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQTJCLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQTJCLFVBQVUsRUFDVSxXQUFXLEVBQ3hELE1BQVksc0JBQXNCLENBQUM7QUFtQzVDLGFBQWE7QUFDYixPQUFPLEVBQUUsU0FBUyxFQUFzQixNQUEwQixjQUFjLENBQUM7QUFFakYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBb0JsRCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsV0FBVztJQUV4QjtJQUF0QixZQUFzQixVQUFzQixFQUFpQyxRQUF5QixFQUFjLGFBQTZCO1FBQzdJLEtBQUssQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFEYixlQUFVLEdBQVYsVUFBVSxDQUFZO0lBRTVDLENBQUM7SUFZTSxlQUFlLENBQUMsaUJBQStDLEVBQUUsVUFBZSxNQUFNLEVBQUUsaUJBQTBCLEtBQUssRUFBRSxPQUFpRztRQUM3TixNQUFNLE9BQU8sR0FBRyxpQkFBaUIsRUFBRSxPQUFPLENBQUM7UUFDM0MsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLGdGQUFnRixDQUFDLENBQUM7UUFDdEcsQ0FBQztRQUNELE1BQU0sZUFBZSxHQUFHLGlCQUFpQixFQUFFLGVBQWUsQ0FBQztRQUMzRCxJQUFJLGVBQWUsS0FBSyxJQUFJLElBQUksZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVELE1BQU0sSUFBSSxLQUFLLENBQUMsd0ZBQXdGLENBQUMsQ0FBQztRQUM5RyxD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biBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogNy4zMy4zMjIyXG4gKiBDb250YWN0OiBzdXBwb3J0QHZlZXJvdXRlLmNvbVxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IuXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbi8qIHRzbGludDpkaXNhYmxlOm5vLXVudXNlZC12YXJpYWJsZSBtZW1iZXItb3JkZXJpbmcgKi9cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9ICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsXG4gICAgICAgICBIdHRwUmVzcG9uc2UsIEh0dHBFdmVudCwgSHR0cFBhcmFtZXRlckNvZGVjLCBIdHRwQ29udGV4dCBcbiAgICAgICAgfSAgICAgICBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDdXN0b21IdHRwUGFyYW1ldGVyQ29kZWMgfSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vZW5jb2Rlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAncnhqcyc7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEdlbmVyYWw0MDBTdHVkaW8gfSBmcm9tICcuLi9tb2RlbC9nZW5lcmFsNDAwJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEdlbmVyYWw0MDJTdHVkaW8gfSBmcm9tICcuLi9tb2RlbC9nZW5lcmFsNDAyJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEdlbmVyYWw0MDNTdHVkaW8gfSBmcm9tICcuLi9tb2RlbC9nZW5lcmFsNDAzJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEdlbmVyYWw0MDRTdHVkaW8gfSBmcm9tICcuLi9tb2RlbC9nZW5lcmFsNDA0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEdlbmVyYWw0MjlTdHVkaW8gfSBmcm9tICcuLi9tb2RlbC9nZW5lcmFsNDI5Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEdlbmVyYWw1MDBTdHVkaW8gfSBmcm9tICcuLi9tb2RlbC9nZW5lcmFsNTAwJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFRhYmxlQ3VzdG9tZmllbGRzQ29sdW1uVHlwZVN0dWRpbyB9IGZyb20gJy4uL21vZGVsL3RhYmxlQ3VzdG9tZmllbGRzQ29sdW1uVHlwZSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBUYWJsZVRyYW5zcG9ydENvbHVtblR5cGVTdHVkaW8gfSBmcm9tICcuLi9tb2RlbC90YWJsZVRyYW5zcG9ydENvbHVtblR5cGUnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVGFibGVUcmFuc3BvcnRGaWx0ZXJMaXN0U3R1ZGlvIH0gZnJvbSAnLi4vbW9kZWwvdGFibGVUcmFuc3BvcnRGaWx0ZXJMaXN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFRhYmxlVHJhbnNwb3J0TGlzdFN0dWRpbyB9IGZyb20gJy4uL21vZGVsL3RhYmxlVHJhbnNwb3J0TGlzdCc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBUYWJsZVRyYW5zcG9ydE1ldHJpY3NGaWx0ZXJMaXN0U3R1ZGlvIH0gZnJvbSAnLi4vbW9kZWwvdGFibGVUcmFuc3BvcnRNZXRyaWNzRmlsdGVyTGlzdCc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBUYWJsZVRyYW5zcG9ydE1ldHJpY3NTdHVkaW8gfSBmcm9tICcuLi9tb2RlbC90YWJsZVRyYW5zcG9ydE1ldHJpY3MnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVHJhbnNwb3J0U3R1ZGlvIH0gZnJvbSAnLi4vbW9kZWwvdHJhbnNwb3J0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFdlYlRyYW5zcG9ydEdlb3BvaW50TGlzdFN0dWRpbyB9IGZyb20gJy4uL21vZGVsL3dlYlRyYW5zcG9ydEdlb3BvaW50TGlzdCc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBXZWJUcmFuc3BvcnRTdHVkaW8gfSBmcm9tICcuLi9tb2RlbC93ZWJUcmFuc3BvcnQnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBCQVNFX1BBVEgsIENPTExFQ1RJT05fRk9STUFUUyB9ICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vdmFyaWFibGVzJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpLmJhc2Uuc2VydmljZSc7XG5pbXBvcnQge1xuICAgIFRyYW5zcG9ydHNTZXJ2aWNlSW50ZXJmYWNlLFxuICAgIENyZWF0ZVRyYW5zcG9ydFJlcXVlc3RQYXJhbXMsXG4gICAgRGVsZXRlVHJhbnNwb3J0UmVxdWVzdFBhcmFtcyxcbiAgICBEZWxldGVUcmFuc3BvcnRzQmF0Y2hSZXF1ZXN0UGFyYW1zLFxuICAgIERpc2FibGVUcmFuc3BvcnRzQmF0Y2hSZXF1ZXN0UGFyYW1zLFxuICAgIEVuYWJsZVRyYW5zcG9ydHNCYXRjaFJlcXVlc3RQYXJhbXMsXG4gICAgUmVhZFRyYW5zcG9ydFJlcXVlc3RQYXJhbXMsXG4gICAgUmVhZFRyYW5zcG9ydHNHZW9wb2ludHNSZXF1ZXN0UGFyYW1zLFxuICAgIFJlYWRUcmFuc3BvcnRzTWV0cmljc1JlcXVlc3RQYXJhbXMsXG4gICAgUmVhZFRyYW5zcG9ydHNUYWJsZVJlcXVlc3RQYXJhbXMsXG4gICAgVXBkYXRlVHJhbnNwb3J0UmVxdWVzdFBhcmFtc1xufSBmcm9tICcuL3RyYW5zcG9ydHNTZXJ2aWNlSW50ZXJmYWNlJztcblxuXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRyYW5zcG9ydHNTZXJ2aWNlIGV4dGVuZHMgQmFzZVNlcnZpY2UgaW1wbGVtZW50cyBUcmFuc3BvcnRzU2VydmljZUludGVyZmFjZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaHR0cENsaWVudDogSHR0cENsaWVudCwgQE9wdGlvbmFsKCkgQEluamVjdChCQVNFX1BBVEgpIGJhc2VQYXRoOiBzdHJpbmd8c3RyaW5nW10sIEBPcHRpb25hbCgpIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIHN1cGVyKGJhc2VQYXRoLCBjb25maWd1cmF0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgdHJhbnNwb3J0XG4gICAgICogTmV3IGVzc2VuY2VzIGNyZWF0aW9uLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVUcmFuc3BvcnQocmVxdWVzdFBhcmFtZXRlcnM6IENyZWF0ZVRyYW5zcG9ydFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8V2ViVHJhbnNwb3J0U3R1ZGlvPjtcbiAgICBwdWJsaWMgY3JlYXRlVHJhbnNwb3J0KHJlcXVlc3RQYXJhbWV0ZXJzOiBDcmVhdGVUcmFuc3BvcnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8V2ViVHJhbnNwb3J0U3R1ZGlvPj47XG4gICAgcHVibGljIGNyZWF0ZVRyYW5zcG9ydChyZXF1ZXN0UGFyYW1ldGVyczogQ3JlYXRlVHJhbnNwb3J0UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxXZWJUcmFuc3BvcnRTdHVkaW8+PjtcbiAgICBwdWJsaWMgY3JlYXRlVHJhbnNwb3J0KHJlcXVlc3RQYXJhbWV0ZXJzOiBDcmVhdGVUcmFuc3BvcnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBmaWxlS2V5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbGVLZXk7XG4gICAgICAgIGlmIChmaWxlS2V5ID09PSBudWxsIHx8IGZpbGVLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZmlsZUtleSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGNyZWF0ZVRyYW5zcG9ydC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc3BvcnRTdHVkaW8gPSByZXF1ZXN0UGFyYW1ldGVycz8udHJhbnNwb3J0U3R1ZGlvO1xuICAgICAgICBpZiAodHJhbnNwb3J0U3R1ZGlvID09PSBudWxsIHx8IHRyYW5zcG9ydFN0dWRpbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB0cmFuc3BvcnRTdHVkaW8gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVUcmFuc3BvcnQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQXBpS2V5QXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5jb25maWd1cmF0aW9uLmFkZENyZWRlbnRpYWxUb0hlYWRlcnMoJ0FwaUtleUF1dGgnLCAnQXV0aG9yaXphdGlvbicsIGxvY2FsVmFySGVhZGVycywgJ0JlYXJlciAnKTtcblxuICAgICAgICBjb25zdCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucz8uaHR0cEhlYWRlckFjY2VwdCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdKTtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0ID0gb3B0aW9ucz8uY29udGV4dCA/PyBuZXcgSHR0cENvbnRleHQoKTtcblxuICAgICAgICBjb25zdCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gPSBvcHRpb25zPy50cmFuc2ZlckNhY2hlID8/IHRydWU7XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3N0dWRpby9leHBlcmltZW50cy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJmaWxlS2V5XCIsIHZhbHVlOiBmaWxlS2V5LCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IFwidXVpZFwifSl9L3RyYW5zcG9ydHNgO1xuICAgICAgICBjb25zdCB7IGJhc2VQYXRoLCB3aXRoQ3JlZGVudGlhbHMgfSA9IHRoaXMuY29uZmlndXJhdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFdlYlRyYW5zcG9ydFN0dWRpbz4oJ3Bvc3QnLCBgJHtiYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogdHJhbnNwb3J0U3R1ZGlvLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIC4uLih3aXRoQ3JlZGVudGlhbHMgPyB7IHdpdGhDcmVkZW50aWFscyB9IDoge30pLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdHJhbnNwb3J0XG4gICAgICogUmVtb3ZpbmcgYSB0cmFuc3BvcnQgYnkga2V5LlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVUcmFuc3BvcnQocmVxdWVzdFBhcmFtZXRlcnM6IERlbGV0ZVRyYW5zcG9ydFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PjtcbiAgICBwdWJsaWMgZGVsZXRlVHJhbnNwb3J0KHJlcXVlc3RQYXJhbWV0ZXJzOiBEZWxldGVUcmFuc3BvcnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8YW55Pj47XG4gICAgcHVibGljIGRlbGV0ZVRyYW5zcG9ydChyZXF1ZXN0UGFyYW1ldGVyczogRGVsZXRlVHJhbnNwb3J0UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PjtcbiAgICBwdWJsaWMgZGVsZXRlVHJhbnNwb3J0KHJlcXVlc3RQYXJhbWV0ZXJzOiBEZWxldGVUcmFuc3BvcnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBmaWxlS2V5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbGVLZXk7XG4gICAgICAgIGlmIChmaWxlS2V5ID09PSBudWxsIHx8IGZpbGVLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZmlsZUtleSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlbGV0ZVRyYW5zcG9ydC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlc3NlbmNlS2V5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVzc2VuY2VLZXk7XG4gICAgICAgIGlmIChlc3NlbmNlS2V5ID09PSBudWxsIHx8IGVzc2VuY2VLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZXNzZW5jZUtleSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlbGV0ZVRyYW5zcG9ydC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChBcGlLZXlBdXRoKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkQ3JlZGVudGlhbFRvSGVhZGVycygnQXBpS2V5QXV0aCcsICdBdXRob3JpemF0aW9uJywgbG9jYWxWYXJIZWFkZXJzLCAnQmVhcmVyICcpO1xuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zPy5odHRwSGVhZGVyQWNjZXB0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgPSBvcHRpb25zPy5jb250ZXh0ID8/IG5ldyBIdHRwQ29udGV4dCgpO1xuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiA9IG9wdGlvbnM/LnRyYW5zZmVyQ2FjaGUgPz8gdHJ1ZTtcblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9zdHVkaW8vZXhwZXJpbWVudHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZmlsZUtleVwiLCB2YWx1ZTogZmlsZUtleSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiBcInV1aWRcIn0pfS90cmFuc3BvcnRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImVzc2VuY2VLZXlcIiwgdmFsdWU6IGVzc2VuY2VLZXksIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9YDtcbiAgICAgICAgY29uc3QgeyBiYXNlUGF0aCwgd2l0aENyZWRlbnRpYWxzIH0gPSB0aGlzLmNvbmZpZ3VyYXRpb247XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxhbnk+KCdkZWxldGUnLCBgJHtiYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgLi4uKHdpdGhDcmVkZW50aWFscyA/IHsgd2l0aENyZWRlbnRpYWxzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSB0cmFuc3BvcnRzIChiYXRjaClcbiAgICAgKiBSZW1vdmluZyB0cmFuc3BvcnRzIGZyb20gdGhlIGZpbGUuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZVRyYW5zcG9ydHNCYXRjaChyZXF1ZXN0UGFyYW1ldGVyczogRGVsZXRlVHJhbnNwb3J0c0JhdGNoUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIHB1YmxpYyBkZWxldGVUcmFuc3BvcnRzQmF0Y2gocmVxdWVzdFBhcmFtZXRlcnM6IERlbGV0ZVRyYW5zcG9ydHNCYXRjaFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxhbnk+PjtcbiAgICBwdWJsaWMgZGVsZXRlVHJhbnNwb3J0c0JhdGNoKHJlcXVlc3RQYXJhbWV0ZXJzOiBEZWxldGVUcmFuc3BvcnRzQmF0Y2hSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+O1xuICAgIHB1YmxpYyBkZWxldGVUcmFuc3BvcnRzQmF0Y2gocmVxdWVzdFBhcmFtZXRlcnM6IERlbGV0ZVRyYW5zcG9ydHNCYXRjaFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGZpbGVLZXkgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsZUtleTtcbiAgICAgICAgaWYgKGZpbGVLZXkgPT09IG51bGwgfHwgZmlsZUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBmaWxlS2V5IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVsZXRlVHJhbnNwb3J0c0JhdGNoLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnJlcXVlc3RCb2R5O1xuICAgICAgICBpZiAocmVxdWVzdEJvZHkgPT09IG51bGwgfHwgcmVxdWVzdEJvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgcmVxdWVzdEJvZHkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWxldGVUcmFuc3BvcnRzQmF0Y2guJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQXBpS2V5QXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5jb25maWd1cmF0aW9uLmFkZENyZWRlbnRpYWxUb0hlYWRlcnMoJ0FwaUtleUF1dGgnLCAnQXV0aG9yaXphdGlvbicsIGxvY2FsVmFySGVhZGVycywgJ0JlYXJlciAnKTtcblxuICAgICAgICBjb25zdCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucz8uaHR0cEhlYWRlckFjY2VwdCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdKTtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0ID0gb3B0aW9ucz8uY29udGV4dCA/PyBuZXcgSHR0cENvbnRleHQoKTtcblxuICAgICAgICBjb25zdCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gPSBvcHRpb25zPy50cmFuc2ZlckNhY2hlID8/IHRydWU7XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3N0dWRpby9leHBlcmltZW50cy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJmaWxlS2V5XCIsIHZhbHVlOiBmaWxlS2V5LCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IFwidXVpZFwifSl9L3RyYW5zcG9ydHMvYmF0Y2gvdGFibGVgO1xuICAgICAgICBjb25zdCB7IGJhc2VQYXRoLCB3aXRoQ3JlZGVudGlhbHMgfSA9IHRoaXMuY29uZmlndXJhdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PGFueT4oJ2RlbGV0ZScsIGAke2Jhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiByZXF1ZXN0Qm9keSxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICAuLi4od2l0aENyZWRlbnRpYWxzID8geyB3aXRoQ3JlZGVudGlhbHMgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSB0cmFuc3BvcnRzXG4gICAgICogRGlzYWJsZSB0cmFuc3BvcnRzIGluIHRoZSBjYWxjdWxhdGlvbi5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzYWJsZVRyYW5zcG9ydHNCYXRjaChyZXF1ZXN0UGFyYW1ldGVyczogRGlzYWJsZVRyYW5zcG9ydHNCYXRjaFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PjtcbiAgICBwdWJsaWMgZGlzYWJsZVRyYW5zcG9ydHNCYXRjaChyZXF1ZXN0UGFyYW1ldGVyczogRGlzYWJsZVRyYW5zcG9ydHNCYXRjaFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxhbnk+PjtcbiAgICBwdWJsaWMgZGlzYWJsZVRyYW5zcG9ydHNCYXRjaChyZXF1ZXN0UGFyYW1ldGVyczogRGlzYWJsZVRyYW5zcG9ydHNCYXRjaFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj47XG4gICAgcHVibGljIGRpc2FibGVUcmFuc3BvcnRzQmF0Y2gocmVxdWVzdFBhcmFtZXRlcnM6IERpc2FibGVUcmFuc3BvcnRzQmF0Y2hSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBmaWxlS2V5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbGVLZXk7XG4gICAgICAgIGlmIChmaWxlS2V5ID09PSBudWxsIHx8IGZpbGVLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZmlsZUtleSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRpc2FibGVUcmFuc3BvcnRzQmF0Y2guJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSByZXF1ZXN0UGFyYW1ldGVycz8ucmVxdWVzdEJvZHk7XG4gICAgICAgIGlmIChyZXF1ZXN0Qm9keSA9PT0gbnVsbCB8fCByZXF1ZXN0Qm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciByZXF1ZXN0Qm9keSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRpc2FibGVUcmFuc3BvcnRzQmF0Y2guJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQXBpS2V5QXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5jb25maWd1cmF0aW9uLmFkZENyZWRlbnRpYWxUb0hlYWRlcnMoJ0FwaUtleUF1dGgnLCAnQXV0aG9yaXphdGlvbicsIGxvY2FsVmFySGVhZGVycywgJ0JlYXJlciAnKTtcblxuICAgICAgICBjb25zdCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucz8uaHR0cEhlYWRlckFjY2VwdCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdKTtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0ID0gb3B0aW9ucz8uY29udGV4dCA/PyBuZXcgSHR0cENvbnRleHQoKTtcblxuICAgICAgICBjb25zdCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gPSBvcHRpb25zPy50cmFuc2ZlckNhY2hlID8/IHRydWU7XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3N0dWRpby9leHBlcmltZW50cy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJmaWxlS2V5XCIsIHZhbHVlOiBmaWxlS2V5LCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IFwidXVpZFwifSl9L3RyYW5zcG9ydHMvYmF0Y2gvYWJpbGl0eWA7XG4gICAgICAgIGNvbnN0IHsgYmFzZVBhdGgsIHdpdGhDcmVkZW50aWFscyB9ID0gdGhpcy5jb25maWd1cmF0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8YW55PignZGVsZXRlJywgYCR7YmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHJlcXVlc3RCb2R5LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIC4uLih3aXRoQ3JlZGVudGlhbHMgPyB7IHdpdGhDcmVkZW50aWFscyB9IDoge30pLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgdHJhbnNwb3J0c1xuICAgICAqIEVuYWJsZSB0cmFuc3BvcnRzIGluIHRoZSBjYWxjdWxhdGlvbi5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZW5hYmxlVHJhbnNwb3J0c0JhdGNoKHJlcXVlc3RQYXJhbWV0ZXJzOiBFbmFibGVUcmFuc3BvcnRzQmF0Y2hSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT47XG4gICAgcHVibGljIGVuYWJsZVRyYW5zcG9ydHNCYXRjaChyZXF1ZXN0UGFyYW1ldGVyczogRW5hYmxlVHJhbnNwb3J0c0JhdGNoUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPGFueT4+O1xuICAgIHB1YmxpYyBlbmFibGVUcmFuc3BvcnRzQmF0Y2gocmVxdWVzdFBhcmFtZXRlcnM6IEVuYWJsZVRyYW5zcG9ydHNCYXRjaFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj47XG4gICAgcHVibGljIGVuYWJsZVRyYW5zcG9ydHNCYXRjaChyZXF1ZXN0UGFyYW1ldGVyczogRW5hYmxlVHJhbnNwb3J0c0JhdGNoUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZmlsZUtleSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5maWxlS2V5O1xuICAgICAgICBpZiAoZmlsZUtleSA9PT0gbnVsbCB8fCBmaWxlS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGZpbGVLZXkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBlbmFibGVUcmFuc3BvcnRzQmF0Y2guJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSByZXF1ZXN0UGFyYW1ldGVycz8ucmVxdWVzdEJvZHk7XG4gICAgICAgIGlmIChyZXF1ZXN0Qm9keSA9PT0gbnVsbCB8fCByZXF1ZXN0Qm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciByZXF1ZXN0Qm9keSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGVuYWJsZVRyYW5zcG9ydHNCYXRjaC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChBcGlLZXlBdXRoKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkQ3JlZGVudGlhbFRvSGVhZGVycygnQXBpS2V5QXV0aCcsICdBdXRob3JpemF0aW9uJywgbG9jYWxWYXJIZWFkZXJzLCAnQmVhcmVyICcpO1xuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zPy5odHRwSGVhZGVyQWNjZXB0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgPSBvcHRpb25zPy5jb250ZXh0ID8/IG5ldyBIdHRwQ29udGV4dCgpO1xuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiA9IG9wdGlvbnM/LnRyYW5zZmVyQ2FjaGUgPz8gdHJ1ZTtcblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvc3R1ZGlvL2V4cGVyaW1lbnRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImZpbGVLZXlcIiwgdmFsdWU6IGZpbGVLZXksIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogXCJ1dWlkXCJ9KX0vdHJhbnNwb3J0cy9iYXRjaC9hYmlsaXR5YDtcbiAgICAgICAgY29uc3QgeyBiYXNlUGF0aCwgd2l0aENyZWRlbnRpYWxzIH0gPSB0aGlzLmNvbmZpZ3VyYXRpb247XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxhbnk+KCdwdXQnLCBgJHtiYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogcmVxdWVzdEJvZHksXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgLi4uKHdpdGhDcmVkZW50aWFscyA/IHsgd2l0aENyZWRlbnRpYWxzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYWRpbmcgdHJhbnNwb3J0XG4gICAgICogR2V0dGluZyB0cmFuc3BvcnQgaW5mb3JtYXRpb24gYnkga2V5LlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkVHJhbnNwb3J0KHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkVHJhbnNwb3J0UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxXZWJUcmFuc3BvcnRTdHVkaW8+O1xuICAgIHB1YmxpYyByZWFkVHJhbnNwb3J0KHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkVHJhbnNwb3J0UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFdlYlRyYW5zcG9ydFN0dWRpbz4+O1xuICAgIHB1YmxpYyByZWFkVHJhbnNwb3J0KHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkVHJhbnNwb3J0UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxXZWJUcmFuc3BvcnRTdHVkaW8+PjtcbiAgICBwdWJsaWMgcmVhZFRyYW5zcG9ydChyZXF1ZXN0UGFyYW1ldGVyczogUmVhZFRyYW5zcG9ydFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGZpbGVLZXkgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsZUtleTtcbiAgICAgICAgaWYgKGZpbGVLZXkgPT09IG51bGwgfHwgZmlsZUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBmaWxlS2V5IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcmVhZFRyYW5zcG9ydC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlc3NlbmNlS2V5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVzc2VuY2VLZXk7XG4gICAgICAgIGlmIChlc3NlbmNlS2V5ID09PSBudWxsIHx8IGVzc2VuY2VLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZXNzZW5jZUtleSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHJlYWRUcmFuc3BvcnQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQXBpS2V5QXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5jb25maWd1cmF0aW9uLmFkZENyZWRlbnRpYWxUb0hlYWRlcnMoJ0FwaUtleUF1dGgnLCAnQXV0aG9yaXphdGlvbicsIGxvY2FsVmFySGVhZGVycywgJ0JlYXJlciAnKTtcblxuICAgICAgICBjb25zdCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucz8uaHR0cEhlYWRlckFjY2VwdCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdKTtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0ID0gb3B0aW9ucz8uY29udGV4dCA/PyBuZXcgSHR0cENvbnRleHQoKTtcblxuICAgICAgICBjb25zdCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gPSBvcHRpb25zPy50cmFuc2ZlckNhY2hlID8/IHRydWU7XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvc3R1ZGlvL2V4cGVyaW1lbnRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImZpbGVLZXlcIiwgdmFsdWU6IGZpbGVLZXksIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogXCJ1dWlkXCJ9KX0vdHJhbnNwb3J0cy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJlc3NlbmNlS2V5XCIsIHZhbHVlOiBlc3NlbmNlS2V5LCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfWA7XG4gICAgICAgIGNvbnN0IHsgYmFzZVBhdGgsIHdpdGhDcmVkZW50aWFscyB9ID0gdGhpcy5jb25maWd1cmF0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8V2ViVHJhbnNwb3J0U3R1ZGlvPignZ2V0JywgYCR7YmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIC4uLih3aXRoQ3JlZGVudGlhbHMgPyB7IHdpdGhDcmVkZW50aWFscyB9IDoge30pLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc3BvcnQgZ2VvcG9pbnRzXG4gICAgICogR2V0dGluZyBhIGdlb3BvaW50cy5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZFRyYW5zcG9ydHNHZW9wb2ludHMocmVxdWVzdFBhcmFtZXRlcnM6IFJlYWRUcmFuc3BvcnRzR2VvcG9pbnRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxXZWJUcmFuc3BvcnRHZW9wb2ludExpc3RTdHVkaW8+O1xuICAgIHB1YmxpYyByZWFkVHJhbnNwb3J0c0dlb3BvaW50cyhyZXF1ZXN0UGFyYW1ldGVyczogUmVhZFRyYW5zcG9ydHNHZW9wb2ludHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8V2ViVHJhbnNwb3J0R2VvcG9pbnRMaXN0U3R1ZGlvPj47XG4gICAgcHVibGljIHJlYWRUcmFuc3BvcnRzR2VvcG9pbnRzKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkVHJhbnNwb3J0c0dlb3BvaW50c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8V2ViVHJhbnNwb3J0R2VvcG9pbnRMaXN0U3R1ZGlvPj47XG4gICAgcHVibGljIHJlYWRUcmFuc3BvcnRzR2VvcG9pbnRzKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkVHJhbnNwb3J0c0dlb3BvaW50c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGZpbGVLZXkgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsZUtleTtcbiAgICAgICAgaWYgKGZpbGVLZXkgPT09IG51bGwgfHwgZmlsZUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBmaWxlS2V5IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcmVhZFRyYW5zcG9ydHNHZW9wb2ludHMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm9mZnNldDtcbiAgICAgICAgY29uc3QgbGltaXQgPSByZXF1ZXN0UGFyYW1ldGVycz8ubGltaXQ7XG4gICAgICAgIGNvbnN0IHRhYmxlVHJhbnNwb3J0RmlsdGVyTGlzdFN0dWRpbyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy50YWJsZVRyYW5zcG9ydEZpbHRlckxpc3RTdHVkaW87XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgIDxhbnk+b2Zmc2V0LCAnb2Zmc2V0Jyk7XG4gICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgPGFueT5saW1pdCwgJ2xpbWl0Jyk7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEFwaUtleUF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFySGVhZGVycyA9IHRoaXMuY29uZmlndXJhdGlvbi5hZGRDcmVkZW50aWFsVG9IZWFkZXJzKCdBcGlLZXlBdXRoJywgJ0F1dGhvcml6YXRpb24nLCBsb2NhbFZhckhlYWRlcnMsICdCZWFyZXIgJyk7XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnM/Lmh0dHBIZWFkZXJBY2NlcHQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCA9IG9wdGlvbnM/LmNvbnRleHQgPz8gbmV3IEh0dHBDb250ZXh0KCk7XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuID0gb3B0aW9ucz8udHJhbnNmZXJDYWNoZSA/PyB0cnVlO1xuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9zdHVkaW8vZXhwZXJpbWVudHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZmlsZUtleVwiLCB2YWx1ZTogZmlsZUtleSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiBcInV1aWRcIn0pfS90cmFuc3BvcnRzL2JhdGNoL2dlb3BvaW50c2A7XG4gICAgICAgIGNvbnN0IHsgYmFzZVBhdGgsIHdpdGhDcmVkZW50aWFscyB9ID0gdGhpcy5jb25maWd1cmF0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8V2ViVHJhbnNwb3J0R2VvcG9pbnRMaXN0U3R1ZGlvPigncG9zdCcsIGAke2Jhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiB0YWJsZVRyYW5zcG9ydEZpbHRlckxpc3RTdHVkaW8sXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICAuLi4od2l0aENyZWRlbnRpYWxzID8geyB3aXRoQ3JlZGVudGlhbHMgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNwb3J0IG1ldHJpY3NcbiAgICAgKiBDYWxjdWxhdGUgZ2VuZXJhbCBtZXRyaWNzIGZvciBzZWxlY3RlZCB0cmFuc3BvcnRzLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkVHJhbnNwb3J0c01ldHJpY3MocmVxdWVzdFBhcmFtZXRlcnM6IFJlYWRUcmFuc3BvcnRzTWV0cmljc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8VGFibGVUcmFuc3BvcnRNZXRyaWNzU3R1ZGlvPjtcbiAgICBwdWJsaWMgcmVhZFRyYW5zcG9ydHNNZXRyaWNzKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkVHJhbnNwb3J0c01ldHJpY3NSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VGFibGVUcmFuc3BvcnRNZXRyaWNzU3R1ZGlvPj47XG4gICAgcHVibGljIHJlYWRUcmFuc3BvcnRzTWV0cmljcyhyZXF1ZXN0UGFyYW1ldGVyczogUmVhZFRyYW5zcG9ydHNNZXRyaWNzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUYWJsZVRyYW5zcG9ydE1ldHJpY3NTdHVkaW8+PjtcbiAgICBwdWJsaWMgcmVhZFRyYW5zcG9ydHNNZXRyaWNzKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkVHJhbnNwb3J0c01ldHJpY3NSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBmaWxlS2V5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbGVLZXk7XG4gICAgICAgIGlmIChmaWxlS2V5ID09PSBudWxsIHx8IGZpbGVLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZmlsZUtleSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHJlYWRUcmFuc3BvcnRzTWV0cmljcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZVRyYW5zcG9ydE1ldHJpY3NGaWx0ZXJMaXN0U3R1ZGlvID0gcmVxdWVzdFBhcmFtZXRlcnM/LnRhYmxlVHJhbnNwb3J0TWV0cmljc0ZpbHRlckxpc3RTdHVkaW87XG4gICAgICAgIGlmICh0YWJsZVRyYW5zcG9ydE1ldHJpY3NGaWx0ZXJMaXN0U3R1ZGlvID09PSBudWxsIHx8IHRhYmxlVHJhbnNwb3J0TWV0cmljc0ZpbHRlckxpc3RTdHVkaW8gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdGFibGVUcmFuc3BvcnRNZXRyaWNzRmlsdGVyTGlzdFN0dWRpbyB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHJlYWRUcmFuc3BvcnRzTWV0cmljcy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChBcGlLZXlBdXRoKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkQ3JlZGVudGlhbFRvSGVhZGVycygnQXBpS2V5QXV0aCcsICdBdXRob3JpemF0aW9uJywgbG9jYWxWYXJIZWFkZXJzLCAnQmVhcmVyICcpO1xuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zPy5odHRwSGVhZGVyQWNjZXB0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgPSBvcHRpb25zPy5jb250ZXh0ID8/IG5ldyBIdHRwQ29udGV4dCgpO1xuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiA9IG9wdGlvbnM/LnRyYW5zZmVyQ2FjaGUgPz8gdHJ1ZTtcblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvc3R1ZGlvL2V4cGVyaW1lbnRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImZpbGVLZXlcIiwgdmFsdWU6IGZpbGVLZXksIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogXCJ1dWlkXCJ9KX0vdHJhbnNwb3J0cy9iYXRjaC9tZXRyaWNzYDtcbiAgICAgICAgY29uc3QgeyBiYXNlUGF0aCwgd2l0aENyZWRlbnRpYWxzIH0gPSB0aGlzLmNvbmZpZ3VyYXRpb247XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxUYWJsZVRyYW5zcG9ydE1ldHJpY3NTdHVkaW8+KCdwb3N0JywgYCR7YmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHRhYmxlVHJhbnNwb3J0TWV0cmljc0ZpbHRlckxpc3RTdHVkaW8sXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgLi4uKHdpdGhDcmVkZW50aWFscyA/IHsgd2l0aENyZWRlbnRpYWxzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zcG9ydCBsaXN0XG4gICAgICogR2V0dGluZyBhIHRyYW5zcG9ydCBsaXN0LlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkVHJhbnNwb3J0c1RhYmxlKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkVHJhbnNwb3J0c1RhYmxlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxUYWJsZVRyYW5zcG9ydExpc3RTdHVkaW8+O1xuICAgIHB1YmxpYyByZWFkVHJhbnNwb3J0c1RhYmxlKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkVHJhbnNwb3J0c1RhYmxlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFRhYmxlVHJhbnNwb3J0TGlzdFN0dWRpbz4+O1xuICAgIHB1YmxpYyByZWFkVHJhbnNwb3J0c1RhYmxlKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkVHJhbnNwb3J0c1RhYmxlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUYWJsZVRyYW5zcG9ydExpc3RTdHVkaW8+PjtcbiAgICBwdWJsaWMgcmVhZFRyYW5zcG9ydHNUYWJsZShyZXF1ZXN0UGFyYW1ldGVyczogUmVhZFRyYW5zcG9ydHNUYWJsZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGZpbGVLZXkgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsZUtleTtcbiAgICAgICAgaWYgKGZpbGVLZXkgPT09IG51bGwgfHwgZmlsZUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBmaWxlS2V5IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcmVhZFRyYW5zcG9ydHNUYWJsZS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvZmZzZXQgPSByZXF1ZXN0UGFyYW1ldGVycz8ub2Zmc2V0O1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5saW1pdDtcbiAgICAgICAgY29uc3Qgc29ydEZpZWxkID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNvcnRGaWVsZDtcbiAgICAgICAgY29uc3Qgc29ydEN1c3RvbWZpZWxkID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNvcnRDdXN0b21maWVsZDtcbiAgICAgICAgY29uc3Qgc29ydERpcmVjdGlvbiA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zb3J0RGlyZWN0aW9uO1xuICAgICAgICBjb25zdCB0YWJsZVRyYW5zcG9ydEZpbHRlckxpc3RTdHVkaW8gPSByZXF1ZXN0UGFyYW1ldGVycz8udGFibGVUcmFuc3BvcnRGaWx0ZXJMaXN0U3R1ZGlvO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICA8YW55Pm9mZnNldCwgJ29mZnNldCcpO1xuICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgIDxhbnk+bGltaXQsICdsaW1pdCcpO1xuICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgIDxhbnk+c29ydEZpZWxkLCAnc29ydF9maWVsZCcpO1xuICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgIDxhbnk+c29ydEN1c3RvbWZpZWxkLCAnc29ydF9jdXN0b21maWVsZCcpO1xuICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgIDxhbnk+c29ydERpcmVjdGlvbiwgJ3NvcnRfZGlyZWN0aW9uJyk7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEFwaUtleUF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFySGVhZGVycyA9IHRoaXMuY29uZmlndXJhdGlvbi5hZGRDcmVkZW50aWFsVG9IZWFkZXJzKCdBcGlLZXlBdXRoJywgJ0F1dGhvcml6YXRpb24nLCBsb2NhbFZhckhlYWRlcnMsICdCZWFyZXIgJyk7XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnM/Lmh0dHBIZWFkZXJBY2NlcHQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCA9IG9wdGlvbnM/LmNvbnRleHQgPz8gbmV3IEh0dHBDb250ZXh0KCk7XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuID0gb3B0aW9ucz8udHJhbnNmZXJDYWNoZSA/PyB0cnVlO1xuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9zdHVkaW8vZXhwZXJpbWVudHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZmlsZUtleVwiLCB2YWx1ZTogZmlsZUtleSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiBcInV1aWRcIn0pfS90cmFuc3BvcnRzL2JhdGNoL3RhYmxlYDtcbiAgICAgICAgY29uc3QgeyBiYXNlUGF0aCwgd2l0aENyZWRlbnRpYWxzIH0gPSB0aGlzLmNvbmZpZ3VyYXRpb247XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxUYWJsZVRyYW5zcG9ydExpc3RTdHVkaW8+KCdwb3N0JywgYCR7YmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHRhYmxlVHJhbnNwb3J0RmlsdGVyTGlzdFN0dWRpbyxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIC4uLih3aXRoQ3JlZGVudGlhbHMgPyB7IHdpdGhDcmVkZW50aWFscyB9IDoge30pLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdHJhbnNwb3J0XG4gICAgICogVXBkYXRpbmcgdGhlIGVzc2VuY2UgYnkga2V5LlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVUcmFuc3BvcnQocmVxdWVzdFBhcmFtZXRlcnM6IFVwZGF0ZVRyYW5zcG9ydFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8V2ViVHJhbnNwb3J0U3R1ZGlvPjtcbiAgICBwdWJsaWMgdXBkYXRlVHJhbnNwb3J0KHJlcXVlc3RQYXJhbWV0ZXJzOiBVcGRhdGVUcmFuc3BvcnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8V2ViVHJhbnNwb3J0U3R1ZGlvPj47XG4gICAgcHVibGljIHVwZGF0ZVRyYW5zcG9ydChyZXF1ZXN0UGFyYW1ldGVyczogVXBkYXRlVHJhbnNwb3J0UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxXZWJUcmFuc3BvcnRTdHVkaW8+PjtcbiAgICBwdWJsaWMgdXBkYXRlVHJhbnNwb3J0KHJlcXVlc3RQYXJhbWV0ZXJzOiBVcGRhdGVUcmFuc3BvcnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBmaWxlS2V5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbGVLZXk7XG4gICAgICAgIGlmIChmaWxlS2V5ID09PSBudWxsIHx8IGZpbGVLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZmlsZUtleSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwZGF0ZVRyYW5zcG9ydC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc3BvcnRTdHVkaW8gPSByZXF1ZXN0UGFyYW1ldGVycz8udHJhbnNwb3J0U3R1ZGlvO1xuICAgICAgICBpZiAodHJhbnNwb3J0U3R1ZGlvID09PSBudWxsIHx8IHRyYW5zcG9ydFN0dWRpbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB0cmFuc3BvcnRTdHVkaW8gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cGRhdGVUcmFuc3BvcnQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQXBpS2V5QXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5jb25maWd1cmF0aW9uLmFkZENyZWRlbnRpYWxUb0hlYWRlcnMoJ0FwaUtleUF1dGgnLCAnQXV0aG9yaXphdGlvbicsIGxvY2FsVmFySGVhZGVycywgJ0JlYXJlciAnKTtcblxuICAgICAgICBjb25zdCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucz8uaHR0cEhlYWRlckFjY2VwdCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdKTtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0ID0gb3B0aW9ucz8uY29udGV4dCA/PyBuZXcgSHR0cENvbnRleHQoKTtcblxuICAgICAgICBjb25zdCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gPSBvcHRpb25zPy50cmFuc2ZlckNhY2hlID8/IHRydWU7XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3N0dWRpby9leHBlcmltZW50cy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJmaWxlS2V5XCIsIHZhbHVlOiBmaWxlS2V5LCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IFwidXVpZFwifSl9L3RyYW5zcG9ydHNgO1xuICAgICAgICBjb25zdCB7IGJhc2VQYXRoLCB3aXRoQ3JlZGVudGlhbHMgfSA9IHRoaXMuY29uZmlndXJhdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFdlYlRyYW5zcG9ydFN0dWRpbz4oJ3B1dCcsIGAke2Jhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiB0cmFuc3BvcnRTdHVkaW8sXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgLi4uKHdpdGhDcmVkZW50aWFscyA/IHsgd2l0aENyZWRlbnRpYWxzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxufVxuIl19