@aws-cdk-testing/cli-integ 3.5.0 → 3.7.0

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 (431) hide show
  1. package/README.md +48 -39
  2. package/lib/aws.js +20 -9
  3. package/lib/cli/query-github.js +2 -3
  4. package/lib/cli/run-suite.js +123 -52
  5. package/lib/cli/stage-distribution.js +4 -4
  6. package/lib/corking.js +2 -5
  7. package/lib/eventually.js +3 -3
  8. package/lib/files.js +2 -3
  9. package/lib/github.js +5 -6
  10. package/lib/integ-test.js +58 -3
  11. package/lib/npm.d.ts +2 -0
  12. package/lib/npm.js +30 -1
  13. package/lib/package-sources/cli-npm-source.d.ts +14 -0
  14. package/lib/package-sources/cli-npm-source.js +50 -0
  15. package/lib/package-sources/cli-repo-source.d.ts +19 -0
  16. package/lib/package-sources/cli-repo-source.js +49 -0
  17. package/lib/package-sources/find-root.d.ts +6 -0
  18. package/lib/package-sources/find-root.js +18 -0
  19. package/lib/package-sources/library-globalinstall-source.d.ts +20 -0
  20. package/lib/package-sources/library-globalinstall-source.js +70 -0
  21. package/lib/package-sources/library-npm-source.d.ts +17 -0
  22. package/lib/package-sources/library-npm-source.js +60 -0
  23. package/lib/package-sources/library-preinstalled-source.d.ts +21 -0
  24. package/lib/package-sources/library-preinstalled-source.js +78 -0
  25. package/lib/package-sources/repo-tools/npm.js +4 -5
  26. package/lib/package-sources/source.d.ts +36 -18
  27. package/lib/package-sources/source.js +1 -1
  28. package/lib/package-sources/subprocess.d.ts +10 -3
  29. package/lib/package-sources/subprocess.js +31 -12
  30. package/lib/process.js +7 -6
  31. package/lib/proxy.d.ts +1 -1
  32. package/lib/proxy.js +2 -2
  33. package/lib/resource-pool.js +10 -6
  34. package/lib/shell.d.ts +3 -3
  35. package/lib/shell.js +12 -16
  36. package/lib/staging/codeartifact.js +17 -18
  37. package/lib/staging/maven.d.ts +2 -2
  38. package/lib/staging/maven.js +3 -5
  39. package/lib/staging/npm.d.ts +2 -2
  40. package/lib/staging/npm.js +1 -1
  41. package/lib/staging/nuget.d.ts +2 -2
  42. package/lib/staging/nuget.js +1 -1
  43. package/lib/staging/parallel-shell.js +2 -2
  44. package/lib/staging/pypi.d.ts +2 -2
  45. package/lib/staging/pypi.js +1 -1
  46. package/lib/staging/usage-dir.js +4 -1
  47. package/lib/with-aws.d.ts +2 -2
  48. package/lib/with-aws.js +5 -4
  49. package/lib/with-cdk-app.d.ts +9 -6
  50. package/lib/with-cdk-app.js +48 -61
  51. package/lib/with-cli-lib.d.ts +4 -3
  52. package/lib/with-cli-lib.js +5 -8
  53. package/lib/with-packages.d.ts +3 -2
  54. package/lib/with-packages.js +3 -2
  55. package/lib/with-sam.d.ts +3 -3
  56. package/lib/with-sam.js +15 -33
  57. package/lib/with-temporary-directory.d.ts +1 -1
  58. package/lib/with-temporary-directory.js +1 -1
  59. package/lib/xpmutex.js +11 -4
  60. package/lib/yarn.d.ts +6 -0
  61. package/lib/yarn.js +31 -0
  62. package/npm-shrinkwrap.json +8724 -0
  63. package/package.json +16 -11
  64. package/resources/cdk-apps/refactoring/cdk.json +7 -0
  65. package/resources/cdk-apps/refactoring/refactoring.js +18 -0
  66. package/resources/integ.jest.config.js +45 -8
  67. package/test-reports/junit.xml +15 -0
  68. package/tests/cli-integ-tests/cdk---exclusively-selects-only-selected-stack.integtest.js +2 -2
  69. package/tests/cli-integ-tests/cdk-assets/cdk-assets-uses-profile.integtest.js +12 -12
  70. package/tests/cli-integ-tests/cdk-assets/smoketest.integtest.js +10 -10
  71. package/tests/cli-integ-tests/cdk-automatic-ordering-with-concurrency.integtest.js +2 -2
  72. package/tests/cli-integ-tests/cdk-automatic-ordering.integtest.js +2 -2
  73. package/tests/cli-integ-tests/cdk-automatic-rollback-if-paused-and---no-rollback-is-removed-from-flags.integtest.js +2 -2
  74. package/tests/cli-integ-tests/cdk-automatic-rollback-if-paused-and-change-contains-a-replacement.integtest.js +2 -2
  75. package/tests/cli-integ-tests/cdk-automatic-rollback-if-replacement-and---no-rollback-is-removed-from-flags.integtest.js +2 -2
  76. package/tests/cli-integ-tests/cdk-bootstrap-a-customized-template-vendor-will-not-overwrite-the-default-template.integtest.js +2 -2
  77. package/tests/cli-integ-tests/cdk-bootstrap-add-tags.integtest.js +3 -4
  78. package/tests/cli-integ-tests/cdk-bootstrap-can-add-tags-then-update-tags-during-re-bootstrap.integtest.js +3 -4
  79. package/tests/cli-integ-tests/cdk-bootstrap-can-and-deploy-if-omitting-execution-policies.integtest.js +2 -2
  80. package/tests/cli-integ-tests/cdk-bootstrap-can-bootstrap-without-execution.integtest.js +3 -4
  81. package/tests/cli-integ-tests/cdk-bootstrap-can-create-a-legacy-bootstrap-stack-with---public-access-block-configuration-false.integtest.js +3 -4
  82. package/tests/cli-integ-tests/cdk-bootstrap-can-create-multiple-legacy-bootstrap-stacks.integtest.js +3 -4
  83. package/tests/cli-integ-tests/cdk-bootstrap-can-deploy-modern-synthesized-stack-even-if-bootstrap-stack-name-is-unknown.integtest.js +2 -2
  84. package/tests/cli-integ-tests/cdk-bootstrap-can-deploy-with-session-tags-on-the-deploy.integtest.js +2 -2
  85. package/tests/cli-integ-tests/cdk-bootstrap-can-deploy-without-execution-role-and-with-session-tags-on-deploy-role.integtest.js +2 -2
  86. package/tests/cli-integ-tests/cdk-bootstrap-can-dump-the-template.integtest.js +2 -2
  87. package/tests/cli-integ-tests/cdk-bootstrap-can-remove-custompermissionsboundary.integtest.js +5 -7
  88. package/tests/cli-integ-tests/cdk-bootstrap-can-remove-trusted-account.integtest.js +3 -4
  89. package/tests/cli-integ-tests/cdk-bootstrap-can-use-the-custom-permissions-boundary-(with-slashes)-to-bootstrap.integtest.js +2 -2
  90. package/tests/cli-integ-tests/cdk-bootstrap-can-use-the-custom-permissions-boundary-to-bootstrap.integtest.js +2 -2
  91. package/tests/cli-integ-tests/cdk-bootstrap-can-use-the-default-permissions-boundary-to-bootstrap.integtest.js +2 -2
  92. package/tests/cli-integ-tests/cdk-bootstrap-create-ecr-with-tag-immutability-to-set-on.integtest.js +5 -6
  93. package/tests/cli-integ-tests/cdk-bootstrap-deploy-new-style-synthesis-to-new-style-bootstrap-(with-docker-image).integtest.js +2 -2
  94. package/tests/cli-integ-tests/cdk-bootstrap-deploy-new-style-synthesis-to-new-style-bootstrap.integtest.js +2 -2
  95. package/tests/cli-integ-tests/cdk-bootstrap-deploy-old-style-synthesis-to-new-style-bootstrap.integtest.js +2 -2
  96. package/tests/cli-integ-tests/cdk-bootstrap-switch-on-termination-protection.integtest.js +3 -4
  97. package/tests/cli-integ-tests/cdk-bootstrap-upgrade-legacy-bootstrap-stack-to-new-bootstrap-stack-while-in-use.integtest.js +2 -2
  98. package/tests/cli-integ-tests/cdk-can-still-load-old-assemblies.integtest.js +2 -2
  99. package/tests/cli-integ-tests/cdk-cdk-diff---fail-on-multiple-stacks-exits-with-error-if-any-of-the-stacks-contains-a-diff.integtest.js +2 -2
  100. package/tests/cli-integ-tests/cdk-cdk-diff---fail-with-multiple-stack-exits-with-if-any-of-the-stacks-contains-a-diff.integtest.js +2 -2
  101. package/tests/cli-integ-tests/cdk-cdk-diff---quiet-does-not-print-there-were-no-differences-message-for-stacks-which-have-no-differences.integtest.js +2 -2
  102. package/tests/cli-integ-tests/cdk-cdk-diff---security-only---fail-exits-when-security-changes-are-present.integtest.js +2 -2
  103. package/tests/cli-integ-tests/cdk-cdk-diff---security-only---fail-exits-when-security-diff-for-sso-access-control-config.integtest.js +2 -2
  104. package/tests/cli-integ-tests/cdk-cdk-diff---security-only---fail-exits-when-security-diff-for-sso-assignment.integtest.js +2 -2
  105. package/tests/cli-integ-tests/cdk-cdk-diff---security-only---fail-exits-when-security-diff-for-sso-perm-set-with-managed-policy.integtest.js +2 -2
  106. package/tests/cli-integ-tests/cdk-cdk-diff---security-only---fail-exits-when-security-diff-for-sso-perm-set-without-managed-policy.integtest.js +2 -2
  107. package/tests/cli-integ-tests/cdk-cdk-diff---security-only-successfully-outputs-sso-access-control-information.integtest.js +2 -2
  108. package/tests/cli-integ-tests/cdk-cdk-diff---security-only-successfully-outputs-sso-assignment-information.integtest.js +2 -2
  109. package/tests/cli-integ-tests/cdk-cdk-diff---security-only-successfully-outputs-sso-permission-set-with-managed-policy-information.integtest.js +2 -2
  110. package/tests/cli-integ-tests/cdk-cdk-diff---security-only-successfully-outputs-sso-permission-set-without-managed-policy-information.integtest.js +2 -2
  111. package/tests/cli-integ-tests/cdk-cdk-diff-doesnt-show-resource-metadata-changes.integtest.js +2 -2
  112. package/tests/cli-integ-tests/cdk-cdk-diff-shows-resource-metadata-changes-with---no-change-set.integtest.js +2 -2
  113. package/tests/cli-integ-tests/cdk-cdk-diff-with-large-changeset-and-custom-toolkit-stack-name-and-qualifier-does-not-fail.integtest.js +2 -2
  114. package/tests/cli-integ-tests/cdk-cdk-diff-with-large-changeset-does-not-fail.integtest.js +2 -2
  115. package/tests/cli-integ-tests/cdk-cdk-diff.integtest.js +2 -2
  116. package/tests/cli-integ-tests/cdk-cdk-ls---show-dependencies---json---long.integtest.js +2 -2
  117. package/tests/cli-integ-tests/cdk-cdk-ls---show-dependencies---json.integtest.js +2 -2
  118. package/tests/cli-integ-tests/cdk-cdk-ls.integtest.js +2 -2
  119. package/tests/cli-integ-tests/cdk-cdk-notices-are-displayed-correctly.integtest.js +2 -2
  120. package/tests/cli-integ-tests/cdk-cdk-notices-with---unacknowledged.integtest.js +2 -2
  121. package/tests/cli-integ-tests/cdk-cdk-synth-add-the-metadata-properties-expected-by-sam.integtest.js +2 -2
  122. package/tests/cli-integ-tests/cdk-cdk-synth-bundled-functions-as-expected.integtest.js +2 -2
  123. package/tests/cli-integ-tests/cdk-cdk-synth.integtest.js +2 -2
  124. package/tests/cli-integ-tests/cdk-ci-output-to-stderr.integtest.js +2 -2
  125. package/tests/cli-integ-tests/cdk-ci-true-output-to-stdout.integtest.js +2 -2
  126. package/tests/cli-integ-tests/cdk-construct-with-builtin-lambda-function.integtest.js +2 -2
  127. package/tests/cli-integ-tests/cdk-context-in-stage-propagates-to-top.integtest.js +2 -2
  128. package/tests/cli-integ-tests/cdk-context-setting.integtest.js +2 -2
  129. package/tests/cli-integ-tests/cdk-deploy---method-direct.integtest.js +3 -4
  130. package/tests/cli-integ-tests/cdk-deploy-all-concurrently.integtest.js +2 -2
  131. package/tests/cli-integ-tests/cdk-deploy-all.integtest.js +2 -2
  132. package/tests/cli-integ-tests/cdk-deploy-and-test-stack-with-lambda-asset.integtest.js +4 -5
  133. package/tests/cli-integ-tests/cdk-deploy-deletes-all-notification-arns-when-empty-array-is-passed.integtest.js +4 -5
  134. package/tests/cli-integ-tests/cdk-deploy-no-stacks-error.integtest.js +2 -2
  135. package/tests/cli-integ-tests/cdk-deploy-no-stacks-with---ignore-no-stacks.integtest.js +2 -2
  136. package/tests/cli-integ-tests/cdk-deploy-preserves-existing-notification-arns-when-not-specified.integtest.js +3 -4
  137. package/tests/cli-integ-tests/cdk-deploy-stack-with-docker-asset.integtest.js +2 -2
  138. package/tests/cli-integ-tests/cdk-deploy-stack-with-lambda-asset-to-object-lock-enabled-asset-bucket.integtest.js +2 -2
  139. package/tests/cli-integ-tests/cdk-deploy-stack-without-resource.integtest.js +2 -2
  140. package/tests/cli-integ-tests/cdk-deploy-wildcard-with-outputs.integtest.js +2 -2
  141. package/tests/cli-integ-tests/cdk-deploy-with-import-existing-resources-true.integtest.js +3 -4
  142. package/tests/cli-integ-tests/cdk-deploy-with-method-direct-and-import-existing-resources-fails.integtest.js +2 -2
  143. package/tests/cli-integ-tests/cdk-deploy-with-notification-arn-as-flag.integtest.js +3 -4
  144. package/tests/cli-integ-tests/cdk-deploy-with-notification-arn-as-prop-and-flag.integtest.js +3 -4
  145. package/tests/cli-integ-tests/cdk-deploy-with-notification-arn-as-prop.integtest.js +3 -4
  146. package/tests/cli-integ-tests/cdk-deploy-with-parameters-multi.integtest.js +4 -5
  147. package/tests/cli-integ-tests/cdk-deploy-with-parameters.integtest.js +3 -4
  148. package/tests/cli-integ-tests/cdk-deploy-with-wildcard-and-parameters.integtest.js +2 -2
  149. package/tests/cli-integ-tests/cdk-deploy-without-execute-a-named-change-set.integtest.js +3 -4
  150. package/tests/cli-integ-tests/cdk-deploy-without-import-existing-resources.integtest.js +3 -4
  151. package/tests/cli-integ-tests/cdk-deploy.integtest.js +3 -4
  152. package/tests/cli-integ-tests/cdk-destroy-interactive.integtest.js +6 -7
  153. package/tests/cli-integ-tests/cdk-doubly-nested-stack.integtest.js +2 -2
  154. package/tests/cli-integ-tests/cdk-enablediffnofail.integtest.js +2 -2
  155. package/tests/cli-integ-tests/cdk-failed-deploy-does-not-hang.integtest.js +2 -2
  156. package/tests/cli-integ-tests/cdk-fast-deploy.integtest.js +5 -6
  157. package/tests/cli-integ-tests/cdk-gc-garbage-collection-deletes-unused-ecr-images.integtest.js +2 -2
  158. package/tests/cli-integ-tests/cdk-gc-garbage-collection-deletes-unused-s3-objects.integtest.js +2 -2
  159. package/tests/cli-integ-tests/cdk-gc-garbage-collection-keeps-in-use-ecr-images.integtest.js +2 -2
  160. package/tests/cli-integ-tests/cdk-gc-garbage-collection-keeps-in-use-s3-objects.integtest.js +2 -2
  161. package/tests/cli-integ-tests/cdk-gc-garbage-collection-tags-unused-ecr-images.integtest.js +2 -2
  162. package/tests/cli-integ-tests/cdk-gc-garbage-collection-tags-unused-s3-objects.integtest.js +2 -2
  163. package/tests/cli-integ-tests/cdk-gc-garbage-collection-untags-in-use-ecr-images.integtest.js +2 -2
  164. package/tests/cli-integ-tests/cdk-gc-garbage-collection-untags-in-use-s3-objects.integtest.js +3 -3
  165. package/tests/cli-integ-tests/cdk-generating-and-loading-assembly.integtest.js +2 -2
  166. package/tests/cli-integ-tests/cdk-hotswap-deployment-for-ecs-service-detects-failed-deployment-and-errors.integtest.js +2 -2
  167. package/tests/cli-integ-tests/cdk-hotswap-deployment-for-ecs-service-waits-for-deployment-to-complete.integtest.js +7 -6
  168. package/tests/cli-integ-tests/cdk-hotswap-deployment-supports-appsync-apis-with-many-functions.integtest.js +3 -4
  169. package/tests/cli-integ-tests/cdk-hotswap-deployment-supports-ecs-service.integtest.js +4 -5
  170. package/tests/cli-integ-tests/cdk-hotswap-deployment-supports-fn::importvalue-intrinsic.integtest.js +4 -5
  171. package/tests/cli-integ-tests/cdk-hotswap-deployment-supports-lambda-functions-description-and-environment-variables.integtest.js +4 -5
  172. package/tests/cli-integ-tests/cdk-hotswap-ecs-deployment-respects-properties-override.integtest.js +6 -7
  173. package/tests/cli-integ-tests/cdk-iam-diff.integtest.js +2 -2
  174. package/tests/cli-integ-tests/cdk-import-interactive.integtest.js +5 -6
  175. package/tests/cli-integ-tests/cdk-lib-cli-lib-deploy.integtest.js +3 -4
  176. package/tests/cli-integ-tests/cdk-lib-cli-lib-list.integtest.js +2 -2
  177. package/tests/cli-integ-tests/cdk-lib-cli-lib-synth.integtest.js +2 -2
  178. package/tests/cli-integ-tests/cdk-lib-security-related-changes-without-a-cli-are-expected-to-fail-when-approval-is-required.integtest.js +2 -3
  179. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate--from-stack-creates-deployable-app-csharp.integtest.js +2 -2
  180. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate--from-stack-creates-deployable-app-java.integtest.js +2 -2
  181. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate--from-stack-creates-deployable-app-python.integtest.js +2 -2
  182. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate--from-stack-creates-deployable-app-typescript.integtest.js +2 -2
  183. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate-deploys-successfully-csharp.integtest.js +2 -2
  184. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate-deploys-successfully-java.integtest.js +2 -2
  185. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate-deploys-successfully-python.integtest.js +2 -2
  186. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate-deploys-successfully-typescript.integtest.js +2 -2
  187. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate-generates-migrate.json.integtest.js +2 -2
  188. package/tests/cli-integ-tests/cdk-migrate/testcase.d.ts +1 -1
  189. package/tests/cli-integ-tests/cdk-migrate/testcase.js +4 -6
  190. package/tests/cli-integ-tests/cdk-nested-stack-with-parameters.integtest.js +3 -4
  191. package/tests/cli-integ-tests/cdk-refactor-dry-run.integtest.js +41 -0
  192. package/tests/cli-integ-tests/cdk-requests-go-through-a-proxy-when-configured.integtest.js +3 -4
  193. package/tests/cli-integ-tests/cdk-sam-can-locally-test-the-synthesized-cdk-application.integtest.js +2 -2
  194. package/tests/cli-integ-tests/cdk-security-related-changes-without-a-cli-are-expected-to-fail.integtest.js +2 -2
  195. package/tests/cli-integ-tests/cdk-skips-notice-refresh.integtest.js +2 -2
  196. package/tests/cli-integ-tests/cdk-ssm-parameter-provider-error.integtest.js +2 -2
  197. package/tests/cli-integ-tests/cdk-stack-in-update_rollback_complete-state-can-be-updated.integtest.js +6 -7
  198. package/tests/cli-integ-tests/cdk-stage-with-bundled-lambda-function.integtest.js +2 -2
  199. package/tests/cli-integ-tests/cdk-synth---quiet-can-be-specified-in-cdk.json.integtest.js +2 -2
  200. package/tests/cli-integ-tests/cdk-synthing-a-stage-with-errors-can-be-suppressed.integtest.js +2 -2
  201. package/tests/cli-integ-tests/cdk-synthing-a-stage-with-errors-leads-to-failure.integtest.js +2 -2
  202. package/tests/cli-integ-tests/cdk-templates-on-disk-contain-metadata-resource.integtest.js +2 -2
  203. package/tests/cli-integ-tests/cdk-termination-protection.integtest.js +2 -2
  204. package/tests/cli-integ-tests/cdk-test-cdk-rollback---force.integtest.js +2 -2
  205. package/tests/cli-integ-tests/cdk-test-cdk-rollback.integtest.js +2 -2
  206. package/tests/cli-integ-tests/cdk-test-migrate-deployment-for-app-with-localfile-source-in-migrate.json.integtest.js +5 -5
  207. package/tests/cli-integ-tests/cdk-test-resource-import-with-construct-that-requires-bundling.integtest.js +2 -2
  208. package/tests/cli-integ-tests/cdk-test-resource-import.integtest.js +2 -2
  209. package/tests/cli-integ-tests/cdk-two-ways-of-showing-the-version.integtest.js +2 -2
  210. package/tests/cli-integ-tests/cdk-update-to-stack-in-rollback_complete-state-will-delete-stack-and-create-a-new-one.integtest.js +6 -7
  211. package/tests/cli-integ-tests/cdk-vpc-lookup.integtest.js +2 -2
  212. package/tests/cli-integ-tests/proxy.integtest.js +2 -3
  213. package/tests/init-csharp/init-csharp.integtest.js +4 -4
  214. package/tests/init-fsharp/init-fsharp.integtest.js +4 -4
  215. package/tests/init-go/init-go.integtest.js +4 -5
  216. package/tests/init-java/init-java.integtest.js +3 -3
  217. package/tests/init-javascript/init-javascript.integtest.js +3 -3
  218. package/tests/init-python/init-python.integtest.js +3 -3
  219. package/tests/init-typescript-app/init-typescript-app.integtest.js +3 -3
  220. package/tests/init-typescript-lib/init-typescript-lib.integtest.js +2 -2
  221. package/tests/tool-integrations/amplify.integtest.js +6 -6
  222. package/tests/tool-integrations/with-tool-context.d.ts +5 -5
  223. package/tests/tool-integrations/with-tool-context.js +1 -1
  224. package/tests/toolkit-lib-integ-tests/toolkit-can-cdk-deploy.integtest.d.ts +1 -0
  225. package/tests/toolkit-lib-integ-tests/toolkit-can-cdk-deploy.integtest.js +17 -0
  226. package/tests/toolkit-lib-integ-tests/toolkit-helpers.d.ts +15 -0
  227. package/tests/toolkit-lib-integ-tests/toolkit-helpers.js +45 -0
  228. package/tests/uberpackage/uberpackage.integtest.js +2 -2
  229. package/.eslintrc.js +0 -9
  230. package/lib/aws.ts +0 -303
  231. package/lib/cli/query-github.ts +0 -56
  232. package/lib/cli/run-suite.ts +0 -153
  233. package/lib/cli/stage-distribution.ts +0 -262
  234. package/lib/cli/test-root.ts +0 -3
  235. package/lib/corking.ts +0 -33
  236. package/lib/eventually.ts +0 -42
  237. package/lib/files.ts +0 -80
  238. package/lib/github.ts +0 -43
  239. package/lib/index.ts +0 -13
  240. package/lib/integ-test.ts +0 -110
  241. package/lib/lists.ts +0 -9
  242. package/lib/memoize.ts +0 -14
  243. package/lib/npm.ts +0 -41
  244. package/lib/package-sources/release-source.d.ts +0 -23
  245. package/lib/package-sources/release-source.js +0 -71
  246. package/lib/package-sources/release-source.ts +0 -82
  247. package/lib/package-sources/repo-source.d.ts +0 -30
  248. package/lib/package-sources/repo-source.js +0 -97
  249. package/lib/package-sources/repo-source.ts +0 -112
  250. package/lib/package-sources/repo-tools/npm.ts +0 -48
  251. package/lib/package-sources/source.ts +0 -35
  252. package/lib/package-sources/subprocess.ts +0 -15
  253. package/lib/process.ts +0 -154
  254. package/lib/proxy.ts +0 -64
  255. package/lib/resource-pool.ts +0 -140
  256. package/lib/resources.ts +0 -4
  257. package/lib/shell.ts +0 -331
  258. package/lib/staging/codeartifact.ts +0 -387
  259. package/lib/staging/maven.ts +0 -95
  260. package/lib/staging/npm.ts +0 -62
  261. package/lib/staging/nuget.ts +0 -75
  262. package/lib/staging/parallel-shell.ts +0 -51
  263. package/lib/staging/pypi.ts +0 -50
  264. package/lib/staging/usage-dir.ts +0 -99
  265. package/lib/with-aws.ts +0 -111
  266. package/lib/with-cdk-app.ts +0 -847
  267. package/lib/with-cli-lib.ts +0 -150
  268. package/lib/with-packages.ts +0 -15
  269. package/lib/with-sam.ts +0 -295
  270. package/lib/with-temporary-directory.ts +0 -35
  271. package/lib/with-timeout.ts +0 -33
  272. package/lib/xpmutex.ts +0 -218
  273. package/resources/cli-regression-patches/v2.130.0/node_modules/@aws-cdk-testing/cli-integ/resources/cdk-apps/sam_cdk_integ_app/lib/nested-stack.js +0 -19
  274. package/resources/cli-regression-patches/v2.130.0/node_modules/@aws-cdk-testing/cli-integ/resources/cdk-apps/sam_cdk_integ_app/lib/test-stack.js +0 -134
  275. package/tests/cli-integ-tests/cdk---exclusively-selects-only-selected-stack.integtest.ts +0 -29
  276. package/tests/cli-integ-tests/cdk-assets/cdk-assets-uses-profile.integtest.ts +0 -92
  277. package/tests/cli-integ-tests/cdk-assets/smoketest.integtest.ts +0 -82
  278. package/tests/cli-integ-tests/cdk-automatic-ordering-with-concurrency.integtest.ts +0 -15
  279. package/tests/cli-integ-tests/cdk-automatic-ordering.integtest.ts +0 -15
  280. package/tests/cli-integ-tests/cdk-automatic-rollback-if-paused-and---no-rollback-is-removed-from-flags.integtest.ts +0 -40
  281. package/tests/cli-integ-tests/cdk-automatic-rollback-if-paused-and-change-contains-a-replacement.integtest.ts +0 -40
  282. package/tests/cli-integ-tests/cdk-automatic-rollback-if-replacement-and---no-rollback-is-removed-from-flags.integtest.ts +0 -29
  283. package/tests/cli-integ-tests/cdk-bootstrap-a-customized-template-vendor-will-not-overwrite-the-default-template.integtest.ts +0 -42
  284. package/tests/cli-integ-tests/cdk-bootstrap-add-tags.integtest.ts +0 -26
  285. package/tests/cli-integ-tests/cdk-bootstrap-can-add-tags-then-update-tags-during-re-bootstrap.integtest.ts +0 -28
  286. package/tests/cli-integ-tests/cdk-bootstrap-can-and-deploy-if-omitting-execution-policies.integtest.ts +0 -21
  287. package/tests/cli-integ-tests/cdk-bootstrap-can-bootstrap-without-execution.integtest.ts +0 -22
  288. package/tests/cli-integ-tests/cdk-bootstrap-can-create-a-legacy-bootstrap-stack-with---public-access-block-configuration-false.integtest.ts +0 -21
  289. package/tests/cli-integ-tests/cdk-bootstrap-can-create-multiple-legacy-bootstrap-stacks.integtest.ts +0 -27
  290. package/tests/cli-integ-tests/cdk-bootstrap-can-deploy-modern-synthesized-stack-even-if-bootstrap-stack-name-is-unknown.integtest.ts +0 -24
  291. package/tests/cli-integ-tests/cdk-bootstrap-can-deploy-with-session-tags-on-the-deploy.integtest.ts +0 -25
  292. package/tests/cli-integ-tests/cdk-bootstrap-can-deploy-without-execution-role-and-with-session-tags-on-deploy-role.integtest.ts +0 -22
  293. package/tests/cli-integ-tests/cdk-bootstrap-can-dump-the-template.integtest.ts +0 -32
  294. package/tests/cli-integ-tests/cdk-bootstrap-can-remove-custompermissionsboundary.integtest.ts +0 -77
  295. package/tests/cli-integ-tests/cdk-bootstrap-can-remove-trusted-account.integtest.ts +0 -30
  296. package/tests/cli-integ-tests/cdk-bootstrap-can-use-the-custom-permissions-boundary-(with-slashes)-to-bootstrap.integtest.ts +0 -15
  297. package/tests/cli-integ-tests/cdk-bootstrap-can-use-the-custom-permissions-boundary-to-bootstrap.integtest.ts +0 -15
  298. package/tests/cli-integ-tests/cdk-bootstrap-can-use-the-default-permissions-boundary-to-bootstrap.integtest.ts +0 -15
  299. package/tests/cli-integ-tests/cdk-bootstrap-create-ecr-with-tag-immutability-to-set-on.integtest.ts +0 -34
  300. package/tests/cli-integ-tests/cdk-bootstrap-deploy-new-style-synthesis-to-new-style-bootstrap-(with-docker-image).integtest.ts +0 -22
  301. package/tests/cli-integ-tests/cdk-bootstrap-deploy-new-style-synthesis-to-new-style-bootstrap.integtest.ts +0 -22
  302. package/tests/cli-integ-tests/cdk-bootstrap-deploy-old-style-synthesis-to-new-style-bootstrap.integtest.ts +0 -21
  303. package/tests/cli-integ-tests/cdk-bootstrap-switch-on-termination-protection.integtest.ts +0 -24
  304. package/tests/cli-integ-tests/cdk-bootstrap-upgrade-legacy-bootstrap-stack-to-new-bootstrap-stack-while-in-use.integtest.ts +0 -47
  305. package/tests/cli-integ-tests/cdk-can-still-load-old-assemblies.integtest.ts +0 -57
  306. package/tests/cli-integ-tests/cdk-cdk-diff---fail-on-multiple-stacks-exits-with-error-if-any-of-the-stacks-contains-a-diff.integtest.ts +0 -22
  307. package/tests/cli-integ-tests/cdk-cdk-diff---fail-with-multiple-stack-exits-with-if-any-of-the-stacks-contains-a-diff.integtest.ts +0 -22
  308. package/tests/cli-integ-tests/cdk-cdk-diff---quiet-does-not-print-there-were-no-differences-message-for-stacks-which-have-no-differences.integtest.ts +0 -19
  309. package/tests/cli-integ-tests/cdk-cdk-diff---security-only---fail-exits-when-security-changes-are-present.integtest.ts +0 -14
  310. package/tests/cli-integ-tests/cdk-cdk-diff---security-only---fail-exits-when-security-diff-for-sso-access-control-config.integtest.ts +0 -13
  311. package/tests/cli-integ-tests/cdk-cdk-diff---security-only---fail-exits-when-security-diff-for-sso-assignment.integtest.ts +0 -13
  312. package/tests/cli-integ-tests/cdk-cdk-diff---security-only---fail-exits-when-security-diff-for-sso-perm-set-with-managed-policy.integtest.ts +0 -13
  313. package/tests/cli-integ-tests/cdk-cdk-diff---security-only---fail-exits-when-security-diff-for-sso-perm-set-without-managed-policy.integtest.ts +0 -13
  314. package/tests/cli-integ-tests/cdk-cdk-diff---security-only-successfully-outputs-sso-access-control-information.integtest.ts +0 -35
  315. package/tests/cli-integ-tests/cdk-cdk-diff---security-only-successfully-outputs-sso-assignment-information.integtest.ts +0 -37
  316. package/tests/cli-integ-tests/cdk-cdk-diff---security-only-successfully-outputs-sso-permission-set-with-managed-policy-information.integtest.ts +0 -35
  317. package/tests/cli-integ-tests/cdk-cdk-diff---security-only-successfully-outputs-sso-permission-set-without-managed-policy-information.integtest.ts +0 -37
  318. package/tests/cli-integ-tests/cdk-cdk-diff-doesnt-show-resource-metadata-changes.integtest.ts +0 -23
  319. package/tests/cli-integ-tests/cdk-cdk-diff-shows-resource-metadata-changes-with---no-change-set.integtest.ts +0 -23
  320. package/tests/cli-integ-tests/cdk-cdk-diff-with-large-changeset-and-custom-toolkit-stack-name-and-qualifier-does-not-fail.integtest.ts +0 -39
  321. package/tests/cli-integ-tests/cdk-cdk-diff-with-large-changeset-does-not-fail.integtest.ts +0 -28
  322. package/tests/cli-integ-tests/cdk-cdk-diff.integtest.ts +0 -18
  323. package/tests/cli-integ-tests/cdk-cdk-ls---show-dependencies---json---long.integtest.ts +0 -50
  324. package/tests/cli-integ-tests/cdk-cdk-ls---show-dependencies---json.integtest.ts +0 -95
  325. package/tests/cli-integ-tests/cdk-cdk-ls.integtest.ts +0 -36
  326. package/tests/cli-integ-tests/cdk-cdk-notices-are-displayed-correctly.integtest.ts +0 -42
  327. package/tests/cli-integ-tests/cdk-cdk-notices-with---unacknowledged.integtest.ts +0 -14
  328. package/tests/cli-integ-tests/cdk-cdk-synth-add-the-metadata-properties-expected-by-sam.integtest.ts +0 -126
  329. package/tests/cli-integ-tests/cdk-cdk-synth-bundled-functions-as-expected.integtest.ts +0 -80
  330. package/tests/cli-integ-tests/cdk-cdk-synth.integtest.ts +0 -53
  331. package/tests/cli-integ-tests/cdk-ci-output-to-stderr.integtest.ts +0 -19
  332. package/tests/cli-integ-tests/cdk-ci-true-output-to-stdout.integtest.ts +0 -28
  333. package/tests/cli-integ-tests/cdk-construct-with-builtin-lambda-function.integtest.ts +0 -14
  334. package/tests/cli-integ-tests/cdk-context-in-stage-propagates-to-top.integtest.ts +0 -20
  335. package/tests/cli-integ-tests/cdk-context-setting.integtest.ts +0 -33
  336. package/tests/cli-integ-tests/cdk-deploy---method-direct.integtest.ts +0 -23
  337. package/tests/cli-integ-tests/cdk-deploy-all-concurrently.integtest.ts +0 -17
  338. package/tests/cli-integ-tests/cdk-deploy-all.integtest.ts +0 -14
  339. package/tests/cli-integ-tests/cdk-deploy-and-test-stack-with-lambda-asset.integtest.ts +0 -31
  340. package/tests/cli-integ-tests/cdk-deploy-deletes-all-notification-arns-when-empty-array-is-passed.integtest.ts +0 -50
  341. package/tests/cli-integ-tests/cdk-deploy-no-stacks-error.integtest.ts +0 -18
  342. package/tests/cli-integ-tests/cdk-deploy-no-stacks-with---ignore-no-stacks.integtest.ts +0 -17
  343. package/tests/cli-integ-tests/cdk-deploy-preserves-existing-notification-arns-when-not-specified.integtest.ts +0 -51
  344. package/tests/cli-integ-tests/cdk-deploy-stack-with-docker-asset.integtest.ts +0 -11
  345. package/tests/cli-integ-tests/cdk-deploy-stack-with-lambda-asset-to-object-lock-enabled-asset-bucket.integtest.ts +0 -42
  346. package/tests/cli-integ-tests/cdk-deploy-stack-without-resource.integtest.ts +0 -32
  347. package/tests/cli-integ-tests/cdk-deploy-wildcard-with-outputs.integtest.ts +0 -28
  348. package/tests/cli-integ-tests/cdk-deploy-with-import-existing-resources-true.integtest.ts +0 -29
  349. package/tests/cli-integ-tests/cdk-deploy-with-method-direct-and-import-existing-resources-fails.integtest.ts +0 -17
  350. package/tests/cli-integ-tests/cdk-deploy-with-notification-arn-as-flag.integtest.ts +0 -36
  351. package/tests/cli-integ-tests/cdk-deploy-with-notification-arn-as-prop-and-flag.integtest.ts +0 -45
  352. package/tests/cli-integ-tests/cdk-deploy-with-notification-arn-as-prop.integtest.ts +0 -37
  353. package/tests/cli-integ-tests/cdk-deploy-with-parameters-multi.integtest.ts +0 -33
  354. package/tests/cli-integ-tests/cdk-deploy-with-parameters.integtest.ts +0 -26
  355. package/tests/cli-integ-tests/cdk-deploy-with-role.integtest.js +0 -97
  356. package/tests/cli-integ-tests/cdk-deploy-with-role.integtest.ts +0 -119
  357. package/tests/cli-integ-tests/cdk-deploy-with-wildcard-and-parameters.integtest.ts +0 -22
  358. package/tests/cli-integ-tests/cdk-deploy-without-execute-a-named-change-set.integtest.ts +0 -36
  359. package/tests/cli-integ-tests/cdk-deploy-without-import-existing-resources.integtest.ts +0 -28
  360. package/tests/cli-integ-tests/cdk-deploy.integtest.ts +0 -20
  361. package/tests/cli-integ-tests/cdk-destroy-interactive.integtest.ts +0 -36
  362. package/tests/cli-integ-tests/cdk-doubly-nested-stack.integtest.ts +0 -12
  363. package/tests/cli-integ-tests/cdk-enablediffnofail.integtest.ts +0 -44
  364. package/tests/cli-integ-tests/cdk-failed-deploy-does-not-hang.integtest.ts +0 -12
  365. package/tests/cli-integ-tests/cdk-fast-deploy.integtest.ts +0 -41
  366. package/tests/cli-integ-tests/cdk-gc-garbage-collection-deletes-unused-ecr-images.integtest.ts +0 -48
  367. package/tests/cli-integ-tests/cdk-gc-garbage-collection-deletes-unused-s3-objects.integtest.ts +0 -51
  368. package/tests/cli-integ-tests/cdk-gc-garbage-collection-keeps-in-use-ecr-images.integtest.ts +0 -48
  369. package/tests/cli-integ-tests/cdk-gc-garbage-collection-keeps-in-use-s3-objects.integtest.ts +0 -52
  370. package/tests/cli-integ-tests/cdk-gc-garbage-collection-tags-unused-ecr-images.integtest.ts +0 -47
  371. package/tests/cli-integ-tests/cdk-gc-garbage-collection-tags-unused-s3-objects.integtest.ts +0 -63
  372. package/tests/cli-integ-tests/cdk-gc-garbage-collection-untags-in-use-ecr-images.integtest.ts +0 -55
  373. package/tests/cli-integ-tests/cdk-gc-garbage-collection-untags-in-use-s3-objects.integtest.ts +0 -63
  374. package/tests/cli-integ-tests/cdk-generating-and-loading-assembly.integtest.ts +0 -52
  375. package/tests/cli-integ-tests/cdk-hotswap-deployment-for-ecs-service-detects-failed-deployment-and-errors.integtest.ts +0 -29
  376. package/tests/cli-integ-tests/cdk-hotswap-deployment-for-ecs-service-waits-for-deployment-to-complete.integtest.ts +0 -45
  377. package/tests/cli-integ-tests/cdk-hotswap-deployment-supports-appsync-apis-with-many-functions.integtest.ts +0 -36
  378. package/tests/cli-integ-tests/cdk-hotswap-deployment-supports-ecs-service.integtest.ts +0 -41
  379. package/tests/cli-integ-tests/cdk-hotswap-deployment-supports-fn::importvalue-intrinsic.integtest.ts +0 -53
  380. package/tests/cli-integ-tests/cdk-hotswap-deployment-supports-lambda-functions-description-and-environment-variables.integtest.ts +0 -43
  381. package/tests/cli-integ-tests/cdk-hotswap-ecs-deployment-respects-properties-override.integtest.ts +0 -59
  382. package/tests/cli-integ-tests/cdk-iam-diff.integtest.ts +0 -23
  383. package/tests/cli-integ-tests/cdk-import-interactive.integtest.ts +0 -57
  384. package/tests/cli-integ-tests/cdk-lib-cli-lib-deploy.integtest.ts +0 -32
  385. package/tests/cli-integ-tests/cdk-lib-cli-lib-list.integtest.ts +0 -12
  386. package/tests/cli-integ-tests/cdk-lib-cli-lib-synth.integtest.ts +0 -27
  387. package/tests/cli-integ-tests/cdk-lib-security-related-changes-without-a-cli-are-expected-to-fail-when-approval-is-required.integtest.ts +0 -32
  388. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate--from-stack-creates-deployable-app-csharp.integtest.ts +0 -13
  389. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate--from-stack-creates-deployable-app-java.integtest.ts +0 -14
  390. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate--from-stack-creates-deployable-app-python.integtest.ts +0 -13
  391. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate--from-stack-creates-deployable-app-typescript.integtest.ts +0 -13
  392. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate-deploys-successfully-csharp.integtest.ts +0 -15
  393. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate-deploys-successfully-java.integtest.ts +0 -15
  394. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate-deploys-successfully-python.integtest.ts +0 -15
  395. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate-deploys-successfully-typescript.integtest.ts +0 -15
  396. package/tests/cli-integ-tests/cdk-migrate/cdk-migrate-generates-migrate.json.integtest.ts +0 -20
  397. package/tests/cli-integ-tests/cdk-migrate/testcase.ts +0 -69
  398. package/tests/cli-integ-tests/cdk-nested-stack-with-parameters.integtest.ts +0 -28
  399. package/tests/cli-integ-tests/cdk-requests-go-through-a-proxy-when-configured.integtest.ts +0 -39
  400. package/tests/cli-integ-tests/cdk-sam-can-locally-test-the-synthesized-cdk-application.integtest.ts +0 -25
  401. package/tests/cli-integ-tests/cdk-security-related-changes-without-a-cli-are-expected-to-fail.integtest.ts +0 -30
  402. package/tests/cli-integ-tests/cdk-skips-notice-refresh.integtest.ts +0 -26
  403. package/tests/cli-integ-tests/cdk-ssm-parameter-provider-error.integtest.ts +0 -18
  404. package/tests/cli-integ-tests/cdk-stack-in-update_rollback_complete-state-can-be-updated.integtest.ts +0 -59
  405. package/tests/cli-integ-tests/cdk-stage-with-bundled-lambda-function.integtest.ts +0 -13
  406. package/tests/cli-integ-tests/cdk-synth---quiet-can-be-specified-in-cdk.json.integtest.ts +0 -20
  407. package/tests/cli-integ-tests/cdk-synthing-a-stage-with-errors-can-be-suppressed.integtest.ts +0 -15
  408. package/tests/cli-integ-tests/cdk-synthing-a-stage-with-errors-leads-to-failure.integtest.ts +0 -18
  409. package/tests/cli-integ-tests/cdk-templates-on-disk-contain-metadata-resource.integtest.ts +0 -25
  410. package/tests/cli-integ-tests/cdk-termination-protection.integtest.ts +0 -19
  411. package/tests/cli-integ-tests/cdk-test-cdk-rollback---force.integtest.ts +0 -48
  412. package/tests/cli-integ-tests/cdk-test-cdk-rollback.integtest.ts +0 -38
  413. package/tests/cli-integ-tests/cdk-test-migrate-deployment-for-app-with-localfile-source-in-migrate.json.integtest.ts +0 -56
  414. package/tests/cli-integ-tests/cdk-test-resource-import-with-construct-that-requires-bundling.integtest.ts +0 -74
  415. package/tests/cli-integ-tests/cdk-test-resource-import.integtest.ts +0 -64
  416. package/tests/cli-integ-tests/cdk-two-ways-of-showing-the-version.integtest.ts +0 -14
  417. package/tests/cli-integ-tests/cdk-update-to-stack-in-rollback_complete-state-will-delete-stack-and-create-a-new-one.integtest.ts +0 -47
  418. package/tests/cli-integ-tests/cdk-vpc-lookup.integtest.ts +0 -26
  419. package/tests/cli-integ-tests/proxy.integtest.ts +0 -168
  420. package/tests/init-csharp/init-csharp.integtest.ts +0 -15
  421. package/tests/init-fsharp/init-fsharp.integtest.ts +0 -15
  422. package/tests/init-go/init-go.integtest.ts +0 -28
  423. package/tests/init-java/init-java.integtest.ts +0 -14
  424. package/tests/init-javascript/init-javascript.integtest.ts +0 -58
  425. package/tests/init-python/init-python.integtest.ts +0 -20
  426. package/tests/init-typescript-app/init-typescript-app.integtest.ts +0 -67
  427. package/tests/init-typescript-lib/init-typescript-lib.integtest.ts +0 -13
  428. package/tests/tool-integrations/amplify.integtest.ts +0 -117
  429. package/tests/tool-integrations/with-tool-context.ts +0 -14
  430. package/tests/uberpackage/uberpackage.integtest.ts +0 -11
  431. /package/tests/cli-integ-tests/{cdk-deploy-with-role.integtest.d.ts → cdk-refactor-dry-run.integtest.d.ts} +0 -0
