@cartanova/qgrid-cli 2.10.3 → 2.10.5

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 (78) hide show
  1. package/bundle/dist/application/qgrid/qgrid-image-generation.js +6 -2
  2. package/bundle/dist/application/qgrid/qgrid-response-format.js +4 -4
  3. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +63 -140
  4. package/bundle/dist/application/qgrid/qgrid.frame.js +3 -6
  5. package/bundle/dist/application/qgrid/qgrid.types.js +4 -8
  6. package/bundle/dist/application/request-log/request-log.model.js +21 -15
  7. package/bundle/dist/application/setting/setting.model.js +2 -64
  8. package/bundle/dist/application/setting/setting.store.js +3 -4
  9. package/bundle/dist/application/setting/setting.types.js +2 -12
  10. package/bundle/dist/i18n/en.js +1 -3
  11. package/bundle/dist/i18n/ko.js +1 -3
  12. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +19 -8
  13. package/bundle/src/application/qgrid/qgrid-image-generation.test.ts +18 -0
  14. package/bundle/src/application/qgrid/qgrid-image-generation.ts +14 -3
  15. package/bundle/src/application/qgrid/qgrid-response-format.test.ts +9 -0
  16. package/bundle/src/application/qgrid/qgrid-response-format.ts +10 -7
  17. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +0 -111
  18. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +82 -178
  19. package/bundle/src/application/qgrid/qgrid.frame.test.ts +0 -38
  20. package/bundle/src/application/qgrid/qgrid.frame.ts +4 -6
  21. package/bundle/src/application/qgrid/qgrid.types.ts +14 -4
  22. package/bundle/src/application/request-log/request-log.model.test.ts +17 -12
  23. package/bundle/src/application/request-log/request-log.model.ts +8 -2
  24. package/bundle/src/application/setting/setting.model.test.ts +1 -101
  25. package/bundle/src/application/setting/setting.model.ts +0 -73
  26. package/bundle/src/application/setting/setting.store.ts +2 -3
  27. package/bundle/src/application/setting/setting.types.ts +0 -12
  28. package/bundle/src/application/sonamu.generated.http +2 -7
  29. package/bundle/src/i18n/en.ts +0 -3
  30. package/bundle/src/i18n/ko.ts +0 -3
  31. package/bundle/src/utils/providers/openai/openai-backend-protocol.test.ts +19 -1
  32. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +22 -0
  33. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +12 -0
  34. package/bundle/web-dist/client/assets/cost-CY2BJEPC.js +1 -0
  35. package/bundle/web-dist/client/assets/index-CvG4UB9v.css +1 -0
  36. package/bundle/web-dist/client/assets/{index-BIC1sQxw.js → index-Dxw7DiXF.js} +4 -4
  37. package/bundle/web-dist/client/assets/logs-3n_U4qnI.js +1 -0
  38. package/bundle/web-dist/client/assets/{monit-CraVV3MQ.js → monit-E8eGW1Sj.js} +1 -1
  39. package/bundle/web-dist/client/assets/{routes-B3ZBoJ60.js → routes-7spLfIGZ.js} +2 -2
  40. package/bundle/web-dist/client/assets/services.generated-jnPHYMER.js +51 -0
  41. package/bundle/web-dist/client/assets/settings-BdosZFNC.js +1 -0
  42. package/bundle/web-dist/client/assets/{show-ItTExdAh.js → show-b2PFNI3D.js} +1 -1
  43. package/bundle/web-dist/client/assets/{tokens-BynKx8Vn.js → tokens-CBdHb2_U.js} +1 -1
  44. package/bundle/web-dist/client/assets/{use-oauth-login-flow-8xw6on5P.js → use-oauth-login-flow-Cyn3YPqW.js} +1 -1
  45. package/bundle/web-dist/client/assets/{use-update-token-mutation-D-Y8OySK.js → use-update-token-mutation-DQCwCYfR.js} +1 -1
  46. package/bundle/web-dist/client/index.html +3 -3
  47. package/bundle/web-dist/server/assets/{cost-CSH_t17I.js → cost-59jBdx-I.js} +8 -3
  48. package/bundle/web-dist/server/assets/{lazyRouteComponent-Bj1cPq6x.js → lazyRouteComponent-CUR-kWzI.js} +2 -2
  49. package/bundle/web-dist/server/assets/{logs-BSk9lOHe.js → logs-CaaWO9-Z.js} +9 -7
  50. package/bundle/web-dist/server/assets/{monit-D9W4ioUi.js → monit-CBil92fJ.js} +4 -4
  51. package/bundle/web-dist/server/assets/{plus-CmvbWuDf.js → plus-Bvdj8Pwx.js} +1 -1
  52. package/bundle/web-dist/server/assets/{react-dom-BjR1Iaz8.js → react-dom-CyuShs9K.js} +1 -1
  53. package/bundle/web-dist/server/assets/{refresh-cw-B8U9BL9-.js → refresh-cw-3QAiSWBd.js} +1 -1
  54. package/bundle/web-dist/server/assets/{routes-C7lB2Q85.js → routes-DtVf9yqo.js} +7 -7
  55. package/bundle/web-dist/server/assets/{services.generated-BM4X3Ecj.js → services.generated-FPwsG9p3.js} +116 -131
  56. package/bundle/web-dist/server/assets/{settings-BFVuldch.js → settings-DeHNwoMv.js} +40 -251
  57. package/bundle/web-dist/server/assets/{show-Cswh_tqs.js → show-8NNdRxhM.js} +3 -3
  58. package/bundle/web-dist/server/assets/{tokens-DiTUwUwr.js → tokens-odgS2-9q.js} +4 -4
  59. package/bundle/web-dist/server/assets/{use-oauth-login-flow-DYKnG4A2.js → use-oauth-login-flow-DTQKdYBO.js} +1 -1
  60. package/bundle/web-dist/server/assets/{use-update-token-mutation-DqGMopII.js → use-update-token-mutation-xvXbPrCI.js} +1 -1
  61. package/bundle/web-dist/server/entry-server.generated.js +10 -10
  62. package/package.json +3 -2
  63. package/skills/qgrid/SKILL.md +1 -1
  64. package/skills/qgrid/references/ai-sdk-provider-contract.md +1 -1
  65. package/skills/qgrid/references/cli-env-and-server-boot.md +12 -9
  66. package/skills/qgrid/references/decision-rationale.md +2 -2
  67. package/skills/qgrid/references/openai-codex-runtime.md +5 -1
  68. package/bundle/dist/utils/process-supervisor.js +0 -22
  69. package/bundle/dist/utils/server-restart.js +0 -61
  70. package/bundle/src/utils/process-supervisor.test.ts +0 -24
  71. package/bundle/src/utils/process-supervisor.ts +0 -17
  72. package/bundle/src/utils/server-restart.test.ts +0 -76
  73. package/bundle/src/utils/server-restart.ts +0 -68
  74. package/bundle/web-dist/client/assets/cost-CpjVoAqp.js +0 -1
  75. package/bundle/web-dist/client/assets/index-D_sagzsR.css +0 -1
  76. package/bundle/web-dist/client/assets/logs-zvdujZWn.js +0 -1
  77. package/bundle/web-dist/client/assets/services.generated-Cbvg2sGQ.js +0 -51
  78. package/bundle/web-dist/client/assets/settings-DwbzT5jo.js +0 -1
@@ -26,14 +26,17 @@ function resolveImageGenerationOptions(options) {
26
26
  };
27
27
  }
28
28
  function imageGenerationCostMethod(options, result) {
29
+ if (result?.content.some((item) => item.type === "image" && item.generation?.route === "codex-responses")) return null;
29
30
  if (result?.content.some((item) => item.type === "image" && item.generation?.route === "codex-images")) return "estimated:gpt-image-2:reported-usage:public-prices:conservative";
30
31
  const resolved = resolveImageGenerationOptions(options);
32
+ if (IMAGE_OUTPUT_COST_MICRO_USD[resolved.quality][resolved.size] === void 0) return null;
31
33
  return `assumed:${CODEX_IMAGE_GENERATION_MODEL}:${resolved.quality}:${resolved.size}:png`;
32
34
  }
