@cartanova/qgrid-cli 2.10.10 → 2.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) 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-Be2qCZmI.css +1 -0
  204. package/bundle/web-dist/client/assets/index-C96h3feE.js +32 -0
  205. package/bundle/web-dist/client/assets/logs-DBM6U0QD.js +1 -0
  206. package/bundle/web-dist/client/assets/monit-BBjXa7vB.js +1 -0
  207. package/bundle/web-dist/client/assets/routes-Crz_PQzi.js +5 -0
  208. package/bundle/web-dist/client/assets/{services.generated-NP-ValHd.js → services.generated-B5lc3aIC.js} +5 -5
  209. package/bundle/web-dist/client/assets/settings-Cdwm3OBB.js +1 -0
  210. package/bundle/web-dist/client/assets/show-DBUhALT1.js +2 -0
  211. package/bundle/web-dist/client/assets/tokens-CVQAVJTo.js +1 -0
  212. package/bundle/web-dist/client/assets/total-cost-MnfKU8IN.js +1 -0
  213. package/bundle/web-dist/client/assets/use-oauth-login-flow-BfxYI4Oh.js +1 -0
  214. package/bundle/web-dist/client/assets/use-update-token-mutation-qKBC2sn7.js +1 -0
  215. package/bundle/web-dist/client/assets/{vendor-tanstack-DJRQAbrY.js → vendor-tanstack-DRPs09ai.js} +1 -1
  216. package/bundle/web-dist/client/index.html +5 -5
  217. package/bundle/web-dist/server/assets/clsx-D_N5PN_2.js +16 -0
  218. package/bundle/web-dist/server/assets/{lazyRouteComponent-CgBdabgd.js → lazyRouteComponent-AKiHfZWp.js} +129 -2
  219. package/bundle/web-dist/server/assets/{logs-BMyR98rU.js → logs-B7QmGJq3.js} +18 -14
  220. package/bundle/web-dist/server/assets/{monit-ZPt66W5M.js → monit-DFt7x3bh.js} +13 -12
  221. package/bundle/web-dist/server/assets/{plus-BZ9I0VgC.js → plus-DaYQRpBt.js} +1 -1
  222. package/bundle/web-dist/server/assets/{react-dom-Ds75e4Jl.js → react-dom-Cv23mm1K.js} +2 -129
  223. package/bundle/web-dist/server/assets/{refresh-cw-CztCFis-.js → refresh-cw-BpXNsAy-.js} +1 -1
  224. package/bundle/web-dist/server/assets/{request-model-DjGldb-h.js → request-model-eHE6YbaF.js} +1 -1
  225. package/bundle/web-dist/server/assets/{routes-Ct-k7nBA.js → routes-_Y-PJfgO.js} +110 -39
  226. package/bundle/web-dist/server/assets/{services.generated-BA4AcAf5.js → services.generated-CMJ8AHbO.js} +582 -172
  227. package/bundle/web-dist/server/assets/{settings-CBUZ47Xx.js → settings-JwJKxn2e.js} +14 -14
  228. package/bundle/web-dist/server/assets/{show-LSFIzvO2.js → show-BEv6z1v_.js} +90 -60
  229. package/bundle/web-dist/server/assets/{tokens-DxrBW512.js → tokens-CNT4mI-f.js} +162 -50
  230. package/bundle/web-dist/server/assets/total-cost-fTE9Xy82.js +18 -0
  231. package/bundle/web-dist/server/assets/use-oauth-login-flow-jkAkT3X6.js +2345 -0
  232. package/bundle/web-dist/server/assets/{use-update-token-mutation-pkArIzCP.js → use-update-token-mutation-Sm6kh02m.js} +1 -1
  233. package/bundle/web-dist/server/entry-server.generated.js +1644 -21655
  234. package/dist/cli.js +9 -9
  235. package/package.json +4 -11
  236. package/postinstall.mjs +12 -0
  237. package/skills/qgrid/SKILL.md +1 -0
  238. package/skills/qgrid/references/cli-env-and-server-boot.md +4 -1
  239. package/skills/qgrid/references/decision-rationale.md +23 -0
  240. package/skills/qgrid/references/grok-runtime.md +89 -0
  241. package/skills/qgrid/references/provider-runtime-differences.md +30 -29
  242. package/skills/qgrid/references/repo-map.md +10 -0
  243. package/skills/qgrid/references/token-auth-quota-lifecycle.md +56 -3
  244. package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -406
  245. package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +0 -1507
  246. package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +0 -887
  247. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2756
  248. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +0 -8
  249. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +0 -8
  250. package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +0 -922
  251. package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +0 -386
  252. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -121
  253. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +0 -51
  254. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +0 -1317
  255. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +0 -561
  256. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +0 -40
  257. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +0 -272
  258. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +0 -27
  259. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +0 -77
  260. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +0 -381
  261. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +0 -51
  262. package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2986
  263. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
  264. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
  265. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
  266. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
  267. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
  268. package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1126
  269. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
  270. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
  271. package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -517
  272. package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -101
  273. 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
  274. 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
  275. 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
  276. 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
  277. 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
  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/index.DdgEv5B1.js +0 -46
  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/rpc.MzXet3jl.js +0 -119
  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/test.DNmyFkvJ.js +0 -3044
  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/utils.BX5Fg8C4.js +0 -59
  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/index.js +0 -28
  283. package/bundle/dist/testing/setup-mocks.js +0 -16
  284. package/bundle/src/testing/setup-mocks.ts +0 -44
  285. package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +0 -1
  286. package/bundle/web-dist/client/assets/index-DZwzUfI-.js +0 -106
  287. package/bundle/web-dist/client/assets/logs-Cog79DU5.js +0 -1
  288. package/bundle/web-dist/client/assets/monit-2auznBys.js +0 -1
  289. package/bundle/web-dist/client/assets/routes-B0lTeLK-.js +0 -5
  290. package/bundle/web-dist/client/assets/settings-D8ZxZGSJ.js +0 -1
  291. package/bundle/web-dist/client/assets/show-CFSERlnM.js +0 -2
  292. package/bundle/web-dist/client/assets/tokens-CZXUyI7O.js +0 -1
  293. package/bundle/web-dist/client/assets/use-oauth-login-flow-hboOs3wG.js +0 -1
  294. package/bundle/web-dist/client/assets/use-update-token-mutation-BQHS0byG.js +0 -1
  295. package/bundle/web-dist/server/assets/use-oauth-login-flow-Gn8flMK5.js +0 -178
  296. package/dist/cli.d.ts +0 -10
  297. /package/bundle/web-dist/client/assets/{cost-DH2jZbrw.js → cost-DB3HbU7T.js} +0 -0
  298. /package/bundle/web-dist/client/assets/{plus-B62CuqT8.js → plus-BsQdY7PS.js} +0 -0
  299. /package/bundle/web-dist/client/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
  300. /package/bundle/web-dist/client/assets/{refresh-cw-NNcU0Cmq.js → refresh-cw-D9IUmT23.js} +0 -0
  301. /package/bundle/web-dist/client/assets/{request-model-CojtinqK.js → request-model-Bpp_rkK8.js} +0 -0
  302. /package/bundle/web-dist/server/assets/{cost-eEHeTRT5.js → cost-BC9yzyA9.js} +0 -0
@@ -1,7 +1,18 @@
1
1
  import { stripFences } from "./fence-strip.js";
2
+ import { isJsonObject, jsonNumber, jsonString } from "../common/provider-types.js";
3
+ import { z } from "zod";
2
4
  //#region src/utils/providers/anthropic/stream-json-adapter.ts
5
+ /**
6
+ * Claude CLI stream-json adapter.
7
+ *
8
+ * Input: qgrid history/input -> Claude JSONL stdin.
9
+ * Output: Claude JSONL stdout -> qgrid deltas + final result metadata.
10
+ *
11
+ * Previous conversation items are flattened into one assistant context line.
12
+ * The only executable user line is the current input.
13
+ */
3
14
  function userInputToText(input) {
4
- return input.filter((i) => i.type === "text").map((i) => i.text).join("\n");
15
+ return input.flatMap((i) => i.type === "text" ? [i.text] : []).join("\n");
5
16
  }
