terraconstructs 0.0.11 → 0.0.12

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 (410) hide show
  1. package/.jsii +104486 -34582
  2. package/lib/aws/arn.js +1 -1
  3. package/lib/aws/aws-construct.d.ts +1 -1
  4. package/lib/aws/aws-construct.js +28 -2
  5. package/lib/aws/aws-stack.d.ts +2 -4
  6. package/lib/aws/aws-stack.js +21 -8
  7. package/lib/aws/aws-tags.d.ts +58 -0
  8. package/lib/aws/aws-tags.js +77 -0
  9. package/lib/aws/cloudwatch/actions/ec2.js +1 -1
  10. package/lib/aws/cloudwatch/actions/lambda.js +1 -1
  11. package/lib/aws/cloudwatch/alarm-base.js +1 -1
  12. package/lib/aws/cloudwatch/alarm-rule.js +1 -1
  13. package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
  14. package/lib/aws/cloudwatch/alarm.js +1 -1
  15. package/lib/aws/cloudwatch/composite-alarm.js +1 -1
  16. package/lib/aws/cloudwatch/dashboard.js +1 -1
  17. package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
  18. package/lib/aws/cloudwatch/graph.js +8 -8
  19. package/lib/aws/cloudwatch/layout.js +3 -3
  20. package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
  21. package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
  22. package/lib/aws/cloudwatch/log-group.js +1 -1
  23. package/lib/aws/cloudwatch/log-query.js +1 -1
  24. package/lib/aws/cloudwatch/log-stream.js +1 -1
  25. package/lib/aws/cloudwatch/metric-filter.d.ts +1 -1
  26. package/lib/aws/cloudwatch/metric-filter.js +4 -4
  27. package/lib/aws/cloudwatch/metric.js +2 -2
  28. package/lib/aws/cloudwatch/pattern.js +3 -3
  29. package/lib/aws/cloudwatch/policy.js +1 -1
  30. package/lib/aws/cloudwatch/private/env-tokens.js +5 -6
  31. package/lib/aws/cloudwatch/private/metric-util.js +4 -5
  32. package/lib/aws/cloudwatch/private/object.js +2 -3
  33. package/lib/aws/cloudwatch/private/rendering.js +3 -3
  34. package/lib/aws/cloudwatch/private/statistic.js +6 -7
  35. package/lib/aws/cloudwatch/query-definition.js +2 -2
  36. package/lib/aws/cloudwatch/stats.js +1 -1
  37. package/lib/aws/cloudwatch/subscription-filter.d.ts +1 -1
  38. package/lib/aws/cloudwatch/subscription-filter.js +4 -4
  39. package/lib/aws/cloudwatch/text.js +1 -1
  40. package/lib/aws/cloudwatch/variable.js +3 -3
  41. package/lib/aws/cloudwatch/widget.d.ts +1 -1
  42. package/lib/aws/cloudwatch/widget.js +4 -4
  43. package/lib/aws/compute/activity.js +3 -2
  44. package/lib/aws/compute/alb/application-listener-action.d.ts +334 -0
  45. package/lib/aws/compute/alb/application-listener-action.js +281 -0
  46. package/lib/aws/compute/alb/application-listener-certificate.d.ts +35 -0
  47. package/lib/aws/compute/alb/application-listener-certificate.js +35 -0
  48. package/lib/aws/compute/alb/application-listener-rule.d.ts +233 -0
  49. package/lib/aws/compute/alb/application-listener-rule.js +220 -0
  50. package/lib/aws/compute/alb/application-listener.d.ts +574 -0
  51. package/lib/aws/compute/alb/application-listener.js +538 -0
  52. package/lib/aws/compute/alb/application-load-balancer.d.ts +715 -0
  53. package/lib/aws/compute/alb/application-load-balancer.js +780 -0
  54. package/lib/aws/compute/alb/application-target-group.d.ts +339 -0
  55. package/lib/aws/compute/alb/application-target-group.js +427 -0
  56. package/lib/aws/compute/alb/conditions.d.ts +61 -0
  57. package/lib/aws/compute/alb/conditions.js +164 -0
  58. package/lib/aws/compute/alb/trust-store-revocation.d.ts +59 -0
  59. package/lib/aws/compute/alb/trust-store-revocation.js +46 -0
  60. package/lib/aws/compute/alb/trust-store.d.ts +86 -0
  61. package/lib/aws/compute/alb/trust-store.js +79 -0
  62. package/lib/aws/compute/architecture.js +1 -1
  63. package/lib/aws/compute/aspects/require-imdsv2-aspect.d.ts +75 -0
  64. package/lib/aws/compute/aspects/require-imdsv2-aspect.js +106 -0
  65. package/lib/aws/compute/bastion-host.d.ts +172 -0
  66. package/lib/aws/compute/bastion-host.js +114 -0
  67. package/lib/aws/compute/chain.js +1 -1
  68. package/lib/aws/compute/cidr-splits.d.ts +49 -0
  69. package/lib/aws/compute/cidr-splits.js +59 -0
  70. package/lib/aws/compute/client-vpn-authorization-rule.d.ts +43 -0
  71. package/lib/aws/compute/client-vpn-authorization-rule.js +30 -0
  72. package/lib/aws/compute/client-vpn-endpoint-types.d.ts +62 -0
  73. package/lib/aws/compute/client-vpn-endpoint-types.js +25 -0
  74. package/lib/aws/compute/client-vpn-endpoint.d.ts +239 -0
  75. package/lib/aws/compute/client-vpn-endpoint.js +259 -0
  76. package/lib/aws/compute/client-vpn-route.d.ts +67 -0
  77. package/lib/aws/compute/client-vpn-route.js +57 -0
  78. package/lib/aws/compute/condition.js +1 -1
  79. package/lib/aws/compute/connections.d.ts +137 -0
  80. package/lib/aws/compute/connections.js +208 -0
  81. package/lib/aws/compute/ec2-augmentations.generated.d.ts +53 -0
  82. package/lib/aws/compute/ec2-augmentations.generated.js +35 -0
  83. package/lib/aws/compute/ec2-canned-metrics.generated.d.ts +555 -0
  84. package/lib/aws/compute/ec2-canned-metrics.generated.js +681 -0
  85. package/lib/aws/compute/ec2-util-v2.d.ts +141 -0
  86. package/lib/aws/compute/ec2-util-v2.js +286 -0
  87. package/lib/aws/compute/ec2-util.d.ts +52 -0
  88. package/lib/aws/compute/ec2-util.js +138 -0
  89. package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.d.ts +176 -0
  90. package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.js +119 -0
  91. package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.d.ts +860 -0
  92. package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.js +597 -0
  93. package/lib/aws/compute/event-invoke-config.js +1 -1
  94. package/lib/aws/compute/event-source-filter.js +2 -2
  95. package/lib/aws/compute/event-source-mapping.js +1 -1
  96. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
  97. package/lib/aws/compute/event-sources/s3.js +1 -1
  98. package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
  99. package/lib/aws/compute/event-sources/sqs.js +1 -1
  100. package/lib/aws/compute/fields.js +4 -4
  101. package/lib/aws/compute/function-alias.js +1 -1
  102. package/lib/aws/compute/function-base.js +2 -2
  103. package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
  104. package/lib/aws/compute/function-destinations/function.js +1 -1
  105. package/lib/aws/compute/function-destinations/sqs.js +1 -1
  106. package/lib/aws/compute/function-nodejs.js +1 -1
  107. package/lib/aws/compute/function-url.js +1 -1
  108. package/lib/aws/compute/function-vpc-config.generated.d.ts +3 -3
  109. package/lib/aws/compute/function-vpc-config.generated.js +1 -1
  110. package/lib/aws/compute/function.d.ts +1 -1
  111. package/lib/aws/compute/function.js +5 -5
  112. package/lib/aws/compute/index-alpha.d.ts +5 -0
  113. package/lib/aws/compute/index-alpha.js +22 -0
  114. package/lib/aws/compute/index.d.ts +60 -0
  115. package/lib/aws/compute/index.js +70 -2
  116. package/lib/aws/compute/instance-types.d.ts +1354 -0
  117. package/lib/aws/compute/instance-types.js +1683 -0
  118. package/lib/aws/compute/instance.d.ts +436 -0
  119. package/lib/aws/compute/instance.js +262 -0
  120. package/lib/aws/compute/ip-addresses.d.ts +249 -0
  121. package/lib/aws/compute/ip-addresses.js +248 -0
  122. package/lib/aws/compute/ipam.d.ts +309 -0
  123. package/lib/aws/compute/ipam.js +306 -0
  124. package/lib/aws/compute/key-pair.d.ts +178 -0
  125. package/lib/aws/compute/key-pair.js +194 -0
  126. package/lib/aws/compute/lambda-augmentations.generated.d.ts +65 -0
  127. package/lib/aws/compute/lambda-augmentations.generated.js +41 -0
  128. package/lib/aws/compute/lambda-canned-metrics.generated.d.ts +316 -0
  129. package/lib/aws/compute/lambda-canned-metrics.generated.js +119 -0
  130. package/lib/aws/compute/launch-template.d.ts +540 -0
  131. package/lib/aws/compute/launch-template.js +468 -0
  132. package/lib/aws/compute/lb-shared/access-logs-accounts.d.ts +7 -0
  133. package/lib/aws/compute/lb-shared/access-logs-accounts.js +46 -0
  134. package/lib/aws/compute/lb-shared/base-listener.d.ts +113 -0
  135. package/lib/aws/compute/lb-shared/base-listener.js +181 -0
  136. package/lib/aws/compute/lb-shared/base-load-balancer.d.ts +212 -0
  137. package/lib/aws/compute/lb-shared/base-load-balancer.js +290 -0
  138. package/lib/aws/compute/lb-shared/base-target-group.d.ts +382 -0
  139. package/lib/aws/compute/lb-shared/base-target-group.js +364 -0
  140. package/lib/aws/compute/lb-shared/enums.d.ts +282 -0
  141. package/lib/aws/compute/lb-shared/enums.js +301 -0
  142. package/lib/aws/compute/lb-shared/grid-lookup-types.d.ts +42 -0
  143. package/lib/aws/compute/lb-shared/grid-lookup-types.js +53 -0
  144. package/lib/aws/compute/lb-shared/imported.d.ts +24 -0
  145. package/lib/aws/compute/lb-shared/imported.js +27 -0
  146. package/lib/aws/compute/lb-shared/lb-listener-config.generated.d.ts +194 -0
  147. package/lib/aws/compute/lb-shared/lb-listener-config.generated.js +3 -0
  148. package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.d.ts +56 -0
  149. package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.js +3 -0
  150. package/lib/aws/compute/lb-shared/listener-action.d.ts +14 -0
  151. package/lib/aws/compute/lb-shared/listener-action.js +4 -0
  152. package/lib/aws/compute/lb-shared/listener-certificate.d.ts +28 -0
  153. package/lib/aws/compute/lb-shared/listener-certificate.js +29 -0
  154. package/lib/aws/compute/lb-shared/load-balancer-targets.d.ts +93 -0
  155. package/lib/aws/compute/lb-shared/load-balancer-targets.js +127 -0
  156. package/lib/aws/compute/lb-shared/util.d.ts +113 -0
  157. package/lib/aws/compute/lb-shared/util.js +264 -0
  158. package/lib/aws/compute/lb-targets/alb-target.d.ts +67 -0
  159. package/lib/aws/compute/lb-targets/alb-target.js +100 -0
  160. package/lib/aws/compute/lb-targets/index.d.ts +4 -0
  161. package/lib/aws/compute/lb-targets/index.js +22 -0
  162. package/lib/aws/compute/lb-targets/instance-target.d.ts +42 -0
  163. package/lib/aws/compute/lb-targets/instance-target.js +67 -0
  164. package/lib/aws/compute/lb-targets/ip-target.d.ts +55 -0
  165. package/lib/aws/compute/lb-targets/ip-target.js +79 -0
  166. package/lib/aws/compute/lb-targets/lambda-target.d.ts +25 -0
  167. package/lib/aws/compute/lb-targets/lambda-target.js +50 -0
  168. package/lib/aws/compute/load-balancer.d.ts +336 -0
  169. package/lib/aws/compute/load-balancer.js +287 -0
  170. package/lib/aws/compute/machine-image/amazon-linux-2022.d.ts +63 -0
  171. package/lib/aws/compute/machine-image/amazon-linux-2022.js +84 -0
  172. package/lib/aws/compute/machine-image/amazon-linux-2023.d.ts +63 -0
  173. package/lib/aws/compute/machine-image/amazon-linux-2023.js +84 -0
  174. package/lib/aws/compute/machine-image/amazon-linux2.d.ts +76 -0
  175. package/lib/aws/compute/machine-image/amazon-linux2.js +87 -0
  176. package/lib/aws/compute/machine-image/common.d.ts +181 -0
  177. package/lib/aws/compute/machine-image/common.js +122 -0
  178. package/lib/aws/compute/machine-image/index.d.ts +5 -0
  179. package/lib/aws/compute/machine-image/index.js +22 -0
  180. package/lib/aws/compute/machine-image/machine-image.d.ts +463 -0
  181. package/lib/aws/compute/machine-image/machine-image.js +566 -0
  182. package/lib/aws/compute/machine-image/utils.d.ts +2 -0
  183. package/lib/aws/compute/machine-image/utils.js +17 -0
  184. package/lib/aws/compute/nat.d.ts +325 -0
  185. package/lib/aws/compute/nat.js +455 -0
  186. package/lib/aws/compute/network-acl-types.d.ts +152 -0
  187. package/lib/aws/compute/network-acl-types.js +156 -0
  188. package/lib/aws/compute/network-acl.d.ts +285 -0
  189. package/lib/aws/compute/network-acl.js +207 -0
  190. package/lib/aws/compute/network-util.d.ts +116 -0
  191. package/lib/aws/compute/network-util.js +241 -0
  192. package/lib/aws/compute/nlb/network-listener-action.d.ts +92 -0
  193. package/lib/aws/compute/nlb/network-listener-action.js +146 -0
  194. package/lib/aws/compute/nlb/network-listener-certificate.d.ts +24 -0
  195. package/lib/aws/compute/nlb/network-listener-certificate.js +25 -0
  196. package/lib/aws/compute/nlb/network-listener.d.ts +248 -0
  197. package/lib/aws/compute/nlb/network-listener.js +217 -0
  198. package/lib/aws/compute/nlb/network-load-balancer.d.ts +315 -0
  199. package/lib/aws/compute/nlb/network-load-balancer.js +360 -0
  200. package/lib/aws/compute/nlb/network-target-group.d.ts +153 -0
  201. package/lib/aws/compute/nlb/network-target-group.js +223 -0
  202. package/lib/aws/compute/peer.d.ts +64 -0
  203. package/lib/aws/compute/peer.js +235 -0
  204. package/lib/aws/compute/placement-group.d.ts +161 -0
  205. package/lib/aws/compute/placement-group.js +133 -0
  206. package/lib/aws/compute/port.d.ts +287 -0
  207. package/lib/aws/compute/port.js +390 -0
  208. package/lib/aws/compute/prefix-list.d.ts +131 -0
  209. package/lib/aws/compute/prefix-list.js +114 -0
  210. package/lib/aws/compute/private/context-stub.d.ts +7 -0
  211. package/lib/aws/compute/private/context-stub.js +43 -0
  212. package/lib/aws/compute/private/ebs-util.d.ts +14 -0
  213. package/lib/aws/compute/private/ebs-util.js +145 -0
  214. package/lib/aws/compute/private/intrinstics.js +2 -1
  215. package/lib/aws/compute/private/json-path.js +8 -8
  216. package/lib/aws/compute/private/util.js +2 -3
  217. package/lib/aws/compute/route.d.ts +547 -0
  218. package/lib/aws/compute/route.js +469 -0
  219. package/lib/aws/compute/security-group.d.ts +414 -0
  220. package/lib/aws/compute/security-group.js +538 -0
  221. package/lib/aws/compute/state-graph.js +1 -1
  222. package/lib/aws/compute/state-machine-fragment.js +1 -1
  223. package/lib/aws/compute/state-machine.d.ts +2 -2
  224. package/lib/aws/compute/state-machine.js +14 -12
  225. package/lib/aws/compute/states/choice.js +1 -1
  226. package/lib/aws/compute/states/custom-state.js +1 -1
  227. package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
  228. package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
  229. package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
  230. package/lib/aws/compute/states/distributed-map.js +1 -1
  231. package/lib/aws/compute/states/fail.js +1 -1
  232. package/lib/aws/compute/states/map-base.js +1 -1
  233. package/lib/aws/compute/states/map.js +1 -1
  234. package/lib/aws/compute/states/parallel.js +1 -1
  235. package/lib/aws/compute/states/pass.js +2 -2
  236. package/lib/aws/compute/states/state.js +5 -5
  237. package/lib/aws/compute/states/succeed.js +1 -1
  238. package/lib/aws/compute/states/task-base.js +2 -2
  239. package/lib/aws/compute/states/task.js +1 -1
  240. package/lib/aws/compute/states/wait.js +2 -2
  241. package/lib/aws/compute/stepfunctions-canned-metrics.generated.d.ts +83 -0
  242. package/lib/aws/compute/stepfunctions-canned-metrics.generated.js +127 -0
  243. package/lib/aws/compute/subnet-v2.d.ts +213 -0
  244. package/lib/aws/compute/subnet-v2.js +405 -0
  245. package/lib/aws/compute/subnet.d.ts +37 -0
  246. package/lib/aws/compute/subnet.js +181 -0
  247. package/lib/aws/compute/task-credentials.js +1 -1
  248. package/lib/aws/compute/task-input.js +1 -1
  249. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
  250. package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
  251. package/lib/aws/compute/tasks/http/invoke.js +1 -1
  252. package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
  253. package/lib/aws/compute/tasks/private/task-utils.js +3 -4
  254. package/lib/aws/compute/tasks/resource-arn-suffix.js +2 -3
  255. package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
  256. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
  257. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
  258. package/lib/aws/compute/types.js +2 -2
  259. package/lib/aws/compute/user-data.d.ts +270 -0
  260. package/lib/aws/compute/user-data.js +487 -0
  261. package/lib/aws/compute/util.d.ts +1 -1
  262. package/lib/aws/compute/util.js +4 -5
  263. package/lib/aws/compute/volume.d.ts +480 -0
  264. package/lib/aws/compute/volume.js +426 -0
  265. package/lib/aws/compute/vpc-endpoint-service.d.ts +149 -0
  266. package/lib/aws/compute/vpc-endpoint-service.js +90 -0
  267. package/lib/aws/compute/vpc-endpoint.d.ts +742 -0
  268. package/lib/aws/compute/vpc-endpoint.js +811 -0
  269. package/lib/aws/compute/vpc-flow-logs.d.ts +551 -0
  270. package/lib/aws/compute/vpc-flow-logs.js +693 -0
  271. package/lib/aws/compute/vpc-lookup.d.ts +73 -0
  272. package/lib/aws/compute/vpc-lookup.js +3 -0
  273. package/lib/aws/compute/vpc-v2-base.d.ts +353 -0
  274. package/lib/aws/compute/vpc-v2-base.js +493 -0
  275. package/lib/aws/compute/vpc-v2.d.ts +385 -0
  276. package/lib/aws/compute/vpc-v2.js +408 -0
  277. package/lib/aws/compute/vpc.d.ts +1448 -0
  278. package/lib/aws/compute/vpc.js +1495 -0
  279. package/lib/aws/compute/vpn.d.ts +443 -0
  280. package/lib/aws/compute/vpn.js +397 -0
  281. package/lib/aws/compute/windows-versions.d.ts +418 -0
  282. package/lib/aws/compute/windows-versions.js +426 -0
  283. package/lib/aws/edge/certificate-base.d.ts +20 -0
  284. package/lib/aws/edge/certificate-base.js +28 -0
  285. package/lib/aws/edge/certificate.d.ts +23 -2
  286. package/lib/aws/edge/certificate.js +54 -4
  287. package/lib/aws/edge/distribution.js +3 -3
  288. package/lib/aws/edge/dns-alias-record-targets.js +2 -2
  289. package/lib/aws/edge/dns-record.js +16 -16
  290. package/lib/aws/edge/dns-zone.d.ts +20 -2
  291. package/lib/aws/edge/dns-zone.js +25 -10
  292. package/lib/aws/edge/function.js +2 -2
  293. package/lib/aws/edge/index.d.ts +1 -0
  294. package/lib/aws/edge/index.js +2 -1
  295. package/lib/aws/edge/key-value-store.js +4 -4
  296. package/lib/aws/edge/origin.js +7 -5
  297. package/lib/aws/edge/response-headers-policy.js +1 -1
  298. package/lib/aws/encryption/alias.js +1 -1
  299. package/lib/aws/encryption/key.js +1 -1
  300. package/lib/aws/encryption/via-service-principal.js +1 -1
  301. package/lib/aws/iam/grant.js +2 -2
  302. package/lib/aws/iam/index.d.ts +1 -0
  303. package/lib/aws/iam/index.js +2 -1
  304. package/lib/aws/iam/instance-profile.d.ts +155 -0
  305. package/lib/aws/iam/instance-profile.js +124 -0
  306. package/lib/aws/iam/managed-policy.js +1 -1
  307. package/lib/aws/iam/oidc-provider.js +1 -1
  308. package/lib/aws/iam/policy-document-config.generated.d.ts +8 -8
  309. package/lib/aws/iam/policy-document-config.generated.js +1 -1
  310. package/lib/aws/iam/policy-document.js +1 -1
  311. package/lib/aws/iam/policy-statement-props.generated.d.ts +8 -8
  312. package/lib/aws/iam/policy-statement-props.generated.js +1 -1
  313. package/lib/aws/iam/policy-statement.js +9 -9
  314. package/lib/aws/iam/policy.js +1 -1
  315. package/lib/aws/iam/principals.js +26 -26
  316. package/lib/aws/iam/private/assume-role-policy.js +2 -3
  317. package/lib/aws/iam/private/comparable-principal.js +2 -3
  318. package/lib/aws/iam/private/immutable-role.d.ts +2 -1
  319. package/lib/aws/iam/private/immutable-role.js +3 -3
  320. package/lib/aws/iam/private/imported-role.d.ts +1 -1
  321. package/lib/aws/iam/private/imported-role.js +3 -3
  322. package/lib/aws/iam/private/merge-statements.js +2 -3
  323. package/lib/aws/iam/private/util.js +4 -4
  324. package/lib/aws/iam/role.js +1 -1
  325. package/lib/aws/iam/saml-provider.d.ts +1 -1
  326. package/lib/aws/iam/saml-provider.js +6 -6
  327. package/lib/aws/iam/unknown-principal.js +1 -1
  328. package/lib/aws/iam/utils.js +2 -3
  329. package/lib/aws/index.d.ts +1 -0
  330. package/lib/aws/index.js +4 -1
  331. package/lib/aws/network/simple-ipv4-vpc.js +5 -5
  332. package/lib/aws/network/subnet-group.js +3 -3
  333. package/lib/aws/network/subnet.d.ts +1 -1
  334. package/lib/aws/network/subnet.js +7 -7
  335. package/lib/aws/notify/archive.js +3 -2
  336. package/lib/aws/notify/connection.js +5 -4
  337. package/lib/aws/notify/event-bus.js +5 -4
  338. package/lib/aws/notify/event-pattern.js +3 -3
  339. package/lib/aws/notify/index.js +3 -1
  340. package/lib/aws/notify/input.js +4 -3
  341. package/lib/aws/notify/kinesis-stream.js +3 -2
  342. package/lib/aws/notify/on-event-options.js +2 -1
  343. package/lib/aws/notify/queue-config.generated.d.ts +18 -11
  344. package/lib/aws/notify/queue-config.generated.js +1 -1
  345. package/lib/aws/notify/queue-policy.js +1 -1
  346. package/lib/aws/notify/queue.js +1 -1
  347. package/lib/aws/notify/resource-policy.js +1 -1
  348. package/lib/aws/notify/rule.js +3 -2
  349. package/lib/aws/notify/schedule.js +2 -2
  350. package/lib/aws/notify/sqs-augmentations.generated.d.ts +125 -0
  351. package/lib/aws/notify/sqs-augmentations.generated.js +74 -0
  352. package/lib/aws/notify/target.js +2 -1
  353. package/lib/aws/notify/targets/event-bus.js +1 -1
  354. package/lib/aws/notify/targets/function.js +1 -1
  355. package/lib/aws/notify/targets/log-group.js +2 -2
  356. package/lib/aws/notify/targets/sqs.js +1 -1
  357. package/lib/aws/notify/targets/state-machine.js +1 -1
  358. package/lib/aws/notify/targets/util.d.ts +1 -1
  359. package/lib/aws/notify/targets/util.js +10 -11
  360. package/lib/aws/notify/util.js +4 -4
  361. package/lib/aws/provider-config.generated.d.ts +33 -33
  362. package/lib/aws/provider-config.generated.js +1 -1
  363. package/lib/aws/storage/bucket-notifications.js +1 -1
  364. package/lib/aws/storage/bucket-policy.js +1 -1
  365. package/lib/aws/storage/bucket-source.js +1 -1
  366. package/lib/aws/storage/bucket.d.ts +298 -65
  367. package/lib/aws/storage/bucket.js +548 -225
  368. package/lib/aws/storage/cors-config.generated.d.ts +3 -3
  369. package/lib/aws/storage/cors-config.generated.js +1 -1
  370. package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
  371. package/lib/aws/storage/cors-rule-config.generated.js +1 -1
  372. package/lib/aws/storage/index.d.ts +1 -0
  373. package/lib/aws/storage/index.js +2 -1
  374. package/lib/aws/storage/lifecycle-config.generated.d.ts +11 -11
  375. package/lib/aws/storage/lifecycle-config.generated.js +1 -1
  376. package/lib/aws/storage/notification-targets/function.js +6 -6
  377. package/lib/aws/storage/notification-targets/queue.js +1 -1
  378. package/lib/aws/storage/origin-access-identity.d.ts +1 -1
  379. package/lib/aws/storage/origin-access-identity.js +5 -4
  380. package/lib/aws/storage/parameter-util.d.ts +12 -0
  381. package/lib/aws/storage/parameter-util.js +65 -0
  382. package/lib/aws/storage/parameter.d.ts +526 -0
  383. package/lib/aws/storage/parameter.js +606 -0
  384. package/lib/aws/storage/s3-canned-metrics.generated.d.ts +22 -0
  385. package/lib/aws/storage/s3-canned-metrics.generated.js +23 -0
  386. package/lib/aws/storage/util.d.ts +25 -3
  387. package/lib/aws/storage/util.js +84 -17
  388. package/lib/aws/storage/website-config.generated.d.ts +5 -5
  389. package/lib/aws/storage/website-config.generated.js +1 -1
  390. package/lib/aws/util.js +2 -3
  391. package/lib/construct-base.d.ts +10 -1
  392. package/lib/construct-base.js +9 -6
  393. package/lib/duration.js +1 -1
  394. package/lib/expiration.d.ts +48 -0
  395. package/lib/expiration.js +68 -0
  396. package/lib/helpers-internal/index.d.ts +1 -0
  397. package/lib/helpers-internal/index.js +7 -0
  398. package/lib/index.d.ts +2 -0
  399. package/lib/index.js +3 -1
  400. package/lib/private/md5.d.ts +4 -0
  401. package/lib/private/md5.js +14 -0
  402. package/lib/private/unique-resource-name.js +3 -4
  403. package/lib/size.js +2 -2
  404. package/lib/stack-base.d.ts +4 -23
  405. package/lib/stack-base.js +9 -30
  406. package/lib/terra-func.d.ts +103 -0
  407. package/lib/terra-func.js +170 -0
  408. package/lib/token.js +5 -5
  409. package/package.json +15 -8
  410. package/bun.lockb +0 -0
