@cartanova/qgrid-cli 2.10.10 → 2.11.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 (313) hide show
  1. package/bundle/dist/_virtual/_rolldown/runtime.js +1 -10
  2. package/bundle/dist/application/monit/log-buffer.js +12 -6
  3. package/bundle/dist/application/monit/monit.frame.js +11 -3
  4. package/bundle/dist/application/monit/monit.types.js +1 -1
  5. package/bundle/dist/application/qgrid/conv-routing.js +9 -6
  6. package/bundle/dist/application/qgrid/expired-token-reminder.js +2 -2
  7. package/bundle/dist/application/qgrid/oauth.js +31 -4
  8. package/bundle/dist/application/qgrid/qgrid-image-generation.js +1 -1
  9. package/bundle/dist/application/qgrid/qgrid-response-format.js +21 -19
  10. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +40 -33
  11. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +128 -93
  12. package/bundle/dist/application/qgrid/qgrid.frame.js +930 -49
  13. package/bundle/dist/application/qgrid/qgrid.types.js +212 -5
  14. package/bundle/dist/application/qgrid/schema-prompt.js +75 -48
  15. package/bundle/dist/application/qgrid/slack-user-map.js +1 -1
  16. package/bundle/dist/application/qgrid/token-death.js +1 -1
  17. package/bundle/dist/application/qgrid/token-subscriber.js +83 -30
  18. package/bundle/dist/application/qgrid/token-trigger-setup.js +1 -1
  19. package/bundle/dist/application/qgrid/token-window-keepalive.js +8 -6
  20. package/bundle/dist/application/qgrid/tool-emulation-schema.js +13 -13
  21. package/bundle/dist/application/qgrid/tool-emulation.js +19 -15
  22. package/bundle/dist/application/request-log/json-schema-type-text.js +29 -12
  23. package/bundle/dist/application/request-log/request-log.model.js +83 -70
  24. package/bundle/dist/application/request-log/request-log.types.js +1 -1
  25. package/bundle/dist/application/request-log/zod-code-format.js +1 -1
  26. package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
  27. package/bundle/dist/application/request-log-step/request-log-step.types.js +1 -1
  28. package/bundle/dist/application/setting/setting.constant.js +1 -1
  29. package/bundle/dist/application/setting/setting.model.js +2 -2
  30. package/bundle/dist/application/setting/setting.store.js +2 -2
  31. package/bundle/dist/application/setting/setting.types.js +1 -1
  32. package/bundle/dist/application/sonamu.generated.js +32 -16
  33. package/bundle/dist/application/sonamu.generated.sso.js +1 -1
  34. package/bundle/dist/application/token/token.model.js +26 -9
  35. package/bundle/dist/application/token/token.types.js +20 -3
  36. package/bundle/dist/i18n/en.js +15 -1
  37. package/bundle/dist/i18n/ko.js +15 -1
  38. package/bundle/dist/i18n/sd.generated.js +1 -1
  39. package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +8 -6
  40. package/bundle/dist/server-bootstrap.js +4 -2
  41. package/bundle/dist/server-error-handler.js +1 -1
  42. package/bundle/dist/sonamu.config.js +37 -8
  43. package/bundle/dist/startup-migrations.js +17 -7
  44. package/bundle/dist/testing/global.js +1 -1
  45. package/bundle/dist/testing/schema-bench.js +0 -0
  46. package/bundle/dist/testing/test-database-name.js +1 -1
  47. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
  48. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +11 -5
  49. package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +4 -4
  50. package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +1 -1
  51. package/bundle/dist/utils/providers/anthropic/claude-session.js +20 -19
  52. package/bundle/dist/utils/providers/anthropic/fence-strip.js +1 -1
  53. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +49 -23
  54. package/bundle/dist/utils/providers/common/credentials.js +5 -1
  55. package/bundle/dist/utils/providers/common/effort.js +3 -3
  56. package/bundle/dist/utils/providers/common/model-cost.js +69 -14
  57. package/bundle/dist/utils/providers/common/provider-types.js +29 -1
  58. package/bundle/dist/utils/providers/common/schema-validation.js +78 -40
  59. package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +1 -1
  60. package/bundle/dist/utils/providers/common/strictifier.js +62 -43
  61. package/bundle/dist/utils/providers/common/thinking.js +3 -2
  62. package/bundle/dist/utils/providers/common/ttft.js +1 -1
  63. package/bundle/dist/utils/providers/grok/grok-backend-protocol.js +427 -0
  64. package/bundle/dist/utils/providers/grok/grok-constants.js +55 -0
  65. package/bundle/dist/utils/providers/grok/grok-direct-client.js +196 -0
  66. package/bundle/dist/utils/providers/grok/grok-dispatcher.js +1313 -0
  67. package/bundle/dist/utils/providers/grok/grok-headers.js +118 -0
  68. package/bundle/dist/utils/providers/grok/grok-media-client.js +420 -0
  69. package/bundle/dist/utils/providers/grok/grok-models.js +114 -0
  70. package/bundle/dist/utils/providers/grok/grok-oauth.js +455 -0
  71. package/bundle/dist/utils/providers/grok/grok-quota.js +119 -0
  72. package/bundle/dist/utils/providers/grok/grok-refresh.js +192 -0
  73. package/bundle/dist/utils/providers/grok/grok-types.js +186 -0
  74. package/bundle/dist/utils/providers/grok/grok-voice-client.js +199 -0
  75. package/bundle/dist/utils/providers/grok/index.js +11 -0
  76. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +111 -83
  77. package/bundle/dist/utils/providers/openai/openai-callback-relay.js +3 -2
  78. package/bundle/dist/utils/providers/openai/openai-constants.js +1 -1
  79. package/bundle/dist/utils/providers/openai/openai-direct-client.js +23 -7
  80. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +143 -106
  81. package/bundle/dist/utils/providers/openai/openai-image-generation.js +48 -33
  82. package/bundle/dist/utils/providers/openai/openai-oauth.js +28 -13
  83. package/bundle/dist/utils/providers/openai/openai-quota.js +38 -27
  84. package/bundle/dist/utils/providers/openai/openai-refresh.js +17 -9
  85. package/bundle/dist/utils/providers/openai/openai-sse.js +1 -1
  86. package/bundle/dist/utils/providers/openai/openai-transport-config.js +1 -1
  87. package/bundle/dist/utils/quiet-hours.js +1 -1
  88. package/bundle/dist/utils/slack-notify.js +14 -8
  89. package/bundle/dist/utils/subset-loaders.js +4 -5
  90. package/bundle/src/application/monit/log-buffer.ts +23 -9
  91. package/bundle/src/application/monit/monit.frame.ts +22 -5
  92. package/bundle/src/application/monit/monit.types.ts +6 -0
  93. package/bundle/src/application/qgrid/conv-routing.test.ts +76 -4
  94. package/bundle/src/application/qgrid/conv-routing.ts +35 -9
  95. package/bundle/src/application/qgrid/expired-token-reminder.ts +9 -1
  96. package/bundle/src/application/qgrid/oauth.ts +51 -15
  97. package/bundle/src/application/qgrid/qgrid-image-generation.ts +9 -0
  98. package/bundle/src/application/qgrid/qgrid-response-format.ts +50 -25
  99. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +19 -0
  100. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +84 -40
  101. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +97 -0
  102. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +274 -126
  103. package/bundle/src/application/qgrid/qgrid.frame.test.ts +1013 -3
  104. package/bundle/src/application/qgrid/qgrid.frame.ts +1415 -60
  105. package/bundle/src/application/qgrid/qgrid.types.ts +335 -0
  106. package/bundle/src/application/qgrid/schema-prompt.ts +105 -41
  107. package/bundle/src/application/qgrid/slack-user-map.ts +5 -0
  108. package/bundle/src/application/qgrid/token-death.ts +4 -0
  109. package/bundle/src/application/qgrid/token-subscriber.test.ts +21 -19
  110. package/bundle/src/application/qgrid/token-subscriber.ts +186 -53
  111. package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -0
  112. package/bundle/src/application/qgrid/token-window-keepalive.ts +49 -6
  113. package/bundle/src/application/qgrid/tool-emulation-schema.ts +33 -29
  114. package/bundle/src/application/qgrid/tool-emulation.ts +52 -27
  115. package/bundle/src/application/request-log/json-schema-type-text.test.ts +5 -5
  116. package/bundle/src/application/request-log/json-schema-type-text.ts +81 -26
  117. package/bundle/src/application/request-log/request-log.model.test.ts +111 -4
  118. package/bundle/src/application/request-log/request-log.model.ts +277 -146
  119. package/bundle/src/application/request-log/request-log.types.ts +6 -0
  120. package/bundle/src/application/request-log/zod-code-format.ts +11 -0
  121. package/bundle/src/application/request-log-step/request-log-step.model.ts +1 -0
  122. package/bundle/src/application/request-log-step/request-log-step.types.ts +2 -0
  123. package/bundle/src/application/setting/setting.constant.ts +9 -0
  124. package/bundle/src/application/setting/setting.model.ts +12 -2
  125. package/bundle/src/application/setting/setting.store.ts +5 -1
  126. package/bundle/src/application/setting/setting.types.ts +8 -0
  127. package/bundle/src/application/sonamu.generated.http +133 -0
  128. package/bundle/src/application/sonamu.generated.sso.ts +2 -0
  129. package/bundle/src/application/sonamu.generated.ts +15 -0
  130. package/bundle/src/application/token/token.identity.test.ts +20 -0
  131. package/bundle/src/application/token/token.model.ts +66 -7
  132. package/bundle/src/application/token/token.types.ts +24 -1
  133. package/bundle/src/i18n/en.ts +19 -0
  134. package/bundle/src/i18n/ko.ts +21 -0
  135. package/bundle/src/i18n/sd.generated.ts +23 -2
  136. package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +16 -8
  137. package/bundle/src/server-bootstrap.ts +4 -2
  138. package/bundle/src/server-error-handler.ts +1 -0
  139. package/bundle/src/sonamu.config.ts +69 -7
  140. package/bundle/src/startup-migrations.ts +27 -9
  141. package/bundle/src/testing/global.ts +20 -0
  142. package/bundle/src/testing/schema-bench.ts +105 -30
  143. package/bundle/src/testing/test-database-name.ts +2 -0
  144. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +8 -0
  145. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +41 -6
  146. package/bundle/src/utils/providers/anthropic/anthropic-quota.ts +7 -3
  147. package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +6 -0
  148. package/bundle/src/utils/providers/anthropic/claude-session.ts +58 -24
  149. package/bundle/src/utils/providers/anthropic/fence-strip.ts +11 -0
  150. package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +110 -45
  151. package/bundle/src/utils/providers/common/credentials.ts +8 -0
  152. package/bundle/src/utils/providers/common/effort.ts +9 -2
  153. package/bundle/src/utils/providers/common/model-cost.test.ts +48 -1
  154. package/bundle/src/utils/providers/common/model-cost.ts +259 -158
  155. package/bundle/src/utils/providers/common/provider-dispatcher.ts +98 -2
  156. package/bundle/src/utils/providers/common/provider-types.ts +46 -3
  157. package/bundle/src/utils/providers/common/schema-validation.test.ts +5 -1
  158. package/bundle/src/utils/providers/common/schema-validation.ts +124 -56
  159. package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -0
  160. package/bundle/src/utils/providers/common/strictifier.ts +185 -59
  161. package/bundle/src/utils/providers/common/thinking.ts +2 -2
  162. package/bundle/src/utils/providers/common/ttft.ts +4 -2
  163. package/bundle/src/utils/providers/grok/__fixtures__/golden-responses-1.0.60.json +164 -0
  164. package/bundle/src/utils/providers/grok/grok-backend-protocol.test.ts +325 -0
  165. package/bundle/src/utils/providers/grok/grok-backend-protocol.ts +721 -0
  166. package/bundle/src/utils/providers/grok/grok-constants.ts +105 -0
  167. package/bundle/src/utils/providers/grok/grok-direct-client.test.ts +179 -0
  168. package/bundle/src/utils/providers/grok/grok-direct-client.ts +313 -0
  169. package/bundle/src/utils/providers/grok/grok-dispatcher.test.ts +1395 -0
  170. package/bundle/src/utils/providers/grok/grok-dispatcher.ts +2105 -0
  171. package/bundle/src/utils/providers/grok/grok-headers.test.ts +149 -0
  172. package/bundle/src/utils/providers/grok/grok-headers.ts +199 -0
  173. package/bundle/src/utils/providers/grok/grok-media-client.test.ts +446 -0
  174. package/bundle/src/utils/providers/grok/grok-media-client.ts +703 -0
  175. package/bundle/src/utils/providers/grok/grok-models.test.ts +96 -0
  176. package/bundle/src/utils/providers/grok/grok-models.ts +161 -0
  177. package/bundle/src/utils/providers/grok/grok-oauth.test.ts +406 -0
  178. package/bundle/src/utils/providers/grok/grok-oauth.ts +771 -0
  179. package/bundle/src/utils/providers/grok/grok-quota.test.ts +142 -0
  180. package/bundle/src/utils/providers/grok/grok-quota.ts +198 -0
  181. package/bundle/src/utils/providers/grok/grok-refresh.test.ts +239 -0
  182. package/bundle/src/utils/providers/grok/grok-refresh.ts +325 -0
  183. package/bundle/src/utils/providers/grok/grok-types.test.ts +252 -0
  184. package/bundle/src/utils/providers/grok/grok-types.ts +374 -0
  185. package/bundle/src/utils/providers/grok/grok-voice-client.test.ts +321 -0
  186. package/bundle/src/utils/providers/grok/grok-voice-client.ts +284 -0
  187. package/bundle/src/utils/providers/grok/index.ts +20 -0
  188. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +221 -137
  189. package/bundle/src/utils/providers/openai/openai-callback-relay.ts +12 -1
  190. package/bundle/src/utils/providers/openai/openai-constants.ts +2 -0
  191. package/bundle/src/utils/providers/openai/openai-direct-client.ts +111 -21
  192. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +322 -169
  193. package/bundle/src/utils/providers/openai/openai-image-generation.ts +116 -36
  194. package/bundle/src/utils/providers/openai/openai-oauth.ts +48 -20
  195. package/bundle/src/utils/providers/openai/openai-quota.ts +77 -46
  196. package/bundle/src/utils/providers/openai/openai-refresh.ts +42 -18
  197. package/bundle/src/utils/providers/openai/openai-sse.ts +27 -3
  198. package/bundle/src/utils/providers/openai/openai-transport-config.ts +2 -0
  199. package/bundle/src/utils/quiet-hours.ts +12 -1
  200. package/bundle/src/utils/slack-notify.ts +44 -13
  201. package/bundle/src/utils/subset-loaders.ts +7 -7
  202. package/bundle/web-dist/client/assets/clsx-5XM_pHvN.js +1 -0
  203. package/bundle/web-dist/client/assets/index-BA7uQ-6c.js +31 -0
  204. package/bundle/web-dist/client/assets/index-Be2qCZmI.css +1 -0
  205. package/bundle/web-dist/client/assets/logs-C47OJGEI.js +1 -0
  206. package/bundle/web-dist/client/assets/monit-BS9no0dU.js +4 -0
  207. package/bundle/web-dist/client/assets/plus-sdACTfH0.js +1 -0
  208. package/bundle/web-dist/client/assets/refresh-cw-CY8o_1cT.js +1 -0
  209. package/bundle/web-dist/client/assets/request-model-BRtFuZvj.js +1 -0
  210. package/bundle/web-dist/client/assets/routes-kqgkUxE8.js +5 -0
  211. package/bundle/web-dist/client/assets/{services.generated-NP-ValHd.js → services.generated-CefiDXEv.js} +5 -5
  212. package/bundle/web-dist/client/assets/settings-DNDvFGSw.js +1 -0
  213. package/bundle/web-dist/client/assets/show-u8Np69q3.js +2 -0
  214. package/bundle/web-dist/client/assets/tokens-QvP410NW.js +1 -0
  215. package/bundle/web-dist/client/assets/total-cost-MnfKU8IN.js +1 -0
  216. package/bundle/web-dist/client/assets/use-oauth-login-flow-Bzdh28Ws.js +1 -0
  217. package/bundle/web-dist/client/assets/use-update-token-mutation-CfJKaxmR.js +1 -0
  218. package/bundle/web-dist/client/assets/vendor-react-CUFFrVN9.js +244 -0
  219. package/bundle/web-dist/client/assets/vendor-tanstack-Bf_jag9G.js +1 -0
  220. package/bundle/web-dist/client/index.html +6 -6
  221. package/bundle/web-dist/server/assets/clsx-D_N5PN_2.js +16 -0
  222. package/bundle/web-dist/server/assets/{lazyRouteComponent-CgBdabgd.js → lazyRouteComponent-D8iTIHyn.js} +129 -2
  223. package/bundle/web-dist/server/assets/logs-B3OTd9hy.js +825 -0
  224. package/bundle/web-dist/server/assets/{monit-ZPt66W5M.js → monit-B2hqorPe.js} +385 -126
  225. package/bundle/web-dist/server/assets/plus-DwG7h9kq.js +28 -0
  226. package/bundle/web-dist/server/assets/{react-dom-Ds75e4Jl.js → react-dom-BIYQzBqG.js} +2 -129
  227. package/bundle/web-dist/server/assets/refresh-cw-mMBkwOq0.js +44 -0
  228. package/bundle/web-dist/server/assets/{request-model-DjGldb-h.js → request-model-I6OdODSH.js} +15 -6
  229. package/bundle/web-dist/server/assets/{routes-Ct-k7nBA.js → routes-B95YlUv2.js} +760 -213
  230. package/bundle/web-dist/server/assets/{services.generated-BA4AcAf5.js → services.generated-DQATJ6qf.js} +12820 -12194
  231. package/bundle/web-dist/server/assets/settings-C3gbGk0m.js +830 -0
  232. package/bundle/web-dist/server/assets/{show-LSFIzvO2.js → show-Bxaj3rhH.js} +1350 -418
  233. package/bundle/web-dist/server/assets/tokens-CZjH3cB7.js +1038 -0
  234. package/bundle/web-dist/server/assets/total-cost-fTE9Xy82.js +18 -0
  235. package/bundle/web-dist/server/assets/use-oauth-login-flow-CKDHgc3U.js +2379 -0
  236. package/bundle/web-dist/server/assets/{use-update-token-mutation-pkArIzCP.js → use-update-token-mutation-BEbgOzaa.js} +1 -1
  237. package/bundle/web-dist/server/entry-server.generated.js +4295 -22810
  238. package/dist/cli.js +9 -9
  239. package/package.json +4 -11
  240. package/postinstall.mjs +12 -0
  241. package/skills/qgrid/SKILL.md +1 -0
  242. package/skills/qgrid/references/cli-env-and-server-boot.md +4 -1
  243. package/skills/qgrid/references/decision-rationale.md +23 -0
  244. package/skills/qgrid/references/grok-runtime.md +89 -0
  245. package/skills/qgrid/references/provider-runtime-differences.md +30 -29
  246. package/skills/qgrid/references/repo-map.md +10 -0
  247. package/skills/qgrid/references/token-auth-quota-lifecycle.md +56 -3
  248. package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -406
  249. package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +0 -1507
  250. package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +0 -887
  251. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2756
  252. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +0 -8
  253. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +0 -8
  254. package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +0 -922
  255. package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +0 -386
  256. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -121
  257. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +0 -51
  258. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +0 -1317
  259. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +0 -561
  260. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +0 -40
  261. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +0 -272
  262. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +0 -27
  263. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +0 -77
  264. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +0 -381
  265. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +0 -51
  266. package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2986
  267. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
  268. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
  269. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
  270. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
  271. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
  272. package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1126
  273. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
  274. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
  275. package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -517
  276. package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -101
  277. package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.11.2_@emnapi_runtime@1.11.2_@types_node@25.0.7_esbuild@0.27.4_5b35fc1fb85d2af4d105e0d74f940f50/node_modules/vite/dist/node/module-runner.js +0 -1265
  278. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +0 -9
  279. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +0 -41
  280. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +0 -19
  281. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +0 -202
  282. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.DdgEv5B1.js +0 -46
  283. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +0 -119
  284. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js +0 -3044
  285. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +0 -59
  286. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/index.js +0 -28
  287. package/bundle/dist/testing/setup-mocks.js +0 -16
  288. package/bundle/src/testing/setup-mocks.ts +0 -44
  289. package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +0 -1
  290. package/bundle/web-dist/client/assets/index-DZwzUfI-.js +0 -106
  291. package/bundle/web-dist/client/assets/logs-Cog79DU5.js +0 -1
  292. package/bundle/web-dist/client/assets/monit-2auznBys.js +0 -1
  293. package/bundle/web-dist/client/assets/plus-B62CuqT8.js +0 -1
  294. package/bundle/web-dist/client/assets/refresh-cw-NNcU0Cmq.js +0 -1
  295. package/bundle/web-dist/client/assets/request-model-CojtinqK.js +0 -1
  296. package/bundle/web-dist/client/assets/routes-B0lTeLK-.js +0 -5
  297. package/bundle/web-dist/client/assets/settings-D8ZxZGSJ.js +0 -1
  298. package/bundle/web-dist/client/assets/show-CFSERlnM.js +0 -2
  299. package/bundle/web-dist/client/assets/tokens-CZXUyI7O.js +0 -1
  300. package/bundle/web-dist/client/assets/use-oauth-login-flow-hboOs3wG.js +0 -1
  301. package/bundle/web-dist/client/assets/use-update-token-mutation-BQHS0byG.js +0 -1
  302. package/bundle/web-dist/client/assets/vendor-react-DH4kUfK2.js +0 -9
  303. package/bundle/web-dist/client/assets/vendor-tanstack-DJRQAbrY.js +0 -1
  304. package/bundle/web-dist/server/assets/logs-BMyR98rU.js +0 -509
  305. package/bundle/web-dist/server/assets/plus-BZ9I0VgC.js +0 -19
  306. package/bundle/web-dist/server/assets/refresh-cw-CztCFis-.js +0 -23
  307. package/bundle/web-dist/server/assets/settings-CBUZ47Xx.js +0 -461
  308. package/bundle/web-dist/server/assets/tokens-DxrBW512.js +0 -448
  309. package/bundle/web-dist/server/assets/use-oauth-login-flow-Gn8flMK5.js +0 -178
  310. package/dist/cli.d.ts +0 -10
  311. /package/bundle/web-dist/client/assets/{cost-DH2jZbrw.js → cost-DB3HbU7T.js} +0 -0
  312. /package/bundle/web-dist/client/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
  313. /package/bundle/web-dist/server/assets/{cost-eEHeTRT5.js → cost-BC9yzyA9.js} +0 -0
