terraconstructs 0.0.25 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. package/.jsii +83939 -55116
  2. package/.mise.toml +2 -2
  3. package/.nvmrc +1 -1
  4. package/LICENSE +202 -674
  5. package/go.mod +1 -1
  6. package/go.sum +2 -2
  7. package/lib/asset-manager.d.ts +23 -0
  8. package/lib/asset-manager.js +3 -0
  9. package/lib/asset-staging.d.ts +178 -0
  10. package/lib/asset-staging.js +589 -0
  11. package/lib/assets.d.ts +359 -0
  12. package/lib/assets.js +55 -0
  13. package/lib/aws/arn.js +16 -15
  14. package/lib/aws/aws-asset-manager.d.ts +91 -0
  15. package/lib/aws/aws-asset-manager.js +244 -0
  16. package/lib/aws/aws-construct.js +1 -1
  17. package/lib/aws/aws-stack.d.ts +37 -0
  18. package/lib/aws/aws-stack.js +30 -9
  19. package/lib/aws/aws-tags.js +2 -2
  20. package/lib/aws/cloudwatch/actions/appscaling.d.ts +15 -0
  21. package/lib/aws/cloudwatch/actions/appscaling.js +24 -0
  22. package/lib/aws/cloudwatch/actions/ec2.js +1 -1
  23. package/lib/aws/cloudwatch/actions/index.d.ts +3 -0
  24. package/lib/aws/cloudwatch/actions/index.js +4 -4
  25. package/lib/aws/cloudwatch/actions/lambda.js +1 -1
  26. package/lib/aws/cloudwatch/actions/sns.d.ts +14 -0
  27. package/lib/aws/cloudwatch/actions/sns.js +23 -0
  28. package/lib/aws/cloudwatch/actions/ssm.d.ts +72 -0
  29. package/lib/aws/cloudwatch/actions/ssm.js +104 -0
  30. package/lib/aws/cloudwatch/alarm-base.js +1 -1
  31. package/lib/aws/cloudwatch/alarm-rule.js +1 -1
  32. package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
  33. package/lib/aws/cloudwatch/alarm.js +1 -1
  34. package/lib/aws/cloudwatch/composite-alarm.js +1 -1
  35. package/lib/aws/cloudwatch/dashboard.js +1 -1
  36. package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
  37. package/lib/aws/cloudwatch/graph.js +8 -8
  38. package/lib/aws/cloudwatch/layout.js +3 -3
  39. package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
  40. package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
  41. package/lib/aws/cloudwatch/log-group.js +1 -1
  42. package/lib/aws/cloudwatch/log-query.js +1 -1
  43. package/lib/aws/cloudwatch/log-stream.js +1 -1
  44. package/lib/aws/cloudwatch/metric-filter.js +1 -1
  45. package/lib/aws/cloudwatch/metric.js +2 -2
  46. package/lib/aws/cloudwatch/pattern.js +3 -3
  47. package/lib/aws/cloudwatch/policy.js +1 -1
  48. package/lib/aws/cloudwatch/query-definition.js +2 -2
  49. package/lib/aws/cloudwatch/stats.js +1 -1
  50. package/lib/aws/cloudwatch/subscription-filter.js +1 -1
  51. package/lib/aws/cloudwatch/text.js +1 -1
  52. package/lib/aws/cloudwatch/variable.js +3 -3
  53. package/lib/aws/cloudwatch/widget.js +1 -1
  54. package/lib/aws/compute/access-log.d.ts +478 -0
  55. package/lib/aws/compute/access-log.js +649 -0
  56. package/lib/aws/compute/activity.js +1 -1
  57. package/lib/aws/compute/alb/application-listener-action.js +1 -1
  58. package/lib/aws/compute/alb/application-listener-certificate.js +1 -1
  59. package/lib/aws/compute/alb/application-listener-rule.js +1 -1
  60. package/lib/aws/compute/alb/application-listener.js +1 -1
  61. package/lib/aws/compute/alb/application-load-balancer.js +1 -1
  62. package/lib/aws/compute/alb/application-target-group.js +1 -1
  63. package/lib/aws/compute/alb/conditions.js +1 -1
  64. package/lib/aws/compute/alb/trust-store-revocation.js +1 -1
  65. package/lib/aws/compute/alb/trust-store.js +1 -1
  66. package/lib/aws/compute/api-definition.d.ts +106 -0
  67. package/lib/aws/compute/api-definition.js +200 -0
  68. package/lib/aws/compute/api-key.d.ts +184 -0
  69. package/lib/aws/compute/api-key.js +197 -0
  70. package/lib/aws/compute/apigateway-canned-metrics.generated.d.ts +169 -0
  71. package/lib/aws/compute/apigateway-canned-metrics.generated.js +63 -0
  72. package/lib/aws/compute/apigateway-util.d.ts +31 -0
  73. package/lib/aws/compute/apigateway-util.js +152 -0
  74. package/lib/aws/compute/architecture.js +1 -1
  75. package/lib/aws/compute/aspects/require-imdsv2-aspect.js +2 -2
  76. package/lib/aws/compute/authorizer.d.ts +35 -0
  77. package/lib/aws/compute/authorizer.js +28 -0
  78. package/lib/aws/compute/authorizers/identity-source.d.ts +37 -0
  79. package/lib/aws/compute/authorizers/identity-source.js +61 -0
  80. package/lib/aws/compute/authorizers/index.d.ts +2 -0
  81. package/lib/aws/compute/authorizers/index.js +20 -0
  82. package/lib/aws/compute/authorizers/lambda.d.ts +140 -0
  83. package/lib/aws/compute/authorizers/lambda.js +208 -0
  84. package/lib/aws/compute/base-path-mapping.d.ts +49 -0
  85. package/lib/aws/compute/base-path-mapping.js +52 -0
  86. package/lib/aws/compute/base-scalable-attribute.js +3 -3
  87. package/lib/aws/compute/bastion-host.js +1 -1
  88. package/lib/aws/compute/chain.js +1 -1
  89. package/lib/aws/compute/client-vpn-authorization-rule.js +1 -1
  90. package/lib/aws/compute/client-vpn-endpoint.js +2 -2
  91. package/lib/aws/compute/client-vpn-route.js +2 -2
  92. package/lib/aws/compute/code.d.ts +415 -0
  93. package/lib/aws/compute/code.js +424 -0
  94. package/lib/aws/compute/condition.js +1 -1
  95. package/lib/aws/compute/connections.js +1 -1
  96. package/lib/aws/compute/cors.d.ts +102 -0
  97. package/lib/aws/compute/cors.js +33 -0
  98. package/lib/aws/compute/deployment.d.ts +83 -0
  99. package/lib/aws/compute/deployment.js +158 -0
  100. package/lib/aws/compute/domain-name.d.ts +153 -0
  101. package/lib/aws/compute/domain-name.js +158 -0
  102. package/lib/aws/compute/event-invoke-config.d.ts +2 -2
  103. package/lib/aws/compute/event-invoke-config.js +4 -4
  104. package/lib/aws/compute/event-source-filter.js +2 -2
  105. package/lib/aws/compute/event-source-mapping.d.ts +2 -2
  106. package/lib/aws/compute/event-source-mapping.js +9 -7
  107. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
  108. package/lib/aws/compute/event-sources/s3.js +1 -1
  109. package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
  110. package/lib/aws/compute/event-sources/sqs.js +3 -2
  111. package/lib/aws/compute/fields.js +4 -4
  112. package/lib/aws/compute/function-alias.d.ts +2 -0
  113. package/lib/aws/compute/function-alias.js +14 -2
  114. package/lib/aws/compute/function-base.d.ts +23 -0
  115. package/lib/aws/compute/function-base.js +4 -4
  116. package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
  117. package/lib/aws/compute/function-destinations/function.js +1 -1
  118. package/lib/aws/compute/function-destinations/sqs.js +1 -1
  119. package/lib/aws/compute/function-nodejs/bundling.d.ts +75 -0
  120. package/lib/aws/compute/function-nodejs/bundling.js +405 -0
  121. package/lib/aws/compute/function-nodejs/function.d.ts +99 -0
  122. package/lib/aws/compute/function-nodejs/function.js +175 -0
  123. package/lib/aws/compute/function-nodejs/index.d.ts +2 -0
  124. package/lib/aws/compute/function-nodejs/index.js +19 -0
  125. package/lib/aws/compute/function-nodejs/package-installation.d.ts +8 -0
  126. package/lib/aws/compute/function-nodejs/package-installation.js +36 -0
  127. package/lib/aws/compute/function-nodejs/package-manager.d.ts +33 -0
  128. package/lib/aws/compute/function-nodejs/package-manager.js +99 -0
  129. package/lib/aws/compute/function-nodejs/types.d.ts +410 -0
  130. package/lib/aws/compute/function-nodejs/types.js +81 -0
  131. package/lib/aws/compute/function-nodejs/util.d.ts +60 -0
  132. package/lib/aws/compute/function-nodejs/util.js +202 -0
  133. package/lib/aws/compute/function-url.d.ts +2 -2
  134. package/lib/aws/compute/function-url.js +4 -4
  135. package/lib/aws/compute/function.d.ts +43 -5
  136. package/lib/aws/compute/function.js +106 -18
  137. package/lib/aws/compute/gateway-response.d.ts +157 -0
  138. package/lib/aws/compute/gateway-response.js +156 -0
  139. package/lib/aws/compute/handler.d.ts +10 -0
  140. package/lib/aws/compute/handler.js +20 -0
  141. package/lib/aws/compute/index.d.ts +27 -0
  142. package/lib/aws/compute/index.js +29 -1
  143. package/lib/aws/compute/instance-types.js +1 -1
  144. package/lib/aws/compute/instance.js +1 -1
  145. package/lib/aws/compute/integration.d.ts +311 -0
  146. package/lib/aws/compute/integration.js +165 -0
  147. package/lib/aws/compute/integrations/aws.d.ts +72 -0
  148. package/lib/aws/compute/integrations/aws.js +55 -0
  149. package/lib/aws/compute/integrations/http.d.ts +37 -0
  150. package/lib/aws/compute/integrations/http.js +35 -0
  151. package/lib/aws/compute/integrations/index.d.ts +6 -0
  152. package/lib/aws/compute/integrations/index.js +24 -0
  153. package/lib/aws/compute/integrations/lambda.d.ts +40 -0
  154. package/lib/aws/compute/integrations/lambda.js +73 -0
  155. package/lib/aws/compute/integrations/mock.d.ts +16 -0
  156. package/lib/aws/compute/integrations/mock.js +30 -0
  157. package/lib/aws/compute/integrations/request-context.d.ts +144 -0
  158. package/lib/aws/compute/integrations/request-context.js +3 -0
  159. package/lib/aws/compute/integrations/stepfunctions.d.ts +102 -0
  160. package/lib/aws/compute/integrations/stepfunctions.js +268 -0
  161. package/lib/aws/compute/ip-addresses.js +2 -2
  162. package/lib/aws/compute/ipam.js +1 -1
  163. package/lib/aws/compute/json-schema.d.ts +75 -0
  164. package/lib/aws/compute/json-schema.js +23 -0
  165. package/lib/aws/compute/key-pair.js +1 -1
  166. package/lib/aws/compute/lambda-api.d.ts +46 -0
  167. package/lib/aws/compute/lambda-api.js +64 -0
  168. package/lib/aws/compute/launch-template.js +2 -2
  169. package/lib/aws/compute/lb-shared/base-listener.js +1 -1
  170. package/lib/aws/compute/lb-shared/base-load-balancer.js +2 -2
  171. package/lib/aws/compute/lb-shared/base-target-group.js +1 -1
  172. package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
  173. package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
  174. package/lib/aws/compute/lb-targets/alb-target.js +3 -3
  175. package/lib/aws/compute/lb-targets/instance-target.js +2 -2
  176. package/lib/aws/compute/lb-targets/ip-target.js +1 -1
  177. package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
  178. package/lib/aws/compute/load-balancer.js +3 -3
  179. package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
  180. package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
  181. package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
  182. package/lib/aws/compute/machine-image/common.js +1 -1
  183. package/lib/aws/compute/machine-image/machine-image.js +8 -8
  184. package/lib/aws/compute/method.d.ts +219 -0
  185. package/lib/aws/compute/method.js +396 -0
  186. package/lib/aws/compute/methodresponse.d.ts +28 -0
  187. package/lib/aws/compute/methodresponse.js +3 -0
  188. package/lib/aws/compute/model.d.ts +143 -0
  189. package/lib/aws/compute/model.js +141 -0
  190. package/lib/aws/compute/nat.js +5 -5
  191. package/lib/aws/compute/network-acl-types.js +2 -2
  192. package/lib/aws/compute/network-acl.js +3 -3
  193. package/lib/aws/compute/nlb/network-listener-action.js +1 -1
  194. package/lib/aws/compute/nlb/network-listener.js +1 -1
  195. package/lib/aws/compute/nlb/network-load-balancer.js +1 -1
  196. package/lib/aws/compute/nlb/network-target-group.js +1 -1
  197. package/lib/aws/compute/peer.js +1 -1
  198. package/lib/aws/compute/placement-group.js +1 -1
  199. package/lib/aws/compute/port.js +1 -1
  200. package/lib/aws/compute/prefix-list.js +1 -1
  201. package/lib/aws/compute/requestvalidator.d.ts +50 -0
  202. package/lib/aws/compute/requestvalidator.js +59 -0
  203. package/lib/aws/compute/resource.d.ts +223 -0
  204. package/lib/aws/compute/resource.js +316 -0
  205. package/lib/aws/compute/restapi.d.ts +510 -0
  206. package/lib/aws/compute/restapi.js +626 -0
  207. package/lib/aws/compute/route.js +8 -8
  208. package/lib/aws/compute/runtime.d.ts +282 -0
  209. package/lib/aws/compute/runtime.js +337 -0
  210. package/lib/aws/compute/scalable-target.js +3 -3
  211. package/lib/aws/compute/schedule.js +3 -3
  212. package/lib/aws/compute/security-group.js +1 -1
  213. package/lib/aws/compute/stage.d.ts +350 -0
  214. package/lib/aws/compute/stage.js +304 -0
  215. package/lib/aws/compute/state-graph.js +1 -1
  216. package/lib/aws/compute/state-machine-fragment.js +1 -1
  217. package/lib/aws/compute/state-machine.js +4 -4
  218. package/lib/aws/compute/states/choice.js +1 -1
  219. package/lib/aws/compute/states/custom-state.js +1 -1
  220. package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
  221. package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
  222. package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
  223. package/lib/aws/compute/states/distributed-map.js +1 -1
  224. package/lib/aws/compute/states/fail.js +1 -1
  225. package/lib/aws/compute/states/map-base.js +1 -1
  226. package/lib/aws/compute/states/map.js +1 -1
  227. package/lib/aws/compute/states/parallel.js +1 -1
  228. package/lib/aws/compute/states/pass.js +2 -2
  229. package/lib/aws/compute/states/state.js +1 -1
  230. package/lib/aws/compute/states/succeed.js +1 -1
  231. package/lib/aws/compute/states/task-base.js +2 -2
  232. package/lib/aws/compute/states/task.js +1 -1
  233. package/lib/aws/compute/states/wait.js +2 -2
  234. package/lib/aws/compute/step-scaling-action.js +3 -3
  235. package/lib/aws/compute/step-scaling-policy.js +1 -1
  236. package/lib/aws/compute/stepfunctions-api.d.ts +103 -0
  237. package/lib/aws/compute/stepfunctions-api.js +39 -0
  238. package/lib/aws/compute/subnet-v2.js +2 -2
  239. package/lib/aws/compute/subnet.js +1 -1
  240. package/lib/aws/compute/target-tracking-scaling-policy.js +3 -3
  241. package/lib/aws/compute/task-credentials.js +1 -1
  242. package/lib/aws/compute/task-input.js +1 -1
  243. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
  244. package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
  245. package/lib/aws/compute/tasks/http/invoke.js +1 -1
  246. package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
  247. package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
  248. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
  249. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
  250. package/lib/aws/compute/types.js +1 -1
  251. package/lib/aws/compute/usage-plan.d.ts +194 -0
  252. package/lib/aws/compute/usage-plan.js +174 -0
  253. package/lib/aws/compute/user-data.js +3 -3
  254. package/lib/aws/compute/volume.js +2 -2
  255. package/lib/aws/compute/vpc-endpoint-service.js +1 -1
  256. package/lib/aws/compute/vpc-endpoint.js +6 -6
  257. package/lib/aws/compute/vpc-flow-logs.js +4 -4
  258. package/lib/aws/compute/vpc-link.d.ts +104 -0
  259. package/lib/aws/compute/vpc-link.js +137 -0
  260. package/lib/aws/compute/vpc-v2-base.js +1 -1
  261. package/lib/aws/compute/vpc-v2.js +2 -2
  262. package/lib/aws/compute/vpc.js +4 -4
  263. package/lib/aws/compute/vpn.js +3 -3
  264. package/lib/aws/edge/certificate.js +1 -1
  265. package/lib/aws/edge/distribution.js +3 -3
  266. package/lib/aws/edge/dns-alias-record-targets.js +3 -3
  267. package/lib/aws/edge/dns-record.js +13 -13
  268. package/lib/aws/edge/dns-zone.js +1 -1
  269. package/lib/aws/edge/function.js +2 -2
  270. package/lib/aws/edge/key-value-store.js +4 -4
  271. package/lib/aws/edge/origin.js +3 -3
  272. package/lib/aws/edge/response-headers-policy.js +1 -1
  273. package/lib/aws/encryption/alias.js +1 -1
  274. package/lib/aws/encryption/key.js +1 -1
  275. package/lib/aws/encryption/via-service-principal.js +1 -1
  276. package/lib/aws/iam/grant.js +2 -2
  277. package/lib/aws/iam/group.js +1 -1
  278. package/lib/aws/iam/instance-profile.js +1 -1
  279. package/lib/aws/iam/managed-policy.js +1 -1
  280. package/lib/aws/iam/oidc-provider.js +1 -1
  281. package/lib/aws/iam/policy-document.js +1 -1
  282. package/lib/aws/iam/policy-statement.js +1 -1
  283. package/lib/aws/iam/policy.js +1 -1
  284. package/lib/aws/iam/principals.js +20 -20
  285. package/lib/aws/iam/role.js +1 -1
  286. package/lib/aws/iam/saml-provider.js +2 -2
  287. package/lib/aws/iam/unknown-principal.js +1 -1
  288. package/lib/aws/iam/user.js +5 -5
  289. package/lib/aws/index.d.ts +1 -0
  290. package/lib/aws/index.js +4 -1
  291. package/lib/aws/network/simple-ipv4-vpc.js +1 -1
  292. package/lib/aws/network/subnet-group.js +3 -3
  293. package/lib/aws/network/subnet.js +4 -4
  294. package/lib/aws/notify/archive.js +1 -1
  295. package/lib/aws/notify/connection.js +3 -3
  296. package/lib/aws/notify/event-bus.js +3 -3
  297. package/lib/aws/notify/event-pattern.js +1 -1
  298. package/lib/aws/notify/input.js +2 -2
  299. package/lib/aws/notify/kinesis-stream.js +1 -1
  300. package/lib/aws/notify/notification-rule.d.ts +1 -1
  301. package/lib/aws/notify/notification-rule.js +5 -5
  302. package/lib/aws/notify/policy.js +1 -1
  303. package/lib/aws/notify/queue-policy.js +1 -1
  304. package/lib/aws/notify/queue.js +1 -1
  305. package/lib/aws/notify/resource-policy.js +1 -1
  306. package/lib/aws/notify/rule.js +1 -1
  307. package/lib/aws/notify/schedule.js +1 -1
  308. package/lib/aws/notify/subscription-filter.js +1 -1
  309. package/lib/aws/notify/subscription.js +4 -4
  310. package/lib/aws/notify/subscriptions/email.js +1 -1
  311. package/lib/aws/notify/subscriptions/lambda.js +1 -1
  312. package/lib/aws/notify/subscriptions/sms.js +1 -1
  313. package/lib/aws/notify/subscriptions/sqs.js +1 -1
  314. package/lib/aws/notify/subscriptions/url.js +1 -1
  315. package/lib/aws/notify/targets/event-bus.js +1 -1
  316. package/lib/aws/notify/targets/function.js +1 -1
  317. package/lib/aws/notify/targets/log-group.js +2 -2
  318. package/lib/aws/notify/targets/sqs.js +1 -1
  319. package/lib/aws/notify/targets/state-machine.js +1 -1
  320. package/lib/aws/notify/topic-base.js +1 -1
  321. package/lib/aws/notify/topic.js +6 -5
  322. package/lib/aws/partition.d.ts +21 -0
  323. package/lib/aws/partition.js +42 -0
  324. package/lib/aws/storage/assets/image-asset.d.ts +379 -0
  325. package/lib/aws/storage/assets/image-asset.js +247 -0
  326. package/lib/aws/storage/assets/index.d.ts +2 -0
  327. package/lib/aws/storage/assets/index.js +21 -0
  328. package/lib/aws/storage/assets/s3.d.ts +125 -0
  329. package/lib/aws/storage/assets/s3.js +80 -0
  330. package/lib/aws/storage/auth-token.d.ts +25 -0
  331. package/lib/aws/storage/auth-token.js +54 -0
  332. package/lib/aws/storage/billing.js +1 -1
  333. package/lib/aws/storage/bucket-notifications.js +1 -1
  334. package/lib/aws/storage/bucket-policy.js +1 -1
  335. package/lib/aws/storage/bucket-source.d.ts +1 -1
  336. package/lib/aws/storage/bucket-source.js +4 -4
  337. package/lib/aws/storage/bucket.d.ts +14 -6
  338. package/lib/aws/storage/bucket.js +48 -40
  339. package/lib/aws/storage/capacity.js +1 -1
  340. package/lib/aws/storage/ecr-lifecycle.d.ts +88 -0
  341. package/lib/aws/storage/ecr-lifecycle.js +23 -0
  342. package/lib/aws/storage/ecr-repository.d.ts +446 -0
  343. package/lib/aws/storage/ecr-repository.js +685 -0
  344. package/lib/aws/storage/encryption.js +1 -1
  345. package/lib/aws/storage/index.d.ts +5 -0
  346. package/lib/aws/storage/index.js +10 -3
  347. package/lib/aws/storage/location.d.ts +17 -0
  348. package/lib/aws/storage/location.js +4 -0
  349. package/lib/aws/storage/notification-targets/function.js +1 -1
  350. package/lib/aws/storage/notification-targets/queue.js +1 -1
  351. package/lib/aws/storage/origin-access-identity.js +1 -1
  352. package/lib/aws/storage/parameter.js +2 -2
  353. package/lib/aws/storage/table.js +3 -3
  354. package/lib/aws/storage/util.d.ts +8 -20
  355. package/lib/aws/storage/util.js +56 -34
  356. package/lib/aws/util.d.ts +1 -0
  357. package/lib/aws/util.js +6 -1
  358. package/lib/bundling.d.ts +434 -0
  359. package/lib/bundling.js +368 -0
  360. package/lib/construct-base.js +2 -2
  361. package/lib/duration.js +1 -1
  362. package/lib/expiration.js +1 -1
  363. package/lib/fs/copy.d.ts +2 -0
  364. package/lib/fs/copy.js +57 -0
  365. package/lib/fs/fingerprint.d.ts +21 -0
  366. package/lib/fs/fingerprint.js +165 -0
  367. package/lib/fs/ignore.d.ts +107 -0
  368. package/lib/fs/ignore.js +190 -0
  369. package/lib/fs/index.d.ts +47 -0
  370. package/lib/fs/index.js +88 -0
  371. package/lib/fs/options.d.ts +110 -0
  372. package/lib/fs/options.js +60 -0
  373. package/lib/fs/utils.d.ts +11 -0
  374. package/lib/fs/utils.js +34 -0
  375. package/lib/index.d.ts +5 -0
  376. package/lib/index.js +7 -1
  377. package/lib/private/asset-staging.d.ts +83 -0
  378. package/lib/private/asset-staging.js +205 -0
  379. package/lib/private/cache.d.ts +17 -0
  380. package/lib/private/cache.js +35 -0
  381. package/lib/private/jsii-deprecated.d.ts +2 -0
  382. package/lib/private/jsii-deprecated.js +19 -0
  383. package/lib/private/unique-resource-name.js +3 -2
  384. package/lib/size.js +1 -1
  385. package/lib/stack-base.js +1 -1
  386. package/lib/terra-func.js +2 -2
  387. package/lib/time-zone.js +1 -1
  388. package/node_modules/@balena/dockerignore/CHANGELOG.md +31 -0
  389. package/node_modules/@balena/dockerignore/LICENSE.md +206 -0
  390. package/node_modules/@balena/dockerignore/README.md +261 -0
  391. package/node_modules/@balena/dockerignore/ignore.js +363 -0
  392. package/node_modules/@balena/dockerignore/index.d.ts +45 -0
  393. package/node_modules/@balena/dockerignore/package.json +49 -0
  394. package/node_modules/balanced-match/.github/FUNDING.yml +2 -0
  395. package/node_modules/balanced-match/LICENSE.md +21 -0
  396. package/node_modules/balanced-match/README.md +97 -0
  397. package/node_modules/balanced-match/index.js +62 -0
  398. package/node_modules/balanced-match/package.json +48 -0
  399. package/node_modules/concat-map/.travis.yml +4 -0
  400. package/node_modules/concat-map/LICENSE +18 -0
  401. package/node_modules/concat-map/README.markdown +62 -0
  402. package/node_modules/concat-map/example/map.js +6 -0
  403. package/node_modules/concat-map/index.js +13 -0
  404. package/node_modules/concat-map/package.json +43 -0
  405. package/node_modules/concat-map/test/map.js +39 -0
  406. package/node_modules/ignore/LICENSE-MIT +21 -0
  407. package/node_modules/ignore/README.md +412 -0
  408. package/node_modules/ignore/index.d.ts +61 -0
  409. package/node_modules/ignore/index.js +636 -0
  410. package/node_modules/ignore/legacy.js +559 -0
  411. package/node_modules/ignore/package.json +74 -0
  412. package/node_modules/minimatch/LICENSE +15 -0
  413. package/node_modules/minimatch/README.md +230 -0
  414. package/node_modules/minimatch/minimatch.js +947 -0
  415. package/node_modules/minimatch/node_modules/brace-expansion/LICENSE +21 -0
  416. package/node_modules/minimatch/node_modules/brace-expansion/README.md +129 -0
  417. package/node_modules/minimatch/node_modules/brace-expansion/index.js +201 -0
  418. package/node_modules/minimatch/node_modules/brace-expansion/package.json +47 -0
  419. package/node_modules/minimatch/package.json +33 -0
  420. package/package.json +14 -5
  421. package/lib/aws/compute/function-nodejs.d.ts +0 -55
  422. package/lib/aws/compute/function-nodejs.js +0 -70