@@ -0,0 +1,538 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ApplicationListener = exports.MutualAuthenticationMode = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ // https://github.com/aws/aws-cdk/blob/v2.175.1/packages/aws-cdk-lib/aws-elasticloadbalancingv2/lib/alb/application-listener.ts
7
+ const cdktf_1 = require("cdktf");
8
+ const application_listener_action_1 = require("./application-listener-action");
9
+ const application_listener_certificate_1 = require("./application-listener-certificate");
10
+ const application_listener_rule_1 = require("./application-listener-rule");
11
+ const application_target_group_1 = require("./application-target-group");
12
+ const aws_construct_1 = require("../../aws-construct");
13
+ const connections_1 = require("../connections");
14
+ const base_listener_1 = require("../lb-shared/base-listener");
15
+ const enums_1 = require("../lb-shared/enums");
16
+ // import {
17
+ // LoadBalancerType,
18
+ // LoadBalancerListenerProtocol,
19
+ // } from "../lb-shared/grid-lookup-types";
20
+ const listener_certificate_1 = require("../lb-shared/listener-certificate");
21
+ const util_1 = require("../lb-shared/util");
22
+ const peer_1 = require("../peer");
23
+ const port_1 = require("../port");
24
+ /**
25
+ * The client certificate handling method
26
+ */
27
+ var MutualAuthenticationMode;
28
+ (function (MutualAuthenticationMode) {
29
+ /**
30
+ * Off
31
+ */
32
+ MutualAuthenticationMode["OFF"] = "off";
33
+ /**
34
+ * Application Load Balancer sends the whole client certificate chain to the target using HTTP headers
35
+ */
36
+ MutualAuthenticationMode["PASS_THROUGH"] = "passthrough";
37
+ /**
38
+ * Application Load Balancer performs X.509 client certificate authentication for clients when a load balancer negotiates TLS connections
39
+ */
40
+ MutualAuthenticationMode["VERIFY"] = "verify";
41
+ })(MutualAuthenticationMode || (exports.MutualAuthenticationMode = MutualAuthenticationMode = {}));
42
+ /**
43
+ * Define an ApplicationListener
44
+ *
45
+ * @resource AWS::ElasticLoadBalancingV2::Listener
46
+ */
47
+ class ApplicationListener extends base_listener_1.BaseListener {
48
+ // TODO: Add Grid Lookup support
49
+ // /**
50
+ // * Look up an ApplicationListener.
51
+ // */
52
+ // public static fromLookup(
53
+ // scope: Construct,
54
+ // id: string,
55
+ // options: ApplicationListenerLookupOptions,
56
+ // ): IApplicationListener {
57
+ // if (Token.isUnresolved(options.listenerArn)) {
58
+ // throw new Error(
59
+ // "All arguments to look up a load balancer listener must be concrete (no Tokens)",
60
+ // );
61
+ // }
62
+ // let listenerProtocol: LoadBalancerListenerProtocol | undefined;
63
+ // switch (options.listenerProtocol) {
64
+ // case ApplicationProtocol.HTTP:
65
+ // listenerProtocol = LoadBalancerListenerProtocol.HTTP;
66
+ // break;
67
+ // case ApplicationProtocol.HTTPS:
68
+ // listenerProtocol = LoadBalancerListenerProtocol.HTTPS;
69
+ // break;
70
+ // }
71
+ // const props = BaseListener._queryContextProvider(scope, {
72
+ // userOptions: options,
73
+ // loadBalancerType: LoadBalancerType.APPLICATION,
74
+ // listenerArn: options.listenerArn,
75
+ // listenerProtocol,
76
+ // });
77
+ // return new LookedUpApplicationListener(scope, id, props);
78
+ // }
79
+ /**
80
+ * Import an existing listener
81
+ */
82
+ static fromApplicationListenerAttributes(scope, id, attrs) {
83
+ return new ImportedApplicationListener(scope, id, attrs);
84
+ }
85
+ constructor(scope, id, props) {
86
+ const [protocol, port] = (0, util_1.determineProtocolAndPort)(props.protocol, props.port);
87
+ if (protocol === undefined || port === undefined) {
88
+ throw new Error("At least one of 'port' or 'protocol' is required");
89
+ }
90
+ validateMutualAuthentication(props.mutualAuthentication);
91
+ super(scope, id, {
92
+ loadBalancerArn: props.loadBalancer.loadBalancerArn,
93
+ certificateArn: cdktf_1.Lazy.stringValue({
94
+ produce: () => this.certificateArns.length > 0 ? this.certificateArns[0] : undefined,
95
+ }),
96
+ protocol,
97
+ port,
98
+ sslPolicy: props.sslPolicy,
99
+ // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lb_listener#mutual_authentication
100
+ mutualAuthentication: props.mutualAuthentication &&
101
+ Object.keys(props.mutualAuthentication).length > 0
102
+ ? {
103
+ ignoreClientCertificateExpiry: props.mutualAuthentication?.ignoreClientCertificateExpiry,
104
+ // CFN Default is off
105
+ // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-mutualauthentication.html#cfn-elasticloadbalancingv2-listener-mutualauthentication-mode
106
+ mode: props.mutualAuthentication?.mutualAuthenticationMode ??
107
+ MutualAuthenticationMode.OFF,
108
+ trustStoreArn: props.mutualAuthentication?.trustStore?.trustStoreArn,
109
+ }
110
+ : undefined,
111
+ });
112
+ this.loadBalancer = props.loadBalancer;
113
+ this.protocol = protocol;
114
+ this.port = port;
115
+ this.certificateArns = [];
116
+ // Attach certificates
117
+ if (props.certificateArns && props.certificateArns.length > 0) {
118
+ this.addCertificateArns("ListenerCertificate", props.certificateArns);
119
+ }
120
+ if (props.certificates && props.certificates.length > 0) {
121
+ this.addCertificates("DefaultCertificates", props.certificates);
122
+ }
123
+ // This listener edits the securitygroup of the load balancer,
124
+ // but adds its own default port.
125
+ this.connections = new connections_1.Connections({
126
+ securityGroups: props.loadBalancer.connections.securityGroups,
127
+ defaultPort: port_1.Port.tcp(port),
128
+ });
129
+ if (props.defaultAction && props.defaultTargetGroups) {
130
+ throw new Error("Specify at most one of 'defaultAction' and 'defaultTargetGroups'");
131
+ }
132
+ if (props.defaultAction) {
133
+ this.setDefaultAction(props.defaultAction);
134
+ }
135
+ if (props.defaultTargetGroups) {
136
+ this.setDefaultAction(application_listener_action_1.ListenerAction.forward(props.defaultTargetGroups));
137
+ }
138
+ if (props.open !== false) {
139
+ this.connections.allowDefaultPortFrom(peer_1.Peer.anyIpv4(), `Allow from anyone on port ${port}`);
140
+ // When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere
141
+ // recommendedValue: true
142
+ // FeatureFlags.of(this).isEnabled(
143
+ // cxapi.ALB_DUALSTACK_WITHOUT_PUBLIC_IPV4_SECURITY_GROUP_RULES_DEFAULT,
144
+ // )
145
+ if (this.loadBalancer.ipAddressType === enums_1.IpAddressType.DUAL_STACK ||
146
+ this.loadBalancer.ipAddressType ===
147
+ enums_1.IpAddressType.DUAL_STACK_WITHOUT_PUBLIC_IPV4) {
148
+ this.connections.allowDefaultPortFrom(peer_1.Peer.anyIpv6(), `Allow from anyone on port ${port}`);
149
+ }
150
+ }
151
+ }
152
+ /**
153
+ * Add one or more certificates to this listener.
154
+ *
155
+ * After the first certificate, this creates ApplicationListenerCertificates
156
+ * resources since cloudformation requires the certificates array on the
157
+ * listener resource to have a length of 1.
158
+ *
159
+ * @deprecated Use `addCertificates` instead.
160
+ */
161
+ addCertificateArns(id, arns) {
162
+ this.addCertificates(id, arns.map(listener_certificate_1.ListenerCertificate.fromArn));
163
+ }
164
+ /**
165
+ * Add one or more certificates to this listener.
166
+ *
167
+ * After the first certificate, this creates ApplicationListenerCertificates
168
+ * resources since cloudformation requires the certificates array on the
169
+ * listener resource to have a length of 1.
170
+ */
171
+ addCertificates(id, certificates) {
172
+ const additionalCerts = [...certificates];
173
+ if (this.certificateArns.length === 0 && additionalCerts.length > 0) {
174
+ const first = additionalCerts.splice(0, 1)[0];
175
+ this.certificateArns.push(first.certificateArn);
176
+ }
177
+ // Only one certificate can be specified per resource, even though
178
+ // `certificates` is of type Array
179
+ for (let i = 0; i < additionalCerts.length; i++) {
180
+ new application_listener_certificate_1.ApplicationListenerCertificate(this, `${id}${i + 1}`, {
181
+ listener: this,
182
+ certificates: [additionalCerts[i]],
183
+ });
184
+ }
185
+ }
186
+ /**
187
+ * Perform the given default action on incoming requests
188
+ *
189
+ * This allows full control of the default action of the load balancer,
190
+ * including Action chaining, fixed responses and redirect responses. See
191
+ * the `ListenerAction` class for all options.
192
+ *
193
+ * It's possible to add routing conditions to the Action added in this way.
194
+ * At least one Action must be added without conditions (which becomes the
195
+ * default Action).
196
+ */
197
+ addAction(id, props) {
198
+ checkAddRuleProps(props);
199
+ if (props.priority !== undefined) {
200
+ // New rule
201
+ //
202
+ // TargetGroup.registerListener is called inside ApplicationListenerRule.
203
+ new application_listener_rule_1.ApplicationListenerRule(this, id + "Rule", {
204
+ listener: this,
205
+ priority: props.priority,
206
+ ...props,
207
+ });
208
+ }
209
+ else {
210
+ // New default target with these targetgroups
211
+ this.setDefaultAction(props.action);
212
+ }
213
+ }
214
+ /**
215
+ * Load balance incoming requests to the given target groups.
216
+ *
217
+ * All target groups will be load balanced to with equal weight and without
218
+ * stickiness. For a more complex configuration than that, use `addAction()`.
219
+ *
220
+ * It's possible to add routing conditions to the TargetGroups added in this
221
+ * way. At least one TargetGroup must be added without conditions (which will
222
+ * become the default Action for this listener).
223
+ */
224
+ addTargetGroups(id, props) {
225
+ checkAddRuleProps(props);
226
+ if (props.priority !== undefined) {
227
+ // New rule
228
+ //
229
+ // TargetGroup.registerListener is called inside ApplicationListenerRule.
230
+ new application_listener_rule_1.ApplicationListenerRule(this, id + "Rule", {
231
+ listener: this,
232
+ priority: props.priority,
233
+ ...props,
234
+ });
235
+ }
236
+ else {
237
+ // New default target with these targetgroups
238
+ this.setDefaultAction(application_listener_action_1.ListenerAction.forward(props.targetGroups));
239
+ }
240
+ }
241
+ /**
242
+ * Load balance incoming requests to the given load balancing targets.
243
+ *
244
+ * This method implicitly creates an ApplicationTargetGroup for the targets
245
+ * involved, and a 'forward' action to route traffic to the given TargetGroup.
246
+ *
247
+ * If you want more control over the precise setup, create the TargetGroup
248
+ * and use `addAction` yourself.
249
+ *
250
+ * It's possible to add conditions to the targets added in this way. At least
251
+ * one set of targets must be added without conditions.
252
+ *
253
+ * @returns The newly created target group
254
+ */
255
+ addTargets(id, props) {
256
+ if (!this.loadBalancer.vpc) {
257
+ // eslint-disable-next-line max-len
258
+ throw new Error("Can only call addTargets() when using a constructed Load Balancer or an imported Load Balancer with specified vpc; construct a new TargetGroup and use addTargetGroup");
259
+ }
260
+ const group = new application_target_group_1.ApplicationTargetGroup(this, id + "Group", {
261
+ vpc: this.loadBalancer.vpc,
262
+ ...props,
263
+ });
264
+ this.addTargetGroups(id, {
265
+ targetGroups: [group],
266
+ ...props,
267
+ });
268
+ return group;
269
+ }
270
+ /**
271
+ * Add a fixed response
272
+ *
273
+ * @deprecated Use `addAction()` instead
274
+ */
275
+ addFixedResponse(id, props) {
276
+ checkAddRuleProps(props);
277
+ const fixedResponse = {
278
+ statusCode: props.statusCode,
279
+ contentType: props.contentType ?? application_listener_rule_1.ContentType.TEXT_PLAIN,
280
+ messageBody: props.messageBody,
281
+ };
282
+ /**
283
+ * NOTE - Copy/pasted from `application-listener-rule.ts#validateFixedResponse`.
284
+ * This was previously a deprecated, exported function, which caused issues with jsii's strip-deprecated functionality.
285
+ * Inlining the duplication functionality in v2 only (for now).
286
+ */
287
+ if (fixedResponse.statusCode &&
288
+ !/^(2|4|5)\d\d$/.test(fixedResponse.statusCode)) {
289
+ throw new Error("`statusCode` must be 2XX, 4XX or 5XX.");
290
+ }
291
+ if (fixedResponse.messageBody && fixedResponse.messageBody.length > 1024) {
292
+ throw new Error("`messageBody` cannot have more than 1024 characters.");
293
+ }
294
+ if (props.priority) {
295
+ new application_listener_rule_1.ApplicationListenerRule(this, id + "Rule", {
296
+ listener: this,
297
+ priority: props.priority,
298
+ fixedResponse,
299
+ ...props,
300
+ });
301
+ }
302
+ else {
303
+ this.setDefaultAction(application_listener_action_1.ListenerAction.fixedResponse(cdktf_1.Token.asNumber(props.statusCode), {
304
+ contentType: props.contentType ?? application_listener_rule_1.ContentType.TEXT_PLAIN,
305
+ messageBody: props.messageBody,
306
+ }));
307
+ }
308
+ }
309
+ /**
310
+ * Add a redirect response
311
+ *
312
+ * @deprecated Use `addAction()` instead
313
+ */
314
+ addRedirectResponse(id, props) {
315
+ checkAddRuleProps(props);
316
+ const redirectResponse = {
317
+ host: props.host,
318
+ path: props.path,
319
+ port: props.port,
320
+ protocol: props.protocol,
321
+ query: props.query,
322
+ statusCode: props.statusCode,
323
+ };
324
+ /**
325
+ * NOTE - Copy/pasted from `application-listener-rule.ts#validateRedirectResponse`.
326
+ * This was previously a deprecated, exported function, which caused issues with jsii's strip-deprecated functionality.
327
+ * Inlining the duplication functionality in v2 only (for now).
328
+ */
329
+ if (redirectResponse.protocol &&
330
+ !/^(HTTPS?|#\{protocol\})$/i.test(redirectResponse.protocol)) {
331
+ throw new Error("`protocol` must be HTTP, HTTPS, or #{protocol}.");
332
+ }
333
+ if (!redirectResponse.statusCode ||
334
+ !/^HTTP_30[12]$/.test(redirectResponse.statusCode)) {
335
+ throw new Error("`statusCode` must be HTTP_301 or HTTP_302.");
336
+ }
337
+ if (props.priority) {
338
+ new application_listener_rule_1.ApplicationListenerRule(this, id + "Rule", {
339
+ listener: this,
340
+ priority: props.priority,
341
+ redirectResponse,
342
+ ...props,
343
+ });
344
+ }
345
+ else {
346
+ this.setDefaultAction(application_listener_action_1.ListenerAction.redirect({
347
+ host: props.host,
348
+ path: props.path,
349
+ port: props.port,
350
+ protocol: props.protocol,
351
+ query: props.query,
352
+ permanent: props.statusCode === "HTTP_301",
353
+ }));
354
+ }
355
+ }
356
+ /**
357
+ * Register that a connectable that has been added to this load balancer.
358
+ *
359
+ * Don't call this directly. It is called by ApplicationTargetGroup.
360
+ */
361
+ registerConnectable(connectable, portRange) {
362
+ connectable.connections.allowFrom(this.loadBalancer, portRange, "Load balancer to target");
363
+ }
364
+ /**
365
+ * Validate this listener.
366
+ */
367
+ validateListener() {
368
+ const errors = super.validateListener();
369
+ if (this.protocol === enums_1.ApplicationProtocol.HTTPS &&
370
+ this.certificateArns.length === 0) {
371
+ errors.push("HTTPS Listener needs at least one certificate (call addCertificates)");
372
+ }
373
+ return errors;
374
+ }
375
+ /**
376
+ * Wrapper for _setDefaultAction which does a type-safe bind
377
+ */
378
+ setDefaultAction(action) {
379
+ action.bind(this, this);
380
+ this._setDefaultAction(action);
381
+ }
382
+ }
383
+ exports.ApplicationListener = ApplicationListener;
384
+ _a = JSII_RTTI_SYMBOL_1;
385
+ ApplicationListener[_a] = { fqn: "terraconstructs.aws.compute.ApplicationListener", version: "0.0.12" };
386
+ class ExternalApplicationListener extends aws_construct_1.AwsConstructBase {
387
+ get listenerOutputs() {
388
+ return {
389
+ listenerArn: this.listenerArn,
390
+ };
391
+ }
392
+ get outputs() {
393
+ return this.listenerOutputs;
394
+ }
395
+ constructor(scope, id) {
396
+ super(scope, id);
397
+ }
398
+ /**
399
+ * Register that a connectable that has been added to this load balancer.
400
+ *
401
+ * Don't call this directly. It is called by ApplicationTargetGroup.
402
+ */
403
+ registerConnectable(connectable, portRange) {
404
+ this.connections.allowTo(connectable, portRange, "Load balancer to target");
405
+ }
406
+ /**
407
+ * Add one or more certificates to this listener.
408
+ * @deprecated use `addCertificates()`
409
+ */
410
+ addCertificateArns(id, arns) {
411
+ this.addCertificates(id, arns.map(listener_certificate_1.ListenerCertificate.fromArn));
412
+ }
413
+ /**
414
+ * Add one or more certificates to this listener.
415
+ */
416
+ addCertificates(id, certificates) {
417
+ new application_listener_certificate_1.ApplicationListenerCertificate(this, id, {
418
+ listener: this,
419
+ certificates,
420
+ });
421
+ }
422
+ /**
423
+ * Load balance incoming requests to the given target groups.
424
+ *
425
+ * It's possible to add conditions to the TargetGroups added in this way.
426
+ * At least one TargetGroup must be added without conditions.
427
+ */
428
+ addTargetGroups(id, props) {
429
+ checkAddRuleProps(props);
430
+ if (props.priority !== undefined) {
431
+ // New rule
432
+ new application_listener_rule_1.ApplicationListenerRule(this, id, {
433
+ listener: this,
434
+ priority: props.priority,
435
+ ...props,
436
+ });
437
+ }
438
+ else {
439
+ throw new Error("Cannot add default Target Groups to imported ApplicationListener");
440
+ }
441
+ }
442
+ /**
443
+ * Load balance incoming requests to the given load balancing targets.
444
+ *
445
+ * This method implicitly creates an ApplicationTargetGroup for the targets
446
+ * involved.
447
+ *
448
+ * It's possible to add conditions to the targets added in this way. At least
449
+ * one set of targets must be added without conditions.
450
+ *
451
+ * @returns The newly created target group
452
+ */
453
+ addTargets(_id, _props) {
454
+ // eslint-disable-next-line max-len
455
+ throw new Error("Can only call addTargets() when using a constructed ApplicationListener; construct a new TargetGroup and use addTargetGroup.");
456
+ }
457
+ /**
458
+ * Perform the given action on incoming requests
459
+ *
460
+ * This allows full control of the default action of the load balancer,
461
+ * including Action chaining, fixed responses and redirect responses. See
462
+ * the `ListenerAction` class for all options.
463
+ *
464
+ * It's possible to add routing conditions to the Action added in this way.
465
+ *
466
+ * It is not possible to add a default action to an imported IApplicationListener.
467
+ * In order to add actions to an imported IApplicationListener a `priority`
468
+ * must be provided.
469
+ *
470
+ * If you previously deployed a `ListenerRule` using the `addTargetGroups()` method
471
+ * and need to migrate to using the more feature rich `addAction()`
472
+ * method, then you will need to set the `removeRuleSuffixFromLogicalId: true`
473
+ * property here to avoid having CloudFormation attempt to replace your resource.
474
+ */
475
+ addAction(id, props) {
476
+ checkAddRuleProps(props);
477
+ if (props.priority !== undefined) {
478
+ const ruleId = props.removeSuffix ? id : id + "Rule";
479
+ // New rule
480
+ //
481
+ // TargetGroup.registerListener is called inside ApplicationListenerRule.
482
+ new application_listener_rule_1.ApplicationListenerRule(this, ruleId, {
483
+ listener: this,
484
+ priority: props.priority,
485
+ ...props,
486
+ });
487
+ }
488
+ else {
489
+ throw new Error("priority must be set for actions added to an imported listener");
490
+ }
491
+ }
492
+ }
493
+ /**
494
+ * An imported application listener.
495
+ */
496
+ class ImportedApplicationListener extends ExternalApplicationListener {
497
+ constructor(scope, id, props) {
498
+ super(scope, id);
499
+ this.listenerArn = props.listenerArn;
500
+ const defaultPort = props.defaultPort !== undefined ? port_1.Port.tcp(props.defaultPort) : undefined;
501
+ this.connections = new connections_1.Connections({
502
+ securityGroups: [props.securityGroup],
503
+ defaultPort,
504
+ });
505
+ }
506
+ }
507
+ function checkAddRuleProps(props) {
508
+ const conditionsCount = props.conditions?.length || 0;
509
+ const hasAnyConditions = conditionsCount !== 0 ||
510
+ props.hostHeader !== undefined ||
511
+ props.pathPattern !== undefined ||
512
+ props.pathPatterns !== undefined;
513
+ const hasPriority = props.priority !== undefined;
514
+ if (hasAnyConditions !== hasPriority) {
515
+ throw new Error("Setting 'conditions', 'pathPattern' or 'hostHeader' also requires 'priority', and vice versa");
516
+ }
517
+ }
518
+ function validateMutualAuthentication(mutualAuthentication) {
519
+ if (!mutualAuthentication) {
520
+ return;
521
+ }
522
+ const currentMode = mutualAuthentication.mutualAuthenticationMode;
523
+ if (currentMode === MutualAuthenticationMode.VERIFY) {
524
+ if (!mutualAuthentication.trustStore) {
525
+ throw new Error(`You must set 'trustStore' when 'mode' is '${MutualAuthenticationMode.VERIFY}'`);
526
+ }
527
+ }
528
+ if (currentMode === MutualAuthenticationMode.OFF ||
529
+ currentMode === MutualAuthenticationMode.PASS_THROUGH) {
530
+ if (mutualAuthentication.trustStore) {
531
+ throw new Error(`You cannot set 'trustStore' when 'mode' is '${MutualAuthenticationMode.OFF}' or '${MutualAuthenticationMode.PASS_THROUGH}'`);
532
+ }
533
+ if (mutualAuthentication.ignoreClientCertificateExpiry !== undefined) {
534
+ throw new Error(`You cannot set 'ignoreClientCertificateExpiry' when 'mode' is '${MutualAuthenticationMode.OFF}' or '${MutualAuthenticationMode.PASS_THROUGH}'`);
535
+ }
536
+ }
537
+ }
538
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24tbGlzdGVuZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXdzL2NvbXB1dGUvYWxiL2FwcGxpY2F0aW9uLWxpc3RlbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0hBQStIO0FBRS9ILGlDQUFvQztBQUVwQywrRUFBK0Q7QUFDL0QseUZBQW9GO0FBQ3BGLDJFQUtxQztBQUVyQyx5RUFJb0M7QUFJcEMsdURBQXVEO0FBQ3ZELGdEQUEyRDtBQUMzRCw4REFLb0M7QUFFcEMsOENBTTRCO0FBQzVCLFdBQVc7QUFDWCxzQkFBc0I7QUFDdEIsa0NBQWtDO0FBQ2xDLDJDQUEyQztBQUMzQyw0RUFHMkM7QUFDM0MsNENBQTZEO0FBQzdELGtDQUErQjtBQUMvQixrQ0FBK0I7QUErSC9COztHQUVHO0FBQ0gsSUFBWSx3QkFlWDtBQWZELFdBQVksd0JBQXdCO0lBQ2xDOztPQUVHO0lBQ0gsdUNBQVcsQ0FBQTtJQUVYOztPQUVHO0lBQ0gsd0RBQTRCLENBQUE7SUFFNUI7O09BRUc7SUFDSCw2Q0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBZlcsd0JBQXdCLHdDQUF4Qix3QkFBd0IsUUFlbkM7QUE4QkQ7Ozs7R0FJRztBQUNILE1BQWEsbUJBQ1gsU0FBUSw0QkFBWTtJQUdwQixnQ0FBZ0M7SUFDaEMsTUFBTTtJQUNOLHFDQUFxQztJQUNyQyxNQUFNO0lBQ04sNEJBQTRCO0lBQzVCLHNCQUFzQjtJQUN0QixnQkFBZ0I7SUFDaEIsK0NBQStDO0lBQy9DLDRCQUE0QjtJQUM1QixtREFBbUQ7SUFDbkQsdUJBQXVCO0lBQ3ZCLDBGQUEwRjtJQUMxRixTQUFTO0lBQ1QsTUFBTTtJQUVOLG9FQUFvRTtJQUNwRSx3Q0FBd0M7SUFDeEMscUNBQXFDO0lBQ3JDLDhEQUE4RDtJQUM5RCxlQUFlO0lBQ2Ysc0NBQXNDO0lBQ3RDLCtEQUErRDtJQUMvRCxlQUFlO0lBQ2YsTUFBTTtJQUVOLDhEQUE4RDtJQUM5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QUNiLDZDQUE2Qyx3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsQ0FDaEYsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFDRSxXQUFXLEtBQUssd0JBQXdCLENBQUMsR0FBRztRQUM1QyxXQUFXLEtBQUssd0JBQXdCLENBQUMsWUFBWSxFQUNyRCxDQUFDO1FBQ0QsSUFBSSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksS0FBSyxDQUNiLCtDQUErQyx3QkFBd0IsQ0FBQyxHQUFHLFNBQVMsd0JBQXdCLENBQUMsWUFBWSxHQUFHLENBQzdILENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxvQkFBb0IsQ0FBQyw2QkFBNkIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyRSxNQUFNLElBQUksS0FBSyxDQUNiLGtFQUFrRSx3QkFBd0IsQ0FBQyxHQUFHLFNBQVMsd0JBQXdCLENBQUMsWUFBWSxHQUFHLENBQ2hKLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNzUuMS9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2Mi9saWIvYWxiL2FwcGxpY2F0aW9uLWxpc3RlbmVyLnRzXG5cbmltcG9ydCB7IExhenksIFRva2VuIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgTGlzdGVuZXJBY3Rpb24gfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi1saXN0ZW5lci1hY3Rpb25cIjtcbmltcG9ydCB7IEFwcGxpY2F0aW9uTGlzdGVuZXJDZXJ0aWZpY2F0ZSB9IGZyb20gXCIuL2FwcGxpY2F0aW9uLWxpc3RlbmVyLWNlcnRpZmljYXRlXCI7XG5pbXBvcnQge1xuICBBcHBsaWNhdGlvbkxpc3RlbmVyUnVsZSxcbiAgQ29udGVudFR5cGUsXG4gIEZpeGVkUmVzcG9uc2UsXG4gIFJlZGlyZWN0UmVzcG9uc2UsXG59IGZyb20gXCIuL2FwcGxpY2F0aW9uLWxpc3RlbmVyLXJ1bGVcIjtcbmltcG9ydCB7IElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uLWxvYWQtYmFsYW5jZXJcIjtcbmltcG9ydCB7XG4gIEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAsXG4gIElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlclRhcmdldCxcbiAgSUFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAsXG59IGZyb20gXCIuL2FwcGxpY2F0aW9uLXRhcmdldC1ncm91cFwiO1xuaW1wb3J0IHsgTGlzdGVuZXJDb25kaXRpb24gfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBJVHJ1c3RTdG9yZSB9IGZyb20gXCIuL3RydXN0LXN0b3JlXCI7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9kdXJhdGlvblwiO1xuaW1wb3J0IHsgQXdzQ29uc3RydWN0QmFzZSB9IGZyb20gXCIuLi8uLi9hd3MtY29uc3RydWN0XCI7XG5pbXBvcnQgeyBDb25uZWN0aW9ucywgSUNvbm5lY3RhYmxlIH0gZnJvbSBcIi4uL2Nvbm5lY3Rpb25zXCI7XG5pbXBvcnQge1xuICBCYXNlTGlzdGVuZXIsXG4gIEJhc2VMaXN0ZW5lckxvb2t1cE9wdGlvbnMsXG4gIElMaXN0ZW5lcixcbiAgTGlzdGVuZXJPdXRwdXRzLFxufSBmcm9tIFwiLi4vbGItc2hhcmVkL2Jhc2UtbGlzdGVuZXJcIjtcbmltcG9ydCB7IEhlYWx0aENoZWNrIH0gZnJvbSBcIi4uL2xiLXNoYXJlZC9iYXNlLXRhcmdldC1ncm91cFwiO1xuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25Qcm90b2NvbCxcbiAgQXBwbGljYXRpb25Qcm90b2NvbFZlcnNpb24sXG4gIFRhcmdldEdyb3VwTG9hZEJhbGFuY2luZ0FsZ29yaXRobVR5cGUsXG4gIElwQWRkcmVzc1R5cGUsXG4gIFNzbFBvbGljeSxcbn0gZnJvbSBcIi4uL2xiLXNoYXJlZC9lbnVtc1wiO1xuLy8gaW1wb3J0IHtcbi8vICAgTG9hZEJhbGFuY2VyVHlwZSxcbi8vICAgTG9hZEJhbGFuY2VyTGlzdGVuZXJQcm90b2NvbCxcbi8vIH0gZnJvbSBcIi4uL2xiLXNoYXJlZC9ncmlkLWxvb2t1cC10eXBlc1wiO1xuaW1wb3J0IHtcbiAgSUxpc3RlbmVyQ2VydGlmaWNhdGUsXG4gIExpc3RlbmVyQ2VydGlmaWNhdGUsXG59IGZyb20gXCIuLi9sYi1zaGFyZWQvbGlzdGVuZXItY2VydGlmaWNhdGVcIjtcbmltcG9ydCB7IGRldGVybWluZVByb3RvY29sQW5kUG9ydCB9IGZyb20gXCIuLi9sYi1zaGFyZWQvdXRpbFwiO1xuaW1wb3J0IHsgUGVlciB9IGZyb20gXCIuLi9wZWVyXCI7XG5pbXBvcnQgeyBQb3J0IH0gZnJvbSBcIi4uL3BvcnRcIjtcbmltcG9ydCB7IElTZWN1cml0eUdyb3VwIH0gZnJvbSBcIi4uL3NlY3VyaXR5LWdyb3VwXCI7XG5cbi8qKlxuICogQmFzaWMgcHJvcGVydGllcyBmb3IgYW4gQXBwbGljYXRpb25MaXN0ZW5lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VBcHBsaWNhdGlvbkxpc3RlbmVyUHJvcHMge1xuICAvKipcbiAgICogVGhlIHByb3RvY29sIHRvIHVzZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIERldGVybWluZWQgZnJvbSBwb3J0IGlmIGtub3duLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2w/OiBBcHBsaWNhdGlvblByb3RvY29sO1xuXG4gIC8qKlxuICAgKiBUaGUgcG9ydCBvbiB3aGljaCB0aGUgbGlzdGVuZXIgbGlzdGVucyBmb3IgcmVxdWVzdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRGV0ZXJtaW5lZCBmcm9tIHByb3RvY29sIGlmIGtub3duLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGNlcnRpZmljYXRlcyB0byB1c2Ugb24gdGhpcyBsaXN0ZW5lclxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGNlcnRpZmljYXRlcy5cbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBgY2VydGlmaWNhdGVzYCBwcm9wZXJ0eSBpbnN0ZWFkXG4gICAqL1xuICByZWFkb25seSBjZXJ0aWZpY2F0ZUFybnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQ2VydGlmaWNhdGUgbGlzdCBvZiBBQ00gY2VydCBBUk5zLiBZb3UgbXVzdCBwcm92aWRlIGV4YWN0bHkgb25lIGNlcnRpZmljYXRlIGlmIHRoZSBsaXN0ZW5lciBwcm90b2NvbCBpcyBIVFRQUyBvciBUTFMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY2VydGlmaWNhdGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgY2VydGlmaWNhdGVzPzogSUxpc3RlbmVyQ2VydGlmaWNhdGVbXTtcblxuICAvKipcbiAgICogVGhlIHNlY3VyaXR5IHBvbGljeSB0aGF0IGRlZmluZXMgd2hpY2ggY2lwaGVycyBhbmQgcHJvdG9jb2xzIGFyZSBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIGN1cnJlbnQgcHJlZGVmaW5lZCBzZWN1cml0eSBwb2xpY3kuXG4gICAqL1xuICByZWFkb25seSBzc2xQb2xpY3k/OiBTc2xQb2xpY3k7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdGFyZ2V0IGdyb3VwcyB0byBsb2FkIGJhbGFuY2UgdG9cbiAgICpcbiAgICogQWxsIHRhcmdldCBncm91cHMgd2lsbCBiZSBsb2FkIGJhbGFuY2VkIHRvIHdpdGggZXF1YWwgd2VpZ2h0IGFuZCB3aXRob3V0XG4gICAqIHN0aWNraW5lc3MuIEZvciBhIG1vcmUgY29tcGxleCBjb25maWd1cmF0aW9uIHRoYW4gdGhhdCwgdXNlXG4gICAqIGVpdGhlciBgZGVmYXVsdEFjdGlvbmAgb3IgYGFkZEFjdGlvbigpYC5cbiAgICpcbiAgICogQ2Fubm90IGJlIHNwZWNpZmllZCB0b2dldGhlciB3aXRoIGBkZWZhdWx0QWN0aW9uYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFRhcmdldEdyb3Vwcz86IElBcHBsaWNhdGlvblRhcmdldEdyb3VwW107XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgYWN0aW9uIHRvIHRha2UgZm9yIHJlcXVlc3RzIHRvIHRoaXMgbGlzdGVuZXJcbiAgICpcbiAgICogVGhpcyBhbGxvd3MgZnVsbCBjb250cm9sIG9mIHRoZSBkZWZhdWx0IGFjdGlvbiBvZiB0aGUgbG9hZCBiYWxhbmNlcixcbiAgICogaW5jbHVkaW5nIEFjdGlvbiBjaGFpbmluZywgZml4ZWQgcmVzcG9uc2VzIGFuZCByZWRpcmVjdCByZXNwb25zZXMuXG4gICAqXG4gICAqIFNlZSB0aGUgYExpc3RlbmVyQWN0aW9uYCBjbGFzcyBmb3IgYWxsIG9wdGlvbnMuXG4gICAqXG4gICAqIENhbm5vdCBiZSBzcGVjaWZpZWQgdG9nZXRoZXIgd2l0aCBgZGVmYXVsdFRhcmdldEdyb3Vwc2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRBY3Rpb24/OiBMaXN0ZW5lckFjdGlvbjtcblxuICAvKipcbiAgICogQWxsb3cgYW55b25lIHRvIGNvbm5lY3QgdG8gdGhlIGxvYWQgYmFsYW5jZXIgb24gdGhlIGxpc3RlbmVyIHBvcnRcbiAgICpcbiAgICogSWYgdGhpcyBpcyBzcGVjaWZpZWQsIHRoZSBsb2FkIGJhbGFuY2VyIHdpbGwgYmUgb3BlbmVkIHVwIHRvIGFueW9uZSB3aG8gY2FuIHJlYWNoIGl0LlxuICAgKiBGb3IgaW50ZXJuYWwgbG9hZCBiYWxhbmNlcnMgdGhpcyBpcyBhbnlvbmUgaW4gdGhlIHNhbWUgVlBDLiBGb3IgcHVibGljIGxvYWRcbiAgICogYmFsYW5jZXJzLCB0aGlzIGlzIGFueW9uZSBvbiB0aGUgaW50ZXJuZXQuXG4gICAqXG4gICAqIElmIHlvdSB3YW50IHRvIGJlIG1vcmUgc2VsZWN0aXZlIGFib3V0IHdobyBjYW4gYWNjZXNzIHRoaXMgbG9hZFxuICAgKiBiYWxhbmNlciwgc2V0IHRoaXMgdG8gYGZhbHNlYCBhbmQgdXNlIHRoZSBsaXN0ZW5lcidzIGBjb25uZWN0aW9uc2BcbiAgICogb2JqZWN0IHRvIHNlbGVjdGl2ZWx5IGdyYW50IGFjY2VzcyB0byB0aGUgbG9hZCBiYWxhbmNlciBvbiB0aGUgbGlzdGVuZXIgcG9ydC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgb3Blbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBtdXR1YWwgYXV0aGVudGljYXRpb24gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIG11dHVhbCBhdXRoZW50aWNhdGlvbiBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2VsYXN0aWNsb2FkYmFsYW5jaW5nL2xhdGVzdC9hcHBsaWNhdGlvbi9tdXR1YWwtYXV0aGVudGljYXRpb24uaHRtbFxuICAgKiBAc2VlIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODcuMC9kb2NzL3Jlc291cmNlcy9sYl9saXN0ZW5lciNtdXR1YWxfYXV0aGVudGljYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IG11dHVhbEF1dGhlbnRpY2F0aW9uPzogTXV0dWFsQXV0aGVudGljYXRpb247XG59XG5cbi8qKlxuICogVGhlIG11dHVhbCBhdXRoZW50aWNhdGlvbiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uXG4gKlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE11dHVhbEF1dGhlbnRpY2F0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBjbGllbnQgY2VydGlmaWNhdGUgaGFuZGxpbmcgbWV0aG9kXG4gICAqXG4gICAqIEBkZWZhdWx0IE11dHVhbEF1dGhlbnRpY2F0aW9uTW9kZS5PRkZcbiAgICovXG4gIHJlYWRvbmx5IG11dHVhbEF1dGhlbnRpY2F0aW9uTW9kZT86IE11dHVhbEF1dGhlbnRpY2F0aW9uTW9kZTtcblxuICAvKipcbiAgICogVGhlIHRydXN0IHN0b3JlXG4gICAqXG4gICAqIENhbm5vdCBiZSB1c2VkIHdpdGggTXV0dWFsQXV0aGVudGljYXRpb25Nb2RlLk9GRiBvciBNdXR1YWxBdXRoZW50aWNhdGlvbk1vZGUuUEFTU19USFJPVUdIXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdHJ1c3Qgc3RvcmVcbiAgICovXG4gIHJlYWRvbmx5IHRydXN0U3RvcmU/OiBJVHJ1c3RTdG9yZTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgZXhwaXJlZCBjbGllbnQgY2VydGlmaWNhdGVzIGFyZSBpZ25vcmVkXG4gICAqXG4gICAqIENhbm5vdCBiZSB1c2VkIHdpdGggTXV0dWFsQXV0aGVudGljYXRpb25Nb2RlLk9GRiBvciBNdXR1YWxBdXRoZW50aWNhdGlvbk1vZGUuUEFTU19USFJPVUdIXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpZ25vcmVDbGllbnRDZXJ0aWZpY2F0ZUV4cGlyeT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIGNsaWVudCBjZXJ0aWZpY2F0ZSBoYW5kbGluZyBtZXRob2RcbiAqL1xuZXhwb3J0IGVudW0gTXV0dWFsQXV0aGVudGljYXRpb25Nb2RlIHtcbiAgLyoqXG4gICAqIE9mZlxuICAgKi9cbiAgT0ZGID0gXCJvZmZcIixcblxuICAvKipcbiAgICogQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlciBzZW5kcyB0aGUgd2hvbGUgY2xpZW50IGNlcnRpZmljYXRlIGNoYWluIHRvIHRoZSB0YXJnZXQgdXNpbmcgSFRUUCBoZWFkZXJzXG4gICAqL1xuICBQQVNTX1RIUk9VR0ggPSBcInBhc3N0aHJvdWdoXCIsXG5cbiAgLyoqXG4gICAqIEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIgcGVyZm9ybXMgWC41MDkgY2xpZW50IGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uIGZvciBjbGllbnRzIHdoZW4gYSBsb2FkIGJhbGFuY2VyIG5lZ290aWF0ZXMgVExTIGNvbm5lY3Rpb25zXG4gICAqL1xuICBWRVJJRlkgPSBcInZlcmlmeVwiLFxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGRlZmluaW5nIGEgc3RhbmRhbG9uZSBBcHBsaWNhdGlvbkxpc3RlbmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25MaXN0ZW5lclByb3BzIGV4dGVuZHMgQmFzZUFwcGxpY2F0aW9uTGlzdGVuZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbG9hZCBiYWxhbmNlciB0byBhdHRhY2ggdGhpcyBsaXN0ZW5lciB0b1xuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEJhbGFuY2VyOiBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgQXBwbGljYXRpb25MaXN0ZW5lciBsb29rdXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkxpc3RlbmVyTG9va3VwT3B0aW9uc1xuICBleHRlbmRzIEJhc2VMaXN0ZW5lckxvb2t1cE9wdGlvbnMge1xuICAvKipcbiAgICogQVJOIG9mIHRoZSBsaXN0ZW5lciB0byBsb29rIHVwXG4gICAqIEBkZWZhdWx0IC0gZG9lcyBub3QgZmlsdGVyIGJ5IGxpc3RlbmVyIGFyblxuICAgKi9cbiAgcmVhZG9ubHkgbGlzdGVuZXJBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBsaXN0ZW5lcnMgYnkgbGlzdGVuZXIgcHJvdG9jb2xcbiAgICogQGRlZmF1bHQgLSBkb2VzIG5vdCBmaWx0ZXIgYnkgbGlzdGVuZXIgcHJvdG9jb2xcbiAgICovXG4gIHJlYWRvbmx5IGxpc3RlbmVyUHJvdG9jb2w/OiBBcHBsaWNhdGlvblByb3RvY29sO1xufVxuXG4vKipcbiAqIERlZmluZSBhbiBBcHBsaWNhdGlvbkxpc3RlbmVyXG4gKlxuICogQHJlc291cmNlIEFXUzo6RWxhc3RpY0xvYWRCYWxhbmNpbmdWMjo6TGlzdGVuZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uTGlzdGVuZXJcbiAgZXh0ZW5kcyBCYXNlTGlzdGVuZXJcbiAgaW1wbGVtZW50cyBJQXBwbGljYXRpb25MaXN0ZW5lclxue1xuICAvLyBUT0RPOiBBZGQgR3JpZCBMb29rdXAgc3VwcG9ydFxuICAvLyAvKipcbiAgLy8gICogTG9vayB1cCBhbiBBcHBsaWNhdGlvbkxpc3RlbmVyLlxuICAvLyAgKi9cbiAgLy8gcHVibGljIHN0YXRpYyBmcm9tTG9va3VwKFxuICAvLyAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIC8vICAgaWQ6IHN0cmluZyxcbiAgLy8gICBvcHRpb25zOiBBcHBsaWNhdGlvbkxpc3RlbmVyTG9va3VwT3B0aW9ucyxcbiAgLy8gKTogSUFwcGxpY2F0aW9uTGlzdGVuZXIge1xuICAvLyAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQob3B0aW9ucy5saXN0ZW5lckFybikpIHtcbiAgLy8gICAgIHRocm93IG5ldyBFcnJvcihcbiAgLy8gICAgICAgXCJBbGwgYXJndW1lbnRzIHRvIGxvb2sgdXAgYSBsb2FkIGJhbGFuY2VyIGxpc3RlbmVyIG11c3QgYmUgY29uY3JldGUgKG5vIFRva2VucylcIixcbiAgLy8gICAgICk7XG4gIC8vICAgfVxuXG4gIC8vICAgbGV0IGxpc3RlbmVyUHJvdG9jb2w6IExvYWRCYWxhbmNlckxpc3RlbmVyUHJvdG9jb2wgfCB1bmRlZmluZWQ7XG4gIC8vICAgc3dpdGNoIChvcHRpb25zLmxpc3RlbmVyUHJvdG9jb2wpIHtcbiAgLy8gICAgIGNhc2UgQXBwbGljYXRpb25Qcm90b2NvbC5IVFRQOlxuICAvLyAgICAgICBsaXN0ZW5lclByb3RvY29sID0gTG9hZEJhbGFuY2VyTGlzdGVuZXJQcm90b2NvbC5IVFRQO1xuICAvLyAgICAgICBicmVhaztcbiAgLy8gICAgIGNhc2UgQXBwbGljYXRpb25Qcm90b2NvbC5IVFRQUzpcbiAgLy8gICAgICAgbGlzdGVuZXJQcm90b2NvbCA9IExvYWRCYWxhbmNlckxpc3RlbmVyUHJvdG9jb2wuSFRUUFM7XG4gIC8vICAgICAgIGJyZWFrO1xuICAvLyAgIH1cblxuICAvLyAgIGNvbnN0IHByb3BzID0gQmFzZUxpc3RlbmVyLl9xdWVyeUNvbnRleHRQcm92aWRlcihzY29wZSwge1xuICAvLyAgICAgdXNlck9wdGlvbnM6IG9wdGlvbnMsXG4gIC8vICAgICBsb2FkQmFsYW5jZXJUeXBlOiBMb2FkQmFsYW5jZXJUeXBlLkFQUExJQ0FUSU9OLFxuICAvLyAgICAgbGlzdGVuZXJBcm46IG9wdGlvbnMubGlzdGVuZXJBcm4sXG4gIC8vICAgICBsaXN0ZW5lclByb3RvY29sLFxuICAvLyAgIH0pO1xuXG4gIC8vICAgcmV0dXJuIG5ldyBMb29rZWRVcEFwcGxpY2F0aW9uTGlzdGVuZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gIC8vIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIGxpc3RlbmVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21BcHBsaWNhdGlvbkxpc3RlbmVyQXR0cmlidXRlcyhcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXR0cnM6IEFwcGxpY2F0aW9uTGlzdGVuZXJBdHRyaWJ1dGVzLFxuICApOiBJQXBwbGljYXRpb25MaXN0ZW5lciB7XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRlZEFwcGxpY2F0aW9uTGlzdGVuZXIoc2NvcGUsIGlkLCBhdHRycyk7XG4gIH1cblxuICAvKipcbiAgICogTWFuYWdlIGNvbm5lY3Rpb25zIHRvIHRoaXMgQXBwbGljYXRpb25MaXN0ZW5lclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICAvKipcbiAgICogTG9hZCBiYWxhbmNlciB0aGlzIGxpc3RlbmVyIGlzIGFzc29jaWF0ZWQgd2l0aFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvYWRCYWxhbmNlcjogSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgcG9ydCBvZiB0aGUgbGlzdGVuZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBUk5zIG9mIGNlcnRpZmljYXRlcyBhZGRlZCB0byB0aGlzIGxpc3RlbmVyXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNlcnRpZmljYXRlQXJuczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIExpc3RlbmVyIHByb3RvY29sIGZvciB0aGlzIGxpc3RlbmVyLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcm90b2NvbDogQXBwbGljYXRpb25Qcm90b2NvbDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXBwbGljYXRpb25MaXN0ZW5lclByb3BzKSB7XG4gICAgY29uc3QgW3Byb3RvY29sLCBwb3J0XSA9IGRldGVybWluZVByb3RvY29sQW5kUG9ydChcbiAgICAgIHByb3BzLnByb3RvY29sLFxuICAgICAgcHJvcHMucG9ydCxcbiAgICApO1xuICAgIGlmIChwcm90b2NvbCA9PT0gdW5kZWZpbmVkIHx8IHBvcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXQgbGVhc3Qgb25lIG9mICdwb3J0JyBvciAncHJvdG9jb2wnIGlzIHJlcXVpcmVkXCIpO1xuICAgIH1cblxuICAgIHZhbGlkYXRlTXV0dWFsQXV0aGVudGljYXRpb24ocHJvcHMubXV0dWFsQXV0aGVudGljYXRpb24pO1xuXG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBsb2FkQmFsYW5jZXJBcm46IHByb3BzLmxvYWRCYWxhbmNlci5sb2FkQmFsYW5jZXJBcm4sXG4gICAgICBjZXJ0aWZpY2F0ZUFybjogTGF6eS5zdHJpbmdWYWx1ZSh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+XG4gICAgICAgICAgdGhpcy5jZXJ0aWZpY2F0ZUFybnMubGVuZ3RoID4gMCA/IHRoaXMuY2VydGlmaWNhdGVBcm5zWzBdIDogdW5kZWZpbmVkLFxuICAgICAgfSksXG4gICAgICBwcm90b2NvbCxcbiAgICAgIHBvcnQsXG4gICAgICBzc2xQb2xpY3k6IHByb3BzLnNzbFBvbGljeSxcbiAgICAgIC8vIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzL2xhdGVzdC9kb2NzL3Jlc291cmNlcy9sYl9saXN0ZW5lciNtdXR1YWxfYXV0aGVudGljYXRpb25cbiAgICAgIG11dHVhbEF1dGhlbnRpY2F0aW9uOlxuICAgICAgICBwcm9wcy5tdXR1YWxBdXRoZW50aWNhdGlvbiAmJlxuICAgICAgICBPYmplY3Qua2V5cyhwcm9wcy5tdXR1YWxBdXRoZW50aWNhdGlvbikubGVuZ3RoID4gMFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBpZ25vcmVDbGllbnRDZXJ0aWZpY2F0ZUV4cGlyeTpcbiAgICAgICAgICAgICAgICBwcm9wcy5tdXR1YWxBdXRoZW50aWNhdGlvbj8uaWdub3JlQ2xpZW50Q2VydGlmaWNhdGVFeHBpcnksXG4gICAgICAgICAgICAgIC8vIENGTiBEZWZhdWx0IGlzIG9mZlxuICAgICAgICAgICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyLWxpc3RlbmVyLW11dHVhbGF1dGhlbnRpY2F0aW9uLmh0bWwjY2ZuLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjItbGlzdGVuZXItbXV0dWFsYXV0aGVudGljYXRpb24tbW9kZVxuICAgICAgICAgICAgICBtb2RlOlxuICAgICAgICAgICAgICAgIHByb3BzLm11dHVhbEF1dGhlbnRpY2F0aW9uPy5tdXR1YWxBdXRoZW50aWNhdGlvbk1vZGUgPz9cbiAgICAgICAgICAgICAgICBNdXR1YWxBdXRoZW50aWNhdGlvbk1vZGUuT0ZGLFxuICAgICAgICAgICAgICB0cnVzdFN0b3JlQXJuOlxuICAgICAgICAgICAgICAgIHByb3BzLm11dHVhbEF1dGhlbnRpY2F0aW9uPy50cnVzdFN0b3JlPy50cnVzdFN0b3JlQXJuLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5sb2FkQmFsYW5jZXIgPSBwcm9wcy5sb2FkQmFsYW5jZXI7XG4gICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sO1xuICAgIHRoaXMucG9ydCA9IHBvcnQ7XG4gICAgdGhpcy5jZXJ0aWZpY2F0ZUFybnMgPSBbXTtcblxuICAgIC8vIEF0dGFjaCBjZXJ0aWZpY2F0ZXNcbiAgICBpZiAocHJvcHMuY2VydGlmaWNhdGVBcm5zICYmIHByb3BzLmNlcnRpZmljYXRlQXJucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmFkZENlcnRpZmljYXRlQXJucyhcIkxpc3RlbmVyQ2VydGlmaWNhdGVcIiwgcHJvcHMuY2VydGlmaWNhdGVBcm5zKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmNlcnRpZmljYXRlcyAmJiBwcm9wcy5jZXJ0aWZpY2F0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hZGRDZXJ0aWZpY2F0ZXMoXCJEZWZhdWx0Q2VydGlmaWNhdGVzXCIsIHByb3BzLmNlcnRpZmljYXRlcyk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBsaXN0ZW5lciBlZGl0cyB0aGUgc2VjdXJpdHlncm91cCBvZiB0aGUgbG9hZCBiYWxhbmNlcixcbiAgICAvLyBidXQgYWRkcyBpdHMgb3duIGRlZmF1bHQgcG9ydC5cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gbmV3IENvbm5lY3Rpb25zKHtcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBwcm9wcy5sb2FkQmFsYW5jZXIuY29ubmVjdGlvbnMuc2VjdXJpdHlHcm91cHMsXG4gICAgICBkZWZhdWx0UG9ydDogUG9ydC50Y3AocG9ydCksXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdEFjdGlvbiAmJiBwcm9wcy5kZWZhdWx0VGFyZ2V0R3JvdXBzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiU3BlY2lmeSBhdCBtb3N0IG9uZSBvZiAnZGVmYXVsdEFjdGlvbicgYW5kICdkZWZhdWx0VGFyZ2V0R3JvdXBzJ1wiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdEFjdGlvbikge1xuICAgICAgdGhpcy5zZXREZWZhdWx0QWN0aW9uKHByb3BzLmRlZmF1bHRBY3Rpb24pO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5kZWZhdWx0VGFyZ2V0R3JvdXBzKSB7XG4gICAgICB0aGlzLnNldERlZmF1bHRBY3Rpb24oTGlzdGVuZXJBY3Rpb24uZm9yd2FyZChwcm9wcy5kZWZhdWx0VGFyZ2V0R3JvdXBzKSk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm9wZW4gIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25zLmFsbG93RGVmYXVsdFBvcnRGcm9tKFxuICAgICAgICBQZWVyLmFueUlwdjQoKSxcbiAgICAgICAgYEFsbG93IGZyb20gYW55b25lIG9uIHBvcnQgJHtwb3J0fWAsXG4gICAgICApO1xuICAgICAgLy8gV2hlbiBlbmFibGVkLCB0aGUgZGVmYXVsdCBzZWN1cml0eSBncm91cCBpbmdyZXNzIHJ1bGVzIHdpbGwgYWxsb3cgSVB2NiBpbmdyZXNzIGZyb20gYW55d2hlcmVcbiAgICAgIC8vIHJlY29tbWVuZGVkVmFsdWU6IHRydWVcbiAgICAgIC8vIEZlYXR1cmVGbGFncy5vZih0aGlzKS5pc0VuYWJsZWQoXG4gICAgICAvLyAgIGN4YXBpLkFMQl9EVUFMU1RBQ0tfV0lUSE9VVF9QVUJMSUNfSVBWNF9TRUNVUklUWV9HUk9VUF9SVUxFU19ERUZBVUxULFxuICAgICAgLy8gKVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmxvYWRCYWxhbmNlci5pcEFkZHJlc3NUeXBlID09PSBJcEFkZHJlc3NUeXBlLkRVQUxfU1RBQ0sgfHxcbiAgICAgICAgdGhpcy5sb2FkQmFsYW5jZXIuaXBBZGRyZXNzVHlwZSA9PT1cbiAgICAgICAgICBJcEFkZHJlc3NUeXBlLkRVQUxfU1RBQ0tfV0lUSE9VVF9QVUJMSUNfSVBWNFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbnMuYWxsb3dEZWZhdWx0UG9ydEZyb20oXG4gICAgICAgICAgUGVlci5hbnlJcHY2KCksXG4gICAgICAgICAgYEFsbG93IGZyb20gYW55b25lIG9uIHBvcnQgJHtwb3J0fWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBvbmUgb3IgbW9yZSBjZXJ0aWZpY2F0ZXMgdG8gdGhpcyBsaXN0ZW5lci5cbiAgICpcbiAgICogQWZ0ZXIgdGhlIGZpcnN0IGNlcnRpZmljYXRlLCB0aGlzIGNyZWF0ZXMgQXBwbGljYXRpb25MaXN0ZW5lckNlcnRpZmljYXRlc1xuICAgKiByZXNvdXJjZXMgc2luY2UgY2xvdWRmb3JtYXRpb24gcmVxdWlyZXMgdGhlIGNlcnRpZmljYXRlcyBhcnJheSBvbiB0aGVcbiAgICogbGlzdGVuZXIgcmVzb3VyY2UgdG8gaGF2ZSBhIGxlbmd0aCBvZiAxLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGFkZENlcnRpZmljYXRlc2AgaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyBhZGRDZXJ0aWZpY2F0ZUFybnMoaWQ6IHN0cmluZywgYXJuczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLmFkZENlcnRpZmljYXRlcyhpZCwgYXJucy5tYXAoTGlzdGVuZXJDZXJ0aWZpY2F0ZS5mcm9tQXJuKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG9uZSBvciBtb3JlIGNlcnRpZmljYXRlcyB0byB0aGlzIGxpc3RlbmVyLlxuICAgKlxuICAgKiBBZnRlciB0aGUgZmlyc3QgY2VydGlmaWNhdGUsIHRoaXMgY3JlYXRlcyBBcHBsaWNhdGlvbkxpc3RlbmVyQ2VydGlmaWNhdGVzXG4gICAqIHJlc291cmNlcyBzaW5jZSBjbG91ZGZvcm1hdGlvbiByZXF1aXJlcyB0aGUgY2VydGlmaWNhdGVzIGFycmF5IG9uIHRoZVxuICAgKiBsaXN0ZW5lciByZXNvdXJjZSB0byBoYXZlIGEgbGVuZ3RoIG9mIDEuXG4gICAqL1xuICBwdWJsaWMgYWRkQ2VydGlmaWNhdGVzKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgY2VydGlmaWNhdGVzOiBJTGlzdGVuZXJDZXJ0aWZpY2F0ZVtdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBhZGRpdGlvbmFsQ2VydHMgPSBbLi4uY2VydGlmaWNhdGVzXTtcblxuICAgIGlmICh0aGlzLmNlcnRpZmljYXRlQXJucy5sZW5ndGggPT09IDAgJiYgYWRkaXRpb25hbENlcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpcnN0ID0gYWRkaXRpb25hbENlcnRzLnNwbGljZSgwLCAxKVswXTtcbiAgICAgIHRoaXMuY2VydGlmaWNhdGVBcm5zLnB1c2goZmlyc3QuY2VydGlmaWNhdGVBcm4pO1xuICAgIH1cblxuICAgIC8vIE9ubHkgb25lIGNlcnRpZmljYXRlIGNhbiBiZSBzcGVjaWZpZWQgcGVyIHJlc291cmNlLCBldmVuIHRob3VnaFxuICAgIC8vIGBjZXJ0aWZpY2F0ZXNgIGlzIG9mIHR5cGUgQXJyYXlcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZGl0aW9uYWxDZXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgbmV3IEFwcGxpY2F0aW9uTGlzdGVuZXJDZXJ0aWZpY2F0ZSh0aGlzLCBgJHtpZH0ke2kgKyAxfWAsIHtcbiAgICAgICAgbGlzdGVuZXI6IHRoaXMsXG4gICAgICAgIGNlcnRpZmljYXRlczogW2FkZGl0aW9uYWxDZXJ0c1tpXV0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgZ2l2ZW4gZGVmYXVsdCBhY3Rpb24gb24gaW5jb21pbmcgcmVxdWVzdHNcbiAgICpcbiAgICogVGhpcyBhbGxvd3MgZnVsbCBjb250cm9sIG9mIHRoZSBkZWZhdWx0IGFjdGlvbiBvZiB0aGUgbG9hZCBiYWxhbmNlcixcbiAgICogaW5jbHVkaW5nIEFjdGlvbiBjaGFpbmluZywgZml4ZWQgcmVzcG9uc2VzIGFuZCByZWRpcmVjdCByZXNwb25zZXMuIFNlZVxuICAgKiB0aGUgYExpc3RlbmVyQWN0aW9uYCBjbGFzcyBmb3IgYWxsIG9wdGlvbnMuXG4gICAqXG4gICAqIEl0J3MgcG9zc2libGUgdG8gYWRkIHJvdXRpbmcgY29uZGl0aW9ucyB0byB0aGUgQWN0aW9uIGFkZGVkIGluIHRoaXMgd2F5LlxuICAgKiBBdCBsZWFzdCBvbmUgQWN0aW9uIG11c3QgYmUgYWRkZWQgd2l0aG91dCBjb25kaXRpb25zICh3aGljaCBiZWNvbWVzIHRoZVxuICAgKiBkZWZhdWx0IEFjdGlvbikuXG4gICAqL1xuICBwdWJsaWMgYWRkQWN0aW9uKGlkOiBzdHJpbmcsIHByb3BzOiBBZGRBcHBsaWNhdGlvbkFjdGlvblByb3BzKTogdm9pZCB7XG4gICAgY2hlY2tBZGRSdWxlUHJvcHMocHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLnByaW9yaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE5ldyBydWxlXG4gICAgICAvL1xuICAgICAgLy8gVGFyZ2V0R3JvdXAucmVnaXN0ZXJMaXN0ZW5lciBpcyBjYWxsZWQgaW5zaWRlIEFwcGxpY2F0aW9uTGlzdGVuZXJSdWxlLlxuICAgICAgbmV3IEFwcGxpY2F0aW9uTGlzdGVuZXJSdWxlKHRoaXMsIGlkICsgXCJSdWxlXCIsIHtcbiAgICAgICAgbGlzdGVuZXI6IHRoaXMsXG4gICAgICAgIHByaW9yaXR5OiBwcm9wcy5wcmlvcml0eSxcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmV3IGRlZmF1bHQgdGFyZ2V0IHdpdGggdGhlc2UgdGFyZ2V0Z3JvdXBzXG4gICAgICB0aGlzLnNldERlZmF1bHRBY3Rpb24ocHJvcHMuYWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBiYWxhbmNlIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBnaXZlbiB0YXJnZXQgZ3JvdXBzLlxuICAgKlxuICAgKiBBbGwgdGFyZ2V0IGdyb3VwcyB3aWxsIGJlIGxvYWQgYmFsYW5jZWQgdG8gd2l0aCBlcXVhbCB3ZWlnaHQgYW5kIHdpdGhvdXRcbiAgICogc3RpY2tpbmVzcy4gRm9yIGEgbW9yZSBjb21wbGV4IGNvbmZpZ3VyYXRpb24gdGhhbiB0aGF0LCB1c2UgYGFkZEFjdGlvbigpYC5cbiAgICpcbiAgICogSXQncyBwb3NzaWJsZSB0byBhZGQgcm91dGluZyBjb25kaXRpb25zIHRvIHRoZSBUYXJnZXRHcm91cHMgYWRkZWQgaW4gdGhpc1xuICAgKiB3YXkuIEF0IGxlYXN0IG9uZSBUYXJnZXRHcm91cCBtdXN0IGJlIGFkZGVkIHdpdGhvdXQgY29uZGl0aW9ucyAod2hpY2ggd2lsbFxuICAgKiBiZWNvbWUgdGhlIGRlZmF1bHQgQWN0aW9uIGZvciB0aGlzIGxpc3RlbmVyKS5cbiAgICovXG4gIHB1YmxpYyBhZGRUYXJnZXRHcm91cHMoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQWRkQXBwbGljYXRpb25UYXJnZXRHcm91cHNQcm9wcyxcbiAgKTogdm9pZCB7XG4gICAgY2hlY2tBZGRSdWxlUHJvcHMocHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLnByaW9yaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE5ldyBydWxlXG4gICAgICAvL1xuICAgICAgLy8gVGFyZ2V0R3JvdXAucmVnaXN0ZXJMaXN0ZW5lciBpcyBjYWxsZWQgaW5zaWRlIEFwcGxpY2F0aW9uTGlzdGVuZXJSdWxlLlxuICAgICAgbmV3IEFwcGxpY2F0aW9uTGlzdGVuZXJSdWxlKHRoaXMsIGlkICsgXCJSdWxlXCIsIHtcbiAgICAgICAgbGlzdGVuZXI6IHRoaXMsXG4gICAgICAgIHByaW9yaXR5OiBwcm9wcy5wcmlvcml0eSxcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmV3IGRlZmF1bHQgdGFyZ2V0IHdpdGggdGhlc2UgdGFyZ2V0Z3JvdXBzXG4gICAgICB0aGlzLnNldERlZmF1bHRBY3Rpb24oTGlzdGVuZXJBY3Rpb24uZm9yd2FyZChwcm9wcy50YXJnZXRHcm91cHMpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBiYWxhbmNlIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBnaXZlbiBsb2FkIGJhbGFuY2luZyB0YXJnZXRzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpbXBsaWNpdGx5IGNyZWF0ZXMgYW4gQXBwbGljYXRpb25UYXJnZXRHcm91cCBmb3IgdGhlIHRhcmdldHNcbiAgICogaW52b2x2ZWQsIGFuZCBhICdmb3J3YXJkJyBhY3Rpb24gdG8gcm91dGUgdHJhZmZpYyB0byB0aGUgZ2l2ZW4gVGFyZ2V0R3JvdXAuXG4gICAqXG4gICAqIElmIHlvdSB3YW50IG1vcmUgY29udHJvbCBvdmVyIHRoZSBwcmVjaXNlIHNldHVwLCBjcmVhdGUgdGhlIFRhcmdldEdyb3VwXG4gICAqIGFuZCB1c2UgYGFkZEFjdGlvbmAgeW91cnNlbGYuXG4gICAqXG4gICAqIEl0J3MgcG9zc2libGUgdG8gYWRkIGNvbmRpdGlvbnMgdG8gdGhlIHRhcmdldHMgYWRkZWQgaW4gdGhpcyB3YXkuIEF0IGxlYXN0XG4gICAqIG9uZSBzZXQgb2YgdGFyZ2V0cyBtdXN0IGJlIGFkZGVkIHdpdGhvdXQgY29uZGl0aW9ucy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIG5ld2x5IGNyZWF0ZWQgdGFyZ2V0IGdyb3VwXG4gICAqL1xuICBwdWJsaWMgYWRkVGFyZ2V0cyhcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBBZGRBcHBsaWNhdGlvblRhcmdldHNQcm9wcyxcbiAgKTogQXBwbGljYXRpb25UYXJnZXRHcm91cCB7XG4gICAgaWYgKCF0aGlzLmxvYWRCYWxhbmNlci52cGMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2FuIG9ubHkgY2FsbCBhZGRUYXJnZXRzKCkgd2hlbiB1c2luZyBhIGNvbnN0cnVjdGVkIExvYWQgQmFsYW5jZXIgb3IgYW4gaW1wb3J0ZWQgTG9hZCBCYWxhbmNlciB3aXRoIHNwZWNpZmllZCB2cGM7IGNvbnN0cnVjdCBhIG5ldyBUYXJnZXRHcm91cCBhbmQgdXNlIGFkZFRhcmdldEdyb3VwXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGdyb3VwID0gbmV3IEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAodGhpcywgaWQgKyBcIkdyb3VwXCIsIHtcbiAgICAgIHZwYzogdGhpcy5sb2FkQmFsYW5jZXIudnBjLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZFRhcmdldEdyb3VwcyhpZCwge1xuICAgICAgdGFyZ2V0R3JvdXBzOiBbZ3JvdXBdLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3JvdXA7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgZml4ZWQgcmVzcG9uc2VcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBhZGRBY3Rpb24oKWAgaW5zdGVhZFxuICAgKi9cbiAgcHVibGljIGFkZEZpeGVkUmVzcG9uc2UoaWQ6IHN0cmluZywgcHJvcHM6IEFkZEZpeGVkUmVzcG9uc2VQcm9wcykge1xuICAgIGNoZWNrQWRkUnVsZVByb3BzKHByb3BzKTtcblxuICAgIGNvbnN0IGZpeGVkUmVzcG9uc2U6IEZpeGVkUmVzcG9uc2UgPSB7XG4gICAgICBzdGF0dXNDb2RlOiBwcm9wcy5zdGF0dXNDb2RlLFxuICAgICAgY29udGVudFR5cGU6IHByb3BzLmNvbnRlbnRUeXBlID8/IENvbnRlbnRUeXBlLlRFWFRfUExBSU4sXG4gICAgICBtZXNzYWdlQm9keTogcHJvcHMubWVzc2FnZUJvZHksXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE5PVEUgLSBDb3B5L3Bhc3RlZCBmcm9tIGBhcHBsaWNhdGlvbi1saXN0ZW5lci1ydWxlLnRzI3ZhbGlkYXRlRml4ZWRSZXNwb25zZWAuXG4gICAgICogVGhpcyB3YXMgcHJldmlvdXNseSBhIGRlcHJlY2F0ZWQsIGV4cG9ydGVkIGZ1bmN0aW9uLCB3aGljaCBjYXVzZWQgaXNzdWVzIHdpdGgganNpaSdzIHN0cmlwLWRlcHJlY2F0ZWQgZnVuY3Rpb25hbGl0eS5cbiAgICAgKiBJbmxpbmluZyB0aGUgZHVwbGljYXRpb24gZnVuY3Rpb25hbGl0eSBpbiB2MiBvbmx5IChmb3Igbm93KS5cbiAgICAgKi9cbiAgICBpZiAoXG4gICAgICBmaXhlZFJlc3BvbnNlLnN0YXR1c0NvZGUgJiZcbiAgICAgICEvXigyfDR8NSlcXGRcXGQkLy50ZXN0KGZpeGVkUmVzcG9uc2Uuc3RhdHVzQ29kZSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImBzdGF0dXNDb2RlYCBtdXN0IGJlIDJYWCwgNFhYIG9yIDVYWC5cIik7XG4gICAgfVxuXG4gICAgaWYgKGZpeGVkUmVzcG9uc2UubWVzc2FnZUJvZHkgJiYgZml4ZWRSZXNwb25zZS5tZXNzYWdlQm9keS5sZW5ndGggPiAxMDI0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJgbWVzc2FnZUJvZHlgIGNhbm5vdCBoYXZlIG1vcmUgdGhhbiAxMDI0IGNoYXJhY3RlcnMuXCIpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5wcmlvcml0eSkge1xuICAgICAgbmV3IEFwcGxpY2F0aW9uTGlzdGVuZXJSdWxlKHRoaXMsIGlkICsgXCJSdWxlXCIsIHtcbiAgICAgICAgbGlzdGVuZXI6IHRoaXMsXG4gICAgICAgIHByaW9yaXR5OiBwcm9wcy5wcmlvcml0eSxcbiAgICAgICAgZml4ZWRSZXNwb25zZSxcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXREZWZhdWx0QWN0aW9uKFxuICAgICAgICBMaXN0ZW5lckFjdGlvbi5maXhlZFJlc3BvbnNlKFRva2VuLmFzTnVtYmVyKHByb3BzLnN0YXR1c0NvZGUpLCB7XG4gICAgICAgICAgY29udGVudFR5cGU6IHByb3BzLmNvbnRlbnRUeXBlID8/IENvbnRlbnRUeXBlLlRFWFRfUExBSU4sXG4gICAgICAgICAgbWVzc2FnZUJvZHk6IHByb3BzLm1lc3NhZ2VCb2R5LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHJlZGlyZWN0IHJlc3BvbnNlXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgYWRkQWN0aW9uKClgIGluc3RlYWRcbiAgICovXG4gIHB1YmxpYyBhZGRSZWRpcmVjdFJlc3BvbnNlKGlkOiBzdHJpbmcsIHByb3BzOiBBZGRSZWRpcmVjdFJlc3BvbnNlUHJvcHMpIHtcbiAgICBjaGVja0FkZFJ1bGVQcm9wcyhwcm9wcyk7XG4gICAgY29uc3QgcmVkaXJlY3RSZXNwb25zZSA9IHtcbiAgICAgIGhvc3Q6IHByb3BzLmhvc3QsXG4gICAgICBwYXRoOiBwcm9wcy5wYXRoLFxuICAgICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICAgIHByb3RvY29sOiBwcm9wcy5wcm90b2NvbCxcbiAgICAgIHF1ZXJ5OiBwcm9wcy5xdWVyeSxcbiAgICAgIHN0YXR1c0NvZGU6IHByb3BzLnN0YXR1c0NvZGUsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE5PVEUgLSBDb3B5L3Bhc3RlZCBmcm9tIGBhcHBsaWNhdGlvbi1saXN0ZW5lci1ydWxlLnRzI3ZhbGlkYXRlUmVkaXJlY3RSZXNwb25zZWAuXG4gICAgICogVGhpcyB3YXMgcHJldmlvdXNseSBhIGRlcHJlY2F0ZWQsIGV4cG9ydGVkIGZ1bmN0aW9uLCB3aGljaCBjYXVzZWQgaXNzdWVzIHdpdGgganNpaSdzIHN0cmlwLWRlcHJlY2F0ZWQgZnVuY3Rpb25hbGl0eS5cbiAgICAgKiBJbmxpbmluZyB0aGUgZHVwbGljYXRpb24gZnVuY3Rpb25hbGl0eSBpbiB2MiBvbmx5IChmb3Igbm93KS5cbiAgICAgKi9cbiAgICBpZiAoXG4gICAgICByZWRpcmVjdFJlc3BvbnNlLnByb3RvY29sICYmXG4gICAgICAhL14oSFRUUFM/fCNcXHtwcm90b2NvbFxcfSkkL2kudGVzdChyZWRpcmVjdFJlc3BvbnNlLnByb3RvY29sKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYHByb3RvY29sYCBtdXN0IGJlIEhUVFAsIEhUVFBTLCBvciAje3Byb3RvY29sfS5cIik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIXJlZGlyZWN0UmVzcG9uc2Uuc3RhdHVzQ29kZSB8fFxuICAgICAgIS9eSFRUUF8zMFsxMl0kLy50ZXN0KHJlZGlyZWN0UmVzcG9uc2Uuc3RhdHVzQ29kZSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImBzdGF0dXNDb2RlYCBtdXN0IGJlIEhUVFBfMzAxIG9yIEhUVFBfMzAyLlwiKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMucHJpb3JpdHkpIHtcbiAgICAgIG5ldyBBcHBsaWNhdGlvbkxpc3RlbmVyUnVsZSh0aGlzLCBpZCArIFwiUnVsZVwiLCB7XG4gICAgICAgIGxpc3RlbmVyOiB0aGlzLFxuICAgICAgICBwcmlvcml0eTogcHJvcHMucHJpb3JpdHksXG4gICAgICAgIHJlZGlyZWN0UmVzcG9uc2UsXG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0RGVmYXVsdEFjdGlvbihcbiAgICAgICAgTGlzdGVuZXJBY3Rpb24ucmVkaXJlY3Qoe1xuICAgICAgICAgIGhvc3Q6IHByb3BzLmhvc3QsXG4gICAgICAgICAgcGF0aDogcHJvcHMucGF0aCxcbiAgICAgICAgICBwb3J0OiBwcm9wcy5wb3J0LFxuICAgICAgICAgIHByb3RvY29sOiBwcm9wcy5wcm90b2NvbCxcbiAgICAgICAgICBxdWVyeTogcHJvcHMucXVlcnksXG4gICAgICAgICAgcGVybWFuZW50OiBwcm9wcy5zdGF0dXNDb2RlID09PSBcIkhUVFBfMzAxXCIsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgdGhhdCBhIGNvbm5lY3RhYmxlIHRoYXQgaGFzIGJlZW4gYWRkZWQgdG8gdGhpcyBsb2FkIGJhbGFuY2VyLlxuICAgKlxuICAgKiBEb24ndCBjYWxsIHRoaXMgZGlyZWN0bHkuIEl0IGlzIGNhbGxlZCBieSBBcHBsaWNhdGlvblRhcmdldEdyb3VwLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyQ29ubmVjdGFibGUoY29ubmVjdGFibGU6IElDb25uZWN0YWJsZSwgcG9ydFJhbmdlOiBQb3J0KTogdm9pZCB7XG4gICAgY29ubmVjdGFibGUuY29ubmVjdGlvbnMuYWxsb3dGcm9tKFxuICAgICAgdGhpcy5sb2FkQmFsYW5jZXIsXG4gICAgICBwb3J0UmFuZ2UsXG4gICAgICBcIkxvYWQgYmFsYW5jZXIgdG8gdGFyZ2V0XCIsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGlzIGxpc3RlbmVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlTGlzdGVuZXIoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGVycm9ycyA9IHN1cGVyLnZhbGlkYXRlTGlzdGVuZXIoKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLnByb3RvY29sID09PSBBcHBsaWNhdGlvblByb3RvY29sLkhUVFBTICYmXG4gICAgICB0aGlzLmNlcnRpZmljYXRlQXJucy5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICBcIkhUVFBTIExpc3RlbmVyIG5lZWRzIGF0IGxlYXN0IG9uZSBjZXJ0aWZpY2F0ZSAoY2FsbCBhZGRDZXJ0aWZpY2F0ZXMpXCIsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBwZXIgZm9yIF9zZXREZWZhdWx0QWN0aW9uIHdoaWNoIGRvZXMgYSB0eXBlLXNhZmUgYmluZFxuICAgKi9cbiAgcHJpdmF0ZSBzZXREZWZhdWx0QWN0aW9uKGFjdGlvbjogTGlzdGVuZXJBY3Rpb24pIHtcbiAgICBhY3Rpb24uYmluZCh0aGlzLCB0aGlzKTtcbiAgICB0aGlzLl9zZXREZWZhdWx0QWN0aW9uKGFjdGlvbik7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIHJlZmVyZW5jZSBhbiBleGlzdGluZyBsaXN0ZW5lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIElBcHBsaWNhdGlvbkxpc3RlbmVyIGV4dGVuZHMgSUxpc3RlbmVyLCBJQ29ubmVjdGFibGUge1xuICAvKipcbiAgICogQWRkIG9uZSBvciBtb3JlIGNlcnRpZmljYXRlcyB0byB0aGlzIGxpc3RlbmVyLlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYGFkZENlcnRpZmljYXRlcygpYFxuICAgKi9cbiAgYWRkQ2VydGlmaWNhdGVBcm5zKGlkOiBzdHJpbmcsIGFybnM6IHN0cmluZ1tdKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkIG9uZSBvciBtb3JlIGNlcnRpZmljYXRlcyB0byB0aGlzIGxpc3RlbmVyLlxuICAgKi9cbiAgYWRkQ2VydGlmaWNhdGVzKGlkOiBzdHJpbmcsIGNlcnRpZmljYXRlczogSUxpc3RlbmVyQ2VydGlmaWNhdGVbXSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIExvYWQgYmFsYW5jZSBpbmNvbWluZyByZXF1ZXN0cyB0byB0aGUgZ2l2ZW4gdGFyZ2V0IGdyb3Vwcy5cbiAgICpcbiAgICogSXQncyBwb3NzaWJsZSB0byBhZGQgY29uZGl0aW9ucyB0byB0aGUgVGFyZ2V0R3JvdXBzIGFkZGVkIGluIHRoaXMgd2F5LlxuICAgKiBBdCBsZWFzdCBvbmUgVGFyZ2V0R3JvdXAgbXVzdCBiZSBhZGRlZCB3aXRob3V0IGNvbmRpdGlvbnMuXG4gICAqL1xuICBhZGRUYXJnZXRHcm91cHMoaWQ6IHN0cmluZywgcHJvcHM6IEFkZEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBzUHJvcHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBMb2FkIGJhbGFuY2UgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIGdpdmVuIGxvYWQgYmFsYW5jaW5nIHRhcmdldHMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGltcGxpY2l0bHkgY3JlYXRlcyBhbiBBcHBsaWNhdGlvblRhcmdldEdyb3VwIGZvciB0aGUgdGFyZ2V0c1xuICAgKiBpbnZvbHZlZC5cbiAgICpcbiAgICogSXQncyBwb3NzaWJsZSB0byBhZGQgY29uZGl0aW9ucyB0byB0aGUgdGFyZ2V0cyBhZGRlZCBpbiB0aGlzIHdheS4gQXQgbGVhc3RcbiAgICogb25lIHNldCBvZiB0YXJnZXRzIG11c3QgYmUgYWRkZWQgd2l0aG91dCBjb25kaXRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbmV3bHkgY3JlYXRlZCB0YXJnZXQgZ3JvdXBcbiAgICovXG4gIGFkZFRhcmdldHMoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQWRkQXBwbGljYXRpb25UYXJnZXRzUHJvcHMsXG4gICk6IEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXA7XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIHRoYXQgYSBjb25uZWN0YWJsZSB0aGF0IGhhcyBiZWVuIGFkZGVkIHRvIHRoaXMgbG9hZCBiYWxhbmNlci5cbiAgICpcbiAgICogRG9uJ3QgY2FsbCB0aGlzIGRpcmVjdGx5LiBJdCBpcyBjYWxsZWQgYnkgQXBwbGljYXRpb25UYXJnZXRHcm91cC5cbiAgICovXG4gIHJlZ2lzdGVyQ29ubmVjdGFibGUoY29ubmVjdGFibGU6IElDb25uZWN0YWJsZSwgcG9ydFJhbmdlOiBQb3J0KTogdm9pZDtcblxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgZ2l2ZW4gYWN0aW9uIG9uIGluY29taW5nIHJlcXVlc3RzXG4gICAqXG4gICAqIFRoaXMgYWxsb3dzIGZ1bGwgY29udHJvbCBvZiB0aGUgZGVmYXVsdCBhY3Rpb24gb2YgdGhlIGxvYWQgYmFsYW5jZXIsXG4gICAqIGluY2x1ZGluZyBBY3Rpb24gY2hhaW5pbmcsIGZpeGVkIHJlc3BvbnNlcyBhbmQgcmVkaXJlY3QgcmVzcG9uc2VzLiBTZWVcbiAgICogdGhlIGBMaXN0ZW5lckFjdGlvbmAgY2xhc3MgZm9yIGFsbCBvcHRpb25zLlxuICAgKlxuICAgKiBJdCdzIHBvc3NpYmxlIHRvIGFkZCByb3V0aW5nIGNvbmRpdGlvbnMgdG8gdGhlIEFjdGlvbiBhZGRlZCBpbiB0aGlzIHdheS5cbiAgICpcbiAgICogSXQgaXMgbm90IHBvc3NpYmxlIHRvIGFkZCBhIGRlZmF1bHQgYWN0aW9uIHRvIGFuIGltcG9ydGVkIElBcHBsaWNhdGlvbkxpc3RlbmVyLlxuICAgKiBJbiBvcmRlciB0byBhZGQgYWN0aW9ucyB0byBhbiBpbXBvcnRlZCBJQXBwbGljYXRpb25MaXN0ZW5lciBhIGBwcmlvcml0eWBcbiAgICogbXVzdCBiZSBwcm92aWRlZC5cbiAgICovXG4gIGFkZEFjdGlvbihpZDogc3RyaW5nLCBwcm9wczogQWRkQXBwbGljYXRpb25BY3Rpb25Qcm9wcyk6IHZvaWQ7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyB0byByZWZlcmVuY2UgYW4gZXhpc3RpbmcgbGlzdGVuZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkxpc3RlbmVyQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBBUk4gb2YgdGhlIGxpc3RlbmVyXG4gICAqL1xuICByZWFkb25seSBsaXN0ZW5lckFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cCBvZiB0aGUgbG9hZCBiYWxhbmNlciB0aGlzIGxpc3RlbmVyIGlzIGFzc29jaWF0ZWQgd2l0aFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cDogSVNlY3VyaXR5R3JvdXA7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHBvcnQgb24gd2hpY2ggdGhpcyBsaXN0ZW5lciBpcyBsaXN0ZW5pbmdcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRQb3J0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBpbXBvcnRlZCBzZWN1cml0eSBncm91cCBhbGxvd3MgYWxsIG91dGJvdW5kIHRyYWZmaWMgb3Igbm90IHdoZW5cbiAgICogaW1wb3J0ZWQgdXNpbmcgYHNlY3VyaXR5R3JvdXBJZGBcbiAgICpcbiAgICogVW5sZXNzIHNldCB0byBgZmFsc2VgLCBubyBlZ3Jlc3MgcnVsZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgc2VjdXJpdHkgZ3JvdXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGBzZWN1cml0eUdyb3VwYCBpbnN0ZWFkXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwQWxsb3dzQWxsT3V0Ym91bmQ/OiBib29sZWFuO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBFeHRlcm5hbEFwcGxpY2F0aW9uTGlzdGVuZXJcbiAgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RCYXNlXG4gIGltcGxlbWVudHMgSUFwcGxpY2F0aW9uTGlzdGVuZXJcbntcbiAgLyoqXG4gICAqIENvbm5lY3Rpb25zIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgLyoqXG4gICAqIEFSTiBvZiB0aGUgbGlzdGVuZXJcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBsaXN0ZW5lckFybjogc3RyaW5nO1xuICBwdWJsaWMgZ2V0IGxpc3RlbmVyT3V0cHV0cygpOiBMaXN0ZW5lck91dHB1dHMge1xuICAgIHJldHVybiB7XG4gICAgICBsaXN0ZW5lckFybjogdGhpcy5saXN0ZW5lckFybixcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5saXN0ZW5lck91dHB1dHM7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciB0aGF0IGEgY29ubmVjdGFibGUgdGhhdCBoYXMgYmVlbiBhZGRlZCB0byB0aGlzIGxvYWQgYmFsYW5jZXIuXG4gICAqXG4gICAqIERvbid0IGNhbGwgdGhpcyBkaXJlY3RseS4gSXQgaXMgY2FsbGVkIGJ5IEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJDb25uZWN0YWJsZShjb25uZWN0YWJsZTogSUNvbm5lY3RhYmxlLCBwb3J0UmFuZ2U6IFBvcnQpOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25zLmFsbG93VG8oY29ubmVjdGFibGUsIHBvcnRSYW5nZSwgXCJMb2FkIGJhbGFuY2VyIHRvIHRhcmdldFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgb25lIG9yIG1vcmUgY2VydGlmaWNhdGVzIHRvIHRoaXMgbGlzdGVuZXIuXG4gICAqIEBkZXByZWNhdGVkIHVzZSBgYWRkQ2VydGlmaWNhdGVzKClgXG4gICAqL1xuICBwdWJsaWMgYWRkQ2VydGlmaWNhdGVBcm5zKGlkOiBzdHJpbmcsIGFybnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5hZGRDZXJ0aWZpY2F0ZXMoaWQsIGFybnMubWFwKExpc3RlbmVyQ2VydGlmaWNhdGUuZnJvbUFybikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBvbmUgb3IgbW9yZSBjZXJ0aWZpY2F0ZXMgdG8gdGhpcyBsaXN0ZW5lci5cbiAgICovXG4gIHB1YmxpYyBhZGRDZXJ0aWZpY2F0ZXMoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBjZXJ0aWZpY2F0ZXM6IElMaXN0ZW5lckNlcnRpZmljYXRlW10sXG4gICk6IHZvaWQge1xuICAgIG5ldyBBcHBsaWNhdGlvbkxpc3RlbmVyQ2VydGlmaWNhdGUodGhpcywgaWQsIHtcbiAgICAgIGxpc3RlbmVyOiB0aGlzLFxuICAgICAgY2VydGlmaWNhdGVzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYmFsYW5jZSBpbmNvbWluZyByZXF1ZXN0cyB0byB0aGUgZ2l2ZW4gdGFyZ2V0IGdyb3Vwcy5cbiAgICpcbiAgICogSXQncyBwb3NzaWJsZSB0byBhZGQgY29uZGl0aW9ucyB0byB0aGUgVGFyZ2V0R3JvdXBzIGFkZGVkIGluIHRoaXMgd2F5LlxuICAgKiBBdCBsZWFzdCBvbmUgVGFyZ2V0R3JvdXAgbXVzdCBiZSBhZGRlZCB3aXRob3V0IGNvbmRpdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgYWRkVGFyZ2V0R3JvdXBzKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEFkZEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBzUHJvcHMsXG4gICk6IHZvaWQge1xuICAgIGNoZWNrQWRkUnVsZVByb3BzKHByb3BzKTtcblxuICAgIGlmIChwcm9wcy5wcmlvcml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBOZXcgcnVsZVxuICAgICAgbmV3IEFwcGxpY2F0aW9uTGlzdGVuZXJSdWxlKHRoaXMsIGlkLCB7XG4gICAgICAgIGxpc3RlbmVyOiB0aGlzLFxuICAgICAgICBwcmlvcml0eTogcHJvcHMucHJpb3JpdHksXG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgYWRkIGRlZmF1bHQgVGFyZ2V0IEdyb3VwcyB0byBpbXBvcnRlZCBBcHBsaWNhdGlvbkxpc3RlbmVyXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGJhbGFuY2UgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIGdpdmVuIGxvYWQgYmFsYW5jaW5nIHRhcmdldHMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGltcGxpY2l0bHkgY3JlYXRlcyBhbiBBcHBsaWNhdGlvblRhcmdldEdyb3VwIGZvciB0aGUgdGFyZ2V0c1xuICAgKiBpbnZvbHZlZC5cbiAgICpcbiAgICogSXQncyBwb3NzaWJsZSB0byBhZGQgY29uZGl0aW9ucyB0byB0aGUgdGFyZ2V0cyBhZGRlZCBpbiB0aGlzIHdheS4gQXQgbGVhc3RcbiAgICogb25lIHNldCBvZiB0YXJnZXRzIG11c3QgYmUgYWRkZWQgd2l0aG91dCBjb25kaXRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbmV3bHkgY3JlYXRlZCB0YXJnZXQgZ3JvdXBcbiAgICovXG4gIHB1YmxpYyBhZGRUYXJnZXRzKFxuICAgIF9pZDogc3RyaW5nLFxuICAgIF9wcm9wczogQWRkQXBwbGljYXRpb25UYXJnZXRzUHJvcHMsXG4gICk6IEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJDYW4gb25seSBjYWxsIGFkZFRhcmdldHMoKSB3aGVuIHVzaW5nIGEgY29uc3RydWN0ZWQgQXBwbGljYXRpb25MaXN0ZW5lcjsgY29uc3RydWN0IGEgbmV3IFRhcmdldEdyb3VwIGFuZCB1c2UgYWRkVGFyZ2V0R3JvdXAuXCIsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIHRoZSBnaXZlbiBhY3Rpb24gb24gaW5jb21pbmcgcmVxdWVzdHNcbiAgICpcbiAgICogVGhpcyBhbGxvd3MgZnVsbCBjb250cm9sIG9mIHRoZSBkZWZhdWx0IGFjdGlvbiBvZiB0aGUgbG9hZCBiYWxhbmNlcixcbiAgICogaW5jbHVkaW5nIEFjdGlvbiBjaGFpbmluZywgZml4ZWQgcmVzcG9uc2VzIGFuZCByZWRpcmVjdCByZXNwb25zZXMuIFNlZVxuICAgKiB0aGUgYExpc3RlbmVyQWN0aW9uYCBjbGFzcyBmb3IgYWxsIG9wdGlvbnMuXG4gICAqXG4gICAqIEl0J3MgcG9zc2libGUgdG8gYWRkIHJvdXRpbmcgY29uZGl0aW9ucyB0byB0aGUgQWN0aW9uIGFkZGVkIGluIHRoaXMgd2F5LlxuICAgKlxuICAgKiBJdCBpcyBub3QgcG9zc2libGUgdG8gYWRkIGEgZGVmYXVsdCBhY3Rpb24gdG8gYW4gaW1wb3J0ZWQgSUFwcGxpY2F0aW9uTGlzdGVuZXIuXG4gICAqIEluIG9yZGVyIHRvIGFkZCBhY3Rpb25zIHRvIGFuIGltcG9ydGVkIElBcHBsaWNhdGlvbkxpc3RlbmVyIGEgYHByaW9yaXR5YFxuICAgKiBtdXN0IGJlIHByb3ZpZGVkLlxuICAgKlxuICAgKiBJZiB5b3UgcHJldmlvdXNseSBkZXBsb3llZCBhIGBMaXN0ZW5lclJ1bGVgIHVzaW5nIHRoZSBgYWRkVGFyZ2V0R3JvdXBzKClgIG1ldGhvZFxuICAgKiBhbmQgbmVlZCB0byBtaWdyYXRlIHRvIHVzaW5nIHRoZSBtb3JlIGZlYXR1cmUgcmljaCBgYWRkQWN0aW9uKClgXG4gICAqIG1ldGhvZCwgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvIHNldCB0aGUgYHJlbW92ZVJ1bGVTdWZmaXhGcm9tTG9naWNhbElkOiB0cnVlYFxuICAgKiBwcm9wZXJ0eSBoZXJlIHRvIGF2b2lkIGhhdmluZyBDbG91ZEZvcm1hdGlvbiBhdHRlbXB0IHRvIHJlcGxhY2UgeW91ciByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyBhZGRBY3Rpb24oaWQ6IHN0cmluZywgcHJvcHM6IEFkZEFwcGxpY2F0aW9uQWN0aW9uUHJvcHMpOiB2b2lkIHtcbiAgICBjaGVja0FkZFJ1bGVQcm9wcyhwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMucHJpb3JpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcnVsZUlkID0gcHJvcHMucmVtb3ZlU3VmZml4ID8gaWQgOiBpZCArIFwiUnVsZVwiO1xuICAgICAgLy8gTmV3IHJ1bGVcbiAgICAgIC8vXG4gICAgICAvLyBUYXJnZXRHcm91cC5yZWdpc3Rlckxpc3RlbmVyIGlzIGNhbGxlZCBpbnNpZGUgQXBwbGljYXRpb25MaXN0ZW5lclJ1bGUuXG4gICAgICBuZXcgQXBwbGljYXRpb25MaXN0ZW5lclJ1bGUodGhpcywgcnVsZUlkLCB7XG4gICAgICAgIGxpc3RlbmVyOiB0aGlzLFxuICAgICAgICBwcmlvcml0eTogcHJvcHMucHJpb3JpdHksXG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJwcmlvcml0eSBtdXN0IGJlIHNldCBmb3IgYWN0aW9ucyBhZGRlZCB0byBhbiBpbXBvcnRlZCBsaXN0ZW5lclwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBpbXBvcnRlZCBhcHBsaWNhdGlvbiBsaXN0ZW5lci5cbiAqL1xuY2xhc3MgSW1wb3J0ZWRBcHBsaWNhdGlvbkxpc3RlbmVyIGV4dGVuZHMgRXh0ZXJuYWxBcHBsaWNhdGlvbkxpc3RlbmVyIHtcbiAgcHVibGljIHJlYWRvbmx5IGxpc3RlbmVyQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBBcHBsaWNhdGlvbkxpc3RlbmVyQXR0cmlidXRlcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMubGlzdGVuZXJBcm4gPSBwcm9wcy5saXN0ZW5lckFybjtcbiAgICBjb25zdCBkZWZhdWx0UG9ydCA9XG4gICAgICBwcm9wcy5kZWZhdWx0UG9ydCAhPT0gdW5kZWZpbmVkID8gUG9ydC50Y3AocHJvcHMuZGVmYXVsdFBvcnQpIDogdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IG5ldyBDb25uZWN0aW9ucyh7XG4gICAgICBzZWN1cml0eUdyb3VwczogW3Byb3BzLnNlY3VyaXR5R3JvdXBdLFxuICAgICAgZGVmYXVsdFBvcnQsXG4gICAgfSk7XG4gIH1cbn1cblxuLy8gVE9ETzogQWRkIEdyaWQgTG9va3VwIHN1cHBvcnRcbi8vIGNsYXNzIExvb2tlZFVwQXBwbGljYXRpb25MaXN0ZW5lciBleHRlbmRzIEV4dGVybmFsQXBwbGljYXRpb25MaXN0ZW5lciB7XG4vLyAgIHB1YmxpYyByZWFkb25seSBsaXN0ZW5lckFybjogc3RyaW5nO1xuLy8gICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuXG4vLyAgIGNvbnN0cnVjdG9yKFxuLy8gICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4vLyAgICAgaWQ6IHN0cmluZyxcbi8vICAgICBwcm9wczogY3hhcGkuTG9hZEJhbGFuY2VyTGlzdGVuZXJDb250ZXh0UmVzcG9uc2UsXG4vLyAgICkge1xuLy8gICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbi8vICAgICB0aGlzLmxpc3RlbmVyQXJuID0gcHJvcHMubGlzdGVuZXJBcm47XG4vLyAgICAgdGhpcy5jb25uZWN0aW9ucyA9IG5ldyBDb25uZWN0aW9ucyh7XG4vLyAgICAgICBkZWZhdWx0UG9ydDogUG9ydC50Y3AocHJvcHMubGlzdGVuZXJQb3J0KSxcbi8vICAgICB9KTtcblxuLy8gICAgIGZvciAoY29uc3Qgc2VjdXJpdHlHcm91cElkIG9mIHByb3BzLnNlY3VyaXR5R3JvdXBJZHMpIHtcbi8vICAgICAgIGNvbnN0IHNlY3VyaXR5R3JvdXAgPSBTZWN1cml0eUdyb3VwLmZyb21Mb29rdXBCeUlkKFxuLy8gICAgICAgICB0aGlzLFxuLy8gICAgICAgICBgU2VjdXJpdHlHcm91cC0ke3NlY3VyaXR5R3JvdXBJZH1gLFxuLy8gICAgICAgICBzZWN1cml0eUdyb3VwSWQsXG4vLyAgICAgICApO1xuLy8gICAgICAgdGhpcy5jb25uZWN0aW9ucy5hZGRTZWN1cml0eUdyb3VwKHNlY3VyaXR5R3JvdXApO1xuLy8gICAgIH1cbi8vICAgfVxuLy8gfVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGFkZGluZyBhIGNvbmRpdGlvbmFsIGxvYWQgYmFsYW5jaW5nIHJ1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRSdWxlUHJvcHMge1xuICAvKipcbiAgICogUHJpb3JpdHkgb2YgdGhpcyB0YXJnZXQgZ3JvdXBcbiAgICpcbiAgICogVGhlIHJ1bGUgd2l0aCB0aGUgbG93ZXN0IHByaW9yaXR5IHdpbGwgYmUgdXNlZCBmb3IgZXZlcnkgcmVxdWVzdC5cbiAgICogSWYgcHJpb3JpdHkgaXMgbm90IGdpdmVuLCB0aGVzZSB0YXJnZXQgZ3JvdXBzIHdpbGwgYmUgYWRkZWQgYXNcbiAgICogZGVmYXVsdHMsIGFuZCBtdXN0IG5vdCBoYXZlIGNvbmRpdGlvbnMuXG4gICAqXG4gICAqIFByaW9yaXRpZXMgbXVzdCBiZSB1bmlxdWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IFRhcmdldCBncm91cHMgYXJlIHVzZWQgYXMgZGVmYXVsdHNcbiAgICovXG4gIHJlYWRvbmx5IHByaW9yaXR5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSdWxlIGFwcGxpZXMgaWYgbWF0Y2hlcyB0aGUgY29uZGl0aW9ucy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWxhc3RpY2xvYWRiYWxhbmNpbmcvbGF0ZXN0L2FwcGxpY2F0aW9uL2xvYWQtYmFsYW5jZXItbGlzdGVuZXJzLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBjb25kaXRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZGl0aW9ucz86IExpc3RlbmVyQ29uZGl0aW9uW107XG5cbiAgLyoqXG4gICAqIFJ1bGUgYXBwbGllcyBpZiB0aGUgcmVxdWVzdGVkIGhvc3QgbWF0Y2hlcyB0aGUgaW5kaWNhdGVkIGhvc3RcbiAgICpcbiAgICogTWF5IGNvbnRhaW4gdXAgdG8gdGhyZWUgJyonIHdpbGRjYXJkcy5cbiAgICpcbiAgICogUmVxdWlyZXMgdGhhdCBwcmlvcml0eSBpcyBzZXQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2VsYXN0aWNsb2FkYmFsYW5jaW5nL2xhdGVzdC9hcHBsaWNhdGlvbi9sb2FkLWJhbGFuY2VyLWxpc3RlbmVycy5odG1sI2hvc3QtY29uZGl0aW9uc1xuICAgKlxuICAgKiBAZGVmYXVsdCBObyBob3N0IGNvbmRpdGlvblxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGNvbmRpdGlvbnNgIGluc3RlYWQuXG4gICAqL1xuICByZWFkb25seSBob3N0SGVhZGVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSdWxlIGFwcGxpZXMgaWYgdGhlIHJlcXVlc3RlZCBwYXRoIG1hdGNoZXMgdGhlIGdpdmVuIHBhdGggcGF0dGVyblxuICAgKlxuICAgKiBNYXkgY29udGFpbiB1cCB0byB0aHJlZSAnKicgd2lsZGNhcmRzLlxuICAgKlxuICAgKiBSZXF1aXJlcyB0aGF0IHByaW9yaXR5IGlzIHNldC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWxhc3RpY2xvYWRiYWxhbmNpbmcvbGF0ZXN0L2FwcGxpY2F0aW9uL2xvYWQtYmFsYW5jZXItbGlzdGVuZXJzLmh0bWwjcGF0aC1jb25kaXRpb25zXG4gICAqIEBkZWZhdWx0IE5vIHBhdGggY29uZGl0aW9uXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgY29uZGl0aW9uc2AgaW5zdGVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhQYXR0ZXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSdWxlIGFwcGxpZXMgaWYgdGhlIHJlcXVlc3RlZCBwYXRoIG1hdGNoZXMgYW55IG9mIHRoZSBnaXZlbiBwYXR0ZXJucy5cbiAgICpcbiAgICogTWF5IGNvbnRhaW4gdXAgdG8gdGhyZWUgJyonIHdpbGRjYXJkcy5cbiAgICpcbiAgICogUmVxdWlyZXMgdGhhdCBwcmlvcml0eSBpcyBzZXQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2VsYXN0aWNsb2FkYmFsYW5jaW5nL2xhdGVzdC9hcHBsaWNhdGlvbi9sb2FkLWJhbGFuY2VyLWxpc3RlbmVycy5odG1sI3BhdGgtY29uZGl0aW9uc1xuICAgKiBAZGVmYXVsdCAtIE5vIHBhdGggY29uZGl0aW9uLlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGNvbmRpdGlvbnNgIGluc3RlYWQuXG4gICAqL1xuICByZWFkb25seSBwYXRoUGF0dGVybnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhZGRpbmcgYSBuZXcgdGFyZ2V0IGdyb3VwIHRvIGEgbGlzdGVuZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRBcHBsaWNhdGlvblRhcmdldEdyb3Vwc1Byb3BzIGV4dGVuZHMgQWRkUnVsZVByb3BzIHtcbiAgLyoqXG4gICAqIFRhcmdldCBncm91cHMgdG8gZm9yd2FyZCByZXF1ZXN0cyB0b1xuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0R3JvdXBzOiBJQXBwbGljYXRpb25UYXJnZXRHcm91cFtdO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGFkZGluZyBhIG5ldyBhY3Rpb24gdG8gYSBsaXN0ZW5lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZEFwcGxpY2F0aW9uQWN0aW9uUHJvcHMgZXh0ZW5kcyBBZGRSdWxlUHJvcHMge1xuICAvKipcbiAgICogQWN0aW9uIHRvIHBlcmZvcm1cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbjogTGlzdGVuZXJBY3Rpb247XG4gIC8qKlxuICAgKiBgTGlzdGVuZXJSdWxlYHMgaGF2ZSBhIGBSdWxlYCBzdWZmaXggb24gdGhlaXIgbG9naWNhbElkIGJ5IGRlZmF1bHQuIFRoaXMgYWxsb3dzIHlvdSB0byByZW1vdmUgdGhhdCBzdWZmaXguXG4gICAqXG4gICAqIExlZ2FjeSBiZWhhdmlvciBvZiB0aGUgYGFkZFRhcmdldEdyb3VwcygpYCBjb252ZW5pZW5jZSBtZXRob2QgZGlkIG5vdCBpbmNsdWRlIHRoZSBgUnVsZWAgc3VmZml4IG9uIHRoZSBsb2dpY2FsSWQgb2YgdGhlIGdlbmVyYXRlZCBgTGlzdGVuZXJSdWxlYC5cbiAgICogQXQgc29tZSBwb2ludCwgaW5jcmVhc2luZyBjb21wbGV4aXR5IG9mIHJlcXVpcmVtZW50cyBjYW4gcmVxdWlyZSB1c2VycyB0byBzd2l0Y2ggZnJvbSB0aGUgYGFkZFRhcmdldEdyb3VwcygpYCBtZXRob2RcbiAgICogdG8gdGhlIGBhZGRBY3Rpb24oKWAgbWV0aG9kLlxuICAgKiBXaGVuIG1pZ3JhdGluZyBgTGlzdGVuZXJSdWxlYHMgZGVwbG95ZWQgYnkgYSBsZWdhY3kgdmVyc2lvbiBvZiBgYWRkVGFyZ2V0R3JvdXBzKClgLFxuICAgKiB5b3Ugd2lsbCBuZWVkIHRvIGVuYWJsZSB0aGlzIGZsYWcgdG8gYXZvaWQgY2hhbmdpbmcgdGhlIGxvZ2ljYWxJZCBvZiB5b3VyIHJlc291cmNlLlxuICAgKiBPdGhlcndpc2UgQ2ZuIHdpbGwgYXR0ZW1wdCB0byByZXBsYWNlIHRoZSBgTGlzdGVuZXJSdWxlYCBhbmQgZmFpbC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2Ugc3RhbmRhcmQgbG9naWNhbElkIHdpdGggdGhlIGBSdWxlYCBzdWZmaXhcbiAgICovXG4gIHJlYWRvbmx5IHJlbW92ZVN1ZmZpeD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYWRkaW5nIG5ldyB0YXJnZXRzIHRvIGEgbGlzdGVuZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRBcHBsaWNhdGlvblRhcmdldHNQcm9wcyBleHRlbmRzIEFkZFJ1bGVQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgcHJvdG9jb2wgdG8gdXNlXG4gICAqXG4gICAqIEBkZWZhdWx0IERldGVybWluZWQgZnJvbSBwb3J0IGlmIGtub3duXG4gICAqL1xuICByZWFkb25seSBwcm90b2NvbD86IEFwcGxpY2F0aW9uUHJvdG9jb2w7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm90b2NvbCB2ZXJzaW9uIHRvIHVzZVxuICAgKlxuICAgKiBAZGVmYXVsdCBBcHBsaWNhdGlvblByb3RvY29sVmVyc2lvbi5IVFRQMVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2xWZXJzaW9uPzogQXBwbGljYXRpb25Qcm90b2NvbFZlcnNpb247XG5cbiAgLyoqXG4gICAqIFRoZSBwb3J0IG9uIHdoaWNoIHRoZSBsaXN0ZW5lciBsaXN0ZW5zIGZvciByZXF1ZXN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgRGV0ZXJtaW5lZCBmcm9tIHByb3RvY29sIGlmIGtub3duXG4gICAqL1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZSBwZXJpb2QgZHVyaW5nIHdoaWNoIHRoZSBsb2FkIGJhbGFuY2VyIHNlbmRzIGEgbmV3bHkgcmVnaXN0ZXJlZFxuICAgKiB0YXJnZXQgYSBsaW5lYXJseSBpbmNyZWFzaW5nIHNoYXJlIG9mIHRoZSB0cmFmZmljIHRvIHRoZSB0YXJnZXQgZ3JvdXAuXG4gICAqXG4gICAqIFRoZSByYW5nZSBpcyAzMC05MDAgc2Vjb25kcyAoMTUgbWludXRlcykuXG4gICAqXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHJlYWRvbmx5IHNsb3dTdGFydD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RpY2tpbmVzcyBjb29raWUgZXhwaXJhdGlvbiBwZXJpb2QuXG4gICAqXG4gICAqIFNldHRpbmcgdGhpcyB2YWx1ZSBlbmFibGVzIGxvYWQgYmFsYW5jZXIgc3RpY2tpbmVzcy5cbiAgICpcbiAgICogQWZ0ZXIgdGhpcyBwZXJpb2QsIHRoZSBjb29raWUgaXMgY29uc2lkZXJlZCBzdGFsZS4gVGhlIG1pbmltdW0gdmFsdWUgaXNcbiAgICogMSBzZWNvbmQgYW5kIHRoZSBtYXhpbXVtIHZhbHVlIGlzIDcgZGF5cyAoNjA0ODAwIHNlY29uZHMpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBTdGlja2luZXNzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBzdGlja2luZXNzQ29va2llRHVyYXRpb24/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgYW4gYXBwbGljYXRpb24tYmFzZWQgc3RpY2tpbmVzcyBjb29raWUuXG4gICAqXG4gICAqIE5hbWVzIHRoYXQgc3RhcnQgd2l0aCB0aGUgZm9sbG93aW5nIHByZWZpeGVzIGFyZSBub3QgYWxsb3dlZDogQVdTQUxCLCBBV1NBTEJBUFAsXG4gICAqIGFuZCBBV1NBTEJURzsgdGhleSdyZSByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZSBsb2FkIGJhbGFuY2VyLlxuICAgKlxuICAgKiBOb3RlOiBgc3RpY2tpbmVzc0Nvb2tpZU5hbWVgIHBhcmFtZXRlciBkZXBlbmRzIG9uIHRoZSBwcmVzZW5jZSBvZiBgc3RpY2tpbmVzc0Nvb2tpZUR1cmF0aW9uYCBwYXJhbWV0ZXIuXG4gICAqIElmIGBzdGlja2luZXNzQ29va2llRHVyYXRpb25gIGlzIG5vdCBzZXQsIGBzdGlja2luZXNzQ29va2llTmFtZWAgd2lsbCBiZSBvbWl0dGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIGBzdGlja2luZXNzQ29va2llRHVyYXRpb25gIGlzIHNldCwgYSBsb2FkLWJhbGFuY2VyIGdlbmVyYXRlZCBjb29raWUgaXMgdXNlZC4gT3RoZXJ3aXNlLCBubyBzdGlja2luZXNzIGlzIGRlZmluZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2VsYXN0aWNsb2FkYmFsYW5jaW5nL2xhdGVzdC9hcHBsaWNhdGlvbi9zdGlja3ktc2Vzc2lvbnMuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgc3RpY2tpbmVzc0Nvb2tpZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0YXJnZXRzIHRvIGFkZCB0byB0aGlzIHRhcmdldCBncm91cC5cbiAgICpcbiAgICogQ2FuIGJlIGBJbnN0YW5jZWAsIGBJUEFkZHJlc3NgLCBvciBhbnkgc2VsZi1yZWdpc3RlcmluZyBsb2FkIGJhbGFuY2luZ1xuICAgKiB0YXJnZXQuIEFsbCB0YXJnZXQgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0cz86IElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlclRhcmdldFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdGFyZ2V0IGdyb3VwLlxuICAgKlxuICAgKiBUaGlzIG5hbWUgbXVzdCBiZSB1bmlxdWUgcGVyIHJlZ2lvbiBwZXIgYWNjb3VudCwgY2FuIGhhdmUgYSBtYXhpbXVtIG9mXG4gICAqIDMyIGNoYXJhY3RlcnMsIG11c3QgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yIGh5cGhlbnMsIGFuZFxuICAgKiBtdXN0IG5vdCBiZWdpbiBvciBlbmQgd2l0aCBhIGh5cGhlbi5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0b21hdGljYWxseSBnZW5lcmF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEdyb3VwTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiB0aW1lIGZvciBFbGFzdGljIExvYWQgQmFsYW5jaW5nIHRvIHdhaXQgYmVmb3JlIGRlcmVnaXN0ZXJpbmcgYSB0YXJnZXQuXG4gICAqXG4gICAqIFRoZSByYW5nZSBpcyAwLTM2MDAgc2Vjb25kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24ubWludXRlcyg1KVxuICAgKi9cbiAgcmVhZG9ubHkgZGVyZWdpc3RyYXRpb25EZWxheT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBIZWFsdGggY2hlY2sgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIHByb3BlcnR5IGluIHRoaXMgY29uZmlndXJhdGlvbiB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjItdGFyZ2V0Z3JvdXAuaHRtbCNhd3MtcmVzb3VyY2UtZWxhc3RpY2xvYWRiYWxhbmNpbmd2Mi10YXJnZXRncm91cC1wcm9wZXJ0aWVzXG4gICAqL1xuICByZWFkb25seSBoZWFsdGhDaGVjaz86IEhlYWx0aENoZWNrO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9hZCBiYWxhbmNpbmcgYWxnb3JpdGhtIHRvIHNlbGVjdCB0YXJnZXRzIGZvciByb3V0aW5nIHJlcXVlc3RzLlxuICAgKlxuICAgKiBAZGVmYXVsdCByb3VuZF9yb2Jpbi5cbiAgICovXG4gIHJlYWRvbmx5IGxvYWRCYWxhbmNpbmdBbGdvcml0aG1UeXBlPzogVGFyZ2V0R3JvdXBMb2FkQmFsYW5jaW5nQWxnb3JpdGhtVHlwZTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW5vbWFseSBtaXRpZ2F0aW9uIGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIE9ubHkgYXZhaWxhYmxlIHdoZW4gYGxvYWRCYWxhbmNpbmdBbGdvcml0aG1UeXBlYCBpcyBgVGFyZ2V0R3JvdXBMb2FkQmFsYW5jaW5nQWxnb3JpdGhtVHlwZS5XRUlHSFRFRF9SQU5ET01gXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2VsYXN0aWNsb2FkYmFsYW5jaW5nL2xhdGVzdC9hcHBsaWNhdGlvbi9sb2FkLWJhbGFuY2VyLXRhcmdldC1ncm91cHMuaHRtbCNhdXRvbWF0aWMtdGFyZ2V0LXdlaWdodHNcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUFub21hbHlNaXRpZ2F0aW9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhZGRpbmcgYSBmaXhlZCByZXNwb25zZSB0byBhIGxpc3RlbmVyXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBBcHBsaWNhdGlvbkxpc3RlbmVyLmFkZEFjdGlvbmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRGaXhlZFJlc3BvbnNlUHJvcHMgZXh0ZW5kcyBBZGRSdWxlUHJvcHMsIEZpeGVkUmVzcG9uc2Uge31cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhZGRpbmcgYSByZWRpcmVjdCByZXNwb25zZSB0byBhIGxpc3RlbmVyXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBBcHBsaWNhdGlvbkxpc3RlbmVyLmFkZEFjdGlvbmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRSZWRpcmVjdFJlc3BvbnNlUHJvcHNcbiAgZXh0ZW5kcyBBZGRSdWxlUHJvcHMsXG4gICAgUmVkaXJlY3RSZXNwb25zZSB7fVxuXG5mdW5jdGlvbiBjaGVja0FkZFJ1bGVQcm9wcyhwcm9wczogQWRkUnVsZVByb3BzKSB7XG4gIGNvbnN0IGNvbmRpdGlvbnNDb3VudCA9IHByb3BzLmNvbmRpdGlvbnM/Lmxlbmd0aCB8fCAwO1xuICBjb25zdCBoYXNBbnlDb25kaXRpb25zID1cbiAgICBjb25kaXRpb25zQ291bnQgIT09IDAgfHxcbiAgICBwcm9wcy5ob3N0SGVhZGVyICE9PSB1bmRlZmluZWQgfHxcbiAgICBwcm9wcy5wYXRoUGF0dGVybiAhPT0gdW5kZWZpbmVkIHx8XG4gICAgcHJvcHMucGF0aFBhdHRlcm5zICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IGhhc1ByaW9yaXR5ID0gcHJvcHMucHJpb3JpdHkgIT09IHVuZGVmaW5lZDtcbiAgaWYgKGhhc0FueUNvbmRpdGlvbnMgIT09IGhhc1ByaW9yaXR5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJTZXR0aW5nICdjb25kaXRpb25zJywgJ3BhdGhQYXR0ZXJuJyBvciAnaG9zdEhlYWRlcicgYWxzbyByZXF1aXJlcyAncHJpb3JpdHknLCBhbmQgdmljZSB2ZXJzYVwiLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVNdXR1YWxBdXRoZW50aWNhdGlvbihcbiAgbXV0dWFsQXV0aGVudGljYXRpb24/OiBNdXR1YWxBdXRoZW50aWNhdGlvbixcbik6IHZvaWQge1xuICBpZiAoIW11dHVhbEF1dGhlbnRpY2F0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY3VycmVudE1vZGUgPSBtdXR1YWxBdXRoZW50aWNhdGlvbi5tdXR1YWxBdXRoZW50aWNhdGlvbk1vZGU7XG5cbiAgaWYgKGN1cnJlbnRNb2RlID09PSBNdXR1YWxBdXRoZW50aWNhdGlvbk1vZGUuVkVSSUZZKSB7XG4gICAgaWYgKCFtdXR1YWxBdXRoZW50aWNhdGlvbi50cnVzdFN0b3JlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBZb3UgbXVzdCBzZXQgJ3RydXN0U3RvcmUnIHdoZW4gJ21vZGUnIGlzICcke011dHVhbEF1dGhlbnRpY2F0aW9uTW9kZS5WRVJJRll9J2AsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcbiAgICBjdXJyZW50TW9kZSA9PT0gTXV0dWFsQXV0aGVudGljYXRpb25Nb2RlLk9GRiB8fFxuICAgIGN1cnJlbnRNb2RlID09PSBNdXR1YWxBdXRoZW50aWNhdGlvbk1vZGUuUEFTU19USFJPVUdIXG4gICkge1xuICAgIGlmIChtdXR1YWxBdXRoZW50aWNhdGlvbi50cnVzdFN0b3JlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBZb3UgY2Fubm90IHNldCAndHJ1c3RTdG9yZScgd2hlbiAnbW9kZScgaXMgJyR7TXV0dWFsQXV0aGVudGljYXRpb25Nb2RlLk9GRn0nIG9yICcke011dHVhbEF1dGhlbnRpY2F0aW9uTW9kZS5QQVNTX1RIUk9VR0h9J2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtdXR1YWxBdXRoZW50aWNhdGlvbi5pZ25vcmVDbGllbnRDZXJ0aWZpY2F0ZUV4cGlyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBZb3UgY2Fubm90IHNldCAnaWdub3JlQ2xpZW50Q2VydGlmaWNhdGVFeHBpcnknIHdoZW4gJ21vZGUnIGlzICcke011dHVhbEF1dGhlbnRpY2F0aW9uTW9kZS5PRkZ9JyBvciAnJHtNdXR1YWxBdXRoZW50aWNhdGlvbk1vZGUuUEFTU19USFJPVUdIfSdgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==