@@ -2,6 +2,7 @@ import { SD } from "../../i18n/sd.generated.js";
2
2
  import { createFenceStripTransform } from "../../utils/providers/anthropic/fence-strip.js";
3
3
  import { getAccessToken } from "../../utils/providers/common/credentials.js";
4
4
  import { calculateCostUsd } from "../../utils/providers/common/model-cost.js";
5
+ import { isJsonObject, isProviderId } from "../../utils/providers/common/provider-types.js";
5
6
  import { parseAndValidateCallerSchemas, serializeAndValidateDispatchSchema } from "../../utils/providers/common/schema-validation.js";
6
7
  import { strictify } from "../../utils/providers/common/strictifier.js";
7
8
  import { ProcessError, maskToken } from "./qgrid.types.js";
@@ -12,20 +13,64 @@ import { applyToolCallEmulation, isToolCallEnvelope } from "./tool-emulation.js"
12
13
  import { buildToolCallSchema } from "./tool-emulation-schema.js";
13
14
  import { InternalServerErrorException, ServiceUnavailableException } from "sonamu";
14
15
  //#region src/application/qgrid/qgrid.dispatcher.ts
16
+ const PROVIDER_LABELS = {
17
+ openai: "OpenAI",
18
+ anthropic: "Anthropic",
19
+ grok: "Grok"
20
+ };
15
21
  var QgridDispatcherClass = class {
16
22
  tokens = /* @__PURE__ */ new Map();
17
23
  requestCounts = /* @__PURE__ */ new Map();
18
24
  subscriber = null;
19
- openaiDispatcher = null;
20
- anthropicDispatcher = null;
25
+ dispatchers = /* @__PURE__ */ new Map();
26
+ #openaiDispatcher = null;
27
+ #anthropicDispatcher = null;
28
+ #grokDispatcher = null;
21
29
  startupState = {
22
30
  openai: "starting",
23
31
  anthropic: "starting"
24
32
  };
33
+ constructor(options = {}) {
34
+ if (options.grokDispatcher) this.grokDispatcher = options.grokDispatcher;
35
+ }
36
+ get openaiDispatcher() {
37
+ return this.#openaiDispatcher;
38
+ }
39
+ set openaiDispatcher(dispatcher) {
40
+ this.#openaiDispatcher = dispatcher;
41
+ this.register("openai", dispatcher);
42
+ }
43
+ get anthropicDispatcher() {
44
+ return this.#anthropicDispatcher;
45
+ }
46
+ set anthropicDispatcher(dispatcher) {
47
+ this.#anthropicDispatcher = dispatcher;
48
+ this.register("anthropic", dispatcher);
49
+ }
50
+ get grokDispatcher() {
51
+ return this.#grokDispatcher;
52
+ }
53
+ set grokDispatcher(dispatcher) {
54
+ this.#grokDispatcher = dispatcher;
55
+ this.register("grok", dispatcher);
56
+ }
57
+ register(provider, dispatcher) {
58
+ if (dispatcher) this.dispatchers.set(provider, dispatcher);
59
+ else this.dispatchers.delete(provider);
60
+ }
25
61
  notReadyError(provider) {
26
- const label = provider === "openai" ? "OpenAI" : "Anthropic";
62
+ const label = PROVIDER_LABELS[provider];
27
63
  return this.startupState[provider] === "failed" ? new InternalServerErrorException(SD("qgrid.dispatcherFailed")(label)) : new ServiceUnavailableException(SD("qgrid.dispatcherStarting")(label));
28
64
  }
65
+ resolveDispatcher(input, provider) {
66
+ if (!isProviderId(provider)) throw directLlmApiFallbackNotImplemented(input);
67
+ const dispatcher = this.dispatchers.get(provider);
68
+ if (!dispatcher) throw this.notReadyError(provider);
69
+ return {
70
+ provider,
71
+ dispatcher
72
+ };
73
+ }
29
74
  recordCompleted(provider, tokenName) {
30
75
  const key = `${provider}\0${tokenName}`;
31
76
  this.requestCounts.set(key, (this.requestCounts.get(key) ?? 0) + 1);
@@ -45,43 +90,10 @@ var QgridDispatcherClass = class {
45
90
  const route = parseProviderRoute(input.model);
46
91
  const outputSchema = buildAndValidateStrictOutputSchema(input, route.provider);
47
92
  const answerKind = input.jsonSchema ? "json" : "text";
48
- if (route.provider === "openai") {
49
- if (!this.openaiDispatcher) throw this.notReadyError("openai");
50
- const decision = decideConvRouting(input, {
51
- directOpenAI: true,
52
- modelNamespace: `openai/${route.model}`
53
- });
54
- const result = await this.openaiDispatcher.generate({
55
- model: route.model,
56
- systemPrompt: input.system,
57
- outputSchema,
58
- stopAfterOutputMessage: input.tools?.length ? (text, phase) => isToolCallEnvelope(text, input.tools, answerKind, phase) : void 0,
59
- thinking: input.thinking,
60
- effort: input.thinking === false ? void 0 : input.effort,
61
- verbosity: input.verbosity,
62
- reasoningSummary: input.reasoningSummary,
63
- serviceTier: input.serviceTier,
64
- timeoutMs: input.timeout,
65
- coldInput: decision.coldInput,
66
- coldHistory: decision.coldHistory,
67
- promptCacheKey: input.imageGeneration ? void 0 : decision.promptCacheKey,
68
- preferredTokenId: input.preferredTokenId ?? (input.imageGeneration ? void 0 : decision.preferredTokenId),
69
- requirePreferredToken: input.requirePreferredToken,
70
- abortSignal,
71
- imageGeneration: input.imageGeneration,
72
- imageGenerationOptions: input.imageGenerationOptions
73
- });
74
- this.recordCompleted("openai", result.tokenName);
75
- const coord = input.imageGeneration ? void 0 : issueConvContext(result.threadCoord, decision, result.threadCoord.workerId);
76
- return applyToolCallEmulation(toEmulationResult(result, input.serviceTier), input.tools, {
77
- threadCoord: coord,
78
- images: result.images,
79
- answerKind
80
- });
81
- } else if (route.provider === "anthropic") {
82
- if (!this.anthropicDispatcher) throw this.notReadyError("anthropic");
93
+ const { provider, dispatcher } = this.resolveDispatcher(input, route.provider);
94
+ if (provider === "anthropic") {
83
95
  const decision = decideConvRouting(input);
84
- const result = await this.anthropicDispatcher.generate({
96
+ const result = await dispatcher.generate({
85
97
  model: input.model,
86
98
  systemPrompt: composeSystemWithSchemaContract(input.system, input),
87
99
  thinking: input.thinking,
@@ -94,66 +106,44 @@ var QgridDispatcherClass = class {
94
106
  imageGeneration: input.imageGeneration,
95
107
  imageGenerationOptions: input.imageGenerationOptions
96
108
  });
97
- this.recordCompleted("anthropic", result.tokenName);
109
+ this.recordCompleted(provider, result.tokenName);
98
110
  return applyToolCallEmulation(toEmulationResult(result), input.tools, {
99
111
  threadCoord: issueConvContext(result.threadCoord, decision),
100
112
  answerKind
101
113
  });
102
114
  }
103
- throw directLlmApiFallbackNotImplemented(input);
115
+ const decision = decideConvRouting(input, {
116
+ directProvider: provider,
117
+ modelNamespace: `${provider}/${route.model}`
118
+ });
119
+ const result = await dispatcher.generate({
120
+ ...buildDirectRequest(input, route.model, outputSchema, answerKind, abortSignal),
121
+ promptCacheKey: input.imageGeneration ? void 0 : decision.promptCacheKey,
122
+ preferredTokenId: input.preferredTokenId ?? (input.imageGeneration ? void 0 : decision.preferredTokenId),
123
+ coldInput: decision.coldInput,
124
+ coldHistory: decision.coldHistory
125
+ });
126
+ this.recordCompleted(provider, result.tokenName);
127
+ const coord = input.imageGeneration ? void 0 : issueConvContext(result.threadCoord, decision, result.threadCoord.workerId);
128
+ return applyToolCallEmulation(toEmulationResult(result, input.serviceTier), input.tools, {
129
+ threadCoord: coord,
130
+ images: result.images,
131
+ answerKind
132
+ });
104
133
  }
105
134
  async queryStream(input, cb, abortSignal) {
106
135
  const route = parseProviderRoute(input.model);
107
136
  const outputSchema = buildAndValidateStrictOutputSchema(input, route.provider);
108
137
  const answerKind = input.jsonSchema ? "json" : "text";
109
- if (route.provider === "openai") {
110
- if (!this.openaiDispatcher) throw this.notReadyError("openai");
111
- const decision = decideConvRouting(input, {
112
- directOpenAI: true,
113
- modelNamespace: `openai/${route.model}`
114
- });
115
- await this.openaiDispatcher.generateStream({
116
- model: route.model,
117
- systemPrompt: input.system,
118
- outputSchema,
119
- stopAfterOutputMessage: input.tools?.length ? (text, phase) => isToolCallEnvelope(text, input.tools, answerKind, phase) : void 0,
120
- thinking: input.thinking,
121
- effort: input.thinking === false ? void 0 : input.effort,
122
- verbosity: input.verbosity,
123
- reasoningSummary: input.reasoningSummary,
124
- serviceTier: input.serviceTier,
125
- timeoutMs: input.timeout,
126
- coldInput: decision.coldInput,
127
- coldHistory: decision.coldHistory,
128
- promptCacheKey: decision.promptCacheKey,
129
- preferredTokenId: input.preferredTokenId ?? decision.preferredTokenId,
130
- requirePreferredToken: input.requirePreferredToken,
131
- abortSignal,
132
- imageGeneration: input.imageGeneration,
133
- imageGenerationOptions: input.imageGenerationOptions
134
- }, {
135
- onDelta: cb.onDelta,
136
- onThreadId: cb.onThreadId,
137
- onTurnId: cb.onTurnId,
138
- onComplete: (turnResult) => {
139
- this.recordCompleted("openai", turnResult.tokenName);
140
- cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult, input.serviceTier), input.tools, {
141
- threadCoord: issueConvContext(turnResult.threadCoord, decision, turnResult.threadCoord.workerId),
142
- answerKind
143
- }));
144
- },
145
- onError: cb.onError
146
- });
147
- return;
148
- } else if (route.provider === "anthropic") {
149
- if (!this.anthropicDispatcher) throw this.notReadyError("anthropic");
138
+ const { provider, dispatcher } = this.resolveDispatcher(input, route.provider);
139
+ if (provider === "anthropic") {
150
140
  const fenceStrip = input.jsonSchema !== void 0 || Boolean(input.tools?.length) ? createFenceStripTransform() : void 0;
151
141
  const emitDelta = fenceStrip ? (text) => {
152
142
  const safe = fenceStrip.push(text);
153
143
  if (safe) cb.onDelta(safe);
154
144
  } : cb.onDelta;
155
145
  const decision = decideConvRouting(input);
156
- await this.anthropicDispatcher.generateStream({
146
+ await dispatcher.generateStream({
157
147
  model: input.model,
158
148
  systemPrompt: composeSystemWithSchemaContract(input.system, input),
159
149
  thinking: input.thinking,
@@ -169,7 +159,7 @@ var QgridDispatcherClass = class {
169
159
  onDelta: emitDelta,
170
160
  onThreadId: cb.onThreadId,
171
161
  onComplete: (turnResult) => {
172
- this.recordCompleted("anthropic", turnResult.tokenName);
162
+ this.recordCompleted(provider, turnResult.tokenName);
173
163
  const rest = fenceStrip?.flush();
174
164
  if (rest) cb.onDelta(rest);
175
165
  const issuedCoord = issueConvContext(turnResult.threadCoord, decision);
@@ -182,9 +172,51 @@ var QgridDispatcherClass = class {
182
172
  });
183
173
  return;
184
174
  }
185
- throw directLlmApiFallbackNotImplemented(input);
175
+ const decision = decideConvRouting(input, {
176
+ directProvider: provider,
177
+ modelNamespace: `${provider}/${route.model}`
178
+ });
179
+ await dispatcher.generateStream({
180
+ ...buildDirectRequest(input, route.model, outputSchema, answerKind, abortSignal),
181
+ promptCacheKey: decision.promptCacheKey,
182
+ preferredTokenId: input.preferredTokenId ?? decision.preferredTokenId,
183
+ coldInput: decision.coldInput,
184
+ coldHistory: decision.coldHistory
185
+ }, {
186
+ onDelta: cb.onDelta,
187
+ onThreadId: cb.onThreadId,
188
+ onTurnId: cb.onTurnId,
189
+ onComplete: (turnResult) => {
190
+ this.recordCompleted(provider, turnResult.tokenName);
191
+ cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult, input.serviceTier), input.tools, {
192
+ threadCoord: issueConvContext(turnResult.threadCoord, decision, turnResult.threadCoord.workerId),
193
+ answerKind
194
+ }));
195
+ },
196
+ onError: cb.onError
197
+ });
186
198
  }
187
199
  };
200
+ function buildDirectRequest(input, model, outputSchema, answerKind, abortSignal) {
201
+ const request = {
202
+ model,
203
+ systemPrompt: input.system,
204
+ outputSchema,
205
+ stopAfterOutputMessage: input.tools?.length ? (text, phase) => isToolCallEnvelope(text, input.tools, answerKind, phase) : void 0,
206
+ thinking: input.thinking,
207
+ effort: input.thinking === false ? void 0 : input.effort,
208
+ verbosity: input.verbosity,
209
+ reasoningSummary: input.reasoningSummary,
210
+ serviceTier: input.serviceTier,
211
+ timeoutMs: input.timeout,
212
+ requirePreferredToken: input.requirePreferredToken,
213
+ abortSignal,
214
+ imageGeneration: input.imageGeneration,
215
+ imageGenerationOptions: input.imageGenerationOptions
216
+ };
217
+ if (input.providerOptions?.xai) request.providerOptions = { xai: { ...input.providerOptions.xai } };
218
+ return request;
219
+ }
188
220
  function parseProviderRoute(model) {
189
221
  if (!model?.includes("/")) return { model: model ?? "" };
190
222
  const [provider, routedModel] = model.split("/", 2);
@@ -199,7 +231,8 @@ function directLlmApiFallbackNotImplemented(input) {
199
231
  }
200
232
  function buildStrictOutputSchema(input, provider) {
201
233
  const outputSchema = buildRawOutputSchema(input);
202
- return outputSchema ? strictify(outputSchema, { provider }) : void 0;
234
+ if (!outputSchema) return void 0;
235
+ return isJsonObject(outputSchema) ? strictify(outputSchema, { provider }) : outputSchema;
203
236
  }
204
237
  function buildAndValidateStrictOutputSchema(input, provider = parseProviderRoute(input.model).provider) {
205
238
  if (provider === "anthropic") {
@@ -214,13 +247,13 @@ function buildRawOutputSchema(input) {
214
247
  const callerOutputSchema = parseAndValidateCallerSchemas(input);
215
248
  return input.tools?.length ? buildToolCallSchema(input.tools, callerOutputSchema) : callerOutputSchema;
216
249
  }
217
- function completedDriverFromImageFailure(error, serviceTier) {
218
- if (!(error instanceof ImageGenerationError) || !error.completedDriver) return void 0;
219
- return applyToolCallEmulation(toEmulationResult(error.completedDriver, serviceTier), void 0, { answerKind: "text" });
250
+ function completedDriverFromImageFailure(cause, serviceTier) {
251
+ if (!(cause instanceof ImageGenerationError) || !cause.completedDriver) return void 0;
252
+ return applyToolCallEmulation(toEmulationResult(cause.completedDriver, serviceTier), void 0, { answerKind: "text" });
220
253
  }
221
254
  function toEmulationResult(result, serviceTier) {
222
- const hasProviderCost = result.costUsd !== void 0 && result.costUsd > 0;
223
- return {
255
+ const hasProviderCost = result.costUsd !== void 0 && (result.costSource === "provider" || result.costUsd > 0);
256
+ const emulationResult = {
224
257
  text: result.text,
225
258
  tokenName: result.tokenName,
226
259
  model: result.model,
@@ -245,11 +278,13 @@ function toEmulationResult(result, serviceTier) {
245
278
  cacheCreationInputTokens5m: result.usage.cacheCreationInputTokens5m,
246
279
  cacheCreationInputTokens1h: result.usage.cacheCreationInputTokens1h
247
280
  }, serviceTier),
248
- costSource: hasProviderCost ? "provider" : "pricing_table"
281
+ costSource: hasProviderCost ? result.costSource ?? "provider" : "pricing_table"
249
282
  };
283
+ if (result.providerMetadata?.xai) emulationResult.providerMetadata = { xai: result.providerMetadata.xai };
284
+ return emulationResult;
250
285
  }
251
286
  const QgridDispatcher = new QgridDispatcherClass();
252
287
  //#endregion
253
288
  export { QgridDispatcher, QgridDispatcherClass, buildAndValidateStrictOutputSchema, buildStrictOutputSchema, completedDriverFromImageFailure };
254
289
 
255
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwcm92aWRlciDrnbzsmrDtjIXqs7wg7Yag7YGwIOy6kOyLnMK37Ya16rOELiDsupDsi5zripQgVG9rZW5TdWJzY3JpYmVy6rCAIOqwseyLoO2VnOuLpC5cblxuaW1wb3J0IHsgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiwgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIH0gZnJvbSBcInNvbmFtdVwiO1xuXG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi8uLi9pMThuL3NkLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgdHlwZSBBbnRocm9waWNEaXNwYXRjaGVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUZlbmNlU3RyaXBUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9mZW5jZS1zdHJpcFwiO1xuaW1wb3J0IHsgZ2V0QWNjZXNzVG9rZW4gfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9jcmVkZW50aWFsc1wiO1xuaW1wb3J0IHsgY2FsY3VsYXRlQ29zdFVzZCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL21vZGVsLWNvc3RcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXN1bHQsXG4gIHR5cGUgU3RyZWFtQ2FsbGJhY2tzLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyB0eXBlIEpzb25WYWx1ZSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLXR5cGVzXCI7XG5pbXBvcnQge1xuICBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyxcbiAgc2VyaWFsaXplQW5kVmFsaWRhdGVEaXNwYXRjaFNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc2NoZW1hLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHN0cmljdGlmeSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3N0cmljdGlmaWVyXCI7XG5pbXBvcnQge1xuICBJbWFnZUdlbmVyYXRpb25FcnJvcixcbiAgdHlwZSBPcGVuQUlEaXNwYXRjaGVyLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZGVjaWRlQ29udlJvdXRpbmcsIGlzc3VlQ29udkNvbnRleHQgfSBmcm9tIFwiLi9jb252LXJvdXRpbmdcIjtcbmltcG9ydCB7XG4gIG1hc2tUb2tlbixcbiAgUHJvY2Vzc0Vycm9yLFxuICB0eXBlIFByb3ZpZGVyU3RhcnR1cFN0YXRlLFxuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG4gIHR5cGUgVG9rZW5TdGF0cyxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IGNvbXBvc2VTeXN0ZW1XaXRoU2NoZW1hQ29udHJhY3QgfSBmcm9tIFwiLi9zY2hlbWEtcHJvbXB0XCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2NyaWJlciB9IGZyb20gXCIuL3Rva2VuLXN1YnNjcmliZXJcIjtcbmltcG9ydCB7IGFwcGx5VG9vbENhbGxFbXVsYXRpb24sIGlzVG9vbENhbGxFbnZlbG9wZSB9IGZyb20gXCIuL3Rvb2wtZW11bGF0aW9uXCI7XG5pbXBvcnQgeyBidWlsZFRvb2xDYWxsU2NoZW1hIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb24tc2NoZW1hXCI7XG5cbmV4cG9ydCB0eXBlIEludGVybmFsUXVlcnlJbnB1dCA9IFF1ZXJ5SW5wdXQgJiB7XG4gIHByZWZlcnJlZFRva2VuSWQ/OiBudW1iZXI7XG4gIHJlcXVpcmVQcmVmZXJyZWRUb2tlbj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY2xhc3MgUWdyaWREaXNwYXRjaGVyQ2xhc3Mge1xuICB0b2tlbnMgPSBuZXcgTWFwPG51bWJlciwgVG9rZW5TdWJzZXRBPigpO1xuXG4gIC8vIO2UhOuhnOyEuOyKpCDsi5zsnpEg7J207ZuEIOyZhOujjOuQnCBwcm92aWRlciBnZW5lcmF0aW9uIOyImC4g7Iuk7YyoL+ykkeqwhCDsi5zrj4TripQg7KCc7Jm47ZWY66mwLFxuICAvLyDtm4Tsho0gdG9vbCB0dXJu64+EIO2VnCBnZW5lcmF0aW9u7Jy866GcIOyEvOuLpC4g64+Z66qFIO2GoO2BsOydgCBwcm92aWRlcuuzhOuhnCDrtoTrpqztlZzri6QuXG4gIHJlcXVlc3RDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIHN1YnNjcmliZXI6IFRva2VuU3Vic2NyaWJlciB8IG51bGwgPSBudWxsO1xuICBvcGVuYWlEaXNwYXRjaGVyOiBPcGVuQUlEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIGFudGhyb3BpY0Rpc3BhdGNoZXI6IEFudGhyb3BpY0Rpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBIVFRQ6rCAIGRpc3BhdGNoZXLrs7Tri6Qg66i87KCAIOyXtOumrOuvgOuhnCDstIjquLDtmZQg7KSR6rO8IOy0iOq4sO2ZlCDsi6TtjKjrpbwg6rWs67aE7ZWc64ukLlxuICBzdGFydHVwU3RhdGU6IFJlY29yZDxcIm9wZW5haVwiIHwgXCJhbnRocm9waWNcIiwgUHJvdmlkZXJTdGFydHVwU3RhdGU+ID0ge1xuICAgIG9wZW5haTogXCJzdGFydGluZ1wiLFxuICAgIGFudGhyb3BpYzogXCJzdGFydGluZ1wiLFxuICB9O1xuXG4gIC8vIOy0iOq4sO2ZlCDspJHsl5DripQgNTAzICsgUmV0cnktQWZ0ZXIsIOy0iOq4sO2ZlCDsi6TtjKjsl5DripQgNTAw7J2EIOuwmO2ZmO2VnOuLpC5cbiAgbm90UmVhZHlFcnJvcihwcm92aWRlcjogXCJvcGVuYWlcIiB8IFwiYW50aHJvcGljXCIpOiBFcnJvciB7XG4gICAgY29uc3QgbGFiZWwgPSBwcm92aWRlciA9PT0gXCJvcGVuYWlcIiA/IFwiT3BlbkFJXCIgOiBcIkFudGhyb3BpY1wiO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0dXBTdGF0ZVtwcm92aWRlcl0gPT09IFwiZmFpbGVkXCJcbiAgICAgID8gbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oU0QoXCJxZ3JpZC5kaXNwYXRjaGVyRmFpbGVkXCIpKGxhYmVsKSlcbiAgICAgIDogbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInFncmlkLmRpc3BhdGNoZXJTdGFydGluZ1wiKShsYWJlbCkpO1xuICB9XG5cbiAgcmVjb3JkQ29tcGxldGVkKHByb3ZpZGVyOiBzdHJpbmcsIHRva2VuTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gYCR7cHJvdmlkZXJ9XFwwJHt0b2tlbk5hbWV9YDtcbiAgICB0aGlzLnJlcXVlc3RDb3VudHMuc2V0KGtleSwgKHRoaXMucmVxdWVzdENvdW50cy5nZXQoa2V5KSA/PyAwKSArIDEpO1xuICB9XG5cbiAgcmVwbGFjZUNhY2hlKHJvd3M6IFRva2VuU3Vic2V0QVtdKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMgPSBuZXcgTWFwKHJvd3MubWFwKChyKSA9PiBbci5pZCwgcl0pKTtcbiAgfVxuXG4gIGdldFN0YXRzKCk6IFRva2VuU3RhdHNbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRva2Vucy52YWx1ZXMoKV0ubWFwKChyKSA9PiAoe1xuICAgICAgdG9rZW46IG1hc2tUb2tlbihnZXRBY2Nlc3NUb2tlbihyLmNyZWRlbnRpYWxzKSksXG4gICAgICBuYW1lOiByLm5hbWUsXG4gICAgICBwcm92aWRlcjogci5wcm92aWRlcixcbiAgICAgIHJlcXVlc3RzOiB0aGlzLnJlcXVlc3RDb3VudHMuZ2V0KGAke3IucHJvdmlkZXJ9XFwwJHtyLm5hbWV9YCkgPz8gMCxcbiAgICB9KSk7XG4gIH1cblxuICBhc3luYyBxdWVyeShpbnB1dDogSW50ZXJuYWxRdWVyeUlucHV0LCBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxRdWVyeU91dHB1dD4ge1xuICAgIGNvbnN0IHJvdXRlID0gcGFyc2VQcm92aWRlclJvdXRlKGlucHV0Lm1vZGVsKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0LCByb3V0ZS5wcm92aWRlcik7XG4gICAgY29uc3QgYW5zd2VyS2luZCA9IGlucHV0Lmpzb25TY2hlbWEgPyAoXCJqc29uXCIgYXMgY29uc3QpIDogKFwidGV4dFwiIGFzIGNvbnN0KTtcblxuICAgIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IHRoaXMubm90UmVhZHlFcnJvcihcIm9wZW5haVwiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCwge1xuICAgICAgICBkaXJlY3RPcGVuQUk6IHRydWUsXG4gICAgICAgIG1vZGVsTmFtZXNwYWNlOiBgb3BlbmFpLyR7cm91dGUubW9kZWx9YCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vcGVuYWlEaXNwYXRjaGVyLmdlbmVyYXRlKHtcbiAgICAgICAgbW9kZWw6IHJvdXRlLm1vZGVsLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgb3V0cHV0U2NoZW1hLFxuICAgICAgICBzdG9wQWZ0ZXJPdXRwdXRNZXNzYWdlOiBpbnB1dC50b29scz8ubGVuZ3RoXG4gICAgICAgICAgPyAodGV4dCwgcGhhc2UpID0+IGlzVG9vbENhbGxFbnZlbG9wZSh0ZXh0LCBpbnB1dC50b29scyEsIGFuc3dlcktpbmQsIHBoYXNlKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB0aGlua2luZzogaW5wdXQudGhpbmtpbmcsXG4gICAgICAgIGVmZm9ydDogaW5wdXQudGhpbmtpbmcgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHByb21wdENhY2hlS2V5OiBpbnB1dC5pbWFnZUdlbmVyYXRpb24gPyB1bmRlZmluZWQgOiBkZWNpc2lvbi5wcm9tcHRDYWNoZUtleSxcbiAgICAgICAgcHJlZmVycmVkVG9rZW5JZDpcbiAgICAgICAgICBpbnB1dC5wcmVmZXJyZWRUb2tlbklkID8/IChpbnB1dC5pbWFnZUdlbmVyYXRpb24gPyB1bmRlZmluZWQgOiBkZWNpc2lvbi5wcmVmZXJyZWRUb2tlbklkKSxcbiAgICAgICAgcmVxdWlyZVByZWZlcnJlZFRva2VuOiBpbnB1dC5yZXF1aXJlUHJlZmVycmVkVG9rZW4sXG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZWNvcmRDb21wbGV0ZWQoXCJvcGVuYWlcIiwgcmVzdWx0LnRva2VuTmFtZSk7XG5cbiAgICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAgY29sZC1vbmx5KFI4KeudvCDsnqzsgqzsmqkg7KKM7ZGc66W8IOuwnOq4ie2VmOyngCDslYrripTri6QuIOyijO2RnOulvCDsi6TsnLzrqbRcbiAgICAgIC8vIHNlc3Npb25LZXkg7IaM67mE7J6Q7J2YIHdhcm0g7KKM7ZGc66W8IOyjveydgCDsooztkZzroZwg642u7Ja07I2oIOuLpOydjCDthY3siqTtirggdHVybiDsnbQgY29sZCDroZwg65ao7Ja07KeE64ukLlxuICAgICAgY29uc3QgY29vcmQgPSBpbnB1dC5pbWFnZUdlbmVyYXRpb25cbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBpc3N1ZUNvbnZDb250ZXh0KHJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24sIHJlc3VsdC50aHJlYWRDb29yZC53b3JrZXJJZCk7XG5cbiAgICAgIHJldHVybiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHJlc3VsdCwgaW5wdXQuc2VydmljZVRpZXIpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogY29vcmQsXG4gICAgICAgIGltYWdlczogcmVzdWx0LmltYWdlcyxcbiAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocm91dGUucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICAgIGlmICghdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyKSB0aHJvdyB0aGlzLm5vdFJlYWR5RXJyb3IoXCJhbnRocm9waWNcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlKHtcbiAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGNvbXBvc2VTeXN0ZW1XaXRoU2NoZW1hQ29udHJhY3QoaW5wdXQuc3lzdGVtLCBpbnB1dCksXG4gICAgICAgIHRoaW5raW5nOiBpbnB1dC50aGlua2luZyxcbiAgICAgICAgZWZmb3J0OiBpbnB1dC50aGlua2luZyA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBpbnB1dC5lZmZvcnQsXG4gICAgICAgIHRpbWVvdXRNczogaW5wdXQudGltZW91dCxcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHByZWZlcnJlZFRva2VuSWQ6IGlucHV0LnByZWZlcnJlZFRva2VuSWQsXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnJlY29yZENvbXBsZXRlZChcImFudGhyb3BpY1wiLCByZXN1bHQudG9rZW5OYW1lKTtcblxuICAgICAgcmV0dXJuIGFwcGx5VG9vbENhbGxFbXVsYXRpb24odG9FbXVsYXRpb25SZXN1bHQocmVzdWx0KSwgaW5wdXQudG9vbHMsIHtcbiAgICAgICAgdGhyZWFkQ29vcmQ6IGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbiksXG4gICAgICAgIGFuc3dlcktpbmQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBkaXJlY3RMbG1BcGlGYWxsYmFja05vdEltcGxlbWVudGVkKGlucHV0KTtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5U3RyZWFtKFxuICAgIGlucHV0OiBJbnRlcm5hbFF1ZXJ5SW5wdXQsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrczxRdWVyeU91dHB1dD4sXG4gICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcbiAgICBjb25zdCBhbnN3ZXJLaW5kID0gaW5wdXQuanNvblNjaGVtYSA/IChcImpzb25cIiBhcyBjb25zdCkgOiAoXCJ0ZXh0XCIgYXMgY29uc3QpO1xuXG4gICAgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBpZiAoIXRoaXMub3BlbmFpRGlzcGF0Y2hlcikgdGhyb3cgdGhpcy5ub3RSZWFkeUVycm9yKFwib3BlbmFpXCIpO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0LCB7XG4gICAgICAgIGRpcmVjdE9wZW5BSTogdHJ1ZSxcbiAgICAgICAgbW9kZWxOYW1lc3BhY2U6IGBvcGVuYWkvJHtyb3V0ZS5tb2RlbH1gLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLm9wZW5haURpc3BhdGNoZXIuZ2VuZXJhdGVTdHJlYW0oXG4gICAgICAgIHtcbiAgICAgICAgICBtb2RlbDogcm91dGUubW9kZWwsXG4gICAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgICAgb3V0cHV0U2NoZW1hLFxuICAgICAgICAgIHN0b3BBZnRlck91dHB1dE1lc3NhZ2U6IGlucHV0LnRvb2xzPy5sZW5ndGhcbiAgICAgICAgICAgID8gKHRleHQsIHBoYXNlKSA9PiBpc1Rvb2xDYWxsRW52ZWxvcGUodGV4dCwgaW5wdXQudG9vbHMhLCBhbnN3ZXJLaW5kLCBwaGFzZSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHRoaW5raW5nOiBpbnB1dC50aGlua2luZyxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LnRoaW5raW5nID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICAgIHNlcnZpY2VUaWVyOiBpbnB1dC5zZXJ2aWNlVGllcixcbiAgICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgIHByb21wdENhY2hlS2V5OiBkZWNpc2lvbi5wcm9tcHRDYWNoZUtleSxcbiAgICAgICAgICBwcmVmZXJyZWRUb2tlbklkOiBpbnB1dC5wcmVmZXJyZWRUb2tlbklkID8/IGRlY2lzaW9uLnByZWZlcnJlZFRva2VuSWQsXG4gICAgICAgICAgcmVxdWlyZVByZWZlcnJlZFRva2VuOiBpbnB1dC5yZXF1aXJlUHJlZmVycmVkVG9rZW4sXG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiBpbnB1dC5pbWFnZUdlbmVyYXRpb24sXG4gICAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9uRGVsdGE6IGNiLm9uRGVsdGEsXG4gICAgICAgICAgb25UaHJlYWRJZDogY2Iub25UaHJlYWRJZCxcbiAgICAgICAgICBvblR1cm5JZDogY2Iub25UdXJuSWQsXG4gICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVjb3JkQ29tcGxldGVkKFwib3BlbmFpXCIsIHR1cm5SZXN1bHQudG9rZW5OYW1lKTtcbiAgICAgICAgICAgIGNiLm9uQ29tcGxldGUoXG4gICAgICAgICAgICAgIGFwcGx5VG9vbENhbGxFbXVsYXRpb24oXG4gICAgICAgICAgICAgICAgdG9FbXVsYXRpb25SZXN1bHQodHVyblJlc3VsdCwgaW5wdXQuc2VydmljZVRpZXIpLFxuICAgICAgICAgICAgICAgIGlucHV0LnRvb2xzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHRocmVhZENvb3JkOiBpc3N1ZUNvbnZDb250ZXh0KFxuICAgICAgICAgICAgICAgICAgICB0dXJuUmVzdWx0LnRocmVhZENvb3JkLFxuICAgICAgICAgICAgICAgICAgICBkZWNpc2lvbixcbiAgICAgICAgICAgICAgICAgICAgdHVyblJlc3VsdC50aHJlYWRDb29yZC53b3JrZXJJZCxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogY2Iub25FcnJvcixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgaWYgKCF0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHRocm93IHRoaXMubm90UmVhZHlFcnJvcihcImFudGhyb3BpY1wiKTtcblxuICAgICAgLy8g6rWs7KGw7ZmUIOydkeuLteydgCDstZzsooUg7YWN7Iqk7Yq47JmAIOuNuO2DgCDrqqjrkZAg7L2U65Oc7Y6c7Iqk66W8IOygnOqxsO2VnOuLpC5cbiAgICAgIGNvbnN0IGhhc1NjaGVtYUNvbnRyYWN0ID0gaW5wdXQuanNvblNjaGVtYSAhPT0gdW5kZWZpbmVkIHx8IEJvb2xlYW4oaW5wdXQudG9vbHM/Lmxlbmd0aCk7XG4gICAgICBjb25zdCBmZW5jZVN0cmlwID0gaGFzU2NoZW1hQ29udHJhY3QgPyBjcmVhdGVGZW5jZVN0cmlwVHJhbnNmb3JtKCkgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBlbWl0RGVsdGEgPSBmZW5jZVN0cmlwXG4gICAgICAgID8gKHRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2FmZSA9IGZlbmNlU3RyaXAucHVzaCh0ZXh0KTtcbiAgICAgICAgICAgIGlmIChzYWZlKSBjYi5vbkRlbHRhKHNhZmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgOiBjYi5vbkRlbHRhO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICAgIGF3YWl0IHRoaXMuYW50aHJvcGljRGlzcGF0Y2hlci5nZW5lcmF0ZVN0cmVhbShcbiAgICAgICAge1xuICAgICAgICAgIG1vZGVsOiBpbnB1dC5tb2RlbCxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGNvbXBvc2VTeXN0ZW1XaXRoU2NoZW1hQ29udHJhY3QoaW5wdXQuc3lzdGVtLCBpbnB1dCksXG4gICAgICAgICAgdGhpbmtpbmc6IGlucHV0LnRoaW5raW5nLFxuICAgICAgICAgIGVmZm9ydDogaW5wdXQudGhpbmtpbmcgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogaW5wdXQuZWZmb3J0LFxuICAgICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgICBwcmVmZXJyZWRUb2tlbklkOiBpbnB1dC5wcmVmZXJyZWRUb2tlbklkLFxuICAgICAgICAgIHRpbWVvdXRNczogaW5wdXQudGltZW91dCxcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogZW1pdERlbHRhLFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVjb3JkQ29tcGxldGVkKFwiYW50aHJvcGljXCIsIHR1cm5SZXN1bHQudG9rZW5OYW1lKTtcbiAgICAgICAgICAgIC8vIOuLq+uKlCDtjpzsiqQg7YyQ7KCVIOuVjOusuOyXkCDrs7TrpZjtlZwg7YWN7Iqk7Yq466W8IOyZhOujjCDsoITsl5Ag67Cp7Lac7ZWc64ukLlxuICAgICAgICAgICAgY29uc3QgcmVzdCA9IGZlbmNlU3RyaXA/LmZsdXNoKCk7XG4gICAgICAgICAgICBpZiAocmVzdCkgY2Iub25EZWx0YShyZXN0KTtcblxuICAgICAgICAgICAgY29uc3QgaXNzdWVkQ29vcmQgPSBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKTtcbiAgICAgICAgICAgIGNiLm9uQ29tcGxldGUoXG4gICAgICAgICAgICAgIGFwcGx5VG9vbENhbGxFbXVsYXRpb24odG9FbXVsYXRpb25SZXN1bHQodHVyblJlc3VsdCksIGlucHV0LnRvb2xzLCB7XG4gICAgICAgICAgICAgICAgdGhyZWFkQ29vcmQ6IGlzc3VlZENvb3JkLFxuICAgICAgICAgICAgICAgIGFuc3dlcktpbmQsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uRXJyb3I6IGNiLm9uRXJyb3IsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUHJvdmlkZXJSb3V0ZShtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkKTogeyBwcm92aWRlcj86IHN0cmluZzsgbW9kZWw6IHN0cmluZyB9IHtcbiAgaWYgKCFtb2RlbD8uaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgcmV0dXJuIHsgbW9kZWw6IG1vZGVsID8/IFwiXCIgfTtcbiAgfVxuXG4gIGNvbnN0IFtwcm92aWRlciwgcm91dGVkTW9kZWxdID0gbW9kZWwuc3BsaXQoXCIvXCIsIDIpO1xuICBpZiAoIXByb3ZpZGVyIHx8ICFyb3V0ZWRNb2RlbCkgdGhyb3cgbmV3IFByb2Nlc3NFcnJvcihcInVua25vd24gbW9kZWxcIik7XG4gIHJldHVybiB7IHByb3ZpZGVyLCBtb2RlbDogcm91dGVkTW9kZWwgfTtcbn1cblxuZnVuY3Rpb24gZGlyZWN0TGxtQXBpRmFsbGJhY2tOb3RJbXBsZW1lbnRlZChpbnB1dDogUXVlcnlJbnB1dCk6IFByb2Nlc3NFcnJvciB7XG4gIHJldHVybiBuZXcgUHJvY2Vzc0Vycm9yKFxuICAgIGBEaXJlY3QgTExNIEFQSSBmYWxsYmFjayBub3QgaW1wbGVtZW50ZWQgZm9yIG1vZGVsOiAke2lucHV0Lm1vZGVsID8/IFwiPGRlZmF1bHQ+XCJ9YCxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4gIHByb3ZpZGVyPzogc3RyaW5nLFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRSYXdPdXRwdXRTY2hlbWEoaW5wdXQpO1xuXG4gIHJldHVybiBvdXRwdXRTY2hlbWFcbiAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0sIHsgcHJvdmlkZXIgfSkgYXMgSnNvblZhbHVlKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJtb2RlbFwiIHwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuICBwcm92aWRlciA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCkucHJvdmlkZXIsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICAvLyBDbGF1ZGUgQ29kZeydmCAtLWpzb24tc2NoZW1h64qUIOu2iO2VhOyalO2VnCDrgrTrtoAg7J6s7Iuc64+E66W8IOycoOuwnO2VnOuLpC5cbiAgLy8gQW50aHJvcGlj7J2AIOybkOuzuCDsiqTtgqTrp4jrpbwg6rKA7Kad7ZWcIOuSpCDtlITroaztlITtirjroZwg7KCE64us7ZWY6rOgLCDsnZHri7Ug6rKA7Kad7J2AIOyGjOu5hOyekOyXkCDrp6HquLTri6QuXG4gIGlmIChwcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgIHBhcnNlQW5kVmFsaWRhdGVDYWxsZXJTY2hlbWFzKGlucHV0KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHByb3ZpZGVyKTtcbiAgc2VyaWFsaXplQW5kVmFsaWRhdGVEaXNwYXRjaFNjaGVtYShvdXRwdXRTY2hlbWEsIHByb3ZpZGVyKTtcbiAgcmV0dXJuIG91dHB1dFNjaGVtYTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSYXdPdXRwdXRTY2hlbWEoXG4gIGlucHV0OiBQaWNrPFF1ZXJ5SW5wdXQsIFwidG9vbHNcIiB8IFwianNvblNjaGVtYVwiPixcbik6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhbGxlck91dHB1dFNjaGVtYSA9IHBhcnNlQW5kVmFsaWRhdGVDYWxsZXJTY2hlbWFzKGlucHV0KTtcblxuICByZXR1cm4gaW5wdXQudG9vbHM/Lmxlbmd0aFxuICAgID8gYnVpbGRUb29sQ2FsbFNjaGVtYShpbnB1dC50b29scywgY2FsbGVyT3V0cHV0U2NoZW1hKVxuICAgIDogY2FsbGVyT3V0cHV0U2NoZW1hO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGxldGVkRHJpdmVyRnJvbUltYWdlRmFpbHVyZShcbiAgZXJyb3I6IHVua25vd24sXG4gIHNlcnZpY2VUaWVyPzogc3RyaW5nLFxuKTogUXVlcnlPdXRwdXQgfCB1bmRlZmluZWQge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEltYWdlR2VuZXJhdGlvbkVycm9yKSB8fCAhZXJyb3IuY29tcGxldGVkRHJpdmVyKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChlcnJvci5jb21wbGV0ZWREcml2ZXIsIHNlcnZpY2VUaWVyKSwgdW5kZWZpbmVkLCB7XG4gICAgYW5zd2VyS2luZDogXCJ0ZXh0XCIsXG4gIH0pO1xufVxuXG4vLyBBbnRocm9waWMgYWRhcHRlciDripQgY2FjaGUgY3JlYXRpb24g7J2EIGlucHV0VG9rZW5zIOyXkCDtj6ztlajtlbQg7ZGc7KSA7ZmU7ZWY6rOgLCDrs4Trj4Qg7ZWE65Oc7JeQ64+EIOuztOyhtO2VnOuLpC5cbmZ1bmN0aW9uIHRvRW11bGF0aW9uUmVzdWx0KFxuICByZXN1bHQ6IEdlbmVyYXRlUmVzdWx0LFxuICBzZXJ2aWNlVGllcj86IHN0cmluZyxcbik6IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPiB7XG4gIGNvbnN0IGhhc1Byb3ZpZGVyQ29zdCA9IHJlc3VsdC5jb3N0VXNkICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0LmNvc3RVc2QgPiAwO1xuICByZXR1cm4ge1xuICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgIHRva2VuTmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICBtb2RlbDogcmVzdWx0Lm1vZGVsLFxuICAgIHJlcXVlc3RlZE1vZGVsOiByZXN1bHQucmVxdWVzdGVkTW9kZWwsXG4gICAgbW9kZWxGYWxsYmFja3M6IHJlc3VsdC5tb2RlbEZhbGxiYWNrcyxcbiAgICB1c2FnZToge1xuICAgICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgcmVhc29uaW5nX3Rva2VuczogcmVzdWx0LnVzYWdlLnJlYXNvbmluZ091dHB1dFRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyA/PyAwLFxuICAgICAgY2FjaGVfY3JlYXRpb25fNW1faW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0sXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCxcbiAgICAgIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgfSxcbiAgICBkdXJhdGlvbk1zOiByZXN1bHQuZHVyYXRpb25NcyxcbiAgICB0dGZ0TXM6IHJlc3VsdC50dGZ0TXMgPz8gMCxcbiAgICBjb3N0VXNkOiBoYXNQcm92aWRlckNvc3RcbiAgICAgID8gcmVzdWx0LmNvc3RVc2QhXG4gICAgICA6IGNhbGN1bGF0ZUNvc3RVc2QoXG4gICAgICAgICAgcmVzdWx0Lm1vZGVsLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBvdXRwdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtLFxuICAgICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlcnZpY2VUaWVyLFxuICAgICAgICApLFxuICAgIGNvc3RTb3VyY2U6IGhhc1Byb3ZpZGVyQ29zdCA/IFwicHJvdmlkZXJcIiA6IFwicHJpY2luZ190YWJsZVwiLFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgUWdyaWREaXNwYXRjaGVyID0gbmV3IFFncmlkRGlzcGF0Y2hlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBMkNBLElBQWEsdUJBQWIsTUFBa0M7Q0FDaEMseUJBQVMsSUFBSSxJQUEwQjtDQUl2QyxnQ0FBZ0IsSUFBSSxJQUFvQjtDQUV4QyxhQUFxQztDQUNyQyxtQkFBNEM7Q0FDNUMsc0JBQWtEO0NBR2xELGVBQXFFO0VBQ25FLFFBQVE7RUFDUixXQUFXO0NBQ2I7Q0FHQSxjQUFjLFVBQXlDO0VBQ3JELE1BQU0sUUFBUSxhQUFhLFdBQVcsV0FBVztFQUNqRCxPQUFPLEtBQUssYUFBYSxjQUFjLFdBQ25DLElBQUksNkJBQTZCLEdBQUcsd0JBQXdCLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFDcEUsSUFBSSw0QkFBNEIsR0FBRywwQkFBMEIsQ0FBQyxDQUFDLEtBQUssQ0FBQztDQUMzRTtDQUVBLGdCQUFnQixVQUFrQixXQUF5QjtFQUN6RCxNQUFNLE1BQU0sR0FBRyxTQUFTLElBQUk7RUFDNUIsS0FBSyxjQUFjLElBQUksTUFB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
290
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbIiNvcGVuYWlEaXNwYXRjaGVyIiwiI2FudGhyb3BpY0Rpc3BhdGNoZXIiLCIjZ3Jva0Rpc3BhdGNoZXIiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwcm92aWRlciDrnbzsmrDtjIXqs7wg7Yag7YGwIOy6kOyLnMK37Ya16rOELiDsupDsi5zripQgVG9rZW5TdWJzY3JpYmVy6rCAIOqwseyLoO2VnOuLpC5cblxuaW1wb3J0IHsgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiwgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIH0gZnJvbSBcInNvbmFtdVwiO1xuXG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi8uLi9pMThuL3NkLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgdHlwZSBBbnRocm9waWNEaXNwYXRjaGVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUZlbmNlU3RyaXBUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9mZW5jZS1zdHJpcFwiO1xuaW1wb3J0IHsgZ2V0QWNjZXNzVG9rZW4gfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9jcmVkZW50aWFsc1wiO1xuaW1wb3J0IHsgY2FsY3VsYXRlQ29zdFVzZCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL21vZGVsLWNvc3RcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIE1lZGlhRGlzcGF0Y2hlcixcbiAgdHlwZSBQcm92aWRlckRpc3BhdGNoZXIsXG4gIHR5cGUgU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFZvaWNlRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHtcbiAgaXNKc29uT2JqZWN0LFxuICBpc1Byb3ZpZGVySWQsXG4gIHR5cGUgSnNvblZhbHVlLFxuICB0eXBlIFByb3ZpZGVySWQsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLXR5cGVzXCI7XG5pbXBvcnQge1xuICBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyxcbiAgc2VyaWFsaXplQW5kVmFsaWRhdGVEaXNwYXRjaFNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc2NoZW1hLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHN0cmljdGlmeSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3N0cmljdGlmaWVyXCI7XG5pbXBvcnQgeyB0eXBlIEdyb2tUb2tlblN0YXRlU25hcHNob3QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2dyb2svZ3Jvay1kaXNwYXRjaGVyXCI7XG5pbXBvcnQge1xuICBJbWFnZUdlbmVyYXRpb25FcnJvcixcbiAgdHlwZSBPcGVuQUlEaXNwYXRjaGVyLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlbkNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyBkZWNpZGVDb252Um91dGluZywgaXNzdWVDb252Q29udGV4dCB9IGZyb20gXCIuL2NvbnYtcm91dGluZ1wiO1xuaW1wb3J0IHtcbiAgbWFza1Rva2VuLFxuICBQcm9jZXNzRXJyb3IsXG4gIHR5cGUgUHJvdmlkZXJTdGFydHVwU3RhdGUsXG4gIHR5cGUgUXVlcnlJbnB1dCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbiAgdHlwZSBUb2tlblN0YXRzLFxufSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgY29tcG9zZVN5c3RlbVdpdGhTY2hlbWFDb250cmFjdCB9IGZyb20gXCIuL3NjaGVtYS1wcm9tcHRcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbiwgaXNUb29sQ2FsbEVudmVsb3BlIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb25cIjtcbmltcG9ydCB7IGJ1aWxkVG9vbENhbGxTY2hlbWEgfSBmcm9tIFwiLi90b29sLWVtdWxhdGlvbi1zY2hlbWFcIjtcblxuZXhwb3J0IHR5cGUgSW50ZXJuYWxRdWVyeUlucHV0ID0gUXVlcnlJbnB1dCAmIHtcbiAgcHJlZmVycmVkVG9rZW5JZD86IG51bWJlcjtcbiAgcmVxdWlyZVByZWZlcnJlZFRva2VuPzogYm9vbGVhbjtcbn07XG5cbi8vIHFncmlkIOyDgeychOqwgCBwcm92aWRlciDsl5Ag7JqU6rWs7ZWY64qUIOyLpO2WiSDqs4Tslb0uIOyKpO2KuOumrOuwjeydgCDqs7XthrUgUHJvdmlkZXJEaXNwYXRjaGVyIOyXkCDslYTsp4Eg7JeG7Ja07IScXG4vLyDsl6zquLDshJwg7ZWp7Lmc64ukLlxuZXhwb3J0IHR5cGUgU3RyZWFtaW5nUHJvdmlkZXJEaXNwYXRjaGVyID0gUHJvdmlkZXJEaXNwYXRjaGVyICYge1xuICBnZW5lcmF0ZVN0cmVhbShyZXE6IEdlbmVyYXRlUmVxdWVzdCwgY2I6IEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzKTogUHJvbWlzZTx2b2lkPjtcbn07XG5cbi8vIFRva2VuU3Vic2NyaWJlciDqsIAgZ3JvayByb3cg66W8IOyghOuLrO2VmOuKlCDqs4Tslb0uIGNyZWRlbnRpYWxzIOuKlCBEQiBKU09OQiDsm5Drs7jsnbTrqbAgZGlzcGF0Y2hlciDqsIBcbi8vIOyekOyytCDsiqTtgqTrp4jroZwg6rKA7Kad7ZWc64ukLlxuZXhwb3J0IHR5cGUgR3Jva1Rva2VuUm93ID0ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWxzO1xuICBxdW90YVRocmVzaG9sZDogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0OiBudW1iZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEdyb2tUb2tlblNpbmsge1xuICBvblRva2VuQWRkZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IFRva2VuQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0OiBudW1iZXIsXG4gICk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBvblRva2VuVXBkYXRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogVG9rZW5DcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZDogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQ6IG51bWJlcixcbiAgKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIG9uVG9rZW5SZW1vdmVkKGlkOiBudW1iZXIpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgcmVwbGFjZVRva2Vucyhyb3dzOiBHcm9rVG9rZW5Sb3dbXSk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogT2JzZXJ2YWJpbGl0eSB0aGUgY29uY3JldGUgR3JvayBkaXNwYXRjaGVyIGV4cG9zZXMgYmV5b25kIHJvdXRpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyb2tUb2tlblN0YXRlU291cmNlIHtcbiAgdG9rZW5TdGF0ZXMoKTogR3Jva1Rva2VuU3RhdGVTbmFwc2hvdFtdO1xufVxuXG4vKiogTWVkaWEsIHZvaWNlLCBhbmQgdG9rZW4tc3RhdGUgcmVwb3J0aW5nIGFyZSBvcHRpb25hbCBjYXBhYmlsaXRpZXMgb2YgYSBHcm9rIGRpc3BhdGNoZXIuICovXG5leHBvcnQgdHlwZSBHcm9rUHJvdmlkZXJEaXNwYXRjaGVyID0gU3RyZWFtaW5nUHJvdmlkZXJEaXNwYXRjaGVyICZcbiAgR3Jva1Rva2VuU2luayAmXG4gIFBhcnRpYWw8TWVkaWFEaXNwYXRjaGVyICYgVm9pY2VEaXNwYXRjaGVyICYgR3Jva1Rva2VuU3RhdGVTb3VyY2U+O1xuXG5leHBvcnQgdHlwZSBRZ3JpZERpc3BhdGNoZXJPcHRpb25zID0ge1xuICBncm9rRGlzcGF0Y2hlcj86IEdyb2tQcm92aWRlckRpc3BhdGNoZXIgfCBudWxsO1xufTtcblxuY29uc3QgUFJPVklERVJfTEFCRUxTOiBSZWNvcmQ8UHJvdmlkZXJJZCwgc3RyaW5nPiA9IHtcbiAgb3BlbmFpOiBcIk9wZW5BSVwiLFxuICBhbnRocm9waWM6IFwiQW50aHJvcGljXCIsXG4gIGdyb2s6IFwiR3Jva1wiLFxufTtcblxuZXhwb3J0IGNsYXNzIFFncmlkRGlzcGF0Y2hlckNsYXNzIHtcbiAgdG9rZW5zID0gbmV3IE1hcDxudW1iZXIsIFRva2VuU3Vic2V0QT4oKTtcblxuICAvLyDtlITroZzshLjsiqQg7Iuc7J6RIOydtO2bhCDsmYTro4zrkJwgcHJvdmlkZXIgZ2VuZXJhdGlvbiDsiJguIOyLpO2MqC/spJHqsIQg7Iuc64+E64qUIOygnOyZuO2VmOupsCxcbiAgLy8g7ZuE7IaNIHRvb2wgdHVybuuPhCDtlZwgZ2VuZXJhdGlvbuycvOuhnCDshLzri6QuIOuPmeuqhSDthqDtgbDsnYAgcHJvdmlkZXLrs4TroZwg67aE66as7ZWc64ukLlxuICByZXF1ZXN0Q291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICBzdWJzY3JpYmVyOiBUb2tlblN1YnNjcmliZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBwcm92aWRlciByb3V0ZSBwcmVmaXgg4oaSIOyLpO2WiSBkaXNwYXRjaGVyLiDrk7HroZ3rkJjsp4Ag7JWK7J2AIHByb3ZpZGVyIOuKlCBub3QtcmVhZHkg66GcIOydkeuLte2VnOuLpC5cbiAgcmVhZG9ubHkgZGlzcGF0Y2hlcnMgPSBuZXcgTWFwPFByb3ZpZGVySWQsIFN0cmVhbWluZ1Byb3ZpZGVyRGlzcGF0Y2hlcj4oKTtcbiAgI29wZW5haURpc3BhdGNoZXI6IE9wZW5BSURpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgI2FudGhyb3BpY0Rpc3BhdGNoZXI6IEFudGhyb3BpY0Rpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgI2dyb2tEaXNwYXRjaGVyOiBHcm9rUHJvdmlkZXJEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gSFRUUOqwgCBkaXNwYXRjaGVy67O064ukIOuovOyggCDsl7Trpqzrr4DroZwg7LSI6riw7ZmUIOykkeqzvCDstIjquLDtmZQg7Iuk7Yyo66W8IOq1rOu2hO2VnOuLpC5cbiAgLy8gZ3JvayDsnYAgYm9vdHN0cmFwIOydtCDrtpnquLAg7KCE6rmM7KeAIOyDge2DnOqwgCDsl4bsnLzrqbAsIOyXhuycvOuptCDquLDrj5kg7KSR7Jy866GcIOuzuOuLpC5cbiAgc3RhcnR1cFN0YXRlOiBSZWNvcmQ8XCJvcGVuYWlcIiB8IFwiYW50aHJvcGljXCIsIFByb3ZpZGVyU3RhcnR1cFN0YXRlPiAmXG4gICAgUGFydGlhbDxSZWNvcmQ8XCJncm9rXCIsIFByb3ZpZGVyU3RhcnR1cFN0YXRlPj4gPSB7XG4gICAgb3BlbmFpOiBcInN0YXJ0aW5nXCIsXG4gICAgYW50aHJvcGljOiBcInN0YXJ0aW5nXCIsXG4gIH07XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUWdyaWREaXNwYXRjaGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKG9wdGlvbnMuZ3Jva0Rpc3BhdGNoZXIpIHRoaXMuZ3Jva0Rpc3BhdGNoZXIgPSBvcHRpb25zLmdyb2tEaXNwYXRjaGVyO1xuICB9XG5cbiAgZ2V0IG9wZW5haURpc3BhdGNoZXIoKTogT3BlbkFJRGlzcGF0Y2hlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLiNvcGVuYWlEaXNwYXRjaGVyO1xuICB9XG5cbiAgc2V0IG9wZW5haURpc3BhdGNoZXIoZGlzcGF0Y2hlcjogT3BlbkFJRGlzcGF0Y2hlciB8IG51bGwpIHtcbiAgICB0aGlzLiNvcGVuYWlEaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcbiAgICB0aGlzLnJlZ2lzdGVyKFwib3BlbmFpXCIsIGRpc3BhdGNoZXIpO1xuICB9XG5cbiAgZ2V0IGFudGhyb3BpY0Rpc3BhdGNoZXIoKTogQW50aHJvcGljRGlzcGF0Y2hlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLiNhbnRocm9waWNEaXNwYXRjaGVyO1xuICB9XG5cbiAgc2V0IGFudGhyb3BpY0Rpc3BhdGNoZXIoZGlzcGF0Y2hlcjogQW50aHJvcGljRGlzcGF0Y2hlciB8IG51bGwpIHtcbiAgICB0aGlzLiNhbnRocm9waWNEaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcbiAgICB0aGlzLnJlZ2lzdGVyKFwiYW50aHJvcGljXCIsIGRpc3BhdGNoZXIpO1xuICB9XG5cbiAgZ2V0IGdyb2tEaXNwYXRjaGVyKCk6IEdyb2tQcm92aWRlckRpc3BhdGNoZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy4jZ3Jva0Rpc3BhdGNoZXI7XG4gIH1cblxuICBzZXQgZ3Jva0Rpc3BhdGNoZXIoZGlzcGF0Y2hlcjogR3Jva1Byb3ZpZGVyRGlzcGF0Y2hlciB8IG51bGwpIHtcbiAgICB0aGlzLiNncm9rRGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XG4gICAgdGhpcy5yZWdpc3RlcihcImdyb2tcIiwgZGlzcGF0Y2hlcik7XG4gIH1cblxuICByZWdpc3Rlcihwcm92aWRlcjogUHJvdmlkZXJJZCwgZGlzcGF0Y2hlcjogU3RyZWFtaW5nUHJvdmlkZXJEaXNwYXRjaGVyIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChkaXNwYXRjaGVyKSB0aGlzLmRpc3BhdGNoZXJzLnNldChwcm92aWRlciwgZGlzcGF0Y2hlcik7XG4gICAgZWxzZSB0aGlzLmRpc3BhdGNoZXJzLmRlbGV0ZShwcm92aWRlcik7XG4gIH1cblxuICAvLyDstIjquLDtmZQg7KSR7JeQ64qUIDUwMyArIFJldHJ5LUFmdGVyLCDstIjquLDtmZQg7Iuk7Yyo7JeQ64qUIDUwMOydhCDrsJjtmZjtlZzri6QuXG4gIG5vdFJlYWR5RXJyb3IocHJvdmlkZXI6IFByb3ZpZGVySWQpOiBFcnJvciB7XG4gICAgY29uc3QgbGFiZWwgPSBQUk9WSURFUl9MQUJFTFNbcHJvdmlkZXJdO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RhcnR1cFN0YXRlW3Byb3ZpZGVyXSA9PT0gXCJmYWlsZWRcIlxuICAgICAgPyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihTRChcInFncmlkLmRpc3BhdGNoZXJGYWlsZWRcIikobGFiZWwpKVxuICAgICAgOiBuZXcgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKFNEKFwicWdyaWQuZGlzcGF0Y2hlclN0YXJ0aW5nXCIpKGxhYmVsKSk7XG4gIH1cblxuICAvLyBwcmVmaXgg7JeG64qUL+uvuOyngOybkCBwcmVmaXgg64qUIOq4sOyhtOuMgOuhnCBQcm9jZXNzRXJyb3IsIOyngOybkCBwcm92aWRlciDsnZgg66+465Ox66Gd7J2AIG5vdC1yZWFkeS5cbiAgcmVzb2x2ZURpc3BhdGNoZXIoaW5wdXQ6IFF1ZXJ5SW5wdXQsIHByb3ZpZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBSZXNvbHZlZERpc3BhdGNoZXIge1xuICAgIGlmICghaXNQcm92aWRlcklkKHByb3ZpZGVyKSkgdGhyb3cgZGlyZWN0TGxtQXBpRmFsbGJhY2tOb3RJbXBsZW1lbnRlZChpbnB1dCk7XG4gICAgY29uc3QgZGlzcGF0Y2hlciA9IHRoaXMuZGlzcGF0Y2hlcnMuZ2V0KHByb3ZpZGVyKTtcblxuICAgIGlmICghZGlzcGF0Y2hlcikgdGhyb3cgdGhpcy5ub3RSZWFkeUVycm9yKHByb3ZpZGVyKTtcblxuICAgIHJldHVybiB7IHByb3ZpZGVyLCBkaXNwYXRjaGVyIH07XG4gIH1cblxuICByZWNvcmRDb21wbGV0ZWQocHJvdmlkZXI6IHN0cmluZywgdG9rZW5OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBgJHtwcm92aWRlcn1cXDAke3Rva2VuTmFtZX1gO1xuICAgIHRoaXMucmVxdWVzdENvdW50cy5zZXQoa2V5LCAodGhpcy5yZXF1ZXN0Q291bnRzLmdldChrZXkpID8/IDApICsgMSk7XG4gIH1cblxuICByZXBsYWNlQ2FjaGUocm93czogVG9rZW5TdWJzZXRBW10pOiB2b2lkIHtcbiAgICB0aGlzLnRva2VucyA9IG5ldyBNYXAocm93cy5tYXAoKHIpID0+IFtyLmlkLCByXSkpO1xuICB9XG5cbiAgZ2V0U3RhdHMoKTogVG9rZW5TdGF0c1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudG9rZW5zLnZhbHVlcygpXS5tYXAoKHIpID0+ICh7XG4gICAgICB0b2tlbjogbWFza1Rva2VuKGdldEFjY2Vzc1Rva2VuKHIuY3JlZGVudGlhbHMpKSxcbiAgICAgIG5hbWU6IHIubmFtZSxcbiAgICAgIHByb3ZpZGVyOiByLnByb3ZpZGVyLFxuICAgICAgcmVxdWVzdHM6IHRoaXMucmVxdWVzdENvdW50cy5nZXQoYCR7ci5wcm92aWRlcn1cXDAke3IubmFtZX1gKSA/PyAwLFxuICAgIH0pKTtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5KGlucHV0OiBJbnRlcm5hbFF1ZXJ5SW5wdXQsIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcbiAgICBjb25zdCBhbnN3ZXJLaW5kID0gaW5wdXQuanNvblNjaGVtYSA/IChcImpzb25cIiBhcyBjb25zdCkgOiAoXCJ0ZXh0XCIgYXMgY29uc3QpO1xuICAgIGNvbnN0IHsgcHJvdmlkZXIsIGRpc3BhdGNoZXIgfSA9IHRoaXMucmVzb2x2ZURpc3BhdGNoZXIoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcblxuICAgIGlmIChwcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogY29tcG9zZVN5c3RlbVdpdGhTY2hlbWFDb250cmFjdChpbnB1dC5zeXN0ZW0sIGlucHV0KSxcbiAgICAgICAgdGhpbmtpbmc6IGlucHV0LnRoaW5raW5nLFxuICAgICAgICBlZmZvcnQ6IGlucHV0LnRoaW5raW5nID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgcHJlZmVycmVkVG9rZW5JZDogaW5wdXQucHJlZmVycmVkVG9rZW5JZCxcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiBpbnB1dC5pbWFnZUdlbmVyYXRpb24sXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5yZWNvcmRDb21wbGV0ZWQocHJvdmlkZXIsIHJlc3VsdC50b2tlbk5hbWUpO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dChyZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQsIHtcbiAgICAgIGRpcmVjdFByb3ZpZGVyOiBwcm92aWRlcixcbiAgICAgIG1vZGVsTmFtZXNwYWNlOiBgJHtwcm92aWRlcn0vJHtyb3V0ZS5tb2RlbH1gLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGlzcGF0Y2hlci5nZW5lcmF0ZSh7XG4gICAgICAuLi5idWlsZERpcmVjdFJlcXVlc3QoaW5wdXQsIHJvdXRlLm1vZGVsLCBvdXRwdXRTY2hlbWEsIGFuc3dlcktpbmQsIGFib3J0U2lnbmFsKSxcbiAgICAgIHByb21wdENhY2hlS2V5OiBpbnB1dC5pbWFnZUdlbmVyYXRpb24gPyB1bmRlZmluZWQgOiBkZWNpc2lvbi5wcm9tcHRDYWNoZUtleSxcbiAgICAgIHByZWZlcnJlZFRva2VuSWQ6XG4gICAgICAgIGlucHV0LnByZWZlcnJlZFRva2VuSWQgPz8gKGlucHV0LmltYWdlR2VuZXJhdGlvbiA/IHVuZGVmaW5lZCA6IGRlY2lzaW9uLnByZWZlcnJlZFRva2VuSWQpLFxuICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlY29yZENvbXBsZXRlZChwcm92aWRlciwgcmVzdWx0LnRva2VuTmFtZSk7XG5cbiAgICAvLyDsnbTrr7jsp4Ag7JqU7LKt7J2AIGNvbGQtb25seShSOCnrnbwg7J6s7IKs7JqpIOyijO2RnOulvCDrsJzquIntlZjsp4Ag7JWK64qU64ukLiDsooztkZzrpbwg7Iuk7Jy866m0XG4gICAgLy8gc2Vzc2lvbktleSDshozruYTsnpDsnZggd2FybSDsooztkZzrpbwg7KO97J2AIOyijO2RnOuhnCDrja7slrTsjagg64uk7J2MIO2FjeyKpO2KuCB0dXJuIOydtCBjb2xkIOuhnCDrlqjslrTsp4Tri6QuXG4gICAgY29uc3QgY29vcmQgPSBpbnB1dC5pbWFnZUdlbmVyYXRpb25cbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbiwgcmVzdWx0LnRocmVhZENvb3JkLndvcmtlcklkKTtcblxuICAgIHJldHVybiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHJlc3VsdCwgaW5wdXQuc2VydmljZVRpZXIpLCBpbnB1dC50b29scywge1xuICAgICAgdGhyZWFkQ29vcmQ6IGNvb3JkLFxuICAgICAgaW1hZ2VzOiByZXN1bHQuaW1hZ2VzLFxuICAgICAgYW5zd2VyS2luZCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5U3RyZWFtKFxuICAgIGlucHV0OiBJbnRlcm5hbFF1ZXJ5SW5wdXQsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrczxRdWVyeU91dHB1dD4sXG4gICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcbiAgICBjb25zdCBhbnN3ZXJLaW5kID0gaW5wdXQuanNvblNjaGVtYSA/IChcImpzb25cIiBhcyBjb25zdCkgOiAoXCJ0ZXh0XCIgYXMgY29uc3QpO1xuICAgIGNvbnN0IHsgcHJvdmlkZXIsIGRpc3BhdGNoZXIgfSA9IHRoaXMucmVzb2x2ZURpc3BhdGNoZXIoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcblxuICAgIGlmIChwcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgLy8g6rWs7KGw7ZmUIOydkeuLteydgCDstZzsooUg7YWN7Iqk7Yq47JmAIOuNuO2DgCDrqqjrkZAg7L2U65Oc7Y6c7Iqk66W8IOygnOqxsO2VnOuLpC5cbiAgICAgIGNvbnN0IGhhc1NjaGVtYUNvbnRyYWN0ID0gaW5wdXQuanNvblNjaGVtYSAhPT0gdW5kZWZpbmVkIHx8IEJvb2xlYW4oaW5wdXQudG9vbHM/Lmxlbmd0aCk7XG4gICAgICBjb25zdCBmZW5jZVN0cmlwID0gaGFzU2NoZW1hQ29udHJhY3QgPyBjcmVhdGVGZW5jZVN0cmlwVHJhbnNmb3JtKCkgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IGVtaXREZWx0YSA9IGZlbmNlU3RyaXBcbiAgICAgICAgPyAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzYWZlID0gZmVuY2VTdHJpcC5wdXNoKHRleHQpO1xuXG4gICAgICAgICAgICBpZiAoc2FmZSkgY2Iub25EZWx0YShzYWZlKTtcbiAgICAgICAgICB9XG4gICAgICAgIDogY2Iub25EZWx0YTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBhd2FpdCBkaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogY29tcG9zZVN5c3RlbVdpdGhTY2hlbWFDb250cmFjdChpbnB1dC5zeXN0ZW0sIGlucHV0KSxcbiAgICAgICAgICB0aGlua2luZzogaW5wdXQudGhpbmtpbmcsXG4gICAgICAgICAgZWZmb3J0OiBpbnB1dC50aGlua2luZyA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBpbnB1dC5lZmZvcnQsXG4gICAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgIHByZWZlcnJlZFRva2VuSWQ6IGlucHV0LnByZWZlcnJlZFRva2VuSWQsXG4gICAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiBlbWl0RGVsdGEsXG4gICAgICAgICAgb25UaHJlYWRJZDogY2Iub25UaHJlYWRJZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWNvcmRDb21wbGV0ZWQocHJvdmlkZXIsIHR1cm5SZXN1bHQudG9rZW5OYW1lKTtcbiAgICAgICAgICAgIC8vIOuLq+uKlCDtjpzsiqQg7YyQ7KCVIOuVjOusuOyXkCDrs7TrpZjtlZwg7YWN7Iqk7Yq466W8IOyZhOujjCDsoITsl5Ag67Cp7Lac7ZWc64ukLlxuICAgICAgICAgICAgY29uc3QgcmVzdCA9IGZlbmNlU3RyaXA/LmZsdXNoKCk7XG5cbiAgICAgICAgICAgIGlmIChyZXN0KSBjYi5vbkRlbHRhKHJlc3QpO1xuXG4gICAgICAgICAgICBjb25zdCBpc3N1ZWRDb29yZCA9IGlzc3VlQ29udkNvbnRleHQodHVyblJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pO1xuICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSwgaW5wdXQudG9vbHMsIHtcbiAgICAgICAgICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVkQ29vcmQsXG4gICAgICAgICAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogY2Iub25FcnJvcixcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0LCB7XG4gICAgICBkaXJlY3RQcm92aWRlcjogcHJvdmlkZXIsXG4gICAgICBtb2RlbE5hbWVzcGFjZTogYCR7cHJvdmlkZXJ9LyR7cm91dGUubW9kZWx9YCxcbiAgICB9KTtcblxuICAgIGF3YWl0IGRpc3BhdGNoZXIuZ2VuZXJhdGVTdHJlYW0oXG4gICAgICB7XG4gICAgICAgIC4uLmJ1aWxkRGlyZWN0UmVxdWVzdChpbnB1dCwgcm91dGUubW9kZWwsIG91dHB1dFNjaGVtYSwgYW5zd2VyS2luZCwgYWJvcnRTaWduYWwpLFxuICAgICAgICBwcm9tcHRDYWNoZUtleTogZGVjaXNpb24ucHJvbXB0Q2FjaGVLZXksXG4gICAgICAgIHByZWZlcnJlZFRva2VuSWQ6IGlucHV0LnByZWZlcnJlZFRva2VuSWQgPz8gZGVjaXNpb24ucHJlZmVycmVkVG9rZW5JZCxcbiAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG9uRGVsdGE6IGNiLm9uRGVsdGEsXG4gICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgIG9uVHVybklkOiBjYi5vblR1cm5JZCxcbiAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICB0aGlzLnJlY29yZENvbXBsZXRlZChwcm92aWRlciwgdHVyblJlc3VsdC50b2tlbk5hbWUpO1xuICAgICAgICAgIGNiLm9uQ29tcGxldGUoXG4gICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQsIGlucHV0LnNlcnZpY2VUaWVyKSwgaW5wdXQudG9vbHMsIHtcbiAgICAgICAgICAgICAgdGhyZWFkQ29vcmQ6IGlzc3VlQ29udkNvbnRleHQoXG4gICAgICAgICAgICAgICAgdHVyblJlc3VsdC50aHJlYWRDb29yZCxcbiAgICAgICAgICAgICAgICBkZWNpc2lvbixcbiAgICAgICAgICAgICAgICB0dXJuUmVzdWx0LnRocmVhZENvb3JkLndvcmtlcklkLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogY2Iub25FcnJvcixcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxufVxuXG4vLyBEaXJlY3QgcHJvdmlkZXIoT3BlbkFJLCBHcm9rKSDqs7XthrUg7JqU7LKtIO2VhOuTnC4gY2FjaGUgYWZmaW5pdHkg7ZWE65Oc64qUIHN0cmVhbSDsl6zrtoDsl5Ag65Sw6528IO2YuOy2nOu2gOqwgCDssYTsmrTri6QuXG5mdW5jdGlvbiBidWlsZERpcmVjdFJlcXVlc3QoXG4gIGlucHV0OiBJbnRlcm5hbFF1ZXJ5SW5wdXQsXG4gIG1vZGVsOiBzdHJpbmcsXG4gIG91dHB1dFNjaGVtYTogSnNvblZhbHVlIHwgdW5kZWZpbmVkLFxuICBhbnN3ZXJLaW5kOiBcImpzb25cIiB8IFwidGV4dFwiLFxuICBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsXG4pOiBPbWl0PEdlbmVyYXRlUmVxdWVzdCwgXCJjb2xkSW5wdXRcIiB8IFwiY29sZEhpc3RvcnlcIiB8IFwicHJvbXB0Q2FjaGVLZXlcIiB8IFwicHJlZmVycmVkVG9rZW5JZFwiPiB7XG4gIGNvbnN0IHJlcXVlc3Q6IE9taXQ8XG4gICAgR2VuZXJhdGVSZXF1ZXN0LFxuICAgIFwiY29sZElucHV0XCIgfCBcImNvbGRIaXN0b3J5XCIgfCBcInByb21wdENhY2hlS2V5XCIgfCBcInByZWZlcnJlZFRva2VuSWRcIlxuICA+ID0ge1xuICAgIG1vZGVsLFxuICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgIG91dHB1dFNjaGVtYSxcbiAgICBzdG9wQWZ0ZXJPdXRwdXRNZXNzYWdlOiBpbnB1dC50b29scz8ubGVuZ3RoXG4gICAgICA/ICh0ZXh0LCBwaGFzZSkgPT4gaXNUb29sQ2FsbEVudmVsb3BlKHRleHQsIGlucHV0LnRvb2xzISwgYW5zd2VyS2luZCwgcGhhc2UpXG4gICAgICA6IHVuZGVmaW5lZCxcbiAgICB0aGlua2luZzogaW5wdXQudGhpbmtpbmcsXG4gICAgZWZmb3J0OiBpbnB1dC50aGlua2luZyA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBpbnB1dC5lZmZvcnQsXG4gICAgdmVyYm9zaXR5OiBpbnB1dC52ZXJib3NpdHksXG4gICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgIHJlcXVpcmVQcmVmZXJyZWRUb2tlbjogaW5wdXQucmVxdWlyZVByZWZlcnJlZFRva2VuLFxuICAgIGFib3J0U2lnbmFsLFxuICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gIH07XG5cbiAgLy8gT3BhcXVlIG5hbWVzcGFjZXM7IHRoZSBHcm9rIGRpc3BhdGNoZXIgcmVhZHMgYHhhaWAsIE9wZW5BSSBpZ25vcmVzIGl0LlxuICBpZiAoaW5wdXQucHJvdmlkZXJPcHRpb25zPy54YWkpIHtcbiAgICByZXF1ZXN0LnByb3ZpZGVyT3B0aW9ucyA9IHsgeGFpOiB7IC4uLmlucHV0LnByb3ZpZGVyT3B0aW9ucy54YWkgfSB9O1xuICB9XG5cbiAgcmV0dXJuIHJlcXVlc3Q7XG59XG5cbmludGVyZmFjZSBQcm92aWRlclJvdXRlIHtcbiAgcHJvdmlkZXI/OiBzdHJpbmc7XG4gIG1vZGVsOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUHJvdmlkZXJSb3V0ZShtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvdmlkZXJSb3V0ZSB7XG4gIGlmICghbW9kZWw/LmluY2x1ZGVzKFwiL1wiKSkge1xuICAgIHJldHVybiB7IG1vZGVsOiBtb2RlbCA/PyBcIlwiIH07XG4gIH1cblxuICBjb25zdCBbcHJvdmlkZXIsIHJvdXRlZE1vZGVsXSA9IG1vZGVsLnNwbGl0KFwiL1wiLCAyKTtcblxuICBpZiAoIXByb3ZpZGVyIHx8ICFyb3V0ZWRNb2RlbCkgdGhyb3cgbmV3IFByb2Nlc3NFcnJvcihcInVua25vd24gbW9kZWxcIik7XG5cbiAgcmV0dXJuIHsgcHJvdmlkZXIsIG1vZGVsOiByb3V0ZWRNb2RlbCB9O1xufVxuXG5mdW5jdGlvbiBkaXJlY3RMbG1BcGlGYWxsYmFja05vdEltcGxlbWVudGVkKGlucHV0OiBRdWVyeUlucHV0KTogUHJvY2Vzc0Vycm9yIHtcbiAgcmV0dXJuIG5ldyBQcm9jZXNzRXJyb3IoXG4gICAgYERpcmVjdCBMTE0gQVBJIGZhbGxiYWNrIG5vdCBpbXBsZW1lbnRlZCBmb3IgbW9kZWw6ICR7aW5wdXQubW9kZWwgPz8gXCI8ZGVmYXVsdD5cIn1gLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdHJpY3RPdXRwdXRTY2hlbWEoXG4gIGlucHV0OiBQaWNrPFF1ZXJ5SW5wdXQsIFwidG9vbHNcIiB8IFwianNvblNjaGVtYVwiPixcbiAgcHJvdmlkZXI/OiBzdHJpbmcsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFJhd091dHB1dFNjaGVtYShpbnB1dCk7XG5cbiAgaWYgKCFvdXRwdXRTY2hlbWEpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gQm9vbGVhbiBhbmQgb3RoZXIgbm9uLW9iamVjdCBzY2hlbWFzIGhhdmUgbm90aGluZyB0byB0aWdodGVuIGFuZCBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLlxuICByZXR1cm4gaXNKc29uT2JqZWN0KG91dHB1dFNjaGVtYSkgPyBzdHJpY3RpZnkob3V0cHV0U2NoZW1hLCB7IHByb3ZpZGVyIH0pIDogb3V0cHV0U2NoZW1hO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJtb2RlbFwiIHwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuICBwcm92aWRlciA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCkucHJvdmlkZXIsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICAvLyBDbGF1ZGUgQ29kZeydmCAtLWpzb24tc2NoZW1h64qUIOu2iO2VhOyalO2VnCDrgrTrtoAg7J6s7Iuc64+E66W8IOycoOuwnO2VnOuLpC5cbiAgLy8gQW50aHJvcGlj7J2AIOybkOuzuCDsiqTtgqTrp4jrpbwg6rKA7Kad7ZWcIOuSpCDtlITroaztlITtirjroZwg7KCE64us7ZWY6rOgLCDsnZHri7Ug6rKA7Kad7J2AIOyGjOu5hOyekOyXkCDrp6HquLTri6QuXG4gIGlmIChwcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgIHBhcnNlQW5kVmFsaWRhdGVDYWxsZXJTY2hlbWFzKGlucHV0KTtcblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcHJvdmlkZXIpO1xuICBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hKG91dHB1dFNjaGVtYSwgcHJvdmlkZXIpO1xuXG4gIHJldHVybiBvdXRwdXRTY2hlbWE7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmF3T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYWxsZXJPdXRwdXRTY2hlbWEgPSBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyhpbnB1dCk7XG5cbiAgcmV0dXJuIGlucHV0LnRvb2xzPy5sZW5ndGhcbiAgICA/IGJ1aWxkVG9vbENhbGxTY2hlbWEoaW5wdXQudG9vbHMsIGNhbGxlck91dHB1dFNjaGVtYSlcbiAgICA6IGNhbGxlck91dHB1dFNjaGVtYTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBsZXRlZERyaXZlckZyb21JbWFnZUZhaWx1cmUoXG4gIGNhdXNlOiB1bmtub3duLFxuICBzZXJ2aWNlVGllcj86IHN0cmluZyxcbik6IFF1ZXJ5T3V0cHV0IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCEoY2F1c2UgaW5zdGFuY2VvZiBJbWFnZUdlbmVyYXRpb25FcnJvcikgfHwgIWNhdXNlLmNvbXBsZXRlZERyaXZlcikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChjYXVzZS5jb21wbGV0ZWREcml2ZXIsIHNlcnZpY2VUaWVyKSwgdW5kZWZpbmVkLCB7XG4gICAgYW5zd2VyS2luZDogXCJ0ZXh0XCIsXG4gIH0pO1xufVxuXG4vLyBBbnRocm9waWMgYWRhcHRlciDripQgY2FjaGUgY3JlYXRpb24g7J2EIGlucHV0VG9rZW5zIOyXkCDtj6ztlajtlbQg7ZGc7KSA7ZmU7ZWY6rOgLCDrs4Trj4Qg7ZWE65Oc7JeQ64+EIOuztOyhtO2VnOuLpC5cbmZ1bmN0aW9uIHRvRW11bGF0aW9uUmVzdWx0KFxuICByZXN1bHQ6IEdlbmVyYXRlUmVzdWx0LFxuICBzZXJ2aWNlVGllcj86IHN0cmluZyxcbik6IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPiB7XG4gIC8vIEEgcHJvdmlkZXIgdGhhdCBsYWJlbHMgaXRzIG93biBjb3N0IChHcm9rIHRpY2tzKSBpcyBhdXRob3JpdGF0aXZlIGV2ZW4gYXQgMDsgb3RoZXJ3aXNlIG9ubHkgYVxuICAvLyBwb3NpdGl2ZSBwcm92aWRlciBjb3N0IChDbGF1ZGUgQ29kZSB0b3RhbF9jb3N0X3VzZCkgd2lucyBvdmVyIHRoZSBwcmljZSB0YWJsZS5cbiAgY29uc3QgaGFzUHJvdmlkZXJDb3N0ID1cbiAgICByZXN1bHQuY29zdFVzZCAhPT0gdW5kZWZpbmVkICYmIChyZXN1bHQuY29zdFNvdXJjZSA9PT0gXCJwcm92aWRlclwiIHx8IHJlc3VsdC5jb3N0VXNkID4gMCk7XG5cbiAgY29uc3QgZW11bGF0aW9uUmVzdWx0OiBPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCIgfCBcInJ1bkNvbnRleHRcIj4gPSB7XG4gICAgdGV4dDogcmVzdWx0LnRleHQsXG4gICAgdG9rZW5OYW1lOiByZXN1bHQudG9rZW5OYW1lLFxuICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgcmVxdWVzdGVkTW9kZWw6IHJlc3VsdC5yZXF1ZXN0ZWRNb2RlbCxcbiAgICBtb2RlbEZhbGxiYWNrczogcmVzdWx0Lm1vZGVsRmFsbGJhY2tzLFxuICAgIHVzYWdlOiB7XG4gICAgICBpbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICByZWFzb25pbmdfdG9rZW5zOiByZXN1bHQudXNhZ2UucmVhc29uaW5nT3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICB9LFxuICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgIHR0ZnRNczogcmVzdWx0LnR0ZnRNcyA/PyAwLFxuICAgIGNvc3RVc2Q6IGhhc1Byb3ZpZGVyQ29zdFxuICAgICAgPyByZXN1bHQuY29zdFVzZCFcbiAgICAgIDogY2FsY3VsYXRlQ29zdFVzZChcbiAgICAgICAgICByZXN1bHQubW9kZWwsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5wdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgIG91dHB1dFRva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0sXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2VydmljZVRpZXIsXG4gICAgICAgICksXG4gICAgY29zdFNvdXJjZTogaGFzUHJvdmlkZXJDb3N0ID8gKHJlc3VsdC5jb3N0U291cmNlID8/IFwicHJvdmlkZXJcIikgOiBcInByaWNpbmdfdGFibGVcIixcbiAgfTtcblxuICBpZiAocmVzdWx0LnByb3ZpZGVyTWV0YWRhdGE/LnhhaSkge1xuICAgIGVtdWxhdGlvblJlc3VsdC5wcm92aWRlck1ldGFkYXRhID0geyB4YWk6IHJlc3VsdC5wcm92aWRlck1ldGFkYXRhLnhhaSB9O1xuICB9XG5cbiAgcmV0dXJuIGVtdWxhdGlvblJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IFFncmlkRGlzcGF0Y2hlciA9IG5ldyBRZ3JpZERpc3BhdGNoZXJDbGFzcygpO1xuXG5pbnRlcmZhY2UgUmVzb2x2ZWREaXNwYXRjaGVyIHtcbiAgcHJvdmlkZXI6IFByb3ZpZGVySWQ7XG4gIGRpc3BhdGNoZXI6IFN0cmVhbWluZ1Byb3ZpZGVyRGlzcGF0Y2hlcjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBd0dBLE1BQU0sa0JBQThDO0NBQ2xELFFBQVE7Q0FDUixXQUFXO0NBQ1gsTUFBTTtBQUNSO0FBRUEsSUFBYSx1QkFBYixNQUFrQztDQUNoQyx5QkFBUyxJQUFJLElBQTBCO0NBSXZDLGdDQUFnQixJQUFJLElBQW9CO0NBRXhDLGFBQXFDO0NBR3JDLDhCQUF1QixJQUFJLElBQTZDO0NBQ3hFLG9CQUE2QztDQUM3Qyx1QkFBbUQ7Q0FDbkQsa0JBQWlEO0NBSWpELGVBQ2tEO0VBQ2hELFFBQVE7RUFDUixXQUFXO0NBQ2I7Q0FFQSxZQUFZLFVBQWtDLENBQUMsR0FBRztFQUNoRCxJQUFJLFFBQVEsZ0JBQWdCLEtBQUssaUJBQWlCLFFBQVE7Q0FDNUQ7Q0FFQSxJQUFJLG1CQUE0QztFQUM5QyxPQUFPLEtBQUtBO0NBQ2Q7Q0FFQSxJQUFJLGlCQUFpQixZQUFxQztFQUN4RCxLQUFLQSxvQkFBb0I7RUFDekIsS0FBSyxTQUFTLFVBQVUsVUFBVTtDQUNwQztDQUVBLElBQUksc0JBQWtEO0VBQ3BELE9BQU8sS0FBS0M7Q0FDZDtDQUVBLElBQUksb0JB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