@@ -20,12 +20,12 @@ const path = require("path");
20
20
  const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
21
21
  const client_ecr_public_1 = require("@aws-sdk/client-ecr-public");
22
22
  const aws_1 = require("./aws");
23
- const repo_source_1 = require("./package-sources/repo-source");
24
23
  const subprocess_1 = require("./package-sources/subprocess");
25
24
  const resources_1 = require("./resources");
26
25
  const shell_1 = require("./shell");
27
26
  const with_aws_1 = require("./with-aws");
28
27
  const with_timeout_1 = require("./with-timeout");
28
+ const yarn_1 = require("./yarn");
29
29
  exports.DEFAULT_TEST_TIMEOUT_S = 20 * 60;
30
30
  exports.EXTENDED_TEST_TIMEOUT_S = 30 * 60;
31
31
  /**
@@ -49,28 +49,11 @@ function withSpecificCdkApp(appName, block) {
49
49
  await fixture.ecrPublicLogin();
50
50
  let success = true;
51
51
  try {
52
- const installationVersion = fixture.packages.requestedFrameworkVersion();
53
- if (fixture.packages.majorVersion() === '1') {
54
- await installNpmPackages(fixture, {
55
- '@aws-cdk/core': installationVersion,
56
- '@aws-cdk/aws-sns': installationVersion,
57
- '@aws-cdk/aws-sqs': installationVersion,
58
- '@aws-cdk/aws-iam': installationVersion,
59
- '@aws-cdk/aws-lambda': installationVersion,
60
- '@aws-cdk/aws-ssm': installationVersion,
61
- '@aws-cdk/aws-ecr-assets': installationVersion,
62
- '@aws-cdk/aws-cloudformation': installationVersion,
63
- '@aws-cdk/aws-ec2': installationVersion,
64
- '@aws-cdk/aws-s3': installationVersion,
65
- 'constructs': '^3',
66
- });
67
- }
68
- else {
69
- await installNpmPackages(fixture, {
70
- 'aws-cdk-lib': installationVersion,
71
- 'constructs': '^10',
72
- });
73
- }
52
+ const installationVersion = fixture.library.requestedVersion();
53
+ await installNpmPackages(fixture, {
54
+ 'aws-cdk-lib': installationVersion,
55
+ 'constructs': '^10',
56
+ });
74
57
  if (!context.disableBootstrap) {
75
58
  await ensureBootstrapped(fixture);
76
59
  }
@@ -164,6 +147,15 @@ async function cloneDirectory(source, target, output) {
164
147
  await (0, shell_1.shell)(['cp', '-R', source + '/*', target], { outputs: output ? [output] : [] });
165
148
  }
166
149
  class TestFixture extends shell_1.ShellHelper {
150
+ integTestDir;
151
+ stackNamePrefix;
152
+ output;
153
+ aws;
154
+ randomString;
155
+ qualifier;
156
+ bucketsToDelete = new Array();
157
+ cli;
158
+ library;
167
159
  constructor(integTestDir, stackNamePrefix, output, aws, randomString) {
168
160
  super(integTestDir, output);
169
161
  this.integTestDir = integTestDir;
@@ -171,9 +163,9 @@ class TestFixture extends shell_1.ShellHelper {
171
163
  this.output = output;
172
164
  this.aws = aws;
173
165
  this.randomString = randomString;
174
- this.bucketsToDelete = new Array();
175
166
  this.qualifier = this.randomString.slice(0, 10);
176
- this.packages = (0, subprocess_1.packageSourceInSubprocess)();
167
+ this.cli = (0, subprocess_1.testSource)('cli');
168
+ this.library = (0, subprocess_1.testSource)('library');
177
169
  }
178
170
  log(s) {
179
171
  this.output.write(`${s}\n`);
@@ -183,18 +175,17 @@ class TestFixture extends shell_1.ShellHelper {
183
175
  * Use this if your test needs to directly pull images outside of a `cdk` or `cdk-assets` command.
184
176
  */
