@wbce/projen-d9 0.0.28 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (421) hide show
  1. package/.jsii +184 -45
  2. package/API.md +153 -37
  3. package/CHANGELOG.md +13 -0
  4. package/README.md +10 -3
  5. package/docs/D9-plumbing.md +189 -0
  6. package/lib/cli/atlas.d.ts +10 -0
  7. package/lib/cli/atlas.js +65 -0
  8. package/lib/cli/commands/cedar/cedar-format.d.ts +7 -0
  9. package/lib/cli/commands/cedar/cedar-format.js +75 -0
  10. package/lib/cli/commands/cedar/cedar-to-d9-translations.d.ts +12 -0
  11. package/lib/cli/commands/cedar/cedar-to-d9-translations.js +130 -0
  12. package/lib/cli/commands/cedar/cedar-to-d9.d.ts +57 -0
  13. package/lib/cli/commands/cedar/cedar-to-d9.js +221 -0
  14. package/lib/cli/commands/cedar/cedar-translations.d.ts +9 -0
  15. package/lib/cli/commands/cedar/cedar-translations.js +213 -0
  16. package/lib/cli/commands/cedar/d9-permission.d.ts +27 -0
  17. package/lib/cli/commands/cedar/d9-permission.js +45 -0
  18. package/lib/cli/commands/cedar/d9-to-cedar.d.ts +33 -0
  19. package/lib/cli/commands/cedar/d9-to-cedar.js +157 -0
  20. package/lib/cli/commands/cedar/roles-table.d.ts +14 -0
  21. package/lib/cli/commands/cedar/roles-table.js +29 -0
  22. package/lib/cli/commands/save/apply-snapshot.js +39 -30
  23. package/lib/cli/commands/save/check-unsaved.d.ts +9 -0
  24. package/lib/cli/commands/save/check-unsaved.js +81 -0
  25. package/lib/cli/commands/save/env.d.ts +33 -0
  26. package/lib/cli/commands/save/env.js +109 -0
  27. package/lib/cli/commands/save/save-snapshot.d.ts +9 -0
  28. package/lib/cli/commands/save/save-snapshot.js +232 -0
  29. package/lib/cli/commands/save/sync-files.d.ts +5 -0
  30. package/lib/cli/commands/save/sync-files.js +46 -0
  31. package/lib/cli/commands/save/transfer.d.ts +18 -0
  32. package/lib/cli/commands/save/transfer.js +96 -0
  33. package/lib/cli/commands/save/utils.d.ts +5 -0
  34. package/lib/cli/commands/save/utils.js +33 -3
  35. package/lib/cli/commands/sync.js +4 -3
  36. package/lib/cli/index.js +65 -25
  37. package/lib/cli/logger.d.ts +2 -0
  38. package/lib/cli/logger.js +10 -0
  39. package/lib/cli/plumbing-config.d.ts +11 -0
  40. package/lib/cli/plumbing-config.js +13 -0
  41. package/lib/index.d.ts +44 -5
  42. package/lib/index.js +54 -41
  43. package/node_modules/@cedar-policy/cedar-wasm/README.md +181 -0
  44. package/node_modules/@cedar-policy/cedar-wasm/esm/README.md +181 -0
  45. package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm.d.ts +427 -0
  46. package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm.js +9 -0
  47. package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm_bg.js +434 -0
  48. package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm_bg.wasm +0 -0
  49. package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm_bg.wasm.d.ts +34 -0
  50. package/node_modules/@cedar-policy/cedar-wasm/esm/package.json +23 -0
  51. package/node_modules/@cedar-policy/cedar-wasm/nodejs/README.md +181 -0
  52. package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm.d.ts +427 -0
  53. package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm.js +463 -0
  54. package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm_bg.wasm +0 -0
  55. package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm_bg.wasm.d.ts +34 -0
  56. package/node_modules/@cedar-policy/cedar-wasm/nodejs/package.json +18 -0
  57. package/node_modules/@cedar-policy/cedar-wasm/package.json +53 -0
  58. package/node_modules/@cedar-policy/cedar-wasm/web/README.md +181 -0
  59. package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm.d.ts +486 -0
  60. package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm.js +534 -0
  61. package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm_bg.wasm +0 -0
  62. package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm_bg.wasm.d.ts +34 -0
  63. package/node_modules/@cedar-policy/cedar-wasm/web/package.json +21 -0
  64. package/node_modules/@types/node/README.md +5 -6
  65. package/node_modules/@types/node/assert/strict.d.ts +111 -0
  66. package/node_modules/@types/node/assert.d.ts +1040 -79
  67. package/node_modules/@types/node/async_hooks.d.ts +476 -119
  68. package/node_modules/@types/node/buffer.buffer.d.ts +472 -0
  69. package/node_modules/@types/node/buffer.d.ts +1925 -13
  70. package/node_modules/@types/node/child_process.d.ts +1204 -235
  71. package/node_modules/@types/node/cluster.d.ts +455 -137
  72. package/node_modules/@types/node/compatibility/disposable.d.ts +14 -0
  73. package/node_modules/@types/node/compatibility/index.d.ts +9 -0
  74. package/node_modules/@types/node/compatibility/indexable.d.ts +20 -0
  75. package/node_modules/@types/node/compatibility/iterators.d.ts +20 -0
  76. package/node_modules/@types/node/console.d.ts +450 -1
  77. package/node_modules/@types/node/constants.d.ts +20 -447
  78. package/node_modules/@types/node/crypto.d.ts +3962 -600
  79. package/node_modules/@types/node/dgram.d.ts +515 -33
  80. package/node_modules/@types/node/diagnostics_channel.d.ts +578 -0
  81. package/node_modules/@types/node/dns/promises.d.ts +503 -0
  82. package/node_modules/@types/node/dns.d.ts +798 -247
  83. package/node_modules/@types/node/domain.d.ts +164 -10
  84. package/node_modules/@types/node/events.d.ts +954 -25
  85. package/node_modules/@types/node/fs/promises.d.ts +1295 -0
  86. package/node_modules/@types/node/fs.d.ts +3463 -1569
  87. package/node_modules/@types/node/globals.d.ts +98 -1277
  88. package/node_modules/@types/node/globals.typedarray.d.ts +38 -0
  89. package/node_modules/@types/node/http.d.ts +1933 -300
  90. package/node_modules/@types/node/http2.d.ts +1946 -254
  91. package/node_modules/@types/node/https.d.ts +557 -134
  92. package/node_modules/@types/node/index.d.ts +54 -48
  93. package/node_modules/@types/node/inspector.d.ts +227 -3014
  94. package/node_modules/@types/node/inspector.generated.d.ts +4052 -0
  95. package/node_modules/@types/node/module.d.ts +890 -2
  96. package/node_modules/@types/node/net.d.ts +872 -105
  97. package/node_modules/@types/node/os.d.ts +452 -209
  98. package/node_modules/@types/node/package.json +78 -128
  99. package/node_modules/@types/node/path.d.ts +196 -155
  100. package/node_modules/@types/node/perf_hooks.d.ts +829 -120
  101. package/node_modules/@types/node/process.d.ts +2072 -3
  102. package/node_modules/@types/node/punycode.d.ts +69 -27
  103. package/node_modules/@types/node/querystring.d.ts +132 -9
  104. package/node_modules/@types/node/readline/promises.d.ts +161 -0
  105. package/node_modules/@types/node/readline.d.ts +485 -49
  106. package/node_modules/@types/node/repl.d.ts +121 -83
  107. package/node_modules/@types/node/sea.d.ts +153 -0
  108. package/node_modules/@types/node/sqlite.d.ts +721 -0
  109. package/node_modules/@types/node/stream/consumers.d.ts +38 -0
  110. package/node_modules/@types/node/stream/promises.d.ts +90 -0
  111. package/node_modules/@types/node/stream/web.d.ts +622 -0
  112. package/node_modules/@types/node/stream.d.ts +1470 -140
  113. package/node_modules/@types/node/string_decoder.d.ts +64 -4
  114. package/node_modules/@types/node/test.d.ts +2163 -0
  115. package/node_modules/@types/node/timers/promises.d.ts +108 -0
  116. package/node_modules/@types/node/timers.d.ts +284 -13
  117. package/node_modules/@types/node/tls.d.ts +850 -244
  118. package/node_modules/@types/node/trace_events.d.ts +147 -11
  119. package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +468 -0
  120. package/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +34 -0
  121. package/node_modules/@types/node/ts5.6/index.d.ts +97 -0
  122. package/node_modules/@types/node/tty.d.ts +160 -18
  123. package/node_modules/@types/node/url.d.ts +890 -53
  124. package/node_modules/@types/node/util.d.ts +2566 -160
  125. package/node_modules/@types/node/v8.d.ts +806 -83
  126. package/node_modules/@types/node/vm.d.ts +932 -44
  127. package/node_modules/@types/node/wasi.d.ts +148 -22
  128. package/node_modules/@types/node/web-globals/abortcontroller.d.ts +34 -0
  129. package/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  130. package/node_modules/@types/node/web-globals/events.d.ts +97 -0
  131. package/node_modules/@types/node/web-globals/fetch.d.ts +55 -0
  132. package/node_modules/@types/node/web-globals/navigator.d.ts +22 -0
  133. package/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  134. package/node_modules/@types/node/worker_threads.d.ts +657 -80
  135. package/node_modules/@types/node/zlib.d.ts +510 -119
  136. package/node_modules/pino/.nojekyll +0 -0
  137. package/node_modules/pino/.prettierignore +1 -0
  138. package/node_modules/pino/CNAME +1 -0
  139. package/node_modules/pino/CONTRIBUTING.md +34 -0
  140. package/node_modules/pino/LICENSE +21 -0
  141. package/node_modules/pino/README.md +177 -0
  142. package/node_modules/pino/SECURITY.md +103 -0
  143. package/node_modules/pino/benchmarks/basic.bench.js +95 -0
  144. package/node_modules/pino/benchmarks/child-child.bench.js +52 -0
  145. package/node_modules/pino/benchmarks/child-creation.bench.js +73 -0
  146. package/node_modules/pino/benchmarks/child.bench.js +62 -0
  147. package/node_modules/pino/benchmarks/deep-object.bench.js +88 -0
  148. package/node_modules/pino/benchmarks/formatters.bench.js +50 -0
  149. package/node_modules/pino/benchmarks/internal/custom-levels.js +67 -0
  150. package/node_modules/pino/benchmarks/internal/just-pino-heavy.bench.js +76 -0
  151. package/node_modules/pino/benchmarks/internal/just-pino.bench.js +182 -0
  152. package/node_modules/pino/benchmarks/internal/parent-vs-child.bench.js +75 -0
  153. package/node_modules/pino/benchmarks/internal/redact.bench.js +86 -0
  154. package/node_modules/pino/benchmarks/long-string.bench.js +81 -0
  155. package/node_modules/pino/benchmarks/multi-arg.bench.js +193 -0
  156. package/node_modules/pino/benchmarks/multistream.js +98 -0
  157. package/node_modules/pino/benchmarks/object.bench.js +82 -0
  158. package/node_modules/pino/benchmarks/utils/generate-benchmark-doc.js +36 -0
  159. package/node_modules/pino/benchmarks/utils/runbench.js +138 -0
  160. package/node_modules/pino/benchmarks/utils/wrap-log-level.js +55 -0
  161. package/node_modules/pino/bin.js +6 -0
  162. package/node_modules/pino/browser.js +607 -0
  163. package/node_modules/pino/build/sync-version.js +25 -0
  164. package/node_modules/pino/docs/api.md +1664 -0
  165. package/node_modules/pino/docs/asynchronous.md +55 -0
  166. package/node_modules/pino/docs/benchmarks.md +55 -0
  167. package/node_modules/pino/docs/browser.md +341 -0
  168. package/node_modules/pino/docs/bundling.md +40 -0
  169. package/node_modules/pino/docs/child-loggers.md +116 -0
  170. package/node_modules/pino/docs/diagnostics.md +16 -0
  171. package/node_modules/pino/docs/ecosystem.md +87 -0
  172. package/node_modules/pino/docs/help.md +353 -0
  173. package/node_modules/pino/docs/lts.md +93 -0
  174. package/node_modules/pino/docs/pretty.md +38 -0
  175. package/node_modules/pino/docs/redaction.md +130 -0
  176. package/node_modules/pino/docs/transports.md +1447 -0
  177. package/node_modules/pino/docs/web.md +306 -0
  178. package/node_modules/pino/eslint.config.js +36 -0
  179. package/node_modules/pino/examples/basic.js +43 -0
  180. package/node_modules/pino/examples/transport.js +68 -0
  181. package/node_modules/pino/favicon.ico +0 -0
  182. package/node_modules/pino/file.js +12 -0
  183. package/node_modules/pino/inc-version.sh +42 -0
  184. package/node_modules/pino/index.html +55 -0
  185. package/node_modules/pino/lib/caller.js +40 -0
  186. package/node_modules/pino/lib/constants.js +28 -0
  187. package/node_modules/pino/lib/deprecations.js +8 -0
  188. package/node_modules/pino/lib/levels.js +241 -0
  189. package/node_modules/pino/lib/meta.js +3 -0
  190. package/node_modules/pino/lib/multistream.js +211 -0
  191. package/node_modules/pino/lib/proto.js +256 -0
  192. package/node_modules/pino/lib/redaction.js +119 -0
  193. package/node_modules/pino/lib/symbols.js +76 -0
  194. package/node_modules/pino/lib/time.js +39 -0
  195. package/node_modules/pino/lib/tools.js +427 -0
  196. package/node_modules/pino/lib/transport-stream.js +56 -0
  197. package/node_modules/pino/lib/transport.js +302 -0
  198. package/node_modules/pino/lib/worker.js +197 -0
  199. package/node_modules/pino/package.json +112 -0
  200. package/node_modules/pino/pino.d.ts +881 -0
  201. package/node_modules/pino/pino.js +259 -0
  202. package/node_modules/pino/test/basic.test.js +952 -0
  203. package/node_modules/pino/test/broken-pipe.test.js +59 -0
  204. package/node_modules/pino/test/browser-bindings.test.js +114 -0
  205. package/node_modules/pino/test/browser-child.test.js +132 -0
  206. package/node_modules/pino/test/browser-disabled.test.js +87 -0
  207. package/node_modules/pino/test/browser-early-console-freeze.test.js +12 -0
  208. package/node_modules/pino/test/browser-is-level-enabled.test.js +101 -0
  209. package/node_modules/pino/test/browser-levels.test.js +241 -0
  210. package/node_modules/pino/test/browser-redaction.test.js +264 -0
  211. package/node_modules/pino/test/browser-serializers.test.js +352 -0
  212. package/node_modules/pino/test/browser-set-bindings.test.js +99 -0
  213. package/node_modules/pino/test/browser-timestamp.test.js +88 -0
  214. package/node_modules/pino/test/browser-transmit.test.js +417 -0
  215. package/node_modules/pino/test/browser.test.js +698 -0
  216. package/node_modules/pino/test/caller.test.js +20 -0
  217. package/node_modules/pino/test/complex-objects.test.js +36 -0
  218. package/node_modules/pino/test/crlf.test.js +34 -0
  219. package/node_modules/pino/test/custom-levels.test.js +267 -0
  220. package/node_modules/pino/test/diagnostics.test.js +107 -0
  221. package/node_modules/pino/test/error-key.test.js +37 -0
  222. package/node_modules/pino/test/error.test.js +403 -0
  223. package/node_modules/pino/test/escaping.test.js +110 -0
  224. package/node_modules/pino/test/esm/esm.mjs +14 -0
  225. package/node_modules/pino/test/esm/index.test.js +21 -0
  226. package/node_modules/pino/test/esm/named-exports.mjs +29 -0
  227. package/node_modules/pino/test/exit.test.js +79 -0
  228. package/node_modules/pino/test/fixtures/broken-pipe/basic.js +9 -0
  229. package/node_modules/pino/test/fixtures/broken-pipe/destination.js +10 -0
  230. package/node_modules/pino/test/fixtures/broken-pipe/syncfalse.js +12 -0
  231. package/node_modules/pino/test/fixtures/caller-loop.js +6 -0
  232. package/node_modules/pino/test/fixtures/console-transport.js +13 -0
  233. package/node_modules/pino/test/fixtures/crashing-transport.js +13 -0
  234. package/node_modules/pino/test/fixtures/default-exit.js +8 -0
  235. package/node_modules/pino/test/fixtures/destination-exit.js +8 -0
  236. package/node_modules/pino/test/fixtures/eval/index.js +13 -0
  237. package/node_modules/pino/test/fixtures/eval/node_modules/14-files.js +3 -0
  238. package/node_modules/pino/test/fixtures/eval/node_modules/2-files.js +3 -0
  239. package/node_modules/pino/test/fixtures/eval/node_modules/file1.js +5 -0
  240. package/node_modules/pino/test/fixtures/eval/node_modules/file10.js +5 -0
  241. package/node_modules/pino/test/fixtures/eval/node_modules/file11.js +5 -0
  242. package/node_modules/pino/test/fixtures/eval/node_modules/file12.js +5 -0
  243. package/node_modules/pino/test/fixtures/eval/node_modules/file13.js +5 -0
  244. package/node_modules/pino/test/fixtures/eval/node_modules/file14.js +11 -0
  245. package/node_modules/pino/test/fixtures/eval/node_modules/file2.js +5 -0
  246. package/node_modules/pino/test/fixtures/eval/node_modules/file3.js +5 -0
  247. package/node_modules/pino/test/fixtures/eval/node_modules/file4.js +5 -0
  248. package/node_modules/pino/test/fixtures/eval/node_modules/file5.js +5 -0
  249. package/node_modules/pino/test/fixtures/eval/node_modules/file6.js +5 -0
  250. package/node_modules/pino/test/fixtures/eval/node_modules/file7.js +5 -0
  251. package/node_modules/pino/test/fixtures/eval/node_modules/file8.js +5 -0
  252. package/node_modules/pino/test/fixtures/eval/node_modules/file9.js +5 -0
  253. package/node_modules/pino/test/fixtures/noop-transport.js +10 -0
  254. package/node_modules/pino/test/fixtures/pretty/null-prototype.js +8 -0
  255. package/node_modules/pino/test/fixtures/stdout-hack-protection.js +11 -0
  256. package/node_modules/pino/test/fixtures/syncfalse-child.js +6 -0
  257. package/node_modules/pino/test/fixtures/syncfalse-exit.js +9 -0
  258. package/node_modules/pino/test/fixtures/syncfalse-flush-exit.js +10 -0
  259. package/node_modules/pino/test/fixtures/syncfalse.js +6 -0
  260. package/node_modules/pino/test/fixtures/syntax-error-esm.mjs +2 -0
  261. package/node_modules/pino/test/fixtures/to-file-transport-with-transform.js +20 -0
  262. package/node_modules/pino/test/fixtures/to-file-transport.js +13 -0
  263. package/node_modules/pino/test/fixtures/to-file-transport.mjs +8 -0
  264. package/node_modules/pino/test/fixtures/transport/index.js +12 -0
  265. package/node_modules/pino/test/fixtures/transport/package.json +5 -0
  266. package/node_modules/pino/test/fixtures/transport-exit-immediately-with-async-dest.js +16 -0
  267. package/node_modules/pino/test/fixtures/transport-exit-immediately.js +11 -0
  268. package/node_modules/pino/test/fixtures/transport-exit-on-ready.js +12 -0
  269. package/node_modules/pino/test/fixtures/transport-invalid-node-options.js +26 -0
  270. package/node_modules/pino/test/fixtures/transport-main.js +9 -0
  271. package/node_modules/pino/test/fixtures/transport-many-lines.js +29 -0
  272. package/node_modules/pino/test/fixtures/transport-preload-main.mjs +13 -0
  273. package/node_modules/pino/test/fixtures/transport-preload.mjs +13 -0
  274. package/node_modules/pino/test/fixtures/transport-string-stdout.js +9 -0
  275. package/node_modules/pino/test/fixtures/transport-transform.js +21 -0
  276. package/node_modules/pino/test/fixtures/transport-uses-pino-config.js +33 -0
  277. package/node_modules/pino/test/fixtures/transport-with-on-exit.js +12 -0
  278. package/node_modules/pino/test/fixtures/transport-worker-data.js +19 -0
  279. package/node_modules/pino/test/fixtures/transport-worker-name.js +24 -0
  280. package/node_modules/pino/test/fixtures/transport-worker.js +15 -0
  281. package/node_modules/pino/test/fixtures/transport-wrong-export-type.js +3 -0
  282. package/node_modules/pino/test/fixtures/ts/to-file-transport-native.mts +15 -0
  283. package/node_modules/pino/test/fixtures/ts/to-file-transport-with-transform.ts +18 -0
  284. package/node_modules/pino/test/fixtures/ts/to-file-transport.ts +11 -0
  285. package/node_modules/pino/test/fixtures/ts/transpile.cjs +36 -0
  286. package/node_modules/pino/test/fixtures/ts/transport-exit-immediately-with-async-dest.ts +15 -0
  287. package/node_modules/pino/test/fixtures/ts/transport-exit-immediately.ts +10 -0
  288. package/node_modules/pino/test/fixtures/ts/transport-exit-on-ready.ts +11 -0
  289. package/node_modules/pino/test/fixtures/ts/transport-main.ts +8 -0
  290. package/node_modules/pino/test/fixtures/ts/transport-string-stdout.ts +8 -0
  291. package/node_modules/pino/test/fixtures/ts/transport-worker.ts +14 -0
  292. package/node_modules/pino/test/formatters.test.js +364 -0
  293. package/node_modules/pino/test/helper.d.ts +4 -0
  294. package/node_modules/pino/test/helper.js +159 -0
  295. package/node_modules/pino/test/hooks.test.js +114 -0
  296. package/node_modules/pino/test/http.test.js +214 -0
  297. package/node_modules/pino/test/internals/version.test.js +17 -0
  298. package/node_modules/pino/test/is-level-enabled.test.js +179 -0
  299. package/node_modules/pino/test/jest/basic.spec.js +10 -0
  300. package/node_modules/pino/test/levels.test.js +810 -0
  301. package/node_modules/pino/test/metadata.test.js +120 -0
  302. package/node_modules/pino/test/mixin-merge-strategy.test.js +57 -0
  303. package/node_modules/pino/test/mixin.test.js +241 -0
  304. package/node_modules/pino/test/multistream.test.js +793 -0
  305. package/node_modules/pino/test/redact.test.js +923 -0
  306. package/node_modules/pino/test/serializers.test.js +257 -0
  307. package/node_modules/pino/test/smoke.js +59 -0
  308. package/node_modules/pino/test/stdout-protection.test.js +41 -0
  309. package/node_modules/pino/test/syncfalse.test.js +186 -0
  310. package/node_modules/pino/test/timestamp-nano.test.js +37 -0
  311. package/node_modules/pino/test/timestamp.test.js +124 -0
  312. package/node_modules/pino/test/transport/big.test.js +42 -0
  313. package/node_modules/pino/test/transport/bundlers-support.test.js +99 -0
  314. package/node_modules/pino/test/transport/caller.test.js +24 -0
  315. package/node_modules/pino/test/transport/core.test.js +818 -0
  316. package/node_modules/pino/test/transport/core.transpiled.test.ts +114 -0
  317. package/node_modules/pino/test/transport/crash.test.js +36 -0
  318. package/node_modules/pino/test/transport/module-link.test.js +241 -0
  319. package/node_modules/pino/test/transport/native-type-stripping.test.mjs +151 -0
  320. package/node_modules/pino/test/transport/node-options.test.js +116 -0
  321. package/node_modules/pino/test/transport/pipeline.test.js +137 -0
  322. package/node_modules/pino/test/transport/preload.test.js +54 -0
  323. package/node_modules/pino/test/transport/repl.test.js +15 -0
  324. package/node_modules/pino/test/transport/sync-false.test.js +79 -0
  325. package/node_modules/pino/test/transport/sync-true.test.js +57 -0
  326. package/node_modules/pino/test/transport/targets.test.js +48 -0
  327. package/node_modules/pino/test/transport/uses-pino-config.test.js +166 -0
  328. package/node_modules/pino/test/transport-stream.test.js +40 -0
  329. package/node_modules/pino/test/types/pino-import.tst.cts +30 -0
  330. package/node_modules/pino/test/types/pino-import.tst.js +73 -0
  331. package/node_modules/pino/test/types/pino-multistream.tst.ts +49 -0
  332. package/node_modules/pino/test/types/pino-top-export.tst.ts +32 -0
  333. package/node_modules/pino/test/types/pino-transport.tst.ts +171 -0
  334. package/node_modules/pino/test/types/pino-type-only.tst.ts +77 -0
  335. package/node_modules/pino/test/types/pino.ts +98 -0
  336. package/node_modules/pino/test/types/pino.tst.ts +681 -0
  337. package/node_modules/pino/test/types/tsconfig.json +10 -0
  338. package/node_modules/pino/tsconfig.json +14 -0
  339. package/node_modules/pino-pretty/.borp.yaml +6 -0
  340. package/node_modules/pino-pretty/.editorconfig +13 -0
  341. package/node_modules/pino-pretty/.github/dependabot.yml +13 -0
  342. package/node_modules/pino-pretty/.github/workflows/ci.yml +83 -0
  343. package/node_modules/pino-pretty/LICENSE +21 -0
  344. package/node_modules/pino-pretty/Readme.md +425 -0
  345. package/node_modules/pino-pretty/SECURITY.md +146 -0
  346. package/node_modules/pino-pretty/benchmark.js +105 -0
  347. package/node_modules/pino-pretty/bin.js +113 -0
  348. package/node_modules/pino-pretty/demo.png +0 -0
  349. package/node_modules/pino-pretty/docs/help.md +24 -0
  350. package/node_modules/pino-pretty/eslint.config.js +5 -0
  351. package/node_modules/pino-pretty/help/help.txt +68 -0
  352. package/node_modules/pino-pretty/index.d.ts +227 -0
  353. package/node_modules/pino-pretty/index.js +234 -0
  354. package/node_modules/pino-pretty/lib/colors.js +134 -0
  355. package/node_modules/pino-pretty/lib/colors.test.js +132 -0
  356. package/node_modules/pino-pretty/lib/constants.js +55 -0
  357. package/node_modules/pino-pretty/lib/pretty.js +171 -0
  358. package/node_modules/pino-pretty/lib/utils/build-safe-sonic-boom.js +69 -0
  359. package/node_modules/pino-pretty/lib/utils/build-safe-sonic-boom.test.js +84 -0
  360. package/node_modules/pino-pretty/lib/utils/create-date.js +26 -0
  361. package/node_modules/pino-pretty/lib/utils/create-date.test.js +20 -0
  362. package/node_modules/pino-pretty/lib/utils/delete-log-property.js +28 -0
  363. package/node_modules/pino-pretty/lib/utils/delete-log-property.test.js +31 -0
  364. package/node_modules/pino-pretty/lib/utils/filter-log.js +99 -0
  365. package/node_modules/pino-pretty/lib/utils/filter-log.test.js +265 -0
  366. package/node_modules/pino-pretty/lib/utils/format-time.js +66 -0
  367. package/node_modules/pino-pretty/lib/utils/format-time.test.js +71 -0
  368. package/node_modules/pino-pretty/lib/utils/get-level-label-data.js +29 -0
  369. package/node_modules/pino-pretty/lib/utils/get-property-value.js +30 -0
  370. package/node_modules/pino-pretty/lib/utils/get-property-value.test.js +31 -0
  371. package/node_modules/pino-pretty/lib/utils/handle-custom-levels-names-opts.js +38 -0
  372. package/node_modules/pino-pretty/lib/utils/handle-custom-levels-names-opts.test.js +45 -0
  373. package/node_modules/pino-pretty/lib/utils/handle-custom-levels-opts.js +39 -0
  374. package/node_modules/pino-pretty/lib/utils/handle-custom-levels-opts.test.js +47 -0
  375. package/node_modules/pino-pretty/lib/utils/index.js +108 -0
  376. package/node_modules/pino-pretty/lib/utils/index.test.js +37 -0
  377. package/node_modules/pino-pretty/lib/utils/interpret-conditionals.js +41 -0
  378. package/node_modules/pino-pretty/lib/utils/interpret-conditionals.test.js +84 -0
  379. package/node_modules/pino-pretty/lib/utils/is-object.js +7 -0
  380. package/node_modules/pino-pretty/lib/utils/is-object.test.js +10 -0
  381. package/node_modules/pino-pretty/lib/utils/is-valid-date.js +14 -0
  382. package/node_modules/pino-pretty/lib/utils/is-valid-date.test.js +16 -0
  383. package/node_modules/pino-pretty/lib/utils/join-lines-with-indentation.js +29 -0
  384. package/node_modules/pino-pretty/lib/utils/join-lines-with-indentation.test.js +16 -0
  385. package/node_modules/pino-pretty/lib/utils/noop.js +3 -0
  386. package/node_modules/pino-pretty/lib/utils/noop.test.js +12 -0
  387. package/node_modules/pino-pretty/lib/utils/parse-factory-options.js +171 -0
  388. package/node_modules/pino-pretty/lib/utils/prettify-error-log.js +76 -0
  389. package/node_modules/pino-pretty/lib/utils/prettify-error-log.test.js +143 -0
  390. package/node_modules/pino-pretty/lib/utils/prettify-error.js +54 -0
  391. package/node_modules/pino-pretty/lib/utils/prettify-error.test.js +25 -0
  392. package/node_modules/pino-pretty/lib/utils/prettify-level.js +41 -0
  393. package/node_modules/pino-pretty/lib/utils/prettify-level.test.js +70 -0
  394. package/node_modules/pino-pretty/lib/utils/prettify-message.js +65 -0
  395. package/node_modules/pino-pretty/lib/utils/prettify-message.test.js +287 -0
  396. package/node_modules/pino-pretty/lib/utils/prettify-metadata.js +75 -0
  397. package/node_modules/pino-pretty/lib/utils/prettify-metadata.test.js +170 -0
  398. package/node_modules/pino-pretty/lib/utils/prettify-object.js +115 -0
  399. package/node_modules/pino-pretty/lib/utils/prettify-object.test.js +217 -0
  400. package/node_modules/pino-pretty/lib/utils/prettify-time.js +43 -0
  401. package/node_modules/pino-pretty/lib/utils/prettify-time.test.js +264 -0
  402. package/node_modules/pino-pretty/lib/utils/split-property-key.js +49 -0
  403. package/node_modules/pino-pretty/lib/utils/split-property-key.test.js +29 -0
  404. package/node_modules/pino-pretty/lib/utils/strip-unsafe-control-chars.js +18 -0
  405. package/node_modules/pino-pretty/lib/utils/strip-unsafe-control-chars.test.js +9 -0
  406. package/node_modules/pino-pretty/package.json +64 -0
  407. package/node_modules/pino-pretty/test/basic.test.js +1305 -0
  408. package/node_modules/pino-pretty/test/boolean-options.test.js +228 -0
  409. package/node_modules/pino-pretty/test/cli-rc.test.js +275 -0
  410. package/node_modules/pino-pretty/test/cli.test.js +360 -0
  411. package/node_modules/pino-pretty/test/crlf.test.js +33 -0
  412. package/node_modules/pino-pretty/test/error-objects.test.js +494 -0
  413. package/node_modules/pino-pretty/test/example/example.js +33 -0
  414. package/node_modules/pino-pretty/test/helper.js +19 -0
  415. package/node_modules/pino-pretty/test/types/exports.tst.ts +15 -0
  416. package/node_modules/pino-pretty/test/types/pino-pretty.tst.ts +140 -0
  417. package/node_modules/pino-pretty/test/types/tsconfig.json +9 -0
  418. package/package.json +12 -5
  419. package/lib/cli/commands/init.d.ts +0 -1
  420. package/lib/cli/commands/init.js +0 -8
  421. package/node_modules/@types/node/globals.global.d.ts +0 -1