33
35
  function estimateImageGenerationCostMicroUsd(result, options) {
34
36
  const images = result.content.filter((item) => item.type === "image");
35
37
  const imageCount = images.length;
36
38
  if (imageCount === 0) return null;
39
+ if (images.some((image) => image.generation?.route === "codex-responses")) return null;
37
40
  if (images.some((image) => image.generation?.route === "codex-images")) {
38
41
  const usage = images.find((image) => image.generation?.usage)?.generation?.usage;
39
42
  if (!usage) return null;
@@ -42,9 +45,10 @@ function estimateImageGenerationCostMicroUsd(result, options) {
42
45
  return Math.round(textTokens * 5 + (usage.input_tokens - textTokens) * 8 + usage.output_tokens * 30);
43
46
  }
44
47
  const resolved = resolveImageGenerationOptions(options);
45
- return imageCount * IMAGE_OUTPUT_COST_MICRO_USD[resolved.quality][resolved.size];
48
+ const unitCost = IMAGE_OUTPUT_COST_MICRO_USD[resolved.quality][resolved.size];
49
+ return unitCost === void 0 ? null : imageCount * unitCost;
46
50
  }
47
51
  //#endregion
48
52
  export { CODEX_IMAGE_GENERATION_MODEL, DEFAULT_IMAGE_GENERATION_QUALITY, DEFAULT_IMAGE_GENERATION_SIZE, estimateImageGenerationCostMicroUsd, imageGenerationCostMethod, resolveImageGenerationOptions };
49
53
 
50
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtaW1hZ2UtZ2VuZXJhdGlvbi5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtaW1hZ2UtZ2VuZXJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0eXBlIEltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gIHR5cGUgSW1hZ2VHZW5lcmF0aW9uUXVhbGl0eSxcbiAgdHlwZSBJbWFnZUdlbmVyYXRpb25TaXplLFxuICB0eXBlIFF1ZXJ5T3V0cHV0LFxufSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgQ09ERVhfSU1BR0VfR0VORVJBVElPTl9NT0RFTCA9IFwiZ3B0LWltYWdlLTJcIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0lNQUdFX0dFTkVSQVRJT05fUVVBTElUWTogSW1hZ2VHZW5lcmF0aW9uUXVhbGl0eSA9IFwibWVkaXVtXCI7XG5leHBvcnQgY29uc3QgREVGQVVMVF9JTUFHRV9HRU5FUkFUSU9OX1NJWkU6IEltYWdlR2VuZXJhdGlvblNpemUgPSBcIjE1MzZ4MTAyNFwiO1xuXG5leHBvcnQgdHlwZSBSZXNvbHZlZEltYWdlR2VuZXJhdGlvbk9wdGlvbnMgPSB7XG4gIHF1YWxpdHk6IEltYWdlR2VuZXJhdGlvblF1YWxpdHk7XG4gIHNpemU6IEltYWdlR2VuZXJhdGlvblNpemU7XG59O1xuXG4vLyBPcGVuQUkgZ3B0LWltYWdlLTIgaW1hZ2Ugb3V0cHV0IGNvc3QgZXN0aW1hdGVzIGJ5IHF1YWxpdHkvc2l6ZTpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL2d1aWRlcy9pbWFnZS1nZW5lcmF0aW9uI2NhbGN1bGF0aW5nLWNvc3RzXG5jb25zdCBJTUFHRV9PVVRQVVRfQ09TVF9NSUNST19VU0Q6IFJlY29yZDxcbiAgSW1hZ2VHZW5lcmF0aW9uUXVhbGl0eSxcbiAgUmVjb3JkPEltYWdlR2VuZXJhdGlvblNpemUsIG51bWJlcj5cbj4gPSB7XG4gIGxvdzoge1xuICAgIFwiMTAyNHgxMDI0XCI6IDZfMDAwLFxuICAgIFwiMTAyNHgxNTM2XCI6IDVfMDAwLFxuICAgIFwiMTUzNngxMDI0XCI6IDVfMDAwLFxuICB9LFxuICBtZWRpdW06IHtcbiAgICBcIjEwMjR4MTAyNFwiOiA1M18wMDAsXG4gICAgXCIxMDI0eDE1MzZcIjogNDFfMDAwLFxuICAgIFwiMTUzNngxMDI0XCI6IDQxXzAwMCxcbiAgfSxcbiAgaGlnaDoge1xuICAgIFwiMTAyNHgxMDI0XCI6IDIxMV8wMDAsXG4gICAgXCIxMDI0eDE1MzZcIjogMTY1XzAwMCxcbiAgICBcIjE1MzZ4MTAyNFwiOiAxNjVfMDAwLFxuICB9LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zKFxuICBvcHRpb25zOiBJbWFnZUdlbmVyYXRpb25PcHRpb25zIHwgdW5kZWZpbmVkLFxuKTogUmVzb2x2ZWRJbWFnZUdlbmVyYXRpb25PcHRpb25zIHtcbiAgcmV0dXJuIHtcbiAgICBxdWFsaXR5OiBvcHRpb25zPy5xdWFsaXR5ID8/IERFRkFVTFRfSU1BR0VfR0VORVJBVElPTl9RVUFMSVRZLFxuICAgIHNpemU6IG9wdGlvbnM/LnNpemUgPz8gREVGQVVMVF9JTUFHRV9HRU5FUkFUSU9OX1NJWkUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZUdlbmVyYXRpb25Db3N0TWV0aG9kKFxuICBvcHRpb25zOiBJbWFnZUdlbmVyYXRpb25PcHRpb25zIHwgdW5kZWZpbmVkLFxuICByZXN1bHQ/OiBRdWVyeU91dHB1dCxcbik6IHN0cmluZyB7XG4gIGlmIChcbiAgICByZXN1bHQ/LmNvbnRlbnQuc29tZShcbiAgICAgIChpdGVtKSA9PiBpdGVtLnR5cGUgPT09IFwiaW1hZ2VcIiAmJiBpdGVtLmdlbmVyYXRpb24/LnJvdXRlID09PSBcImNvZGV4LWltYWdlc1wiLFxuICAgIClcbiAgKSB7XG4gICAgcmV0dXJuIFwiZXN0aW1hdGVkOmdwdC1pbWFnZS0yOnJlcG9ydGVkLXVzYWdlOnB1YmxpYy1wcmljZXM6Y29uc2VydmF0aXZlXCI7XG4gIH1cbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyhvcHRpb25zKTtcbiAgcmV0dXJuIGBhc3N1bWVkOiR7Q09ERVhfSU1BR0VfR0VORVJBVElPTl9NT0RFTH06JHtyZXNvbHZlZC5xdWFsaXR5fToke3Jlc29sdmVkLnNpemV9OnBuZ2A7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlc3RpbWF0ZUltYWdlR2VuZXJhdGlvbkNvc3RNaWNyb1VzZChcbiAgcmVzdWx0OiBRdWVyeU91dHB1dCxcbiAgb3B0aW9uczogSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyB8IHVuZGVmaW5lZCxcbik6IG51bWJlciB8IG51bGwge1xuICBjb25zdCBpbWFnZXMgPSByZXN1bHQuY29udGVudC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gXCJpbWFnZVwiKTtcbiAgY29uc3QgaW1hZ2VDb3VudCA9IGltYWdlcy5sZW5ndGg7XG4gIGlmIChpbWFnZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKGltYWdlcy5zb21lKChpbWFnZSkgPT4gaW1hZ2UuZ2VuZXJhdGlvbj8ucm91dGUgPT09IFwiY29kZXgtaW1hZ2VzXCIpKSB7XG4gICAgLy8gVGhlIHN0YW5kYWxvbmUgcmVzcG9uc2UncyBhZ2dyZWdhdGUgdXNhZ2UgaXMgY2FycmllZCBieSBpdHMgZmlyc3QgaW1hZ2Ugb25seS5cbiAgICAvLyBEbyBub3QgbXVsdGlwbHkgaXQgYnkgb3V0cHV0IGNvdW50IG9yIHByaWNlIGl0IGFzIHRoZSByZXF1ZXN0ZWQgdGV4dCBkcml2ZXIuXG4gICAgY29uc3QgdXNhZ2UgPSBpbWFnZXMuZmluZCgoaW1hZ2UpID0+IGltYWdlLmdlbmVyYXRpb24/LnVzYWdlKT8uZ2VuZXJhdGlvbj8udXNhZ2U7XG4gICAgaWYgKCF1c2FnZSkgcmV0dXJuIG51bGw7XG4gICAgLy8gUHVibGljIEdQVCBJbWFnZSAyIHJhdGVzIHZlcmlmaWVkIDIwMjYtMDktMDg6IHRleHQgaW5wdXQgJDUvTSwgaW1hZ2UgaW5wdXRcbiAgICAvLyAkOC9NLCBvdXRwdXQgJDMwL00uIEFtb3VudHMgYmVsb3cgYXJlIG1pY3JvVVNELCBzbyBubyAvMU0gY29udmVyc2lvbi5cbiAgICAvLyBodHRwczovL2RldmVsb3BlcnMub3BlbmFpLmNvbS9hcGkvZG9jcy9wcmljaW5nI2ltYWdlLWdlbmVyYXRpb25cbiAgICAvLyBVc2UgYSBjb25zaXN0ZW50IHJlcG9ydGVkIHNwbGl0OyB1bmtub3duIGlucHV0IGlzIGNvbnNlcnZhdGl2ZWx5IHByaWNlZCBhc1xuICAgIC8vIGltYWdlcy4gQ2FjaGUgZGlzY291bnRzIGFuZCBwcml2YXRlIHN1YnNjcmlwdGlvbiBiaWxsaW5nIHJlbWFpbiB1bmtub3duLlxuICAgIGNvbnN0IGRldGFpbHMgPSB1c2FnZS5pbnB1dF90b2tlbnNfZGV0YWlscztcbiAgICBjb25zdCB0ZXh0VG9rZW5zID1cbiAgICAgIGRldGFpbHMgJiYgZGV0YWlscy50ZXh0X3Rva2VucyArIGRldGFpbHMuaW1hZ2VfdG9rZW5zIDw9IHVzYWdlLmlucHV0X3Rva2Vuc1xuICAgICAgICA/IGRldGFpbHMudGV4dF90b2tlbnNcbiAgICAgICAgOiAwO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKFxuICAgICAgdGV4dFRva2VucyAqIDUgKyAodXNhZ2UuaW5wdXRfdG9rZW5zIC0gdGV4dFRva2VucykgKiA4ICsgdXNhZ2Uub3V0cHV0X3Rva2VucyAqIDMwLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyhvcHRpb25zKTtcbiAgcmV0dXJuIGltYWdlQ291bnQgKiBJTUFHRV9PVVRQVVRfQ09TVF9NSUNST19VU0RbcmVzb2x2ZWQucXVhbGl0eV1bcmVzb2x2ZWQuc2l6ZV07XG59XG4iXSwibWFwcGluZ3MiOiI7QUFPQSxNQUFhLCtCQUErQjtBQUM1QyxNQUFhLG1DQUEyRDtBQUN4RSxNQUFhLGdDQUFxRDtBQVNsRSxNQUFNLDhCQUdGO0NBQ0YsS0FBSztFQUNILGFBQWE7RUFDYixhQUFhO0VBQ2IsYUFBYTtDQUNmO0NBQ0EsUUFBUTtFQUNOLGFBQWE7RUFDYixhQUFhO0VBQ2IsYUFBYTtDQUNmO0NBQ0EsTUFBTTtFQUNKLGFBQWE7RUFDYixhQUFhO0VBQ2IsYUFBYTtDQUNmO0FBQ0Y7QUFFQSxTQUFnQiw4QkFDZCxTQUNnQztDQUNoQyxPQUFPO0VBQ0wsU0FBUyxTQUFTLFdBQUE7RUFDbEIsTUFBTSxTQUFTLFFBQUE7Q0FDakI7QUFDRjtBQUVBLFNBQWdCLDBCQUNkLFNBQ0EsUUFDUTtDQUNSLElBQ0UsUUFBUSxRQUFRLE1BQ2IsU0FBUyxLQUFLLFNBQVMsV0FBVyxLQUFLLFlBQVksVUFBVSxjQUNoRSxHQUVBLE9BQU87Q0FFVCxNQUFNLFdBQVcsOEJBQThCLE9BQU87Q0FDdEQsT0FBTyxXQUFXLDZCQUE2QixHQUFHLFNBQVMsUUFBUSxHQUFHLFNBQVMsS0FBSztBQUN0RjtBQUVBLFNBQWdCLG9DQUNkLFFBQ0EsU0FDZTtDQUNmLE1BQU0sU0FBUyxPQUFPLFFBQVEsUUFBUSxTQUFTLEtBQUssU0FBUyxPQUFPO0NBQ3BFLE1BQU0sYUFBYSxPQUFPO0NBQzFCLElBQUksZUFBZSxHQUFHLE9BQU87Q0FDN0IsSUFBSSxPQUFPLE1BQU0sVUFBVSxNQUFNLFlBQVksVUFBVSxjQUFjLEdBQUc7RUFHdEUsTUFBTSxRQUFRLE9BQU8sTUFBTSxVQUFVLE1BQU0sWUFBWSxLQUFLLENBQUMsRUFBRSxZQUFZO0VBQzNFLElBQUksQ0FBQyxPQUFPLE9BQU87RUFNbkIsTUFBTSxVQUFVLE1BQU07RUFDdEIsTUFBTSxhQUNKLFdBQVcsUUFBUSxjQUFjLFFBQVEsZ0JBQWdCLE1BQU0sZUFDM0QsUUFBUSxjQUNSO0VBQ04sT0FBTyxLQUFLLE1BQ1YsYUFBYSxLQUFLLE1BQU0sZUFBZSxjQUFjLElBQUksTUFBTSxnQkFBZ0IsRUFDakY7Q0FDRjtDQUNBLE1BQU0sV0FBVyw4QkFBOEIsT0FBTztDQUN0RCxPQUFPLGFBQWEsNEJBQTRCLFNBQVMsUUFBUSxDQUFDLFNBQVM7QUFDN0UifQ==
54
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtaW1hZ2UtZ2VuZXJhdGlvbi5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtaW1hZ2UtZ2VuZXJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0eXBlIEltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gIHR5cGUgSW1hZ2VHZW5lcmF0aW9uUXVhbGl0eSxcbiAgdHlwZSBJbWFnZUdlbmVyYXRpb25TaXplLFxuICB0eXBlIFF1ZXJ5T3V0cHV0LFxufSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgQ09ERVhfSU1BR0VfR0VORVJBVElPTl9NT0RFTCA9IFwiZ3B0LWltYWdlLTJcIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0lNQUdFX0dFTkVSQVRJT05fUVVBTElUWTogSW1hZ2VHZW5lcmF0aW9uUXVhbGl0eSA9IFwibWVkaXVtXCI7XG5leHBvcnQgY29uc3QgREVGQVVMVF9JTUFHRV9HRU5FUkFUSU9OX1NJWkU6IEltYWdlR2VuZXJhdGlvblNpemUgPSBcIjE1MzZ4MTAyNFwiO1xuXG5leHBvcnQgdHlwZSBSZXNvbHZlZEltYWdlR2VuZXJhdGlvbk9wdGlvbnMgPSB7XG4gIHF1YWxpdHk6IEltYWdlR2VuZXJhdGlvblF1YWxpdHk7XG4gIHNpemU6IEltYWdlR2VuZXJhdGlvblNpemU7XG59O1xuXG4vLyBPcGVuQUkgZ3B0LWltYWdlLTIgaW1hZ2Ugb3V0cHV0IGNvc3QgZXN0aW1hdGVzIGJ5IHF1YWxpdHkvc2l6ZTpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL2d1aWRlcy9pbWFnZS1nZW5lcmF0aW9uI2NhbGN1bGF0aW5nLWNvc3RzXG5jb25zdCBJTUFHRV9PVVRQVVRfQ09TVF9NSUNST19VU0Q6IFJlY29yZDxcbiAgSW1hZ2VHZW5lcmF0aW9uUXVhbGl0eSxcbiAgUGFydGlhbDxSZWNvcmQ8SW1hZ2VHZW5lcmF0aW9uU2l6ZSwgbnVtYmVyPj5cbj4gPSB7XG4gIGxvdzoge1xuICAgIFwiMTAyNHgxMDI0XCI6IDZfMDAwLFxuICAgIFwiMTAyNHgxNTM2XCI6IDVfMDAwLFxuICAgIFwiMTUzNngxMDI0XCI6IDVfMDAwLFxuICB9LFxuICBtZWRpdW06IHtcbiAgICBcIjEwMjR4MTAyNFwiOiA1M18wMDAsXG4gICAgXCIxMDI0eDE1MzZcIjogNDFfMDAwLFxuICAgIFwiMTUzNngxMDI0XCI6IDQxXzAwMCxcbiAgfSxcbiAgaGlnaDoge1xuICAgIFwiMTAyNHgxMDI0XCI6IDIxMV8wMDAsXG4gICAgXCIxMDI0eDE1MzZcIjogMTY1XzAwMCxcbiAgICBcIjE1MzZ4MTAyNFwiOiAxNjVfMDAwLFxuICB9LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zKFxuICBvcHRpb25zOiBJbWFnZUdlbmVyYXRpb25PcHRpb25zIHwgdW5kZWZpbmVkLFxuKTogUmVzb2x2ZWRJbWFnZUdlbmVyYXRpb25PcHRpb25zIHtcbiAgcmV0dXJuIHtcbiAgICBxdWFsaXR5OiBvcHRpb25zPy5xdWFsaXR5ID8/IERFRkFVTFRfSU1BR0VfR0VORVJBVElPTl9RVUFMSVRZLFxuICAgIHNpemU6IG9wdGlvbnM/LnNpemUgPz8gREVGQVVMVF9JTUFHRV9HRU5FUkFUSU9OX1NJWkUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZUdlbmVyYXRpb25Db3N0TWV0aG9kKFxuICBvcHRpb25zOiBJbWFnZUdlbmVyYXRpb25PcHRpb25zIHwgdW5kZWZpbmVkLFxuICByZXN1bHQ/OiBRdWVyeU91dHB1dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoXG4gICAgcmVzdWx0Py5jb250ZW50LnNvbWUoXG4gICAgICAoaXRlbSkgPT4gaXRlbS50eXBlID09PSBcImltYWdlXCIgJiYgaXRlbS5nZW5lcmF0aW9uPy5yb3V0ZSA9PT0gXCJjb2RleC1yZXNwb25zZXNcIixcbiAgICApXG4gIClcbiAgICByZXR1cm4gbnVsbDtcbiAgaWYgKFxuICAgIHJlc3VsdD8uY29udGVudC5zb21lKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gXCJpbWFnZVwiICYmIGl0ZW0uZ2VuZXJhdGlvbj8ucm91dGUgPT09IFwiY29kZXgtaW1hZ2VzXCIsXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gXCJlc3RpbWF0ZWQ6Z3B0LWltYWdlLTI6cmVwb3J0ZWQtdXNhZ2U6cHVibGljLXByaWNlczpjb25zZXJ2YXRpdmVcIjtcbiAgfVxuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zKG9wdGlvbnMpO1xuICBpZiAoSU1BR0VfT1VUUFVUX0NPU1RfTUlDUk9fVVNEW3Jlc29sdmVkLnF1YWxpdHldW3Jlc29sdmVkLnNpemVdID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICByZXR1cm4gYGFzc3VtZWQ6JHtDT0RFWF9JTUFHRV9HRU5FUkFUSU9OX01PREVMfToke3Jlc29sdmVkLnF1YWxpdHl9OiR7cmVzb2x2ZWQuc2l6ZX06cG5nYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVzdGltYXRlSW1hZ2VHZW5lcmF0aW9uQ29zdE1pY3JvVXNkKFxuICByZXN1bHQ6IFF1ZXJ5T3V0cHV0LFxuICBvcHRpb25zOiBJbWFnZUdlbmVyYXRpb25PcHRpb25zIHwgdW5kZWZpbmVkLFxuKTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IGltYWdlcyA9IHJlc3VsdC5jb250ZW50LmZpbHRlcigoaXRlbSkgPT4gaXRlbS50eXBlID09PSBcImltYWdlXCIpO1xuICBjb25zdCBpbWFnZUNvdW50ID0gaW1hZ2VzLmxlbmd0aDtcbiAgaWYgKGltYWdlQ291bnQgPT09IDApIHJldHVybiBudWxsO1xuICAvLyBIb3N0ZWQgUmVzcG9uc2VzIHJlcG9ydHMgb2JzZXJ2ZWQgc2V0dGluZ3MgYnV0IG5vIHRydXN0d29ydGh5IGltYWdlIHVzYWdlXG4gIC8vIG9yIGd1YXJhbnRlZWQgaW1hZ2UgbW9kZWwuIFJlcXVlc3RlZCBzaXplL3F1YWxpdHkgY2Fubm90IHByaWNlIHRoYXQgb3V0cHV0LlxuICBpZiAoaW1hZ2VzLnNvbWUoKGltYWdlKSA9PiBpbWFnZS5nZW5lcmF0aW9uPy5yb3V0ZSA9PT0gXCJjb2RleC1yZXNwb25zZXNcIikpIHJldHVybiBudWxsO1xuICBpZiAoaW1hZ2VzLnNvbWUoKGltYWdlKSA9PiBpbWFnZS5nZW5lcmF0aW9uPy5yb3V0ZSA9PT0gXCJjb2RleC1pbWFnZXNcIikpIHtcbiAgICAvLyBUaGUgc3RhbmRhbG9uZSByZXNwb25zZSdzIGFnZ3JlZ2F0ZSB1c2FnZSBpcyBjYXJyaWVkIGJ5IGl0cyBmaXJzdCBpbWFnZSBvbmx5LlxuICAgIC8vIERvIG5vdCBtdWx0aXBseSBpdCBieSBvdXRwdXQgY291bnQgb3IgcHJpY2UgaXQgYXMgdGhlIHJlcXVlc3RlZCB0ZXh0IGRyaXZlci5cbiAgICBjb25zdCB1c2FnZSA9IGltYWdlcy5maW5kKChpbWFnZSkgPT4gaW1hZ2UuZ2VuZXJhdGlvbj8udXNhZ2UpPy5nZW5lcmF0aW9uPy51c2FnZTtcbiAgICBpZiAoIXVzYWdlKSByZXR1cm4gbnVsbDtcbiAgICAvLyBQdWJsaWMgR1BUIEltYWdlIDIgcmF0ZXMgdmVyaWZpZWQgMjAyNi0wOS0wODogdGV4dCBpbnB1dCAkNS9NLCBpbWFnZSBpbnB1dFxuICAgIC8vICQ4L00sIG91dHB1dCAkMzAvTS4gQW1vdW50cyBiZWxvdyBhcmUgbWljcm9VU0QsIHNvIG5vIC8xTSBjb252ZXJzaW9uLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL3ByaWNpbmcjaW1hZ2UtZ2VuZXJhdGlvblxuICAgIC8vIFVzZSBhIGNvbnNpc3RlbnQgcmVwb3J0ZWQgc3BsaXQ7IHVua25vd24gaW5wdXQgaXMgY29uc2VydmF0aXZlbHkgcHJpY2VkIGFzXG4gICAgLy8gaW1hZ2VzLiBDYWNoZSBkaXNjb3VudHMgYW5kIHByaXZhdGUgc3Vic2NyaXB0aW9uIGJpbGxpbmcgcmVtYWluIHVua25vd24uXG4gICAgY29uc3QgZGV0YWlscyA9IHVzYWdlLmlucHV0X3Rva2Vuc19kZXRhaWxzO1xuICAgIGNvbnN0IHRleHRUb2tlbnMgPVxuICAgICAgZGV0YWlscyAmJiBkZXRhaWxzLnRleHRfdG9rZW5zICsgZGV0YWlscy5pbWFnZV90b2tlbnMgPD0gdXNhZ2UuaW5wdXRfdG9rZW5zXG4gICAgICAgID8gZGV0YWlscy50ZXh0X3Rva2Vuc1xuICAgICAgICA6IDA7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoXG4gICAgICB0ZXh0VG9rZW5zICogNSArICh1c2FnZS5pbnB1dF90b2tlbnMgLSB0ZXh0VG9rZW5zKSAqIDggKyB1c2FnZS5vdXRwdXRfdG9rZW5zICogMzAsXG4gICAgKTtcbiAgfVxuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB1bml0Q29zdCA9IElNQUdFX09VVFBVVF9DT1NUX01JQ1JPX1VTRFtyZXNvbHZlZC5xdWFsaXR5XVtyZXNvbHZlZC5zaXplXTtcbiAgcmV0dXJuIHVuaXRDb3N0ID09PSB1bmRlZmluZWQgPyBudWxsIDogaW1hZ2VDb3VudCAqIHVuaXRDb3N0O1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBT0EsTUFBYSwrQkFBK0I7QUFDNUMsTUFBYSxtQ0FBMkQ7QUFDeEUsTUFBYSxnQ0FBcUQ7QUFTbEUsTUFBTSw4QkFHRjtDQUNGLEtBQUs7RUFDSCxhQUFhO0VBQ2IsYUFBYTtFQUNiLGFBQWE7Q0FDZjtDQUNBLFFBQVE7RUFDTixhQUFhO0VBQ2IsYUFBYTtFQUNiLGFBQWE7Q0FDZjtDQUNBLE1BQU07RUFDSixhQUFhO0VBQ2IsYUFBYTtFQUNiLGFBQWE7Q0FDZjtBQUNGO0FBRUEsU0FBZ0IsOEJBQ2QsU0FDZ0M7Q0FDaEMsT0FBTztFQUNMLFNBQVMsU0FBUyxXQUFBO0VBQ2xCLE1BQU0sU0FBUyxRQUFBO0NBQ2pCO0FBQ0Y7QUFFQSxTQUFnQiwwQkFDZCxTQUNBLFFBQ2U7Q0FDZixJQUNFLFFBQVEsUUFBUSxNQUNiLFNBQVMsS0FBSyxTQUFTLFdBQVcsS0FBSyxZQUFZLFVBQVUsaUJBQ2hFLEdBRUEsT0FBTztDQUNULElBQ0UsUUFBUSxRQUFRLE1BQ2IsU0FBUyxLQUFLLFNBQVMsV0FBVyxLQUFLLFlBQVksVUFBVSxjQUNoRSxHQUVBLE9BQU87Q0FFVCxNQUFNLFdBQVcsOEJBQThCLE9BQU87Q0FDdEQsSUFBSSw0QkFBNEIsU0FBUyxRQUFRLENBQUMsU0FBUyxVQUFVLFFBQVcsT0FBTztDQUN2RixPQUFPLFdBQVcsNkJBQTZCLEdBQUcsU0FBUyxRQUFRLEdBQUcsU0FBUyxLQUFLO0FBQ3RGO0FBRUEsU0FBZ0Isb0NBQ2QsUUFDQSxTQUNlO0NBQ2YsTUFBTSxTQUFTLE9BQU8sUUFBUSxRQUFRLFNBQVMsS0FBSyxTQUFTLE9BQU87Q0FDcEUsTUFBTSxhQUFhLE9BQU87Q0FDMUIsSUFBSSxlQUFlLEdBQUcsT0FBTztDQUc3QixJQUFJLE9BQU8sTUFBTSxVQUFVLE1BQU0sWUFBWSxVQUFVLGlCQUFpQixHQUFHLE9BQU87Q0FDbEYsSUFBSSxPQUFPLE1BQU0sVUFBVSxNQUFNLFlBQVksVUFBVSxjQUFjLEdBQUc7RUFHdEUsTUFBTSxRQUFRLE9BQU8sTUFBTSxVQUFVLE1BQU0sWUFBWSxLQUFLLENBQUMsRUFBRSxZQUFZO0VBQzNFLElBQUksQ0FBQyxPQUFPLE9BQU87RUFNbkIsTUFBTSxVQUFVLE1BQU07RUFDdEIsTUFBTSxhQUNKLFdBQVcsUUFBUSxjQUFjLFFBQVEsZ0JBQWdCLE1BQU0sZUFDM0QsUUFBUSxjQUNSO0VBQ04sT0FBTyxLQUFLLE1BQ1YsYUFBYSxLQUFLLE1BQU0sZUFBZSxjQUFjLElBQUksTUFBTSxnQkFBZ0IsRUFDakY7Q0FDRjtDQUNBLE1BQU0sV0FBVyw4QkFBOEIsT0FBTztDQUN0RCxNQUFNLFdBQVcsNEJBQTRCLFNBQVMsUUFBUSxDQUFDLFNBQVM7Q0FDeEUsT0FBTyxhQUFhLFNBQVksT0FBTyxhQUFhO0FBQ3REIn0=
@@ -1,4 +1,4 @@
1
- import { CODEX_IMAGE_GENERATION_MODEL, resolveImageGenerationOptions } from "./qgrid-image-generation.js";
1
+ import { CODEX_IMAGE_GENERATION_MODEL, imageGenerationCostMethod, resolveImageGenerationOptions } from "./qgrid-image-generation.js";
2
2
  //#region src/application/qgrid/qgrid-response-format.ts
3
3
  const CODEX_IMAGE_GENERATION_TOOL_CONFIG = {
4
4
  type: "image_generation",
@@ -33,11 +33,11 @@ function imageGenerationToolArgs(args, options = {}) {
33
33
  ...args.imageGenerationOptions?.outputFormat ? { outputFormat: args.imageGenerationOptions.outputFormat } : {}
34
34
  },
35
35
  ...args.imageGenerationOptions ? { requestedOptions: args.imageGenerationOptions } : {},
36
- ...options.generation ? { observedGeneration: options.generation } : { pricingAssumption: {
36
+ ...options.generation ? { observedGeneration: options.generation } : imageGenerationCostMethod(args.imageGenerationOptions) ? { pricingAssumption: {
37
37
  model: CODEX_IMAGE_GENERATION_MODEL,
38
38
  quality: resolved.quality,
39
39
  size: resolved.size
40
- } }
40
+ } } : {}
41
41
  });
