projen 0.101.13 → 0.101.15

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 (328) hide show
  1. package/.jsii +106 -35
  2. package/lib/ai-instructions.js +2 -2
  3. package/lib/awscdk/auto-discover.js +6 -6
  4. package/lib/awscdk/awscdk-app-java.js +1 -1
  5. package/lib/awscdk/awscdk-app-py.js +1 -1
  6. package/lib/awscdk/awscdk-app-ts.js +1 -1
  7. package/lib/awscdk/awscdk-construct.js +1 -1
  8. package/lib/awscdk/awscdk-deps-java.js +1 -1
  9. package/lib/awscdk/awscdk-deps-js.js +1 -1
  10. package/lib/awscdk/awscdk-deps-py.js +1 -1
  11. package/lib/awscdk/awscdk-deps.js +1 -1
  12. package/lib/awscdk/cdk-config.js +3 -3
  13. package/lib/awscdk/cdk-tasks.js +1 -1
  14. package/lib/awscdk/integration-test.js +1 -1
  15. package/lib/awscdk/lambda-extension.js +1 -1
  16. package/lib/awscdk/lambda-function.js +2 -2
  17. package/lib/build/build-workflow.js +1 -1
  18. package/lib/cdk/auto-discover-base.js +2 -2
  19. package/lib/cdk/construct-lib.js +1 -1
  20. package/lib/cdk/integration-test-base.js +1 -1
  21. package/lib/cdk/jsii-build.js +1 -1
  22. package/lib/cdk/jsii-docgen.js +1 -1
  23. package/lib/cdk/jsii-project.js +1 -1
  24. package/lib/cdk8s/auto-discover.js +2 -2
  25. package/lib/cdk8s/cdk8s-app-py.js +1 -1
  26. package/lib/cdk8s/cdk8s-app-ts.js +1 -1
  27. package/lib/cdk8s/cdk8s-construct.js +1 -1
  28. package/lib/cdk8s/cdk8s-deps-py.js +1 -1
  29. package/lib/cdk8s/cdk8s-deps.js +1 -1
  30. package/lib/cdk8s/integration-test.js +1 -1
  31. package/lib/cdktf/cdktf-construct.js +1 -1
  32. package/lib/circleci/circleci.js +1 -1
  33. package/lib/cli/task-runtime.d.ts +34 -1
  34. package/lib/cli/task-runtime.js +99 -10
  35. package/lib/component.js +2 -2
  36. package/lib/dependencies.js +1 -1
  37. package/lib/dev-env.js +1 -1
  38. package/lib/docker-compose/docker-compose-service.js +1 -1
  39. package/lib/docker-compose/docker-compose.js +1 -1
  40. package/lib/file.js +1 -1
  41. package/lib/gitattributes.js +1 -1
  42. package/lib/github/actions-provider.js +1 -1
  43. package/lib/github/auto-approve.js +1 -1
  44. package/lib/github/auto-merge.js +1 -1
  45. package/lib/github/auto-queue.js +1 -1
  46. package/lib/github/dependabot.js +1 -1
  47. package/lib/github/dependency-review.js +1 -1
  48. package/lib/github/github-credentials.js +1 -1
  49. package/lib/github/github-project.js +1 -1
  50. package/lib/github/github.js +1 -1
  51. package/lib/github/merge-queue.js +1 -1
  52. package/lib/github/mergify.js +1 -1
  53. package/lib/github/pr-template.js +1 -1
  54. package/lib/github/pull-request-backport.js +1 -1
  55. package/lib/github/pull-request-lint.js +1 -1
  56. package/lib/github/stale.js +1 -1
  57. package/lib/github/task-workflow-job.js +1 -1
  58. package/lib/github/task-workflow.js +1 -1
  59. package/lib/github/workflow-actions.js +1 -1
  60. package/lib/github/workflow-jobs.js +1 -1
  61. package/lib/github/workflow-steps.js +1 -1
  62. package/lib/github/workflows.js +1 -1
  63. package/lib/gitlab/configuration.js +1 -1
  64. package/lib/gitlab/gitlab-configuration.js +1 -1
  65. package/lib/gitlab/nested-configuration.js +1 -1
  66. package/lib/gitpod.js +1 -1
  67. package/lib/ignore-file.js +1 -1
  68. package/lib/ini.js +1 -1
  69. package/lib/java/java-project.js +1 -1
  70. package/lib/java/junit.js +1 -1
  71. package/lib/java/maven-compile.js +1 -1
  72. package/lib/java/maven-packaging.js +1 -1
  73. package/lib/java/maven-sample.js +1 -1
  74. package/lib/java/pom.js +2 -2
  75. package/lib/java/projenrc.js +1 -1
  76. package/lib/javascript/biome/biome.js +1 -1
  77. package/lib/javascript/bundler.js +1 -1
  78. package/lib/javascript/eslint.js +1 -1
  79. package/lib/javascript/jest.js +4 -4
  80. package/lib/javascript/license-checker.js +1 -1
  81. package/lib/javascript/node-package.js +1 -1
  82. package/lib/javascript/node-project.js +1 -1
  83. package/lib/javascript/npm-config.js +1 -1
  84. package/lib/javascript/pnpm-workspace-config.js +2 -2
  85. package/lib/javascript/pnpm-workspace.js +1 -1
  86. package/lib/javascript/prettier.js +1 -1
  87. package/lib/javascript/projenrc.js +1 -1
  88. package/lib/javascript/typescript-config.js +2 -2
  89. package/lib/javascript/upgrade-dependencies.js +2 -2
  90. package/lib/javascript/yarnrc.js +1 -1
  91. package/lib/json-patch.js +1 -1
  92. package/lib/json.js +1 -1
  93. package/lib/license.js +1 -1
  94. package/lib/logger.js +1 -1
  95. package/lib/makefile.js +1 -1
  96. package/lib/object-file.js +1 -1
  97. package/lib/project-build.js +1 -1
  98. package/lib/project-tree.js +1 -1
  99. package/lib/project.js +1 -1
  100. package/lib/projects.js +1 -1
  101. package/lib/projenrc-json.js +1 -1
  102. package/lib/projenrc.js +1 -1
  103. package/lib/python/pip.js +1 -1
  104. package/lib/python/poetry.js +2 -2
  105. package/lib/python/projenrc.js +1 -1
  106. package/lib/python/pyproject-toml-file.js +1 -1
  107. package/lib/python/pytest-sample.js +1 -1
  108. package/lib/python/pytest.js +1 -1
  109. package/lib/python/python-project.js +1 -1
  110. package/lib/python/python-sample.js +1 -1
  111. package/lib/python/requirements-file.js +1 -1
  112. package/lib/python/setuppy.js +1 -1
  113. package/lib/python/setuptools.js +1 -1
  114. package/lib/python/uv-config.js +1 -1
  115. package/lib/python/uv.js +1 -1
  116. package/lib/python/venv.js +1 -1
  117. package/lib/readme.js +1 -1
  118. package/lib/release/apply-version-bump.task.js +48 -0
  119. package/lib/release/bump-version.d.ts +52 -8
  120. package/lib/release/bump-version.js +86 -116
  121. package/lib/release/publisher.js +1 -1
  122. package/lib/release/release-trigger.js +1 -1
  123. package/lib/release/release.js +1 -1
  124. package/lib/release/resolve-latest-tag.task.d.ts +1 -0
  125. package/lib/release/resolve-latest-tag.task.js +23 -0
  126. package/lib/release/suggest-version-bump.task.d.ts +1 -0
  127. package/lib/release/suggest-version-bump.task.js +25 -0
  128. package/lib/renovatebot.js +1 -1
  129. package/lib/run-task.cjs +118 -32
  130. package/lib/sample-file.js +2 -2
  131. package/lib/script-runner.js +1 -1
  132. package/lib/source-code.js +1 -1
  133. package/lib/task-model.d.ts +19 -0
  134. package/lib/task-model.js +1 -1
  135. package/lib/task-shell.js +1 -1
  136. package/lib/task.js +1 -1
  137. package/lib/tasks.js +1 -1
  138. package/lib/testing.js +1 -1
  139. package/lib/textfile.js +1 -1
  140. package/lib/toml.js +1 -1
  141. package/lib/typescript/projenrc-ts.js +1 -1
  142. package/lib/typescript/projenrc.js +1 -1
  143. package/lib/typescript/typescript-runner.js +1 -1
  144. package/lib/typescript/typescript-typedoc.js +1 -1
  145. package/lib/typescript/typescript.js +5 -5
  146. package/lib/util/exec.d.ts +1 -43
  147. package/lib/util/exec.js +4 -73
  148. package/lib/util/task-env.d.ts +11 -0
  149. package/lib/util/task-env.js +41 -0
  150. package/lib/version.d.ts +10 -0
  151. package/lib/version.js +47 -9
  152. package/lib/vscode/devcontainer.js +1 -1
  153. package/lib/vscode/extensions.js +1 -1
  154. package/lib/vscode/launch-config.js +1 -1
  155. package/lib/vscode/settings.js +1 -1
  156. package/lib/vscode/vscode.js +1 -1
  157. package/lib/web/next.js +3 -3
  158. package/lib/web/postcss.js +1 -1
  159. package/lib/web/react.js +3 -3
  160. package/lib/web/tailwind.js +1 -1
  161. package/lib/xmlfile.js +1 -1
  162. package/lib/yaml.js +1 -1
  163. package/node_modules/dax/{script/deps/jsr.io/@david/shell/0.5.4 → esm/deps/jsr.io/@david/shell/0.6.0}/internal.d.ts.map +1 -1
  164. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/mod.d.ts.map +1 -1
  165. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/byteRingBuffer.d.ts.map +1 -1
  166. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/command.d.ts.map +1 -1
  167. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commandHandler.d.ts.map +1 -1
  168. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/args.d.ts.map +1 -1
  169. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/cat.d.ts.map +1 -1
  170. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/cd.d.ts.map +1 -1
  171. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/cpMv.d.ts.map +1 -1
  172. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/echo.d.ts.map +1 -1
  173. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/executable.d.ts.map +1 -1
  174. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/exit.d.ts.map +1 -1
  175. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/export.d.ts.map +1 -1
  176. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/mkdir.d.ts.map +1 -1
  177. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/printenv.d.ts.map +1 -1
  178. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/pwd.d.ts.map +1 -1
  179. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/rm.d.ts.map +1 -1
  180. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/set.d.ts.map +1 -1
  181. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/shopt.d.ts.map +1 -1
  182. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/sleep.d.ts.map +1 -1
  183. package/node_modules/dax/{script/deps/jsr.io/@david/shell/0.5.4 → esm/deps/jsr.io/@david/shell/0.6.0}/src/commands/test.d.ts.map +1 -1
  184. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/touch.d.ts.map +1 -1
  185. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/unset.d.ts.map +1 -1
  186. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/which.d.ts.map +1 -1
  187. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/common.d.ts.map +1 -1
  188. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/dollar.d.ts.map +1 -1
  189. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/fsFile.d.ts.map +1 -1
  190. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/glob.d.ts.map +1 -1
  191. package/node_modules/dax/esm/deps/jsr.io/@david/shell/0.6.0/src/lib/rs_lib.d.ts.map +1 -0
  192. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/lib/rs_lib.internal.d.ts.map +1 -1
  193. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/lineRingBuffer.d.ts.map +1 -1
  194. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/pipes.d.ts.map +1 -1
  195. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/result.d.ts.map +1 -1
  196. package/node_modules/dax/{script/deps/jsr.io/@david/shell/0.5.4 → esm/deps/jsr.io/@david/shell/0.6.0}/src/shell.d.ts +5 -1
  197. package/node_modules/dax/esm/deps/jsr.io/@david/shell/0.6.0/src/shell.d.ts.map +1 -0
  198. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/signal.d.ts.map +1 -1
  199. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/spawn.d.ts.map +1 -1
  200. package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/streams.d.ts.map +1 -1
  201. package/node_modules/dax/esm/mod.d.ts +3 -3
  202. package/node_modules/dax/esm/mod.js +73 -41
  203. package/node_modules/dax/esm/src/common.d.ts +1 -1
  204. package/node_modules/dax/esm/src/console/utils.d.ts +1 -1
  205. package/node_modules/dax/esm/src/request.d.ts +2 -2
  206. package/node_modules/dax/package.json +1 -1
  207. package/node_modules/dax/{esm/deps/jsr.io/@david/shell/0.5.4 → script/deps/jsr.io/@david/shell/0.6.0}/internal.d.ts.map +1 -1
  208. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/mod.d.ts.map +1 -1
  209. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/byteRingBuffer.d.ts.map +1 -1
  210. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/command.d.ts.map +1 -1
  211. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commandHandler.d.ts.map +1 -1
  212. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/args.d.ts.map +1 -1
  213. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/cat.d.ts.map +1 -1
  214. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/cd.d.ts.map +1 -1
  215. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/cpMv.d.ts.map +1 -1
  216. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/echo.d.ts.map +1 -1
  217. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/executable.d.ts.map +1 -1
  218. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/exit.d.ts.map +1 -1
  219. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/export.d.ts.map +1 -1
  220. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/mkdir.d.ts.map +1 -1
  221. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/printenv.d.ts.map +1 -1
  222. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/pwd.d.ts.map +1 -1
  223. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/rm.d.ts.map +1 -1
  224. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/set.d.ts.map +1 -1
  225. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/shopt.d.ts.map +1 -1
  226. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/sleep.d.ts.map +1 -1
  227. package/node_modules/dax/{esm/deps/jsr.io/@david/shell/0.5.4 → script/deps/jsr.io/@david/shell/0.6.0}/src/commands/test.d.ts.map +1 -1
  228. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/touch.d.ts.map +1 -1
  229. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/unset.d.ts.map +1 -1
  230. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/which.d.ts.map +1 -1
  231. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/common.d.ts.map +1 -1
  232. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/dollar.d.ts.map +1 -1
  233. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/fsFile.d.ts.map +1 -1
  234. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/glob.d.ts.map +1 -1
  235. package/node_modules/dax/script/deps/jsr.io/@david/shell/0.6.0/src/lib/rs_lib.d.ts.map +1 -0
  236. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/lib/rs_lib.internal.d.ts.map +1 -1
  237. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/lineRingBuffer.d.ts.map +1 -1
  238. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/pipes.d.ts.map +1 -1
  239. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/result.d.ts.map +1 -1
  240. package/node_modules/dax/{esm/deps/jsr.io/@david/shell/0.5.4 → script/deps/jsr.io/@david/shell/0.6.0}/src/shell.d.ts +5 -1
  241. package/node_modules/dax/script/deps/jsr.io/@david/shell/0.6.0/src/shell.d.ts.map +1 -0
  242. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/signal.d.ts.map +1 -1
  243. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/spawn.d.ts.map +1 -1
  244. package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/streams.d.ts.map +1 -1
  245. package/node_modules/dax/script/mod.d.ts +3 -3
  246. package/node_modules/dax/script/mod.js +105 -73
  247. package/node_modules/dax/script/src/common.d.ts +1 -1
  248. package/node_modules/dax/script/src/console/utils.d.ts +1 -1
  249. package/node_modules/dax/script/src/request.d.ts +2 -2
  250. package/package.json +3 -2
  251. package/lib/release/bump-version.task.js +0 -90
  252. package/node_modules/dax/esm/deps/jsr.io/@david/shell/0.5.4/src/lib/rs_lib.d.ts.map +0 -1
  253. package/node_modules/dax/esm/deps/jsr.io/@david/shell/0.5.4/src/shell.d.ts.map +0 -1
  254. package/node_modules/dax/script/deps/jsr.io/@david/shell/0.5.4/src/lib/rs_lib.d.ts.map +0 -1
  255. package/node_modules/dax/script/deps/jsr.io/@david/shell/0.5.4/src/shell.d.ts.map +0 -1
  256. /package/lib/release/{bump-version.task.d.ts → apply-version-bump.task.d.ts} +0 -0
  257. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/internal.d.ts +0 -0
  258. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/mod.d.ts +0 -0
  259. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/byteRingBuffer.d.ts +0 -0
  260. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/command.d.ts +0 -0
  261. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commandHandler.d.ts +0 -0
  262. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/args.d.ts +0 -0
  263. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/cat.d.ts +0 -0
  264. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/cd.d.ts +0 -0
  265. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/cpMv.d.ts +0 -0
  266. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/echo.d.ts +0 -0
  267. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/executable.d.ts +0 -0
  268. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/exit.d.ts +0 -0
  269. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/export.d.ts +0 -0
  270. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/mkdir.d.ts +0 -0
  271. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/printenv.d.ts +0 -0
  272. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/pwd.d.ts +0 -0
  273. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/rm.d.ts +0 -0
  274. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/set.d.ts +0 -0
  275. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/shopt.d.ts +0 -0
  276. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/sleep.d.ts +0 -0
  277. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/test.d.ts +0 -0
  278. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/touch.d.ts +0 -0
  279. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/unset.d.ts +0 -0
  280. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/which.d.ts +0 -0
  281. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/common.d.ts +0 -0
  282. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/dollar.d.ts +0 -0
  283. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/fsFile.d.ts +0 -0
  284. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/glob.d.ts +0 -0
  285. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/lib/rs_lib.d.ts +0 -0
  286. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/lib/rs_lib.internal.d.ts +0 -0
  287. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/lineRingBuffer.d.ts +0 -0
  288. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/pipes.d.ts +0 -0
  289. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/result.d.ts +0 -0
  290. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/signal.d.ts +0 -0
  291. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/spawn.d.ts +0 -0
  292. /package/node_modules/dax/esm/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/streams.d.ts +0 -0
  293. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/internal.d.ts +0 -0
  294. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/mod.d.ts +0 -0
  295. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/byteRingBuffer.d.ts +0 -0
  296. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/command.d.ts +0 -0
  297. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commandHandler.d.ts +0 -0
  298. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/args.d.ts +0 -0
  299. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/cat.d.ts +0 -0
  300. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/cd.d.ts +0 -0
  301. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/cpMv.d.ts +0 -0
  302. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/echo.d.ts +0 -0
  303. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/executable.d.ts +0 -0
  304. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/exit.d.ts +0 -0
  305. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/export.d.ts +0 -0
  306. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/mkdir.d.ts +0 -0
  307. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/printenv.d.ts +0 -0
  308. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/pwd.d.ts +0 -0
  309. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/rm.d.ts +0 -0
  310. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/set.d.ts +0 -0
  311. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/shopt.d.ts +0 -0
  312. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/sleep.d.ts +0 -0
  313. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/test.d.ts +0 -0
  314. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/touch.d.ts +0 -0
  315. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/unset.d.ts +0 -0
  316. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/commands/which.d.ts +0 -0
  317. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/common.d.ts +0 -0
  318. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/dollar.d.ts +0 -0
  319. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/fsFile.d.ts +0 -0
  320. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/glob.d.ts +0 -0
  321. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/lib/rs_lib.d.ts +0 -0
  322. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/lib/rs_lib.internal.d.ts +0 -0
  323. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/lineRingBuffer.d.ts +0 -0
  324. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/pipes.d.ts +0 -0
  325. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/result.d.ts +0 -0
  326. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/signal.d.ts +0 -0
  327. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/spawn.d.ts +0 -0
  328. /package/node_modules/dax/script/deps/jsr.io/@david/shell/{0.5.4 → 0.6.0}/src/streams.d.ts +0 -0
@@ -34,6 +34,8 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.TaskRuntime = void 0;
37
+ exports.systemShell = systemShell;
38
+ const child_process = __importStar(require("child_process"));
37
39
  const fs_1 = require("fs");
38
40
  const path_1 = require("path");
39
41
  const path = __importStar(require("path"));