package/lib/aws/arn.js CHANGED
@@ -6,6 +6,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  // ref: https://github.com/aws/aws-cdk/blob/v2.150.0/packages/aws-cdk-lib/core/lib/arn.ts
7
7
  const cdktf = require("cdktf");
8
8
  const util_1 = require("./util");
9
+ const terra_func_1 = require("../terra-func");
9
10
  /**
10
11
  * An enum representing the various ARN formats that different services use.
11
12
  */
@@ -254,7 +255,7 @@ class Arn {
254
255
  static extractResourceName(arn, resourceType) {
255
256
  const components = parseArnShape(arn);
256
257
  if (components === "token") {
257
- return cdktf.Fn.element(cdktf.Fn.split(`:${resourceType}/`, arn), 1);
258
+ return terra_func_1.Fn.select(1, terra_func_1.Fn.splitv2(`:${resourceType}/`, arn));
258
259
  }
259
260
  // Apparently we could just parse this right away. Validate that we got the right
260
261
  // resource type (to notify authors of incorrect assumptions right away).
@@ -272,7 +273,7 @@ class Arn {
272
273
  }
273
274
  exports.Arn = Arn;
274
275
  _a = JSII_RTTI_SYMBOL_1;
275
- Arn[_a] = { fqn: "terraconstructs.aws.Arn", version: "0.0.25" };
276
+ Arn[_a] = { fqn: "terraconstructs.aws.Arn", version: "0.1.1" };
276
277
  /**
277
278
  * Given a Token evaluating to ARN, parses it and returns components.
278
279
  *
@@ -296,20 +297,20 @@ function parseTokenArn(arnToken, arnFormat) {
296
297
  // arn:partition:service:region:account:resource:resourceName
297
298
  // arn:partition:service:region:account:resource/resourceName
298
299
  // arn:partition:service:region:account:/resource/resourceName
299
- const components = cdktf.Fn.split(":", arnToken);
300
- const partition = cdktf.Fn.element(components, 1).toString();
301
- const service = cdktf.Fn.element(components, 2).toString();
302
- const region = cdktf.Fn.element(components, 3).toString();
303
- const account = cdktf.Fn.element(components, 4).toString();
300
+ const components = terra_func_1.Fn.splitv2(":", arnToken);
301
+ const partition = terra_func_1.Fn.select(1, components).toString();
302
+ const service = terra_func_1.Fn.select(2, components).toString();
303
+ const region = terra_func_1.Fn.select(3, components).toString();
304
+ const account = terra_func_1.Fn.select(4, components).toString();
304
305
  let resource;
305
306
  let resourceName;
306
307
  let sep;
307
308
  if (arnFormat === ArnFormat.NO_RESOURCE_NAME ||
308
309
  arnFormat === ArnFormat.COLON_RESOURCE_NAME) {
309
310
  // we know that the 'resource' part will always be the 6th segment in this case
310
- resource = cdktf.Fn.element(components, 5);
311
+ resource = terra_func_1.Fn.select(5, components);
311
312
  if (arnFormat === ArnFormat.COLON_RESOURCE_NAME) {
312
- resourceName = cdktf.Fn.element(components, 6);
313
+ resourceName = terra_func_1.Fn.select(6, components);
313
314
  sep = ":";
314
315
  }
315
316
  else {
@@ -320,16 +321,16 @@ function parseTokenArn(arnToken, arnFormat) {
320
321
  else {
321
322
  // we know that the 'resource' and 'resourceName' parts are separated by slash here,
322
323
  // so we split the 6th segment from the colon-separated ones with a slash
323
- const lastComponents = cdktf.Fn.split("/", cdktf.Fn.element(components, 5));
324
+ const lastComponents = terra_func_1.Fn.split("/", terra_func_1.Fn.select(5, components));
324
325
  if (arnFormat === ArnFormat.SLASH_RESOURCE_NAME) {
325
- resource = cdktf.Fn.element(lastComponents, 0);
326
- resourceName = cdktf.Fn.element(lastComponents, 1);
326
+ resource = terra_func_1.Fn.select(0, lastComponents);
327
+ resourceName = terra_func_1.Fn.select(1, lastComponents);
327
328
  }
328
329
  else {
329
330
  // arnFormat is ArnFormat.SLASH_RESOURCE_SLASH_RESOURCE_NAME,
330
331
  // which means there's an extra slash there at the beginning that we need to skip
331
- resource = cdktf.Fn.element(lastComponents, 1);
332
- resourceName = cdktf.Fn.element(lastComponents, 2);
332
+ resource = terra_func_1.Fn.select(1, lastComponents);
333
+ resourceName = terra_func_1.Fn.select(2, lastComponents);
333
334
  }
334
335
  sep = "/";
335
336
  }
@@ -380,4 +381,4 @@ function parseArnShape(arn) {
380
381
  // Account can be missing in some ARN types (such as used for S3 buckets)
381
382
  return components;
382
383
  }
383
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F3cy9hcm4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5RkFBeUY7QUFDekYsK0JBQStCO0FBRS9CLGlDQUF5QztBQUN6Qzs7R0FFRztBQUNILElBQVksU0F1Q1g7QUF2Q0QsV0FBWSxTQUFTO0lBQ25COzs7Ozs7O09BT0c7SUFDSCx5RUFBNEQsQ0FBQTtJQUU1RDs7Ozs7OztPQU9HO0lBQ0gseUZBQTRFLENBQUE7SUFFNUU7Ozs7Ozs7T0FPRztJQUNILHlGQUE0RSxDQUFBO0lBRTVFOzs7Ozs7T0FNRztJQUNILHlHQUE0RixDQUFBO0FBQzlGLENBQUMsRUF2Q1csU0FBUyx5QkFBVCxTQUFTLFFBdUNwQjtBQW1FRCxNQUFhLEdBQUc7SUFDZDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBeUIsRUFBRSxLQUFpQjtRQUMvRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxJQUFJLEtBQUssRUFBRSxTQUFTLENBQUM7UUFDM0QsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUUsTUFBTSxDQUFDO1FBQ2xELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLElBQUksS0FBSyxFQUFFLE9BQU8sQ0FBQztRQUVyRCxvQ0FBb0M7UUFDcEMsSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzNELE1BQU0sSUFBSSxLQUFLLENBQ2IsMEJBQTBCLFNBQVMsY0FBYyxNQUFNLG1CQUFtQixPQUFPLDhDQUE4QyxDQUNoSSxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sR0FBRyxHQUNQLFVBQVUsQ0FBQyxHQUFHO1lBQ2QsQ0FBQyxVQUFVLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFD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LEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSxLQUFLLENBQ2IsaUVBQWlFLEdBQUcsR0FBRyxDQUN4RSxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNuRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksS0FBSyxDQUNiLGtFQUFrRSxHQUFHLEdBQUcsQ0FDekUsQ0FBQztJQUNKLENBQUM7SUFFRCw2REFBNkQ7SUFFN0QseUVBQXlFO0lBRXpFLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE1MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2NvcmUvbGliL2Fybi50c1xuaW1wb3J0ICogYXMgY2RrdGYgZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBJQXdzU3RhY2sgfSBmcm9tIFwiLi9hd3Mtc3RhY2tcIjtcbmltcG9ydCB7IGZpbHRlclVuZGVmaW5lZCB9IGZyb20gXCIuL3V0aWxcIjtcbi8qKlxuICogQW4gZW51bSByZXByZXNlbnRpbmcgdGhlIHZhcmlvdXMgQVJOIGZvcm1hdHMgdGhhdCBkaWZmZXJlbnQgc2VydmljZXMgdXNlLlxuICovXG5leHBvcnQgZW51bSBBcm5Gb3JtYXQge1xuICAvKipcbiAgICogVGhpcyByZXByZXNlbnRzIGEgZm9ybWF0IHdoZXJlIHRoZXJlIGlzIG5vICdyZXNvdXJjZU5hbWUnIHBhcnQuXG4gICAqIFRoaXMgZm9ybWF0IGlzIHVzZWQgZm9yIFMzIHJlc291cmNlcyxcbiAgICogbGlrZSAnYXJuOmF3czpzMzo6OmJ1Y2tldCcuXG4gICAqIEV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGxhc3QgY29sb24gaXMgY29uc2lkZXJlZCB0aGUgJ3Jlc291cmNlJyxcbiAgICogZXZlbiBpZiBpdCBjb250YWlucyBzbGFzaGVzLFxuICAgKiBsaWtlIGluICdhcm46YXdzOnMzOjo6YnVja2V0L29iamVjdC56aXAnLlxuICAgKi9cbiAgTk9fUkVTT1VSQ0VfTkFNRSA9IFwiYXJuOmF3czpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlXCIsXG5cbiAgLyoqXG4gICAqIFRoaXMgcmVwcmVzZW50cyBhIGZvcm1hdCB3aGVyZSB0aGUgJ3Jlc291cmNlJyBhbmQgJ3Jlc291cmNlTmFtZSdcbiAgICogcGFydHMgYXJlIHNlcGFyYXRlZCB3aXRoIGEgY29sb24uXG4gICAqIExpa2UgaW46ICdhcm46YXdzOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6cmVzb3VyY2U6cmVzb3VyY2VOYW1lJy5cbiAgICogRXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdCBjb2xvbiBpcyBjb25zaWRlcmVkIHRoZSAncmVzb3VyY2VOYW1lJyxcbiAgICogZXZlbiBpZiBpdCBjb250YWlucyBzbGFzaGVzLFxuICAgKiBsaWtlIGluICdhcm46YXdzOmFwaWdhdGV3YXk6cmVnaW9uOmFjY291bnQ6cmVzb3VyY2U6L3Rlc3QvbXlkZW1vcmVzb3VyY2UvKicuXG4gICAqL1xuICBDT0xPTl9SRVNPVVJDRV9OQU1FID0gXCJhcm46YXdzOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6cmVzb3VyY2U6cmVzb3VyY2VOYW1lXCIsXG5cbiAgLyoqXG4gICAqIFRoaXMgcmVwcmVzZW50cyBhIGZvcm1hdCB3aGVyZSB0aGUgJ3Jlc291cmNlJyBhbmQgJ3Jlc291cmNlTmFtZSdcbiAgICogcGFydHMgYXJlIHNlcGFyYXRlZCB3aXRoIGEgc2xhc2guXG4gICAqIExpa2UgaW46ICdhcm46YXdzOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6cmVzb3VyY2UvcmVzb3VyY2VOYW1lJy5cbiAgICogRXZlcnl0aGluZyBhZnRlciB0aGUgc2VwYXJhdGluZyBzbGFzaCBpcyBjb25zaWRlcmVkIHRoZSAncmVzb3VyY2VOYW1lJyxcbiAgICogZXZlbiBpZiBpdCBjb250YWlucyBjb2xvbnMsXG4gICAqIGxpa2UgaW4gJ2Fybjphd3M6Y29nbml0by1zeW5jOnJlZ2lvbjphY2NvdW50OmlkZW50aXR5cG9vbC91cy1lYXN0LTE6MWExYTFhMWEtZmZmZi0xMTExLTk5OTktMTIzNDU2Nzg6YmxhJy5cbiAgICovXG4gIFNMQVNIX1JFU09VUkNFX05BTUUgPSBcImFybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZS9yZXNvdXJjZU5hbWVcIixcblxuICAvKipcbiAgICogVGhpcyByZXByZXNlbnRzIGEgZm9ybWF0IHdoZXJlIHRoZSAncmVzb3VyY2UnIGFuZCAncmVzb3VyY2VOYW1lJ1xuICAgKiBwYXJ0cyBhcmUgc2VwZXJhdGVkIHdpdGggYSBzbGFzaCxcbiAgICogYnV0IHRoZXJlIGlzIGFsc28gYW4gYWRkaXRpb25hbCBzbGFzaCBhZnRlciB0aGUgY29sb24gc2VwYXJhdGluZyAnYWNjb3VudCcgZnJvbSAncmVzb3VyY2UnLlxuICAgKiBMaWtlIGluOiAnYXJuOmF3czpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50Oi9yZXNvdXJjZS9yZXNvdXJjZU5hbWUnLlxuICAgKiBOb3RlIHRoYXQgdGhlIGxlYWRpbmcgc2xhc2ggaXMgX25vdF8gaW5jbHVkZWQgaW4gdGhlIHBhcnNlZCAncmVzb3VyY2UnIHBhcnQuXG4gICAqL1xuICBTTEFTSF9SRVNPVVJDRV9TTEFTSF9SRVNPVVJDRV9OQU1FID0gXCJhcm46YXdzOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6L3Jlc291cmNlL3Jlc291cmNlTmFtZVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFybkNvbXBvbmVudHMge1xuICAvKipcbiAgICogVGhlIHBhcnRpdGlvbiB0aGF0IHRoZSByZXNvdXJjZSBpcyBpbi4gRm9yIHN0YW5kYXJkIEFXUyByZWdpb25zLCB0aGVcbiAgICogcGFydGl0aW9uIGlzIGF3cy4gSWYgeW91IGhhdmUgcmVzb3VyY2VzIGluIG90aGVyIHBhcnRpdGlvbnMsIHRoZVxuICAgKiBwYXJ0aXRpb24gaXMgYXdzLXBhcnRpdGlvbm5hbWUuIEZvciBleGFtcGxlLCB0aGUgcGFydGl0aW9uIGZvciByZXNvdXJjZXNcbiAgICogaW4gdGhlIENoaW5hIChCZWlqaW5nKSByZWdpb24gaXMgYXdzLWNuLlxuICAgKlxuICAgKiBAZGVmYXVsdCBUaGUgQVdTIHBhcnRpdGlvbiB0aGUgc3RhY2sgaXMgZGVwbG95ZWQgdG8uXG4gICAqL1xuICByZWFkb25seSBwYXJ0aXRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIG5hbWVzcGFjZSB0aGF0IGlkZW50aWZpZXMgdGhlIEFXUyBwcm9kdWN0IChmb3IgZXhhbXBsZSxcbiAgICogJ3MzJywgJ2lhbScsICdjb2RlcGlwbGluZScpLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIHRoZSByZXNvdXJjZSByZXNpZGVzIGluLiBOb3RlIHRoYXQgdGhlIEFSTnMgZm9yIHNvbWUgcmVzb3VyY2VzXG4gICAqIGRvIG5vdCByZXF1aXJlIGEgcmVnaW9uLCBzbyB0aGlzIGNvbXBvbmVudCBtaWdodCBiZSBvbWl0dGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBUaGUgcmVnaW9uIHRoZSBzdGFjayBpcyBkZXBsb3llZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBBV1MgYWNjb3VudCB0aGF0IG93bnMgdGhlIHJlc291cmNlLCB3aXRob3V0IHRoZSBoeXBoZW5zLlxuICAgKiBGb3IgZXhhbXBsZSwgMTIzNDU2Nzg5MDEyLiBOb3RlIHRoYXQgdGhlIEFSTnMgZm9yIHNvbWUgcmVzb3VyY2VzIGRvbid0XG4gICAqIHJlcXVpcmUgYW4gYWNjb3VudCBudW1iZXIsIHNvIHRoaXMgY29tcG9uZW50IG1pZ2h0IGJlIG9taXR0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFRoZSBhY2NvdW50IHRoZSBzdGFjayBpcyBkZXBsb3llZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlc291cmNlIHR5cGUgKGUuZy4gXCJ0YWJsZVwiLCBcImF1dG9TY2FsaW5nR3JvdXBcIiwgXCJjZXJ0aWZpY2F0ZVwiKS5cbiAgICogRm9yIHNvbWUgcmVzb3VyY2UgdHlwZXMsIGUuZy4gUzMgYnVja2V0cywgdGhpcyBmaWVsZCBkZWZpbmVzIHRoZSBidWNrZXQgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNlcGFyYXRvciBiZXR3ZWVuIHJlc291cmNlIHR5cGUgYW5kIHRoZSByZXNvdXJjZS5cbiAgICpcbiAgICogQ2FuIGJlIGVpdGhlciAnLycsICc6JyBvciBhbiBlbXB0eSBzdHJpbmcuIFdpbGwgb25seSBiZSB1c2VkIGlmIHJlc291cmNlTmFtZSBpcyBkZWZpbmVkLlxuICAgKiBAZGVmYXVsdCAnLydcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGFybkZvcm1hdCBpbnN0ZWFkXG4gICAqL1xuICByZWFkb25seSBzZXA/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlc291cmNlIG5hbWUgb3IgcGF0aCB3aXRoaW4gdGhlIHJlc291cmNlIChpLmUuIFMzIGJ1Y2tldCBvYmplY3Qga2V5KSBvclxuICAgKiBhIHdpbGRjYXJkIHN1Y2ggYXMgYGBcIipcImBgLiBUaGlzIGlzIHNlcnZpY2UtZGVwZW5kZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3BlY2lmaWMgQVJOIGZvcm1hdCB0byB1c2UgZm9yIHRoaXMgQVJOIHZhbHVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVzZXMgdmFsdWUgb2YgYHNlcGAgYXMgdGhlIHNlcGFyYXRvciBmb3IgZm9ybWF0dGluZyxcbiAgICogICBgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUVgIGlmIHRoYXQgcHJvcGVydHkgd2FzIGFsc28gbm90ZFxuICAgKi9cbiAgcmVhZG9ubHkgYXJuRm9ybWF0PzogQXJuRm9ybWF0O1xufVxuXG5leHBvcnQgY2xhc3MgQXJuIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gQVJOIGZyb20gY29tcG9uZW50cy5cbiAgICpcbiAgICogSWYgYHBhcnRpdGlvbmAsIGByZWdpb25gIG9yIGBhY2NvdW50YCBhcmUgbm90IHNwZWNpZmllZCwgdGhlIHN0YWNrJ3NcbiAgICogcGFydGl0aW9uLCByZWdpb24gYW5kIGFjY291bnQgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBJZiBhbnkgY29tcG9uZW50IGlzIHRoZSBlbXB0eSBzdHJpbmcsIGFuIGVtcHR5IHN0cmluZyB3aWxsIGJlIGluc2VydGVkXG4gICAqIGludG8gdGhlIGdlbmVyYXRlZCBBUk4gYXQgdGhlIGxvY2F0aW9uIHRoYXQgY29tcG9uZW50IGNvcnJlc3BvbmRzIHRvLlxuICAgKlxuICAgKiBUaGUgQVJOIHdpbGwgYmUgZm9ybWF0dGVkIGFzIGZvbGxvd3M6XG4gICAqXG4gICAqICAgYXJuOntwYXJ0aXRpb259OntzZXJ2aWNlfTp7cmVnaW9ufTp7YWNjb3VudH06e3Jlc291cmNlfXtzZXB9e3Jlc291cmNlLW5hbWV9XG4gICAqXG4gICAqIFRoZSByZXF1aXJlZCBBUk4gcGllY2VzIHRoYXQgYXJlIG9taXR0ZWQgd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBzdGFjayB0aGF0XG4gICAqIHRoZSAnc2NvcGUnIGlzIGF0dGFjaGVkIHRvLiBJZiBhbGwgQVJOIHBpZWNlcyBhcmUgc3VwcGxpZWQsIHRoZSBzdXBwbGllZCBzY29wZVxuICAgKiBjYW4gYmUgJ3VuZGVmaW5lZCcuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZvcm1hdChjb21wb25lbnRzOiBBcm5Db21wb25lbnRzLCBzdGFjaz86IElBd3NTdGFjayk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydGl0aW9uID0gY29tcG9uZW50cy5wYXJ0aXRpb24gPz8gc3RhY2s/LnBhcnRpdGlvbjtcbiAgICBjb25zdCByZWdpb24gPSBjb21wb25lbnRzLnJlZ2lvbiA/PyBzdGFjaz8ucmVnaW9uO1xuICAgIGNvbnN0IGFjY291bnQgPSBjb21wb25lbnRzLmFjY291bnQgPz8gc3RhY2s/LmFjY291bnQ7XG5cbiAgICAvLyBDYXRjaCBib3RoICdudWxsJyBhbmQgJ3VuZGVmaW5lZCdcbiAgICBpZiAocGFydGl0aW9uID09IG51bGwgfHwgcmVnaW9uID09IG51bGwgfHwgYWNjb3VudCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBcm4uZm9ybWF0OiBwYXJ0aXRpb24gKCR7cGFydGl0aW9ufSksIHJlZ2lvbiAoJHtyZWdpb259KSwgYW5kIGFjY291bnQgKCR7YWNjb3VudH0pIG11c3QgYWxsIGJlIHBhc3NlZCBpZiBzdGFjayBpcyBub3QgcGFzc2VkLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcCA9XG4gICAgICBjb21wb25lbnRzLnNlcCA/P1xuICAgICAgKGNvbXBvbmVudHMuYXJuRm9ybWF0ID09PSBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSA/IFwiOlwiIDogXCIvXCIpO1xuXG4gICAgY29uc3QgdmFsdWVzID0gW1xuICAgICAgXCJhcm5cIixcbiAgICAgIFwiOlwiLFxuICAgICAgcGFydGl0aW9uLFxuICAgICAgXCI6XCIsXG4gICAgICBjb21wb25lbnRzLnNlcnZpY2UsXG4gICAgICBcIjpcIixcbiAgICAgIHJlZ2lvbixcbiAgICAgIFwiOlwiLFxuICAgICAgYWNjb3VudCxcbiAgICAgIFwiOlwiLFxuICAgICAgLi4uKGNvbXBvbmVudHMuYXJuRm9ybWF0ID09PSBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfU0xBU0hfUkVTT1VSQ0VfTkFNRVxuICAgICAgICA/IFtcIi9cIl1cbiAgICAgICAgOiBbXSksXG4gICAgICBjb21wb25lbnRzLnJlc291cmNlLFxuICAgIF07XG5cbiAgICBpZiAoc2VwICE9PSBcIi9cIiAmJiBzZXAgIT09IFwiOlwiICYmIHNlcCAhPT0gXCJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAncmVzb3VyY2VQYXRoU2VwIG1heSBvbmx5IGJlIFwiOlwiLCBcIi9cIiBvciBhbiBlbXB0eSBzdHJpbmcnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50cy5yZXNvdXJjZU5hbWUgIT0gbnVsbCkge1xuICAgICAgdmFsdWVzLnB1c2goc2VwKTtcbiAgICAgIHZhbHVlcy5wdXNoKGNvbXBvbmVudHMucmVzb3VyY2VOYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzLmpvaW4oXCJcIik7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYW4gQVJOLCBwYXJzZXMgaXQgYW5kIHJldHVybnMgY29tcG9uZW50cy5cbiAgICpcbiAgICogSUYgVEhFIEFSTiBJUyBBIENPTkNSRVRFIFNUUklORy4uLlxuICAgKlxuICAgKiAuLi5pdCB3aWxsIGJlIHBhcnNlZCBhbmQgdmFsaWRhdGVkLiBUaGUgc2VwYXJhdG9yIChgc2VwYCkgd2lsbCBiZSBzZXQgdG8gJy8nXG4gICAqIGlmIHRoZSA2dGggY29tcG9uZW50IGluY2x1ZGVzIGEgJy8nLCBpbiB3aGljaCBjYXNlLCBgcmVzb3VyY2VgIHdpbGwgYmUgc2V0XG4gICAqIHRvIHRoZSB2YWx1ZSBiZWZvcmUgdGhlICcvJyBhbmQgYHJlc291cmNlTmFtZWAgd2lsbCBiZSB0aGUgcmVzdC4gSW4gY2FzZVxuICAgKiB0aGVyZSBpcyBubyAnLycsIGByZXNvdXJjZWAgd2lsbCBiZSBzZXQgdG8gdGhlIDZ0aCBjb21wb25lbnRzIGFuZFxuICAgKiBgcmVzb3VyY2VOYW1lYCB3aWxsIGJlIHNldCB0byB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nLlxuICAgKlxuICAgKiBJRiBUSEUgQVJOIElTIEEgVE9LRU4uLi5cbiAgICpcbiAgICogLi4uaXQgY2Fubm90IGJlIHZhbGlkYXRlZCwgc2luY2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgYWN0dWFsIHZhbHVlIHlldCBhdCB0aGVcbiAgICogdGltZSBvZiB0aGlzIGZ1bmN0aW9uIGNhbGwuIFlvdSB3aWxsIGhhdmUgdG8gc3VwcGx5IGBzZXBJZlRva2VuYCBhbmRcbiAgICogd2hldGhlciBvciBub3QgQVJOcyBvZiB0aGUgZXhwZWN0ZWQgZm9ybWF0IHVzdWFsbHkgaGF2ZSByZXNvdXJjZSBuYW1lc1xuICAgKiBpbiBvcmRlciB0byBwYXJzZSBpdCBwcm9wZXJseS4gVGhlIHJlc3VsdGluZyBgQXJuQ29tcG9uZW50c2Agb2JqZWN0IHdpbGxcbiAgICogY29udGFpbiB0b2tlbnMgZm9yIHRoZSBzdWJleHByZXNzaW9ucyBvZiB0aGUgQVJOLCBub3Qgc3RyaW5nIGxpdGVyYWxzLlxuICAgKlxuICAgKiBJZiB0aGUgcmVzb3VyY2UgbmFtZSBjb3VsZCBwb3NzaWJseSBjb250YWluIHRoZSBzZXBhcmF0b3IgY2hhciwgdGhlIGFjdHVhbFxuICAgKiByZXNvdXJjZSBuYW1lIGNhbm5vdCBiZSBwcm9wZXJseSBwYXJzZWQuIFRoaXMgb25seSBvY2N1cnMgaWYgdGhlIHNlcGFyYXRvclxuICAgKiBjaGFyIGlzICcvJywgYW5kIGhhcHBlbnMgZm9yIGV4YW1wbGUgZm9yIFMzIG9iamVjdCBBUk5zLCBJQU0gUm9sZSBBUk5zLFxuICAgKiBJQU0gT0lEQyBQcm92aWRlciBBUk5zLCBldGMuIFRvIHByb3Blcmx5IGV4dHJhY3QgdGhlIHJlc291cmNlIG5hbWUgZnJvbSBhXG4gICAqIFRva2VuaXplZCBBUk4sIHlvdSBtdXN0IGtub3cgdGhlIHJlc291cmNlIHR5cGUgYW5kIGNhbGxcbiAgICogYEFybi5leHRyYWN0UmVzb3VyY2VOYW1lYC5cbiAgICpcbiAgICogQHBhcmFtIGFybiBUaGUgQVJOIHRvIHBhcnNlXG4gICAqIEBwYXJhbSBzZXBJZlRva2VuIFRoZSBzZXBhcmF0b3IgdXNlZCB0byBzZXBhcmF0ZSByZXNvdXJjZSBmcm9tIHJlc291cmNlTmFtZVxuICAgKiBAcGFyYW0gaGFzTmFtZSBXaGV0aGVyIHRoZXJlIGlzIGEgbmFtZSBjb21wb25lbnQgaW4gdGhlIEFSTiBhdCBhbGwuIEZvclxuICAgKiBleGFtcGxlLCBTTlMgVG9waWNzIEFSTnMgaGF2ZSB0aGUgJ3Jlc291cmNlJyBjb21wb25lbnQgY29udGFpbiB0aGUgdG9waWNcbiAgICogbmFtZSwgYW5kIG5vICdyZXNvdXJjZU5hbWUnIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgYW4gQXJuQ29tcG9uZW50cyBvYmplY3Qgd2hpY2ggYWxsb3dzIGFjY2VzcyB0byB0aGUgdmFyaW91c1xuICAgKiBjb21wb25lbnRzIG9mIHRoZSBBUk4uXG4gICAqXG4gICAqIEByZXR1cm5zIGFuIEFybkNvbXBvbmVudHMgb2JqZWN0IHdoaWNoIGFsbG93cyBhY2Nlc3MgdG8gdGhlIHZhcmlvdXNcbiAgICogICAgICBjb21wb25lbnRzIG9mIHRoZSBBUk4uXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzcGxpdCBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHBhcnNlKFxuICAgIGFybjogc3RyaW5nLFxuICAgIHNlcElmVG9rZW46IHN0cmluZyA9IFwiL1wiLFxuICAgIGhhc05hbWU6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBBcm5Db21wb25lbnRzIHtcbiAgICBsZXQgYXJuRm9ybWF0OiBBcm5Gb3JtYXQ7XG4gICAgaWYgKCFoYXNOYW1lKSB7XG4gICAgICBhcm5Gb3JtYXQgPSBBcm5Gb3JtYXQuTk9fUkVTT1VSQ0VfTkFNRTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJuRm9ybWF0ID1cbiAgICAgICAgc2VwSWZUb2tlbiA9PT0gXCIvXCJcbiAgICAgICAgICA/IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FXG4gICAgICAgICAgOiBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3BsaXQoYXJuLCBhcm5Gb3JtYXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyB0aGUgcHJvdmlkZWQgQVJOIGludG8gaXRzIGNvbXBvbmVudHMuXG4gICAqIFdvcmtzIGJvdGggaWYgJ2FybicgaXMgYSBzdHJpbmcgbGlrZSAnYXJuOmF3czpzMzo6OmJ1Y2tldCcsXG4gICAqIGFuZCBhIFRva2VuIHJlcHJlc2VudGluZyBhIGR5bmFtaWMgQ2xvdWRGb3JtYXRpb24gZXhwcmVzc2lvblxuICAgKiAoaW4gd2hpY2ggY2FzZSB0aGUgcmV0dXJuZWQgY29tcG9uZW50cyB3aWxsIGFsc28gYmUgZHluYW1pYyBDbG91ZEZvcm1hdGlvbiBleHByZXNzaW9ucyxcbiAgICogZW5jb2RlZCBhcyBUb2tlbnMpLlxuICAgKlxuICAgKiBAcGFyYW0gYXJuIHRoZSBBUk4gdG8gc3BsaXQgaW50byBpdHMgY29tcG9uZW50c1xuICAgKiBAcGFyYW0gYXJuRm9ybWF0IHRoZSBleHBlY3RlZCBmb3JtYXQgb2YgJ2FybicgLSBkZXBlbmRzIG9uIHdoYXQgZm9ybWF0IHRoZSBzZXJ2aWNlICdhcm4nIHJlcHJlc2VudHMgdXNlc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzcGxpdChhcm46IHN0cmluZywgYXJuRm9ybWF0OiBBcm5Gb3JtYXQpOiBBcm5Db21wb25lbnRzIHtcbiAgICBjb25zdCBjb21wb25lbnRzID0gcGFyc2VBcm5TaGFwZShhcm4pO1xuICAgIGlmIChjb21wb25lbnRzID09PSBcInRva2VuXCIpIHtcbiAgICAgIHJldHVybiBwYXJzZVRva2VuQXJuKGFybiwgYXJuRm9ybWF0KTtcbiAgICB9XG5cbiAgICBjb25zdCBbLCBwYXJ0aXRpb24sIHNlcnZpY2UsIHJlZ2lvbiwgYWNjb3VudCwgcmVzb3VyY2VUeXBlT3JOYW1lLCAuLi5yZXN0XSA9XG4gICAgICBjb21wb25lbnRzO1xuXG4gICAgbGV0IHJlc291cmNlOiBzdHJpbmc7XG4gICAgbGV0IHJlc291cmNlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzZXA6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVzb3VyY2VQYXJ0U3RhcnRJbmRleCA9IDA7XG4gICAgbGV0IGRldGVjdGVkQXJuRm9ybWF0OiBBcm5Gb3JtYXQ7XG5cbiAgICBsZXQgc2xhc2hJbmRleCA9IHJlc291cmNlVHlwZU9yTmFtZS5pbmRleE9mKFwiL1wiKTtcbiAgICBpZiAoc2xhc2hJbmRleCA9PT0gMCkge1xuICAgICAgLy8gbmV3LXN0eWxlIEFSTnMgYXJlIG9mIHRoZSBmb3JtICdhcm46YXdzOnM0OnVzLXdlc3QtMToxMjM0NTovcmVzb3VyY2UtdHlwZS9yZXNvdXJjZS1uYW1lJ1xuICAgICAgc2xhc2hJbmRleCA9IHJlc291cmNlVHlwZU9yTmFtZS5pbmRleE9mKFwiL1wiLCAxKTtcbiAgICAgIHJlc291cmNlUGFydFN0YXJ0SW5kZXggPSAxO1xuICAgICAgZGV0ZWN0ZWRBcm5Gb3JtYXQgPSBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfU0xBU0hfUkVTT1VSQ0VfTkFNRTtcbiAgICB9XG4gICAgaWYgKHNsYXNoSW5kZXggIT09IC0xKSB7XG4gICAgICAvLyB0aGUgc2xhc2ggaXMgb25seSBhIHNlcGFyYXRvciBpZiBBcm5Gb3JtYXQgaXMgbm90IE5PX1JFU09VUkNFX05BTUVcbiAgICAgIGlmIChhcm5Gb3JtYXQgPT09IEFybkZvcm1hdC5OT19SRVNPVVJDRV9OQU1FKSB7XG4gICAgICAgIHNlcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgc2xhc2hJbmRleCA9IC0xO1xuICAgICAgICBkZXRlY3RlZEFybkZvcm1hdCA9IEFybkZvcm1hdC5OT19SRVNPVVJDRV9OQU1FO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VwID0gXCIvXCI7XG4gICAgICAgIGRldGVjdGVkQXJuRm9ybWF0ID1cbiAgICAgICAgICByZXNvdXJjZVBhcnRTdGFydEluZGV4ID09PSAwXG4gICAgICAgICAgICA/IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FXG4gICAgICAgICAgICA6IC8vIG5lZWQgdG8gcmVwZWF0IHRoaXMgaGVyZSwgYXMgb3RoZXJ3aXNlIHRoZSBjb21waWxlciB0aGlua3MgJ2RldGVjdGVkQXJuRm9ybWF0JyBpcyBub3QgaW5pdGlhbGl6ZWQgaW4gYWxsIHBhdGhzXG4gICAgICAgICAgICAgIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9TTEFTSF9SRVNPVVJDRV9OQU1FO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVzdC5sZW5ndGggPiAwKSB7XG4gICAgICBzZXAgPSBcIjpcIjtcbiAgICAgIHNsYXNoSW5kZXggPSAtMTtcbiAgICAgIGRldGVjdGVkQXJuRm9ybWF0ID0gQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlcCA9IHVuZGVmaW5lZDtcbiAgICAgIGRldGVjdGVkQXJuRm9ybWF0ID0gQXJuRm9ybWF0Lk5PX1JFU09VUkNFX05BTUU7XG4gICAgfVxuXG4gICAgaWYgKHNsYXNoSW5kZXggIT09IC0xKSB7XG4gICAgICByZXNvdXJjZSA9IHJlc291cmNlVHlwZU9yTmFtZS5zdWJzdHJpbmcoXG4gICAgICAgIHJlc291cmNlUGFydFN0YXJ0SW5kZXgsXG4gICAgICAgIHNsYXNoSW5kZXgsXG4gICAgICApO1xuICAgICAgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VUeXBlT3JOYW1lLnN1YnN0cmluZyhzbGFzaEluZGV4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc291cmNlID0gcmVzb3VyY2VUeXBlT3JOYW1lO1xuICAgIH1cblxuICAgIGlmIChyZXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghcmVzb3VyY2VOYW1lKSB7XG4gICAgICAgIHJlc291cmNlTmFtZSA9IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvdXJjZU5hbWUgKz0gXCI6XCI7XG4gICAgICB9XG5cbiAgICAgIHJlc291cmNlTmFtZSArPSByZXN0LmpvaW4oXCI6XCIpO1xuICAgIH1cblxuICAgIC8vIFwifHwgdW5kZWZpbmVkXCIgd2lsbCBjYXVzZSBlbXB0eSBzdHJpbmdzIHRvIGJlIHRyZWF0ZWQgYXMgXCJ1bmRlZmluZWRcIi5cbiAgICAvLyBPcHRpb25hbCBBUk4gYXR0cmlidXRlcyAoZS5nLiByZWdpb24sIGFjY291bnQpIHNob3VsZCByZXR1cm4gYXMgZW1wdHkgc3RyaW5nXG4gICAgLy8gaWYgdGhleSBhcmUgcHJvdmlkZWQgYXMgc3VjaC5cbiAgICByZXR1cm4gZmlsdGVyVW5kZWZpbmVkKHtcbiAgICAgIHNlcnZpY2U6IHNlcnZpY2UgfHwgdW5kZWZpbmVkLFxuICAgICAgcmVzb3VyY2U6IHJlc291cmNlIHx8IHVuZGVmaW5lZCxcbiAgICAgIHBhcnRpdGlvbjogcGFydGl0aW9uIHx8IHVuZGVmaW5lZCxcbiAgICAgIHJlZ2lvbixcbiAgICAgIGFjY291bnQsXG4gICAgICByZXNvdXJjZU5hbWUsXG4gICAgICBzZXAsXG4gICAgICBhcm5Gb3JtYXQ6IGRldGVjdGVkQXJuRm9ybWF0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgdGhlIGZ1bGwgcmVzb3VyY2UgbmFtZSBmcm9tIGFuIEFSTlxuICAgKlxuICAgKiBOZWNlc3NhcnkgZm9yIHJlc291cmNlIG5hbWVzIChwYXRocykgdGhhdCBtYXkgY29udGFpbiB0aGUgc2VwYXJhdG9yLCBsaWtlXG4gICAqIGBhcm46YXdzOmlhbTo6MTExMTExMTExMTExOnJvbGUvcGF0aC90by9yb2xlL25hbWVgLlxuICAgKlxuICAgKiBPbmx5IHdvcmtzIGlmIHdlIHN0YXRpY2FsbHkga25vdyB0aGUgZXhwZWN0ZWQgYHJlc291cmNlVHlwZWAgYmVmb3JlaGFuZCwgc2luY2Ugd2UncmUgZ29pbmdcbiAgICogdG8gdXNlIHRoYXQgdG8gc3BsaXQgdGhlIHN0cmluZyBvbiAnOjxyZXNvdXJjZVR5cGU+LycgKGFuZCB0YWtlIHRoZSByaWdodC1oYW5kIHNpZGUpLlxuICAgKlxuICAgKiBXZSBjYW4ndCBleHRyYWN0IHRoZSAncmVzb3VyY2VUeXBlJyBmcm9tIHRoZSBBUk4gYXQgaGFuZCwgYmVjYXVzZSBDbG91ZEZvcm1hdGlvbiBFeHByZXNzaW9uc1xuICAgKiBvbmx5IGFsbG93IGxpdGVyYWxzIGluIHRoZSAnc2VwYXJhdG9yJyBhcmd1bWVudCB0byBgeyBGbjo6U3BsaXQgfWAsIGFuZCBzbyBpdCBjYW4ndCBiZVxuICAgKiBgeyBGbjo6U2VsZWN0OiBbNSwgeyBGbjo6U3BsaXQ6IFsnOicsIEFSTl0gfX1gLlxuICAgKlxuICAgKiBPbmx5IG5lY2Vzc2FyeSBmb3IgQVJOIGZvcm1hdHMgZm9yIHdoaWNoIHRoZSB0eXBlLW5hbWUgc2VwYXJhdG9yIGlzIGAvYC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZXh0cmFjdFJlc291cmNlTmFtZShhcm46IHN0cmluZywgcmVzb3VyY2VUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbXBvbmVudHMgPSBwYXJzZUFyblNoYXBlKGFybik7XG4gICAgaWYgKGNvbXBvbmVudHMgPT09IFwidG9rZW5cIikge1xuICAgICAgcmV0dXJuIGNka3RmLkZuLmVsZW1lbnQoY2RrdGYuRm4uc3BsaXQoYDoke3Jlc291cmNlVHlwZX0vYCwgYXJuKSwgMSk7XG4gICAgfVxuXG4gICAgLy8gQXBwYXJlbnRseSB3ZSBjb3VsZCBqdXN0IHBhcnNlIHRoaXMgcmlnaHQgYXdheS4gVmFsaWRhdGUgdGhhdCB3ZSBnb3QgdGhlIHJpZ2h0XG4gICAgLy8gcmVzb3VyY2UgdHlwZSAodG8gbm90aWZ5IGF1dGhvcnMgb2YgaW5jb3JyZWN0IGFzc3VtcHRpb25zIHJpZ2h0IGF3YXkpLlxuICAgIGNvbnN0IHBhcnNlZCA9IEFybi5zcGxpdChhcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKTtcbiAgICBpZiAoXG4gICAgICAhY2RrdGYuVG9rZW4uaXNVbnJlc29sdmVkKHBhcnNlZC5yZXNvdXJjZSkgJiZcbiAgICAgIHBhcnNlZC5yZXNvdXJjZSAhPT0gcmVzb3VyY2VUeXBlXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBFeHBlY3RlZCByZXNvdXJjZSB0eXBlICcke3Jlc291cmNlVHlwZX0nIGluIEFSTiwgZ290ICcke3BhcnNlZC5yZXNvdXJjZX0nIGluICcke2Fybn0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcGFyc2VkLnJlc291cmNlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgcmVzb3VyY2UgbmFtZSBpbiBBUk4sIGRpZG4ndCBmaW5kIG9uZTogJyR7YXJufSdgLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZC5yZXNvdXJjZU5hbWU7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbn1cblxuLyoqXG4gKiBHaXZlbiBhIFRva2VuIGV2YWx1YXRpbmcgdG8gQVJOLCBwYXJzZXMgaXQgYW5kIHJldHVybnMgY29tcG9uZW50cy5cbiAqXG4gKiBUaGUgQVJOIGNhbm5vdCBiZSB2YWxpZGF0ZWQsIHNpbmNlIHdlIGRvbid0IGhhdmUgdGhlIGFjdHVhbCB2YWx1ZSB5ZXRcbiAqIGF0IHRoZSB0aW1lIG9mIHRoaXMgZnVuY3Rpb24gY2FsbC4gWW91IHdpbGwgaGF2ZSB0byBrbm93IHRoZSBzZXBhcmF0b3JcbiAqIGFuZCB0aGUgdHlwZSBvZiBBUk4uXG4gKlxuICogVGhlIHJlc3VsdGluZyBgQXJuQ29tcG9uZW50c2Agb2JqZWN0IHdpbGwgY29udGFpbiB0b2tlbnMgZm9yIHRoZVxuICogc3ViZXhwcmVzc2lvbnMgb2YgdGhlIEFSTiwgbm90IHN0cmluZyBsaXRlcmFscy5cbiAqXG4gKiBXQVJOSU5HOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBwcm9wZXJseSBwYXJzZSB0aGUgY29tcGxldGUgZmluYWxcbiAqICdyZXNvdXJjZU5hbWUnIHBhcnQgaWYgaXQgY29udGFpbnMgY29sb25zLFxuICogbGlrZSAnYXJuOmF3czpjb2duaXRvLXN5bmM6cmVnaW9uOmFjY291bnQ6aWRlbnRpdHlwb29sL3VzLWVhc3QtMToxYTFhMWExYS1mZmZmLTExMTEtOTk5OS0xMjM0NTY3ODpibGEnLlxuICpcbiAqIEBwYXJhbSBhcm5Ub2tlbiBUaGUgaW5wdXQgdG9rZW4gdGhhdCBjb250YWlucyBhbiBBUk5cbiAqIEBwYXJhbSBhcm5Gb3JtYXQgdGhlIGV4cGVjdGVkIGZvcm1hdCBvZiAnYXJuJyAtIGRlcGVuZHMgb24gd2hhdCBmb3JtYXQgdGhlIHNlcnZpY2UgdGhlIEFSTiByZXByZXNlbnRzIHVzZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VUb2tlbkFybihhcm5Ub2tlbjogc3RyaW5nLCBhcm5Gb3JtYXQ6IEFybkZvcm1hdCk6IEFybkNvbXBvbmVudHMge1xuICAvLyBBUk4gbG9va3MgbGlrZTpcbiAgLy8gYXJuOnBhcnRpdGlvbjpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlXG4gIC8vIGFybjpwYXJ0aXRpb246c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZTpyZXNvdXJjZU5hbWVcbiAgLy8gYXJuOnBhcnRpdGlvbjpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlL3Jlc291cmNlTmFtZVxuICAvLyBhcm46cGFydGl0aW9uOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6L3Jlc291cmNlL3Jlc291cmNlTmFtZVxuXG4gIGNvbnN0IGNvbXBvbmVudHMgPSBjZGt0Zi5Gbi5zcGxpdChcIjpcIiwgYXJuVG9rZW4pO1xuXG4gIGNvbnN0IHBhcnRpdGlvbiA9IGNka3RmLkZuLmVsZW1lbnQoY29tcG9uZW50cywgMSkudG9TdHJpbmcoKTtcbiAgY29uc3Qgc2VydmljZSA9IGNka3RmLkZuLmVsZW1lbnQoY29tcG9uZW50cywgMikudG9TdHJpbmcoKTtcbiAgY29uc3QgcmVnaW9uID0gY2RrdGYuRm4uZWxlbWVudChjb21wb25lbnRzLCAzKS50b1N0cmluZygpO1xuICBjb25zdCBhY2NvdW50ID0gY2RrdGYuRm4uZWxlbWVudChjb21wb25lbnRzLCA0KS50b1N0cmluZygpO1xuICBsZXQgcmVzb3VyY2U6IHN0cmluZztcbiAgbGV0IHJlc291cmNlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgc2VwOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKFxuICAgIGFybkZvcm1hdCA9PT0gQXJuRm9ybWF0Lk5PX1JFU09VUkNFX05BTUUgfHxcbiAgICBhcm5Gb3JtYXQgPT09IEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FXG4gICkge1xuICAgIC8vIHdlIGtub3cgdGhhdCB0aGUgJ3Jlc291cmNlJyBwYXJ0IHdpbGwgYWx3YXlzIGJlIHRoZSA2dGggc2VnbWVudCBpbiB0aGlzIGNhc2VcbiAgICByZXNvdXJjZSA9IGNka3RmLkZuLmVsZW1lbnQoY29tcG9uZW50cywgNSk7XG4gICAgaWYgKGFybkZvcm1hdCA9PT0gQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUpIHtcbiAgICAgIHJlc291cmNlTmFtZSA9IGNka3RmLkZuLmVsZW1lbnQoY29tcG9uZW50cywgNik7XG4gICAgICBzZXAgPSBcIjpcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb3VyY2VOYW1lID0gdW5kZWZpbmVkO1xuICAgICAgc2VwID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyB3ZSBrbm93IHRoYXQgdGhlICdyZXNvdXJjZScgYW5kICdyZXNvdXJjZU5hbWUnIHBhcnRzIGFyZSBzZXBhcmF0ZWQgYnkgc2xhc2ggaGVyZSxcbiAgICAvLyBzbyB3ZSBzcGxpdCB0aGUgNnRoIHNlZ21lbnQgZnJvbSB0aGUgY29sb24tc2VwYXJhdGVkIG9uZXMgd2l0aCBhIHNsYXNoXG4gICAgY29uc3QgbGFzdENvbXBvbmVudHMgPSBjZGt0Zi5Gbi5zcGxpdChcIi9cIiwgY2RrdGYuRm4uZWxlbWVudChjb21wb25lbnRzLCA1KSk7XG5cbiAgICBpZiAoYXJuRm9ybWF0ID09PSBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSkge1xuICAgICAgcmVzb3VyY2UgPSBjZGt0Zi5Gbi5lbGVtZW50KGxhc3RDb21wb25lbnRzLCAwKTtcbiAgICAgIHJlc291cmNlTmFtZSA9IGNka3RmLkZuLmVsZW1lbnQobGFzdENvbXBvbmVudHMsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhcm5Gb3JtYXQgaXMgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX1NMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgICAvLyB3aGljaCBtZWFucyB0aGVyZSdzIGFuIGV4dHJhIHNsYXNoIHRoZXJlIGF0IHRoZSBiZWdpbm5pbmcgdGhhdCB3ZSBuZWVkIHRvIHNraXBcbiAgICAgIHJlc291cmNlID0gY2RrdGYuRm4uZWxlbWVudChsYXN0Q29tcG9uZW50cywgMSk7XG4gICAgICByZXNvdXJjZU5hbWUgPSBjZGt0Zi5Gbi5lbGVtZW50KGxhc3RDb21wb25lbnRzLCAyKTtcbiAgICB9XG4gICAgc2VwID0gXCIvXCI7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhcnRpdGlvbixcbiAgICBzZXJ2aWNlLFxuICAgIHJlZ2lvbixcbiAgICBhY2NvdW50LFxuICAgIHJlc291cmNlLFxuICAgIHJlc291cmNlTmFtZSxcbiAgICBzZXAsXG4gICAgYXJuRm9ybWF0LFxuICB9O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBzdHJpbmcgaXMgZWl0aGVyIHVucGFyc2VhYmxlIG9yIGxvb2tzIG1vc3RseSBsaWtlIGFuIEFSTlxuICovXG5mdW5jdGlvbiBwYXJzZUFyblNoYXBlKGFybjogc3RyaW5nKTogXCJ0b2tlblwiIHwgc3RyaW5nW10ge1xuICAvLyBhc3N1bWUgYW55dGhpbmcgdGhhdCBzdGFydHMgd2l0aCAnYXJuOicgaXMgYW4gQVJOLFxuICAvLyBzbyB3ZSBjYW4gcmVwb3J0IGJldHRlciBlcnJvcnNcbiAgY29uc3QgbG9va3NMaWtlQXJuID0gYXJuLnN0YXJ0c1dpdGgoXCJhcm46XCIpO1xuXG4gIGlmICghbG9va3NMaWtlQXJuKSB7XG4gICAgaWYgKGNka3RmLlRva2VuLmlzVW5yZXNvbHZlZChhcm4pKSB7XG4gICAgICByZXR1cm4gXCJ0b2tlblwiO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBUk5zIG11c3Qgc3RhcnQgd2l0aCBcImFybjpcIiBhbmQgaGF2ZSBhdCBsZWFzdCA2IGNvbXBvbmVudHM6ICR7YXJufWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIHRoZSBBUk4gbWVyZWx5IGNvbnRhaW5zIFRva2VucywgYnV0IG90aGVyd2lzZSAqbG9va3MqIG1vc3RseSBsaWtlIGFuIEFSTixcbiAgLy8gaXQncyBhIHN0cmluZyBvZiB0aGUgZm9ybSAnYXJuOiR7cGFydGl0aW9ufTpzZXJ2aWNlOiR7cmVnaW9ufToke2FjY291bnR9OnJlc291cmNlL3h5eicuXG4gIC8vIFBhcnNlIGZpZWxkcyBvdXQgdG8gdGhlIGJlc3Qgb2Ygb3VyIGFiaWxpdHkuXG4gIC8vIFRva2VucyB3b24ndCBjb250YWluIFwiOlwiLCBzbyB0aGlzIHdvbid0IGJyZWFrIHRoZW0uXG4gIGNvbnN0IGNvbXBvbmVudHMgPSBhcm4uc3BsaXQoXCI6XCIpO1xuXG4gIGNvbnN0IHBhcnRpdGlvbiA9IGNvbXBvbmVudHMubGVuZ3RoID4gMSA/IGNvbXBvbmVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIGlmICghcGFydGl0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJUaGUgYHBhcnRpdGlvbmAgY29tcG9uZW50ICgybmQgY29tcG9uZW50KSBvZiBhbiBBUk4gaXMgcmVxdWlyZWQ6IFwiICsgYXJuLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzZXJ2aWNlID0gY29tcG9uZW50cy5sZW5ndGggPiAyID8gY29tcG9uZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJUaGUgYHNlcnZpY2VgIGNvbXBvbmVudCAoM3JkIGNvbXBvbmVudCkgb2YgYW4gQVJOIGlzIHJlcXVpcmVkOiBcIiArIGFybixcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcmVzb3VyY2UgPSBjb21wb25lbnRzLmxlbmd0aCA+IDUgPyBjb21wb25lbnRzWzVdIDogdW5kZWZpbmVkO1xuICBpZiAoIXJlc291cmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJUaGUgYHJlc291cmNlYCBjb21wb25lbnQgKDZ0aCBjb21wb25lbnQpIG9mIGFuIEFSTiBpcyByZXF1aXJlZDogXCIgKyBhcm4sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlZ2lvbiBjYW4gYmUgbWlzc2luZyBpbiBnbG9iYWwgQVJOcyAoc3VjaCBhcyB1c2VkIGJ5IElBTSlcblxuICAvLyBBY2NvdW50IGNhbiBiZSBtaXNzaW5nIGluIHNvbWUgQVJOIHR5cGVzIChzdWNoIGFzIHVzZWQgZm9yIFMzIGJ1Y2tldHMpXG5cbiAgcmV0dXJuIGNvbXBvbmVudHM7XG59XG4iXX0=
384
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F3cy9hcm4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5RkFBeUY7QUFFekYsK0JBQStCO0FBRS9CLGlDQUF5QztBQUN6Qyw4Q0FBbUM7QUFFbkM7O0dBRUc7QUFDSCxJQUFZLFNBdUNYO0FBdkNELFdBQVksU0FBUztJQUNuQjs7Ozs7OztPQU9HO0lBQ0gseUVBQTRELENBQUE7SUFFNUQ7Ozs7Ozs7T0FPRztJQUNILHlGQUE0RSxDQUFBO0lBRTVFOzs7Ozs7O09BT0c7SUFDSCx5RkFBNEUsQ0FBQTtJQUU1RTs7Ozs7O09BTUc7SUFDSCx5R0FBNEYsQ0FBQTtBQUM5RixDQUFDLEVBdkNXLFNBQVMseUJBQVQsU0FBUyxRQXVDcEI7QUFtRUQsTUFBYSxHQUFHO0lBQ2Q7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQXlCLEVBQUUsS0FBaUI7UUFDL0QsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsSUFBSSxLQUFLLEVBQUUsU0FBUyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFLE1BQU0sQ0FBQztRQUNsRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxJQUFJLEtBQUssRUFBRSxPQUFPLENBQUM7UUFFckQsb0NBQW9DO1FBQ3BDLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMzRCxNQUFNLElBQUksS0FBSyxDQUNiLDBCQUEwQixTQUFTLGNBQWMsTUFBTSxtQkFBbUIsT0FBTyw4Q0FBOEMsQ0FDaEksQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FDUCxVQUFVLENBQUMsR0FBRztZQUNkLENBQUMsVUFBVSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsbUJB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VSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbkUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSxJQUFJLEtBQUssQ0FDYixrRUFBa0UsR0FBRyxHQUFHLENBQ3pFLENBQUM7SUFDSixDQUFDO0lBRUQsNkRBQTZEO0lBRTdELHlFQUF5RTtJQUV6RSxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNTAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9jb3JlL2xpYi9hcm4udHNcblxuaW1wb3J0ICogYXMgY2RrdGYgZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBJQXdzU3RhY2sgfSBmcm9tIFwiLi9hd3Mtc3RhY2tcIjtcbmltcG9ydCB7IGZpbHRlclVuZGVmaW5lZCB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7IEZuIH0gZnJvbSBcIi4uL3RlcnJhLWZ1bmNcIjtcblxuLyoqXG4gKiBBbiBlbnVtIHJlcHJlc2VudGluZyB0aGUgdmFyaW91cyBBUk4gZm9ybWF0cyB0aGF0IGRpZmZlcmVudCBzZXJ2aWNlcyB1c2UuXG4gKi9cbmV4cG9ydCBlbnVtIEFybkZvcm1hdCB7XG4gIC8qKlxuICAgKiBUaGlzIHJlcHJlc2VudHMgYSBmb3JtYXQgd2hlcmUgdGhlcmUgaXMgbm8gJ3Jlc291cmNlTmFtZScgcGFydC5cbiAgICogVGhpcyBmb3JtYXQgaXMgdXNlZCBmb3IgUzMgcmVzb3VyY2VzLFxuICAgKiBsaWtlICdhcm46YXdzOnMzOjo6YnVja2V0Jy5cbiAgICogRXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdCBjb2xvbiBpcyBjb25zaWRlcmVkIHRoZSAncmVzb3VyY2UnLFxuICAgKiBldmVuIGlmIGl0IGNvbnRhaW5zIHNsYXNoZXMsXG4gICAqIGxpa2UgaW4gJ2Fybjphd3M6czM6OjpidWNrZXQvb2JqZWN0LnppcCcuXG4gICAqL1xuICBOT19SRVNPVVJDRV9OQU1FID0gXCJhcm46YXdzOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6cmVzb3VyY2VcIixcblxuICAvKipcbiAgICogVGhpcyByZXByZXNlbnRzIGEgZm9ybWF0IHdoZXJlIHRoZSAncmVzb3VyY2UnIGFuZCAncmVzb3VyY2VOYW1lJ1xuICAgKiBwYXJ0cyBhcmUgc2VwYXJhdGVkIHdpdGggYSBjb2xvbi5cbiAgICogTGlrZSBpbjogJ2Fybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZTpyZXNvdXJjZU5hbWUnLlxuICAgKiBFdmVyeXRoaW5nIGFmdGVyIHRoZSBsYXN0IGNvbG9uIGlzIGNvbnNpZGVyZWQgdGhlICdyZXNvdXJjZU5hbWUnLFxuICAgKiBldmVuIGlmIGl0IGNvbnRhaW5zIHNsYXNoZXMsXG4gICAqIGxpa2UgaW4gJ2Fybjphd3M6YXBpZ2F0ZXdheTpyZWdpb246YWNjb3VudDpyZXNvdXJjZTovdGVzdC9teWRlbW9yZXNvdXJjZS8qJy5cbiAgICovXG4gIENPTE9OX1JFU09VUkNFX05BTUUgPSBcImFybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZTpyZXNvdXJjZU5hbWVcIixcblxuICAvKipcbiAgICogVGhpcyByZXByZXNlbnRzIGEgZm9ybWF0IHdoZXJlIHRoZSAncmVzb3VyY2UnIGFuZCAncmVzb3VyY2VOYW1lJ1xuICAgKiBwYXJ0cyBhcmUgc2VwYXJhdGVkIHdpdGggYSBzbGFzaC5cbiAgICogTGlrZSBpbjogJ2Fybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZS9yZXNvdXJjZU5hbWUnLlxuICAgKiBFdmVyeXRoaW5nIGFmdGVyIHRoZSBzZXBhcmF0aW5nIHNsYXNoIGlzIGNvbnNpZGVyZWQgdGhlICdyZXNvdXJjZU5hbWUnLFxuICAgKiBldmVuIGlmIGl0IGNvbnRhaW5zIGNvbG9ucyxcbiAgICogbGlrZSBpbiAnYXJuOmF3czpjb2duaXRvLXN5bmM6cmVnaW9uOmFjY291bnQ6aWRlbnRpdHlwb29sL3VzLWVhc3QtMToxYTFhMWExYS1mZmZmLTExMTEtOTk5OS0xMjM0NTY3ODpibGEnLlxuICAgKi9cbiAgU0xBU0hfUkVTT1VSQ0VfTkFNRSA9IFwiYXJuOmF3czpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlL3Jlc291cmNlTmFtZVwiLFxuXG4gIC8qKlxuICAgKiBUaGlzIHJlcHJlc2VudHMgYSBmb3JtYXQgd2hlcmUgdGhlICdyZXNvdXJjZScgYW5kICdyZXNvdXJjZU5hbWUnXG4gICAqIHBhcnRzIGFyZSBzZXBlcmF0ZWQgd2l0aCBhIHNsYXNoLFxuICAgKiBidXQgdGhlcmUgaXMgYWxzbyBhbiBhZGRpdGlvbmFsIHNsYXNoIGFmdGVyIHRoZSBjb2xvbiBzZXBhcmF0aW5nICdhY2NvdW50JyBmcm9tICdyZXNvdXJjZScuXG4gICAqIExpa2UgaW46ICdhcm46YXdzOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6L3Jlc291cmNlL3Jlc291cmNlTmFtZScuXG4gICAqIE5vdGUgdGhhdCB0aGUgbGVhZGluZyBzbGFzaCBpcyBfbm90XyBpbmNsdWRlZCBpbiB0aGUgcGFyc2VkICdyZXNvdXJjZScgcGFydC5cbiAgICovXG4gIFNMQVNIX1JFU09VUkNFX1NMQVNIX1JFU09VUkNFX05BTUUgPSBcImFybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDovcmVzb3VyY2UvcmVzb3VyY2VOYW1lXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJuQ29tcG9uZW50cyB7XG4gIC8qKlxuICAgKiBUaGUgcGFydGl0aW9uIHRoYXQgdGhlIHJlc291cmNlIGlzIGluLiBGb3Igc3RhbmRhcmQgQVdTIHJlZ2lvbnMsIHRoZVxuICAgKiBwYXJ0aXRpb24gaXMgYXdzLiBJZiB5b3UgaGF2ZSByZXNvdXJjZXMgaW4gb3RoZXIgcGFydGl0aW9ucywgdGhlXG4gICAqIHBhcnRpdGlvbiBpcyBhd3MtcGFydGl0aW9ubmFtZS4gRm9yIGV4YW1wbGUsIHRoZSBwYXJ0aXRpb24gZm9yIHJlc291cmNlc1xuICAgKiBpbiB0aGUgQ2hpbmEgKEJlaWppbmcpIHJlZ2lvbiBpcyBhd3MtY24uXG4gICAqXG4gICAqIEBkZWZhdWx0IFRoZSBBV1MgcGFydGl0aW9uIHRoZSBzdGFjayBpcyBkZXBsb3llZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNlcnZpY2UgbmFtZXNwYWNlIHRoYXQgaWRlbnRpZmllcyB0aGUgQVdTIHByb2R1Y3QgKGZvciBleGFtcGxlLFxuICAgKiAnczMnLCAnaWFtJywgJ2NvZGVwaXBsaW5lJykuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gdGhlIHJlc291cmNlIHJlc2lkZXMgaW4uIE5vdGUgdGhhdCB0aGUgQVJOcyBmb3Igc29tZSByZXNvdXJjZXNcbiAgICogZG8gbm90IHJlcXVpcmUgYSByZWdpb24sIHNvIHRoaXMgY29tcG9uZW50IG1pZ2h0IGJlIG9taXR0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFRoZSByZWdpb24gdGhlIHN0YWNrIGlzIGRlcGxveWVkIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIEFXUyBhY2NvdW50IHRoYXQgb3ducyB0aGUgcmVzb3VyY2UsIHdpdGhvdXQgdGhlIGh5cGhlbnMuXG4gICAqIEZvciBleGFtcGxlLCAxMjM0NTY3ODkwMTIuIE5vdGUgdGhhdCB0aGUgQVJOcyBmb3Igc29tZSByZXNvdXJjZXMgZG9uJ3RcbiAgICogcmVxdWlyZSBhbiBhY2NvdW50IG51bWJlciwgc28gdGhpcyBjb21wb25lbnQgbWlnaHQgYmUgb21pdHRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgVGhlIGFjY291bnQgdGhlIHN0YWNrIGlzIGRlcGxveWVkIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudD86IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb3VyY2UgdHlwZSAoZS5nLiBcInRhYmxlXCIsIFwiYXV0b1NjYWxpbmdHcm91cFwiLCBcImNlcnRpZmljYXRlXCIpLlxuICAgKiBGb3Igc29tZSByZXNvdXJjZSB0eXBlcywgZS5nLiBTMyBidWNrZXRzLCB0aGlzIGZpZWxkIGRlZmluZXMgdGhlIGJ1Y2tldCBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2U6IHN0cmluZztcblxuICAvKipcbiAgICogU2VwYXJhdG9yIGJldHdlZW4gcmVzb3VyY2UgdHlwZSBhbmQgdGhlIHJlc291cmNlLlxuICAgKlxuICAgKiBDYW4gYmUgZWl0aGVyICcvJywgJzonIG9yIGFuIGVtcHR5IHN0cmluZy4gV2lsbCBvbmx5IGJlIHVzZWQgaWYgcmVzb3VyY2VOYW1lIGlzIGRlZmluZWQuXG4gICAqIEBkZWZhdWx0ICcvJ1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYXJuRm9ybWF0IGluc3RlYWRcbiAgICovXG4gIHJlYWRvbmx5IHNlcD86IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb3VyY2UgbmFtZSBvciBwYXRoIHdpdGhpbiB0aGUgcmVzb3VyY2UgKGkuZS4gUzMgYnVja2V0IG9iamVjdCBrZXkpIG9yXG4gICAqIGEgd2lsZGNhcmQgc3VjaCBhcyBgYFwiKlwiYGAuIFRoaXMgaXMgc2VydmljZS1kZXBlbmRlbnQuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzcGVjaWZpYyBBUk4gZm9ybWF0IHRvIHVzZSBmb3IgdGhpcyBBUk4gdmFsdWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlcyB2YWx1ZSBvZiBgc2VwYCBhcyB0aGUgc2VwYXJhdG9yIGZvciBmb3JtYXR0aW5nLFxuICAgKiAgIGBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRWAgaWYgdGhhdCBwcm9wZXJ0eSB3YXMgYWxzbyBub3RkXG4gICAqL1xuICByZWFkb25seSBhcm5Gb3JtYXQ/OiBBcm5Gb3JtYXQ7XG59XG5cbmV4cG9ydCBjbGFzcyBBcm4ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBBUk4gZnJvbSBjb21wb25lbnRzLlxuICAgKlxuICAgKiBJZiBgcGFydGl0aW9uYCwgYHJlZ2lvbmAgb3IgYGFjY291bnRgIGFyZSBub3Qgc3BlY2lmaWVkLCB0aGUgc3RhY2snc1xuICAgKiBwYXJ0aXRpb24sIHJlZ2lvbiBhbmQgYWNjb3VudCB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIElmIGFueSBjb21wb25lbnQgaXMgdGhlIGVtcHR5IHN0cmluZywgYW4gZW1wdHkgc3RyaW5nIHdpbGwgYmUgaW5zZXJ0ZWRcbiAgICogaW50byB0aGUgZ2VuZXJhdGVkIEFSTiBhdCB0aGUgbG9jYXRpb24gdGhhdCBjb21wb25lbnQgY29ycmVzcG9uZHMgdG8uXG4gICAqXG4gICAqIFRoZSBBUk4gd2lsbCBiZSBmb3JtYXR0ZWQgYXMgZm9sbG93czpcbiAgICpcbiAgICogICBhcm46e3BhcnRpdGlvbn06e3NlcnZpY2V9OntyZWdpb259OnthY2NvdW50fTp7cmVzb3VyY2V9e3NlcH17cmVzb3VyY2UtbmFtZX1cbiAgICpcbiAgICogVGhlIHJlcXVpcmVkIEFSTiBwaWVjZXMgdGhhdCBhcmUgb21pdHRlZCB3aWxsIGJlIHRha2VuIGZyb20gdGhlIHN0YWNrIHRoYXRcbiAgICogdGhlICdzY29wZScgaXMgYXR0YWNoZWQgdG8uIElmIGFsbCBBUk4gcGllY2VzIGFyZSBzdXBwbGllZCwgdGhlIHN1cHBsaWVkIHNjb3BlXG4gICAqIGNhbiBiZSAndW5kZWZpbmVkJy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZm9ybWF0KGNvbXBvbmVudHM6IEFybkNvbXBvbmVudHMsIHN0YWNrPzogSUF3c1N0YWNrKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0aXRpb24gPSBjb21wb25lbnRzLnBhcnRpdGlvbiA/PyBzdGFjaz8ucGFydGl0aW9uO1xuICAgIGNvbnN0IHJlZ2lvbiA9IGNvbXBvbmVudHMucmVnaW9uID8/IHN0YWNrPy5yZWdpb247XG4gICAgY29uc3QgYWNjb3VudCA9IGNvbXBvbmVudHMuYWNjb3VudCA/PyBzdGFjaz8uYWNjb3VudDtcblxuICAgIC8vIENhdGNoIGJvdGggJ251bGwnIGFuZCAndW5kZWZpbmVkJ1xuICAgIGlmIChwYXJ0aXRpb24gPT0gbnVsbCB8fCByZWdpb24gPT0gbnVsbCB8fCBhY2NvdW50ID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFybi5mb3JtYXQ6IHBhcnRpdGlvbiAoJHtwYXJ0aXRpb259KSwgcmVnaW9uICgke3JlZ2lvbn0pLCBhbmQgYWNjb3VudCAoJHthY2NvdW50fSkgbXVzdCBhbGwgYmUgcGFzc2VkIGlmIHN0YWNrIGlzIG5vdCBwYXNzZWQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VwID1cbiAgICAgIGNvbXBvbmVudHMuc2VwID8/XG4gICAgICAoY29tcG9uZW50cy5hcm5Gb3JtYXQgPT09IEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FID8gXCI6XCIgOiBcIi9cIik7XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgICBcImFyblwiLFxuICAgICAgXCI6XCIsXG4gICAgICBwYXJ0aXRpb24sXG4gICAgICBcIjpcIixcbiAgICAgIGNvbXBvbmVudHMuc2VydmljZSxcbiAgICAgIFwiOlwiLFxuICAgICAgcmVnaW9uLFxuICAgICAgXCI6XCIsXG4gICAgICBhY2NvdW50LFxuICAgICAgXCI6XCIsXG4gICAgICAuLi4oY29tcG9uZW50cy5hcm5Gb3JtYXQgPT09IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9TTEFTSF9SRVNPVVJDRV9OQU1FXG4gICAgICAgID8gW1wiL1wiXVxuICAgICAgICA6IFtdKSxcbiAgICAgIGNvbXBvbmVudHMucmVzb3VyY2UsXG4gICAgXTtcblxuICAgIGlmIChzZXAgIT09IFwiL1wiICYmIHNlcCAhPT0gXCI6XCIgJiYgc2VwICE9PSBcIlwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdyZXNvdXJjZVBhdGhTZXAgbWF5IG9ubHkgYmUgXCI6XCIsIFwiL1wiIG9yIGFuIGVtcHR5IHN0cmluZycsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRzLnJlc291cmNlTmFtZSAhPSBudWxsKSB7XG4gICAgICB2YWx1ZXMucHVzaChzZXApO1xuICAgICAgdmFsdWVzLnB1c2goY29tcG9uZW50cy5yZXNvdXJjZU5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXMuam9pbihcIlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBBUk4sIHBhcnNlcyBpdCBhbmQgcmV0dXJucyBjb21wb25lbnRzLlxuICAgKlxuICAgKiBJRiBUSEUgQVJOIElTIEEgQ09OQ1JFVEUgU1RSSU5HLi4uXG4gICAqXG4gICAqIC4uLml0IHdpbGwgYmUgcGFyc2VkIGFuZCB2YWxpZGF0ZWQuIFRoZSBzZXBhcmF0b3IgKGBzZXBgKSB3aWxsIGJlIHNldCB0byAnLydcbiAgICogaWYgdGhlIDZ0aCBjb21wb25lbnQgaW5jbHVkZXMgYSAnLycsIGluIHdoaWNoIGNhc2UsIGByZXNvdXJjZWAgd2lsbCBiZSBzZXRcbiAgICogdG8gdGhlIHZhbHVlIGJlZm9yZSB0aGUgJy8nIGFuZCBgcmVzb3VyY2VOYW1lYCB3aWxsIGJlIHRoZSByZXN0LiBJbiBjYXNlXG4gICAqIHRoZXJlIGlzIG5vICcvJywgYHJlc291cmNlYCB3aWxsIGJlIHNldCB0byB0aGUgNnRoIGNvbXBvbmVudHMgYW5kXG4gICAqIGByZXNvdXJjZU5hbWVgIHdpbGwgYmUgc2V0IHRvIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcuXG4gICAqXG4gICAqIElGIFRIRSBBUk4gSVMgQSBUT0tFTi4uLlxuICAgKlxuICAgKiAuLi5pdCBjYW5ub3QgYmUgdmFsaWRhdGVkLCBzaW5jZSB3ZSBkb24ndCBoYXZlIHRoZSBhY3R1YWwgdmFsdWUgeWV0IGF0IHRoZVxuICAgKiB0aW1lIG9mIHRoaXMgZnVuY3Rpb24gY2FsbC4gWW91IHdpbGwgaGF2ZSB0byBzdXBwbHkgYHNlcElmVG9rZW5gIGFuZFxuICAgKiB3aGV0aGVyIG9yIG5vdCBBUk5zIG9mIHRoZSBleHBlY3RlZCBmb3JtYXQgdXN1YWxseSBoYXZlIHJlc291cmNlIG5hbWVzXG4gICAqIGluIG9yZGVyIHRvIHBhcnNlIGl0IHByb3Blcmx5LiBUaGUgcmVzdWx0aW5nIGBBcm5Db21wb25lbnRzYCBvYmplY3Qgd2lsbFxuICAgKiBjb250YWluIHRva2VucyBmb3IgdGhlIHN1YmV4cHJlc3Npb25zIG9mIHRoZSBBUk4sIG5vdCBzdHJpbmcgbGl0ZXJhbHMuXG4gICAqXG4gICAqIElmIHRoZSByZXNvdXJjZSBuYW1lIGNvdWxkIHBvc3NpYmx5IGNvbnRhaW4gdGhlIHNlcGFyYXRvciBjaGFyLCB0aGUgYWN0dWFsXG4gICAqIHJlc291cmNlIG5hbWUgY2Fubm90IGJlIHByb3Blcmx5IHBhcnNlZC4gVGhpcyBvbmx5IG9jY3VycyBpZiB0aGUgc2VwYXJhdG9yXG4gICAqIGNoYXIgaXMgJy8nLCBhbmQgaGFwcGVucyBmb3IgZXhhbXBsZSBmb3IgUzMgb2JqZWN0IEFSTnMsIElBTSBSb2xlIEFSTnMsXG4gICAqIElBTSBPSURDIFByb3ZpZGVyIEFSTnMsIGV0Yy4gVG8gcHJvcGVybHkgZXh0cmFjdCB0aGUgcmVzb3VyY2UgbmFtZSBmcm9tIGFcbiAgICogVG9rZW5pemVkIEFSTiwgeW91IG11c3Qga25vdyB0aGUgcmVzb3VyY2UgdHlwZSBhbmQgY2FsbFxuICAgKiBgQXJuLmV4dHJhY3RSZXNvdXJjZU5hbWVgLlxuICAgKlxuICAgKiBAcGFyYW0gYXJuIFRoZSBBUk4gdG8gcGFyc2VcbiAgICogQHBhcmFtIHNlcElmVG9rZW4gVGhlIHNlcGFyYXRvciB1c2VkIHRvIHNlcGFyYXRlIHJlc291cmNlIGZyb20gcmVzb3VyY2VOYW1lXG4gICAqIEBwYXJhbSBoYXNOYW1lIFdoZXRoZXIgdGhlcmUgaXMgYSBuYW1lIGNvbXBvbmVudCBpbiB0aGUgQVJOIGF0IGFsbC4gRm9yXG4gICAqIGV4YW1wbGUsIFNOUyBUb3BpY3MgQVJOcyBoYXZlIHRoZSAncmVzb3VyY2UnIGNvbXBvbmVudCBjb250YWluIHRoZSB0b3BpY1xuICAgKiBuYW1lLCBhbmQgbm8gJ3Jlc291cmNlTmFtZScgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBhbiBBcm5Db21wb25lbnRzIG9iamVjdCB3aGljaCBhbGxvd3MgYWNjZXNzIHRvIHRoZSB2YXJpb3VzXG4gICAqIGNvbXBvbmVudHMgb2YgdGhlIEFSTi5cbiAgICpcbiAgICogQHJldHVybnMgYW4gQXJuQ29tcG9uZW50cyBvYmplY3Qgd2hpY2ggYWxsb3dzIGFjY2VzcyB0byB0aGUgdmFyaW91c1xuICAgKiAgICAgIGNvbXBvbmVudHMgb2YgdGhlIEFSTi5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHNwbGl0IGluc3RlYWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcGFyc2UoXG4gICAgYXJuOiBzdHJpbmcsXG4gICAgc2VwSWZUb2tlbjogc3RyaW5nID0gXCIvXCIsXG4gICAgaGFzTmFtZTogYm9vbGVhbiA9IHRydWUsXG4gICk6IEFybkNvbXBvbmVudHMge1xuICAgIGxldCBhcm5Gb3JtYXQ6IEFybkZvcm1hdDtcbiAgICBpZiAoIWhhc05hbWUpIHtcbiAgICAgIGFybkZvcm1hdCA9IEFybkZvcm1hdC5OT19SRVNPVVJDRV9OQU1FO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcm5Gb3JtYXQgPVxuICAgICAgICBzZXBJZlRva2VuID09PSBcIi9cIlxuICAgICAgICAgID8gQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUVcbiAgICAgICAgICA6IEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGxpdChhcm4sIGFybkZvcm1hdCk7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXRzIHRoZSBwcm92aWRlZCBBUk4gaW50byBpdHMgY29tcG9uZW50cy5cbiAgICogV29ya3MgYm90aCBpZiAnYXJuJyBpcyBhIHN0cmluZyBsaWtlICdhcm46YXdzOnMzOjo6YnVja2V0JyxcbiAgICogYW5kIGEgVG9rZW4gcmVwcmVzZW50aW5nIGEgZHluYW1pYyBDbG91ZEZvcm1hdGlvbiBleHByZXNzaW9uXG4gICAqIChpbiB3aGljaCBjYXNlIHRoZSByZXR1cm5lZCBjb21wb25lbnRzIHdpbGwgYWxzbyBiZSBkeW5hbWljIENsb3VkRm9ybWF0aW9uIGV4cHJlc3Npb25zLFxuICAgKiBlbmNvZGVkIGFzIFRva2VucykuXG4gICAqXG4gICAqIEBwYXJhbSBhcm4gdGhlIEFSTiB0byBzcGxpdCBpbnRvIGl0cyBjb21wb25lbnRzXG4gICAqIEBwYXJhbSBhcm5Gb3JtYXQgdGhlIGV4cGVjdGVkIGZvcm1hdCBvZiAnYXJuJyAtIGRlcGVuZHMgb24gd2hhdCBmb3JtYXQgdGhlIHNlcnZpY2UgJ2FybicgcmVwcmVzZW50cyB1c2VzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNwbGl0KGFybjogc3RyaW5nLCBhcm5Gb3JtYXQ6IEFybkZvcm1hdCk6IEFybkNvbXBvbmVudHMge1xuICAgIGNvbnN0IGNvbXBvbmVudHMgPSBwYXJzZUFyblNoYXBlKGFybik7XG4gICAgaWYgKGNvbXBvbmVudHMgPT09IFwidG9rZW5cIikge1xuICAgICAgcmV0dXJuIHBhcnNlVG9rZW5Bcm4oYXJuLCBhcm5Gb3JtYXQpO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHBhcnRpdGlvbiwgc2VydmljZSwgcmVnaW9uLCBhY2NvdW50LCByZXNvdXJjZVR5cGVPck5hbWUsIC4uLnJlc3RdID1cbiAgICAgIGNvbXBvbmVudHM7XG5cbiAgICBsZXQgcmVzb3VyY2U6IHN0cmluZztcbiAgICBsZXQgcmVzb3VyY2VOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHNlcDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXNvdXJjZVBhcnRTdGFydEluZGV4ID0gMDtcbiAgICBsZXQgZGV0ZWN0ZWRBcm5Gb3JtYXQ6IEFybkZvcm1hdDtcblxuICAgIGxldCBzbGFzaEluZGV4ID0gcmVzb3VyY2VUeXBlT3JOYW1lLmluZGV4T2YoXCIvXCIpO1xuICAgIGlmIChzbGFzaEluZGV4ID09PSAwKSB7XG4gICAgICAvLyBuZXctc3R5bGUgQVJOcyBhcmUgb2YgdGhlIGZvcm0gJ2Fybjphd3M6czQ6dXMtd2VzdC0xOjEyMzQ1Oi9yZXNvdXJjZS10eXBlL3Jlc291cmNlLW5hbWUnXG4gICAgICBzbGFzaEluZGV4ID0gcmVzb3VyY2VUeXBlT3JOYW1lLmluZGV4T2YoXCIvXCIsIDEpO1xuICAgICAgcmVzb3VyY2VQYXJ0U3RhcnRJbmRleCA9IDE7XG4gICAgICBkZXRlY3RlZEFybkZvcm1hdCA9IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9TTEFTSF9SRVNPVVJDRV9OQU1FO1xuICAgIH1cbiAgICBpZiAoc2xhc2hJbmRleCAhPT0gLTEpIHtcbiAgICAgIC8vIHRoZSBzbGFzaCBpcyBvbmx5IGEgc2VwYXJhdG9yIGlmIEFybkZvcm1hdCBpcyBub3QgTk9fUkVTT1VSQ0VfTkFNRVxuICAgICAgaWYgKGFybkZvcm1hdCA9PT0gQXJuRm9ybWF0Lk5PX1JFU09VUkNFX05BTUUpIHtcbiAgICAgICAgc2VwID0gdW5kZWZpbmVkO1xuICAgICAgICBzbGFzaEluZGV4ID0gLTE7XG4gICAgICAgIGRldGVjdGVkQXJuRm9ybWF0ID0gQXJuRm9ybWF0Lk5PX1JFU09VUkNFX05BTUU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXAgPSBcIi9cIjtcbiAgICAgICAgZGV0ZWN0ZWRBcm5Gb3JtYXQgPVxuICAgICAgICAgIHJlc291cmNlUGFydFN0YXJ0SW5kZXggPT09IDBcbiAgICAgICAgICAgID8gQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUVcbiAgICAgICAgICAgIDogLy8gbmVlZCB0byByZXBlYXQgdGhpcyBoZXJlLCBhcyBvdGhlcndpc2UgdGhlIGNvbXBpbGVyIHRoaW5rcyAnZGV0ZWN0ZWRBcm5Gb3JtYXQnIGlzIG5vdCBpbml0aWFsaXplZCBpbiBhbGwgcGF0aHNcbiAgICAgICAgICAgICAgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX1NMQVNIX1JFU09VUkNFX05BTUU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHNlcCA9IFwiOlwiO1xuICAgICAgc2xhc2hJbmRleCA9IC0xO1xuICAgICAgZGV0ZWN0ZWRBcm5Gb3JtYXQgPSBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VwID0gdW5kZWZpbmVkO1xuICAgICAgZGV0ZWN0ZWRBcm5Gb3JtYXQgPSBBcm5Gb3JtYXQuTk9fUkVTT1VSQ0VfTkFNRTtcbiAgICB9XG5cbiAgICBpZiAoc2xhc2hJbmRleCAhPT0gLTEpIHtcbiAgICAgIHJlc291cmNlID0gcmVzb3VyY2VUeXBlT3JOYW1lLnN1YnN0cmluZyhcbiAgICAgICAgcmVzb3VyY2VQYXJ0U3RhcnRJbmRleCxcbiAgICAgICAgc2xhc2hJbmRleCxcbiAgICAgICk7XG4gICAgICByZXNvdXJjZU5hbWUgPSByZXNvdXJjZVR5cGVPck5hbWUuc3Vic3RyaW5nKHNsYXNoSW5kZXggKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZVR5cGVPck5hbWU7XG4gICAgfVxuXG4gICAgaWYgKHJlc3QubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCFyZXNvdXJjZU5hbWUpIHtcbiAgICAgICAgcmVzb3VyY2VOYW1lID0gXCJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc291cmNlTmFtZSArPSBcIjpcIjtcbiAgICAgIH1cblxuICAgICAgcmVzb3VyY2VOYW1lICs9IHJlc3Quam9pbihcIjpcIik7XG4gICAgfVxuXG4gICAgLy8gXCJ8fCB1bmRlZmluZWRcIiB3aWxsIGNhdXNlIGVtcHR5IHN0cmluZ3MgdG8gYmUgdHJlYXRlZCBhcyBcInVuZGVmaW5lZFwiLlxuICAgIC8vIE9wdGlvbmFsIEFSTiBhdHRyaWJ1dGVzIChlLmcuIHJlZ2lvbiwgYWNjb3VudCkgc2hvdWxkIHJldHVybiBhcyBlbXB0eSBzdHJpbmdcbiAgICAvLyBpZiB0aGV5IGFyZSBwcm92aWRlZCBhcyBzdWNoLlxuICAgIHJldHVybiBmaWx0ZXJVbmRlZmluZWQoe1xuICAgICAgc2VydmljZTogc2VydmljZSB8fCB1bmRlZmluZWQsXG4gICAgICByZXNvdXJjZTogcmVzb3VyY2UgfHwgdW5kZWZpbmVkLFxuICAgICAgcGFydGl0aW9uOiBwYXJ0aXRpb24gfHwgdW5kZWZpbmVkLFxuICAgICAgcmVnaW9uLFxuICAgICAgYWNjb3VudCxcbiAgICAgIHJlc291cmNlTmFtZSxcbiAgICAgIHNlcCxcbiAgICAgIGFybkZvcm1hdDogZGV0ZWN0ZWRBcm5Gb3JtYXQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCB0aGUgZnVsbCByZXNvdXJjZSBuYW1lIGZyb20gYW4gQVJOXG4gICAqXG4gICAqIE5lY2Vzc2FyeSBmb3IgcmVzb3VyY2UgbmFtZXMgKHBhdGhzKSB0aGF0IG1heSBjb250YWluIHRoZSBzZXBhcmF0b3IsIGxpa2VcbiAgICogYGFybjphd3M6aWFtOjoxMTExMTExMTExMTE6cm9sZS9wYXRoL3RvL3JvbGUvbmFtZWAuXG4gICAqXG4gICAqIE9ubHkgd29ya3MgaWYgd2Ugc3RhdGljYWxseSBrbm93IHRoZSBleHBlY3RlZCBgcmVzb3VyY2VUeXBlYCBiZWZvcmVoYW5kLCBzaW5jZSB3ZSdyZSBnb2luZ1xuICAgKiB0byB1c2UgdGhhdCB0byBzcGxpdCB0aGUgc3RyaW5nIG9uICc6PHJlc291cmNlVHlwZT4vJyAoYW5kIHRha2UgdGhlIHJpZ2h0LWhhbmQgc2lkZSkuXG4gICAqXG4gICAqIFdlIGNhbid0IGV4dHJhY3QgdGhlICdyZXNvdXJjZVR5cGUnIGZyb20gdGhlIEFSTiBhdCBoYW5kLCBiZWNhdXNlIENsb3VkRm9ybWF0aW9uIEV4cHJlc3Npb25zXG4gICAqIG9ubHkgYWxsb3cgbGl0ZXJhbHMgaW4gdGhlICdzZXBhcmF0b3InIGFyZ3VtZW50IHRvIGB7IEZuOjpTcGxpdCB9YCwgYW5kIHNvIGl0IGNhbid0IGJlXG4gICAqIGB7IEZuOjpTZWxlY3Q6IFs1LCB7IEZuOjpTcGxpdDogWyc6JywgQVJOXSB9fWAuXG4gICAqXG4gICAqIE9ubHkgbmVjZXNzYXJ5IGZvciBBUk4gZm9ybWF0cyBmb3Igd2hpY2ggdGhlIHR5cGUtbmFtZSBzZXBhcmF0b3IgaXMgYC9gLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBleHRyYWN0UmVzb3VyY2VOYW1lKGFybjogc3RyaW5nLCByZXNvdXJjZVR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY29tcG9uZW50cyA9IHBhcnNlQXJuU2hhcGUoYXJuKTtcbiAgICBpZiAoY29tcG9uZW50cyA9PT0gXCJ0b2tlblwiKSB7XG4gICAgICByZXR1cm4gRm4uc2VsZWN0KDEsIEZuLnNwbGl0djIoYDoke3Jlc291cmNlVHlwZX0vYCwgYXJuKSk7XG4gICAgfVxuXG4gICAgLy8gQXBwYXJlbnRseSB3ZSBjb3VsZCBqdXN0IHBhcnNlIHRoaXMgcmlnaHQgYXdheS4gVmFsaWRhdGUgdGhhdCB3ZSBnb3QgdGhlIHJpZ2h0XG4gICAgLy8gcmVzb3VyY2UgdHlwZSAodG8gbm90aWZ5IGF1dGhvcnMgb2YgaW5jb3JyZWN0IGFzc3VtcHRpb25zIHJpZ2h0IGF3YXkpLlxuICAgIGNvbnN0IHBhcnNlZCA9IEFybi5zcGxpdChhcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKTtcbiAgICBpZiAoXG4gICAgICAhY2RrdGYuVG9rZW4uaXNVbnJlc29sdmVkKHBhcnNlZC5yZXNvdXJjZSkgJiZcbiAgICAgIHBhcnNlZC5yZXNvdXJjZSAhPT0gcmVzb3VyY2VUeXBlXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBFeHBlY3RlZCByZXNvdXJjZSB0eXBlICcke3Jlc291cmNlVHlwZX0nIGluIEFSTiwgZ290ICcke3BhcnNlZC5yZXNvdXJjZX0nIGluICcke2Fybn0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcGFyc2VkLnJlc291cmNlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgcmVzb3VyY2UgbmFtZSBpbiBBUk4sIGRpZG4ndCBmaW5kIG9uZTogJyR7YXJufSdgLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZC5yZXNvdXJjZU5hbWU7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbn1cblxuLyoqXG4gKiBHaXZlbiBhIFRva2VuIGV2YWx1YXRpbmcgdG8gQVJOLCBwYXJzZXMgaXQgYW5kIHJldHVybnMgY29tcG9uZW50cy5cbiAqXG4gKiBUaGUgQVJOIGNhbm5vdCBiZSB2YWxpZGF0ZWQsIHNpbmNlIHdlIGRvbid0IGhhdmUgdGhlIGFjdHVhbCB2YWx1ZSB5ZXRcbiAqIGF0IHRoZSB0aW1lIG9mIHRoaXMgZnVuY3Rpb24gY2FsbC4gWW91IHdpbGwgaGF2ZSB0byBrbm93IHRoZSBzZXBhcmF0b3JcbiAqIGFuZCB0aGUgdHlwZSBvZiBBUk4uXG4gKlxuICogVGhlIHJlc3VsdGluZyBgQXJuQ29tcG9uZW50c2Agb2JqZWN0IHdpbGwgY29udGFpbiB0b2tlbnMgZm9yIHRoZVxuICogc3ViZXhwcmVzc2lvbnMgb2YgdGhlIEFSTiwgbm90IHN0cmluZyBsaXRlcmFscy5cbiAqXG4gKiBXQVJOSU5HOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBwcm9wZXJseSBwYXJzZSB0aGUgY29tcGxldGUgZmluYWxcbiAqICdyZXNvdXJjZU5hbWUnIHBhcnQgaWYgaXQgY29udGFpbnMgY29sb25zLFxuICogbGlrZSAnYXJuOmF3czpjb2duaXRvLXN5bmM6cmVnaW9uOmFjY291bnQ6aWRlbnRpdHlwb29sL3VzLWVhc3QtMToxYTFhMWExYS1mZmZmLTExMTEtOTk5OS0xMjM0NTY3ODpibGEnLlxuICpcbiAqIEBwYXJhbSBhcm5Ub2tlbiBUaGUgaW5wdXQgdG9rZW4gdGhhdCBjb250YWlucyBhbiBBUk5cbiAqIEBwYXJhbSBhcm5Gb3JtYXQgdGhlIGV4cGVjdGVkIGZvcm1hdCBvZiAnYXJuJyAtIGRlcGVuZHMgb24gd2hhdCBmb3JtYXQgdGhlIHNlcnZpY2UgdGhlIEFSTiByZXByZXNlbnRzIHVzZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VUb2tlbkFybihhcm5Ub2tlbjogc3RyaW5nLCBhcm5Gb3JtYXQ6IEFybkZvcm1hdCk6IEFybkNvbXBvbmVudHMge1xuICAvLyBBUk4gbG9va3MgbGlrZTpcbiAgLy8gYXJuOnBhcnRpdGlvbjpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlXG4gIC8vIGFybjpwYXJ0aXRpb246c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZTpyZXNvdXJjZU5hbWVcbiAgLy8gYXJuOnBhcnRpdGlvbjpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlL3Jlc291cmNlTmFtZVxuICAvLyBhcm46cGFydGl0aW9uOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6L3Jlc291cmNlL3Jlc291cmNlTmFtZVxuXG4gIGNvbnN0IGNvbXBvbmVudHMgPSBGbi5zcGxpdHYyKFwiOlwiLCBhcm5Ub2tlbik7XG5cbiAgY29uc3QgcGFydGl0aW9uID0gRm4uc2VsZWN0KDEsIGNvbXBvbmVudHMpLnRvU3RyaW5nKCk7XG4gIGNvbnN0IHNlcnZpY2UgPSBGbi5zZWxlY3QoMiwgY29tcG9uZW50cykudG9TdHJpbmcoKTtcbiAgY29uc3QgcmVnaW9uID0gRm4uc2VsZWN0KDMsIGNvbXBvbmVudHMpLnRvU3RyaW5nKCk7XG4gIGNvbnN0IGFjY291bnQgPSBGbi5zZWxlY3QoNCwgY29tcG9uZW50cykudG9TdHJpbmcoKTtcbiAgbGV0IHJlc291cmNlOiBzdHJpbmc7XG4gIGxldCByZXNvdXJjZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNlcDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChcbiAgICBhcm5Gb3JtYXQgPT09IEFybkZvcm1hdC5OT19SRVNPVVJDRV9OQU1FIHx8XG4gICAgYXJuRm9ybWF0ID09PSBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRVxuICApIHtcbiAgICAvLyB3ZSBrbm93IHRoYXQgdGhlICdyZXNvdXJjZScgcGFydCB3aWxsIGFsd2F5cyBiZSB0aGUgNnRoIHNlZ21lbnQgaW4gdGhpcyBjYXNlXG4gICAgcmVzb3VyY2UgPSBGbi5zZWxlY3QoNSwgY29tcG9uZW50cyk7XG4gICAgaWYgKGFybkZvcm1hdCA9PT0gQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUpIHtcbiAgICAgIHJlc291cmNlTmFtZSA9IEZuLnNlbGVjdCg2LCBjb21wb25lbnRzKTtcbiAgICAgIHNlcCA9IFwiOlwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvdXJjZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICBzZXAgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIHdlIGtub3cgdGhhdCB0aGUgJ3Jlc291cmNlJyBhbmQgJ3Jlc291cmNlTmFtZScgcGFydHMgYXJlIHNlcGFyYXRlZCBieSBzbGFzaCBoZXJlLFxuICAgIC8vIHNvIHdlIHNwbGl0IHRoZSA2dGggc2VnbWVudCBmcm9tIHRoZSBjb2xvbi1zZXBhcmF0ZWQgb25lcyB3aXRoIGEgc2xhc2hcbiAgICBjb25zdCBsYXN0Q29tcG9uZW50cyA9IEZuLnNwbGl0KFwiL1wiLCBGbi5zZWxlY3QoNSwgY29tcG9uZW50cykpO1xuXG4gICAgaWYgKGFybkZvcm1hdCA9PT0gQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUpIHtcbiAgICAgIHJlc291cmNlID0gRm4uc2VsZWN0KDAsIGxhc3RDb21wb25lbnRzKTtcbiAgICAgIHJlc291cmNlTmFtZSA9IEZuLnNlbGVjdCgxLCBsYXN0Q29tcG9uZW50cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFybkZvcm1hdCBpcyBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICAgIC8vIHdoaWNoIG1lYW5zIHRoZXJlJ3MgYW4gZXh0cmEgc2xhc2ggdGhlcmUgYXQgdGhlIGJlZ2lubmluZyB0aGF0IHdlIG5lZWQgdG8gc2tpcFxuICAgICAgcmVzb3VyY2UgPSBGbi5zZWxlY3QoMSwgbGFzdENvbXBvbmVudHMpO1xuICAgICAgcmVzb3VyY2VOYW1lID0gRm4uc2VsZWN0KDIsIGxhc3RDb21wb25lbnRzKTtcbiAgICB9XG4gICAgc2VwID0gXCIvXCI7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhcnRpdGlvbixcbiAgICBzZXJ2aWNlLFxuICAgIHJlZ2lvbixcbiAgICBhY2NvdW50LFxuICAgIHJlc291cmNlLFxuICAgIHJlc291cmNlTmFtZSxcbiAgICBzZXAsXG4gICAgYXJuRm9ybWF0LFxuICB9O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBzdHJpbmcgaXMgZWl0aGVyIHVucGFyc2VhYmxlIG9yIGxvb2tzIG1vc3RseSBsaWtlIGFuIEFSTlxuICovXG5mdW5jdGlvbiBwYXJzZUFyblNoYXBlKGFybjogc3RyaW5nKTogXCJ0b2tlblwiIHwgc3RyaW5nW10ge1xuICAvLyBhc3N1bWUgYW55dGhpbmcgdGhhdCBzdGFydHMgd2l0aCAnYXJuOicgaXMgYW4gQVJOLFxuICAvLyBzbyB3ZSBjYW4gcmVwb3J0IGJldHRlciBlcnJvcnNcbiAgY29uc3QgbG9va3NMaWtlQXJuID0gYXJuLnN0YXJ0c1dpdGgoXCJhcm46XCIpO1xuXG4gIGlmICghbG9va3NMaWtlQXJuKSB7XG4gICAgaWYgKGNka3RmLlRva2VuLmlzVW5yZXNvbHZlZChhcm4pKSB7XG4gICAgICByZXR1cm4gXCJ0b2tlblwiO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBUk5zIG11c3Qgc3RhcnQgd2l0aCBcImFybjpcIiBhbmQgaGF2ZSBhdCBsZWFzdCA2IGNvbXBvbmVudHM6ICR7YXJufWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIHRoZSBBUk4gbWVyZWx5IGNvbnRhaW5zIFRva2VucywgYnV0IG90aGVyd2lzZSAqbG9va3MqIG1vc3RseSBsaWtlIGFuIEFSTixcbiAgLy8gaXQncyBhIHN0cmluZyBvZiB0aGUgZm9ybSAnYXJuOiR7cGFydGl0aW9ufTpzZXJ2aWNlOiR7cmVnaW9ufToke2FjY291bnR9OnJlc291cmNlL3h5eicuXG4gIC8vIFBhcnNlIGZpZWxkcyBvdXQgdG8gdGhlIGJlc3Qgb2Ygb3VyIGFiaWxpdHkuXG4gIC8vIFRva2VucyB3b24ndCBjb250YWluIFwiOlwiLCBzbyB0aGlzIHdvbid0IGJyZWFrIHRoZW0uXG4gIGNvbnN0IGNvbXBvbmVudHMgPSBhcm4uc3BsaXQoXCI6XCIpO1xuXG4gIGNvbnN0IHBhcnRpdGlvbiA9IGNvbXBvbmVudHMubGVuZ3RoID4gMSA/IGNvbXBvbmVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIGlmICghcGFydGl0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJUaGUgYHBhcnRpdGlvbmAgY29tcG9uZW50ICgybmQgY29tcG9uZW50KSBvZiBhbiBBUk4gaXMgcmVxdWlyZWQ6IFwiICsgYXJuLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzZXJ2aWNlID0gY29tcG9uZW50cy5sZW5ndGggPiAyID8gY29tcG9uZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJUaGUgYHNlcnZpY2VgIGNvbXBvbmVudCAoM3JkIGNvbXBvbmVudCkgb2YgYW4gQVJOIGlzIHJlcXVpcmVkOiBcIiArIGFybixcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcmVzb3VyY2UgPSBjb21wb25lbnRzLmxlbmd0aCA+IDUgPyBjb21wb25lbnRzWzVdIDogdW5kZWZpbmVkO1xuICBpZiAoIXJlc291cmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJUaGUgYHJlc291cmNlYCBjb21wb25lbnQgKDZ0aCBjb21wb25lbnQpIG9mIGFuIEFSTiBpcyByZXF1aXJlZDogXCIgKyBhcm4sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlZ2lvbiBjYW4gYmUgbWlzc2luZyBpbiBnbG9iYWwgQVJOcyAoc3VjaCBhcyB1c2VkIGJ5IElBTSlcblxuICAvLyBBY2NvdW50IGNhbiBiZSBtaXNzaW5nIGluIHNvbWUgQVJOIHR5cGVzIChzdWNoIGFzIHVzZWQgZm9yIFMzIGJ1Y2tldHMpXG5cbiAgcmV0dXJuIGNvbXBvbmVudHM7XG59XG4iXX0=
@@ -0,0 +1,91 @@
1
+ import { Construct } from "constructs";
2
+ import { IAssetManager } from "../asset-manager";
3
+ import { DockerImageAssetLocation, DockerImageAssetSource, FileAssetLocation, FileAssetSource } from "../assets";
4
+ export interface AwsAssetManagerOptions {
5
+ /**
6
+ * Existing bucket name to upload file assets to S3.
7
+ *
8
+ * @default - a bucket will be created on demand using the gridUUID
9
+ */
10
+ readonly bucketName?: string;
11
+ /**
12
+ * bucketPrefix to use while storing S3 Assets
13
+ *
14
+ * @default - "" (no prefix)
15
+ */
16
+ readonly bucketPrefix?: string;
17
+ /**
18
+ * Qualifier for asset resource names when creating them on demand
19
+ *
20
+ * @default - "${GridUUID}-assets"
21
+ */
22
+ readonly qualifier?: string;
23
+ /**
24
+ * Use existing ECR Repository for container image assets.
25
+ *
26
+ * @default - a repository will be created on demand using the provided qualifier
27
+ */
28
+ readonly repositoryName?: string;
29
+ /**
30
+ * A prefix to use while tagging and uploading Docker images to ECR.
31
+ *
32
+ * This does not add any separators - the source hash will be appended to
33
+ * this string directly.
34
+ *
35
+ * @default - "" (no prefix)
36
+ */
37
+ readonly dockerTagPrefix?: string;
38
+ }
39
+ /**
40
+ * Properties for the AWS Asset Manager implementation used by AWS stacks.
41
+ */
42
+ export interface AwsAssetManagerProps extends AwsAssetManagerOptions {
43
+ /**
44
+ * The region for creating AWS resources
45
+ */
46
+ readonly region: string;
47
+ /**
48
+ * The account ID for creating AWS resources
49
+ */
50
+ readonly account: string;
51
+ /**
52
+ * The partition for creating AWS resources
53
+ */
54
+ readonly partition: string;
55
+ /**
56
+ * The URL suffix for the partition
57
+ */
58
+ readonly urlSuffix: string;
59
+ }
60
+ /**
61
+ * AWS implementation of IAssetManager using raw Terraform provider resources.
62
+ *
63
+ * This implementation avoids circular dependencies by using raw Terraform resources
64
+ * instead of L2 constructs like Bucket and Repository.
65
+ */
66
+ export declare class AwsAssetManager implements IAssetManager {
67
+ private readonly scope;
68
+ private readonly props;
69
+ private bucket?;
70
+ private repository?;
71
+ private dockerProvider?;
72
+ /**
73
+ * Map of Terraform assets registered by this manager.
74
+ */
75
+ private readonly fileAssetMap;
76
+ private readonly dockerAssetMap;
77
+ constructor(scope: Construct, props: AwsAssetManagerProps);
78
+ /**
79
+ * Register a file asset and return its location details.
80
+ */
81
+ addFileAsset(asset: FileAssetSource): FileAssetLocation;
82
+ /**
83
+ * Register a Docker image asset and return its location details.
84
+ */
85
+ addDockerImageAsset(asset: DockerImageAssetSource): DockerImageAssetLocation;
86
+ private ensureBucket;
87
+ private ensureRepository;
88
+ private ensureDockerProvider;
89
+ private buildS3Url;
90
+ private buildS3ObjectUrl;
91
+ }
@@ -0,0 +1,244 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AwsAssetManager = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const fs = require("node:fs");
7
+ const path = require("node:path");
8
+ const provider_aws_1 = require("@cdktf/provider-aws");
9
+ const provider_docker_1 = require("@cdktf/provider-docker");
10
+ const cdktf_1 = require("cdktf");
11
+ const mime = require("mime-types");
12
+ const assets_1 = require("../assets");
13
+ /**
14
+ * AWS implementation of IAssetManager using raw Terraform provider resources.
15
+ *
16
+ * This implementation avoids circular dependencies by using raw Terraform resources
17
+ * instead of L2 constructs like Bucket and Repository.
18
+ */
19
+ class AwsAssetManager {
20
+ constructor(scope, props) {
21
+ this.scope = scope;
22
+ this.props = props;
23
+ /**
24
+ * Map of Terraform assets registered by this manager.
25
+ */
26
+ this.fileAssetMap = new Map();
27
+ this.dockerAssetMap = new Map();
28
+ }
29
+ /**
30
+ * Register a file asset and return its location details.
31
+ */
32
+ addFileAsset(asset) {
33
+ if (!this.bucket) {
34
+ this.ensureBucket();
35
+ }
36
+ // TODO: Support executable asset props?
37
+ // validateFileAssetSource(asset);
38
+ // const extension = asset.fileName != undefined ? path.extname(asset.fileName) : "";
39
+ const extension = path.extname(asset.fileName);
40
+ const bucketPrefix = this.props.bucketPrefix ?? "";
41
+ const objectKey = bucketPrefix +
42
+ asset.sourceHash +
43
+ (asset.packaging === assets_1.FileAssetPackaging.ZIP_DIRECTORY
44
+ ? ".zip"
45
+ : extension);
46
+ if (this.fileAssetMap.has(objectKey)) {
47
+ return this.fileAssetMap.get(objectKey);
48
+ }
49
+ // NOTE: AWSCDK uses sourceHash as the Construct ID
50
+ // Avoided here because TerraformAsset paths already includes sourceHash
51
+ // Ensure unique ID for the asset in the scope
52
+ let id = "FileAsset";
53
+ for (let i = 0; this.scope.node.tryFindChild(id); i++) {
54
+ id = `${id}_${i}`;
55
+ }
56
+ const assetStats = fs.statSync(asset.fileName);
57
+ const tfAsset = new cdktf_1.TerraformAsset(this.scope, id, {
58
+ path: asset.fileName,
59
+ assetHash: asset.sourceHash,
60
+ type: assetStats.isDirectory() ? cdktf_1.AssetType.ARCHIVE : cdktf_1.AssetType.FILE,
61
+ });
62
+ const s3Asset = new provider_aws_1.s3Object.S3Object(this.scope, `${id}_S3`, {
63
+ key: objectKey,
64
+ bucket: this.bucket.bucket,
65
+ source: tfAsset.path,
66
+ sourceHash: asset.sourceHash,
67
+ contentType: mime.contentType(extension) || undefined,
68
+ });
69
+ const httpUrl = this.buildS3Url(s3Asset.key);
70
+ // Store the asset location details
71
+ const location = {
72
+ bucketName: this.bucket.bucket,
73
+ objectKey: s3Asset.key,
74
+ httpUrl,
75
+ s3Url: httpUrl,
76
+ s3ObjectUrl: this.buildS3ObjectUrl(s3Asset.key),
77
+ };
78
+ // Store in the map for future lookups
79
+ this.fileAssetMap.set(objectKey, location);
80
+ // Return the asset location details
81
+ return location;
82
+ }
83
+ /**
84
+ * Register a Docker image asset and return its location details.
85
+ */
86
+ addDockerImageAsset(asset) {
87
+ // validateDockerImageAssetSource(asset);
88
+ if (!this.dockerProvider) {
89
+ this.ensureDockerProvider();
90
+ }
91
+ if (!this.repository) {
92
+ this.ensureRepository();
93
+ }
94
+ // Ensure dependency on ecr repo by using token instead of this.buildRepositoryUri();
95
+ const repositoryUri = this.repository.repositoryUrl;
96
+ const dockerTagPrefix = this.props.dockerTagPrefix ?? "";
97
+ const imageTag = `${dockerTagPrefix}${asset.sourceHash}`;
98
+ const imageUri = `${repositoryUri}:${imageTag}`;
99
+ if (this.dockerAssetMap.has(imageUri)) {
100
+ return this.dockerAssetMap.get(imageUri);
101
+ }
102
+ // NOTE: AWSCDK uses sourceHash as the Construct ID
103
+ // const sourceHash = asset.assetName
104
+ // ? `${asset.assetName}-${asset.sourceHash}`
105
+ // : asset.sourceHash;
106
+ // Ensure unique ID for the asset in the scope
107
+ let id = "DockerAsset";
108
+ for (let i = 0; this.scope.node.tryFindChild(id); i++) {
109
+ id = `${id}_${i}`;
110
+ }
111
+ const tfAsset = new cdktf_1.TerraformAsset(this.scope, id, {
112
+ path: asset.directoryName,
113
+ assetHash: asset.sourceHash,
114
+ type: cdktf_1.AssetType.DIRECTORY, // Error if not directory asset type?
115
+ // auto infer type...
116
+ // type: <auto-infer>,
117
+ });
118
+ const imageAsset = new provider_docker_1.image.Image(this.scope, `${id}_Image`, {
119
+ // https://github.com/kreuzwerker/terraform-provider-docker/blob/v3.6.2/internal/provider/docker_buildx_build.go#L216
120
+ name: imageUri,
121
+ buildAttribute: {
122
+ context: tfAsset.path, // asset.directoryName, // required
123
+ // TODO: Verify if ${path.cwd} is needed given directoryName is relative?
124
+ // path.join(
125
+ // Token.asString(ref("path.cwd")),
126
+ // asset.directoryName,
127
+ // ),
128
+ dockerfile: asset.dockerFile,
129
+ buildArgs: asset.dockerBuildArgs,
130
+ secrets: asset.dockerBuildSecrets
131
+ ? Object.entries(asset.dockerBuildSecrets).map(([k, v]) => ({
132
+ id: k,
133
+ // TODO: env secrets?
134
+ src: v,
135
+ }))
136
+ : undefined,
137
+ networkMode: asset.networkMode,
138
+ platform: asset.platform,
139
+ target: asset.dockerBuildTarget,
140
+ cacheFrom: asset.dockerCacheFrom
141
+ ? parseDockerCacheEntries(...asset.dockerCacheFrom)
142
+ : undefined,
143
+ noCache: asset.dockerCacheDisabled,
144
+ // Enable buildx (currently does not support ulimits)
145
+ builder: "default",
146
+ // TODO: no SSH Support?,
147
+ // ssh: asset.dockerBuildSSH,
148
+ // TODO: no cacheTo support?
149
+ // cacheTo: asset.dockerCacheTo
150
+ // ? parseCacheEntries(asset.dockerCacheTo)
151
+ // : undefined,
152
+ // TODO: no dockerOutputs support?
153
+ // outputs: asset.dockerOutputs,
154
+ },
155
+ triggers: {
156
+ dir_sha1: asset.sourceHash, // use sourceHash to trigger rebuilds
157
+ },
158
+ // executable: asset.executable, // TODO: Support executable assets
159
+ });
160
+ const registryImage = new provider_docker_1.registryImage.RegistryImage(this.scope, `${id}_RegistryImage`, {
161
+ name: imageAsset.name,
162
+ });
163
+ const location = {
164
+ imageUri: registryImage.name,
165
+ repositoryName: this.repository.name,
166
+ imageTag,
167
+ };
168
+ // Store the asset location details
169
+ this.dockerAssetMap.set(imageUri, location);
170
+ // Return the asset location details
171
+ return location;
172
+ }
173
+ ensureBucket() {
174
+ if (this.bucket)
175
+ return;
176
+ if (this.props.bucketName) {
177
+ // Use existing bucket if provided
178
+ this.bucket = new provider_aws_1.dataAwsS3Bucket.DataAwsS3Bucket(this.scope, "ExistingAssetBucket", {
179
+ bucket: this.props.bucketName,
180
+ });
181
+ return;
182
+ }
183
+ const bucketName = `${this.props.qualifier ?? "assets"}-${this.props.account}-${this.props.region}`;
184
+ this.bucket = new provider_aws_1.s3Bucket.S3Bucket(this.scope, "AssetBucket", {
185
+ bucket: bucketName,
186
+ });
187
+ }
188
+ ensureRepository() {
189
+ if (this.repository)
190
+ return;
191
+ if (this.props.repositoryName) {
192
+ // Use existing repository if provided
193
+ this.repository = new provider_aws_1.dataAwsEcrRepository.DataAwsEcrRepository(this.scope, "ExistingAssetRepository", {
194
+ name: this.props.repositoryName,
195
+ });
196
+ return;
197
+ }
198
+ this.repository = new provider_aws_1.ecrRepository.EcrRepository(this.scope, "AssetRepository", {
199
+ name: this.props.qualifier
200
+ ? `${this.props.qualifier}-assets`
201
+ : "assets",
202
+ });
203
+ }
204
+ ensureDockerProvider() {
205
+ if (this.dockerProvider)
206
+ return;
207
+ this.dockerProvider = new provider_docker_1.provider.DockerProvider(this.scope, "Docker",
208
+ // TODO: Support custom Docker host?
209
+ {});
210
+ }
211
+ buildS3Url(objectKey) {
212
+ const bucketName = this.bucket.bucket;
213
+ return `https://${bucketName}.s3.${this.props.region}.${this.props.urlSuffix}/${objectKey}`;
214
+ }
215
+ buildS3ObjectUrl(objectKey) {
216
+ const bucketName = this.bucket.bucket;
217
+ return `s3://${bucketName}/${objectKey}`;
218
+ }
219
+ }
220
+ exports.AwsAssetManager = AwsAssetManager;
221
+ _a = JSII_RTTI_SYMBOL_1;
222
+ AwsAssetManager[_a] = { fqn: "terraconstructs.aws.AwsAssetManager", version: "0.1.1" };
223
+ /**
224
+ * Convert the Docker cache options to a format suitable for the buildx cacheFrom flag.
225
+ */
226
+ function parseDockerCacheEntries(...cacheOption) {
227
+ if (cacheOption.length === 0) {
228
+ return undefined;
229
+ }
230
+ let cacheFrom = [];
231
+ // https://github.com/docker/buildx/blob/v0.25.0/util/buildflags/cache.go#L140
232
+ for (const c of cacheOption) {
233
+ let cacheFromEntry = `type=${c.type}`;
234
+ if (c.params) {
235
+ const params = Object.entries(c.params)
236
+ .map(([k, v]) => `${k}=${v}`)
237
+ .join(",");
238
+ cacheFromEntry += `,${params}`;
239
+ }
240
+ cacheFrom.push(cacheFromEntry);
241
+ }
242
+ return cacheFrom;
243
+ }
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWFzc2V0LW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXdzL2F3cy1hc3NldC1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOEJBQThCO0FBQzlCLGtDQUFrQztBQUNsQyxzREFNNkI7QUFDN0IsNERBSWdDO0FBQ2hDLGlDQUllO0FBRWYsbUNBQW1DO0FBRW5DLHNDQU9tQjtBQStEbkI7Ozs7O0dBS0c7QUFDSCxNQUFhLGVBQWU7SUFXMUIsWUFDbUIsS0FBZ0IsRUFDaEIsS0FBMkI7UUFEM0IsVUFBSyxHQUFMLEtBQUssQ0FBVztRQUNoQixVQUFLLEdBQUwsS0FBSyxDQUFzQjtRQVA5Qzs7V0FFRztRQUNjLGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBQTZCLENBQUM7UUFDcEQsbUJBQWMsR0FBRyxJQUFJLEdBQUcsRUFBb0MsQ0FBQztJQUkzRSxDQUFDO0lBRUo7O09BRUc7SUFDSSxZQUFZLENBQUMsS0FBc0I7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUVELHdDQUF3QztRQUN4QyxrQ0FBa0M7UUFDbEMscUZBQXFGO1FBQ3JGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFNBQVMsR0FDYixZQUFZO1lBQ1osS0FBSyxDQUFDLFVBQVU7WUFDaEIsQ0FBQyxLQUFLLENBQUMsU0FBUyxLQUFLLDJCQUFrQixDQUFDLGFBQWE7Z0JBQ25ELENBQUMsQ0FBQyxNQUFNO2dCQUNSLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVqQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxD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LENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksU0FBUyxHQUFhLEVBQUUsQ0FBQztJQUM3Qiw4RUFBOEU7SUFDOUUsS0FBSyxNQUFNLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUM1QixJQUFJLGNBQWMsR0FBRyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNiLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztpQkFDcEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2lCQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDYixjQUFjLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7XG4gIHMzQnVja2V0LFxuICBzM09iamVjdCxcbiAgZWNyUmVwb3NpdG9yeSxcbiAgZGF0YUF3c0VjclJlcG9zaXRvcnksXG4gIGRhdGFBd3NTM0J1Y2tldCxcbn0gZnJvbSBcIkBjZGt0Zi9wcm92aWRlci1hd3NcIjtcbmltcG9ydCB7XG4gIHByb3ZpZGVyIGFzIGRvY2tlclByb3ZpZGVyLFxuICBpbWFnZSBhcyBkb2NrZXJJbWFnZSxcbiAgcmVnaXN0cnlJbWFnZSBhcyBkb2NrZXJSZWdpc3RyeUltYWdlLFxufSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWRvY2tlclwiO1xuaW1wb3J0IHtcbiAgQXNzZXRUeXBlLFxuICBUZXJyYWZvcm1Bc3NldCxcbiAgLy8gcmVmLFxufSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgKiBhcyBtaW1lIGZyb20gXCJtaW1lLXR5cGVzXCI7XG5pbXBvcnQgeyBJQXNzZXRNYW5hZ2VyIH0gZnJvbSBcIi4uL2Fzc2V0LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIERvY2tlckNhY2hlT3B0aW9uLFxuICBEb2NrZXJJbWFnZUFzc2V0TG9jYXRpb24sXG4gIERvY2tlckltYWdlQXNzZXRTb3VyY2UsXG4gIEZpbGVBc3NldExvY2F0aW9uLFxuICBGaWxlQXNzZXRQYWNrYWdpbmcsXG4gIEZpbGVBc3NldFNvdXJjZSxcbn0gZnJvbSBcIi4uL2Fzc2V0c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF3c0Fzc2V0TWFuYWdlck9wdGlvbnMge1xuICAvKipcbiAgICogRXhpc3RpbmcgYnVja2V0IG5hbWUgdG8gdXBsb2FkIGZpbGUgYXNzZXRzIHRvIFMzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgYnVja2V0IHdpbGwgYmUgY3JlYXRlZCBvbiBkZW1hbmQgdXNpbmcgdGhlIGdyaWRVVUlEXG4gICAqL1xuICByZWFkb25seSBidWNrZXROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogYnVja2V0UHJlZml4IHRvIHVzZSB3aGlsZSBzdG9yaW5nIFMzIEFzc2V0c1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIFwiXCIgKG5vIHByZWZpeClcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldFByZWZpeD86IHN0cmluZztcbiAgLyoqXG4gICAqIFF1YWxpZmllciBmb3IgYXNzZXQgcmVzb3VyY2UgbmFtZXMgd2hlbiBjcmVhdGluZyB0aGVtIG9uIGRlbWFuZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFwiJHtHcmlkVVVJRH0tYXNzZXRzXCJcbiAgICovXG4gIHJlYWRvbmx5IHF1YWxpZmllcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFVzZSBleGlzdGluZyBFQ1IgUmVwb3NpdG9yeSBmb3IgY29udGFpbmVyIGltYWdlIGFzc2V0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIHJlcG9zaXRvcnkgd2lsbCBiZSBjcmVhdGVkIG9uIGRlbWFuZCB1c2luZyB0aGUgcHJvdmlkZWQgcXVhbGlmaWVyXG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5TmFtZT86IHN0cmluZzsgLy8gVE9ETzogU3VwcG9ydCBVUkkgKyBVUkkgUGFyc2luZyBmb3IgY3Jvc3MgQWNjb3VudCB1c2FnZT9cbiAgLyoqXG4gICAqIEEgcHJlZml4IHRvIHVzZSB3aGlsZSB0YWdnaW5nIGFuZCB1cGxvYWRpbmcgRG9ja2VyIGltYWdlcyB0byBFQ1IuXG4gICAqXG4gICAqIFRoaXMgZG9lcyBub3QgYWRkIGFueSBzZXBhcmF0b3JzIC0gdGhlIHNvdXJjZSBoYXNoIHdpbGwgYmUgYXBwZW5kZWQgdG9cbiAgICogdGhpcyBzdHJpbmcgZGlyZWN0bHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gXCJcIiAobm8gcHJlZml4KVxuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VyVGFnUHJlZml4Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRoZSBBV1MgQXNzZXQgTWFuYWdlciBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IEFXUyBzdGFja3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXdzQXNzZXRNYW5hZ2VyUHJvcHMgZXh0ZW5kcyBBd3NBc3NldE1hbmFnZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSByZWdpb24gZm9yIGNyZWF0aW5nIEFXUyByZXNvdXJjZXNcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYWNjb3VudCBJRCBmb3IgY3JlYXRpbmcgQVdTIHJlc291cmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFydGl0aW9uIGZvciBjcmVhdGluZyBBV1MgcmVzb3VyY2VzXG4gICAqL1xuICByZWFkb25seSBwYXJ0aXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVSTCBzdWZmaXggZm9yIHRoZSBwYXJ0aXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHVybFN1ZmZpeDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFXUyBpbXBsZW1lbnRhdGlvbiBvZiBJQXNzZXRNYW5hZ2VyIHVzaW5nIHJhdyBUZXJyYWZvcm0gcHJvdmlkZXIgcmVzb3VyY2VzLlxuICpcbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gYXZvaWRzIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBieSB1c2luZyByYXcgVGVycmFmb3JtIHJlc291cmNlc1xuICogaW5zdGVhZCBvZiBMMiBjb25zdHJ1Y3RzIGxpa2UgQnVja2V0IGFuZCBSZXBvc2l0b3J5LlxuICovXG5leHBvcnQgY2xhc3MgQXdzQXNzZXRNYW5hZ2VyIGltcGxlbWVudHMgSUFzc2V0TWFuYWdlciB7XG4gIHByaXZhdGUgYnVja2V0PzogczNCdWNrZXQuUzNCdWNrZXQgfCBkYXRhQXdzUzNCdWNrZXQuRGF0YUF3c1MzQnVja2V0O1xuICBwcml2YXRlIHJlcG9zaXRvcnk/OlxuICAgIHwgZWNyUmVwb3NpdG9yeS5FY3JSZXBvc2l0b3J5XG4gICAgfCBkYXRhQXdzRWNyUmVwb3NpdG9yeS5EYXRhQXdzRWNyUmVwb3NpdG9yeTtcbiAgcHJpdmF0ZSBkb2NrZXJQcm92aWRlcj86IGRvY2tlclByb3ZpZGVyLkRvY2tlclByb3ZpZGVyO1xuICAvKipcbiAgICogTWFwIG9mIFRlcnJhZm9ybSBhc3NldHMgcmVnaXN0ZXJlZCBieSB0aGlzIG1hbmFnZXIuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVBc3NldE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBGaWxlQXNzZXRMb2NhdGlvbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkb2NrZXJBc3NldE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBEb2NrZXJJbWFnZUFzc2V0TG9jYXRpb24+KCk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBBd3NBc3NldE1hbmFnZXJQcm9wcyxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGZpbGUgYXNzZXQgYW5kIHJldHVybiBpdHMgbG9jYXRpb24gZGV0YWlscy5cbiAgICovXG4gIHB1YmxpYyBhZGRGaWxlQXNzZXQoYXNzZXQ6IEZpbGVBc3NldFNvdXJjZSk6IEZpbGVBc3NldExvY2F0aW9uIHtcbiAgICBpZiAoIXRoaXMuYnVja2V0KSB7XG4gICAgICB0aGlzLmVuc3VyZUJ1Y2tldCgpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IFN1cHBvcnQgZXhlY3V0YWJsZSBhc3NldCBwcm9wcz9cbiAgICAvLyB2YWxpZGF0ZUZpbGVBc3NldFNvdXJjZShhc3NldCk7XG4gICAgLy8gY29uc3QgZXh0ZW5zaW9uID0gYXNzZXQuZmlsZU5hbWUgIT0gdW5kZWZpbmVkID8gcGF0aC5leHRuYW1lKGFzc2V0LmZpbGVOYW1lKSA6IFwiXCI7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGFzc2V0LmZpbGVOYW1lKTtcbiAgICBjb25zdCBidWNrZXRQcmVmaXggPSB0aGlzLnByb3BzLmJ1Y2tldFByZWZpeCA/PyBcIlwiO1xuICAgIGNvbnN0IG9iamVjdEtleSA9XG4gICAgICBidWNrZXRQcmVmaXggK1xuICAgICAgYXNzZXQuc291cmNlSGFzaCArXG4gICAgICAoYXNzZXQucGFja2FnaW5nID09PSBGaWxlQXNzZXRQYWNrYWdpbmcuWklQX0RJUkVDVE9SWVxuICAgICAgICA/IFwiLnppcFwiXG4gICAgICAgIDogZXh0ZW5zaW9uKTtcblxuICAgIGlmICh0aGlzLmZpbGVBc3NldE1hcC5oYXMob2JqZWN0S2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZUFzc2V0TWFwLmdldChvYmplY3RLZXkpITtcbiAgICB9XG5cbiAgICAvLyBOT1RFOiBBV1NDREsgdXNlcyBzb3VyY2VIYXNoIGFzIHRoZSBDb25zdHJ1Y3QgSURcbiAgICAvLyBBdm9pZGVkIGhlcmUgYmVjYXVzZSBUZXJyYWZvcm1Bc3NldCBwYXRocyBhbHJlYWR5IGluY2x1ZGVzIHNvdXJjZUhhc2hcbiAgICAvLyBFbnN1cmUgdW5pcXVlIElEIGZvciB0aGUgYXNzZXQgaW4gdGhlIHNjb3BlXG4gICAgbGV0IGlkID0gXCJGaWxlQXNzZXRcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgdGhpcy5zY29wZS5ub2RlLnRyeUZpbmRDaGlsZChpZCk7IGkrKykge1xuICAgICAgaWQgPSBgJHtpZH1fJHtpfWA7XG4gICAgfVxuXG4gICAgY29uc3QgYXNzZXRTdGF0cyA9IGZzLnN0YXRTeW5jKGFzc2V0LmZpbGVOYW1lKTtcbiAgICBjb25zdCB0ZkFzc2V0ID0gbmV3IFRlcnJhZm9ybUFzc2V0KHRoaXMuc2NvcGUsIGlkLCB7XG4gICAgICBwYXRoOiBhc3NldC5maWxlTmFtZSxcbiAgICAgIGFzc2V0SGFzaDogYXNzZXQuc291cmNlSGFzaCxcbiAgICAgIHR5cGU6IGFzc2V0U3RhdHMuaXNEaXJlY3RvcnkoKSA/IEFzc2V0VHlwZS5BUkNISVZFIDogQXNzZXRUeXBlLkZJTEUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzM0Fzc2V0ID0gbmV3IHMzT2JqZWN0LlMzT2JqZWN0KHRoaXMuc2NvcGUsIGAke2lkfV9TM2AsIHtcbiAgICAgIGtleTogb2JqZWN0S2V5LFxuICAgICAgYnVja2V0OiB0aGlzLmJ1Y2tldCEuYnVja2V0LFxuICAgICAgc291cmNlOiB0ZkFzc2V0LnBhdGgsXG4gICAgICBzb3VyY2VIYXNoOiBhc3NldC5zb3VyY2VIYXNoLFxuICAgICAgY29udGVudFR5cGU6IG1pbWUuY29udGVudFR5cGUoZXh0ZW5zaW9uKSB8fCB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBodHRwVXJsID0gdGhpcy5idWlsZFMzVXJsKHMzQXNzZXQua2V5KTtcbiAgICAvLyBTdG9yZSB0aGUgYXNzZXQgbG9jYXRpb24gZGV0YWlsc1xuICAgIGNvbnN0IGxvY2F0aW9uOiBGaWxlQXNzZXRMb2NhdGlvbiA9IHtcbiAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0IS5idWNrZXQsXG4gICAgICBvYmplY3RLZXk6IHMzQXNzZXQua2V5LFxuICAgICAgaHR0cFVybCxcbiAgICAgIHMzVXJsOiBodHRwVXJsLFxuICAgICAgczNPYmplY3RVcmw6IHRoaXMuYnVpbGRTM09iamVjdFVybChzM0Fzc2V0LmtleSksXG4gICAgfTtcbiAgICAvLyBTdG9yZSBpbiB0aGUgbWFwIGZvciBmdXR1cmUgbG9va3Vwc1xuICAgIHRoaXMuZmlsZUFzc2V0TWFwLnNldChvYmplY3RLZXksIGxvY2F0aW9uKTtcbiAgICAvLyBSZXR1cm4gdGhlIGFzc2V0IGxvY2F0aW9uIGRldGFpbHNcbiAgICByZXR1cm4gbG9jYXRpb247XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBEb2NrZXIgaW1hZ2UgYXNzZXQgYW5kIHJldHVybiBpdHMgbG9jYXRpb24gZGV0YWlscy5cbiAgICovXG4gIHB1YmxpYyBhZGREb2NrZXJJbWFnZUFzc2V0KFxuICAgIGFzc2V0OiBEb2NrZXJJbWFnZUFzc2V0U291cmNlLFxuICApOiBEb2NrZXJJbWFnZUFzc2V0TG9jYXRpb24ge1xuICAgIC8vIHZhbGlkYXRlRG9ja2VySW1hZ2VBc3NldFNvdXJjZShhc3NldCk7XG4gICAgaWYgKCF0aGlzLmRvY2tlclByb3ZpZGVyKSB7XG4gICAgICB0aGlzLmVuc3VyZURvY2tlclByb3ZpZGVyKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5yZXBvc2l0b3J5KSB7XG4gICAgICB0aGlzLmVuc3VyZVJlcG9zaXRvcnkoKTtcbiAgICB9XG4gICAgLy8gRW5zdXJlIGRlcGVuZGVuY3kgb24gZWNyIHJlcG8gYnkgdXNpbmcgdG9rZW4gaW5zdGVhZCBvZiB0aGlzLmJ1aWxkUmVwb3NpdG9yeVVyaSgpO1xuICAgIGNvbnN0IHJlcG9zaXRvcnlVcmkgPSB0aGlzLnJlcG9zaXRvcnkhLnJlcG9zaXRvcnlVcmw7XG5cbiAgICBjb25zdCBkb2NrZXJUYWdQcmVmaXggPSB0aGlzLnByb3BzLmRvY2tlclRhZ1ByZWZpeCA/PyBcIlwiO1xuICAgIGNvbnN0IGltYWdlVGFnID0gYCR7ZG9ja2VyVGFnUHJlZml4fSR7YXNzZXQuc291cmNlSGFzaH1gO1xuICAgIGNvbnN0IGltYWdlVXJpID0gYCR7cmVwb3NpdG9yeVVyaX06JHtpbWFnZVRhZ31gO1xuXG4gICAgaWYgKHRoaXMuZG9ja2VyQXNzZXRNYXAuaGFzKGltYWdlVXJpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZG9ja2VyQXNzZXRNYXAuZ2V0KGltYWdlVXJpKSE7XG4gICAgfVxuXG4gICAgLy8gTk9URTogQVdTQ0RLIHVzZXMgc291cmNlSGFzaCBhcyB0aGUgQ29uc3RydWN0IElEXG4gICAgLy8gY29uc3Qgc291cmNlSGFzaCA9IGFzc2V0LmFzc2V0TmFtZVxuICAgIC8vICAgPyBgJHthc3NldC5hc3NldE5hbWV9LSR7YXNzZXQuc291cmNlSGFzaH1gXG4gICAgLy8gICA6IGFzc2V0LnNvdXJjZUhhc2g7XG5cbiAgICAvLyBFbnN1cmUgdW5pcXVlIElEIGZvciB0aGUgYXNzZXQgaW4gdGhlIHNjb3BlXG4gICAgbGV0IGlkID0gXCJEb2NrZXJBc3NldFwiO1xuICAgIGZvciAobGV0IGkgPSAwOyB0aGlzLnNjb3BlLm5vZGUudHJ5RmluZENoaWxkKGlkKTsgaSsrKSB7XG4gICAgICBpZCA9IGAke2lkfV8ke2l9YDtcbiAgICB9XG5cbiAgICBjb25zdCB0ZkFzc2V0ID0gbmV3IFRlcnJhZm9ybUFzc2V0KHRoaXMuc2NvcGUsIGlkLCB7XG4gICAgICBwYXRoOiBhc3NldC5kaXJlY3RvcnlOYW1lLFxuICAgICAgYXNzZXRIYXNoOiBhc3NldC5zb3VyY2VIYXNoLFxuICAgICAgdHlwZTogQXNzZXRUeXBlLkRJUkVDVE9SWSwgLy8gRXJyb3IgaWYgbm90IGRpcmVjdG9yeSBhc3NldCB0eXBlP1xuICAgICAgLy8gYXV0byBpbmZlciB0eXBlLi4uXG4gICAgICAvLyB0eXBlOiA8YXV0by1pbmZlcj4sXG4gICAgfSk7XG5cbiAgICBjb25zdCBpbWFnZUFzc2V0ID0gbmV3IGRvY2tlckltYWdlLkltYWdlKHRoaXMuc2NvcGUsIGAke2lkfV9JbWFnZWAsIHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmV1endlcmtlci90ZXJyYWZvcm0tcHJvdmlkZXItZG9ja2VyL2Jsb2IvdjMuNi4yL2ludGVybmFsL3Byb3ZpZGVyL2RvY2tlcl9idWlsZHhfYnVpbGQuZ28jTDIxNlxuICAgICAgbmFtZTogaW1hZ2VVcmksXG4gICAgICBidWlsZEF0dHJpYnV0ZToge1xuICAgICAgICBjb250ZXh0OiB0ZkFzc2V0LnBhdGgsIC8vIGFzc2V0LmRpcmVjdG9yeU5hbWUsIC8vIHJlcXVpcmVkXG4gICAgICAgIC8vIFRPRE86IFZlcmlmeSBpZiAke3BhdGguY3dkfSBpcyBuZWVkZWQgZ2l2ZW4gZGlyZWN0b3J5TmFtZSBpcyByZWxhdGl2ZT9cbiAgICAgICAgLy8gcGF0aC5qb2luKFxuICAgICAgICAvLyAgIFRva2VuLmFzU3RyaW5nKHJlZihcInBhdGguY3dkXCIpKSxcbiAgICAgICAgLy8gICBhc3NldC5kaXJlY3RvcnlOYW1lLFxuICAgICAgICAvLyApLFxuICAgICAgICBkb2NrZXJmaWxlOiBhc3NldC5kb2NrZXJGaWxlLFxuICAgICAgICBidWlsZEFyZ3M6IGFzc2V0LmRvY2tlckJ1aWxkQXJncyxcbiAgICAgICAgc2VjcmV0czogYXNzZXQuZG9ja2VyQnVpbGRTZWNyZXRzXG4gICAgICAgICAgPyBPYmplY3QuZW50cmllcyhhc3NldC5kb2NrZXJCdWlsZFNlY3JldHMpLm1hcCgoW2ssIHZdKSA9PiAoe1xuICAgICAgICAgICAgICBpZDogayxcbiAgICAgICAgICAgICAgLy8gVE9ETzogZW52IHNlY3JldHM/XG4gICAgICAgICAgICAgIHNyYzogdixcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBuZXR3b3JrTW9kZTogYXNzZXQubmV0d29ya01vZGUsXG4gICAgICAgIHBsYXRmb3JtOiBhc3NldC5wbGF0Zm9ybSxcbiAgICAgICAgdGFyZ2V0OiBhc3NldC5kb2NrZXJCdWlsZFRhcmdldCxcbiAgICAgICAgY2FjaGVGcm9tOiBhc3NldC5kb2NrZXJDYWNoZUZyb21cbiAgICAgICAgICA/IHBhcnNlRG9ja2VyQ2FjaGVFbnRyaWVzKC4uLmFzc2V0LmRvY2tlckNhY2hlRnJvbSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgbm9DYWNoZTogYXNzZXQuZG9ja2VyQ2FjaGVEaXNhYmxlZCxcbiAgICAgICAgLy8gRW5hYmxlIGJ1aWxkeCAoY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgdWxpbWl0cylcbiAgICAgICAgYnVpbGRlcjogXCJkZWZhdWx0XCIsXG4gICAgICAgIC8vIFRPRE86IG5vIFNTSCBTdXBwb3J0PyxcbiAgICAgICAgLy8gc3NoOiBhc3NldC5kb2NrZXJCdWlsZFNTSCxcbiAgICAgICAgLy8gVE9ETzogbm8gY2FjaGVUbyBzdXBwb3J0P1xuICAgICAgICAvLyBjYWNoZVRvOiBhc3NldC5kb2NrZXJDYWNoZVRvXG4gICAgICAgIC8vICAgPyBwYXJzZUNhY2hlRW50cmllcyhhc3NldC5kb2NrZXJDYWNoZVRvKVxuICAgICAgICAvLyAgIDogdW5kZWZpbmVkLFxuICAgICAgICAvLyBUT0RPOiBubyBkb2NrZXJPdXRwdXRzIHN1cHBvcnQ/XG4gICAgICAgIC8vIG91dHB1dHM6IGFzc2V0LmRvY2tlck91dHB1dHMsXG4gICAgICB9LFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgZGlyX3NoYTE6IGFzc2V0LnNvdXJjZUhhc2gsIC8vIHVzZSBzb3VyY2VIYXNoIHRvIHRyaWdnZXIgcmVidWlsZHNcbiAgICAgIH0sXG4gICAgICAvLyBleGVjdXRhYmxlOiBhc3NldC5leGVjdXRhYmxlLCAvLyBUT0RPOiBTdXBwb3J0IGV4ZWN1dGFibGUgYXNzZXRzXG4gICAgfSk7XG5cbiAgICBjb25zdCByZWdpc3RyeUltYWdlID0gbmV3IGRvY2tlclJlZ2lzdHJ5SW1hZ2UuUmVnaXN0cnlJbWFnZShcbiAgICAgIHRoaXMuc2NvcGUsXG4gICAgICBgJHtpZH1fUmVnaXN0cnlJbWFnZWAsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGltYWdlQXNzZXQubmFtZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGxvY2F0aW9uOiBEb2NrZXJJbWFnZUFzc2V0TG9jYXRpb24gPSB7XG4gICAgICBpbWFnZVVyaTogcmVnaXN0cnlJbWFnZS5uYW1lLFxuICAgICAgcmVwb3NpdG9yeU5hbWU6IHRoaXMucmVwb3NpdG9yeSEubmFtZSxcbiAgICAgIGltYWdlVGFnLFxuICAgIH07XG4gICAgLy8gU3RvcmUgdGhlIGFzc2V0IGxvY2F0aW9uIGRldGFpbHNcbiAgICB0aGlzLmRvY2tlckFzc2V0TWFwLnNldChpbWFnZVVyaSwgbG9jYXRpb24pO1xuICAgIC8vIFJldHVybiB0aGUgYXNzZXQgbG9jYXRpb24gZGV0YWlsc1xuICAgIHJldHVybiBsb2NhdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlQnVja2V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJ1Y2tldCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuYnVja2V0TmFtZSkge1xuICAgICAgLy8gVXNlIGV4aXN0aW5nIGJ1Y2tldCBpZiBwcm92aWRlZFxuICAgICAgdGhpcy5idWNrZXQgPSBuZXcgZGF0YUF3c1MzQnVja2V0LkRhdGFBd3NTM0J1Y2tldChcbiAgICAgICAgdGhpcy5zY29wZSxcbiAgICAgICAgXCJFeGlzdGluZ0Fzc2V0QnVja2V0XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBidWNrZXQ6IHRoaXMucHJvcHMuYnVja2V0TmFtZSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnVja2V0TmFtZSA9IGAke3RoaXMucHJvcHMucXVhbGlmaWVyID8/IFwiYXNzZXRzXCJ9LSR7dGhpcy5wcm9wcy5hY2NvdW50fS0ke3RoaXMucHJvcHMucmVnaW9ufWA7XG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBzM0J1Y2tldC5TM0J1Y2tldCh0aGlzLnNjb3BlLCBcIkFzc2V0QnVja2V0XCIsIHtcbiAgICAgIGJ1Y2tldDogYnVja2V0TmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlUmVwb3NpdG9yeSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXBvc2l0b3J5KSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5wcm9wcy5yZXBvc2l0b3J5TmFtZSkge1xuICAgICAgLy8gVXNlIGV4aXN0aW5nIHJlcG9zaXRvcnkgaWYgcHJvdmlkZWRcbiAgICAgIHRoaXMucmVwb3NpdG9yeSA9IG5ldyBkYXRhQXdzRWNyUmVwb3NpdG9yeS5EYXRhQXdzRWNyUmVwb3NpdG9yeShcbiAgICAgICAgdGhpcy5zY29wZSxcbiAgICAgICAgXCJFeGlzdGluZ0Fzc2V0UmVwb3NpdG9yeVwiLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogdGhpcy5wcm9wcy5yZXBvc2l0b3J5TmFtZSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVwb3NpdG9yeSA9IG5ldyBlY3JSZXBvc2l0b3J5LkVjclJlcG9zaXRvcnkoXG4gICAgICB0aGlzLnNjb3BlLFxuICAgICAgXCJBc3NldFJlcG9zaXRvcnlcIixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogdGhpcy5wcm9wcy5xdWFsaWZpZXJcbiAgICAgICAgICA/IGAke3RoaXMucHJvcHMucXVhbGlmaWVyfS1hc3NldHNgXG4gICAgICAgICAgOiBcImFzc2V0c1wiLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVEb2NrZXJQcm92aWRlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kb2NrZXJQcm92aWRlcikgcmV0dXJuO1xuXG4gICAgdGhpcy5kb2NrZXJQcm92aWRlciA9IG5ldyBkb2NrZXJQcm92aWRlci5Eb2NrZXJQcm92aWRlcihcbiAgICAgIHRoaXMuc2NvcGUsXG4gICAgICBcIkRvY2tlclwiLFxuICAgICAgLy8gVE9ETzogU3VwcG9ydCBjdXN0b20gRG9ja2VyIGhvc3Q/XG4gICAgICB7fSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFMzVXJsKG9iamVjdEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBidWNrZXROYW1lID0gdGhpcy5idWNrZXQhLmJ1Y2tldDtcbiAgICByZXR1cm4gYGh0dHBzOi8vJHtidWNrZXROYW1lfS5zMy4ke3RoaXMucHJvcHMucmVnaW9ufS4ke3RoaXMucHJvcHMudXJsU3VmZml4fS8ke29iamVjdEtleX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFMzT2JqZWN0VXJsKG9iamVjdEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBidWNrZXROYW1lID0gdGhpcy5idWNrZXQhLmJ1Y2tldDtcbiAgICByZXR1cm4gYHMzOi8vJHtidWNrZXROYW1lfS8ke29iamVjdEtleX1gO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBidWlsZFJlcG9zaXRvcnlVcmkoKTogc3RyaW5nIHtcbiAgLy8gICBjb25zdCByZXBvc2l0b3J5TmFtZSA9IHRoaXMucmVwb3NpdG9yeSEubmFtZTtcbiAgLy8gICByZXR1cm4gYCR7dGhpcy5wcm9wcy5hY2NvdW50fS5ka3IuZWNyLiR7dGhpcy5wcm9wcy5yZWdpb259LiR7dGhpcy5wcm9wcy51cmxTdWZmaXh9LyR7cmVwb3NpdG9yeU5hbWV9YDtcbiAgLy8gfVxufVxuXG4vKipcbiAqIENvbnZlcnQgdGhlIERvY2tlciBjYWNoZSBvcHRpb25zIHRvIGEgZm9ybWF0IHN1aXRhYmxlIGZvciB0aGUgYnVpbGR4IGNhY2hlRnJvbSBmbGFnLlxuICovXG5mdW5jdGlvbiBwYXJzZURvY2tlckNhY2hlRW50cmllcyhcbiAgLi4uY2FjaGVPcHRpb246IERvY2tlckNhY2hlT3B0aW9uW11cbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNhY2hlT3B0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IGNhY2hlRnJvbTogc3RyaW5nW10gPSBbXTtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RvY2tlci9idWlsZHgvYmxvYi92MC4yNS4wL3V0aWwvYnVpbGRmbGFncy9jYWNoZS5nbyNMMTQwXG4gIGZvciAoY29uc3QgYyBvZiBjYWNoZU9wdGlvbikge1xuICAgIGxldCBjYWNoZUZyb21FbnRyeSA9IGB0eXBlPSR7Yy50eXBlfWA7XG4gICAgaWYgKGMucGFyYW1zKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBPYmplY3QuZW50cmllcyhjLnBhcmFtcylcbiAgICAgICAgLm1hcCgoW2ssIHZdKSA9PiBgJHtrfT0ke3Z9YClcbiAgICAgICAgLmpvaW4oXCIsXCIpO1xuICAgICAgY2FjaGVGcm9tRW50cnkgKz0gYCwke3BhcmFtc31gO1xuICAgIH1cbiAgICBjYWNoZUZyb20ucHVzaChjYWNoZUZyb21FbnRyeSk7XG4gIH1cbiAgcmV0dXJuIGNhY2hlRnJvbTtcbn1cblxuLy8gLyoqXG4vLyAgKiBUaHJvdyBhbiBlcnJvciBtZXNzYWdlIGFib3V0IGJpbmRpbmcoKSBpZiB3ZSBkb24ndCBoYXZlIGEgdmFsdWUgZm9yIHguXG4vLyAgKlxuLy8gICogVGhpcyByZXBsYWNlcyB0aGUgISBhc3NlcnRpb25zIHdlIHdvdWxkIG5lZWQgZXZlcnl3aGVyZSBvdGhlcndpc2UuXG4vLyAgKi9cbi8vIGV4cG9ydCBmdW5jdGlvbiBhc3NlcnRCb3VuZDxBPih4OiBBIHwgdW5kZWZpbmVkKTogYXNzZXJ0cyB4IGlzIE5vbk51bGxhYmxlPEE+IHtcbi8vICAgaWYgKHggPT09IG51bGwgJiYgeCA9PT0gdW5kZWZpbmVkKSB7XG4vLyAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3QgY2FsbCBiaW5kU3RhY2soKSBmaXJzdFwiKTtcbi8vICAgfVxuLy8gfVxuXG4vLyBUT0RPOiBTdXBwb3J0IGV4ZWN1dGFibGUgYXJyYXkgcHJvZHVjaW5nIGxvY2F0aW9uIG9mIHppcCBmaWxlIG9uIHN0ZG91dFxuLy8gZnVuY3Rpb24gdmFsaWRhdGVGaWxlQXNzZXRTb3VyY2UoYXNzZXQ6IEZpbGVBc3NldFNvdXJjZSkge1xuLy8gICBpZiAoISFhc3NldC5leGVjdXRhYmxlID09PSAhIWFzc2V0LmZpbGVOYW1lKSB7XG4vLyAgICAgdGhyb3cgbmV3IEVycm9yKFxuLy8gICAgICAgYEV4YWN0bHkgb25lIG9mICdmaWxlTmFtZScgb3IgJ2V4ZWN1dGFibGUnIGlzIHJlcXVpcmVkLCBnb3Q6ICR7SlNPTi5zdHJpbmdpZnkoYXNzZXQpfWAsXG4vLyAgICAgKTtcbi8vICAgfVxuXG4vLyAgIGlmICghIWFzc2V0LnBhY2thZ2luZyAhPT0gISFhc3NldC5maWxlTmFtZSkge1xuLy8gICAgIHRocm93IG5ldyBFcnJvcihcbi8vICAgICAgIGAncGFja2FnaW5nJyBpcyBleHBlY3RlZCBpbiBjb21iaW5hdGlvbiB3aXRoICdmaWxlTmFtZScsIGdvdDogJHtKU09OLnN0cmluZ2lmeShhc3NldCl9YCxcbi8vICAgICApO1xuLy8gICB9XG4vLyB9XG5cbi8vIFRPRE86IFN1cHBvcnQgZXhlY3V0YWJsZSBhcnJheSBwcm9kdWNpbmcgdGhlIG5hbWUgb2YgYSBsb2NhbCBEb2NrZXIgaW1hZ2Ugb24gYHN0ZG91dGBcbi8vIGZ1bmN0aW9uIHZhbGlkYXRlRG9ja2VySW1hZ2VBc3NldFNvdXJjZShhc3NldDogRG9ja2VySW1hZ2VBc3NldFNvdXJjZSkge1xuLy8gICBpZiAoISFhc3NldC5leGVjdXRhYmxlID09PSAhIWFzc2V0LmRpcmVjdG9yeU5hbWUpIHtcbi8vICAgICB0aHJvdyBuZXcgRXJyb3IoXG4vLyAgICAgICBgRXhhY3RseSBvbmUgb2YgJ2RpcmVjdG9yeU5hbWUnIG9yICdleGVjdXRhYmxlJyBpcyByZXF1aXJlZCwgZ290OiAke0pTT04uc3RyaW5naWZ5KGFzc2V0KX1gLFxuLy8gICAgICk7XG4vLyAgIH1cblxuLy8gICBjaGVjayhcImRvY2tlckJ1aWxkQXJnc1wiKTtcbi8vICAgY2hlY2soXCJkb2NrZXJCdWlsZFRhcmdldFwiKTtcbi8vICAgY2hlY2soXCJkb2NrZXJPdXRwdXRzXCIpO1xuLy8gICBjaGVjayhcImRvY2tlckZpbGVcIik7XG5cbi8vICAgZnVuY3Rpb24gY2hlY2s8SyBleHRlbmRzIGtleW9mIERvY2tlckltYWdlQXNzZXRTb3VyY2U+KGtleTogSykge1xuLy8gICAgIGlmIChhc3NldFtrZXldICYmICFhc3NldC5kaXJlY3RvcnlOYW1lKSB7XG4vLyAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4vLyAgICAgICAgIGAnJHtrZXl9JyBpcyBvbmx5IGFsbG93ZWQgaW4gY29tYmluYXRpb24gd2l0aCAnZGlyZWN0b3J5TmFtZScsIGdvdDogJHtKU09OLnN0cmluZ2lmeShhc3NldCl9YCxcbi8vICAgICAgICk7XG4vLyAgICAgfVxuLy8gICB9XG4vLyB9XG4iXX0=