185
177
  async ecrPublicLogin() {
186
- var _a, _b;
187
178
  const tokenResponse = await this.aws.ecrPublic.send(new client_ecr_public_1.GetAuthorizationTokenCommand({}));
188
- const authData = (_a = tokenResponse.authorizationData) === null || _a === void 0 ? void 0 : _a.authorizationToken;
189
- const docker = (_b = process.env.CDK_DOCKER) !== null && _b !== void 0 ? _b : 'docker';
179
+ const authData = tokenResponse.authorizationData?.authorizationToken;
180
+ const docker = process.env.CDK_DOCKER ?? 'docker';
190
181
  if (!authData) {
191
- throw new Error("Could not retrieve ECR public auth token.");
182
+ throw new Error('Could not retrieve ECR public auth token.');
192
183
  }
193
- const decoded = Buffer.from(authData, "base64").toString("utf-8");
194
- const [username, password] = decoded.split(":");
184
+ const decoded = Buffer.from(authData, 'base64').toString('utf-8');
185
+ const [username, password] = decoded.split(':');
195
186
  await this.shell([docker, 'login',
196
187
  '--username', username,
197
- '--password', "${ECR_PASSWORD}",
188
+ '--password', '${ECR_PASSWORD}',
198
189
  'public.ecr.aws'], {
199
190
  shell: true,
200
191
  modEnv: {
@@ -206,37 +197,39 @@ class TestFixture extends shell_1.ShellHelper {
206
197
  return this.cdk(this.cdkDeployCommandLine(stackNames, options, skipStackRename), options);
207
198
  }
208
199
  cdkDeployCommandLine(stackNames, options = {}, skipStackRename) {
209
- var _a, _b;
210
200
  stackNames = typeof stackNames === 'string' ? [stackNames] : stackNames;
211
- const neverRequireApproval = (_a = options.neverRequireApproval) !== null && _a !== void 0 ? _a : true;
201
+ const neverRequireApproval = options.neverRequireApproval ?? true;
212
202
  return [
213
203
  'deploy',
214
204
  ...(neverRequireApproval ? ['--require-approval=never'] : []), // Default to no approval in an unattended test
215
- ...((_b = options.options) !== null && _b !== void 0 ? _b : []),
205
+ ...(options.options ?? []),
216
206
  // use events because bar renders bad in tests
217
207
  '--progress', 'events',
218
208
  ...(skipStackRename ? stackNames : this.fullStackName(stackNames)),
219
209
  ];
220
210
  }
221
211
  async cdkSynth(options = {}) {
222
- var _a;
223
212
  return this.cdk([
224
213
  'synth',
225
- ...((_a = options.options) !== null && _a !== void 0 ? _a : []),
214
+ ...(options.options ?? []),
215
+ ], options);
216
+ }
217
+ async cdkRefactor(options = {}) {
218
+ return this.cdk([
219
+ 'refactor',
220
+ ...(options.options ?? []),
226
221
  ], options);
227
222
  }
228
223
  async cdkDestroy(stackNames, options = {}) {
229
- var _a, _b;
230
224
  stackNames = typeof stackNames === 'string' ? [stackNames] : stackNames;
231
225
  // default to true because most tests don't test user interaction
232
- const force = (_a = options.force) !== null && _a !== void 0 ? _a : true;
226
+ const force = options.force ?? true;
233
227
  return this.cdk(['destroy',
234
228
  ...(force ? ['-f'] : []), // pass -f if user interaction is not desired
235
- ...((_b = options.options) !== null && _b !== void 0 ? _b : []),
229
+ ...(options.options ?? []),
236
230
  ...this.fullStackName(stackNames)], options);
237
231
  }
238
232
  async cdkBootstrapLegacy(options) {
239
- var _a;
240
233
  const args = ['bootstrap'];
241
234
  if (options.verbose) {
242
235
  args.push('-v');
@@ -257,7 +250,7 @@ class TestFixture extends shell_1.ShellHelper {
257
250
  return this.cdk(args, {
258
251
  ...options.cliOptions,
259
252
  modEnv: {
260
- ...(_a = options.cliOptions) === null || _a === void 0 ? void 0 : _a.modEnv,
253
+ ...options.cliOptions?.modEnv,
261
254
  // so that this works for V2,
262
255
  // where the "new" bootstrap is the default
263
256
  CDK_LEGACY_BOOTSTRAP: '1',
@@ -265,7 +258,6 @@ class TestFixture extends shell_1.ShellHelper {
265
258
  });
266
259
  }
267
260
  async cdkBootstrapModern(options) {
268
- var _a, _b;
269
261
  const args = ['bootstrap'];
270
262
  if (options.verbose) {
271
263
  args.push('-v');
@@ -280,7 +272,7 @@ class TestFixture extends shell_1.ShellHelper {
280
272
  if (options.bootstrapBucketName) {
281
273
  args.push('--bootstrap-bucket-name', options.bootstrapBucketName);
282
274
  }
283
- args.push('--qualifier', (_a = options.qualifier) !== null && _a !== void 0 ? _a : this.qualifier);
275
+ args.push('--qualifier', options.qualifier ?? this.qualifier);
284
276
  if (options.cfnExecutionPolicy) {
285
277
  args.push('--cloudformation-execution-policies', options.cfnExecutionPolicy);
286
278
  }
@@ -314,7 +306,7 @@ class TestFixture extends shell_1.ShellHelper {
314
306
  return this.cdk(args, {
315
307
  ...options.cliOptions,
316
308
  modEnv: {
317
- ...(_b = options.cliOptions) === null || _b === void 0 ? void 0 : _b.modEnv,
309
+ ...options.cliOptions?.modEnv,
318
310
  // so that this works for V1,
319
311
  // where the "old" bootstrap is the default
320
312
  CDK_NEW_BOOTSTRAP: '1',
@@ -340,7 +332,6 @@ class TestFixture extends shell_1.ShellHelper {
340
332
  return this.cdk(args);
341
333
  }
342
334
  async cdkMigrate(language, stackName, inputPath, options) {
343
- var _a;
344
335
  return this.cdk([
345
336
  'migrate',
346
337
  '--language',
@@ -348,14 +339,13 @@ class TestFixture extends shell_1.ShellHelper {
348
339
  '--stack-name',
349
340
  stackName,
350
341
  '--from-path',
351
- inputPath !== null && inputPath !== void 0 ? inputPath : path.join(__dirname, '..', 'resources', 'templates', 'sqs-template.json').toString(),
352
- ...((_a = options === null || options === void 0 ? void 0 : options.options) !== null && _a !== void 0 ? _a : []),
342
+ inputPath ?? path.join(__dirname, '..', 'resources', 'templates', 'sqs-template.json').toString(),
343
+ ...(options?.options ?? []),
353
344
  ], options);
354
345
  }
355
346
  async cdk(args, options = {}) {
356
- var _a;
357
- const verbose = (_a = options.verbose) !== null && _a !== void 0 ? _a : true;
358
- await this.packages.makeCliAvailable();
347
+ const verbose = options.verbose ?? true;
348
+ await this.cli.makeCliAvailable();
359
349
  return this.shell(['cdk', ...(verbose ? ['-v'] : []), ...args], {
360
350
  ...options,
361
351
  modEnv: {
@@ -368,15 +358,14 @@ class TestFixture extends shell_1.ShellHelper {
368
358
  * Return the environment variables with which to execute CDK
369
359
  */
370
360
  cdkShellEnv() {
371
- var _a;
372
361
  // if tests are using an explicit aws identity already (i.e creds)
373
362
  // force every cdk command to use the same identity.
374
- const awsCreds = (_a = this.aws.identityEnv()) !== null && _a !== void 0 ? _a : {};
363
+ const awsCreds = this.aws.identityEnv() ?? {};
375
364
  return {
376
365
  AWS_REGION: this.aws.region,
377
366
  AWS_DEFAULT_REGION: this.aws.region,
378
367
  STACK_NAME_PREFIX: this.stackNamePrefix,
379
- PACKAGE_LAYOUT_VERSION: this.packages.majorVersion(),
368
+ PACKAGE_LAYOUT_VERSION: '2',
380
369
  // In these tests we want to make a distinction between stdout and sterr
381
370
  CI: 'false',
382
371
  ...awsCreds,
@@ -388,13 +377,12 @@ class TestFixture extends shell_1.ShellHelper {
388
377
  return JSON.parse(fs.readFileSync(templatePath, { encoding: 'utf-8' }).toString());
389
378
  }
390
379
  async bootstrapRepoName() {
391
- var _a, _b;
392
380
  await ensureBootstrapped(this);
393
381
  const response = await this.aws.cloudFormation.send(new client_cloudformation_1.DescribeStacksCommand({}));
394
- const stack = ((_a = response.Stacks) !== null && _a !== void 0 ? _a : [])
382
+ const stack = (response.Stacks ?? [])
395
383
  .filter((s) => s.StackName && s.StackName == this.bootstrapStackName);
396
384
  assert(stack.length == 1);
397
- return (_b = (0, aws_1.outputFromStack)('ImageRepositoryName', stack[0])) !== null && _b !== void 0 ? _b : '';
385
+ return (0, aws_1.outputFromStack)('ImageRepositoryName', stack[0]) ?? '';
398
386
  }
399
387
  get bootstrapStackName() {
400
388
  return this.fullStackName('bootstrap-stack');
@@ -462,7 +450,6 @@ class TestFixture extends shell_1.ShellHelper {
462
450
  * Return the stacks starting with our testing prefix that should be deleted
463
451
  */
464
452
  async deleteableStacks(prefix) {
465
- var _a;
466
453
  const statusFilter = [
467
454
  'CREATE_IN_PROGRESS', 'CREATE_FAILED', 'CREATE_COMPLETE',
468
455
  'ROLLBACK_IN_PROGRESS', 'ROLLBACK_FAILED', 'ROLLBACK_COMPLETE',
@@ -477,7 +464,7 @@ class TestFixture extends shell_1.ShellHelper {
477
464
  'IMPORT_ROLLBACK_COMPLETE',
478
465
  ];
479
466
  const response = await this.aws.cloudFormation.send(new client_cloudformation_1.DescribeStacksCommand({}));
480
- return ((_a = response.Stacks) !== null && _a !== void 0 ? _a : [])
467
+ return (response.Stacks ?? [])
481
468
  .filter((s) => s.StackName && s.StackName.startsWith(prefix))
482
469
  .filter((s) => s.StackStatus && statusFilter.includes(s.StackStatus))
483
470
  .filter((s) => s.RootId === undefined); // Only delete parent stacks. Nested stacks are deleted in the process
@@ -589,7 +576,7 @@ function defined(x) {
589
576
  */
590
577
  async function installNpmPackages(fixture, packages) {
591
578
  if (process.env.REPO_ROOT) {
592
- const monoRepo = await (0, repo_source_1.findYarnPackages)(process.env.REPO_ROOT);
579
+ const monoRepo = await (0, yarn_1.findYarnPackages)(process.env.REPO_ROOT);
593
580
  // Replace the install target with the physical location of this package
594
581
  for (const key of Object.keys(packages)) {
595
582
  if (key in monoRepo) {
@@ -625,4 +612,4 @@ async function installNpmPackages(fixture, packages) {
625
612
  }
626
613
  }
627
614
  const ALREADY_BOOTSTRAPPED_IN_THIS_RUN = new Set();
628
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1jZGstYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2l0aC1jZGstYXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTRCQSxnREErREM7QUFLRCxnQ0FLQztBQUVELDhDQStDQztBQVdELGdEQUVDO0FBRUQsa0RBRUM7QUFFRCxnRUFFQztBQUVELHNEQUVDO0FBbUJELDRDQUVDO0FBZUQsd0NBSUM7QUFtZkQsZ0RBeUJDO0FBaUVELGdEQXdDQztBQTUwQkQsK0JBQStCO0FBQy9CLGlDQUFpQztBQUNqQyx5QkFBeUI7QUFDekIseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwwRUFBOEU7QUFDOUUsa0VBQTBFO0FBQzFFLCtCQUEyRDtBQUUzRCwrREFBaUU7QUFFakUsNkRBQXlFO0FBQ3pFLDJDQUE0QztBQUM1QyxtQ0FBbUU7QUFDbkUseUNBQW9FO0FBQ3BFLGlEQUE2QztBQUVoQyxRQUFBLHNCQUFzQixHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBQSx1QkFBdUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRS9DOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FDaEMsT0FBZSxFQUNmLEtBQThDO0lBRTlDLE9BQU8sS0FBSyxFQUFFLE9BQTJELEVBQUUsRUFBRTtRQUMzRSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBQ25DLE1BQU0sZUFBZSxHQUFHLFdBQVcsS0FBSyxFQUFFLENBQUM7UUFDM0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRWxFLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixlQUFlLElBQUksQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixZQUFZLElBQUksQ0FBQyxDQUFD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RyxJQUFJLENBQUMsQ0FBQTtJQUNyRSxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztJQUU3QixPQUFPLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDO1lBQ0gsNkNBQTZDO1lBQzdDLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDakUsTUFBTTtRQUNSLENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUUsRUFBRSxDQUFDO2dCQUM1RixPQUFPLENBQUMsR0FBRyxDQUFDLHFEQUFxRCxpQkFBaUIsYUFBYSxDQUFDLENBQUM7Z0JBQ2pHLE1BQU0sSUFBQSxXQUFLLEVBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLENBQUE7Z0JBQ3JDLFNBQVM7WUFDWCxDQUFDO1lBQ0QsTUFBTSxDQUFDLENBQUM7UUFDVixDQUFDO0lBQ0gsQ0FBQztBQUVILENBQUM7QUFFRCxNQUFNLGdDQUFnQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBEZXNjcmliZVN0YWNrc0NvbW1hbmQsIFN0YWNrIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IEdldEF1dGhvcml6YXRpb25Ub2tlbkNvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtZWNyLXB1YmxpYyc7XG5pbXBvcnQgeyBvdXRwdXRGcm9tU3RhY2ssIEF3c0NsaWVudHMsIHNsZWVwIH0gZnJvbSAnLi9hd3MnO1xuaW1wb3J0IHsgVGVzdENvbnRleHQgfSBmcm9tICcuL2ludGVnLXRlc3QnO1xuaW1wb3J0IHsgZmluZFlhcm5QYWNrYWdlcyB9IGZyb20gJy4vcGFja2FnZS1zb3VyY2VzL3JlcG8tc291cmNlJztcbmltcG9ydCB7IElQYWNrYWdlU291cmNlIH0gZnJvbSAnLi9wYWNrYWdlLXNvdXJjZXMvc291cmNlJztcbmltcG9ydCB7IHBhY2thZ2VTb3VyY2VJblN1YnByb2Nlc3MgfSBmcm9tICcuL3BhY2thZ2Utc291cmNlcy9zdWJwcm9jZXNzJztcbmltcG9ydCB7IFJFU09VUkNFU19ESVIgfSBmcm9tICcuL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBzaGVsbCwgU2hlbGxPcHRpb25zLCBTaGVsbEhlbHBlciwgcmltcmFmIH0gZnJvbSAnLi9zaGVsbCc7XG5pbXBvcnQgeyBBd3NDb250ZXh0LCBhdG1vc3BoZXJlRW5hYmxlZCwgd2l0aEF3cyB9IGZyb20gJy4vd2l0aC1hd3MnO1xuaW1wb3J0IHsgd2l0aFRpbWVvdXQgfSBmcm9tICcuL3dpdGgtdGltZW91dCc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RFU1RfVElNRU9VVF9TID0gMjAgKiA2MDtcbmV4cG9ydCBjb25zdCBFWFRFTkRFRF9URVNUX1RJTUVPVVRfUyA9IDMwICogNjA7XG5cbi8qKlxuICogSGlnaGVyIG9yZGVyIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYSBibG9jayB3aXRoIGEgQ0RLIGFwcCBmaXh0dXJlXG4gKlxuICogUmVxdWlyZXMgYW4gQVdTIGNsaWVudCB0byBiZSBwYXNzZWQgaW4uXG4gKlxuICogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgdGVzdHMgKHNvIHdlIGRvbid0IGhhdmUgdG8gY2hhbmdlXG4gKiB0b28gbXVjaCkgdGhlIGlubmVyIGJsb2NrIGlzIGV4cGVjdGVkIHRvIHRha2UgYSBgVGVzdEZpeHR1cmVgIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTcGVjaWZpY0Nka0FwcChcbiAgYXBwTmFtZTogc3RyaW5nLFxuICBibG9jazogKGNvbnRleHQ6IFRlc3RGaXh0dXJlKSA9PiBQcm9taXNlPHZvaWQ+LFxuKTogKGNvbnRleHQ6IFRlc3RDb250ZXh0ICYgQXdzQ29udGV4dCAmIERpc2FibGVCb290c3RyYXBDb250ZXh0KSA9PiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGFzeW5jIChjb250ZXh0OiBUZXN0Q29udGV4dCAmIEF3c0NvbnRleHQgJiBEaXNhYmxlQm9vdHN0cmFwQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHJhbmR5ID0gY29udGV4dC5yYW5kb21TdHJpbmc7XG4gICAgY29uc3Qgc3RhY2tOYW1lUHJlZml4ID0gYGNka3Rlc3QtJHtyYW5keX1gO1xuICAgIGNvbnN0IGludGVnVGVzdERpciA9IHBhdGguam9pbihvcy50bXBkaXIoKSwgYGNkay1pbnRlZy0ke3JhbmR5fWApO1xuXG4gICAgY29udGV4dC5vdXRwdXQud3JpdGUoYCBTdGFjayBwcmVmaXg6ICAgJHtzdGFja05hbWVQcmVmaXh9XFxuYCk7XG4gICAgY29udGV4dC5vdXRwdXQud3JpdGUoYCBUZXN0IGRpcmVjdG9yeTogJHtpbnRlZ1Rlc3REaXJ9XFxuYCk7XG4gICAgY29udGV4dC5vdXRwdXQud3JpdGUoYCBSZWdpb246ICAgICAgICAgJHtjb250ZXh0LmF3cy5yZWdpb259XFxuYCk7XG5cbiAgICBhd2FpdCBjbG9uZURpcmVjdG9yeShwYXRoLmpvaW4oUkVTT1VSQ0VTX0RJUiwgJ2Nkay1hcHBzJywgYXBwTmFtZSksIGludGVnVGVzdERpciwgY29udGV4dC5vdXRwdXQpO1xuICAgIGNvbnN0IGZpeHR1cmUgPSBuZXcgVGVzdEZpeHR1cmUoXG4gICAgICBpbnRlZ1Rlc3REaXIsXG4gICAgICBzdGFja05hbWVQcmVmaXgsXG4gICAgICBjb250ZXh0Lm91dHB1dCxcbiAgICAgIGNvbnRleHQuYXdzLFxuICAgICAgY29udGV4dC5yYW5kb21TdHJpbmcpO1xuICAgIGF3YWl0IGZpeHR1cmUuZWNyUHVibGljTG9naW4oKTtcblxuICAgIGxldCBzdWNjZXNzID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW5zdGFsbGF0aW9uVmVyc2lvbiA9IGZpeHR1cmUucGFja2FnZXMucmVxdWVzdGVkRnJhbWV3b3JrVmVyc2lvbigpO1xuXG4gICAgICBpZiAoZml4dHVyZS5wYWNrYWdlcy5tYWpvclZlcnNpb24oKSA9PT0gJzEnKSB7XG4gICAgICAgIGF3YWl0IGluc3RhbGxOcG1QYWNrYWdlcyhmaXh0dXJlLCB7XG4gICAgICAgICAgJ0Bhd3MtY2RrL2NvcmUnOiBpbnN0YWxsYXRpb25WZXJzaW9uLFxuICAgICAgICAgICdAYXdzLWNkay9hd3Mtc25zJzogaW5zdGFsbGF0aW9uVmVyc2lvbixcbiAgICAgICAgICAnQGF3cy1jZGsvYXdzLXNxcyc6IGluc3RhbGxhdGlvblZlcnNpb24sXG4gICAgICAgICAgJ0Bhd3MtY2RrL2F3cy1pYW0nOiBpbnN0YWxsYXRpb25WZXJzaW9uLFxuICAgICAgICAgICdAYXdzLWNkay9hd3MtbGFtYmRhJzogaW5zdGFsbGF0aW9uVmVyc2lvbixcbiAgICAgICAgICAnQGF3cy1jZGsvYXdzLXNzbSc6IGluc3RhbGxhdGlvblZlcnNpb24sXG4gICAgICAgICAgJ0Bhd3MtY2RrL2F3cy1lY3ItYXNzZXRzJzogaW5zdGFsbGF0aW9uVmVyc2lvbixcbiAgICAgICAgICAnQGF3cy1jZGsvYXdzLWNsb3VkZm9ybWF0aW9uJzogaW5zdGFsbGF0aW9uVmVyc2lvbixcbiAgICAgICAgICAnQGF3cy1jZGsvYXdzLWVjMic6IGluc3RhbGxhdGlvblZlcnNpb24sXG4gICAgICAgICAgJ0Bhd3MtY2RrL2F3cy1zMyc6IGluc3RhbGxhdGlvblZlcnNpb24sXG4gICAgICAgICAgJ2NvbnN0cnVjdHMnOiAnXjMnLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGluc3RhbGxOcG1QYWNrYWdlcyhmaXh0dXJlLCB7XG4gICAgICAgICAgJ2F3cy1jZGstbGliJzogaW5zdGFsbGF0aW9uVmVyc2lvbixcbiAgICAgICAgICAnY29uc3RydWN0cyc6ICdeMTAnLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFjb250ZXh0LmRpc2FibGVCb290c3RyYXApIHtcbiAgICAgICAgYXdhaXQgZW5zdXJlQm9vdHN0cmFwcGVkKGZpeHR1cmUpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBibG9jayhmaXh0dXJlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdWNjZXNzID0gZmFsc2U7XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuSU5URUdfTk9fQ0xFQU4pIHtcbiAgICAgICAgY29udGV4dC5sb2coYExlZnQgdGVzdCBkaXJlY3RvcnkgaW4gJyR7aW50ZWdUZXN0RGlyfScgKCRJTlRFR19OT19DTEVBTilcXG5gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGZpeHR1cmUuZGlzcG9zZShzdWNjZXNzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogTGlrZSBgd2l0aFNwZWNpZmljQ2RrQXBwYCwgYnV0IHVzZXMgdGhlIGRlZmF1bHQgaW50ZWdyYXRpb24gdGVzdGluZyBhcHAgd2l0aCBhIG1pbGxpb24gc3RhY2tzIGluIGl0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoQ2RrQXBwKFxuICBibG9jazogKGNvbnRleHQ6IFRlc3RGaXh0dXJlKSA9PiBQcm9taXNlPHZvaWQ+LFxuKTogKGNvbnRleHQ6IFRlc3RDb250ZXh0ICYgQXdzQ29udGV4dCAmIERpc2FibGVCb290c3RyYXBDb250ZXh0KSA9PiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gJ2FwcCcgaXMgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgaW50ZWdyYXRpb24gYXBwIGluIHRoZSBgY2RrLWFwcHNgIGRpcmVjdG9yeVxuICByZXR1cm4gd2l0aFNwZWNpZmljQ2RrQXBwKCdhcHAnLCBibG9jayk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoQ2RrTWlncmF0ZUFwcChcbiAgbGFuZ3VhZ2U6IHN0cmluZyxcbiAgYmxvY2s6IChjb250ZXh0OiBUZXN0Rml4dHVyZSkgPT4gUHJvbWlzZTx2b2lkPixcbik6IChjb250ZXh0OiBUZXN0Q29udGV4dCAmIEF3c0NvbnRleHQgJiBEaXNhYmxlQm9vdHN0cmFwQ29udGV4dCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBhc3luYyAoY29udGV4dDogVGVzdENvbnRleHQgJiBBd3NDb250ZXh0ICYgRGlzYWJsZUJvb3RzdHJhcENvbnRleHQpID0+IHtcbiAgICBjb25zdCBzdGFja05hbWUgPSBgY2RrLW1pZ3JhdGUtJHtsYW5ndWFnZX0taW50ZWctJHtjb250ZXh0LnJhbmRvbVN0cmluZ31gO1xuICAgIGNvbnN0IGludGVnVGVzdERpciA9IHBhdGguam9pbihvcy50bXBkaXIoKSwgYGNkay1taWdyYXRlLSR7bGFuZ3VhZ2V9LWludGVnLSR7Y29udGV4dC5yYW5kb21TdHJpbmd9YCk7XG5cbiAgICBjb250ZXh0Lm91dHB1dC53cml0ZShgIFN0YWNrIG5hbWU6ICAgJHtzdGFja05hbWV9XFxuYCk7XG4gICAgY29udGV4dC5vdXRwdXQud3JpdGUoYCBUZXN0IGRpcmVjdG9yeTogJHtpbnRlZ1Rlc3REaXJ9XFxuYCk7XG5cbiAgICBmcy5ta2RpclN5bmMoaW50ZWdUZXN0RGlyKTtcbiAgICBjb25zdCBmaXh0dXJlID0gbmV3IFRlc3RGaXh0dXJlKFxuICAgICAgaW50ZWdUZXN0RGlyLFxuICAgICAgc3RhY2tOYW1lLFxuICAgICAgY29udGV4dC5vdXRwdXQsXG4gICAgICBjb250ZXh0LmF3cyxcbiAgICAgIGNvbnRleHQucmFuZG9tU3RyaW5nLFxuICAgICk7XG4gICAgYXdhaXQgZml4dHVyZS5lY3JQdWJsaWNMb2dpbigpO1xuXG4gICAgYXdhaXQgZW5zdXJlQm9vdHN0cmFwcGVkKGZpeHR1cmUpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtNaWdyYXRlKGxhbmd1YWdlLCBzdGFja05hbWUpO1xuXG4gICAgY29uc3QgdGVzdEZpeHR1cmUgPSBuZXcgVGVzdEZpeHR1cmUoXG4gICAgICBwYXRoLmpvaW4oaW50ZWdUZXN0RGlyLCBzdGFja05hbWUpLFxuICAgICAgc3RhY2tOYW1lLFxuICAgICAgY29udGV4dC5vdXRwdXQsXG4gICAgICBjb250ZXh0LmF3cyxcbiAgICAgIGNvbnRleHQucmFuZG9tU3RyaW5nLFxuICAgICk7XG5cbiAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGJsb2NrKHRlc3RGaXh0dXJlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdWNjZXNzID0gZmFsc2U7XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuSU5URUdfTk9fQ0xFQU4pIHtcbiAgICAgICAgY29udGV4dC5sb2coYExlZnQgdGVzdCBkaXJlY3RvcnkgaW4gJyR7aW50ZWdUZXN0RGlyfScgKCRJTlRFR19OT19DTEVBTilgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGZpeHR1cmUuZGlzcG9zZShzdWNjZXNzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogRGVmYXVsdCB0ZXN0IGZpeHR1cmUgZm9yIG1vc3QgKGFsbD8pIGludGVnIHRlc3RzXG4gKlxuICogSXQncyBhIGNvbXBvc2l0aW9uIG9mIHdpdGhBd3Mvd2l0aENka0FwcCwgZXhwZWN0aW5nIHRoZSB0ZXN0IGJsb2NrIHRvIHRha2UgYSBgVGVzdEZpeHR1cmVgXG4gKiBvYmplY3QuXG4gKlxuICogV2UgY291bGQgaGF2ZSBwdXQgYHdpdGhBd3Mod2l0aENka0FwcChmaXh0dXJlID0+IHsgLy4uLiBhY3R1YWwgdGVzdCBoZXJlLi4uLyB9KSlgIGluIGV2ZXJ5XG4gKiB0ZXN0IGRlY2xhcmF0aW9uIGJ1dCBjZW50cmFsaXppbmcgaXQgaXMgZ29pbmcgdG8gbWFrZSBpdCBjb252ZW5pZW50IHRvIG1vZGlmeSBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aERlZmF1bHRGaXh0dXJlKGJsb2NrOiAoY29udGV4dDogVGVzdEZpeHR1cmUpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgcmV0dXJuIHdpdGhBd3Mod2l0aFRpbWVvdXQoREVGQVVMVF9URVNUX1RJTUVPVVRfUywgd2l0aENka0FwcChibG9jaykpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTcGVjaWZpY0ZpeHR1cmUoYXBwTmFtZTogc3RyaW5nLCBibG9jazogKGNvbnRleHQ6IFRlc3RGaXh0dXJlKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gIHJldHVybiB3aXRoQXdzKHdpdGhUaW1lb3V0KERFRkFVTFRfVEVTVF9USU1FT1VUX1MsIHdpdGhTcGVjaWZpY0Nka0FwcChhcHBOYW1lLCBibG9jaykpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhFeHRlbmRlZFRpbWVvdXRGaXh0dXJlKGJsb2NrOiAoY29udGV4dDogVGVzdEZpeHR1cmUpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgcmV0dXJuIHdpdGhBd3Mod2l0aFRpbWVvdXQoRVhURU5ERURfVEVTVF9USU1FT1VUX1MsIHdpdGhDZGtBcHAoYmxvY2spKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoQ0RLTWlncmF0ZUZpeHR1cmUobGFuZ3VhZ2U6IHN0cmluZywgYmxvY2s6IChjb250ZW50OiBUZXN0Rml4dHVyZSkgPT4gUHJvbWlzZTx2b2lkPikge1xuICByZXR1cm4gd2l0aEF3cyh3aXRoVGltZW91dChERUZBVUxUX1RFU1RfVElNRU9VVF9TLCB3aXRoQ2RrTWlncmF0ZUFwcChsYW5ndWFnZSwgYmxvY2spKSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzYWJsZUJvb3RzdHJhcENvbnRleHQge1xuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIGNyZWF0aW5nIHRoZSBkZWZhdWx0IGJvb3RzdHJhcFxuICAgKiBzdGFjayBwcmlvciB0byBydW5uaW5nIHRoZSB0ZXN0XG4gICAqXG4gICAqIFRoaXMgc2hvdWxkIGJlIHNldCB0byB0cnVlIHdoZW4gcnVubmluZyB0ZXN0cyB0aGF0XG4gICAqIGV4cGxpY2l0bHkgY3JlYXRlIGEgYm9vdHN0cmFwIHN0YWNrXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkaXNhYmxlQm9vdHN0cmFwPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUbyBiZSB1c2VkIGluIHBsYWNlIG9mIGB3aXRoRGVmYXVsdEZpeHR1cmVgIHdoZW4gdGhlIHRlc3RcbiAqIHNob3VsZCBub3QgY3JlYXRlIHRoZSBkZWZhdWx0IGJvb3RzdHJhcCBzdGFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aG91dEJvb3RzdHJhcChibG9jazogKGNvbnRleHQ6IFRlc3RGaXh0dXJlKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gIHJldHVybiB3aXRoQXdzKHdpdGhDZGtBcHAoYmxvY2spLCB0cnVlKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDZGtDbGlPcHRpb25zIGV4dGVuZHMgU2hlbGxPcHRpb25zIHtcbiAgb3B0aW9ucz86IHN0cmluZ1tdO1xuICBuZXZlclJlcXVpcmVBcHByb3ZhbD86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENka0Rlc3Ryb3lDbGlPcHRpb25zIGV4dGVuZHMgQ2RrQ2xpT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGZvcmNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcmVwYXJlIGEgdGFyZ2V0IGRpciBieXJlcGxpY2F0aW5nIGEgc291cmNlIGRpcmVjdG9yeVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xvbmVEaXJlY3Rvcnkoc291cmNlOiBzdHJpbmcsIHRhcmdldDogc3RyaW5nLCBvdXRwdXQ/OiBOb2RlSlMuV3JpdGFibGVTdHJlYW0pIHtcbiAgYXdhaXQgc2hlbGwoWydybScsICctcmYnLCB0YXJnZXRdLCB7IG91dHB1dHM6IG91dHB1dCA/IFtvdXRwdXRdIDogW10gfSk7XG4gIGF3YWl0IHNoZWxsKFsnbWtkaXInLCAnLXAnLCB0YXJnZXRdLCB7IG91dHB1dHM6IG91dHB1dCA/IFtvdXRwdXRdIDogW10gfSk7XG4gIGF3YWl0IHNoZWxsKFsnY3AnLCAnLVInLCBzb3VyY2UgKyAnLyonLCB0YXJnZXRdLCB7IG91dHB1dHM6IG91dHB1dCA/IFtvdXRwdXRdIDogW10gfSk7XG59XG5cbmludGVyZmFjZSBDb21tb25DZGtCb290c3RyYXBDb21tYW5kT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQYXRoIHRvIGEgY3VzdG9tIGJvb3RzdHJhcCB0ZW1wbGF0ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgZGVmYXVsdCBDREsgYm9vdHN0cmFwIHRlbXBsYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYm9vdHN0cmFwVGVtcGxhdGU/OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgdG9vbGtpdFN0YWNrTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdmVyYm9zZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IC0gYXV0by1nZW5lcmF0ZWQgQ2xvdWRGb3JtYXRpb24gbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgYm9vdHN0cmFwQnVja2V0TmFtZT86IHN0cmluZztcblxuICByZWFkb25seSBjbGlPcHRpb25zPzogQ2RrQ2xpT3B0aW9ucztcblxuICAvKipcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBkZWZhdWx0IENESyBxdWFsaWZpZXJcbiAgICovXG4gIHJlYWRvbmx5IHF1YWxpZmllcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDZGtMZWdhY3lCb290c3RyYXBDb21tYW5kT3B0aW9ucyBleHRlbmRzIENvbW1vbkNka0Jvb3RzdHJhcENvbW1hbmRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBub0V4ZWN1dGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBwdWJsaWNBY2Nlc3NCbG9ja0NvbmZpZ3VyYXRpb24/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENka01vZGVybkJvb3RzdHJhcENvbW1hbmRPcHRpb25zIGV4dGVuZHMgQ29tbW9uQ2RrQm9vdHN0cmFwQ29tbWFuZE9wdGlvbnMge1xuICAvKipcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGZvcmNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBjZm5FeGVjdXRpb25Qb2xpY3k/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBzaG93VGVtcGxhdGU/OiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IHRlbXBsYXRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdGVybWluYXRpb25Qcm90ZWN0aW9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBleGFtcGxlUGVybWlzc2lvbnNCb3VuZGFyeT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tUGVybWlzc2lvbnNCb3VuZGFyeT86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSB1c2VQcmV2aW91c1BhcmFtZXRlcnM/OiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IHRydXN0Pzogc3RyaW5nW107XG5cbiAgcmVhZG9ubHkgdW50cnVzdD86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENka0dhcmJhZ2VDb2xsZWN0aW9uQ29tbWFuZE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiBkYXlzIGFuIGFzc2V0IHNob3VsZCBzdGF5IGlzb2xhdGVkIGJlZm9yZSBkZWxldGlvbiwgdG9cbiAgICogZ3VhcmQgYWdhaW5zdCBzb21lIHBpcGVsaW5lIHJvbGxiYWNrIHNjZW5hcmlvc1xuICAgKlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICByZWFkb25seSByb2xsYmFja0J1ZmZlckRheXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGFzc2V0IHRoYXQgaXMgZ2V0dGluZyBnYXJiYWdlIGNvbGxlY3RlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgJ2FsbCdcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiAnZWNyJyB8ICdzMycgfCAnYWxsJztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGJvb3RzdHJhcCBzdGFja1xuICAgKlxuICAgKiBAZGVmYXVsdCAnQ2RrVG9vbGtpdCdcbiAgICovXG4gIHJlYWRvbmx5IGJvb3RzdHJhcFN0YWNrTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3RGaXh0dXJlIGV4dGVuZHMgU2hlbGxIZWxwZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgcXVhbGlmaWVyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnVja2V0c1RvRGVsZXRlID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgcHVibGljIHJlYWRvbmx5IHBhY2thZ2VzOiBJUGFja2FnZVNvdXJjZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgaW50ZWdUZXN0RGlyOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHN0YWNrTmFtZVByZWZpeDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBvdXRwdXQ6IE5vZGVKUy5Xcml0YWJsZVN0cmVhbSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXdzOiBBd3NDbGllbnRzLFxuICAgIHB1YmxpYyByZWFkb25seSByYW5kb21TdHJpbmc6IHN0cmluZykge1xuICAgIHN1cGVyKGludGVnVGVzdERpciwgb3V0cHV0KTtcblxuICAgIHRoaXMucXVhbGlmaWVyID0gdGhpcy5yYW5kb21TdHJpbmcuc2xpY2UoMCwgMTApO1xuICAgIHRoaXMucGFja2FnZXMgPSBwYWNrYWdlU291cmNlSW5TdWJwcm9jZXNzKCk7XG4gIH1cblxuICBwdWJsaWMgbG9nKHM6IHN0cmluZykge1xuICAgIHRoaXMub3V0cHV0LndyaXRlKGAke3N9XFxuYCk7XG4gIH1cblxuICAvKipcbiAgICogTG9naW4gdG8gdGhlIHB1YmxpYyBFQ1IgZ2FsbGVyeSB1c2luZyB0aGUgY3VycmVudCBBV1MgY3JlZGVudGlhbHMuXG4gICAqIFVzZSB0aGlzIGlmIHlvdXIgdGVzdCBuZWVkcyB0byBkaXJlY3RseSBwdWxsIGltYWdlcyBvdXRzaWRlIG9mIGEgYGNka2Agb3IgYGNkay1hc3NldHNgIGNvbW1hbmQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZWNyUHVibGljTG9naW4oKSB7XG5cbiAgICBjb25zdCB0b2tlblJlc3BvbnNlID0gYXdhaXQgdGhpcy5hd3MuZWNyUHVibGljLnNlbmQobmV3IEdldEF1dGhvcml6YXRpb25Ub2tlbkNvbW1hbmQoe30pKTtcbiAgICBjb25zdCBhdXRoRGF0YSA9IHRva2VuUmVzcG9uc2UuYXV0aG9yaXphdGlvbkRhdGE/LmF1dGhvcml6YXRpb25Ub2tlbjtcblxuICAgIGNvbnN0IGRvY2tlciA9IHByb2Nlc3MuZW52LkNES19ET0NLRVIgPz8gJ2RvY2tlcic7XG5cbiAgICBpZiAoIWF1dGhEYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgcmV0cmlldmUgRUNSIHB1YmxpYyBhdXRoIHRva2VuLlwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNvZGVkID0gQnVmZmVyLmZyb20oYXV0aERhdGEsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgY29uc3QgW3VzZXJuYW1lLCBwYXNzd29yZF0gPSBkZWNvZGVkLnNwbGl0KFwiOlwiKTtcblxuICAgIGF3YWl0IHRoaXMuc2hlbGwoW2RvY2tlciwgJ2xvZ2luJyxcbiAgICAgICctLXVzZXJuYW1lJywgdXNlcm5hbWUsXG4gICAgICAnLS1wYXNzd29yZCcsIFwiJHtFQ1JfUEFTU1dPUkR9XCIsXG4gICAgICAncHVibGljLmVjci5hd3MnXSwge1xuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBtb2RFbnY6IHtcbiAgICAgICAgRUNSX1BBU1NXT1JEOiBwYXNzd29yZCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjZGtEZXBsb3koc3RhY2tOYW1lczogc3RyaW5nIHwgc3RyaW5nW10sIG9wdGlvbnM6IENka0NsaU9wdGlvbnMgPSB7fSwgc2tpcFN0YWNrUmVuYW1lPzogYm9vbGVhbikge1xuICAgIHJldHVybiB0aGlzLmNkayh0aGlzLmNka0RlcGxveUNvbW1hbmRMaW5lKHN0YWNrTmFtZXMsIG9wdGlvbnMsIHNraXBTdGFja1JlbmFtZSksIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNka0RlcGxveUNvbW1hbmRMaW5lKHN0YWNrTmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRpb25zOiBDZGtDbGlPcHRpb25zID0ge30sIHNraXBTdGFja1JlbmFtZT86IGJvb2xlYW4pIHtcbiAgICBzdGFja05hbWVzID0gdHlwZW9mIHN0YWNrTmFtZXMgPT09ICdzdHJpbmcnID8gW3N0YWNrTmFtZXNdIDogc3RhY2tOYW1lcztcbiAgICBjb25zdCBuZXZlclJlcXVpcmVBcHByb3ZhbCA9IG9wdGlvbnMubmV2ZXJSZXF1aXJlQXBwcm92YWwgPz8gdHJ1ZTtcblxuICAgIHJldHVybiBbXG4gICAgICAnZGVwbG95JyxcbiAgICAgIC4uLihuZXZlclJlcXVpcmVBcHByb3ZhbCA/IFsnLS1yZXF1aXJlLWFwcHJvdmFsPW5ldmVyJ10gOiBbXSksIC8vIERlZmF1bHQgdG8gbm8gYXBwcm92YWwgaW4gYW4gdW5hdHRlbmRlZCB0ZXN0XG4gICAgICAuLi4ob3B0aW9ucy5vcHRpb25zID8/IFtdKSxcbiAgICAgIC8vIHVzZSBldmVudHMgYmVjYXVzZSBiYXIgcmVuZGVycyBiYWQgaW4gdGVzdHNcbiAgICAgICctLXByb2dyZXNzJywgJ2V2ZW50cycsXG4gICAgICAuLi4oc2tpcFN0YWNrUmVuYW1lID8gc3RhY2tOYW1lcyA6IHRoaXMuZnVsbFN0YWNrTmFtZShzdGFja05hbWVzKSksXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjZGtTeW50aChvcHRpb25zOiBDZGtDbGlPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5jZGsoW1xuICAgICAgJ3N5bnRoJyxcbiAgICAgIC4uLihvcHRpb25zLm9wdGlvbnMgPz8gW10pLFxuICAgIF0sIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNka0Rlc3Ryb3koc3RhY2tOYW1lczogc3RyaW5nIHwgc3RyaW5nW10sIG9wdGlvbnM6IENka0Rlc3Ryb3lDbGlPcHRpb25zID0ge30pIHtcbiAgICBzdGFja05hbWVzID0gdHlwZW9mIHN0YWNrTmFtZXMgPT09ICdzdHJpbmcnID8gW3N0YWNrTmFtZXNdIDogc3RhY2tOYW1lcztcblxuICAgIC8vIGRlZmF1bHQgdG8gdHJ1ZSBiZWNhdXNlIG1vc3QgdGVzdHMgZG9uJ3QgdGVzdCB1c2VyIGludGVyYWN0aW9uXG4gICAgY29uc3QgZm9yY2UgPSBvcHRpb25zLmZvcmNlID8/IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcy5jZGsoWydkZXN0cm95JyxcbiAgICAgIC4uLihmb3JjZSA/IFsnLWYnXSA6IFtdKSwgLy8gcGFzcyAtZiBpZiB1c2VyIGludGVyYWN0aW9uIGlzIG5vdCBkZXNpcmVkXG4gICAgICAuLi4ob3B0aW9ucy5vcHRpb25zID8/IFtdKSxcbiAgICAgIC4uLnRoaXMuZnVsbFN0YWNrTmFtZShzdGFja05hbWVzKV0sIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNka0Jvb3RzdHJhcExlZ2FjeShvcHRpb25zOiBDZGtMZWdhY3lCb290c3RyYXBDb21tYW5kT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgYXJncyA9IFsnYm9vdHN0cmFwJ107XG5cbiAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICBhcmdzLnB1c2goJy12Jyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLS10b29sa2l0LXN0YWNrLW5hbWUnLCBvcHRpb25zLnRvb2xraXRTdGFja05hbWUpO1xuICAgIGlmIChvcHRpb25zLmJvb3RzdHJhcEJ1Y2tldE5hbWUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1ib290c3RyYXAtYnVja2V0LW5hbWUnLCBvcHRpb25zLmJvb3RzdHJhcEJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5ub0V4ZWN1dGUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1uby1leGVjdXRlJyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnB1YmxpY0FjY2Vzc0Jsb2NrQ29uZmlndXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmdzLnB1c2goJy0tcHVibGljLWFjY2Vzcy1ibG9jay1jb25maWd1cmF0aW9uJywgb3B0aW9ucy5wdWJsaWNBY2Nlc3NCbG9ja0NvbmZpZ3VyYXRpb24udG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRhZ3MpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS10YWdzJywgb3B0aW9ucy50YWdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jZGsoYXJncywge1xuICAgICAgLi4ub3B0aW9ucy5jbGlPcHRpb25zLFxuICAgICAgbW9kRW52OiB7XG4gICAgICAgIC4uLm9wdGlvbnMuY2xpT3B0aW9ucz8ubW9kRW52LFxuICAgICAgICAvLyBzbyB0aGF0IHRoaXMgd29ya3MgZm9yIFYyLFxuICAgICAgICAvLyB3aGVyZSB0aGUgXCJuZXdcIiBib290c3RyYXAgaXMgdGhlIGRlZmF1bHRcbiAgICAgICAgQ0RLX0xFR0FDWV9CT09UU1RSQVA6ICcxJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2RrQm9vdHN0cmFwTW9kZXJuKG9wdGlvbnM6IENka01vZGVybkJvb3RzdHJhcENvbW1hbmRPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBhcmdzID0gWydib290c3RyYXAnXTtcblxuICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgIGFyZ3MucHVzaCgnLXYnKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc2hvd1RlbXBsYXRlKSB7XG4gICAgICBhcmdzLnB1c2goJy0tc2hvdy10ZW1wbGF0ZScpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50ZW1wbGF0ZSkge1xuICAgICAgYXJncy5wdXNoKCctLXRlbXBsYXRlJywgb3B0aW9ucy50ZW1wbGF0ZSk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLS10b29sa2l0LXN0YWNrLW5hbWUnLCBvcHRpb25zLnRvb2xraXRTdGFja05hbWUpO1xuICAgIGlmIChvcHRpb25zLmJvb3RzdHJhcEJ1Y2tldE5hbWUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1ib290c3RyYXAtYnVja2V0LW5hbWUnLCBvcHRpb25zLmJvb3RzdHJhcEJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJy0tcXVhbGlmaWVyJywgb3B0aW9ucy5xdWFsaWZpZXIgPz8gdGhpcy5xdWFsaWZpZXIpO1xuICAgIGlmIChvcHRpb25zLmNmbkV4ZWN1dGlvblBvbGljeSkge1xuICAgICAgYXJncy5wdXNoKCctLWNsb3VkZm9ybWF0aW9uLWV4ZWN1dGlvbi1wb2xpY2llcycsIG9wdGlvbnMuY2ZuRXhlY3V0aW9uUG9saWN5KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGVybWluYXRpb25Qcm90ZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS10ZXJtaW5hdGlvbi1wcm90ZWN0aW9uJywgb3B0aW9ucy50ZXJtaW5hdGlvblByb3RlY3Rpb24udG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmZvcmNlKSB7XG4gICAgICBhcmdzLnB1c2goJy0tZm9yY2UnKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGFncykge1xuICAgICAgYXJncy5wdXNoKCctLXRhZ3MnLCBvcHRpb25zLnRhZ3MpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5jdXN0b21QZXJtaXNzaW9uc0JvdW5kYXJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1jdXN0b20tcGVybWlzc2lvbnMtYm91bmRhcnknLCBvcHRpb25zLmN1c3RvbVBlcm1pc3Npb25zQm91bmRhcnkpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5leGFtcGxlUGVybWlzc2lvbnNCb3VuZGFyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmdzLnB1c2goJy0tZXhhbXBsZS1wZXJtaXNzaW9ucy1ib3VuZGFyeScpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy51c2VQcmV2aW91c1BhcmFtZXRlcnMgPT09IGZhbHNlKSB7XG4gICAgICBhcmdzLnB1c2goJy0tbm8tcHJldmlvdXMtcGFyYW1ldGVycycpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5ib290c3RyYXBUZW1wbGF0ZSkge1xuICAgICAgYXJncy5wdXNoKCctLXRlbXBsYXRlJywgb3B0aW9ucy5ib290c3RyYXBUZW1wbGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudHJ1c3QgIT0gbnVsbCkge1xuICAgICAgYXJncy5wdXNoKCctLXRydXN0Jywgb3B0aW9ucy50cnVzdC5qb2luKCcsJykpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy51bnRydXN0ICE9IG51bGwpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS11bnRydXN0Jywgb3B0aW9ucy51bnRydXN0LmpvaW4oJywnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2RrKGFyZ3MsIHtcbiAgICAgIC4uLm9wdGlvbnMuY2xpT3B0aW9ucyxcbiAgICAgIG1vZEVudjoge1xuICAgICAgICAuLi5vcHRpb25zLmNsaU9wdGlvbnM/Lm1vZEVudixcbiAgICAgICAgLy8gc28gdGhhdCB0aGlzIHdvcmtzIGZvciBWMSxcbiAgICAgICAgLy8gd2hlcmUgdGhlIFwib2xkXCIgYm9vdHN0cmFwIGlzIHRoZSBkZWZhdWx0XG4gICAgICAgIENES19ORVdfQk9PVFNUUkFQOiAnMScsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNka0dhcmJhZ2VDb2xsZWN0KG9wdGlvbnM6IENka0dhcmJhZ2VDb2xsZWN0aW9uQ29tbWFuZE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICAnZ2MnLFxuICAgICAgJy0tdW5zdGFibGU9Z2MnLCAvLyBUT0RPOiByZW1vdmUgd2hlbiBzdGFiaWxpemluZ1xuICAgICAgJy0tY29uZmlybT1mYWxzZScsXG4gICAgICAnLS1jcmVhdGVkLWJ1ZmZlci1kYXlzPTAnLCAvLyBPdGhlcndpc2UgYWxsIGFzc2V0cyBjcmVhdGVkIGR1cmluZyBpbnRlZyB0ZXN0cyBhcmUgdG9vIHlvdW5nXG4gICAgXTtcbiAgICBpZiAob3B0aW9ucy5yb2xsYmFja0J1ZmZlckRheXMpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1yb2xsYmFjay1idWZmZXItZGF5cycsIFN0cmluZyhvcHRpb25zLnJvbGxiYWNrQnVmZmVyRGF5cykpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50eXBlKSB7XG4gICAgICBhcmdzLnB1c2goJy0tdHlwZScsIG9wdGlvbnMudHlwZSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmJvb3RzdHJhcFN0YWNrTmFtZSkge1xuICAgICAgYXJncy5wdXNoKCctLWJvb3RzdHJhcFN0YWNrTmFtZScsIG9wdGlvbnMuYm9vdHN0cmFwU3RhY2tOYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jZGsoYXJncyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2RrTWlncmF0ZShsYW5ndWFnZTogc3RyaW5nLCBzdGFja05hbWU6IHN0cmluZywgaW5wdXRQYXRoPzogc3RyaW5nLCBvcHRpb25zPzogQ2RrQ2xpT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmNkayhbXG4gICAgICAnbWlncmF0ZScsXG4gICAgICAnLS1sYW5ndWFnZScsXG4gICAgICBsYW5ndWFnZSxcbiAgICAgICctLXN0YWNrLW5hbWUnLFxuICAgICAgc3RhY2tOYW1lLFxuICAgICAgJy0tZnJvbS1wYXRoJyxcbiAgICAgIGlucHV0UGF0aCA/PyBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAncmVzb3VyY2VzJywgJ3RlbXBsYXRlcycsICdzcXMtdGVtcGxhdGUuanNvbicpLnRvU3RyaW5nKCksXG4gICAgICAuLi4ob3B0aW9ucz8ub3B0aW9ucyA/PyBbXSksXG4gICAgXSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2RrKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBDZGtDbGlPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlID8/IHRydWU7XG5cbiAgICBhd2FpdCB0aGlzLnBhY2thZ2VzLm1ha2VDbGlBdmFpbGFibGUoKTtcblxuICAgIHJldHVybiB0aGlzLnNoZWxsKFsnY2RrJywgLi4uKHZlcmJvc2UgPyBbJy12J10gOiBbXSksIC4uLmFyZ3NdLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbW9kRW52OiB7XG4gICAgICAgIC4uLnRoaXMuY2RrU2hlbGxFbnYoKSxcbiAgICAgICAgLi4ub3B0aW9ucy5tb2RFbnYsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpdGggd2hpY2ggdG8gZXhlY3V0ZSBDREtcbiAgICovXG4gIHB1YmxpYyBjZGtTaGVsbEVudigpIHtcbiAgICAvLyBpZiB0ZXN0cyBhcmUgdXNpbmcgYW4gZXhwbGljaXQgYXdzIGlkZW50aXR5IGFscmVhZHkgKGkuZSBjcmVkcylcbiAgICAvLyBmb3JjZSBldmVyeSBjZGsgY29tbWFuZCB0byB1c2UgdGhlIHNhbWUgaWRlbnRpdHkuXG4gICAgY29uc3QgYXdzQ3JlZHMgPSB0aGlzLmF3cy5pZGVudGl0eUVudigpID8/IHt9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIEFXU19SRUdJT046IHRoaXMuYXdzLnJlZ2lvbixcbiAgICAgIEFXU19ERUZBVUxUX1JFR0lPTjogdGhpcy5hd3MucmVnaW9uLFxuICAgICAgU1RBQ0tfTkFNRV9QUkVGSVg6IHRoaXMuc3RhY2tOYW1lUHJlZml4LFxuICAgICAgUEFDS0FHRV9MQVlPVVRfVkVSU0lPTjogdGhpcy5wYWNrYWdlcy5tYWpvclZlcnNpb24oKSxcbiAgICAgIC8vIEluIHRoZXNlIHRlc3RzIHdlIHdhbnQgdG8gbWFrZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gc3Rkb3V0IGFuZCBzdGVyclxuICAgICAgQ0k6ICdmYWxzZScsXG4gICAgICAuLi5hd3NDcmVkcyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHRlbXBsYXRlKHN0YWNrTmFtZTogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCBmdWxsU3RhY2tOYW1lID0gdGhpcy5mdWxsU3RhY2tOYW1lKHN0YWNrTmFtZSk7XG4gICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKHRoaXMuaW50ZWdUZXN0RGlyLCAnY2RrLm91dCcsIGAke2Z1bGxTdGFja05hbWV9LnRlbXBsYXRlLmpzb25gKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGJvb3RzdHJhcFJlcG9OYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgZW5zdXJlQm9vdHN0cmFwcGVkKHRoaXMpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF3cy5jbG91ZEZvcm1hdGlvbi5zZW5kKG5ldyBEZXNjcmliZVN0YWNrc0NvbW1hbmQoe30pKTtcblxuICAgIGNvbnN0IHN0YWNrID0gKHJlc3BvbnNlLlN0YWNrcyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKHMpID0+IHMuU3RhY2tOYW1lICYmIHMuU3RhY2tOYW1lID09IHRoaXMuYm9vdHN0cmFwU3RhY2tOYW1lKTtcbiAgICBhc3NlcnQoc3RhY2subGVuZ3RoID09IDEpO1xuICAgIHJldHVybiBvdXRwdXRGcm9tU3RhY2soJ0ltYWdlUmVwb3NpdG9yeU5hbWUnLCBzdGFja1swXSkgPz8gJyc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJvb3RzdHJhcFN0YWNrTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5mdWxsU3RhY2tOYW1lKCdib290c3RyYXAtc3RhY2snKTtcbiAgfVxuXG4gIHB1YmxpYyBmdWxsU3RhY2tOYW1lKHN0YWNrTmFtZTogc3RyaW5nKTogc3RyaW5nO1xuICBwdWJsaWMgZnVsbFN0YWNrTmFtZShzdGFja05hbWVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdO1xuICBwdWJsaWMgZnVsbFN0YWNrTmFtZShzdGFja05hbWVzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICBpZiAodHlwZW9mIHN0YWNrTmFtZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5zdGFja05hbWVQcmVmaXh9LSR7c3RhY2tOYW1lc31gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhY2tOYW1lcy5tYXAocyA9PiBgJHt0aGlzLnN0YWNrTmFtZVByZWZpeH0tJHtzfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmQgdGhpcyB0byB0aGUgbGlzdCBvZiBidWNrZXRzIHRvIHBvdGVudGlhbGx5IGRlbGV0ZVxuICAgKlxuICAgKiBBdCB0aGUgZW5kIG9mIGEgdGVzdCwgd2UgY2xlYW4gdXAgYnVja2V0cyB0aGF0IG1heSBub3QgaGF2ZSBnb3R0ZW4gZGVzdHJveWVkXG4gICAqIChmb3Igd2hhdGV2ZXIgcmVhc29uKS5cbiAgICovXG4gIHB1YmxpYyByZW1lbWJlclRvRGVsZXRlQnVja2V0KGJ1Y2tldE5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuYnVja2V0c1RvRGVsZXRlLnB1c2goYnVja2V0TmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW51cCBsZWZ0b3ZlciBzdGFja3MgYW5kIGJvb3RzdHJhcHBlZCByZXNvdXJjZXNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNwb3NlKHN1Y2Nlc3M6IGJvb2xlYW4pIHtcbiAgICAvLyB3aGVuIHVzaW5nIHRoZSBhdG1vc3BoZXJlIHNlcnZpY2UsIGl0IGRvZXMgcmVzb3VyY2UgY2xlYW51cCBvbiBvdXIgYmVoYWxmXG4gICAgLy8gc28gd2UgZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciBpdC5cbiAgICBpZiAoIWF0bW9zcGhlcmVFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IHN0YWNrc1RvRGVsZXRlID0gYXdhaXQgdGhpcy5kZWxldGVhYmxlU3RhY2tzKHRoaXMuc3RhY2tOYW1lUHJlZml4KTtcblxuICAgICAgdGhpcy5zb3J0Qm9vdHN0cmFwU3RhY2tzVG9UaGVFbmQoc3RhY2tzVG9EZWxldGUpO1xuXG4gICAgICAvLyBCb290c3RyYXAgc3RhY2tzIGhhdmUgYnVja2V0cyB0aGF0IG5lZWQgdG8gYmUgY2xlYW5lZFxuICAgICAgY29uc3QgYnVja2V0TmFtZXMgPSBzdGFja3NUb0RlbGV0ZS5tYXAoc3RhY2sgPT4gb3V0cHV0RnJvbVN0YWNrKCdCdWNrZXROYW1lJywgc3RhY2spKS5maWx0ZXIoZGVmaW5lZCk7XG4gICAgICAvLyBQYXJhbGxlbGlzbSB3aWxsIGJlIHJlYXNvbmFibGVcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAY2RrbGFicy9wcm9taXNlYWxsLW5vLXVuYm91bmRlZC1wYXJhbGxlbGlzbVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYnVja2V0TmFtZXMubWFwKGIgPT4gdGhpcy5hd3MuZW1wdHlCdWNrZXQoYikpKTtcbiAgICAgIC8vIFRoZSBib290c3RyYXAgYnVja2V0IGhhcyBhIHJlbW92YWwgcG9saWN5IG9mIFJFVEFJTiBieSBkZWZhdWx0LCBzbyBhZGQgaXQgdG8gdGhlIGJ1Y2tldHMgdG8gYmUgY2xlYW5lZCB1cC5cbiAgICAgIHRoaXMuYnVja2V0c1RvRGVsZXRlLnB1c2goLi4uYnVja2V0TmFtZXMpO1xuXG4gICAgICAvLyBCb290c3RyYXAgc3RhY2tzIGhhdmUgRUNSIHJlcG9zaXRvcmllcyB3aXRoIGltYWdlcyB3aGljaCBzaG91bGQgYmUgZGVsZXRlZFxuICAgICAgY29uc3QgaW1hZ2VSZXBvc2l0b3J5TmFtZXMgPSBzdGFja3NUb0RlbGV0ZS5tYXAoc3RhY2sgPT4gb3V0cHV0RnJvbVN0YWNrKCdJbWFnZVJlcG9zaXRvcnlOYW1lJywgc3RhY2spKS5maWx0ZXIoZGVmaW5lZCk7XG4gICAgICAvLyBQYXJhbGxlbGlzbSB3aWxsIGJlIHJlYXNvbmFibGVcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAY2RrbGFicy9wcm9taXNlYWxsLW5vLXVuYm91bmRlZC1wYXJhbGxlbGlzbVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoaW1hZ2VSZXBvc2l0b3J5TmFtZXMubWFwKHIgPT4gdGhpcy5hd3MuZGVsZXRlSW1hZ2VSZXBvc2l0b3J5KHIpKSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuYXdzLmRlbGV0ZVN0YWNrcyhcbiAgICAgICAgLi4uc3RhY2tzVG9EZWxldGUubWFwKChzKSA9PiB7XG4gICAgICAgICAgaWYgKCFzLlN0YWNrTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGFjayBuYW1lIGlzIHJlcXVpcmVkIHRvIGRlbGV0ZSBhIHN0YWNrLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcy5TdGFja05hbWU7XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgLy8gV2UgbWlnaHQgaGF2ZSBsZWFrZWQgc29tZSBidWNrZXRzIGJ5IHVwZ3JhZGluZyB0aGUgYm9vdHN0cmFwIHN0YWNrLiBCZVxuICAgICAgLy8gc3VyZSB0byBjbGVhbiBldmVyeXRoaW5nLlxuICAgICAgZm9yIChjb25zdCBidWNrZXQgb2YgdGhpcy5idWNrZXRzVG9EZWxldGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hd3MuZGVsZXRlQnVja2V0KGJ1Y2tldCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHRlc3RzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIGhhcHBpbHkgZGVsZXRlIHRoZSBmaXh0dXJlXG4gICAgLy8gKG90aGVyd2lzZSBsZWF2ZSBpdCBmb3IgaHVtYW5zIHRvIGluc3BlY3QpXG4gICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgIGNvbnN0IGNsZWFuZWQgPSByaW1yYWYodGhpcy5pbnRlZ1Rlc3REaXIpO1xuICAgICAgaWYgKCFjbGVhbmVkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjbGVhbiB1cCAke3RoaXMuaW50ZWdUZXN0RGlyfSBkdWUgdG8gcGVybWlzc2lvbnMgaXNzdWVzIChEb2NrZXIgcnVubmluZyBhcyByb290PylgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzdGFja3Mgc3RhcnRpbmcgd2l0aCBvdXIgdGVzdGluZyBwcmVmaXggdGhhdCBzaG91bGQgYmUgZGVsZXRlZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZWxldGVhYmxlU3RhY2tzKHByZWZpeDogc3RyaW5nKTogUHJvbWlzZTxTdGFja1tdPiB7XG4gICAgY29uc3Qgc3RhdHVzRmlsdGVyID0gW1xuICAgICAgJ0NSRUFURV9JTl9QUk9HUkVTUycsICdDUkVBVEVfRkFJTEVEJywgJ0NSRUFURV9DT01QTEVURScsXG4gICAgICAnUk9MTEJBQ0tfSU5fUFJPR1JFU1MnLCAnUk9MTEJBQ0tfRkFJTEVEJywgJ1JPTExCQUNLX0NPTVBMRVRFJyxcbiAgICAgICdERUxFVEVfRkFJTEVEJyxcbiAgICAgICdVUERBVEVfSU5fUFJPR1JFU1MnLCAnVVBEQVRFX0NPTVBMRVRFX0NMRUFOVVBfSU5fUFJPR1JFU1MnLFxuICAgICAgJ1VQREFURV9DT01QTEVURScsICdVUERBVEVfUk9MTEJBQ0tfSU5fUFJPR1JFU1MnLFxuICAgICAgJ1VQREFURV9ST0xMQkFDS19GQUlMRUQnLFxuICAgICAgJ1VQREFURV9ST0xMQkFDS19DT01QTEVURV9DTEVBTlVQX0lOX1BST0dSRVNTJyxcbiAgICAgICdVUERBVEVfUk9MTEJBQ0tfQ09NUExFVEUnLCAnUkVWSUVXX0lOX1BST0dSRVNTJyxcbiAgICAgICdJTVBPUlRfSU5fUFJPR1JFU1MnLCAnSU1QT1JUX0NPTVBMRVRFJyxcbiAgICAgICdJTVBPUlRfUk9MTEJBQ0tfSU5fUFJPR1JFU1MnLCAnSU1QT1JUX1JPTExCQUNLX0ZBSUxFRCcsXG4gICAgICAnSU1QT1JUX1JPTExCQUNLX0NPTVBMRVRFJyxcbiAgICBdO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF3cy5jbG91ZEZvcm1hdGlvbi5zZW5kKG5ldyBEZXNjcmliZVN0YWNrc0NvbW1hbmQoe30pKTtcblxuICAgIHJldHVybiAocmVzcG9uc2UuU3RhY2tzID8/IFtdKVxuICAgICAgLmZpbHRlcigocykgPT4gcy5TdGFja05hbWUgJiYgcy5TdGFja05hbWUuc3RhcnRzV2l0aChwcmVmaXgpKVxuICAgICAgLmZpbHRlcigocykgPT4gcy5TdGFja1N0YXR1cyAmJiBzdGF0dXNGaWx0ZXIuaW5jbHVkZXMocy5TdGFja1N0YXR1cykpXG4gICAgICAuZmlsdGVyKChzKSA9PiBzLlJvb3RJZCA9PT0gdW5kZWZpbmVkKTsgLy8gT25seSBkZWxldGUgcGFyZW50IHN0YWNrcy4gTmVzdGVkIHN0YWNrcyBhcmUgZGVsZXRlZCBpbiB0aGUgcHJvY2Vzc1xuICB9XG5cbiAgcHJpdmF0ZSBzb3J0Qm9vdHN0cmFwU3RhY2tzVG9UaGVFbmQoc3RhY2tzOiBTdGFja1tdKSB7XG4gICAgc3RhY2tzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGlmICghYS5TdGFja05hbWUgfHwgIWIuU3RhY2tOYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU3RhY2sgbmFtZXMgZG8gbm90IGV4aXN0cy4gVGhlc2UgYXJlIHJlcXVpcmVkIGZvciBzb3J0aW5nIHRoZSBib290c3RyYXAgc3RhY2tzLicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhQnMgPSBhLlN0YWNrTmFtZS5zdGFydHNXaXRoKHRoaXMuYm9vdHN0cmFwU3RhY2tOYW1lKTtcbiAgICAgIGNvbnN0IGJCcyA9IGIuU3RhY2tOYW1lLnN0YXJ0c1dpdGgodGhpcy5ib290c3RyYXBTdGFja05hbWUpO1xuXG4gICAgICByZXR1cm4gYUJzICE9IGJCc1xuICAgICAgICAvLyAnKycgY29udmVydHMgYSBib29sZWFuIHRvIDAgb3IgMVxuICAgICAgICA/ICgrYUJzKSAtICgrYkJzKVxuICAgICAgICA6IGEuU3RhY2tOYW1lLmxvY2FsZUNvbXBhcmUoYi5TdGFja05hbWUpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTWFrZSBzdXJlIHRoYXQgdGhlIGdpdmVuIGVudmlyb25tZW50IGlzIGJvb3RzdHJhcHBlZFxuICpcbiAqIFNpbmNlIHdlIGdvIHN0cmlwaW5nIGFjcm9zcyByZWdpb25zLCBpdCdzIGdvaW5nIHRvIHN1Y2sgZG9pbmcgdGhpc1xuICogYnkgaGFuZCBzbyBsZXQncyBqdXN0IG1hc3MtYXV0b21hdGUgaXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVCb290c3RyYXBwZWQoZml4dHVyZTogVGVzdEZpeHR1cmUpIHtcbiAgLy8gQWx3YXlzIHVzZSB0aGUgbW9kZXJuIGJvb3RzdHJhcCBzdGFjaywgb3RoZXJ3aXNlIHdlIG1heSBnZXQgdGhlIGVycm9yXG4gIC8vIFwicmVmdXNpbmcgdG8gZG93bmdyYWRlIGZyb20gdmVyc2lvbiA3IHRvIHZlcnNpb24gMFwiIHdoZW4gYm9vdHN0cmFwcGluZyB3aXRoIGRlZmF1bHRcbiAgLy8gc2V0dGluZ3MgdXNpbmcgYSB2MSBDTEkuXG4gIC8vXG4gIC8vIEl0IGRvZXNuJ3QgbWF0dGVyIGZvciB0ZXN0czogd2hlbiB0aGV5IHdhbnQgdG8gdGVzdCBzb21ldGhpbmcgYWJvdXQgYW4gYWN0dWFsIGxlZ2FjeVxuICAvLyBib290c3RyYXAgc3RhY2ssIHRoZXknbGwgY3JlYXRlIGEgYm9vdHN0cmFwIHN0YWNrIHdpdGggYSBub24tZGVmYXVsdCBuYW1lIHRvIHRlc3QgdGhhdCBleGFjdCBwcm9wZXJ0eS5cbiAgY29uc3QgZW52U3BlY2lmaWVyID0gYGF3czovLyR7YXdhaXQgZml4dHVyZS5hd3MuYWNjb3VudCgpfS8ke2ZpeHR1cmUuYXdzLnJlZ2lvbn1gO1xuICBpZiAoQUxSRUFEWV9CT09UU1RSQVBQRURfSU5fVEhJU19SVU4uaGFzKGVudlNwZWNpZmllcikpIHsgcmV0dXJuOyB9XG5cbiAgaWYgKGF0bW9zcGhlcmVFbmFibGVkKCkpIHtcbiAgICAvLyB3aGVuIGF0bW9zcGhlcmUgaXMgZW5hYmxlZCwgZWFjaCB0ZXN0IHN0YXJ0cyB3aXRoIGFuIGVtcHR5IGVudmlyb25tZW50XG4gICAgLy8gYW5kIG5lZWRzIHRvIGRlcGxveSB0aGUgYm9vdHN0cmFwIHN0YWNrLiBpbiBjYXNlIGVudmlyb25tZW50cyBhcmUgcmVjeWxjZWQgdG9vIHF1aWNrbHksXG4gICAgLy8gY2xvdWRmb3JtYXRpb24gbWF5IHRoaW5rIHRoZSBib290c3RyYXAgYnVja2V0IHN0aWxsIGV4aXN0cyBldmVuIHRob3VnaCBpdCBkb2VzbnQgKGJlY2F1c2Ugb2YgczMgZXZlbnR1YWwgY29uc2lzdGVuY3kpLlxuICAgIC8vIHNvIHdlIHJldHJ5IG9uIHRoZSBzcGVjaWZpYyBlcnJvciBmb3IgYSB3aGlsZS5cbiAgICBhd2FpdCBib290c3RyYXBXaXRoUmV0cnlPbkJ1Y2tldEV4aXN0cyhlbnZTcGVjaWZpZXIsIGZpeHR1cmUpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGRvQm9vdHN0cmFwKGVudlNwZWNpZmllciwgZml4dHVyZSwgZmFsc2UpO1xuICB9XG5cbiAgLy8gd2hlbiB1c2luZyB0aGUgYXRtb3NwaGVyZSBzZXJ2aWNlLCBldmVyeSB0ZXN0IG5lZWRzIHRvIGJvb3RzdHJhcFxuICAvLyBpdHMgb3duIGVudmlyb25tZW50LlxuICBpZiAoIWF0bW9zcGhlcmVFbmFibGVkKCkpIHtcbiAgICBBTFJFQURZX0JPT1RTVFJBUFBFRF9JTl9USElTX1JVTi5hZGQoZW52U3BlY2lmaWVyKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkb0Jvb3RzdHJhcChlbnZTcGVjaWZpZXI6IHN0cmluZywgZml4dHVyZTogVGVzdEZpeHR1cmUsIGFsbG93RXJyRXhpdDogYm9vbGVhbikge1xuICByZXR1cm4gZml4dHVyZS5jZGsoWydib290c3RyYXAnLCBlbnZTcGVjaWZpZXJdLCB7XG4gICAgbW9kRW52OiB7XG4gICAgICAvLyBFdmVuIGZvciB2MSwgdXNlIG5ldyBib290c3RyYXBcbiAgICAgIENES19ORVdfQk9PVFNUUkFQOiAnMScsXG4gICAgICAvLyB3aGVuIGFsbG93aW5nIGVycm9yIGV4aXQsIHdlIHByb2JhYmx5IHdhbnQgdG8gaW5zcGVjdFxuICAgICAgLy8gYW5kIGNvbXBhcmUgb3V0cHV0LCB3aGljaCBpcyBiZXR0ZXIgZG9uZSB3aXRob3V0IGNvbG9yIGNoYXJhY3RlcnMuXG4gICAgICAuLi4oYWxsb3dFcnJFeGl0ID8geyBGT1JDRV9DT0xPUjogJzAnIH0gOiB7fSksXG4gICAgfSxcbiAgICBhbGxvd0VyckV4aXQsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBib290c3RyYXBXaXRoUmV0cnlPbkJ1Y2tldEV4aXN0cyhlbnZTcGVjaWZpZXI6IHN0cmluZywgZml4dHVyZTogVGVzdEZpeHR1cmUpIHtcblxuICBjb25zdCBhY2NvdW50ID0gYXdhaXQgZml4dHVyZS5hd3MuYWNjb3VudCgpO1xuICBjb25zdCByZXRyeUFmdGVyU2Vjb25kcyA9IDMwO1xuICBjb25zdCBib290c3RyYXBCdWNrZXQgPSBgY2RrLWhuYjY1OWZkcy1hc3NldHMtJHthY2NvdW50fS0ke2ZpeHR1cmUuYXdzLnJlZ2lvbn1gO1xuXG4gIC8vIHMzIHNheXMgdGhhdCBhIGJ1Y2tldCBkZWxldGlvbiBjYW4gdGFrZSB1cCB0byBhbiBob3VyIHRvIGJlIGZ1bGx5IHZpc2libGUuXG4gIC8vIGVtcGlyaWNhbGx5IHdlIHNlZSB0aGF0IGEgZmV3IG1pbnV0ZXMgaXMgZW5vdWdoIHRob3VnaC4gbGV0cyBnaXZlIDEwIHRvIGJlIG9uIHRoZSBzYWZlKHIpIHNpZGUuXG4gIGNvbnN0IHRpbWVvdXRNaW51dGVzID0gMTA7XG5cbiAgY29uc3QgdGltZW91dERhdGUgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgdGltZW91dE1pbnV0ZXMgKiA2MCAqIDEwMDApXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3Qgb3V0ID0gYXdhaXQgZG9Cb290c3RyYXAoZW52U3BlY2lmaWVyLCBmaXh0dXJlLCB0cnVlKTtcbiAgICBpZiAob3V0LmluY2x1ZGVzKGBFbnZpcm9ubWVudCAke2VudlNwZWNpZmllcn0gYm9vdHN0cmFwcGVkYCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAob3V0LmluY2x1ZGVzKGAke2Jvb3RzdHJhcEJ1Y2tldH0gYWxyZWFkeSBleGlzdHNgKSkge1xuICAgICAgLy8gbWlnaHQgYmUgYW4gczMgZXZlbnR1YWx5IGNvbnNpc3RlbmN5IGlzc3VlIGR1ZSB0byByZWN5Y2xlZCBlbnZpcm9ubWVudHMuXG4gICAgICBpZiAoRGF0ZS5ub3coKSA8IHRpbWVvdXREYXRlLmdldFRpbWUoKSkge1xuICAgICAgICBmaXh0dXJlLmxvZyhgQm9vdHN0cmFwIG9mICR7ZW52U3BlY2lmaWVyfSBmYWlsZWQgZHVlIHRvIGJ1Y2tldCBleGlzdGVuY2UgY2hlY2suIFJldHJ5aW5nIGluICR7cmV0cnlBZnRlclNlY29uZHN9IHNlY29uZHMuLi5gKTtcbiAgICAgICAgYXdhaXQgc2xlZXAocmV0cnlBZnRlclNlY29uZHMgKiAxMDAwKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgYm9vdHN0cmFwcGluZyAke2VudlNwZWNpZmllcn1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZpbmVkPEE+KHg6IEEpOiB4IGlzIE5vbk51bGxhYmxlPEE+IHtcbiAgcmV0dXJuIHggIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIHRoZSBnaXZlbiBOUE0gcGFja2FnZXMsIGlkZW50aWZpZWQgYnkgdGhlaXIgbmFtZXMgYW5kIHZlcnNpb25zXG4gKlxuICogV29ya3MgYnkgd3JpdGluZyB0aGUgcGFja2FnZXMgdG8gYSBgcGFja2FnZS5qc29uYCBmaWxlLCBhbmRcbiAqIHRoZW4gcnVubmluZyBOUE03J3MgXCJpbnN0YWxsXCIgb24gaXQuIFRoZSB1c2Ugb2YgTlBNNyB3aWxsIGF1dG9tYXRpY2FsbHlcbiAqIGluc3RhbGwgcmVxdWlyZWQgcGVlckRlcGVuZGVuY2llcy5cbiAqXG4gKiBJZiB3ZSdyZSBydW5uaW5nIGluIFJFUE8gbW9kZSBhbmQgd2UgZmluZCB0aGUgcGFja2FnZSBpbiB0aGUgc2V0IG9mIGxvY2FsXG4gKiBwYWNrYWdlcyBpbiB0aGUgcmVwb3NpdG9yeSwgd2UnbGwgd3JpdGUgdGhlIGRpcmVjdG9yeSBuYW1lIHRvIGBwYWNrYWdlLmpzb25gXG4gKiBzbyB0aGF0IE5QTSB3aWxsIGNyZWF0ZSBhIHN5bWxpbmsgKHRoaXMgYWxsb3dzIHJ1bm5pbmcgdGVzdHMgYWdhaW5zdFxuICogYnVpbHQtYnV0LXVucGFja2FnZWQgbW9kdWxlcywgYW5kIHNhdmVzIGRldiBjeWNsZSB0aW1lKS5cbiAqXG4gKiBCZSBhd2FyZSB5b3UgTVVTVCBpbnN0YWxsIGFsbCB0aGUgcGFja2FnZXMgeW91IGRpcmVjdGx5IGRlcGVuZCB1cG9uISBJbiB0aGUgY2FzZVxuICogb2YgYSByZXBvL3N5bWxpbmtpbmcgaW5zdGFsbCwgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgV0lMTCBOT1QgYmUgaW5zdGFsbGVkIGluIHRoZVxuICogY3VycmVudCBkaXJlY3RvcnkncyBgbm9kZV9tb2R1bGVzYCBkaXJlY3RvcnksIGJlY2F1c2UgdGhleSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuXG4gKiBzeW1saW5rZWQgZnJvbSB0aGUgVEFSR0VUIGRpcmVjdG9yeSdzIGBub2RlX21vZHVsZXNgIGRpcmVjdG9yeSAod2hpY2ggaXMgc3VmZmljaWVudFxuICogZm9yIE5vZGUncyBkZXBlbmRlbmN5IGxvb2t1cCBtZWNoYW5pc20pLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbE5wbVBhY2thZ2VzKGZpeHR1cmU6IFRlc3RGaXh0dXJlLCBwYWNrYWdlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICBpZiAocHJvY2Vzcy5lbnYuUkVQT19ST09UKSB7XG4gICAgY29uc3QgbW9ub1JlcG8gPSBhd2FpdCBmaW5kWWFyblBhY2thZ2VzKHByb2Nlc3MuZW52LlJFUE9fUk9PVCk7XG5cbiAgICAvLyBSZXBsYWNlIHRoZSBpbnN0YWxsIHRhcmdldCB3aXRoIHRoZSBwaHlzaWNhbCBsb2NhdGlvbiBvZiB0aGlzIHBhY2thZ2VcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYWNrYWdlcykpIHtcbiAgICAgIGlmIChrZXkgaW4gbW9ub1JlcG8pIHtcbiAgICAgICAgcGFja2FnZXNba2V5XSA9IG1vbm9SZXBvW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oZml4dHVyZS5pbnRlZ1Rlc3REaXIsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkoe1xuICAgIG5hbWU6ICdjZGstaW50ZWctdGVzdHMnLFxuICAgIHByaXZhdGU6IHRydWUsXG4gICAgdmVyc2lvbjogJzAuMC4xJyxcbiAgICBkZXZEZXBlbmRlbmNpZXM6IHBhY2thZ2VzLFxuICB9LCB1bmRlZmluZWQsIDIpLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gIC8vIHdlIG9mdGVuIEVDT05OUkVTRVQgZnJvbSBOUE0gc28gbGV0cyByZXRyeS4gdGhpcyBtaWdodCBiZSBiZWNhdXNlIG9mIGhpZ2ggY29uY3VycmVuY3lcbiAgLy8gd2hpY2ggb3ZlcndoZWxtZXMgc3lzdGVtIHJlc291cmNlcy5cbiAgY29uc3QgdGltZW91dE1pbnV0ZXMgPSAxMDtcbiAgY29uc3QgdGltZW91dERhdGUgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgdGltZW91dE1pbnV0ZXMgKiA2MCAqIDEwMDApXG4gIGNvbnN0IHJldHJ5QWZ0ZXJTZWNvbmRzID0gMzA7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICB0cnkge1xuICAgICAgLy8gTm93IGluc3RhbGwgdGhhdCBgcGFja2FnZS5qc29uYCB1c2luZyBOUE03XG4gICAgICBhd2FpdCBmaXh0dXJlLnNoZWxsKFsnbm9kZScsIHJlcXVpcmUucmVzb2x2ZSgnbnBtJyksICdpbnN0YWxsJ10pO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA8IHRpbWVvdXREYXRlLmdldFRpbWUoKSAmJiBmaXh0dXJlLm91dHB1dC50b1N0cmluZygpLmluY2x1ZGVzKCdFQ09OTlJFU0VUJyApKSB7XG4gICAgICAgIGZpeHR1cmUubG9nKGBucG0gaW5zdGFsbCBmYWlsZWQgZHVlIHRvIEVDT05OUkVTRVQuIFJldHJ5aW5nIGluICR7cmV0cnlBZnRlclNlY29uZHN9IHNlY29uZHMuLi5gKTtcbiAgICAgICAgYXdhaXQgc2xlZXAocmV0cnlBZnRlclNlY29uZHMgKiAxMDAwKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbn1cblxuY29uc3QgQUxSRUFEWV9CT09UU1RSQVBQRURfSU5fVEhJU19SVU4gPSBuZXcgU2V0KCk7XG4iXX0=
615
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1jZGstYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2l0aC1jZGstYXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWdDQSxnREErQ0M7QUFLRCxnQ0FLQztBQUVELDhDQStDQztBQVdELGdEQUVDO0FBRUQsa0RBRUM7QUFFRCxnRUFFQztBQUVELHNEQUVDO0FBbUJELDRDQUVDO0FBZUQsd0NBSUM7QUEwZkQsZ0RBMkJDO0FBZ0VELGdEQXVDQztBQXYwQkQsK0JBQStCO0FBQy9CLGlDQUFpQztBQUNqQyx5QkFBeUI7QUFDekIseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUU3QiwwRUFBdUU7QUFDdkUsa0VBQTBFO0FBRTFFLCtCQUErQztBQUcvQyw2REFBMEQ7QUFDMUQsMkNBQTRDO0FBRTVDLG1DQUFxRDtBQUVyRCx5Q0FBd0Q7QUFDeEQsaURBQTZDO0FBQzdDLGlDQUEwQztBQUU3QixRQUFBLHNCQUFzQixHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBQSx1QkFBdUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRS9DOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FDaEMsT0FBZSxFQUNmLEtBQThDO0lBRTlDLE9BQU8sS0FBSyxFQUFFLE9BQTJELEVBQUUsRUFBRTtRQUMzRSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBQ25DLE1BQU0sZUFBZSxHQUFHLFdBQVcsS0FBSyxFQUFFLENBQUM7UUFDM0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRWxFLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixlQUFlLElBQUksQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixZQUFZLElBQUksQ0FBQyxDQUFD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TyxFQUFFLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFFLEVBQUUsQ0FBQztnQkFDNUYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxREFBcUQsaUJBQWlCLGFBQWEsQ0FBQyxDQUFDO2dCQUNqRyxNQUFNLElBQUEsV0FBSyxFQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUN0QyxTQUFTO1lBQ1gsQ0FBQztZQUNELE1BQU0sQ0FBQyxDQUFDO1FBQ1YsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHR5cGUgeyBTdGFjayB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBEZXNjcmliZVN0YWNrc0NvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgR2V0QXV0aG9yaXphdGlvblRva2VuQ29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1lY3ItcHVibGljJztcbmltcG9ydCB0eXBlIHsgQXdzQ2xpZW50cyB9IGZyb20gJy4vYXdzJztcbmltcG9ydCB7IG91dHB1dEZyb21TdGFjaywgc2xlZXAgfSBmcm9tICcuL2F3cyc7XG5pbXBvcnQgdHlwZSB7IFRlc3RDb250ZXh0IH0gZnJvbSAnLi9pbnRlZy10ZXN0JztcbmltcG9ydCB0eXBlIHsgSVRlc3RDbGlTb3VyY2UsIElUZXN0TGlicmFyeVNvdXJjZSB9IGZyb20gJy4vcGFja2FnZS1zb3VyY2VzL3NvdXJjZSc7XG5pbXBvcnQgeyB0ZXN0U291cmNlIH0gZnJvbSAnLi9wYWNrYWdlLXNvdXJjZXMvc3VicHJvY2Vzcyc7XG5pbXBvcnQgeyBSRVNPVVJDRVNfRElSIH0gZnJvbSAnLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHR5cGUgeyBTaGVsbE9wdGlvbnMgfSBmcm9tICcuL3NoZWxsJztcbmltcG9ydCB7IHNoZWxsLCBTaGVsbEhlbHBlciwgcmltcmFmIH0gZnJvbSAnLi9zaGVsbCc7XG5pbXBvcnQgdHlwZSB7IEF3c0NvbnRleHQgfSBmcm9tICcuL3dpdGgtYXdzJztcbmltcG9ydCB7IGF0bW9zcGhlcmVFbmFibGVkLCB3aXRoQXdzIH0gZnJvbSAnLi93aXRoLWF3cyc7XG5pbXBvcnQgeyB3aXRoVGltZW91dCB9IGZyb20gJy4vd2l0aC10aW1lb3V0JztcbmltcG9ydCB7IGZpbmRZYXJuUGFja2FnZXMgfSBmcm9tICcuL3lhcm4nO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9URVNUX1RJTUVPVVRfUyA9IDIwICogNjA7XG5leHBvcnQgY29uc3QgRVhURU5ERURfVEVTVF9USU1FT1VUX1MgPSAzMCAqIDYwO1xuXG4vKipcbiAqIEhpZ2hlciBvcmRlciBmdW5jdGlvbiB0byBleGVjdXRlIGEgYmxvY2sgd2l0aCBhIENESyBhcHAgZml4dHVyZVxuICpcbiAqIFJlcXVpcmVzIGFuIEFXUyBjbGllbnQgdG8gYmUgcGFzc2VkIGluLlxuICpcbiAqIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHRlc3RzIChzbyB3ZSBkb24ndCBoYXZlIHRvIGNoYW5nZVxuICogdG9vIG11Y2gpIHRoZSBpbm5lciBibG9jayBpcyBleHBlY3RlZCB0byB0YWtlIGEgYFRlc3RGaXh0dXJlYCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU3BlY2lmaWNDZGtBcHAoXG4gIGFwcE5hbWU6IHN0cmluZyxcbiAgYmxvY2s6IChjb250ZXh0OiBUZXN0Rml4dHVyZSkgPT4gUHJvbWlzZTx2b2lkPixcbik6IChjb250ZXh0OiBUZXN0Q29udGV4dCAmIEF3c0NvbnRleHQgJiBEaXNhYmxlQm9vdHN0cmFwQ29udGV4dCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBhc3luYyAoY29udGV4dDogVGVzdENvbnRleHQgJiBBd3NDb250ZXh0ICYgRGlzYWJsZUJvb3RzdHJhcENvbnRleHQpID0+IHtcbiAgICBjb25zdCByYW5keSA9IGNvbnRleHQucmFuZG9tU3RyaW5nO1xuICAgIGNvbnN0IHN0YWNrTmFtZVByZWZpeCA9IGBjZGt0ZXN0LSR7cmFuZHl9YDtcbiAgICBjb25zdCBpbnRlZ1Rlc3REaXIgPSBwYXRoLmpvaW4ob3MudG1wZGlyKCksIGBjZGstaW50ZWctJHtyYW5keX1gKTtcblxuICAgIGNvbnRleHQub3V0cHV0LndyaXRlKGAgU3RhY2sgcHJlZml4OiAgICR7c3RhY2tOYW1lUHJlZml4fVxcbmApO1xuICAgIGNvbnRleHQub3V0cHV0LndyaXRlKGAgVGVzdCBkaXJlY3Rvcnk6ICR7aW50ZWdUZXN0RGlyfVxcbmApO1xuICAgIGNvbnRleHQub3V0cHV0LndyaXRlKGAgUmVnaW9uOiAgICAgICAgICR7Y29udGV4dC5hd3MucmVnaW9ufVxcbmApO1xuXG4gICAgYXdhaXQgY2xvbmVEaXJlY3RvcnkocGF0aC5qb2luKFJFU09VUkNFU19ESVIsICdjZGstYXBwcycsIGFwcE5hbWUpLCBpbnRlZ1Rlc3REaXIsIGNvbnRleHQub3V0cHV0KTtcbiAgICBjb25zdCBmaXh0dXJlID0gbmV3IFRlc3RGaXh0dXJlKFxuICAgICAgaW50ZWdUZXN0RGlyLFxuICAgICAgc3RhY2tOYW1lUHJlZml4LFxuICAgICAgY29udGV4dC5vdXRwdXQsXG4gICAgICBjb250ZXh0LmF3cyxcbiAgICAgIGNvbnRleHQucmFuZG9tU3RyaW5nKTtcbiAgICBhd2FpdCBmaXh0dXJlLmVjclB1YmxpY0xvZ2luKCk7XG5cbiAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGluc3RhbGxhdGlvblZlcnNpb24gPSBmaXh0dXJlLmxpYnJhcnkucmVxdWVzdGVkVmVyc2lvbigpO1xuXG4gICAgICBhd2FpdCBpbnN0YWxsTnBtUGFja2FnZXMoZml4dHVyZSwge1xuICAgICAgICAnYXdzLWNkay1saWInOiBpbnN0YWxsYXRpb25WZXJzaW9uLFxuICAgICAgICAnY29uc3RydWN0cyc6ICdeMTAnLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghY29udGV4dC5kaXNhYmxlQm9vdHN0cmFwKSB7XG4gICAgICAgIGF3YWl0IGVuc3VyZUJvb3RzdHJhcHBlZChmaXh0dXJlKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYmxvY2soZml4dHVyZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgdGhyb3cgZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52LklOVEVHX05PX0NMRUFOKSB7XG4gICAgICAgIGNvbnRleHQubG9nKGBMZWZ0IHRlc3QgZGlyZWN0b3J5IGluICcke2ludGVnVGVzdERpcn0nICgkSU5URUdfTk9fQ0xFQU4pXFxuYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBmaXh0dXJlLmRpc3Bvc2Uoc3VjY2Vzcyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIExpa2UgYHdpdGhTcGVjaWZpY0Nka0FwcGAsIGJ1dCB1c2VzIHRoZSBkZWZhdWx0IGludGVncmF0aW9uIHRlc3RpbmcgYXBwIHdpdGggYSBtaWxsaW9uIHN0YWNrcyBpbiBpdFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aENka0FwcChcbiAgYmxvY2s6IChjb250ZXh0OiBUZXN0Rml4dHVyZSkgPT4gUHJvbWlzZTx2b2lkPixcbik6IChjb250ZXh0OiBUZXN0Q29udGV4dCAmIEF3c0NvbnRleHQgJiBEaXNhYmxlQm9vdHN0cmFwQ29udGV4dCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gIC8vICdhcHAnIGlzIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGludGVncmF0aW9uIGFwcCBpbiB0aGUgYGNkay1hcHBzYCBkaXJlY3RvcnlcbiAgcmV0dXJuIHdpdGhTcGVjaWZpY0Nka0FwcCgnYXBwJywgYmxvY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aENka01pZ3JhdGVBcHAoXG4gIGxhbmd1YWdlOiBzdHJpbmcsXG4gIGJsb2NrOiAoY29udGV4dDogVGVzdEZpeHR1cmUpID0+IFByb21pc2U8dm9pZD4sXG4pOiAoY29udGV4dDogVGVzdENvbnRleHQgJiBBd3NDb250ZXh0ICYgRGlzYWJsZUJvb3RzdHJhcENvbnRleHQpID0+IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gYXN5bmMgKGNvbnRleHQ6IFRlc3RDb250ZXh0ICYgQXdzQ29udGV4dCAmIERpc2FibGVCb290c3RyYXBDb250ZXh0KSA9PiB7XG4gICAgY29uc3Qgc3RhY2tOYW1lID0gYGNkay1taWdyYXRlLSR7bGFuZ3VhZ2V9LWludGVnLSR7Y29udGV4dC5yYW5kb21TdHJpbmd9YDtcbiAgICBjb25zdCBpbnRlZ1Rlc3REaXIgPSBwYXRoLmpvaW4ob3MudG1wZGlyKCksIGBjZGstbWlncmF0ZS0ke2xhbmd1YWdlfS1pbnRlZy0ke2NvbnRleHQucmFuZG9tU3RyaW5nfWApO1xuXG4gICAgY29udGV4dC5vdXRwdXQud3JpdGUoYCBTdGFjayBuYW1lOiAgICR7c3RhY2tOYW1lfVxcbmApO1xuICAgIGNvbnRleHQub3V0cHV0LndyaXRlKGAgVGVzdCBkaXJlY3Rvcnk6ICR7aW50ZWdUZXN0RGlyfVxcbmApO1xuXG4gICAgZnMubWtkaXJTeW5jKGludGVnVGVzdERpcik7XG4gICAgY29uc3QgZml4dHVyZSA9IG5ldyBUZXN0Rml4dHVyZShcbiAgICAgIGludGVnVGVzdERpcixcbiAgICAgIHN0YWNrTmFtZSxcbiAgICAgIGNvbnRleHQub3V0cHV0LFxuICAgICAgY29udGV4dC5hd3MsXG4gICAgICBjb250ZXh0LnJhbmRvbVN0cmluZyxcbiAgICApO1xuICAgIGF3YWl0IGZpeHR1cmUuZWNyUHVibGljTG9naW4oKTtcblxuICAgIGF3YWl0IGVuc3VyZUJvb3RzdHJhcHBlZChmaXh0dXJlKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrTWlncmF0ZShsYW5ndWFnZSwgc3RhY2tOYW1lKTtcblxuICAgIGNvbnN0IHRlc3RGaXh0dXJlID0gbmV3IFRlc3RGaXh0dXJlKFxuICAgICAgcGF0aC5qb2luKGludGVnVGVzdERpciwgc3RhY2tOYW1lKSxcbiAgICAgIHN0YWNrTmFtZSxcbiAgICAgIGNvbnRleHQub3V0cHV0LFxuICAgICAgY29udGV4dC5hd3MsXG4gICAgICBjb250ZXh0LnJhbmRvbVN0cmluZyxcbiAgICApO1xuXG4gICAgbGV0IHN1Y2Nlc3MgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBibG9jayh0ZXN0Rml4dHVyZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgdGhyb3cgZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52LklOVEVHX05PX0NMRUFOKSB7XG4gICAgICAgIGNvbnRleHQubG9nKGBMZWZ0IHRlc3QgZGlyZWN0b3J5IGluICcke2ludGVnVGVzdERpcn0nICgkSU5URUdfTk9fQ0xFQU4pYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBmaXh0dXJlLmRpc3Bvc2Uoc3VjY2Vzcyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIERlZmF1bHQgdGVzdCBmaXh0dXJlIGZvciBtb3N0IChhbGw/KSBpbnRlZyB0ZXN0c1xuICpcbiAqIEl0J3MgYSBjb21wb3NpdGlvbiBvZiB3aXRoQXdzL3dpdGhDZGtBcHAsIGV4cGVjdGluZyB0aGUgdGVzdCBibG9jayB0byB0YWtlIGEgYFRlc3RGaXh0dXJlYFxuICogb2JqZWN0LlxuICpcbiAqIFdlIGNvdWxkIGhhdmUgcHV0IGB3aXRoQXdzKHdpdGhDZGtBcHAoZml4dHVyZSA9PiB7IC8uLi4gYWN0dWFsIHRlc3QgaGVyZS4uLi8gfSkpYCBpbiBldmVyeVxuICogdGVzdCBkZWNsYXJhdGlvbiBidXQgY2VudHJhbGl6aW5nIGl0IGlzIGdvaW5nIHRvIG1ha2UgaXQgY29udmVuaWVudCB0byBtb2RpZnkgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEZWZhdWx0Rml4dHVyZShibG9jazogKGNvbnRleHQ6IFRlc3RGaXh0dXJlKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gIHJldHVybiB3aXRoQXdzKHdpdGhUaW1lb3V0KERFRkFVTFRfVEVTVF9USU1FT1VUX1MsIHdpdGhDZGtBcHAoYmxvY2spKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU3BlY2lmaWNGaXh0dXJlKGFwcE5hbWU6IHN0cmluZywgYmxvY2s6IChjb250ZXh0OiBUZXN0Rml4dHVyZSkgPT4gUHJvbWlzZTx2b2lkPikge1xuICByZXR1cm4gd2l0aEF3cyh3aXRoVGltZW91dChERUZBVUxUX1RFU1RfVElNRU9VVF9TLCB3aXRoU3BlY2lmaWNDZGtBcHAoYXBwTmFtZSwgYmxvY2spKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoRXh0ZW5kZWRUaW1lb3V0Rml4dHVyZShibG9jazogKGNvbnRleHQ6IFRlc3RGaXh0dXJlKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gIHJldHVybiB3aXRoQXdzKHdpdGhUaW1lb3V0KEVYVEVOREVEX1RFU1RfVElNRU9VVF9TLCB3aXRoQ2RrQXBwKGJsb2NrKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aENES01pZ3JhdGVGaXh0dXJlKGxhbmd1YWdlOiBzdHJpbmcsIGJsb2NrOiAoY29udGVudDogVGVzdEZpeHR1cmUpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgcmV0dXJuIHdpdGhBd3Mod2l0aFRpbWVvdXQoREVGQVVMVF9URVNUX1RJTUVPVVRfUywgd2l0aENka01pZ3JhdGVBcHAobGFuZ3VhZ2UsIGJsb2NrKSkpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpc2FibGVCb290c3RyYXBDb250ZXh0IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSBjcmVhdGluZyB0aGUgZGVmYXVsdCBib290c3RyYXBcbiAgICogc3RhY2sgcHJpb3IgdG8gcnVubmluZyB0aGUgdGVzdFxuICAgKlxuICAgKiBUaGlzIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSB3aGVuIHJ1bm5pbmcgdGVzdHMgdGhhdFxuICAgKiBleHBsaWNpdGx5IGNyZWF0ZSBhIGJvb3RzdHJhcCBzdGFja1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZUJvb3RzdHJhcD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVG8gYmUgdXNlZCBpbiBwbGFjZSBvZiBgd2l0aERlZmF1bHRGaXh0dXJlYCB3aGVuIHRoZSB0ZXN0XG4gKiBzaG91bGQgbm90IGNyZWF0ZSB0aGUgZGVmYXVsdCBib290c3RyYXAgc3RhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhvdXRCb290c3RyYXAoYmxvY2s6IChjb250ZXh0OiBUZXN0Rml4dHVyZSkgPT4gUHJvbWlzZTx2b2lkPikge1xuICByZXR1cm4gd2l0aEF3cyh3aXRoQ2RrQXBwKGJsb2NrKSwgdHJ1ZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrQ2xpT3B0aW9ucyBleHRlbmRzIFNoZWxsT3B0aW9ucyB7XG4gIG9wdGlvbnM/OiBzdHJpbmdbXTtcbiAgbmV2ZXJSZXF1aXJlQXBwcm92YWw/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDZGtEZXN0cm95Q2xpT3B0aW9ucyBleHRlbmRzIENka0NsaU9wdGlvbnMge1xuICByZWFkb25seSBmb3JjZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJlcGFyZSBhIHRhcmdldCBkaXIgYnlyZXBsaWNhdGluZyBhIHNvdXJjZSBkaXJlY3RvcnlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb25lRGlyZWN0b3J5KHNvdXJjZTogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZywgb3V0cHV0PzogTm9kZUpTLldyaXRhYmxlU3RyZWFtKSB7XG4gIGF3YWl0IHNoZWxsKFsncm0nLCAnLXJmJywgdGFyZ2V0XSwgeyBvdXRwdXRzOiBvdXRwdXQgPyBbb3V0cHV0XSA6IFtdIH0pO1xuICBhd2FpdCBzaGVsbChbJ21rZGlyJywgJy1wJywgdGFyZ2V0XSwgeyBvdXRwdXRzOiBvdXRwdXQgPyBbb3V0cHV0XSA6IFtdIH0pO1xuICBhd2FpdCBzaGVsbChbJ2NwJywgJy1SJywgc291cmNlICsgJy8qJywgdGFyZ2V0XSwgeyBvdXRwdXRzOiBvdXRwdXQgPyBbb3V0cHV0XSA6IFtdIH0pO1xufVxuXG5pbnRlcmZhY2UgQ29tbW9uQ2RrQm9vdHN0cmFwQ29tbWFuZE9wdGlvbnMge1xuICAvKipcbiAgICogUGF0aCB0byBhIGN1c3RvbSBib290c3RyYXAgdGVtcGxhdGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGRlZmF1bHQgQ0RLIGJvb3RzdHJhcCB0ZW1wbGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGJvb3RzdHJhcFRlbXBsYXRlPzogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IHRvb2xraXRTdGFja05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHZlcmJvc2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCAtIGF1dG8tZ2VuZXJhdGVkIENsb3VkRm9ybWF0aW9uIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGJvb3RzdHJhcEJ1Y2tldE5hbWU/OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgY2xpT3B0aW9ucz86IENka0NsaU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlZmF1bHQgLSB0aGUgZGVmYXVsdCBDREsgcXVhbGlmaWVyXG4gICAqL1xuICByZWFkb25seSBxdWFsaWZpZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrTGVnYWN5Qm9vdHN0cmFwQ29tbWFuZE9wdGlvbnMgZXh0ZW5kcyBDb21tb25DZGtCb290c3RyYXBDb21tYW5kT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgbm9FeGVjdXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljQWNjZXNzQmxvY2tDb25maWd1cmF0aW9uPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDZGtNb2Rlcm5Cb290c3RyYXBDb21tYW5kT3B0aW9ucyBleHRlbmRzIENvbW1vbkNka0Jvb3RzdHJhcENvbW1hbmRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmb3JjZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgY2ZuRXhlY3V0aW9uUG9saWN5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd1RlbXBsYXRlPzogYm9vbGVhbjtcblxuICByZWFkb25seSB0ZW1wbGF0ZT86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHRlcm1pbmF0aW9uUHJvdGVjdGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhhbXBsZVBlcm1pc3Npb25zQm91bmRhcnk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVBlcm1pc3Npb25zQm91bmRhcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgdXNlUHJldmlvdXNQYXJhbWV0ZXJzPzogYm9vbGVhbjtcblxuICByZWFkb25seSB0cnVzdD86IHN0cmluZ1tdO1xuXG4gIHJlYWRvbmx5IHVudHJ1c3Q/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDZGtHYXJiYWdlQ29sbGVjdGlvbkNvbW1hbmRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgb2YgZGF5cyBhbiBhc3NldCBzaG91bGQgc3RheSBpc29sYXRlZCBiZWZvcmUgZGVsZXRpb24sIHRvXG4gICAqIGd1YXJkIGFnYWluc3Qgc29tZSBwaXBlbGluZSByb2xsYmFjayBzY2VuYXJpb3NcbiAgICpcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgcmVhZG9ubHkgcm9sbGJhY2tCdWZmZXJEYXlzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBhc3NldCB0aGF0IGlzIGdldHRpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdhbGwnXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogJ2VjcicgfCAnczMnIHwgJ2FsbCc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBib290c3RyYXAgc3RhY2tcbiAgICpcbiAgICogQGRlZmF1bHQgJ0Nka1Rvb2xraXQnXG4gICAqL1xuICByZWFkb25seSBib290c3RyYXBTdGFja05hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBUZXN0Rml4dHVyZSBleHRlbmRzIFNoZWxsSGVscGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IHF1YWxpZmllcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1Y2tldHNUb0RlbGV0ZSA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIHB1YmxpYyByZWFkb25seSBjbGk6IElUZXN0Q2xpU291cmNlO1xuICBwdWJsaWMgcmVhZG9ubHkgbGlicmFyeTogSVRlc3RMaWJyYXJ5U291cmNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBpbnRlZ1Rlc3REaXI6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhY2tOYW1lUHJlZml4OiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IG91dHB1dDogTm9kZUpTLldyaXRhYmxlU3RyZWFtLFxuICAgIHB1YmxpYyByZWFkb25seSBhd3M6IEF3c0NsaWVudHMsXG4gICAgcHVibGljIHJlYWRvbmx5IHJhbmRvbVN0cmluZzogc3RyaW5nKSB7XG4gICAgc3VwZXIoaW50ZWdUZXN0RGlyLCBvdXRwdXQpO1xuXG4gICAgdGhpcy5xdWFsaWZpZXIgPSB0aGlzLnJhbmRvbVN0cmluZy5zbGljZSgwLCAxMCk7XG4gICAgdGhpcy5jbGkgPSB0ZXN0U291cmNlKCdjbGknKTtcbiAgICB0aGlzLmxpYnJhcnkgPSB0ZXN0U291cmNlKCdsaWJyYXJ5Jyk7XG4gIH1cblxuICBwdWJsaWMgbG9nKHM6IHN0cmluZykge1xuICAgIHRoaXMub3V0cHV0LndyaXRlKGAke3N9XFxuYCk7XG4gIH1cblxuICAvKipcbiAgICogTG9naW4gdG8gdGhlIHB1YmxpYyBFQ1IgZ2FsbGVyeSB1c2luZyB0aGUgY3VycmVudCBBV1MgY3JlZGVudGlhbHMuXG4gICAqIFVzZSB0aGlzIGlmIHlvdXIgdGVzdCBuZWVkcyB0byBkaXJlY3RseSBwdWxsIGltYWdlcyBvdXRzaWRlIG9mIGEgYGNka2Agb3IgYGNkay1hc3NldHNgIGNvbW1hbmQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZWNyUHVibGljTG9naW4oKSB7XG4gICAgY29uc3QgdG9rZW5SZXNwb25zZSA9IGF3YWl0IHRoaXMuYXdzLmVjclB1YmxpYy5zZW5kKG5ldyBHZXRBdXRob3JpemF0aW9uVG9rZW5Db21tYW5kKHt9KSk7XG4gICAgY29uc3QgYXV0aERhdGEgPSB0b2tlblJlc3BvbnNlLmF1dGhvcml6YXRpb25EYXRhPy5hdXRob3JpemF0aW9uVG9rZW47XG5cbiAgICBjb25zdCBkb2NrZXIgPSBwcm9jZXNzLmVudi5DREtfRE9DS0VSID8/ICdkb2NrZXInO1xuXG4gICAgaWYgKCFhdXRoRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgcmV0cmlldmUgRUNSIHB1YmxpYyBhdXRoIHRva2VuLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShhdXRoRGF0YSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgIGNvbnN0IFt1c2VybmFtZSwgcGFzc3dvcmRdID0gZGVjb2RlZC5zcGxpdCgnOicpO1xuXG4gICAgYXdhaXQgdGhpcy5zaGVsbChbZG9ja2VyLCAnbG9naW4nLFxuICAgICAgJy0tdXNlcm5hbWUnLCB1c2VybmFtZSxcbiAgICAgICctLXBhc3N3b3JkJywgJyR7RUNSX1BBU1NXT1JEfScsXG4gICAgICAncHVibGljLmVjci5hd3MnXSwge1xuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBtb2RFbnY6IHtcbiAgICAgICAgRUNSX1BBU1NXT1JEOiBwYXNzd29yZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2RrRGVwbG95KHN0YWNrTmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRpb25zOiBDZGtDbGlPcHRpb25zID0ge30sIHNraXBTdGFja1JlbmFtZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5jZGsodGhpcy5jZGtEZXBsb3lDb21tYW5kTGluZShzdGFja05hbWVzLCBvcHRpb25zLCBza2lwU3RhY2tSZW5hbWUpLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBjZGtEZXBsb3lDb21tYW5kTGluZShzdGFja05hbWVzOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3B0aW9uczogQ2RrQ2xpT3B0aW9ucyA9IHt9LCBza2lwU3RhY2tSZW5hbWU/OiBib29sZWFuKSB7XG4gICAgc3RhY2tOYW1lcyA9IHR5cGVvZiBzdGFja05hbWVzID09PSAnc3RyaW5nJyA/IFtzdGFja05hbWVzXSA6IHN0YWNrTmFtZXM7XG4gICAgY29uc3QgbmV2ZXJSZXF1aXJlQXBwcm92YWwgPSBvcHRpb25zLm5ldmVyUmVxdWlyZUFwcHJvdmFsID8/IHRydWU7XG5cbiAgICByZXR1cm4gW1xuICAgICAgJ2RlcGxveScsXG4gICAgICAuLi4obmV2ZXJSZXF1aXJlQXBwcm92YWwgPyBbJy0tcmVxdWlyZS1hcHByb3ZhbD1uZXZlciddIDogW10pLCAvLyBEZWZhdWx0IHRvIG5vIGFwcHJvdmFsIGluIGFuIHVuYXR0ZW5kZWQgdGVzdFxuICAgICAgLi4uKG9wdGlvbnMub3B0aW9ucyA/PyBbXSksXG4gICAgICAvLyB1c2UgZXZlbnRzIGJlY2F1c2UgYmFyIHJlbmRlcnMgYmFkIGluIHRlc3RzXG4gICAgICAnLS1wcm9ncmVzcycsICdldmVudHMnLFxuICAgICAgLi4uKHNraXBTdGFja1JlbmFtZSA/IHN0YWNrTmFtZXMgOiB0aGlzLmZ1bGxTdGFja05hbWUoc3RhY2tOYW1lcykpLFxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2RrU3ludGgob3B0aW9uczogQ2RrQ2xpT3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuY2RrKFtcbiAgICAgICdzeW50aCcsXG4gICAgICAuLi4ob3B0aW9ucy5vcHRpb25zID8/IFtdKSxcbiAgICBdLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjZGtSZWZhY3RvcihvcHRpb25zOiBDZGtDbGlPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5jZGsoW1xuICAgICAgJ3JlZmFjdG9yJyxcbiAgICAgIC4uLihvcHRpb25zLm9wdGlvbnMgPz8gW10pLFxuICAgIF0sIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNka0Rlc3Ryb3koc3RhY2tOYW1lczogc3RyaW5nIHwgc3RyaW5nW10sIG9wdGlvbnM6IENka0Rlc3Ryb3lDbGlPcHRpb25zID0ge30pIHtcbiAgICBzdGFja05hbWVzID0gdHlwZW9mIHN0YWNrTmFtZXMgPT09ICdzdHJpbmcnID8gW3N0YWNrTmFtZXNdIDogc3RhY2tOYW1lcztcblxuICAgIC8vIGRlZmF1bHQgdG8gdHJ1ZSBiZWNhdXNlIG1vc3QgdGVzdHMgZG9uJ3QgdGVzdCB1c2VyIGludGVyYWN0aW9uXG4gICAgY29uc3QgZm9yY2UgPSBvcHRpb25zLmZvcmNlID8/IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcy5jZGsoWydkZXN0cm95JyxcbiAgICAgIC4uLihmb3JjZSA/IFsnLWYnXSA6IFtdKSwgLy8gcGFzcyAtZiBpZiB1c2VyIGludGVyYWN0aW9uIGlzIG5vdCBkZXNpcmVkXG4gICAgICAuLi4ob3B0aW9ucy5vcHRpb25zID8/IFtdKSxcbiAgICAgIC4uLnRoaXMuZnVsbFN0YWNrTmFtZShzdGFja05hbWVzKV0sIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNka0Jvb3RzdHJhcExlZ2FjeShvcHRpb25zOiBDZGtMZWdhY3lCb290c3RyYXBDb21tYW5kT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgYXJncyA9IFsnYm9vdHN0cmFwJ107XG5cbiAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICBhcmdzLnB1c2goJy12Jyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLS10b29sa2l0LXN0YWNrLW5hbWUnLCBvcHRpb25zLnRvb2xraXRTdGFja05hbWUpO1xuICAgIGlmIChvcHRpb25zLmJvb3RzdHJhcEJ1Y2tldE5hbWUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1ib290c3RyYXAtYnVja2V0LW5hbWUnLCBvcHRpb25zLmJvb3RzdHJhcEJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5ub0V4ZWN1dGUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1uby1leGVjdXRlJyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnB1YmxpY0FjY2Vzc0Jsb2NrQ29uZmlndXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmdzLnB1c2goJy0tcHVibGljLWFjY2Vzcy1ibG9jay1jb25maWd1cmF0aW9uJywgb3B0aW9ucy5wdWJsaWNBY2Nlc3NCbG9ja0NvbmZpZ3VyYXRpb24udG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRhZ3MpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS10YWdzJywgb3B0aW9ucy50YWdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jZGsoYXJncywge1xuICAgICAgLi4ub3B0aW9ucy5jbGlPcHRpb25zLFxuICAgICAgbW9kRW52OiB7XG4gICAgICAgIC4uLm9wdGlvbnMuY2xpT3B0aW9ucz8ubW9kRW52LFxuICAgICAgICAvLyBzbyB0aGF0IHRoaXMgd29ya3MgZm9yIFYyLFxuICAgICAgICAvLyB3aGVyZSB0aGUgXCJuZXdcIiBib290c3RyYXAgaXMgdGhlIGRlZmF1bHRcbiAgICAgICAgQ0RLX0xFR0FDWV9CT09UU1RSQVA6ICcxJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2RrQm9vdHN0cmFwTW9kZXJuKG9wdGlvbnM6IENka01vZGVybkJvb3RzdHJhcENvbW1hbmRPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBhcmdzID0gWydib290c3RyYXAnXTtcblxuICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgIGFyZ3MucHVzaCgnLXYnKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc2hvd1RlbXBsYXRlKSB7XG4gICAgICBhcmdzLnB1c2goJy0tc2hvdy10ZW1wbGF0ZScpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50ZW1wbGF0ZSkge1xuICAgICAgYXJncy5wdXNoKCctLXRlbXBsYXRlJywgb3B0aW9ucy50ZW1wbGF0ZSk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLS10b29sa2l0LXN0YWNrLW5hbWUnLCBvcHRpb25zLnRvb2xraXRTdGFja05hbWUpO1xuICAgIGlmIChvcHRpb25zLmJvb3RzdHJhcEJ1Y2tldE5hbWUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1ib290c3RyYXAtYnVja2V0LW5hbWUnLCBvcHRpb25zLmJvb3RzdHJhcEJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJy0tcXVhbGlmaWVyJywgb3B0aW9ucy5xdWFsaWZpZXIgPz8gdGhpcy5xdWFsaWZpZXIpO1xuICAgIGlmIChvcHRpb25zLmNmbkV4ZWN1dGlvblBvbGljeSkge1xuICAgICAgYXJncy5wdXNoKCctLWNsb3VkZm9ybWF0aW9uLWV4ZWN1dGlvbi1wb2xpY2llcycsIG9wdGlvbnMuY2ZuRXhlY3V0aW9uUG9saWN5KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGVybWluYXRpb25Qcm90ZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS10ZXJtaW5hdGlvbi1wcm90ZWN0aW9uJywgb3B0aW9ucy50ZXJtaW5hdGlvblByb3RlY3Rpb24udG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmZvcmNlKSB7XG4gICAgICBhcmdzLnB1c2goJy0tZm9yY2UnKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGFncykge1xuICAgICAgYXJncy5wdXNoKCctLXRhZ3MnLCBvcHRpb25zLnRhZ3MpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5jdXN0b21QZXJtaXNzaW9uc0JvdW5kYXJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1jdXN0b20tcGVybWlzc2lvbnMtYm91bmRhcnknLCBvcHRpb25zLmN1c3RvbVBlcm1pc3Npb25zQm91bmRhcnkpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5leGFtcGxlUGVybWlzc2lvbnNCb3VuZGFyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmdzLnB1c2goJy0tZXhhbXBsZS1wZXJtaXNzaW9ucy1ib3VuZGFyeScpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy51c2VQcmV2aW91c1BhcmFtZXRlcnMgPT09IGZhbHNlKSB7XG4gICAgICBhcmdzLnB1c2goJy0tbm8tcHJldmlvdXMtcGFyYW1ldGVycycpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5ib290c3RyYXBUZW1wbGF0ZSkge1xuICAgICAgYXJncy5wdXNoKCctLXRlbXBsYXRlJywgb3B0aW9ucy5ib290c3RyYXBUZW1wbGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudHJ1c3QgIT0gbnVsbCkge1xuICAgICAgYXJncy5wdXNoKCctLXRydXN0Jywgb3B0aW9ucy50cnVzdC5qb2luKCcsJykpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy51bnRydXN0ICE9IG51bGwpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS11bnRydXN0Jywgb3B0aW9ucy51bnRydXN0LmpvaW4oJywnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2RrKGFyZ3MsIHtcbiAgICAgIC4uLm9wdGlvbnMuY2xpT3B0aW9ucyxcbiAgICAgIG1vZEVudjoge1xuICAgICAgICAuLi5vcHRpb25zLmNsaU9wdGlvbnM/Lm1vZEVudixcbiAgICAgICAgLy8gc28gdGhhdCB0aGlzIHdvcmtzIGZvciBWMSxcbiAgICAgICAgLy8gd2hlcmUgdGhlIFwib2xkXCIgYm9vdHN0cmFwIGlzIHRoZSBkZWZhdWx0XG4gICAgICAgIENES19ORVdfQk9PVFNUUkFQOiAnMScsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNka0dhcmJhZ2VDb2xsZWN0KG9wdGlvbnM6IENka0dhcmJhZ2VDb2xsZWN0aW9uQ29tbWFuZE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICAnZ2MnLFxuICAgICAgJy0tdW5zdGFibGU9Z2MnLCAvLyBUT0RPOiByZW1vdmUgd2hlbiBzdGFiaWxpemluZ1xuICAgICAgJy0tY29uZmlybT1mYWxzZScsXG4gICAgICAnLS1jcmVhdGVkLWJ1ZmZlci1kYXlzPTAnLCAvLyBPdGhlcndpc2UgYWxsIGFzc2V0cyBjcmVhdGVkIGR1cmluZyBpbnRlZyB0ZXN0cyBhcmUgdG9vIHlvdW5nXG4gICAgXTtcbiAgICBpZiAob3B0aW9ucy5yb2xsYmFja0J1ZmZlckRheXMpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1yb2xsYmFjay1idWZmZXItZGF5cycsIFN0cmluZyhvcHRpb25zLnJvbGxiYWNrQnVmZmVyRGF5cykpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50eXBlKSB7XG4gICAgICBhcmdzLnB1c2goJy0tdHlwZScsIG9wdGlvbnMudHlwZSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmJvb3RzdHJhcFN0YWNrTmFtZSkge1xuICAgICAgYXJncy5wdXNoKCctLWJvb3RzdHJhcFN0YWNrTmFtZScsIG9wdGlvbnMuYm9vdHN0cmFwU3RhY2tOYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jZGsoYXJncyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2RrTWlncmF0ZShsYW5ndWFnZTogc3RyaW5nLCBzdGFja05hbWU6IHN0cmluZywgaW5wdXRQYXRoPzogc3RyaW5nLCBvcHRpb25zPzogQ2RrQ2xpT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmNkayhbXG4gICAgICAnbWlncmF0ZScsXG4gICAgICAnLS1sYW5ndWFnZScsXG4gICAgICBsYW5ndWFnZSxcbiAgICAgICctLXN0YWNrLW5hbWUnLFxuICAgICAgc3RhY2tOYW1lLFxuICAgICAgJy0tZnJvbS1wYXRoJyxcbiAgICAgIGlucHV0UGF0aCA/PyBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAncmVzb3VyY2VzJywgJ3RlbXBsYXRlcycsICdzcXMtdGVtcGxhdGUuanNvbicpLnRvU3RyaW5nKCksXG4gICAgICAuLi4ob3B0aW9ucz8ub3B0aW9ucyA/PyBbXSksXG4gICAgXSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2RrKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBDZGtDbGlPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlID8/IHRydWU7XG5cbiAgICBhd2FpdCB0aGlzLmNsaS5tYWtlQ2xpQXZhaWxhYmxlKCk7XG5cbiAgICByZXR1cm4gdGhpcy5zaGVsbChbJ2NkaycsIC4uLih2ZXJib3NlID8gWyctdiddIDogW10pLCAuLi5hcmdzXSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG1vZEVudjoge1xuICAgICAgICAuLi50aGlzLmNka1NoZWxsRW52KCksXG4gICAgICAgIC4uLm9wdGlvbnMubW9kRW52LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aXRoIHdoaWNoIHRvIGV4ZWN1dGUgQ0RLXG4gICAqL1xuICBwdWJsaWMgY2RrU2hlbGxFbnYoKSB7XG4gICAgLy8gaWYgdGVzdHMgYXJlIHVzaW5nIGFuIGV4cGxpY2l0IGF3cyBpZGVudGl0eSBhbHJlYWR5IChpLmUgY3JlZHMpXG4gICAgLy8gZm9yY2UgZXZlcnkgY2RrIGNvbW1hbmQgdG8gdXNlIHRoZSBzYW1lIGlkZW50aXR5LlxuICAgIGNvbnN0IGF3c0NyZWRzID0gdGhpcy5hd3MuaWRlbnRpdHlFbnYoKSA/PyB7fTtcblxuICAgIHJldHVybiB7XG4gICAgICBBV1NfUkVHSU9OOiB0aGlzLmF3cy5yZWdpb24sXG4gICAgICBBV1NfREVGQVVMVF9SRUdJT046IHRoaXMuYXdzLnJlZ2lvbixcbiAgICAgIFNUQUNLX05BTUVfUFJFRklYOiB0aGlzLnN0YWNrTmFtZVByZWZpeCxcbiAgICAgIFBBQ0tBR0VfTEFZT1VUX1ZFUlNJT046ICcyJyxcbiAgICAgIC8vIEluIHRoZXNlIHRlc3RzIHdlIHdhbnQgdG8gbWFrZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gc3Rkb3V0IGFuZCBzdGVyclxuICAgICAgQ0k6ICdmYWxzZScsXG4gICAgICAuLi5hd3NDcmVkcyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHRlbXBsYXRlKHN0YWNrTmFtZTogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCBmdWxsU3RhY2tOYW1lID0gdGhpcy5mdWxsU3RhY2tOYW1lKHN0YWNrTmFtZSk7XG4gICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKHRoaXMuaW50ZWdUZXN0RGlyLCAnY2RrLm91dCcsIGAke2Z1bGxTdGFja05hbWV9LnRlbXBsYXRlLmpzb25gKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGJvb3RzdHJhcFJlcG9OYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgZW5zdXJlQm9vdHN0cmFwcGVkKHRoaXMpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF3cy5jbG91ZEZvcm1hdGlvbi5zZW5kKG5ldyBEZXNjcmliZVN0YWNrc0NvbW1hbmQoe30pKTtcblxuICAgIGNvbnN0IHN0YWNrID0gKHJlc3BvbnNlLlN0YWNrcyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKHMpID0+IHMuU3RhY2tOYW1lICYmIHMuU3RhY2tOYW1lID09IHRoaXMuYm9vdHN0cmFwU3RhY2tOYW1lKTtcbiAgICBhc3NlcnQoc3RhY2subGVuZ3RoID09IDEpO1xuICAgIHJldHVybiBvdXRwdXRGcm9tU3RhY2soJ0ltYWdlUmVwb3NpdG9yeU5hbWUnLCBzdGFja1swXSkgPz8gJyc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJvb3RzdHJhcFN0YWNrTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5mdWxsU3RhY2tOYW1lKCdib290c3RyYXAtc3RhY2snKTtcbiAgfVxuXG4gIHB1YmxpYyBmdWxsU3RhY2tOYW1lKHN0YWNrTmFtZTogc3RyaW5nKTogc3RyaW5nO1xuICBwdWJsaWMgZnVsbFN0YWNrTmFtZShzdGFja05hbWVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdO1xuICBwdWJsaWMgZnVsbFN0YWNrTmFtZShzdGFja05hbWVzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICBpZiAodHlwZW9mIHN0YWNrTmFtZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5zdGFja05hbWVQcmVmaXh9LSR7c3RhY2tOYW1lc31gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhY2tOYW1lcy5tYXAocyA9PiBgJHt0aGlzLnN0YWNrTmFtZVByZWZpeH0tJHtzfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmQgdGhpcyB0byB0aGUgbGlzdCBvZiBidWNrZXRzIHRvIHBvdGVudGlhbGx5IGRlbGV0ZVxuICAgKlxuICAgKiBBdCB0aGUgZW5kIG9mIGEgdGVzdCwgd2UgY2xlYW4gdXAgYnVja2V0cyB0aGF0IG1heSBub3QgaGF2ZSBnb3R0ZW4gZGVzdHJveWVkXG4gICAqIChmb3Igd2hhdGV2ZXIgcmVhc29uKS5cbiAgICovXG4gIHB1YmxpYyByZW1lbWJlclRvRGVsZXRlQnVja2V0KGJ1Y2tldE5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuYnVja2V0c1RvRGVsZXRlLnB1c2goYnVja2V0TmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW51cCBsZWZ0b3ZlciBzdGFja3MgYW5kIGJvb3RzdHJhcHBlZCByZXNvdXJjZXNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNwb3NlKHN1Y2Nlc3M6IGJvb2xlYW4pIHtcbiAgICAvLyB3aGVuIHVzaW5nIHRoZSBhdG1vc3BoZXJlIHNlcnZpY2UsIGl0IGRvZXMgcmVzb3VyY2UgY2xlYW51cCBvbiBvdXIgYmVoYWxmXG4gICAgLy8gc28gd2UgZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciBpdC5cbiAgICBpZiAoIWF0bW9zcGhlcmVFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IHN0YWNrc1RvRGVsZXRlID0gYXdhaXQgdGhpcy5kZWxldGVhYmxlU3RhY2tzKHRoaXMuc3RhY2tOYW1lUHJlZml4KTtcblxuICAgICAgdGhpcy5zb3J0Qm9vdHN0cmFwU3RhY2tzVG9UaGVFbmQoc3RhY2tzVG9EZWxldGUpO1xuXG4gICAgICAvLyBCb290c3RyYXAgc3RhY2tzIGhhdmUgYnVja2V0cyB0aGF0IG5lZWQgdG8gYmUgY2xlYW5lZFxuICAgICAgY29uc3QgYnVja2V0TmFtZXMgPSBzdGFja3NUb0RlbGV0ZS5tYXAoc3RhY2sgPT4gb3V0cHV0RnJvbVN0YWNrKCdCdWNrZXROYW1lJywgc3RhY2spKS5maWx0ZXIoZGVmaW5lZCk7XG4gICAgICAvLyBQYXJhbGxlbGlzbSB3aWxsIGJlIHJlYXNvbmFibGVcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAY2RrbGFicy9wcm9taXNlYWxsLW5vLXVuYm91bmRlZC1wYXJhbGxlbGlzbVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYnVja2V0TmFtZXMubWFwKGIgPT4gdGhpcy5hd3MuZW1wdHlCdWNrZXQoYikpKTtcbiAgICAgIC8vIFRoZSBib290c3RyYXAgYnVja2V0IGhhcyBhIHJlbW92YWwgcG9saWN5IG9mIFJFVEFJTiBieSBkZWZhdWx0LCBzbyBhZGQgaXQgdG8gdGhlIGJ1Y2tldHMgdG8gYmUgY2xlYW5lZCB1cC5cbiAgICAgIHRoaXMuYnVja2V0c1RvRGVsZXRlLnB1c2goLi4uYnVja2V0TmFtZXMpO1xuXG4gICAgICAvLyBCb290c3RyYXAgc3RhY2tzIGhhdmUgRUNSIHJlcG9zaXRvcmllcyB3aXRoIGltYWdlcyB3aGljaCBzaG91bGQgYmUgZGVsZXRlZFxuICAgICAgY29uc3QgaW1hZ2VSZXBvc2l0b3J5TmFtZXMgPSBzdGFja3NUb0RlbGV0ZS5tYXAoc3RhY2sgPT4gb3V0cHV0RnJvbVN0YWNrKCdJbWFnZVJlcG9zaXRvcnlOYW1lJywgc3RhY2spKS5maWx0ZXIoZGVmaW5lZCk7XG4gICAgICAvLyBQYXJhbGxlbGlzbSB3aWxsIGJlIHJlYXNvbmFibGVcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAY2RrbGFicy9wcm9taXNlYWxsLW5vLXVuYm91bmRlZC1wYXJhbGxlbGlzbVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoaW1hZ2VSZXBvc2l0b3J5TmFtZXMubWFwKHIgPT4gdGhpcy5hd3MuZGVsZXRlSW1hZ2VSZXBvc2l0b3J5KHIpKSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuYXdzLmRlbGV0ZVN0YWNrcyhcbiAgICAgICAgLi4uc3RhY2tzVG9EZWxldGUubWFwKChzKSA9PiB7XG4gICAgICAgICAgaWYgKCFzLlN0YWNrTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGFjayBuYW1lIGlzIHJlcXVpcmVkIHRvIGRlbGV0ZSBhIHN0YWNrLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcy5TdGFja05hbWU7XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgLy8gV2UgbWlnaHQgaGF2ZSBsZWFrZWQgc29tZSBidWNrZXRzIGJ5IHVwZ3JhZGluZyB0aGUgYm9vdHN0cmFwIHN0YWNrLiBCZVxuICAgICAgLy8gc3VyZSB0byBjbGVhbiBldmVyeXRoaW5nLlxuICAgICAgZm9yIChjb25zdCBidWNrZXQgb2YgdGhpcy5idWNrZXRzVG9EZWxldGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hd3MuZGVsZXRlQnVja2V0KGJ1Y2tldCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHRlc3RzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIGhhcHBpbHkgZGVsZXRlIHRoZSBmaXh0dXJlXG4gICAgLy8gKG90aGVyd2lzZSBsZWF2ZSBpdCBmb3IgaHVtYW5zIHRvIGluc3BlY3QpXG4gICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgIGNvbnN0IGNsZWFuZWQgPSByaW1yYWYodGhpcy5pbnRlZ1Rlc3REaXIpO1xuICAgICAgaWYgKCFjbGVhbmVkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjbGVhbiB1cCAke3RoaXMuaW50ZWdUZXN0RGlyfSBkdWUgdG8gcGVybWlzc2lvbnMgaXNzdWVzIChEb2NrZXIgcnVubmluZyBhcyByb290PylgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzdGFja3Mgc3RhcnRpbmcgd2l0aCBvdXIgdGVzdGluZyBwcmVmaXggdGhhdCBzaG91bGQgYmUgZGVsZXRlZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZWxldGVhYmxlU3RhY2tzKHByZWZpeDogc3RyaW5nKTogUHJvbWlzZTxTdGFja1tdPiB7XG4gICAgY29uc3Qgc3RhdHVzRmlsdGVyID0gW1xuICAgICAgJ0NSRUFURV9JTl9QUk9HUkVTUycsICdDUkVBVEVfRkFJTEVEJywgJ0NSRUFURV9DT01QTEVURScsXG4gICAgICAnUk9MTEJBQ0tfSU5fUFJPR1JFU1MnLCAnUk9MTEJBQ0tfRkFJTEVEJywgJ1JPTExCQUNLX0NPTVBMRVRFJyxcbiAgICAgICdERUxFVEVfRkFJTEVEJyxcbiAgICAgICdVUERBVEVfSU5fUFJPR1JFU1MnLCAnVVBEQVRFX0NPTVBMRVRFX0NMRUFOVVBfSU5fUFJPR1JFU1MnLFxuICAgICAgJ1VQREFURV9DT01QTEVURScsICdVUERBVEVfUk9MTEJBQ0tfSU5fUFJPR1JFU1MnLFxuICAgICAgJ1VQREFURV9ST0xMQkFDS19GQUlMRUQnLFxuICAgICAgJ1VQREFURV9ST0xMQkFDS19DT01QTEVURV9DTEVBTlVQX0lOX1BST0dSRVNTJyxcbiAgICAgICdVUERBVEVfUk9MTEJBQ0tfQ09NUExFVEUnLCAnUkVWSUVXX0lOX1BST0dSRVNTJyxcbiAgICAgICdJTVBPUlRfSU5fUFJPR1JFU1MnLCAnSU1QT1JUX0NPTVBMRVRFJyxcbiAgICAgICdJTVBPUlRfUk9MTEJBQ0tfSU5fUFJPR1JFU1MnLCAnSU1QT1JUX1JPTExCQUNLX0ZBSUxFRCcsXG4gICAgICAnSU1QT1JUX1JPTExCQUNLX0NPTVBMRVRFJyxcbiAgICBdO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF3cy5jbG91ZEZvcm1hdGlvbi5zZW5kKG5ldyBEZXNjcmliZVN0YWNrc0NvbW1hbmQoe30pKTtcblxuICAgIHJldHVybiAocmVzcG9uc2UuU3RhY2tzID8/IFtdKVxuICAgICAgLmZpbHRlcigocykgPT4gcy5TdGFja05hbWUgJiYgcy5TdGFja05hbWUuc3RhcnRzV2l0aChwcmVmaXgpKVxuICAgICAgLmZpbHRlcigocykgPT4gcy5TdGFja1N0YXR1cyAmJiBzdGF0dXNGaWx0ZXIuaW5jbHVkZXMocy5TdGFja1N0YXR1cykpXG4gICAgICAuZmlsdGVyKChzKSA9PiBzLlJvb3RJZCA9PT0gdW5kZWZpbmVkKTsgLy8gT25seSBkZWxldGUgcGFyZW50IHN0YWNrcy4gTmVzdGVkIHN0YWNrcyBhcmUgZGVsZXRlZCBpbiB0aGUgcHJvY2Vzc1xuICB9XG5cbiAgcHJpdmF0ZSBzb3J0Qm9vdHN0cmFwU3RhY2tzVG9UaGVFbmQoc3RhY2tzOiBTdGFja1tdKSB7XG4gICAgc3RhY2tzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGlmICghYS5TdGFja05hbWUgfHwgIWIuU3RhY2tOYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU3RhY2sgbmFtZXMgZG8gbm90IGV4aXN0cy4gVGhlc2UgYXJlIHJlcXVpcmVkIGZvciBzb3J0aW5nIHRoZSBib290c3RyYXAgc3RhY2tzLicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhQnMgPSBhLlN0YWNrTmFtZS5zdGFydHNXaXRoKHRoaXMuYm9vdHN0cmFwU3RhY2tOYW1lKTtcbiAgICAgIGNvbnN0IGJCcyA9IGIuU3RhY2tOYW1lLnN0YXJ0c1dpdGgodGhpcy5ib290c3RyYXBTdGFja05hbWUpO1xuXG4gICAgICByZXR1cm4gYUJzICE9IGJCc1xuICAgICAgICAvLyAnKycgY29udmVydHMgYSBib29sZWFuIHRvIDAgb3IgMVxuICAgICAgICA/ICgrYUJzKSAtICgrYkJzKVxuICAgICAgICA6IGEuU3RhY2tOYW1lLmxvY2FsZUNvbXBhcmUoYi5TdGFja05hbWUpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTWFrZSBzdXJlIHRoYXQgdGhlIGdpdmVuIGVudmlyb25tZW50IGlzIGJvb3RzdHJhcHBlZFxuICpcbiAqIFNpbmNlIHdlIGdvIHN0cmlwaW5nIGFjcm9zcyByZWdpb25zLCBpdCdzIGdvaW5nIHRvIHN1Y2sgZG9pbmcgdGhpc1xuICogYnkgaGFuZCBzbyBsZXQncyBqdXN0IG1hc3MtYXV0b21hdGUgaXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVCb290c3RyYXBwZWQoZml4dHVyZTogVGVzdEZpeHR1cmUpIHtcbiAgLy8gQWx3YXlzIHVzZSB0aGUgbW9kZXJuIGJvb3RzdHJhcCBzdGFjaywgb3RoZXJ3aXNlIHdlIG1heSBnZXQgdGhlIGVycm9yXG4gIC8vIFwicmVmdXNpbmcgdG8gZG93bmdyYWRlIGZyb20gdmVyc2lvbiA3IHRvIHZlcnNpb24gMFwiIHdoZW4gYm9vdHN0cmFwcGluZyB3aXRoIGRlZmF1bHRcbiAgLy8gc2V0dGluZ3MgdXNpbmcgYSB2MSBDTEkuXG4gIC8vXG4gIC8vIEl0IGRvZXNuJ3QgbWF0dGVyIGZvciB0ZXN0czogd2hlbiB0aGV5IHdhbnQgdG8gdGVzdCBzb21ldGhpbmcgYWJvdXQgYW4gYWN0dWFsIGxlZ2FjeVxuICAvLyBib290c3RyYXAgc3RhY2ssIHRoZXknbGwgY3JlYXRlIGEgYm9vdHN0cmFwIHN0YWNrIHdpdGggYSBub24tZGVmYXVsdCBuYW1lIHRvIHRlc3QgdGhhdCBleGFjdCBwcm9wZXJ0eS5cbiAgY29uc3QgZW52U3BlY2lmaWVyID0gYGF3czovLyR7YXdhaXQgZml4dHVyZS5hd3MuYWNjb3VudCgpfS8ke2ZpeHR1cmUuYXdzLnJlZ2lvbn1gO1xuICBpZiAoQUxSRUFEWV9CT09UU1RSQVBQRURfSU5fVEhJU19SVU4uaGFzKGVudlNwZWNpZmllcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYXRtb3NwaGVyZUVuYWJsZWQoKSkge1xuICAgIC8vIHdoZW4gYXRtb3NwaGVyZSBpcyBlbmFibGVkLCBlYWNoIHRlc3Qgc3RhcnRzIHdpdGggYW4gZW1wdHkgZW52aXJvbm1lbnRcbiAgICAvLyBhbmQgbmVlZHMgdG8gZGVwbG95IHRoZSBib290c3RyYXAgc3RhY2suIGluIGNhc2UgZW52aXJvbm1lbnRzIGFyZSByZWN5bGNlZCB0b28gcXVpY2tseSxcbiAgICAvLyBjbG91ZGZvcm1hdGlvbiBtYXkgdGhpbmsgdGhlIGJvb3RzdHJhcCBidWNrZXQgc3RpbGwgZXhpc3RzIGV2ZW4gdGhvdWdoIGl0IGRvZXNudCAoYmVjYXVzZSBvZiBzMyBldmVudHVhbCBjb25zaXN0ZW5jeSkuXG4gICAgLy8gc28gd2UgcmV0cnkgb24gdGhlIHNwZWNpZmljIGVycm9yIGZvciBhIHdoaWxlLlxuICAgIGF3YWl0IGJvb3RzdHJhcFdpdGhSZXRyeU9uQnVja2V0RXhpc3RzKGVudlNwZWNpZmllciwgZml4dHVyZSk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgZG9Cb290c3RyYXAoZW52U3BlY2lmaWVyLCBmaXh0dXJlLCBmYWxzZSk7XG4gIH1cblxuICAvLyB3aGVuIHVzaW5nIHRoZSBhdG1vc3BoZXJlIHNlcnZpY2UsIGV2ZXJ5IHRlc3QgbmVlZHMgdG8gYm9vdHN0cmFwXG4gIC8vIGl0cyBvd24gZW52aXJvbm1lbnQuXG4gIGlmICghYXRtb3NwaGVyZUVuYWJsZWQoKSkge1xuICAgIEFMUkVBRFlfQk9PVFNUUkFQUEVEX0lOX1RISVNfUlVOLmFkZChlbnZTcGVjaWZpZXIpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvQm9vdHN0cmFwKGVudlNwZWNpZmllcjogc3RyaW5nLCBmaXh0dXJlOiBUZXN0Rml4dHVyZSwgYWxsb3dFcnJFeGl0OiBib29sZWFuKSB7XG4gIHJldHVybiBmaXh0dXJlLmNkayhbJ2Jvb3RzdHJhcCcsIGVudlNwZWNpZmllcl0sIHtcbiAgICBtb2RFbnY6IHtcbiAgICAgIC8vIEV2ZW4gZm9yIHYxLCB1c2UgbmV3IGJvb3RzdHJhcFxuICAgICAgQ0RLX05FV19CT09UU1RSQVA6ICcxJyxcbiAgICAgIC8vIHdoZW4gYWxsb3dpbmcgZXJyb3IgZXhpdCwgd2UgcHJvYmFibHkgd2FudCB0byBpbnNwZWN0XG4gICAgICAvLyBhbmQgY29tcGFyZSBvdXRwdXQsIHdoaWNoIGlzIGJldHRlciBkb25lIHdpdGhvdXQgY29sb3IgY2hhcmFjdGVycy5cbiAgICAgIC4uLihhbGxvd0VyckV4aXQgPyB7IEZPUkNFX0NPTE9SOiAnMCcgfSA6IHt9KSxcbiAgICB9LFxuICAgIGFsbG93RXJyRXhpdCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcFdpdGhSZXRyeU9uQnVja2V0RXhpc3RzKGVudlNwZWNpZmllcjogc3RyaW5nLCBmaXh0dXJlOiBUZXN0Rml4dHVyZSkge1xuICBjb25zdCBhY2NvdW50ID0gYXdhaXQgZml4dHVyZS5hd3MuYWNjb3VudCgpO1xuICBjb25zdCByZXRyeUFmdGVyU2Vjb25kcyA9IDMwO1xuICBjb25zdCBib290c3RyYXBCdWNrZXQgPSBgY2RrLWhuYjY1OWZkcy1hc3NldHMtJHthY2NvdW50fS0ke2ZpeHR1cmUuYXdzLnJlZ2lvbn1gO1xuXG4gIC8vIHMzIHNheXMgdGhhdCBhIGJ1Y2tldCBkZWxldGlvbiBjYW4gdGFrZSB1cCB0byBhbiBob3VyIHRvIGJlIGZ1bGx5IHZpc2libGUuXG4gIC8vIGVtcGlyaWNhbGx5IHdlIHNlZSB0aGF0IGEgZmV3IG1pbnV0ZXMgaXMgZW5vdWdoIHRob3VnaC4gbGV0cyBnaXZlIDEwIHRvIGJlIG9uIHRoZSBzYWZlKHIpIHNpZGUuXG4gIGNvbnN0IHRpbWVvdXRNaW51dGVzID0gMTA7XG5cbiAgY29uc3QgdGltZW91dERhdGUgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgdGltZW91dE1pbnV0ZXMgKiA2MCAqIDEwMDApO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IG91dCA9IGF3YWl0IGRvQm9vdHN0cmFwKGVudlNwZWNpZmllciwgZml4dHVyZSwgdHJ1ZSk7XG4gICAgaWYgKG91dC5pbmNsdWRlcyhgRW52aXJvbm1lbnQgJHtlbnZTcGVjaWZpZXJ9IGJvb3RzdHJhcHBlZGApKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKG91dC5pbmNsdWRlcyhgJHtib290c3RyYXBCdWNrZXR9IGFscmVhZHkgZXhpc3RzYCkpIHtcbiAgICAgIC8vIG1pZ2h0IGJlIGFuIHMzIGV2ZW50dWFseSBjb25zaXN0ZW5jeSBpc3N1ZSBkdWUgdG8gcmVjeWNsZWQgZW52aXJvbm1lbnRzLlxuICAgICAgaWYgKERhdGUubm93KCkgPCB0aW1lb3V0RGF0ZS5nZXRUaW1lKCkpIHtcbiAgICAgICAgZml4dHVyZS5sb2coYEJvb3RzdHJhcCBvZiAke2VudlNwZWNpZmllcn0gZmFpbGVkIGR1ZSB0byBidWNrZXQgZXhpc3RlbmNlIGNoZWNrLiBSZXRyeWluZyBpbiAke3JldHJ5QWZ0ZXJTZWNvbmRzfSBzZWNvbmRzLi4uYCk7XG4gICAgICAgIGF3YWl0IHNsZWVwKHJldHJ5QWZ0ZXJTZWNvbmRzICogMTAwMCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCBib290c3RyYXBwaW5nICR7ZW52U3BlY2lmaWVyfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmluZWQ8QT4oeDogQSk6IHggaXMgTm9uTnVsbGFibGU8QT4ge1xuICByZXR1cm4geCAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEluc3RhbGwgdGhlIGdpdmVuIE5QTSBwYWNrYWdlcywgaWRlbnRpZmllZCBieSB0aGVpciBuYW1lcyBhbmQgdmVyc2lvbnNcbiAqXG4gKiBXb3JrcyBieSB3cml0aW5nIHRoZSBwYWNrYWdlcyB0byBhIGBwYWNrYWdlLmpzb25gIGZpbGUsIGFuZFxuICogdGhlbiBydW5uaW5nIE5QTTcncyBcImluc3RhbGxcIiBvbiBpdC4gVGhlIHVzZSBvZiBOUE03IHdpbGwgYXV0b21hdGljYWxseVxuICogaW5zdGFsbCByZXF1aXJlZCBwZWVyRGVwZW5kZW5jaWVzLlxuICpcbiAqIElmIHdlJ3JlIHJ1bm5pbmcgaW4gUkVQTyBtb2RlIGFuZCB3ZSBmaW5kIHRoZSBwYWNrYWdlIGluIHRoZSBzZXQgb2YgbG9jYWxcbiAqIHBhY2thZ2VzIGluIHRoZSByZXBvc2l0b3J5LCB3ZSdsbCB3cml0ZSB0aGUgZGlyZWN0b3J5IG5hbWUgdG8gYHBhY2thZ2UuanNvbmBcbiAqIHNvIHRoYXQgTlBNIHdpbGwgY3JlYXRlIGEgc3ltbGluayAodGhpcyBhbGxvd3MgcnVubmluZyB0ZXN0cyBhZ2FpbnN0XG4gKiBidWlsdC1idXQtdW5wYWNrYWdlZCBtb2R1bGVzLCBhbmQgc2F2ZXMgZGV2IGN5Y2xlIHRpbWUpLlxuICpcbiAqIEJlIGF3YXJlIHlvdSBNVVNUIGluc3RhbGwgYWxsIHRoZSBwYWNrYWdlcyB5b3UgZGlyZWN0bHkgZGVwZW5kIHVwb24hIEluIHRoZSBjYXNlXG4gKiBvZiBhIHJlcG8vc3ltbGlua2luZyBpbnN0YWxsLCB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyBXSUxMIE5PVCBiZSBpbnN0YWxsZWQgaW4gdGhlXG4gKiBjdXJyZW50IGRpcmVjdG9yeSdzIGBub2RlX21vZHVsZXNgIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGV5IHdpbGwgYWxyZWFkeSBoYXZlIGJlZW5cbiAqIHN5bWxpbmtlZCBmcm9tIHRoZSBUQVJHRVQgZGlyZWN0b3J5J3MgYG5vZGVfbW9kdWxlc2AgZGlyZWN0b3J5ICh3aGljaCBpcyBzdWZmaWNpZW50XG4gKiBmb3IgTm9kZSdzIGRlcGVuZGVuY3kgbG9va3VwIG1lY2hhbmlzbSkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsTnBtUGFja2FnZXMoZml4dHVyZTogVGVzdEZpeHR1cmUsIHBhY2thZ2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gIGlmIChwcm9jZXNzLmVudi5SRVBPX1JPT1QpIHtcbiAgICBjb25zdCBtb25vUmVwbyA9IGF3YWl0IGZpbmRZYXJuUGFja2FnZXMocHJvY2Vzcy5lbnYuUkVQT19ST09UKTtcblxuICAgIC8vIFJlcGxhY2UgdGhlIGluc3RhbGwgdGFyZ2V0IHdpdGggdGhlIHBoeXNpY2FsIGxvY2F0aW9uIG9mIHRoaXMgcGFja2FnZVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhY2thZ2VzKSkge1xuICAgICAgaWYgKGtleSBpbiBtb25vUmVwbykge1xuICAgICAgICBwYWNrYWdlc1trZXldID0gbW9ub1JlcG9ba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihmaXh0dXJlLmludGVnVGVzdERpciwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgbmFtZTogJ2Nkay1pbnRlZy10ZXN0cycsXG4gICAgcHJpdmF0ZTogdHJ1ZSxcbiAgICB2ZXJzaW9uOiAnMC4wLjEnLFxuICAgIGRldkRlcGVuZGVuY2llczogcGFja2FnZXMsXG4gIH0sIHVuZGVmaW5lZCwgMiksIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgLy8gd2Ugb2Z0ZW4gRUNPTk5SRVNFVCBmcm9tIE5QTSBzbyBsZXRzIHJldHJ5LiB0aGlzIG1pZ2h0IGJlIGJlY2F1c2Ugb2YgaGlnaCBjb25jdXJyZW5jeVxuICAvLyB3aGljaCBvdmVyd2hlbG1lcyBzeXN0ZW0gcmVzb3VyY2VzLlxuICBjb25zdCB0aW1lb3V0TWludXRlcyA9IDEwO1xuICBjb25zdCB0aW1lb3V0RGF0ZSA9IG5ldyBEYXRlKERhdGUubm93KCkgKyB0aW1lb3V0TWludXRlcyAqIDYwICogMTAwMCk7XG4gIGNvbnN0IHJldHJ5QWZ0ZXJTZWNvbmRzID0gMzA7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICB0cnkge1xuICAgICAgLy8gTm93IGluc3RhbGwgdGhhdCBgcGFja2FnZS5qc29uYCB1c2luZyBOUE03XG4gICAgICBhd2FpdCBmaXh0dXJlLnNoZWxsKFsnbm9kZScsIHJlcXVpcmUucmVzb2x2ZSgnbnBtJyksICdpbnN0YWxsJ10pO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA8IHRpbWVvdXREYXRlLmdldFRpbWUoKSAmJiBmaXh0dXJlLm91dHB1dC50b1N0cmluZygpLmluY2x1ZGVzKCdFQ09OTlJFU0VUJyApKSB7XG4gICAgICAgIGZpeHR1cmUubG9nKGBucG0gaW5zdGFsbCBmYWlsZWQgZHVlIHRvIEVDT05OUkVTRVQuIFJldHJ5aW5nIGluICR7cmV0cnlBZnRlclNlY29uZHN9IHNlY29uZHMuLi5gKTtcbiAgICAgICAgYXdhaXQgc2xlZXAocmV0cnlBZnRlclNlY29uZHMgKiAxMDAwKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBBTFJFQURZX0JPT1RTVFJBUFBFRF9JTl9USElTX1JVTiA9IG5ldyBTZXQoKTtcbiJdfQ==
@@ -1,6 +1,7 @@
1
- import { TestContext } from './integ-test';
2
- import { AwsContext } from './with-aws';
3
- import { TestFixture, CdkCliOptions, DisableBootstrapContext } from './with-cdk-app';
1
+ import type { TestContext } from './integ-test';
2
+ import type { AwsContext } from './with-aws';
3
+ import type { CdkCliOptions, DisableBootstrapContext } from './with-cdk-app';
4
+ import { TestFixture } from './with-cdk-app';
4
5
  /**
5
6
  * Higher order function to execute a block with a CliLib Integration CDK app fixture
6
7
  */