@cartanova/qgrid-cli 2.10.1 → 2.10.3
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.
- package/README.ko.md +1 -1
- package/README.md +1 -1
- package/bundle/dist/application/monit/log-buffer.js +7 -11
- package/bundle/dist/application/monit/monit.frame.js +6 -11
- package/bundle/dist/application/qgrid/oauth.js +2 -2
- package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +2 -2
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +12 -36
- package/bundle/dist/application/qgrid/qgrid.frame.js +2 -2
- package/bundle/dist/application/qgrid/qgrid.types.js +2 -1
- package/bundle/dist/application/qgrid/token-subscriber.js +4 -7
- package/bundle/dist/application/qgrid/token-window-keepalive.js +3 -2
- package/bundle/dist/application/qgrid/tool-emulation-schema.js +4 -4
- package/bundle/dist/application/qgrid/tool-emulation.js +14 -2
- package/bundle/dist/application/request-log/request-log.model.js +7 -5
- package/bundle/dist/application/setting/setting.model.js +1 -1
- package/bundle/dist/sonamu.config.js +6 -6
- package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
- package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +53 -84
- package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +55 -0
- package/bundle/dist/utils/providers/anthropic/claude-session.js +11 -13
- package/bundle/dist/utils/providers/common/effort.js +1 -1
- package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +3 -3
- package/bundle/dist/utils/providers/common/thinking.js +12 -0
- package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +3 -2
- package/bundle/dist/utils/providers/openai/openai-direct-client.js +6 -16
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +89 -78
- package/bundle/src/application/monit/log-buffer.test.ts +3 -4
- package/bundle/src/application/monit/log-buffer.ts +13 -27
- package/bundle/src/application/monit/monit.frame.test.ts +7 -8
- package/bundle/src/application/monit/monit.frame.ts +9 -14
- package/bundle/src/application/qgrid/oauth.ts +1 -1
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +7 -0
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +1 -1
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +62 -1
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +25 -71
- package/bundle/src/application/qgrid/qgrid.frame.ts +4 -8
- package/bundle/src/application/qgrid/qgrid.types.ts +2 -0
- package/bundle/src/application/qgrid/token-subscriber.test.ts +8 -18
- package/bundle/src/application/qgrid/token-subscriber.ts +10 -20
- package/bundle/src/application/qgrid/token-window-keepalive.test.ts +2 -2
- package/bundle/src/application/qgrid/token-window-keepalive.ts +2 -1
- package/bundle/src/application/qgrid/tool-emulation-schema.test.ts +6 -3
- package/bundle/src/application/qgrid/tool-emulation-schema.ts +3 -3
- package/bundle/src/application/qgrid/tool-emulation.test.ts +8 -1
- package/bundle/src/application/qgrid/tool-emulation.ts +29 -0
- package/bundle/src/application/request-log/request-log.model.ts +5 -5
- package/bundle/src/application/setting/setting.model.ts +1 -1
- package/bundle/src/sonamu.config.ts +5 -5
- package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +3 -6
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +26 -0
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +70 -148
- package/bundle/src/utils/providers/anthropic/anthropic-thinking.test.ts +36 -0
- package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +84 -0
- package/bundle/src/utils/providers/anthropic/claude-session.test.ts +74 -13
- package/bundle/src/utils/providers/anthropic/claude-session.ts +11 -20
- package/bundle/src/utils/providers/common/effort.ts +1 -1
- package/bundle/src/utils/providers/common/provider-dispatcher.ts +4 -0
- package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -4
- package/bundle/src/utils/providers/common/thinking.ts +10 -0
- package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +7 -3
- package/bundle/src/utils/providers/openai/openai-direct-client.test.ts +3 -3
- package/bundle/src/utils/providers/openai/openai-direct-client.ts +20 -33
- package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +97 -6
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +113 -77
- package/bundle/web-dist/client/assets/{index-Cq4_ExLO.js → index-BIC1sQxw.js} +3 -3
- package/bundle/web-dist/client/assets/logs-zvdujZWn.js +1 -0
- package/bundle/web-dist/client/assets/monit-CraVV3MQ.js +1 -0
- package/bundle/web-dist/client/assets/refresh-cw-NNcU0Cmq.js +1 -0
- package/bundle/web-dist/client/assets/{routes-CXotE1OF.js → routes-B3ZBoJ60.js} +1 -1
- package/bundle/web-dist/client/assets/{settings-CfJDz4AC.js → settings-DwbzT5jo.js} +1 -1
- package/bundle/web-dist/client/assets/{show-gBpWK4z2.js → show-ItTExdAh.js} +1 -1
- package/bundle/web-dist/client/assets/{tokens-CbFJjIyC.js → tokens-BynKx8Vn.js} +1 -1
- package/bundle/web-dist/client/assets/{use-oauth-login-flow-jJo7GV3r.js → use-oauth-login-flow-8xw6on5P.js} +1 -1
- package/bundle/web-dist/client/index.html +1 -1
- package/bundle/web-dist/server/assets/{logs-DMlOXcDS.js → logs-BSk9lOHe.js} +13 -3
- package/bundle/web-dist/server/assets/{monit-Dg1wZCdx.js → monit-D9W4ioUi.js} +2 -21
- package/bundle/web-dist/server/assets/refresh-cw-B8U9BL9-.js +23 -0
- package/bundle/web-dist/server/assets/{settings-BaIBt_Vs.js → settings-BFVuldch.js} +1 -1
- package/bundle/web-dist/server/assets/{show-CDxGr4rS.js → show-Cswh_tqs.js} +1 -1
- package/bundle/web-dist/server/assets/{tokens-DJlfeGcx.js → tokens-DiTUwUwr.js} +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +6 -7
- package/package.json +1 -1
- package/skills/qgrid/SKILL.md +1 -0
- package/skills/qgrid/references/ai-sdk-provider-contract.md +2 -1
- package/skills/qgrid/references/anthropic-claude-code-runtime.md +7 -4
- package/skills/qgrid/references/decision-rationale.md +9 -0
- package/skills/qgrid/references/openai-codex-runtime.md +6 -0
- package/skills/qgrid/references/sonamu-api-web-flow.md +3 -1
- package/skills/qgrid/references/token-auth-quota-lifecycle.md +2 -0
- package/skills/qgrid/references/tool-calling-and-multiturn.md +18 -1
- package/skills/qgrid/references/verification-and-debugging.md +1 -1
- package/bundle/web-dist/client/assets/logs-kg1KOMBk.js +0 -1
- package/bundle/web-dist/client/assets/monit-DmtHTmSM.js +0 -1
- /package/bundle/web-dist/client/assets/{plus-CknMNCP5.js → plus-B62CuqT8.js} +0 -0
- /package/bundle/web-dist/client/assets/{request-model-eygfdRv7.js → request-model-D4CZPmnG.js} +0 -0
- /package/bundle/web-dist/server/assets/{plus-DVobMrag.js → plus-CmvbWuDf.js} +0 -0
- /package/bundle/web-dist/server/assets/{request-model-DXclJfdP.js → request-model-CnCeaNLE.js} +0 -0
|
@@ -70,4 +70,4 @@ function assertSupportedOneMillionSuffix(model) {
|
|
|
70
70
|
//#endregion
|
|
71
71
|
export { ANTHROPIC_CLAUDE_CWD, ANTHROPIC_CONFIG_DIR_BASE, ANTHROPIC_DEFAULT_EFFORT, ANTHROPIC_DEFAULT_MODEL, ANTHROPIC_DISALLOWED_TOOLS, anthropicConfigDir, assertSupportedOneMillionSuffix, canonicalAnthropicModel, hasOneMillionSuffix, isFableFamilyModel, needsCli1mSuffix, supports1MContext, usesAdaptiveThinking };
|
|
72
72
|
|
|
73
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLWNvbnN0YW50cy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9hbnRocm9waWMtY29uc3RhbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQW50aHJvcGljKENsYXVkZSkgcHJvdmlkZXIg7IOB7IiYLlxuICpcbiAqIENsYXVkZSBDb2RlIENMSSDtlIzrnpjqt7gvZW52IOqzhOyVveydhCBBbnRocm9waWMgZGlzcGF0Y2hlciDsmqnsnLzroZwg6rOg7KCV7ZWc64ukOlxuICogIC0gYC0tbm8tc2Vzc2lvbi1wZXJzaXN0ZW5jZWAg7KCc6rGwICjrqYDti7DthLQg7ZWE7IiYKS5cbiAqICAtIGAtLWlucHV0LWZvcm1hdCBzdHJlYW0tanNvbmAg7LaU6rCAIChzdGRpbiDsnLzroZwg7J6F66ClIOyWtOuMke2EsCBKU09OTCDtnZjrprwpLlxuICogIC0gQW50aHJvcGljIOqyveuhnOuKlCDrp6Qg7Zi47LacIGAtLXNlc3Npb24taWRgIOuhnCBmcmVzaCBzZXNzaW9uIOydhCDrsJzquIntlZzri6QuXG4gKi9cblxuLy8gQ0MgLS1tb2RlbCDtlIzrnpjqt7jqsIAg67Cb64qUIG9mZmljaWFsIG1vZGVsIGlkIChhbGlhcyBcInNvbm5ldFwiIOqwgCDslYTri4jrnbwg7KCV7ZmV7ZWcIOyLneuzhOyekOuhnCDqs6DsoJUpLlxuLy8gY2xhdWRlLWFwaSDsiqTtgqwg7ZmV7J24OiBTb25uZXQgNC42IG9mZmljaWFsIGlkID0gXCJjbGF1ZGUtc29ubmV0LTQtNlwiICjrgqDsp5wgc3VmZml4IOyXhuydjCkuXG4vLyBtb2RlbC1jb3N0IO2FjOydtOu4lOyXkOuPhCBcImNsYXVkZS1zb25uZXQtNC02XCIg7YKkIOyhtOyerFxuZXhwb3J0IGNvbnN0IEFOVEhST1BJQ19ERUZBVUxUX01PREVMID0gXCJjbGF1ZGUtc29ubmV0LTQtNlwiO1xuLy8gT3BlbkFJIHByb3ZpZGVyIOq4sOuzuOqwkihvcGVuYWktZGlzcGF0Y2hlciBERUZBVUxUX0VGRk9SVCnqs7wg66ee7LaY64ukLiDtgbTrnbzqsIAgZWZmb3J0IOuvuOyngOyglSDsi5wg7JWI7KCE66edLlxuZXhwb3J0IGNvbnN0IEFOVEhST1BJQ19ERUZBVUxUX0VGRk9SVCA9IFwibG93XCI7XG4vLyBwcm9qZWN0IHNjb3BlIGN3ZCAoc2V0dGluZ3MuanNvbiDqsqnrpqwpLiDthqDtgbDrs4Qg6rKp66as64qUIENMQVVERV9DT05GSUdfRElSIOuhnCDtlZzri6QuXG5leHBvcnQgY29uc3QgQU5USFJPUElDX0NMQVVERV9DV0QgPSBcIi90bXAvcWdyaWQtYW50aHJvcGljXCI7XG4vLyBwZXItdG9rZW4gQ0xBVURFX0NPTkZJR19ESVIg7J2YIOuyoOydtOyKpC4g7Iuk7KCcIOqyveuhnOuKlCBgJHtCQVNFfS8ke3Rva2VuSWR9YCAoUjEwIOqyqeumrCkuXG5leHBvcnQgY29uc3QgQU5USFJPUElDX0NPTkZJR19ESVJfQkFTRSA9IFwiL3RtcC9xZ3JpZC1hbnRocm9waWMtY29uZmlnXCI7XG4vLyBDQyDqsIAg7J6Q64+ZIO2ZnOyEse2ZlO2VmOuKlCBkZWZlcnJlZCDrj4Tqtawg4oCUIO2GoO2BsCDstZzsoIHtmZQg7JyE7ZW0IGRpc3BhdGNoZXIg6rK966Gc7JeQ7IScIOywqOuLqC5cbmV4cG9ydCBjb25zdCBBTlRIUk9QSUNfRElTQUxMT1dFRF9UT09MUyA9IFtcIk1vbml0b3JcIiwgXCJQdXNoTm90aWZpY2F0aW9uXCIsIFwiUmVtb3RlVHJpZ2dlclwiXSBhcyBjb25zdDtcbmNvbnN0IE9ORV9NSUxMSU9OX1NVRkZJWF9SRSA9IC9cXFsxbVxcXSQvaTtcblxuLy8g7Yag7YGw67OEIENMQVVERV9DT05GSUdfRElSIOqyveuhnCDqt5zsuZkoUjEwIOqyqeumrCDqs4Tslb0pLiB0b2tlbklkIOuzhOuhnCDrtoTrpqzrkJjslrQsIOqwmeydgCBjbGF1ZGUgc2Vzc2lvbi1pZFxuLy8g652864+EIOuLpOuluCDthqDtgbDsnbTrqbQg64uk66W4IGNvbmZpZyBkaXIg4oaSIHRyYW5zY3JpcHQg6rCAIOyEnuydtOyngCDslYrripTri6QuIOu2gOyImO2aqOqzvCDsl4bripQg7Iic7IiYIO2VqOyImOudvFxuLy8g6rKp66asIOqzhOyVveydhCDri6jsnIQg7YWM7Iqk7Yq466GcIOqzoOygle2VoCDsiJgg7J6I64ukKFU2IFIxMCDqtazsobAg6rKA7KadKS4g7Iuk7KCcIGRpciDsg53shLHsnYAgZW5zdXJlQ29uZmlnRGlyIOqwgCDtlZzri6QuXG5leHBvcnQgZnVuY3Rpb24gYW50aHJvcGljQ29uZmlnRGlyKHRva2VuSWQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtBTlRIUk9QSUNfQ09ORklHX0RJUl9CQVNFfS8ke3Rva2VuSWR9YDtcbn1cblxuLy8gbW9kZWwgaWQg66W8IGNhbm9uaWNhbChwcm92aWRlciBwcmVmaXgg7JeG64qUIENMSS9jb3N0IO2CpCkg66GcIOygleq3nO2ZlFxuLy8gYWktc2RrIOuKlCAnYW50aHJvcGljL2NsYXVkZS0qJyDtmJXtg5zroZwg67O064K064qU642wLCBwcmVmaXgg6rCAIGNhbGN1bGF0ZUNvc3RVc2Qg7JeQIOyDiOuptCBjb3N0IOqwgFxuLy8gZGVmYXVsdCDri6jqsIDroZwg7Jik6rOE7IKw65Cc64ukLiBgWzFtXWAgc3VmZml4IOuPhCBDTEkgZW1pdCDsoITsmqnsnbTrnbxcbi8vIGJhc2UgY2Fub25pY2FsIOyXkOyEnOuKlCDsoJzqsbDtlZzri6QuIOuvuOyngOygleydtOuptCBkZWZhdWx0LlxuZXhwb3J0IGZ1bmN0aW9uIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsKG1vZGVsPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmF3ID0gbW9kZWwgfHwgQU5USFJPUElDX0RFRkFVTFRfTU9ERUw7XG4gIGNvbnN0IHdpdGhvdXRQcm92aWRlciA9IHJhdy5pbmNsdWRlcyhcIi9cIikgPyByYXcuc3BsaXQoXCIvXCIpLnBvcCgpISA6IHJhdztcbiAgcmV0dXJuIHdpdGhvdXRQcm92aWRlci5yZXBsYWNlKE9ORV9NSUxMSU9OX1NVRkZJWF9SRSwgXCJcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNPbmVNaWxsaW9uU3VmZml4KG1vZGVsPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBtb2RlbCAhPT0gdW5kZWZpbmVkICYmIE9ORV9NSUxMSU9OX1NVRkZJWF9SRS50ZXN0KG1vZGVsKTtcbn1cblxuLy8gMU0g7KeA7JuQIOyXrOu2gOuKlCBDbGF1ZGUgQ29kZSDrgrTrtoDsnZgg6rSR67KU7JyE7ZWcIHByZWZpeCDtjJDsoJXsnbQg7JWE64uI6528IHFncmlk7JeQ7IScIO2ZleyduO2VnCBleGFjdCBzZXQg7Jy866GcXG4vLyDqs6DsoJXtlZzri6QuIG9wdXMtNC03IOydgCDsi6TsuKEg7KCE6rmM7KeAIOuvuO2PrO2VqC4g7IOIIOuqqOuNuCDstpTqsIAg7IucIOqzteyLnSDsgqzslpHqs7wg7Iuk7KCcIENMSSDrj5nsnpHsnYQg7ZmV7J247ZWc64ukLlxuY29uc3QgT05FX01JTExJT05fQ09OVEVYVF9NT0RFTFMgPSBuZXcgU2V0KFtcbiAgXCJjbGF1ZGUtZmFibGUtNS0xXCIsXG4gIFwiY2xhdWRlLWZhYmxlLTVcIixcbiAgXCJjbGF1ZGUtb3B1cy01XCIsXG4gIFwiY2xhdWRlLW9wdXMtNS01XCIsXG4gIFwiY2xhdWRlLXNvbm5ldC01LTVcIixcbiAgXCJjbGF1ZGUtc29ubmV0LTVcIixcbiAgXCJjbGF1ZGUtaGFpa3UtNS01XCIsXG4gIFwiY2xhdWRlLXNvbm5ldC00LTZcIixcbiAgXCJjbGF1ZGUtb3B1cy00LTZcIixcbiAgXCJjbGF1ZGUtb3B1cy00LThcIixcbl0pO1xuXG5jb25zdCBDTElfT05FX01JTExJT05fU1VGRklYX01PREVMUyA9IG5ldyBTZXQoW1wiY2xhdWRlLXNvbm5ldC00LTZcIiwgXCJjbGF1ZGUtb3B1cy00LTZcIl0pO1xuLy8gRmFibGUgNS81LjEsIE9wdXMgNS41LCBTb25uZXQgNS41LCBIYWlrdSA1LjUg64qUIHRoaW5raW5nIGRpc2FibGVkIOulvCDqsbDrtoDtlZzri6QoRmFibGU6IENMSSDsubTtg4jroZzqt7ggYHJlamVjdHNfZGlzYWJsZWRfdGhpbmtpbmdgLFxuLy8gT3B1cyA1LjU6IOqzteyLnSDsgqzslpEgXCJjYW4ndCBiZSB0dXJuZWQgb2ZmXCIsIDIwMjYtMDktMjIg7Lac7IucLiBTb25uZXQgNS41OiBBUEkgYHt0eXBlOiBcImRpc2FibGVkXCJ9YCA0MDAsIENMSSDsubTtg4jroZzqt7ggYHJlamVjdHNfZGlzYWJsZWRfdGhpbmtpbmdgLCAyMDI2LTA5LTI4IOy2nOyLnC5cbi8vIEhhaWt1IDUuNTogQVBJIOuKlCBoaWdoIOydtO2VmOyXkOyEnOunjCBkaXNhYmxlZCDtl4jsmqnCt3hoaWdoL21heCA0MDAsIENsYXVkZSBDb2RlIDIuMS4yOTMg7Lm07YOI66Gc6re464qUIGByZWplY3RzX2Rpc2FibGVkX3RoaW5raW5nYCwgMjAyNi0xMC0wNyDstpzsi5wpLiBPcHVzIDUg64qUXG4vLyBkaXNhYmxlZCDrpbwgaGlnaCDsnbTtlZjsl5DshJwg7KeA7JuQ7ZWY7KeA66eMLCDqs7Xsi50g6riw67O46rCSwrfqtozsnqUg64+Z7J6R7J24IGFkYXB0aXZlIHRoaW5raW5nIOydhCDsnKDsp4DtlZzri6QuIHFncmlkXG4vLyDquLDrs7ggZWZmb3J0PWxvdyDqsIAg67mE7JqpL+yngOyXsCDsoJzslrTrpbwg66eh7Jy866mwLCDsnbQg7KCV7LGF7J2AIGRpc2FibGVkK3hoaWdoL21heCA0MDAg7Jik66WY7JmAIGRpc2FibGVkIOyLnFxuLy8gdG9vbC9YTUwg7Lac66ClIOyYpOyXvOuPhCDtlLztlZzri6QuXG5jb25zdCBBREFQVElWRV9USElOS0lOR19NT0RFTFMgPSBuZXcgU2V0KFtcbiAgXCJjbGF1ZGUtZmFibGUtNS0xXCIsXG4gIFwiY2xhdWRlLWZhYmxlLTVcIixcbiAgXCJjbGF1ZGUtb3B1cy01XCIsXG4gIFwiY2xhdWRlLW9wdXMtNS01XCIsXG4gIFwiY2xhdWRlLXNvbm5ldC01LTVcIixcbiAgXCJjbGF1ZGUtaGFpa3UtNS01XCIsXG5dKTtcblxuLy8gRmFibGUg6rOE7Je0OiDqtazrj4Ug7ZSM656c7JeQ7IScIHVzYWdlIGNyZWRpdHMg6rCAIO2VhOyalO2VnCDstZzsg4HsnIQg7Yuw7Ja0LiDqtazrj4UgdXNhZ2UgQVBJIOydmFxuLy8gYHNldmVuX2RheV9vdmVyYWdlX2luY2x1ZGVkYCDrsoTtgrfsnYAg7J20IOqzhOyXtOyXkOunjCDsoIHsmqnrkJjrr4DroZwgcXVvdGEgdGhyZXNob2xkIO2MkOygleydtCDssLjsobDtlZzri6QuXG4vLyBNeXRob3Mg64qUIFByb2plY3QgR2xhc3N3aW5nIOyhsOyngSDsoITsmqnsnbTrnbwg6rWs64+FIO2GoO2BsCDqsr3roZzsl5DshJwg64+E64us7ZWgIOyImCDsl4bslrQg7Y+s7ZWo7ZWY7KeAIOyViuuKlOuLpC5cbmNvbnN0IEZBQkxFX0ZBTUlMWV9NT0RFTFMgPSBuZXcgU2V0KFtcImNsYXVkZS1mYWJsZS01LTFcIiwgXCJjbGF1ZGUtZmFibGUtNVwiXSk7XG5cbi8vIOu2iOuzgCDqs4Tslb06IHN1ZmZpeCDqsIAg7ZWE7JqU7ZWcIOuqqOuNuOydgCDrsJjrk5zsi5wgMU0g7KeA7JuQIOuqqOuNuOydmCDrtoDrtoTsp5HtlansnbTslrTslbwg7ZWc64ukLiDsl63rsKntlqUg67aI7J287LmYKHN1ZmZpeFxuLy8g64yA7IOB7J24642wIOyngOybkCDsp5Htlansl5Qg7JeG7J2MKeuptCBuZWVkc0NsaTFtU3VmZml4PXRydWXCt3N1cHBvcnRzMU1Db250ZXh0PWZhbHNlIOqwgCDrj5nsi5zsl5Ag64KY7IScXG4vLyBgLS1tb2RlbCBbMW1dYCDqs7wgRElTQUJMRV8xTSBlbnYg6rCAIOuqqOyInOuQmOqyjCDrtpnripTri6QuIOyDiCDrqqjrjbjsnYQg7ZWc7Kq9IFNldCDsl5Drp4wg64Sj64qUIOyLpOyImOulvCDrqqjrk4hcbi8vIOuhnOuTnCDsi5zsoJDsl5Ag7J6h64qU64ukLlxuZm9yIChjb25zdCBtb2RlbCBvZiBDTElfT05FX01JTExJT05fU1VGRklYX01PREVMUykge1xuICBpZiAoIU9ORV9NSUxMSU9OX0NPTlRFWFRfTU9ERUxTLmhhcyhtb2RlbCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFtpbnZhcmlhbnRdIENMSSAxTSBzdWZmaXggbW9kZWwgbm90IGluIGNvbnRleHQgc2V0OiAke21vZGVsfWApO1xuICB9XG59XG4vLyBGYWJsZSDqs4Tsl7TsnYAg6rO17IudIOyCrOyWkeyDgSAxTSDquLDrs7gg7Luo7YWN7Iqk7Yq4ICsgYWRhcHRpdmUgdGhpbmtpbmcg7ZWE7IiY64ukLiDsg4ggRmFibGUg67KE7KCE7J2EIOqzhOyXtCBTZXRcbi8vIOyXkOunjCDrhKPqs6Ag64KY66i47KeA66W8IOu5oOucqOumrOuKlCDsi6TsiJjrpbwg6rCZ7J2AIOuwqeyLneycvOuhnCDrqqjrk4gg66Gc65OcIOyLnOygkOyXkCDsnqHripTri6QuXG5mb3IgKGNvbnN0IG1vZGVsIG9mIEZBQkxFX0ZBTUlMWV9NT0RFTFMpIHtcbiAgaWYgKCFPTkVfTUlMTElPTl9DT05URVhUX01PREVMUy5oYXMobW9kZWwpIHx8ICFBREFQVElWRV9USElOS0lOR19NT0RFTFMuaGFzKG1vZGVsKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgW2ludmFyaWFudF0gRmFibGUgZmFtaWx5IG1vZGVsIG1pc3NpbmcgZnJvbSAxTS9hZGFwdGl2ZSBzZXQ6ICR7bW9kZWx9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzMU1Db250ZXh0KG1vZGVsPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBPTkVfTUlMTElPTl9DT05URVhUX01PREVMUy5oYXMoY2Fub25pY2FsQW50aHJvcGljTW9kZWwobW9kZWwpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZWRzQ2xpMW1TdWZmaXgobW9kZWw/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIENMSV9PTkVfTUlMTElPTl9TVUZGSVhfTU9ERUxTLmhhcyhjYW5vbmljYWxBbnRocm9waWNNb2RlbChtb2RlbCkpO1xufVxuXG4vLyBxZ3JpZCDqsIAgYWRhcHRpdmUgdGhpbmtpbmcg7J2EIOuztOyhtO2VmOuKlCDrqqjrjbjsnbjsp4Ag7YyQ67OE7ZWc64ukLiDrgpjrqLjsp4Ag66qo64247J2AIOq4sOyhtFxuLy8g7KCA67mE7JqpL+u5hOy2lOuhoCDqsr3roZzrpbwg7Jyg7KeA7ZWc64ukLlxuZXhwb3J0IGZ1bmN0aW9uIHVzZXNBZGFwdGl2ZVRoaW5raW5nKG1vZGVsPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBBREFQVElWRV9USElOS0lOR19NT0RFTFMuaGFzKGNhbm9uaWNhbEFudGhyb3BpY01vZGVsKG1vZGVsKSk7XG59XG5cbi8vIOq1rOuPhSB1c2FnZSDsnZggRmFibGUg7KCE7JqpIDfsnbwg67KE7YK37J2EIHF1b3RhIO2MkOygleyXkCDtj6ztlajtlaDsp4Ag6rKw7KCV7ZWc64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGlzRmFibGVGYW1pbHlNb2RlbChtb2RlbD86IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gRkFCTEVfRkFNSUxZX01PREVMUy5oYXMoY2Fub25pY2FsQW50aHJvcGljTW9kZWwobW9kZWwpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFN1cHBvcnRlZE9uZU1pbGxpb25TdWZmaXgobW9kZWw/OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFoYXNPbmVNaWxsaW9uU3VmZml4KG1vZGVsKSkgcmV0dXJuO1xuICBjb25zdCBjYW5vbmljYWwgPSBjYW5vbmljYWxBbnRocm9waWNNb2RlbChtb2RlbCk7XG4gIGlmICghc3VwcG9ydHMxTUNvbnRleHQoY2Fub25pY2FsKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgQW50aHJvcGljIDFNIG1vZGVsIHN1ZmZpeDogJHttb2RlbH1gKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFZQSxNQUFhLDBCQUEwQjtBQUV2QyxNQUFhLDJCQUEyQjtBQUV4QyxNQUFhLHVCQUF1QjtBQUVwQyxNQUFhLDRCQUE0QjtBQUV6QyxNQUFhLDZCQUE2QjtDQUFDO0NBQVc7Q0FBb0I7QUFBZTtBQUN6RixNQUFNLHdCQUF3QjtBQUs5QixTQUFnQixtQkFBbUIsU0FBeUI7Q0FDMUQsT0FBTyxHQUFHLDBCQUEwQixHQUFHO0FBQ3pDO0FBTUEsU0FBZ0Isd0JBQXdCLE9BQXdCO0NBQzlELE1BQU0sTUFBTSxTQUFBO0NBRVosUUFEd0IsSUFBSSxTQUFTLEdBQUcsSUFBSSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFLLElBQzdELENBQWdCLFFBQVEsdUJBQXVCLEVBQUU7QUFDMUQ7QUFFQSxTQUFnQixvQkFBb0IsT0FBeUI7Q0FDM0QsT0FBTyxVQUFVLFVBQWEsc0JBQXNCLEtBQUssS0FBSztBQUNoRTtBQUlBLE1BQU0sNkNBQTZCLElBQUksSUFBSTtDQUN6QztDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtBQUNGLENBQUM7QUFFRCxNQUFNLGdEQUFnQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsaUJBQWlCLENBQUM7QUFPdEYsTUFBTSwyQ0FBMkIsSUFBSSxJQUFJO0NBQ3ZDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtBQUNGLENBQUM7QUFLRCxNQUFNLHNDQUFzQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsZ0JBQWdCLENBQUM7QUFNMUUsS0FBSyxNQUFNLFNBQVMsK0JBQ2xCLElBQUksQ0FBQywyQkFBMkIsSUFBSSxLQUFLLEdBQ3ZDLE1BQU0sSUFBSSxNQUFNLHVEQUF1RCxPQUFPO0FBS2xGLEtBQUssTUFBTSxTQUFTLHFCQUNsQixJQUFJLENBQUMsMkJBQTJCLElBQUksS0FBSyxLQUFLLENBQUMseUJBQXlCLElBQUksS0FBSyxHQUMvRSxNQUFNLElBQUksTUFBTSxnRUFBZ0UsT0FBTztBQUkzRixTQUFnQixrQkFBa0IsT0FBeUI7Q0FDekQsT0FBTywyQkFBMkIsSUFBSSx3QkFBd0IsS0FBSyxDQUFDO0FBQ3RFO0FBRUEsU0FBZ0IsaUJBQWlCLE9BQXlCO0NBQ3hELE9BQU8sOEJBQThCLElBQUksd0JBQXdCLEtBQUssQ0FBQztBQUN6RTtBQUlBLFNBQWdCLHFCQUFxQixPQUF5QjtDQUM1RCxPQUFPLHlCQUF5QixJQUFJLHdCQUF3QixLQUFLLENBQUM7QUFDcEU7QUFHQSxTQUFnQixtQkFBbUIsT0FBeUI7Q0FDMUQsT0FBTyxvQkFBb0IsSUFBSSx3QkFBd0IsS0FBSyxDQUFDO0FBQy9EO0FBRUEsU0FBZ0IsZ0NBQWdDLE9BQXNCO0NBQ3BFLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxHQUFHO0NBRWpDLElBQUksQ0FBQyxrQkFEYSx3QkFBd0IsS0FDbkIsQ0FBUyxHQUM5QixNQUFNLElBQUksTUFBTSwwQ0FBMEMsT0FBTztBQUVyRSJ9
|
|
73
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLWNvbnN0YW50cy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9hbnRocm9waWMtY29uc3RhbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQW50aHJvcGljKENsYXVkZSkgcHJvdmlkZXIg7IOB7IiYLlxuICpcbiAqIENsYXVkZSBDb2RlIENMSSDtlIzrnpjqt7gvZW52IOqzhOyVveydhCBBbnRocm9waWMgZGlzcGF0Y2hlciDsmqnsnLzroZwg6rOg7KCV7ZWc64ukOlxuICogIC0gYC0tbm8tc2Vzc2lvbi1wZXJzaXN0ZW5jZWAg7KCc6rGwICjrqYDti7DthLQg7ZWE7IiYKS5cbiAqICAtIGAtLWlucHV0LWZvcm1hdCBzdHJlYW0tanNvbmAg7LaU6rCAIChzdGRpbiDsnLzroZwg7J6F66ClIOyWtOuMke2EsCBKU09OTCDtnZjrprwpLlxuICogIC0gQW50aHJvcGljIOqyveuhnOuKlCDrp6Qg7Zi47LacIGAtLXNlc3Npb24taWRgIOuhnCBmcmVzaCBzZXNzaW9uIOydhCDrsJzquIntlZzri6QuXG4gKi9cblxuLy8gQ0MgLS1tb2RlbCDtlIzrnpjqt7jqsIAg67Cb64qUIG9mZmljaWFsIG1vZGVsIGlkIChhbGlhcyBcInNvbm5ldFwiIOqwgCDslYTri4jrnbwg7KCV7ZmV7ZWcIOyLneuzhOyekOuhnCDqs6DsoJUpLlxuLy8gY2xhdWRlLWFwaSDsiqTtgqwg7ZmV7J24OiBTb25uZXQgNC42IG9mZmljaWFsIGlkID0gXCJjbGF1ZGUtc29ubmV0LTQtNlwiICjrgqDsp5wgc3VmZml4IOyXhuydjCkuXG4vLyBtb2RlbC1jb3N0IO2FjOydtOu4lOyXkOuPhCBcImNsYXVkZS1zb25uZXQtNC02XCIg7YKkIOyhtOyerFxuZXhwb3J0IGNvbnN0IEFOVEhST1BJQ19ERUZBVUxUX01PREVMID0gXCJjbGF1ZGUtc29ubmV0LTQtNlwiO1xuLy8gT3BlbkFJIHByb3ZpZGVyIOq4sOuzuOqwkihvcGVuYWktZGlzcGF0Y2hlciBERUZBVUxUX0VGRk9SVCnqs7wg66ee7LaY64ukLiDtgbTrnbzqsIAgZWZmb3J0IOuvuOyngOyglSDsi5wg7JWI7KCE66edLlxuZXhwb3J0IGNvbnN0IEFOVEhST1BJQ19ERUZBVUxUX0VGRk9SVCA9IFwibG93XCI7XG4vLyBwcm9qZWN0IHNjb3BlIGN3ZCAoc2V0dGluZ3MuanNvbiDqsqnrpqwpLiDthqDtgbDrs4Qg6rKp66as64qUIENMQVVERV9DT05GSUdfRElSIOuhnCDtlZzri6QuXG5leHBvcnQgY29uc3QgQU5USFJPUElDX0NMQVVERV9DV0QgPSBcIi90bXAvcWdyaWQtYW50aHJvcGljXCI7XG4vLyBwZXItdG9rZW4gQ0xBVURFX0NPTkZJR19ESVIg7J2YIOuyoOydtOyKpC4g7Iuk7KCcIOqyveuhnOuKlCBgJHtCQVNFfS8ke3Rva2VuSWR9YCAoUjEwIOqyqeumrCkuXG5leHBvcnQgY29uc3QgQU5USFJPUElDX0NPTkZJR19ESVJfQkFTRSA9IFwiL3RtcC9xZ3JpZC1hbnRocm9waWMtY29uZmlnXCI7XG4vLyBDQyDqsIAg7J6Q64+ZIO2ZnOyEse2ZlO2VmOuKlCBkZWZlcnJlZCDrj4Tqtawg4oCUIO2GoO2BsCDstZzsoIHtmZQg7JyE7ZW0IGRpc3BhdGNoZXIg6rK966Gc7JeQ7IScIOywqOuLqC5cbmV4cG9ydCBjb25zdCBBTlRIUk9QSUNfRElTQUxMT1dFRF9UT09MUyA9IFtcIk1vbml0b3JcIiwgXCJQdXNoTm90aWZpY2F0aW9uXCIsIFwiUmVtb3RlVHJpZ2dlclwiXSBhcyBjb25zdDtcbmNvbnN0IE9ORV9NSUxMSU9OX1NVRkZJWF9SRSA9IC9cXFsxbVxcXSQvaTtcblxuLy8g7Yag7YGw67OEIENMQVVERV9DT05GSUdfRElSIOqyveuhnCDqt5zsuZkoUjEwIOqyqeumrCDqs4Tslb0pLiB0b2tlbklkIOuzhOuhnCDrtoTrpqzrkJjslrQsIOqwmeydgCBjbGF1ZGUgc2Vzc2lvbi1pZFxuLy8g652864+EIOuLpOuluCDthqDtgbDsnbTrqbQg64uk66W4IGNvbmZpZyBkaXIg4oaSIHRyYW5zY3JpcHQg6rCAIOyEnuydtOyngCDslYrripTri6QuIOu2gOyImO2aqOqzvCDsl4bripQg7Iic7IiYIO2VqOyImOudvFxuLy8g6rKp66asIOqzhOyVveydhCDri6jsnIQg7YWM7Iqk7Yq466GcIOqzoOygle2VoCDsiJgg7J6I64ukKFU2IFIxMCDqtazsobAg6rKA7KadKS4g7Iuk7KCcIGRpciDsg53shLHsnYAgZW5zdXJlQ29uZmlnRGlyIOqwgCDtlZzri6QuXG5leHBvcnQgZnVuY3Rpb24gYW50aHJvcGljQ29uZmlnRGlyKHRva2VuSWQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtBTlRIUk9QSUNfQ09ORklHX0RJUl9CQVNFfS8ke3Rva2VuSWR9YDtcbn1cblxuLy8gbW9kZWwgaWQg66W8IGNhbm9uaWNhbChwcm92aWRlciBwcmVmaXgg7JeG64qUIENMSS9jb3N0IO2CpCkg66GcIOygleq3nO2ZlFxuLy8gYWktc2RrIOuKlCAnYW50aHJvcGljL2NsYXVkZS0qJyDtmJXtg5zroZwg67O064K064qU642wLCBwcmVmaXgg6rCAIGNhbGN1bGF0ZUNvc3RVc2Qg7JeQIOyDiOuptCBjb3N0IOqwgFxuLy8gZGVmYXVsdCDri6jqsIDroZwg7Jik6rOE7IKw65Cc64ukLiBgWzFtXWAgc3VmZml4IOuPhCBDTEkgZW1pdCDsoITsmqnsnbTrnbxcbi8vIGJhc2UgY2Fub25pY2FsIOyXkOyEnOuKlCDsoJzqsbDtlZzri6QuIOuvuOyngOygleydtOuptCBkZWZhdWx0LlxuZXhwb3J0IGZ1bmN0aW9uIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsKG1vZGVsPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmF3ID0gbW9kZWwgfHwgQU5USFJPUElDX0RFRkFVTFRfTU9ERUw7XG4gIGNvbnN0IHdpdGhvdXRQcm92aWRlciA9IHJhdy5pbmNsdWRlcyhcIi9cIikgPyByYXcuc3BsaXQoXCIvXCIpLnBvcCgpISA6IHJhdztcbiAgcmV0dXJuIHdpdGhvdXRQcm92aWRlci5yZXBsYWNlKE9ORV9NSUxMSU9OX1NVRkZJWF9SRSwgXCJcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNPbmVNaWxsaW9uU3VmZml4KG1vZGVsPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBtb2RlbCAhPT0gdW5kZWZpbmVkICYmIE9ORV9NSUxMSU9OX1NVRkZJWF9SRS50ZXN0KG1vZGVsKTtcbn1cblxuLy8gMU0g7KeA7JuQIOyXrOu2gOuKlCBDbGF1ZGUgQ29kZSDrgrTrtoDsnZgg6rSR67KU7JyE7ZWcIHByZWZpeCDtjJDsoJXsnbQg7JWE64uI6528IHFncmlk7JeQ7IScIO2ZleyduO2VnCBleGFjdCBzZXQg7Jy866GcXG4vLyDqs6DsoJXtlZzri6QuIG9wdXMtNC03IOydgCDsi6TsuKEg7KCE6rmM7KeAIOuvuO2PrO2VqC4g7IOIIOuqqOuNuCDstpTqsIAg7IucIOqzteyLnSDsgqzslpHqs7wg7Iuk7KCcIENMSSDrj5nsnpHsnYQg7ZmV7J247ZWc64ukLlxuY29uc3QgT05FX01JTExJT05fQ09OVEVYVF9NT0RFTFMgPSBuZXcgU2V0KFtcbiAgXCJjbGF1ZGUtZmFibGUtNS0xXCIsXG4gIFwiY2xhdWRlLWZhYmxlLTVcIixcbiAgXCJjbGF1ZGUtb3B1cy01XCIsXG4gIFwiY2xhdWRlLW9wdXMtNS01XCIsXG4gIFwiY2xhdWRlLXNvbm5ldC01LTVcIixcbiAgXCJjbGF1ZGUtc29ubmV0LTVcIixcbiAgXCJjbGF1ZGUtaGFpa3UtNS01XCIsXG4gIFwiY2xhdWRlLXNvbm5ldC00LTZcIixcbiAgXCJjbGF1ZGUtb3B1cy00LTZcIixcbiAgXCJjbGF1ZGUtb3B1cy00LThcIixcbl0pO1xuXG5jb25zdCBDTElfT05FX01JTExJT05fU1VGRklYX01PREVMUyA9IG5ldyBTZXQoW1wiY2xhdWRlLXNvbm5ldC00LTZcIiwgXCJjbGF1ZGUtb3B1cy00LTZcIl0pO1xuLy8gUHJlc2VydmUgdGhlc2UgZGVmYXVsdHMgd2hlbiB0aGlua2luZyBpcyBvbWl0dGVkLiBUaGlzIGlzIG5vdCBhbiBvZmYtY2FwYWJpbGl0eSBsaXN0OlxuLy8gZXhwbGljaXQgZmFsc2Ugc3VwcG9ydHMgT3B1cyA1LCBhbmQgbmF0aXZlIGV4dHJhLWJvZHkgZGVsaXZlcnkgc3VwcG9ydHMgSGFpa3UgNS41XG4vLyAoZGlzYWJsZWQpIGFuZCBTb25uZXQgNS41IChiZXR3ZWVuX3Rvb2xzKS4gU2VlIGFudGhyb3BpYy10aGlua2luZy50cy5cbmNvbnN0IEFEQVBUSVZFX1RISU5LSU5HX01PREVMUyA9IG5ldyBTZXQoW1xuICBcImNsYXVkZS1mYWJsZS01LTFcIixcbiAgXCJjbGF1ZGUtZmFibGUtNVwiLFxuICBcImNsYXVkZS1vcHVzLTVcIixcbiAgXCJjbGF1ZGUtb3B1cy01LTVcIixcbiAgXCJjbGF1ZGUtc29ubmV0LTUtNVwiLFxuICBcImNsYXVkZS1oYWlrdS01LTVcIixcbl0pO1xuXG4vLyBGYWJsZSDqs4Tsl7Q6IOq1rOuPhSDtlIzrnpzsl5DshJwgdXNhZ2UgY3JlZGl0cyDqsIAg7ZWE7JqU7ZWcIOy1nOyDgeychCDti7DslrQuIOq1rOuPhSB1c2FnZSBBUEkg7J2YXG4vLyBgc2V2ZW5fZGF5X292ZXJhZ2VfaW5jbHVkZWRgIOuyhO2Ct+ydgCDsnbQg6rOE7Je07JeQ66eMIOyggeyaqeuQmOuvgOuhnCBxdW90YSB0aHJlc2hvbGQg7YyQ7KCV7J20IOywuOyhsO2VnOuLpC5cbi8vIE15dGhvcyDripQgUHJvamVjdCBHbGFzc3dpbmcg7KGw7KeBIOyghOyaqeydtOudvCDqtazrj4Ug7Yag7YGwIOqyveuhnOyXkOyEnCDrj4Tri6ztlaAg7IiYIOyXhuyWtCDtj6ztlajtlZjsp4Ag7JWK64qU64ukLlxuY29uc3QgRkFCTEVfRkFNSUxZX01PREVMUyA9IG5ldyBTZXQoW1wiY2xhdWRlLWZhYmxlLTUtMVwiLCBcImNsYXVkZS1mYWJsZS01XCJdKTtcblxuLy8g67aI67OAIOqzhOyVvTogc3VmZml4IOqwgCDtlYTsmpTtlZwg66qo64247J2AIOuwmOuTnOyLnCAxTSDsp4Dsm5Ag66qo64247J2YIOu2gOu2hOynke2VqeydtOyWtOyVvCDtlZzri6QuIOyXreuwqe2WpSDrtojsnbzsuZgoc3VmZml4XG4vLyDrjIDsg4HsnbjrjbAg7KeA7JuQIOynke2VqeyXlCDsl4bsnYwp66m0IG5lZWRzQ2xpMW1TdWZmaXg9dHJ1ZcK3c3VwcG9ydHMxTUNvbnRleHQ9ZmFsc2Ug6rCAIOuPmeyLnOyXkCDrgpjshJxcbi8vIGAtLW1vZGVsIFsxbV1gIOqzvCBESVNBQkxFXzFNIGVudiDqsIAg66qo7Iic65CY6rKMIOu2meuKlOuLpC4g7IOIIOuqqOuNuOydhCDtlZzsqr0gU2V0IOyXkOunjCDrhKPripQg7Iuk7IiY66W8IOuqqOuTiFxuLy8g66Gc65OcIOyLnOygkOyXkCDsnqHripTri6QuXG5mb3IgKGNvbnN0IG1vZGVsIG9mIENMSV9PTkVfTUlMTElPTl9TVUZGSVhfTU9ERUxTKSB7XG4gIGlmICghT05FX01JTExJT05fQ09OVEVYVF9NT0RFTFMuaGFzKG1vZGVsKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgW2ludmFyaWFudF0gQ0xJIDFNIHN1ZmZpeCBtb2RlbCBub3QgaW4gY29udGV4dCBzZXQ6ICR7bW9kZWx9YCk7XG4gIH1cbn1cbi8vIEZhYmxlIOqzhOyXtOydgCDqs7Xsi50g7IKs7JaR7IOBIDFNIOq4sOuzuCDsu6jthY3siqTtirggKyBhZGFwdGl2ZSB0aGlua2luZyDtlYTsiJjri6QuIOyDiCBGYWJsZSDrsoTsoITsnYQg6rOE7Je0IFNldFxuLy8g7JeQ66eMIOuEo+qzoCDrgpjrqLjsp4Drpbwg67mg65yo66as64qUIOyLpOyImOulvCDqsJnsnYAg67Cp7Iud7Jy866GcIOuqqOuTiCDroZzrk5wg7Iuc7KCQ7JeQIOyeoeuKlOuLpC5cbmZvciAoY29uc3QgbW9kZWwgb2YgRkFCTEVfRkFNSUxZX01PREVMUykge1xuICBpZiAoIU9ORV9NSUxMSU9OX0NPTlRFWFRfTU9ERUxTLmhhcyhtb2RlbCkgfHwgIUFEQVBUSVZFX1RISU5LSU5HX01PREVMUy5oYXMobW9kZWwpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBbaW52YXJpYW50XSBGYWJsZSBmYW1pbHkgbW9kZWwgbWlzc2luZyBmcm9tIDFNL2FkYXB0aXZlIHNldDogJHttb2RlbH1gKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHMxTUNvbnRleHQobW9kZWw/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9ORV9NSUxMSU9OX0NPTlRFWFRfTU9ERUxTLmhhcyhjYW5vbmljYWxBbnRocm9waWNNb2RlbChtb2RlbCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmVlZHNDbGkxbVN1ZmZpeChtb2RlbD86IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gQ0xJX09ORV9NSUxMSU9OX1NVRkZJWF9NT0RFTFMuaGFzKGNhbm9uaWNhbEFudGhyb3BpY01vZGVsKG1vZGVsKSk7XG59XG5cbi8vIHFncmlkIOqwgCBhZGFwdGl2ZSB0aGlua2luZyDsnYQg67O07KG07ZWY64qUIOuqqOuNuOyduOyngCDtjJDrs4TtlZzri6QuIOuCmOuouOyngCDrqqjrjbjsnYAg6riw7KG0XG4vLyDsoIDruYTsmqkv67mE7LaU66GgIOqyveuhnOulvCDsnKDsp4DtlZzri6QuXG5leHBvcnQgZnVuY3Rpb24gdXNlc0FkYXB0aXZlVGhpbmtpbmcobW9kZWw/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEFEQVBUSVZFX1RISU5LSU5HX01PREVMUy5oYXMoY2Fub25pY2FsQW50aHJvcGljTW9kZWwobW9kZWwpKTtcbn1cblxuLy8g6rWs64+FIHVzYWdlIOydmCBGYWJsZSDsoITsmqkgN+ydvCDrsoTtgrfsnYQgcXVvdGEg7YyQ7KCV7JeQIO2PrO2VqO2VoOyngCDqsrDsoJXtlZzri6QuXG5leHBvcnQgZnVuY3Rpb24gaXNGYWJsZUZhbWlseU1vZGVsKG1vZGVsPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBGQUJMRV9GQU1JTFlfTU9ERUxTLmhhcyhjYW5vbmljYWxBbnRocm9waWNNb2RlbChtb2RlbCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U3VwcG9ydGVkT25lTWlsbGlvblN1ZmZpeChtb2RlbD86IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIWhhc09uZU1pbGxpb25TdWZmaXgobW9kZWwpKSByZXR1cm47XG4gIGNvbnN0IGNhbm9uaWNhbCA9IGNhbm9uaWNhbEFudGhyb3BpY01vZGVsKG1vZGVsKTtcbiAgaWYgKCFzdXBwb3J0czFNQ29udGV4dChjYW5vbmljYWwpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBBbnRocm9waWMgMU0gbW9kZWwgc3VmZml4OiAke21vZGVsfWApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVlBLE1BQWEsMEJBQTBCO0FBRXZDLE1BQWEsMkJBQTJCO0FBRXhDLE1BQWEsdUJBQXVCO0FBRXBDLE1BQWEsNEJBQTRCO0FBRXpDLE1BQWEsNkJBQTZCO0NBQUM7Q0FBVztDQUFvQjtBQUFlO0FBQ3pGLE1BQU0sd0JBQXdCO0FBSzlCLFNBQWdCLG1CQUFtQixTQUF5QjtDQUMxRCxPQUFPLEdBQUcsMEJBQTBCLEdBQUc7QUFDekM7QUFNQSxTQUFnQix3QkFBd0IsT0FBd0I7Q0FDOUQsTUFBTSxNQUFNLFNBQUE7Q0FFWixRQUR3QixJQUFJLFNBQVMsR0FBRyxJQUFJLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUssSUFDN0QsQ0FBZ0IsUUFBUSx1QkFBdUIsRUFBRTtBQUMxRDtBQUVBLFNBQWdCLG9CQUFvQixPQUF5QjtDQUMzRCxPQUFPLFVBQVUsVUFBYSxzQkFBc0IsS0FBSyxLQUFLO0FBQ2hFO0FBSUEsTUFBTSw2Q0FBNkIsSUFBSSxJQUFJO0NBQ3pDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0FBQ0YsQ0FBQztBQUVELE1BQU0sZ0RBQWdDLElBQUksSUFBSSxDQUFDLHFCQUFxQixpQkFBaUIsQ0FBQztBQUl0RixNQUFNLDJDQUEyQixJQUFJLElBQUk7Q0FDdkM7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0FBQ0YsQ0FBQztBQUtELE1BQU0sc0NBQXNCLElBQUksSUFBSSxDQUFDLG9CQUFvQixnQkFBZ0IsQ0FBQztBQU0xRSxLQUFLLE1BQU0sU0FBUywrQkFDbEIsSUFBSSxDQUFDLDJCQUEyQixJQUFJLEtBQUssR0FDdkMsTUFBTSxJQUFJLE1BQU0sdURBQXVELE9BQU87QUFLbEYsS0FBSyxNQUFNLFNBQVMscUJBQ2xCLElBQUksQ0FBQywyQkFBMkIsSUFBSSxLQUFLLEtBQUssQ0FBQyx5QkFBeUIsSUFBSSxLQUFLLEdBQy9FLE1BQU0sSUFBSSxNQUFNLGdFQUFnRSxPQUFPO0FBSTNGLFNBQWdCLGtCQUFrQixPQUF5QjtDQUN6RCxPQUFPLDJCQUEyQixJQUFJLHdCQUF3QixLQUFLLENBQUM7QUFDdEU7QUFFQSxTQUFnQixpQkFBaUIsT0FBeUI7Q0FDeEQsT0FBTyw4QkFBOEIsSUFBSSx3QkFBd0IsS0FBSyxDQUFDO0FBQ3pFO0FBSUEsU0FBZ0IscUJBQXFCLE9BQXlCO0NBQzVELE9BQU8seUJBQXlCLElBQUksd0JBQXdCLEtBQUssQ0FBQztBQUNwRTtBQUdBLFNBQWdCLG1CQUFtQixPQUF5QjtDQUMxRCxPQUFPLG9CQUFvQixJQUFJLHdCQUF3QixLQUFLLENBQUM7QUFDL0Q7QUFFQSxTQUFnQixnQ0FBZ0MsT0FBc0I7Q0FDcEUsSUFBSSxDQUFDLG9CQUFvQixLQUFLLEdBQUc7Q0FFakMsSUFBSSxDQUFDLGtCQURhLHdCQUF3QixLQUNuQixDQUFTLEdBQzlCLE1BQU0sSUFBSSxNQUFNLDBDQUEwQyxPQUFPO0FBRXJFIn0=
|
|
@@ -6,34 +6,23 @@ import { invalidateAnthropicQuotaUsage } from "../../../application/qgrid/oauth.
|
|
|
6
6
|
import { SmoothWeightedRoundRobin } from "../common/smooth-weighted-round-robin.js";
|
|
7
7
|
import { assertSupportedOneMillionSuffix, canonicalAnthropicModel } from "./anthropic-constants.js";
|
|
8
8
|
import { readAnthropicQuotaUsage } from "./anthropic-quota.js";
|
|
9
|
+
import { assertAnthropicThinkingRuntime, resolveAnthropicThinking } from "./anthropic-thinking.js";
|
|
9
10
|
import { makeAnthropicWorkerId, runClaudeSession } from "./claude-session.js";
|
|
10
11
|
import { getLogger } from "@logtape/logtape";
|
|
11
12
|
//#region src/utils/providers/anthropic/anthropic-dispatcher.ts
|
|
12
13
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* OpenAIDispatcher와 달리, worker pool을 두는 대신 요청별 fresh spawn
|
|
16
|
-
* 토큰은 인메모리(MAP)으로 관리하고 smooth weighted round-robin 으로 고른다
|
|
17
|
-
*
|
|
18
|
-
* - 모든 요청은 fresh `--session-id` 로 실행
|
|
19
|
-
* - 멀티턴 문맥은 클라이언트가 매 호출 보내는 full history 를 평탄화해 전달한다.
|
|
20
|
-
* - 발급한 session-id 를 GenerateResult.threadCoord(threadId=session-id, workerId=tokenId,
|
|
21
|
-
* epoch=0)로 올려, 상위(issueConvContext)가 클라에 회송할 좌표를 만든다. 다음 turn 이 좌표를
|
|
22
|
-
* 회송해도 Anthropic 라우팅에는 쓰지 않는다.
|
|
14
|
+
* 요청마다 새 Claude 프로세스에 전체 대화 이력을 전달한다.
|
|
15
|
+
* 반환한 threadCoord는 다음 요청의 세션 재사용이나 토큰 선택에 쓰지 않는다.
|
|
23
16
|
*/
|
|
24
17
|
const logger = getLogger(["qgrid", "anthropic-dispatcher"]);
|
|
25
18
|
const DEFAULT_TIMEOUT_MS = 24e4;
|
|
26
19
|
const REFRESH_SAFETY_MS = 6e4;
|
|
27
|
-
function quotaThresholdExceededMessage(provider, tokens) {
|
|
28
|
-
const details = tokens.map((token) => `${token.tokenName} (threshold ${token.threshold}%)`).join(", ");
|
|
29
|
-
return details.length > 0 ? `All ${provider} tokens exceeded quota threshold: ${details}` : `All ${provider} tokens exceeded quota threshold`;
|
|
30
|
-
}
|
|
31
20
|
var AnthropicDispatcher = class {
|
|
32
21
|
tokenPool = /* @__PURE__ */ new Map();
|
|
33
22
|
weightedSelector = new SmoothWeightedRoundRobin();
|
|
23
|
+
inFlight = 0;
|
|
34
24
|
async start() {
|
|
35
|
-
|
|
36
|
-
for (const t of tokens) {
|
|
25
|
+
(await TokenModel.findActiveByProvider("A", "anthropic")).forEach((t) => {
|
|
37
26
|
this.tokenPool.set(t.id, {
|
|
38
27
|
id: t.id,
|
|
39
28
|
name: t.name,
|
|
@@ -43,30 +32,22 @@ var AnthropicDispatcher = class {
|
|
|
43
32
|
});
|
|
44
33
|
this.weightedSelector.setToken(t.id, t.weight);
|
|
45
34
|
logger.info(`worker spawned: ${t.name}`);
|
|
46
|
-
}
|
|
35
|
+
});
|
|
47
36
|
}
|
|
48
37
|
async stop() {
|
|
49
|
-
|
|
50
|
-
for (const id of tokenIds) this.weightedSelector.removeToken(id);
|
|
38
|
+
[...this.tokenPool.keys()].forEach((id) => this.weightedSelector.removeToken(id));
|
|
51
39
|
this.tokenPool.clear();
|
|
52
40
|
this.weightedSelector.resetScores();
|
|
53
41
|
}
|
|
54
|
-
get tokenCount() {
|
|
55
|
-
return this.tokenPool.size;
|
|
56
|
-
}
|
|
57
|
-
inFlightCount = 0;
|
|
58
|
-
get inFlight() {
|
|
59
|
-
return this.inFlightCount;
|
|
60
|
-
}
|
|
61
|
-
get tokenNames() {
|
|
62
|
-
return [...this.tokenPool.values()].map((token) => token.name).toSorted();
|
|
63
|
-
}
|
|
64
42
|
replaceTokens(rows) {
|
|
65
43
|
const next = new Set(rows.map((r) => r.id));
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
44
|
+
Array.from(this.tokenPool.keys()).forEach((id) => {
|
|
45
|
+
if (!next.has(id)) this.onTokenRemoved(id);
|
|
46
|
+
});
|
|
47
|
+
rows.forEach((r) => {
|
|
48
|
+
if (this.tokenPool.has(r.id)) this.onTokenUpdated(r.id, r.name, r.credentials, r.quotaThreshold, r.weight);
|
|
49
|
+
else this.onTokenAdded(r.id, r.name, r.credentials, r.quotaThreshold, r.weight);
|
|
50
|
+
});
|
|
70
51
|
}
|
|
71
52
|
onTokenAdded(id, name, credentials, quotaThreshold, weight = 1) {
|
|
72
53
|
this.tokenPool.set(id, {
|
|
@@ -106,7 +87,8 @@ var AnthropicDispatcher = class {
|
|
|
106
87
|
overThresholdTokens,
|
|
107
88
|
reason: "all_exceeded"
|
|
108
89
|
});
|
|
109
|
-
|
|
90
|
+
const details = overThresholdTokens.map((token) => `${token.tokenName} (threshold ${token.threshold}%)`).join(", ");
|
|
91
|
+
throw new QuotaThresholdExceededError(details ? `All anthropic tokens exceeded quota threshold: ${details}` : "All anthropic tokens exceeded quota threshold");
|
|
110
92
|
}
|
|
111
93
|
if (preferred) return preferred;
|
|
112
94
|
const selectedId = this.weightedSelector.select(new Set(eligible.map((token) => token.id)));
|
|
@@ -125,22 +107,34 @@ var AnthropicDispatcher = class {
|
|
|
125
107
|
token,
|
|
126
108
|
result: await readAnthropicQuotaUsage(token.credentials.accessToken, model)
|
|
127
109
|
})))).forEach((check, index) => {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
const token = check.value.token;
|
|
136
|
-
const result = check.value.result;
|
|
110
|
+
const token = check.status === "rejected" ? thresholded[index] : check.value.token;
|
|
111
|
+
if (!token) return;
|
|
112
|
+
const result = check.status === "fulfilled" ? check.value.result : {
|
|
113
|
+
kind: "lookup_failed",
|
|
114
|
+
reason: String(check.reason)
|
|
115
|
+
};
|
|
137
116
|
if (result.kind === "lookup_failed") {
|
|
138
|
-
|
|
117
|
+
logger.warn("quota_threshold gate: lookup_fail_open", {
|
|
118
|
+
tokenId: token.id,
|
|
119
|
+
tokenName: token.name,
|
|
120
|
+
provider: "anthropic",
|
|
121
|
+
threshold: token.quotaThreshold,
|
|
122
|
+
reason: "lookup_fail_open",
|
|
123
|
+
lookupReason: result.reason
|
|
124
|
+
});
|
|
139
125
|
eligibleIds.add(token.id);
|
|
140
126
|
return;
|
|
141
127
|
}
|
|
142
128
|
if (result.utilizationPct >= token.quotaThreshold) {
|
|
143
|
-
|
|
129
|
+
logger.info("quota_threshold gate: over_threshold", {
|
|
130
|
+
tokenId: token.id,
|
|
131
|
+
tokenName: token.name,
|
|
132
|
+
provider: "anthropic",
|
|
133
|
+
threshold: token.quotaThreshold,
|
|
134
|
+
cachedUtilization: result.utilizationPct,
|
|
135
|
+
cacheAge: result.cacheAgeMs,
|
|
136
|
+
reason: "over_threshold"
|
|
137
|
+
});
|
|
144
138
|
overThresholdTokens.push({
|
|
145
139
|
tokenName: token.name,
|
|
146
140
|
threshold: token.quotaThreshold
|
|
@@ -157,27 +151,6 @@ var AnthropicDispatcher = class {
|
|
|
157
151
|
hasQuotaThreshold(token) {
|
|
158
152
|
return token.quotaThreshold !== void 0 && token.quotaThreshold !== null;
|
|
159
153
|
}
|
|
160
|
-
logQuotaOverThreshold(token, result) {
|
|
161
|
-
logger.info("quota_threshold gate: over_threshold", {
|
|
162
|
-
tokenId: token.id,
|
|
163
|
-
tokenName: token.name,
|
|
164
|
-
provider: "anthropic",
|
|
165
|
-
threshold: token.quotaThreshold,
|
|
166
|
-
cachedUtilization: result.utilizationPct,
|
|
167
|
-
cacheAge: result.cacheAgeMs,
|
|
168
|
-
reason: "over_threshold"
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
logQuotaLookupFailOpen(token, reason) {
|
|
172
|
-
logger.warn("quota_threshold gate: lookup_fail_open", {
|
|
173
|
-
tokenId: token.id,
|
|
174
|
-
tokenName: token.name,
|
|
175
|
-
provider: "anthropic",
|
|
176
|
-
threshold: token.quotaThreshold,
|
|
177
|
-
reason: "lookup_fail_open",
|
|
178
|
-
lookupReason: reason
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
154
|
async generate(req) {
|
|
182
155
|
return this.run(req, () => {});
|
|
183
156
|
}
|
|
@@ -190,22 +163,16 @@ var AnthropicDispatcher = class {
|
|
|
190
163
|
cb.onError(e);
|
|
191
164
|
}
|
|
192
165
|
}
|
|
193
|
-
async run(
|
|
194
|
-
this.
|
|
166
|
+
async run(req, onDelta, opts) {
|
|
167
|
+
this.inFlight++;
|
|
195
168
|
try {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
assertSupportedOneMillionSuffix(req.model);
|
|
204
|
-
const model = canonicalAnthropicModel(req.model);
|
|
205
|
-
const jsonSchema = serializeAndValidateDispatchSchema(req.outputSchema, "anthropic");
|
|
206
|
-
const token = await this.selectToken(model, req.preferredTokenId);
|
|
207
|
-
if (!token) throw new Error("No anthropic tokens available");
|
|
208
|
-
const exec = async () => {
|
|
169
|
+
if (req.imageGeneration) throw new Error("image generation is not supported on the Anthropic route");
|
|
170
|
+
assertSupportedOneMillionSuffix(req.model);
|
|
171
|
+
const model = canonicalAnthropicModel(req.model);
|
|
172
|
+
assertAnthropicThinkingRuntime(resolveAnthropicThinking(model, req.thinking, req.effort).extraBody);
|
|
173
|
+
const jsonSchema = serializeAndValidateDispatchSchema(req.outputSchema, "anthropic");
|
|
174
|
+
const token = await this.selectToken(model, req.preferredTokenId);
|
|
175
|
+
if (!token) throw new Error("No anthropic tokens available");
|
|
209
176
|
let accessToken = token.credentials.accessToken;
|
|
210
177
|
const expiresAt = getExpiresAt(token.credentials);
|
|
211
178
|
if (expiresAt && expiresAt - Date.now() < REFRESH_SAFETY_MS && getRefreshToken(token.credentials)) try {
|
|
@@ -227,6 +194,7 @@ var AnthropicDispatcher = class {
|
|
|
227
194
|
system: req.systemPrompt,
|
|
228
195
|
jsonSchema,
|
|
229
196
|
effort: req.effort,
|
|
197
|
+
thinking: req.thinking,
|
|
230
198
|
timeoutMs: req.timeoutMs ?? DEFAULT_TIMEOUT_MS,
|
|
231
199
|
coldHistory: req.coldHistory,
|
|
232
200
|
input: req.coldInput,
|
|
@@ -260,11 +228,12 @@ var AnthropicDispatcher = class {
|
|
|
260
228
|
epoch: 0
|
|
261
229
|
}
|
|
262
230
|
};
|
|
263
|
-
}
|
|
264
|
-
|
|
231
|
+
} finally {
|
|
232
|
+
this.inFlight--;
|
|
233
|
+
}
|
|
265
234
|
}
|
|
266
235
|
};
|
|
267
236
|
//#endregion
|
|
268
237
|
export { AnthropicDispatcher };
|
|
269
238
|
|
|
270
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBbnRocm9waWNEaXNwYXRjaGVyXG4gKlxuICogT3BlbkFJRGlzcGF0Y2hlcuyZgCDri6zrpqwsIHdvcmtlciBwb29s7J2EIOuRkOuKlCDrjIDsi6Ag7JqU7LKt67OEIGZyZXNoIHNwYXduXG4gKiDthqDtgbDsnYAg7J2466mU66qo66asKE1BUCnsnLzroZwg6rSA66as7ZWY6rOgIHNtb290aCB3ZWlnaHRlZCByb3VuZC1yb2JpbiDsnLzroZwg6rOg66W464ukXG4gKlxuICogLSDrqqjrk6Ag7JqU7LKt7J2AIGZyZXNoIGAtLXNlc3Npb24taWRgIOuhnCDsi6TtlolcbiAqIC0g66mA7Yuw7YS0IOusuOunpeydgCDtgbTrnbzsnbTslrjtirjqsIAg66ekIO2YuOy2nCDrs7TrgrTripQgZnVsbCBoaXN0b3J5IOulvCDtj4ntg4TtmZTtlbQg7KCE64us7ZWc64ukLlxuICogLSDrsJzquIntlZwgc2Vzc2lvbi1pZCDrpbwgR2VuZXJhdGVSZXN1bHQudGhyZWFkQ29vcmQodGhyZWFkSWQ9c2Vzc2lvbi1pZCwgd29ya2VySWQ9dG9rZW5JZCxcbiAqICAgZXBvY2g9MCnroZwg7Jis66CkLCDsg4HsnIQoaXNzdWVDb252Q29udGV4dCnqsIAg7YG065287JeQIO2ajOyGoe2VoCDsooztkZzrpbwg66eM65Og64ukLiDri6TsnYwgdHVybiDsnbQg7KKM7ZGc66W8XG4gKiAgIO2ajOyGoe2VtOuPhCBBbnRocm9waWMg65287Jqw7YyF7JeQ64qUIOyTsOyngCDslYrripTri6QuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyBnZXRFeHBpcmVzQXQsIGdldFJlZnJlc2hUb2tlbiB9IGZyb20gXCIuLi9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hIH0gZnJvbSBcIi4uL2NvbW1vbi9zY2hlbWEtdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluIH0gZnJvbSBcIi4uL2NvbW1vbi9zbW9vdGgtd2VpZ2h0ZWQtcm91bmQtcm9iaW5cIjtcbmltcG9ydCB7IGFzc2VydFN1cHBvcnRlZE9uZU1pbGxpb25TdWZmaXgsIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsIH0gZnJvbSBcIi4vYW50aHJvcGljLWNvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgaW52YWxpZGF0ZUFudGhyb3BpY1F1b3RhVXNhZ2UsXG4gIHJlYWRBbnRocm9waWNRdW90YVVzYWdlLFxuICB0eXBlIEFudGhyb3BpY1F1b3RhVXNhZ2VSZXN1bHQsXG59IGZyb20gXCIuL2FudGhyb3BpYy1xdW90YVwiO1xuaW1wb3J0IHsgbWFrZUFudGhyb3BpY1dvcmtlcklkLCBydW5DbGF1ZGVTZXNzaW9uIH0gZnJvbSBcIi4vY2xhdWRlLXNlc3Npb25cIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwiYW50aHJvcGljLWRpc3BhdGNoZXJcIl0pO1xuXG4vLyAxTSBjb250ZXh0IOygleyDgSDsg53shLHsnYAg7Iuk7Lih7IOBIDEwMHMr6rmM7KeAIOqwhOuLpC4gMjQwc+uKlCDsmYTstqkg7J6l7LmY7J28IOu/kCxcbi8vIOqxsOu2gCvqsbDrjIAgc3lzdGVtIOyerOyDneyEsSDsp4Dsl7DsnYQg7JmE7KCE7Z6IIO2VtOqysO2VmOuKlCDqsJLsnYAg7JWE64uI64ukLlxuY29uc3QgREVGQVVMVF9USU1FT1VUX01TID0gMjQwXzAwMDtcbi8vIGFjY2VzcyB0b2tlbiDrp4zro4wg7J6E67CVIOyehOqzhCDigJQg6riw7KG0IHN0YW5kYWxvbmUg6rK966GcKHFncmlkLmRpc3BhdGNoZXIudHMp7JmAIOuPmeydvCg2MHMpLlxuY29uc3QgUkVGUkVTSF9TQUZFVFlfTVMgPSA2MF8wMDA7XG5cbmludGVyZmFjZSBQb29sZWRUb2tlbiB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgY3JlZGVudGlhbHM6IEFudGhyb3BpY0NyZWRlbnRpYWxzO1xuICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gIHdlaWdodDogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBxdW90YVRocmVzaG9sZEV4Y2VlZGVkTWVzc2FnZShcbiAgcHJvdmlkZXI6IHN0cmluZyxcbiAgdG9rZW5zOiBBcnJheTx7IHRva2VuTmFtZTogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9Pixcbik6IHN0cmluZyB7XG4gIGNvbnN0IGRldGFpbHMgPSB0b2tlbnNcbiAgICAubWFwKCh0b2tlbikgPT4gYCR7dG9rZW4udG9rZW5OYW1lfSAodGhyZXNob2xkICR7dG9rZW4udGhyZXNob2xkfSUpYClcbiAgICAuam9pbihcIiwgXCIpO1xuICByZXR1cm4gZGV0YWlscy5sZW5ndGggPiAwXG4gICAgPyBgQWxsICR7cHJvdmlkZXJ9IHRva2VucyBleGNlZWRlZCBxdW90YSB0aHJlc2hvbGQ6ICR7ZGV0YWlsc31gXG4gICAgOiBgQWxsICR7cHJvdmlkZXJ9IHRva2VucyBleGNlZWRlZCBxdW90YSB0aHJlc2hvbGRgO1xufVxuXG5leHBvcnQgY2xhc3MgQW50aHJvcGljRGlzcGF0Y2hlciBpbXBsZW1lbnRzIFByb3ZpZGVyRGlzcGF0Y2hlciB7XG4gIC8vIHRva2VuSWQg4oaSIO2SgCDtla3rqqkuIHN0YXJ0KCkvdG9rZW4g7J2067Kk7Yq466GcIOyxhOybgFxuICBwcml2YXRlIHRva2VuUG9vbCA9IG5ldyBNYXA8bnVtYmVyLCBQb29sZWRUb2tlbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRlZFNlbGVjdG9yID0gbmV3IFNtb290aFdlaWdodGVkUm91bmRSb2JpbigpO1xuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIE9wZW5BSURpc3BhdGNoZXIuc3RhcnQoKSDsmYAg64+Z7J287ZWY6rKMIERCIOyXkOyEnCDquLDsobQgYW50aHJvcGljIO2GoO2BsOydhCBzZWxmLWJvb3RzdHJhcCDtlZzri6QuXG4gICAgLy8gKOyEnOuyhCDsnqzsi5zsnpEg7IucIE5PVElGWSDqsIAg7JWIIOyYpOuvgOuhnCDrtoDtirjsiqTtirjrnqnsnbQg7JeG7Jy866m0IO2SgOydtCDruYgg7LGE66GcIOuCqOuKlOuLpC4pXG4gICAgLy8g7J207ZuEIOuzgOqyveu2hOydgCB0b2tlbi1zdWJzY3JpYmVyIOqwgCBvblRva2VuQWRkZWQvVXBkYXRlZC9SZW1vdmVkIOuhnCDsoITri6ztlZzri6QuXG4gICAgLy8gZmluZEFjdGl2ZUJ5UHJvdmlkZXIg6rCAIGFjdGl2ZT10cnVlICsgcHJvdmlkZXIg7ZWE7YSw66W8IERCIOyXkOyEnCDsspjrpqwg4oaSIGluYWN0aXZlIOuKlCDslaDstIjsl5Ag7JWIIOyYqOuLpC5cbiAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRBY3RpdmVCeVByb3ZpZGVyKFwiQVwiLCBcImFudGhyb3BpY1wiKTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdG9rZW5zKSB7XG4gICAgICB0aGlzLnRva2VuUG9vbC5zZXQodC5pZCwge1xuICAgICAgICBpZDogdC5pZCxcbiAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICBjcmVkZW50aWFsczogdC5jcmVkZW50aWFscyBhcyBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICAgICAgcXVvdGFUaHJlc2hvbGQ6IHQucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICB3ZWlnaHQ6IHQud2VpZ2h0LFxuICAgICAgfSk7XG4gICAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4odC5pZCwgdC53ZWlnaHQpO1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciBzcGF3bmVkOiAke3QubmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VuSWRzID0gWy4uLnRoaXMudG9rZW5Qb29sLmtleXMoKV07XG4gICAgZm9yIChjb25zdCBpZCBvZiB0b2tlbklkcykgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgICB0aGlzLnRva2VuUG9vbC5jbGVhcigpO1xuICAgIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICB9XG5cbiAgLy8g7ZiE7J6sIO2SgOydmCDthqDtgbAg7IiYKHN0YXJ0dXAg66Gc6re4L2hlYWx0aCDsmqkpLlxuICBnZXQgdG9rZW5Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRva2VuUG9vbC5zaXplO1xuICB9XG5cbiAgLy8g7KeA6riIIOyLpO2WiSDspJHsnbggQ2xhdWRlIENvZGUg7ZSE66Gc7IS47IqkIOyImCDigJQgZnJlc2gtc3Bhd24g7J206528IOydtOqyjCDqs6cg64+Z7IucIOyalOyyrSDsiJjri6QuXG4gIHByaXZhdGUgaW5GbGlnaHRDb3VudCA9IDA7XG4gIGdldCBpbkZsaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmluRmxpZ2h0Q291bnQ7XG4gIH1cblxuICAvLyBNb25pdCDtkZzsi5zsmqkg4oCUIO2SgOyXkCDsnojripQg7Yag7YGwIOydtOumhCDsiqTrg4Xsg7cgKOydtOumhOyInCDsoJXroKwpXG4gIGdldCB0b2tlbk5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudG9rZW5Qb29sLnZhbHVlcygpXS5tYXAoKHRva2VuKSA9PiB0b2tlbi5uYW1lKS50b1NvcnRlZCgpO1xuICB9XG5cbiAgLy8gREIgYWN0aXZlIGFudGhyb3BpYyDthqDtgbAg66qp66Gd7Jy866GcIO2SgOydhCDsnqzrj5nquLDtmZTtlZzri6QocGVyaW9kaWMgcmVjb25jaWxlL+yerOyXsOqysOyaqSkuXG4gIC8vIExJU1RFTi9OT1RJRlkg6rCAIOuBiuq4tCDrj5nslYgg7Jyg7Iuk65CcIOy2lOqwgC/sgq3soJwv67mE7Zmc7ISx7ZmU66W8IERCIOq4sOykgOycvOuhnCDri6Tsi5wg66ee7LaY64ukLlxuICAvLyDsnbTrsqTtirgg7ZW465Ok65+s66W8IOyerOyCrOyaqe2VtCDtkoAg6rCx7Iug7J20IOydvOq0gOuQmOqyjCDsoIHsmqnrkJjrj4TroZ0g7ZWc64ukOlxuICAvLyAgLSBEQiDsl5Ag7JeG64qU642wIO2SgOyXkCDsnojripQg7Yag7YGwIOKGkiBvblRva2VuUmVtb3ZlZFxuICAvLyAgLSBEQiDsl5Ag7J6I64qUIO2GoO2BsCDihpIg7Iug6rec66m0IG9uVG9rZW5BZGRlZCwg6riw7KG07J2066m0IG9uVG9rZW5VcGRhdGVkXG4gIHJlcGxhY2VUb2tlbnMoXG4gICAgcm93czogQXJyYXk8e1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGNyZWRlbnRpYWxzOiBBbnRocm9waWNDcmVkZW50aWFscztcbiAgICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIHdlaWdodDogbnVtYmVyO1xuICAgIH0+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldChyb3dzLm1hcCgocikgPT4gci5pZCkpO1xuICAgIC8vIG9uVG9rZW5SZW1vdmVkIOqwgCB0b2tlblBvb2wg7J2EIGRlbGV0ZSDtlZjrr4DroZwg7Iic7ZqMIOykkSDsiJjsoJXsnYQg7ZS87ZWY66CkIO2CpOulvCDrqLzsoIAg7Iqk64OF7IO37ZWc64ukLlxuICAgIGNvbnN0IGN1cnJlbnRJZHMgPSBBcnJheS5mcm9tKHRoaXMudG9rZW5Qb29sLmtleXMoKSk7XG4gICAgZm9yIChjb25zdCBpZCBvZiBjdXJyZW50SWRzKSB7XG4gICAgICBpZiAoIW5leHQuaGFzKGlkKSkgdGhpcy5vblRva2VuUmVtb3ZlZChpZCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgciBvZiByb3dzKSB7XG4gICAgICBpZiAodGhpcy50b2tlblBvb2wuaGFzKHIuaWQpKSB7XG4gICAgICAgIHRoaXMub25Ub2tlblVwZGF0ZWQoci5pZCwgci5uYW1lLCByLmNyZWRlbnRpYWxzLCByLnF1b3RhVGhyZXNob2xkLCByLndlaWdodCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uVG9rZW5BZGRlZChyLmlkLCByLm5hbWUsIHIuY3JlZGVudGlhbHMsIHIucXVvdGFUaHJlc2hvbGQsIHIud2VpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyB0b2tlbiBldmVudHMgKHRva2VuLXN1YnNjcmliZXIg6rCAIO2YuOy2nClcbiAgb25Ub2tlbkFkZGVkKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0ID0gMSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50b2tlblBvb2wuc2V0KGlkLCB7IGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCB9KTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4oaWQsIHdlaWdodCk7XG4gIH1cblxuICBvblRva2VuVXBkYXRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogQW50aHJvcGljQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5Qb29sLnNldChpZCwgeyBpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQgfSk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnNldFRva2VuKGlkLCB3ZWlnaHQpO1xuICB9XG5cbiAgb25Ub2tlblJlbW92ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudG9rZW5Qb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgfVxuXG4gIC8vIOyngOyglSDsmpTssq3snYAg7ZW064u5IO2GoO2BsOunjCBxdW90YSDtjJDsoJXtlZjqs6Agd2VpZ2h0ZWQg7IOB7YOc66W8IOqxtOuTnOumrOyngCDslYrripTri6QuXG4gIC8vIOuvuOyngOyglSDsmpTssq3rp4wgcXVvdGEg7Ya16rO8IO2bhOuztOuhnCBzbW9vdGggd2VpZ2h0ZWQgcm91bmQtcm9iaW4g7J2EIOynhO2Wie2VnOuLpC5cbiAgcHJpdmF0ZSBhc3luYyBzZWxlY3RUb2tlbihtb2RlbDogc3RyaW5nLCBwcmVmZXJyZWRUb2tlbklkPzogbnVtYmVyKTogUHJvbWlzZTxQb29sZWRUb2tlbiB8IG51bGw+IHtcbiAgICBjb25zdCBwcmVmZXJyZWQgPVxuICAgICAgcHJlZmVycmVkVG9rZW5JZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy50b2tlblBvb2wuZ2V0KHByZWZlcnJlZFRva2VuSWQpO1xuICAgIGlmIChwcmVmZXJyZWRUb2tlbklkICE9PSB1bmRlZmluZWQgJiYgIXByZWZlcnJlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcmVmZXJyZWQgYW50aHJvcGljIHRva2VuICR7cHJlZmVycmVkVG9rZW5JZH0gaXMgbm90IGF2YWlsYWJsZWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJvd3MgPSBwcmVmZXJyZWQgPyBbcHJlZmVycmVkXSA6IFsuLi50aGlzLnRva2VuUG9vbC52YWx1ZXMoKV07XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7IGVsaWdpYmxlLCBvdmVyVGhyZXNob2xkVG9rZW5zIH0gPSBhd2FpdCB0aGlzLmZpbHRlckVsaWdpYmxlVG9rZW5zKHJvd3MsIG1vZGVsKTtcbiAgICBpZiAoZWxpZ2libGUubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBhbGxfZXhjZWVkZWRcIiwge1xuICAgICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgICAgdG9rZW5Db3VudDogcm93cy5sZW5ndGgsXG4gICAgICAgIHRocmVzaG9sZGVkVG9rZW5Db3VudDogcm93cy5maWx0ZXIoKHIpID0+IHRoaXMuaGFzUXVvdGFUaHJlc2hvbGQocikpLmxlbmd0aCxcbiAgICAgICAgb3ZlclRocmVzaG9sZFRva2VucyxcbiAgICAgICAgcmVhc29uOiBcImFsbF9leGNlZWRlZFwiLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yKFxuICAgICAgICBxdW90YVRocmVzaG9sZEV4Y2VlZGVkTWVzc2FnZShcImFudGhyb3BpY1wiLCBvdmVyVGhyZXNob2xkVG9rZW5zKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHByZWZlcnJlZCkgcmV0dXJuIHByZWZlcnJlZDtcblxuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2VsZWN0KG5ldyBTZXQoZWxpZ2libGUubWFwKCh0b2tlbikgPT4gdG9rZW4uaWQpKSk7XG4gICAgaWYgKHNlbGVjdGVkSWQgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnRva2VuUG9vbC5nZXQoc2VsZWN0ZWRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmlsdGVyRWxpZ2libGVUb2tlbnMoXG4gICAgcm93czogUG9vbGVkVG9rZW5bXSxcbiAgICBtb2RlbDogc3RyaW5nLFxuICApOiBQcm9taXNlPHtcbiAgICBlbGlnaWJsZTogUG9vbGVkVG9rZW5bXTtcbiAgICBvdmVyVGhyZXNob2xkVG9rZW5zOiBBcnJheTx7IHRva2VuTmFtZTogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9PjtcbiAgfT4ge1xuICAgIGNvbnN0IHRocmVzaG9sZGVkID0gcm93cy5maWx0ZXIoKHRva2VuKSA9PiB0aGlzLmhhc1F1b3RhVGhyZXNob2xkKHRva2VuKSk7XG4gICAgaWYgKHRocmVzaG9sZGVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgZWxpZ2libGU6IHJvd3MsIG92ZXJUaHJlc2hvbGRUb2tlbnM6IFtdIH07XG5cbiAgICBjb25zdCBlbGlnaWJsZUlkcyA9IG5ldyBTZXQoXG4gICAgICByb3dzLmZpbHRlcigodG9rZW4pID0+ICF0aGlzLmhhc1F1b3RhVGhyZXNob2xkKHRva2VuKSkubWFwKCh0b2tlbikgPT4gdG9rZW4uaWQpLFxuICAgICk7XG4gICAgY29uc3Qgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT4gPSBbXTtcbiAgICBjb25zdCBjaGVja3MgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB0aHJlc2hvbGRlZC5tYXAoYXN5bmMgKHRva2VuKSA9PiAoe1xuICAgICAgICB0b2tlbixcbiAgICAgICAgcmVzdWx0OiBhd2FpdCByZWFkQW50aHJvcGljUXVvdGFVc2FnZSh0b2tlbi5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbiwgbW9kZWwpLFxuICAgICAgfSkpLFxuICAgICk7XG5cbiAgICBjaGVja3MuZm9yRWFjaCgoY2hlY2ssIGluZGV4KSA9PiB7XG4gICAgICBpZiAoY2hlY2suc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aHJlc2hvbGRlZFtpbmRleF07XG4gICAgICAgIGlmICghdG9rZW4pIHJldHVybjtcbiAgICAgICAgdGhpcy5sb2dRdW90YUxvb2t1cEZhaWxPcGVuKHRva2VuLCBTdHJpbmcoY2hlY2sucmVhc29uKSk7XG4gICAgICAgIGVsaWdpYmxlSWRzLmFkZCh0b2tlbi5pZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9rZW4gPSBjaGVjay52YWx1ZS50b2tlbjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrLnZhbHVlLnJlc3VsdDtcbiAgICAgIGlmIChyZXN1bHQua2luZCA9PT0gXCJsb29rdXBfZmFpbGVkXCIpIHtcbiAgICAgICAgdGhpcy5sb2dRdW90YUxvb2t1cEZhaWxPcGVuKHRva2VuLCByZXN1bHQucmVhc29uKTtcbiAgICAgICAgZWxpZ2libGVJZHMuYWRkKHRva2VuLmlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LnV0aWxpemF0aW9uUGN0ID49IHRva2VuLnF1b3RhVGhyZXNob2xkKSB7XG4gICAgICAgIHRoaXMubG9nUXVvdGFPdmVyVGhyZXNob2xkKHRva2VuLCByZXN1bHQpO1xuICAgICAgICBvdmVyVGhyZXNob2xkVG9rZW5zLnB1c2goeyB0b2tlbk5hbWU6IHRva2VuLm5hbWUsIHRocmVzaG9sZDogdG9rZW4ucXVvdGFUaHJlc2hvbGQgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZWxpZ2libGVJZHMuYWRkKHRva2VuLmlkKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGVsaWdpYmxlOiByb3dzLmZpbHRlcigodG9rZW4pID0+IGVsaWdpYmxlSWRzLmhhcyh0b2tlbi5pZCkpLCBvdmVyVGhyZXNob2xkVG9rZW5zIH07XG4gIH1cblxuICBwcml2YXRlIGhhc1F1b3RhVGhyZXNob2xkKHRva2VuOiBQb29sZWRUb2tlbik6IHRva2VuIGlzIFBvb2xlZFRva2VuICYgeyBxdW90YVRocmVzaG9sZDogbnVtYmVyIH0ge1xuICAgIHJldHVybiB0b2tlbi5xdW90YVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmIHRva2VuLnF1b3RhVGhyZXNob2xkICE9PSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dRdW90YU92ZXJUaHJlc2hvbGQoXG4gICAgdG9rZW46IFBvb2xlZFRva2VuICYgeyBxdW90YVRocmVzaG9sZDogbnVtYmVyIH0sXG4gICAgcmVzdWx0OiBFeHRyYWN0PEFudGhyb3BpY1F1b3RhVXNhZ2VSZXN1bHQsIHsga2luZDogXCJva1wiIH0+LFxuICApOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbyhcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBvdmVyX3RocmVzaG9sZFwiLCB7XG4gICAgICB0b2tlbklkOiB0b2tlbi5pZCxcbiAgICAgIHRva2VuTmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgdGhyZXNob2xkOiB0b2tlbi5xdW90YVRocmVzaG9sZCxcbiAgICAgIGNhY2hlZFV0aWxpemF0aW9uOiByZXN1bHQudXRpbGl6YXRpb25QY3QsXG4gICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICByZWFzb246IFwib3Zlcl90aHJlc2hvbGRcIixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFMb29rdXBGYWlsT3BlbihcbiAgICB0b2tlbjogUG9vbGVkVG9rZW4gJiB7IHF1b3RhVGhyZXNob2xkOiBudW1iZXIgfSxcbiAgICByZWFzb246IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogbG9va3VwX2ZhaWxfb3BlblwiLCB7XG4gICAgICB0b2tlbklkOiB0b2tlbi5pZCxcbiAgICAgIHRva2VuTmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgdGhyZXNob2xkOiB0b2tlbi5xdW90YVRocmVzaG9sZCxcbiAgICAgIHJlYXNvbjogXCJsb29rdXBfZmFpbF9vcGVuXCIsXG4gICAgICBsb29rdXBSZWFzb246IHJlYXNvbixcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlKHJlcTogR2VuZXJhdGVSZXF1ZXN0KTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJ1bihyZXEsICgpID0+IHt9KTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW4ocmVxLCBjYi5vbkRlbHRhLCB7IGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM6IHRydWUgfSk7XG4gICAgICBjYi5vblRocmVhZElkPy4ocmVzdWx0LnRocmVhZENvb3JkLnRocmVhZElkKTtcbiAgICAgIGNiLm9uQ29tcGxldGUocmVzdWx0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjYi5vbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGdlbmVyYXRlL2dlbmVyYXRlU3RyZWFtIOqzte2GtSDsi6TtlokuIG9uRGVsdGEg64qUIOyKpO2KuOumvOydtOuptCDsoJDsp4Qg67Cp7LacLCDruYTsiqTtirjrprzsnbTrqbQgbm8tb3AuXG4gIHByaXZhdGUgYXN5bmMgcnVuKC4uLmFyZ3M6IFBhcmFtZXRlcnM8QW50aHJvcGljRGlzcGF0Y2hlcltcInJ1bklubmVyXCJdPik6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICB0aGlzLmluRmxpZ2h0Q291bnQrKztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuSW5uZXIoLi4uYXJncyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaW5GbGlnaHRDb3VudC0tO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuSW5uZXIoXG4gICAgcmVxOiBHZW5lcmF0ZVJlcXVlc3QsXG4gICAgb25EZWx0YTogKHQ6IHN0cmluZykgPT4gdm9pZCxcbiAgICBvcHRzPzogeyBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzPzogYm9vbGVhbiB9LFxuICApOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgLy8g7J2066+47KeAIOyDneyEseydgCBPcGVuQUkg6rK966GcIOyghOyaqS4gQW50aHJvcGljIOudvOyasO2MheyXkCDsnbTrr7jsp4Ag7ZSM656Y6re46rCAXG4gICAgLy8g64+E64us7ZWY66m0IOyhsOyaqe2eiCDthY3siqTtirjroZwg7Y+067Cx7ZWY7KeAIOyViuqzoCDrqoXsi5zsoIHsnLzroZwg6rGw67aA7ZWc64ukLlxuICAgIGlmIChyZXEuaW1hZ2VHZW5lcmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbWFnZSBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIEFudGhyb3BpYyByb3V0ZVwiKTtcbiAgICB9XG4gICAgLy8gbW9kZWwg7KCV6rec7ZmU66W8IGRpc3BhdGNoZXIg7KeE7J6F7KCQ7JeQ7IScIO2VnCDrsogg7ZWc64ukOiByZXN1bHQubW9kZWwgLyBydW5DbGF1ZGVTZXNzaW9uIOyghOu2gFxuICAgIC8vIGNhbm9uaWNhbChwcmVmaXgg7JeG64qUIGNvc3Qg7YKkKSDsnYQg7JOw6rKMIO2GteydvC4g66+47KeA7KCV7J2066m0IEFOVEhST1BJQ19ERUZBVUxUX01PREVMIOKAlCBxZ3JpZC5kaXNwYXRjaGVyXG4gICAgLy8g7J2YIFwic29ubmV0XCIg67OE7LmtIOyasO2ajCDssKjri6guIOygleq3nO2ZlCDqt5zsuZnsnYAgZmFsbGJhY2sg6rK966Gc7JmAIOqzteycoChjYW5vbmljYWxBbnRocm9waWNNb2RlbCkuXG4gICAgYXNzZXJ0U3VwcG9ydGVkT25lTWlsbGlvblN1ZmZpeChyZXEubW9kZWwpO1xuICAgIGNvbnN0IG1vZGVsID0gY2Fub25pY2FsQW50aHJvcGljTW9kZWwocmVxLm1vZGVsKTtcbiAgICBjb25zdCBqc29uU2NoZW1hID0gc2VyaWFsaXplQW5kVmFsaWRhdGVEaXNwYXRjaFNjaGVtYShyZXEub3V0cHV0U2NoZW1hLCBcImFudGhyb3BpY1wiKTtcblxuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5zZWxlY3RUb2tlbihtb2RlbCwgcmVxLnByZWZlcnJlZFRva2VuSWQpO1xuICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcihcIk5vIGFudGhyb3BpYyB0b2tlbnMgYXZhaWxhYmxlXCIpO1xuXG4gICAgY29uc3QgZXhlYyA9IGFzeW5jICgpOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiA9PiB7XG4gICAgICAvLyDrp4zro4wg7J6E67CVIO2GoO2BsCBwcmVlbXB0aXZlIHJlZnJlc2go6riw7KG0IHN0YW5kYWxvbmUg6rK966Gc7JmAIOuPmeydvCkuIOyLpO2MqO2VtOuPhCDsp4TtlokuXG4gICAgICBsZXQgYWNjZXNzVG9rZW4gPSB0b2tlbi5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbjtcbiAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IGdldEV4cGlyZXNBdCh0b2tlbi5jcmVkZW50aWFscyk7XG4gICAgICBpZiAoXG4gICAgICAgIGV4cGlyZXNBdCAmJlxuICAgICAgICBleHBpcmVzQXQgLSBEYXRlLm5vdygpIDwgUkVGUkVTSF9TQUZFVFlfTVMgJiZcbiAgICAgICAgZ2V0UmVmcmVzaFRva2VuKHRva2VuLmNyZWRlbnRpYWxzKVxuICAgICAgKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBRZ3JpZEZyYW1lIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5mcmFtZVwiKTtcbiAgICAgICAgICAvLyBwcm92aWRlciDrpbwg67CY65Oc7IucIOyxhOybjOyVvCByZWZyZXNoVG9rZW4g64K067aAIFRva2VuTW9kZWwuc2F2ZSDqsIAg7ISx6rO17ZWc64ukLlxuICAgICAgICAgIC8vIHJlZnJlc2hUb2tlbihUb2tlblN1YnNldEEpIOuKlCBpZC9wcm92aWRlci9jcmVkZW50aWFscy9uYW1lIOunjCDsgqzsmqntlZjrr4DroZwg6re4IDTqsJzrp4wg64SY6ri064ukLlxuICAgICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgUWdyaWRGcmFtZS5yZWZyZXNoVG9rZW4oe1xuICAgICAgICAgICAgaWQ6IHRva2VuLmlkLFxuICAgICAgICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICAgICAgICBuYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IHRva2VuLmNyZWRlbnRpYWxzLFxuICAgICAgICAgIH0gYXMgUGFyYW1ldGVyczx0eXBlb2YgUWdyaWRGcmFtZS5yZWZyZXNoVG9rZW4+WzBdKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGByZWZyZXNoIGZhaWxlZCBmb3IgJHt0b2tlbi5uYW1lfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbyhg4oaSICR7dG9rZW4ubmFtZX0gKG1vZGVsOiAke21vZGVsfSlgKTtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBydW5DbGF1ZGVTZXNzaW9uKFxuICAgICAgICB7XG4gICAgICAgICAgdG9rZW5JZDogdG9rZW4uaWQsXG4gICAgICAgICAgdG9rZW46IGFjY2Vzc1Rva2VuLFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIHN5c3RlbTogcmVxLnN5c3RlbVByb21wdCxcbiAgICAgICAgICBqc29uU2NoZW1hLFxuICAgICAgICAgIGVmZm9ydDogcmVxLmVmZm9ydCxcbiAgICAgICAgICB0aW1lb3V0TXM6IHJlcS50aW1lb3V0TXMgPz8gREVGQVVMVF9USU1FT1VUX01TLFxuICAgICAgICAgIGNvbGRIaXN0b3J5OiByZXEuY29sZEhpc3RvcnksXG4gICAgICAgICAgaW5wdXQ6IHJlcS5jb2xkSW5wdXQsXG4gICAgICAgICAgYWJvcnRTaWduYWw6IHJlcS5hYm9ydFNpZ25hbCxcbiAgICAgICAgICBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzOiBvcHRzPy5pbmNsdWRlUGFydGlhbE1lc3NhZ2VzLFxuICAgICAgICB9LFxuICAgICAgICBvbkRlbHRhLFxuICAgICAgKTtcblxuICAgICAgaWYgKHNlc3Npb24ucXVvdGFFeGhhdXN0ZWQpIHtcbiAgICAgICAgaW52YWxpZGF0ZUFudGhyb3BpY1F1b3RhVXNhZ2UodG9rZW4uY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4pO1xuICAgICAgICBpZiAoYWNjZXNzVG9rZW4gIT09IHRva2VuLmNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgaW52YWxpZGF0ZUFudGhyb3BpY1F1b3RhVXNhZ2UoYWNjZXNzVG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgcXVvdGEgZXhoYXVzdGVkICgke3Rva2VuLm5hbWV9KWApO1xuICAgICAgfVxuICAgICAgaWYgKHNlc3Npb24uaXNFcnJvcikge1xuICAgICAgICAvLyDsp4Tri6goU09OLTQ5NSk6IGlzRXJyb3Ig7YyQ7KCVIOyCrOycoChzdWJ0eXBlL3Rlcm1pbmFsX3JlYXNvbinrpbwg66mU7Iuc7KeAIOyVnuyXkCDrk5zrn6zrgrjri6QuXG4gICAgICAgIC8vIOq3uOuPmeyViCBkZXRhaWwg7J20IHNlc3Npb24udGV4dCjsmYTsoITtlZwgSlNPTiDrs7jrrLgp67+Q7J206528IFwic2NoZW1hIOychOuwmOyduOyngCAvIG1heCByZXRyaWVzIOyduOyngCAvXG4gICAgICAgIC8vIG1heCB0dXJucyDsnbjsp4BcIuulvCDqtazrtoTtlaAg7IiYIOyXhuyXiOuLpC4gdGV4dCDripQg7KeE64uo7JeQIO2VhOyalO2VnCDrp4ztgbzrp4wg7J6Y6528IOuNp+u2meyduOuLpC5cbiAgICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgICBzZXNzaW9uLnN1YnR5cGUgPz8gc2Vzc2lvbi50ZXJtaW5hbFJlYXNvbiA/PyAoc2Vzc2lvbi5pc0Vycm9yID8gXCJpc19lcnJvclwiIDogXCJ1bmtub3duXCIpO1xuICAgICAgICBjb25zdCBib2R5ID0gc2Vzc2lvbi50ZXh0XG4gICAgICAgICAgPyBzZXNzaW9uLnRleHQubGVuZ3RoID4gNTAwXG4gICAgICAgICAgICA/IGAke3Nlc3Npb24udGV4dC5zbGljZSgwLCA1MDApfeKApigke3Nlc3Npb24udGV4dC5sZW5ndGh9IGNoYXJzKWBcbiAgICAgICAgICAgIDogc2Vzc2lvbi50ZXh0XG4gICAgICAgICAgOiBgZW1wdHkgdGV4dCwgb3V0cHV0VG9rZW5zPSR7c2Vzc2lvbi51c2FnZS5vdXRwdXRUb2tlbnN9YDtcbiAgICAgICAgY29uc3QgcmVmdXNhbCA9IHNlc3Npb24ucmVmdXNhbCA/IGAgcmVmdXNhbD0ke0pTT04uc3RyaW5naWZ5KHNlc3Npb24ucmVmdXNhbCl9YCA6IFwiXCI7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgY2xhdWRlIGVycm9yICgke3Rva2VuLm5hbWV9KSBbJHtyZWFzb259XTogJHtib2R5fSR7cmVmdXNhbH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dDogc2Vzc2lvbi50ZXh0LFxuICAgICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgIHVzYWdlOiBzZXNzaW9uLnVzYWdlLFxuICAgICAgICBkdXJhdGlvbk1zOiBzZXNzaW9uLmR1cmF0aW9uTXMsXG4gICAgICAgIHR0ZnRNczogc2Vzc2lvbi50dGZ0TXMsXG4gICAgICAgIGNvc3RVc2Q6IHNlc3Npb24uY29zdFVzZCxcbiAgICAgICAgLy8gQ2xhdWRlIENvZGUg64qUIEZhYmxlIHJlZnVzYWwg7J2EIE9wdXMg66GcIOyekOuPmSBmYWxsYmFjayDtlaAg7IiYIOyeiOuLpC4g7JqU7LKtIOuqqOuNuOydhFxuICAgICAgICAvLyDqt7jrjIDroZwgc2VydmluZyBtb2RlbCDroZwg6riw66Gd7ZWY66m0IOu5hOyaqS/qsJDsgqwg66Gc6re46rCAIOuqqOuRkCDti4DslrTsp4Drr4DroZwg65GY7J2EIOq1rOu2hO2VnOuLpC5cbiAgICAgICAgbW9kZWw6IHNlc3Npb24uc2VydmVkTW9kZWwgPz8gbW9kZWwsXG4gICAgICAgIHJlcXVlc3RlZE1vZGVsOiBtb2RlbCxcbiAgICAgICAgbW9kZWxGYWxsYmFja3M6IHNlc3Npb24ubW9kZWxGYWxsYmFja3MsXG4gICAgICAgIC8vIHN5c3RlbUhhc2gg64qUIOyDgeychCBpc3N1ZUNvbnZDb250ZXh0IOqwgCDssYTsmrTri6Qo7Jes6riw7ISgIOu5hOyatOuLpCkuXG4gICAgICAgIHRocmVhZENvb3JkOiB7XG4gICAgICAgICAgd29ya2VySWQ6IG1ha2VBbnRocm9waWNXb3JrZXJJZCh0b2tlbi5pZCksXG4gICAgICAgICAgdGhyZWFkSWQ6IHNlc3Npb24uc2Vzc2lvbklkLFxuICAgICAgICAgIGVwb2NoOiAwLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGV4ZWMoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1DQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsc0JBQXNCLENBQUM7QUFJMUQsTUFBTSxxQkFBcUI7QUFFM0IsTUFBTSxvQkFBb0I7QUFVMUIsU0FBUyw4QkFDUCxVQUNBLFFBQ1E7Q0FDUixNQUFN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
|
|
239
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDsmpTssq3rp4jri6Qg7IOIIENsYXVkZSDtlITroZzshLjsiqTsl5Ag7KCE7LK0IOuMgO2ZlCDsnbTroKXsnYQg7KCE64us7ZWc64ukLlxuICog67CY7ZmY7ZWcIHRocmVhZENvb3Jk64qUIOuLpOydjCDsmpTssq3snZgg7IS47IWYIOyerOyCrOyaqeydtOuCmCDthqDtgbAg7ISg7YOd7JeQIOyTsOyngCDslYrripTri6QuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyBnZXRFeHBpcmVzQXQsIGdldFJlZnJlc2hUb2tlbiB9IGZyb20gXCIuLi9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hIH0gZnJvbSBcIi4uL2NvbW1vbi9zY2hlbWEtdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluIH0gZnJvbSBcIi4uL2NvbW1vbi9zbW9vdGgtd2VpZ2h0ZWQtcm91bmQtcm9iaW5cIjtcbmltcG9ydCB7IGFzc2VydFN1cHBvcnRlZE9uZU1pbGxpb25TdWZmaXgsIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsIH0gZnJvbSBcIi4vYW50aHJvcGljLWNvbnN0YW50c1wiO1xuaW1wb3J0IHsgaW52YWxpZGF0ZUFudGhyb3BpY1F1b3RhVXNhZ2UsIHJlYWRBbnRocm9waWNRdW90YVVzYWdlIH0gZnJvbSBcIi4vYW50aHJvcGljLXF1b3RhXCI7XG5pbXBvcnQgeyBhc3NlcnRBbnRocm9waWNUaGlua2luZ1J1bnRpbWUsIHJlc29sdmVBbnRocm9waWNUaGlua2luZyB9IGZyb20gXCIuL2FudGhyb3BpYy10aGlua2luZ1wiO1xuaW1wb3J0IHsgbWFrZUFudGhyb3BpY1dvcmtlcklkLCBydW5DbGF1ZGVTZXNzaW9uIH0gZnJvbSBcIi4vY2xhdWRlLXNlc3Npb25cIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwiYW50aHJvcGljLWRpc3BhdGNoZXJcIl0pO1xuXG4vLyAxTSBjb250ZXh0IOyDneyEseydgCAxMDDstIgg7J207IOBIOqxuOumtCDsiJgg7J6I64ukLlxuY29uc3QgREVGQVVMVF9USU1FT1VUX01TID0gMjQwXzAwMDtcbmNvbnN0IFJFRlJFU0hfU0FGRVRZX01TID0gNjBfMDAwO1xuXG5pbnRlcmZhY2UgUG9vbGVkVG9rZW4ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzOiBBbnRocm9waWNDcmVkZW50aWFscztcbiAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEFudGhyb3BpY0Rpc3BhdGNoZXIgaW1wbGVtZW50cyBQcm92aWRlckRpc3BhdGNoZXIge1xuICB0b2tlblBvb2wgPSBuZXcgTWFwPG51bWJlciwgUG9vbGVkVG9rZW4+KCk7XG4gIHJlYWRvbmx5IHdlaWdodGVkU2VsZWN0b3IgPSBuZXcgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluKCk7XG4gIGluRmxpZ2h0ID0gMDtcblxuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBOT1RJRlnripQg6riw7KG0IO2GoO2BsOydhCDsnqzsoITshqHtlZjsp4Ag7JWK7Jy866+A66GcIOyLnOyekSDsi5wgRELsl5DshJwg7J2964qU64ukLlxuICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZEFjdGl2ZUJ5UHJvdmlkZXIoXCJBXCIsIFwiYW50aHJvcGljXCIpO1xuICAgIHRva2Vucy5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICB0aGlzLnRva2VuUG9vbC5zZXQodC5pZCwge1xuICAgICAgICBpZDogdC5pZCxcbiAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICBjcmVkZW50aWFsczogdC5jcmVkZW50aWFscyBhcyBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICAgICAgcXVvdGFUaHJlc2hvbGQ6IHQucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICB3ZWlnaHQ6IHQud2VpZ2h0LFxuICAgICAgfSk7XG4gICAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4odC5pZCwgdC53ZWlnaHQpO1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciBzcGF3bmVkOiAke3QubmFtZX1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW5JZHMgPSBbLi4udGhpcy50b2tlblBvb2wua2V5cygpXTtcbiAgICB0b2tlbklkcy5mb3JFYWNoKChpZCkgPT4gdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKSk7XG4gICAgdGhpcy50b2tlblBvb2wuY2xlYXIoKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgfVxuXG4gIC8vIExJU1RFTi9OT1RJRlkg7Jew6rKw7J20IOuBiuq4tCDrj5nslYgg64aT7LmcIOuzgOqyveydhCBEQiDquLDspIDsnLzroZwg66ee7LaY64ukLlxuICByZXBsYWNlVG9rZW5zKFxuICAgIHJvd3M6IEFycmF5PHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjcmVkZW50aWFsczogQW50aHJvcGljQ3JlZGVudGlhbHM7XG4gICAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gICAgICB3ZWlnaHQ6IG51bWJlcjtcbiAgICB9PixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICAvLyDsgq3soJztlaAg7YKk64qUIOyInO2ajCDsoITsl5Ag7Iqk64OF7IO37ZWc64ukLlxuICAgIGNvbnN0IGN1cnJlbnRJZHMgPSBBcnJheS5mcm9tKHRoaXMudG9rZW5Qb29sLmtleXMoKSk7XG4gICAgY3VycmVudElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgaWYgKCFuZXh0LmhhcyhpZCkpIHRoaXMub25Ub2tlblJlbW92ZWQoaWQpO1xuICAgIH0pO1xuICAgIHJvd3MuZm9yRWFjaCgocikgPT4ge1xuICAgICAgaWYgKHRoaXMudG9rZW5Qb29sLmhhcyhyLmlkKSkge1xuICAgICAgICB0aGlzLm9uVG9rZW5VcGRhdGVkKHIuaWQsIHIubmFtZSwgci5jcmVkZW50aWFscywgci5xdW90YVRocmVzaG9sZCwgci53ZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vblRva2VuQWRkZWQoci5pZCwgci5uYW1lLCByLmNyZWRlbnRpYWxzLCByLnF1b3RhVGhyZXNob2xkLCByLndlaWdodCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblRva2VuQWRkZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IEFudGhyb3BpY0NyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQgPSAxLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnRva2VuUG9vbC5zZXQoaWQsIHsgaWQsIG5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0IH0pO1xuICAgIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5zZXRUb2tlbihpZCwgd2VpZ2h0KTtcbiAgfVxuXG4gIG9uVG9rZW5VcGRhdGVkKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0ID0gMSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50b2tlblBvb2wuc2V0KGlkLCB7IGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCB9KTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4oaWQsIHdlaWdodCk7XG4gIH1cblxuICBvblRva2VuUmVtb3ZlZChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50b2tlblBvb2wuZGVsZXRlKGlkKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVtb3ZlVG9rZW4oaWQpO1xuICB9XG5cbiAgLy8g7KeA7KCVIOyalOyyreydgCDtlbTri7kg7Yag7YGw66eMIHF1b3RhIO2MkOygle2VmOqzoCB3ZWlnaHRlZCDsg4Htg5zrpbwg6rG065Oc66as7KeAIOyViuuKlOuLpC5cbiAgLy8g66+47KeA7KCVIOyalOyyreunjCBxdW90YSDthrXqs7wg7ZuE67O066GcIHNtb290aCB3ZWlnaHRlZCByb3VuZC1yb2JpbiDsnYQg7KeE7ZaJ7ZWc64ukLlxuICBhc3luYyBzZWxlY3RUb2tlbihtb2RlbDogc3RyaW5nLCBwcmVmZXJyZWRUb2tlbklkPzogbnVtYmVyKTogUHJvbWlzZTxQb29sZWRUb2tlbiB8IG51bGw+IHtcbiAgICBjb25zdCBwcmVmZXJyZWQgPVxuICAgICAgcHJlZmVycmVkVG9rZW5JZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy50b2tlblBvb2wuZ2V0KHByZWZlcnJlZFRva2VuSWQpO1xuICAgIGlmIChwcmVmZXJyZWRUb2tlbklkICE9PSB1bmRlZmluZWQgJiYgIXByZWZlcnJlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcmVmZXJyZWQgYW50aHJvcGljIHRva2VuICR7cHJlZmVycmVkVG9rZW5JZH0gaXMgbm90IGF2YWlsYWJsZWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJvd3MgPSBwcmVmZXJyZWQgPyBbcHJlZmVycmVkXSA6IFsuLi50aGlzLnRva2VuUG9vbC52YWx1ZXMoKV07XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7IGVsaWdpYmxlLCBvdmVyVGhyZXNob2xkVG9rZW5zIH0gPSBhd2FpdCB0aGlzLmZpbHRlckVsaWdpYmxlVG9rZW5zKHJvd3MsIG1vZGVsKTtcbiAgICBpZiAoZWxpZ2libGUubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBhbGxfZXhjZWVkZWRcIiwge1xuICAgICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgICAgdG9rZW5Db3VudDogcm93cy5sZW5ndGgsXG4gICAgICAgIHRocmVzaG9sZGVkVG9rZW5Db3VudDogcm93cy5maWx0ZXIoKHIpID0+IHRoaXMuaGFzUXVvdGFUaHJlc2hvbGQocikpLmxlbmd0aCxcbiAgICAgICAgb3ZlclRocmVzaG9sZFRva2VucyxcbiAgICAgICAgcmVhc29uOiBcImFsbF9leGNlZWRlZFwiLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXRhaWxzID0gb3ZlclRocmVzaG9sZFRva2Vuc1xuICAgICAgICAubWFwKCh0b2tlbikgPT4gYCR7dG9rZW4udG9rZW5OYW1lfSAodGhyZXNob2xkICR7dG9rZW4udGhyZXNob2xkfSUpYClcbiAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICAgIHRocm93IG5ldyBRdW90YVRocmVzaG9sZEV4Y2VlZGVkRXJyb3IoXG4gICAgICAgIGRldGFpbHNcbiAgICAgICAgICA/IGBBbGwgYW50aHJvcGljIHRva2VucyBleGNlZWRlZCBxdW90YSB0aHJlc2hvbGQ6ICR7ZGV0YWlsc31gXG4gICAgICAgICAgOiBcIkFsbCBhbnRocm9waWMgdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZFwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocHJlZmVycmVkKSByZXR1cm4gcHJlZmVycmVkO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRJZCA9IHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5zZWxlY3QobmV3IFNldChlbGlnaWJsZS5tYXAoKHRva2VuKSA9PiB0b2tlbi5pZCkpKTtcbiAgICBpZiAoc2VsZWN0ZWRJZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Qb29sLmdldChzZWxlY3RlZElkKSA/PyBudWxsO1xuICB9XG5cbiAgYXN5bmMgZmlsdGVyRWxpZ2libGVUb2tlbnMoXG4gICAgcm93czogUG9vbGVkVG9rZW5bXSxcbiAgICBtb2RlbDogc3RyaW5nLFxuICApOiBQcm9taXNlPHtcbiAgICBlbGlnaWJsZTogUG9vbGVkVG9rZW5bXTtcbiAgICBvdmVyVGhyZXNob2xkVG9rZW5zOiBBcnJheTx7IHRva2VuTmFtZTogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9PjtcbiAgfT4ge1xuICAgIGNvbnN0IHRocmVzaG9sZGVkID0gcm93cy5maWx0ZXIoKHRva2VuKSA9PiB0aGlzLmhhc1F1b3RhVGhyZXNob2xkKHRva2VuKSk7XG4gICAgaWYgKHRocmVzaG9sZGVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgZWxpZ2libGU6IHJvd3MsIG92ZXJUaHJlc2hvbGRUb2tlbnM6IFtdIH07XG5cbiAgICBjb25zdCBlbGlnaWJsZUlkcyA9IG5ldyBTZXQoXG4gICAgICByb3dzLmZpbHRlcigodG9rZW4pID0+ICF0aGlzLmhhc1F1b3RhVGhyZXNob2xkKHRva2VuKSkubWFwKCh0b2tlbikgPT4gdG9rZW4uaWQpLFxuICAgICk7XG4gICAgY29uc3Qgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT4gPSBbXTtcbiAgICBjb25zdCBjaGVja3MgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB0aHJlc2hvbGRlZC5tYXAoYXN5bmMgKHRva2VuKSA9PiAoe1xuICAgICAgICB0b2tlbixcbiAgICAgICAgcmVzdWx0OiBhd2FpdCByZWFkQW50aHJvcGljUXVvdGFVc2FnZSh0b2tlbi5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbiwgbW9kZWwpLFxuICAgICAgfSkpLFxuICAgICk7XG5cbiAgICBjaGVja3MuZm9yRWFjaCgoY2hlY2ssIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB0b2tlbiA9IGNoZWNrLnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiID8gdGhyZXNob2xkZWRbaW5kZXhdIDogY2hlY2sudmFsdWUudG9rZW47XG4gICAgICBpZiAoIXRva2VuKSByZXR1cm47XG4gICAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICBjaGVjay5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCJcbiAgICAgICAgICA/IGNoZWNrLnZhbHVlLnJlc3VsdFxuICAgICAgICAgIDogeyBraW5kOiBcImxvb2t1cF9mYWlsZWRcIiBhcyBjb25zdCwgcmVhc29uOiBTdHJpbmcoY2hlY2sucmVhc29uKSB9O1xuICAgICAgaWYgKHJlc3VsdC5raW5kID09PSBcImxvb2t1cF9mYWlsZWRcIikge1xuICAgICAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBsb29rdXBfZmFpbF9vcGVuXCIsIHtcbiAgICAgICAgICB0b2tlbklkOiB0b2tlbi5pZCxcbiAgICAgICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICAgICAgdGhyZXNob2xkOiB0b2tlbi5xdW90YVRocmVzaG9sZCxcbiAgICAgICAgICByZWFzb246IFwibG9va3VwX2ZhaWxfb3BlblwiLFxuICAgICAgICAgIGxvb2t1cFJlYXNvbjogcmVzdWx0LnJlYXNvbixcbiAgICAgICAgfSk7XG4gICAgICAgIGVsaWdpYmxlSWRzLmFkZCh0b2tlbi5pZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC51dGlsaXphdGlvblBjdCA+PSB0b2tlbi5xdW90YVRocmVzaG9sZCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBvdmVyX3RocmVzaG9sZFwiLCB7XG4gICAgICAgICAgdG9rZW5JZDogdG9rZW4uaWQsXG4gICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgICAgIHRocmVzaG9sZDogdG9rZW4ucXVvdGFUaHJlc2hvbGQsXG4gICAgICAgICAgY2FjaGVkVXRpbGl6YXRpb246IHJlc3VsdC51dGlsaXphdGlvblBjdCxcbiAgICAgICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICAgICAgcmVhc29uOiBcIm92ZXJfdGhyZXNob2xkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBvdmVyVGhyZXNob2xkVG9rZW5zLnB1c2goeyB0b2tlbk5hbWU6IHRva2VuLm5hbWUsIHRocmVzaG9sZDogdG9rZW4ucXVvdGFUaHJlc2hvbGQgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZWxpZ2libGVJZHMuYWRkKHRva2VuLmlkKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGVsaWdpYmxlOiByb3dzLmZpbHRlcigodG9rZW4pID0+IGVsaWdpYmxlSWRzLmhhcyh0b2tlbi5pZCkpLCBvdmVyVGhyZXNob2xkVG9rZW5zIH07XG4gIH1cblxuICBoYXNRdW90YVRocmVzaG9sZCh0b2tlbjogUG9vbGVkVG9rZW4pOiB0b2tlbiBpcyBQb29sZWRUb2tlbiAmIHsgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB9IHtcbiAgICByZXR1cm4gdG9rZW4ucXVvdGFUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJiB0b2tlbi5xdW90YVRocmVzaG9sZCAhPT0gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlKHJlcTogR2VuZXJhdGVSZXF1ZXN0KTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJ1bihyZXEsICgpID0+IHt9KTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW4ocmVxLCBjYi5vbkRlbHRhLCB7IGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM6IHRydWUgfSk7XG4gICAgICBjYi5vblRocmVhZElkPy4ocmVzdWx0LnRocmVhZENvb3JkLnRocmVhZElkKTtcbiAgICAgIGNiLm9uQ29tcGxldGUocmVzdWx0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjYi5vbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJ1bihcbiAgICByZXE6IEdlbmVyYXRlUmVxdWVzdCxcbiAgICBvbkRlbHRhOiAodDogc3RyaW5nKSA9PiB2b2lkLFxuICAgIG9wdHM/OiB7IGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM/OiBib29sZWFuIH0sXG4gICk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICB0aGlzLmluRmxpZ2h0Kys7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChyZXEuaW1hZ2VHZW5lcmF0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImltYWdlIGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgQW50aHJvcGljIHJvdXRlXCIpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0U3VwcG9ydGVkT25lTWlsbGlvblN1ZmZpeChyZXEubW9kZWwpO1xuICAgICAgY29uc3QgbW9kZWwgPSBjYW5vbmljYWxBbnRocm9waWNNb2RlbChyZXEubW9kZWwpO1xuICAgICAgY29uc3QgdGhpbmtpbmcgPSByZXNvbHZlQW50aHJvcGljVGhpbmtpbmcobW9kZWwsIHJlcS50aGlua2luZywgcmVxLmVmZm9ydCk7XG4gICAgICBhc3NlcnRBbnRocm9waWNUaGlua2luZ1J1bnRpbWUodGhpbmtpbmcuZXh0cmFCb2R5KTtcbiAgICAgIGNvbnN0IGpzb25TY2hlbWEgPSBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hKHJlcS5vdXRwdXRTY2hlbWEsIFwiYW50aHJvcGljXCIpO1xuXG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuc2VsZWN0VG9rZW4obW9kZWwsIHJlcS5wcmVmZXJyZWRUb2tlbklkKTtcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcihcIk5vIGFudGhyb3BpYyB0b2tlbnMgYXZhaWxhYmxlXCIpO1xuXG4gICAgICAvLyDrp4zro4wg7KeB7KCE7JeQIOqwseyLoO2VmOuQmCDsi6TtjKjtlZjrqbQg6riw7KG0IO2GoO2BsOycvOuhnCDsp4TtlontlZzri6QuXG4gICAgICBsZXQgYWNjZXNzVG9rZW4gPSB0b2tlbi5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbjtcbiAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IGdldEV4cGlyZXNBdCh0b2tlbi5jcmVkZW50aWFscyk7XG4gICAgICBpZiAoXG4gICAgICAgIGV4cGlyZXNBdCAmJlxuICAgICAgICBleHBpcmVzQXQgLSBEYXRlLm5vdygpIDwgUkVGUkVTSF9TQUZFVFlfTVMgJiZcbiAgICAgICAgZ2V0UmVmcmVzaFRva2VuKHRva2VuLmNyZWRlbnRpYWxzKVxuICAgICAgKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBRZ3JpZEZyYW1lIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5mcmFtZVwiKTtcbiAgICAgICAgICAvLyBwcm92aWRlciDrpbwg67CY65Oc7IucIOyxhOybjOyVvCByZWZyZXNoVG9rZW4g64K067aAIFRva2VuTW9kZWwuc2F2ZSDqsIAg7ISx6rO17ZWc64ukLlxuICAgICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgUWdyaWRGcmFtZS5yZWZyZXNoVG9rZW4oe1xuICAgICAgICAgICAgaWQ6IHRva2VuLmlkLFxuICAgICAgICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICAgICAgICBuYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IHRva2VuLmNyZWRlbnRpYWxzLFxuICAgICAgICAgIH0gYXMgUGFyYW1ldGVyczx0eXBlb2YgUWdyaWRGcmFtZS5yZWZyZXNoVG9rZW4+WzBdKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGByZWZyZXNoIGZhaWxlZCBmb3IgJHt0b2tlbi5uYW1lfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbyhg4oaSICR7dG9rZW4ubmFtZX0gKG1vZGVsOiAke21vZGVsfSlgKTtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBydW5DbGF1ZGVTZXNzaW9uKFxuICAgICAgICB7XG4gICAgICAgICAgdG9rZW5JZDogdG9rZW4uaWQsXG4gICAgICAgICAgdG9rZW46IGFjY2Vzc1Rva2VuLFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIHN5c3RlbTogcmVxLnN5c3RlbVByb21wdCxcbiAgICAgICAgICBqc29uU2NoZW1hLFxuICAgICAgICAgIGVmZm9ydDogcmVxLmVmZm9ydCxcbiAgICAgICAgICB0aGlua2luZzogcmVxLnRoaW5raW5nLFxuICAgICAgICAgIHRpbWVvdXRNczogcmVxLnRpbWVvdXRNcyA/PyBERUZBVUxUX1RJTUVPVVRfTVMsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IHJlcS5jb2xkSGlzdG9yeSxcbiAgICAgICAgICBpbnB1dDogcmVxLmNvbGRJbnB1dCxcbiAgICAgICAgICBhYm9ydFNpZ25hbDogcmVxLmFib3J0U2lnbmFsLFxuICAgICAgICAgIGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM6IG9wdHM/LmluY2x1ZGVQYXJ0aWFsTWVzc2FnZXMsXG4gICAgICAgIH0sXG4gICAgICAgIG9uRGVsdGEsXG4gICAgICApO1xuXG4gICAgICBpZiAoc2Vzc2lvbi5xdW90YUV4aGF1c3RlZCkge1xuICAgICAgICBpbnZhbGlkYXRlQW50aHJvcGljUXVvdGFVc2FnZSh0b2tlbi5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbik7XG4gICAgICAgIGlmIChhY2Nlc3NUb2tlbiAhPT0gdG9rZW4uY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICBpbnZhbGlkYXRlQW50aHJvcGljUXVvdGFVc2FnZShhY2Nlc3NUb2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBxdW90YSBleGhhdXN0ZWQgKCR7dG9rZW4ubmFtZX0pYCk7XG4gICAgICB9XG4gICAgICBpZiAoc2Vzc2lvbi5pc0Vycm9yKSB7XG4gICAgICAgIC8vIOyiheujjCDsgqzsnKDrpbwg66i87KCAIO2RnOyLnO2VmOqzoCDsnZHri7Ug67O466y47J2AIOynhOuLqOyXkCDtlYTsmpTtlZwg66eM7YG866eMIOuCqOq4tOuLpC5cbiAgICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgICBzZXNzaW9uLnN1YnR5cGUgPz8gc2Vzc2lvbi50ZXJtaW5hbFJlYXNvbiA/PyAoc2Vzc2lvbi5pc0Vycm9yID8gXCJpc19lcnJvclwiIDogXCJ1bmtub3duXCIpO1xuICAgICAgICBjb25zdCBib2R5ID0gc2Vzc2lvbi50ZXh0XG4gICAgICAgICAgPyBzZXNzaW9uLnRleHQubGVuZ3RoID4gNTAwXG4gICAgICAgICAgICA/IGAke3Nlc3Npb24udGV4dC5zbGljZSgwLCA1MDApfeKApigke3Nlc3Npb24udGV4dC5sZW5ndGh9IGNoYXJzKWBcbiAgICAgICAgICAgIDogc2Vzc2lvbi50ZXh0XG4gICAgICAgICAgOiBgZW1wdHkgdGV4dCwgb3V0cHV0VG9rZW5zPSR7c2Vzc2lvbi51c2FnZS5vdXRwdXRUb2tlbnN9YDtcbiAgICAgICAgY29uc3QgcmVmdXNhbCA9IHNlc3Npb24ucmVmdXNhbCA/IGAgcmVmdXNhbD0ke0pTT04uc3RyaW5naWZ5KHNlc3Npb24ucmVmdXNhbCl9YCA6IFwiXCI7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgY2xhdWRlIGVycm9yICgke3Rva2VuLm5hbWV9KSBbJHtyZWFzb259XTogJHtib2R5fSR7cmVmdXNhbH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dDogc2Vzc2lvbi50ZXh0LFxuICAgICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgIHVzYWdlOiBzZXNzaW9uLnVzYWdlLFxuICAgICAgICBkdXJhdGlvbk1zOiBzZXNzaW9uLmR1cmF0aW9uTXMsXG4gICAgICAgIHR0ZnRNczogc2Vzc2lvbi50dGZ0TXMsXG4gICAgICAgIGNvc3RVc2Q6IHNlc3Npb24uY29zdFVzZCxcbiAgICAgICAgLy8gQ2xhdWRlIENvZGXsnZgg66qo6424IGZhbGxiYWNr7J2EIOu5hOyaqcK36rCQ7IKsIOuhnOq3uOyXkCDrsJjsmIHtlZzri6QuXG4gICAgICAgIG1vZGVsOiBzZXNzaW9uLnNlcnZlZE1vZGVsID8/IG1vZGVsLFxuICAgICAgICByZXF1ZXN0ZWRNb2RlbDogbW9kZWwsXG4gICAgICAgIG1vZGVsRmFsbGJhY2tzOiBzZXNzaW9uLm1vZGVsRmFsbGJhY2tzLFxuICAgICAgICB0aHJlYWRDb29yZDoge1xuICAgICAgICAgIHdvcmtlcklkOiBtYWtlQW50aHJvcGljV29ya2VySWQodG9rZW4uaWQpLFxuICAgICAgICAgIHRocmVhZElkOiBzZXNzaW9uLnNlc3Npb25JZCxcbiAgICAgICAgICBlcG9jaDogMCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaW5GbGlnaHQtLTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsc0JBQXNCLENBQUM7QUFHMUQsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxvQkFBb0I7QUFVMUIsSUFBYSxzQkFBYixNQUErRDtDQUM3RCw0QkFBWSxJQUFJLElBQXlCO0NBQ3pDLG1CQUE0QixJQUFJLHlCQUF5QjtDQUN6RCxXQUFXO0NBRVgsTUFBTSxRQUF1QjtFQUczQixPQURxQixXQUFXLHFCQUFxQixLQUFLLFdBQVcsRUFDckUsQ0FBTyxTQUFTLE1BQU07R0FDcEIsS0FBSyxVQUFVLElBQUksRUFBRSxJQUFJO0lBQ3ZCLElBQUksRUFBRTtJQUNOLE1BQU0sRUFBRTtJQUNSLGFBQWEsRUFBRTtJQUNmLGdCQUFnQixFQUFFO0lBQ2xCLFFBQVEsRUFBRTtHQUNaLENBQUM7R0FDRCxLQUFLLGlCQUFpQixTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU07R0FDN0MsT0FBTyxLQUFLLG1CQUFtQixFQUFFLE1BQU07RUFDekMsQ0FBQztDQUNIO0NBRUEsTUFBTSxPQUFzQjtFQUUxQixDQURrQixHQUFHLEtBQUssVUFBVSxLQUFLLENBQ3pDLENBQUEsQ0FBUyxTQUFTLE9BQU8sS0FBSyxpQkFB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
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { canonicalAnthropicModel, usesAdaptiveThinking } from "./anthropic-constants.js";
|
|
2
|
+
import { resolveAnthropicEffort } from "../common/effort.js";
|
|
3
|
+
import { ThinkingValidationError } from "../common/thinking.js";
|
|
4
|
+
import { execFileSync } from "node:child_process";
|
|
5
|
+
//#region src/utils/providers/anthropic/anthropic-thinking.ts
|
|
6
|
+
const THINKING_OFF_MODELS = /* @__PURE__ */ new Set([
|
|
7
|
+
"claude-haiku-4-5",
|
|
8
|
+
"claude-sonnet-4-5",
|
|
9
|
+
"claude-sonnet-4-6",
|
|
10
|
+
"claude-sonnet-5",
|
|
11
|
+
"claude-opus-4-5",
|
|
12
|
+
"claude-opus-4-6",
|
|
13
|
+
"claude-opus-4-7",
|
|
14
|
+
"claude-opus-4-8",
|
|
15
|
+
"claude-opus-5",
|
|
16
|
+
"claude-haiku-5-5",
|
|
17
|
+
"claude-sonnet-5-5"
|
|
18
|
+
]);
|
|
19
|
+
let extraBodyRuntimeSupported;
|
|
20
|
+
/** These modes were verified through native extra-body delivery on Claude Code 2.1.295. */
|
|
21
|
+
function assertAnthropicThinkingRuntime(extraBody) {
|
|
22
|
+
if (!extraBody) return;
|
|
23
|
+
if (extraBodyRuntimeSupported === void 0) try {
|
|
24
|
+
const [major, minor, patch] = execFileSync("claude", ["--version"], {
|
|
25
|
+
encoding: "utf8",
|
|
26
|
+
timeout: 5e3,
|
|
27
|
+
stdio: [
|
|
28
|
+
"ignore",
|
|
29
|
+
"pipe",
|
|
30
|
+
"pipe"
|
|
31
|
+
],
|
|
32
|
+
env: {
|
|
33
|
+
PATH: process.env.PATH,
|
|
34
|
+
TMPDIR: process.env.TMPDIR
|
|
35
|
+
}
|
|
36
|
+
}).match(/^(\d+)\.(\d+)\.(\d+)/)?.slice(1).map(Number) ?? [];
|
|
37
|
+
extraBodyRuntimeSupported = major !== void 0 && minor !== void 0 && patch !== void 0 && (major > 2 || major === 2 && (minor > 1 || minor === 1 && patch >= 295));
|
|
38
|
+
} catch {
|
|
39
|
+
extraBodyRuntimeSupported = false;
|
|
40
|
+
}
|
|
41
|
+
if (!extraBodyRuntimeSupported) throw new ThinkingValidationError("thinking:false for Haiku 5.5 and Sonnet 5.5 requires Claude Code 2.1.295 or later; runtime version could not be verified");
|
|
42
|
+
}
|
|
43
|
+
function resolveAnthropicThinking(model, thinking, effort) {
|
|
44
|
+
const canonical = canonicalAnthropicModel(model);
|
|
45
|
+
if (thinking === false && !THINKING_OFF_MODELS.has(canonical)) throw new ThinkingValidationError(`thinking:false is not supported for anthropic/${canonical}: ${usesAdaptiveThinking(canonical) ? "this model requires thinking" : "thinking-off support has not been verified for this model"}`);
|
|
46
|
+
return {
|
|
47
|
+
extraBody: thinking === false && (canonical === "claude-haiku-5-5" || canonical === "claude-sonnet-5-5") ? JSON.stringify({ thinking: { type: canonical === "claude-sonnet-5-5" ? "between_tools" : "disabled" } }) : void 0,
|
|
48
|
+
mode: thinking === true ? "adaptive" : thinking === false || !usesAdaptiveThinking(canonical) ? "disabled" : void 0,
|
|
49
|
+
effort: thinking === false ? "low" : resolveAnthropicEffort(effort) ?? "low"
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
export { assertAnthropicThinkingRuntime, resolveAnthropicThinking };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLXRoaW5raW5nLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy10aGlua2luZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5cbmltcG9ydCB7IHJlc29sdmVBbnRocm9waWNFZmZvcnQgfSBmcm9tIFwiLi4vY29tbW9uL2VmZm9ydFwiO1xuaW1wb3J0IHsgVGhpbmtpbmdWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vY29tbW9uL3RoaW5raW5nXCI7XG5pbXBvcnQge1xuICBBTlRIUk9QSUNfREVGQVVMVF9FRkZPUlQsXG4gIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsLFxuICB1c2VzQWRhcHRpdmVUaGlua2luZyxcbn0gZnJvbSBcIi4vYW50aHJvcGljLWNvbnN0YW50c1wiO1xuXG5jb25zdCBUSElOS0lOR19PRkZfTU9ERUxTID0gbmV3IFNldChbXG4gIFwiY2xhdWRlLWhhaWt1LTQtNVwiLFxuICBcImNsYXVkZS1zb25uZXQtNC01XCIsXG4gIFwiY2xhdWRlLXNvbm5ldC00LTZcIixcbiAgXCJjbGF1ZGUtc29ubmV0LTVcIixcbiAgXCJjbGF1ZGUtb3B1cy00LTVcIixcbiAgXCJjbGF1ZGUtb3B1cy00LTZcIixcbiAgXCJjbGF1ZGUtb3B1cy00LTdcIixcbiAgXCJjbGF1ZGUtb3B1cy00LThcIixcbiAgXCJjbGF1ZGUtb3B1cy01XCIsXG4gIFwiY2xhdWRlLWhhaWt1LTUtNVwiLFxuICBcImNsYXVkZS1zb25uZXQtNS01XCIsXG5dKTtcblxubGV0IGV4dHJhQm9keVJ1bnRpbWVTdXBwb3J0ZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbi8qKiBUaGVzZSBtb2RlcyB3ZXJlIHZlcmlmaWVkIHRocm91Z2ggbmF0aXZlIGV4dHJhLWJvZHkgZGVsaXZlcnkgb24gQ2xhdWRlIENvZGUgMi4xLjI5NS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRBbnRocm9waWNUaGlua2luZ1J1bnRpbWUoZXh0cmFCb2R5OiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFleHRyYUJvZHkpIHJldHVybjtcbiAgaWYgKGV4dHJhQm9keVJ1bnRpbWVTdXBwb3J0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gZXhlY0ZpbGVTeW5jKFwiY2xhdWRlXCIsIFtcIi0tdmVyc2lvblwiXSwge1xuICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIHRpbWVvdXQ6IDUwMDAsXG4gICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgZW52OiB7IFBBVEg6IHByb2Nlc3MuZW52LlBBVEgsIFRNUERJUjogcHJvY2Vzcy5lbnYuVE1QRElSIH0sXG4gICAgICB9KS5tYXRjaCgvXihcXGQrKVxcLihcXGQrKVxcLihcXGQrKS8pO1xuICAgICAgY29uc3QgW21ham9yLCBtaW5vciwgcGF0Y2hdID0gdmVyc2lvbj8uc2xpY2UoMSkubWFwKE51bWJlcikgPz8gW107XG4gICAgICBleHRyYUJvZHlSdW50aW1lU3VwcG9ydGVkID1cbiAgICAgICAgbWFqb3IgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBtaW5vciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhdGNoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKG1ham9yID4gMiB8fCAobWFqb3IgPT09IDIgJiYgKG1pbm9yID4gMSB8fCAobWlub3IgPT09IDEgJiYgcGF0Y2ggPj0gMjk1KSkpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGV4dHJhQm9keVJ1bnRpbWVTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFleHRyYUJvZHlSdW50aW1lU3VwcG9ydGVkKSB7XG4gICAgdGhyb3cgbmV3IFRoaW5raW5nVmFsaWRhdGlvbkVycm9yKFxuICAgICAgXCJ0aGlua2luZzpmYWxzZSBmb3IgSGFpa3UgNS41IGFuZCBTb25uZXQgNS41IHJlcXVpcmVzIENsYXVkZSBDb2RlIDIuMS4yOTUgb3IgbGF0ZXI7IHJ1bnRpbWUgdmVyc2lvbiBjb3VsZCBub3QgYmUgdmVyaWZpZWRcIixcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQW50aHJvcGljVGhpbmtpbmcobW9kZWw6IHN0cmluZywgdGhpbmtpbmc/OiBib29sZWFuLCBlZmZvcnQ/OiBzdHJpbmcpIHtcbiAgY29uc3QgY2Fub25pY2FsID0gY2Fub25pY2FsQW50aHJvcGljTW9kZWwobW9kZWwpO1xuICBpZiAodGhpbmtpbmcgPT09IGZhbHNlICYmICFUSElOS0lOR19PRkZfTU9ERUxTLmhhcyhjYW5vbmljYWwpKSB7XG4gICAgY29uc3QgcmVhc29uID0gdXNlc0FkYXB0aXZlVGhpbmtpbmcoY2Fub25pY2FsKVxuICAgICAgPyBcInRoaXMgbW9kZWwgcmVxdWlyZXMgdGhpbmtpbmdcIlxuICAgICAgOiBcInRoaW5raW5nLW9mZiBzdXBwb3J0IGhhcyBub3QgYmVlbiB2ZXJpZmllZCBmb3IgdGhpcyBtb2RlbFwiO1xuICAgIHRocm93IG5ldyBUaGlua2luZ1ZhbGlkYXRpb25FcnJvcihcbiAgICAgIGB0aGlua2luZzpmYWxzZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbnRocm9waWMvJHtjYW5vbmljYWx9OiAke3JlYXNvbn1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAvLyBOZXZlciBhY2NlcHQgY2FsbGVyLXByb3ZpZGVkIGV4dHJhIGJvZHkgZGF0YSBvciBpbmhlcml0IGl0IGZyb20gdGhlIGhvc3QgZW52aXJvbm1lbnQuXG4gICAgZXh0cmFCb2R5OlxuICAgICAgdGhpbmtpbmcgPT09IGZhbHNlICYmIChjYW5vbmljYWwgPT09IFwiY2xhdWRlLWhhaWt1LTUtNVwiIHx8IGNhbm9uaWNhbCA9PT0gXCJjbGF1ZGUtc29ubmV0LTUtNVwiKVxuICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHRoaW5raW5nOiB7IHR5cGU6IGNhbm9uaWNhbCA9PT0gXCJjbGF1ZGUtc29ubmV0LTUtNVwiID8gXCJiZXR3ZWVuX3Rvb2xzXCIgOiBcImRpc2FibGVkXCIgfSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICBtb2RlOlxuICAgICAgdGhpbmtpbmcgPT09IHRydWVcbiAgICAgICAgPyAoXCJhZGFwdGl2ZVwiIGFzIGNvbnN0KVxuICAgICAgICA6IHRoaW5raW5nID09PSBmYWxzZSB8fCAhdXNlc0FkYXB0aXZlVGhpbmtpbmcoY2Fub25pY2FsKVxuICAgICAgICAgID8gKFwiZGlzYWJsZWRcIiBhcyBjb25zdClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICBlZmZvcnQ6XG4gICAgICB0aGlua2luZyA9PT0gZmFsc2VcbiAgICAgICAgPyBBTlRIUk9QSUNfREVGQVVMVF9FRkZPUlRcbiAgICAgICAgOiAocmVzb2x2ZUFudGhyb3BpY0VmZm9ydChlZmZvcnQpID8/IEFOVEhST1BJQ19ERUZBVUxUX0VGRk9SVCksXG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBVUEsTUFBTSxzQ0FBc0IsSUFBSSxJQUFJO0NBQ2xDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7QUFDRixDQUFDO0FBRUQsSUFBSTs7QUFHSixTQUFnQiwrQkFBK0IsV0FBcUM7Q0FDbEYsSUFBSSxDQUFDLFdBQVc7Q0FDaEIsSUFBSSw4QkFBOEIsUUFDaEMsSUFBSTtFQU9GLE1BQU0sQ0FBQyxPQUFPLE9BQU8sU0FOTCxhQUFhLFVBQVUsQ0FBQyxXQUFXLEdBQUc7R0FDcEQsVUFBVTtHQUNWLFNBQVM7R0FDVCxPQUFPO0lBQUM7SUFBVTtJQUFRO0dBQU07R0FDaEMsS0FBSztJQUFFLE1BQU0sUUFBUSxJQUFJO0lBQU0sUUFBUSxRQUFRLElBQUk7R0FBTztFQUM1RCxDQUFDLENBQUMsQ0FBQyxNQUFNLHNCQUNxQixDQUFBLEVBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sS0FBSyxDQUFDO0VBQ2hFLDRCQUNFLFVBQVUsVUFDVixVQUFVLFVBQ1YsVUFBVSxXQUNULFFBQVEsS0FBTSxVQUFVLE1BQU0sUUFBUSxLQUFNLFVBQVUsS0FBSyxTQUFTO0NBQ3pFLFFBQVE7RUFDTiw0QkFBNEI7Q0FDOUI7Q0FFRixJQUFJLENBQUMsMkJBQ0gsTUFBTSxJQUFJLHdCQUNSLDBIQUNGO0FBRUo7QUFFQSxTQUFnQix5QkFBeUIsT0FBZSxVQUFvQixRQUFpQjtDQUMzRixNQUFNLFlBQVksd0JBQXdCLEtBQUs7Q0FDL0MsSUFBSSxhQUFhLFNBQVMsQ0FBQyxvQkFBb0IsSUFBSSxTQUFTLEdBSTFELE1BQU0sSUFBSSx3QkFDUixpREFBaUQsVUFBVSxJQUo5QyxxQkFBcUIsU0FBUyxJQUN6QyxpQ0FDQSw2REFHSjtDQUVGLE9BQU87RUFFTCxXQUNFLGFBQWEsVUFBVSxjQUFjLHNCQUFzQixjQUFjLHVCQUNyRSxLQUFLLFVBQVUsRUFDYixVQUFVLEVBQUUsTUFBTSxjQUFjLHNCQUFzQixrQkFBa0IsV0FBVyxFQUNyRixDQUFDLElBQ0Q7RUFDTixNQUNFLGFBQWEsT0FDUixhQUNELGFBQWEsU0FBUyxDQUFDLHFCQUFxQixTQUFTLElBQ2xELGFBQ0Q7RUFDUixRQUNFLGFBQWEsUUFBQSxRQUVSLHVCQUF1QixNQUFNLEtBQUE7Q0FDdEM7QUFDRiJ9
|