@@ -156,7 +158,7 @@ class TaskRuntime {
156
158
  * Runs the task.
157
159
  * @param name The task name.
158
160
  */
159
- async runTask(name, parents = [], args = [], env = {}) {
161
+ async runTask(name, parents = [], args = [], env = {}, options = {}) {
160
162
  // A previously executed task (most importantly the "default"/synth task,
161
163
  // which `build` spawns first) may have regenerated `.projen/tasks.json`.
162
164
  // Pick up any such changes before resolving and running this task so we
@@ -166,7 +168,8 @@ class TaskRuntime {
166
168
  if (!task) {
167
169
  throw new Error(`cannot find command ${name}`);
168
170
  }
169
- await new RunTask(this, task, parents, args, env).run();
171
+ const runner = new RunTask(this, task, parents, args, env);
172
+ return options.captureOutput ? runner.runCapturingOutput() : runner.run();
170
173
  }
171
174
  /**
172
175
  * Re-reads the tasks manifest from disk if its contents changed since it was
@@ -228,6 +231,13 @@ class RunTask {
228
231
  env = {};
229
232
  parents;
230
233
  workdir;
234
+ // When set, every step's stdout is captured and accumulated (for a spawned
235
+ // task whose aggregate output the caller wants).
236
+ captureAll = false;
237
+ captured = [];
238
+ // `outputEnv` captures, propagated to spawned subtasks (exec/builtin steps
239
+ // see them via `this.env`).
240
+ capturedEnv = {};
231
241
  constructor(runtime, task, parents = [], args = [], envParam = {}) {
232
242
  this.runtime = runtime;
233
243
  this.task = task;
@@ -236,6 +246,29 @@ class RunTask {
236
246
  this.workdir = task.cwd ?? this.runtime.workdir;
237
247
  this.parents = parents;
238
248
  }
249
+ /**
250
+ * Runs the task, capturing and returning the trimmed, newline-joined stdout
251
+ * of all its steps (and any nested spawned tasks) in execution order.
252
+ */
253
+ async runCapturingOutput() {
254
+ this.captureAll = true;
255
+ await this.run();
256
+ return this.captured.join("\n").trim();
257
+ }
258
+ /**
259
+ * Records a step's captured (trimmed) stdout: into `outputEnv` for later
260
+ * steps (and propagated to spawned subtasks), and into the run's aggregate
261
+ * output when capturing everything.
262
+ */
263
+ recordCapture(outputEnv, value) {
264
+ if (outputEnv) {
265
+ this.env[outputEnv] = value;
266
+ this.capturedEnv[outputEnv] = value;
267
+ }
268
+ if (this.captureAll) {
269
+ this.captured.push(value);
270
+ }
271
+ }
239
272
  /**
240
273
  * Executes the task. This was previously done in the constructor, but is now
241
274
  * an async method since shell execution is asynchronous (e.g. dax on
@@ -288,7 +321,11 @@ class RunTask {
288
321
  logging.info(this.fmtLog(step.say));
289
322
  }
290
323
  if (step.spawn) {
291
- await this.runtime.runTask(step.spawn, [...this.parents, this.task.name], argsList, step.env);
324
+ const capture = this.captureAll || !!step.outputEnv;
325
+ const output = await this.runtime.runTask(step.spawn, [...this.parents, this.task.name], argsList, { ...this.capturedEnv, ...step.env }, { captureOutput: capture });
326
+ if (typeof output === "string") {
327
+ this.recordCapture(step.outputEnv, output);
328
+ }
292
329
  }
293
330
  const execs = step.exec ? [step.exec] : [];
294
331
  // Parse step-specific environment variables
@@ -337,6 +374,7 @@ class RunTask {
337
374
  }
338
375
  }
339
376
  const cwd = step.cwd;
377
+ const capture = this.captureAll || !!step.outputEnv;
340
378
  // A thrown error (e.g. spawn failure) propagates; a non-zero exit is
341
379
  // reported via `result.status`.
342
380
  const result = await this.shell({
@@ -344,10 +382,15 @@ class RunTask {
344
382
  cwd,
345
383
  extraEnv: env,
346
384
  shell: stepShell,
385
+ captureOutput: capture,
347
386
  });
348
387
  if (result.status !== 0) {
349
388
  throw new Error(`Task "${this.fullname}" failed when executing "${Array.isArray(command) ? command.join(" ") : command}" (cwd: ${(0, path_1.resolve)(cwd ?? this.workdir)})`);
350
389
  }
390
+ if (capture) {
391
+ const stdout = result.stdout?.toString("utf-8").trim() ?? "";
392
+ this.recordCapture(step.outputEnv, stdout);
393
+ }
351
394
  }
352
395
  }
353
396
  }
@@ -479,9 +522,10 @@ class RunTask {
479
522
  if (typeof shell === "string" && shell !== "projen" && shell !== "system") {
480
523
  throw new Error(`unknown built-in shell ${JSON.stringify(shell)}; use the built-in "projen" or "system" shells, or a TaskShell.command([...]) invocation`);
481
524
  }
482
- // stdout/stderr are captured only when asked (e.g. `$(...)` env eval);
483
- // otherwise they are inherited so output streams through.
484
525
  const capture = options.captureOutput ?? false;
526
+ // Quiet captures (`$(...)`, conditions) stay silent; visible captures
527
+ // (`outputEnv`) stream live while still buffering.
528
+ const stream = capture && !quiet;
485
529
  const command = options.command;
486
530
  const env = {
487
531
  ...process.env,
@@ -506,17 +550,25 @@ class RunTask {
506
550
  throw e;
507
551
  }
508
552
  }
509
- return (0, exec_1.systemShell)(command, { cwd, env, capture });
553
+ return systemShell(command, { cwd, env, capture, stream });
510
554
  }
511
555
  // Otherwise run through dax: the "projen" shell or an explicit invocation.
512
556
  const builder = this.buildDaxCommand(command, shell);
557
+ // `inheritPiped` streams and buffers; `piped` buffers quietly. stderr is
558
+ // buffered only for quiet captures, so it can surface in errors.
559
+ const stdoutMode = capture
560
+ ? stream
561
+ ? "inheritPiped"
562
+ : "piped"
563
+ : "inherit";
564
+ const stderrMode = capture && !stream ? "piped" : "inherit";
513
565
  let result;
514
566
  try {
515
567
  result = await builder
516
568
  .cwd(cwd)
517
569
  .env(env)
518
- .stdout(capture ? "piped" : "inherit")
519
- .stderr(capture ? "piped" : "inherit")
570
+ .stdout(stdoutMode)
571
+ .stderr(stderrMode)
520
572
  .noThrow();
521
573
  }
522
574
  catch (e) {
@@ -529,7 +581,7 @@ class RunTask {
529
581
  return {
530
582
  status: result.code,
531
583
  stdout: capture ? Buffer.from(result.stdoutBytes) : null,
532
- stderr: capture ? Buffer.from(result.stderrBytes) : null,
584
+ stderr: capture && !stream ? Buffer.from(result.stderrBytes) : null,
533
585
  };
534
586
  }
535
587
  /**
@@ -575,4 +627,41 @@ class RunTask {
575
627
  return `"${process.execPath}" "${program}"`;
576
628
  }
577
629
  }
578
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS90YXNrLXJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkJBQXdEO0FBQ3hELCtCQUE4QztBQUM5QywyQ0FBNkI7QUFDN0IsK0JBQThCO0FBQzlCLGlDQUF3QztBQUN4Qyw2QkFBd0I7QUFDeEIsc0NBQStEO0FBQy9ELG9EQUFzQztBQUV0Qyx1Q0FBaUQ7QUFFakQscUVBQXFFO0FBQ3JFLGdGQUFnRjtBQUNoRixnRkFBZ0Y7QUFDaEYsMkVBQTJFO0FBQzNFLG1FQUFtRTtBQUNuRSxpRUFBaUU7QUFDakUsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUMvRCxNQUFNLGlCQUFpQixHQUNyQix1QkFBdUIsRUFBRSxPQUFPLElBQUksdUJBQXVCLENBQUM7QUFFOUQsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQztBQUN6QixNQUFNLGtCQUFrQixHQUFHLElBQUksV0FBVyxHQUFHLENBQUM7QUFFOUM7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUFDLEdBQVc7SUFDM0IsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3ZELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsdUJBQXVCLENBQzlCLEtBQWMsRUFDZCxPQUEwQjtJQUUxQixNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3RDLG9CQUFvQjtRQUNwQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDekUsT0FBTyxJQUFJLEtBQUssQ0FDZCxtREFBbUQ7UUFDakQsS0FBSyxXQUFXLElBQUk7UUFDcEIsMEVBQTBFLENBQzdFLENBQUM7QUFDSixDQUFDO0FBOEJEOztHQUVHO0FBQ0gsTUFBYSxXQUFXO0lBQ3RCOztPQUVHO0lBQ0ksTUFBTSxDQUFVLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDcEQsbUJBQVUsRUFDVixZQUFZLENBQ2IsQ0FBQztJQUVGOzs7Ozs7Ozs7T0FTRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQWUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLFNBQVMsR0FBa0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFFakQ7OztPQUdHO0lBQ0ssU0FBUyxDQUFVO0lBRTNCOztPQUVHO0lBQ2EsT0FBTyxDQUFTO0lBRWhDLFlBQVksT0FBZTtRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUEsY0FBTyxFQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hDLHFFQUFxRTtRQUNyRSxXQUFXO1FBQ1gsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFZLFlBQVk7UUFDdEIsT0FBTyxJQUFBLFdBQUksRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLEtBQUs7UUFDZCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVyxDQUFDLElBQVk7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxPQUFPLENBQ2xCLElBQVksRUFDWixVQUFvQixFQUFFLEVBQ3RCLE9BQStCLEVBQUUsRUFDakMsTUFBa0MsRUFBRTtRQUVwQyx5RUFBeUU7UUFDekUseUVBQXlFO1FBQ3pFLHdFQUF3RTtRQUN4RSwrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFFL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxNQUFNLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssdUJBQXVCO1FBQzdCLElBQUksQ0FBQyxJQUFBLGVBQVUsRUFBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxvRUFBb0U7WUFDcEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUMzQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLElBQUEsaUJBQVksRUFBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsZ0NBQWdDO1FBQzFDLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBa0IsaUJBQWlCLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUU1RSxrRUFBa0U7UUFDbEUsd0VBQXdFO1FBQ3hFLDZDQUE2QztRQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQztRQUU5QyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBRXJCLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsS0FBSyxDQUNYLEdBQUcsV0FBVyxDQUFDLGFBQWEsK0RBQStELENBQzVGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxjQUFjLENBQUMsUUFBdUI7UUFDNUMsMEVBQTBFO1FBQzFFLFdBQVc7UUFDWCxJQUFJLFFBQVEsQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDM0MsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxlQUFlLEdBQUcsK0JBQXNCLEVBQUUsQ0FBQztZQUN0RCxPQUFPLENBQUMsSUFBSSxDQUNWLEdBQUcsV0FBVyxDQUFDLGFBQWEsOENBQThDO2dCQUN4RSxxQkFBcUIsUUFBUSxDQUFDLGVBQWUsZ0NBQWdDLCtCQUFzQixLQUFLO2dCQUN4RyxtRUFBbUUsQ0FDdEUsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDOztBQXRLSCxrQ0F1S0M7QUFFRCxNQUFNLE9BQU87SUFPUTtJQUNBO0lBRUE7SUFDQTtJQVZYLEdBQUcsR0FBMkMsRUFBRSxDQUFDO0lBQ3hDLE9BQU8sQ0FBVztJQUVsQixPQUFPLENBQVM7SUFFakMsWUFDbUIsT0FBb0IsRUFDcEIsSUFBYyxFQUMvQixVQUFvQixFQUFFLEVBQ0wsT0FBK0IsRUFBRSxFQUNqQyxXQUF1QyxFQUFFO1FBSnpDLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFDcEIsU0FBSSxHQUFKLElBQUksQ0FBVTtRQUVkLFNBQUksR0FBSixJQUFJLENBQTZCO1FBQ2pDLGFBQVEsR0FBUixRQUFRLENBQWlDO1FBRTFELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUNoRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxHQUFHO1FBQ2QsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBRXJDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBQSxZQUFJLEVBQUMsK0NBQStDLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FDdEMsSUFBSSxDQUFDLFFBQVEsRUFDYixPQUFPLEVBQ1AsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUNwQixDQUFDO1FBRUYsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25CLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlDLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsTUFBTSxPQUFPLEdBQ1gsRUFBRSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hFLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFBLFlBQUksRUFBQyxHQUFHLElBQUEsaUJBQVMsRUFBQyxLQUFLLENBQUMsS0FBSyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFFRCxxQkFBcUI7UUFDckIsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1lBQ3RELE9BQU87UUFDVCxDQUFDO1FBRUQsdURBQXVEO1FBQ3ZELE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQy9DLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDcEMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQ2IsMkNBQTJDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDL0QsQ0FBQztRQUNKLENBQUM7UUFFRCxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTFDLDBCQUEwQjtZQUMxQixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxDQUFDLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO2dCQUN0RCxTQUFTO1lBQ1gsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFhO2dCQUN6QixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3BCLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNsQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFFM0IsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDZixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUN4QixJQUFJLENBQUMsS0FBSyxFQUNWLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQ2pDLFFBQVEsRUFDUixJQUFJLENBQUMsR0FBRyxDQUNULENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQTZCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFckUsNENBQTRDO1lBQzVDLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVsRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFFRCwwRUFBMEU7WUFDMUUsMEVBQTBFO1lBQzFFLHlFQUF5RTtZQUN6RSwwRUFBMEU7WUFDMUUsd0VBQXdFO1lBQ3hFLHdFQUF3RTtZQUN4RSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO2dCQUMxQixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ25CLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNwQyxJQUFJLE9BQU8sS0FBSyxXQUFXLEVBQUUsQ0FBQzt3QkFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO3dCQUN2QixNQUFNLEdBQUcsSUFBSSxDQUFDO29CQUNoQixDQUFDO3lCQUFNLENBQUM7d0JBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDckIsQ0FBQztnQkFDSCxDQUFDO2dCQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDWixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7Z0JBQ3pCLENBQUM7Z0JBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixDQUFDO1lBRUQsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUVuQixxRUFBcUU7Z0JBQ3JFLHdFQUF3RTtnQkFDeEUsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDaEMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQzt3QkFDekMsK0RBQStEO3dCQUMvRCxtRUFBbUU7d0JBQ25FLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUN2QixrQkFBa0IsRUFDbEIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQ2pDLENBQUM7b0JBQ0osQ0FBQzt5QkFBTSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQzt3QkFDekMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDN0QsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE9BQU8sR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDN0MsQ0FBQztnQkFDSCxDQUFDO2dCQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQ3JCLHFFQUFxRTtnQkFDckUsZ0NBQWdDO2dCQUNoQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQzlCLE9BQU87b0JBQ1AsR0FBRztvQkFDSCxRQUFRLEVBQUUsR0FBRztvQkFDYixLQUFLLEVBQUUsU0FBUztpQkFDakIsQ0FBQyxDQUFDO2dCQUNILElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FDYixTQUFTLElBQUksQ0FBQyxRQUFRLDRCQUNwQixLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUMvQyxXQUFXLElBQUEsY0FBTyxFQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDM0MsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssS0FBSyxDQUFDLGFBQWEsQ0FDekIsVUFBK0IsRUFDL0IsS0FBd0I7UUFFeEIseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFBLFlBQUksRUFBQyxHQUFHLElBQUEsaUJBQVMsRUFBQyxXQUFXLENBQUMsS0FBSyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQztZQUM5QixPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVM7WUFDN0IsS0FBSyxFQUFFLElBQUk7WUFDWCxLQUFLO1NBQ04sQ0FBQyxDQUFDO1FBQ0gsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsZUFBZSxDQUMzQixHQUErQixFQUMvQixLQUF3QjtRQUV4QixNQUFNLE1BQU0sR0FBMkMsRUFBRSxDQUFDO1FBRTFELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3JELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQztvQkFDOUIsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsS0FBSyxFQUFFLElBQUk7b0JBQ1gsYUFBYSxFQUFFLElBQUk7b0JBQ25CLEtBQUs7aUJBQ04sQ0FBQyxDQUFDO2dCQUNILElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUs7d0JBQ3hCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUs7d0JBQ3BCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRTs0QkFDaEMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUU7NEJBQ2hDLDRCQUE0QixNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBRWhELE9BQU8sQ0FBQyxJQUFJLENBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FDVCxHQUFHLElBQUEsaUJBQVMsRUFBQyxHQUFHLENBQUMseUJBQXlCLEtBQUssK0ZBQStGLENBQy9JLENBQ0YsQ0FBQztvQkFDRixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFBLGlCQUFTLEVBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzRCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDOUQsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsa0JBQWtCLENBQzlCLFFBQW9DLEVBQ3BDLE9BQWlCLEVBQ2pCLEtBQXdCO1FBRXhCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFFMUMsMkNBQTJDO1FBQzNDLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDN0IsR0FBRyxHQUFHO2dCQUNKLEdBQUcsR0FBRztnQkFDTixHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQzthQUNqRCxDQUFDO1FBQ0osQ0FBQztRQUVELHFEQUFxRDtRQUNyRCxHQUFHLEdBQUc7WUFDSixHQUFHLEdBQUc7WUFDTixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ3hCLEdBQUcsUUFBUTtTQUNaLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7O09BR0c7SUFDSyxZQUFZLENBQUMsSUFBZTtRQUNsQyxPQUFPLENBQ0wsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUMxRSxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBWSxRQUFRO1FBQ2xCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVPLEdBQUcsQ0FBQyxHQUFHLElBQVc7UUFDeEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU8sUUFBUSxDQUFDLEdBQUcsSUFBVztRQUM3QixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTyxNQUFNLENBQUMsR0FBRyxJQUFXO1FBQzNCLE9BQU8sSUFBQSxhQUFNLEVBQUMsR0FBRyxJQUFBLGlCQUFTLEVBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFxQjtRQUN2QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztRQUNyQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1lBRWhDLEdBQUcsQ0FBQyxJQUFJLENBQ04sS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUM1QixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUMzQixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FDcEIsQ0FBQztZQUVGLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDcEMsQ0FBQztZQUVELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDeEMsSUFBSSxDQUFDLElBQUEsZUFBVSxFQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBQSxhQUFRLEVBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUNyRCxNQUFNLElBQUksS0FBSyxDQUNiLDBCQUEwQixHQUFHLGdDQUFnQyxDQUM5RCxDQUFDO1FBQ0osQ0FBQztRQUVELGdDQUFnQztRQUNoQyw4RUFBOEU7UUFDOUUsMkVBQTJFO1FBQzNFLDRFQUE0RTtRQUM1RSw4RUFBOEU7UUFDOUUsMkJBQTJCO1FBQzNCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDO1FBQ3hDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFFLE1BQU0sSUFBSSxLQUFLLENBQ2IsMEJBQTBCLElBQUksQ0FBQyxTQUFTLENBQ3RDLEtBQUssQ0FDTiwwRkFBMEYsQ0FDNUYsQ0FBQztRQUNKLENBQUM7UUFFRCx1RUFBdUU7UUFDdkUsMERBQTBEO1FBQzFELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDO1FBRS9DLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDaEMsTUFBTSxHQUFHLEdBQUc7WUFDVixHQUFHLE9BQU8sQ0FBQyxHQUFHO1lBQ2QsR0FBRyxJQUFJLENBQUMsR0FBRztZQUNYLEdBQUcsT0FBTyxDQUFDLFFBQVE7U0FDcEIsQ0FBQztRQUVGLHlFQUF5RTtRQUN6RSwwRUFBMEU7UUFDMUUsNkVBQTZFO1FBQzdFLDRFQUE0RTtRQUM1RSxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQztnQkFDbkMsSUFBSSxDQUFDO29CQUNILElBQUEsV0FBSSxFQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUMxRCxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUN2QixDQUFDO2dCQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7b0JBQ2hCLElBQUksT0FBTyxDQUFDLEVBQUUsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO3dCQUNsQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDOUIsQ0FBQztvQkFDRCxNQUFNLENBQUMsQ0FBQztnQkFDVixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sSUFBQSxrQkFBVyxFQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBRUQsMkVBQTJFO1FBQzNFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXJELElBQUksTUFBTSxDQUFDO1FBQ1gsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLE1BQU0sT0FBTztpQkFDbkIsR0FBRyxDQUFDLEdBQUcsQ0FBQztpQkFDUixHQUFHLENBQUMsR0FBRyxDQUFDO2lCQUNSLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2lCQUNyQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztpQkFDckMsT0FBTyxFQUFFLENBQUM7UUFDZixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLHlFQUF5RTtZQUN6RSx3RUFBd0U7WUFDeEUsdUVBQXVFO1lBQ3ZFLDhDQUE4QztZQUM5QyxNQUFNLHVCQUF1QixDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsT0FBTztZQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNuQixNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUN4RCxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtTQUN6RCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssZUFBZSxDQUNyQixPQUEwQixFQUMxQixLQUF3QjtRQUV4QixzRUFBc0U7UUFDdEUsMkVBQTJFO1FBQzNFLDRFQUE0RTtRQUM1RSxRQUFRO1FBQ1IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNsQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztnQkFDeEMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDakMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNaLE9BQU8sSUFBQSxPQUFDLEVBQUEsR0FBRyxPQUFPLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQ2xELENBQUM7UUFFRCxxQ0FBcUM7UUFDckMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUMzQixDQUFDLENBQUMsMkVBQTJFO2dCQUMzRSxJQUFBLE9BQUMsRUFBQSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3RDLENBQUMsQ0FBQyxtRUFBbUU7Z0JBQ25FLE9BQUMsQ0FBQyxHQUFHLENBQUEsR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRU8sYUFBYSxDQUFDLE9BQWU7UUFDbkMsMEVBQTBFO1FBQzFFLDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0UsdUVBQXVFO1FBQ3ZFLHdFQUF3RTtRQUN4RSxJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDM0IsT0FBTyxDQUFDLElBQUEsZUFBVSxFQUFDLElBQUEsV0FBSSxFQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckQsTUFBTSxNQUFNLEdBQUcsSUFBQSxjQUFPLEVBQUMsVUFBVSxDQUFDLENBQUM7WUFDbkMsSUFBSSxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztZQUM5RCxDQUFDO1lBQ0QsVUFBVSxHQUFHLE1BQU0sQ0FBQztRQUN0QixDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FDN0IsSUFBQSxXQUFJLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU8sVUFBVSxDQUFDLENBQzlDLENBQUM7UUFDRixPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsTUFBTSxPQUFPLEdBQUcsQ0FBQztJQUM5QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMsIHN0YXRTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luLCByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBncmF5LCB1bmRlcmxpbmUgfSBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7ICQgfSBmcm9tIFwiZGF4XCI7XG5pbXBvcnQgeyBQUk9KRU5fRElSLCBUQVNLU19NQU5JRkVTVF9WRVJTSU9OIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0ICogYXMgbG9nZ2luZyBmcm9tIFwiLi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHR5cGUgeyBUYXNrc01hbmlmZXN0LCBUYXNrU3BlYywgVGFza1N0ZXAgfSBmcm9tIFwiLi4vdGFzay1tb2RlbFwiO1xuaW1wb3J0IHsgc3lzdGVtU2hlbGwsIHRvb2wgfSBmcm9tIFwiLi4vdXRpbC9leGVjXCI7XG5cbi8vIGF2b2lkcyBhIChmYWxzZSBwb3NpdGl2ZSkgZXNidWlsZCB3YXJuaW5nIGFib3V0IGluY29ycmVjdCBpbXBvcnRzLlxuLy8gYD8uZGVmYXVsdCA/PyBtb2R1bGVgIGtlZXBzIHRoaXMgd29ya2luZyBib3RoIGFzIGEgcGxhaW4gQ29tbW9uSlMgcmVxdWlyZSBhbmRcbi8vIHdoZW4gdGhlIGRlcGVuZGVuY3kgaXMgaW50ZXJvcC13cmFwcGVkIGluc2lkZSB0aGUgYnVuZGxlZCBydW4tdGFzay5janMgKHdoZXJlXG4vLyBgcmVxdWlyZSguLi4pYCBtYXkgeWllbGQgYHsgZGVmYXVsdDogZm4gfWAgaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24pLiBTZWVcbi8vIHByb2plbiM0NDA3IChcInBhcnNlQ29uZmxpY3RKU09OIGlzIG5vdCBhIGZ1bmN0aW9uXCIgYWZ0ZXIgZWplY3QpLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IHBhcnNlQ29uZmxpY3RKU09OTW9kdWxlID0gcmVxdWlyZShcInBhcnNlLWNvbmZsaWN0LWpzb25cIik7XG5jb25zdCBwYXJzZUNvbmZsaWN0SlNPTiA9XG4gIHBhcnNlQ29uZmxpY3RKU09OTW9kdWxlPy5kZWZhdWx0ID8/IHBhcnNlQ29uZmxpY3RKU09OTW9kdWxlO1xuXG5jb25zdCBFTlZfVFJJTV9MRU4gPSAyMDtcbmNvbnN0IEFSR1NfTUFSS0VSID0gXCIkQFwiO1xuY29uc3QgUVVPVEVEX0FSR1NfTUFSS0VSID0gYFwiJHtBUkdTX01BUktFUn1cImA7XG5cbi8qKlxuICogRG91YmxlLXF1b3RlcyBhIHNpbmdsZSBhcmd1bWVudCBzbyBpdCBpcyBwYXNzZWQgdGhyb3VnaCB2ZXJiYXRpbSwgZXNjYXBpbmcgdGhlXG4gKiBjaGFyYWN0ZXJzIHRoYXQgc3RheSBzcGVjaWFsIGluc2lkZSBkb3VibGUgcXVvdGVzLiAoRG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZTpcbiAqIGRheCdzIHNoZWxsIGxhY2tzIHRoZSBQT1NJWCBgJ1xcJydgIGVzY2FwZS4pXG4gKi9cbmZ1bmN0aW9uIHF1b3RlQXJnKGFyZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuICdcIicgKyBhcmcucmVwbGFjZSgvKFtcIiRgXFxcXF0pL2csIFwiXFxcXCQxXCIpICsgJ1wiJztcbn1cblxuLyoqXG4gKiBkYXgncyBidWlsdC1pbiBjcm9zcy1wbGF0Zm9ybSBzaGVsbCBvbmx5IGltcGxlbWVudHMgYSBzdWJzZXQgb2YgUE9TSVggc2hlbGxcbiAqIHN5bnRheCBhbmQgdGhyb3dzIGEgdGVyc2UgYE5vdCBpbXBsZW1lbnRlZDogLi4uYCBmb3IgdGhlIHJlc3QuIFJld3JpdGUgdGhvc2VcbiAqIGludG8gYSBzaG9ydCwgYWN0aW9uYWJsZSBlcnJvciB0aGF0IHBvaW50cyBhdCB0aGUgc3lzdGVtLXNoZWxsIGVzY2FwZSBoYXRjaDtcbiAqIHBhc3MgZXZlcnkgb3RoZXIgZXJyb3IgdGhyb3VnaCB1bmNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGVucmljaEJ1aWx0aW5TaGVsbEVycm9yKFxuICBlcnJvcjogdW5rbm93bixcbiAgY29tbWFuZDogc3RyaW5nIHwgc3RyaW5nW10sXG4pOiB1bmtub3duIHtcbiAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgaWYgKCEvTm90IGltcGxlbWVudGVkOi8udGVzdChtZXNzYWdlKSkge1xuICAgIC8qIHY4IGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgY29uc3QgY29tbWFuZExpbmUgPSBBcnJheS5pc0FycmF5KGNvbW1hbmQpID8gY29tbWFuZC5qb2luKFwiIFwiKSA6IGNvbW1hbmQ7XG4gIHJldHVybiBuZXcgRXJyb3IoXG4gICAgXCJwcm9qZW4ncyBidWlsdC1pbiBzaGVsbCBjYW4ndCBydW4gdGhpcyBjb21tYW5kOlxcblwiICtcbiAgICAgIGAgICR7Y29tbWFuZExpbmV9XFxuYCArXG4gICAgICBcIlRvIHVzZSB5b3VyIHN5c3RlbSdzIHNoZWxsIGluc3RlYWQsIHNldCB0aGlzIHRhc2sgdG8gVGFza1NoZWxsLnN5c3RlbSgpLlwiLFxuICApO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZWQgcmVzdWx0IG9mIGBzaGVsbCgpYCAoYSBzdWJzZXQgb2Ygbm9kZSdzIGBTcGF3blN5bmNSZXR1cm5zYCkuXG4gKi9cbmludGVyZmFjZSBTaGVsbFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgZXhpdCBjb2RlIG9mIHRoZSBjb21tYW5kLCBvciBgbnVsbGAgaWYgdGhlIHByb2Nlc3Mgd2FzIHRlcm1pbmF0ZWQgYnkgYVxuICAgKiBzaWduYWwgb3IgbmV2ZXIgc3Bhd25lZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ2FwdHVyZWQgc3Rkb3V0LiBPbmx5IHBvcHVsYXRlZCB3aGVuIHN0ZG91dCBpcyBwaXBlZCAoZS5nLiB3aGVuIGV2YWx1YXRpbmdcbiAgICogZW52aXJvbm1lbnQgdmFyaWFibGVzKTsgYG51bGxgL2B1bmRlZmluZWRgIHdoZW4gc3RkaW8gaXMgaW5oZXJpdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3Rkb3V0PzogQnVmZmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ2FwdHVyZWQgc3RkZXJyLiBTZWUgYHN0ZG91dGAuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI/OiBCdWZmZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBlcnJvciByYWlzZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBzcGF3biB0aGUgY29tbWFuZCAobm90IGEgbm9uLXplcm8gZXhpdFxuICAgKiBjb2RlLCB3aGljaCBpcyByZXBvcnRlZCB2aWEgYHN0YXR1c2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3I/OiBFcnJvcjtcbn1cblxuLyoqXG4gKiBUaGUgcnVudGltZSBjb21wb25lbnQgb2YgdGhlIHRhc2tzIGVuZ2luZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tSdW50aW1lIHtcbiAgLyoqXG4gICAqIFRoZSBwcm9qZWN0LXJlbGF0aXZlIHBhdGggb2YgdGhlIHRhc2tzIG1hbmlmZXN0IGZpbGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1BTklGRVNUX0ZJTEUgPSBwYXRoLnBvc2l4LmpvaW4oXG4gICAgUFJPSkVOX0RJUixcbiAgICBcInRhc2tzLmpzb25cIixcbiAgKTtcblxuICAvKipcbiAgICogT25lLXNob3QgZW50cnlwb2ludCBmb3IgdGhlIHN0YW5kYWxvbmUgdGFzayBydW5uZXIuXG4gICAqXG4gICAqIENyZWF0ZXMgYSBydW50aW1lIHJvb3RlZCBhdCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgcnVucyB0aGUgbmFtZWRcbiAgICogdGFzaywgYW5kIGNvbnZlcnRzIGFueSBmYWlsdXJlIGludG8gYSBub24temVybyBwcm9jZXNzIGV4aXQgY29kZS4gVGhpcyBpc1xuICAgKiB0aGUgc2luZ2xlIGxpbmUgaW52b2tlZCBieSB0aGUgYnVuZGxlZCBgc2NyaXB0cy9ydW4tdGFzay5janNgIHRoYXRcbiAgICogXCJwcm9qZW4gZWplY3RcIiBlbWl0cywgd2hpY2gga2VlcHMgdGhlIGdlbmVyYXRlZCBidW5kbGUgZm9vdGVyIHRyaXZpYWwuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0YXNrIHRvIHJ1bi4gRGVmYXVsdHMgdG8gYHByb2Nlc3MuYXJndlsyXWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIG1haW4obmFtZTogc3RyaW5nID0gcHJvY2Vzcy5hcmd2WzJdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldyBUYXNrUnVudGltZShcIi5cIikucnVuVGFzayhuYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZT8uc3RhY2sgPz8gU3RyaW5nKGUpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIG9mIHRhc2tzLmpzb25cbiAgICovXG4gIHByaXZhdGUgX21hbmlmZXN0OiBUYXNrc01hbmlmZXN0ID0geyB0YXNrczoge30gfTtcblxuICAvKipcbiAgICogVGhlIHJhdyBjb250ZW50cyBvZiB0aGUgY3VycmVudGx5IGxvYWRlZCBtYW5pZmVzdCwgdXNlZCB0byBkZXRlY3QgY2hhbmdlc1xuICAgKiBvbiBkaXNrIHNvIHRoZSBydW50aW1lIGNhbiByZWxvYWQgYSByZWdlbmVyYXRlZCBtYW5pZmVzdCBtaWQtcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBfaWRlbnRpdHk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCBhbmQgdGhlIGN3ZCBmb3IgZXhlY3V0aW5nIHRhc2tzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtkaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih3b3JrZGlyOiBzdHJpbmcpIHtcbiAgICB0aGlzLndvcmtkaXIgPSByZXNvbHZlKHdvcmtkaXIpO1xuICAgIC8vIFBlcmZvcm0gdGhlIGluaXRpYWwgbG9hZC4gVGhpcyBhbHNvIHZlcmlmaWVzIHRoZSBtYW5pZmVzdCdzIHNjaGVtYVxuICAgIC8vIHZlcnNpb24uXG4gICAgdGhpcy5yZWxvYWRNYW5pZmVzdElmQ2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0YXNrcy5qc29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1hbmlmZXN0KCk6IFRhc2tzTWFuaWZlc3Qge1xuICAgIHJldHVybiB0aGlzLl9tYW5pZmVzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdGFza3MgbWFuaWZlc3QgZmlsZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0IG1hbmlmZXN0UGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBqb2luKHRoaXMud29ya2RpciwgVGFza1J1bnRpbWUuTUFOSUZFU1RfRklMRSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRhc2tzIGluIHRoaXMgcHJvamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdGFza3MoKTogVGFza1NwZWNbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5tYW5pZmVzdC50YXNrcyA/PyB7fSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIHRhc2sgYnkgbmFtZSwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLlxuICAgKi9cbiAgcHVibGljIHRyeUZpbmRUYXNrKG5hbWU6IHN0cmluZyk6IFRhc2tTcGVjIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMubWFuaWZlc3QudGFza3MpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hbmlmZXN0LnRhc2tzW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHRhc2suXG4gICAqIEBwYXJhbSBuYW1lIFRoZSB0YXNrIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcnVuVGFzayhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBhcmdzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW10sXG4gICAgZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBIHByZXZpb3VzbHkgZXhlY3V0ZWQgdGFzayAobW9zdCBpbXBvcnRhbnRseSB0aGUgXCJkZWZhdWx0XCIvc3ludGggdGFzayxcbiAgICAvLyB3aGljaCBgYnVpbGRgIHNwYXducyBmaXJzdCkgbWF5IGhhdmUgcmVnZW5lcmF0ZWQgYC5wcm9qZW4vdGFza3MuanNvbmAuXG4gICAgLy8gUGljayB1cCBhbnkgc3VjaCBjaGFuZ2VzIGJlZm9yZSByZXNvbHZpbmcgYW5kIHJ1bm5pbmcgdGhpcyB0YXNrIHNvIHdlXG4gICAgLy8gbmV2ZXIgZXhlY3V0ZSBhIHN0YWxlLCBpbi1tZW1vcnkgZGVmaW5pdGlvbi5cbiAgICB0aGlzLnJlbG9hZE1hbmlmZXN0SWZDaGFuZ2VkKCk7XG5cbiAgICBjb25zdCB0YXNrID0gdGhpcy50cnlGaW5kVGFzayhuYW1lKTtcbiAgICBpZiAoIXRhc2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2Fubm90IGZpbmQgY29tbWFuZCAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFJ1blRhc2sodGhpcywgdGFzaywgcGFyZW50cywgYXJncywgZW52KS5ydW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1yZWFkcyB0aGUgdGFza3MgbWFuaWZlc3QgZnJvbSBkaXNrIGlmIGl0cyBjb250ZW50cyBjaGFuZ2VkIHNpbmNlIGl0IHdhc1xuICAgKiBsYXN0IGxvYWRlZCwgdmVyaWZ5aW5nIGl0cyBzY2hlbWEgdmVyc2lvbiBhbG9uZyB0aGUgd2F5LlxuICAgKlxuICAgKiBDaGFuZ2UgZGV0ZWN0aW9uIGNvbXBhcmVzIHRoZSByYXcgZmlsZSBjb250ZW50cywgc28gYW4gdW5jaGFuZ2VkIG1hbmlmZXN0XG4gICAqIGlzIG5vdCByZS12ZXJpZmllZCBvciByZS1hZG9wdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWxvYWRNYW5pZmVzdElmQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAoIWV4aXN0c1N5bmModGhpcy5tYW5pZmVzdFBhdGgpKSB7XG4gICAgICAvLyBObyBtYW5pZmVzdCBvbiBkaXNrOiB0cmVhdCBhcyBhbiBlbXB0eSBwcm9qZWN0IChsZWdhY3kgYmVoYXZpb3IpLlxuICAgICAgdGhpcy5fbWFuaWZlc3QgPSB7IHRhc2tzOiB7fSB9O1xuICAgICAgdGhpcy5faWRlbnRpdHkgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmF3ID0gcmVhZEZpbGVTeW5jKHRoaXMubWFuaWZlc3RQYXRoLCBcInV0Zi04XCIpO1xuICAgIGlmIChyYXcgPT09IHRoaXMuX2lkZW50aXR5KSB7XG4gICAgICByZXR1cm47IC8vIHVuY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBsb2FkXG4gICAgfVxuXG4gICAgY29uc3QgbWFuaWZlc3Q6IFRhc2tzTWFuaWZlc3QgPSBwYXJzZUNvbmZsaWN0SlNPTihyYXcsIHVuZGVmaW5lZCwgXCJ0aGVpcnNcIik7XG5cbiAgICAvLyBBIHByZXZpb3VzbHkgbG9hZGVkIG1hbmlmZXN0IG1lYW5zIHRoaXMgaXMgYSAqcmVsb2FkKiAoZS5nLiB0aGVcbiAgICAvLyBcImRlZmF1bHRcIi9zeW50aCB0YXNrIHJlZ2VuZXJhdGVkIHRoZSBmaWxlIG1pZC1ydW4pLCBhcyBvcHBvc2VkIHRvIHRoZVxuICAgIC8vIGluaXRpYWwgbG9hZCBwZXJmb3JtZWQgYnkgdGhlIGNvbnN0cnVjdG9yLlxuICAgIGNvbnN0IGlzUmVsb2FkID0gdGhpcy5faWRlbnRpdHkgIT09IHVuZGVmaW5lZDtcblxuICAgIHRoaXMudmVyaWZ5TWFuaWZlc3QobWFuaWZlc3QpO1xuICAgIHRoaXMuX21hbmlmZXN0ID0gbWFuaWZlc3Q7XG4gICAgdGhpcy5faWRlbnRpdHkgPSByYXc7XG5cbiAgICBpZiAoaXNSZWxvYWQpIHtcbiAgICAgIGxvZ2dpbmcuZGVidWcoXG4gICAgICAgIGAke1Rhc2tSdW50aW1lLk1BTklGRVNUX0ZJTEV9IGNoYW5nZWQgb24gZGlzazsgc3VjY2Vzc2Z1bGx5IGxvYWRlZCB0aGUgbmV3IHRhc2tzIG1hbmlmZXN0LmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSBmcmVzaGx5IHJlYWQgbWFuaWZlc3Q6XG4gICAqXG4gICAqIC0gTGVnYWN5IG1hbmlmZXN0cyAobm8gYG1hbmlmZXN0VmVyc2lvbmApIGFyZSBhY2NlcHRlZCBhcy1pcyBmb3IgYmFja3dhcmRzXG4gICAqICAgY29tcGF0aWJpbGl0eS5cbiAgICogLSBNYW5pZmVzdHMgZnJvbSBhIG5ld2VyIHByb2plbiAoYSBoaWdoZXIgYG1hbmlmZXN0VmVyc2lvbmApIGFyZSBhY2NlcHRlZFxuICAgKiAgIHdpdGggYSB3YXJuaW5nLCBzaW5jZSB0aGlzIHJ1bnRpbWUgbWF5IG5vdCB1bmRlcnN0YW5kIHRoZSBzY2hlbWEuXG4gICAqL1xuICBwcml2YXRlIHZlcmlmeU1hbmlmZXN0KG1hbmlmZXN0OiBUYXNrc01hbmlmZXN0KTogdm9pZCB7XG4gICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IG1hbmlmZXN0cyBnZW5lcmF0ZWQgYmVmb3JlIHZlcnNpb25pbmcgY2Fycnkgbm9cbiAgICAvLyB2ZXJzaW9uLlxuICAgIGlmIChtYW5pZmVzdC5tYW5pZmVzdFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtYW5pZmVzdC5tYW5pZmVzdFZlcnNpb24gPiBUQVNLU19NQU5JRkVTVF9WRVJTSU9OKSB7XG4gICAgICBsb2dnaW5nLndhcm4oXG4gICAgICAgIGAke1Rhc2tSdW50aW1lLk1BTklGRVNUX0ZJTEV9IHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb2plbiBgICtcbiAgICAgICAgICBgKG1hbmlmZXN0IHZlcnNpb24gJHttYW5pZmVzdC5tYW5pZmVzdFZlcnNpb259LCB0aGlzIHByb2plbiBzdXBwb3J0cyB1cCB0byAke1RBU0tTX01BTklGRVNUX1ZFUlNJT059KS4gYCArXG4gICAgICAgICAgYFNvbWUgdGFza3MgbWF5IG5vdCBiZWhhdmUgYXMgZXhwZWN0ZWQ7IGNvbnNpZGVyIHVwZ3JhZGluZyBwcm9qZW4uYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFJ1blRhc2sge1xuICBwcml2YXRlIGVudjogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRzOiBzdHJpbmdbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHdvcmtkaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJ1bnRpbWU6IFRhc2tSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFzazogVGFza1NwZWMsXG4gICAgcGFyZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFyZ3M6IEFycmF5PHN0cmluZyB8IG51bWJlcj4gPSBbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVudlBhcmFtOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLndvcmtkaXIgPSB0YXNrLmN3ZCA/PyB0aGlzLnJ1bnRpbWUud29ya2RpcjtcbiAgICB0aGlzLnBhcmVudHMgPSBwYXJlbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSB0YXNrLiBUaGlzIHdhcyBwcmV2aW91c2x5IGRvbmUgaW4gdGhlIGNvbnN0cnVjdG9yLCBidXQgaXMgbm93XG4gICAqIGFuIGFzeW5jIG1ldGhvZCBzaW5jZSBzaGVsbCBleGVjdXRpb24gaXMgYXN5bmNocm9ub3VzIChlLmcuIGRheCBvblxuICAgKiBXaW5kb3dzKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB0YXNrLCBhcmdzLCBwYXJlbnRzIH0gPSB0aGlzO1xuXG4gICAgaWYgKCF0YXNrLnN0ZXBzIHx8IHRhc2suc3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvZ0RlYnVnKGdyYXkoXCJObyBhY3Rpb25zIGhhdmUgYmVlbiBzcGVjaWZpZWQgZm9yIHRoaXMgdGFzay5cIikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZW52ID0gYXdhaXQgdGhpcy5yZXNvbHZlRW52aXJvbm1lbnQoXG4gICAgICB0aGlzLmVudlBhcmFtLFxuICAgICAgcGFyZW50cyxcbiAgICAgIHRoaXMucmVzb2x2ZVNoZWxsKCksXG4gICAgKTtcblxuICAgIGNvbnN0IGVudmxvZ3MgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudikpIHtcbiAgICAgIGNvbnN0IHZ2ID0gdiA/PyBcIlwiO1xuICAgICAgY29uc3QgdHJpbW1lZCA9XG4gICAgICAgIHZ2Lmxlbmd0aCA+IEVOVl9UUklNX0xFTiA/IHZ2LnN1YnN0cmluZygwLCBFTlZfVFJJTV9MRU4pICsgXCIuLi5cIiA6IHZ2O1xuICAgICAgZW52bG9ncy5wdXNoKGAke2t9PSR7dHJpbW1lZH1gKTtcbiAgICB9XG5cbiAgICBpZiAoZW52bG9ncy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubG9nRGVidWcoZ3JheShgJHt1bmRlcmxpbmUoXCJlbnZcIil9OiAke2VudmxvZ3Muam9pbihcIiBcIil9YCkpO1xuICAgIH1cblxuICAgIC8vIGV2YWx1YXRlIGNvbmRpdGlvblxuICAgIGlmICghKGF3YWl0IHRoaXMuZXZhbENvbmRpdGlvbih0YXNrLCB0aGlzLnJlc29sdmVTaGVsbCgpKSkpIHtcbiAgICAgIHRoaXMubG9nKFwiY29uZGl0aW9uIGV4aXRlZCB3aXRoIG5vbi16ZXJvIC0gc2tpcHBpbmdcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdmVyaWZ5IHdlIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgZGVmaW5lZFxuICAgIGNvbnN0IG1lcmdlZCA9IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRoaXMuZW52IH07XG4gICAgY29uc3QgbWlzc2luZyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRhc2sucmVxdWlyZWRFbnYgPz8gW10pIHtcbiAgICAgIGlmICghKG5hbWUgaW4gbWVyZ2VkKSkge1xuICAgICAgICBtaXNzaW5nLnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgbWlzc2luZyByZXF1aXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6ICR7bWlzc2luZy5qb2luKFwiLFwiKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgdGFzay5zdGVwcykge1xuICAgICAgY29uc3Qgc3RlcFNoZWxsID0gdGhpcy5yZXNvbHZlU2hlbGwoc3RlcCk7XG5cbiAgICAgIC8vIGV2YWx1YXRlIHN0ZXAgY29uZGl0aW9uXG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmV2YWxDb25kaXRpb24oc3RlcCwgc3RlcFNoZWxsKSkpIHtcbiAgICAgICAgdGhpcy5sb2coXCJjb25kaXRpb24gZXhpdGVkIHdpdGggbm9uLXplcm8gLSBza2lwcGluZ1wiKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFyZ3NMaXN0OiBzdHJpbmdbXSA9IFtcbiAgICAgICAgLi4uKHN0ZXAuYXJncyB8fCBbXSksXG4gICAgICAgIC4uLihzdGVwLnJlY2VpdmVBcmdzID8gYXJncyA6IFtdKSxcbiAgICAgIF0ubWFwKChhKSA9PiBhLnRvU3RyaW5nKCkpO1xuXG4gICAgICBpZiAoc3RlcC5zYXkpIHtcbiAgICAgICAgbG9nZ2luZy5pbmZvKHRoaXMuZm10TG9nKHN0ZXAuc2F5KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGVwLnNwYXduKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucnVudGltZS5ydW5UYXNrKFxuICAgICAgICAgIHN0ZXAuc3Bhd24sXG4gICAgICAgICAgWy4uLnRoaXMucGFyZW50cywgdGhpcy50YXNrLm5hbWVdLFxuICAgICAgICAgIGFyZ3NMaXN0LFxuICAgICAgICAgIHN0ZXAuZW52LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGVjczogQXJyYXk8c3RyaW5nIHwgc3RyaW5nW10+ID0gc3RlcC5leGVjID8gW3N0ZXAuZXhlY10gOiBbXTtcblxuICAgICAgLy8gUGFyc2Ugc3RlcC1zcGVjaWZpYyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZXZhbEVudmlyb25tZW50KHN0ZXAuZW52ID8/IHt9LCBzdGVwU2hlbGwpO1xuXG4gICAgICBpZiAoc3RlcC5idWlsdGluKSB7XG4gICAgICAgIGV4ZWNzLnB1c2godGhpcy5yZW5kZXJCdWlsdGluKHN0ZXAuYnVpbHRpbikpO1xuICAgICAgfVxuXG4gICAgICAvLyBgZXhlY0FyZ3NgIGlzIGFuIGV4cGxpY2l0IGFyZ3YgKHRoZSBwcm9ncmFtIGZvbGxvd2VkIGJ5IGl0cyBhcmd1bWVudHMpLlxuICAgICAgLy8gSXQgaXMgaGFuZGVkIHRvIGBzaGVsbCgpYCBhcyBhbiBhcnJheSByYXRoZXIgdGhhbiBhIHJlbmRlcmVkIHN0cmluZywgc29cbiAgICAgIC8vIGl0IHJ1bnMgd2l0aG91dCBhIHNoZWxsIGFuZCBldmVyeSBlbGVtZW50IGlzIHBhc3NlZCB0aHJvdWdoIHZlcmJhdGltIC1cbiAgICAgIC8vIHdoaWNoIGlzIHdoYXQgbGV0cyBjYWxsZXJzIGF2b2lkIHRoaW5raW5nIGFib3V0IHF1b3RpbmcuIEZpeGVkL3JlY2VpdmVkXG4gICAgICAvLyBhcmdzIGFyZSBzcGxpY2VkIGluIHdoZXJldmVyIGEgYCRAYCBtYXJrZXIgZWxlbWVudCBhcHBlYXJzIChtaXJyb3JpbmdcbiAgICAgIC8vIHRoZSBzdHJpbmcgYGV4ZWNgIGJlaGF2aW9yKSwgb3IgYXBwZW5kZWQgYXQgdGhlIGVuZCBpZiB0aGVyZSBpcyBub25lLlxuICAgICAgaWYgKHN0ZXAuZXhlY0FyZ3MpIHtcbiAgICAgICAgY29uc3QgYXJndjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IHBsYWNlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygc3RlcC5leGVjQXJncykge1xuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBBUkdTX01BUktFUikge1xuICAgICAgICAgICAgYXJndi5wdXNoKC4uLmFyZ3NMaXN0KTtcbiAgICAgICAgICAgIHBsYWNlZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFyZ3YucHVzaChlbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwbGFjZWQpIHtcbiAgICAgICAgICBhcmd2LnB1c2goLi4uYXJnc0xpc3QpO1xuICAgICAgICB9XG4gICAgICAgIGV4ZWNzLnB1c2goYXJndik7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZXhlYyBvZiBleGVjcykge1xuICAgICAgICBsZXQgY29tbWFuZCA9IGV4ZWM7XG5cbiAgICAgICAgLy8gQSBzdHJpbmcgY29tbWFuZCBpcyBhIHNoZWxsIGxpbmU6IHNwbGljZSB0YXNrIGFyZ3MgaW4gcGVyIHRoZSBgJEBgXG4gICAgICAgIC8vIG1hcmtlciBydWxlcy4gQW4gYGV4ZWNBcmdzYCBhcmd2IGFscmVhZHkgY2FycmllcyBpdHMgYXJncywgdW50b3VjaGVkLlxuICAgICAgICBpZiAodHlwZW9mIGNvbW1hbmQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBpZiAoY29tbWFuZC5pbmNsdWRlcyhRVU9URURfQVJHU19NQVJLRVIpKSB7XG4gICAgICAgICAgICAvLyBgXCIkQFwiYDogc3BsaWNlIGVhY2ggYXJnIGluIGFzIGEgc2VwYXJhdGUgdmVyYmF0aW0gd29yZCAobGlrZVxuICAgICAgICAgICAgLy8gYmFzaCdzIHF1b3RlZCBgXCIkQFwiYCksIHNvIHdoaXRlc3BhY2UgYW5kIG1ldGFjaGFyYWN0ZXJzIHN1cnZpdmUuXG4gICAgICAgICAgICBjb21tYW5kID0gY29tbWFuZC5yZXBsYWNlKFxuICAgICAgICAgICAgICBRVU9URURfQVJHU19NQVJLRVIsXG4gICAgICAgICAgICAgIGFyZ3NMaXN0Lm1hcChxdW90ZUFyZykuam9pbihcIiBcIiksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5pbmNsdWRlcyhBUkdTX01BUktFUikpIHtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLnJlcGxhY2UoQVJHU19NQVJLRVIsIGFyZ3NMaXN0LmpvaW4oXCIgXCIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tbWFuZCA9IFtjb21tYW5kLCAuLi5hcmdzTGlzdF0uam9pbihcIiBcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3dkID0gc3RlcC5jd2Q7XG4gICAgICAgIC8vIEEgdGhyb3duIGVycm9yIChlLmcuIHNwYXduIGZhaWx1cmUpIHByb3BhZ2F0ZXM7IGEgbm9uLXplcm8gZXhpdCBpc1xuICAgICAgICAvLyByZXBvcnRlZCB2aWEgYHJlc3VsdC5zdGF0dXNgLlxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNoZWxsKHtcbiAgICAgICAgICBjb21tYW5kLFxuICAgICAgICAgIGN3ZCxcbiAgICAgICAgICBleHRyYUVudjogZW52LFxuICAgICAgICAgIHNoZWxsOiBzdGVwU2hlbGwsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUYXNrIFwiJHt0aGlzLmZ1bGxuYW1lfVwiIGZhaWxlZCB3aGVuIGV4ZWN1dGluZyBcIiR7XG4gICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY29tbWFuZCkgPyBjb21tYW5kLmpvaW4oXCIgXCIpIDogY29tbWFuZFxuICAgICAgICAgICAgfVwiIChjd2Q6ICR7cmVzb2x2ZShjd2QgPz8gdGhpcy53b3JrZGlyKX0pYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgYSB0YXNrIHNob3VsZCBiZSBleGVjdXRlZCBiYXNlZCBvbiBcImNvbmRpdGlvblwiLlxuICAgKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIHNob3VsZCBiZSBleGVjdXRlZCBvciBmYWxzZSBpZiB0aGUgY29uZGl0aW9uXG4gICAqIGV2YWx1YXRlcyB0byBmYWxzZSAoZXhpdHMgd2l0aCBub24temVybyksIGluZGljYXRpbmcgdGhhdCB0aGUgdGFzayBzaG91bGRcbiAgICogYmUgc2tpcHBlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXZhbENvbmRpdGlvbihcbiAgICB0YXNrT3JTdGVwOiBUYXNrU3BlYyB8IFRhc2tTdGVwLFxuICAgIHNoZWxsOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKSB7XG4gICAgLy8gbm8gY29uZGl0aW9uLCBjYXJyeSBvblxuICAgIGlmICghdGFza09yU3RlcC5jb25kaXRpb24pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMubG9nKGdyYXkoYCR7dW5kZXJsaW5lKFwiY29uZGl0aW9uXCIpfTogJHt0YXNrT3JTdGVwLmNvbmRpdGlvbn1gKSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaGVsbCh7XG4gICAgICBjb21tYW5kOiB0YXNrT3JTdGVwLmNvbmRpdGlvbixcbiAgICAgIHF1aWV0OiB0cnVlLFxuICAgICAgc2hlbGwsXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBzaGVsbCBjb21tYW5kcyAoZS5nLiBgJCh4eClgKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBldmFsRW52aXJvbm1lbnQoXG4gICAgZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgICBzaGVsbDogc3RyaW5nIHwgc3RyaW5nW10sXG4gICkge1xuICAgIGNvbnN0IG91dHB1dDogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudiA/PyB7fSkpIHtcbiAgICAgIGlmIChTdHJpbmcodmFsdWUpLnN0YXJ0c1dpdGgoXCIkKFwiKSAmJiBTdHJpbmcodmFsdWUpLmVuZHNXaXRoKFwiKVwiKSkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IHZhbHVlLnN1YnN0cmluZygyLCB2YWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaGVsbCh7XG4gICAgICAgICAgY29tbWFuZDogcXVlcnksXG4gICAgICAgICAgcXVpZXQ6IHRydWUsXG4gICAgICAgICAgY2FwdHVyZU91dHB1dDogdHJ1ZSxcbiAgICAgICAgICBzaGVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQuZXJyb3JcbiAgICAgICAgICAgID8gcmVzdWx0LmVycm9yLnN0YWNrXG4gICAgICAgICAgICA6IHJlc3VsdC5zdGRlcnI/LnRvU3RyaW5nKCkudHJpbSgpIHx8XG4gICAgICAgICAgICAgIHJlc3VsdC5zdGRvdXQ/LnRvU3RyaW5nKCkudHJpbSgpIHx8XG4gICAgICAgICAgICAgIGBjb21tYW5kIGV4aXRlZCB3aXRoIGNvZGUgJHtyZXN1bHQuc3RhdHVzfWA7XG5cbiAgICAgICAgICBsb2dnaW5nLndhcm4oXG4gICAgICAgICAgICB0aGlzLmZtdExvZyhcbiAgICAgICAgICAgICAgYCR7dW5kZXJsaW5lKGtleSl9OiB1bmFibGUgdG8gZXZhbHVhdGUgXCIke3F1ZXJ5fVwiLiBFbnZpcm9ubWVudCB2YXJpYWJsZSB3aWxsIGJlIHNraXBwZWQuIENoZWNrIHRoYXQgdGhlIGNvbW1hbmQgZXhpc3RzIGFuZCBydW5zIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZ2dpbmcud2Fybih0aGlzLmZtdExvZyhgJHt1bmRlcmxpbmUoa2V5KX06ICR7ZXJyb3J9YCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dHB1dFtrZXldID0gcmVzdWx0LnN0ZG91dD8udG9TdHJpbmcoXCJ1dGYtOFwiKS50cmltKCkgPz8gXCJcIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBydW50aW1lIGVudmlyb25tZW50IGZvciBhIHRhc2suIE5hbWVseSwgaXQgc3VwcG9ydHMgdGhpcyBzeW50YXhcbiAgICogYCQoeHgpYCBmb3IgYWxsb3dpbmcgZW52aXJvbm1lbnQgdG8gYmUgZXZhbHVhdGVkIGJ5IGV4ZWN1dGluZyBhIHNoZWxsXG4gICAqIGNvbW1hbmQgYW5kIG9idGFpbmluZyBpdHMgcmVzdWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlRW52aXJvbm1lbnQoXG4gICAgZW52UGFyYW06IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9LFxuICAgIHBhcmVudHM6IHN0cmluZ1tdLFxuICAgIHNoZWxsOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKSB7XG4gICAgbGV0IGVudiA9IHRoaXMucnVudGltZS5tYW5pZmVzdC5lbnYgPz8ge307XG5cbiAgICAvLyBhZGQgZW52IGZyb20gYWxsIHBhcmVudCB0YXNrcyBvbmUgYnkgb25lXG4gICAgZm9yIChjb25zdCBwYXJlbnQgb2YgcGFyZW50cykge1xuICAgICAgZW52ID0ge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIC4uLih0aGlzLnJ1bnRpbWUudHJ5RmluZFRhc2socGFyZW50KT8uZW52ID8/IHt9KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gYXBwbHkgdGFzayBlbnZpcm9ubWVudCwgdGhlbiB0aGUgc3BlY2lmaWMgZW52IGxhc3RcbiAgICBlbnYgPSB7XG4gICAgICAuLi5lbnYsXG4gICAgICAuLi4odGhpcy50YXNrLmVudiA/PyB7fSksXG4gICAgICAuLi5lbnZQYXJhbSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXZhbEVudmlyb25tZW50KGVudiwgc2hlbGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzaGVsbCBmb3IgYSBzdGVwJ3MgY29tbWFuZCAob3IgdGhlIHRhc2sncywgd2hlbiBubyBzdGVwIGlzXG4gICAqIGdpdmVuKTogc3RlcCwgdGhlbiB0YXNrLCB0aGVuIHByb2plY3QgZGVmYXVsdCwgdGhlbiBcInByb2plblwiLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlU2hlbGwoc3RlcD86IFRhc2tTdGVwKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiAoXG4gICAgICBzdGVwPy5zaGVsbCA/PyB0aGlzLnRhc2suc2hlbGwgPz8gdGhpcy5ydW50aW1lLm1hbmlmZXN0LnNoZWxsID8/IFwicHJvamVuXCJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFwiZnVsbCBuYW1lXCIgb2YgdGhlIHRhc2sgd2hpY2ggaW5jbHVkZXMgYWxsIGl0J3MgcGFyZW50IHRhc2sgbmFtZXMgY29uY2F0ZW5hdGVkIGJ5IGNoZXZyb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgZnVsbG5hbWUoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnBhcmVudHMsIHRoaXMudGFzay5uYW1lXS5qb2luKFwiIMK7IFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgbG9nZ2luZy52ZXJib3NlKHRoaXMuZm10TG9nKC4uLmFyZ3MpKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nRGVidWcoLi4uYXJnczogYW55W10pIHtcbiAgICBsb2dnaW5nLmRlYnVnKHRoaXMuZm10TG9nKC4uLmFyZ3MpKTtcbiAgfVxuXG4gIHByaXZhdGUgZm10TG9nKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgcmV0dXJuIGZvcm1hdChgJHt1bmRlcmxpbmUodGhpcy5mdWxsbmFtZSl9IHxgLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2hlbGwob3B0aW9uczogU2hlbGxPcHRpb25zKTogUHJvbWlzZTxTaGVsbFJlc3VsdD4ge1xuICAgIGNvbnN0IHF1aWV0ID0gb3B0aW9ucy5xdWlldCA/PyBmYWxzZTtcbiAgICBpZiAoIXF1aWV0KSB7XG4gICAgICBjb25zdCBsb2cgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgICBsb2cucHVzaChcbiAgICAgICAgQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbW1hbmQpXG4gICAgICAgICAgPyBvcHRpb25zLmNvbW1hbmQuam9pbihcIiBcIilcbiAgICAgICAgICA6IG9wdGlvbnMuY29tbWFuZCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChvcHRpb25zLmN3ZCkge1xuICAgICAgICBsb2cucHVzaChgKGN3ZDogJHtvcHRpb25zLmN3ZH0pYCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nKGxvZy5qb2luKFwiIFwiKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3dkID0gb3B0aW9ucy5jd2QgPz8gdGhpcy53b3JrZGlyO1xuICAgIGlmICghZXhpc3RzU3luYyhjd2QpIHx8ICFzdGF0U3luYyhjd2QpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGludmFsaWQgd29ya2RpciAoY3dkKTogJHtjd2R9IG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlc29sdmVkIHNoZWxsIGlzIG9uZSBvZjpcbiAgICAvLyAtIFwicHJvamVuXCIgKGRlZmF1bHQpOiBkYXgncyBpbi1wcm9jZXNzIGNyb3NzLXBsYXRmb3JtIHNoZWxsLCBzbyBQT1NJWC1zdHlsZVxuICAgIC8vICAgdGFzayBzeW50YXggKGBta2RpciAtcGAsIGAmJmAsIGAkVkFSYCwgLi4uKSB3b3JrcyB0aGUgc2FtZSBldmVyeXdoZXJlLlxuICAgIC8vIC0gXCJzeXN0ZW1cIjogdGhlIGhvc3QncyBuYXRpdmUgc2hlbGwgKGAvYmluL3NoYCwgb3IgYGNtZC5leGVgIG9uIFdpbmRvd3MpLlxuICAgIC8vIC0gYW4gYXJndiwgZS5nLiBbXCJiYXNoXCIsXCItY1wiXTogYSBzaGVsbCBpbnZvY2F0aW9uIHdpdGggdGhlIGNvbW1hbmQgYXBwZW5kZWRcbiAgICAvLyAgIGFzIGl0cyBmaW5hbCBhcmd1bWVudC5cbiAgICBjb25zdCBzaGVsbCA9IG9wdGlvbnMuc2hlbGwgPz8gXCJwcm9qZW5cIjtcbiAgICBpZiAodHlwZW9mIHNoZWxsID09PSBcInN0cmluZ1wiICYmIHNoZWxsICE9PSBcInByb2plblwiICYmIHNoZWxsICE9PSBcInN5c3RlbVwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB1bmtub3duIGJ1aWx0LWluIHNoZWxsICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgc2hlbGwsXG4gICAgICAgICl9OyB1c2UgdGhlIGJ1aWx0LWluIFwicHJvamVuXCIgb3IgXCJzeXN0ZW1cIiBzaGVsbHMsIG9yIGEgVGFza1NoZWxsLmNvbW1hbmQoWy4uLl0pIGludm9jYXRpb25gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBzdGRvdXQvc3RkZXJyIGFyZSBjYXB0dXJlZCBvbmx5IHdoZW4gYXNrZWQgKGUuZy4gYCQoLi4uKWAgZW52IGV2YWwpO1xuICAgIC8vIG90aGVyd2lzZSB0aGV5IGFyZSBpbmhlcml0ZWQgc28gb3V0cHV0IHN0cmVhbXMgdGhyb3VnaC5cbiAgICBjb25zdCBjYXB0dXJlID0gb3B0aW9ucy5jYXB0dXJlT3V0cHV0ID8/IGZhbHNlO1xuXG4gICAgY29uc3QgY29tbWFuZCA9IG9wdGlvbnMuY29tbWFuZDtcbiAgICBjb25zdCBlbnYgPSB7XG4gICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgIC4uLnRoaXMuZW52LFxuICAgICAgLi4ub3B0aW9ucy5leHRyYUVudixcbiAgICB9O1xuXG4gICAgLy8gXCJzeXN0ZW1cIjogdGhlIGhvc3QtbmF0aXZlIGVuZ2luZS4gQSBzdHJpbmcgY29tbWFuZCBydW5zIHRocm91Z2ggdGhlIE9TXG4gICAgLy8gc2hlbGw7IGFuIGBleGVjQXJnc2AgYXJndiBpcyBzcGF3bmVkIGRpcmVjdGx5IChzaGVsbC1mcmVlKSwgc28gdGhlIHJlYWxcbiAgICAvLyBiaW5hcnkgcnVucyB3aXRoIG5vIGRheCBidWlsdC1pbnMuIChPbmx5IGAkKC4uLilgL2NvbmRpdGlvbiBldmFsIGNhcHR1cmVzLFxuICAgIC8vIGFuZCB0aG9zZSBhbHdheXMgcGFzcyBhIHN0cmluZywgc28gYW4gYXJyYXkgY29tbWFuZCBuZXZlciBuZWVkcyBjYXB0dXJlLilcbiAgICBpZiAoc2hlbGwgPT09IFwic3lzdGVtXCIpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbW1hbmQpKSB7XG4gICAgICAgIGNvbnN0IFtwcm9ncmFtLCAuLi5hcmdzXSA9IGNvbW1hbmQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdG9vbChwcm9ncmFtKS5ydW4oYXJncywgeyBjd2QsIGVudiwgaW5oZXJpdFN0ZGlvOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB7IHN0YXR1czogMCB9O1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGU/LnN0YXR1cyA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBlLnN0YXR1cyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3lzdGVtU2hlbGwoY29tbWFuZCwgeyBjd2QsIGVudiwgY2FwdHVyZSB9KTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgcnVuIHRocm91Z2ggZGF4OiB0aGUgXCJwcm9qZW5cIiBzaGVsbCBvciBhbiBleHBsaWNpdCBpbnZvY2F0aW9uLlxuICAgIGNvbnN0IGJ1aWxkZXIgPSB0aGlzLmJ1aWxkRGF4Q29tbWFuZChjb21tYW5kLCBzaGVsbCk7XG5cbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBidWlsZGVyXG4gICAgICAgIC5jd2QoY3dkKVxuICAgICAgICAuZW52KGVudilcbiAgICAgICAgLnN0ZG91dChjYXB0dXJlID8gXCJwaXBlZFwiIDogXCJpbmhlcml0XCIpXG4gICAgICAgIC5zdGRlcnIoY2FwdHVyZSA/IFwicGlwZWRcIiA6IFwiaW5oZXJpdFwiKVxuICAgICAgICAubm9UaHJvdygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGRheCdzIGluLXByb2Nlc3Mgc2hlbGwgdGhyb3dzIGEgdGVyc2UgYE5vdCBpbXBsZW1lbnRlZDogLi4uYCBmb3Igc2hlbGxcbiAgICAgIC8vIHN5bnRheCBpdCBkb2VzIG5vdCBzdXBwb3J0IChlLmcuIGAkKC4uLilgIGNvbW1hbmQgc3Vic3RpdHV0aW9uKTsgdHVyblxuICAgICAgLy8gdGhhdCBpbnRvIGFuIGFjdGlvbmFibGUgZXJyb3IgdGhhdCBwb2ludHMgYXQgdGhlIHN5c3RlbS1zaGVsbCBlc2NhcGVcbiAgICAgIC8vIGhhdGNoLiBPdGhlciBlcnJvcnMgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZC5cbiAgICAgIHRocm93IGVucmljaEJ1aWx0aW5TaGVsbEVycm9yKGUsIGNvbW1hbmQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IHJlc3VsdC5jb2RlLFxuICAgICAgc3Rkb3V0OiBjYXB0dXJlID8gQnVmZmVyLmZyb20ocmVzdWx0LnN0ZG91dEJ5dGVzKSA6IG51bGwsXG4gICAgICBzdGRlcnI6IGNhcHR1cmUgPyBCdWZmZXIuZnJvbShyZXN1bHQuc3RkZXJyQnl0ZXMpIDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGF4IGNvbW1hbmQgZm9yIHRoZSBcInByb2plblwiIHNoZWxsIG9yIGFuIGV4cGxpY2l0IGludm9jYXRpb24uXG4gICAqIChUaGUgXCJzeXN0ZW1cIiBzaGVsbCBpcyBoYW5kbGVkIGhvc3Qtc2lkZSwgbm90IGhlcmUuKSBgY29tbWFuZGAgaXMgYSBzaGVsbFxuICAgKiBsaW5lIChzdHJpbmcpIG9yIGFuIGBleGVjQXJnc2AgYXJndiAoc3RyaW5nW10pOyBgc2hlbGxgIGlzIGBcInByb2plblwiYCBvciBhblxuICAgKiBpbnZvY2F0aW9uIGFyZ3Ygc3VjaCBhcyBgW1wiYmFzaFwiLCBcIi1jXCJdYC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGREYXhDb21tYW5kKFxuICAgIGNvbW1hbmQ6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIHNoZWxsOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKSB7XG4gICAgLy8gQW4gaW52b2NhdGlvbiAoZS5nLiBbXCJiYXNoXCIsXCItY1wiXSwgW1wibnB4XCIsXCItLW5vXCIsXCItY1wiXSk6IGFwcGVuZCB0aGVcbiAgICAvLyBjb21tYW5kIGFzIGl0cyBmaW5hbCBhcmd1bWVudC4gQSBzdHJpbmcgaXMgYXBwZW5kZWQgYXMtaXM7IGFuIGBleGVjQXJnc2BcbiAgICAvLyBhcmd2IGlzIHJlbmRlcmVkIHRvIGEgcXVvdGVkIGNvbW1hbmQgbGluZSBzbyB0aGUgc2hlbGwgcmUtcGFyc2VzIHRoZSBzYW1lXG4gICAgLy8gYXJndi5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzaGVsbCkpIHtcbiAgICAgIGNvbnN0IFtwcm9ncmFtLCAuLi5mbGFnc10gPSBzaGVsbDtcbiAgICAgIGNvbnN0IGNvbW1hbmRMaW5lID0gQXJyYXkuaXNBcnJheShjb21tYW5kKVxuICAgICAgICA/IGNvbW1hbmQubWFwKHF1b3RlQXJnKS5qb2luKFwiIFwiKVxuICAgICAgICA6IGNvbW1hbmQ7XG4gICAgICByZXR1cm4gJGAke3Byb2dyYW19ICR7Wy4uLmZsYWdzLCBjb21tYW5kTGluZV19YDtcbiAgICB9XG5cbiAgICAvLyBUaGUgYnVpbHQtaW4gXCJwcm9qZW5cIiBzaGVsbCAoZGF4KS5cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShjb21tYW5kKVxuICAgICAgPyAvLyBleGVjQXJnczogc2hlbGwtZnJlZSBhcmd2IChlYWNoIGVsZW1lbnQgZXNjYXBlZDsgYC5jbWRgIHNoaW1zIHJlc29sdmVkKS5cbiAgICAgICAgJGAke2NvbW1hbmRbMF19ICR7Y29tbWFuZC5zbGljZSgxKX1gXG4gICAgICA6IC8vIHN0cmluZyBjb21tYW5kLCBwYXJzZWQgaW4tcHJvY2VzcyBieSBkYXgncyBjcm9zcy1wbGF0Zm9ybSBzaGVsbC5cbiAgICAgICAgJC5yYXdgJHtjb21tYW5kfWA7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckJ1aWx0aW4oYnVpbHRpbjogc3RyaW5nKSB7XG4gICAgLy8gTG9jYXRlIHByb2plbidzIHBhY2thZ2Ugcm9vdCBieSB3YWxraW5nIHVwIGZyb20gdGhpcyBtb2R1bGUncyBkaXJlY3RvcnlcbiAgICAvLyB1bnRpbCB3ZSBmaW5kIGEgcGFja2FnZS5qc29uLiBUaGlzIHdvcmtzIHdoZXRoZXIgdGhlIGNvZGUgcnVucyBmcm9tIHRoZVxuICAgIC8vIGNvbXBpbGVkIGZpbGUgKGxpYi9jbGkvdGFzay1ydW50aW1lLmpzKSBvciBmcm9tIHRoZSBidW5kbGVkIHJ1bi10YXNrLmNqc1xuICAgIC8vIChsaWIvcnVuLXRhc2suY2pzKSwgd2hpY2ggbGl2ZSBhdCBkaWZmZXJlbnQgZGVwdGhzIC0gc28gYSBoYXJkLWNvZGVkXG4gICAgLy8gcmVsYXRpdmUgcGF0aCB0byBwYWNrYWdlLmpzb24gd291bGQgYmUgd3JvbmcgaW4gb25lIG9mIHRoZSB0d28gY2FzZXMuXG4gICAgbGV0IG1vZHVsZVJvb3QgPSBfX2Rpcm5hbWU7XG4gICAgd2hpbGUgKCFleGlzdHNTeW5jKGpvaW4obW9kdWxlUm9vdCwgXCJwYWNrYWdlLmpzb25cIikpKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKG1vZHVsZVJvb3QpO1xuICAgICAgaWYgKHBhcmVudCA9PT0gbW9kdWxlUm9vdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmFibGUgdG8gbG9jYXRlIHRoZSBwcm9qZW4gcGFja2FnZSByb290XCIpO1xuICAgICAgfVxuICAgICAgbW9kdWxlUm9vdCA9IHBhcmVudDtcbiAgICB9XG4gICAgY29uc3QgcHJvZ3JhbSA9IHJlcXVpcmUucmVzb2x2ZShcbiAgICAgIGpvaW4obW9kdWxlUm9vdCwgXCJsaWJcIiwgYCR7YnVpbHRpbn0udGFzay5qc2ApLFxuICAgICk7XG4gICAgcmV0dXJuIGBcIiR7cHJvY2Vzcy5leGVjUGF0aH1cIiBcIiR7cHJvZ3JhbX1cImA7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFNoZWxsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgY29tbWFuZCB0byBydW4uIEEgc3RyaW5nIGlzIGV4ZWN1dGVkIGFzIGEgc2hlbGwgY29tbWFuZCBsaW5lOyBhXG4gICAqIHN0cmluZyBhcnJheSBpcyBhbiBleHBsaWNpdCBhcmd2IChwcm9ncmFtICsgYXJndW1lbnRzKSBleGVjdXRlZCB3aXRob3V0IGFcbiAgICogc2hlbGwuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEBkZWZhdWx0IC0gcHJvamVjdCBkaXJcbiAgICovXG4gIHJlYWRvbmx5IGN3ZD86IHN0cmluZztcbiAgLyoqXG4gICAqIENhcHR1cmUgc3Rkb3V0L3N0ZGVyciAoc28gdGhlIGNhbGxlciBjYW4gcmVhZCB0aGVtIGZyb20gdGhlIHJlc3VsdClcbiAgICogaW5zdGVhZCBvZiBpbmhlcml0aW5nIHRoZSBwYXJlbnQncyBzdHJlYW1zLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FwdHVyZU91dHB1dD86IGJvb2xlYW47XG4gIC8qKiBAZGVmYXVsdCBmYWxzZSAqL1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGV4dHJhRW52PzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH07XG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgc2hlbGwgdG8gaW50ZXJwcmV0IHRoZSBjb21tYW5kIChlLmcuIFwicHJvamVuXCIsIFwiYmFzaCAtY1wiKS5cbiAgICogQGRlZmF1bHQgXCJwcm9qZW5cIlxuICAgKi9cbiAgcmVhZG9ubHkgc2hlbGw/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbn1cbiJdfQ==
630
+ /**
631
+ * Runs a command line through the operating system's native shell.
632
+ *
633
+ * Calls the OS shell via `child_process` with `shell: true`.
634
+ * This backs the `system` task shell, which lets a user opt out of the built-in
635
+ * cross-platform shell and use the host's native shell instead:
636
+ * `/bin/sh`on POSIX and `cmd.exe` on Windows.
637
+ *
638
+ * Never throws for a non-zero exit (that is reported via `status`);
639
+ * a spawn failure is reported via `error`. The caller supplies the full `env`.
640
+ */
641
+ function systemShell(command, options) {
642
+ logging.debug(`${command} (cwd: ${options.cwd})`);
643
+ const result = child_process.spawnSync(command, {
644
+ cwd: options.cwd,
645
+ shell: true,
646
+ maxBuffer: exec_1.MAX_BUFFER,
647
+ env: options.env,
648
+ // Quiet capture buffers stderr for error messages. Streamed capture
649
+ // inherits stderr and re-emits buffered stdout afterwards, since spawnSync
650
+ // can't both show and buffer the same stream at once.
651
+ stdio: options.capture
652
+ ? options.stream
653
+ ? ["inherit", "pipe", "inherit"]
654
+ : ["inherit", "pipe", "pipe"]
655
+ : "inherit",
656
+ });
657
+ if (options.capture && options.stream && result.stdout) {
658
+ process.stdout.write(result.stdout);
659
+ }
660
+ return {
661
+ status: result.status,
662
+ stdout: result.stdout ?? null,
663
+ stderr: result.stderr ?? null,
664
+ error: result.error,
665
+ };
666
+ }
667
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS90YXNrLXJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK3lCQSxrQ0FpQ0M7QUFoMUJELDZEQUErQztBQUMvQywyQkFBd0Q7QUFDeEQsK0JBQThDO0FBQzlDLDJDQUE2QjtBQUM3QiwrQkFBOEI7QUFDOUIsaUNBQXdDO0FBQ3hDLDZCQUF3QjtBQUN4QixzQ0FBK0Q7QUFDL0Qsb0RBQXNDO0FBRXRDLHVDQUFnRDtBQUVoRCxxRUFBcUU7QUFDckUsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRiwyRUFBMkU7QUFDM0UsbUVBQW1FO0FBQ25FLGlFQUFpRTtBQUNqRSxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQy9ELE1BQU0saUJBQWlCLEdBQ3JCLHVCQUF1QixFQUFFLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQztBQUU5RCxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDeEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxXQUFXLEdBQUcsQ0FBQztBQUU5Qzs7OztHQUlHO0FBQ0gsU0FBUyxRQUFRLENBQUMsR0FBVztJQUMzQixPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDdkQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FDOUIsS0FBYyxFQUNkLE9BQTBCO0lBRTFCLE1BQU0sT0FBTyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdEMsb0JBQW9CO1FBQ3BCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUN6RSxPQUFPLElBQUksS0FBSyxDQUNkLG1EQUFtRDtRQUNqRCxLQUFLLFdBQVcsSUFBSTtRQUNwQiwwRUFBMEUsQ0FDN0UsQ0FBQztBQUNKLENBQUM7QUE4QkQ7O0dBRUc7QUFDSCxNQUFhLFdBQVc7SUFDdEI7O09BRUc7SUFDSSxNQUFNLENBQVUsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNwRCxtQkFBVSxFQUNWLFlBQVksQ0FDYixDQUFDO0lBRUY7Ozs7Ozs7OztPQVNHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBZSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUyxHQUFrQixFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUVqRDs7O09BR0c7SUFDSyxTQUFTLENBQVU7SUFFM0I7O09BRUc7SUFDYSxPQUFPLENBQVM7SUFFaEMsWUFBWSxPQUFlO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBQSxjQUFPLEVBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEMscUVBQXFFO1FBQ3JFLFdBQVc7UUFDWCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVksWUFBWTtRQUN0QixPQUFPLElBQUEsV0FBSSxFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsS0FBSztRQUNkLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXLENBQUMsSUFBWTtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLE9BQU8sQ0FDbEIsSUFBWSxFQUNaLFVBQW9CLEVBQUUsRUFDdEIsT0FBK0IsRUFBRSxFQUNqQyxNQUFrQyxFQUFFLEVBQ3BDLFVBQXVDLEVBQUU7UUFFekMseUVBQXlFO1FBQ3pFLHlFQUF5RTtRQUN6RSx3RUFBd0U7UUFDeEUsK0NBQStDO1FBQy9DLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBRS9CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNELE9BQU8sT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM1RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssdUJBQXVCO1FBQzdCLElBQUksQ0FBQyxJQUFBLGVBQVUsRUFBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxvRUFBb0U7WUFDcEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUMzQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLElBQUEsaUJBQVksRUFBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsZ0NBQWdDO1FBQzFDLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBa0IsaUJBQWlCLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUU1RSxrRUFBa0U7UUFDbEUsd0VBQXdFO1FBQ3hFLDZDQUE2QztRQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQztRQUU5QyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBRXJCLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsS0FBSyxDQUNYLEdBQUcsV0FBVyxDQUFDLGFBQWEsK0RBQStELENBQzVGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxjQUFjLENBQUMsUUFBdUI7UUFDNUMsMEVBQTBFO1FBQzFFLFdBQVc7UUFDWCxJQUFJLFFBQVEsQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDM0MsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxlQUFlLEdBQUcsK0JBQXNCLEVBQUUsQ0FBQztZQUN0RCxPQUFPLENBQUMsSUFBSSxDQUNWLEdBQUcsV0FBVyxDQUFDLGFBQWEsOENBQThDO2dCQUN4RSxxQkFBcUIsUUFBUSxDQUFDLGVBQWUsZ0NBQWdDLCtCQUFzQixLQUFLO2dCQUN4RyxtRUFBbUUsQ0FDdEUsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDOztBQXhLSCxrQ0F5S0M7QUFFRCxNQUFNLE9BQU87SUFnQlE7SUFDQTtJQUVBO0lBQ0E7SUFuQlgsR0FBRyxHQUEyQyxFQUFFLENBQUM7SUFDeEMsT0FBTyxDQUFXO0lBRWxCLE9BQU8sQ0FBUztJQUVqQywyRUFBMkU7SUFDM0UsaURBQWlEO0lBQ3pDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDVixRQUFRLEdBQWEsRUFBRSxDQUFDO0lBRXpDLDJFQUEyRTtJQUMzRSw0QkFBNEI7SUFDWCxXQUFXLEdBQStCLEVBQUUsQ0FBQztJQUU5RCxZQUNtQixPQUFvQixFQUNwQixJQUFjLEVBQy9CLFVBQW9CLEVBQUUsRUFDTCxPQUErQixFQUFFLEVBQ2pDLFdBQXVDLEVBQUU7UUFKekMsWUFBTyxHQUFQLE9BQU8sQ0FBYTtRQUNwQixTQUFJLEdBQUosSUFBSSxDQUFVO1FBRWQsU0FBSSxHQUFKLElBQUksQ0FBNkI7UUFDakMsYUFBUSxHQUFSLFFBQVEsQ0FBaUM7UUFFMUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsa0JBQWtCO1FBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxhQUFhLENBQUMsU0FBNkIsRUFBRSxLQUFhO1FBQ2hFLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLEdBQUc7UUFDZCxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFckMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFBLFlBQUksRUFBQywrQ0FBK0MsQ0FBQyxDQUFDLENBQUM7WUFDckUsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUN0QyxJQUFJLENBQUMsUUFBUSxFQUNiLE9BQU8sRUFDUCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQ3BCLENBQUM7UUFFRixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbkIsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQixNQUFNLE9BQU8sR0FDWCxFQUFFLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEUsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUEsWUFBSSxFQUFDLEdBQUcsSUFBQSxpQkFBUyxFQUFDLEtBQUssQ0FBQyxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUVELHFCQUFxQjtRQUNyQixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzRCxJQUFJLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7WUFDdEQsT0FBTztRQUNULENBQUM7UUFFRCx1REFBdUQ7UUFDdkQsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDL0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUNwQyxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FDYiwyQ0FBMkMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUMvRCxDQUFDO1FBQ0osQ0FBQztRQUVELEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzlCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFMUMsMEJBQTBCO1lBQzFCLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNqRCxJQUFJLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7Z0JBQ3RELFNBQVM7WUFDWCxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQWE7Z0JBQ3pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDcEIsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ2xDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUUzQixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDYixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ3BELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQ3ZDLElBQUksQ0FBQyxLQUFLLEVBQ1YsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFDakMsUUFBUSxFQUNSLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUNwQyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FDM0IsQ0FBQztnQkFDRixJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzdDLENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQTZCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFckUsNENBQTRDO1lBQzVDLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVsRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFFRCwwRUFBMEU7WUFDMUUsMEVBQTBFO1lBQzFFLHlFQUF5RTtZQUN6RSwwRUFBMEU7WUFDMUUsd0VBQXdFO1lBQ3hFLHdFQUF3RTtZQUN4RSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO2dCQUMxQixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ25CLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNwQyxJQUFJLE9BQU8sS0FBSyxXQUFXLEVBQUUsQ0FBQzt3QkFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO3dCQUN2QixNQUFNLEdBQUcsSUFBSSxDQUFDO29CQUNoQixDQUFDO3lCQUFNLENBQUM7d0JBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDckIsQ0FBQztnQkFDSCxDQUFDO2dCQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDWixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7Z0JBQ3pCLENBQUM7Z0JBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixDQUFDO1lBRUQsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUVuQixxRUFBcUU7Z0JBQ3JFLHdFQUF3RTtnQkFDeEUsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDaEMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQzt3QkFDekMsK0RBQStEO3dCQUMvRCxtRUFBbUU7d0JBQ25FLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUN2QixrQkFBa0IsRUFDbEIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQ2pDLENBQUM7b0JBQ0osQ0FBQzt5QkFBTSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQzt3QkFDekMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDN0QsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE9BQU8sR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDN0MsQ0FBQztnQkFDSCxDQUFDO2dCQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQ3JCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ3BELHFFQUFxRTtnQkFDckUsZ0NBQWdDO2dCQUNoQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQzlCLE9BQU87b0JBQ1AsR0FBRztvQkFDSCxRQUFRLEVBQUUsR0FBRztvQkFDYixLQUFLLEVBQUUsU0FBUztvQkFDaEIsYUFBYSxFQUFFLE9BQU87aUJBQ3ZCLENBQUMsQ0FBQztnQkFDSCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQ2IsU0FBUyxJQUFJLENBQUMsUUFBUSw0QkFDcEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FDL0MsV0FBVyxJQUFBLGNBQU8sRUFBQyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQzNDLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNaLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztvQkFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUM3QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssS0FBSyxDQUFDLGFBQWEsQ0FDekIsVUFBK0IsRUFDL0IsS0FBd0I7UUFFeEIseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFBLFlBQUksRUFBQyxHQUFHLElBQUEsaUJBQVMsRUFBQyxXQUFXLENBQUMsS0FBSyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQztZQUM5QixPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVM7WUFDN0IsS0FBSyxFQUFFLElBQUk7WUFDWCxLQUFLO1NBQ04sQ0FBQyxDQUFDO1FBQ0gsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsZUFBZSxDQUMzQixHQUErQixFQUMvQixLQUF3QjtRQUV4QixNQUFNLE1BQU0sR0FBMkMsRUFBRSxDQUFDO1FBRTFELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3JELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQztvQkFDOUIsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsS0FBSyxFQUFFLElBQUk7b0JBQ1gsYUFBYSxFQUFFLElBQUk7b0JBQ25CLEtBQUs7aUJBQ04sQ0FBQyxDQUFDO2dCQUNILElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUs7d0JBQ3hCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUs7d0JBQ3BCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRTs0QkFDaEMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUU7NEJBQ2hDLDRCQUE0QixNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBRWhELE9BQU8sQ0FBQyxJQUFJLENBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FDVCxHQUFHLElBQUEsaUJBQVMsRUFBQyxHQUFHLENBQUMseUJBQXlCLEtBQUssK0ZBQStGLENBQy9JLENBQ0YsQ0FBQztvQkFDRixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFBLGlCQUFTLEVBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzRCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDOUQsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsa0JBQWtCLENBQzlCLFFBQW9DLEVBQ3BDLE9BQWlCLEVBQ2pCLEtBQXdCO1FBRXhCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFFMUMsMkNBQTJDO1FBQzNDLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDN0IsR0FBRyxHQUFHO2dCQUNKLEdBQUcsR0FBRztnQkFDTixHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQzthQUNqRCxDQUFDO1FBQ0osQ0FBQztRQUVELHFEQUFxRDtRQUNyRCxHQUFHLEdBQUc7WUFDSixHQUFHLEdBQUc7WUFDTixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ3hCLEdBQUcsUUFBUTtTQUNaLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7O09BR0c7SUFDSyxZQUFZLENBQUMsSUFBZTtRQUNsQyxPQUFPLENBQ0wsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUMxRSxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBWSxRQUFRO1FBQ2xCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVPLEdBQUcsQ0FBQyxHQUFHLElBQVc7UUFDeEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU8sUUFBUSxDQUFDLEdBQUcsSUFBVztRQUM3QixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTyxNQUFNLENBQUMsR0FBRyxJQUFXO1FBQzNCLE9BQU8sSUFBQSxhQUFNLEVBQUMsR0FBRyxJQUFBLGlCQUFTLEVBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFxQjtRQUN2QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztRQUNyQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1lBRWhDLEdBQUcsQ0FBQyxJQUFJLENBQ04sS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUM1QixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUMzQixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FDcEIsQ0FBQztZQUVGLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDcEMsQ0FBQztZQUVELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDeEMsSUFBSSxDQUFDLElBQUEsZUFBVSxFQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBQSxhQUFRLEVBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUNyRCxNQUFNLElBQUksS0FBSyxDQUNiLDBCQUEwQixHQUFHLGdDQUFnQyxDQUM5RCxDQUFDO1FBQ0osQ0FBQztRQUVELGdDQUFnQztRQUNoQyw4RUFBOEU7UUFDOUUsMkVBQTJFO1FBQzNFLDRFQUE0RTtRQUM1RSw4RUFBOEU7UUFDOUUsMkJBQTJCO1FBQzNCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDO1FBQ3hDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFFLE1BQU0sSUFBSSxLQUFLLENBQ2IsMEJBQTBCLElBQUksQ0FBQyxTQUFTLENBQ3RDLEtBQUssQ0FDTiwwRkFBMEYsQ0FDNUYsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQztRQUMvQyxzRUFBc0U7UUFDdEUsbURBQW1EO1FBQ25ELE1BQU0sTUFBTSxHQUFHLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUVqQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2hDLE1BQU0sR0FBRyxHQUFHO1lBQ1YsR0FBRyxPQUFPLENBQUMsR0FBRztZQUNkLEdBQUcsSUFBSSxDQUFDLEdBQUc7WUFDWCxHQUFHLE9BQU8sQ0FBQyxRQUFRO1NBQ3BCLENBQUM7UUFFRix5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLDZFQUE2RTtRQUM3RSw0RUFBNEU7UUFDNUUsSUFBSSxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdkIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7Z0JBQ25DLElBQUksQ0FBQztvQkFDSCxJQUFBLFdBQUksRUFBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsQ0FBQztnQkFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO29CQUNoQixJQUFJLE9BQU8sQ0FBQyxFQUFFLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDbEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQzlCLENBQUM7b0JBQ0QsTUFBTSxDQUFDLENBQUM7Z0JBQ1YsQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFRCwyRUFBMkU7UUFDM0UsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFckQseUVBQXlFO1FBQ3pFLGlFQUFpRTtRQUNqRSxNQUFNLFVBQVUsR0FBRyxPQUFPO1lBQ3hCLENBQUMsQ0FBQyxNQUFNO2dCQUNOLENBQUMsQ0FBQyxjQUFjO2dCQUNoQixDQUFDLENBQUMsT0FBTztZQUNYLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDZCxNQUFNLFVBQVUsR0FBRyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTVELElBQUksTUFBTSxDQUFDO1FBQ1gsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLE1BQU0sT0FBTztpQkFDbkIsR0FBRyxDQUFDLEdBQUcsQ0FBQztpQkFDUixHQUFHLENBQUMsR0FBRyxDQUFDO2lCQUNSLE1BQU0sQ0FBQyxVQUFVLENBQUM7aUJBQ2xCLE1BQU0sQ0FBQyxVQUFVLENBQUM7aUJBQ2xCLE9BQU8sRUFBRSxDQUFDO1FBQ2YsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCx5RUFBeUU7WUFDekUsd0VBQXdFO1lBQ3hFLHVFQUF1RTtZQUN2RSw4Q0FBOEM7WUFDOUMsTUFBTSx1QkFBdUIsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUVELE9BQU87WUFDTCxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDbkIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDeEQsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDcEUsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGVBQWUsQ0FDckIsT0FBMEIsRUFDMUIsS0FBd0I7UUFFeEIsc0VBQXNFO1FBQ3RFLDJFQUEyRTtRQUMzRSw0RUFBNEU7UUFDNUUsUUFBUTtRQUNSLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDbEMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQ3hDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDWixPQUFPLElBQUEsT0FBQyxFQUFBLEdBQUcsT0FBTyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxDQUFDO1FBRUQscUNBQXFDO1FBQ3JDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDM0IsQ0FBQyxDQUFDLDJFQUEyRTtnQkFDM0UsSUFBQSxPQUFDLEVBQUEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN0QyxDQUFDLENBQUMsbUVBQW1FO2dCQUNuRSxPQUFDLENBQUMsR0FBRyxDQUFBLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVPLGFBQWEsQ0FBQyxPQUFlO1FBQ25DLDBFQUEwRTtRQUMxRSwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsSUFBSSxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzNCLE9BQU8sQ0FBQyxJQUFBLGVBQVUsRUFBQyxJQUFBLFdBQUksRUFBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JELE1BQU0sTUFBTSxHQUFHLElBQUEsY0FBTyxFQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ25DLElBQUksTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7WUFDOUQsQ0FBQztZQUNELFVBQVUsR0FBRyxNQUFNLENBQUM7UUFDdEIsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQzdCLElBQUEsV0FBSSxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLFVBQVUsQ0FBQyxDQUM5QyxDQUFDO1FBQ0YsT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLE1BQU0sT0FBTyxHQUFHLENBQUM7SUFDOUMsQ0FBQztDQUNGO0FBNkNEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixXQUFXLENBQ3pCLE9BQWUsRUFDZixPQUtDO0lBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sVUFBVSxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNsRCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRTtRQUM5QyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7UUFDaEIsS0FBSyxFQUFFLElBQUk7UUFDWCxTQUFTLEVBQUUsaUJBQVU7UUFDckIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1FBQ2hCLG9FQUFvRTtRQUNwRSwyRUFBMkU7UUFDM0Usc0RBQXNEO1FBQ3RELEtBQUssRUFBRSxPQUFPLENBQUMsT0FBTztZQUNwQixDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU07Z0JBQ2QsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO1lBQy9CLENBQUMsQ0FBQyxTQUFTO0tBQ2QsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsT0FBTztRQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJO1FBQzdCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUk7UUFDN0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO0tBQ3BCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCBzdGF0U3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwidXRpbFwiO1xuaW1wb3J0IHsgZ3JheSwgdW5kZXJsaW5lIH0gZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyAkIH0gZnJvbSBcImRheFwiO1xuaW1wb3J0IHsgUFJPSkVOX0RJUiwgVEFTS1NfTUFOSUZFU1RfVkVSU0lPTiB9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCAqIGFzIGxvZ2dpbmcgZnJvbSBcIi4uL2xvZ2dpbmdcIjtcbmltcG9ydCB0eXBlIHsgVGFza3NNYW5pZmVzdCwgVGFza1NwZWMsIFRhc2tTdGVwIH0gZnJvbSBcIi4uL3Rhc2stbW9kZWxcIjtcbmltcG9ydCB7IE1BWF9CVUZGRVIsIHRvb2wgfSBmcm9tIFwiLi4vdXRpbC9leGVjXCI7XG5cbi8vIGF2b2lkcyBhIChmYWxzZSBwb3NpdGl2ZSkgZXNidWlsZCB3YXJuaW5nIGFib3V0IGluY29ycmVjdCBpbXBvcnRzLlxuLy8gYD8uZGVmYXVsdCA/PyBtb2R1bGVgIGtlZXBzIHRoaXMgd29ya2luZyBib3RoIGFzIGEgcGxhaW4gQ29tbW9uSlMgcmVxdWlyZSBhbmRcbi8vIHdoZW4gdGhlIGRlcGVuZGVuY3kgaXMgaW50ZXJvcC13cmFwcGVkIGluc2lkZSB0aGUgYnVuZGxlZCBydW4tdGFzay5janMgKHdoZXJlXG4vLyBgcmVxdWlyZSguLi4pYCBtYXkgeWllbGQgYHsgZGVmYXVsdDogZm4gfWAgaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24pLiBTZWVcbi8vIHByb2plbiM0NDA3IChcInBhcnNlQ29uZmxpY3RKU09OIGlzIG5vdCBhIGZ1bmN0aW9uXCIgYWZ0ZXIgZWplY3QpLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IHBhcnNlQ29uZmxpY3RKU09OTW9kdWxlID0gcmVxdWlyZShcInBhcnNlLWNvbmZsaWN0LWpzb25cIik7XG5jb25zdCBwYXJzZUNvbmZsaWN0SlNPTiA9XG4gIHBhcnNlQ29uZmxpY3RKU09OTW9kdWxlPy5kZWZhdWx0ID8/IHBhcnNlQ29uZmxpY3RKU09OTW9kdWxlO1xuXG5jb25zdCBFTlZfVFJJTV9MRU4gPSAyMDtcbmNvbnN0IEFSR1NfTUFSS0VSID0gXCIkQFwiO1xuY29uc3QgUVVPVEVEX0FSR1NfTUFSS0VSID0gYFwiJHtBUkdTX01BUktFUn1cImA7XG5cbi8qKlxuICogRG91YmxlLXF1b3RlcyBhIHNpbmdsZSBhcmd1bWVudCBzbyBpdCBpcyBwYXNzZWQgdGhyb3VnaCB2ZXJiYXRpbSwgZXNjYXBpbmcgdGhlXG4gKiBjaGFyYWN0ZXJzIHRoYXQgc3RheSBzcGVjaWFsIGluc2lkZSBkb3VibGUgcXVvdGVzLiAoRG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZTpcbiAqIGRheCdzIHNoZWxsIGxhY2tzIHRoZSBQT1NJWCBgJ1xcJydgIGVzY2FwZS4pXG4gKi9cbmZ1bmN0aW9uIHF1b3RlQXJnKGFyZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuICdcIicgKyBhcmcucmVwbGFjZSgvKFtcIiRgXFxcXF0pL2csIFwiXFxcXCQxXCIpICsgJ1wiJztcbn1cblxuLyoqXG4gKiBkYXgncyBidWlsdC1pbiBjcm9zcy1wbGF0Zm9ybSBzaGVsbCBvbmx5IGltcGxlbWVudHMgYSBzdWJzZXQgb2YgUE9TSVggc2hlbGxcbiAqIHN5bnRheCBhbmQgdGhyb3dzIGEgdGVyc2UgYE5vdCBpbXBsZW1lbnRlZDogLi4uYCBmb3IgdGhlIHJlc3QuIFJld3JpdGUgdGhvc2VcbiAqIGludG8gYSBzaG9ydCwgYWN0aW9uYWJsZSBlcnJvciB0aGF0IHBvaW50cyBhdCB0aGUgc3lzdGVtLXNoZWxsIGVzY2FwZSBoYXRjaDtcbiAqIHBhc3MgZXZlcnkgb3RoZXIgZXJyb3IgdGhyb3VnaCB1bmNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGVucmljaEJ1aWx0aW5TaGVsbEVycm9yKFxuICBlcnJvcjogdW5rbm93bixcbiAgY29tbWFuZDogc3RyaW5nIHwgc3RyaW5nW10sXG4pOiB1bmtub3duIHtcbiAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgaWYgKCEvTm90IGltcGxlbWVudGVkOi8udGVzdChtZXNzYWdlKSkge1xuICAgIC8qIHY4IGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgY29uc3QgY29tbWFuZExpbmUgPSBBcnJheS5pc0FycmF5KGNvbW1hbmQpID8gY29tbWFuZC5qb2luKFwiIFwiKSA6IGNvbW1hbmQ7XG4gIHJldHVybiBuZXcgRXJyb3IoXG4gICAgXCJwcm9qZW4ncyBidWlsdC1pbiBzaGVsbCBjYW4ndCBydW4gdGhpcyBjb21tYW5kOlxcblwiICtcbiAgICAgIGAgICR7Y29tbWFuZExpbmV9XFxuYCArXG4gICAgICBcIlRvIHVzZSB5b3VyIHN5c3RlbSdzIHNoZWxsIGluc3RlYWQsIHNldCB0aGlzIHRhc2sgdG8gVGFza1NoZWxsLnN5c3RlbSgpLlwiLFxuICApO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZWQgcmVzdWx0IG9mIGBzaGVsbCgpYCAoYSBzdWJzZXQgb2Ygbm9kZSdzIGBTcGF3blN5bmNSZXR1cm5zYCkuXG4gKi9cbmludGVyZmFjZSBTaGVsbFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgZXhpdCBjb2RlIG9mIHRoZSBjb21tYW5kLCBvciBgbnVsbGAgaWYgdGhlIHByb2Nlc3Mgd2FzIHRlcm1pbmF0ZWQgYnkgYVxuICAgKiBzaWduYWwgb3IgbmV2ZXIgc3Bhd25lZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ2FwdHVyZWQgc3Rkb3V0LiBPbmx5IHBvcHVsYXRlZCB3aGVuIHN0ZG91dCBpcyBwaXBlZCAoZS5nLiB3aGVuIGV2YWx1YXRpbmdcbiAgICogZW52aXJvbm1lbnQgdmFyaWFibGVzKTsgYG51bGxgL2B1bmRlZmluZWRgIHdoZW4gc3RkaW8gaXMgaW5oZXJpdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3Rkb3V0PzogQnVmZmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ2FwdHVyZWQgc3RkZXJyLiBTZWUgYHN0ZG91dGAuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI/OiBCdWZmZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBlcnJvciByYWlzZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBzcGF3biB0aGUgY29tbWFuZCAobm90IGEgbm9uLXplcm8gZXhpdFxuICAgKiBjb2RlLCB3aGljaCBpcyByZXBvcnRlZCB2aWEgYHN0YXR1c2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3I/OiBFcnJvcjtcbn1cblxuLyoqXG4gKiBUaGUgcnVudGltZSBjb21wb25lbnQgb2YgdGhlIHRhc2tzIGVuZ2luZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tSdW50aW1lIHtcbiAgLyoqXG4gICAqIFRoZSBwcm9qZWN0LXJlbGF0aXZlIHBhdGggb2YgdGhlIHRhc2tzIG1hbmlmZXN0IGZpbGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1BTklGRVNUX0ZJTEUgPSBwYXRoLnBvc2l4LmpvaW4oXG4gICAgUFJPSkVOX0RJUixcbiAgICBcInRhc2tzLmpzb25cIixcbiAgKTtcblxuICAvKipcbiAgICogT25lLXNob3QgZW50cnlwb2ludCBmb3IgdGhlIHN0YW5kYWxvbmUgdGFzayBydW5uZXIuXG4gICAqXG4gICAqIENyZWF0ZXMgYSBydW50aW1lIHJvb3RlZCBhdCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgcnVucyB0aGUgbmFtZWRcbiAgICogdGFzaywgYW5kIGNvbnZlcnRzIGFueSBmYWlsdXJlIGludG8gYSBub24temVybyBwcm9jZXNzIGV4aXQgY29kZS4gVGhpcyBpc1xuICAgKiB0aGUgc2luZ2xlIGxpbmUgaW52b2tlZCBieSB0aGUgYnVuZGxlZCBgc2NyaXB0cy9ydW4tdGFzay5janNgIHRoYXRcbiAgICogXCJwcm9qZW4gZWplY3RcIiBlbWl0cywgd2hpY2gga2VlcHMgdGhlIGdlbmVyYXRlZCBidW5kbGUgZm9vdGVyIHRyaXZpYWwuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0YXNrIHRvIHJ1bi4gRGVmYXVsdHMgdG8gYHByb2Nlc3MuYXJndlsyXWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIG1haW4obmFtZTogc3RyaW5nID0gcHJvY2Vzcy5hcmd2WzJdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldyBUYXNrUnVudGltZShcIi5cIikucnVuVGFzayhuYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZT8uc3RhY2sgPz8gU3RyaW5nKGUpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIG9mIHRhc2tzLmpzb25cbiAgICovXG4gIHByaXZhdGUgX21hbmlmZXN0OiBUYXNrc01hbmlmZXN0ID0geyB0YXNrczoge30gfTtcblxuICAvKipcbiAgICogVGhlIHJhdyBjb250ZW50cyBvZiB0aGUgY3VycmVudGx5IGxvYWRlZCBtYW5pZmVzdCwgdXNlZCB0byBkZXRlY3QgY2hhbmdlc1xuICAgKiBvbiBkaXNrIHNvIHRoZSBydW50aW1lIGNhbiByZWxvYWQgYSByZWdlbmVyYXRlZCBtYW5pZmVzdCBtaWQtcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBfaWRlbnRpdHk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCBhbmQgdGhlIGN3ZCBmb3IgZXhlY3V0aW5nIHRhc2tzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtkaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih3b3JrZGlyOiBzdHJpbmcpIHtcbiAgICB0aGlzLndvcmtkaXIgPSByZXNvbHZlKHdvcmtkaXIpO1xuICAgIC8vIFBlcmZvcm0gdGhlIGluaXRpYWwgbG9hZC4gVGhpcyBhbHNvIHZlcmlmaWVzIHRoZSBtYW5pZmVzdCdzIHNjaGVtYVxuICAgIC8vIHZlcnNpb24uXG4gICAgdGhpcy5yZWxvYWRNYW5pZmVzdElmQ2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0YXNrcy5qc29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1hbmlmZXN0KCk6IFRhc2tzTWFuaWZlc3Qge1xuICAgIHJldHVybiB0aGlzLl9tYW5pZmVzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdGFza3MgbWFuaWZlc3QgZmlsZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0IG1hbmlmZXN0UGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBqb2luKHRoaXMud29ya2RpciwgVGFza1J1bnRpbWUuTUFOSUZFU1RfRklMRSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRhc2tzIGluIHRoaXMgcHJvamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdGFza3MoKTogVGFza1NwZWNbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5tYW5pZmVzdC50YXNrcyA/PyB7fSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIHRhc2sgYnkgbmFtZSwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLlxuICAgKi9cbiAgcHVibGljIHRyeUZpbmRUYXNrKG5hbWU6IHN0cmluZyk6IFRhc2tTcGVjIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMubWFuaWZlc3QudGFza3MpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hbmlmZXN0LnRhc2tzW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHRhc2suXG4gICAqIEBwYXJhbSBuYW1lIFRoZSB0YXNrIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcnVuVGFzayhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBhcmdzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW10sXG4gICAgZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICAgIG9wdGlvbnM6IHsgY2FwdHVyZU91dHB1dD86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBQcm9taXNlPHN0cmluZyB8IHZvaWQ+IHtcbiAgICAvLyBBIHByZXZpb3VzbHkgZXhlY3V0ZWQgdGFzayAobW9zdCBpbXBvcnRhbnRseSB0aGUgXCJkZWZhdWx0XCIvc3ludGggdGFzayxcbiAgICAvLyB3aGljaCBgYnVpbGRgIHNwYXducyBmaXJzdCkgbWF5IGhhdmUgcmVnZW5lcmF0ZWQgYC5wcm9qZW4vdGFza3MuanNvbmAuXG4gICAgLy8gUGljayB1cCBhbnkgc3VjaCBjaGFuZ2VzIGJlZm9yZSByZXNvbHZpbmcgYW5kIHJ1bm5pbmcgdGhpcyB0YXNrIHNvIHdlXG4gICAgLy8gbmV2ZXIgZXhlY3V0ZSBhIHN0YWxlLCBpbi1tZW1vcnkgZGVmaW5pdGlvbi5cbiAgICB0aGlzLnJlbG9hZE1hbmlmZXN0SWZDaGFuZ2VkKCk7XG5cbiAgICBjb25zdCB0YXNrID0gdGhpcy50cnlGaW5kVGFzayhuYW1lKTtcbiAgICBpZiAoIXRhc2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2Fubm90IGZpbmQgY29tbWFuZCAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcnVubmVyID0gbmV3IFJ1blRhc2sodGhpcywgdGFzaywgcGFyZW50cywgYXJncywgZW52KTtcbiAgICByZXR1cm4gb3B0aW9ucy5jYXB0dXJlT3V0cHV0ID8gcnVubmVyLnJ1bkNhcHR1cmluZ091dHB1dCgpIDogcnVubmVyLnJ1bigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLXJlYWRzIHRoZSB0YXNrcyBtYW5pZmVzdCBmcm9tIGRpc2sgaWYgaXRzIGNvbnRlbnRzIGNoYW5nZWQgc2luY2UgaXQgd2FzXG4gICAqIGxhc3QgbG9hZGVkLCB2ZXJpZnlpbmcgaXRzIHNjaGVtYSB2ZXJzaW9uIGFsb25nIHRoZSB3YXkuXG4gICAqXG4gICAqIENoYW5nZSBkZXRlY3Rpb24gY29tcGFyZXMgdGhlIHJhdyBmaWxlIGNvbnRlbnRzLCBzbyBhbiB1bmNoYW5nZWQgbWFuaWZlc3RcbiAgICogaXMgbm90IHJlLXZlcmlmaWVkIG9yIHJlLWFkb3B0ZWQuXG4gICAqL1xuICBwcml2YXRlIHJlbG9hZE1hbmlmZXN0SWZDaGFuZ2VkKCk6IHZvaWQge1xuICAgIGlmICghZXhpc3RzU3luYyh0aGlzLm1hbmlmZXN0UGF0aCkpIHtcbiAgICAgIC8vIE5vIG1hbmlmZXN0IG9uIGRpc2s6IHRyZWF0IGFzIGFuIGVtcHR5IHByb2plY3QgKGxlZ2FjeSBiZWhhdmlvcikuXG4gICAgICB0aGlzLl9tYW5pZmVzdCA9IHsgdGFza3M6IHt9IH07XG4gICAgICB0aGlzLl9pZGVudGl0eSA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByYXcgPSByZWFkRmlsZVN5bmModGhpcy5tYW5pZmVzdFBhdGgsIFwidXRmLThcIik7XG4gICAgaWYgKHJhdyA9PT0gdGhpcy5faWRlbnRpdHkpIHtcbiAgICAgIHJldHVybjsgLy8gdW5jaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGxvYWRcbiAgICB9XG5cbiAgICBjb25zdCBtYW5pZmVzdDogVGFza3NNYW5pZmVzdCA9IHBhcnNlQ29uZmxpY3RKU09OKHJhdywgdW5kZWZpbmVkLCBcInRoZWlyc1wiKTtcblxuICAgIC8vIEEgcHJldmlvdXNseSBsb2FkZWQgbWFuaWZlc3QgbWVhbnMgdGhpcyBpcyBhICpyZWxvYWQqIChlLmcuIHRoZVxuICAgIC8vIFwiZGVmYXVsdFwiL3N5bnRoIHRhc2sgcmVnZW5lcmF0ZWQgdGhlIGZpbGUgbWlkLXJ1biksIGFzIG9wcG9zZWQgdG8gdGhlXG4gICAgLy8gaW5pdGlhbCBsb2FkIHBlcmZvcm1lZCBieSB0aGUgY29uc3RydWN0b3IuXG4gICAgY29uc3QgaXNSZWxvYWQgPSB0aGlzLl9pZGVudGl0eSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgdGhpcy52ZXJpZnlNYW5pZmVzdChtYW5pZmVzdCk7XG4gICAgdGhpcy5fbWFuaWZlc3QgPSBtYW5pZmVzdDtcbiAgICB0aGlzLl9pZGVudGl0eSA9IHJhdztcblxuICAgIGlmIChpc1JlbG9hZCkge1xuICAgICAgbG9nZ2luZy5kZWJ1ZyhcbiAgICAgICAgYCR7VGFza1J1bnRpbWUuTUFOSUZFU1RfRklMRX0gY2hhbmdlZCBvbiBkaXNrOyBzdWNjZXNzZnVsbHkgbG9hZGVkIHRoZSBuZXcgdGFza3MgbWFuaWZlc3QuYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIGZyZXNobHkgcmVhZCBtYW5pZmVzdDpcbiAgICpcbiAgICogLSBMZWdhY3kgbWFuaWZlc3RzIChubyBgbWFuaWZlc3RWZXJzaW9uYCkgYXJlIGFjY2VwdGVkIGFzLWlzIGZvciBiYWNrd2FyZHNcbiAgICogICBjb21wYXRpYmlsaXR5LlxuICAgKiAtIE1hbmlmZXN0cyBmcm9tIGEgbmV3ZXIgcHJvamVuIChhIGhpZ2hlciBgbWFuaWZlc3RWZXJzaW9uYCkgYXJlIGFjY2VwdGVkXG4gICAqICAgd2l0aCBhIHdhcm5pbmcsIHNpbmNlIHRoaXMgcnVudGltZSBtYXkgbm90IHVuZGVyc3RhbmQgdGhlIHNjaGVtYS5cbiAgICovXG4gIHByaXZhdGUgdmVyaWZ5TWFuaWZlc3QobWFuaWZlc3Q6IFRhc2tzTWFuaWZlc3QpOiB2b2lkIHtcbiAgICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogbWFuaWZlc3RzIGdlbmVyYXRlZCBiZWZvcmUgdmVyc2lvbmluZyBjYXJyeSBub1xuICAgIC8vIHZlcnNpb24uXG4gICAgaWYgKG1hbmlmZXN0Lm1hbmlmZXN0VmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG1hbmlmZXN0Lm1hbmlmZXN0VmVyc2lvbiA+IFRBU0tTX01BTklGRVNUX1ZFUlNJT04pIHtcbiAgICAgIGxvZ2dpbmcud2FybihcbiAgICAgICAgYCR7VGFza1J1bnRpbWUuTUFOSUZFU1RfRklMRX0gd2FzIGdlbmVyYXRlZCBieSBhIG5ld2VyIHZlcnNpb24gb2YgcHJvamVuIGAgK1xuICAgICAgICAgIGAobWFuaWZlc3QgdmVyc2lvbiAke21hbmlmZXN0Lm1hbmlmZXN0VmVyc2lvbn0sIHRoaXMgcHJvamVuIHN1cHBvcnRzIHVwIHRvICR7VEFTS1NfTUFOSUZFU1RfVkVSU0lPTn0pLiBgICtcbiAgICAgICAgICBgU29tZSB0YXNrcyBtYXkgbm90IGJlaGF2ZSBhcyBleHBlY3RlZDsgY29uc2lkZXIgdXBncmFkaW5nIHByb2plbi5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgUnVuVGFzayB7XG4gIHByaXZhdGUgZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfSA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudHM6IHN0cmluZ1tdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgd29ya2Rpcjogc3RyaW5nO1xuXG4gIC8vIFdoZW4gc2V0LCBldmVyeSBzdGVwJ3Mgc3Rkb3V0IGlzIGNhcHR1cmVkIGFuZCBhY2N1bXVsYXRlZCAoZm9yIGEgc3Bhd25lZFxuICAvLyB0YXNrIHdob3NlIGFnZ3JlZ2F0ZSBvdXRwdXQgdGhlIGNhbGxlciB3YW50cykuXG4gIHByaXZhdGUgY2FwdHVyZUFsbCA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGNhcHR1cmVkOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIGBvdXRwdXRFbnZgIGNhcHR1cmVzLCBwcm9wYWdhdGVkIHRvIHNwYXduZWQgc3VidGFza3MgKGV4ZWMvYnVpbHRpbiBzdGVwc1xuICAvLyBzZWUgdGhlbSB2aWEgYHRoaXMuZW52YCkuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FwdHVyZWRFbnY6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBydW50aW1lOiBUYXNrUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhc2s6IFRhc2tTcGVjLFxuICAgIHBhcmVudHM6IHN0cmluZ1tdID0gW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcmdzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbnZQYXJhbTogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fSxcbiAgKSB7XG4gICAgdGhpcy53b3JrZGlyID0gdGFzay5jd2QgPz8gdGhpcy5ydW50aW1lLndvcmtkaXI7XG4gICAgdGhpcy5wYXJlbnRzID0gcGFyZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSB0YXNrLCBjYXB0dXJpbmcgYW5kIHJldHVybmluZyB0aGUgdHJpbW1lZCwgbmV3bGluZS1qb2luZWQgc3Rkb3V0XG4gICAqIG9mIGFsbCBpdHMgc3RlcHMgKGFuZCBhbnkgbmVzdGVkIHNwYXduZWQgdGFza3MpIGluIGV4ZWN1dGlvbiBvcmRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW5DYXB0dXJpbmdPdXRwdXQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmNhcHR1cmVBbGwgPSB0cnVlO1xuICAgIGF3YWl0IHRoaXMucnVuKCk7XG4gICAgcmV0dXJuIHRoaXMuY2FwdHVyZWQuam9pbihcIlxcblwiKS50cmltKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyBhIHN0ZXAncyBjYXB0dXJlZCAodHJpbW1lZCkgc3Rkb3V0OiBpbnRvIGBvdXRwdXRFbnZgIGZvciBsYXRlclxuICAgKiBzdGVwcyAoYW5kIHByb3BhZ2F0ZWQgdG8gc3Bhd25lZCBzdWJ0YXNrcyksIGFuZCBpbnRvIHRoZSBydW4ncyBhZ2dyZWdhdGVcbiAgICogb3V0cHV0IHdoZW4gY2FwdHVyaW5nIGV2ZXJ5dGhpbmcuXG4gICAqL1xuICBwcml2YXRlIHJlY29yZENhcHR1cmUob3V0cHV0RW52OiBzdHJpbmcgfCB1bmRlZmluZWQsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAob3V0cHV0RW52KSB7XG4gICAgICB0aGlzLmVudltvdXRwdXRFbnZdID0gdmFsdWU7XG4gICAgICB0aGlzLmNhcHR1cmVkRW52W291dHB1dEVudl0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FwdHVyZUFsbCkge1xuICAgICAgdGhpcy5jYXB0dXJlZC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgdGhlIHRhc2suIFRoaXMgd2FzIHByZXZpb3VzbHkgZG9uZSBpbiB0aGUgY29uc3RydWN0b3IsIGJ1dCBpcyBub3dcbiAgICogYW4gYXN5bmMgbWV0aG9kIHNpbmNlIHNoZWxsIGV4ZWN1dGlvbiBpcyBhc3luY2hyb25vdXMgKGUuZy4gZGF4IG9uXG4gICAqIFdpbmRvd3MpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHRhc2ssIGFyZ3MsIHBhcmVudHMgfSA9IHRoaXM7XG5cbiAgICBpZiAoIXRhc2suc3RlcHMgfHwgdGFzay5zdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9nRGVidWcoZ3JheShcIk5vIGFjdGlvbnMgaGF2ZSBiZWVuIHNwZWNpZmllZCBmb3IgdGhpcyB0YXNrLlwiKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5lbnYgPSBhd2FpdCB0aGlzLnJlc29sdmVFbnZpcm9ubWVudChcbiAgICAgIHRoaXMuZW52UGFyYW0sXG4gICAgICBwYXJlbnRzLFxuICAgICAgdGhpcy5yZXNvbHZlU2hlbGwoKSxcbiAgICApO1xuXG4gICAgY29uc3QgZW52bG9ncyA9IFtdO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW52KSkge1xuICAgICAgY29uc3QgdnYgPSB2ID8/IFwiXCI7XG4gICAgICBjb25zdCB0cmltbWVkID1cbiAgICAgICAgdnYubGVuZ3RoID4gRU5WX1RSSU1fTEVOID8gdnYuc3Vic3RyaW5nKDAsIEVOVl9UUklNX0xFTikgKyBcIi4uLlwiIDogdnY7XG4gICAgICBlbnZsb2dzLnB1c2goYCR7a309JHt0cmltbWVkfWApO1xuICAgIH1cblxuICAgIGlmIChlbnZsb2dzLmxlbmd0aCkge1xuICAgICAgdGhpcy5sb2dEZWJ1ZyhncmF5KGAke3VuZGVybGluZShcImVudlwiKX06ICR7ZW52bG9ncy5qb2luKFwiIFwiKX1gKSk7XG4gICAgfVxuXG4gICAgLy8gZXZhbHVhdGUgY29uZGl0aW9uXG4gICAgaWYgKCEoYXdhaXQgdGhpcy5ldmFsQ29uZGl0aW9uKHRhc2ssIHRoaXMucmVzb2x2ZVNoZWxsKCkpKSkge1xuICAgICAgdGhpcy5sb2coXCJjb25kaXRpb24gZXhpdGVkIHdpdGggbm9uLXplcm8gLSBza2lwcGluZ1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB2ZXJpZnkgd2UgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBkZWZpbmVkXG4gICAgY29uc3QgbWVyZ2VkID0geyAuLi5wcm9jZXNzLmVudiwgLi4udGhpcy5lbnYgfTtcbiAgICBjb25zdCBtaXNzaW5nID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdGFzay5yZXF1aXJlZEVudiA/PyBbXSkge1xuICAgICAgaWYgKCEobmFtZSBpbiBtZXJnZWQpKSB7XG4gICAgICAgIG1pc3NpbmcucHVzaChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBtaXNzaW5nIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlczogJHttaXNzaW5nLmpvaW4oXCIsXCIpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3RlcCBvZiB0YXNrLnN0ZXBzKSB7XG4gICAgICBjb25zdCBzdGVwU2hlbGwgPSB0aGlzLnJlc29sdmVTaGVsbChzdGVwKTtcblxuICAgICAgLy8gZXZhbHVhdGUgc3RlcCBjb25kaXRpb25cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuZXZhbENvbmRpdGlvbihzdGVwLCBzdGVwU2hlbGwpKSkge1xuICAgICAgICB0aGlzLmxvZyhcImNvbmRpdGlvbiBleGl0ZWQgd2l0aCBub24temVybyAtIHNraXBwaW5nXCIpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXJnc0xpc3Q6IHN0cmluZ1tdID0gW1xuICAgICAgICAuLi4oc3RlcC5hcmdzIHx8IFtdKSxcbiAgICAgICAgLi4uKHN0ZXAucmVjZWl2ZUFyZ3MgPyBhcmdzIDogW10pLFxuICAgICAgXS5tYXAoKGEpID0+IGEudG9TdHJpbmcoKSk7XG5cbiAgICAgIGlmIChzdGVwLnNheSkge1xuICAgICAgICBsb2dnaW5nLmluZm8odGhpcy5mbXRMb2coc3RlcC5zYXkpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0ZXAuc3Bhd24pIHtcbiAgICAgICAgY29uc3QgY2FwdHVyZSA9IHRoaXMuY2FwdHVyZUFsbCB8fCAhIXN0ZXAub3V0cHV0RW52O1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLnJ1bnRpbWUucnVuVGFzayhcbiAgICAgICAgICBzdGVwLnNwYXduLFxuICAgICAgICAgIFsuLi50aGlzLnBhcmVudHMsIHRoaXMudGFzay5uYW1lXSxcbiAgICAgICAgICBhcmdzTGlzdCxcbiAgICAgICAgICB7IC4uLnRoaXMuY2FwdHVyZWRFbnYsIC4uLnN0ZXAuZW52IH0sXG4gICAgICAgICAgeyBjYXB0dXJlT3V0cHV0OiBjYXB0dXJlIH0sXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlb2Ygb3V0cHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgdGhpcy5yZWNvcmRDYXB0dXJlKHN0ZXAub3V0cHV0RW52LCBvdXRwdXQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4ZWNzOiBBcnJheTxzdHJpbmcgfCBzdHJpbmdbXT4gPSBzdGVwLmV4ZWMgPyBbc3RlcC5leGVjXSA6IFtdO1xuXG4gICAgICAvLyBQYXJzZSBzdGVwLXNwZWNpZmljIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5ldmFsRW52aXJvbm1lbnQoc3RlcC5lbnYgPz8ge30sIHN0ZXBTaGVsbCk7XG5cbiAgICAgIGlmIChzdGVwLmJ1aWx0aW4pIHtcbiAgICAgICAgZXhlY3MucHVzaCh0aGlzLnJlbmRlckJ1aWx0aW4oc3RlcC5idWlsdGluKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGBleGVjQXJnc2AgaXMgYW4gZXhwbGljaXQgYXJndiAodGhlIHByb2dyYW0gZm9sbG93ZWQgYnkgaXRzIGFyZ3VtZW50cykuXG4gICAgICAvLyBJdCBpcyBoYW5kZWQgdG8gYHNoZWxsKClgIGFzIGFuIGFycmF5IHJhdGhlciB0aGFuIGEgcmVuZGVyZWQgc3RyaW5nLCBzb1xuICAgICAgLy8gaXQgcnVucyB3aXRob3V0IGEgc2hlbGwgYW5kIGV2ZXJ5IGVsZW1lbnQgaXMgcGFzc2VkIHRocm91Z2ggdmVyYmF0aW0gLVxuICAgICAgLy8gd2hpY2ggaXMgd2hhdCBsZXRzIGNhbGxlcnMgYXZvaWQgdGhpbmtpbmcgYWJvdXQgcXVvdGluZy4gRml4ZWQvcmVjZWl2ZWRcbiAgICAgIC8vIGFyZ3MgYXJlIHNwbGljZWQgaW4gd2hlcmV2ZXIgYSBgJEBgIG1hcmtlciBlbGVtZW50IGFwcGVhcnMgKG1pcnJvcmluZ1xuICAgICAgLy8gdGhlIHN0cmluZyBgZXhlY2AgYmVoYXZpb3IpLCBvciBhcHBlbmRlZCBhdCB0aGUgZW5kIGlmIHRoZXJlIGlzIG5vbmUuXG4gICAgICBpZiAoc3RlcC5leGVjQXJncykge1xuICAgICAgICBjb25zdCBhcmd2OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgcGxhY2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBzdGVwLmV4ZWNBcmdzKSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IEFSR1NfTUFSS0VSKSB7XG4gICAgICAgICAgICBhcmd2LnB1c2goLi4uYXJnc0xpc3QpO1xuICAgICAgICAgICAgcGxhY2VkID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJndi5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBsYWNlZCkge1xuICAgICAgICAgIGFyZ3YucHVzaCguLi5hcmdzTGlzdCk7XG4gICAgICAgIH1cbiAgICAgICAgZXhlY3MucHVzaChhcmd2KTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBleGVjIG9mIGV4ZWNzKSB7XG4gICAgICAgIGxldCBjb21tYW5kID0gZXhlYztcblxuICAgICAgICAvLyBBIHN0cmluZyBjb21tYW5kIGlzIGEgc2hlbGwgbGluZTogc3BsaWNlIHRhc2sgYXJncyBpbiBwZXIgdGhlIGAkQGBcbiAgICAgICAgLy8gbWFya2VyIHJ1bGVzLiBBbiBgZXhlY0FyZ3NgIGFyZ3YgYWxyZWFkeSBjYXJyaWVzIGl0cyBhcmdzLCB1bnRvdWNoZWQuXG4gICAgICAgIGlmICh0eXBlb2YgY29tbWFuZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGlmIChjb21tYW5kLmluY2x1ZGVzKFFVT1RFRF9BUkdTX01BUktFUikpIHtcbiAgICAgICAgICAgIC8vIGBcIiRAXCJgOiBzcGxpY2UgZWFjaCBhcmcgaW4gYXMgYSBzZXBhcmF0ZSB2ZXJiYXRpbSB3b3JkIChsaWtlXG4gICAgICAgICAgICAvLyBiYXNoJ3MgcXVvdGVkIGBcIiRAXCJgKSwgc28gd2hpdGVzcGFjZSBhbmQgbWV0YWNoYXJhY3RlcnMgc3Vydml2ZS5cbiAgICAgICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLnJlcGxhY2UoXG4gICAgICAgICAgICAgIFFVT1RFRF9BUkdTX01BUktFUixcbiAgICAgICAgICAgICAgYXJnc0xpc3QubWFwKHF1b3RlQXJnKS5qb2luKFwiIFwiKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmluY2x1ZGVzKEFSR1NfTUFSS0VSKSkge1xuICAgICAgICAgICAgY29tbWFuZCA9IGNvbW1hbmQucmVwbGFjZShBUkdTX01BUktFUiwgYXJnc0xpc3Quam9pbihcIiBcIikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21tYW5kID0gW2NvbW1hbmQsIC4uLmFyZ3NMaXN0XS5qb2luKFwiIFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjd2QgPSBzdGVwLmN3ZDtcbiAgICAgICAgY29uc3QgY2FwdHVyZSA9IHRoaXMuY2FwdHVyZUFsbCB8fCAhIXN0ZXAub3V0cHV0RW52O1xuICAgICAgICAvLyBBIHRocm93biBlcnJvciAoZS5nLiBzcGF3biBmYWlsdXJlKSBwcm9wYWdhdGVzOyBhIG5vbi16ZXJvIGV4aXQgaXNcbiAgICAgICAgLy8gcmVwb3J0ZWQgdmlhIGByZXN1bHQuc3RhdHVzYC5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaGVsbCh7XG4gICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICBjd2QsXG4gICAgICAgICAgZXh0cmFFbnY6IGVudixcbiAgICAgICAgICBzaGVsbDogc3RlcFNoZWxsLFxuICAgICAgICAgIGNhcHR1cmVPdXRwdXQ6IGNhcHR1cmUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUYXNrIFwiJHt0aGlzLmZ1bGxuYW1lfVwiIGZhaWxlZCB3aGVuIGV4ZWN1dGluZyBcIiR7XG4gICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY29tbWFuZCkgPyBjb21tYW5kLmpvaW4oXCIgXCIpIDogY29tbWFuZFxuICAgICAgICAgICAgfVwiIChjd2Q6ICR7cmVzb2x2ZShjd2QgPz8gdGhpcy53b3JrZGlyKX0pYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYXB0dXJlKSB7XG4gICAgICAgICAgY29uc3Qgc3Rkb3V0ID0gcmVzdWx0LnN0ZG91dD8udG9TdHJpbmcoXCJ1dGYtOFwiKS50cmltKCkgPz8gXCJcIjtcbiAgICAgICAgICB0aGlzLnJlY29yZENhcHR1cmUoc3RlcC5vdXRwdXRFbnYsIHN0ZG91dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIHRhc2sgc2hvdWxkIGJlIGV4ZWN1dGVkIGJhc2VkIG9uIFwiY29uZGl0aW9uXCIuXG4gICAqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgc2hvdWxkIGJlIGV4ZWN1dGVkIG9yIGZhbHNlIGlmIHRoZSBjb25kaXRpb25cbiAgICogZXZhbHVhdGVzIHRvIGZhbHNlIChleGl0cyB3aXRoIG5vbi16ZXJvKSwgaW5kaWNhdGluZyB0aGF0IHRoZSB0YXNrIHNob3VsZFxuICAgKiBiZSBza2lwcGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBldmFsQ29uZGl0aW9uKFxuICAgIHRhc2tPclN0ZXA6IFRhc2tTcGVjIHwgVGFza1N0ZXAsXG4gICAgc2hlbGw6IHN0cmluZyB8IHN0cmluZ1tdLFxuICApIHtcbiAgICAvLyBubyBjb25kaXRpb24sIGNhcnJ5IG9uXG4gICAgaWYgKCF0YXNrT3JTdGVwLmNvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5sb2coZ3JheShgJHt1bmRlcmxpbmUoXCJjb25kaXRpb25cIil9OiAke3Rhc2tPclN0ZXAuY29uZGl0aW9ufWApKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNoZWxsKHtcbiAgICAgIGNvbW1hbmQ6IHRhc2tPclN0ZXAuY29uZGl0aW9uLFxuICAgICAgcXVpZXQ6IHRydWUsXG4gICAgICBzaGVsbCxcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHNoZWxsIGNvbW1hbmRzIChlLmcuIGAkKHh4KWApXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV2YWxFbnZpcm9ubWVudChcbiAgICBlbnY6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9LFxuICAgIHNoZWxsOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKSB7XG4gICAgY29uc3Qgb3V0cHV0OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfSA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52ID8/IHt9KSkge1xuICAgICAgaWYgKFN0cmluZyh2YWx1ZSkuc3RhcnRzV2l0aChcIiQoXCIpICYmIFN0cmluZyh2YWx1ZSkuZW5kc1dpdGgoXCIpXCIpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gdmFsdWUuc3Vic3RyaW5nKDIsIHZhbHVlLmxlbmd0aCAtIDEpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNoZWxsKHtcbiAgICAgICAgICBjb21tYW5kOiBxdWVyeSxcbiAgICAgICAgICBxdWlldDogdHJ1ZSxcbiAgICAgICAgICBjYXB0dXJlT3V0cHV0OiB0cnVlLFxuICAgICAgICAgIHNoZWxsLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5lcnJvclxuICAgICAgICAgICAgPyByZXN1bHQuZXJyb3Iuc3RhY2tcbiAgICAgICAgICAgIDogcmVzdWx0LnN0ZGVycj8udG9TdHJpbmcoKS50cmltKCkgfHxcbiAgICAgICAgICAgICAgcmVzdWx0LnN0ZG91dD8udG9TdHJpbmcoKS50cmltKCkgfHxcbiAgICAgICAgICAgICAgYGNvbW1hbmQgZXhpdGVkIHdpdGggY29kZSAke3Jlc3VsdC5zdGF0dXN9YDtcblxuICAgICAgICAgIGxvZ2dpbmcud2FybihcbiAgICAgICAgICAgIHRoaXMuZm10TG9nKFxuICAgICAgICAgICAgICBgJHt1bmRlcmxpbmUoa2V5KX06IHVuYWJsZSB0byBldmFsdWF0ZSBcIiR7cXVlcnl9XCIuIEVudmlyb25tZW50IHZhcmlhYmxlIHdpbGwgYmUgc2tpcHBlZC4gQ2hlY2sgdGhhdCB0aGUgY29tbWFuZCBleGlzdHMgYW5kIHJ1bnMgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9nZ2luZy53YXJuKHRoaXMuZm10TG9nKGAke3VuZGVybGluZShrZXkpfTogJHtlcnJvcn1gKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0cHV0W2tleV0gPSByZXN1bHQuc3Rkb3V0Py50b1N0cmluZyhcInV0Zi04XCIpLnRyaW0oKSA/PyBcIlwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgZm9yIGEgdGFzay4gTmFtZWx5LCBpdCBzdXBwb3J0cyB0aGlzIHN5bnRheFxuICAgKiBgJCh4eClgIGZvciBhbGxvd2luZyBlbnZpcm9ubWVudCB0byBiZSBldmFsdWF0ZWQgYnkgZXhlY3V0aW5nIGEgc2hlbGxcbiAgICogY29tbWFuZCBhbmQgb2J0YWluaW5nIGl0cyByZXN1bHQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVFbnZpcm9ubWVudChcbiAgICBlbnZQYXJhbTogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgcGFyZW50czogc3RyaW5nW10sXG4gICAgc2hlbGw6IHN0cmluZyB8IHN0cmluZ1tdLFxuICApIHtcbiAgICBsZXQgZW52ID0gdGhpcy5ydW50aW1lLm1hbmlmZXN0LmVudiA/PyB7fTtcblxuICAgIC8vIGFkZCBlbnYgZnJvbSBhbGwgcGFyZW50IHRhc2tzIG9uZSBieSBvbmVcbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBwYXJlbnRzKSB7XG4gICAgICBlbnYgPSB7XG4gICAgICAgIC4uLmVudixcbiAgICAgICAgLi4uKHRoaXMucnVudGltZS50cnlGaW5kVGFzayhwYXJlbnQpPy5lbnYgPz8ge30pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBhcHBseSB0YXNrIGVudmlyb25tZW50LCB0aGVuIHRoZSBzcGVjaWZpYyBlbnYgbGFzdFxuICAgIGVudiA9IHtcbiAgICAgIC4uLmVudixcbiAgICAgIC4uLih0aGlzLnRhc2suZW52ID8/IHt9KSxcbiAgICAgIC4uLmVudlBhcmFtLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5ldmFsRW52aXJvbm1lbnQoZW52LCBzaGVsbCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHNoZWxsIGZvciBhIHN0ZXAncyBjb21tYW5kIChvciB0aGUgdGFzaydzLCB3aGVuIG5vIHN0ZXAgaXNcbiAgICogZ2l2ZW4pOiBzdGVwLCB0aGVuIHRhc2ssIHRoZW4gcHJvamVjdCBkZWZhdWx0LCB0aGVuIFwicHJvamVuXCIuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVTaGVsbChzdGVwPzogVGFza1N0ZXApOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN0ZXA/LnNoZWxsID8/IHRoaXMudGFzay5zaGVsbCA/PyB0aGlzLnJ1bnRpbWUubWFuaWZlc3Quc2hlbGwgPz8gXCJwcm9qZW5cIlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgXCJmdWxsIG5hbWVcIiBvZiB0aGUgdGFzayB3aGljaCBpbmNsdWRlcyBhbGwgaXQncyBwYXJlbnQgdGFzayBuYW1lcyBjb25jYXRlbmF0ZWQgYnkgY2hldnJvbnMuXG4gICAqL1xuICBwcml2YXRlIGdldCBmdWxsbmFtZSgpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMucGFyZW50cywgdGhpcy50YXNrLm5hbWVdLmpvaW4oXCIgwrsgXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2coLi4uYXJnczogYW55W10pIHtcbiAgICBsb2dnaW5nLnZlcmJvc2UodGhpcy5mbXRMb2coLi4uYXJncykpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dEZWJ1ZyguLi5hcmdzOiBhbnlbXSkge1xuICAgIGxvZ2dpbmcuZGVidWcodGhpcy5mbXRMb2coLi4uYXJncykpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbXRMb2coLi4uYXJnczogYW55W10pIHtcbiAgICByZXR1cm4gZm9ybWF0KGAke3VuZGVybGluZSh0aGlzLmZ1bGxuYW1lKX0gfGAsIC4uLmFyZ3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaGVsbChvcHRpb25zOiBTaGVsbE9wdGlvbnMpOiBQcm9taXNlPFNoZWxsUmVzdWx0PiB7XG4gICAgY29uc3QgcXVpZXQgPSBvcHRpb25zLnF1aWV0ID8/IGZhbHNlO1xuICAgIGlmICghcXVpZXQpIHtcbiAgICAgIGNvbnN0IGxvZyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICAgIGxvZy5wdXNoKFxuICAgICAgICBBcnJheS5pc0FycmF5KG9wdGlvbnMuY29tbWFuZClcbiAgICAgICAgICA/IG9wdGlvbnMuY29tbWFuZC5qb2luKFwiIFwiKVxuICAgICAgICAgIDogb3B0aW9ucy5jb21tYW5kLFxuICAgICAgKTtcblxuICAgICAgaWYgKG9wdGlvbnMuY3dkKSB7XG4gICAgICAgIGxvZy5wdXNoKGAoY3dkOiAke29wdGlvbnMuY3dkfSlgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cobG9nLmpvaW4oXCIgXCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjd2QgPSBvcHRpb25zLmN3ZCA/PyB0aGlzLndvcmtkaXI7XG4gICAgaWYgKCFleGlzdHNTeW5jKGN3ZCkgfHwgIXN0YXRTeW5jKGN3ZCkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgaW52YWxpZCB3b3JrZGlyIChjd2QpOiAke2N3ZH0gbXVzdCBiZSBhbiBleGlzdGluZyBkaXJlY3RvcnlgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVzb2x2ZWQgc2hlbGwgaXMgb25lIG9mOlxuICAgIC8vIC0gXCJwcm9qZW5cIiAoZGVmYXVsdCk6IGRheCdzIGluLXByb2Nlc3MgY3Jvc3MtcGxhdGZvcm0gc2hlbGwsIHNvIFBPU0lYLXN0eWxlXG4gICAgLy8gICB0YXNrIHN5bnRheCAoYG1rZGlyIC1wYCwgYCYmYCwgYCRWQVJgLCAuLi4pIHdvcmtzIHRoZSBzYW1lIGV2ZXJ5d2hlcmUuXG4gICAgLy8gLSBcInN5c3RlbVwiOiB0aGUgaG9zdCdzIG5hdGl2ZSBzaGVsbCAoYC9iaW4vc2hgLCBvciBgY21kLmV4ZWAgb24gV2luZG93cykuXG4gICAgLy8gLSBhbiBhcmd2LCBlLmcuIFtcImJhc2hcIixcIi1jXCJdOiBhIHNoZWxsIGludm9jYXRpb24gd2l0aCB0aGUgY29tbWFuZCBhcHBlbmRlZFxuICAgIC8vICAgYXMgaXRzIGZpbmFsIGFyZ3VtZW50LlxuICAgIGNvbnN0IHNoZWxsID0gb3B0aW9ucy5zaGVsbCA/PyBcInByb2plblwiO1xuICAgIGlmICh0eXBlb2Ygc2hlbGwgPT09IFwic3RyaW5nXCIgJiYgc2hlbGwgIT09IFwicHJvamVuXCIgJiYgc2hlbGwgIT09IFwic3lzdGVtXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHVua25vd24gYnVpbHQtaW4gc2hlbGwgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBzaGVsbCxcbiAgICAgICAgKX07IHVzZSB0aGUgYnVpbHQtaW4gXCJwcm9qZW5cIiBvciBcInN5c3RlbVwiIHNoZWxscywgb3IgYSBUYXNrU2hlbGwuY29tbWFuZChbLi4uXSkgaW52b2NhdGlvbmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNhcHR1cmUgPSBvcHRpb25zLmNhcHR1cmVPdXRwdXQgPz8gZmFsc2U7XG4gICAgLy8gUXVpZXQgY2FwdHVyZXMgKGAkKC4uLilgLCBjb25kaXRpb25zKSBzdGF5IHNpbGVudDsgdmlzaWJsZSBjYXB0dXJlc1xuICAgIC8vIChgb3V0cHV0RW52YCkgc3RyZWFtIGxpdmUgd2hpbGUgc3RpbGwgYnVmZmVyaW5nLlxuICAgIGNvbnN0IHN0cmVhbSA9IGNhcHR1cmUgJiYgIXF1aWV0O1xuXG4gICAgY29uc3QgY29tbWFuZCA9IG9wdGlvbnMuY29tbWFuZDtcbiAgICBjb25zdCBlbnYgPSB7XG4gICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgIC4uLnRoaXMuZW52LFxuICAgICAgLi4ub3B0aW9ucy5leHRyYUVudixcbiAgICB9O1xuXG4gICAgLy8gXCJzeXN0ZW1cIjogdGhlIGhvc3QtbmF0aXZlIGVuZ2luZS4gQSBzdHJpbmcgY29tbWFuZCBydW5zIHRocm91Z2ggdGhlIE9TXG4gICAgLy8gc2hlbGw7IGFuIGBleGVjQXJnc2AgYXJndiBpcyBzcGF3bmVkIGRpcmVjdGx5IChzaGVsbC1mcmVlKSwgc28gdGhlIHJlYWxcbiAgICAvLyBiaW5hcnkgcnVucyB3aXRoIG5vIGRheCBidWlsdC1pbnMuIChPbmx5IGAkKC4uLilgL2NvbmRpdGlvbiBldmFsIGNhcHR1cmVzLFxuICAgIC8vIGFuZCB0aG9zZSBhbHdheXMgcGFzcyBhIHN0cmluZywgc28gYW4gYXJyYXkgY29tbWFuZCBuZXZlciBuZWVkcyBjYXB0dXJlLilcbiAgICBpZiAoc2hlbGwgPT09IFwic3lzdGVtXCIpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbW1hbmQpKSB7XG4gICAgICAgIGNvbnN0IFtwcm9ncmFtLCAuLi5hcmdzXSA9IGNvbW1hbmQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdG9vbChwcm9ncmFtKS5ydW4oYXJncywgeyBjd2QsIGVudiwgaW5oZXJpdFN0ZGlvOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB7IHN0YXR1czogMCB9O1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGU/LnN0YXR1cyA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBlLnN0YXR1cyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3lzdGVtU2hlbGwoY29tbWFuZCwgeyBjd2QsIGVudiwgY2FwdHVyZSwgc3RyZWFtIH0pO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSBydW4gdGhyb3VnaCBkYXg6IHRoZSBcInByb2plblwiIHNoZWxsIG9yIGFuIGV4cGxpY2l0IGludm9jYXRpb24uXG4gICAgY29uc3QgYnVpbGRlciA9IHRoaXMuYnVpbGREYXhDb21tYW5kKGNvbW1hbmQsIHNoZWxsKTtcblxuICAgIC8vIGBpbmhlcml0UGlwZWRgIHN0cmVhbXMgYW5kIGJ1ZmZlcnM7IGBwaXBlZGAgYnVmZmVycyBxdWlldGx5LiBzdGRlcnIgaXNcbiAgICAvLyBidWZmZXJlZCBvbmx5IGZvciBxdWlldCBjYXB0dXJlcywgc28gaXQgY2FuIHN1cmZhY2UgaW4gZXJyb3JzLlxuICAgIGNvbnN0IHN0ZG91dE1vZGUgPSBjYXB0dXJlXG4gICAgICA/IHN0cmVhbVxuICAgICAgICA/IFwiaW5oZXJpdFBpcGVkXCJcbiAgICAgICAgOiBcInBpcGVkXCJcbiAgICAgIDogXCJpbmhlcml0XCI7XG4gICAgY29uc3Qgc3RkZXJyTW9kZSA9IGNhcHR1cmUgJiYgIXN0cmVhbSA/IFwicGlwZWRcIiA6IFwiaW5oZXJpdFwiO1xuXG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgYnVpbGRlclxuICAgICAgICAuY3dkKGN3ZClcbiAgICAgICAgLmVudihlbnYpXG4gICAgICAgIC5zdGRvdXQoc3Rkb3V0TW9kZSlcbiAgICAgICAgLnN0ZGVycihzdGRlcnJNb2RlKVxuICAgICAgICAubm9UaHJvdygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGRheCdzIGluLXByb2Nlc3Mgc2hlbGwgdGhyb3dzIGEgdGVyc2UgYE5vdCBpbXBsZW1lbnRlZDogLi4uYCBmb3Igc2hlbGxcbiAgICAgIC8vIHN5bnRheCBpdCBkb2VzIG5vdCBzdXBwb3J0IChlLmcuIGAkKC4uLilgIGNvbW1hbmQgc3Vic3RpdHV0aW9uKTsgdHVyblxuICAgICAgLy8gdGhhdCBpbnRvIGFuIGFjdGlvbmFibGUgZXJyb3IgdGhhdCBwb2ludHMgYXQgdGhlIHN5c3RlbS1zaGVsbCBlc2NhcGVcbiAgICAgIC8vIGhhdGNoLiBPdGhlciBlcnJvcnMgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZC5cbiAgICAgIHRocm93IGVucmljaEJ1aWx0aW5TaGVsbEVycm9yKGUsIGNvbW1hbmQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IHJlc3VsdC5jb2RlLFxuICAgICAgc3Rkb3V0OiBjYXB0dXJlID8gQnVmZmVyLmZyb20ocmVzdWx0LnN0ZG91dEJ5dGVzKSA6IG51bGwsXG4gICAgICBzdGRlcnI6IGNhcHR1cmUgJiYgIXN0cmVhbSA/IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGRlcnJCeXRlcykgOiBudWxsLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkYXggY29tbWFuZCBmb3IgdGhlIFwicHJvamVuXCIgc2hlbGwgb3IgYW4gZXhwbGljaXQgaW52b2NhdGlvbi5cbiAgICogKFRoZSBcInN5c3RlbVwiIHNoZWxsIGlzIGhhbmRsZWQgaG9zdC1zaWRlLCBub3QgaGVyZS4pIGBjb21tYW5kYCBpcyBhIHNoZWxsXG4gICAqIGxpbmUgKHN0cmluZykgb3IgYW4gYGV4ZWNBcmdzYCBhcmd2IChzdHJpbmdbXSk7IGBzaGVsbGAgaXMgYFwicHJvamVuXCJgIG9yIGFuXG4gICAqIGludm9jYXRpb24gYXJndiBzdWNoIGFzIGBbXCJiYXNoXCIsIFwiLWNcIl1gLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZERheENvbW1hbmQoXG4gICAgY29tbWFuZDogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgc2hlbGw6IHN0cmluZyB8IHN0cmluZ1tdLFxuICApIHtcbiAgICAvLyBBbiBpbnZvY2F0aW9uIChlLmcuIFtcImJhc2hcIixcIi1jXCJdLCBbXCJucHhcIixcIi0tbm9cIixcIi1jXCJdKTogYXBwZW5kIHRoZVxuICAgIC8vIGNvbW1hbmQgYXMgaXRzIGZpbmFsIGFyZ3VtZW50LiBBIHN0cmluZyBpcyBhcHBlbmRlZCBhcy1pczsgYW4gYGV4ZWNBcmdzYFxuICAgIC8vIGFyZ3YgaXMgcmVuZGVyZWQgdG8gYSBxdW90ZWQgY29tbWFuZCBsaW5lIHNvIHRoZSBzaGVsbCByZS1wYXJzZXMgdGhlIHNhbWVcbiAgICAvLyBhcmd2LlxuICAgIGlmIChBcnJheS5pc0FycmF5KHNoZWxsKSkge1xuICAgICAgY29uc3QgW3Byb2dyYW0sIC4uLmZsYWdzXSA9IHNoZWxsO1xuICAgICAgY29uc3QgY29tbWFuZExpbmUgPSBBcnJheS5pc0FycmF5KGNvbW1hbmQpXG4gICAgICAgID8gY29tbWFuZC5tYXAocXVvdGVBcmcpLmpvaW4oXCIgXCIpXG4gICAgICAgIDogY29tbWFuZDtcbiAgICAgIHJldHVybiAkYCR7cHJvZ3JhbX0gJHtbLi4uZmxhZ3MsIGNvbW1hbmRMaW5lXX1gO1xuICAgIH1cblxuICAgIC8vIFRoZSBidWlsdC1pbiBcInByb2plblwiIHNoZWxsIChkYXgpLlxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbW1hbmQpXG4gICAgICA/IC8vIGV4ZWNBcmdzOiBzaGVsbC1mcmVlIGFyZ3YgKGVhY2ggZWxlbWVudCBlc2NhcGVkOyBgLmNtZGAgc2hpbXMgcmVzb2x2ZWQpLlxuICAgICAgICAkYCR7Y29tbWFuZFswXX0gJHtjb21tYW5kLnNsaWNlKDEpfWBcbiAgICAgIDogLy8gc3RyaW5nIGNvbW1hbmQsIHBhcnNlZCBpbi1wcm9jZXNzIGJ5IGRheCdzIGNyb3NzLXBsYXRmb3JtIHNoZWxsLlxuICAgICAgICAkLnJhd2Ake2NvbW1hbmR9YDtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQnVpbHRpbihidWlsdGluOiBzdHJpbmcpIHtcbiAgICAvLyBMb2NhdGUgcHJvamVuJ3MgcGFja2FnZSByb290IGJ5IHdhbGtpbmcgdXAgZnJvbSB0aGlzIG1vZHVsZSdzIGRpcmVjdG9yeVxuICAgIC8vIHVudGlsIHdlIGZpbmQgYSBwYWNrYWdlLmpzb24uIFRoaXMgd29ya3Mgd2hldGhlciB0aGUgY29kZSBydW5zIGZyb20gdGhlXG4gICAgLy8gY29tcGlsZWQgZmlsZSAobGliL2NsaS90YXNrLXJ1bnRpbWUuanMpIG9yIGZyb20gdGhlIGJ1bmRsZWQgcnVuLXRhc2suY2pzXG4gICAgLy8gKGxpYi9ydW4tdGFzay5janMpLCB3aGljaCBsaXZlIGF0IGRpZmZlcmVudCBkZXB0aHMgLSBzbyBhIGhhcmQtY29kZWRcbiAgICAvLyByZWxhdGl2ZSBwYXRoIHRvIHBhY2thZ2UuanNvbiB3b3VsZCBiZSB3cm9uZyBpbiBvbmUgb2YgdGhlIHR3byBjYXNlcy5cbiAgICBsZXQgbW9kdWxlUm9vdCA9IF9fZGlybmFtZTtcbiAgICB3aGlsZSAoIWV4aXN0c1N5bmMoam9pbihtb2R1bGVSb290LCBcInBhY2thZ2UuanNvblwiKSkpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IGRpcm5hbWUobW9kdWxlUm9vdCk7XG4gICAgICBpZiAocGFyZW50ID09PSBtb2R1bGVSb290KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuYWJsZSB0byBsb2NhdGUgdGhlIHByb2plbiBwYWNrYWdlIHJvb3RcIik7XG4gICAgICB9XG4gICAgICBtb2R1bGVSb290ID0gcGFyZW50O1xuICAgIH1cbiAgICBjb25zdCBwcm9ncmFtID0gcmVxdWlyZS5yZXNvbHZlKFxuICAgICAgam9pbihtb2R1bGVSb290LCBcImxpYlwiLCBgJHtidWlsdGlufS50YXNrLmpzYCksXG4gICAgKTtcbiAgICByZXR1cm4gYFwiJHtwcm9jZXNzLmV4ZWNQYXRofVwiIFwiJHtwcm9ncmFtfVwiYDtcbiAgfVxufVxuXG5pbnRlcmZhY2UgU2hlbGxPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21tYW5kIHRvIHJ1bi4gQSBzdHJpbmcgaXMgZXhlY3V0ZWQgYXMgYSBzaGVsbCBjb21tYW5kIGxpbmU7IGFcbiAgICogc3RyaW5nIGFycmF5IGlzIGFuIGV4cGxpY2l0IGFyZ3YgKHByb2dyYW0gKyBhcmd1bWVudHMpIGV4ZWN1dGVkIHdpdGhvdXQgYVxuICAgKiBzaGVsbC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipcbiAgICogQGRlZmF1bHQgLSBwcm9qZWN0IGRpclxuICAgKi9cbiAgcmVhZG9ubHkgY3dkPzogc3RyaW5nO1xuICAvKipcbiAgICogQ2FwdHVyZSBzdGRvdXQvc3RkZXJyIChzbyB0aGUgY2FsbGVyIGNhbiByZWFkIHRoZW0gZnJvbSB0aGUgcmVzdWx0KVxuICAgKiBpbnN0ZWFkIG9mIGluaGVyaXRpbmcgdGhlIHBhcmVudCdzIHN0cmVhbXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjYXB0dXJlT3V0cHV0PzogYm9vbGVhbjtcbiAgLyoqIEBkZWZhdWx0IGZhbHNlICovXG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZXh0cmFFbnY/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfTtcbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBzaGVsbCB0byBpbnRlcnByZXQgdGhlIGNvbW1hbmQgKGUuZy4gXCJwcm9qZW5cIiwgXCJiYXNoIC1jXCIpLlxuICAgKiBAZGVmYXVsdCBcInByb2plblwiXG4gICAqL1xuICByZWFkb25seSBzaGVsbD86IHN0cmluZyB8IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZWQgcmVzdWx0IG9mIHJ1bm5pbmcgYSBjb21tYW5kIHRocm91Z2ggdGhlIHN5c3RlbSBzaGVsbCAoYSBzdWJzZXQgb2ZcbiAqIG5vZGUncyBgU3Bhd25TeW5jUmV0dXJuc2ApLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN5c3RlbVNoZWxsUmVzdWx0IHtcbiAgLyoqIEV4aXQgY29kZSwgb3IgYG51bGxgIGlmIHRlcm1pbmF0ZWQgYnkgYSBzaWduYWwgb3IgbmV2ZXIgc3Bhd25lZC4gKi9cbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIgfCBudWxsO1xuICAvKiogQ2FwdHVyZWQgc3Rkb3V0LCBvciBgbnVsbGAgd2hlbiBzdGRvdXQgd2FzIGluaGVyaXRlZC4gKi9cbiAgcmVhZG9ubHkgc3Rkb3V0OiBCdWZmZXIgfCBudWxsO1xuICAvKiogQ2FwdHVyZWQgc3RkZXJyLCBvciBgbnVsbGAgd2hlbiBzdGRlcnIgd2FzIGluaGVyaXRlZC4gKi9cbiAgcmVhZG9ubHkgc3RkZXJyOiBCdWZmZXIgfCBudWxsO1xuICAvKiogQW4gZXJyb3IgcmFpc2VkIHdoaWxlIGF0dGVtcHRpbmcgdG8gc3Bhd24gKG5vdCBhIG5vbi16ZXJvIGV4aXQpLiAqL1xuICByZWFkb25seSBlcnJvcj86IEVycm9yO1xufVxuXG4vKipcbiAqIFJ1bnMgYSBjb21tYW5kIGxpbmUgdGhyb3VnaCB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIG5hdGl2ZSBzaGVsbC5cbiAqXG4gKiBDYWxscyB0aGUgT1Mgc2hlbGwgdmlhIGBjaGlsZF9wcm9jZXNzYCB3aXRoIGBzaGVsbDogdHJ1ZWAuXG4gKiBUaGlzIGJhY2tzIHRoZSBgc3lzdGVtYCB0YXNrIHNoZWxsLCB3aGljaCBsZXRzIGEgdXNlciBvcHQgb3V0IG9mIHRoZSBidWlsdC1pblxuICogY3Jvc3MtcGxhdGZvcm0gc2hlbGwgYW5kIHVzZSB0aGUgaG9zdCdzIG5hdGl2ZSBzaGVsbCBpbnN0ZWFkOlxuICogYC9iaW4vc2hgb24gUE9TSVggYW5kIGBjbWQuZXhlYCBvbiBXaW5kb3dzLlxuICpcbiAqIE5ldmVyIHRocm93cyBmb3IgYSBub24temVybyBleGl0ICh0aGF0IGlzIHJlcG9ydGVkIHZpYSBgc3RhdHVzYCk7XG4gKiBhIHNwYXduIGZhaWx1cmUgaXMgcmVwb3J0ZWQgdmlhIGBlcnJvcmAuIFRoZSBjYWxsZXIgc3VwcGxpZXMgdGhlIGZ1bGwgYGVudmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzeXN0ZW1TaGVsbChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBvcHRpb25zOiB7XG4gICAgY3dkOiBzdHJpbmc7XG4gICAgZW52PzogTm9kZUpTLlByb2Nlc3NFbnY7XG4gICAgY2FwdHVyZT86IGJvb2xlYW47XG4gICAgc3RyZWFtPzogYm9vbGVhbjtcbiAgfSxcbik6IFN5c3RlbVNoZWxsUmVzdWx0IHtcbiAgbG9nZ2luZy5kZWJ1ZyhgJHtjb21tYW5kfSAoY3dkOiAke29wdGlvbnMuY3dkfSlgKTtcbiAgY29uc3QgcmVzdWx0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoY29tbWFuZCwge1xuICAgIGN3ZDogb3B0aW9ucy5jd2QsXG4gICAgc2hlbGw6IHRydWUsXG4gICAgbWF4QnVmZmVyOiBNQVhfQlVGRkVSLFxuICAgIGVudjogb3B0aW9ucy5lbnYsXG4gICAgLy8gUXVpZXQgY2FwdHVyZSBidWZmZXJzIHN0ZGVyciBmb3IgZXJyb3IgbWVzc2FnZXMuIFN0cmVhbWVkIGNhcHR1cmVcbiAgICAvLyBpbmhlcml0cyBzdGRlcnIgYW5kIHJlLWVtaXRzIGJ1ZmZlcmVkIHN0ZG91dCBhZnRlcndhcmRzLCBzaW5jZSBzcGF3blN5bmNcbiAgICAvLyBjYW4ndCBib3RoIHNob3cgYW5kIGJ1ZmZlciB0aGUgc2FtZSBzdHJlYW0gYXQgb25jZS5cbiAgICBzdGRpbzogb3B0aW9ucy5jYXB0dXJlXG4gICAgICA/IG9wdGlvbnMuc3RyZWFtXG4gICAgICAgID8gW1wiaW5oZXJpdFwiLCBcInBpcGVcIiwgXCJpbmhlcml0XCJdXG4gICAgICAgIDogW1wiaW5oZXJpdFwiLCBcInBpcGVcIiwgXCJwaXBlXCJdXG4gICAgICA6IFwiaW5oZXJpdFwiLFxuICB9KTtcbiAgaWYgKG9wdGlvbnMuY2FwdHVyZSAmJiBvcHRpb25zLnN0cmVhbSAmJiByZXN1bHQuc3Rkb3V0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUocmVzdWx0LnN0ZG91dCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMsXG4gICAgc3Rkb3V0OiByZXN1bHQuc3Rkb3V0ID8/IG51bGwsXG4gICAgc3RkZXJyOiByZXN1bHQuc3RkZXJyID8/IG51bGwsXG4gICAgZXJyb3I6IHJlc3VsdC5lcnJvcixcbiAgfTtcbn1cbiJdfQ==
package/lib/component.js CHANGED
@@ -16,7 +16,7 @@ const componentId = (scope) => {
16
16
  * @param id Unique id of the component. If not provided, an unstable AutoId is generated.
17
17
  */
18
18
  class Component extends constructs_1.Construct {
19
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Component", version: "0.101.13" };
19
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Component", version: "0.101.15" };
20
20
  /**
21
21
  * Test whether the given construct is a component.
22
22
  */
@@ -175,7 +175,7 @@ function guardDetached(target) {
175
175
  * ```
176
176
  */
177
177
  class FutureComponent extends Component {
178
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.FutureComponent", version: "0.101.13" };
178
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.FutureComponent", version: "0.101.15" };
179
179
  newTargetName;
180
180
  attachedState = false;
181
181
  constructor() {
@@ -51,7 +51,7 @@ const json_1 = require("./json");
51
51
  * `nodeProject.addDeps()` or use the generic API of `project.deps`:
52
52
  */
53
53
  class Dependencies extends component_1.Component {
54
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Dependencies", version: "0.101.13" };
54
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Dependencies", version: "0.101.15" };
55
55
  /**
56
56
  * The project-relative path of the deps manifest file.
57
57
  */
package/lib/dev-env.js CHANGED
@@ -6,7 +6,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  * Options for specifying the Docker image of the container.
7
7
  */
8
8
  class DevEnvironmentDockerImage {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DevEnvironmentDockerImage", version: "0.101.13" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DevEnvironmentDockerImage", version: "0.101.15" };
10
10
  /**
11
11
  * A publicly available Docker image.
12
12
  * @example 'ubuntu:latest'
@@ -7,7 +7,7 @@ const docker_compose_1 = require("./docker-compose");
7
7
  * A docker-compose service.
8
8
  */
9
9
  class DockerComposeService {
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DockerComposeService", version: "0.101.13" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DockerComposeService", version: "0.101.15" };
11
11
  /**
12
12
  * Name of the service.
13
13
  */
@@ -11,7 +11,7 @@ const yaml_1 = require("../yaml");
11
11
  * Create a docker-compose YAML file.
12
12
  */
13
13
  class DockerCompose extends component_1.Component {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DockerCompose", version: "0.101.13" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DockerCompose", version: "0.101.15" };
15
15
  /**
16
16
  * Depends on a service name.
17
17
  */
package/lib/file.js CHANGED
@@ -45,7 +45,7 @@ const util_1 = require("./util");
45
45
  const constructs_1 = require("./util/constructs");
46
46
  const diff_1 = require("./util/diff");
47
47
  class FileBase extends component_1.Component {
48
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.FileBase", version: "0.101.13" };
48
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.FileBase", version: "0.101.15" };
49
49
  /**
50
50
  * The file path, relative to the project's outdir.
51
51
  */
@@ -32,7 +32,7 @@ var EndOfLine;
32
32
  * @see https://git-scm.com/docs/gitattributes
33
33
  */
34
34
  class GitAttributesFile extends file_1.FileBase {
35
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.GitAttributesFile", version: "0.101.13" };
35
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.GitAttributesFile", version: "0.101.15" };
36
36
  attributes = new Map();
37
37
  /**
38
38
  * The default end of line character for text files.
@@ -6,7 +6,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  * Manage the versions used for GitHub Actions used in steps
7
7
  */
8
8
  class GitHubActionsProvider {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHubActionsProvider", version: "0.101.13" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHubActionsProvider", version: "0.101.15" };
10
10
  actions = new Map();
11
11
  /**
12
12
  * Define an override for a given action.
@@ -9,7 +9,7 @@ const runner_options_1 = require("../runner-options");
9
9
  * Auto approve pull requests that meet a criteria
10
10
  */
11
11
  class AutoApprove extends component_1.Component {
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoApprove", version: "0.101.13" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoApprove", version: "0.101.15" };
13
13
  label;
14
14
  constructor(github, options = {}) {
15
15
  super(github.project);
@@ -19,7 +19,7 @@ const component_1 = require("../component");
19
19
  * @see https://mergify.com/
20
20
  */
21
21
  class AutoMerge extends component_1.Component {
22
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoMerge", version: "0.101.13" };
22
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoMerge", version: "0.101.15" };
23
23
  lazyConditions = new Array();
24
24
  constructor(github, options = {}) {
25
25
  super(github.project);
@@ -54,7 +54,7 @@ var MergeMethod;
54
54
  * PRs will be merged once they pass required checks.
55
55
  */
56
56
  class AutoQueue extends component_1.Component {
57
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoQueue", version: "0.101.13" };
57
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoQueue", version: "0.101.15" };
58
58
  constructor(scope, options = {}) {
59
59
  super(scope);
60
60
  const workflowEngine = github_1.GitHub.of(this.project);
@@ -166,7 +166,7 @@ var VersioningStrategy;
166
166
  * on the lockfile itself will be proposed.
167
167
  */
168
168
  class Dependabot extends component_1.Component {
169
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.Dependabot", version: "0.101.13" };
169
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.Dependabot", version: "0.101.15" };
170
170
  /**
171
171
  * The raw dependabot configuration.
172
172
  * @see https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates
@@ -15,7 +15,7 @@ const runner_options_1 = require("../runner-options");
15
15
  * @see https://github.com/actions/dependency-review-action
16
16
  */
17
17
  class DependencyReview extends component_1.Component {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.DependencyReview", version: "0.101.13" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.DependencyReview", version: "0.101.15" };
19
19
  constructor(github, options = {}) {
20
20
  super(github.project);
21
21
  const commentSummary = options.commentSummaryInPr ?? "always";
@@ -41,7 +41,7 @@ const Case = __importStar(require("case"));
41
41
  */
42
42
  class GithubCredentials {
43
43
  options;
44
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GithubCredentials", version: "0.101.13" };
44
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GithubCredentials", version: "0.101.15" };
45
45
  /**
46
46
  * Provide API access through a GitHub personal access token.
47
47
  *
@@ -21,7 +21,7 @@ const vscode_1 = require("../vscode");
21
21
  * "engines" can be used to implement our CI/CD solutions.
22
22
  */
23
23
  class GitHubProject extends project_1.Project {
24
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHubProject", version: "0.101.13" };
24
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHubProject", version: "0.101.15" };
25
25
  /**
26
26
  * Access all github components.
27
27
  *