package/lib/index.js CHANGED
@@ -10,8 +10,8 @@ const workflows_model_1 = require("projen/lib/github/workflows-model");
10
10
  const javascript_1 = require("projen/lib/javascript");
11
11
  class D9Project extends projen_1.javascript.NodeProject {
12
12
  constructor(options) {
13
- const d9Version = options.packageVersions?.d9 || '12.0.1';
14
- const atlasVersion = options.packageVersions?.atlas || '0.32.0';
13
+ const d9Version = options.packageVersions?.d9 || '12.0.15';
14
+ const atlasVersion = options.packageVersions?.atlas || '1.3.3';
15
15
  super({
16
16
  ...options,
17
17
  packageManager: options.packageManager ?? projen_1.javascript.NodePackageManager.NPM,
@@ -53,8 +53,8 @@ class D9Project extends projen_1.javascript.NodeProject {
53
53
  '',
54
54
  '| Task | Description |',
55
55
  '| --- | --- |',
56
- '| `npx projen run` | Start d9 (`docker compose up directus`) |',
57
- '| `npx projen build-extensions` | Install and build all extensions |',
56
+ '| `npx projen run` | Start d9 (`docker compose up d9`) |',
57
+ '| `npx projen build-extensions [name]` | Install and build all extensions (or only `name`) |',
58
58
  '| `npx projen create-an-admin` | Create the default admin user |',
59
59
  '',
60
60
  'See `.projen/tasks.json` for the full list.',
@@ -79,7 +79,6 @@ class D9Project extends projen_1.javascript.NodeProject {
79
79
  devDeps: [
80
80
  '@wbce/projen-d9',
81
81
  '@wbce/projen-d9-extension',
82
- `@ariga/atlas@${atlasVersion}`,
83
82
  ...(options.devDeps ?? []),
84
83
  ],
85
84
  deps: [`@wbce-d9/directus9@${d9Version}`],
@@ -87,12 +86,15 @@ class D9Project extends projen_1.javascript.NodeProject {
87
86
  this.options = options;
88
87
  // No tsconfig means no tsc --build in compile
89
88
  this.compileTask.reset();
89
+ this.plumbingConfig = new projen_1.JsonFile(this, 'd9-plumbing.json', {
90
+ obj: { atlasVersion },
91
+ });
90
92
  this.addExtensionFolder();
91
93
  this.addDockerCompose();
92
- this.addApplySchemaTask();
93
94
  this.addFirstRunTask();
94
95
  this.addBuildExtensionTask();
95
96
  this.addRunTask();
97
+ this.addD9PlumbingTask();
96
98
  this.addDockerfile();
97
99
  this.addCreateAdminUserTask();
98
100
  new projen_1.AiInstructions(this, {
@@ -106,7 +108,7 @@ class D9Project extends projen_1.javascript.NodeProject {
106
108
  this.gitignore.addPatterns('**/.DS_Store');
107
109
  this.gitignore.addPatterns('.env.local');
108
110
  // Create an empty .env.local if it doesn't exist, so Docker doesn't mount a directory
109
- new projen_1.SampleFile(this, '.env.local', { contents: '# Local environment overrides for Directus' });
111
+ new projen_1.SampleFile(this, '.env.local', { contents: '# Local environment overrides for d9' });
110
112
  }
111
113
  addExtensionFolder() {
112
114
  const folderName = this.options.extensionsFolderName ?? 'plugins';
@@ -118,15 +120,26 @@ class D9Project extends projen_1.javascript.NodeProject {
118
120
  addExtension(name, extensionTypes, options) {
119
121
  return this.extensions.add(name, extensionTypes, options);
120
122
  }
123
+ configurePlumbing(options) {
124
+ for (const [key, value] of Object.entries(options)) {
125
+ this.plumbingConfig.addOverride(key, value);
126
+ }
127
+ }
121
128
  addFirstRunTask() {
122
129
  const task = this.addTask('first-run', {
123
- description: 'Initialize and start a fresh Directus instance',
130
+ description: 'Initialize and start a fresh d9 instance',
124
131
  });
125
132
  const adminEmail = 'admin@example.com';
126
- const userNotExistsCondition = `docker compose exec database psql -U directus -d directus -tAc "SELECT count(*) FROM directus_users WHERE email = '${adminEmail}'" | grep -q '^0$'`;
133
+ const userNotExistsCondition = `docker compose exec database psql -U d9 -d d9 -tAc "SELECT count(*) FROM directus_users WHERE email = '${adminEmail}'" | grep -q '^0$'`;
134
+ const emptyDatabaseCondition = 'docker compose exec database psql -U d9 -d d9 -tAc "SELECT count(*) FROM information_schema.tables WHERE table_name LIKE \'directus_%\'" | grep -q \'^0$\'';
127
135
  task.exec('docker compose up -d --wait database cache');
128
- task.spawn(this.applySchemaTask);
129
- task.exec(`ADMIN_ROLE_ID=$(docker compose exec database psql -U directus -d directus -tAc "SELECT id FROM directus_roles WHERE admin_access = true LIMIT 1") && docker compose run --rm directus npx directus users create --email ${adminEmail} --password totototo --role "$ADMIN_ROLE_ID"`, {
136
+ task.exec('npx d9-plumbing first-import --host localhost --user d9 --password d9 --database d9', {
137
+ condition: 'test -d ./sql',
138
+ });
139
+ task.exec('docker compose run --rm d9 npx directus bootstrap', {
140
+ condition: `test ! -d ./sql && ${emptyDatabaseCondition}`,
141
+ });
142
+ task.exec(`ADMIN_ROLE_ID=$(docker compose exec database psql -U d9 -d d9 -tAc "SELECT id FROM directus_roles WHERE admin_access = true LIMIT 1") && docker compose run --rm d9 npx directus users create --email ${adminEmail} --password totototo --role "$ADMIN_ROLE_ID"`, {
130
143
  condition: userNotExistsCondition,
131
144
  });
132
145
  task.say(`User ${adminEmail} has been created with password totototo`, {
@@ -135,16 +148,16 @@ class D9Project extends projen_1.javascript.NodeProject {
135
148
  task.say(`User ${adminEmail} already exists, skipping creation`, {
136
149
  condition: `! ${userNotExistsCondition}`,
137
150
  });
138
- task.exec('docker compose up directus');
151
+ task.exec('docker compose up d9');
139
152
  }
140
153
  addCreateAdminUserTask() {
141
154
  const task = this.addTask('create-an-admin', {
142
155
  description: 'Create an admin user',
143
156
  });
144
157
  const adminEmail = 'admin@example.com';
145
- const userNotExistsCondition = `docker compose exec database psql -U directus -d directus -tAc "SELECT count(*) FROM directus_users WHERE email = '${adminEmail}'" | grep -q '^0$'`;
158
+ const userNotExistsCondition = `docker compose exec database psql -U d9 -d d9 -tAc "SELECT count(*) FROM directus_users WHERE email = '${adminEmail}'" | grep -q '^0$'`;
146
159
  task.exec('docker compose up -d --wait database cache');
147
- task.exec(`ADMIN_ROLE_ID=$(docker compose exec database psql -U directus -d directus -tAc "SELECT id FROM directus_roles WHERE admin_access = true LIMIT 1") && docker compose run --rm directus npx directus users create --email ${adminEmail} --password totototo --role "$ADMIN_ROLE_ID"`, {
160
+ task.exec(`ADMIN_ROLE_ID=$(docker compose exec database psql -U d9 -d d9 -tAc "SELECT id FROM directus_roles WHERE admin_access = true LIMIT 1") && docker compose run --rm d9 npx directus users create --email ${adminEmail} --password totototo --role "$ADMIN_ROLE_ID"`, {
148
161
  condition: userNotExistsCondition,
149
162
  });
150
163
  task.say(`User ${adminEmail} has been created with password totototo`, {
@@ -156,27 +169,24 @@ class D9Project extends projen_1.javascript.NodeProject {
156
169
  }
157
170
  addRunTask() {
158
171
  const task = this.addTask('run', {
159
- description: 'start the Directus instance',
172
+ description: 'start the d9 instance',
160
173
  });
161
- task.exec('docker compose up directus');
174
+ task.exec('docker compose up d9');
162
175
  }
163
- addApplySchemaTask() {
164
- this.applySchemaTask = this.addTask('apply-schema', {
165
- description: 'Apply SQL snapshot to the local Directus database',
166
- });
167
- this.applySchemaTask.exec('npx wbce-directus apply-snapshot --host localhost --user directus --password directus --database directus', {
168
- condition: 'test -d ./sql',
169
- });
170
- this.applySchemaTask.exec('docker compose run --rm directus npx directus bootstrap', {
171
- condition: 'test ! -d ./sql',
176
+ addD9PlumbingTask() {
177
+ const task = this.addTask('d9-plumbing', {
178
+ description: 'Run the d9-plumbing CLI (save, apply-schema, first-import...). Use --help to list all subcommands.',
172
179
  });
180
+ task.say('Tip: you can also call it directly with `npx d9-plumbing <command>`');
181
+ task.exec('npx d9-plumbing "$@"', { receiveArgs: true });
173
182
  }
174
183
  addBuildExtensionTask() {
175
184
  this.buildExtensionTask = this.addTask('build-extensions', {
176
- description: 'Build the directus extensions',
185
+ description: 'Build the d9 extensions',
177
186
  });
178
187
  this.buildExtensionTask.exec(`cd ${this.extensionFolder} && pnpm install`);
179
- this.buildExtensionTask.exec(`cd ${this.extensionFolder} && pnpm run --recursive build`);
188
+ // projen replaces "$@" with the quoted task args; `set --` turns them back into $1
189
+ this.buildExtensionTask.exec(`cd ${this.extensionFolder} && set -- "$@" && if [ -n "$1" ]; then pnpm --recursive --filter "$1..." run build; else pnpm run --recursive build; fi`, { receiveArgs: true });
180
190
  }
181
191
  addDockerCompose() {
182
192
  const dc = new projen_1.DockerCompose(this);
@@ -189,9 +199,9 @@ class D9Project extends projen_1.javascript.NodeProject {
189
199
  projen_1.DockerCompose.portMapping(5432, 5432),
190
200
  ],
191
201
  environment: {
192
- POSTGRES_USER: 'directus',
193
- POSTGRES_PASSWORD: 'directus',
194
- POSTGRES_DB: 'directus',
202
+ POSTGRES_USER: 'd9',
203
+ POSTGRES_PASSWORD: 'd9',
204
+ POSTGRES_DB: 'd9',
195
205
  },
196
206
  });
197
207
  this.cacheService = dc.addService('cache', {
@@ -203,7 +213,7 @@ class D9Project extends projen_1.javascript.NodeProject {
203
213
  projen_1.DockerCompose.portMapping(6379, 6379),
204
214
  ],
205
215
  });
206
- this.directusService = dc.addService('directus', {
216
+ this.d9Service = dc.addService('d9', {
207
217
  imageBuild: { context: '.' },
208
218
  ports: [
209
219
  projen_1.DockerCompose.portMapping(8055, 8055),
@@ -220,11 +230,14 @@ class D9Project extends projen_1.javascript.NodeProject {
220
230
  DB_CLIENT: 'pg',
221
231
  DB_HOST: 'database',
222
232
  DB_PORT: '5432',
223
- DB_DATABASE: 'directus',
224
- DB_USER: 'directus',
225
- DB_PASSWORD: 'directus',
233
+ DB_DATABASE: 'd9',
234
+ DB_USER: 'd9',
235
+ DB_PASSWORD: 'd9',
226
236
  CACHE_ENABLED: 'false',
237
+ CACHE_STORE: 'redis',
227
238
  CACHE_REDIS_HOST: 'cache',
239
+ MESSENGER_STORE: 'redis',
240
+ MESSENGER_REDIS: 'redis://cache:6379',
228
241
  CACHE_STATUS_HEADER: 'cache-hit',
229
242
  CORS_ENABLED: 'true',
230
243
  CORS_ORIGIN: 'true',
@@ -237,10 +250,10 @@ class D9Project extends projen_1.javascript.NodeProject {
237
250
  },
238
251
  command: ['sh', '-c', 'npx directus start'],
239
252
  });
240
- this.directusService.addVolume(projen_1.DockerCompose.bindVolume('./.env.local', '/app/.env.local'));
253
+ this.d9Service.addVolume(projen_1.DockerCompose.bindVolume('./.env.local', '/app/.env.local'));
241
254
  // Add healthcheck for database (not natively supported by projen DockerCompose)
242
255
  dc.file.addOverride('services.database.healthcheck', {
243
- test: ['CMD', 'pg_isready', '--host=localhost', '--username=directus'],
256
+ test: ['CMD', 'pg_isready', '--host=localhost', '--username=d9'],
244
257
  interval: '10s',
245
258
  timeout: '5s',
246
259
  retries: 5,
@@ -257,7 +270,7 @@ class D9Project extends projen_1.javascript.NodeProject {
257
270
  start_period: '30s',
258
271
  });
259
272
  // Override depends_on to use condition syntax
260
- dc.file.addOverride('services.directus.depends_on', {
273
+ dc.file.addOverride('services.d9.depends_on', {
261
274
  cache: { condition: 'service_healthy' },
262
275
  database: { condition: 'service_healthy' },
263
276
  });
@@ -303,14 +316,14 @@ class D9Project extends projen_1.javascript.NodeProject {
303
316
  .copy('.', '.')
304
317
  .step('build-extension', 'build extensions')
305
318
  .run('npx projen build-extensions')
306
- .step('start', 'Start Directus server')
319
+ .step('start', 'Start d9 server')
307
320
  .cmdExec(['npx', 'directus', 'start']);
308
321
  return this.dockerfile;
309
322
  }
310
323
  }
311
324
  exports.D9Project = D9Project;
312
325
  _a = JSII_RTTI_SYMBOL_1;
313
- D9Project[_a] = { fqn: "@wbce/projen-d9.D9Project", version: "0.0.28" };
326
+ D9Project[_a] = { fqn: "@wbce/projen-d9.D9Project", version: "0.1.0" };
314
327
  /**
315
328
  * @deprecated Use {@link D9Project} instead. The package was renamed to `@wbce/projen-d9` to reflect that it targets the d9 fork, not upstream Directus.
316
329
  */
@@ -318,5 +331,5 @@ class DirectusProject extends D9Project {
318
331
  }
319
332
  exports.DirectusProject = DirectusProject;
320
333
  _b = JSII_RTTI_SYMBOL_1;
321
- DirectusProject[_b] = { fqn: "@wbce/projen-d9.DirectusProject", version: "0.0.28" };
322
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtRUFBa0c7QUFDbEcsdURBQW9GO0FBQ3BGLG1DQUFnSTtBQUNoSSx1RUFBa0U7QUFDbEUsc0RBQW9FO0FBNEJwRSxNQUFhLFNBQVUsU0FBUSxtQkFBVSxDQUFDLFdBQVc7SUFhbkQsWUFBc0IsT0FBeUI7UUFDN0MsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksUUFBUSxDQUFDO1FBQzFELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQUUsS0FBSyxJQUFJLFFBQVEsQ0FBQztRQUNoRSxLQUFLLENBQUM7WUFDSixHQUFHLE9BQU87WUFDVixjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWMsSUFBSSxtQkFBVSxDQUFDLGtCQUFrQixDQUFDLEdBQUc7WUFDM0UsTUFBTSxFQUFFLEtBQUssRUFBRSxzQ0FBc0M7WUFDckQsV0FBVyxFQUFFLElBQUk7WUFDakIsa0JBQWtCLEVBQUU7Z0JBQ2xCLGVBQWUsRUFBRTtvQkFDZixRQUFRLEVBQUUsd0NBQTJCLENBQUMsS0FBSztpQkFDNUM7YUFDRjtZQUNELFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUk7Z0JBQ3hCLFFBQVEsRUFBRTtvQkFDUixLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUU7b0JBQ25CLEVBQUU7b0JBQ0YsZ1BBQWdQO29CQUNoUCxFQUFFO29CQUNGLHNCQUFzQjtvQkFDdEIsRUFBRTtvQkFDRixPQUFPO29CQUNQLGdEQUFnRDtvQkFDaEQsOERBQThEO29CQUM5RCxLQUFLO29CQUNMLEVBQUU7b0JBQ0YscUlBQXFJO29CQUNySSxFQUFFO29CQUNGLFdBQVc7b0JBQ1gsRUFBRTtvQkFDRixtRkFBbUY7b0JBQ25GLEVBQUU7b0JBQ0YsT0FBTztvQkFDUCw0Q0FBNEM7b0JB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RSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDOztBQTlVSCw4QkFnVkM7OztBQVFEOztHQUVHO0FBQ0gsTUFBYSxlQUFnQixTQUFRLFNBQVM7O0FBQTlDLDBDQUFpRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFkZEV4dGVuc2lvbk9wdGlvbnMsIEQ5RXh0ZW5zaW9uVHlwZSwgRXh0ZW5zaW9uRm9sZGVyIH0gZnJvbSAnQHdiY2UvcHJvamVuLWQ5LWV4dGVuc2lvbic7XG5pbXBvcnQgeyBHaXRIdWJDb25maWcsIEdpdEh1YkNvbmZpZ09wdGlvbnMsIERvY2tlcmZpbGUgfSBmcm9tICdAd2JjZS9wcm9qZW4tc2hhcmVkJztcbmltcG9ydCB7IEFpQWdlbnQsIEFpSW5zdHJ1Y3Rpb25zLCBEb2NrZXJDb21wb3NlLCBEb2NrZXJDb21wb3NlU2VydmljZSwgamF2YXNjcmlwdCwgU2FtcGxlRmlsZSwgVGFzaywgdHlwZXNjcmlwdCB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBKb2JQZXJtaXNzaW9uIH0gZnJvbSAncHJvamVuL2xpYi9naXRodWIvd29ya2Zsb3dzLW1vZGVsJztcbmltcG9ydCB7IFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZSB9IGZyb20gJ3Byb2plbi9saWIvamF2YXNjcmlwdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZVZlcnNpb25zIHtcbiAgcmVhZG9ubHkgZDk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiBAYXJpZ2EvYXRsYXMgdG8gdXNlLlxuICAgKiBAZGVmYXVsdCBcIjAuMzIuMFwiXG4gICAqL1xuICByZWFkb25seSBhdGxhcz86IHN0cmluZztcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIEQ5UHJvamVjdE9wdGlvbnMgZXh0ZW5kcyB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciB0aGUgR2l0SHViIGNvbmZpZ3VyYXRpb24uXG4gICAqIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIEdpdEh1YiBjb25maWcgZW50aXJlbHkuXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBHaXRIdWJDb25maWcgd2l0aCBwcm9qZWN0IGRlZmF1bHRzXG4gICAqL1xuICByZWFkb25seSBnaXRodWJDb25maWc/OiBHaXRIdWJDb25maWdPcHRpb25zIHwgZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb25zIGZvbGRlci5cbiAgICogQGRlZmF1bHQgXCJleHRlbnNpb24tcGFja2FnZXNcIlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9uc0ZvbGRlck5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhY2thZ2VWZXJzaW9ucz86IFBhY2thZ2VWZXJzaW9ucztcbn1cblxuZXhwb3J0IGNsYXNzIEQ5UHJvamVjdCBleHRlbmRzIGphdmFzY3JpcHQuTm9kZVByb2plY3Qge1xuXG4gIHB1YmxpYyByZWFkb25seSBnaXRodWJDb25maWc/OiBHaXRIdWJDb25maWc7XG4gIHB1YmxpYyBleHRlbnNpb25zITogRXh0ZW5zaW9uRm9sZGVyO1xuICBwdWJsaWMgZXh0ZW5zaW9uRm9sZGVyITogc3RyaW5nO1xuICBwdWJsaWMgYXBwbHlTY2hlbWFUYXNrITogVGFzaztcbiAgcHVibGljIGJ1aWxkRXh0ZW5zaW9uVGFzayE6IFRhc2s7XG4gIHB1YmxpYyBkb2NrZXJmaWxlITogRG9ja2VyZmlsZTtcbiAgcHVibGljIGRvY2tlckNvbXBvc2VGaWxlITogRG9ja2VyQ29tcG9zZTtcbiAgcHVibGljIGRpcmVjdHVzU2VydmljZSE6IERvY2tlckNvbXBvc2VTZXJ2aWNlO1xuICBwdWJsaWMgZGF0YWJhc2VTZXJ2aWNlITogRG9ja2VyQ29tcG9zZVNlcnZpY2U7XG4gIHB1YmxpYyBjYWNoZVNlcnZpY2UhOiBEb2NrZXJDb21wb3NlU2VydmljZTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgb3B0aW9uczogRDlQcm9qZWN0T3B0aW9ucykge1xuICAgIGNvbnN0IGQ5VmVyc2lvbiA9IG9wdGlvbnMucGFja2FnZVZlcnNpb25zPy5kOSB8fCAnMTIuMC4xJztcbiAgICBjb25zdCBhdGxhc1ZlcnNpb24gPSBvcHRpb25zLnBhY2thZ2VWZXJzaW9ucz8uYXRsYXMgfHwgJzAuMzIuMCc7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHBhY2thZ2VNYW5hZ2VyOiBvcHRpb25zLnBhY2thZ2VNYW5hZ2VyID8/IGphdmFzY3JpcHQuTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTSxcbiAgICAgIGdpdGh1YjogZmFsc2UsIC8vIFdlIHVzZSBvdXIgb3duIEdpdEh1YkNvbmZpZyBpbnN0ZWFkXG4gICAgICBkZXBzVXBncmFkZTogdHJ1ZSxcbiAgICAgIGRlcHNVcGdyYWRlT3B0aW9uczoge1xuICAgICAgICB3b3JrZmxvd09wdGlvbnM6IHtcbiAgICAgICAgICBzY2hlZHVsZTogVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlLkRBSUxZLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxpY2Vuc2VkOiBmYWxzZSxcbiAgICAgIHJlYWRtZTogb3B0aW9ucy5yZWFkbWUgPz8ge1xuICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgIGAjICR7b3B0aW9ucy5uYW1lfWAsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ0EgW2Q5XShodHRwczovL2dpdGh1Yi5jb20vTGFXZWJjYXBzdWxlL2Q5KSAoRGlyZWN0dXMgOSBmb3JrKSBwcm9qZWN0IHNjYWZmb2xkZWQgd2l0aCBbYEB3YmNlL3Byb2plbi1kOWBdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0B3YmNlL3Byb2plbi1kOSkuIERldmVsb3AgbG9jYWxseSBhZ2FpbnN0IERvY2tlciBDb21wb3NlLCB0aGVuIGJ1aWxkIGEgRG9ja2VyIGltYWdlIHRvIGRlcGxveSBhbnl3aGVyZS4nLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcjIyBMb2NhbCBkZXZlbG9wbWVudCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ2BgYHNoJyxcbiAgICAgICAgICAnbnB4IHByb2plbiBpbnN0YWxsICAgICAgIyBpbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgICAgICAgJ25weCBwcm9qZW4gZmlyc3QtcnVuICAgICMgYm9vdCBzdGFjaywgY3JlYXRlIGFkbWluLCBzdGFydCBkOScsXG4gICAgICAgICAgJ2BgYCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ09wZW4gaHR0cDovL2xvY2FsaG9zdDo4MDU1IGFuZCBzaWduIGluIGFzIGBhZG1pbkBleGFtcGxlLmNvbWAgLyBgdG90b3RvdG9gLiBFeHRlbnNpb25zIGF1dG8tcmVsb2FkIChgRVhURU5TSU9OU19BVVRPX1JFTE9BRD10cnVlYCkuJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnIyMgRGVwbG95JyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnQSBgRG9ja2VyZmlsZWAgaXMgaW5jbHVkZWQuIEJ1aWxkIGFuZCBwdXNoIHRoZSBpbWFnZSBmb3IgeW91ciB0YXJnZXQgZW52aXJvbm1lbnQ6JyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnYGBgc2gnLFxuICAgICAgICAgICdkb2NrZXIgYnVpbGQgLXQgPHJlZ2lzdHJ5Pi88aW1hZ2U+Ojx0YWc+IC4nLFxuICAgICAgICAgICdkb2NrZXIgcHVzaCA8cmVnaXN0cnk+LzxpbWFnZT46PHRhZz4nLFxuICAgICAgICAgICdgYGAnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICdDb25maWd1cmUgdGhlIGRlcGxveWVkIGluc3RhbmNlIHdpdGggZW52aXJvbm1lbnQgdmFyaWFibGVzIChkYXRhYmFzZSwgY2FjaGUsIHNlY3JldHMpIOKAlCBzZWUgdGhlIGQ5IGRvY3MuJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnIyMgQ29tbW9uIHRhc2tzJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnfCBUYXNrIHwgRGVzY3JpcHRpb24gfCcsXG4gICAgICAgICAgJ3wgLS0tIHwgLS0tIHwnLFxuICAgICAgICAgICd8IGBucHggcHJvamVuIHJ1bmAgfCBTdGFydCBkOSAoYGRvY2tlciBjb21wb3NlIHVwIGRpcmVjdHVzYCkgfCcsXG4gICAgICAgICAgJ3wgYG5weCBwcm9qZW4gYnVpbGQtZXh0ZW5zaW9uc2AgfCBJbnN0YWxsIGFuZCBidWlsZCBhbGwgZXh0ZW5zaW9ucyB8JyxcbiAgICAgICAgICAnfCBgbnB4IHByb2plbiBjcmVhdGUtYW4tYWRtaW5gIHwgQ3JlYXRlIHRoZSBkZWZhdWx0IGFkbWluIHVzZXIgfCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ1NlZSBgLnByb2plbi90YXNrcy5qc29uYCBmb3IgdGhlIGZ1bGwgbGlzdC4nLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcjIyBDb25maWd1cmF0aW9uJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnRWRpdCBgLnByb2plbnJjLmpzYCBhbmQgcnVuIGBucHggcHJvamVuYCB0byByZWdlbmVyYXRlIHByb2plY3QgZmlsZXMuIExvY2FsIGVudmlyb25tZW50IG92ZXJyaWRlcyBnbyBpbiBgLmVudi5sb2NhbGAuJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnIyMgRXh0ZW5zaW9ucycsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ0V4dGVuc2lvbnMgbGl2ZSB1bmRlciBgLi9wbHVnaW5zL2AuIEFkZCBuZXcgb25lcyBpbiBgLnByb2plbnJjLmpzYDonLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICdgYGBqcycsXG4gICAgICAgICAgXCJpbXBvcnQgeyBEOUV4dGVuc2lvblR5cGUgfSBmcm9tICdAd2JjZS9wcm9qZW4tZDktZXh0ZW5zaW9uJztcIixcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBcInByb2plY3QuYWRkRXh0ZW5zaW9uKCdteS1ob29rJywgW0Q5RXh0ZW5zaW9uVHlwZS5IT09LXSk7XCIsXG4gICAgICAgICAgJ2BgYCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ1RoZW4gYG5weCBwcm9qZW4gJiYgbnB4IHByb2plbiBidWlsZC1leHRlbnNpb25zYC4nLFxuICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgfSxcbiAgICAgIGRldkRlcHM6IFtcbiAgICAgICAgJ0B3YmNlL3Byb2plbi1kOScsXG4gICAgICAgICdAd2JjZS9wcm9qZW4tZDktZXh0ZW5zaW9uJyxcbiAgICAgICAgYEBhcmlnYS9hdGxhc0Ake2F0bGFzVmVyc2lvbn1gLFxuICAgICAgICAuLi4ob3B0aW9ucy5kZXZEZXBzID8/IFtdKSxcbiAgICAgIF0sXG4gICAgICBkZXBzOiBbYEB3YmNlLWQ5L2RpcmVjdHVzOUAke2Q5VmVyc2lvbn1gXSxcbiAgICB9KTtcblxuICAgIC8vIE5vIHRzY29uZmlnIG1lYW5zIG5vIHRzYyAtLWJ1aWxkIGluIGNvbXBpbGVcbiAgICB0aGlzLmNvbXBpbGVUYXNrLnJlc2V0KCk7XG5cbiAgICB0aGlzLmFkZEV4dGVuc2lvbkZvbGRlcigpO1xuICAgIHRoaXMuYWRkRG9ja2VyQ29tcG9zZSgpO1xuICAgIHRoaXMuYWRkQXBwbHlTY2hlbWFUYXNrKCk7XG4gICAgdGhpcy5hZGRGaXJzdFJ1blRhc2soKTtcbiAgICB0aGlzLmFkZEJ1aWxkRXh0ZW5zaW9uVGFzaygpO1xuICAgIHRoaXMuYWRkUnVuVGFzaygpO1xuICAgIHRoaXMuYWRkRG9ja2VyZmlsZSgpO1xuICAgIHRoaXMuYWRkQ3JlYXRlQWRtaW5Vc2VyVGFzaygpO1xuXG4gICAgbmV3IEFpSW5zdHJ1Y3Rpb25zKHRoaXMsIHtcbiAgICAgIGFnZW50czogW0FpQWdlbnQuQ0xBVURFXSxcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb25zLmdpdGh1YkNvbmZpZyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZ2l0aHViQ29uZmlnID0gbmV3IEdpdEh1YkNvbmZpZyh0aGlzLCBvcHRpb25zLmdpdGh1YkNvbmZpZyk7XG4gICAgICB0aGlzLmFkZFNhdmVCcmFuY2hXb3JrZmxvdygpO1xuICAgIH1cbiAgICB0aGlzLmdpdGlnbm9yZS5hZGRQYXR0ZXJucygndXBsb2FkcycpO1xuICAgIHRoaXMuZ2l0aWdub3JlLmFkZFBhdHRlcm5zKCcqKi8uRFNfU3RvcmUnKTtcbiAgICB0aGlzLmdpdGlnbm9yZS5hZGRQYXR0ZXJucygnLmVudi5sb2NhbCcpO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGVtcHR5IC5lbnYubG9jYWwgaWYgaXQgZG9lc24ndCBleGlzdCwgc28gRG9ja2VyIGRvZXNuJ3QgbW91bnQgYSBkaXJlY3RvcnlcbiAgICBuZXcgU2FtcGxlRmlsZSh0aGlzLCAnLmVudi5sb2NhbCcsIHsgY29udGVudHM6ICcjIExvY2FsIGVudmlyb25tZW50IG92ZXJyaWRlcyBmb3IgRGlyZWN0dXMnIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRFeHRlbnNpb25Gb2xkZXIoKSB7XG4gICAgY29uc3QgZm9sZGVyTmFtZSA9IHRoaXMub3B0aW9ucy5leHRlbnNpb25zRm9sZGVyTmFtZSA/PyAncGx1Z2lucyc7XG4gICAgdGhpcy5leHRlbnNpb25zID0gbmV3IEV4dGVuc2lvbkZvbGRlcih7IHBhcmVudDogdGhpcywgbmFtZTogZm9sZGVyTmFtZSB9KTtcbiAgICB0aGlzLmV4dGVuc2lvbkZvbGRlciA9IGZvbGRlck5hbWU7XG4gICAgdGhpcy5naXRpZ25vcmUuZXhjbHVkZSgnZXh0ZW5zaW9ucy8qJyk7XG4gICAgdGhpcy5naXRpZ25vcmUuaW5jbHVkZSgnZXh0ZW5zaW9ucy90ZW1wbGF0ZXMvJyk7XG4gIH1cblxuICBwdWJsaWMgYWRkRXh0ZW5zaW9uKG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uVHlwZXM6IEQ5RXh0ZW5zaW9uVHlwZVtdLCBvcHRpb25zPzogQWRkRXh0ZW5zaW9uT3B0aW9ucyApIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25zLmFkZChuYW1lLCBleHRlbnNpb25UeXBlcywgb3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFkZEZpcnN0UnVuVGFzaygpIHtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5hZGRUYXNrKCdmaXJzdC1ydW4nLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0luaXRpYWxpemUgYW5kIHN0YXJ0IGEgZnJlc2ggRGlyZWN0dXMgaW5zdGFuY2UnLFxuICAgIH0pO1xuICAgIGNvbnN0IGFkbWluRW1haWwgPSAnYWRtaW5AZXhhbXBsZS5jb20nO1xuICAgIGNvbnN0IHVzZXJOb3RFeGlzdHNDb25kaXRpb24gPSBgZG9ja2VyIGNvbXBvc2UgZXhlYyBkYXRhYmFzZSBwc3FsIC1VIGRpcmVjdHVzIC1kIGRpcmVjdHVzIC10QWMgXCJTRUxFQ1QgY291bnQoKikgRlJPTSBkaXJlY3R1c191c2VycyBXSEVSRSBlbWFpbCA9ICcke2FkbWluRW1haWx9J1wiIHwgZ3JlcCAtcSAnXjAkJ2A7XG4gICAgdGFzay5leGVjKCdkb2NrZXIgY29tcG9zZSB1cCAtZCAtLXdhaXQgZGF0YWJhc2UgY2FjaGUnKTtcbiAgICB0YXNrLnNwYXduKHRoaXMuYXBwbHlTY2hlbWFUYXNrKTtcbiAgICB0YXNrLmV4ZWMoYEFETUlOX1JPTEVfSUQ9JChkb2NrZXIgY29tcG9zZSBleGVjIGRhdGFiYXNlIHBzcWwgLVUgZGlyZWN0dXMgLWQgZGlyZWN0dXMgLXRBYyBcIlNFTEVDVCBpZCBGUk9NIGRpcmVjdHVzX3JvbGVzIFdIRVJFIGFkbWluX2FjY2VzcyA9IHRydWUgTElNSVQgMVwiKSAmJiBkb2NrZXIgY29tcG9zZSBydW4gLS1ybSBkaXJlY3R1cyBucHggZGlyZWN0dXMgdXNlcnMgY3JlYXRlIC0tZW1haWwgJHthZG1pbkVtYWlsfSAtLXBhc3N3b3JkIHRvdG90b3RvIC0tcm9sZSBcIiRBRE1JTl9ST0xFX0lEXCJgLCB7XG4gICAgICBjb25kaXRpb246IHVzZXJOb3RFeGlzdHNDb25kaXRpb24sXG4gICAgfSk7XG4gICAgdGFzay5zYXkoYFVzZXIgJHthZG1pbkVtYWlsfSBoYXMgYmVlbiBjcmVhdGVkIHdpdGggcGFzc3dvcmQgdG90b3RvdG9gLCB7XG4gICAgICBjb25kaXRpb246IHVzZXJOb3RFeGlzdHNDb25kaXRpb24sXG4gICAgfSk7XG4gICAgdGFzay5zYXkoYFVzZXIgJHthZG1pbkVtYWlsfSBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcgY3JlYXRpb25gLCB7XG4gICAgICBjb25kaXRpb246IGAhICR7dXNlck5vdEV4aXN0c0NvbmRpdGlvbn1gLFxuICAgIH0pO1xuICAgIHRhc2suZXhlYygnZG9ja2VyIGNvbXBvc2UgdXAgZGlyZWN0dXMnKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQ3JlYXRlQWRtaW5Vc2VyVGFzaygpIHtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5hZGRUYXNrKCdjcmVhdGUtYW4tYWRtaW4nLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhbiBhZG1pbiB1c2VyJyxcbiAgICB9KTtcbiAgICBjb25zdCBhZG1pbkVtYWlsID0gJ2FkbWluQGV4YW1wbGUuY29tJztcbiAgICBjb25zdCB1c2VyTm90RXhpc3RzQ29uZGl0aW9uID0gYGRvY2tlciBjb21wb3NlIGV4ZWMgZGF0YWJhc2UgcHNxbCAtVSBkaXJlY3R1cyAtZCBkaXJlY3R1cyAtdEFjIFwiU0VMRUNUIGNvdW50KCopIEZST00gZGlyZWN0dXNfdXNlcnMgV0hFUkUgZW1haWwgPSAnJHthZG1pbkVtYWlsfSdcIiB8IGdyZXAgLXEgJ14wJCdgO1xuICAgIHRhc2suZXhlYygnZG9ja2VyIGNvbXBvc2UgdXAgLWQgLS13YWl0IGRhdGFiYXNlIGNhY2hlJyk7XG4gICAgdGFzay5leGVjKGBBRE1JTl9ST0xFX0lEPSQoZG9ja2VyIGNvbXBvc2UgZXhlYyBkYXRhYmFzZSBwc3FsIC1VIGRpcmVjdHVzIC1kIGRpcmVjdHVzIC10QWMgXCJTRUxFQ1QgaWQgRlJPTSBkaXJlY3R1c19yb2xlcyBXSEVSRSBhZG1pbl9hY2Nlc3MgPSB0cnVlIExJTUlUIDFcIikgJiYgZG9ja2VyIGNvbXBvc2UgcnVuIC0tcm0gZGlyZWN0dXMgbnB4IGRpcmVjdHVzIHVzZXJzIGNyZWF0ZSAtLWVtYWlsICR7YWRtaW5FbWFpbH0gLS1wYXNzd29yZCB0b3RvdG90byAtLXJvbGUgXCIkQURNSU5fUk9MRV9JRFwiYCwge1xuICAgICAgY29uZGl0aW9uOiB1c2VyTm90RXhpc3RzQ29uZGl0aW9uLFxuICAgIH0pO1xuICAgIHRhc2suc2F5KGBVc2VyICR7YWRtaW5FbWFpbH0gaGFzIGJlZW4gY3JlYXRlZCB3aXRoIHBhc3N3b3JkIHRvdG90b3RvYCwge1xuICAgICAgY29uZGl0aW9uOiB1c2VyTm90RXhpc3RzQ29uZGl0aW9uLFxuICAgIH0pO1xuICAgIHRhc2suc2F5KGBVc2VyICR7YWRtaW5FbWFpbH0gYWxyZWFkeSBleGlzdHMsIHNraXBwaW5nIGNyZWF0aW9uYCwge1xuICAgICAgY29uZGl0aW9uOiBgISAke3VzZXJOb3RFeGlzdHNDb25kaXRpb259YCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUnVuVGFzaygpIHtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5hZGRUYXNrKCdydW4nLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3N0YXJ0IHRoZSBEaXJlY3R1cyBpbnN0YW5jZScsXG4gICAgfSk7XG4gICAgdGFzay5leGVjKCdkb2NrZXIgY29tcG9zZSB1cCBkaXJlY3R1cycpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRBcHBseVNjaGVtYVRhc2soKSB7XG4gICAgdGhpcy5hcHBseVNjaGVtYVRhc2sgPSB0aGlzLmFkZFRhc2soJ2FwcGx5LXNjaGVtYScsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQXBwbHkgU1FMIHNuYXBzaG90IHRvIHRoZSBsb2NhbCBEaXJlY3R1cyBkYXRhYmFzZScsXG4gICAgfSk7XG4gICAgdGhpcy5hcHBseVNjaGVtYVRhc2suZXhlYygnbnB4IHdiY2UtZGlyZWN0dXMgYXBwbHktc25hcHNob3QgLS1ob3N0IGxvY2FsaG9zdCAtLXVzZXIgZGlyZWN0dXMgLS1wYXNzd29yZCBkaXJlY3R1cyAtLWRhdGFiYXNlIGRpcmVjdHVzJywge1xuICAgICAgY29uZGl0aW9uOiAndGVzdCAtZCAuL3NxbCcsXG4gICAgfSk7XG4gICAgdGhpcy5hcHBseVNjaGVtYVRhc2suZXhlYygnZG9ja2VyIGNvbXBvc2UgcnVuIC0tcm0gZGlyZWN0dXMgbnB4IGRpcmVjdHVzIGJvb3RzdHJhcCcsIHtcbiAgICAgIGNvbmRpdGlvbjogJ3Rlc3QgISAtZCAuL3NxbCcsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZEJ1aWxkRXh0ZW5zaW9uVGFzaygpIHtcbiAgICB0aGlzLmJ1aWxkRXh0ZW5zaW9uVGFzayA9IHRoaXMuYWRkVGFzaygnYnVpbGQtZXh0ZW5zaW9ucycsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQnVpbGQgdGhlIGRpcmVjdHVzIGV4dGVuc2lvbnMnLFxuICAgIH0pO1xuICAgIHRoaXMuYnVpbGRFeHRlbnNpb25UYXNrLmV4ZWMoYGNkICR7dGhpcy5leHRlbnNpb25Gb2xkZXJ9ICYmIHBucG0gaW5zdGFsbGApO1xuICAgIHRoaXMuYnVpbGRFeHRlbnNpb25UYXNrLmV4ZWMoYGNkICR7dGhpcy5leHRlbnNpb25Gb2xkZXJ9ICYmIHBucG0gcnVuIC0tcmVjdXJzaXZlIGJ1aWxkYCk7XG4gIH1cblxuXG4gIHByaXZhdGUgYWRkRG9ja2VyQ29tcG9zZSgpIHtcbiAgICBjb25zdCBkYyA9IG5ldyBEb2NrZXJDb21wb3NlKHRoaXMpO1xuXG4gICAgdGhpcy5kYXRhYmFzZVNlcnZpY2UgPSBkYy5hZGRTZXJ2aWNlKCdkYXRhYmFzZScsIHtcbiAgICAgIGltYWdlOiAncG9zdGdpcy9wb3N0Z2lzOjEzLW1hc3RlcicsXG4gICAgICB2b2x1bWVzOiBbXG4gICAgICAgIERvY2tlckNvbXBvc2UubmFtZWRWb2x1bWUoJ3BnZGF0YScsICcvdmFyL2xpYi9wb3N0Z3Jlc3FsL2RhdGEnKSxcbiAgICAgIF0sXG4gICAgICBwb3J0czogW1xuICAgICAgICBEb2NrZXJDb21wb3NlLnBvcnRNYXBwaW5nKDU0MzIsIDU0MzIpLFxuICAgICAgXSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFBPU1RHUkVTX1VTRVI6ICdkaXJlY3R1cycsXG4gICAgICAgIFBPU1RHUkVTX1BBU1NXT1JEOiAnZGlyZWN0dXMnLFxuICAgICAgICBQT1NUR1JFU19EQjogJ2RpcmVjdHVzJyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmNhY2hlU2VydmljZSA9IGRjLmFkZFNlcnZpY2UoJ2NhY2hlJywge1xuICAgICAgaW1hZ2U6ICdyZWRpczo2JyxcbiAgICAgIHZvbHVtZXM6IFtcbiAgICAgICAgRG9ja2VyQ29tcG9zZS5uYW1lZFZvbHVtZSgncmVkaXNfc3RvcmFnZScsICcvZGF0YScpLFxuICAgICAgXSxcbiAgICAgIHBvcnRzOiBbXG4gICAgICAgIERvY2tlckNvbXBvc2UucG9ydE1hcHBpbmcoNjM3OSwgNjM3OSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kaXJlY3R1c1NlcnZpY2UgPSBkYy5hZGRTZXJ2aWNlKCdkaXJlY3R1cycsIHtcbiAgICAgIGltYWdlQnVpbGQ6IHsgY29udGV4dDogJy4nIH0sXG4gICAgICBwb3J0czogW1xuICAgICAgICBEb2NrZXJDb21wb3NlLnBvcnRNYXBwaW5nKDgwNTUsIDgwNTUpLFxuICAgICAgXSxcbiAgICAgIHZvbHVtZXM6IFtcbiAgICAgICAgRG9ja2VyQ29tcG9zZS5iaW5kVm9sdW1lKCcuL3VwbG9hZHMnLCAnL2FwcC91cGxvYWRzJyksXG4gICAgICAgIERvY2tlckNvbXBvc2UuYmluZFZvbHVtZSgnLi9leHRlbnNpb25zJywgJy9hcHAvZXh0ZW5zaW9ucycpLFxuICAgICAgXSxcbiAgICAgIC8vIGRlcGVuZHNPbiBpcyBzZXQgdmlhIGFkZE92ZXJyaWRlIGJlbG93IHdpdGggY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIEtFWTogJ3NvbWUtcmFuZG9tLWtleScsXG4gICAgICAgIFNFQ1JFVDogJ2Fub3RoZXItcmFuZG9tLWtleScsXG4gICAgICAgIENPTkZJR19QQVRIOiAnLmVudi5sb2NhbCcsXG4gICAgICAgIERCX0NMSUVOVDogJ3BnJyxcbiAgICAgICAgREJfSE9TVDogJ2RhdGFiYXNlJyxcbiAgICAgICAgREJfUE9SVDogJzU0MzInLFxuICAgICAgICBEQl9EQVRBQkFTRTogJ2RpcmVjdHVzJyxcbiAgICAgICAgREJfVVNFUjogJ2RpcmVjdHVzJyxcbiAgICAgICAgREJfUEFTU1dPUkQ6ICdkaXJlY3R1cycsXG4gICAgICAgIENBQ0hFX0VOQUJMRUQ6ICdmYWxzZScsXG4gICAgICAgIENBQ0hFX1JFRElTX0hPU1Q6ICdjYWNoZScsXG4gICAgICAgIENBQ0hFX1NUQVRVU19IRUFERVI6ICdjYWNoZS1oaXQnLFxuICAgICAgICBDT1JTX0VOQUJMRUQ6ICd0cnVlJyxcbiAgICAgICAgQ09SU19PUklHSU46ICd0cnVlJyxcbiAgICAgICAgTE9HX0xFVkVMOiAnaW5mbycsXG4gICAgICAgIEFETUlOX0VNQUlMOiAnYWRtaW5AZXhhbXBsZS5jb20nLFxuICAgICAgICBBRE1JTl9QQVNTV09SRDogJ3RvdG90b3RvJyxcbiAgICAgICAgRVhURU5TSU9OU19BVVRPX1JFTE9BRDogJ3RydWUnLFxuICAgICAgICBWQUxJREFURV9FTlRJVElFU19UT0tFTlNfQVBJX0tFWTogJ3RvdG8nLFxuICAgICAgICBBV1NfS01TX0tFWV9JRDogJ3R1dHUnLFxuICAgICAgfSxcbiAgICAgIGNvbW1hbmQ6IFsnc2gnLCAnLWMnLCAnbnB4IGRpcmVjdHVzIHN0YXJ0J10sXG4gICAgfSk7XG5cbiAgICB0aGlzLmRpcmVjdHVzU2VydmljZS5hZGRWb2x1bWUoRG9ja2VyQ29tcG9zZS5iaW5kVm9sdW1lKCcuLy5lbnYubG9jYWwnLCAnL2FwcC8uZW52LmxvY2FsJykpO1xuXG4gICAgLy8gQWRkIGhlYWx0aGNoZWNrIGZvciBkYXRhYmFzZSAobm90IG5hdGl2ZWx5IHN1cHBvcnRlZCBieSBwcm9qZW4gRG9ja2VyQ29tcG9zZSlcbiAgICBkYy5maWxlLmFkZE92ZXJyaWRlKCdzZXJ2aWNlcy5kYXRhYmFzZS5oZWFsdGhjaGVjaycsIHtcbiAgICAgIHRlc3Q6IFsnQ01EJywgJ3BnX2lzcmVhZHknLCAnLS1ob3N0PWxvY2FsaG9zdCcsICctLXVzZXJuYW1lPWRpcmVjdHVzJ10sXG4gICAgICBpbnRlcnZhbDogJzEwcycsXG4gICAgICB0aW1lb3V0OiAnNXMnLFxuICAgICAgcmV0cmllczogNSxcbiAgICAgIHN0YXJ0X2ludGVydmFsOiAnNXMnLFxuICAgICAgc3RhcnRfcGVyaW9kOiAnMzBzJyxcbiAgICB9KTtcblxuICAgIC8vIEFkZCBoZWFsdGhjaGVjayBmb3IgY2FjaGVcbiAgICBkYy5maWxlLmFkZE92ZXJyaWRlKCdzZXJ2aWNlcy5jYWNoZS5oZWFsdGhjaGVjaycsIHtcbiAgICAgIHRlc3Q6IFsnQ01ELVNIRUxMJywgJ1sgJChyZWRpcy1jbGkgcGluZykgPSBcXCdQT05HXFwnIF0nXSxcbiAgICAgIGludGVydmFsOiAnMTBzJyxcbiAgICAgIHRpbWVvdXQ6ICc1cycsXG4gICAgICByZXRyaWVzOiA1LFxuICAgICAgc3RhcnRfaW50ZXJ2YWw6ICc1cycsXG4gICAgICBzdGFydF9wZXJpb2Q6ICczMHMnLFxuICAgIH0pO1xuXG4gICAgLy8gT3ZlcnJpZGUgZGVwZW5kc19vbiB0byB1c2UgY29uZGl0aW9uIHN5bnRheFxuICAgIGRjLmZpbGUuYWRkT3ZlcnJpZGUoJ3NlcnZpY2VzLmRpcmVjdHVzLmRlcGVuZHNfb24nLCB7XG4gICAgICBjYWNoZTogeyBjb25kaXRpb246ICdzZXJ2aWNlX2hlYWx0aHknIH0sXG4gICAgICBkYXRhYmFzZTogeyBjb25kaXRpb246ICdzZXJ2aWNlX2hlYWx0aHknIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmRvY2tlckNvbXBvc2VGaWxlID0gZGM7XG5cbiAgICByZXR1cm4gZGM7XG4gIH1cblxuICBwcml2YXRlIGFkZFNhdmVCcmFuY2hXb3JrZmxvdygpIHtcbiAgICBjb25zdCB3b3JrZmxvdyA9IHRoaXMuZ2l0aHViQ29uZmlnIS5hZGRXb3JrZmxvdygnc2F2ZS1icmFuY2gnKTtcbiAgICB3b3JrZmxvdy5vbih7IHB1c2g6IHsgYnJhbmNoZXM6IFsnKi1zYXZlJ10gfSB9KTtcbiAgICB3b3JrZmxvdy5hZGRKb2IoJ2NyZWF0ZS1wcicsIHtcbiAgICAgIG5hbWU6ICdDcmVhdGUgUHVsbCBSZXF1ZXN0JyxcbiAgICAgIHJ1bnNPbjogWyd1YnVudHUtbGF0ZXN0J10sXG4gICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICBjb250ZW50czogSm9iUGVybWlzc2lvbi5SRUFELFxuICAgICAgICBwdWxsUmVxdWVzdHM6IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICB9LFxuICAgICAgc3RlcHM6IFtcbiAgICAgICAgeyBuYW1lOiAnQ2hlY2tvdXQnLCB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NCcgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdDcmVhdGUgUHVsbCBSZXF1ZXN0JyxcbiAgICAgICAgICBydW46ICdnaCBwciBjcmVhdGUgLS10aXRsZSBcIlNhdmU6ICR7R0lUSFVCX1JFRl9OQU1FJS1zYXZlfVwiIC0tYm9keSBcIkF1dG8tZ2VuZXJhdGVkIFBSIGZyb20gYnJhbmNoIFxcXFxgJHtHSVRIVUJfUkVGX05BTUUlLXNhdmV9XFxcXGBcIiAtLWJhc2UgXCIke0dJVEhVQl9SRUZfTkFNRSUtc2F2ZX1cIiB8fCBlY2hvIFwiUFIgYWxyZWFkeSBleGlzdHNcIicsXG4gICAgICAgICAgZW52OiB7IEdIX1RPS0VOOiAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JyB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRG9ja2VyZmlsZSgpIHtcbiAgICB0aGlzLmRvY2tlcmZpbGUgPSBuZXcgRG9ja2VyZmlsZSh0aGlzKVxuICAgICAgLmZyb20oJ25vZGUnLCAnMjItYm9va3dvcm0tc2xpbScpXG4gICAgICAuc3RlcCgndXBkYXRlLW5wbScsICdVcGRhdGUgbnBtIHRvIGZpeCBkZXBlbmRlbmNpZXMnKVxuICAgICAgLnJ1bignbnBtIGluc3RhbGwgLWcgbnBtQDExLjguMCcpXG4gICAgICAuc3RlcCgnaW5zdGFsbC1wbnBtJywgJ2luc3RhbGwgcG5wbScpXG4gICAgICAucnVuKCducG0gaW5zdGFsbCAtZyBwbnBtQDEwLjMzLjAnKVxuICAgICAgLnN0ZXAoJ2NvcHktcGFja2FnZScsICdDb3B5IHBhY2thZ2UuanNvbiBhbmQgcGFja2FnZS1sb2NrLmpzb24gZmlyc3QgdG8gbGV2ZXJhZ2UgRG9ja2VyIGxheWVyIGNhY2hpbmcnKVxuICAgICAgLmNvcHkoJ3BhY2thZ2UqLmpzb24nLCAnL2FwcC8nKVxuICAgICAgLnN0ZXAoJ3dvcmtkaXInLCAnU2V0IHdvcmtpbmcgZGlyZWN0b3J5JylcbiAgICAgIC53b3JrZGlyKCcvYXBwJylcbiAgICAgIC5zdGVwKCdpbnN0YWxsLWRlcHMnLCAnSW5zdGFsbCBkZXBlbmRlbmNpZXMgLSB3aXRob3V0IGRldiBkZXBlbmRlbmNpZXMnKVxuICAgICAgLnJ1bignTk9ERV9FTlY9cHJvZHVjdGlvbiBucG0gaW5zdGFsbCcpXG4gICAgICAuc3RlcCgnY2xlYW51cCcsICdDbGVhbmluZyBiZW5jaG1hcmtzIGZvbGRlciBpbiB0ZWRpb3VzIG1vZHVsZSBmb3Igc2VjdXJpdHknKVxuICAgICAgLnJ1bigncm0gLXJmIG5vZGVfbW9kdWxlcy90ZWRpb3VzL2JlbmNobWFya3MnKVxuICAgICAgLnN0ZXAoJ2NvcHktc291cmNlJywgJ0NvcHkgdGhlIHJlc3Qgb2YgdGhlIGFwcGxpY2F0aW9uIGNvZGUnKVxuICAgICAgLmNvcHkoJy4nLCAnLicpXG4gICAgICAuc3RlcCgnYnVpbGQtZXh0ZW5zaW9uJywgJ2J1aWxkIGV4dGVuc2lvbnMnKVxuICAgICAgLnJ1bignbnB4IHByb2plbiBidWlsZC1leHRlbnNpb25zJylcbiAgICAgIC5zdGVwKCdzdGFydCcsICdTdGFydCBEaXJlY3R1cyBzZXJ2ZXInKVxuICAgICAgLmNtZEV4ZWMoWyducHgnLCAnZGlyZWN0dXMnLCAnc3RhcnQnXSk7XG4gICAgcmV0dXJuIHRoaXMuZG9ja2VyZmlsZTtcbiAgfVxuXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBEOVByb2plY3RPcHRpb25zfSBpbnN0ZWFkLiBUaGUgcGFja2FnZSB3YXMgcmVuYW1lZCB0byBgQHdiY2UvcHJvamVuLWQ5YCB0byByZWZsZWN0IHRoYXQgaXQgdGFyZ2V0cyB0aGUgZDkgZm9yaywgbm90IHVwc3RyZWFtIERpcmVjdHVzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LW9iamVjdC10eXBlXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdHVzUHJvamVjdE9wdGlvbnMgZXh0ZW5kcyBEOVByb2plY3RPcHRpb25zIHt9XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBEOVByb2plY3R9IGluc3RlYWQuIFRoZSBwYWNrYWdlIHdhcyByZW5hbWVkIHRvIGBAd2JjZS9wcm9qZW4tZDlgIHRvIHJlZmxlY3QgdGhhdCBpdCB0YXJnZXRzIHRoZSBkOSBmb3JrLCBub3QgdXBzdHJlYW0gRGlyZWN0dXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXJlY3R1c1Byb2plY3QgZXh0ZW5kcyBEOVByb2plY3Qge31cbiJdfQ==
334
+ DirectusProject[_b] = { fqn: "@wbce/projen-d9.DirectusProject", version: "0.1.0" };
335
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtRUFBa0c7QUFDbEcsdURBQW9GO0FBQ3BGLG1DQUEwSTtBQUMxSSx1RUFBa0U7QUFDbEUsc0RBQW9FO0FBK0RwRSxNQUFhLFNBQVUsU0FBUSxtQkFBVSxDQUFDLFdBQVc7SUFhbkQsWUFBc0IsT0FBeUI7UUFDN0MsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksU0FBUyxDQUFDO1FBQzNELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQUUsS0FBSyxJQUFJLE9BQU8sQ0FBQztRQUMvRCxLQUFLLENBQUM7WUFDSixHQUFHLE9BQU87WUFDVixjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWMsSUFBSSxtQkFBVSxDQUFDLGtCQUFrQixDQUFDLEdBQUc7WUFDM0UsTUFBTSxFQUFFLEtBQUssRUFBRSxzQ0FBc0M7WUFDckQsV0FBVyxFQUFFLElBQUk7WUFDakIsa0JBQWtCLEVBQUU7Z0JBQ2xCLGVBQWUsRUFBRTtvQkFDZixRQUFRLEVBQUUsd0NBQTJCLENBQUMsS0FBSztpQkFDNUM7YUFDRjtZQUNELFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUk7Z0JBQ3hCLFFBQVEsRUFBRTtvQkFDUixLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUU7b0JBQ25CLEVBQUU7b0JBQ0YsZ1BBQWdQO29CQUNoUCxFQUFFO29CQUNGLHNCQUFzQjtvQkFDdEIsRUFBRTtvQkFDRixPQUFPO29CQUNQLGdEQUFnRDtvQkFDaEQsOERBQThEO29CQUM5RCxLQUFLO29CQUNMLEVBQUU7b0JBQ0YscUlBQXFJO29CQUNySSxFQUFFO29CQUNGLFdBQVc7b0JBQ1gsRUFBRTtvQkFDRixtRkFBbUY7b0JBQ25GLEVBQUU7b0JBQ0YsT0FBTztvQkFDUCw0Q0FBNEM7b0JB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QUMsY0FBYyxFQUFFLGdGQUFnRixDQUFDO2FBQ3RHLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDO2FBQzlCLElBQUksQ0FBQyxTQUFTLEVBQUUsdUJBQXVCLENBQUM7YUFDeEMsT0FBTyxDQUFDLE1BQU0sQ0FBQzthQUNmLElBQUksQ0FBQyxjQUFjLEVBQUUsaURBQWlELENBQUM7YUFDdkUsR0FBRyxDQUFDLGlDQUFpQyxDQUFDO2FBQ3RDLElBQUksQ0FBQyxTQUFTLEVBQUUsMkRBQTJELENBQUM7YUFDNUUsR0FBRyxDQUFDLHdDQUF3QyxDQUFDO2FBQzdDLElBQUksQ0FBQyxhQUFhLEVBQUUsdUNBQXVDLENBQUM7YUFDNUQsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7YUFDZCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUM7YUFDM0MsR0FBRyxDQUFDLDZCQUE2QixDQUFDO2FBQ2xDLElBQUksQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUM7YUFDaEMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDOztBQWhXSCw4QkFrV0M7OztBQVFEOztHQUVHO0FBQ0gsTUFBYSxlQUFnQixTQUFRLFNBQVM7O0FBQTlDLDBDQUFpRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFkZEV4dGVuc2lvbk9wdGlvbnMsIEQ5RXh0ZW5zaW9uVHlwZSwgRXh0ZW5zaW9uRm9sZGVyIH0gZnJvbSAnQHdiY2UvcHJvamVuLWQ5LWV4dGVuc2lvbic7XG5pbXBvcnQgeyBHaXRIdWJDb25maWcsIEdpdEh1YkNvbmZpZ09wdGlvbnMsIERvY2tlcmZpbGUgfSBmcm9tICdAd2JjZS9wcm9qZW4tc2hhcmVkJztcbmltcG9ydCB7IEFpQWdlbnQsIEFpSW5zdHJ1Y3Rpb25zLCBEb2NrZXJDb21wb3NlLCBEb2NrZXJDb21wb3NlU2VydmljZSwgamF2YXNjcmlwdCwgSnNvbkZpbGUsIFNhbXBsZUZpbGUsIFRhc2ssIHR5cGVzY3JpcHQgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgSm9iUGVybWlzc2lvbiB9IGZyb20gJ3Byb2plbi9saWIvZ2l0aHViL3dvcmtmbG93cy1tb2RlbCc7XG5pbXBvcnQgeyBVcGdyYWRlRGVwZW5kZW5jaWVzU2NoZWR1bGUgfSBmcm9tICdwcm9qZW4vbGliL2phdmFzY3JpcHQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VWZXJzaW9ucyB7XG4gIHJlYWRvbmx5IGQ5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIEF0bGFzIGJpbmFyeSBkb3dubG9hZGVkIGJ5IGQ5LXBsdW1iaW5nLlxuICAgKiBAZGVmYXVsdCBcIjEuMy4zXCJcbiAgICovXG4gIHJlYWRvbmx5IGF0bGFzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFN0b3JhZ2Ugc2hhcmVkIGJldHdlZW4gZW52aXJvbm1lbnRzLCB1c2VkIGJ5IGBkOS1wbHVtYmluZyBzYXZlYCBhbmQgYGQ5LXBsdW1iaW5nIGFwcGx5LXNjaGVtYWAgdG8gdHJhbnNmZXIgZmlsZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJtZWRpYXRlU3RvcmFnZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHN0b3JhZ2UgZHJpdmVyOiBzMywgZ2NzLCBhenVyZSwgbG9jYWwgb3IgY2xvdWRpbmFyeS5cbiAgICovXG4gIHJlYWRvbmx5IGRyaXZlcjogc3RyaW5nO1xuICAvKipcbiAgICogTm9uLXNlY3JldCBkcml2ZXIgb3B0aW9ucyAocm9vdCwgYnVja2V0LCByZWdpb24sIGVuZHBvaW50Li4uKS5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAvKipcbiAgICogU2VjcmV0IGRyaXZlciBvcHRpb25zLCBtYXBwaW5nIGVhY2ggb3B0aW9uIG5hbWUgdG8gdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGhvbGRpbmcgaXRzIHZhbHVlLlxuICAgKiBPbmx5IHRoZSB2YXJpYWJsZSBuYW1lIGlzIHdyaXR0ZW4gdG8gYGQ5LXBsdW1iaW5nLmpzb25gLCBuZXZlciB0aGUgdmFsdWU6IGl0IGlzIHJlYWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgKG9yIGAuZW52YCkgYXQgcnVudGltZS5cbiAgICogQGV4YW1wbGUgeyBrZXk6ICdTM19BQ0NFU1NfS0VZX0lEX0VOVl9WQVInLCBzZWNyZXQ6ICdTM19TRUNSRVRfQUNDRVNTX0tFWV9FTlZfVkFSJyB9IC8vIHRoZSBgc2VjcmV0YCBvcHRpb24gaXMgcmVhZCBmcm9tICRTM19TRUNSRVRfQUNDRVNTX0tFWV9FTlZfVkFSXG4gICAqL1xuICByZWFkb25seSBzZWNyZXRFbnY/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb2YgdGhlIGQ5LXBsdW1iaW5nIENMSSwgd3JpdHRlbiB0byBgZDktcGx1bWJpbmcuanNvbmAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1bWJpbmdPcHRpb25zIHtcbiAgLyoqXG4gICAqIFN0b3JhZ2Ugc2hhcmVkIGJldHdlZW4gZW52aXJvbm1lbnRzLlxuICAgKiBAZGVmYXVsdCAtIG5vbmUsIHRoZSBpbnRlcm1lZGlhdGUgc3RvcmFnZSBpcyBjb25maWd1cmVkIHdpdGggSU5URVJNRURJQVRFX1NUT1JBR0VfKiB2YXJpYWJsZXMgb3IgZmxhZ3NcbiAgICovXG4gIHJlYWRvbmx5IGludGVybWVkaWF0ZVN0b3JhZ2U/OiBJbnRlcm1lZGlhdGVTdG9yYWdlT3B0aW9ucztcbiAgLyoqXG4gICAqIERlZmF1bHQgbG9nIGxldmVsIG9mIHRoZSBDTEksIG92ZXJyaWRkZW4gYnkgdGhlIExPR19MRVZFTCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICogQGRlZmF1bHQgXCJkZWJ1Z1wiXG4gICAqL1xuICByZWFkb25seSBsb2dMZXZlbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEOVByb2plY3RPcHRpb25zIGV4dGVuZHMgdHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdE9wdGlvbnMge1xuICAvKipcbiAgICogT3B0aW9ucyBmb3IgdGhlIEdpdEh1YiBjb25maWd1cmF0aW9uLlxuICAgKiBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSBHaXRIdWIgY29uZmlnIGVudGlyZWx5LlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgR2l0SHViQ29uZmlnIHdpdGggcHJvamVjdCBkZWZhdWx0c1xuICAgKi9cbiAgcmVhZG9ubHkgZ2l0aHViQ29uZmlnPzogR2l0SHViQ29uZmlnT3B0aW9ucyB8IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9ucyBmb2xkZXIuXG4gICAqIEBkZWZhdWx0IFwiZXh0ZW5zaW9uLXBhY2thZ2VzXCJcbiAgICovXG4gIHJlYWRvbmx5IGV4dGVuc2lvbnNGb2xkZXJOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBwYWNrYWdlVmVyc2lvbnM/OiBQYWNrYWdlVmVyc2lvbnM7XG59XG5cbmV4cG9ydCBjbGFzcyBEOVByb2plY3QgZXh0ZW5kcyBqYXZhc2NyaXB0Lk5vZGVQcm9qZWN0IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgZ2l0aHViQ29uZmlnPzogR2l0SHViQ29uZmlnO1xuICBwdWJsaWMgZXh0ZW5zaW9ucyE6IEV4dGVuc2lvbkZvbGRlcjtcbiAgcHVibGljIGV4dGVuc2lvbkZvbGRlciE6IHN0cmluZztcbiAgcHVibGljIGJ1aWxkRXh0ZW5zaW9uVGFzayE6IFRhc2s7XG4gIHB1YmxpYyBkb2NrZXJmaWxlITogRG9ja2VyZmlsZTtcbiAgcHVibGljIGRvY2tlckNvbXBvc2VGaWxlITogRG9ja2VyQ29tcG9zZTtcbiAgcHVibGljIGQ5U2VydmljZSE6IERvY2tlckNvbXBvc2VTZXJ2aWNlO1xuICBwdWJsaWMgZGF0YWJhc2VTZXJ2aWNlITogRG9ja2VyQ29tcG9zZVNlcnZpY2U7XG4gIHB1YmxpYyBjYWNoZVNlcnZpY2UhOiBEb2NrZXJDb21wb3NlU2VydmljZTtcbiAgcHJpdmF0ZSBwbHVtYmluZ0NvbmZpZyE6IEpzb25GaWxlO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBvcHRpb25zOiBEOVByb2plY3RPcHRpb25zKSB7XG4gICAgY29uc3QgZDlWZXJzaW9uID0gb3B0aW9ucy5wYWNrYWdlVmVyc2lvbnM/LmQ5IHx8ICcxMi4wLjE1JztcbiAgICBjb25zdCBhdGxhc1ZlcnNpb24gPSBvcHRpb25zLnBhY2thZ2VWZXJzaW9ucz8uYXRsYXMgfHwgJzEuMy4zJztcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgcGFja2FnZU1hbmFnZXI6IG9wdGlvbnMucGFja2FnZU1hbmFnZXIgPz8gamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIuTlBNLFxuICAgICAgZ2l0aHViOiBmYWxzZSwgLy8gV2UgdXNlIG91ciBvd24gR2l0SHViQ29uZmlnIGluc3RlYWRcbiAgICAgIGRlcHNVcGdyYWRlOiB0cnVlLFxuICAgICAgZGVwc1VwZ3JhZGVPcHRpb25zOiB7XG4gICAgICAgIHdvcmtmbG93T3B0aW9uczoge1xuICAgICAgICAgIHNjaGVkdWxlOiBVcGdyYWRlRGVwZW5kZW5jaWVzU2NoZWR1bGUuREFJTFksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbGljZW5zZWQ6IGZhbHNlLFxuICAgICAgcmVhZG1lOiBvcHRpb25zLnJlYWRtZSA/PyB7XG4gICAgICAgIGNvbnRlbnRzOiBbXG4gICAgICAgICAgYCMgJHtvcHRpb25zLm5hbWV9YCxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnQSBbZDldKGh0dHBzOi8vZ2l0aHViLmNvbS9MYVdlYmNhcHN1bGUvZDkpIChEaXJlY3R1cyA5IGZvcmspIHByb2plY3Qgc2NhZmZvbGRlZCB3aXRoIFtgQHdiY2UvcHJvamVuLWQ5YF0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvQHdiY2UvcHJvamVuLWQ5KS4gRGV2ZWxvcCBsb2NhbGx5IGFnYWluc3QgRG9ja2VyIENvbXBvc2UsIHRoZW4gYnVpbGQgYSBEb2NrZXIgaW1hZ2UgdG8gZGVwbG95IGFueXdoZXJlLicsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJyMjIExvY2FsIGRldmVsb3BtZW50JyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnYGBgc2gnLFxuICAgICAgICAgICducHggcHJvamVuIGluc3RhbGwgICAgICAjIGluc3RhbGwgZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAnbnB4IHByb2plbiBmaXJzdC1ydW4gICAgIyBib290IHN0YWNrLCBjcmVhdGUgYWRtaW4sIHN0YXJ0IGQ5JyxcbiAgICAgICAgICAnYGBgJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnT3BlbiBodHRwOi8vbG9jYWxob3N0OjgwNTUgYW5kIHNpZ24gaW4gYXMgYGFkbWluQGV4YW1wbGUuY29tYCAvIGB0b3RvdG90b2AuIEV4dGVuc2lvbnMgYXV0by1yZWxvYWQgKGBFWFRFTlNJT05TX0FVVE9fUkVMT0FEPXRydWVgKS4nLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcjIyBEZXBsb3knLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICdBIGBEb2NrZXJmaWxlYCBpcyBpbmNsdWRlZC4gQnVpbGQgYW5kIHB1c2ggdGhlIGltYWdlIGZvciB5b3VyIHRhcmdldCBlbnZpcm9ubWVudDonLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICdgYGBzaCcsXG4gICAgICAgICAgJ2RvY2tlciBidWlsZCAtdCA8cmVnaXN0cnk+LzxpbWFnZT46PHRhZz4gLicsXG4gICAgICAgICAgJ2RvY2tlciBwdXNoIDxyZWdpc3RyeT4vPGltYWdlPjo8dGFnPicsXG4gICAgICAgICAgJ2BgYCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ0NvbmZpZ3VyZSB0aGUgZGVwbG95ZWQgaW5zdGFuY2Ugd2l0aCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGRhdGFiYXNlLCBjYWNoZSwgc2VjcmV0cykg4oCUIHNlZSB0aGUgZDkgZG9jcy4nLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcjIyBDb21tb24gdGFza3MnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICd8IFRhc2sgfCBEZXNjcmlwdGlvbiB8JyxcbiAgICAgICAgICAnfCAtLS0gfCAtLS0gfCcsXG4gICAgICAgICAgJ3wgYG5weCBwcm9qZW4gcnVuYCB8IFN0YXJ0IGQ5IChgZG9ja2VyIGNvbXBvc2UgdXAgZDlgKSB8JyxcbiAgICAgICAgICAnfCBgbnB4IHByb2plbiBidWlsZC1leHRlbnNpb25zIFtuYW1lXWAgfCBJbnN0YWxsIGFuZCBidWlsZCBhbGwgZXh0ZW5zaW9ucyAob3Igb25seSBgbmFtZWApIHwnLFxuICAgICAgICAgICd8IGBucHggcHJvamVuIGNyZWF0ZS1hbi1hZG1pbmAgfCBDcmVhdGUgdGhlIGRlZmF1bHQgYWRtaW4gdXNlciB8JyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnU2VlIGAucHJvamVuL3Rhc2tzLmpzb25gIGZvciB0aGUgZnVsbCBsaXN0LicsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJyMjIENvbmZpZ3VyYXRpb24nLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICdFZGl0IGAucHJvamVucmMuanNgIGFuZCBydW4gYG5weCBwcm9qZW5gIHRvIHJlZ2VuZXJhdGUgcHJvamVjdCBmaWxlcy4gTG9jYWwgZW52aXJvbm1lbnQgb3ZlcnJpZGVzIGdvIGluIGAuZW52LmxvY2FsYC4nLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcjIyBFeHRlbnNpb25zJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnRXh0ZW5zaW9ucyBsaXZlIHVuZGVyIGAuL3BsdWdpbnMvYC4gQWRkIG5ldyBvbmVzIGluIGAucHJvamVucmMuanNgOicsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ2BgYGpzJyxcbiAgICAgICAgICBcImltcG9ydCB7IEQ5RXh0ZW5zaW9uVHlwZSB9IGZyb20gJ0B3YmNlL3Byb2plbi1kOS1leHRlbnNpb24nO1wiLFxuICAgICAgICAgICcnLFxuICAgICAgICAgIFwicHJvamVjdC5hZGRFeHRlbnNpb24oJ215LWhvb2snLCBbRDlFeHRlbnNpb25UeXBlLkhPT0tdKTtcIixcbiAgICAgICAgICAnYGBgJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnVGhlbiBgbnB4IHByb2plbiAmJiBucHggcHJvamVuIGJ1aWxkLWV4dGVuc2lvbnNgLicsXG4gICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICB9LFxuICAgICAgZGV2RGVwczogW1xuICAgICAgICAnQHdiY2UvcHJvamVuLWQ5JyxcbiAgICAgICAgJ0B3YmNlL3Byb2plbi1kOS1leHRlbnNpb24nLFxuICAgICAgICAuLi4ob3B0aW9ucy5kZXZEZXBzID8/IFtdKSxcbiAgICAgIF0sXG4gICAgICBkZXBzOiBbYEB3YmNlLWQ5L2RpcmVjdHVzOUAke2Q5VmVyc2lvbn1gXSxcbiAgICB9KTtcblxuICAgIC8vIE5vIHRzY29uZmlnIG1lYW5zIG5vIHRzYyAtLWJ1aWxkIGluIGNvbXBpbGVcbiAgICB0aGlzLmNvbXBpbGVUYXNrLnJlc2V0KCk7XG5cbiAgICB0aGlzLnBsdW1iaW5nQ29uZmlnID0gbmV3IEpzb25GaWxlKHRoaXMsICdkOS1wbHVtYmluZy5qc29uJywge1xuICAgICAgb2JqOiB7IGF0bGFzVmVyc2lvbiB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRFeHRlbnNpb25Gb2xkZXIoKTtcbiAgICB0aGlzLmFkZERvY2tlckNvbXBvc2UoKTtcbiAgICB0aGlzLmFkZEZpcnN0UnVuVGFzaygpO1xuICAgIHRoaXMuYWRkQnVpbGRFeHRlbnNpb25UYXNrKCk7XG4gICAgdGhpcy5hZGRSdW5UYXNrKCk7XG4gICAgdGhpcy5hZGREOVBsdW1iaW5nVGFzaygpO1xuICAgIHRoaXMuYWRkRG9ja2VyZmlsZSgpO1xuICAgIHRoaXMuYWRkQ3JlYXRlQWRtaW5Vc2VyVGFzaygpO1xuXG4gICAgbmV3IEFpSW5zdHJ1Y3Rpb25zKHRoaXMsIHtcbiAgICAgIGFnZW50czogW0FpQWdlbnQuQ0xBVURFXSxcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb25zLmdpdGh1YkNvbmZpZyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZ2l0aHViQ29uZmlnID0gbmV3IEdpdEh1YkNvbmZpZyh0aGlzLCBvcHRpb25zLmdpdGh1YkNvbmZpZyk7XG4gICAgICB0aGlzLmFkZFNhdmVCcmFuY2hXb3JrZmxvdygpO1xuICAgIH1cbiAgICB0aGlzLmdpdGlnbm9yZS5hZGRQYXR0ZXJucygndXBsb2FkcycpO1xuICAgIHRoaXMuZ2l0aWdub3JlLmFkZFBhdHRlcm5zKCcqKi8uRFNfU3RvcmUnKTtcbiAgICB0aGlzLmdpdGlnbm9yZS5hZGRQYXR0ZXJucygnLmVudi5sb2NhbCcpO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGVtcHR5IC5lbnYubG9jYWwgaWYgaXQgZG9lc24ndCBleGlzdCwgc28gRG9ja2VyIGRvZXNuJ3QgbW91bnQgYSBkaXJlY3RvcnlcbiAgICBuZXcgU2FtcGxlRmlsZSh0aGlzLCAnLmVudi5sb2NhbCcsIHsgY29udGVudHM6ICcjIExvY2FsIGVudmlyb25tZW50IG92ZXJyaWRlcyBmb3IgZDknIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRFeHRlbnNpb25Gb2xkZXIoKSB7XG4gICAgY29uc3QgZm9sZGVyTmFtZSA9IHRoaXMub3B0aW9ucy5leHRlbnNpb25zRm9sZGVyTmFtZSA/PyAncGx1Z2lucyc7XG4gICAgdGhpcy5leHRlbnNpb25zID0gbmV3IEV4dGVuc2lvbkZvbGRlcih7IHBhcmVudDogdGhpcywgbmFtZTogZm9sZGVyTmFtZSB9KTtcbiAgICB0aGlzLmV4dGVuc2lvbkZvbGRlciA9IGZvbGRlck5hbWU7XG4gICAgdGhpcy5naXRpZ25vcmUuZXhjbHVkZSgnZXh0ZW5zaW9ucy8qJyk7XG4gICAgdGhpcy5naXRpZ25vcmUuaW5jbHVkZSgnZXh0ZW5zaW9ucy90ZW1wbGF0ZXMvJyk7XG4gIH1cblxuICBwdWJsaWMgYWRkRXh0ZW5zaW9uKG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uVHlwZXM6IEQ5RXh0ZW5zaW9uVHlwZVtdLCBvcHRpb25zPzogQWRkRXh0ZW5zaW9uT3B0aW9ucyApIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25zLmFkZChuYW1lLCBleHRlbnNpb25UeXBlcywgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY29uZmlndXJlUGx1bWJpbmcob3B0aW9uczogUGx1bWJpbmdPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3B0aW9ucykpIHtcbiAgICAgIHRoaXMucGx1bWJpbmdDb25maWcuYWRkT3ZlcnJpZGUoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRGaXJzdFJ1blRhc2soKSB7XG4gICAgY29uc3QgdGFzayA9IHRoaXMuYWRkVGFzaygnZmlyc3QtcnVuJywge1xuICAgICAgZGVzY3JpcHRpb246ICdJbml0aWFsaXplIGFuZCBzdGFydCBhIGZyZXNoIGQ5IGluc3RhbmNlJyxcbiAgICB9KTtcbiAgICBjb25zdCBhZG1pbkVtYWlsID0gJ2FkbWluQGV4YW1wbGUuY29tJztcbiAgICBjb25zdCB1c2VyTm90RXhpc3RzQ29uZGl0aW9uID0gYGRvY2tlciBjb21wb3NlIGV4ZWMgZGF0YWJhc2UgcHNxbCAtVSBkOSAtZCBkOSAtdEFjIFwiU0VMRUNUIGNvdW50KCopIEZST00gZGlyZWN0dXNfdXNlcnMgV0hFUkUgZW1haWwgPSAnJHthZG1pbkVtYWlsfSdcIiB8IGdyZXAgLXEgJ14wJCdgO1xuICAgIGNvbnN0IGVtcHR5RGF0YWJhc2VDb25kaXRpb24gPSAnZG9ja2VyIGNvbXBvc2UgZXhlYyBkYXRhYmFzZSBwc3FsIC1VIGQ5IC1kIGQ5IC10QWMgXCJTRUxFQ1QgY291bnQoKikgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX25hbWUgTElLRSBcXCdkaXJlY3R1c18lXFwnXCIgfCBncmVwIC1xIFxcJ14wJFxcJyc7XG4gICAgdGFzay5leGVjKCdkb2NrZXIgY29tcG9zZSB1cCAtZCAtLXdhaXQgZGF0YWJhc2UgY2FjaGUnKTtcbiAgICB0YXNrLmV4ZWMoJ25weCBkOS1wbHVtYmluZyBmaXJzdC1pbXBvcnQgLS1ob3N0IGxvY2FsaG9zdCAtLXVzZXIgZDkgLS1wYXNzd29yZCBkOSAtLWRhdGFiYXNlIGQ5Jywge1xuICAgICAgY29uZGl0aW9uOiAndGVzdCAtZCAuL3NxbCcsXG4gICAgfSk7XG4gICAgdGFzay5leGVjKCdkb2NrZXIgY29tcG9zZSBydW4gLS1ybSBkOSBucHggZGlyZWN0dXMgYm9vdHN0cmFwJywge1xuICAgICAgY29uZGl0aW9uOiBgdGVzdCAhIC1kIC4vc3FsICYmICR7ZW1wdHlEYXRhYmFzZUNvbmRpdGlvbn1gLFxuICAgIH0pO1xuICAgIHRhc2suZXhlYyhgQURNSU5fUk9MRV9JRD0kKGRvY2tlciBjb21wb3NlIGV4ZWMgZGF0YWJhc2UgcHNxbCAtVSBkOSAtZCBkOSAtdEFjIFwiU0VMRUNUIGlkIEZST00gZGlyZWN0dXNfcm9sZXMgV0hFUkUgYWRtaW5fYWNjZXNzID0gdHJ1ZSBMSU1JVCAxXCIpICYmIGRvY2tlciBjb21wb3NlIHJ1biAtLXJtIGQ5IG5weCBkaXJlY3R1cyB1c2VycyBjcmVhdGUgLS1lbWFpbCAke2FkbWluRW1haWx9IC0tcGFzc3dvcmQgdG90b3RvdG8gLS1yb2xlIFwiJEFETUlOX1JPTEVfSURcImAsIHtcbiAgICAgIGNvbmRpdGlvbjogdXNlck5vdEV4aXN0c0NvbmRpdGlvbixcbiAgICB9KTtcbiAgICB0YXNrLnNheShgVXNlciAke2FkbWluRW1haWx9IGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCBwYXNzd29yZCB0b3RvdG90b2AsIHtcbiAgICAgIGNvbmRpdGlvbjogdXNlck5vdEV4aXN0c0NvbmRpdGlvbixcbiAgICB9KTtcbiAgICB0YXNrLnNheShgVXNlciAke2FkbWluRW1haWx9IGFscmVhZHkgZXhpc3RzLCBza2lwcGluZyBjcmVhdGlvbmAsIHtcbiAgICAgIGNvbmRpdGlvbjogYCEgJHt1c2VyTm90RXhpc3RzQ29uZGl0aW9ufWAsXG4gICAgfSk7XG4gICAgdGFzay5leGVjKCdkb2NrZXIgY29tcG9zZSB1cCBkOScpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDcmVhdGVBZG1pblVzZXJUYXNrKCkge1xuICAgIGNvbnN0IHRhc2sgPSB0aGlzLmFkZFRhc2soJ2NyZWF0ZS1hbi1hZG1pbicsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGFuIGFkbWluIHVzZXInLFxuICAgIH0pO1xuICAgIGNvbnN0IGFkbWluRW1haWwgPSAnYWRtaW5AZXhhbXBsZS5jb20nO1xuICAgIGNvbnN0IHVzZXJOb3RFeGlzdHNDb25kaXRpb24gPSBgZG9ja2VyIGNvbXBvc2UgZXhlYyBkYXRhYmFzZSBwc3FsIC1VIGQ5IC1kIGQ5IC10QWMgXCJTRUxFQ1QgY291bnQoKikgRlJPTSBkaXJlY3R1c191c2VycyBXSEVSRSBlbWFpbCA9ICcke2FkbWluRW1haWx9J1wiIHwgZ3JlcCAtcSAnXjAkJ2A7XG4gICAgdGFzay5leGVjKCdkb2NrZXIgY29tcG9zZSB1cCAtZCAtLXdhaXQgZGF0YWJhc2UgY2FjaGUnKTtcbiAgICB0YXNrLmV4ZWMoYEFETUlOX1JPTEVfSUQ9JChkb2NrZXIgY29tcG9zZSBleGVjIGRhdGFiYXNlIHBzcWwgLVUgZDkgLWQgZDkgLXRBYyBcIlNFTEVDVCBpZCBGUk9NIGRpcmVjdHVzX3JvbGVzIFdIRVJFIGFkbWluX2FjY2VzcyA9IHRydWUgTElNSVQgMVwiKSAmJiBkb2NrZXIgY29tcG9zZSBydW4gLS1ybSBkOSBucHggZGlyZWN0dXMgdXNlcnMgY3JlYXRlIC0tZW1haWwgJHthZG1pbkVtYWlsfSAtLXBhc3N3b3JkIHRvdG90b3RvIC0tcm9sZSBcIiRBRE1JTl9ST0xFX0lEXCJgLCB7XG4gICAgICBjb25kaXRpb246IHVzZXJOb3RFeGlzdHNDb25kaXRpb24sXG4gICAgfSk7XG4gICAgdGFzay5zYXkoYFVzZXIgJHthZG1pbkVtYWlsfSBoYXMgYmVlbiBjcmVhdGVkIHdpdGggcGFzc3dvcmQgdG90b3RvdG9gLCB7XG4gICAgICBjb25kaXRpb246IHVzZXJOb3RFeGlzdHNDb25kaXRpb24sXG4gICAgfSk7XG4gICAgdGFzay5zYXkoYFVzZXIgJHthZG1pbkVtYWlsfSBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcgY3JlYXRpb25gLCB7XG4gICAgICBjb25kaXRpb246IGAhICR7dXNlck5vdEV4aXN0c0NvbmRpdGlvbn1gLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRSdW5UYXNrKCkge1xuICAgIGNvbnN0IHRhc2sgPSB0aGlzLmFkZFRhc2soJ3J1bicsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnc3RhcnQgdGhlIGQ5IGluc3RhbmNlJyxcbiAgICB9KTtcbiAgICB0YXNrLmV4ZWMoJ2RvY2tlciBjb21wb3NlIHVwIGQ5Jyk7XG4gIH1cblxuICBwcml2YXRlIGFkZEQ5UGx1bWJpbmdUYXNrKCkge1xuICAgIGNvbnN0IHRhc2sgPSB0aGlzLmFkZFRhc2soJ2Q5LXBsdW1iaW5nJywge1xuICAgICAgZGVzY3JpcHRpb246ICdSdW4gdGhlIGQ5LXBsdW1iaW5nIENMSSAoc2F2ZSwgYXBwbHktc2NoZW1hLCBmaXJzdC1pbXBvcnQuLi4pLiBVc2UgLS1oZWxwIHRvIGxpc3QgYWxsIHN1YmNvbW1hbmRzLicsXG4gICAgfSk7XG4gICAgdGFzay5zYXkoJ1RpcDogeW91IGNhbiBhbHNvIGNhbGwgaXQgZGlyZWN0bHkgd2l0aCBgbnB4IGQ5LXBsdW1iaW5nIDxjb21tYW5kPmAnKTtcbiAgICB0YXNrLmV4ZWMoJ25weCBkOS1wbHVtYmluZyBcIiRAXCInLCB7IHJlY2VpdmVBcmdzOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRCdWlsZEV4dGVuc2lvblRhc2soKSB7XG4gICAgdGhpcy5idWlsZEV4dGVuc2lvblRhc2sgPSB0aGlzLmFkZFRhc2soJ2J1aWxkLWV4dGVuc2lvbnMnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0J1aWxkIHRoZSBkOSBleHRlbnNpb25zJyxcbiAgICB9KTtcbiAgICB0aGlzLmJ1aWxkRXh0ZW5zaW9uVGFzay5leGVjKGBjZCAke3RoaXMuZXh0ZW5zaW9uRm9sZGVyfSAmJiBwbnBtIGluc3RhbGxgKTtcbiAgICAvLyBwcm9qZW4gcmVwbGFjZXMgXCIkQFwiIHdpdGggdGhlIHF1b3RlZCB0YXNrIGFyZ3M7IGBzZXQgLS1gIHR1cm5zIHRoZW0gYmFjayBpbnRvICQxXG4gICAgdGhpcy5idWlsZEV4dGVuc2lvblRhc2suZXhlYyhcbiAgICAgIGBjZCAke3RoaXMuZXh0ZW5zaW9uRm9sZGVyfSAmJiBzZXQgLS0gXCIkQFwiICYmIGlmIFsgLW4gXCIkMVwiIF07IHRoZW4gcG5wbSAtLXJlY3Vyc2l2ZSAtLWZpbHRlciBcIiQxLi4uXCIgcnVuIGJ1aWxkOyBlbHNlIHBucG0gcnVuIC0tcmVjdXJzaXZlIGJ1aWxkOyBmaWAsXG4gICAgICB7IHJlY2VpdmVBcmdzOiB0cnVlIH0sXG4gICAgKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBhZGREb2NrZXJDb21wb3NlKCkge1xuICAgIGNvbnN0IGRjID0gbmV3IERvY2tlckNvbXBvc2UodGhpcyk7XG5cbiAgICB0aGlzLmRhdGFiYXNlU2VydmljZSA9IGRjLmFkZFNlcnZpY2UoJ2RhdGFiYXNlJywge1xuICAgICAgaW1hZ2U6ICdwb3N0Z2lzL3Bvc3RnaXM6MTMtbWFzdGVyJyxcbiAgICAgIHZvbHVtZXM6IFtcbiAgICAgICAgRG9ja2VyQ29tcG9zZS5uYW1lZFZvbHVtZSgncGdkYXRhJywgJy92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScpLFxuICAgICAgXSxcbiAgICAgIHBvcnRzOiBbXG4gICAgICAgIERvY2tlckNvbXBvc2UucG9ydE1hcHBpbmcoNTQzMiwgNTQzMiksXG4gICAgICBdLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgUE9TVEdSRVNfVVNFUjogJ2Q5JyxcbiAgICAgICAgUE9TVEdSRVNfUEFTU1dPUkQ6ICdkOScsXG4gICAgICAgIFBPU1RHUkVTX0RCOiAnZDknLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuY2FjaGVTZXJ2aWNlID0gZGMuYWRkU2VydmljZSgnY2FjaGUnLCB7XG4gICAgICBpbWFnZTogJ3JlZGlzOjYnLFxuICAgICAgdm9sdW1lczogW1xuICAgICAgICBEb2NrZXJDb21wb3NlLm5hbWVkVm9sdW1lKCdyZWRpc19zdG9yYWdlJywgJy9kYXRhJyksXG4gICAgICBdLFxuICAgICAgcG9ydHM6IFtcbiAgICAgICAgRG9ja2VyQ29tcG9zZS5wb3J0TWFwcGluZyg2Mzc5LCA2Mzc5KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmQ5U2VydmljZSA9IGRjLmFkZFNlcnZpY2UoJ2Q5Jywge1xuICAgICAgaW1hZ2VCdWlsZDogeyBjb250ZXh0OiAnLicgfSxcbiAgICAgIHBvcnRzOiBbXG4gICAgICAgIERvY2tlckNvbXBvc2UucG9ydE1hcHBpbmcoODA1NSwgODA1NSksXG4gICAgICBdLFxuICAgICAgdm9sdW1lczogW1xuICAgICAgICBEb2NrZXJDb21wb3NlLmJpbmRWb2x1bWUoJy4vdXBsb2FkcycsICcvYXBwL3VwbG9hZHMnKSxcbiAgICAgICAgRG9ja2VyQ29tcG9zZS5iaW5kVm9sdW1lKCcuL2V4dGVuc2lvbnMnLCAnL2FwcC9leHRlbnNpb25zJyksXG4gICAgICBdLFxuICAgICAgLy8gZGVwZW5kc09uIGlzIHNldCB2aWEgYWRkT3ZlcnJpZGUgYmVsb3cgd2l0aCBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgS0VZOiAnc29tZS1yYW5kb20ta2V5JyxcbiAgICAgICAgU0VDUkVUOiAnYW5vdGhlci1yYW5kb20ta2V5JyxcbiAgICAgICAgQ09ORklHX1BBVEg6ICcuZW52LmxvY2FsJyxcbiAgICAgICAgREJfQ0xJRU5UOiAncGcnLFxuICAgICAgICBEQl9IT1NUOiAnZGF0YWJhc2UnLFxuICAgICAgICBEQl9QT1JUOiAnNTQzMicsXG4gICAgICAgIERCX0RBVEFCQVNFOiAnZDknLFxuICAgICAgICBEQl9VU0VSOiAnZDknLFxuICAgICAgICBEQl9QQVNTV09SRDogJ2Q5JyxcbiAgICAgICAgQ0FDSEVfRU5BQkxFRDogJ2ZhbHNlJyxcbiAgICAgICAgQ0FDSEVfU1RPUkU6ICdyZWRpcycsXG4gICAgICAgIENBQ0hFX1JFRElTX0hPU1Q6ICdjYWNoZScsXG4gICAgICAgIE1FU1NFTkdFUl9TVE9SRTogJ3JlZGlzJyxcbiAgICAgICAgTUVTU0VOR0VSX1JFRElTOiAncmVkaXM6Ly9jYWNoZTo2Mzc5JyxcbiAgICAgICAgQ0FDSEVfU1RBVFVTX0hFQURFUjogJ2NhY2hlLWhpdCcsXG4gICAgICAgIENPUlNfRU5BQkxFRDogJ3RydWUnLFxuICAgICAgICBDT1JTX09SSUdJTjogJ3RydWUnLFxuICAgICAgICBMT0dfTEVWRUw6ICdpbmZvJyxcbiAgICAgICAgQURNSU5fRU1BSUw6ICdhZG1pbkBleGFtcGxlLmNvbScsXG4gICAgICAgIEFETUlOX1BBU1NXT1JEOiAndG90b3RvdG8nLFxuICAgICAgICBFWFRFTlNJT05TX0FVVE9fUkVMT0FEOiAndHJ1ZScsXG4gICAgICAgIFZBTElEQVRFX0VOVElUSUVTX1RPS0VOU19BUElfS0VZOiAndG90bycsXG4gICAgICAgIEFXU19LTVNfS0VZX0lEOiAndHV0dScsXG4gICAgICB9LFxuICAgICAgY29tbWFuZDogWydzaCcsICctYycsICducHggZGlyZWN0dXMgc3RhcnQnXSxcbiAgICB9KTtcblxuICAgIHRoaXMuZDlTZXJ2aWNlLmFkZFZvbHVtZShEb2NrZXJDb21wb3NlLmJpbmRWb2x1bWUoJy4vLmVudi5sb2NhbCcsICcvYXBwLy5lbnYubG9jYWwnKSk7XG5cbiAgICAvLyBBZGQgaGVhbHRoY2hlY2sgZm9yIGRhdGFiYXNlIChub3QgbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IHByb2plbiBEb2NrZXJDb21wb3NlKVxuICAgIGRjLmZpbGUuYWRkT3ZlcnJpZGUoJ3NlcnZpY2VzLmRhdGFiYXNlLmhlYWx0aGNoZWNrJywge1xuICAgICAgdGVzdDogWydDTUQnLCAncGdfaXNyZWFkeScsICctLWhvc3Q9bG9jYWxob3N0JywgJy0tdXNlcm5hbWU9ZDknXSxcbiAgICAgIGludGVydmFsOiAnMTBzJyxcbiAgICAgIHRpbWVvdXQ6ICc1cycsXG4gICAgICByZXRyaWVzOiA1LFxuICAgICAgc3RhcnRfaW50ZXJ2YWw6ICc1cycsXG4gICAgICBzdGFydF9wZXJpb2Q6ICczMHMnLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIGhlYWx0aGNoZWNrIGZvciBjYWNoZVxuICAgIGRjLmZpbGUuYWRkT3ZlcnJpZGUoJ3NlcnZpY2VzLmNhY2hlLmhlYWx0aGNoZWNrJywge1xuICAgICAgdGVzdDogWydDTUQtU0hFTEwnLCAnWyAkKHJlZGlzLWNsaSBwaW5nKSA9IFxcJ1BPTkdcXCcgXSddLFxuICAgICAgaW50ZXJ2YWw6ICcxMHMnLFxuICAgICAgdGltZW91dDogJzVzJyxcbiAgICAgIHJldHJpZXM6IDUsXG4gICAgICBzdGFydF9pbnRlcnZhbDogJzVzJyxcbiAgICAgIHN0YXJ0X3BlcmlvZDogJzMwcycsXG4gICAgfSk7XG5cbiAgICAvLyBPdmVycmlkZSBkZXBlbmRzX29uIHRvIHVzZSBjb25kaXRpb24gc3ludGF4XG4gICAgZGMuZmlsZS5hZGRPdmVycmlkZSgnc2VydmljZXMuZDkuZGVwZW5kc19vbicsIHtcbiAgICAgIGNhY2hlOiB7IGNvbmRpdGlvbjogJ3NlcnZpY2VfaGVhbHRoeScgfSxcbiAgICAgIGRhdGFiYXNlOiB7IGNvbmRpdGlvbjogJ3NlcnZpY2VfaGVhbHRoeScgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuZG9ja2VyQ29tcG9zZUZpbGUgPSBkYztcblxuICAgIHJldHVybiBkYztcbiAgfVxuXG4gIHByaXZhdGUgYWRkU2F2ZUJyYW5jaFdvcmtmbG93KCkge1xuICAgIGNvbnN0IHdvcmtmbG93ID0gdGhpcy5naXRodWJDb25maWchLmFkZFdvcmtmbG93KCdzYXZlLWJyYW5jaCcpO1xuICAgIHdvcmtmbG93Lm9uKHsgcHVzaDogeyBicmFuY2hlczogWycqLXNhdmUnXSB9IH0pO1xuICAgIHdvcmtmbG93LmFkZEpvYignY3JlYXRlLXByJywge1xuICAgICAgbmFtZTogJ0NyZWF0ZSBQdWxsIFJlcXVlc3QnLFxuICAgICAgcnVuc09uOiBbJ3VidW50dS1sYXRlc3QnXSxcbiAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLlJFQUQsXG4gICAgICAgIHB1bGxSZXF1ZXN0czogSm9iUGVybWlzc2lvbi5XUklURSxcbiAgICAgIH0sXG4gICAgICBzdGVwczogW1xuICAgICAgICB7IG5hbWU6ICdDaGVja291dCcsIHVzZXM6ICdhY3Rpb25zL2NoZWNrb3V0QHY0JyB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0NyZWF0ZSBQdWxsIFJlcXVlc3QnLFxuICAgICAgICAgIHJ1bjogJ2doIHByIGNyZWF0ZSAtLXRpdGxlIFwiU2F2ZTogJHtHSVRIVUJfUkVGX05BTUUlLXNhdmV9XCIgLS1ib2R5IFwiQXV0by1nZW5lcmF0ZWQgUFIgZnJvbSBicmFuY2ggXFxcXGAke0dJVEhVQl9SRUZfTkFNRSUtc2F2ZX1cXFxcYFwiIC0tYmFzZSBcIiR7R0lUSFVCX1JFRl9OQU1FJS1zYXZlfVwiIHx8IGVjaG8gXCJQUiBhbHJlYWR5IGV4aXN0c1wiJyxcbiAgICAgICAgICBlbnY6IHsgR0hfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGREb2NrZXJmaWxlKCkge1xuICAgIHRoaXMuZG9ja2VyZmlsZSA9IG5ldyBEb2NrZXJmaWxlKHRoaXMpXG4gICAgICAuZnJvbSgnbm9kZScsICcyMi1ib29rd29ybS1zbGltJylcbiAgICAgIC5zdGVwKCd1cGRhdGUtbnBtJywgJ1VwZGF0ZSBucG0gdG8gZml4IGRlcGVuZGVuY2llcycpXG4gICAgICAucnVuKCducG0gaW5zdGFsbCAtZyBucG1AMTEuOC4wJylcbiAgICAgIC5zdGVwKCdpbnN0YWxsLXBucG0nLCAnaW5zdGFsbCBwbnBtJylcbiAgICAgIC5ydW4oJ25wbSBpbnN0YWxsIC1nIHBucG1AMTAuMzMuMCcpXG4gICAgICAuc3RlcCgnY29weS1wYWNrYWdlJywgJ0NvcHkgcGFja2FnZS5qc29uIGFuZCBwYWNrYWdlLWxvY2suanNvbiBmaXJzdCB0byBsZXZlcmFnZSBEb2NrZXIgbGF5ZXIgY2FjaGluZycpXG4gICAgICAuY29weSgncGFja2FnZSouanNvbicsICcvYXBwLycpXG4gICAgICAuc3RlcCgnd29ya2RpcicsICdTZXQgd29ya2luZyBkaXJlY3RvcnknKVxuICAgICAgLndvcmtkaXIoJy9hcHAnKVxuICAgICAgLnN0ZXAoJ2luc3RhbGwtZGVwcycsICdJbnN0YWxsIGRlcGVuZGVuY2llcyAtIHdpdGhvdXQgZGV2IGRlcGVuZGVuY2llcycpXG4gICAgICAucnVuKCdOT0RFX0VOVj1wcm9kdWN0aW9uIG5wbSBpbnN0YWxsJylcbiAgICAgIC5zdGVwKCdjbGVhbnVwJywgJ0NsZWFuaW5nIGJlbmNobWFya3MgZm9sZGVyIGluIHRlZGlvdXMgbW9kdWxlIGZvciBzZWN1cml0eScpXG4gICAgICAucnVuKCdybSAtcmYgbm9kZV9tb2R1bGVzL3RlZGlvdXMvYmVuY2htYXJrcycpXG4gICAgICAuc3RlcCgnY29weS1zb3VyY2UnLCAnQ29weSB0aGUgcmVzdCBvZiB0aGUgYXBwbGljYXRpb24gY29kZScpXG4gICAgICAuY29weSgnLicsICcuJylcbiAgICAgIC5zdGVwKCdidWlsZC1leHRlbnNpb24nLCAnYnVpbGQgZXh0ZW5zaW9ucycpXG4gICAgICAucnVuKCducHggcHJvamVuIGJ1aWxkLWV4dGVuc2lvbnMnKVxuICAgICAgLnN0ZXAoJ3N0YXJ0JywgJ1N0YXJ0IGQ5IHNlcnZlcicpXG4gICAgICAuY21kRXhlYyhbJ25weCcsICdkaXJlY3R1cycsICdzdGFydCddKTtcbiAgICByZXR1cm4gdGhpcy5kb2NrZXJmaWxlO1xuICB9XG5cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEQ5UHJvamVjdE9wdGlvbnN9IGluc3RlYWQuIFRoZSBwYWNrYWdlIHdhcyByZW5hbWVkIHRvIGBAd2JjZS9wcm9qZW4tZDlgIHRvIHJlZmxlY3QgdGhhdCBpdCB0YXJnZXRzIHRoZSBkOSBmb3JrLCBub3QgdXBzdHJlYW0gRGlyZWN0dXMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktb2JqZWN0LXR5cGVcbmV4cG9ydCBpbnRlcmZhY2UgRGlyZWN0dXNQcm9qZWN0T3B0aW9ucyBleHRlbmRzIEQ5UHJvamVjdE9wdGlvbnMge31cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEQ5UHJvamVjdH0gaW5zdGVhZC4gVGhlIHBhY2thZ2Ugd2FzIHJlbmFtZWQgdG8gYEB3YmNlL3Byb2plbi1kOWAgdG8gcmVmbGVjdCB0aGF0IGl0IHRhcmdldHMgdGhlIGQ5IGZvcmssIG5vdCB1cHN0cmVhbSBEaXJlY3R1cy5cbiAqL1xuZXhwb3J0IGNsYXNzIERpcmVjdHVzUHJvamVjdCBleHRlbmRzIEQ5UHJvamVjdCB7fVxuIl19
@@ -0,0 +1,181 @@
1
+ # cedar-wasm
2
+
3
+ An implementation of various cedar functions to enable developers to write typescript and javascript applications using Cedar and wasm.
4
+
5
+ ## Installing
6
+
7
+ Installing is simple, just run `npm i @cedar-policy/cedar-wasm --save` or install with whatever your favorite package manager is.
8
+
9
+ Loading is much more complicated. It depends on your environment. We offer three subpackages:
10
+
11
+ * es modules (default). It loads wasm in a way that will be bundled into a single file if you use dynamic imports, or embedded into your main bundle if you use regular imports.
12
+ * commonjs (for node). It loads wasm using node's `fs` module, synchronously. Not really designed for bundling or shipping to the browser.
13
+ * web: more customizable. This one is for when you need to load the wasm in some totally custom way. More details in the "alternate loading strategies" section.
14
+
15
+ These sub-packages are named `@cedar-policy/cedar-wasm`, `@cedar-policy/cedar-wasm/nodejs`, and `@cedar-policy/cedar-wasm/web`, respectively.
16
+
17
+ ## Loading in bare nodeJs without a bundler
18
+
19
+ Node uses CommonJs so you have to import with require, or with dynamic `import()`.
20
+
21
+ Importing the CJS export:
22
+
23
+ ```
24
+ const cedar = require('@cedar-policy/cedar-wasm/nodejs');
25
+ console.log(cedar.getCedarVersion());
26
+ ```
27
+
28
+ Importing the esm version using esm async import:
29
+
30
+ ```
31
+ import('@cedar-policy/cedar-wasm/nodejs')
32
+ .then(cedar => console.log(cedar.getCedarVersion()));
33
+ ```
34
+
35
+
36
+ ## Loading in webpack 5:
37
+
38
+ Minimal package.json for webpack including dev server:
39
+
40
+ ```
41
+ {
42
+ "name": "webpack-ts-tester",
43
+ "version": "1.0.0",
44
+ "description": "",
45
+ "private": true,
46
+ "scripts": {
47
+ "test": "echo \"Error: no test specified\" && exit 1",
48
+ "build": "webpack",
49
+ "dev": "webpack serve"
50
+ },
51
+ "keywords": [],
52
+ "author": "",
53
+ "license": "ISC",
54
+ "dependencies": {
55
+ "@cedar-policy/cedar-wasm": "3.2.0"
56
+ },
57
+ "devDependencies": {
58
+ "ts-loader": "^9.5.1",
59
+ "typescript": "^5.4.5",
60
+ "webpack": "^5.91.0",
61
+ "webpack-cli": "^5.1.4",
62
+ "webpack-dev-server": "^5.0.4",
63
+ "html-webpack-plugin": "^5.6.0"
64
+ }
65
+ }
66
+ ```
67
+
68
+ Minimal tsconfig:
69
+
70
+ ```
71
+ {
72
+ "compilerOptions": {
73
+ "outDir": "./dist/",
74
+ "noImplicitAny": true,
75
+ "module": "es2020",
76
+ "target": "es5",
77
+ "jsx": "react",
78
+ "allowJs": true,
79
+ "moduleResolution": "node"
80
+ }
81
+ }
82
+ ```
83
+
84
+ Configure webpack.config.js:
85
+
86
+ ```
87
+ const path = require('path');
88
+ const HtmlWebpackPlugin = require('html-webpack-plugin');
89
+
90
+ module.exports = {
91
+ mode: 'development', // change this to suit you
92
+ entry: './src/index.ts',
93
+ module: {
94
+ rules: [
95
+ {
96
+ test: /\.tsx?$/,
97
+ use: 'ts-loader',
98
+ exclude: /node_modules/,
99
+ },
100
+ ],
101
+ },
102
+ resolve: {
103
+ extensions: ['.tsx', '.ts', '.js'],
104
+ },
105
+ output: {
106
+ filename: 'bundle.js',
107
+ path: path.resolve(__dirname, 'dist'),
108
+ },
109
+ experiments: {
110
+ asyncWebAssembly: true, // enables wasm support in webpack
111
+ },
112
+ plugins: [new HtmlWebpackPlugin()],
113
+ devServer: {
114
+ static: {
115
+ directory: path.join(__dirname, 'dist'),
116
+ },
117
+ compress: true,
118
+ port: 8000,
119
+ }
120
+ };
121
+ ```
122
+
123
+ Finally, load the code from your `index.ts` file. We recommend dynamic imports:
124
+
125
+ ```
126
+ import('@cedar-policy/cedar-wasm').then(mod => {
127
+ // cache it globally here or invoke functions like mod.getCedarVersion();
128
+ });
129
+ ```
130
+
131
+
132
+
133
+ ## Loading in vite 5:
134
+
135
+ Starting from the vite typescript template, install these two dependencies to enable wasm:
136
+
137
+ ```
138
+ npm i --save-dev vite-plugin-top-level-await vite-plugin-wasm
139
+ ```
140
+
141
+ Then add those two plugins to your vite config in `vite.config.js`:
142
+
143
+ ```
144
+ import wasm from 'vite-plugin-wasm';
145
+ import topLevelAwait from 'vite-plugin-top-level-await';
146
+ import { defineConfig } from 'vite';
147
+
148
+ export default defineConfig({
149
+ plugins: [
150
+ wasm(),
151
+ topLevelAwait()
152
+ ]
153
+ });
154
+
155
+ ```
156
+
157
+ Finally, load the code. We recommend dynamic imports:
158
+
159
+ ```
160
+ import('@cedar-policy/cedar-wasm').then(mod => {
161
+ // cache it globally here or invoke functions like mod.getCedarVersion();
162
+ });
163
+ ```
164
+
165
+ ## Alternate loading strategies
166
+
167
+ If for some reason you cannot use es modules, we provide alternate sub-packages `web` and `nodejs` (defined as `exports` in the root package.json).
168
+
169
+ The `nodejs` subpackage uses `fs` and CommonJS modules. To use it, you can import it like so:
170
+
171
+ ```
172
+ const cedar = require('@cedar-policy/cedar-wasm/nodejs')
173
+ ```
174
+
175
+ The `web` subpackage exposes an `initSync` function that you can use to load Cedar in scenarios where you want to load the wasm binary async for whatever reason. Using the `web` subpackage may also be necessary with some `jest` setups. Here's how you use the `web` subpackage:
176
+
177
+ ```
178
+ const wasmBuffer = ... // `fetch` it or use `fs` to read it from `node_modules` in jest setupTests
179
+ import * as cedarJsBindings from '@cedar-policy/cedar-wasm/web';
180
+ cedarJsBindings.initSync(wasmBuffer);
181
+ ```