42
42
  }
43
43
  function buildImageGenerationToolSteps(args, images, stepIndex) {
@@ -89,4 +89,4 @@ function base64ByteSize(value) {
89
89
  //#endregion
90
90
  export { CODEX_IMAGE_GENERATION_TOOL_CONFIG, buildImageGenerationToolSteps, formatImagePartForLog, formatResponseForLog, getImageParts, imageGenerationToolArgs };
91
91
 
92
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcmVzcG9uc2UtZm9ybWF0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC1yZXNwb25zZS1mb3JtYXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ09ERVhfSU1BR0VfR0VORVJBVElPTl9NT0RFTCxcbiAgcmVzb2x2ZUltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG59IGZyb20gXCIuL3FncmlkLWltYWdlLWdlbmVyYXRpb25cIjtcbmltcG9ydCB7XG4gIHR5cGUgSW1hZ2VHZW5lcmF0aW9uTWV0YWRhdGEsXG4gIHR5cGUgUWdyaWRDb250ZW50LFxuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBDT0RFWF9JTUFHRV9HRU5FUkFUSU9OX1RPT0xfQ09ORklHID0ge1xuICB0eXBlOiBcImltYWdlX2dlbmVyYXRpb25cIixcbiAgb3V0cHV0Rm9ybWF0OiBcInBuZ1wiLFxufSBhcyBjb25zdDtcblxuZnVuY3Rpb24gZXNjYXBlSHRtbEF0dHJpYnV0ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKVxuICAgIC5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKVxuICAgIC5yZXBsYWNlKC88L2csIFwiJmx0O1wiKVxuICAgIC5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlc3BvbnNlRm9yTG9nKHJlc3VsdDogUXVlcnlPdXRwdXQpOiBzdHJpbmcge1xuICByZXR1cm4gcmVzdWx0LmNvbnRlbnRcbiAgICAuZmxhdE1hcCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJ0ZXh0XCIpIHJldHVybiBbaXRlbS50ZXh0XTtcbiAgICAgIGlmIChpdGVtLnR5cGUgPT09IFwiaW1hZ2VcIikgcmV0dXJuIFtmb3JtYXRJbWFnZVBhcnRGb3JMb2coaXRlbSldO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pXG4gICAgLmZpbHRlcigocGFydCkgPT4gcGFydC5sZW5ndGggPiAwKVxuICAgIC5qb2luKFwiXFxuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1hZ2VQYXJ0cyhyZXN1bHQ6IFF1ZXJ5T3V0cHV0KTogRXh0cmFjdDxRZ3JpZENvbnRlbnQsIHsgdHlwZTogXCJpbWFnZVwiIH0+W10ge1xuICByZXR1cm4gcmVzdWx0LmNvbnRlbnQuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnR5cGUgPT09IFwiaW1hZ2VcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRJbWFnZVBhcnRGb3JMb2coaW1hZ2U6IEV4dHJhY3Q8UWdyaWRDb250ZW50LCB7IHR5cGU6IFwiaW1hZ2VcIiB9Pik6IHN0cmluZyB7XG4gIGNvbnN0IGFsdCA9IGVzY2FwZUh0bWxBdHRyaWJ1dGUoaW1hZ2UucmV2aXNlZFByb21wdCA/PyBcImdlbmVyYXRlZCBpbWFnZVwiKTtcbiAgcmV0dXJuIGA8aW1nIHNyYz1cImRhdGE6JHtpbWFnZS5tZWRpYVR5cGUgPz8gXCJpbWFnZS9wbmdcIn07YmFzZTY0LCR7aW1hZ2UuZGF0YX1cIiBhbHQ9XCIke2FsdH1cIiAvPmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZUdlbmVyYXRpb25Ub29sQXJncyhcbiAgYXJnczogUXVlcnlJbnB1dCxcbiAgb3B0aW9uczogeyBpbmNsdWRlSW5wdXRJbWFnZXM/OiBib29sZWFuOyBnZW5lcmF0aW9uPzogSW1hZ2VHZW5lcmF0aW9uTWV0YWRhdGEgfSA9IHt9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyhhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMpO1xuICBjb25zdCBpbnB1dEltYWdlcyA9XG4gICAgb3B0aW9ucy5pbmNsdWRlSW5wdXRJbWFnZXMgPT09IGZhbHNlID8gW10gOiBleHRyYWN0SW5wdXRJbWFnZXNGb3JUb29sQXJncyhhcmdzKTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICBwcm9tcHQ6IGFyZ3MucHJvbXB0LFxuICAgIC4uLihpbnB1dEltYWdlcy5sZW5ndGggPiAwID8geyBpbnB1dEltYWdlcyB9IDoge30pLFxuICAgIGRyaXZlck1vZGVsOiBhcmdzLm1vZGVsID8/IG51bGwsXG4gICAgdG9vbDoge1xuICAgICAgLi4uQ09ERVhfSU1BR0VfR0VORVJBVElPTl9UT09MX0NPTkZJRyxcbiAgICAgIC4uLihhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnM/Lm91dHB1dEZvcm1hdFxuICAgICAgICA/IHsgb3V0cHV0Rm9ybWF0OiBhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMub3V0cHV0Rm9ybWF0IH1cbiAgICAgICAgOiB7fSksXG4gICAgfSxcbiAgICAuLi4oYXJncy5pbWFnZUdlbmVyYXRpb25PcHRpb25zID8geyByZXF1ZXN0ZWRPcHRpb25zOiBhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMgfSA6IHt9KSxcbiAgICAuLi4ob3B0aW9ucy5nZW5lcmF0aW9uXG4gICAgICA/IHsgb2JzZXJ2ZWRHZW5lcmF0aW9uOiBvcHRpb25zLmdlbmVyYXRpb24gfVxuICAgICAgOiB7XG4gICAgICAgICAgcHJpY2luZ0Fzc3VtcHRpb246IHtcbiAgICAgICAgICAgIG1vZGVsOiBDT0RFWF9JTUFHRV9HRU5FUkFUSU9OX01PREVMLFxuICAgICAgICAgICAgcXVhbGl0eTogcmVzb2x2ZWQucXVhbGl0eSxcbiAgICAgICAgICAgIHNpemU6IHJlc29sdmVkLnNpemUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRJbWFnZUdlbmVyYXRpb25Ub29sU3RlcHMoXG4gIGFyZ3M6IFF1ZXJ5SW5wdXQsXG4gIGltYWdlczogRXh0cmFjdDxRZ3JpZENvbnRlbnQsIHsgdHlwZTogXCJpbWFnZVwiIH0+W10sXG4gIHN0ZXBJbmRleDogbnVtYmVyLFxuKTogQXJyYXk8e1xuICBzdGVwX2luZGV4OiBudW1iZXI7XG4gIHR5cGU6IFwidG9vbF9jYWxsXCI7XG4gIHRvb2xfY2FsbF9pbmRleDogbnVtYmVyO1xuICB0b29sX2NhbGxfaWQ6IHN0cmluZztcbiAgdG9vbF9uYW1lOiBcImltYWdlX2dlbmVyYXRpb25cIjtcbiAgdG9vbF9hcmdzOiBzdHJpbmc7XG4gIHRvb2xfcmVzdWx0OiBzdHJpbmc7XG59PiB7XG4gIGlmIChpbWFnZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgcmV0dXJuIGltYWdlcy5tYXAoKGltYWdlLCBpbmRleCkgPT4gKHtcbiAgICBzdGVwX2luZGV4OiBzdGVwSW5kZXgsXG4gICAgdHlwZTogXCJ0b29sX2NhbGxcIixcbiAgICB0b29sX2NhbGxfaW5kZXg6IGluZGV4LFxuICAgIHRvb2xfY2FsbF9pZDogYGltYWdlX2dlbmVyYXRpb246JHtzdGVwSW5kZXh9OiR7aW5kZXh9YCxcbiAgICB0b29sX25hbWU6IFwiaW1hZ2VfZ2VuZXJhdGlvblwiLFxuICAgIHRvb2xfYXJnczogaW1hZ2VHZW5lcmF0aW9uVG9vbEFyZ3MoYXJncywge1xuICAgICAgaW5jbHVkZUlucHV0SW1hZ2VzOiBpbmRleCA9PT0gMCxcbiAgICAgIGdlbmVyYXRpb246IGltYWdlLmdlbmVyYXRpb24sXG4gICAgfSksXG4gICAgdG9vbF9yZXN1bHQ6IGZvcm1hdEltYWdlUGFydEZvckxvZyhpbWFnZSksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElucHV0SW1hZ2VzRm9yVG9vbEFyZ3MoYXJnczogUXVlcnlJbnB1dCk6IEFycmF5PHtcbiAgbWVkaWFUeXBlPzogc3RyaW5nO1xuICBkYXRhPzogc3RyaW5nO1xuICB1cmw/OiBzdHJpbmc7XG4gIGJ5dGVTaXplPzogbnVtYmVyO1xufT4ge1xuICBjb25zdCBpbWFnZXMgPSBhcmdzLmlucHV0Py5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gXCJpbWFnZVwiKSA/PyBbXTtcbiAgcmV0dXJuIGltYWdlcy5tYXAoKGltYWdlKSA9PiB7XG4gICAgY29uc3QgZGF0YVVybCA9IHBhcnNlRGF0YVVybChpbWFnZS51cmwpO1xuICAgIGlmICghZGF0YVVybCkgcmV0dXJuIHsgdXJsOiBpbWFnZS51cmwgfTtcbiAgICBpZiAoZGF0YVVybC5pc0Jhc2U2NCAmJiBkYXRhVXJsLm1lZGlhVHlwZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJpbWFnZS9cIikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1lZGlhVHlwZTogZGF0YVVybC5tZWRpYVR5cGUsXG4gICAgICAgIGRhdGE6IGRhdGFVcmwuZGF0YSxcbiAgICAgICAgYnl0ZVNpemU6IGJhc2U2NEJ5dGVTaXplKGRhdGFVcmwuZGF0YSksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbWVkaWFUeXBlOiBkYXRhVXJsLm1lZGlhVHlwZSxcbiAgICAgIHVybDogYFtkYXRhLXVybCAke2ltYWdlLnVybC5sZW5ndGh9IGNoYXJzXWAsXG4gICAgICAuLi4oZGF0YVVybC5pc0Jhc2U2NCA/IHsgYnl0ZVNpemU6IGJhc2U2NEJ5dGVTaXplKGRhdGFVcmwuZGF0YSkgfSA6IHt9KSxcbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VEYXRhVXJsKFxuICB2YWx1ZTogc3RyaW5nLFxuKTogeyBtZWRpYVR5cGU6IHN0cmluZzsgZGF0YTogc3RyaW5nOyBpc0Jhc2U2NDogYm9vbGVhbiB9IHwgbnVsbCB7XG4gIGNvbnN0IG1hdGNoID0gL15kYXRhOihbXjssXSspKCg/OjtbXixdKikqKSwoLiopJC9pcy5leGVjKHZhbHVlKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHBhcmFtcyA9IG1hdGNoWzJdIS50b0xvd2VyQ2FzZSgpLnNwbGl0KFwiO1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gIHJldHVybiB7IG1lZGlhVHlwZTogbWF0Y2hbMV0hLCBkYXRhOiBtYXRjaFszXSEsIGlzQmFzZTY0OiBwYXJhbXMuaW5jbHVkZXMoXCJiYXNlNjRcIikgfTtcbn1cblxuZnVuY3Rpb24gYmFzZTY0Qnl0ZVNpemUodmFsdWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSAvXFxzLy50ZXN0KHZhbHVlKSA/IHZhbHVlLnJlcGxhY2UoL1xccy9nLCBcIlwiKSA6IHZhbHVlO1xuICBjb25zdCBwYWRkaW5nID0gbm9ybWFsaXplZC5lbmRzV2l0aChcIj09XCIpID8gMiA6IG5vcm1hbGl6ZWQuZW5kc1dpdGgoXCI9XCIpID8gMSA6IDA7XG4gIHJldHVybiBNYXRoLm1heChNYXRoLmZsb29yKChub3JtYWxpemVkLmxlbmd0aCAqIDMpIC8gNCkgLSBwYWRkaW5nLCAwKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFXQSxNQUFhLHFDQUFxQztDQUNoRCxNQUFNO0NBQ04sY0FBYztBQUNoQjtBQUVBLFNBQVMsb0JBQW9CLE9BQXVCO0NBQ2xELE9BQU8sTUFDSixRQUFRLE1BQU0sT0FBTyxDQUFDLENBQ3RCLFFBQVEsTUFBTSxRQUFRLENBQUMsQ0FDdkIsUUFBUSxNQUFNLE1BQU0sQ0FBQyxDQUNyQixRQUFRLE1BQU0sTUFBTTtBQUN6QjtBQUVBLFNBQWdCLHFCQUFxQixRQUE2QjtDQUNoRSxPQUFPLE9BQU8sUUFDWCxTQUFTLFNBQVM7RUFDakIsSUFBSSxLQUFLLFNBQVMsUUFBUSxPQUFPLENBQUMsS0FBSyxJQUFJO0VBQzNDLElBQUksS0FBSyxTQUFTLFNBQVMsT0FBTyxDQUFDLHNCQUFzQixJQUFJLENBQUM7RUFDOUQsT0FBTyxDQUFDO0NBQ1YsQ0FBQyxDQUFDLENBQ0QsUUFBUSxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FDakMsS0FBSyxJQUFJO0FBQ2Q7QUFFQSxTQUFnQixjQUFjLFFBQWlFO0NBQzdGLE9BQU8sT0FBTyxRQUFRLFFBQVEsU0FBUyxLQUFLLFNBQVMsT0FB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
92
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcmVzcG9uc2UtZm9ybWF0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC1yZXNwb25zZS1mb3JtYXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ09ERVhfSU1BR0VfR0VORVJBVElPTl9NT0RFTCxcbiAgaW1hZ2VHZW5lcmF0aW9uQ29zdE1ldGhvZCxcbiAgcmVzb2x2ZUltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG59IGZyb20gXCIuL3FncmlkLWltYWdlLWdlbmVyYXRpb25cIjtcbmltcG9ydCB7XG4gIHR5cGUgSW1hZ2VHZW5lcmF0aW9uTWV0YWRhdGEsXG4gIHR5cGUgUWdyaWRDb250ZW50LFxuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBDT0RFWF9JTUFHRV9HRU5FUkFUSU9OX1RPT0xfQ09ORklHID0ge1xuICB0eXBlOiBcImltYWdlX2dlbmVyYXRpb25cIixcbiAgb3V0cHV0Rm9ybWF0OiBcInBuZ1wiLFxufSBhcyBjb25zdDtcblxuZnVuY3Rpb24gZXNjYXBlSHRtbEF0dHJpYnV0ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKVxuICAgIC5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKVxuICAgIC5yZXBsYWNlKC88L2csIFwiJmx0O1wiKVxuICAgIC5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlc3BvbnNlRm9yTG9nKHJlc3VsdDogUXVlcnlPdXRwdXQpOiBzdHJpbmcge1xuICByZXR1cm4gcmVzdWx0LmNvbnRlbnRcbiAgICAuZmxhdE1hcCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJ0ZXh0XCIpIHJldHVybiBbaXRlbS50ZXh0XTtcbiAgICAgIGlmIChpdGVtLnR5cGUgPT09IFwiaW1hZ2VcIikgcmV0dXJuIFtmb3JtYXRJbWFnZVBhcnRGb3JMb2coaXRlbSldO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pXG4gICAgLmZpbHRlcigocGFydCkgPT4gcGFydC5sZW5ndGggPiAwKVxuICAgIC5qb2luKFwiXFxuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1hZ2VQYXJ0cyhyZXN1bHQ6IFF1ZXJ5T3V0cHV0KTogRXh0cmFjdDxRZ3JpZENvbnRlbnQsIHsgdHlwZTogXCJpbWFnZVwiIH0+W10ge1xuICByZXR1cm4gcmVzdWx0LmNvbnRlbnQuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnR5cGUgPT09IFwiaW1hZ2VcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRJbWFnZVBhcnRGb3JMb2coaW1hZ2U6IEV4dHJhY3Q8UWdyaWRDb250ZW50LCB7IHR5cGU6IFwiaW1hZ2VcIiB9Pik6IHN0cmluZyB7XG4gIGNvbnN0IGFsdCA9IGVzY2FwZUh0bWxBdHRyaWJ1dGUoaW1hZ2UucmV2aXNlZFByb21wdCA/PyBcImdlbmVyYXRlZCBpbWFnZVwiKTtcbiAgcmV0dXJuIGA8aW1nIHNyYz1cImRhdGE6JHtpbWFnZS5tZWRpYVR5cGUgPz8gXCJpbWFnZS9wbmdcIn07YmFzZTY0LCR7aW1hZ2UuZGF0YX1cIiBhbHQ9XCIke2FsdH1cIiAvPmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZUdlbmVyYXRpb25Ub29sQXJncyhcbiAgYXJnczogUXVlcnlJbnB1dCxcbiAgb3B0aW9uczogeyBpbmNsdWRlSW5wdXRJbWFnZXM/OiBib29sZWFuOyBnZW5lcmF0aW9uPzogSW1hZ2VHZW5lcmF0aW9uTWV0YWRhdGEgfSA9IHt9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyhhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMpO1xuICBjb25zdCBpbnB1dEltYWdlcyA9XG4gICAgb3B0aW9ucy5pbmNsdWRlSW5wdXRJbWFnZXMgPT09IGZhbHNlID8gW10gOiBleHRyYWN0SW5wdXRJbWFnZXNGb3JUb29sQXJncyhhcmdzKTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICBwcm9tcHQ6IGFyZ3MucHJvbXB0LFxuICAgIC4uLihpbnB1dEltYWdlcy5sZW5ndGggPiAwID8geyBpbnB1dEltYWdlcyB9IDoge30pLFxuICAgIGRyaXZlck1vZGVsOiBhcmdzLm1vZGVsID8/IG51bGwsXG4gICAgdG9vbDoge1xuICAgICAgLi4uQ09ERVhfSU1BR0VfR0VORVJBVElPTl9UT09MX0NPTkZJRyxcbiAgICAgIC4uLihhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnM/Lm91dHB1dEZvcm1hdFxuICAgICAgICA/IHsgb3V0cHV0Rm9ybWF0OiBhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMub3V0cHV0Rm9ybWF0IH1cbiAgICAgICAgOiB7fSksXG4gICAgfSxcbiAgICAuLi4oYXJncy5pbWFnZUdlbmVyYXRpb25PcHRpb25zID8geyByZXF1ZXN0ZWRPcHRpb25zOiBhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMgfSA6IHt9KSxcbiAgICAuLi4ob3B0aW9ucy5nZW5lcmF0aW9uXG4gICAgICA/IHsgb2JzZXJ2ZWRHZW5lcmF0aW9uOiBvcHRpb25zLmdlbmVyYXRpb24gfVxuICAgICAgOiBpbWFnZUdlbmVyYXRpb25Db3N0TWV0aG9kKGFyZ3MuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucylcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBwcmljaW5nQXNzdW1wdGlvbjoge1xuICAgICAgICAgICAgICBtb2RlbDogQ09ERVhfSU1BR0VfR0VORVJBVElPTl9NT0RFTCxcbiAgICAgICAgICAgICAgcXVhbGl0eTogcmVzb2x2ZWQucXVhbGl0eSxcbiAgICAgICAgICAgICAgc2l6ZTogcmVzb2x2ZWQuc2l6ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEltYWdlR2VuZXJhdGlvblRvb2xTdGVwcyhcbiAgYXJnczogUXVlcnlJbnB1dCxcbiAgaW1hZ2VzOiBFeHRyYWN0PFFncmlkQ29udGVudCwgeyB0eXBlOiBcImltYWdlXCIgfT5bXSxcbiAgc3RlcEluZGV4OiBudW1iZXIsXG4pOiBBcnJheTx7XG4gIHN0ZXBfaW5kZXg6IG51bWJlcjtcbiAgdHlwZTogXCJ0b29sX2NhbGxcIjtcbiAgdG9vbF9jYWxsX2luZGV4OiBudW1iZXI7XG4gIHRvb2xfY2FsbF9pZDogc3RyaW5nO1xuICB0b29sX25hbWU6IFwiaW1hZ2VfZ2VuZXJhdGlvblwiO1xuICB0b29sX2FyZ3M6IHN0cmluZztcbiAgdG9vbF9yZXN1bHQ6IHN0cmluZztcbn0+IHtcbiAgaWYgKGltYWdlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICByZXR1cm4gaW1hZ2VzLm1hcCgoaW1hZ2UsIGluZGV4KSA9PiAoe1xuICAgIHN0ZXBfaW5kZXg6IHN0ZXBJbmRleCxcbiAgICB0eXBlOiBcInRvb2xfY2FsbFwiLFxuICAgIHRvb2xfY2FsbF9pbmRleDogaW5kZXgsXG4gICAgdG9vbF9jYWxsX2lkOiBgaW1hZ2VfZ2VuZXJhdGlvbjoke3N0ZXBJbmRleH06JHtpbmRleH1gLFxuICAgIHRvb2xfbmFtZTogXCJpbWFnZV9nZW5lcmF0aW9uXCIsXG4gICAgdG9vbF9hcmdzOiBpbWFnZUdlbmVyYXRpb25Ub29sQXJncyhhcmdzLCB7XG4gICAgICBpbmNsdWRlSW5wdXRJbWFnZXM6IGluZGV4ID09PSAwLFxuICAgICAgZ2VuZXJhdGlvbjogaW1hZ2UuZ2VuZXJhdGlvbixcbiAgICB9KSxcbiAgICB0b29sX3Jlc3VsdDogZm9ybWF0SW1hZ2VQYXJ0Rm9yTG9nKGltYWdlKSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SW5wdXRJbWFnZXNGb3JUb29sQXJncyhhcmdzOiBRdWVyeUlucHV0KTogQXJyYXk8e1xuICBtZWRpYVR5cGU/OiBzdHJpbmc7XG4gIGRhdGE/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbiAgYnl0ZVNpemU/OiBudW1iZXI7XG59PiB7XG4gIGNvbnN0IGltYWdlcyA9IGFyZ3MuaW5wdXQ/LmZpbHRlcigoaXRlbSkgPT4gaXRlbS50eXBlID09PSBcImltYWdlXCIpID8/IFtdO1xuICByZXR1cm4gaW1hZ2VzLm1hcCgoaW1hZ2UpID0+IHtcbiAgICBjb25zdCBkYXRhVXJsID0gcGFyc2VEYXRhVXJsKGltYWdlLnVybCk7XG4gICAgaWYgKCFkYXRhVXJsKSByZXR1cm4geyB1cmw6IGltYWdlLnVybCB9O1xuICAgIGlmIChkYXRhVXJsLmlzQmFzZTY0ICYmIGRhdGFVcmwubWVkaWFUeXBlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcImltYWdlL1wiKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWVkaWFUeXBlOiBkYXRhVXJsLm1lZGlhVHlwZSxcbiAgICAgICAgZGF0YTogZGF0YVVybC5kYXRhLFxuICAgICAgICBieXRlU2l6ZTogYmFzZTY0Qnl0ZVNpemUoZGF0YVVybC5kYXRhKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBtZWRpYVR5cGU6IGRhdGFVcmwubWVkaWFUeXBlLFxuICAgICAgdXJsOiBgW2RhdGEtdXJsICR7aW1hZ2UudXJsLmxlbmd0aH0gY2hhcnNdYCxcbiAgICAgIC4uLihkYXRhVXJsLmlzQmFzZTY0ID8geyBieXRlU2l6ZTogYmFzZTY0Qnl0ZVNpemUoZGF0YVVybC5kYXRhKSB9IDoge30pLFxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZURhdGFVcmwoXG4gIHZhbHVlOiBzdHJpbmcsXG4pOiB7IG1lZGlhVHlwZTogc3RyaW5nOyBkYXRhOiBzdHJpbmc7IGlzQmFzZTY0OiBib29sZWFuIH0gfCBudWxsIHtcbiAgY29uc3QgbWF0Y2ggPSAvXmRhdGE6KFteOyxdKykoKD86O1teLF0qKSopLCguKikkL2lzLmV4ZWModmFsdWUpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcGFyYW1zID0gbWF0Y2hbMl0hLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCI7XCIpLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIHsgbWVkaWFUeXBlOiBtYXRjaFsxXSEsIGRhdGE6IG1hdGNoWzNdISwgaXNCYXNlNjQ6IHBhcmFtcy5pbmNsdWRlcyhcImJhc2U2NFwiKSB9O1xufVxuXG5mdW5jdGlvbiBiYXNlNjRCeXRlU2l6ZSh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IC9cXHMvLnRlc3QodmFsdWUpID8gdmFsdWUucmVwbGFjZSgvXFxzL2csIFwiXCIpIDogdmFsdWU7XG4gIGNvbnN0IHBhZGRpbmcgPSBub3JtYWxpemVkLmVuZHNXaXRoKFwiPT1cIikgPyAyIDogbm9ybWFsaXplZC5lbmRzV2l0aChcIj1cIikgPyAxIDogMDtcbiAgcmV0dXJuIE1hdGgubWF4KE1hdGguZmxvb3IoKG5vcm1hbGl6ZWQubGVuZ3RoICogMykgLyA0KSAtIHBhZGRpbmcsIDApO1xufVxuIl0sIm1hcHBpbmdzIjoiOztBQVlBLE1BQWEscUNBQXFDO0NBQ2hELE1BQU07Q0FDTixjQUFjO0FBQ2hCO0FBRUEsU0FBUyxvQkFBb0IsT0FBdUI7Q0FDbEQsT0FBTyxNQUNKLFFBQVEsTUFBTSxPQUFPLENBQUMsQ0FDdEIsUUFBUSxNQUFNLFFBQVEsQ0FBQyxDQUN2QixRQUFRLE1BQU0sTUFBTSxDQUFDLENBQ3JCLFFBQVEsTUFBTSxNQUFNO0FBQ3pCO0FBRUEsU0FBZ0IscUJBQXFCLFFBQTZCO0NBQ2hFLE9BQU8sT0FBTyxRQUNYLFNBQVMsU0FBUztFQUNqQixJQUFJLEtBQUssU0FBUyxRQUFRLE9BQU8sQ0FBQyxLQUFLLElBQUk7RUFDM0MsSUFBSSxLQUFLLFNBQVMsU0FBUyxPQUFPLENBQUMsc0JBQXNCLElBQUksQ0FBQztFQUM5RCxPQUFPLENBQUM7Q0FDVixDQUFDLENBQUMs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
@@ -1,9 +1,6 @@
1
- import { SD } from "../../i18n/sd.generated.js";
2
1
  import { RequestLogModel } from "../request-log/request-log.model.js";
3
- import { isRestartPending } from "../../utils/server-restart.js";
4
2
  import { estimateImageGenerationCostMicroUsd, imageGenerationCostMethod } from "./qgrid-image-generation.js";
5
3
  import { buildImageGenerationToolSteps, formatResponseForLog, getImageParts } from "./qgrid-response-format.js";
6
- import { ServiceUnavailableException } from "sonamu";
7
4
  import { getLogger } from "@logtape/logtape";
8
5
  //#region src/application/qgrid/qgrid-run-lifecycle.ts
9
6
  const logger = getLogger(["qgrid", "run-lifecycle"]);
@@ -11,35 +8,6 @@ const STALE_RUN_THRESHOLD_MS = 1800 * 1e3;
11
8
  const STALE_CLEANUP_INTERVAL_MS = 60 * 1e3;
12
9
  let staleCleanupInFlight;
13
10
  let lastStaleCleanupStartedAt = 0;
14
- const activeNativeRunRefs = /* @__PURE__ */ new Map();
15
- const interruptedNativeRunIds = /* @__PURE__ */ new Set();
16
- const activeNativeFinalizers = /* @__PURE__ */ new Map();
17
- function restartUnavailable() {
18
- return new ServiceUnavailableException(SD("qgrid.restartPending")());
19
- }
20
- function registerNativeRun(requestLogId) {
21
- activeNativeRunRefs.set(requestLogId, (activeNativeRunRefs.get(requestLogId) ?? 0) + 1);
22
- }
23
- function releaseNativeRun(requestLogId) {
24
- const refs = activeNativeRunRefs.get(requestLogId);
25
- if (refs === void 0 || refs <= 1) activeNativeRunRefs.delete(requestLogId);
26
- else activeNativeRunRefs.set(requestLogId, refs - 1);
27
- }
28
- function trackNativeFinalizer(requestLogId, finalize) {
29
- const operation = finalize();
30
- const settled = operation.then(() => void 0, () => void 0);
31
- const finalizers = activeNativeFinalizers.get(requestLogId) ?? /* @__PURE__ */ new Set();
32
- finalizers.add(settled);
33
- activeNativeFinalizers.set(requestLogId, finalizers);
34
- settled.then(() => {
35
- finalizers.delete(settled);
36
- if (finalizers.size === 0) activeNativeFinalizers.delete(requestLogId);
37
- });
38
- return operation;
39
- }
40
- function assertNativeRunAdmission() {
41
- if (isRestartPending()) throw restartUnavailable();
42
- }
43
11
  function withProviderPrefix(routeModel, model) {
44
12
  if (!model) return void 0;
45
13
  if (model.includes("/")) return model;
@@ -78,7 +46,6 @@ function isParseableJson(text) {
78
46
  * 2) afterQuery: generate step + tool-call step + finish/keep-open
79
47
  */
80
48
  async function beforeQuery(args) {
81
- assertNativeRunAdmission();
82
49
  let requestLogId;
83
50
  let stepIndex = 0;
84
51
  if (args.runContext?.requestLogId !== void 0) {
@@ -99,126 +66,82 @@ async function beforeQuery(args) {
99
66
  json_schema: args.jsonSchema ?? null
100
67
  });
101
68
  }
102
- if (isRestartPending()) {
103
- await finishTerminalRun(requestLogId, "error", "server restarted");
104
- throw restartUnavailable();
105
- }
106
- registerNativeRun(requestLogId);
107
69
  return {
108
70
  requestLogId,
109
71
  stepIndex
110
72
  };
111
73
  }
112
74
  async function afterQuery(requestLogId, stepIndex, args, result) {
113
- if (interruptedNativeRunIds.has(requestLogId)) return {};
114
- return trackNativeFinalizer(requestLogId, async () => {
115
- try {
116
- const requestedModelName = withProviderPrefix(args.model, args.model ?? result.requestedModel ?? result.model);
117
- const servedModelName = withProviderPrefix(args.model, result.model);
75
+ const requestedModelName = withProviderPrefix(args.model, args.model ?? result.requestedModel ?? result.model);
76
+ const servedModelName = withProviderPrefix(args.model, result.model);
77
+ await RequestLogModel.appendStep(requestLogId, {
78
+ step_index: stepIndex,
79
+ type: "generate",
80
+ model_name: servedModelName,
81
+ requested_model_name: requestedModelName,
82
+ fallback_count: result.modelFallbacks?.length ?? 0,
83
+ input_tokens: result.usage.input_tokens,
84
+ output_tokens: result.usage.output_tokens,
85
+ cache_read_tokens: result.usage.cache_read_input_tokens,
86
+ cache_creation_tokens: result.usage.cache_creation_input_tokens,
87
+ cache_creation_5m_tokens: result.usage.cache_creation_5m_input_tokens,
88
+ cache_creation_1h_tokens: result.usage.cache_creation_1h_input_tokens,
89
+ cost_usd: Math.round(result.costUsd * 1e6),
90
+ cost_source: result.costSource,
91
+ duration_ms: result.durationMs,
92
+ ttft_ms: result.ttftMs,
93
+ finish_reason: result.finishReason
94
+ });
95
+ const imageParts = getImageParts(result);
96
+ const imageCostMicroUsd = estimateImageGenerationCostMicroUsd(result, args.imageGenerationOptions);
97
+ for (const step of buildImageGenerationToolSteps(args, imageParts, stepIndex)) await RequestLogModel.appendStep(requestLogId, step);
98
+ if (result.finishReason === "tool-calls") {
99
+ const toolCalls = result.content.filter((c) => c.type === "tool-call");
100
+ for (let i = 0; i < toolCalls.length; i++) {
101
+ const tc = toolCalls[i];
102
+ if (tc.type !== "tool-call") continue;
118
103
  await RequestLogModel.appendStep(requestLogId, {
119
104
  step_index: stepIndex,
120
- type: "generate",
121
- model_name: servedModelName,
122
- requested_model_name: requestedModelName,
123
- fallback_count: result.modelFallbacks?.length ?? 0,
124
- input_tokens: result.usage.input_tokens,
125
- output_tokens: result.usage.output_tokens,
126
- cache_read_tokens: result.usage.cache_read_input_tokens,
127
- cache_creation_tokens: result.usage.cache_creation_input_tokens,
128
- cache_creation_5m_tokens: result.usage.cache_creation_5m_input_tokens,
129
- cache_creation_1h_tokens: result.usage.cache_creation_1h_input_tokens,
130
- cost_usd: Math.round(result.costUsd * 1e6),
131
- cost_source: result.costSource,
132
- duration_ms: result.durationMs,
133
- ttft_ms: result.ttftMs,
134
- finish_reason: result.finishReason
135
- });
136
- const imageParts = getImageParts(result);
137
- const imageCostMicroUsd = estimateImageGenerationCostMicroUsd(result, args.imageGenerationOptions);
138
- for (const step of buildImageGenerationToolSteps(args, imageParts, stepIndex)) await RequestLogModel.appendStep(requestLogId, step);
139
- if (result.finishReason === "tool-calls") {
140
- const toolCalls = result.content.filter((c) => c.type === "tool-call");
141
- for (let i = 0; i < toolCalls.length; i++) {
142
- const tc = toolCalls[i];
143
- if (tc.type !== "tool-call") continue;
144
- await RequestLogModel.appendStep(requestLogId, {
145
- step_index: stepIndex,
146
- type: "tool_call",
147
- tool_call_index: imageParts.length + i,
148
- tool_call_id: tc.toolCallId,
149
- tool_name: tc.toolName,
150
- tool_args: tc.input
151
- });
152
- }
153
- return { runContext: { requestLogId } };
154
- }
155
- const agg = await RequestLogModel.aggregateStepUsage(requestLogId);
156
- const responseText = formatResponseForLog(result);
157
- await RequestLogModel.finishRun(requestLogId, {
158
- status: "succeeded",
159
- response: responseText,
160
- response_json_ok: args.jsonSchema ? isParseableJson(responseText) : null,
161
- token_name: result.tokenName,
162
- input_tokens: agg.input_tokens,
163
- output_tokens: agg.output_tokens,
164
- cache_read_tokens: agg.cache_read_tokens,
165
- cache_creation_tokens: agg.cache_creation_tokens,
166
- cache_creation_5m_tokens: agg.cache_creation_5m_tokens,
167
- cache_creation_1h_tokens: agg.cache_creation_1h_tokens,
168
- duration_ms: agg.duration_ms,
169
- requested_model_name: requestedModelName,
170
- model_name: servedModelName,
171
- fallback_count: agg.fallback_count,
172
- cost_usd: agg.cost_usd,
173
- cost_source: agg.cost_source,
174
- image_cost_usd: imageCostMicroUsd,
175
- ...imageParts.length > 0 ? { is_image_generation: true } : {},
176
- image_cost_method: imageCostMicroUsd !== null ? imageGenerationCostMethod(args.imageGenerationOptions, result) : null,
177
- history: filterHistoryForStorage(args.history)
105
+ type: "tool_call",
106
+ tool_call_index: imageParts.length + i,
107
+ tool_call_id: tc.toolCallId,
108
+ tool_name: tc.toolName,
109
+ tool_args: tc.input
178
110
  });
179
- return {};
180
- } finally {
181
- releaseNativeRun(requestLogId);
182
111
  }
112
+ return { runContext: { requestLogId } };
113
+ }
114
+ const agg = await RequestLogModel.aggregateStepUsage(requestLogId);
115
+ const responseText = formatResponseForLog(result);
116
+ await RequestLogModel.finishRun(requestLogId, {
117
+ status: "succeeded",
118
+ response: responseText,
119
+ response_json_ok: args.jsonSchema ? isParseableJson(responseText) : null,
120
+ token_name: result.tokenName,
121
+ input_tokens: agg.input_tokens,
122
+ output_tokens: agg.output_tokens,
123
+ cache_read_tokens: agg.cache_read_tokens,
124
+ cache_creation_tokens: agg.cache_creation_tokens,
125
+ cache_creation_5m_tokens: agg.cache_creation_5m_tokens,
126
+ cache_creation_1h_tokens: agg.cache_creation_1h_tokens,
127
+ duration_ms: agg.duration_ms,
128
+ requested_model_name: requestedModelName,
129
+ model_name: servedModelName,
130
+ fallback_count: agg.fallback_count,
131
+ cost_usd: agg.cost_usd,
132
+ cost_source: agg.cost_source,
133
+ image_cost_usd: imageCostMicroUsd,
134
+ ...imageParts.length > 0 ? { is_image_generation: true } : {},
135
+ image_cost_method: imageCostMicroUsd !== null ? imageGenerationCostMethod(args.imageGenerationOptions, result) : null,
136
+ history: filterHistoryForStorage(args.history)
183
137
  });
138
+ return {};
184
139
  }
185
140
  async function finishRunWithError(requestLogId, errorMessage, args) {
186
- if (interruptedNativeRunIds.has(requestLogId)) return;
187
- return trackNativeFinalizer(requestLogId, async () => {
188
- try {
189
- await finishTerminalRun(requestLogId, "error", errorMessage, args);
190
- } finally {
191
- releaseNativeRun(requestLogId);
192
- }
193
- });
141
+ await finishTerminalRun(requestLogId, "error", errorMessage, args);
194
142
  }
195
143
  async function finishRunAborted(requestLogId, args) {
196
- if (interruptedNativeRunIds.has(requestLogId)) return;
197
- return trackNativeFinalizer(requestLogId, async () => {
198
- try {
199
- await finishTerminalRun(requestLogId, "aborted", "client disconnected", args);
200
- } finally {
201
- releaseNativeRun(requestLogId);
202
- }
203
- });
204
- }
205
- /** 현재 이 프로세스가 provider를 실행 중인 native run만 재시작 오류로 마감한다. */
206
- async function finishActiveNativeRunsForRestart() {
207
- const requestLogIds = [...activeNativeRunRefs.keys()];
208
- for (const requestLogId of requestLogIds) {
209
- interruptedNativeRunIds.add(requestLogId);
210
- activeNativeRunRefs.delete(requestLogId);
211
- }
212
- await Promise.all(requestLogIds.map(async (requestLogId) => {
213
- await Promise.all(activeNativeFinalizers.get(requestLogId) ?? []);
214
- await finishTerminalRun(requestLogId, "error", "server restarted");
215
- }));
216
- }
217
- /** 프로세스 전역 registry를 격리해야 하는 단위 테스트 전용. */
218
- function resetNativeRunRegistryForTests() {
219
- activeNativeRunRefs.clear();
220
- interruptedNativeRunIds.clear();
221
- activeNativeFinalizers.clear();
144
+ await finishTerminalRun(requestLogId, "aborted", "client disconnected", args);
222
145
  }
223
146
  async function finishTerminalRun(requestLogId, status, errorMessage, args) {
224
147
  try {
@@ -274,6 +197,6 @@ async function performStaleRunCleanup() {
274
197
  }
275
198
  }
276
199
  //#endregion
277
- export { afterQuery, assertNativeRunAdmission, beforeQuery, finishActiveNativeRunsForRestart, finishRunAborted, finishRunWithError, resetNativeRunRegistryForTests };
200
+ export { afterQuery, beforeQuery, finishRunAborted, finishRunWithError };
278
201
 
279
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcnVuLWxpZmVjeWNsZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtcnVuLWxpZmVjeWNsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIH0gZnJvbSBcInNvbmFtdVwiO1xuXG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi8uLi9pMThuL3NkLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgaXNSZXN0YXJ0UGVuZGluZyB9IGZyb20gXCIuLi8uLi91dGlscy9zZXJ2ZXItcmVzdGFydFwiO1xuaW1wb3J0IHsgUmVxdWVzdExvZ01vZGVsIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsXCI7XG5pbXBvcnQge1xuICBlc3RpbWF0ZUltYWdlR2VuZXJhdGlvbkNvc3RNaWNyb1VzZCxcbiAgaW1hZ2VHZW5lcmF0aW9uQ29zdE1ldGhvZCxcbn0gZnJvbSBcIi4vcWdyaWQtaW1hZ2UtZ2VuZXJhdGlvblwiO1xuaW1wb3J0IHtcbiAgYnVpbGRJbWFnZUdlbmVyYXRpb25Ub29sU3RlcHMsXG4gIGZvcm1hdFJlc3BvbnNlRm9yTG9nLFxuICBnZXRJbWFnZVBhcnRzLFxufSBmcm9tIFwiLi9xZ3JpZC1yZXNwb25zZS1mb3JtYXRcIjtcbmltcG9ydCB7IHR5cGUgUWdyaWRSdW5Db250ZXh0LCB0eXBlIFF1ZXJ5SW5wdXQsIHR5cGUgUXVlcnlPdXRwdXQgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJydW4tbGlmZWN5Y2xlXCJdKTtcbmNvbnN0IFNUQUxFX1JVTl9USFJFU0hPTERfTVMgPSAzMCAqIDYwICogMTAwMDtcbmNvbnN0IFNUQUxFX0NMRUFOVVBfSU5URVJWQUxfTVMgPSA2MCAqIDEwMDA7XG5sZXQgc3RhbGVDbGVhbnVwSW5GbGlnaHQ6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG5sZXQgbGFzdFN0YWxlQ2xlYW51cFN0YXJ0ZWRBdCA9IDA7XG5jb25zdCBhY3RpdmVOYXRpdmVSdW5SZWZzID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbmNvbnN0IGludGVycnVwdGVkTmF0aXZlUnVuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG5jb25zdCBhY3RpdmVOYXRpdmVGaW5hbGl6ZXJzID0gbmV3IE1hcDxudW1iZXIsIFNldDxQcm9taXNlPHZvaWQ+Pj4oKTtcblxuZnVuY3Rpb24gcmVzdGFydFVuYXZhaWxhYmxlKCk6IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiB7XG4gIHJldHVybiBuZXcgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKFNEKFwicWdyaWQucmVzdGFydFBlbmRpbmdcIikoKSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyTmF0aXZlUnVuKHJlcXVlc3RMb2dJZDogbnVtYmVyKTogdm9pZCB7XG4gIGFjdGl2ZU5hdGl2ZVJ1blJlZnMuc2V0KHJlcXVlc3RMb2dJZCwgKGFjdGl2ZU5hdGl2ZVJ1blJlZnMuZ2V0KHJlcXVlc3RMb2dJZCkgPz8gMCkgKyAxKTtcbn1cblxuZnVuY3Rpb24gcmVsZWFzZU5hdGl2ZVJ1bihyZXF1ZXN0TG9nSWQ6IG51bWJlcik6IHZvaWQge1xuICBjb25zdCByZWZzID0gYWN0aXZlTmF0aXZlUnVuUmVmcy5nZXQocmVxdWVzdExvZ0lkKTtcbiAgaWYgKHJlZnMgPT09IHVuZGVmaW5lZCB8fCByZWZzIDw9IDEpIGFjdGl2ZU5hdGl2ZVJ1blJlZnMuZGVsZXRlKHJlcXVlc3RMb2dJZCk7XG4gIGVsc2UgYWN0aXZlTmF0aXZlUnVuUmVmcy5zZXQocmVxdWVzdExvZ0lkLCByZWZzIC0gMSk7XG59XG5cbmZ1bmN0aW9uIHRyYWNrTmF0aXZlRmluYWxpemVyPFQ+KHJlcXVlc3RMb2dJZDogbnVtYmVyLCBmaW5hbGl6ZTogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICBjb25zdCBvcGVyYXRpb24gPSBmaW5hbGl6ZSgpO1xuICBjb25zdCBzZXR0bGVkID0gb3BlcmF0aW9uLnRoZW4oXG4gICAgKCkgPT4gdW5kZWZpbmVkLFxuICAgICgpID0+IHVuZGVmaW5lZCxcbiAgKTtcbiAgY29uc3QgZmluYWxpemVycyA9IGFjdGl2ZU5hdGl2ZUZpbmFsaXplcnMuZ2V0KHJlcXVlc3RMb2dJZCkgPz8gbmV3IFNldDxQcm9taXNlPHZvaWQ+PigpO1xuICBmaW5hbGl6ZXJzLmFkZChzZXR0bGVkKTtcbiAgYWN0aXZlTmF0aXZlRmluYWxpemVycy5zZXQocmVxdWVzdExvZ0lkLCBmaW5hbGl6ZXJzKTtcbiAgdm9pZCBzZXR0bGVkLnRoZW4oKCkgPT4ge1xuICAgIGZpbmFsaXplcnMuZGVsZXRlKHNldHRsZWQpO1xuICAgIGlmIChmaW5hbGl6ZXJzLnNpemUgPT09IDApIGFjdGl2ZU5hdGl2ZUZpbmFsaXplcnMuZGVsZXRlKHJlcXVlc3RMb2dJZCk7XG4gIH0pO1xuICByZXR1cm4gb3BlcmF0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TmF0aXZlUnVuQWRtaXNzaW9uKCk6IHZvaWQge1xuICBpZiAoaXNSZXN0YXJ0UGVuZGluZygpKSB0aHJvdyByZXN0YXJ0VW5hdmFpbGFibGUoKTtcbn1cblxuZnVuY3Rpb24gd2l0aFByb3ZpZGVyUHJlZml4KFxuICByb3V0ZU1vZGVsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG1vZGVsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIW1vZGVsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAobW9kZWwuaW5jbHVkZXMoXCIvXCIpKSByZXR1cm4gbW9kZWw7XG4gIGNvbnN0IHNsYXNoID0gcm91dGVNb2RlbD8uaW5kZXhPZihcIi9cIikgPz8gLTE7XG4gIGNvbnN0IHByb3ZpZGVyID0gc2xhc2ggPiAwID8gcm91dGVNb2RlbD8uc2xpY2UoMCwgc2xhc2gpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gcHJvdmlkZXIgPyBgJHtwcm92aWRlcn0vJHttb2RlbH1gIDogbW9kZWw7XG59XG5cbi8qKlxuICogaGlzdG9yeeuKlCDsm5Drs7gg6re464yA66GcIOyggOyepe2VmOq4sOuztOuLpOuKlCwgcnVuIOu2hOyEneyXkCDtlYTsmpTtlZwgdXNlci9hc3Npc3RhbnQg7KCV67O066eMIO2VhO2EsOunge2VtOyEnCDsoIDsnqVcbiAqL1xuZnVuY3Rpb24gZmlsdGVySGlzdG9yeUZvclN0b3JhZ2UocmF3SGlzdG9yeTogc3RyaW5nIHwgdW5kZWZpbmVkKTogdW5rbm93biB7XG4gIGlmICghcmF3SGlzdG9yeSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBpdGVtcyA9IEpTT04ucGFyc2UocmF3SGlzdG9yeSkgYXMgdW5rbm93bltdO1xuICAgIGNvbnN0IGZpbHRlcmVkID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0gfHwgdHlwZW9mIGl0ZW0gIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJlY29yZCA9IGl0ZW0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICByZXR1cm4gcmVjb3JkLnR5cGUgPT09IFwibWVzc2FnZVwiICYmIChyZWNvcmQucm9sZSA9PT0gXCJ1c2VyXCIgfHwgcmVjb3JkLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpO1xuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXJlZC5sZW5ndGggPiAwID8gZmlsdGVyZWQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQYXJzZWFibGVKc29uKHRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIEpTT04ucGFyc2UodGV4dCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSdW5MaWZlY3ljbGVSZXN1bHQgPSB7XG4gIHJ1bkNvbnRleHQ/OiBRZ3JpZFJ1bkNvbnRleHQ7XG59O1xuXG4vKipcbiAqIGxvZ2dlci1lbmFibGVkIHF1ZXJ5L3N0cmVhbSDsnZHri7Ug7KCE7ZuE7JeQIO2YuOy2nC5cbiAqXG4gKiAxKSBiZWZvcmVRdWVyeTogcnVuIOyDneyEsS/qs4Tsho0gKyB0b29sIHJlc3VsdCDsmYTro4wgKyBzdGFsZSB0b29sLXdhaXQgY2xlYW51cFxuICogMikgYWZ0ZXJRdWVyeTogZ2VuZXJhdGUgc3RlcCArIHRvb2wtY2FsbCBzdGVwICsgZmluaXNoL2tlZXAtb3BlblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYmVmb3JlUXVlcnkoYXJnczogUXVlcnlJbnB1dCk6IFByb21pc2U8e1xuICByZXF1ZXN0TG9nSWQ6IG51bWJlcjtcbiAgc3RlcEluZGV4OiBudW1iZXI7XG59PiB7XG4gIGFzc2VydE5hdGl2ZVJ1bkFkbWlzc2lvbigpO1xuXG4gIGxldCByZXF1ZXN0TG9nSWQ6IG51bWJlcjtcbiAgbGV0IHN0ZXBJbmRleCA9IDA7XG5cbiAgLy8gcmVxdWVzdExvZ0lkIOqwgCDsnojsnYQg65WM66eMIOq4sOyhtCBydW4g7Jew7J6lLiB0aHJlYWRDb29yZCDrp4wg7J6I64qUIGNvbnYg64qUIOyDiCBydW4g7Jy866GcIOyLnOyekS5cbiAgLy8gY29udGludWF0aW9uIOydgCBjcmVhdGVSdW4g7J2EIOqxtOuEiOubsOuvgOuhnCBydW4g7J2YIHRvb2xzIOuKlCDssqsg7Iqk7YWdIOyepeywqeu2hOycvOuhnCDqs6DsoJXrkJzri6Qg4oCUXG4gIC8vIEFJIFNESyBwcmVwYXJlU3RlcC9hY3RpdmVUb29scyDroZwg7Iqk7YWd66eI64ukIO2ItOyFi+ydtCDrsJTrgIzslrTrj4Qg66Gc6re47JeQ64qUIOuwmOyYgeuQmOyngCDslYrripTri6QuXG4gIGlmIChhcmdzLnJ1bkNvbnRleHQ/LnJlcXVlc3RMb2dJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmVxdWVzdExvZ0lkID0gYXJncy5ydW5Db250ZXh0LnJlcXVlc3RMb2dJZDtcbiAgICAvLyBjbGVhbnVw6rO8IOqwmeydgCBEQiBhZHZpc29yeSBsb2Nr7J2EIOyeoeqzoCB0b29sIOqysOqzvCDrsJjsmIEgKyDri6TsnYwgc3RlcCDsmIjslb3snYQg7ZWcXG4gICAgLy8gdHJhbnNhY3Rpb27sl5DshJwg7LKY66as7ZWc64ukLiDsl6zrn6wgcWdyaWQg7ZSE66Gc7IS47IqkIOyCrOydtOyXkOyEnOuPhCBzdGFsZSBleHBpcnnqsIBcbiAgICAvLyDrj4TssKkg7KSR7J24IGZvbGxvdy11cOydhCBlcnJvcuuhnCDrja7slrTsk7Dsp4Ag66q77ZWc64ukLlxuICAgIHN0ZXBJbmRleCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jb250aW51ZVRvb2xSdW4ocmVxdWVzdExvZ0lkLCBhcmdzLnRvb2xSZXN1bHRzID8/IFtdKTtcbiAgICBhd2FpdCBjbGVhbnVwU3RhbGVSdW5zKCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgY2xlYW51cFN0YWxlUnVucygpO1xuICAgIHJlcXVlc3RMb2dJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jcmVhdGVSdW4oe1xuICAgICAgdXNlcl9wcm9tcHQ6IGFyZ3MucHJvbXB0LFxuICAgICAgc3lzdGVtX3Byb21wdDogYXJncy5zeXN0ZW0sXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogYXJncy5tb2RlbCxcbiAgICAgIGVmZm9ydDogYXJncy50aGlua2luZyA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBhcmdzLmVmZm9ydCxcbiAgICAgIHByb2plY3RfbmFtZTogYXJncy5wcm9qZWN0TmFtZSxcbiAgICAgIGhpc3Rvcnk6IGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKGFyZ3MuaGlzdG9yeSksXG4gICAgICB0b29sczogYXJncy50b29scz8ubGVuZ3RoID8gYXJncy50b29scyA6IHVuZGVmaW5lZCxcbiAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb246IGFyZ3MuaW1hZ2VHZW5lcmF0aW9uID09PSBcImF1dG9cIiA/IGZhbHNlIDogYXJncy5pbWFnZUdlbmVyYXRpb24sXG4gICAgICBqc29uX3NjaGVtYTogYXJncy5qc29uU2NoZW1hID8/IG51bGwsXG4gICAgfSk7XG4gIH1cblxuICAvLyBEQiDspIDruYQg7KSR7JeQIOyerOyLnOyekeydtCDsi5zsnpHrkJDri6TrqbQgcHJvdmlkZXIg7Iuk7ZaJ7Jy866GcIOuEmOyWtOqwgOyngCDslYrripTri6QuXG4gIC8vIOydtCDsmpTssq3snYAg7J6s7Iuc7J6RIHNuYXBzaG907JeQIOyXhuyXiOycvOuvgOuhnCDrsKnquIgg7KSA67mE7ZWcIHJ1buydhCDsp4HsoJEg66eI6rCQ7ZWc64ukLlxuICBpZiAoaXNSZXN0YXJ0UGVuZGluZygpKSB7XG4gICAgYXdhaXQgZmluaXNoVGVybWluYWxSdW4ocmVxdWVzdExvZ0lkLCBcImVycm9yXCIsIFwic2VydmVyIHJlc3RhcnRlZFwiKTtcbiAgICB0aHJvdyByZXN0YXJ0VW5hdmFpbGFibGUoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyTmF0aXZlUnVuKHJlcXVlc3RMb2dJZCk7XG4gIHJldHVybiB7IHJlcXVlc3RMb2dJZCwgc3RlcEluZGV4IH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZnRlclF1ZXJ5KFxuICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgc3RlcEluZGV4OiBudW1iZXIsXG4gIGFyZ3M6IFF1ZXJ5SW5wdXQsXG4gIHJlc3VsdDogUXVlcnlPdXRwdXQsXG4pOiBQcm9taXNlPFJ1bkxpZmVjeWNsZVJlc3VsdD4ge1xuICBpZiAoaW50ZXJydXB0ZWROYXRpdmVSdW5JZHMuaGFzKHJlcXVlc3RMb2dJZCkpIHJldHVybiB7fTtcblxuICByZXR1cm4gdHJhY2tOYXRpdmVGaW5hbGl6ZXIocmVxdWVzdExvZ0lkLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIHByb3ZpZGVy6rCAIGNhbm9uaWNhbCBtb2RlbOydhCDrj4zroKTspJjrj4Qg7JqU7LKtIHJvdXRlIOyekOyytChbMW1dIOuTsSnripQg67O07KG07ZWc64ukLlxuICAgICAgY29uc3QgcmVxdWVzdGVkTW9kZWxOYW1lID0gd2l0aFByb3ZpZGVyUHJlZml4KFxuICAgICAgICBhcmdzLm1vZGVsLFxuICAgICAgICBhcmdzLm1vZGVsID8/IHJlc3VsdC5yZXF1ZXN0ZWRNb2RlbCA/PyByZXN1bHQubW9kZWwsXG4gICAgICApO1xuICAgICAgY29uc3Qgc2VydmVkTW9kZWxOYW1lID0gd2l0aFByb3ZpZGVyUHJlZml4KGFyZ3MubW9kZWwsIHJlc3VsdC5tb2RlbCk7XG5cbiAgICAgIC8vIGdlbmVyYXRlIHN0ZXAg6riw66GdXG4gICAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuYXBwZW5kU3RlcChyZXF1ZXN0TG9nSWQsIHtcbiAgICAgICAgc3RlcF9pbmRleDogc3RlcEluZGV4LFxuICAgICAgICB0eXBlOiBcImdlbmVyYXRlXCIsXG4gICAgICAgIG1vZGVsX25hbWU6IHNlcnZlZE1vZGVsTmFtZSxcbiAgICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IHJlcXVlc3RlZE1vZGVsTmFtZSxcbiAgICAgICAgZmFsbGJhY2tfY291bnQ6IHJlc3VsdC5tb2RlbEZhbGxiYWNrcz8ubGVuZ3RoID8/IDAsXG4gICAgICAgIGlucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmlucHV0X3Rva2VucyxcbiAgICAgICAgb3V0cHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dF90b2tlbnMsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfcmVhZF9pbnB1dF90b2tlbnMsXG4gICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyxcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfY3JlYXRpb25fNW1faW5wdXRfdG9rZW5zLFxuICAgICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZV9jcmVhdGlvbl8xaF9pbnB1dF90b2tlbnMsXG4gICAgICAgIGNvc3RfdXNkOiBNYXRoLnJvdW5kKHJlc3VsdC5jb3N0VXNkICogMV8wMDBfMDAwKSxcbiAgICAgICAgY29zdF9zb3VyY2U6IHJlc3VsdC5jb3N0U291cmNlLFxuICAgICAgICBkdXJhdGlvbl9tczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgICAgIHR0ZnRfbXM6IHJlc3VsdC50dGZ0TXMsXG4gICAgICAgIGZpbmlzaF9yZWFzb246IHJlc3VsdC5maW5pc2hSZWFzb24sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgaW1hZ2VQYXJ0cyA9IGdldEltYWdlUGFydHMocmVzdWx0KTtcbiAgICAgIGNvbnN0IGltYWdlQ29zdE1pY3JvVXNkID0gZXN0aW1hdGVJbWFnZUdlbmVyYXRpb25Db3N0TWljcm9Vc2QoXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgYXJncy5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiBidWlsZEltYWdlR2VuZXJhdGlvblRvb2xTdGVwcyhhcmdzLCBpbWFnZVBhcnRzLCBzdGVwSW5kZXgpKSB7XG4gICAgICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKHJlcXVlc3RMb2dJZCwgc3RlcCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQuZmluaXNoUmVhc29uID09PSBcInRvb2wtY2FsbHNcIikge1xuICAgICAgICAvLyB0b29sLWNhbGwgc3RlcOydhCDsponsi5wg6riw66Gd7ZWY6rOgLCDri6TsnYwgZm9sbG93LXVw7J20IOqwmeydgCByb3fsl5Ag6rKw6rO866W8IOyxhOyatOuLpC5cbiAgICAgICAgY29uc3QgdG9vbENhbGxzID0gcmVzdWx0LmNvbnRlbnQuZmlsdGVyKChjKSA9PiBjLnR5cGUgPT09IFwidG9vbC1jYWxsXCIpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvb2xDYWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHRjID0gdG9vbENhbGxzW2ldITtcbiAgICAgICAgICBpZiAodGMudHlwZSAhPT0gXCJ0b29sLWNhbGxcIikgY29udGludWU7XG4gICAgICAgICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCB7XG4gICAgICAgICAgICBzdGVwX2luZGV4OiBzdGVwSW5kZXgsXG4gICAgICAgICAgICB0eXBlOiBcInRvb2xfY2FsbFwiLFxuICAgICAgICAgICAgdG9vbF9jYWxsX2luZGV4OiBpbWFnZVBhcnRzLmxlbmd0aCArIGksXG4gICAgICAgICAgICB0b29sX2NhbGxfaWQ6IHRjLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICB0b29sX25hbWU6IHRjLnRvb2xOYW1lLFxuICAgICAgICAgICAgdG9vbF9hcmdzOiB0Yy5pbnB1dCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHJ1bkNvbnRleHQ6IHsgcmVxdWVzdExvZ0lkIH0gfTtcbiAgICAgIH1cblxuICAgICAgLy8gZmluaXNoUmVhc29uID09PSBcInN0b3BcIiDihpIgcnVuIOyiheujjCAo7KCE7LK0IHN0ZXAgdXNhZ2Ug7ZWp7IKwKVxuICAgICAgY29uc3QgYWdnID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFnZ3JlZ2F0ZVN0ZXBVc2FnZShyZXF1ZXN0TG9nSWQpO1xuICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gZm9ybWF0UmVzcG9uc2VGb3JMb2cocmVzdWx0KTtcbiAgICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5maW5pc2hSdW4ocmVxdWVzdExvZ0lkLCB7XG4gICAgICAgIHN0YXR1czogXCJzdWNjZWVkZWRcIixcbiAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlVGV4dCxcbiAgICAgICAgLy8gc3RydWN0dXJlZCDsmpTssq3rp4wg7YyQ7KCV7ZWc64ukLiBkZXRpIOuwsOy5mOydmCBicm9rZW4gSlNPTiDrpZjrpbwg66qp66Gd7JeQ7IScIOuwlOuhnFxuICAgICAgICAvLyDqtazrs4TtlZjquLAg7JyE7ZWcIOq4sOuhneydtOupsCwg67mEc3RydWN0dXJlZCDsmpTssq3snYAgbnVsbCDroZwg64Ko64qU64ukLlxuICAgICAgICByZXNwb25zZV9qc29uX29rOiBhcmdzLmpzb25TY2hlbWEgPyBpc1BhcnNlYWJsZUpzb24ocmVzcG9uc2VUZXh0KSA6IG51bGwsXG4gICAgICAgIHRva2VuX25hbWU6IHJlc3VsdC50b2tlbk5hbWUsXG4gICAgICAgIGlucHV0X3Rva2VuczogYWdnLmlucHV0X3Rva2VucyxcbiAgICAgICAgb3V0cHV0X3Rva2VuczogYWdnLm91dHB1dF90b2tlbnMsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBhZ2cuY2FjaGVfcmVhZF90b2tlbnMsXG4gICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogYWdnLmNhY2hlX2NyZWF0aW9uX3Rva2VucyxcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBhZ2cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zLFxuICAgICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IGFnZy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMsXG4gICAgICAgIGR1cmF0aW9uX21zOiBhZ2cuZHVyYXRpb25fbXMsXG4gICAgICAgIC8vIG11bHRpLXN0ZXAgcnVuIOu2gOuqqOydmCDrqqjrjbjsnYAg7LWc7KKFIHR1cm7snYQg7ISc67mZ7ZWcIOuqqOuNuOydtOuLpC5cbiAgICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IHJlcXVlc3RlZE1vZGVsTmFtZSxcbiAgICAgICAgbW9kZWxfbmFtZTogc2VydmVkTW9kZWxOYW1lLFxuICAgICAgICBmYWxsYmFja19jb3VudDogYWdnLmZhbGxiYWNrX2NvdW50LFxuICAgICAgICBjb3N0X3VzZDogYWdnLmNvc3RfdXNkLFxuICAgICAgICBjb3N0X3NvdXJjZTogYWdnLmNvc3Rfc291cmNlLFxuICAgICAgICBpbWFnZV9jb3N0X3VzZDogaW1hZ2VDb3N0TWljcm9Vc2QsXG4gICAgICAgIC4uLihpbWFnZVBhcnRzLmxlbmd0aCA+IDAgPyB7IGlzX2ltYWdlX2dlbmVyYXRpb246IHRydWUgfSA6IHt9KSxcbiAgICAgICAgaW1hZ2VfY29zdF9tZXRob2Q6XG4gICAgICAgICAgaW1hZ2VDb3N0TWljcm9Vc2QgIT09IG51bGxcbiAgICAgICAgICAgID8gaW1hZ2VHZW5lcmF0aW9uQ29zdE1ldGhvZChhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsIHJlc3VsdClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgaGlzdG9yeTogZmlsdGVySGlzdG9yeUZvclN0b3JhZ2UoYXJncy5oaXN0b3J5KSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge307XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlbGVhc2VOYXRpdmVSdW4ocmVxdWVzdExvZ0lkKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluaXNoUnVuV2l0aEVycm9yKFxuICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmcsXG4gIGFyZ3M/OiBRdWVyeUlucHV0LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChpbnRlcnJ1cHRlZE5hdGl2ZVJ1bklkcy5oYXMocmVxdWVzdExvZ0lkKSkgcmV0dXJuO1xuICByZXR1cm4gdHJhY2tOYXRpdmVGaW5hbGl6ZXIocmVxdWVzdExvZ0lkLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZpbmlzaFRlcm1pbmFsUnVuKHJlcXVlc3RMb2dJZCwgXCJlcnJvclwiLCBlcnJvck1lc3NhZ2UsIGFyZ3MpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZWxlYXNlTmF0aXZlUnVuKHJlcXVlc3RMb2dJZCk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmlzaFJ1bkFib3J0ZWQocmVxdWVzdExvZ0lkOiBudW1iZXIsIGFyZ3M/OiBRdWVyeUlucHV0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChpbnRlcnJ1cHRlZE5hdGl2ZVJ1bklkcy5oYXMocmVxdWVzdExvZ0lkKSkgcmV0dXJuO1xuICByZXR1cm4gdHJhY2tOYXRpdmVGaW5hbGl6ZXIocmVxdWVzdExvZ0lkLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZpbmlzaFRlcm1pbmFsUnVuKHJlcXVlc3RMb2dJZCwgXCJhYm9ydGVkXCIsIFwiY2xpZW50IGRpc2Nvbm5lY3RlZFwiLCBhcmdzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVsZWFzZU5hdGl2ZVJ1bihyZXF1ZXN0TG9nSWQpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKiDtmITsnqwg7J20IO2UhOuhnOyEuOyKpOqwgCBwcm92aWRlcuulvCDsi6Ttlokg7KSR7J24IG5hdGl2ZSBydW7rp4wg7J6s7Iuc7J6RIOyYpOulmOuhnCDrp4jqsJDtlZzri6QuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluaXNoQWN0aXZlTmF0aXZlUnVuc0ZvclJlc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcXVlc3RMb2dJZHMgPSBbLi4uYWN0aXZlTmF0aXZlUnVuUmVmcy5rZXlzKCldO1xuICBmb3IgKGNvbnN0IHJlcXVlc3RMb2dJZCBvZiByZXF1ZXN0TG9nSWRzKSB7XG4gICAgaW50ZXJydXB0ZWROYXRpdmVSdW5JZHMuYWRkKHJlcXVlc3RMb2dJZCk7XG4gICAgYWN0aXZlTmF0aXZlUnVuUmVmcy5kZWxldGUocmVxdWVzdExvZ0lkKTtcbiAgfVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHJlcXVlc3RMb2dJZHMubWFwKGFzeW5jIChyZXF1ZXN0TG9nSWQpID0+IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGFjdGl2ZU5hdGl2ZUZpbmFsaXplcnMuZ2V0KHJlcXVlc3RMb2dJZCkgPz8gW10pO1xuICAgICAgYXdhaXQgZmluaXNoVGVybWluYWxSdW4ocmVxdWVzdExvZ0lkLCBcImVycm9yXCIsIFwic2VydmVyIHJlc3RhcnRlZFwiKTtcbiAgICB9KSxcbiAgKTtcbn1cblxuLyoqIO2UhOuhnOyEuOyKpCDsoITsl60gcmVnaXN0cnnrpbwg6rKp66as7ZW07JW8IO2VmOuKlCDri6jsnIQg7YWM7Iqk7Yq4IOyghOyaqS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldE5hdGl2ZVJ1blJlZ2lzdHJ5Rm9yVGVzdHMoKTogdm9pZCB7XG4gIGFjdGl2ZU5hdGl2ZVJ1blJlZnMuY2xlYXIoKTtcbiAgaW50ZXJydXB0ZWROYXRpdmVSdW5JZHMuY2xlYXIoKTtcbiAgYWN0aXZlTmF0aXZlRmluYWxpemVycy5jbGVhcigpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5pc2hUZXJtaW5hbFJ1bihcbiAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gIHN0YXR1czogXCJlcnJvclwiIHwgXCJhYm9ydGVkXCIsXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nLFxuICBhcmdzPzogUXVlcnlJbnB1dCxcbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGxldCBhZ2dyZWdhdGU6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgUmVxdWVzdExvZ01vZGVsLmFnZ3JlZ2F0ZVN0ZXBVc2FnZT4+IHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBhZ2dyZWdhdGUgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuYWdncmVnYXRlU3RlcFVzYWdlKHJlcXVlc3RMb2dJZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yKGBhZ2dyZWdhdGVTdGVwVXNhZ2UgZmFpbGVkIHdoaWxlIGZpbmlzaGluZyAke3N0YXR1c306ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihyZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIGVycm9yX21lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICAgIGhpc3Rvcnk6IGFyZ3MgPyBmaWx0ZXJIaXN0b3J5Rm9yU3RvcmFnZShhcmdzLmhpc3RvcnkpIDogdW5kZWZpbmVkLFxuICAgICAgLi4uKGFnZ3JlZ2F0ZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGlucHV0X3Rva2VuczogYWdncmVnYXRlLmlucHV0X3Rva2VucyxcbiAgICAgICAgICAgIG91dHB1dF90b2tlbnM6IGFnZ3JlZ2F0ZS5vdXRwdXRfdG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IGFnZ3JlZ2F0ZS5jYWNoZV9yZWFkX3Rva2VucyxcbiAgICAgICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uX3Rva2VucyxcbiAgICAgICAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyxcbiAgICAgICAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyxcbiAgICAgICAgICAgIGR1cmF0aW9uX21zOiBhZ2dyZWdhdGUuZHVyYXRpb25fbXMsXG4gICAgICAgICAgICBmYWxsYmFja19jb3VudDogYWdncmVnYXRlLmZhbGxiYWNrX2NvdW50LFxuICAgICAgICAgICAgY29zdF91c2Q6IGFnZ3JlZ2F0ZS5jb3N0X3VzZCxcbiAgICAgICAgICAgIGNvc3Rfc291cmNlOiBhZ2dyZWdhdGUuY29zdF9zb3VyY2UsXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcihgZmluaXNoVGVybWluYWxSdW4oJHtzdGF0dXN9KSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cFN0YWxlUnVucygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHN0YWxlQ2xlYW51cEluRmxpZ2h0KSB7XG4gICAgYXdhaXQgc3RhbGVDbGVhbnVwSW5GbGlnaHQ7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgaWYgKG5vdyAtIGxhc3RTdGFsZUNsZWFudXBTdGFydGVkQXQgPCBTVEFMRV9DTEVBTlVQX0lOVEVSVkFMX01TKSByZXR1cm47XG4gIGxhc3RTdGFsZUNsZWFudXBTdGFydGVkQXQgPSBub3c7XG5cbiAgY29uc3QgY2xlYW51cCA9IHBlcmZvcm1TdGFsZVJ1bkNsZWFudXAoKTtcbiAgc3RhbGVDbGVhbnVwSW5GbGlnaHQgPSBjbGVhbnVwO1xuICB0cnkge1xuICAgIGF3YWl0IGNsZWFudXA7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHN0YWxlQ2xlYW51cEluRmxpZ2h0ID09PSBjbGVhbnVwKSBzdGFsZUNsZWFudXBJbkZsaWdodCA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBwZXJmb3JtU3RhbGVSdW5DbGVhbnVwKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IFwidG9vbC1jYWxsIHJ1bjogbm8gZm9sbG93LXVwIHdpdGhpbiAzMCBtaW51dGVzXCI7XG4gICAgY29uc3Qgc3RhbGVJZHMgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZXhwaXJlU3RhbGVUb29sV2FpdGluZ1J1bnMoXG4gICAgICBTVEFMRV9SVU5fVEhSRVNIT0xEX01TLFxuICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICk7XG4gICAgY29uc3QgY2xlYW5lZENvdW50ID0gc3RhbGVJZHMubGVuZ3RoO1xuICAgIGlmIChjbGVhbmVkQ291bnQgPiAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgY2xlYW5lZCB1cCAke2NsZWFuZWRDb3VudH0gc3RhbGUgcnVubmluZyByZXF1ZXN0IGxvZ3NgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3IoYHN0YWxlIGNsZWFudXAgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBaUJBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxlQUFlLENBQUM7QUFDbkQsTUFBTSx5QkFBeUIsT0FBVTtBQUN6QyxNQUFNLDRCQUE0QixLQUFLO0FBQ3ZDLElBQUk7QUFDSixJQUFJLDRCQUE0QjtBQUNoQyxNQUFNLHNDQUFzQixJQUFJLElBQW9CO0FBQ3BELE1BQU0sMENBQTBCLElBQUksSUFBWTtBQUNoRCxNQUFNLHlDQUF5QixJQUFJLElBQWdDO0FBRW5FLFNBQVMscUJBQWtEO0NBQ3pELE9BQU8sSUFBSSw0QkFBNEIsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7QUFDckU7QUFFQSxTQUFTLGtCQUFrQixjQUE0QjtDQUNyRCxvQkFBb0IsSUFBSSxlQUFlLG9CQUFvQixJQUFJLFlBQVksS0FBSyxLQUFLLENBQUM7QUFDeEY7QUFFQSxTQUFTLGlCQUFpQixjQUE0QjtDQUNwRCxNQUFNLE9BQU8sb0JBQW9CLElBQUksWUFBWTtDQUNqRCxJQUFJLFNBQVMsVUFBYSxRQUFRLEdBQUcsb0JBQW9CLE9BQU8sWUFBWTtNQUN2RSxvQkFBb0IsSUFBSSxjQUFjLE9BQU8sQ0FBQztBQUNyRDtBQUVBLFNBQVMscUJBQXdCLGNBQXNCLFVBQXdDO0NBQzdGLE1BQU0sWUFBWSxTQUFTO0NBQzNCLE1BQU0sVUFBVSxVQUFVLFdBQ2xCLGNBQ0EsTUFDUjtDQUNBLE1BQU0sYUFBYSx1QkFBdUIsSUFBSSxZQUFZLHFCQUFLLElBQUksSUFBbUI7Q0FDdEYsV0FBVyxJQUFJLE9BQU87Q0FDdEIsdUJBQXVCLElBQUksY0FBYyxVQUFVO0NBQ25ELEFBQUssUUFBUSxXQUFXO0VBQ3RCLFdBQVcsT0FBTyxPQUFPO0VBQ3pCLElBQUksV0FB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
202
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcnVuLWxpZmVjeWNsZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtcnVuLWxpZmVjeWNsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBSZXF1ZXN0TG9nTW9kZWwgfSBmcm9tIFwiLi4vcmVxdWVzdC1sb2cvcmVxdWVzdC1sb2cubW9kZWxcIjtcbmltcG9ydCB7XG4gIGVzdGltYXRlSW1hZ2VHZW5lcmF0aW9uQ29zdE1pY3JvVXNkLFxuICBpbWFnZUdlbmVyYXRpb25Db3N0TWV0aG9kLFxufSBmcm9tIFwiLi9xZ3JpZC1pbWFnZS1nZW5lcmF0aW9uXCI7XG5pbXBvcnQge1xuICBidWlsZEltYWdlR2VuZXJhdGlvblRvb2xTdGVwcyxcbiAgZm9ybWF0UmVzcG9uc2VGb3JMb2csXG4gIGdldEltYWdlUGFydHMsXG59IGZyb20gXCIuL3FncmlkLXJlc3BvbnNlLWZvcm1hdFwiO1xuaW1wb3J0IHsgdHlwZSBRZ3JpZFJ1bkNvbnRleHQsIHR5cGUgUXVlcnlJbnB1dCwgdHlwZSBRdWVyeU91dHB1dCB9IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInJ1bi1saWZlY3ljbGVcIl0pO1xuY29uc3QgU1RBTEVfUlVOX1RIUkVTSE9MRF9NUyA9IDMwICogNjAgKiAxMDAwO1xuY29uc3QgU1RBTEVfQ0xFQU5VUF9JTlRFUlZBTF9NUyA9IDYwICogMTAwMDtcbmxldCBzdGFsZUNsZWFudXBJbkZsaWdodDogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbmxldCBsYXN0U3RhbGVDbGVhbnVwU3RhcnRlZEF0ID0gMDtcbmZ1bmN0aW9uIHdpdGhQcm92aWRlclByZWZpeChcbiAgcm91dGVNb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFtb2RlbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKG1vZGVsLmluY2x1ZGVzKFwiL1wiKSkgcmV0dXJuIG1vZGVsO1xuICBjb25zdCBzbGFzaCA9IHJvdXRlTW9kZWw/LmluZGV4T2YoXCIvXCIpID8/IC0xO1xuICBjb25zdCBwcm92aWRlciA9IHNsYXNoID4gMCA/IHJvdXRlTW9kZWw/LnNsaWNlKDAsIHNsYXNoKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHByb3ZpZGVyID8gYCR7cHJvdmlkZXJ9LyR7bW9kZWx9YCA6IG1vZGVsO1xufVxuXG4vKipcbiAqIGhpc3RvcnnripQg7JuQ67O4IOq3uOuMgOuhnCDsoIDsnqXtlZjquLDrs7Tri6TripQsIHJ1biDrtoTshJ3sl5Ag7ZWE7JqU7ZWcIHVzZXIvYXNzaXN0YW50IOygleuztOunjCDtlYTthLDrp4HtlbTshJwg7KCA7J6lXG4gKi9cbmZ1bmN0aW9uIGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKHJhd0hpc3Rvcnk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICBpZiAoIXJhd0hpc3RvcnkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgaXRlbXMgPSBKU09OLnBhcnNlKHJhd0hpc3RvcnkpIGFzIHVua25vd25bXTtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWNvcmQgPSBpdGVtIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgcmV0dXJuIHJlY29yZC50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiAocmVjb3JkLnJvbGUgPT09IFwidXNlclwiIHx8IHJlY29yZC5yb2xlID09PSBcImFzc2lzdGFudFwiKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVyZWQubGVuZ3RoID4gMCA/IGZpbHRlcmVkIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUGFyc2VhYmxlSnNvbih0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBKU09OLnBhcnNlKHRleHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUnVuTGlmZWN5Y2xlUmVzdWx0ID0ge1xuICBydW5Db250ZXh0PzogUWdyaWRSdW5Db250ZXh0O1xufTtcblxuLyoqXG4gKiBsb2dnZXItZW5hYmxlZCBxdWVyeS9zdHJlYW0g7J2R64u1IOyghO2bhOyXkCDtmLjstpwuXG4gKlxuICogMSkgYmVmb3JlUXVlcnk6IHJ1biDsg53shLEv6rOE7IaNICsgdG9vbCByZXN1bHQg7JmE66OMICsgc3RhbGUgdG9vbC13YWl0IGNsZWFudXBcbiAqIDIpIGFmdGVyUXVlcnk6IGdlbmVyYXRlIHN0ZXAgKyB0b29sLWNhbGwgc3RlcCArIGZpbmlzaC9rZWVwLW9wZW5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJlZm9yZVF1ZXJ5KGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHtcbiAgcmVxdWVzdExvZ0lkOiBudW1iZXI7XG4gIHN0ZXBJbmRleDogbnVtYmVyO1xufT4ge1xuICBsZXQgcmVxdWVzdExvZ0lkOiBudW1iZXI7XG4gIGxldCBzdGVwSW5kZXggPSAwO1xuXG4gIC8vIHJlcXVlc3RMb2dJZCDqsIAg7J6I7J2EIOuVjOunjCDquLDsobQgcnVuIOyXsOyepS4gdGhyZWFkQ29vcmQg66eMIOyeiOuKlCBjb252IOuKlCDsg4ggcnVuIOycvOuhnCDsi5zsnpEuXG4gIC8vIGNvbnRpbnVhdGlvbiDsnYAgY3JlYXRlUnVuIOydhCDqsbTrhIjrm7Drr4DroZwgcnVuIOydmCB0b29scyDripQg7LKrIOyKpO2FnSDsnqXssKnrtoTsnLzroZwg6rOg7KCV65Cc64ukIOKAlFxuICAvLyBBSSBTREsgcHJlcGFyZVN0ZXAvYWN0aXZlVG9vbHMg66GcIOyKpO2FneuniOuLpCDtiLTshYvsnbQg67CU64CM7Ja064+EIOuhnOq3uOyXkOuKlCDrsJjsmIHrkJjsp4Ag7JWK64qU64ukLlxuICBpZiAoYXJncy5ydW5Db250ZXh0Py5yZXF1ZXN0TG9nSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJlcXVlc3RMb2dJZCA9IGFyZ3MucnVuQ29udGV4dC5yZXF1ZXN0TG9nSWQ7XG4gICAgLy8gY2xlYW51cOqzvCDqsJnsnYAgREIgYWR2aXNvcnkgbG9ja+ydhCDsnqHqs6AgdG9vbCDqsrDqs7wg67CY7JiBICsg64uk7J2MIHN0ZXAg7JiI7JW97J2EIO2VnFxuICAgIC8vIHRyYW5zYWN0aW9u7JeQ7IScIOyymOumrO2VnOuLpC4g7Jes65+sIHFncmlkIO2UhOuhnOyEuOyKpCDsgqzsnbTsl5DshJzrj4Qgc3RhbGUgZXhwaXJ56rCAXG4gICAgLy8g64+E7LCpIOykkeyduCBmb2xsb3ctdXDsnYQgZXJyb3LroZwg642u7Ja07JOw7KeAIOuqu+2VnOuLpC5cbiAgICBzdGVwSW5kZXggPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuY29udGludWVUb29sUnVuKHJlcXVlc3RMb2dJZCwgYXJncy50b29sUmVzdWx0cyA/PyBbXSk7XG4gICAgYXdhaXQgY2xlYW51cFN0YWxlUnVucygpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGNsZWFudXBTdGFsZVJ1bnMoKTtcbiAgICByZXF1ZXN0TG9nSWQgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuY3JlYXRlUnVuKHtcbiAgICAgIHVzZXJfcHJvbXB0OiBhcmdzLnByb21wdCxcbiAgICAgIHN5c3RlbV9wcm9tcHQ6IGFyZ3Muc3lzdGVtLFxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IGFyZ3MubW9kZWwsXG4gICAgICBlZmZvcnQ6IGFyZ3MudGhpbmtpbmcgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogYXJncy5lZmZvcnQsXG4gICAgICBwcm9qZWN0X25hbWU6IGFyZ3MucHJvamVjdE5hbWUsXG4gICAgICBoaXN0b3J5OiBmaWx0ZXJIaXN0b3J5Rm9yU3RvcmFnZShhcmdzLmhpc3RvcnkpLFxuICAgICAgdG9vbHM6IGFyZ3MudG9vbHM/Lmxlbmd0aCA/IGFyZ3MudG9vbHMgOiB1bmRlZmluZWQsXG4gICAgICBpc19pbWFnZV9nZW5lcmF0aW9uOiBhcmdzLmltYWdlR2VuZXJhdGlvbiA9PT0gXCJhdXRvXCIgPyBmYWxzZSA6IGFyZ3MuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAganNvbl9zY2hlbWE6IGFyZ3MuanNvblNjaGVtYSA/PyBudWxsLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHsgcmVxdWVzdExvZ0lkLCBzdGVwSW5kZXggfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFmdGVyUXVlcnkoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICBzdGVwSW5kZXg6IG51bWJlcixcbiAgYXJnczogUXVlcnlJbnB1dCxcbiAgcmVzdWx0OiBRdWVyeU91dHB1dCxcbik6IFByb21pc2U8UnVuTGlmZWN5Y2xlUmVzdWx0PiB7XG4gIC8vIHByb3ZpZGVy6rCAIGNhbm9uaWNhbCBtb2RlbOydhCDrj4zroKTspJjrj4Qg7JqU7LKtIHJvdXRlIOyekOyytChbMW1dIOuTsSnripQg67O07KG07ZWc64ukLlxuICBjb25zdCByZXF1ZXN0ZWRNb2RlbE5hbWUgPSB3aXRoUHJvdmlkZXJQcmVmaXgoXG4gICAgYXJncy5tb2RlbCxcbiAgICBhcmdzLm1vZGVsID8/IHJlc3VsdC5yZXF1ZXN0ZWRNb2RlbCA/PyByZXN1bHQubW9kZWwsXG4gICk7XG4gIGNvbnN0IHNlcnZlZE1vZGVsTmFtZSA9IHdpdGhQcm92aWRlclByZWZpeChhcmdzLm1vZGVsLCByZXN1bHQubW9kZWwpO1xuXG4gIC8vIGdlbmVyYXRlIHN0ZXAg6riw66GdXG4gIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKHJlcXVlc3RMb2dJZCwge1xuICAgIHN0ZXBfaW5kZXg6IHN0ZXBJbmRleCxcbiAgICB0eXBlOiBcImdlbmVyYXRlXCIsXG4gICAgbW9kZWxfbmFtZTogc2VydmVkTW9kZWxOYW1lLFxuICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiByZXF1ZXN0ZWRNb2RlbE5hbWUsXG4gICAgZmFsbGJhY2tfY291bnQ6IHJlc3VsdC5tb2RlbEZhbGxiYWNrcz8ubGVuZ3RoID8/IDAsXG4gICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRfdG9rZW5zLFxuICAgIG91dHB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRfdG9rZW5zLFxuICAgIGNhY2hlX3JlYWRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfcmVhZF9pbnB1dF90b2tlbnMsXG4gICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zLFxuICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlX2NyZWF0aW9uXzVtX2lucHV0X3Rva2VucyxcbiAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZV9jcmVhdGlvbl8xaF9pbnB1dF90b2tlbnMsXG4gICAgY29zdF91c2Q6IE1hdGgucm91bmQocmVzdWx0LmNvc3RVc2QgKiAxXzAwMF8wMDApLFxuICAgIGNvc3Rfc291cmNlOiByZXN1bHQuY29zdFNvdXJjZSxcbiAgICBkdXJhdGlvbl9tczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgdHRmdF9tczogcmVzdWx0LnR0ZnRNcyxcbiAgICBmaW5pc2hfcmVhc29uOiByZXN1bHQuZmluaXNoUmVhc29uLFxuICB9KTtcblxuICBjb25zdCBpbWFnZVBhcnRzID0gZ2V0SW1hZ2VQYXJ0cyhyZXN1bHQpO1xuICBjb25zdCBpbWFnZUNvc3RNaWNyb1VzZCA9IGVzdGltYXRlSW1hZ2VHZW5lcmF0aW9uQ29zdE1pY3JvVXNkKFxuICAgIHJlc3VsdCxcbiAgICBhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICk7XG4gIGZvciAoY29uc3Qgc3RlcCBvZiBidWlsZEltYWdlR2VuZXJhdGlvblRvb2xTdGVwcyhhcmdzLCBpbWFnZVBhcnRzLCBzdGVwSW5kZXgpKSB7XG4gICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCBzdGVwKTtcbiAgfVxuXG4gIGlmIChyZXN1bHQuZmluaXNoUmVhc29uID09PSBcInRvb2wtY2FsbHNcIikge1xuICAgIC8vIHRvb2wtY2FsbCBzdGVw7J2EIOymieyLnCDquLDroZ3tlZjqs6AsIOuLpOydjCBmb2xsb3ctdXDsnbQg6rCZ7J2AIHJvd+yXkCDqsrDqs7zrpbwg7LGE7Jq064ukLlxuICAgIGNvbnN0IHRvb2xDYWxscyA9IHJlc3VsdC5jb250ZW50LmZpbHRlcigoYykgPT4gYy50eXBlID09PSBcInRvb2wtY2FsbFwiKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvb2xDYWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGMgPSB0b29sQ2FsbHNbaV0hO1xuICAgICAgaWYgKHRjLnR5cGUgIT09IFwidG9vbC1jYWxsXCIpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCB7XG4gICAgICAgIHN0ZXBfaW5kZXg6IHN0ZXBJbmRleCxcbiAgICAgICAgdHlwZTogXCJ0b29sX2NhbGxcIixcbiAgICAgICAgdG9vbF9jYWxsX2luZGV4OiBpbWFnZVBhcnRzLmxlbmd0aCArIGksXG4gICAgICAgIHRvb2xfY2FsbF9pZDogdGMudG9vbENhbGxJZCxcbiAgICAgICAgdG9vbF9uYW1lOiB0Yy50b29sTmFtZSxcbiAgICAgICAgdG9vbF9hcmdzOiB0Yy5pbnB1dCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IHJ1bkNvbnRleHQ6IHsgcmVxdWVzdExvZ0lkIH0gfTtcbiAgfVxuXG4gIC8vIGZpbmlzaFJlYXNvbiA9PT0gXCJzdG9wXCIg4oaSIHJ1biDsooXro4wgKOyghOyytCBzdGVwIHVzYWdlIO2VqeyCsClcbiAgY29uc3QgYWdnID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFnZ3JlZ2F0ZVN0ZXBVc2FnZShyZXF1ZXN0TG9nSWQpO1xuICBjb25zdCByZXNwb25zZVRleHQgPSBmb3JtYXRSZXNwb25zZUZvckxvZyhyZXN1bHQpO1xuICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgIHN0YXR1czogXCJzdWNjZWVkZWRcIixcbiAgICByZXNwb25zZTogcmVzcG9uc2VUZXh0LFxuICAgIC8vIHN0cnVjdHVyZWQg7JqU7LKt66eMIO2MkOygle2VnOuLpC4gZGV0aSDrsLDsuZjsnZggYnJva2VuIEpTT04g66WY66W8IOuqqeuhneyXkOyEnCDrsJTroZxcbiAgICAvLyDqtazrs4TtlZjquLAg7JyE7ZWcIOq4sOuhneydtOupsCwg67mEc3RydWN0dXJlZCDsmpTssq3snYAgbnVsbCDroZwg64Ko64qU64ukLlxuICAgIHJlc3BvbnNlX2pzb25fb2s6IGFyZ3MuanNvblNjaGVtYSA/IGlzUGFyc2VhYmxlSnNvbihyZXNwb25zZVRleHQpIDogbnVsbCxcbiAgICB0b2tlbl9uYW1lOiByZXN1bHQudG9rZW5OYW1lLFxuICAgIGlucHV0X3Rva2VuczogYWdnLmlucHV0X3Rva2VucyxcbiAgICBvdXRwdXRfdG9rZW5zOiBhZ2cub3V0cHV0X3Rva2VucyxcbiAgICBjYWNoZV9yZWFkX3Rva2VuczogYWdnLmNhY2hlX3JlYWRfdG9rZW5zLFxuICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogYWdnLmNhY2hlX2NyZWF0aW9uX3Rva2VucyxcbiAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IGFnZy5jYWNoZV9jcmVhdGlvbl81bV90b2tlbnMsXG4gICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBhZ2cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zLFxuICAgIGR1cmF0aW9uX21zOiBhZ2cuZHVyYXRpb25fbXMsXG4gICAgLy8gbXVsdGktc3RlcCBydW4g67aA66qo7J2YIOuqqOuNuOydgCDstZzsooUgdHVybuydhCDshJzruZntlZwg66qo64247J2064ukLlxuICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiByZXF1ZXN0ZWRNb2RlbE5hbWUsXG4gICAgbW9kZWxfbmFtZTogc2VydmVkTW9kZWxOYW1lLFxuICAgIGZhbGxiYWNrX2NvdW50OiBhZ2cuZmFsbGJhY2tfY291bnQsXG4gICAgY29zdF91c2Q6IGFnZy5jb3N0X3VzZCxcbiAgICBjb3N0X3NvdXJjZTogYWdnLmNvc3Rfc291cmNlLFxuICAgIGltYWdlX2Nvc3RfdXNkOiBpbWFnZUNvc3RNaWNyb1VzZCxcbiAgICAuLi4oaW1hZ2VQYXJ0cy5sZW5ndGggPiAwID8geyBpc19pbWFnZV9nZW5lcmF0aW9uOiB0cnVlIH0gOiB7fSksXG4gICAgaW1hZ2VfY29zdF9tZXRob2Q6XG4gICAgICBpbWFnZUNvc3RNaWNyb1VzZCAhPT0gbnVsbFxuICAgICAgICA/IGltYWdlR2VuZXJhdGlvbkNvc3RNZXRob2QoYXJncy5pbWFnZUdlbmVyYXRpb25PcHRpb25zLCByZXN1bHQpXG4gICAgICAgIDogbnVsbCxcbiAgICBoaXN0b3J5OiBmaWx0ZXJIaXN0b3J5Rm9yU3RvcmFnZShhcmdzLmhpc3RvcnkpLFxuICB9KTtcblxuICByZXR1cm4ge307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5pc2hSdW5XaXRoRXJyb3IoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICBlcnJvck1lc3NhZ2U6IHN0cmluZyxcbiAgYXJncz86IFF1ZXJ5SW5wdXQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZmluaXNoVGVybWluYWxSdW4ocmVxdWVzdExvZ0lkLCBcImVycm9yXCIsIGVycm9yTWVzc2FnZSwgYXJncyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5pc2hSdW5BYm9ydGVkKHJlcXVlc3RMb2dJZDogbnVtYmVyLCBhcmdzPzogUXVlcnlJbnB1dCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmaW5pc2hUZXJtaW5hbFJ1bihyZXF1ZXN0TG9nSWQsIFwiYWJvcnRlZFwiLCBcImNsaWVudCBkaXNjb25uZWN0ZWRcIiwgYXJncyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmlzaFRlcm1pbmFsUnVuKFxuICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgc3RhdHVzOiBcImVycm9yXCIgfCBcImFib3J0ZWRcIixcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmcsXG4gIGFyZ3M/OiBRdWVyeUlucHV0LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgbGV0IGFnZ3JlZ2F0ZTogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBSZXF1ZXN0TG9nTW9kZWwuYWdncmVnYXRlU3RlcFVzYWdlPj4gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGFnZ3JlZ2F0ZSA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hZ2dyZWdhdGVTdGVwVXNhZ2UocmVxdWVzdExvZ0lkKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYGFnZ3JlZ2F0ZVN0ZXBVc2FnZSBmYWlsZWQgd2hpbGUgZmluaXNoaW5nICR7c3RhdHVzfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RhdHVzLFxuICAgICAgZXJyb3JfbWVzc2FnZTogZXJyb3JNZXNzYWdlLFxuICAgICAgaGlzdG9yeTogYXJncyA/IGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKGFyZ3MuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgICAuLi4oYWdncmVnYXRlXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaW5wdXRfdG9rZW5zOiBhZ2dyZWdhdGUuaW5wdXRfdG9rZW5zLFxuICAgICAgICAgICAgb3V0cHV0X3Rva2VuczogYWdncmVnYXRlLm91dHB1dF90b2tlbnMsXG4gICAgICAgICAgICBjYWNoZV9yZWFkX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX3JlYWRfdG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fdG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zLFxuICAgICAgICAgICAgZHVyYXRpb25fbXM6IGFnZ3JlZ2F0ZS5kdXJhdGlvbl9tcyxcbiAgICAgICAgICAgIGZhbGxiYWNrX2NvdW50OiBhZ2dyZWdhdGUuZmFsbGJhY2tfY291bnQsXG4gICAgICAgICAgICBjb3N0X3VzZDogYWdncmVnYXRlLmNvc3RfdXNkLFxuICAgICAgICAgICAgY29zdF9zb3VyY2U6IGFnZ3JlZ2F0ZS5jb3N0X3NvdXJjZSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBmaW5pc2hUZXJtaW5hbFJ1bigke3N0YXR1c30pIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwU3RhbGVSdW5zKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc3RhbGVDbGVhbnVwSW5GbGlnaHQpIHtcbiAgICBhd2FpdCBzdGFsZUNsZWFudXBJbkZsaWdodDtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBpZiAobm93IC0gbGFzdFN0YWxlQ2xlYW51cFN0YXJ0ZWRBdCA8IFNUQUxFX0NMRUFOVVBfSU5URVJWQUxfTVMpIHJldHVybjtcbiAgbGFzdFN0YWxlQ2xlYW51cFN0YXJ0ZWRBdCA9IG5vdztcblxuICBjb25zdCBjbGVhbnVwID0gcGVyZm9ybVN0YWxlUnVuQ2xlYW51cCgpO1xuICBzdGFsZUNsZWFudXBJbkZsaWdodCA9IGNsZWFudXA7XG4gIHRyeSB7XG4gICAgYXdhaXQgY2xlYW51cDtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoc3RhbGVDbGVhbnVwSW5GbGlnaHQgPT09IGNsZWFudXApIHN0YWxlQ2xlYW51cEluRmxpZ2h0ID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1TdGFsZVJ1bkNsZWFudXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gXCJ0b29sLWNhbGwgcnVuOiBubyBmb2xsb3ctdXAgd2l0aGluIDMwIG1pbnV0ZXNcIjtcbiAgICBjb25zdCBzdGFsZUlkcyA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5leHBpcmVTdGFsZVRvb2xXYWl0aW5nUnVucyhcbiAgICAgIFNUQUxFX1JVTl9USFJFU0hPTERfTVMsXG4gICAgICBlcnJvck1lc3NhZ2UsXG4gICAgKTtcbiAgICBjb25zdCBjbGVhbmVkQ291bnQgPSBzdGFsZUlkcy5sZW5ndGg7XG4gICAgaWYgKGNsZWFuZWRDb3VudCA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBjbGVhbmVkIHVwICR7Y2xlYW5lZENvdW50fSBzdGFsZSBydW5uaW5nIHJlcXVlc3QgbG9nc2ApO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcihgc3RhbGUgY2xlYW51cCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFjQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZUFBZSxDQUFDO0FBQ25ELE1BQU0seUJBQXlCLE9BQVU7QUFDekMsTUFBTSw0QkFBNEIsS0FBSztBQUN2QyxJQUFJO0FBQ0osSUFBSSw0QkFBNEI7QUFDaEMsU0FBUyxtQkFDUCxZQUNBLE9BQ29CO0NBQ3BCLElBQUksQ0FBQyxPQUFPLE9BQU87Q0FDbkIsSUFBSSxNQUFNLFNBQVMsR0FBRyxHQUFHLE9BQU87Q0FDaEMsTUFBTSxRQUFRLFlBQVksUUFBUSxHQUFHLEtBQUs7Q0FDMUMsTUFBTSxXQUFXLFFBQVEsSUFBSSxZQUFZLE1BQU0sR0FBRyxLQUFLLElBQUk7Q0FDM0QsT0FBTyxXQUFXLEdBQUcsU0FBUyxHQUFHLFVBQVU7QUFDN0M7Ozs7QUFLQSxTQUFTLHdCQUF3QixZQUF5QztDQUN4RSxJQUFJLENBQUMsWUFBWSxPQUFPO0NBQ3hCLElBQUk7RUFFRixNQUFNLFdBRFEsS0FBSyxNQUFNLFVBQ1IsQ0FBQSxDQUFNLFFBQVEsU0FBUztHQUN0QyxJQUFJLENBQUMsUUFBUSxPQUFPLFNBQVMsVUFBVSxPQUFPO0dBQzlDLE1BQU0sU0FBUztHQUNmLE9BQU8sT0FBTyxTQUFTLGNBQWMsT0FBTyxTQUFTLFVBQVUsT0FBTyxTQUFTO0VBQ2pGLENBQUM7RUFDRCxPQUFPLFNBQVMsU0FBUyxJQUFJLFdBQVc7Q0FDMUMsUUFBUTtFQUNOO0NBQ0Y7QUFDRjtBQUVBLFNBQVMsZ0JBQWdCLE1BQXVCO0NBQzlDLElBQUk7RUFDRixLQUFLLE1BQU0sSUFBSTtFQUNmLE9BQU87Q0FDVCxRQUFRO0VBQ04sT0FBTztDQUNUO0FBQ0Y7Ozs7Ozs7QUFZQSxlQUFzQixZQUFZLE1BRy9CO0NBQ0QsSUFBSTtDQUNKLElBQUksWUFBWTtDQUtoQixJQUFJLEtBQUssWUFBWSxpQkFBaUIsUUFBVztFQUMvQyxlQUFlLEtBQUssV0FBVztFQUkvQixZQUFZLE1BQU0sZ0JBQWdCLGdCQUFnQixjQUFjLEtBQUssZUFBZSxDQUFDLENBQUM7RUFDdEYsTUFBTSxpQkFBaUI7Q0FDekIsT0FBTztFQUNMLE1BQU0saUJBQWlCO0VBQ3ZCLGVBQWUsTUFBTSxnQkFBZ0IsVUFBVTtHQUM3QyxhQUFhLEtBQUs7R0FDbEIsZUFBZSxLQUFLO0dBQ3BCLHNCQUFzQixLQUFLO0dBQzNCLFFBQVEsS0FBSyxhQUFhLFFBQVEsU0FBWSxLQUFLO0dBQ25ELGNBQWMsS0FBSztHQUNuQixTQUFTLHdCQUF3QixLQUFLLE9BQU87R0FDN0MsT0FBTyxLQUFLLE9BQU8sU0FBUyxLQUFLLFFBQVE7R0FDekMscUJBQXFCLEtBQUssb0JBQW9CLFNBQVMsUUFBUSxLQUFLO0dBQ3BFLGFBQWEsS0FBSyxjQUFjO0VBQ2xDLENBQUM7Q0FDSDtDQUVBLE9BQU87RUFBRTtFQUFjO0NBQVU7QUFDbkM7QUFFQSxlQUFzQixXQUNwQixjQUNBLFdBQ0EsTUFDQSxRQUM2QjtDQUU3QixNQUFNLHFCQUFxQixtQkFDekIsS0FBSyxPQUNMLEtBQUssU0FBUyxPQUFPLGtCQUFrQixPQUFPLEtBQ2hEO0NBQ0EsTUFBTSxrQkFBa0IsbUJBQW1CLEtBQUssT0FBTyxPQUFPLEtBQUs7Q0FHbkUsTUFBTSxnQkFBZ0IsV0FBVyxjQUFjO0VBQzdDLFlBQVk7RUFDWixNQUFNO0VBQ04sWUFBWTtFQUNaLHNCQUFzQjtFQUN0QixnQkFBZ0IsT0FBTyxnQkFBZ0IsVUFBVTtFQUNqRCxjQUFjLE9BQU8sTUFBTTtFQUMzQixlQUFlLE9BQU8sTUFBTTtFQUM1QixtQkFBbUIsT0FBTyxNQUFNO0VBQ2hDLHVCQUF1QixPQUFPLE1BQU07RUFDcEMsMEJBQTBCLE9BQU8sTUFBTTtFQUN2QywwQkFBMEIsT0FBTyxNQUFNO0VBQ3ZDLFVBQVUsS0FBSyxNQUFNLE9BQU8sVUFBVSxHQUFTO0VBQy9DLGFBQWEsT0FBTztFQUNwQixhQUFhLE9BQU87RUFDcEIsU0FBUyxPQUFPO0VBQ2hCLGVBQWUsT0FBTztDQUN4QixDQUFDO0NBRUQsTUFBTSxhQUFhLGNBQWMsTUFBTTtDQUN2QyxNQUFNLG9CQUFvQixvQ0FDeEIsUUFDQSxLQUFLLHNCQUNQO0NBQ0EsS0FBSyxNQUFNLFFBQVEsOEJBQThCLE1BQU0sWUFBWSxTQUFTLEdBQzFFLE1BQU0sZ0JBQWdCLFdBQVcsY0FBYyxJQUFJO0NBR3JELElBQUksT0FBTyxpQkFBaUIsY0FBYztFQUV4QyxNQUFNLFlBQVksT0FBTyxRQUFRLFFBQVEsTUFBTSxFQUFFLFNBQVMsV0FBVztFQUNyRSxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLEtBQUs7R0FDekMsTUFBTSxLQUFLLFVBQVU7R0FDckIsSUFBSSxHQUFHLFNBQVMsYUFBYTtHQUM3QixNQUFNLGdCQUFnQixXQUFXLGNBQWM7SUFDN0MsWUFBWTtJQUNaLE1BQU07SUFDTixpQkFBaUIsV0FBVyxTQUFTO0lBQ3JDLGNBQWMsR0FBRztJQUNqQixXQUFXLEdBQUc7SUFDZCxXQUFXLEdBQUc7R0FDaEIsQ0FBQztFQUNIO0VBRUEsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUU7Q0FDeEM7Q0FHQSxNQUFNLE1BQU0sTUFBTSxnQkFBZ0IsbUJBQW1CLFlBQVk7Q0FDakUsTUFBTSxlQUFlLHFCQUFxQixNQUFNO0NBQ2hELE1BQU0sZ0JBQWdCLFVBQVUsY0FBYztFQUM1QyxRQUFRO0VBQ1IsVUFBVTtFQUdWLGtCQUFrQixLQUFLLGFBQWEsZ0JBQWdCLFlBQVksSUFBSTtFQUNwRSxZQUFZLE9BQU87RUFDbkIsY0FBYyxJQUFJO0VBQ2xCLGVBQWUsSUFBSTtFQUNuQixtQkFBbUIsSUFBSTtFQUN2Qix1QkFBdUIsSUFBSTtFQUMzQiwwQkFBMEIsSUFBSTtFQUM5QiwwQkFBMEIsSUFBSTtFQUM5QixhQUFhLElBQUk7RUFFakIsc0JBQXNCO0VBQ3RCLFlBQVk7RUFDWixnQkFBZ0IsSUFBSTtFQUNwQixVQUFVLElBQUk7RUFDZCxhQUFhLElBQUk7RUFDakIsZ0JBQWdCO0VBQ2hCLEdBQUksV0FBVyxTQUFTLElBQUksRUFBRSxxQkFBcUIsS0FBSyxJQUFJLENBQUM7RUFDN0QsbUJBQ0Usc0JBQXNCLE9BQ2xCLDBCQUEwQixLQUFLLHdCQUF3QixNQUFNLElBQzdEO0VBQ04sU0FBUyx3QkFBd0IsS0FBSyxPQUFPO0NBQy9DLENBQUM7Q0FFRCxPQUFPLENBQUM7QUFDVjtBQUVBLGVBQXNCLG1CQUNwQixjQUNBLGNBQ0EsTUFDZTtDQUNmLE1BQU0sa0JBQWtCLGNBQWMsU0FBUyxjQUFjLElBQUk7QUFDbkU7QUFFQSxlQUFzQixpQkFBaUIsY0FBc0IsTUFBa0M7Q0FDN0YsTUFBTSxrQkFBa0IsY0FBYyxXQUFXLHVCQUF1QixJQUFJO0FBQzlFO0FBRUEsZUFBZSxrQkFDYixjQUNBLFFBQ0EsY0FDQSxNQUNlO0NBQ2YsSUFBSTtFQUNGLElBQUk7RUFDSixJQUFJO0dBQ0YsWUFBWSxNQUFNLGdCQUFnQixtQkFBbUIsWUFBWTtFQUNuRSxTQUFTLEdBQUc7R0FDVixPQUFPLE1BQU0sNkNBQTZDLE9BQU8sSUFBSyxFQUFZLFNBQVM7RUFDN0Y7RUFFQSxNQUFNLGdCQUFnQixVQUFVLGNBQWM7R0FDNUM7R0FDQSxlQUFlO0dBQ2YsU0FBUyxPQUFPLHdCQUF3QixLQUFLLE9BQU8sSUFBSTtHQUN4RCxHQUFJLFlBQ0E7SUFDRSxjQUFjLFVBQVU7SUFDeEIsZUFBZSxVQUFVO0lBQ3pCLG1CQUFtQixVQUFVO0lBQzdCLHVCQUF1QixVQUFVO0lBQ2pDLDBCQUEwQixVQUFVO0lBQ3BDLDBCQUEwQixVQUFVO0lBQ3BDLGFBQWEsVUFBVTtJQUN2QixnQkFBZ0IsVUFBVTtJQUMxQixVQUFVLFVBQVU7SUFDcEIsYUFBYSxVQUFVO0dBQ3pCLElBQ0EsQ0FBQztFQUNQLENBQUM7Q0FDSCxTQUFTLEdBQUc7RUFDVixPQUFPLE1BQU0scUJBQXFCLE9BQU8sWUFBYSxFQUFZLFNBQVM7Q0FDN0U7QUFDRjtBQUVBLGVBQWUsbUJBQWtDO0NBQy9DLElBQUksc0JBQXNCO0VBQ3hCLE1BQU07RUFDTjtDQUNGO0NBRUEsTUFBTSxNQUFNLEtBQUssSUFBSTtDQUNyQixJQUFJLE1BQU0sNEJBQTRCLDJCQUEyQjtDQUNqRSw0QkFBNEI7Q0FFNUIsTUFBTSxVQUFVLHVCQUF1QjtDQUN2Qyx1QkFBdUI7Q0FDdkIsSUFBSTtFQUNGLE1BQU07Q0FDUixVQUFVO0VBQ1IsSUFBSSx5QkFBeUIsU0FBUyx1QkFBdUI7Q0FDL0Q7QUFDRjtBQUVBLGVBQWUseUJBQXdDO0NBQ3JELElBQUk7RUFNRixNQUFNLGdCQUFlLE1BSkUsZ0JBQWdCLDJCQUNyQyx3QkFDQSwrQ0FDRixFQUNxQixDQUFTO0VBQzlCLElBQUksZUFBZSxHQUNqQixPQUFPLEtBQUssY0FBYyxhQUFhLDRCQUE0QjtDQUV2RSxTQUFTLEdBQUc7RUFDVixPQUFPLE1BQU0seUJBQTBCLEVBQVksU0FBUztDQUM5RDtBQUNGIn0=