6
17
  function textBlock(text) {
7
18
  return [{
@@ -10,14 +21,14 @@ function textBlock(text) {
10
21
  }];
11
22
  }
12
23
  function asObject(v) {
13
- return typeof v === "object" && v !== null && !Array.isArray(v) ? v : null;
24
+ return isJsonObject(v) ? v : null;
14
25
  }
15
26
  function responseItemText(item) {
16
27
  const content = item.content;
17
28
  if (!Array.isArray(content)) return "";
18
29
  return content.map((c) => {
19
30
  const obj = asObject(c);
20
- return obj && typeof obj.text === "string" ? obj.text : "";
31
+ return (obj && jsonString(obj.text)) ?? "";
21
32
  }).filter(Boolean).join("\n");
22
33
  }
23
34
  function flattenColdHistory(coldHistory) {
@@ -28,11 +39,11 @@ function flattenColdHistory(coldHistory) {
28
39
  if (item.type === "message" && item.role === "assistant") parts.push(`Assistant: ${responseItemText(item)}`);
29
40
  else if (item.type === "message" && item.role === "user") parts.push(`User: ${responseItemText(item)}`);
30
41
  else if (item.type === "function_call") {
31
- const name = typeof item.name === "string" ? item.name : "";
32
- const args = typeof item.arguments === "string" ? item.arguments : JSON.stringify(item.arguments ?? {});
42
+ const name = jsonString(item.name) ?? "";
43
+ const args = jsonString(item.arguments) ?? JSON.stringify(item.arguments ?? {});
33
44
  parts.push(`Tool call: ${name}(${args})`);
34
45
  } else if (item.type === "function_call_output") {
35
- const output = typeof item.output === "string" ? item.output : JSON.stringify(item.output ?? "");
46
+ const output = jsonString(item.output) ?? JSON.stringify(item.output ?? "");
36
47
  parts.push(`Tool result: ${output}`);
37
48
  }
38
49
  }
@@ -62,6 +73,17 @@ function buildStreamJsonInput(opts) {
62
73
  function serializeStreamJsonInput(lines) {
63
74
  return lines.map((l) => JSON.stringify(l)).join("\n") + "\n";
64
75
  }
76
+ const optionalCount = z.number().optional().catch(void 0);
77
+ const ClaudeUsage = z.object({
78
+ input_tokens: optionalCount,
79
+ output_tokens: optionalCount,
80
+ cache_creation_input_tokens: optionalCount,
81
+ cache_read_input_tokens: optionalCount,
82
+ cache_creation: z.object({
83
+ ephemeral_5m_input_tokens: optionalCount,
84
+ ephemeral_1h_input_tokens: optionalCount
85
+ }).optional().catch(void 0)
86
+ });
65
87
  function toUsageBreakdown(u) {
66
88
  const input = u.input_tokens ?? 0;
67
89
  const cacheCreate = u.cache_creation_input_tokens ?? 0;
@@ -70,16 +92,17 @@ function toUsageBreakdown(u) {
70
92
  const totalInput = input + cacheCreate + cacheRead;
71
93
  const cacheCreate5m = u.cache_creation?.ephemeral_5m_input_tokens;
72
94
  const cacheCreate1h = u.cache_creation?.ephemeral_1h_input_tokens;
73
- return {
95
+ const usage = {
74
96
  totalTokens: totalInput + output,
75
97
  inputTokens: totalInput,
76
98
  cachedInputTokens: cacheRead,
77
99
  cacheCreationInputTokens: cacheCreate,
78
- ...typeof cacheCreate5m === "number" ? { cacheCreationInputTokens5m: cacheCreate5m } : {},
79
- ...typeof cacheCreate1h === "number" ? { cacheCreationInputTokens1h: cacheCreate1h } : {},
80
100
  outputTokens: output,
81
101
  reasoningOutputTokens: 0
82
102
  };
103
+ if (cacheCreate5m !== void 0) usage.cacheCreationInputTokens5m = cacheCreate5m;
104
+ if (cacheCreate1h !== void 0) usage.cacheCreationInputTokens1h = cacheCreate1h;
105
+ return usage;
83
106
  }
84
107
  function structuredOutputToolUseText(j) {
85
108
  const content = asObject(j.message)?.content;
@@ -94,7 +117,7 @@ function canonicalEventModel(model) {
94
117
  return (model.startsWith("anthropic/") ? model.slice(10) : model).replace(/\[1m\]$/, "");
95
118
  }
96
119
  function optionalString(value) {
97
- return typeof value === "string" && value.length > 0 ? value : void 0;
120
+ return jsonString(value) || void 0;
98
121
  }
99
122
  function recordFallback(state, fallback) {
100
123
  if (!state) return;
@@ -153,12 +176,13 @@ function handleStreamJsonLine(line, onDelta, opts) {
153
176
  const state = opts?.state;
154
177
  const trimmed = line.trim();
155
178
  if (!trimmed) return null;
156
- let j;
179
+ let parsed;
157
180
  try {
158
- j = JSON.parse(trimmed);
181
+ parsed = JSON.parse(trimmed);
159
182
  } catch {
160
183
  return null;
161
184
  }
185
+ const j = asObject(parsed) ?? {};
162
186
  if (j.type === "stream_event") {
163
187
  const event = asObject(j.event);
164
188
  if (event?.type === "message_start") updateRoutingFromMessage(asObject(event.message), state);
@@ -171,10 +195,12 @@ function handleStreamJsonLine(line, onDelta, opts) {
171
195
  }
172
196
  if (event && event.type === "content_block_delta") {
173
197
  const delta = asObject(event.delta);
174
- if (delta) {
175
- if (structuredOutput) {
176
- if (delta.type === "input_json_delta" && typeof delta.partial_json === "string") onDelta(delta.partial_json);
177
- } else if (delta.type === "text_delta" && typeof delta.text === "string") onDelta(delta.text);
198
+ if (delta) if (structuredOutput) {
199
+ const partialJson = jsonString(delta.partial_json);
200
+ if (delta.type === "input_json_delta" && partialJson !== void 0) onDelta(partialJson);
201
+ } else {
202
+ const deltaText = jsonString(delta.text);
203
+ if (delta.type === "text_delta" && deltaText !== void 0) onDelta(deltaText);
178
204
  }
179
205
  }
180
206
  return null;
@@ -212,15 +238,15 @@ function handleStreamJsonLine(line, onDelta, opts) {
212
238
  return null;
213
239
  }
214
240
  if (j.type === "result") {
215
- const subtype = typeof j.subtype === "string" ? j.subtype : void 0;
216
- const terminalReason = typeof j.terminal_reason === "string" ? j.terminal_reason : void 0;
241
+ const subtype = jsonString(j.subtype);
242
+ const terminalReason = jsonString(j.terminal_reason);
217
243
  const resultSucceeded = j.is_error !== true && terminalReason !== "model_error" && (subtype === void 0 || subtype === "success");
218
244
  let text;
219
245
  const preservedStructuredOutput = structuredOutput ? state?.structuredOutputText : void 0;
220
246
  if (structuredOutput && resultSucceeded && j.structured_output !== void 0) text = JSON.stringify(j.structured_output);
221
247
  else if (preservedStructuredOutput !== void 0) text = preservedStructuredOutput;
222
248
  else if (j.structured_output !== void 0) text = JSON.stringify(j.structured_output);
223
- else text = stripFences(typeof j.result === "string" ? j.result : "");
249
+ else text = stripFences(jsonString(j.result) ?? "");
224
250
  const rawUsage = asObject(j.usage) ?? {};
225
251
  updateRoutingFromUsage(rawUsage, state);
226
252
  const resultModel = optionalString(j.model);
@@ -230,14 +256,14 @@ function handleStreamJsonLine(line, onDelta, opts) {
230
256
  state.stopReason = resultStopReason;
231
257
  if (resultStopReason === "refusal") state.refusalWithoutFallback = true;
232
258
  }
233
- const usage = toUsageBreakdown(rawUsage);
259
+ const usage = toUsageBreakdown(ClaudeUsage.parse(rawUsage));
234
260
  const quotaExhausted = text.startsWith("You've hit");
235
261
  const isError = j.is_error === true || j.terminal_reason === "model_error" || subtype !== void 0 && subtype !== "success" || state?.refusalWithoutFallback === true;
236
262
  return {
237
263
  text,
238
264
  usage,
239
- durationMs: typeof j.duration_ms === "number" ? j.duration_ms : 0,
240
- costUsd: typeof j.total_cost_usd === "number" ? j.total_cost_usd : 0,
265
+ durationMs: jsonNumber(j.duration_ms) ?? 0,
266
+ costUsd: jsonNumber(j.total_cost_usd) ?? 0,
241
267
  quotaExhausted,
242
268
  isError,
243
269
  subtype,
@@ -253,4 +279,4 @@ function handleStreamJsonLine(line, onDelta, opts) {
253
279
  //#endregion
254
280
  export { buildStreamJsonInput, handleStreamJsonLine, serializeStreamJsonInput };
255
281
 
256
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLWpzb24tYWRhcHRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9zdHJlYW0tanNvbi1hZGFwdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xhdWRlIENMSSBzdHJlYW0tanNvbiBhZGFwdGVyLlxuICpcbiAqIElucHV0OiBxZ3JpZCBoaXN0b3J5L2lucHV0IC0+IENsYXVkZSBKU09OTCBzdGRpbi5cbiAqIE91dHB1dDogQ2xhdWRlIEpTT05MIHN0ZG91dCAtPiBxZ3JpZCBkZWx0YXMgKyBmaW5hbCByZXN1bHQgbWV0YWRhdGEuXG4gKlxuICogUHJldmlvdXMgY29udmVyc2F0aW9uIGl0ZW1zIGFyZSBmbGF0dGVuZWQgaW50byBvbmUgYXNzaXN0YW50IGNvbnRleHQgbGluZS5cbiAqIFRoZSBvbmx5IGV4ZWN1dGFibGUgdXNlciBsaW5lIGlzIHRoZSBjdXJyZW50IGlucHV0LlxuICovXG5cbmltcG9ydCB7XG4gIHR5cGUgTW9kZWxGYWxsYmFjayxcbiAgdHlwZSBQcm92aWRlclRva2VuVXNhZ2VCcmVha2Rvd24sXG59IGZyb20gXCIuLi9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUsIHR5cGUgVXNlcklucHV0IH0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci10eXBlc1wiO1xuaW1wb3J0IHsgc3RyaXBGZW5jZXMgfSBmcm9tIFwiLi9mZW5jZS1zdHJpcFwiO1xuXG4vLyDilIDilIAg7J6F66ClIOyWtOuMke2EsCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLy8gQ2xhdWRlIHN0cmVhbS1qc29uIOyeheugpSDtlZwg7KSEKEpTT05MKS4gRW52ZWxvcGUgZmllbGRzIGFyZSBhZGRlZCBpbiBjbGF1ZGUtc2Vzc2lvbi5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhdWRlU3RyZWFtSnNvbkxpbmUge1xuICB0eXBlOiBcInVzZXJcIiB8IFwiYXNzaXN0YW50XCI7XG4gIG1lc3NhZ2U6IHtcbiAgICByb2xlOiBcInVzZXJcIiB8IFwiYXNzaXN0YW50XCI7XG4gICAgY29udGVudDogQXJyYXk8eyB0eXBlOiBcInRleHRcIjsgdGV4dDogc3RyaW5nIH0+O1xuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VySW5wdXRUb1RleHQoaW5wdXQ6IEFycmF5PFVzZXJJbnB1dD4pOiBzdHJpbmcge1xuICByZXR1cm4gaW5wdXRcbiAgICAuZmlsdGVyKChpKTogaSBpcyBFeHRyYWN0PFVzZXJJbnB1dCwgeyB0eXBlOiBcInRleHRcIiB9PiA9PiBpLnR5cGUgPT09IFwidGV4dFwiKVxuICAgIC5tYXAoKGkpID0+IGkudGV4dClcbiAgICAuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gdGV4dEJsb2NrKHRleHQ6IHN0cmluZyk6IEFycmF5PHsgdHlwZTogXCJ0ZXh0XCI7IHRleHQ6IHN0cmluZyB9PiB7XG4gIHJldHVybiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dCB9XTtcbn1cblxuLy8gT3BlbkFJIFJlc3BvbnNlcyBpdGVtKGNvbGRIaXN0b3J5IGl0ZW0pIOy1nOyGjCBzaGFwZS5cbi8vIGV4dHJhY3RQcm9tcHRBbmRIaXN0b3J5KGFpLXNkay91dGlscy50cykg6rCAIOunjOuTnOuKlCDtmJXsi506XG4vLyAgIHsgdHlwZTpcIm1lc3NhZ2VcIiwgcm9sZTpcInVzZXJcIiwgY29udGVudDpbe3R5cGU6XCJpbnB1dF90ZXh0XCIsIHRleHR9XSB9XG4vLyAgIHsgdHlwZTpcIm1lc3NhZ2VcIiwgcm9sZTpcImFzc2lzdGFudFwiLCBjb250ZW50Olt7dHlwZTpcIm91dHB1dF90ZXh0XCIsIHRleHR9XSB9XG4vLyAgIHsgdHlwZTpcImZ1bmN0aW9uX2NhbGxcIiwgbmFtZSwgYXJndW1lbnRzLCBjYWxsX2lkIH1cbi8vICAgeyB0eXBlOlwiZnVuY3Rpb25fY2FsbF9vdXRwdXRcIiwgY2FsbF9pZCwgb3V0cHV0IH1cbnR5cGUgUmVzcG9uc2VJdGVtID0geyBba2V5OiBzdHJpbmddOiBKc29uVmFsdWUgfCB1bmRlZmluZWQgfTtcblxuZnVuY3Rpb24gYXNPYmplY3QodjogSnNvblZhbHVlIHwgdW5kZWZpbmVkKTogUmVzcG9uc2VJdGVtIHwgbnVsbCB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHYpID8gKHYgYXMgUmVzcG9uc2VJdGVtKSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlc3BvbnNlSXRlbVRleHQoaXRlbTogUmVzcG9uc2VJdGVtKTogc3RyaW5nIHtcbiAgY29uc3QgY29udGVudCA9IGl0ZW0uY29udGVudDtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRlbnQpKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAubWFwKChjKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSBhc09iamVjdChjKTtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iai50ZXh0ID09PSBcInN0cmluZ1wiID8gb2JqLnRleHQgOiBcIlwiO1xuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuQ29sZEhpc3RvcnkoY29sZEhpc3Rvcnk6IEFycmF5PEpzb25WYWx1ZT4pOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBmb3IgKGNvbnN0IHJhdyBvZiBjb2xkSGlzdG9yeSkge1xuICAgIGNvbnN0IGl0ZW0gPSBhc09iamVjdChyYXcpO1xuICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICBpZiAoaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiBpdGVtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICAgIHBhcnRzLnB1c2goYEFzc2lzdGFudDogJHtyZXNwb25zZUl0ZW1UZXh0KGl0ZW0pfWApO1xuICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiBpdGVtLnJvbGUgPT09IFwidXNlclwiKSB7XG4gICAgICBwYXJ0cy5wdXNoKGBVc2VyOiAke3Jlc3BvbnNlSXRlbVRleHQoaXRlbSl9YCk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiKSB7XG4gICAgICBjb25zdCBuYW1lID0gdHlwZW9mIGl0ZW0ubmFtZSA9PT0gXCJzdHJpbmdcIiA/IGl0ZW0ubmFtZSA6IFwiXCI7XG4gICAgICBjb25zdCBhcmdzID1cbiAgICAgICAgdHlwZW9mIGl0ZW0uYXJndW1lbnRzID09PSBcInN0cmluZ1wiID8gaXRlbS5hcmd1bWVudHMgOiBKU09OLnN0cmluZ2lmeShpdGVtLmFyZ3VtZW50cyA/PyB7fSk7XG4gICAgICBwYXJ0cy5wdXNoKGBUb29sIGNhbGw6ICR7bmFtZX0oJHthcmdzfSlgKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsX291dHB1dFwiKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICB0eXBlb2YgaXRlbS5vdXRwdXQgPT09IFwic3RyaW5nXCIgPyBpdGVtLm91dHB1dCA6IEpTT04uc3RyaW5naWZ5KGl0ZW0ub3V0cHV0ID8/IFwiXCIpO1xuICAgICAgcGFydHMucHVzaChgVG9vbCByZXN1bHQ6ICR7b3V0cHV0fWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFydHMuam9pbihcIlxcblwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RyZWFtSnNvbklucHV0KG9wdHM6IHtcbiAgY29sZEhpc3Rvcnk/OiBBcnJheTxKc29uVmFsdWU+O1xuICBpbnB1dDogQXJyYXk8VXNlcklucHV0Pjtcbn0pOiBBcnJheTxDbGF1ZGVTdHJlYW1Kc29uTGluZT4ge1xuICBjb25zdCBsaW5lczogQXJyYXk8Q2xhdWRlU3RyZWFtSnNvbkxpbmU+ID0gW107XG5cbiAgaWYgKG9wdHMuY29sZEhpc3RvcnkgJiYgb3B0cy5jb2xkSGlzdG9yeS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZmxhdHRlbmVkID0gZmxhdHRlbkNvbGRIaXN0b3J5KG9wdHMuY29sZEhpc3RvcnkpO1xuICAgIGlmIChmbGF0dGVuZWQpIHtcbiAgICAgIGxpbmVzLnB1c2goe1xuICAgICAgICB0eXBlOiBcImFzc2lzdGFudFwiLFxuICAgICAgICBtZXNzYWdlOiB7XG4gICAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgICBjb250ZW50OiB0ZXh0QmxvY2soYFByaW9yIGNvbnZlcnNhdGlvbiBjb250ZXh0OlxcbiR7ZmxhdHRlbmVkfWApLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbGluZXMucHVzaCh7XG4gICAgdHlwZTogXCJ1c2VyXCIsXG4gICAgbWVzc2FnZTogeyByb2xlOiBcInVzZXJcIiwgY29udGVudDogdGV4dEJsb2NrKHVzZXJJbnB1dFRvVGV4dChvcHRzLmlucHV0KSkgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplU3RyZWFtSnNvbklucHV0KGxpbmVzOiBBcnJheTxDbGF1ZGVTdHJlYW1Kc29uTGluZT4pOiBzdHJpbmcge1xuICByZXR1cm4gbGluZXMubWFwKChsKSA9PiBKU09OLnN0cmluZ2lmeShsKSkuam9pbihcIlxcblwiKSArIFwiXFxuXCI7XG59XG5cbi8vIOKUgOKUgCDstpzroKUg7Ja064yR7YSwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIENsYXVkZSBzdGRvdXQoSlNPTkwp7J2EIHFncmlkIGRlbHRhcyArIGZpbmFsIHJlc3VsdCDroZwg67OA7ZmY7ZWc64ukLlxuXG5pbnRlcmZhY2UgQ2xhdWRlVXNhZ2Uge1xuICBpbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gIG91dHB1dF90b2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2Vucz86IG51bWJlcjtcbiAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uPzoge1xuICAgIGVwaGVtZXJhbF81bV9pbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gICAgZXBoZW1lcmFsXzFoX2lucHV0X3Rva2Vucz86IG51bWJlcjtcbiAgfTtcbiAgaXRlcmF0aW9ucz86IEFycmF5PHtcbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIG1vZGVsPzogc3RyaW5nO1xuICB9Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTdHJlYW1SZXN1bHQge1xuICB0ZXh0OiBzdHJpbmc7XG4gIHVzYWdlOiBQcm92aWRlclRva2VuVXNhZ2VCcmVha2Rvd247XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgY29zdFVzZDogbnVtYmVyO1xuICAvLyBxdW90YSDshozsp4QoXCJZb3UndmUgaGl0IC4uLlwiKSDqsJDsp4AuIGRpc3BhdGNoZXIg6rCAIFF1b3RhRXJyb3Ig66GcIOuzgO2ZmC5cbiAgcXVvdGFFeGhhdXN0ZWQ6IGJvb2xlYW47XG4gIC8vIHJlc3VsdC5pc19lcnJvciAvIHRlcm1pbmFsIG1vZGVsX2Vycm9yIOuTsS4gZGlzcGF0Y2hlciDqsIAg7JeQ65+s66GcIOuzgO2ZmC5cbiAgaXNFcnJvcjogYm9vbGVhbjtcbiAgLy8g7KeE64uo7JqpOiBDQyByZXN1bHQg65287J247J2YIHN1YnR5cGUoXCJzdWNjZXNzXCIgfCBcImVycm9yX21heF90dXJuc1wiIHwgLi4uKSDqs7wgdGVybWluYWxfcmVhc29uLlxuICAvLyBpc0Vycm9yIO2MkOyglSDsgqzsnKDrpbwg7JeQ65+sIOuplOyLnOyngOyXkCDrk5zrn6zrgrTquLAg7JyE7ZW0IOuztOyhtO2VnOuLpChTT04tNDk1KS5cbiAgc3VidHlwZT86IHN0cmluZztcbiAgdGVybWluYWxSZWFzb24/OiBzdHJpbmc7XG4gIC8vIOyLpOygnCDstZzsooUg7J2R64u17J2EIOunjOuToCDrqqjrjbguIEZhYmxlIHJlZnVzYWwgZmFsbGJhY2sg65WMIHJlcXVlc3RlZCBtb2RlbCDqs7wg64uk66W064ukLlxuICBzZXJ2ZWRNb2RlbD86IHN0cmluZztcbiAgc3RvcFJlYXNvbj86IHN0cmluZztcbiAgcmVmdXNhbD86IHtcbiAgICBjYXRlZ29yeT86IHN0cmluZztcbiAgICBleHBsYW5hdGlvbj86IHN0cmluZztcbiAgfTtcbiAgbW9kZWxGYWxsYmFja3M/OiBBcnJheTxNb2RlbEZhbGxiYWNrPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUge1xuICBzdHJ1Y3R1cmVkT3V0cHV0VGV4dD86IHN0cmluZztcbiAgc2VydmVkTW9kZWw/OiBzdHJpbmc7XG4gIHN0b3BSZWFzb24/OiBzdHJpbmc7XG4gIHJlZnVzYWw/OiB7XG4gICAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgZXhwbGFuYXRpb24/OiBzdHJpbmc7XG4gIH07XG4gIG1vZGVsRmFsbGJhY2tzPzogQXJyYXk8TW9kZWxGYWxsYmFjaz47XG4gIHJlZnVzYWxXaXRob3V0RmFsbGJhY2s/OiBib29sZWFuO1xufVxuXG4vLyBBbnRocm9waWMgdXNhZ2UgNCDsubTthYzqs6Drpqwg4oaSIFRva2VuVXNhZ2VCcmVha2Rvd24uXG4vLyBBbnRocm9waWMgbmF0aXZlIHVzYWdlIOuKlCBpbnB1dC9jYWNoZV9jcmVhdGlvbi9jYWNoZV9yZWFkIOulvCDshJzroZwg67Cw7YOA7KCB7J24IOy5tO2FjOqzoOumrOuhnCDspIDri6QuXG4vLyDrsJjrqbQgcWdyaWQg64K067aAIO2RnOykgChUb2tlblVzYWdlQnJlYWtkb3duKeqzvCBjb3N0IOqzhOyCsOydgCBpbnB1dFRva2VucyDrpbwgXCLsoITssrQg7J6F66ClXG4vLyAoPSBub24tY2FjaGUgaW5wdXQgKyBjYWNoZSBjcmVhdGlvbiArIGNhY2hlIHJlYWQpXCIg7Jy866GcIOy3qOq4ie2VmOqzoCBjYWNoZWRJbnB1dFRva2Vucy9jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnNcbi8vIOulvCDqt7jspJEg6rCBIOuqq+ycvOuhnCDri6Tsi5wg7ZGc7Iuc7ZWc64ukKE9wZW5BSS9Db2RleCB1c2FnZSDsmYAg6rCZ7J2AIOydmOuvuCkuIOuUsOudvOyEnCDsl6zquLDshJwg7ZWp7LOQIO2RnOykgO2ZlO2VnOuLpC5cbmZ1bmN0aW9uIHRvVXNhZ2VCcmVha2Rvd24odTogQ2xhdWRlVXNhZ2UpOiBQcm92aWRlclRva2VuVXNhZ2VCcmVha2Rvd24ge1xuICBjb25zdCBpbnB1dCA9IHUuaW5wdXRfdG9rZW5zID8/IDA7XG4gIGNvbnN0IGNhY2hlQ3JlYXRlID0gdS5jYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnMgPz8gMDtcbiAgY29uc3QgY2FjaGVSZWFkID0gdS5jYWNoZV9yZWFkX2lucHV0X3Rva2VucyA/PyAwO1xuICBjb25zdCBvdXRwdXQgPSB1Lm91dHB1dF90b2tlbnMgPz8gMDtcbiAgY29uc3QgdG90YWxJbnB1dCA9IGlucHV0ICsgY2FjaGVDcmVhdGUgKyBjYWNoZVJlYWQ7XG4gIGNvbnN0IGNhY2hlQ3JlYXRlNW0gPSB1LmNhY2hlX2NyZWF0aW9uPy5lcGhlbWVyYWxfNW1faW5wdXRfdG9rZW5zO1xuICBjb25zdCBjYWNoZUNyZWF0ZTFoID0gdS5jYWNoZV9jcmVhdGlvbj8uZXBoZW1lcmFsXzFoX2lucHV0X3Rva2VucztcbiAgcmV0dXJuIHtcbiAgICB0b3RhbFRva2VuczogdG90YWxJbnB1dCArIG91dHB1dCxcbiAgICBpbnB1dFRva2VuczogdG90YWxJbnB1dCxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogY2FjaGVSZWFkLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogY2FjaGVDcmVhdGUsXG4gICAgLi4uKHR5cGVvZiBjYWNoZUNyZWF0ZTVtID09PSBcIm51bWJlclwiID8geyBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogY2FjaGVDcmVhdGU1bSB9IDoge30pLFxuICAgIC4uLih0eXBlb2YgY2FjaGVDcmVhdGUxaCA9PT0gXCJudW1iZXJcIiA/IHsgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IGNhY2hlQ3JlYXRlMWggfSA6IHt9KSxcbiAgICBvdXRwdXRUb2tlbnM6IG91dHB1dCxcbiAgICByZWFzb25pbmdPdXRwdXRUb2tlbnM6IDAsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0cnVjdHVyZWRPdXRwdXRUb29sVXNlVGV4dChqOiBSZXNwb25zZUl0ZW0pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtZXNzYWdlID0gYXNPYmplY3Qoai5tZXNzYWdlKTtcbiAgY29uc3QgY29udGVudCA9IG1lc3NhZ2U/LmNvbnRlbnQ7XG4gIGlmICghQXJyYXkuaXNBcnJheShjb250ZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IHJhdyBvZiBjb250ZW50KSB7XG4gICAgY29uc3QgYmxvY2sgPSBhc09iamVjdChyYXcpO1xuICAgIGlmICghYmxvY2spIGNvbnRpbnVlO1xuICAgIGlmIChcbiAgICAgIGJsb2NrLnR5cGUgPT09IFwidG9vbF91c2VcIiAmJlxuICAgICAgYmxvY2submFtZSA9PT0gXCJTdHJ1Y3R1cmVkT3V0cHV0XCIgJiZcbiAgICAgIGJsb2NrLmlucHV0ICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShibG9jay5pbnB1dCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbEV2ZW50TW9kZWwobW9kZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdpdGhvdXRQcm92aWRlciA9IG1vZGVsLnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvXCIpID8gbW9kZWwuc2xpY2UoXCJhbnRocm9waWMvXCIubGVuZ3RoKSA6IG1vZGVsO1xuICByZXR1cm4gd2l0aG91dFByb3ZpZGVyLnJlcGxhY2UoL1xcWzFtXFxdJC8sIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBvcHRpb25hbFN0cmluZyh2YWx1ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5sZW5ndGggPiAwID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlY29yZEZhbGxiYWNrKHN0YXRlOiBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBNb2RlbEZhbGxiYWNrKTogdm9pZCB7XG4gIGlmICghc3RhdGUpIHJldHVybjtcbiAgY29uc3Qgbm9ybWFsaXplZDogTW9kZWxGYWxsYmFjayA9IHtcbiAgICAuLi5mYWxsYmFjayxcbiAgICBmcm9tTW9kZWw6IGNhbm9uaWNhbEV2ZW50TW9kZWwoZmFsbGJhY2suZnJvbU1vZGVsKSxcbiAgICB0b01vZGVsOiBjYW5vbmljYWxFdmVudE1vZGVsKGZhbGxiYWNrLnRvTW9kZWwpLFxuICB9O1xuICBjb25zdCBleGlzdGluZyA9IHN0YXRlLm1vZGVsRmFsbGJhY2tzPy5maW5kKFxuICAgIChpdGVtKSA9PlxuICAgICAgaXRlbS50cmlnZ2VyID09PSBub3JtYWxpemVkLnRyaWdnZXIgJiZcbiAgICAgIGl0ZW0uZnJvbU1vZGVsID09PSBub3JtYWxpemVkLmZyb21Nb2RlbCAmJlxuICAgICAgaXRlbS50b01vZGVsID09PSBub3JtYWxpemVkLnRvTW9kZWwsXG4gICk7XG4gIGlmIChleGlzdGluZykge1xuICAgIGV4aXN0aW5nLmNhdGVnb3J5ID8/PSBub3JtYWxpemVkLmNhdGVnb3J5O1xuICAgIGV4aXN0aW5nLmV4cGxhbmF0aW9uID8/PSBub3JtYWxpemVkLmV4cGxhbmF0aW9uO1xuICB9IGVsc2Uge1xuICAgIChzdGF0ZS5tb2RlbEZhbGxiYWNrcyA/Pz0gW10pLnB1c2gobm9ybWFsaXplZCk7XG4gIH1cbiAgc3RhdGUuc2VydmVkTW9kZWwgPSBub3JtYWxpemVkLnRvTW9kZWw7XG4gIHN0YXRlLnJlZnVzYWxXaXRob3V0RmFsbGJhY2sgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUm91dGluZ0Zyb21Vc2FnZShcbiAgdXNhZ2U6IFJlc3BvbnNlSXRlbSB8IG51bGwsXG4gIHN0YXRlOiBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUgfCB1bmRlZmluZWQsXG4pOiB2b2lkIHtcbiAgaWYgKCFzdGF0ZSB8fCAhdXNhZ2UgfHwgIUFycmF5LmlzQXJyYXkodXNhZ2UuaXRlcmF0aW9ucykpIHJldHVybjtcblxuICBsZXQgcHJldmlvdXNNb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHJhdyBvZiB1c2FnZS5pdGVyYXRpb25zKSB7XG4gICAgY29uc3QgaXRlcmF0aW9uID0gYXNPYmplY3QocmF3KTtcbiAgICBpZiAoIWl0ZXJhdGlvbikgY29udGludWU7XG4gICAgY29uc3QgbW9kZWwgPSBvcHRpb25hbFN0cmluZyhpdGVyYXRpb24ubW9kZWwpO1xuICAgIGNvbnN0IHR5cGUgPSBvcHRpb25hbFN0cmluZyhpdGVyYXRpb24udHlwZSk7XG4gICAgaWYgKCFtb2RlbCkgY29udGludWU7XG4gICAgY29uc3QgY2Fub25pY2FsTW9kZWwgPSBjYW5vbmljYWxFdmVudE1vZGVsKG1vZGVsKTtcbiAgICBpZiAodHlwZSA9PT0gXCJmYWxsYmFja19tZXNzYWdlXCIgJiYgcHJldmlvdXNNb2RlbCkge1xuICAgICAgcmVjb3JkRmFsbGJhY2soc3RhdGUsIHtcbiAgICAgICAgdHJpZ2dlcjogXCJyZWZ1c2FsXCIsXG4gICAgICAgIGZyb21Nb2RlbDogcHJldmlvdXNNb2RlbCxcbiAgICAgICAgdG9Nb2RlbDogY2Fub25pY2FsTW9kZWwsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcHJldmlvdXNNb2RlbCA9IGNhbm9uaWNhbE1vZGVsO1xuICAgIHN0YXRlLnNlcnZlZE1vZGVsID0gY2Fub25pY2FsTW9kZWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlUm91dGluZ0Zyb21NZXNzYWdlKFxuICBtZXNzYWdlOiBSZXNwb25zZUl0ZW0gfCBudWxsLFxuICBzdGF0ZTogQ2xhdWRlU3RyZWFtSnNvblN0YXRlIHwgdW5kZWZpbmVkLFxuKTogdm9pZCB7XG4gIGlmICghc3RhdGUgfHwgIW1lc3NhZ2UpIHJldHVybjtcbiAgY29uc3QgbW9kZWwgPSBvcHRpb25hbFN0cmluZyhtZXNzYWdlLm1vZGVsKTtcbiAgY29uc3QgY2Fub25pY2FsTW9kZWwgPSBtb2RlbCA/IGNhbm9uaWNhbEV2ZW50TW9kZWwobW9kZWwpIDogdW5kZWZpbmVkO1xuICBpZiAoY2Fub25pY2FsTW9kZWwpIHN0YXRlLnNlcnZlZE1vZGVsID0gY2Fub25pY2FsTW9kZWw7XG4gIGNvbnN0IHN0b3BSZWFzb24gPSBvcHRpb25hbFN0cmluZyhtZXNzYWdlLnN0b3BfcmVhc29uKTtcbiAgaWYgKHN0b3BSZWFzb24pIHtcbiAgICBzdGF0ZS5zdG9wUmVhc29uID0gc3RvcFJlYXNvbjtcbiAgICBpZiAoc3RvcFJlYXNvbiA9PT0gXCJyZWZ1c2FsXCIpIHN0YXRlLnJlZnVzYWxXaXRob3V0RmFsbGJhY2sgPSB0cnVlO1xuICAgIGVsc2UgaWYgKHN0YXRlLm1vZGVsRmFsbGJhY2tzPy5zb21lKChmYWxsYmFjaykgPT4gZmFsbGJhY2sudG9Nb2RlbCA9PT0gY2Fub25pY2FsTW9kZWwpKSB7XG4gICAgICBzdGF0ZS5yZWZ1c2FsV2l0aG91dEZhbGxiYWNrID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RvcERldGFpbHMgPSBhc09iamVjdChtZXNzYWdlLnN0b3BfZGV0YWlscyk7XG4gIGlmIChzdG9wRGV0YWlscz8udHlwZSA9PT0gXCJyZWZ1c2FsXCIgfHwgc3RvcFJlYXNvbiA9PT0gXCJyZWZ1c2FsXCIpIHtcbiAgICBzdGF0ZS5yZWZ1c2FsID0ge1xuICAgICAgY2F0ZWdvcnk6IG9wdGlvbmFsU3RyaW5nKHN0b3BEZXRhaWxzPy5jYXRlZ29yeSksXG4gICAgICBleHBsYW5hdGlvbjogb3B0aW9uYWxTdHJpbmcoc3RvcERldGFpbHM/LmV4cGxhbmF0aW9uKSxcbiAgICB9O1xuICB9XG4gIHVwZGF0ZVJvdXRpbmdGcm9tVXNhZ2UoYXNPYmplY3QobWVzc2FnZS51c2FnZSksIHN0YXRlKTtcbn1cblxuLy8gUHJvY2Vzc2VzIG9uZSBDbGF1ZGUgc3Rkb3V0IEpTT05MIGxpbmUuIFJldHVybnMgZmluYWwgcmVzdWx0IG9uIHJlc3VsdCBldmVudC5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVTdHJlYW1Kc29uTGluZShcbiAgbGluZTogc3RyaW5nLFxuICBvbkRlbHRhOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkLFxuICBvcHRzPzogeyBzdHJ1Y3R1cmVkT3V0cHV0PzogYm9vbGVhbjsgc3RhdGU/OiBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUgfSxcbik6IENsYXVkZVN0cmVhbVJlc3VsdCB8IG51bGwge1xuICBjb25zdCBzdHJ1Y3R1cmVkT3V0cHV0ID0gb3B0cz8uc3RydWN0dXJlZE91dHB1dCA/PyBmYWxzZTtcbiAgY29uc3Qgc3RhdGUgPSBvcHRzPy5zdGF0ZTtcbiAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICBpZiAoIXRyaW1tZWQpIHJldHVybiBudWxsO1xuXG4gIGxldCBqOiB7IFtrZXk6IHN0cmluZ106IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB9O1xuICB0cnkge1xuICAgIGogPSBKU09OLnBhcnNlKHRyaW1tZWQpIGFzIHsgW2tleTogc3RyaW5nXTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGoudHlwZSA9PT0gXCJzdHJlYW1fZXZlbnRcIikge1xuICAgIGNvbnN0IGV2ZW50ID0gYXNPYmplY3Qoai5ldmVudCk7XG4gICAgaWYgKGV2ZW50Py50eXBlID09PSBcIm1lc3NhZ2Vfc3RhcnRcIikge1xuICAgICAgdXBkYXRlUm91dGluZ0Zyb21NZXNzYWdlKGFzT2JqZWN0KGV2ZW50Lm1lc3NhZ2UpLCBzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudD8udHlwZSA9PT0gXCJtZXNzYWdlX2RlbHRhXCIpIHtcbiAgICAgIGNvbnN0IGRlbHRhID0gYXNPYmplY3QoZXZlbnQuZGVsdGEpO1xuICAgICAgY29uc3Qgc3RvcFJlYXNvbiA9IG9wdGlvbmFsU3RyaW5nKGRlbHRhPy5zdG9wX3JlYXNvbik7XG4gICAgICBpZiAoc3RhdGUgJiYgc3RvcFJlYXNvbikge1xuICAgICAgICBzdGF0ZS5zdG9wUmVhc29uID0gc3RvcFJlYXNvbjtcbiAgICAgICAgaWYgKHN0b3BSZWFzb24gPT09IFwicmVmdXNhbFwiKSBzdGF0ZS5yZWZ1c2FsV2l0aG91dEZhbGxiYWNrID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnR5cGUgPT09IFwiY29udGVudF9ibG9ja19kZWx0YVwiKSB7XG4gICAgICBjb25zdCBkZWx0YSA9IGFzT2JqZWN0KGV2ZW50LmRlbHRhKTtcbiAgICAgIGlmIChkZWx0YSkge1xuICAgICAgICBpZiAoc3RydWN0dXJlZE91dHB1dCkge1xuICAgICAgICAgIGlmIChkZWx0YS50eXBlID09PSBcImlucHV0X2pzb25fZGVsdGFcIiAmJiB0eXBlb2YgZGVsdGEucGFydGlhbF9qc29uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBvbkRlbHRhKGRlbHRhLnBhcnRpYWxfanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChkZWx0YS50eXBlID09PSBcInRleHRfZGVsdGFcIiAmJiB0eXBlb2YgZGVsdGEudGV4dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgb25EZWx0YShkZWx0YS50ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoai50eXBlID09PSBcInN5c3RlbVwiKSB7XG4gICAgY29uc3Qgc3VidHlwZSA9IG9wdGlvbmFsU3RyaW5nKGouc3VidHlwZSk7XG4gICAgaWYgKHN1YnR5cGUgPT09IFwibW9kZWxfcmVmdXNhbF9mYWxsYmFja1wiKSB7XG4gICAgICBjb25zdCBmcm9tTW9kZWwgPSBvcHRpb25hbFN0cmluZyhqLm9yaWdpbmFsTW9kZWwpID8/IG9wdGlvbmFsU3RyaW5nKGoub3JpZ2luYWxfbW9kZWwpO1xuICAgICAgY29uc3QgdG9Nb2RlbCA9IG9wdGlvbmFsU3RyaW5nKGouZmFsbGJhY2tNb2RlbCkgPz8gb3B0aW9uYWxTdHJpbmcoai5mYWxsYmFja19tb2RlbCk7XG4gICAgICBpZiAoZnJvbU1vZGVsICYmIHRvTW9kZWwpIHtcbiAgICAgICAgcmVjb3JkRmFsbGJhY2soc3RhdGUsIHtcbiAgICAgICAgICB0cmlnZ2VyOiBcInJlZnVzYWxcIixcbiAgICAgICAgICBmcm9tTW9kZWwsXG4gICAgICAgICAgdG9Nb2RlbCxcbiAgICAgICAgICBjYXRlZ29yeTpcbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGouYXBpUmVmdXNhbENhdGVnb3J5KSA/P1xuICAgICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5hcGlfcmVmdXNhbF9jYXRlZ29yeSkgPz9cbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbENhdGVnb3J5KSA/P1xuICAgICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5yZWZ1c2FsX2NhdGVnb3J5KSxcbiAgICAgICAgICBleHBsYW5hdGlvbjpcbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGouYXBpUmVmdXNhbEV4cGxhbmF0aW9uKSA/P1xuICAgICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5hcGlfcmVmdXNhbF9leHBsYW5hdGlvbikgPz9cbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbEV4cGxhbmF0aW9uKSA/P1xuICAgICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5yZWZ1c2FsX2V4cGxhbmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdWJ0eXBlID09PSBcIm1vZGVsX3JlZnVzYWxfbm9fZmFsbGJhY2tcIiAmJiBzdGF0ZSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxNb2RlbCA9IG9wdGlvbmFsU3RyaW5nKGoub3JpZ2luYWxNb2RlbCkgPz8gb3B0aW9uYWxTdHJpbmcoai5vcmlnaW5hbF9tb2RlbCk7XG4gICAgICBpZiAob3JpZ2luYWxNb2RlbCkgc3RhdGUuc2VydmVkTW9kZWwgPSBjYW5vbmljYWxFdmVudE1vZGVsKG9yaWdpbmFsTW9kZWwpO1xuICAgICAgc3RhdGUuc3RvcFJlYXNvbiA9IFwicmVmdXNhbFwiO1xuICAgICAgc3RhdGUucmVmdXNhbFdpdGhvdXRGYWxsYmFjayA9IHRydWU7XG4gICAgICBzdGF0ZS5yZWZ1c2FsID0ge1xuICAgICAgICBjYXRlZ29yeTpcbiAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLmFwaVJlZnVzYWxDYXRlZ29yeSkgPz9cbiAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLmFwaV9yZWZ1c2FsX2NhdGVnb3J5KSA/P1xuICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbENhdGVnb3J5KSA/P1xuICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbF9jYXRlZ29yeSksXG4gICAgICAgIGV4cGxhbmF0aW9uOlxuICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGouYXBpUmVmdXNhbEV4cGxhbmF0aW9uKSA/P1xuICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGouYXBpX3JlZnVzYWxfZXhwbGFuYXRpb24pID8/XG4gICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5yZWZ1c2FsRXhwbGFuYXRpb24pID8/XG4gICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5yZWZ1c2FsX2V4cGxhbmF0aW9uKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGoudHlwZSA9PT0gXCJhc3Npc3RhbnRcIikge1xuICAgIHVwZGF0ZVJvdXRpbmdGcm9tTWVzc2FnZShhc09iamVjdChqLm1lc3NhZ2UpLCBzdGF0ZSk7XG4gICAgaWYgKHN0cnVjdHVyZWRPdXRwdXQgJiYgc3RhdGUgJiYgc3RhdGUuc3RydWN0dXJlZE91dHB1dFRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdGV4dCA9IHN0cnVjdHVyZWRPdXRwdXRUb29sVXNlVGV4dChqKTtcbiAgICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIHN0YXRlLnN0cnVjdHVyZWRPdXRwdXRUZXh0ID0gdGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoai50eXBlID09PSBcInJlc3VsdFwiKSB7XG4gICAgY29uc3Qgc3VidHlwZSA9IHR5cGVvZiBqLnN1YnR5cGUgPT09IFwic3RyaW5nXCIgPyBqLnN1YnR5cGUgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGVybWluYWxSZWFzb24gPSB0eXBlb2Ygai50ZXJtaW5hbF9yZWFzb24gPT09IFwic3RyaW5nXCIgPyBqLnRlcm1pbmFsX3JlYXNvbiA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXN1bHRTdWNjZWVkZWQgPVxuICAgICAgai5pc19lcnJvciAhPT0gdHJ1ZSAmJlxuICAgICAgdGVybWluYWxSZWFzb24gIT09IFwibW9kZWxfZXJyb3JcIiAmJlxuICAgICAgKHN1YnR5cGUgPT09IHVuZGVmaW5lZCB8fCBzdWJ0eXBlID09PSBcInN1Y2Nlc3NcIik7XG4gICAgbGV0IHRleHQ6IHN0cmluZztcbiAgICBjb25zdCBwcmVzZXJ2ZWRTdHJ1Y3R1cmVkT3V0cHV0ID0gc3RydWN0dXJlZE91dHB1dCA/IHN0YXRlPy5zdHJ1Y3R1cmVkT3V0cHV0VGV4dCA6IHVuZGVmaW5lZDtcbiAgICAvLyBDbGF1ZGUgQ29kZeuKlCBTdHJ1Y3R1cmVkT3V0cHV0IOyKpO2CpOuniCDqsoDspp0g7Iuk7YyoIO2bhCDrgrTrtoAg7J6s7Iuc64+E66W8IO2VoCDsiJgg7J6I64ukLiBhc3Npc3RhbnRcbiAgICAvLyDsnbTrsqTtirjsnZgg7LKrIHRvb2wgaW5wdXTsnYAg6rGw7KCI65CcIOyLnOuPhOydvCDsiJgg7J6I7Jy866+A66GcLCDshLHqs7UgcmVzdWx06rCAIOygnOqzte2VnCDstZzsooUg6rKA7Kad6rCS7J2EXG4gICAgLy8g7Jqw7ISg7ZWc64ukLiDssqsg7J6F66ClIOuztOyhtOqwkuydgCBtYXhfdHVybnMvcmV0cnkg7LSI6rO87LKY65+8IOyEseqztSByZXN1bHTqsIAg7JeG64qUIOynhOuLqCDqsr3roZzsmqnsnbTri6QuXG4gICAgaWYgKHN0cnVjdHVyZWRPdXRwdXQgJiYgcmVzdWx0U3VjY2VlZGVkICYmIGouc3RydWN0dXJlZF9vdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dCA9IEpTT04uc3RyaW5naWZ5KGouc3RydWN0dXJlZF9vdXRwdXQpO1xuICAgIH0gZWxzZSBpZiAocHJlc2VydmVkU3RydWN0dXJlZE91dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZXh0ID0gcHJlc2VydmVkU3RydWN0dXJlZE91dHB1dDtcbiAgICB9IGVsc2UgaWYgKGouc3RydWN0dXJlZF9vdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dCA9IEpTT04uc3RyaW5naWZ5KGouc3RydWN0dXJlZF9vdXRwdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZXh0ID0gc3RyaXBGZW5jZXModHlwZW9mIGoucmVzdWx0ID09PSBcInN0cmluZ1wiID8gai5yZXN1bHQgOiBcIlwiKTtcbiAgICB9XG5cbiAgICBjb25zdCByYXdVc2FnZSA9IGFzT2JqZWN0KGoudXNhZ2UpID8/IHt9O1xuICAgIHVwZGF0ZVJvdXRpbmdGcm9tVXNhZ2UocmF3VXNhZ2UsIHN0YXRlKTtcbiAgICBjb25zdCByZXN1bHRNb2RlbCA9IG9wdGlvbmFsU3RyaW5nKGoubW9kZWwpO1xuICAgIGlmIChzdGF0ZSAmJiByZXN1bHRNb2RlbCAmJiAhc3RhdGUuc2VydmVkTW9kZWwpIHtcbiAgICAgIHN0YXRlLnNlcnZlZE1vZGVsID0gY2Fub25pY2FsRXZlbnRNb2RlbChyZXN1bHRNb2RlbCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdFN0b3BSZWFzb24gPSBvcHRpb25hbFN0cmluZyhqLnN0b3BfcmVhc29uKTtcbiAgICBpZiAoc3RhdGUgJiYgcmVzdWx0U3RvcFJlYXNvbikge1xuICAgICAgc3RhdGUuc3RvcFJlYXNvbiA9IHJlc3VsdFN0b3BSZWFzb247XG4gICAgICBpZiAocmVzdWx0U3RvcFJlYXNvbiA9PT0gXCJyZWZ1c2FsXCIpIHN0YXRlLnJlZnVzYWxXaXRob3V0RmFsbGJhY2sgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB1c2FnZSA9IHRvVXNhZ2VCcmVha2Rvd24ocmF3VXNhZ2UgYXMgQ2xhdWRlVXNhZ2UpO1xuICAgIGNvbnN0IHF1b3RhRXhoYXVzdGVkID0gdGV4dC5zdGFydHNXaXRoKFwiWW91J3ZlIGhpdFwiKTtcblxuICAgIC8vIFNPTi00OTU6IOu5hOygleyDgSDsooXro4woZXJyb3JfbWF4X3N0cnVjdHVyZWRfb3V0cHV0X3JldHJpZXMg65OxKeuKlCDsoJXsp4HtlZjqsowg7JeQ65+s66GcIOyymOumrO2VnOuLpC5cbiAgICAvLyBDQyBzdHJ1Y3R1cmVkIG91dHB1dCDsnYAgY29uc3RyYWluZWQgZGVjb2Rpbmcg7J20IOyVhOuLiOudvCBcInRvb2wgaW5wdXQg7IOd7ISxIO2bhCDsgqztm4QgQUpWIOqygOymnVwi7J206528XG4gICAgLy8g66qo64247J20IOqwgOuBlCBwbGFjZWhvbGRlcigkUEFSQU1FVEVSX05BTUUpwrfqsbDrtoAoXCJqdXN0IGtpZGRpbmdcIinCt+2VhOuTnCDriITrnb0oYWR2YW5jZSkg6rCZ7J2AIOuwnOyekS9cbiAgICAvLyDrtojsmYTsoIQg7Lac66Cl7J2EIOuCuOuLpC4g7J2066W8IFwi6rGw7J2YIOunnuyVmOycvOuLiCDsgrTrpqzsnpBcIuqzoCDtnZjrpqzrqbQg7YG065287J207Ja47Yq4IOqygOymneyXkOyEnCDquajsp4DqsbDrgpgo7ZWE65OcIOuIhOudvSlcbiAgICAvLyDsk7DroIjquLDqsIAg7IOI7Ja0IOuCmOqwhOuLpCjsi6TsuKEgMTE2NzQvMTE2NzUpLiDslYzroKTsp4QgYmVzdCBwcmFjdGljZShyZWZ1c2FsL2RlZ2VuZXJhdGUgb3V0cHV0IOydgCDsgrTrpqzsp4BcbiAgICAvLyDrp5Dqs6AgZ3JhY2VmdWwgZXJyb3Ip64yA66GcLCBzdWJ0eXBlICE9IHN1Y2Nlc3Mg64qUIOq3uOuMgOuhnCDsl5Drn6zroZwg65GU64ukLiDtgbTrnbzsnbTslrjtirjqsIAg6re4IO2EtOydhCDsi6TtjKjroZxcbiAgICAvLyDri6Tro6jqsowg7ZWc64ukKOyKpO2KuOumvOydtOudvCDsnpDrj5kg7J6s7Iuc64+EIOyXhuydjCDigJQg7Iuc6rCEIDLrsLAg67Cp7KeAKS5cbiAgICBjb25zdCBpc0Vycm9yID1cbiAgICAgIGouaXNfZXJyb3IgPT09IHRydWUgfHxcbiAgICAgIGoudGVybWluYWxfcmVhc29uID09PSBcIm1vZGVsX2Vycm9yXCIgfHxcbiAgICAgIChzdWJ0eXBlICE9PSB1bmRlZmluZWQgJiYgc3VidHlwZSAhPT0gXCJzdWNjZXNzXCIpIHx8XG4gICAgICBzdGF0ZT8ucmVmdXNhbFdpdGhvdXRGYWxsYmFjayA9PT0gdHJ1ZTtcblxuICAgIHJldHVybiB7XG4gICAgICB0ZXh0LFxuICAgICAgdXNhZ2UsXG4gICAgICBkdXJhdGlvbk1zOiB0eXBlb2Ygai5kdXJhdGlvbl9tcyA9PT0gXCJudW1iZXJcIiA/IGouZHVyYXRpb25fbXMgOiAwLFxuICAgICAgY29zdFVzZDogdHlwZW9mIGoudG90YWxfY29zdF91c2QgPT09IFwibnVtYmVyXCIgPyBqLnRvdGFsX2Nvc3RfdXNkIDogMCxcbiAgICAgIHF1b3RhRXhoYXVzdGVkLFxuICAgICAgaXNFcnJvcixcbiAgICAgIHN1YnR5cGUsXG4gICAgICB0ZXJtaW5hbFJlYXNvbixcbiAgICAgIHNlcnZlZE1vZGVsOiBzdGF0ZT8uc2VydmVkTW9kZWwsXG4gICAgICBzdG9wUmVhc29uOiBzdGF0ZT8uc3RvcFJlYXNvbixcbiAgICAgIHJlZnVzYWw6IHN0YXRlPy5yZWZ1c2FsLFxuICAgICAgbW9kZWxGYWxsYmFja3M6IHN0YXRlPy5tb2RlbEZhbGxiYWNrcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBNEJBLFNBQVMsZ0JBQWdCLE9BQWlDO0NBQ3hELE9BQU8sTUFDSixRQUFRLE1BQWlELEVBQUUsU0FBUyxNQUFNLENBQUMsQ0FDM0UsS0FBSyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQ2xCLEtBQUssSUFBSTtBQUNkO0FBRUEsU0FBUyxVQUFVLE1BQXFEO0NBQ3RFLE9BQU8sQ0FBQztFQUFFLE1BQU07RUFBUTtDQUFLLENBQUM7QUFDaEM7QUFVQSxTQUFTLFNBQVMsR0FBK0M7Q0FDL0QsT0FBTyxPQUFPLE1BQU0sWUFBWSxNQUFNLFFBQVEsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFLLElBQXFCO0FBQzFGO0FBRUEsU0FBUyxpQkFBaUIsTUFBNEI7Q0FDcEQsTUFBTSxVQUFVLEtBQUs7Q0FDckIsSUFBSSxDQUFDLE1BQU0sUUFBUSxPQUFPLEdBQUcsT0FBTztDQUNwQyxPQUFPLFFBQ0osS0FBSyxNQUFNO0VBQ1YsTUFBTSxNQUFNLFNBQVMsQ0FBQztFQUN0QixPQUFPLE9BQU8sT0FBTyxJQUFJLFNBQVMsV0FBVyxJQUFJLE9BQU87Q0FDMUQsQ0FBQyxDQUFDLENBQ0QsT0FBTyxPQUFPLENBQUMsQ0FDZixLQUFLLElBQUk7QUFDZDtBQUVBLFNBQVMsbUJBQW1CLGFBQXVDO0NBQ2pFLE1BQU0sUUFBdUIsQ0FBQztDQUM5QixLQUFLLE1BQU0sT0FB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
282
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLWpzb24tYWRhcHRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9zdHJlYW0tanNvbi1hZGFwdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xhdWRlIENMSSBzdHJlYW0tanNvbiBhZGFwdGVyLlxuICpcbiAqIElucHV0OiBxZ3JpZCBoaXN0b3J5L2lucHV0IC0+IENsYXVkZSBKU09OTCBzdGRpbi5cbiAqIE91dHB1dDogQ2xhdWRlIEpTT05MIHN0ZG91dCAtPiBxZ3JpZCBkZWx0YXMgKyBmaW5hbCByZXN1bHQgbWV0YWRhdGEuXG4gKlxuICogUHJldmlvdXMgY29udmVyc2F0aW9uIGl0ZW1zIGFyZSBmbGF0dGVuZWQgaW50byBvbmUgYXNzaXN0YW50IGNvbnRleHQgbGluZS5cbiAqIFRoZSBvbmx5IGV4ZWN1dGFibGUgdXNlciBsaW5lIGlzIHRoZSBjdXJyZW50IGlucHV0LlxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7XG4gIHR5cGUgTW9kZWxGYWxsYmFjayxcbiAgdHlwZSBQcm92aWRlclRva2VuVXNhZ2VCcmVha2Rvd24sXG59IGZyb20gXCIuLi9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHtcbiAgaXNKc29uT2JqZWN0LFxuICB0eXBlIEpzb25PYmplY3QsXG4gIGpzb25OdW1iZXIsXG4gIGpzb25TdHJpbmcsXG4gIHR5cGUgSnNvblZhbHVlLFxuICB0eXBlIFVzZXJJbnB1dCxcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci10eXBlc1wiO1xuaW1wb3J0IHsgc3RyaXBGZW5jZXMgfSBmcm9tIFwiLi9mZW5jZS1zdHJpcFwiO1xuXG4vLyDilIDilIAg7J6F66ClIOyWtOuMke2EsCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLy8gQ2xhdWRlIHN0cmVhbS1qc29uIOyeheugpSDtlZwg7KSEKEpTT05MKS4gRW52ZWxvcGUgZmllbGRzIGFyZSBhZGRlZCBpbiBjbGF1ZGUtc2Vzc2lvbi5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhdWRlU3RyZWFtSnNvbkxpbmUge1xuICB0eXBlOiBcInVzZXJcIiB8IFwiYXNzaXN0YW50XCI7XG4gIG1lc3NhZ2U6IHtcbiAgICByb2xlOiBcInVzZXJcIiB8IFwiYXNzaXN0YW50XCI7XG4gICAgY29udGVudDogQXJyYXk8eyB0eXBlOiBcInRleHRcIjsgdGV4dDogc3RyaW5nIH0+O1xuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VySW5wdXRUb1RleHQoaW5wdXQ6IEFycmF5PFVzZXJJbnB1dD4pOiBzdHJpbmcge1xuICByZXR1cm4gaW5wdXQuZmxhdE1hcCgoaSkgPT4gKGkudHlwZSA9PT0gXCJ0ZXh0XCIgPyBbaS50ZXh0XSA6IFtdKSkuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gdGV4dEJsb2NrKHRleHQ6IHN0cmluZyk6IEFycmF5PHsgdHlwZTogXCJ0ZXh0XCI7IHRleHQ6IHN0cmluZyB9PiB7XG4gIHJldHVybiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dCB9XTtcbn1cblxuLy8gT3BlbkFJIFJlc3BvbnNlcyBpdGVtKGNvbGRIaXN0b3J5IGl0ZW0pIOy1nOyGjCBzaGFwZS5cbi8vIGV4dHJhY3RQcm9tcHRBbmRIaXN0b3J5KGFpLXNkay91dGlscy50cykg6rCAIOunjOuTnOuKlCDtmJXsi506XG4vLyAgIHsgdHlwZTpcIm1lc3NhZ2VcIiwgcm9sZTpcInVzZXJcIiwgY29udGVudDpbe3R5cGU6XCJpbnB1dF90ZXh0XCIsIHRleHR9XSB9XG4vLyAgIHsgdHlwZTpcIm1lc3NhZ2VcIiwgcm9sZTpcImFzc2lzdGFudFwiLCBjb250ZW50Olt7dHlwZTpcIm91dHB1dF90ZXh0XCIsIHRleHR9XSB9XG4vLyAgIHsgdHlwZTpcImZ1bmN0aW9uX2NhbGxcIiwgbmFtZSwgYXJndW1lbnRzLCBjYWxsX2lkIH1cbi8vICAgeyB0eXBlOlwiZnVuY3Rpb25fY2FsbF9vdXRwdXRcIiwgY2FsbF9pZCwgb3V0cHV0IH1cbnR5cGUgUmVzcG9uc2VJdGVtID0gSnNvbk9iamVjdDtcblxuZnVuY3Rpb24gYXNPYmplY3QodjogSnNvblZhbHVlIHwgdW5kZWZpbmVkKTogUmVzcG9uc2VJdGVtIHwgbnVsbCB7XG4gIHJldHVybiBpc0pzb25PYmplY3QodikgPyB2IDogbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVzcG9uc2VJdGVtVGV4dChpdGVtOiBSZXNwb25zZUl0ZW0pOiBzdHJpbmcge1xuICBjb25zdCBjb250ZW50ID0gaXRlbS5jb250ZW50O1xuXG4gIGlmICghQXJyYXkuaXNBcnJheShjb250ZW50KSkgcmV0dXJuIFwiXCI7XG5cbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAubWFwKChjKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSBhc09iamVjdChjKTtcblxuICAgICAgcmV0dXJuIChvYmogJiYganNvblN0cmluZyhvYmoudGV4dCkpID8/IFwiXCI7XG4gICAgfSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmpvaW4oXCJcXG5cIik7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5Db2xkSGlzdG9yeShjb2xkSGlzdG9yeTogQXJyYXk8SnNvblZhbHVlPik6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnRzOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgZm9yIChjb25zdCByYXcgb2YgY29sZEhpc3RvcnkpIHtcbiAgICBjb25zdCBpdGVtID0gYXNPYmplY3QocmF3KTtcblxuICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICBpZiAoaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiBpdGVtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICAgIHBhcnRzLnB1c2goYEFzc2lzdGFudDogJHtyZXNwb25zZUl0ZW1UZXh0KGl0ZW0pfWApO1xuICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiBpdGVtLnJvbGUgPT09IFwidXNlclwiKSB7XG4gICAgICBwYXJ0cy5wdXNoKGBVc2VyOiAke3Jlc3BvbnNlSXRlbVRleHQoaXRlbSl9YCk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiKSB7XG4gICAgICBjb25zdCBuYW1lID0ganNvblN0cmluZyhpdGVtLm5hbWUpID8/IFwiXCI7XG4gICAgICBjb25zdCBhcmdzID0ganNvblN0cmluZyhpdGVtLmFyZ3VtZW50cykgPz8gSlNPTi5zdHJpbmdpZnkoaXRlbS5hcmd1bWVudHMgPz8ge30pO1xuXG4gICAgICBwYXJ0cy5wdXNoKGBUb29sIGNhbGw6ICR7bmFtZX0oJHthcmdzfSlgKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsX291dHB1dFwiKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBqc29uU3RyaW5nKGl0ZW0ub3V0cHV0KSA/PyBKU09OLnN0cmluZ2lmeShpdGVtLm91dHB1dCA/PyBcIlwiKTtcblxuICAgICAgcGFydHMucHVzaChgVG9vbCByZXN1bHQ6ICR7b3V0cHV0fWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKFwiXFxuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdHJlYW1Kc29uSW5wdXQob3B0czoge1xuICBjb2xkSGlzdG9yeT86IEFycmF5PEpzb25WYWx1ZT47XG4gIGlucHV0OiBBcnJheTxVc2VySW5wdXQ+O1xufSk6IEFycmF5PENsYXVkZVN0cmVhbUpzb25MaW5lPiB7XG4gIGNvbnN0IGxpbmVzOiBBcnJheTxDbGF1ZGVTdHJlYW1Kc29uTGluZT4gPSBbXTtcblxuICBpZiAob3B0cy5jb2xkSGlzdG9yeSAmJiBvcHRzLmNvbGRIaXN0b3J5Lmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBmbGF0dGVuZWQgPSBmbGF0dGVuQ29sZEhpc3Rvcnkob3B0cy5jb2xkSGlzdG9yeSk7XG5cbiAgICBpZiAoZmxhdHRlbmVkKSB7XG4gICAgICBsaW5lcy5wdXNoKHtcbiAgICAgICAgdHlwZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgbWVzc2FnZToge1xuICAgICAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgICAgICAgY29udGVudDogdGV4dEJsb2NrKGBQcmlvciBjb252ZXJzYXRpb24gY29udGV4dDpcXG4ke2ZsYXR0ZW5lZH1gKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGxpbmVzLnB1c2goe1xuICAgIHR5cGU6IFwidXNlclwiLFxuICAgIG1lc3NhZ2U6IHsgcm9sZTogXCJ1c2VyXCIsIGNvbnRlbnQ6IHRleHRCbG9jayh1c2VySW5wdXRUb1RleHQob3B0cy5pbnB1dCkpIH0sXG4gIH0pO1xuXG4gIHJldHVybiBsaW5lcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVN0cmVhbUpzb25JbnB1dChsaW5lczogQXJyYXk8Q2xhdWRlU3RyZWFtSnNvbkxpbmU+KTogc3RyaW5nIHtcbiAgcmV0dXJuIGxpbmVzLm1hcCgobCkgPT4gSlNPTi5zdHJpbmdpZnkobCkpLmpvaW4oXCJcXG5cIikgKyBcIlxcblwiO1xufVxuXG4vLyDilIDilIAg7Lac66ClIOyWtOuMke2EsCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vXG4vLyBDbGF1ZGUgc3Rkb3V0KEpTT05MKeydhCBxZ3JpZCBkZWx0YXMgKyBmaW5hbCByZXN1bHQg66GcIOuzgO2ZmO2VnOuLpC5cblxuLy8gVXNhZ2UgZmllbGRzIGFyZSByZWFkIG9ubHkgd2hlbiB0aGV5IGhvbGQgbnVtYmVyczsgYW55dGhpbmcgZWxzZSBjb3VudHMgYXMgYWJzZW50LlxuY29uc3Qgb3B0aW9uYWxDb3VudCA9IHoubnVtYmVyKCkub3B0aW9uYWwoKS5jYXRjaCh1bmRlZmluZWQpO1xuXG5jb25zdCBDbGF1ZGVVc2FnZSA9IHoub2JqZWN0KHtcbiAgaW5wdXRfdG9rZW5zOiBvcHRpb25hbENvdW50LFxuICBvdXRwdXRfdG9rZW5zOiBvcHRpb25hbENvdW50LFxuICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6IG9wdGlvbmFsQ291bnQsXG4gIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiBvcHRpb25hbENvdW50LFxuICBjYWNoZV9jcmVhdGlvbjogelxuICAgIC5vYmplY3QoeyBlcGhlbWVyYWxfNW1faW5wdXRfdG9rZW5zOiBvcHRpb25hbENvdW50LCBlcGhlbWVyYWxfMWhfaW5wdXRfdG9rZW5zOiBvcHRpb25hbENvdW50IH0pXG4gICAgLm9wdGlvbmFsKClcbiAgICAuY2F0Y2godW5kZWZpbmVkKSxcbn0pO1xuXG50eXBlIENsYXVkZVVzYWdlID0gei5pbmZlcjx0eXBlb2YgQ2xhdWRlVXNhZ2U+O1xuXG5leHBvcnQgaW50ZXJmYWNlIENsYXVkZVN0cmVhbVJlc3VsdCB7XG4gIHRleHQ6IHN0cmluZztcbiAgdXNhZ2U6IFByb3ZpZGVyVG9rZW5Vc2FnZUJyZWFrZG93bjtcbiAgZHVyYXRpb25NczogbnVtYmVyO1xuICBjb3N0VXNkOiBudW1iZXI7XG4gIC8vIHF1b3RhIOyGjOynhChcIllvdSd2ZSBoaXQgLi4uXCIpIOqwkOyngC4gZGlzcGF0Y2hlciDqsIAgUXVvdGFFcnJvciDroZwg67OA7ZmYLlxuICBxdW90YUV4aGF1c3RlZDogYm9vbGVhbjtcbiAgLy8gcmVzdWx0LmlzX2Vycm9yIC8gdGVybWluYWwgbW9kZWxfZXJyb3Ig65OxLiBkaXNwYXRjaGVyIOqwgCDsl5Drn6zroZwg67OA7ZmYLlxuICBpc0Vycm9yOiBib29sZWFuO1xuICAvLyDsp4Tri6jsmqk6IENDIHJlc3VsdCDrnbzsnbjsnZggc3VidHlwZShcInN1Y2Nlc3NcIiB8IFwiZXJyb3JfbWF4X3R1cm5zXCIgfCAuLi4pIOqzvCB0ZXJtaW5hbF9yZWFzb24uXG4gIC8vIGlzRXJyb3Ig7YyQ7KCVIOyCrOycoOulvCDsl5Drn6wg66mU7Iuc7KeA7JeQIOuTnOufrOuCtOq4sCDsnITtlbQg67O07KG07ZWc64ukKFNPTi00OTUpLlxuICBzdWJ0eXBlPzogc3RyaW5nO1xuICB0ZXJtaW5hbFJlYXNvbj86IHN0cmluZztcbiAgLy8g7Iuk7KCcIOy1nOyihSDsnZHri7XsnYQg66eM65OgIOuqqOuNuC4gRmFibGUgcmVmdXNhbCBmYWxsYmFjayDrlYwgcmVxdWVzdGVkIG1vZGVsIOqzvCDri6TrpbTri6QuXG4gIHNlcnZlZE1vZGVsPzogc3RyaW5nO1xuICBzdG9wUmVhc29uPzogc3RyaW5nO1xuICByZWZ1c2FsPzoge1xuICAgIGNhdGVnb3J5Pzogc3RyaW5nO1xuICAgIGV4cGxhbmF0aW9uPzogc3RyaW5nO1xuICB9O1xuICBtb2RlbEZhbGxiYWNrcz86IEFycmF5PE1vZGVsRmFsbGJhY2s+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsYXVkZVN0cmVhbUpzb25TdGF0ZSB7XG4gIHN0cnVjdHVyZWRPdXRwdXRUZXh0Pzogc3RyaW5nO1xuICBzZXJ2ZWRNb2RlbD86IHN0cmluZztcbiAgc3RvcFJlYXNvbj86IHN0cmluZztcbiAgcmVmdXNhbD86IHtcbiAgICBjYXRlZ29yeT86IHN0cmluZztcbiAgICBleHBsYW5hdGlvbj86IHN0cmluZztcbiAgfTtcbiAgbW9kZWxGYWxsYmFja3M/OiBBcnJheTxNb2RlbEZhbGxiYWNrPjtcbiAgcmVmdXNhbFdpdGhvdXRGYWxsYmFjaz86IGJvb2xlYW47XG59XG5cbi8vIEFudGhyb3BpYyB1c2FnZSA0IOy5tO2FjOqzoOumrCDihpIgVG9rZW5Vc2FnZUJyZWFrZG93bi5cbi8vIEFudGhyb3BpYyBuYXRpdmUgdXNhZ2Ug64qUIGlucHV0L2NhY2hlX2NyZWF0aW9uL2NhY2hlX3JlYWQg66W8IOyEnOuhnCDrsLDtg4DsoIHsnbgg7Lm07YWM6rOg66as66GcIOykgOuLpC5cbi8vIOuwmOuptCBxZ3JpZCDrgrTrtoAg7ZGc7KSAKFRva2VuVXNhZ2VCcmVha2Rvd24p6rO8IGNvc3Qg6rOE7IKw7J2AIGlucHV0VG9rZW5zIOulvCBcIuyghOyytCDsnoXroKVcbi8vICg9IG5vbi1jYWNoZSBpbnB1dCArIGNhY2hlIGNyZWF0aW9uICsgY2FjaGUgcmVhZClcIiDsnLzroZwg7Leo6riJ7ZWY6rOgIGNhY2hlZElucHV0VG9rZW5zL2NhY2hlQ3JlYXRpb25JbnB1dFRva2Vuc1xuLy8g66W8IOq3uOykkSDqsIEg66qr7Jy866GcIOuLpOyLnCDtkZzsi5ztlZzri6QoT3BlbkFJL0NvZGV4IHVzYWdlIOyZgCDqsJnsnYAg7J2Y66+4KS4g65Sw65287IScIOyXrOq4sOyEnCDtlanss5Ag7ZGc7KSA7ZmU7ZWc64ukLlxuZnVuY3Rpb24gdG9Vc2FnZUJyZWFrZG93bih1OiBDbGF1ZGVVc2FnZSk6IFByb3ZpZGVyVG9rZW5Vc2FnZUJyZWFrZG93biB7XG4gIGNvbnN0IGlucHV0ID0gdS5pbnB1dF90b2tlbnMgPz8gMDtcbiAgY29uc3QgY2FjaGVDcmVhdGUgPSB1LmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyA/PyAwO1xuICBjb25zdCBjYWNoZVJlYWQgPSB1LmNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zID8/IDA7XG4gIGNvbnN0IG91dHB1dCA9IHUub3V0cHV0X3Rva2VucyA/PyAwO1xuICBjb25zdCB0b3RhbElucHV0ID0gaW5wdXQgKyBjYWNoZUNyZWF0ZSArIGNhY2hlUmVhZDtcbiAgY29uc3QgY2FjaGVDcmVhdGU1bSA9IHUuY2FjaGVfY3JlYXRpb24/LmVwaGVtZXJhbF81bV9pbnB1dF90b2tlbnM7XG4gIGNvbnN0IGNhY2hlQ3JlYXRlMWggPSB1LmNhY2hlX2NyZWF0aW9uPy5lcGhlbWVyYWxfMWhfaW5wdXRfdG9rZW5zO1xuXG4gIGNvbnN0IHVzYWdlOiBQcm92aWRlclRva2VuVXNhZ2VCcmVha2Rvd24gPSB7XG4gICAgdG90YWxUb2tlbnM6IHRvdGFsSW5wdXQgKyBvdXRwdXQsXG4gICAgaW5wdXRUb2tlbnM6IHRvdGFsSW5wdXQsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IGNhY2hlUmVhZCxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IGNhY2hlQ3JlYXRlLFxuICAgIG91dHB1dFRva2Vuczogb3V0cHV0LFxuICAgIHJlYXNvbmluZ091dHB1dFRva2VuczogMCxcbiAgfTtcblxuICBpZiAoY2FjaGVDcmVhdGU1bSAhPT0gdW5kZWZpbmVkKSB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSA9IGNhY2hlQ3JlYXRlNW07XG5cbiAgaWYgKGNhY2hlQ3JlYXRlMWggIT09IHVuZGVmaW5lZCkgdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWggPSBjYWNoZUNyZWF0ZTFoO1xuXG4gIHJldHVybiB1c2FnZTtcbn1cblxuZnVuY3Rpb24gc3RydWN0dXJlZE91dHB1dFRvb2xVc2VUZXh0KGo6IFJlc3BvbnNlSXRlbSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBhc09iamVjdChqLm1lc3NhZ2UpO1xuICBjb25zdCBjb250ZW50ID0gbWVzc2FnZT8uY29udGVudDtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCByYXcgb2YgY29udGVudCkge1xuICAgIGNvbnN0IGJsb2NrID0gYXNPYmplY3QocmF3KTtcblxuICAgIGlmICghYmxvY2spIGNvbnRpbnVlO1xuXG4gICAgaWYgKFxuICAgICAgYmxvY2sudHlwZSA9PT0gXCJ0b29sX3VzZVwiICYmXG4gICAgICBibG9jay5uYW1lID09PSBcIlN0cnVjdHVyZWRPdXRwdXRcIiAmJlxuICAgICAgYmxvY2suaW5wdXQgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGJsb2NrLmlucHV0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBjYW5vbmljYWxFdmVudE1vZGVsKG1vZGVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB3aXRob3V0UHJvdmlkZXIgPSBtb2RlbC5zdGFydHNXaXRoKFwiYW50aHJvcGljL1wiKSA/IG1vZGVsLnNsaWNlKFwiYW50aHJvcGljL1wiLmxlbmd0aCkgOiBtb2RlbDtcblxuICByZXR1cm4gd2l0aG91dFByb3ZpZGVyLnJlcGxhY2UoL1xcWzFtXFxdJC8sIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBvcHRpb25hbFN0cmluZyh2YWx1ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGpzb25TdHJpbmcodmFsdWUpIHx8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVjb3JkRmFsbGJhY2soc3RhdGU6IENsYXVkZVN0cmVhbUpzb25TdGF0ZSB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IE1vZGVsRmFsbGJhY2spOiB2b2lkIHtcbiAgaWYgKCFzdGF0ZSkgcmV0dXJuO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWQ6IE1vZGVsRmFsbGJhY2sgPSB7XG4gICAgLi4uZmFsbGJhY2ssXG4gICAgZnJvbU1vZGVsOiBjYW5vbmljYWxFdmVudE1vZGVsKGZhbGxiYWNrLmZyb21Nb2RlbCksXG4gICAgdG9Nb2RlbDogY2Fub25pY2FsRXZlbnRNb2RlbChmYWxsYmFjay50b01vZGVsKSxcbiAgfTtcblxuICBjb25zdCBleGlzdGluZyA9IHN0YXRlLm1vZGVsRmFsbGJhY2tzPy5maW5kKFxuICAgIChpdGVtKSA9PlxuICAgICAgaXRlbS50cmlnZ2VyID09PSBub3JtYWxpemVkLnRyaWdnZXIgJiZcbiAgICAgIGl0ZW0uZnJvbU1vZGVsID09PSBub3JtYWxpemVkLmZyb21Nb2RlbCAmJlxuICAgICAgaXRlbS50b01vZGVsID09PSBub3JtYWxpemVkLnRvTW9kZWwsXG4gICk7XG5cbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgZXhpc3RpbmcuY2F0ZWdvcnkgPz89IG5vcm1hbGl6ZWQuY2F0ZWdvcnk7XG4gICAgZXhpc3RpbmcuZXhwbGFuYXRpb24gPz89IG5vcm1hbGl6ZWQuZXhwbGFuYXRpb247XG4gIH0gZWxzZSB7XG4gICAgKHN0YXRlLm1vZGVsRmFsbGJhY2tzID8/PSBbXSkucHVzaChub3JtYWxpemVkKTtcbiAgfVxuXG4gIHN0YXRlLnNlcnZlZE1vZGVsID0gbm9ybWFsaXplZC50b01vZGVsO1xuICBzdGF0ZS5yZWZ1c2FsV2l0aG91dEZhbGxiYWNrID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJvdXRpbmdGcm9tVXNhZ2UoXG4gIHVzYWdlOiBSZXNwb25zZUl0ZW0gfCBudWxsLFxuICBzdGF0ZTogQ2xhdWRlU3RyZWFtSnNvblN0YXRlIHwgdW5kZWZpbmVkLFxuKTogdm9pZCB7XG4gIGlmICghc3RhdGUgfHwgIXVzYWdlIHx8ICFBcnJheS5pc0FycmF5KHVzYWdlLml0ZXJhdGlvbnMpKSByZXR1cm47XG5cbiAgbGV0IHByZXZpb3VzTW9kZWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IHJhdyBvZiB1c2FnZS5pdGVyYXRpb25zKSB7XG4gICAgY29uc3QgaXRlcmF0aW9uID0gYXNPYmplY3QocmF3KTtcblxuICAgIGlmICghaXRlcmF0aW9uKSBjb250aW51ZTtcbiAgICBjb25zdCBtb2RlbCA9IG9wdGlvbmFsU3RyaW5nKGl0ZXJhdGlvbi5tb2RlbCk7XG4gICAgY29uc3QgdHlwZSA9IG9wdGlvbmFsU3RyaW5nKGl0ZXJhdGlvbi50eXBlKTtcblxuICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNhbm9uaWNhbE1vZGVsID0gY2Fub25pY2FsRXZlbnRNb2RlbChtb2RlbCk7XG5cbiAgICBpZiAodHlwZSA9PT0gXCJmYWxsYmFja19tZXNzYWdlXCIgJiYgcHJldmlvdXNNb2RlbCkge1xuICAgICAgcmVjb3JkRmFsbGJhY2soc3RhdGUsIHtcbiAgICAgICAgdHJpZ2dlcjogXCJyZWZ1c2FsXCIsXG4gICAgICAgIGZyb21Nb2RlbDogcHJldmlvdXNNb2RlbCxcbiAgICAgICAgdG9Nb2RlbDogY2Fub25pY2FsTW9kZWwsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcmV2aW91c01vZGVsID0gY2Fub25pY2FsTW9kZWw7XG4gICAgc3RhdGUuc2VydmVkTW9kZWwgPSBjYW5vbmljYWxNb2RlbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVSb3V0aW5nRnJvbU1lc3NhZ2UoXG4gIG1lc3NhZ2U6IFJlc3BvbnNlSXRlbSB8IG51bGwsXG4gIHN0YXRlOiBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUgfCB1bmRlZmluZWQsXG4pOiB2b2lkIHtcbiAgaWYgKCFzdGF0ZSB8fCAhbWVzc2FnZSkgcmV0dXJuO1xuICBjb25zdCBtb2RlbCA9IG9wdGlvbmFsU3RyaW5nKG1lc3NhZ2UubW9kZWwpO1xuICBjb25zdCBjYW5vbmljYWxNb2RlbCA9IG1vZGVsID8gY2Fub25pY2FsRXZlbnRNb2RlbChtb2RlbCkgOiB1bmRlZmluZWQ7XG5cbiAgaWYgKGNhbm9uaWNhbE1vZGVsKSBzdGF0ZS5zZXJ2ZWRNb2RlbCA9IGNhbm9uaWNhbE1vZGVsO1xuICBjb25zdCBzdG9wUmVhc29uID0gb3B0aW9uYWxTdHJpbmcobWVzc2FnZS5zdG9wX3JlYXNvbik7XG5cbiAgaWYgKHN0b3BSZWFzb24pIHtcbiAgICBzdGF0ZS5zdG9wUmVhc29uID0gc3RvcFJlYXNvbjtcblxuICAgIGlmIChzdG9wUmVhc29uID09PSBcInJlZnVzYWxcIikgc3RhdGUucmVmdXNhbFdpdGhvdXRGYWxsYmFjayA9IHRydWU7XG4gICAgZWxzZSBpZiAoc3RhdGUubW9kZWxGYWxsYmFja3M/LnNvbWUoKGZhbGxiYWNrKSA9PiBmYWxsYmFjay50b01vZGVsID09PSBjYW5vbmljYWxNb2RlbCkpIHtcbiAgICAgIHN0YXRlLnJlZnVzYWxXaXRob3V0RmFsbGJhY2sgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdG9wRGV0YWlscyA9IGFzT2JqZWN0KG1lc3NhZ2Uuc3RvcF9kZXRhaWxzKTtcblxuICBpZiAoc3RvcERldGFpbHM/LnR5cGUgPT09IFwicmVmdXNhbFwiIHx8IHN0b3BSZWFzb24gPT09IFwicmVmdXNhbFwiKSB7XG4gICAgc3RhdGUucmVmdXNhbCA9IHtcbiAgICAgIGNhdGVnb3J5OiBvcHRpb25hbFN0cmluZyhzdG9wRGV0YWlscz8uY2F0ZWdvcnkpLFxuICAgICAgZXhwbGFuYXRpb246IG9wdGlvbmFsU3RyaW5nKHN0b3BEZXRhaWxzPy5leHBsYW5hdGlvbiksXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZVJvdXRpbmdGcm9tVXNhZ2UoYXNPYmplY3QobWVzc2FnZS51c2FnZSksIHN0YXRlKTtcbn1cblxuLy8gUHJvY2Vzc2VzIG9uZSBDbGF1ZGUgc3Rkb3V0IEpTT05MIGxpbmUuIFJldHVybnMgZmluYWwgcmVzdWx0IG9uIHJlc3VsdCBldmVudC5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVTdHJlYW1Kc29uTGluZShcbiAgbGluZTogc3RyaW5nLFxuICBvbkRlbHRhOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkLFxuICBvcHRzPzogeyBzdHJ1Y3R1cmVkT3V0cHV0PzogYm9vbGVhbjsgc3RhdGU/OiBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUgfSxcbik6IENsYXVkZVN0cmVhbVJlc3VsdCB8IG51bGwge1xuICBjb25zdCBzdHJ1Y3R1cmVkT3V0cHV0ID0gb3B0cz8uc3RydWN0dXJlZE91dHB1dCA/PyBmYWxzZTtcbiAgY29uc3Qgc3RhdGUgPSBvcHRzPy5zdGF0ZTtcbiAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuXG4gIGlmICghdHJpbW1lZCkgcmV0dXJuIG51bGw7XG5cbiAgbGV0IHBhcnNlZDogSnNvblZhbHVlO1xuXG4gIHRyeSB7XG4gICAgLy8gSlNPTi5wYXJzZSB3aXRob3V0IGEgcmV2aXZlciB5aWVsZHMgb25seSBKU09OIHZhbHVlcy5cbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHRyaW1tZWQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEV2ZXJ5IENsYXVkZSBzdHJlYW0tanNvbiBsaW5lIGlzIGFuIG9iamVjdDsgb3RoZXIgSlNPTiB2YWx1ZXMgY2Fycnkgbm8gZXZlbnQuXG4gIGNvbnN0IGogPSBhc09iamVjdChwYXJzZWQpID8/IHt9O1xuXG4gIGlmIChqLnR5cGUgPT09IFwic3RyZWFtX2V2ZW50XCIpIHtcbiAgICBjb25zdCBldmVudCA9IGFzT2JqZWN0KGouZXZlbnQpO1xuXG4gICAgaWYgKGV2ZW50Py50eXBlID09PSBcIm1lc3NhZ2Vfc3RhcnRcIikge1xuICAgICAgdXBkYXRlUm91dGluZ0Zyb21NZXNzYWdlKGFzT2JqZWN0KGV2ZW50Lm1lc3NhZ2UpLCBzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudD8udHlwZSA9PT0gXCJtZXNzYWdlX2RlbHRhXCIpIHtcbiAgICAgIGNvbnN0IGRlbHRhID0gYXNPYmplY3QoZXZlbnQuZGVsdGEpO1xuICAgICAgY29uc3Qgc3RvcFJlYXNvbiA9IG9wdGlvbmFsU3RyaW5nKGRlbHRhPy5zdG9wX3JlYXNvbik7XG5cbiAgICAgIGlmIChzdGF0ZSAmJiBzdG9wUmVhc29uKSB7XG4gICAgICAgIHN0YXRlLnN0b3BSZWFzb24gPSBzdG9wUmVhc29uO1xuXG4gICAgICAgIGlmIChzdG9wUmVhc29uID09PSBcInJlZnVzYWxcIikgc3RhdGUucmVmdXNhbFdpdGhvdXRGYWxsYmFjayA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnR5cGUgPT09IFwiY29udGVudF9ibG9ja19kZWx0YVwiKSB7XG4gICAgICBjb25zdCBkZWx0YSA9IGFzT2JqZWN0KGV2ZW50LmRlbHRhKTtcblxuICAgICAgaWYgKGRlbHRhKSB7XG4gICAgICAgIGlmIChzdHJ1Y3R1cmVkT3V0cHV0KSB7XG4gICAgICAgICAgY29uc3QgcGFydGlhbEpzb24gPSBqc29uU3RyaW5nKGRlbHRhLnBhcnRpYWxfanNvbik7XG5cbiAgICAgICAgICBpZiAoZGVsdGEudHlwZSA9PT0gXCJpbnB1dF9qc29uX2RlbHRhXCIgJiYgcGFydGlhbEpzb24gIT09IHVuZGVmaW5lZCkgb25EZWx0YShwYXJ0aWFsSnNvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZGVsdGFUZXh0ID0ganNvblN0cmluZyhkZWx0YS50ZXh0KTtcblxuICAgICAgICAgIGlmIChkZWx0YS50eXBlID09PSBcInRleHRfZGVsdGFcIiAmJiBkZWx0YVRleHQgIT09IHVuZGVmaW5lZCkgb25EZWx0YShkZWx0YVRleHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoai50eXBlID09PSBcInN5c3RlbVwiKSB7XG4gICAgY29uc3Qgc3VidHlwZSA9IG9wdGlvbmFsU3RyaW5nKGouc3VidHlwZSk7XG5cbiAgICBpZiAoc3VidHlwZSA9PT0gXCJtb2RlbF9yZWZ1c2FsX2ZhbGxiYWNrXCIpIHtcbiAgICAgIGNvbnN0IGZyb21Nb2RlbCA9IG9wdGlvbmFsU3RyaW5nKGoub3JpZ2luYWxNb2RlbCkgPz8gb3B0aW9uYWxTdHJpbmcoai5vcmlnaW5hbF9tb2RlbCk7XG4gICAgICBjb25zdCB0b01vZGVsID0gb3B0aW9uYWxTdHJpbmcoai5mYWxsYmFja01vZGVsKSA/PyBvcHRpb25hbFN0cmluZyhqLmZhbGxiYWNrX21vZGVsKTtcblxuICAgICAgaWYgKGZyb21Nb2RlbCAmJiB0b01vZGVsKSB7XG4gICAgICAgIHJlY29yZEZhbGxiYWNrKHN0YXRlLCB7XG4gICAgICAgICAgdHJpZ2dlcjogXCJyZWZ1c2FsXCIsXG4gICAgICAgICAgZnJvbU1vZGVsLFxuICAgICAgICAgIHRvTW9kZWwsXG4gICAgICAgICAgY2F0ZWdvcnk6XG4gICAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLmFwaVJlZnVzYWxDYXRlZ29yeSkgPz9cbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGouYXBpX3JlZnVzYWxfY2F0ZWdvcnkpID8/XG4gICAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLnJlZnVzYWxDYXRlZ29yeSkgPz9cbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbF9jYXRlZ29yeSksXG4gICAgICAgICAgZXhwbGFuYXRpb246XG4gICAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLmFwaVJlZnVzYWxFeHBsYW5hdGlvbikgPz9cbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGouYXBpX3JlZnVzYWxfZXhwbGFuYXRpb24pID8/XG4gICAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLnJlZnVzYWxFeHBsYW5hdGlvbikgPz9cbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbF9leHBsYW5hdGlvbiksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3VidHlwZSA9PT0gXCJtb2RlbF9yZWZ1c2FsX25vX2ZhbGxiYWNrXCIgJiYgc3RhdGUpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsTW9kZWwgPSBvcHRpb25hbFN0cmluZyhqLm9yaWdpbmFsTW9kZWwpID8/IG9wdGlvbmFsU3RyaW5nKGoub3JpZ2luYWxfbW9kZWwpO1xuXG4gICAgICBpZiAob3JpZ2luYWxNb2RlbCkgc3RhdGUuc2VydmVkTW9kZWwgPSBjYW5vbmljYWxFdmVudE1vZGVsKG9yaWdpbmFsTW9kZWwpO1xuICAgICAgc3RhdGUuc3RvcFJlYXNvbiA9IFwicmVmdXNhbFwiO1xuICAgICAgc3RhdGUucmVmdXNhbFdpdGhvdXRGYWxsYmFjayA9IHRydWU7XG4gICAgICBzdGF0ZS5yZWZ1c2FsID0ge1xuICAgICAgICBjYXRlZ29yeTpcbiAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLmFwaVJlZnVzYWxDYXRlZ29yeSkgPz9cbiAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLmFwaV9yZWZ1c2FsX2NhdGVnb3J5KSA/P1xuICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbENhdGVnb3J5KSA/P1xuICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbF9jYXRlZ29yeSksXG4gICAgICAgIGV4cGxhbmF0aW9uOlxuICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGouYXBpUmVmdXNhbEV4cGxhbmF0aW9uKSA/P1xuICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGouYXBpX3JlZnVzYWxfZXhwbGFuYXRpb24pID8/XG4gICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5yZWZ1c2FsRXhwbGFuYXRpb24pID8/XG4gICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5yZWZ1c2FsX2V4cGxhbmF0aW9uKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoai50eXBlID09PSBcImFzc2lzdGFudFwiKSB7XG4gICAgdXBkYXRlUm91dGluZ0Zyb21NZXNzYWdlKGFzT2JqZWN0KGoubWVzc2FnZSksIHN0YXRlKTtcblxuICAgIGlmIChzdHJ1Y3R1cmVkT3V0cHV0ICYmIHN0YXRlICYmIHN0YXRlLnN0cnVjdHVyZWRPdXRwdXRUZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBzdHJ1Y3R1cmVkT3V0cHV0VG9vbFVzZVRleHQoaik7XG5cbiAgICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIHN0YXRlLnN0cnVjdHVyZWRPdXRwdXRUZXh0ID0gdGV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChqLnR5cGUgPT09IFwicmVzdWx0XCIpIHtcbiAgICBjb25zdCBzdWJ0eXBlID0ganNvblN0cmluZyhqLnN1YnR5cGUpO1xuICAgIGNvbnN0IHRlcm1pbmFsUmVhc29uID0ganNvblN0cmluZyhqLnRlcm1pbmFsX3JlYXNvbik7XG5cbiAgICBjb25zdCByZXN1bHRTdWNjZWVkZWQgPVxuICAgICAgai5pc19lcnJvciAhPT0gdHJ1ZSAmJlxuICAgICAgdGVybWluYWxSZWFzb24gIT09IFwibW9kZWxfZXJyb3JcIiAmJlxuICAgICAgKHN1YnR5cGUgPT09IHVuZGVmaW5lZCB8fCBzdWJ0eXBlID09PSBcInN1Y2Nlc3NcIik7XG5cbiAgICBsZXQgdGV4dDogc3RyaW5nO1xuICAgIGNvbnN0IHByZXNlcnZlZFN0cnVjdHVyZWRPdXRwdXQgPSBzdHJ1Y3R1cmVkT3V0cHV0ID8gc3RhdGU/LnN0cnVjdHVyZWRPdXRwdXRUZXh0IDogdW5kZWZpbmVkO1xuXG4gICAgLy8gQ2xhdWRlIENvZGXripQgU3RydWN0dXJlZE91dHB1dCDsiqTtgqTrp4gg6rKA7KadIOyLpO2MqCDtm4Qg64K067aAIOyerOyLnOuPhOulvCDtlaAg7IiYIOyeiOuLpC4gYXNzaXN0YW50XG4gICAgLy8g7J2067Kk7Yq47J2YIOyyqyB0b29sIGlucHV07J2AIOqxsOygiOuQnCDsi5zrj4Tsnbwg7IiYIOyeiOycvOuvgOuhnCwg7ISx6rO1IHJlc3VsdOqwgCDsoJzqs7XtlZwg7LWc7KKFIOqygOymneqwkuydhFxuICAgIC8vIOyasOyEoO2VnOuLpC4g7LKrIOyeheugpSDrs7TsobTqsJLsnYAgbWF4X3R1cm5zL3JldHJ5IOy0iOqzvOyymOufvCDshLHqs7UgcmVzdWx06rCAIOyXhuuKlCDsp4Tri6gg6rK966Gc7Jqp7J2064ukLlxuICAgIGlmIChzdHJ1Y3R1cmVkT3V0cHV0ICYmIHJlc3VsdFN1Y2NlZWRlZCAmJiBqLnN0cnVjdHVyZWRfb3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRleHQgPSBKU09OLnN0cmluZ2lmeShqLnN0cnVjdHVyZWRfb3V0cHV0KTtcbiAgICB9IGVsc2UgaWYgKHByZXNlcnZlZFN0cnVjdHVyZWRPdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dCA9IHByZXNlcnZlZFN0cnVjdHVyZWRPdXRwdXQ7XG4gICAgfSBlbHNlIGlmIChqLnN0cnVjdHVyZWRfb3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRleHQgPSBKU09OLnN0cmluZ2lmeShqLnN0cnVjdHVyZWRfb3V0cHV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dCA9IHN0cmlwRmVuY2VzKGpzb25TdHJpbmcoai5yZXN1bHQpID8/IFwiXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHJhd1VzYWdlID0gYXNPYmplY3Qoai51c2FnZSkgPz8ge307XG4gICAgdXBkYXRlUm91dGluZ0Zyb21Vc2FnZShyYXdVc2FnZSwgc3RhdGUpO1xuICAgIGNvbnN0IHJlc3VsdE1vZGVsID0gb3B0aW9uYWxTdHJpbmcoai5tb2RlbCk7XG5cbiAgICBpZiAoc3RhdGUgJiYgcmVzdWx0TW9kZWwgJiYgIXN0YXRlLnNlcnZlZE1vZGVsKSB7XG4gICAgICBzdGF0ZS5zZXJ2ZWRNb2RlbCA9IGNhbm9uaWNhbEV2ZW50TW9kZWwocmVzdWx0TW9kZWwpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdFN0b3BSZWFzb24gPSBvcHRpb25hbFN0cmluZyhqLnN0b3BfcmVhc29uKTtcblxuICAgIGlmIChzdGF0ZSAmJiByZXN1bHRTdG9wUmVhc29uKSB7XG4gICAgICBzdGF0ZS5zdG9wUmVhc29uID0gcmVzdWx0U3RvcFJlYXNvbjtcblxuICAgICAgaWYgKHJlc3VsdFN0b3BSZWFzb24gPT09IFwicmVmdXNhbFwiKSBzdGF0ZS5yZWZ1c2FsV2l0aG91dEZhbGxiYWNrID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2FnZSA9IHRvVXNhZ2VCcmVha2Rvd24oQ2xhdWRlVXNhZ2UucGFyc2UocmF3VXNhZ2UpKTtcbiAgICBjb25zdCBxdW90YUV4aGF1c3RlZCA9IHRleHQuc3RhcnRzV2l0aChcIllvdSd2ZSBoaXRcIik7XG5cbiAgICAvLyBTT04tNDk1OiDruYTsoJXsg4Eg7KKF66OMKGVycm9yX21heF9zdHJ1Y3R1cmVkX291dHB1dF9yZXRyaWVzIOuTsSnripQg7KCV7KeB7ZWY6rKMIOyXkOufrOuhnCDsspjrpqztlZzri6QuXG4gICAgLy8gQ0Mgc3RydWN0dXJlZCBvdXRwdXQg7J2AIGNvbnN0cmFpbmVkIGRlY29kaW5nIOydtCDslYTri4jrnbwgXCJ0b29sIGlucHV0IOyDneyEsSDtm4Qg7IKs7ZuEIEFKViDqsoDspp1cIuydtOudvFxuICAgIC8vIOuqqOuNuOydtCDqsIDrgZQgcGxhY2Vob2xkZXIoJFBBUkFNRVRFUl9OQU1FKcK36rGw67aAKFwianVzdCBraWRkaW5nXCIpwrftlYTrk5wg64iE6529KGFkdmFuY2UpIOqwmeydgCDrsJzsnpEvXG4gICAgLy8g67aI7JmE7KCEIOy2nOugpeydhCDrgrjri6QuIOydtOulvCBcIuqxsOydmCDrp57slZjsnLzri4gg7IK066as7J6QXCLqs6Ag7Z2Y66as66m0IO2BtOudvOydtOyWuO2KuCDqsoDspp3sl5DshJwg6rmo7KeA6rGw64KYKO2VhOuTnCDriITrnb0pXG4gICAgLy8g7JOw66CI6riw6rCAIOyDiOyWtCDrgpjqsITri6Qo7Iuk7LihIDExNjc0LzExNjc1KS4g7JWM66Ck7KeEIGJlc3QgcHJhY3RpY2UocmVmdXNhbC9kZWdlbmVyYXRlIG91dHB1dCDsnYAg7IK066as7KeAXG4gICAgLy8g66eQ6rOgIGdyYWNlZnVsIGVycm9yKeuMgOuhnCwgc3VidHlwZSAhPSBzdWNjZXNzIOuKlCDqt7jrjIDroZwg7JeQ65+s66GcIOuRlOuLpC4g7YG065287J207Ja47Yq46rCAIOq3uCDthLTsnYQg7Iuk7Yyo66GcXG4gICAgLy8g64uk66Oo6rKMIO2VnOuLpCjsiqTtirjrprzsnbTrnbwg7J6Q64+ZIOyerOyLnOuPhCDsl4bsnYwg4oCUIOyLnOqwhCAy67CwIOuwqeyngCkuXG4gICAgY29uc3QgaXNFcnJvciA9XG4gICAgICBqLmlzX2Vycm9yID09PSB0cnVlIHx8XG4gICAgICBqLnRlcm1pbmFsX3JlYXNvbiA9PT0gXCJtb2RlbF9lcnJvclwiIHx8XG4gICAgICAoc3VidHlwZSAhPT0gdW5kZWZpbmVkICYmIHN1YnR5cGUgIT09IFwic3VjY2Vzc1wiKSB8fFxuICAgICAgc3RhdGU/LnJlZnVzYWxXaXRob3V0RmFsbGJhY2sgPT09IHRydWU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGV4dCxcbiAgICAgIHVzYWdlLFxuICAgICAgZHVyYXRpb25NczoganNvbk51bWJlcihqLmR1cmF0aW9uX21zKSA/PyAwLFxuICAgICAgY29zdFVzZDoganNvbk51bWJlcihqLnRvdGFsX2Nvc3RfdXNkKSA/PyAwLFxuICAgICAgcXVvdGFFeGhhdXN0ZWQsXG4gICAgICBpc0Vycm9yLFxuICAgICAgc3VidHlwZSxcbiAgICAgIHRlcm1pbmFsUmVhc29uLFxuICAgICAgc2VydmVkTW9kZWw6IHN0YXRlPy5zZXJ2ZWRNb2RlbCxcbiAgICAgIHN0b3BSZWFzb246IHN0YXRlPy5zdG9wUmVhc29uLFxuICAgICAgcmVmdXNhbDogc3RhdGU/LnJlZnVzYWwsXG4gICAgICBtb2RlbEZhbGxiYWNrczogc3RhdGU/Lm1vZGVsRmFsbGJhY2tzLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQXFDQSxTQUFTLGdCQUFnQixPQUFpQztDQUN4RCxPQUFPLE1BQU0sU0FBUyxNQUFPLEVBQUUsU0FBUyxTQUFTLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFFLENBQUMsQ0FBQyxLQUFLLElBQUk7QUFDNUU7QUFFQSxTQUFTLFVBQVUsTUFBcUQ7Q0FDdEUsT0FBTyxDQUFDO0VBQUUsTUFBTTtFQUFRO0NBQUssQ0FBQztBQUNoQztBQVVBLFNBQVMsU0FBUyxHQUErQztDQUMvRCxPQUFPLGFBQWEsQ0FBQyxJQUFJLElBQUk7QUFDL0I7QUFFQSxTQUFTLGlCQUFpQixNQUE0QjtDQUNwRCxNQUFNLFVBQVUsS0FBSztDQUVyQixJQUFJLENBQUMsTUFBTSxRQUFRLE9BQU8sR0FBRyxPQUFPO0NBRXBDLE9BQU8sUUFDSixLQUFLLE1BQU07RUFDVixNQUFNLE1BQU0sU0FBUyxDQUFDO0VBRXRCLFFBQVEsT0FBTyxXQUFXLElBQUks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
@@ -6,6 +6,10 @@ function getRefreshToken(creds) {
6
6
  return creds.refreshToken;
7
7
  }
8
8
  function getExpiresAt(creds) {
9
+ if ("authMode" in creds) {
10
+ const parsed = Date.parse(creds.expiresAt);
11
+ return Number.isNaN(parsed) ? 0 : parsed;
12
+ }
9
13
  if ("expiresAt" in creds) return creds.expiresAt;
10
14
  return creds.accessTokenExpiresAt;
11
15
  }
@@ -18,4 +22,4 @@ function isOpenAICredentials(creds) {
18
22
  //#endregion
19
23
  export { getAccessToken, getExpiresAt, getRefreshToken, isAnthropicCredentials, isOpenAICredentials };
20
24
 
21
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlZGVudGlhbHMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgdHlwZSBPcGVuQUlDcmVkZW50aWFscyxcbiAgdHlwZSBUb2tlbkNyZWRlbnRpYWxzLFxufSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4udHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjY2Vzc1Rva2VuKGNyZWRzOiBUb2tlbkNyZWRlbnRpYWxzKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWRzLmFjY2Vzc1Rva2VuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVmcmVzaFRva2VuKGNyZWRzOiBUb2tlbkNyZWRlbnRpYWxzKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNyZWRzLnJlZnJlc2hUb2tlbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGlyZXNBdChjcmVkczogVG9rZW5DcmVkZW50aWFscyk6IG51bWJlciB7XG4gIGlmIChcImV4cGlyZXNBdFwiIGluIGNyZWRzKSByZXR1cm4gY3JlZHMuZXhwaXJlc0F0O1xuICByZXR1cm4gY3JlZHMuYWNjZXNzVG9rZW5FeHBpcmVzQXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FudGhyb3BpY0NyZWRlbnRpYWxzKGNyZWRzOiBUb2tlbkNyZWRlbnRpYWxzKTogY3JlZHMgaXMgQW50aHJvcGljQ3JlZGVudGlhbHMge1xuICByZXR1cm4gXCJhY2NvdW50VXVpZFwiIGluIGNyZWRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPcGVuQUlDcmVkZW50aWFscyhjcmVkczogVG9rZW5DcmVkZW50aWFscyk6IGNyZWRzIGlzIE9wZW5BSUNyZWRlbnRpYWxzIHtcbiAgcmV0dXJuIFwiYWNjb3VudElkXCIgaW4gY3JlZHM7XG59XG4iXSwibWFwcGluZ3MiOiI7QUFNQSxTQUFnQixlQUFlLE9BQWlDO0NBQzlELE9BQU8sTUFBTTtBQUNmO0FBRUEsU0FBZ0IsZ0JBQWdCLE9BQTZDO0NBQzNFLE9BQU8sTUFBTTtBQUNmO0FBRUEsU0FBZ0IsYUFBYSxPQUFpQztDQUM1RCxJQUFJLGVBQWUsT0FBTyxPQUFPLE1BQU07Q0FDdkMsT0FBTyxNQUFNO0FBQ2Y7QUFFQSxTQUFnQix1QkFBdUIsT0FBd0Q7Q0FDN0YsT0FBTyxpQkFBaUI7QUFDMUI7QUFFQSxTQUFnQixvQkFBb0IsT0FBcUQ7Q0FDdkYsT0FBTyxlQUFlO0FBQ3hCIn0=
25
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlZGVudGlhbHMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgdHlwZSBPcGVuQUlDcmVkZW50aWFscyxcbiAgdHlwZSBUb2tlbkNyZWRlbnRpYWxzLFxufSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4udHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjY2Vzc1Rva2VuKGNyZWRzOiBUb2tlbkNyZWRlbnRpYWxzKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWRzLmFjY2Vzc1Rva2VuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVmcmVzaFRva2VuKGNyZWRzOiBUb2tlbkNyZWRlbnRpYWxzKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNyZWRzLnJlZnJlc2hUb2tlbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGlyZXNBdChjcmVkczogVG9rZW5DcmVkZW50aWFscyk6IG51bWJlciB7XG4gIC8vIEdyb2sgY3JlZGVudGlhbHMgKGF1dGhNb2RlIFwib2F1dGhcIikgc3RvcmUgUkZDIDMzMzk7IGFuIHVucGFyc2VhYmxlIHZhbHVlIHJlYWRzIGFzIGV4cGlyZWQuXG4gIGlmIChcImF1dGhNb2RlXCIgaW4gY3JlZHMpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBEYXRlLnBhcnNlKGNyZWRzLmV4cGlyZXNBdCk7XG5cbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHBhcnNlZCkgPyAwIDogcGFyc2VkO1xuICB9XG5cbiAgaWYgKFwiZXhwaXJlc0F0XCIgaW4gY3JlZHMpIHJldHVybiBjcmVkcy5leHBpcmVzQXQ7XG5cbiAgcmV0dXJuIGNyZWRzLmFjY2Vzc1Rva2VuRXhwaXJlc0F0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBbnRocm9waWNDcmVkZW50aWFscyhjcmVkczogVG9rZW5DcmVkZW50aWFscyk6IGNyZWRzIGlzIEFudGhyb3BpY0NyZWRlbnRpYWxzIHtcbiAgcmV0dXJuIFwiYWNjb3VudFV1aWRcIiBpbiBjcmVkcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT3BlbkFJQ3JlZGVudGlhbHMoY3JlZHM6IFRva2VuQ3JlZGVudGlhbHMpOiBjcmVkcyBpcyBPcGVuQUlDcmVkZW50aWFscyB7XG4gIHJldHVybiBcImFjY291bnRJZFwiIGluIGNyZWRzO1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBTUEsU0FBZ0IsZUFBZSxPQUFpQztDQUM5RCxPQUFPLE1BQU07QUFDZjtBQUVBLFNBQWdCLGdCQUFnQixPQUE2QztDQUMzRSxPQUFPLE1BQU07QUFDZjtBQUVBLFNBQWdCLGFBQWEsT0FBaUM7Q0FFNUQsSUFBSSxjQUFjLE9BQU87RUFDdkIsTUFBTSxTQUFTLEtBQUssTUFBTSxNQUFNLFNBQVM7RUFFekMsT0FBTyxPQUFPLE1BQU0sTUFBTSxJQUFJLElBQUk7Q0FDcEM7Q0FFQSxJQUFJLGVBQWUsT0FBTyxPQUFPLE1BQU07Q0FFdkMsT0FBTyxNQUFNO0FBQ2Y7QUFFQSxTQUFnQix1QkFBdUIsT0FBd0Q7Q0FDN0YsT0FBTyxpQkFBaUI7QUFDMUI7QUFFQSxTQUFnQixvQkFBb0IsT0FBcUQ7Q0FDdkYsT0FBTyxlQUFlO0FBQ3hCIn0=
@@ -27,7 +27,7 @@ const ANTHROPIC_EFFORTS = [
27
27
  ];
28
28
  function resolveWithin(levels, effort, max, target) {
29
29
  if (effort === void 0) return void 0;
30
- const rank = levels.indexOf(effort);
30
+ const rank = levels.findIndex((level) => level === effort);
31
31
  if (rank < 0) {
32
32
  logger.debug(`ignoring effort "${effort}" for ${target}: not in ${levels.join("/")}`);
33
33
  return;
@@ -36,7 +36,7 @@ function resolveWithin(levels, effort, max, target) {
36
36
  logger.debug(`ignoring effort "${effort}" for ${target}: model supports up to "${max}"`);
37
37
  return;
38
38
  }
39
- return effort;
39
+ return levels[rank];
40
40
  }
41
41
  /** canonical OpenAI model(`openai/` prefix 제거 후) 기준으로 effort 를 판정한다. */
42
42
  function resolveOpenAIEffort(model, effort) {
@@ -48,4 +48,4 @@ function resolveAnthropicEffort(effort) {
48
48
  //#endregion
49
49
  export { ANTHROPIC_EFFORTS, OPENAI_EFFORTS, resolveAnthropicEffort, resolveOpenAIEffort };
50
50
 
51
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmb3J0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvY29tbW9uL2VmZm9ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBvcGVuYWlNb2RlbE1heEVmZm9ydCB9IGZyb20gXCIuL21vZGVsLWNvc3RcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwiZWZmb3J0XCJdKTtcblxuLyoqXG4gKiBwcm92aWRlciDrs4QgcmVhc29uaW5nIGVmZm9ydCDslrTtnJguXG4gKlxuICogU0RLIOqwgCDrs7TrgrggZWZmb3J0IOusuOyekOyXtOydhCDqt7jrjIDroZwgcHJvdmlkZXIg7JeQIOuEmOq4sOyngCDslYrripTri6QuIHByb3ZpZGVyIOuniOuLpCDrsJvripQg6rCS7J20IOuLpOultOqzoCxcbiAqIOuqqOultOuKlCDqsJLsnYQg67Cb7JWY7J2EIOuVjOydmCDrsJjsnZHrj4Qg64uk66W064ukKENvZGV4IOuwseyXlOuTnOuKlCA0MDAg7J20IOyYiOyDgeuQmOqzoCwgQ2xhdWRlIENvZGUg64qUIOqyveqzoOunjFxuICog64Ko6riw6rOgIOuqqOuNuCDquLDrs7ggZWZmb3J0IOuhnCDsi6TtlontlZzri6QpLiDqsIEgcHJvdmlkZXIgZGlzcGF0Y2hlciDqsIAg7JqU7LKt7J2EIOunjOuTpCDrlYwg7Jes6riw7IScIO2MkOygle2VtCxcbiAqIOunnuyngCDslYrripQg6rCS7J2AIOyYpOulmCDsl4bsnbQg67KE66as6rOgIFwi66+47KeA7KCVXCIg6rO8IOqwmeqyjCDst6jquIntlZzri6QuXG4gKi9cblxuLy8gQ29kZXgg6rWs64+FIOuwseyXlOuTnCDrqqjrjbgg7Lm07YOI66Gc6re4KH4vLmNvZGV4L21vZGVsc19jYWNoZS5qc29uKSDsnZggc3VwcG9ydGVkX3JlYXNvbmluZ19sZXZlbHMg7ZWp7KeR7ZWpLlxuLy8gUHVibGljIGVmZm9ydCBvcHRpb25zIGV4Y2x1ZGUgbm9uZS9taW5pbWFsLiB0aGlua2luZzpmYWxzZSBtYXBzIHRvIHdpcmUtbGV2ZWwgbm9uZSBzZXBhcmF0ZWx5LlxuZXhwb3J0IGNvbnN0IE9QRU5BSV9FRkZPUlRTID0gW1wibG93XCIsIFwibWVkaXVtXCIsIFwiaGlnaFwiLCBcInhoaWdoXCIsIFwibWF4XCIsIFwidWx0cmFcIl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBPcGVuQUlFZmZvcnQgPSAodHlwZW9mIE9QRU5BSV9FRkZPUlRTKVtudW1iZXJdO1xuXG4vLyBDbGF1ZGUgQ29kZSBgLS1lZmZvcnRgIO2XiOyaqeqwki4g66qo642467OEIOyDge2VnCh4aGlnaF9lZmZvcnQgLyBtYXhfZWZmb3J0IGNhcGFiaWxpdHkp7J2AIENsYXVkZSBDb2RlIOqwgFxuLy8g7Iqk7Iqk66GcIOyymOumrO2VmOuvgOuhnCBxZ3JpZCDripQgcHJvdmlkZXIg7KeR7ZWp66eMIOqygOyCrO2VnOuLpC5cbmV4cG9ydCBjb25zdCBBTlRIUk9QSUNfRUZGT1JUUyA9IFtcImxvd1wiLCBcIm1lZGl1bVwiLCBcImhpZ2hcIiwgXCJ4aGlnaFwiLCBcIm1heFwiXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEFudGhyb3BpY0VmZm9ydCA9ICh0eXBlb2YgQU5USFJPUElDX0VGRk9SVFMpW251bWJlcl07XG5cbi8vIOyWtO2cmCDslYjsl5Ag7J6I6rOgIOyDge2VnCjsnojri6TrqbQpIOydtO2VmOyduCDqsJLrp4wg7Ya16rO87Iuc7YKo64ukLiDrgpjrqLjsp4DripQgZGVidWcg66Gc6re4IO2bhCDrr7jsp4DsoJUuXG5mdW5jdGlvbiByZXNvbHZlV2l0aGluPFQgZXh0ZW5kcyBzdHJpbmc+KFxuICBsZXZlbHM6IHJlYWRvbmx5IFRbXSxcbiAgZWZmb3J0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG1heDogVCB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGVmZm9ydCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByYW5rID0gbGV2ZWxzLmluZGV4T2YoZWZmb3J0IGFzIFQpO1xuICBpZiAocmFuayA8IDApIHtcbiAgICBsb2dnZXIuZGVidWcoYGlnbm9yaW5nIGVmZm9ydCBcIiR7ZWZmb3J0fVwiIGZvciAke3RhcmdldH06IG5vdCBpbiAke2xldmVscy5qb2luKFwiL1wiKX1gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChtYXggIT09IHVuZGVmaW5lZCAmJiByYW5rID4gbGV2ZWxzLmluZGV4T2YobWF4KSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgaWdub3JpbmcgZWZmb3J0IFwiJHtlZmZvcnR9XCIgZm9yICR7dGFyZ2V0fTogbW9kZWwgc3VwcG9ydHMgdXAgdG8gXCIke21heH1cImApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGVmZm9ydCBhcyBUO1xufVxuXG4vKiogY2Fub25pY2FsIE9wZW5BSSBtb2RlbChgb3BlbmFpL2AgcHJlZml4IOygnOqxsCDtm4QpIOq4sOykgOycvOuhnCBlZmZvcnQg66W8IO2MkOygle2VnOuLpC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3BlbkFJRWZmb3J0KG1vZGVsOiBzdHJpbmcsIGVmZm9ydD86IHN0cmluZyk6IE9wZW5BSUVmZm9ydCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiByZXNvbHZlV2l0aGluKE9QRU5BSV9FRkZPUlRTLCBlZmZvcnQsIG9wZW5haU1vZGVsTWF4RWZmb3J0KG1vZGVsKSwgYG9wZW5haS8ke21vZGVsfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUFudGhyb3BpY0VmZm9ydChlZmZvcnQ/OiBzdHJpbmcpOiBBbnRocm9waWNFZmZvcnQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcmVzb2x2ZVdpdGhpbihBTlRIUk9QSUNfRUZGT1JUUywgZWZmb3J0LCB1bmRlZmluZWQsIFwiYW50aHJvcGljXCIpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUFJQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsUUFBUSxDQUFDOzs7Ozs7Ozs7QUFhNUMsTUFBYSxpQkFBaUI7Q0FBQztDQUFPO0NBQVU7Q0FBUTtDQUFTO0NBQU87QUFBTztBQUsvRSxNQUFhLG9CQUFvQjtDQUFDO0NBQU87Q0FBVTtDQUFRO0NBQVM7QUFBSztBQUl6RSxTQUFTLGNBQ1AsUUFDQSxRQUNBLEtBQ0EsUUFDZTtDQUNmLElBQUksV0FBVyxRQUFXLE9BQU87Q0FDakMsTUFBTSxPQUFPLE9BQU8sUUFBUSxNQUFXO0NBQ3ZDLElBQUksT0FBTyxHQUFHO0VBQ1osT0FBTyxNQUFNLG9CQUFvQixPQUFPLFFBQVEsT0FBTyxXQUFXLE9BQU8sS0FBSyxHQUFHLEdBQUc7RUFDcEY7Q0FDRjtDQUNBLElBQUksUUFBUSxVQUFhLE9BQU8sT0FBTyxRQUFRLEdBQUcsR0FBRztFQUNuRCxPQUFPLE1BQU0sb0JBQW9CLE9BQU8sUUFBUSxPQUFPLDBCQUEwQixJQUFJLEVBQUU7RUFDdkY7Q0FDRjtDQUNBLE9BQU87QUFDVDs7QUFHQSxTQUFnQixvQkFBb0IsT0FBZSxRQUEyQztDQUM1RixPQUFPLGNBQWMsZ0JBQWdCLFFBQVEscUJBQXFCLEtBQUssR0FBRyxVQUFVLE9BQU87QUFDN0Y7QUFFQSxTQUFnQix1QkFBdUIsUUFBOEM7Q0FDbkYsT0FBTyxjQUFjLG1CQUFtQixRQUFRLFFBQVcsV0FBVztBQUN4RSJ9
51
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmb3J0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvY29tbW9uL2VmZm9ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBvcGVuYWlNb2RlbE1heEVmZm9ydCB9IGZyb20gXCIuL21vZGVsLWNvc3RcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwiZWZmb3J0XCJdKTtcblxuLyoqXG4gKiBwcm92aWRlciDrs4QgcmVhc29uaW5nIGVmZm9ydCDslrTtnJguXG4gKlxuICogU0RLIOqwgCDrs7TrgrggZWZmb3J0IOusuOyekOyXtOydhCDqt7jrjIDroZwgcHJvdmlkZXIg7JeQIOuEmOq4sOyngCDslYrripTri6QuIHByb3ZpZGVyIOuniOuLpCDrsJvripQg6rCS7J20IOuLpOultOqzoCxcbiAqIOuqqOultOuKlCDqsJLsnYQg67Cb7JWY7J2EIOuVjOydmCDrsJjsnZHrj4Qg64uk66W064ukKENvZGV4IOuwseyXlOuTnOuKlCA0MDAg7J20IOyYiOyDgeuQmOqzoCwgQ2xhdWRlIENvZGUg64qUIOqyveqzoOunjFxuICog64Ko6riw6rOgIOuqqOuNuCDquLDrs7ggZWZmb3J0IOuhnCDsi6TtlontlZzri6QpLiDqsIEgcHJvdmlkZXIgZGlzcGF0Y2hlciDqsIAg7JqU7LKt7J2EIOunjOuTpCDrlYwg7Jes6riw7IScIO2MkOygle2VtCxcbiAqIOunnuyngCDslYrripQg6rCS7J2AIOyYpOulmCDsl4bsnbQg67KE66as6rOgIFwi66+47KeA7KCVXCIg6rO8IOqwmeqyjCDst6jquIntlZzri6QuXG4gKi9cblxuLy8gQ29kZXgg6rWs64+FIOuwseyXlOuTnCDrqqjrjbgg7Lm07YOI66Gc6re4KH4vLmNvZGV4L21vZGVsc19jYWNoZS5qc29uKSDsnZggc3VwcG9ydGVkX3JlYXNvbmluZ19sZXZlbHMg7ZWp7KeR7ZWpLlxuLy8gUHVibGljIGVmZm9ydCBvcHRpb25zIGV4Y2x1ZGUgbm9uZS9taW5pbWFsLiB0aGlua2luZzpmYWxzZSBtYXBzIHRvIHdpcmUtbGV2ZWwgbm9uZSBzZXBhcmF0ZWx5LlxuZXhwb3J0IGNvbnN0IE9QRU5BSV9FRkZPUlRTID0gW1wibG93XCIsIFwibWVkaXVtXCIsIFwiaGlnaFwiLCBcInhoaWdoXCIsIFwibWF4XCIsIFwidWx0cmFcIl0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIE9wZW5BSUVmZm9ydCA9ICh0eXBlb2YgT1BFTkFJX0VGRk9SVFMpW251bWJlcl07XG5cbi8vIENsYXVkZSBDb2RlIGAtLWVmZm9ydGAg7ZeI7Jqp6rCSLiDrqqjrjbjrs4Qg7IOB7ZWcKHhoaWdoX2VmZm9ydCAvIG1heF9lZmZvcnQgY2FwYWJpbGl0eSnsnYAgQ2xhdWRlIENvZGUg6rCAXG4vLyDsiqTsiqTroZwg7LKY66as7ZWY66+A66GcIHFncmlkIOuKlCBwcm92aWRlciDsp5Htlanrp4wg6rKA7IKs7ZWc64ukLlxuZXhwb3J0IGNvbnN0IEFOVEhST1BJQ19FRkZPUlRTID0gW1wibG93XCIsIFwibWVkaXVtXCIsIFwiaGlnaFwiLCBcInhoaWdoXCIsIFwibWF4XCJdIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBBbnRocm9waWNFZmZvcnQgPSAodHlwZW9mIEFOVEhST1BJQ19FRkZPUlRTKVtudW1iZXJdO1xuXG4vLyDslrTtnJgg7JWI7JeQIOyeiOqzoCDsg4HtlZwo7J6I64uk66m0KSDsnbTtlZjsnbgg6rCS66eMIO2GteqzvOyLnO2CqOuLpC4g64KY66i47KeA64qUIGRlYnVnIOuhnOq3uCDtm4Qg66+47KeA7KCVLlxuZnVuY3Rpb24gcmVzb2x2ZVdpdGhpbjxUIGV4dGVuZHMgc3RyaW5nPihcbiAgbGV2ZWxzOiByZWFkb25seSBUW10sXG4gIGVmZm9ydDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBtYXg6IFQgfCB1bmRlZmluZWQsXG4gIHRhcmdldDogc3RyaW5nLFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIGlmIChlZmZvcnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmFuayA9IGxldmVscy5maW5kSW5kZXgoKGxldmVsKSA9PiBsZXZlbCA9PT0gZWZmb3J0KTtcblxuICBpZiAocmFuayA8IDApIHtcbiAgICBsb2dnZXIuZGVidWcoYGlnbm9yaW5nIGVmZm9ydCBcIiR7ZWZmb3J0fVwiIGZvciAke3RhcmdldH06IG5vdCBpbiAke2xldmVscy5qb2luKFwiL1wiKX1gKTtcblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAobWF4ICE9PSB1bmRlZmluZWQgJiYgcmFuayA+IGxldmVscy5pbmRleE9mKG1heCkpIHtcbiAgICBsb2dnZXIuZGVidWcoYGlnbm9yaW5nIGVmZm9ydCBcIiR7ZWZmb3J0fVwiIGZvciAke3RhcmdldH06IG1vZGVsIHN1cHBvcnRzIHVwIHRvIFwiJHttYXh9XCJgKTtcblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gbGV2ZWxzW3JhbmtdO1xufVxuXG4vKiogY2Fub25pY2FsIE9wZW5BSSBtb2RlbChgb3BlbmFpL2AgcHJlZml4IOygnOqxsCDtm4QpIOq4sOykgOycvOuhnCBlZmZvcnQg66W8IO2MkOygle2VnOuLpC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3BlbkFJRWZmb3J0KG1vZGVsOiBzdHJpbmcsIGVmZm9ydD86IHN0cmluZyk6IE9wZW5BSUVmZm9ydCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiByZXNvbHZlV2l0aGluKE9QRU5BSV9FRkZPUlRTLCBlZmZvcnQsIG9wZW5haU1vZGVsTWF4RWZmb3J0KG1vZGVsKSwgYG9wZW5haS8ke21vZGVsfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUFudGhyb3BpY0VmZm9ydChlZmZvcnQ/OiBzdHJpbmcpOiBBbnRocm9waWNFZmZvcnQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcmVzb2x2ZVdpdGhpbihBTlRIUk9QSUNfRUZGT1JUUywgZWZmb3J0LCB1bmRlZmluZWQsIFwiYW50aHJvcGljXCIpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUFJQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsUUFBUSxDQUFDOzs7Ozs7Ozs7QUFhNUMsTUFBYSxpQkFBaUI7Q0FBQztDQUFPO0NBQVU7Q0FBUTtDQUFTO0NBQU87QUFBTztBQU0vRSxNQUFhLG9CQUFvQjtDQUFDO0NBQU87Q0FBVTtDQUFRO0NBQVM7QUFBSztBQUt6RSxTQUFTLGNBQ1AsUUFDQSxRQUNBLEtBQ0EsUUFDZTtDQUNmLElBQUksV0FBVyxRQUFXLE9BQU87Q0FDakMsTUFBTSxPQUFPLE9BQU8sV0FBVyxVQUFVLFVBQVUsTUFBTTtDQUV6RCxJQUFJLE9BQU8sR0FBRztFQUNaLE9BQU8sTUFBTSxvQkFBb0IsT0FBTyxRQUFRLE9BQU8sV0FBVyxPQUFPLEtBQUssR0FBRyxHQUFHO0VBRXBGO0NBQ0Y7Q0FFQSxJQUFJLFFBQVEsVUFBYSxPQUFPLE9BQU8sUUFBUSxHQUFHLEdBQUc7RUFDbkQsT0FBTyxNQUFNLG9CQUFvQixPQUFPLFFBQVEsT0FBTywwQkFBMEIsSUFBSSxFQUFFO0VBRXZGO0NBQ0Y7Q0FFQSxPQUFPLE9BQU87QUFDaEI7O0FBR0EsU0FBZ0Isb0JBQW9CLE9BQWUsUUFBMkM7Q0FDNUYsT0FBTyxjQUFjLGdCQUFnQixRQUFRLHFCQUFxQixLQUFLLEdBQUcsVUFBVSxPQUFPO0FBQzdGO0FBRUEsU0FBZ0IsdUJBQXVCLFFBQThDO0NBQ25GLE9BQU8sY0FBYyxtQkFBbUIsUUFBUSxRQUFXLFdBQVc7QUFDeEUifQ==