@cartanova/qgrid-cli 2.9.1 → 2.9.4

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 (49) hide show
  1. package/bundle/dist/application/qgrid/qgrid.frame.js +4 -3
  2. package/bundle/dist/application/qgrid/token-death.js +6 -22
  3. package/bundle/dist/application/qgrid/token-subscriber.js +2 -1
  4. package/bundle/dist/application/token/token.model.js +22 -17
  5. package/bundle/dist/startup-migrations.js +8 -5
  6. package/bundle/dist/utils/providers/anthropic/claude-session.js +3 -2
  7. package/bundle/dist/utils/providers/common/effort.js +51 -0
  8. package/bundle/dist/utils/providers/common/model-cost.js +29 -14
  9. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +1 -1
  10. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +5 -3
  11. package/bundle/src/application/qgrid/qgrid.frame.test.ts +20 -0
  12. package/bundle/src/application/qgrid/qgrid.frame.ts +3 -2
  13. package/bundle/src/application/qgrid/token-death.test.ts +11 -10
  14. package/bundle/src/application/qgrid/token-death.ts +9 -21
  15. package/bundle/src/application/qgrid/token-subscriber.test.ts +5 -1
  16. package/bundle/src/application/qgrid/token-subscriber.ts +1 -0
  17. package/bundle/src/application/token/token.model.test.ts +24 -5
  18. package/bundle/src/application/token/token.model.ts +30 -23
  19. package/bundle/src/startup-migrations.test.ts +19 -15
  20. package/bundle/src/startup-migrations.ts +11 -3
  21. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +1 -1
  22. package/bundle/src/utils/providers/anthropic/claude-session.test.ts +13 -0
  23. package/bundle/src/utils/providers/anthropic/claude-session.ts +3 -1
  24. package/bundle/src/utils/providers/common/effort.test.ts +61 -0
  25. package/bundle/src/utils/providers/common/effort.ts +53 -0
  26. package/bundle/src/utils/providers/common/model-cost.test.ts +25 -12
  27. package/bundle/src/utils/providers/common/model-cost.ts +43 -14
  28. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +3 -1
  29. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +21 -0
  30. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +5 -4
  31. package/bundle/web-dist/client/assets/{index-DiioTXCk.js → index-fogJvajr.js} +3 -3
  32. package/bundle/web-dist/client/assets/{logs-Cmh7iNUl.js → logs-CsY2cqvt.js} +1 -1
  33. package/bundle/web-dist/client/assets/{monit-BxqRbzYv.js → monit-ChgaLEcD.js} +1 -1
  34. package/bundle/web-dist/client/assets/{routes-DrNdqoD1.js → routes-BvyiTnOZ.js} +2 -2
  35. package/bundle/web-dist/client/assets/{settings-ROuRMHwU.js → settings-ZR2J9rWb.js} +1 -1
  36. package/bundle/web-dist/client/assets/{show-Ct97ts6E.js → show-CjwO4-So.js} +1 -1
  37. package/bundle/web-dist/client/assets/{tokens-Cw2eWi9I.js → tokens-Bx-hG1gm.js} +1 -1
  38. package/bundle/web-dist/client/assets/{use-oauth-login-flow-D4-P9yOJ.js → use-oauth-login-flow-Bqax_icS.js} +1 -1
  39. package/bundle/web-dist/client/index.html +1 -1
  40. package/bundle/web-dist/server/assets/{routes-CxMHXfdH.js → routes-B408iqh1.js} +29 -14
  41. package/bundle/web-dist/server/entry-server.generated.js +3 -2
  42. package/package.json +1 -1
  43. package/skills/qgrid/SKILL.md +1 -0
  44. package/skills/qgrid/references/ai-sdk-provider-contract.md +2 -2
  45. package/skills/qgrid/references/cli-env-and-server-boot.md +1 -0
  46. package/skills/qgrid/references/openai-codex-runtime.md +71 -0
  47. package/skills/qgrid/references/provider-runtime-differences.md +2 -0
  48. package/skills/qgrid/references/sonamu-api-web-flow.md +1 -1
  49. package/skills/qgrid/references/token-auth-quota-lifecycle.md +3 -2
@@ -198,9 +198,8 @@ var TokenModelClass = class extends BaseModelClass {
198
198
  }]);
199
199
  }
200
200
  /**
201
- * 인증 사망을 한 번만 기록하고, 다른 활성 토큰이 있으면 라우팅에서도 제외한다.
202
- * 마지막 활성 토큰은 systemic 장애 안전판 때문에 active 상태를 유지하되 재로그인
203
- * 필요 상태는 기록한다. `marked`가 공유 DB 인스턴스들의 알림 발송 게이트다.
201
+ * Record confirmed expiry and remove the token from routing atomically.
202
+ * The last active token is also deactivated; its notification is urgent.
204
203
  */
205
204
  async markReauthRequired(id, expectedCredentials) {
206
205
  return this.getPuri("w").transaction(async (trx) => {
@@ -211,38 +210,44 @@ var TokenModelClass = class extends BaseModelClass {
211
210
  }).where("id", id).forUpdate().first();
212
211
  if (!token || token.reauth_required) return {
213
212
  marked: false,
214
- keptAsLastActive: false,
213
+ wasLastActive: false,
215
214
  staleCredentials: false
216
215
  };
217
216
  if (!isDeepStrictEqual(token.credentials, expectedCredentials)) return {
218
217
  marked: false,
219
- keptAsLastActive: false,
218
+ wasLastActive: false,
220
219
  staleCredentials: true
221
220
  };
222
221
  await trx.knex.raw("SELECT pg_advisory_xact_lock(?, hashtext(?))", [TOKEN_AUTH_DEATH_LOCK_CLASS_ID, token.provider]);
223
- const marked = (await trx.knex.raw(`UPDATE tokens
222
+ const marked = (await trx.knex.raw(`WITH previous AS (
223
+ SELECT active AND NOT EXISTS (
224
+ SELECT 1 FROM tokens peer
225
+ WHERE peer.provider = tokens.provider AND peer.active
226
+ AND NOT peer.reauth_required AND peer.id <> tokens.id
227
+ ) AS was_last_active FROM tokens WHERE id = ?
228
+ )
229
+ UPDATE tokens
224
230
  SET reauth_required = true,
225
- active = CASE
226
- WHEN active AND (SELECT count(*) FROM tokens peer
227
- WHERE peer.provider = tokens.provider AND peer.active) > 1
228
- THEN false
229
- ELSE active
230
- END
231
+ active = false
231
232
  WHERE id = ? AND reauth_required = false
232
- RETURNING active`, [id])).rows[0];
233
+ RETURNING (SELECT was_last_active FROM previous) AS was_last_active`, [id, id])).rows[0];
233
234
  if (!marked) return {
234
235
  marked: false,
235
- keptAsLastActive: false,
236
+ wasLastActive: false,
236
237
  staleCredentials: false
237
238
  };
238
- if (marked.active) logger.error(`refusing to auto-deactivate token ${id}: last active provider token — systemic refresh failure suspected, keeping the pool non-empty`);
239
+ if (marked.was_last_active) logger.error(`deactivated expired token ${id}: no usable provider tokens remain`);
239
240
  return {
240
241
  marked: true,
241
- keptAsLastActive: marked.active,
242
+ wasLastActive: marked.was_last_active,
242
243
  staleCredentials: false
243
244
  };
244
245
  });
245
246
  }
247
+ /** Repair rows retained by the former last-active exception before pool reconciliation. */
248
+ async deactivateExpiredTokens() {
249
+ await this.getPuri("w").table("tokens").where("reauth_required", true).where("active", true).update({ active: false });
250
+ }
246
251
  async reorder(ids) {
247
252
  await this.getPuri("w").transaction(async (trx) => {
248
253
  for (let i = 0; i < ids.length; i++) await trx.table("tokens").where("id", ids[i]).update({ ord: i });
@@ -298,4 +303,4 @@ const TokenModel = new TokenModelClass();
298
303
  //#endregion
299
304
  export { TokenModel };
300
305
 
301
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4ubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRGVlcFN0cmljdEVxdWFsIH0gZnJvbSBcIm5vZGU6dXRpbFwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHtcbiAgYXBpLFxuICBhc0FycmF5LFxuICBCYWRSZXF1ZXN0RXhjZXB0aW9uLFxuICBCYXNlTW9kZWxDbGFzcyxcbiAgZXhoYXVzdGl2ZSxcbiAgdHlwZSBMaXN0UmVzdWx0LFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbn0gZnJvbSBcInNvbmFtdVwiO1xuXG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi8uLi9pMThuL3NkLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEtleSwgdHlwZSBUb2tlblN1YnNldE1hcHBpbmcgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgdG9rZW5Mb2FkZXJRdWVyaWVzLCB0b2tlblN1YnNldFF1ZXJpZXMgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZC5zc29cIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5DcmVkZW50aWFscywgdHlwZSBUb2tlbkxpc3RQYXJhbXMsIHR5cGUgVG9rZW5TYXZlUGFyYW1zIH0gZnJvbSBcIi4vdG9rZW4udHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9rZW5cIl0pO1xuXG5jb25zdCBERUZBVUxUX1FVT1RBX1RIUkVTSE9MRCA9IDgwO1xuY29uc3QgREVGQVVMVF9XRUlHSFQgPSAxO1xuY29uc3QgVE9LRU5fQVVUSF9ERUFUSF9MT0NLX0NMQVNTX0lEID0gNzE5O1xuXG5leHBvcnQgdHlwZSBUb2tlblVwZGF0ZUZpZWxkcyA9IHtcbiAgbmFtZT86IHN0cmluZztcbiAgcXVvdGFfdGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0PzogbnVtYmVyO1xuICBrZWVwYWxpdmVfZW5hYmxlZD86IGJvb2xlYW47XG59O1xuXG5mdW5jdGlvbiBhcHBseUNyZWF0ZURlZmF1bHRzKHNwOiBUb2tlblNhdmVQYXJhbXMpOiBUb2tlblNhdmVQYXJhbXMge1xuICBpZiAoc3AuaWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHNwO1xuICByZXR1cm4ge1xuICAgIC4uLnNwLFxuICAgIC4uLihzcC5xdW90YV90aHJlc2hvbGQgPT09IHVuZGVmaW5lZCA/IHsgcXVvdGFfdGhyZXNob2xkOiBERUZBVUxUX1FVT1RBX1RIUkVTSE9MRCB9IDoge30pLFxuICAgIC4uLihzcC53ZWlnaHQgPT09IHVuZGVmaW5lZCA/IHsgd2VpZ2h0OiBERUZBVUxUX1dFSUdIVCB9IDoge30pLFxuICB9O1xufVxuXG5jbGFzcyBUb2tlbk1vZGVsQ2xhc3MgZXh0ZW5kcyBCYXNlTW9kZWxDbGFzczxcbiAgVG9rZW5TdWJzZXRLZXksXG4gIFRva2VuU3Vic2V0TWFwcGluZyxcbiAgdHlwZW9mIHRva2VuU3Vic2V0UXVlcmllcyxcbiAgdHlwZW9mIHRva2VuTG9hZGVyUXVlcmllc1xuPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiVG9rZW5cIiwgdG9rZW5TdWJzZXRRdWVyaWVzLCB0b2tlbkxvYWRlclF1ZXJpZXMpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJUb2tlblwiIH0pXG4gIGFzeW5jIGZpbmRCeUlkPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oc3Vic2V0OiBULCBpZDogbnVtYmVyKTogUHJvbWlzZTxUb2tlblN1YnNldE1hcHBpbmdbVF0+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7IGlkLCBudW06IDEsIHBhZ2U6IDEgfSk7XG4gICAgaWYgKCFyb3dzWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5lbnRpdHlOb3RGb3VuZFwiKShcIlRva2VuXCIsIGlkKSk7XG4gICAgfVxuICAgIHJldHVybiByb3dzWzBdO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZTxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBsaXN0UGFyYW1zOiBUb2tlbkxpc3RQYXJhbXMsXG4gICk6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHsgLi4ubGlzdFBhcmFtcywgbnVtOiAxLCBwYWdlOiAxIH0pO1xuICAgIHJldHVybiByb3dzWzBdID8/IG51bGw7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSwgcmVzb3VyY2VOYW1lOiBcIlRva2Vuc1wiIH0pXG4gIGFzeW5jIGZpbmRNYW55PFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleSwgTFAgZXh0ZW5kcyBUb2tlbkxpc3RQYXJhbXM+KFxuICAgIHN1YnNldDogVCxcbiAgICByYXdQYXJhbXM/OiBMUCxcbiAgKTogUHJvbWlzZTxMaXN0UmVzdWx0PExQLCBUb2tlblN1YnNldE1hcHBpbmdbVF0+PiB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbnVtOiAyNCxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2g6IFwiaWRcIiBhcyBjb25zdCxcbiAgICAgIG9yZGVyQnk6IFwib3JkLWFzY1wiIGFzIGNvbnN0LFxuICAgICAgLi4ucmF3UGFyYW1zLFxuICAgIH0gc2F0aXNmaWVzIFRva2VuTGlzdFBhcmFtcztcblxuICAgIGNvbnN0IHsgcWIsIG9uU3Vic2V0OiBfIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcblxuICAgIGlmIChwYXJhbXMuaWQpIHtcbiAgICAgIHFiLndoZXJlSW4oXCJ0b2tlbnMuaWRcIiwgYXNBcnJheShwYXJhbXMuaWQpKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNlYXJjaCAmJiBwYXJhbXMua2V5d29yZCAmJiBwYXJhbXMua2V5d29yZC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJpZFwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwidG9rZW5zLmlkXCIsIE51bWJlcihwYXJhbXMua2V5d29yZCkpO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2VhcmNoID09PSBcIm5hbWVcIikge1xuICAgICAgICBxYi53aGVyZShcInRva2Vucy5uYW1lXCIsIFwibGlrZVwiLCBgJSR7cGFyYW1zLmtleXdvcmR9JWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci51bmtub3duU2VhcmNoRmllbGRcIikocGFyYW1zLnNlYXJjaCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMub3JkZXJCeSkge1xuICAgICAgaWYgKHBhcmFtcy5vcmRlckJ5ID09PSBcImlkLWRlc2NcIikge1xuICAgICAgICBxYi5vcmRlckJ5KFwidG9rZW5zLmlkXCIsIFwiZGVzY1wiKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLm9yZGVyQnkgPT09IFwib3JkLWFzY1wiKSB7XG4gICAgICAgIHFiLm9yZGVyQnkoXCJ0b2tlbnMub3JkXCIsIFwiYXNjXCIpO1xuICAgICAgICBxYi5vcmRlckJ5KFwidG9rZW5zLmlkXCIsIFwiYXNjXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhoYXVzdGl2ZShwYXJhbXMub3JkZXJCeSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoe1xuICAgICAgQTogKHJvdykgPT4gKHsgLi4ucm93IH0pLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHsgc3Vic2V0LCBxYiwgcGFyYW1zLCBlbmhhbmNlcnMsIGRlYnVnOiBmYWxzZSB9KTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRCeUFjY291bnRJZGVudGlmaWVyPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgYWNjb3VudElkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdW10+IHtcbiAgICBjb25zdCB7IHFiIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcbiAgICBxYi53aGVyZShcInRva2Vucy5wcm92aWRlclwiLCBwcm92aWRlcik7XG4gICAgY29uc3QganNvbktleSA9IHByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiID8gXCJhY2NvdW50VXVpZFwiIDogXCJhY2NvdW50SWRcIjtcbiAgICBxYi53aGVyZVJhdyhgdG9rZW5zLmNyZWRlbnRpYWxzLT4+JyR7anNvbktleX0nID0gP2AsIFthY2NvdW50SWRdKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIGFzeW5jIGZpbmRBY3RpdmVCeVByb3ZpZGVyPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdW10+IHtcbiAgICBjb25zdCB7IHFiIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcbiAgICBxYi53aGVyZShcInRva2Vucy5hY3RpdmVcIiwgdHJ1ZSk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMucHJvdmlkZXJcIiwgcHJvdmlkZXIpO1xuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHsgQTogKHJvdykgPT4gKHsgLi4ucm93IH0pIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHtcbiAgICAgIHN1YnNldCxcbiAgICAgIHFiLFxuICAgICAgcGFyYW1zOiB7IG51bTogMTAwLCBwYWdlOiAxIH0sXG4gICAgICBlbmhhbmNlcnMsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xuICB9XG5cbiAgYXN5bmMgZmluZEFjdGl2ZUJ5UHJvdmlkZXJBbmROYW1lPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHsgcWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLmFjdGl2ZVwiLCB0cnVlKTtcbiAgICBxYi53aGVyZShcInRva2Vucy5wcm92aWRlclwiLCBwcm92aWRlcik7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMubmFtZVwiLCBuYW1lKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEsIHBhZ2U6IDEgfSxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3NbMF07XG4gIH1cblxuICAvKiog7Iuk7KCcIOyduOymnSDrp4zro4zqsIAg7ZmV7J2464+8IOyerOuhnOq3uOyduOydtCDtlYTsmpTtlZwg7Yag7YGw65OkLiDsiJjrj5kg67mE7Zmc7ISx7ZmU64qUIOygnOyZuO2VnOuLpC4gKi9cbiAgYXN5bmMgZmluZFJlYXV0aFJlcXVpcmVkPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oc3Vic2V0OiBUKTogUHJvbWlzZTxUb2tlblN1YnNldE1hcHBpbmdbVF1bXT4ge1xuICAgIGNvbnN0IHsgcWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLnJlYXV0aF9yZXF1aXJlZFwiLCB0cnVlKTtcbiAgICBxYi5vcmRlckJ5KFwidG9rZW5zLm5hbWVcIiwgXCJhc2NcIik7XG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoeyBBOiAocm93KSA9PiAoeyAuLi5yb3cgfSkgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXM6IHsgbnVtOiAxMDAsIHBhZ2U6IDEgfSxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gIH1cblxuICBhc3luYyBmaW5kQWN0aXZlPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oc3Vic2V0OiBUKTogUHJvbWlzZTxUb2tlblN1YnNldE1hcHBpbmdbVF1bXT4ge1xuICAgIGNvbnN0IHsgcWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLmFjdGl2ZVwiLCB0cnVlKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIGFzeW5jIHNhdmUoc3BhOiBUb2tlblNhdmVQYXJhbXNbXSk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCJ0b2tlbnNcIiwgYXBwbHlDcmVhdGVEZWZhdWx0cyhzcCkpO1xuICAgIH0pO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC51YlVwc2VydChcInRva2Vuc1wiKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUZpZWxkcyhpZDogbnVtYmVyLCBmaWVsZHM6IFRva2VuVXBkYXRlRmllbGRzKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oKHRyeCkgPT4gdHJ4LnRhYmxlKFwidG9rZW5zXCIpLndoZXJlKFwiaWRcIiwgaWQpLnVwZGF0ZShmaWVsZHMpKTtcbiAgfVxuXG4gIGFzeW5jIHRvZ2dsZUFjdGl2ZShpZDogbnVtYmVyKTogUHJvbWlzZTx7IGFjdGl2ZTogYm9vbGVhbjsgcmVhdXRoUmVxdWlyZWQ6IGJvb2xlYW4gfSB8IG51bGw+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0cnhcbiAgICAgICAgLmZyb20oXCJ0b2tlbnNcIilcbiAgICAgICAgLnNlbGVjdCh7IGFjdGl2ZTogXCJhY3RpdmVcIiwgcmVhdXRoX3JlcXVpcmVkOiBcInJlYXV0aF9yZXF1aXJlZFwiIH0pXG4gICAgICAgIC53aGVyZShcImlkXCIsIGlkKVxuICAgICAgICAuZm9yVXBkYXRlKClcbiAgICAgICAgLmZpcnN0KCk7XG4gICAgICBpZiAoIXRva2VuKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmICghdG9rZW4uYWN0aXZlICYmIHRva2VuLnJlYXV0aF9yZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCByZWF1dGhSZXF1aXJlZDogdHJ1ZSB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY3RpdmUgPSAhdG9rZW4uYWN0aXZlO1xuICAgICAgYXdhaXQgdHJ4LmZyb20oXCJ0b2tlbnNcIikud2hlcmUoXCJpZFwiLCBpZCkudXBkYXRlKHsgYWN0aXZlIH0pO1xuICAgICAgcmV0dXJuIHsgYWN0aXZlLCByZWF1dGhSZXF1aXJlZDogZmFsc2UgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDqsJnsnYAg6rOE7KCV7J2YIOq4sOyhtCDthqDtgbDsnYQg7KeA7Jqw6rOgIOyDiOuhnCDsoIDsnqXtlZzri6Qo66Gc6re47J24wrfsnqzroZzqt7jsnbgg6rO17Ya1IOqyveuhnCkuXG4gICAqXG4gICAqIHByb3ZpZGVyIOydkeuLteyXkCDqs4TsoJUg7Iud67OE7J6Q6rCAIOyXhuycvOuptCBkZWR1cCDsnpDssrTqsIAg67aI6rCA64ql7ZWY66+A66GcIOqyveqzoOunjCDrgqjquLDqs6BcbiAgICog7KSR67O1IOygnOqxsCDsl4bsnbQg7KCA7J6l7ZWc64ukKOyjveydgCByb3cg6rCAIOuCqOuKlOuLpCkuXG4gICAqL1xuICBhc3luYyByZXBsYWNlQnlBY2NvdW50KFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgYWNjb3VudElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc2F2ZVBhcmFtczogVG9rZW5TYXZlUGFyYW1zLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2VlcGFsaXZlRW5hYmxlZCA9IHNhdmVQYXJhbXMua2VlcGFsaXZlX2VuYWJsZWQ7XG4gICAgaWYgKGFjY291bnRJZCkge1xuICAgICAgY29uc3Qgb2xkRW50cmllcyA9IGF3YWl0IHRoaXMuZmluZEJ5QWNjb3VudElkZW50aWZpZXIoXCJBXCIsIHByb3ZpZGVyLCBhY2NvdW50SWQpO1xuICAgICAgaWYgKGtlZXBhbGl2ZUVuYWJsZWQgPT09IHVuZGVmaW5lZCAmJiBvbGRFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAga2VlcGFsaXZlRW5hYmxlZCA9IG9sZEVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmtlZXBhbGl2ZV9lbmFibGVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRFbnRyaWVzLmxlbmd0aCA+IDApIGF3YWl0IHRoaXMuZGVsKG9sZEVudHJpZXMubWFwKChvKSA9PiBvLmlkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgJHtwcm92aWRlcn0gbG9naW4gd2l0aG91dCBhY2NvdW50IGlkZW50aWZpZXI6IGRlZHVwIHNraXBwZWQgZm9yICR7c2F2ZVBhcmFtcy5uYW1lID8/IFwidW5uYW1lZFwifWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2F2ZShbXG4gICAgICBrZWVwYWxpdmVFbmFibGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBzYXZlUGFyYW1zXG4gICAgICAgIDogeyAuLi5zYXZlUGFyYW1zLCBrZWVwYWxpdmVfZW5hYmxlZDoga2VlcGFsaXZlRW5hYmxlZCB9LFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOyduOymnSDsgqzrp53snYQg7ZWcIOuyiOunjCDquLDroZ3tlZjqs6AsIOuLpOuluCDtmZzshLEg7Yag7YGw7J20IOyeiOycvOuptCDrnbzsmrDtjIXsl5DshJzrj4Qg7KCc7Jm47ZWc64ukLlxuICAgKiDrp4jsp4Drp4kg7Zmc7ISxIO2GoO2BsOydgCBzeXN0ZW1pYyDsnqXslaAg7JWI7KCE7YyQIOuVjOusuOyXkCBhY3RpdmUg7IOB7YOc66W8IOycoOyngO2VmOuQmCDsnqzroZzqt7jsnbhcbiAgICog7ZWE7JqUIOyDge2DnOuKlCDquLDroZ3tlZzri6QuIGBtYXJrZWRg6rCAIOqzteycoCBEQiDsnbjsiqTthLTsiqTrk6TsnZgg7JWM66a8IOuwnOyGoSDqsozsnbTtirjri6QuXG4gICAqL1xuICBhc3luYyBtYXJrUmVhdXRoUmVxdWlyZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBleHBlY3RlZENyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWxzLFxuICApOiBQcm9taXNlPHsgbWFya2VkOiBib29sZWFuOyBrZXB0QXNMYXN0QWN0aXZlOiBib29sZWFuOyBzdGFsZUNyZWRlbnRpYWxzOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0cnhcbiAgICAgICAgLmZyb20oXCJ0b2tlbnNcIilcbiAgICAgICAgLnNlbGVjdCh7XG4gICAgICAgICAgcHJvdmlkZXI6IFwicHJvdmlkZXJcIixcbiAgICAgICAgICBjcmVkZW50aWFsczogXCJjcmVkZW50aWFsc1wiLFxuICAgICAgICAgIHJlYXV0aF9yZXF1aXJlZDogXCJyZWF1dGhfcmVxdWlyZWRcIixcbiAgICAgICAgfSlcbiAgICAgICAgLndoZXJlKFwiaWRcIiwgaWQpXG4gICAgICAgIC5mb3JVcGRhdGUoKVxuICAgICAgICAuZmlyc3QoKTtcbiAgICAgIGlmICghdG9rZW4gfHwgdG9rZW4ucmVhdXRoX3JlcXVpcmVkKSB7XG4gICAgICAgIHJldHVybiB7IG1hcmtlZDogZmFsc2UsIGtlcHRBc0xhc3RBY3RpdmU6IGZhbHNlLCBzdGFsZUNyZWRlbnRpYWxzOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgaWYgKCFpc0RlZXBTdHJpY3RFcXVhbCh0b2tlbi5jcmVkZW50aWFscywgZXhwZWN0ZWRDcmVkZW50aWFscykpIHtcbiAgICAgICAgcmV0dXJuIHsgbWFya2VkOiBmYWxzZSwga2VwdEFzTGFzdEFjdGl2ZTogZmFsc2UsIHN0YWxlQ3JlZGVudGlhbHM6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdHJ4LmtuZXgucmF3KFwiU0VMRUNUIHBnX2Fkdmlzb3J5X3hhY3RfbG9jayg/LCBoYXNodGV4dCg/KSlcIiwgW1xuICAgICAgICBUT0tFTl9BVVRIX0RFQVRIX0xPQ0tfQ0xBU1NfSUQsXG4gICAgICAgIHRva2VuLnByb3ZpZGVyLFxuICAgICAgXSk7XG4gICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdHJ4LmtuZXgucmF3PHsgcm93czogeyBhY3RpdmU6IGJvb2xlYW4gfVtdIH0+KFxuICAgICAgICBgVVBEQVRFIHRva2Vuc1xuICAgICAgICAgU0VUIHJlYXV0aF9yZXF1aXJlZCA9IHRydWUsXG4gICAgICAgICAgICAgYWN0aXZlID0gQ0FTRVxuICAgICAgICAgICAgICAgV0hFTiBhY3RpdmUgQU5EIChTRUxFQ1QgY291bnQoKikgRlJPTSB0b2tlbnMgcGVlclxuICAgICAgICAgICAgICAgICBXSEVSRSBwZWVyLnByb3ZpZGVyID0gdG9rZW5zLnByb3ZpZGVyIEFORCBwZWVyLmFjdGl2ZSkgPiAxXG4gICAgICAgICAgICAgICBUSEVOIGZhbHNlXG4gICAgICAgICAgICAgICBFTFNFIGFjdGl2ZVxuICAgICAgICAgICAgIEVORFxuICAgICAgICAgV0hFUkUgaWQgPSA/IEFORCByZWF1dGhfcmVxdWlyZWQgPSBmYWxzZVxuICAgICAgICAgUkVUVVJOSU5HIGFjdGl2ZWAsXG4gICAgICAgIFtpZF0sXG4gICAgICApO1xuICAgICAgY29uc3QgbWFya2VkID0gdXBkYXRlZC5yb3dzWzBdO1xuICAgICAgaWYgKCFtYXJrZWQpIHJldHVybiB7IG1hcmtlZDogZmFsc2UsIGtlcHRBc0xhc3RBY3RpdmU6IGZhbHNlLCBzdGFsZUNyZWRlbnRpYWxzOiBmYWxzZSB9O1xuXG4gICAgICBpZiAobWFya2VkLmFjdGl2ZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYHJlZnVzaW5nIHRvIGF1dG8tZGVhY3RpdmF0ZSB0b2tlbiAke2lkfTogbGFzdCBhY3RpdmUgcHJvdmlkZXIgdG9rZW4g4oCUIGAgK1xuICAgICAgICAgICAgYHN5c3RlbWljIHJlZnJlc2ggZmFpbHVyZSBzdXNwZWN0ZWQsIGtlZXBpbmcgdGhlIHBvb2wgbm9uLWVtcHR5YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG1hcmtlZDogdHJ1ZSwga2VwdEFzTGFzdEFjdGl2ZTogbWFya2VkLmFjdGl2ZSwgc3RhbGVDcmVkZW50aWFsczogZmFsc2UgfTtcbiAgICB9KTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZW9yZGVyKGlkczogbnVtYmVyW10pOiBQcm9taXNlPHsgZG9uZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXdhaXQgdHJ4LnRhYmxlKFwidG9rZW5zXCIpLndoZXJlKFwiaWRcIiwgaWRzW2ldISkudXBkYXRlKHsgb3JkOiBpIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7IGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBkZWwoaWRzOiBudW1iZXJbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC50YWJsZShcInRva2Vuc1wiKS53aGVyZUluKFwidG9rZW5zLmlkXCIsIGlkcykuZGVsZXRlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlkcy5sZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFRva2VuTW9kZWwgPSBuZXcgVG9rZW5Nb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBa0JBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxPQUFPLENBQUM7QUFFM0MsTUFBTSwwQkFBMEI7QUFDaEMsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxpQ0FBaUM7QUFTdkMsU0FBUyxvQkFBb0IsSUFBc0M7Q0FDakUsSUFBSSxHQUFHLE9BQU8sUUFBVyxPQUFPO0NBQ2hDLE9BQU87RUFDTCxHQUFHO0VBQ0gsR0FBSSxHQUFHLG9CQUFvQixTQUFZLEVBQUUsaUJBQWlCLHdCQUF3QixJQUFJLENBQUM7RUFDdkYsR0FBSSxHQUFHLFdBQVcsU0FBWSxFQUFFLFFBQVEsZUFBZSxJQUFJLENBQUM7Q0FDOUQ7QUFDRjtBQUVBLElBQU0sa0JBQU4sY0FBOEIsZUFLNUI7Q0FDQSxjQUFjO0VBQ1osTUFBTSxTQUFTLG9CQUFvQixrQkFB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
306
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4ubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRGVlcFN0cmljdEVxdWFsIH0gZnJvbSBcIm5vZGU6dXRpbFwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHtcbiAgYXBpLFxuICBhc0FycmF5LFxuICBCYWRSZXF1ZXN0RXhjZXB0aW9uLFxuICBCYXNlTW9kZWxDbGFzcyxcbiAgZXhoYXVzdGl2ZSxcbiAgdHlwZSBMaXN0UmVzdWx0LFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbn0gZnJvbSBcInNvbmFtdVwiO1xuXG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi8uLi9pMThuL3NkLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEtleSwgdHlwZSBUb2tlblN1YnNldE1hcHBpbmcgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgdG9rZW5Mb2FkZXJRdWVyaWVzLCB0b2tlblN1YnNldFF1ZXJpZXMgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZC5zc29cIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5DcmVkZW50aWFscywgdHlwZSBUb2tlbkxpc3RQYXJhbXMsIHR5cGUgVG9rZW5TYXZlUGFyYW1zIH0gZnJvbSBcIi4vdG9rZW4udHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9rZW5cIl0pO1xuXG5jb25zdCBERUZBVUxUX1FVT1RBX1RIUkVTSE9MRCA9IDgwO1xuY29uc3QgREVGQVVMVF9XRUlHSFQgPSAxO1xuY29uc3QgVE9LRU5fQVVUSF9ERUFUSF9MT0NLX0NMQVNTX0lEID0gNzE5O1xuXG5leHBvcnQgdHlwZSBUb2tlblVwZGF0ZUZpZWxkcyA9IHtcbiAgbmFtZT86IHN0cmluZztcbiAgcXVvdGFfdGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0PzogbnVtYmVyO1xuICBrZWVwYWxpdmVfZW5hYmxlZD86IGJvb2xlYW47XG59O1xuXG5mdW5jdGlvbiBhcHBseUNyZWF0ZURlZmF1bHRzKHNwOiBUb2tlblNhdmVQYXJhbXMpOiBUb2tlblNhdmVQYXJhbXMge1xuICBpZiAoc3AuaWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHNwO1xuICByZXR1cm4ge1xuICAgIC4uLnNwLFxuICAgIC4uLihzcC5xdW90YV90aHJlc2hvbGQgPT09IHVuZGVmaW5lZCA/IHsgcXVvdGFfdGhyZXNob2xkOiBERUZBVUxUX1FVT1RBX1RIUkVTSE9MRCB9IDoge30pLFxuICAgIC4uLihzcC53ZWlnaHQgPT09IHVuZGVmaW5lZCA/IHsgd2VpZ2h0OiBERUZBVUxUX1dFSUdIVCB9IDoge30pLFxuICB9O1xufVxuXG5jbGFzcyBUb2tlbk1vZGVsQ2xhc3MgZXh0ZW5kcyBCYXNlTW9kZWxDbGFzczxcbiAgVG9rZW5TdWJzZXRLZXksXG4gIFRva2VuU3Vic2V0TWFwcGluZyxcbiAgdHlwZW9mIHRva2VuU3Vic2V0UXVlcmllcyxcbiAgdHlwZW9mIHRva2VuTG9hZGVyUXVlcmllc1xuPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiVG9rZW5cIiwgdG9rZW5TdWJzZXRRdWVyaWVzLCB0b2tlbkxvYWRlclF1ZXJpZXMpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJUb2tlblwiIH0pXG4gIGFzeW5jIGZpbmRCeUlkPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oc3Vic2V0OiBULCBpZDogbnVtYmVyKTogUHJvbWlzZTxUb2tlblN1YnNldE1hcHBpbmdbVF0+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7IGlkLCBudW06IDEsIHBhZ2U6IDEgfSk7XG4gICAgaWYgKCFyb3dzWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5lbnRpdHlOb3RGb3VuZFwiKShcIlRva2VuXCIsIGlkKSk7XG4gICAgfVxuICAgIHJldHVybiByb3dzWzBdO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZTxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBsaXN0UGFyYW1zOiBUb2tlbkxpc3RQYXJhbXMsXG4gICk6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHsgLi4ubGlzdFBhcmFtcywgbnVtOiAxLCBwYWdlOiAxIH0pO1xuICAgIHJldHVybiByb3dzWzBdID8/IG51bGw7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSwgcmVzb3VyY2VOYW1lOiBcIlRva2Vuc1wiIH0pXG4gIGFzeW5jIGZpbmRNYW55PFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleSwgTFAgZXh0ZW5kcyBUb2tlbkxpc3RQYXJhbXM+KFxuICAgIHN1YnNldDogVCxcbiAgICByYXdQYXJhbXM/OiBMUCxcbiAgKTogUHJvbWlzZTxMaXN0UmVzdWx0PExQLCBUb2tlblN1YnNldE1hcHBpbmdbVF0+PiB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbnVtOiAyNCxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2g6IFwiaWRcIiBhcyBjb25zdCxcbiAgICAgIG9yZGVyQnk6IFwib3JkLWFzY1wiIGFzIGNvbnN0LFxuICAgICAgLi4ucmF3UGFyYW1zLFxuICAgIH0gc2F0aXNmaWVzIFRva2VuTGlzdFBhcmFtcztcblxuICAgIGNvbnN0IHsgcWIsIG9uU3Vic2V0OiBfIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcblxuICAgIGlmIChwYXJhbXMuaWQpIHtcbiAgICAgIHFiLndoZXJlSW4oXCJ0b2tlbnMuaWRcIiwgYXNBcnJheShwYXJhbXMuaWQpKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNlYXJjaCAmJiBwYXJhbXMua2V5d29yZCAmJiBwYXJhbXMua2V5d29yZC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJpZFwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwidG9rZW5zLmlkXCIsIE51bWJlcihwYXJhbXMua2V5d29yZCkpO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2VhcmNoID09PSBcIm5hbWVcIikge1xuICAgICAgICBxYi53aGVyZShcInRva2Vucy5uYW1lXCIsIFwibGlrZVwiLCBgJSR7cGFyYW1zLmtleXdvcmR9JWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci51bmtub3duU2VhcmNoRmllbGRcIikocGFyYW1zLnNlYXJjaCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMub3JkZXJCeSkge1xuICAgICAgaWYgKHBhcmFtcy5vcmRlckJ5ID09PSBcImlkLWRlc2NcIikge1xuICAgICAgICBxYi5vcmRlckJ5KFwidG9rZW5zLmlkXCIsIFwiZGVzY1wiKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLm9yZGVyQnkgPT09IFwib3JkLWFzY1wiKSB7XG4gICAgICAgIHFiLm9yZGVyQnkoXCJ0b2tlbnMub3JkXCIsIFwiYXNjXCIpO1xuICAgICAgICBxYi5vcmRlckJ5KFwidG9rZW5zLmlkXCIsIFwiYXNjXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhoYXVzdGl2ZShwYXJhbXMub3JkZXJCeSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoe1xuICAgICAgQTogKHJvdykgPT4gKHsgLi4ucm93IH0pLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHsgc3Vic2V0LCBxYiwgcGFyYW1zLCBlbmhhbmNlcnMsIGRlYnVnOiBmYWxzZSB9KTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRCeUFjY291bnRJZGVudGlmaWVyPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgYWNjb3VudElkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdW10+IHtcbiAgICBjb25zdCB7IHFiIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcbiAgICBxYi53aGVyZShcInRva2Vucy5wcm92aWRlclwiLCBwcm92aWRlcik7XG4gICAgY29uc3QganNvbktleSA9IHByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiID8gXCJhY2NvdW50VXVpZFwiIDogXCJhY2NvdW50SWRcIjtcbiAgICBxYi53aGVyZVJhdyhgdG9rZW5zLmNyZWRlbnRpYWxzLT4+JyR7anNvbktleX0nID0gP2AsIFthY2NvdW50SWRdKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIGFzeW5jIGZpbmRBY3RpdmVCeVByb3ZpZGVyPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdW10+IHtcbiAgICBjb25zdCB7IHFiIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcbiAgICBxYi53aGVyZShcInRva2Vucy5hY3RpdmVcIiwgdHJ1ZSk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMucHJvdmlkZXJcIiwgcHJvdmlkZXIpO1xuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHsgQTogKHJvdykgPT4gKHsgLi4ucm93IH0pIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHtcbiAgICAgIHN1YnNldCxcbiAgICAgIHFiLFxuICAgICAgcGFyYW1zOiB7IG51bTogMTAwLCBwYWdlOiAxIH0sXG4gICAgICBlbmhhbmNlcnMsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xuICB9XG5cbiAgYXN5bmMgZmluZEFjdGl2ZUJ5UHJvdmlkZXJBbmROYW1lPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHsgcWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLmFjdGl2ZVwiLCB0cnVlKTtcbiAgICBxYi53aGVyZShcInRva2Vucy5wcm92aWRlclwiLCBwcm92aWRlcik7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMubmFtZVwiLCBuYW1lKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEsIHBhZ2U6IDEgfSxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3NbMF07XG4gIH1cblxuICAvKiog7Iuk7KCcIOyduOymnSDrp4zro4zqsIAg7ZmV7J2464+8IOyerOuhnOq3uOyduOydtCDtlYTsmpTtlZwg7Yag7YGw65OkLiDsiJjrj5kg67mE7Zmc7ISx7ZmU64qUIOygnOyZuO2VnOuLpC4gKi9cbiAgYXN5bmMgZmluZFJlYXV0aFJlcXVpcmVkPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oc3Vic2V0OiBUKTogUHJvbWlzZTxUb2tlblN1YnNldE1hcHBpbmdbVF1bXT4ge1xuICAgIGNvbnN0IHsgcWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLnJlYXV0aF9yZXF1aXJlZFwiLCB0cnVlKTtcbiAgICBxYi5vcmRlckJ5KFwidG9rZW5zLm5hbWVcIiwgXCJhc2NcIik7XG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoeyBBOiAocm93KSA9PiAoeyAuLi5yb3cgfSkgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXM6IHsgbnVtOiAxMDAsIHBhZ2U6IDEgfSxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gIH1cblxuICBhc3luYyBmaW5kQWN0aXZlPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oc3Vic2V0OiBUKTogUHJvbWlzZTxUb2tlblN1YnNldE1hcHBpbmdbVF1bXT4ge1xuICAgIGNvbnN0IHsgcWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLmFjdGl2ZVwiLCB0cnVlKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIGFzeW5jIHNhdmUoc3BhOiBUb2tlblNhdmVQYXJhbXNbXSk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCJ0b2tlbnNcIiwgYXBwbHlDcmVhdGVEZWZhdWx0cyhzcCkpO1xuICAgIH0pO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC51YlVwc2VydChcInRva2Vuc1wiKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUZpZWxkcyhpZDogbnVtYmVyLCBmaWVsZHM6IFRva2VuVXBkYXRlRmllbGRzKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oKHRyeCkgPT4gdHJ4LnRhYmxlKFwidG9rZW5zXCIpLndoZXJlKFwiaWRcIiwgaWQpLnVwZGF0ZShmaWVsZHMpKTtcbiAgfVxuXG4gIGFzeW5jIHRvZ2dsZUFjdGl2ZShpZDogbnVtYmVyKTogUHJvbWlzZTx7IGFjdGl2ZTogYm9vbGVhbjsgcmVhdXRoUmVxdWlyZWQ6IGJvb2xlYW4gfSB8IG51bGw+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0cnhcbiAgICAgICAgLmZyb20oXCJ0b2tlbnNcIilcbiAgICAgICAgLnNlbGVjdCh7IGFjdGl2ZTogXCJhY3RpdmVcIiwgcmVhdXRoX3JlcXVpcmVkOiBcInJlYXV0aF9yZXF1aXJlZFwiIH0pXG4gICAgICAgIC53aGVyZShcImlkXCIsIGlkKVxuICAgICAgICAuZm9yVXBkYXRlKClcbiAgICAgICAgLmZpcnN0KCk7XG4gICAgICBpZiAoIXRva2VuKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmICghdG9rZW4uYWN0aXZlICYmIHRva2VuLnJlYXV0aF9yZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCByZWF1dGhSZXF1aXJlZDogdHJ1ZSB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY3RpdmUgPSAhdG9rZW4uYWN0aXZlO1xuICAgICAgYXdhaXQgdHJ4LmZyb20oXCJ0b2tlbnNcIikud2hlcmUoXCJpZFwiLCBpZCkudXBkYXRlKHsgYWN0aXZlIH0pO1xuICAgICAgcmV0dXJuIHsgYWN0aXZlLCByZWF1dGhSZXF1aXJlZDogZmFsc2UgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDqsJnsnYAg6rOE7KCV7J2YIOq4sOyhtCDthqDtgbDsnYQg7KeA7Jqw6rOgIOyDiOuhnCDsoIDsnqXtlZzri6Qo66Gc6re47J24wrfsnqzroZzqt7jsnbgg6rO17Ya1IOqyveuhnCkuXG4gICAqXG4gICAqIHByb3ZpZGVyIOydkeuLteyXkCDqs4TsoJUg7Iud67OE7J6Q6rCAIOyXhuycvOuptCBkZWR1cCDsnpDssrTqsIAg67aI6rCA64ql7ZWY66+A66GcIOqyveqzoOunjCDrgqjquLDqs6BcbiAgICog7KSR67O1IOygnOqxsCDsl4bsnbQg7KCA7J6l7ZWc64ukKOyjveydgCByb3cg6rCAIOuCqOuKlOuLpCkuXG4gICAqL1xuICBhc3luYyByZXBsYWNlQnlBY2NvdW50KFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgYWNjb3VudElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc2F2ZVBhcmFtczogVG9rZW5TYXZlUGFyYW1zLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2VlcGFsaXZlRW5hYmxlZCA9IHNhdmVQYXJhbXMua2VlcGFsaXZlX2VuYWJsZWQ7XG4gICAgaWYgKGFjY291bnRJZCkge1xuICAgICAgY29uc3Qgb2xkRW50cmllcyA9IGF3YWl0IHRoaXMuZmluZEJ5QWNjb3VudElkZW50aWZpZXIoXCJBXCIsIHByb3ZpZGVyLCBhY2NvdW50SWQpO1xuICAgICAgaWYgKGtlZXBhbGl2ZUVuYWJsZWQgPT09IHVuZGVmaW5lZCAmJiBvbGRFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAga2VlcGFsaXZlRW5hYmxlZCA9IG9sZEVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmtlZXBhbGl2ZV9lbmFibGVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRFbnRyaWVzLmxlbmd0aCA+IDApIGF3YWl0IHRoaXMuZGVsKG9sZEVudHJpZXMubWFwKChvKSA9PiBvLmlkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgJHtwcm92aWRlcn0gbG9naW4gd2l0aG91dCBhY2NvdW50IGlkZW50aWZpZXI6IGRlZHVwIHNraXBwZWQgZm9yICR7c2F2ZVBhcmFtcy5uYW1lID8/IFwidW5uYW1lZFwifWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2F2ZShbXG4gICAgICBrZWVwYWxpdmVFbmFibGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBzYXZlUGFyYW1zXG4gICAgICAgIDogeyAuLi5zYXZlUGFyYW1zLCBrZWVwYWxpdmVfZW5hYmxlZDoga2VlcGFsaXZlRW5hYmxlZCB9LFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBjb25maXJtZWQgZXhwaXJ5IGFuZCByZW1vdmUgdGhlIHRva2VuIGZyb20gcm91dGluZyBhdG9taWNhbGx5LlxuICAgKiBUaGUgbGFzdCBhY3RpdmUgdG9rZW4gaXMgYWxzbyBkZWFjdGl2YXRlZDsgaXRzIG5vdGlmaWNhdGlvbiBpcyB1cmdlbnQuXG4gICAqL1xuICBhc3luYyBtYXJrUmVhdXRoUmVxdWlyZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBleHBlY3RlZENyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWxzLFxuICApOiBQcm9taXNlPHsgbWFya2VkOiBib29sZWFuOyB3YXNMYXN0QWN0aXZlOiBib29sZWFuOyBzdGFsZUNyZWRlbnRpYWxzOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0cnhcbiAgICAgICAgLmZyb20oXCJ0b2tlbnNcIilcbiAgICAgICAgLnNlbGVjdCh7XG4gICAgICAgICAgcHJvdmlkZXI6IFwicHJvdmlkZXJcIixcbiAgICAgICAgICBjcmVkZW50aWFsczogXCJjcmVkZW50aWFsc1wiLFxuICAgICAgICAgIHJlYXV0aF9yZXF1aXJlZDogXCJyZWF1dGhfcmVxdWlyZWRcIixcbiAgICAgICAgfSlcbiAgICAgICAgLndoZXJlKFwiaWRcIiwgaWQpXG4gICAgICAgIC5mb3JVcGRhdGUoKVxuICAgICAgICAuZmlyc3QoKTtcbiAgICAgIGlmICghdG9rZW4gfHwgdG9rZW4ucmVhdXRoX3JlcXVpcmVkKSB7XG4gICAgICAgIHJldHVybiB7IG1hcmtlZDogZmFsc2UsIHdhc0xhc3RBY3RpdmU6IGZhbHNlLCBzdGFsZUNyZWRlbnRpYWxzOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgaWYgKCFpc0RlZXBTdHJpY3RFcXVhbCh0b2tlbi5jcmVkZW50aWFscywgZXhwZWN0ZWRDcmVkZW50aWFscykpIHtcbiAgICAgICAgcmV0dXJuIHsgbWFya2VkOiBmYWxzZSwgd2FzTGFzdEFjdGl2ZTogZmFsc2UsIHN0YWxlQ3JlZGVudGlhbHM6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdHJ4LmtuZXgucmF3KFwiU0VMRUNUIHBnX2Fkdmlzb3J5X3hhY3RfbG9jayg/LCBoYXNodGV4dCg/KSlcIiwgW1xuICAgICAgICBUT0tFTl9BVVRIX0RFQVRIX0xPQ0tfQ0xBU1NfSUQsXG4gICAgICAgIHRva2VuLnByb3ZpZGVyLFxuICAgICAgXSk7XG4gICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdHJ4LmtuZXgucmF3PHsgcm93czogeyB3YXNfbGFzdF9hY3RpdmU6IGJvb2xlYW4gfVtdIH0+KFxuICAgICAgICBgV0lUSCBwcmV2aW91cyBBUyAoXG4gICAgICAgICAgIFNFTEVDVCBhY3RpdmUgQU5EIE5PVCBFWElTVFMgKFxuICAgICAgICAgICAgIFNFTEVDVCAxIEZST00gdG9rZW5zIHBlZXJcbiAgICAgICAgICAgICBXSEVSRSBwZWVyLnByb3ZpZGVyID0gdG9rZW5zLnByb3ZpZGVyIEFORCBwZWVyLmFjdGl2ZVxuICAgICAgICAgICAgICAgQU5EIE5PVCBwZWVyLnJlYXV0aF9yZXF1aXJlZCBBTkQgcGVlci5pZCA8PiB0b2tlbnMuaWRcbiAgICAgICAgICAgKSBBUyB3YXNfbGFzdF9hY3RpdmUgRlJPTSB0b2tlbnMgV0hFUkUgaWQgPSA/XG4gICAgICAgICApXG4gICAgICAgICBVUERBVEUgdG9rZW5zXG4gICAgICAgICBTRVQgcmVhdXRoX3JlcXVpcmVkID0gdHJ1ZSxcbiAgICAgICAgICAgICBhY3RpdmUgPSBmYWxzZVxuICAgICAgICAgV0hFUkUgaWQgPSA/IEFORCByZWF1dGhfcmVxdWlyZWQgPSBmYWxzZVxuICAgICAgICAgUkVUVVJOSU5HIChTRUxFQ1Qgd2FzX2xhc3RfYWN0aXZlIEZST00gcHJldmlvdXMpIEFTIHdhc19sYXN0X2FjdGl2ZWAsXG4gICAgICAgIFtpZCwgaWRdLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1hcmtlZCA9IHVwZGF0ZWQucm93c1swXTtcbiAgICAgIGlmICghbWFya2VkKSByZXR1cm4geyBtYXJrZWQ6IGZhbHNlLCB3YXNMYXN0QWN0aXZlOiBmYWxzZSwgc3RhbGVDcmVkZW50aWFsczogZmFsc2UgfTtcblxuICAgICAgaWYgKG1hcmtlZC53YXNfbGFzdF9hY3RpdmUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBkZWFjdGl2YXRlZCBleHBpcmVkIHRva2VuICR7aWR9OiBubyB1c2FibGUgcHJvdmlkZXIgdG9rZW5zIHJlbWFpbmApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbWFya2VkOiB0cnVlLCB3YXNMYXN0QWN0aXZlOiBtYXJrZWQud2FzX2xhc3RfYWN0aXZlLCBzdGFsZUNyZWRlbnRpYWxzOiBmYWxzZSB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlcGFpciByb3dzIHJldGFpbmVkIGJ5IHRoZSBmb3JtZXIgbGFzdC1hY3RpdmUgZXhjZXB0aW9uIGJlZm9yZSBwb29sIHJlY29uY2lsaWF0aW9uLiAqL1xuICBhc3luYyBkZWFjdGl2YXRlRXhwaXJlZFRva2VucygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmdldFB1cmkoXCJ3XCIpXG4gICAgICAudGFibGUoXCJ0b2tlbnNcIilcbiAgICAgIC53aGVyZShcInJlYXV0aF9yZXF1aXJlZFwiLCB0cnVlKVxuICAgICAgLndoZXJlKFwiYWN0aXZlXCIsIHRydWUpXG4gICAgICAudXBkYXRlKHsgYWN0aXZlOiBmYWxzZSB9KTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZW9yZGVyKGlkczogbnVtYmVyW10pOiBQcm9taXNlPHsgZG9uZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXdhaXQgdHJ4LnRhYmxlKFwidG9rZW5zXCIpLndoZXJlKFwiaWRcIiwgaWRzW2ldISkudXBkYXRlKHsgb3JkOiBpIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7IGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBkZWwoaWRzOiBudW1iZXJbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC50YWJsZShcInRva2Vuc1wiKS53aGVyZUluKFwidG9rZW5zLmlkXCIsIGlkcykuZGVsZXRlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlkcy5sZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFRva2VuTW9kZWwgPSBuZXcgVG9rZW5Nb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBa0JBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxPQUFPLENBQUM7QUFFM0MsTUFBTSwwQkFBMEI7QUFDaEMsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxpQ0FBaUM7QUFTdkMsU0FBUyxvQkFBb0IsSUFBc0M7Q0FDakUsSUFBSSxHQUFHLE9BQU8sUUFBVyxPQUFPO0NB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
@@ -22,7 +22,7 @@ const MIGRATION_FILE_RE = /^\d{14}_.+\.ts$/;
22
22
  function createStartupMigrationSource(dirs) {
23
23
  return {
24
24
  async getMigrations() {
25
- return (await readdir(dirs.sourceDir)).filter((name) => MIGRATION_FILE_RE.test(name) && !name.endsWith(".d.ts")).sort();
25
+ return (await readdir(dirs.sourceDir)).filter((name) => MIGRATION_FILE_RE.test(name) && !name.endsWith(".d.ts")).toSorted();
26
26
  },
27
27
  getMigrationName(name) {
28
28
  return name;
@@ -40,17 +40,20 @@ function createStartupMigrationSource(dirs) {
40
40
  }
41
41
  };
42
42
  }
43
- async function runRequiredMigrations(dirs = resolveStartupMigrationDirs()) {
43
+ async function runRequiredMigrations(dirs = resolveStartupMigrationDirs(), deps = {
44
+ getKnex: () => TokenModel.getDB("w"),
45
+ exit: process.exit
46
+ }) {
44
47
  const log = getLogger(["qgrid", "startup"]);
45
48
  try {
46
- const [batch, migrations] = await TokenModel.getDB("w").migrate.latest({ migrationSource: createStartupMigrationSource(dirs) });
49
+ const [batch, migrations] = await deps.getKnex().migrate.latest({ migrationSource: createStartupMigrationSource(dirs) });
47
50
  if (migrations.length > 0) log.info(`migration: ${migrations.length} applied (batch ${batch})`);
48
51
  } catch (error) {
49
52
  log.error(`migration failed: ${error.message}`);
50
- process.exit(1);
53
+ deps.exit(1);
51
54
  }
52
55
  }
53
56
  //#endregion
54
57
  export { createStartupMigrationSource, resolveStartupMigrationDirs, runRequiredMigrations };
55
58
 
56
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnR1cC1taWdyYXRpb25zLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGFydHVwLW1pZ3JhdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyByZWFkZGlyIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi5tb2RlbFwiO1xuXG5leHBvcnQgdHlwZSBTdGFydHVwTWlncmF0aW9uRGlycyA9IHtcbiAgLyoqIFNvbmFtdSDqsIAgbWlncmF0aW9uIOydhCDsg53shLHCt+q4sOuhne2VmOuKlCDsm5Drs7gg65SU66CJ7YSw66asLiBga25leF9taWdyYXRpb25zLm5hbWVgIOydgCDsnbQg7YyM7J2866qFKGAudHNgKeydtOuLpC4gKi9cbiAgc291cmNlRGlyOiBzdHJpbmc7XG4gIC8qKiDruYzrk5wg7IKw7Lac66y8IOuUlOugie2EsOumrC4gZGlzdCDsl5DshJwg7Iuk7ZaJIOykkeydtOuptCDqsJnsnYAg7J2066aE7J2YIGAuanNgIOqwgCDsl6zquLAg7J6I64ukLiAqL1xuICBjb21waWxlZERpcjogc3RyaW5nO1xufTtcblxuLy8gaW1wb3J0Lm1ldGEuZGlybmFtZSDsnYAg7IaM7IqkIOyLpO2WiSh0cyBsb2FkZXIp7JeQ7ISc64qUIGBzcmMvYCwg7Yyo7YKk7KeA65CcIENMSSDsl5DshJzripQgYGJ1bmRsZS9kaXN0L2Ag64ukLlxuLy8g65GQIOqyveyasCDrqqjrkZAgYC4uL3NyYy9taWdyYXRpb25zYCDqsIAg7J2066aE7J2YIOygleuzuOydtOqzoCBgLi9taWdyYXRpb25zYCDqsIAg7Lu07YyM7J28IOyCsOy2nOusvCDsnITsuZjri6QuXG4vLyDshozsiqQg7Iuk7ZaJ7JeQ7ISc64qUIOuRmOydtCDqsJnsnYAg65SU66CJ7YSw66as6528IOy7tO2MjOydvCDtjIzsnbzsnbQg7JeG6rOgLCBgLnRzYCDrpbwgbG9hZGVyIOqwgCDsp4HsoJEg7J2964qU64ukLlxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTdGFydHVwTWlncmF0aW9uRGlycyhcbiAgbW9kdWxlRGlyOiBzdHJpbmcgPSBpbXBvcnQubWV0YS5kaXJuYW1lLFxuKTogU3RhcnR1cE1pZ3JhdGlvbkRpcnMge1xuICByZXR1cm4ge1xuICAgIHNvdXJjZURpcjogcGF0aC5qb2luKG1vZHVsZURpciwgXCIuLi9zcmMvbWlncmF0aW9uc1wiKSxcbiAgICBjb21waWxlZERpcjogcGF0aC5qb2luKG1vZHVsZURpciwgXCJtaWdyYXRpb25zXCIpLFxuICB9O1xufVxuXG4vLyBTb25hbXUg6rCAIOunjOuTnOuKlCDtjIzsnbzrqoUg6rec7LmZOiBgWVlZWU1NRERISG1tc3NfPHRpdGxlPi50c2AuIO2DgOyehSDshKDslrjsnbTrgpggUkVBRE1FIOuKlCDsoJzsmbjtlZzri6QuXG5jb25zdCBNSUdSQVRJT05fRklMRV9SRSA9IC9eXFxkezE0fV8uK1xcLnRzJC87XG5cbnR5cGUgTWlncmF0aW9uTW9kdWxlID0ge1xuICB1cD86IChrbmV4OiBLbmV4KSA9PiBQcm9taXNlPHVua25vd24+O1xuICBkb3duPzogKGtuZXg6IEtuZXgpID0+IFByb21pc2U8dW5rbm93bj47XG59O1xuXG4vKipcbiAqIO2MqO2CpOyngOuQnCBDTEkg64qUIGBidW5kbGUvZGlzdGAg7JeQ7IScIOyLpO2WieuQmOuKlOuNsCwga25leCDquLDrs7ggRnNNaWdyYXRpb25zIOyXkCBgLi4vc3JjL21pZ3JhdGlvbnNgIOulvFxuICog64SY6riw66m0IHBlbmRpbmcgbWlncmF0aW9uIOydhCBgLnRzYCDroZwgaW1wb3J0IO2VmOuLpCBcIlVua25vd24gZmlsZSBleHRlbnNpb24gLnRzXCIg66GcIOyjveuKlOuLpCgyLjkuMCDsgqzqs6ApLlxuICog67CY64yA66GcIOuUlOugie2EsOumrOulvCBgZGlzdC9taWdyYXRpb25zYCDroZwg67CU6r6466m0IGBrbmV4X21pZ3JhdGlvbnNgIOyXkCBgLnRzYCDsnbTrpoTsnLzroZwg6riw66Gd65CcIOqzvOqxsFxuICogbWlncmF0aW9uIOydtCDsoITrtoAgcGVuZGluZyDsnLzroZwg67O07J2464ukLiDqt7jrnpjshJwg7J2066aE7J2AIGBzcmMvbWlncmF0aW9uc2Ag7J2YIGAudHNgIO2MjOydvOuqheydhCDqt7jrjIDroZxcbiAqIOyTsOqzoCwg66qo65OI66eMIOy7tO2MjOydvOuQnCBgLmpzYCDqsIAg7J6I7Jy866m0IOq3uOqyg+ydhCDroZzrk5ztlZzri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdGFydHVwTWlncmF0aW9uU291cmNlKFxuICBkaXJzOiBTdGFydHVwTWlncmF0aW9uRGlycyxcbik6IEtuZXguTWlncmF0aW9uU291cmNlPHN0cmluZz4ge1xuICByZXR1cm4ge1xuICAgIGFzeW5jIGdldE1pZ3JhdGlvbnMoKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihkaXJzLnNvdXJjZURpcik7XG4gICAgICByZXR1cm4gZW50cmllc1xuICAgICAgICAuZmlsdGVyKChuYW1lKSA9PiBNSUdSQVRJT05fRklMRV9SRS50ZXN0KG5hbWUpICYmICFuYW1lLmVuZHNXaXRoKFwiLmQudHNcIikpXG4gICAgICAgIC5zb3J0KCk7XG4gICAgfSxcbiAgICBnZXRNaWdyYXRpb25OYW1lKG5hbWUpIHtcbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH0sXG4gICAgYXN5bmMgZ2V0TWlncmF0aW9uKG5hbWUpIHtcbiAgICAgIGNvbnN0IGNvbXBpbGVkID0gcGF0aC5qb2luKGRpcnMuY29tcGlsZWREaXIsIG5hbWUucmVwbGFjZSgvXFwudHMkLywgXCIuanNcIikpO1xuICAgICAgY29uc3Qgc291cmNlID0gcGF0aC5qb2luKGRpcnMuc291cmNlRGlyLCBuYW1lKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV4aXN0c1N5bmMoY29tcGlsZWQpID8gY29tcGlsZWQgOiBzb3VyY2U7XG4gICAgICBjb25zdCBtb2R1bGUgPSAoYXdhaXQgaW1wb3J0KHBhdGhUb0ZpbGVVUkwodGFyZ2V0KS5ocmVmKSkgYXMgTWlncmF0aW9uTW9kdWxlO1xuICAgICAgaWYgKHR5cGVvZiBtb2R1bGUudXAgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1pZ3JhdGlvbiAke25hbWV9IGhhcyBubyB1cCgpIGV4cG9ydCAoJHt0YXJnZXR9KWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgdXA6IG1vZHVsZS51cCwgZG93bjogbW9kdWxlLmRvd24gPz8gKGFzeW5jICgpID0+IHVuZGVmaW5lZCkgfTtcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuUmVxdWlyZWRNaWdyYXRpb25zKFxuICBkaXJzOiBTdGFydHVwTWlncmF0aW9uRGlycyA9IHJlc29sdmVTdGFydHVwTWlncmF0aW9uRGlycygpLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGxvZyA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInN0YXJ0dXBcIl0pO1xuICB0cnkge1xuICAgIGNvbnN0IGtuZXggPSBUb2tlbk1vZGVsLmdldERCKFwid1wiKTtcbiAgICBjb25zdCBbYmF0Y2gsIG1pZ3JhdGlvbnNdID0gYXdhaXQga25leC5taWdyYXRlLmxhdGVzdCh7XG4gICAgICBtaWdyYXRpb25Tb3VyY2U6IGNyZWF0ZVN0YXJ0dXBNaWdyYXRpb25Tb3VyY2UoZGlycyksXG4gICAgfSk7XG4gICAgaWYgKG1pZ3JhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nLmluZm8oYG1pZ3JhdGlvbjogJHttaWdyYXRpb25zLmxlbmd0aH0gYXBwbGllZCAoYmF0Y2ggJHtiYXRjaH0pYCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcihgbWlncmF0aW9uIGZhaWxlZDogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFvQkEsU0FBZ0IsNEJBQ2QsWUFBb0IsT0FBTyxLQUFLLFNBQ1Y7Q0FDdEIsT0FBTztFQUNMLFdBQVcsS0FBSyxLQUFLLFdBQVcsbUJBQW1CO0VBQ25ELGFBQWEsS0FBSyxLQUFLLFdBQVcsWUFBWTtDQUNoRDtBQUNGO0FBR0EsTUFBTSxvQkFBb0I7Ozs7Ozs7O0FBYzFCLFNBQWdCLDZCQUNkLE1BQzhCO0NBQzlCLE9BQU87RUFDTCxNQUFNLGdCQUFnQjtHQUVwQixRQUFPLE1BRGUsUUFBUSxLQUFLLFNBQVMsRUFDckMsQ0FDSixRQUFRLFNBQVMsa0JBQWtCLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQ3pFLEtBQUs7RUFDVjtFQUNBLGlCQUFpQixNQUFNO0dBQ3JCLE9BQU87RUFDVDtFQUNBLE1BQU0sYUFBYSxNQUFNO0dBQ3ZCLE1BQU0sV0FBVyxLQUFLLEtBQUssS0FBSyxhQUFhLEtBQUssUUFBUSxTQUFTLEtBQUssQ0FBQztHQUN6RSxNQUFNLFNBQVMsS0FBSyxLQUFLLEtBQUssV0FBVyxJQUFJO0dBQzdDLE1BQU0sU0FBUyxXQUFXLFFBQVEsSUFBSSxXQUFXO0dBQ2pELE1BQU0sU0FBVSxNQUFNLE9BQU8sY0FBYyxNQUFNLENBQUMsQ0FBQztHQUNuRCxJQUFJLE9BQU8sT0FBTyxPQUFPLFlBQ3ZCLE1BQU0sSUFBSSxNQUFNLGFBQWEsS0FBSyx1QkFBdUIsT0FBTyxFQUFFO0dBRXBFLE9BQU87SUFBRSxJQUFJLE9BQU87SUFBSSxNQUFNLE9BQU8sU0FBUyxZQUFZO0dBQVc7RUFDdkU7Q0FDRjtBQUNGO0FBRUEsZUFBc0Isc0JBQ3BCLE9BQTZCLDRCQUE0QixHQUMxQztDQUNmLE1BQU0sTUFBTSxVQUFVLENBQUMsU0FBUyxTQUFTLENBQUM7Q0FDMUMsSUFBSTtFQUVGLE1BQU0sQ0FBQyxPQUFPLGNBQWMsTUFEZixXQUFXLE1BQU0sR0FDSSxDQUFBLENBQUssUUFBUSxPQUFPLEVBQ3BELGlCQUFpQiw2QkFBNkIsSUFBSSxFQUNwRCxDQUFDO0VBQ0QsSUFBSSxXQUFXLFNBQVMsR0FDdEIsSUFBSSxLQUFLLGNBQWMsV0FBVyxPQUFPLGtCQUFrQixNQUFNLEVBQUU7Q0FFdkUsU0FBUyxPQUFPO0VBQ2QsSUFBSSxNQUFNLHFCQUFzQixNQUFnQixTQUFTO0VBQ3pELFFBQVEsS0FBSyxDQUFDO0NBQ2hCO0FBQ0YifQ==
59
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnR1cC1taWdyYXRpb25zLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGFydHVwLW1pZ3JhdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyByZWFkZGlyIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi5tb2RlbFwiO1xuXG5leHBvcnQgdHlwZSBTdGFydHVwTWlncmF0aW9uRGlycyA9IHtcbiAgLyoqIFNvbmFtdSDqsIAgbWlncmF0aW9uIOydhCDsg53shLHCt+q4sOuhne2VmOuKlCDsm5Drs7gg65SU66CJ7YSw66asLiBga25leF9taWdyYXRpb25zLm5hbWVgIOydgCDsnbQg7YyM7J2866qFKGAudHNgKeydtOuLpC4gKi9cbiAgc291cmNlRGlyOiBzdHJpbmc7XG4gIC8qKiDruYzrk5wg7IKw7Lac66y8IOuUlOugie2EsOumrC4gZGlzdCDsl5DshJwg7Iuk7ZaJIOykkeydtOuptCDqsJnsnYAg7J2066aE7J2YIGAuanNgIOqwgCDsl6zquLAg7J6I64ukLiAqL1xuICBjb21waWxlZERpcjogc3RyaW5nO1xufTtcblxuLy8gaW1wb3J0Lm1ldGEuZGlybmFtZSDsnYAg7IaM7IqkIOyLpO2WiSh0cyBsb2FkZXIp7JeQ7ISc64qUIGBzcmMvYCwg7Yyo7YKk7KeA65CcIENMSSDsl5DshJzripQgYGJ1bmRsZS9kaXN0L2Ag64ukLlxuLy8g65GQIOqyveyasCDrqqjrkZAgYC4uL3NyYy9taWdyYXRpb25zYCDqsIAg7J2066aE7J2YIOygleuzuOydtOqzoCBgLi9taWdyYXRpb25zYCDqsIAg7Lu07YyM7J28IOyCsOy2nOusvCDsnITsuZjri6QuXG4vLyDshozsiqQg7Iuk7ZaJ7JeQ7ISc64qUIOuRmOydtCDqsJnsnYAg65SU66CJ7YSw66as6528IOy7tO2MjOydvCDtjIzsnbzsnbQg7JeG6rOgLCBgLnRzYCDrpbwgbG9hZGVyIOqwgCDsp4HsoJEg7J2964qU64ukLlxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTdGFydHVwTWlncmF0aW9uRGlycyhcbiAgbW9kdWxlRGlyOiBzdHJpbmcgPSBpbXBvcnQubWV0YS5kaXJuYW1lLFxuKTogU3RhcnR1cE1pZ3JhdGlvbkRpcnMge1xuICByZXR1cm4ge1xuICAgIHNvdXJjZURpcjogcGF0aC5qb2luKG1vZHVsZURpciwgXCIuLi9zcmMvbWlncmF0aW9uc1wiKSxcbiAgICBjb21waWxlZERpcjogcGF0aC5qb2luKG1vZHVsZURpciwgXCJtaWdyYXRpb25zXCIpLFxuICB9O1xufVxuXG4vLyBTb25hbXUg6rCAIOunjOuTnOuKlCDtjIzsnbzrqoUg6rec7LmZOiBgWVlZWU1NRERISG1tc3NfPHRpdGxlPi50c2AuIO2DgOyehSDshKDslrjsnbTrgpggUkVBRE1FIOuKlCDsoJzsmbjtlZzri6QuXG5jb25zdCBNSUdSQVRJT05fRklMRV9SRSA9IC9eXFxkezE0fV8uK1xcLnRzJC87XG5cbnR5cGUgTWlncmF0aW9uTW9kdWxlID0ge1xuICB1cD86IChrbmV4OiBLbmV4KSA9PiBQcm9taXNlPHVua25vd24+O1xuICBkb3duPzogKGtuZXg6IEtuZXgpID0+IFByb21pc2U8dW5rbm93bj47XG59O1xuXG4vKipcbiAqIO2MqO2CpOyngOuQnCBDTEkg64qUIGBidW5kbGUvZGlzdGAg7JeQ7IScIOyLpO2WieuQmOuKlOuNsCwga25leCDquLDrs7ggRnNNaWdyYXRpb25zIOyXkCBgLi4vc3JjL21pZ3JhdGlvbnNgIOulvFxuICog64SY6riw66m0IHBlbmRpbmcgbWlncmF0aW9uIOydhCBgLnRzYCDroZwgaW1wb3J0IO2VmOuLpCBcIlVua25vd24gZmlsZSBleHRlbnNpb24gLnRzXCIg66GcIOyjveuKlOuLpCgyLjkuMCDsgqzqs6ApLlxuICog67CY64yA66GcIOuUlOugie2EsOumrOulvCBgZGlzdC9taWdyYXRpb25zYCDroZwg67CU6r6466m0IGBrbmV4X21pZ3JhdGlvbnNgIOyXkCBgLnRzYCDsnbTrpoTsnLzroZwg6riw66Gd65CcIOqzvOqxsFxuICogbWlncmF0aW9uIOydtCDsoITrtoAgcGVuZGluZyDsnLzroZwg67O07J2464ukLiDqt7jrnpjshJwg7J2066aE7J2AIGBzcmMvbWlncmF0aW9uc2Ag7J2YIGAudHNgIO2MjOydvOuqheydhCDqt7jrjIDroZxcbiAqIOyTsOqzoCwg66qo65OI66eMIOy7tO2MjOydvOuQnCBgLmpzYCDqsIAg7J6I7Jy866m0IOq3uOqyg+ydhCDroZzrk5ztlZzri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdGFydHVwTWlncmF0aW9uU291cmNlKFxuICBkaXJzOiBTdGFydHVwTWlncmF0aW9uRGlycyxcbik6IEtuZXguTWlncmF0aW9uU291cmNlPHN0cmluZz4ge1xuICByZXR1cm4ge1xuICAgIGFzeW5jIGdldE1pZ3JhdGlvbnMoKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihkaXJzLnNvdXJjZURpcik7XG4gICAgICByZXR1cm4gZW50cmllc1xuICAgICAgICAuZmlsdGVyKChuYW1lKSA9PiBNSUdSQVRJT05fRklMRV9SRS50ZXN0KG5hbWUpICYmICFuYW1lLmVuZHNXaXRoKFwiLmQudHNcIikpXG4gICAgICAgIC50b1NvcnRlZCgpO1xuICAgIH0sXG4gICAgZ2V0TWlncmF0aW9uTmFtZShuYW1lKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuICAgIGFzeW5jIGdldE1pZ3JhdGlvbihuYW1lKSB7XG4gICAgICBjb25zdCBjb21waWxlZCA9IHBhdGguam9pbihkaXJzLmNvbXBpbGVkRGlyLCBuYW1lLnJlcGxhY2UoL1xcLnRzJC8sIFwiLmpzXCIpKTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHBhdGguam9pbihkaXJzLnNvdXJjZURpciwgbmFtZSk7XG4gICAgICBjb25zdCB0YXJnZXQgPSBleGlzdHNTeW5jKGNvbXBpbGVkKSA/IGNvbXBpbGVkIDogc291cmNlO1xuICAgICAgY29uc3QgbW9kdWxlID0gKGF3YWl0IGltcG9ydChwYXRoVG9GaWxlVVJMKHRhcmdldCkuaHJlZikpIGFzIE1pZ3JhdGlvbk1vZHVsZTtcbiAgICAgIGlmICh0eXBlb2YgbW9kdWxlLnVwICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtaWdyYXRpb24gJHtuYW1lfSBoYXMgbm8gdXAoKSBleHBvcnQgKCR7dGFyZ2V0fSlgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHVwOiBtb2R1bGUudXAsIGRvd246IG1vZHVsZS5kb3duID8/IChhc3luYyAoKSA9PiB1bmRlZmluZWQpIH07XG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgU3RhcnR1cE1pZ3JhdGlvbkRlcHMgPSB7XG4gIGdldEtuZXg6ICgpID0+IFBpY2s8S25leCwgXCJtaWdyYXRlXCI+O1xuICBleGl0OiAoY29kZTogbnVtYmVyKSA9PiBuZXZlcjtcbn07XG5cbi8vIO2FjOyKpO2KuOuKlCBkZXBzIOulvCDso7zsnoXtlZzri6QuIOuqqOuTiCDrqqnsnLzroZwgVG9rZW5Nb2RlbCDsnYQg67CU6r6464qUIOuwqeyLneydgCDsoITssrQg7Iqk7JyE7Yq47JeQ7IScIOuqqeydtCDsg4jrqbRcbi8vIOyLpOygnCBwcm9jZXNzLmV4aXQoMSkg7J20IHdvcmtlciDrpbwg7KO97JesIOuCqOydgCDthYzsiqTtirjqsIAg7KGw7Jqp7Z6IIHBlbmRpbmcg7Jy866GcIOu5oOynhOuLpC5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5SZXF1aXJlZE1pZ3JhdGlvbnMoXG4gIGRpcnM6IFN0YXJ0dXBNaWdyYXRpb25EaXJzID0gcmVzb2x2ZVN0YXJ0dXBNaWdyYXRpb25EaXJzKCksXG4gIGRlcHM6IFN0YXJ0dXBNaWdyYXRpb25EZXBzID0geyBnZXRLbmV4OiAoKSA9PiBUb2tlbk1vZGVsLmdldERCKFwid1wiKSwgZXhpdDogcHJvY2Vzcy5leGl0IH0sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbG9nID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3RhcnR1cFwiXSk7XG4gIHRyeSB7XG4gICAgY29uc3Qga25leCA9IGRlcHMuZ2V0S25leCgpO1xuICAgIGNvbnN0IFtiYXRjaCwgbWlncmF0aW9uc10gPSBhd2FpdCBrbmV4Lm1pZ3JhdGUubGF0ZXN0KHtcbiAgICAgIG1pZ3JhdGlvblNvdXJjZTogY3JlYXRlU3RhcnR1cE1pZ3JhdGlvblNvdXJjZShkaXJzKSxcbiAgICB9KTtcbiAgICBpZiAobWlncmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2cuaW5mbyhgbWlncmF0aW9uOiAke21pZ3JhdGlvbnMubGVuZ3RofSBhcHBsaWVkIChiYXRjaCAke2JhdGNofSlgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKGBtaWdyYXRpb24gZmFpbGVkOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICBkZXBzLmV4aXQoMSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQW9CQSxTQUFnQiw0QkFDZCxZQUFvQixPQUFPLEtBQUssU0FDVjtDQUN0QixPQUFPO0VBQ0wsV0FBVyxLQUFLLEtBQUssV0FBVyxtQkFBbUI7RUFDbkQsYUFBYSxLQUFLLEtBQUssV0FBVyxZQUFZO0NBQ2hEO0FBQ0Y7QUFHQSxNQUFNLG9CQUFvQjs7Ozs7Ozs7QUFjMUIsU0FBZ0IsNkJBQ2QsTUFDOEI7Q0FDOUIsT0FBTztFQUNMLE1BQU0sZ0JBQWdCO0dBRXBCLFFBQU8sTUFEZSxRQUFRLEtBQUssU0FBUyxFQUNyQyxDQUNKLFFBQVEsU0FBUyxrQkFBa0IsS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FDekUsU0FBUztFQUNkO0VBQ0EsaUJBQWlCLE1BQU07R0FDckIsT0FBTztFQUNUO0VBQ0EsTUFBTSxhQUFhLE1BQU07R0FDdkIsTUFBTSxXQUFXLEtBQUssS0FBSyxLQUFLLGFBQWEsS0FBSyxRQUFRLFNBQVMsS0FBSyxDQUFDO0dBQ3pFLE1BQU0sU0FBUyxLQUFLLEtBQUssS0FBSyxXQUFXLElBQUk7R0FDN0MsTUFBTSxTQUFTLFdBQVcsUUFBUSxJQUFJLFdBQVc7R0FDakQsTUFBTSxTQUFVLE1BQU0sT0FBTyxjQUFjLE1BQU0sQ0FBQyxDQUFDO0dBQ25ELElBQUksT0FBTyxPQUFPLE9BQU8sWUFDdkIsTUFBTSxJQUFJLE1BQU0sYUFBYSxLQUFLLHVCQUF1QixPQUFPLEVBQUU7R0FFcEUsT0FBTztJQUFFLElBQUksT0FBTztJQUFJLE1BQU0sT0FBTyxTQUFTLFlBQVk7R0FBVztFQUN2RTtDQUNGO0FBQ0Y7QUFTQSxlQUFzQixzQkFDcEIsT0FBNkIsNEJBQTRCLEdBQ3pELE9BQTZCO0NBQUUsZUFBZSxXQUFXLE1BQU0sR0FBRztDQUFHLE1BQU0sUUFBUTtBQUFLLEdBQ3pFO0NBQ2YsTUFBTSxNQUFNLFVBQVUsQ0FBQyxTQUFTLFNBQVMsQ0FBQztDQUMxQyxJQUFJO0VBRUYsTUFBTSxDQUFDLE9BQU8sY0FBYyxNQURmLEtBQUssUUFDZ0IsQ0FBQSxDQUFLLFFBQVEsT0FBTyxFQUNwRCxpQkFBaUIsNkJBQTZCLElBQUksRUFDcEQsQ0FBQztFQUNELElBQUksV0FBVyxTQUFTLEdBQ3RCLElBQUksS0FBSyxjQUFjLFdBQVcsT0FBTyxrQkFBa0IsTUFBTSxFQUFFO0NBRXZFLFNBQVMsT0FBTztFQUNkLElBQUksTUFBTSxxQkFBc0IsTUFBZ0IsU0FBUztFQUN6RCxLQUFLLEtBQUssQ0FBQztDQUNiO0FBQ0YifQ==
@@ -1,5 +1,6 @@
1
1
  import { ARGV_SAFE_MAX_UTF8_BYTES, assertAnthropicSchemaArgvSize } from "../common/schema-validation.js";
2
2
  import { ANTHROPIC_CLAUDE_CWD, ANTHROPIC_DISALLOWED_TOOLS, anthropicConfigDir, assertSupportedOneMillionSuffix, canonicalAnthropicModel, needsCli1mSuffix, supports1MContext, usesAdaptiveThinking } from "./anthropic-constants.js";
3
+ import { resolveAnthropicEffort } from "../common/effort.js";
3
4
  import { createTtftTracker } from "../common/ttft.js";
4
5
  import { buildStreamJsonInput, handleStreamJsonLine } from "./stream-json-adapter.js";
5
6
  import { randomUUID } from "node:crypto";
@@ -110,7 +111,7 @@ function buildClaudeArgs(opts) {
110
111
  ...systemArgs,
111
112
  ...usesAdaptiveThinking(opts.model) ? [] : ["--thinking", "disabled"],
112
113
  "--effort",
113
- opts.effort ?? "low",
114
+ resolveAnthropicEffort(opts.effort) ?? "low",
114
115
  "--disable-slash-commands",
115
116
  "--session-id",
116
117
  opts.sessionId
@@ -272,4 +273,4 @@ function runClaudeSession(req, onDelta) {
272
273
  //#endregion
273
274
  export { SYSTEM_PROMPT_ARGV_MAX_BYTES, applyOneMillionSuffix, buildClaudeArgs, decorateAndSerialize, ensureConfigDir, makeAnthropicWorkerId, oneMillionEnv, runClaudeSession, shouldPinStructuredRetries, structuredOutputRetriesEnv, thinkingEnv, withSessionLock };
274
275
 
275
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhdWRlLXNlc3Npb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvY2xhdWRlLXNlc3Npb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjbGF1ZGUtc2Vzc2lvbiDigJQgQ2xhdWRlIENMSSDshLjshZggc3Bhd24gKyBRZ3JpZFRocmVhZENvb3JkIOunpO2VkSArIHBlci1zZXNzaW9uIOudvS5cbiAqXG4gKiDrqYDti7DthLQ6IOunpCDtmLjstpwgZnJlc2ggYC0tc2Vzc2lvbi1pZCA8dXVpZD5g66GcIOyLpO2Wie2VnOuLpC4g7J6F66Cl7J2AIOyWtOuMke2EsOqwgCDrp4zrk6AgSlNPTkwg7J2EXG4gKiBzdGRpbiDsnLzroZwg7Z2Y66as6rOgKGAtLWlucHV0LWZvcm1hdCBzdHJlYW0tanNvbmApLCDstpzroKXsnYAg7YyM7ISc66GcIOyymOumrO2VnOuLpC5cbiAqXG4gKiDtlbXsi6wg6rOE7JW9OlxuICogIC0gY29vcmQg64qUIOyehOydmCDsoIDsnqXsnbQg7JWE64uI6528IOq4sOyhtCBRZ3JpZFRocmVhZENvb3Jke3dvcmtlcklkLHRocmVhZElkLGVwb2NoLHN5c3RlbUhhc2h9IOyXkFxuICogICAg66ek7ZWR7ZWc64ukLiB0aHJlYWRJZD3shLjshZggdXVpZCwgZXBvY2g9MCDqs6DsoJUod29ya2VyIHJlc3RhcnQg6rCc64WQIOyXhuydjCksIHdvcmtlcklkPXRva2VuIOq4sOuwmFxuICogICAg7JWI7KCVIO2VqeyEsSwgc3lzdGVtSGFzaD3smpTssq0gc3lzdGVtIO2VtOyLnC4gaXNzdWVDb252Q29udGV4dC9kZWNpZGVDb252Um91dGluZyDqs7wgcm91bmQtdHJpcC5cbiAqICAtIHdpdGhTZXNzaW9uTG9jayDsnYAgZXhwb3J0ZWQgcHJpbWl0aXZlIOuhnCDsnKDsp4DtlZzri6QuIOq4sOuzuCDqsr3roZzsl5DshJzripQg66ekIO2YuOy2nCDsg4ggc2Vzc2lvbi1pZCDrnbxcbiAqICAgIOyCrOyLpOyDgSBuby1jb250ZW50aW9uIOydtOyngOunjCwg7KeB7KCRIO2YuOy2nOyekC/thYzsiqTtirjsnZgg7KeB66Cs7ZmUIOuztOyepeydgCDrs7TsobTtlZzri6QuXG4gKiAgLSBzdHJlYW0tanNvbiDsp4HroKztmZQg7IucIFNESyBlbnZlbG9wZSh1dWlkL3Nlc3Npb25faWQvcGFyZW50X3Rvb2xfdXNlX2lkKSBkZWNvcmF0ZS5cbiAqICAtIHN0cnVjdHVyZWQgb3V0cHV0IOydvCDrlYwg7Lac66ClIO2MjOyEnOyXkCB7IHN0cnVjdHVyZWRPdXRwdXQ6IHRydWUgfSDsoITri6wo7JeG7Jy866m0IHN0cmVhbU9iamVjdCDquajsp5ApLlxuICovXG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgbWtkaXJTeW5jLCB1bmxpbmtTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUsIHR5cGUgVG9rZW5Vc2FnZUJyZWFrZG93biwgdHlwZSBVc2VySW5wdXQgfSBmcm9tIFwiLi4vY29tbW9uL3Byb3ZpZGVyLXR5cGVzXCI7XG5pbXBvcnQge1xuICBBUkdWX1NBRkVfTUFYX1VURjhfQllURVMsXG4gIGFzc2VydEFudGhyb3BpY1NjaGVtYUFyZ3ZTaXplLFxufSBmcm9tIFwiLi4vY29tbW9uL3NjaGVtYS12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBjcmVhdGVUdGZ0VHJhY2tlciB9IGZyb20gXCIuLi9jb21tb24vdHRmdFwiO1xuaW1wb3J0IHtcbiAgQU5USFJPUElDX0NMQVVERV9DV0QsXG4gIGFudGhyb3BpY0NvbmZpZ0RpcixcbiAgQU5USFJPUElDX0RFRkFVTFRfRUZGT1JULFxuICBBTlRIUk9QSUNfRElTQUxMT1dFRF9UT09MUyxcbiAgYXNzZXJ0U3VwcG9ydGVkT25lTWlsbGlvblN1ZmZpeCxcbiAgY2Fub25pY2FsQW50aHJvcGljTW9kZWwsXG4gIG5lZWRzQ2xpMW1TdWZmaXgsXG4gIHN1cHBvcnRzMU1Db250ZXh0LFxuICB1c2VzQWRhcHRpdmVUaGlua2luZyxcbn0gZnJvbSBcIi4vYW50aHJvcGljLWNvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgYnVpbGRTdHJlYW1Kc29uSW5wdXQsXG4gIHR5cGUgQ2xhdWRlU3RyZWFtSnNvblN0YXRlLFxuICB0eXBlIENsYXVkZVN0cmVhbUpzb25MaW5lLFxuICB0eXBlIENsYXVkZVN0cmVhbVJlc3VsdCxcbiAgaGFuZGxlU3RyZWFtSnNvbkxpbmUsXG59IGZyb20gXCIuL3N0cmVhbS1qc29uLWFkYXB0ZXJcIjtcblxuLy8g4pSA4pSAIHBlci1zZXNzaW9uIOudvSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLy8gc2Vzc2lvbi1pZCDri6jsnIQg7KeB66Cs7ZmUIHByaW1pdGl2ZS4g6riw67O4IOqyveuhnOyXkOyEnOuKlCDrp6Qg7Zi47LacIOyDiCB1dWlkIOudvCDsgqzsi6Tsg4Egbm8tb3Ag7J207KeA66eMLFxuLy8g6rCZ7J2AIHNlc3Npb24taWQg66W8IOyngeygkSDsk7DripQg7Zi47Lac7J6Q64qUIOyXrOyghO2eiCDsp4HroKztmZQg67O07J6l7J2EIOuwm+uKlOuLpC5cbmNvbnN0IHNlc3Npb25DaGFpbnMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhTZXNzaW9uTG9jazxUPihzZXNzaW9uSWQ6IHN0cmluZywgZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcHJldiA9IHNlc3Npb25DaGFpbnMuZ2V0KHNlc3Npb25JZCkgPz8gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIC8vIOydtOyghCB0dXJuIOydmCDshLHtjKjsmYAg66y06rSA7ZWY6rKMIOyngeugrCDssrTsnbjsnYQg7J6H64qU64ukLlxuICBjb25zdCBuZXh0ID0gcHJldi50aGVuKGZuLCBmbik7XG4gIC8vIHRhaWw6IOyEse2MqCDrrLTqtIAgc2V0dGxlIOuQmOuKlCDtlbjrk6QuIOydtOqxuCDrp7Xsl5Ag65GQ6rOgLCBmaW5hbGx5IOyXkOyEnCBcIuyXrOyghO2eiCDrgrTqsIAg64GdXCLsnbwg65WM66eMIOyCreygnC5cbiAgLy8gKHNldCDsp4Htm4QgdW5kZWZpbmVkIOqygOyCrOuhnCDtlZjrqbQg7KCI64yAIOyCreygnCDslYgg64+8IOyEuOyFmCBpZCDqsIAg64iE7IiY65CoIOKAlCB0YWlsIOydvOy5mCDqsoDsgqzroZwg7ZqM7ZS8LilcbiAgY29uc3QgdGFpbCA9IG5leHQudGhlbihcbiAgICAoKSA9PiB7fSxcbiAgICAoKSA9PiB7fSxcbiAgKTtcbiAgc2Vzc2lvbkNoYWlucy5zZXQoc2Vzc2lvbklkLCB0YWlsKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgbmV4dDtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyDqt7gg7IKs7J20IOuLpOuluCB0dXJuIOydtCDssrTsnbjsnYQg7J207Ja067Cb7JWY7Jy866m0IHRhaWwg7J20IOq1kOyytOuPvCDsnojri6Qg4oCUIOq3uOuVjOuKlCDsgq3soJztlZjsp4Ag7JWK64qU64ukLlxuICAgIGlmIChzZXNzaW9uQ2hhaW5zLmdldChzZXNzaW9uSWQpID09PSB0YWlsKSBzZXNzaW9uQ2hhaW5zLmRlbGV0ZShzZXNzaW9uSWQpO1xuICB9XG59XG5cbi8vIOKUgOKUgCBjb29yZCDrp6TtlZEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8vIHRva2VuIOq4sOuwmCDslYjsoJUgd29ya2VySWQg7ZWp7ISxLiBBbnRocm9waWMg7J2AIHdvcmtlciBwb29sIOydtCDsl4bsnLzrr4DroZwgdG9rZW5JZCDrpbwg6re464yA66GcIOyTtOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQW50aHJvcGljV29ya2VySWQodG9rZW5JZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHRva2VuSWQ7XG59XG5cbi8vIOKUgOKUgCBlbnZlbG9wZSBkZWNvcmF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLy8gc3RyZWFtLWpzb24g7J6F66ClIOudvOyduOyXkCBTREsgZW52ZWxvcGUg67aA7LCpIO2bhCDsp4HroKztmZQuIHNlc3Npb24g7IaM7Jyg7J6Q7J24IOyXrOq4sOyEnCDtlZzri6QuXG5leHBvcnQgZnVuY3Rpb24gZGVjb3JhdGVBbmRTZXJpYWxpemUoXG4gIGxpbmVzOiBBcnJheTxDbGF1ZGVTdHJlYW1Kc29uTGluZT4sXG4gIHNlc3Npb25JZDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICBsaW5lc1xuICAgICAgLm1hcCgobGluZSkgPT5cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIC4uLmxpbmUsXG4gICAgICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvbklkLFxuICAgICAgICAgIHV1aWQ6IHJhbmRvbVVVSUQoKSxcbiAgICAgICAgICBwYXJlbnRfdG9vbF91c2VfaWQ6IG51bGwsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLmpvaW4oXCJcXG5cIikgKyBcIlxcblwiXG4gICk7XG59XG5cbi8vIOKUgOKUgCBzcGF3biArIGNvbnN1bWUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhdWRlU2Vzc2lvblJlcXVlc3Qge1xuICB0b2tlbklkOiBudW1iZXI7XG4gIHRva2VuOiBzdHJpbmc7IC8vIE9BdXRoIGFjY2VzcyB0b2tlblxuICBtb2RlbDogc3RyaW5nO1xuICBzeXN0ZW0/OiBzdHJpbmc7XG4gIGpzb25TY2hlbWE/OiBzdHJpbmc7IC8vIOyeiOycvOuptCBzdHJ1Y3R1cmVkIG91dHB1dFxuICBlZmZvcnQ/OiBzdHJpbmc7XG4gIHRpbWVvdXRNczogbnVtYmVyO1xuICBjb2xkSGlzdG9yeT86IEFycmF5PEpzb25WYWx1ZT47XG4gIGlucHV0OiBBcnJheTxVc2VySW5wdXQ+O1xuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTZXNzaW9uUmVzdWx0IGV4dGVuZHMgQ2xhdWRlU3RyZWFtUmVzdWx0IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHdvcmtlcklkOiBudW1iZXI7XG4gIHR0ZnRNczogbnVtYmVyIHwgbnVsbDtcbn1cblxuLy8gcGVyLXRva2VuIENMQVVERV9DT05GSUdfRElSIOuztOyepSjqsqnrpqwpLiDqsr3roZwg6rec7LmZ7J2AIGFudGhyb3BpY0NvbmZpZ0RpcijsiJzsiJgg7ZWo7IiYKeydtCDshozsnKAg4oCUXG4vLyDsl6zquLDshKAg6re4IOqyveuhnOyXkCDruYggc2V0dGluZ3Mg66W8IOq5lOyVhCBjbGF1ZGUtbWVtIGhvb2sg65Ox7J2EIOywqOuLqO2VnOuLpC4gKFIxMCDqsqnrpqwpXG4vLyDsnbQgc2VlZCDtjIzsnbzsnYAgY2xhdWRlLW1lbSBob29rIC8g7IKs7Jqp7J6QIOyEpOyglSDsmKTsl7wg7LCo64uo7J2EIOychO2VnCDqsqnrpqwg6rK96rOE64ukLiDrp6Qg7Zi47Lac66eI64ukIOuLpOyLnCDsjajshJxcbi8vIOyZuOu2gCDrs4DsobDCt+yCreygnCDtm4Tsl5Drj4Qg64uk7J2MIOyLpO2WieyXkOyEnCBzZWxmLWhlYWxpbmcg65CY64+E66GdIOq4sOyhtCBzZW1hbnRpY3Mg66W8IOycoOyngO2VnOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVDb25maWdEaXIodG9rZW5JZDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgZGlyID0gYW50aHJvcGljQ29uZmlnRGlyKHRva2VuSWQpO1xuICBta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgd3JpdGVGaWxlU3luYyhgJHtkaXJ9Ly5jbGF1ZGUuanNvbmAsIFwie31cIik7XG4gIHdyaXRlRmlsZVN5bmMoYCR7ZGlyfS9zZXR0aW5ncy5qc29uYCwgXCJ7fVwiKTtcbiAgcmV0dXJuIGRpcjtcbn1cblxubGV0IGN3ZEVuc3VyZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGVuc3VyZUN3ZCgpOiB2b2lkIHtcbiAgaWYgKGN3ZEVuc3VyZWQpIHJldHVybjtcbiAgbWtkaXJTeW5jKGAke0FOVEhST1BJQ19DTEFVREVfQ1dEfS8uY2xhdWRlYCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIHdyaXRlRmlsZVN5bmMoYCR7QU5USFJPUElDX0NMQVVERV9DV0R9Ly5jbGF1ZGUvc2V0dGluZ3MuanNvbmAsIFwie31cIik7XG4gIGN3ZEVuc3VyZWQgPSB0cnVlO1xufVxuXG4vLyBzcGF3biBhcmdzIOq1rOyEsS4g66mA7Yuw7YS0L+qyqeumrC9zdHJ1Y3R1cmVkIOuqqOuTnCDrsJjsmIEuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlPbmVNaWxsaW9uU3VmZml4KG1vZGVsOiBzdHJpbmcsIG5lZWRzU3VmZml4OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IGNhbm9uaWNhbEFudGhyb3BpY01vZGVsKG1vZGVsKTtcbiAgcmV0dXJuIG5lZWRzU3VmZml4ID8gYCR7YmFzZX1bMW1dYCA6IGJhc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvbmVNaWxsaW9uRW52KHN1cHBvcnRlZDogYm9vbGVhbik6IHsgQ0xBVURFX0NPREVfRElTQUJMRV8xTV9DT05URVhUPzogXCIxXCIgfSB7XG4gIHJldHVybiBzdXBwb3J0ZWQgPyB7fSA6IHsgQ0xBVURFX0NPREVfRElTQUJMRV8xTV9DT05URVhUOiBcIjFcIiB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGhpbmtpbmdFbnYobW9kZWw6IHN0cmluZyk6IHtcbiAgQ0xBVURFX0NPREVfRElTQUJMRV9BREFQVElWRV9USElOS0lORz86IFwiMVwiO1xuICBNQVhfVEhJTktJTkdfVE9LRU5TPzogXCIwXCI7XG59IHtcbiAgcmV0dXJuIHVzZXNBZGFwdGl2ZVRoaW5raW5nKG1vZGVsKVxuICAgID8ge31cbiAgICA6IHtcbiAgICAgICAgQ0xBVURFX0NPREVfRElTQUJMRV9BREFQVElWRV9USElOS0lORzogXCIxXCIsXG4gICAgICAgIE1BWF9USElOS0lOR19UT0tFTlM6IFwiMFwiLFxuICAgICAgfTtcbn1cblxuLy8gU09OLTQ5NTogc3RydWN0dXJlZCBvdXRwdXQgcmV0cnkg66W8IDEg66GcIOqzoOygle2VnOuLpC4gQ0Mg6rCAIGF0dGVtcHQg66W8IHJlamVjdCDtlZjqs6AgcmV0cnkg7ZWY66m0XG4vLyBge3JlamVjdGVkfXthY2NlcHRlZH1gIOuIhOyggeydtCBBSS1TREsg7J2YIEpTT04ucGFyc2Ug66W8IOq5qOucqOumrOuvgOuhnCwgcmV0cnkg7J6Q7LK066W8IOunieyVhCDqt7gg6rK966Gc66W8XG4vLyDsm5Dsspwg7LCo64uo7ZWc64ukLiBgMGAg7J2AIENDIHF1ZXJ5IGxvb3AoYGNhbGxzVGhpc1F1ZXJ5ID49IG1heFJldHJpZXNgKeqwgCDssqsgYXR0ZW1wdCBlbWl0IOyghOyXkFxuLy8g7Iuk7Yyo7Iuc7YKk66+A66GcKGBlcnJvcl9tYXhfc3RydWN0dXJlZF9vdXRwdXRfcmV0cmllc2ApIOyZuOu2gCDqsJLsnbQgMSDrr7jrp4zsnbTslrTrj4QgMSDroZwg7YG0656o7ZSE7ZWc64ukLlxuZXhwb3J0IGZ1bmN0aW9uIHN0cnVjdHVyZWRPdXRwdXRSZXRyaWVzRW52KHJhdyA9IHByb2Nlc3MuZW52Lk1BWF9TVFJVQ1RVUkVEX09VVFBVVF9SRVRSSUVTKToge1xuICBNQVhfU1RSVUNUVVJFRF9PVVRQVVRfUkVUUklFUzogc3RyaW5nO1xufSB7XG4gIGlmICghcmF3KSByZXR1cm4geyBNQVhfU1RSVUNUVVJFRF9PVVRQVVRfUkVUUklFUzogXCIxXCIgfTtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyLnBhcnNlSW50KHJhdywgMTApO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpKSByZXR1cm4geyBNQVhfU1RSVUNUVVJFRF9PVVRQVVRfUkVUUklFUzogXCIxXCIgfTtcbiAgcmV0dXJuIHsgTUFYX1NUUlVDVFVSRURfT1VUUFVUX1JFVFJJRVM6IFN0cmluZyhNYXRoLm1heChwYXJzZWQsIDEpKSB9O1xufVxuXG4vLyBTT04tNDk1IOydmCByZXRyeSDqs6DsoJXsnYAgXCLsiqTtirjrpqzrsI0gKyBzdHJ1Y3R1cmVkXCIg7KGw7ZWpIO2VnOyglSDsoJXssYXsnbTri6QuIOyKpO2KuOumvOyXkOyEnCByZXRyeSDqsIAg64+M66m0XG4vLyB3YWxsLWNsb2NrIOydtCAy67Cw6rCAIOuQmOyWtCDsi6TsmqnshLHsnbQg7JeG6riwIOuVjOusuOydtOuLpCjsm5Ag6rKw7KCVIOyCrOycoCkuIOuFvOyKpO2KuOumvCBnZW5lcmF0ZSDripQg7JWg7LSI7JeQIOyZhOujjOulvFxuLy8g6riw64uk66as66+A66GcIOq3uCDsgqzsnKDqsIAg7ISx66a97ZWY7KeAIOyViuuKlOuLpC4g67CY66m0IENsYXVkZSDqs4Tsl7TsnYAgT3BlbkFJIOuMgOu5hCBzdHJ1Y3R1cmVkIG91dHB1dCDspIDsiJjsnKjsnbRcbi8vIOuCruyVhCwg64W87Iqk7Yq466a86rmM7KeAIHJldHJ5PTEg66GcIOustuycvOuptCAx7ZqMIHJlamVjdCDqsIAg6rOn67CU66GcXG4vLyBgZXJyb3JfbWF4X3N0cnVjdHVyZWRfb3V0cHV0X3JldHJpZXNgIOuhnCDsp4HqsrDrkJzri6Qo7Iuk7LihOiBkZXRpX3Byb2R1Y3Rpb24gb3B1cy00LTgg7Iuk7Yyo7JyoIDM5LjYlKS5cbi8vIOyKpO2KuOumrOuwjSDsl6zrtoDripQgYC0taW5jbHVkZS1wYXJ0aWFsLW1lc3NhZ2VzYCDrpbwg67aZ7J2064qUIGdlbmVyYXRlU3RyZWFtIOqyveuhnOyXkOyEnOunjCB0cnVlIOqwgCDrkJjrr4DroZxcbi8vIChhbnRocm9waWMtZGlzcGF0Y2hlciDsnZggZ2VuZXJhdGUvZ2VuZXJhdGVTdHJlYW0g67aE6riwKSDsnbTrpbwg7Iuk7KeIIOq1rOu2hOyekOuhnCDsk7Tri6QuXG4vLyDruYTshLHqs7Ugc3VidHlwZSDsnYQg7ZWt7IOBIGlzRXJyb3Ig66GcIOyYrOumrOuKlCBTT04tNDk1IOydmCDrgpjrqLjsp4Ag7KCI67CY7J2AIOq3uOuMgOuhnCDsnKDsp4DrkJzri6Qg4oCUIHJldHJ5IO2bhOyXkOuPhFxuLy8gZGVnZW5lcmF0ZSDstpzroKXsnbTrqbQg7KGw7Jqp7Z6IIO2GteqzvOyLnO2CpOyngCDslYrqs6Ag7KCV7KeB7ZWY6rKMIOyLpO2MqO2VnOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRQaW5TdHJ1Y3R1cmVkUmV0cmllcyhvcHRzOiB7XG4gIHVzZVN0cnVjdHVyZWQ6IGJvb2xlYW47XG4gIGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM/OiBib29sZWFuO1xufSk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3B0cy51c2VTdHJ1Y3R1cmVkICYmIG9wdHMuaW5jbHVkZVBhcnRpYWxNZXNzYWdlcyA9PT0gdHJ1ZTtcbn1cblxuLy8gTGludXgg64uo7J28IGFyZ3Yg7J247J6QIO2VnOqzhChNQVhfQVJHX1NUUkxFTiA9IFBBR0VfU0laRcOXMzIgPSAxMjhLQiwg7Luk64SQIO2VmOuTnOy9lOuUqSDsg4HsiJgpXG4vLyDsi5zsiqTthZwg7ZSE66Gs7ZSE7Yq46rCAIOydtOulvCDrhJjsnLzrqbQgZXhlY3ZlIOqwgCBFMkJJRyDroZwg6rGw67aA65Cc64ukLiBkZXRpIOuTsSDrjIDtmJUg7ZSE66Gs7ZSE7Yq464qUIOyLpOy4oVxuLy8g7Y+J6regIDM0M0tCwrfstZzrjIAgNDg1S0Iob3B1cy00LTgp6528IOydvOyDgeyggeycvOuhnCDstIjqs7ztlZzri6QuIO2VnOqzhOydmCDsoIjrsJgoNjRLQinsnYQg7J6E6rOE6rCS7Jy866GcIOyeoeyVhFxuLy8gVVRGLTgg66mA7Yuw67CU7J207Yq4wrfsmIjsuKEg66q7IO2VnCDsl6zsnKDrtoTquYzsp4Ag7JWI7KCEIOuniOynhOydhCDrkZTri6QuXG5leHBvcnQgY29uc3QgU1lTVEVNX1BST01QVF9BUkdWX01BWF9CWVRFUyA9IEFSR1ZfU0FGRV9NQVhfVVRGOF9CWVRFUztcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2xhdWRlQXJncyhvcHRzOiB7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIC8vIOyLnOyKpO2FnCDtlITroaztlITtirgg7KCE64us7J2AIO2BrOq4sOuhnCDrtoTquLDtlZzri6Qo7Zi47Lac67aA6rCAIOqysOyglSk6XG4gIC8vICAtIOyekeycvOuptCBzeXN0ZW0oaW5saW5lKSDihpIgLS1zeXN0ZW0tcHJvbXB0IDx0ZXh0PiAo7YyM7J28IEkvTyDsl4bsnYwsIOq4sOyhtCDqsr3roZwpXG4gIC8vICAtIO2BrOuptCBzeXN0ZW1Qcm9tcHRGaWxlKOqyveuhnCkg4oaSIC0tc3lzdGVtLXByb21wdC1maWxlIDxwYXRoPiAoYXJndiDtlZzqs4Qg7ZqM7ZS8KVxuICAvLyAtLXN5c3RlbS1wcm9tcHQtZmlsZSDsnYAgLS1zeXN0ZW0tcHJvbXB0IOyZgCDrj5nsnbztlZjqsowgZGVmYXVsdCDrpbwgcmVwbGFjZSDtlZzri6QoYXBwZW5kIOyVhOuLmCDigJRcbiAgLy8gUjcg6rKp66asIOuztOyhtCwg7Iuk7LihIO2ZleyduCkuIOuRmCDri6Qg7JeG7Jy866m0IOu5iCAtLXN5c3RlbS1wcm9tcHQoZGVmYXVsdCAyM2sg7KO87J6FIOuwqeyngCkuXG4gIHN5c3RlbT86IHN0cmluZztcbiAgc3lzdGVtUHJvbXB0RmlsZT86IHN0cmluZztcbiAgZWZmb3J0Pzogc3RyaW5nO1xuICBqc29uU2NoZW1hPzogc3RyaW5nO1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgbmVlZHNPbmVNaWxsaW9uU3VmZml4PzogYm9vbGVhbjtcbiAgaW5jbHVkZVBhcnRpYWxNZXNzYWdlcz86IGJvb2xlYW47XG59KTogQXJyYXk8c3RyaW5nPiB7XG4gIGNvbnN0IHVzZVN0cnVjdHVyZWQgPSBCb29sZWFuKG9wdHMuanNvblNjaGVtYSAmJiBvcHRzLmpzb25TY2hlbWEubGVuZ3RoID4gMCk7XG4gIGlmICh1c2VTdHJ1Y3R1cmVkKSBhc3NlcnRBbnRocm9waWNTY2hlbWFBcmd2U2l6ZShvcHRzLmpzb25TY2hlbWEhKTtcbiAgLy8gLS10b29scyBcIlwiIOuhnCDsoITssrQg7LCo64uoLCBzdHJ1Y3R1cmVkKGpzb25TY2hlbWEg7J6I7J2MKSDrqbQgU3RydWN0dXJlZE91dHB1dCDrp4wg7ZeI7JqpLlxuICBjb25zdCB0b29sQXJncyA9IHVzZVN0cnVjdHVyZWRcbiAgICA/IFtcIi0tdG9vbHNcIiwgXCJcIiwgXCItLWFsbG93ZWQtdG9vbHNcIiwgXCJTdHJ1Y3R1cmVkT3V0cHV0XCJdXG4gICAgOiBbXCItLXRvb2xzXCIsIFwiXCJdO1xuXG4gIC8vIOyLnOyKpO2FnCDtlITroaztlITtirg6IO2MjOydvCDqsr3roZzqsIAg7Jik66m0IC0tc3lzdGVtLXByb21wdC1maWxlLCDslYTri4jrqbQgaW5saW5lIC0tc3lzdGVtLXByb21wdC5cbiAgLy8gKO2YuOy2nOu2gOqwgCDtgazquLDroZwg67aE6riw7ZW0IOuRmCDspJEg7ZWY64KY66eMIOyxhOyatOuLpC4g65GYIOuLpCDsl4bsnLzrqbQg67mIIC0tc3lzdGVtLXByb21wdC4pXG4gIGNvbnN0IHN5c3RlbUFyZ3MgPSBvcHRzLnN5c3RlbVByb21wdEZpbGVcbiAgICA/IFtcIi0tc3lzdGVtLXByb21wdC1maWxlXCIsIG9wdHMuc3lzdGVtUHJvbXB0RmlsZV1cbiAgICA6IFtcIi0tc3lzdGVtLXByb21wdFwiLCBvcHRzLnN5c3RlbSA/PyBcIlwiXTtcblxuICBjb25zdCBhcmdzOiBBcnJheTxzdHJpbmc+ID0gW1xuICAgIFwiLXBcIixcbiAgICAuLi50b29sQXJncyxcbiAgICBcIi0tZGlzYWxsb3dlZFRvb2xzXCIsXG4gICAgLi4uQU5USFJPUElDX0RJU0FMTE9XRURfVE9PTFMsXG4gICAgXCItLWlucHV0LWZvcm1hdFwiLFxuICAgIFwic3RyZWFtLWpzb25cIixcbiAgICBcIi0tb3V0cHV0LWZvcm1hdFwiLFxuICAgIFwic3RyZWFtLWpzb25cIixcbiAgICBcIi0tdmVyYm9zZVwiLFxuICAgIC4uLihvcHRzLmluY2x1ZGVQYXJ0aWFsTWVzc2FnZXMgPyBbXCItLWluY2x1ZGUtcGFydGlhbC1tZXNzYWdlc1wiXSA6IFtdKSxcbiAgICBcIi0tcGVybWlzc2lvbi1tb2RlXCIsXG4gICAgXCJieXBhc3NQZXJtaXNzaW9uc1wiLFxuICAgIFwiLS1zZXR0aW5nLXNvdXJjZXNcIixcbiAgICBcInByb2plY3RcIixcbiAgICBcIi0tbW9kZWxcIixcbiAgICBhcHBseU9uZU1pbGxpb25TdWZmaXgob3B0cy5tb2RlbCwgb3B0cy5uZWVkc09uZU1pbGxpb25TdWZmaXggPz8gZmFsc2UpLFxuICAgIC8vIGlubGluZSBbU3lzdGVtXSDquIjsp4Ag4oCUIOygleyLnSDssYTrhJDrp4woUjcpLiDsg53rnrUg7IucIENDIGRlZmF1bHQoMjNrKSDso7zsnoXrkJjrr4DroZwg67CY65Oc7IucIOuqheyLnC5cbiAgICAvLyDtgazquLDsl5Ag65Sw6528IC0tc3lzdGVtLXByb21wdCjsnpHsnYwpIC8gLS1zeXN0ZW0tcHJvbXB0LWZpbGUo7YG8KeuhnCDrtoTquLAoc3lzdGVtQXJncykuXG4gICAgLi4uc3lzdGVtQXJncyxcbiAgICAvLyBGYWJsZSA1IOuKlCBhZGFwdGl2ZSB0aGlua2luZyDsnbQg7ZWE7IiY7J206rOgLCBPcHVzIDUg64qUIOqzteyLnSDquLDrs7ggYWRhcHRpdmUg64+Z7J6R7J2EIOuztOyhtO2VnOuLpC5cbiAgICAuLi4odXNlc0FkYXB0aXZlVGhpbmtpbmcob3B0cy5tb2RlbCkgPyBbXSA6IFtcIi0tdGhpbmtpbmdcIiwgXCJkaXNhYmxlZFwiXSksXG4gICAgXCItLWVmZm9ydFwiLFxuICAgIG9wdHMuZWZmb3J0ID8/IEFOVEhST1BJQ19ERUZBVUxUX0VGRk9SVCxcbiAgICBcIi0tZGlzYWJsZS1zbGFzaC1jb21tYW5kc1wiLFxuICAgIFwiLS1zZXNzaW9uLWlkXCIsXG4gICAgb3B0cy5zZXNzaW9uSWQsXG4gIF07XG4gIGlmICh1c2VTdHJ1Y3R1cmVkKSBhcmdzLnB1c2goXCItLWpzb24tc2NoZW1hXCIsIG9wdHMuanNvblNjaGVtYSEpO1xuICByZXR1cm4gYXJncztcbn1cblxuLyoqXG4gKiBDbGF1ZGUg7IS47IWY7J2EIHNwYXduIO2VtCDtlZwgdHVybiDsnYQg7Iuk7ZaJ7ZWc64ukLiBwZXItc2Vzc2lvbiDrnb3snLzroZwg7KeB66Cs7ZmU65Cc64ukLlxuICogQHBhcmFtIG9uRGVsdGEg7KCQ7KeEIO2FjeyKpO2KuCBkZWx0YShzdHJlYW1UZXh0KSDrmJDripQgc3RydWN0dXJlZCDrtoDrtoQgSlNPTihzdHJlYW1PYmplY3QpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuQ2xhdWRlU2Vzc2lvbihcbiAgcmVxOiBDbGF1ZGVTZXNzaW9uUmVxdWVzdCxcbiAgb25EZWx0YTogKHRleHQ6IHN0cmluZykgPT4gdm9pZCxcbik6IFByb21pc2U8Q2xhdWRlU2Vzc2lvblJlc3VsdD4ge1xuICAvLyDsoJXqt5ztmZQg6rec7LmZ7J2AIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsIOydtCDri6jrj4Ug7IaM7JygIOKAlCBkaXNwYXRjaGVyIOqwgCDsnbTrr7ggY2Fub25pY2FsIOydhCDrhJjquLDsp4Drp4wsXG4gIC8vIOyngeygkSDtmLjstpwo7YWM7Iqk7Yq4L+uvuOuemCBjYWxsZXIpIOuMgOu5hCDrsKnslrTsoIHsnLzroZwg7ZWcIOuyiCDrjZQg7Ya16rO87Iuc7YKo64ukKOydtOuvuCBjYW5vbmljYWwg7J2066m0IG5vLW9wKS5cbiAgYXNzZXJ0U3VwcG9ydGVkT25lTWlsbGlvblN1ZmZpeChyZXEubW9kZWwpO1xuICBjb25zdCBtb2RlbCA9IGNhbm9uaWNhbEFudGhyb3BpY01vZGVsKHJlcS5tb2RlbCk7XG4gIGNvbnN0IHN1cHBvcnRzT25lTWlsbGlvbiA9IHN1cHBvcnRzMU1Db250ZXh0KG1vZGVsKTtcbiAgY29uc3QgbmVlZHNPbmVNaWxsaW9uU3VmZml4ID0gbmVlZHNDbGkxbVN1ZmZpeChtb2RlbCk7XG4gIGNvbnN0IHNlc3Npb25JZCA9IHJhbmRvbVVVSUQoKTtcbiAgY29uc3QgdXNlU3RydWN0dXJlZCA9IEJvb2xlYW4ocmVxLmpzb25TY2hlbWEgJiYgcmVxLmpzb25TY2hlbWEubGVuZ3RoID4gMCk7XG4gIGNvbnN0IHdvcmtlcklkID0gbWFrZUFudGhyb3BpY1dvcmtlcklkKHJlcS50b2tlbklkKTtcblxuICByZXR1cm4gd2l0aFNlc3Npb25Mb2NrKHNlc3Npb25JZCwgKCkgPT4ge1xuICAgIGVuc3VyZUN3ZCgpO1xuICAgIGNvbnN0IGNvbmZpZ0RpciA9IGVuc3VyZUNvbmZpZ0RpcihyZXEudG9rZW5JZCk7XG5cbiAgICAvLyDsi5zsiqTthZwg7ZSE66Gs7ZSE7Yq466W8IO2BrOq4sOuhnCDrtoTquLA6IDEyOEtCKGFyZ3Yg7ZWc6rOEKeydmCDsoIjrsJjsnYQg64SY7Jy866m0IO2MjOydvOuhnCDrhJjqsqggRTJCSUcg7ZqM7ZS8LlxuICAgIC8vIOyekeydgCDtlITroaztlITtirjripQg7YyM7J28IEkvTyDsl4bsnbQg6riw7KG0IGlubGluZSDqsr3roZzrpbwg6re464yA66GcIOyTtOuLpCjrjIDrtoDrtoTsnZgg7Zi47LacKS5cbiAgICAvLyDsi6TsoJwg7YyM7J28IOyTsOq4sOuKlCBhYm9ydCDssrTtgawg7J207ZuEKFByb21pc2Ug7JWIKeuhnCDrr7jrpIQsIOydtOuvuCDst6jshozrkJwg7JqU7LKt7JeUIOyTsOyngCDslYrripTri6QuXG4gICAgY29uc3Qgc3lzdGVtID0gcmVxLnN5c3RlbSA/PyBcIlwiO1xuICAgIGNvbnN0IHVzZVN5c3RlbVByb21wdEZpbGUgPSBCdWZmZXIuYnl0ZUxlbmd0aChzeXN0ZW0sIFwidXRmOFwiKSA+IFNZU1RFTV9QUk9NUFRfQVJHVl9NQVhfQllURVM7XG4gICAgY29uc3Qgc3lzdGVtUHJvbXB0RmlsZSA9IHVzZVN5c3RlbVByb21wdEZpbGVcbiAgICAgID8gYCR7Y29uZmlnRGlyfS9zeXN0ZW0tcHJvbXB0LSR7c2Vzc2lvbklkfS50eHRgXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGFyZ3MgPSBidWlsZENsYXVkZUFyZ3Moe1xuICAgICAgbW9kZWwsXG4gICAgICBzeXN0ZW06IHVzZVN5c3RlbVByb21wdEZpbGUgPyB1bmRlZmluZWQgOiByZXEuc3lzdGVtLFxuICAgICAgc3lzdGVtUHJvbXB0RmlsZSxcbiAgICAgIGVmZm9ydDogcmVxLmVmZm9ydCxcbiAgICAgIGpzb25TY2hlbWE6IHJlcS5qc29uU2NoZW1hLFxuICAgICAgc2Vzc2lvbklkLFxuICAgICAgbmVlZHNPbmVNaWxsaW9uU3VmZml4LFxuICAgICAgaW5jbHVkZVBhcnRpYWxNZXNzYWdlczogcmVxLmluY2x1ZGVQYXJ0aWFsTWVzc2FnZXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnB1dExpbmVzID0gYnVpbGRTdHJlYW1Kc29uSW5wdXQoe1xuICAgICAgY29sZEhpc3Rvcnk6IHJlcS5jb2xkSGlzdG9yeSxcbiAgICAgIGlucHV0OiByZXEuaW5wdXQsXG4gICAgfSk7XG4gICAgY29uc3Qgc3RkaW5QYXlsb2FkID0gZGVjb3JhdGVBbmRTZXJpYWxpemUoaW5wdXRMaW5lcywgc2Vzc2lvbklkKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxDbGF1ZGVTZXNzaW9uUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAocmVxLmFib3J0U2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJhYm9ydGVkXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyDrjIDtmJUg7Iuc7Iqk7YWcIO2UhOuhrO2UhO2KuOuKlCBzcGF3biDsp4HsoITsl5Ag7YyM7J2866GcIOq4sOuhnShhcmd2IEUyQklHIO2ajO2UvCkuIOyiheujjCDsi5wg7KCV66as7ZWc64ukLlxuICAgICAgaWYgKHN5c3RlbVByb21wdEZpbGUpIHdyaXRlRmlsZVN5bmMoc3lzdGVtUHJvbXB0RmlsZSwgc3lzdGVtKTtcblxuICAgICAgY29uc3QgY2hpbGQgPSBzcGF3bihcImNsYXVkZVwiLCBhcmdzLCB7XG4gICAgICAgIC8vIHN0ZGVyciDrj4Qg7Lqh7LKYOiBpbnZhbGlkIE9BdXRoIC8g7J6Y66q765CcIO2UjOuemOq3uCAvIENMSSDqsoDspp0g7Iuk7Yyo6rCAXG4gICAgICAgIC8vIFwiY2xvc2VkIHdpdGhvdXQgcmVzdWx0XCIg66GcIOutieqwnOyngOyngCDslYrqsowgY2xvc2UvZXJyb3Ig7JeQIHN0ZGVyciDrpbwg7Iuk7Ja0IOuztOuCuOuLpC5cbiAgICAgICAgc3RkaW86IFtcInBpcGVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgY3dkOiBBTlRIUk9QSUNfQ0xBVURFX0NXRCxcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgUEFUSDogcHJvY2Vzcy5lbnYuUEFUSCxcbiAgICAgICAgICBUTVBESVI6IHByb2Nlc3MuZW52LlRNUERJUixcbiAgICAgICAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogcmVxLnRva2VuLFxuICAgICAgICAgIENMQVVERV9DT05GSUdfRElSOiBjb25maWdEaXIsXG4gICAgICAgICAgQ0xBVURFX0NPREVfRElTQUJMRV9BVVRPX01FTU9SWTogXCIxXCIsXG4gICAgICAgICAgLi4udGhpbmtpbmdFbnYobW9kZWwpLFxuICAgICAgICAgIC4uLm9uZU1pbGxpb25FbnYoc3VwcG9ydHNPbmVNaWxsaW9uKSxcbiAgICAgICAgICBDTEFVREVfQ09ERV9ESVNBQkxFX0NMQVVERV9NRFM6IFwiMVwiLFxuICAgICAgICAgIENMQVVERV9DT0RFX0RJU0FCTEVfVEVSTUlOQUxfVElUTEU6IFwiMVwiLFxuICAgICAgICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQlVORExFRF9TS0lMTFM6IFwiMVwiLFxuICAgICAgICAgIENMQVVERV9DT0RFX0RJU0FCTEVfV09SS0ZMT1dTOiBcIjFcIixcbiAgICAgICAgICBDTEFVREVfQ09ERV9BVFRSSUJVVElPTl9IRUFERVI6IFwiMFwiLFxuICAgICAgICAgIC8vIHN0cnVjdHVyZWQgKyDsiqTtirjrpqzrsI3snbwg65WM66eMIHJldHJ5IOulvCDqs6DsoJXtlZzri6QoU09OLTQ5NSkuIHRleHQg66qo65Oc7JmAIOuFvOyKpO2KuOumvFxuICAgICAgICAgIC8vIGdlbmVyYXRlIOuKlCBDQyDquLDrs7ggcmV0cnkg66W8IOq3uOuMgOuhnCDsk7Tri6QuXG4gICAgICAgICAgLi4uKHNob3VsZFBpblN0cnVjdHVyZWRSZXRyaWVzKHtcbiAgICAgICAgICAgIHVzZVN0cnVjdHVyZWQsXG4gICAgICAgICAgICBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzOiByZXEuaW5jbHVkZVBhcnRpYWxNZXNzYWdlcyxcbiAgICAgICAgICB9KVxuICAgICAgICAgICAgPyBzdHJ1Y3R1cmVkT3V0cHV0UmV0cmllc0VudigpXG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgbGV0IGJ1ZmZlciA9IFwiXCI7XG4gICAgICBjb25zdCBzdHJlYW1TdGF0ZTogQ2xhdWRlU3RyZWFtSnNvblN0YXRlID0ge307XG4gICAgICBjb25zdCB0dGZ0VHJhY2tlciA9IGNyZWF0ZVR0ZnRUcmFja2VyKCk7XG4gICAgICBjb25zdCBvblRyYWNrZWREZWx0YSA9IHR0ZnRUcmFja2VyLndyYXBEZWx0YShvbkRlbHRhKTtcbiAgICAgIC8vIGJvdW5kZWQgc3RkZXJyIOuyhO2NvCjstZzqt7wgfjRLQuunjCDsnKDsp4Ag4oCUIOustO2VnCDriITsoIEg67Cp7KeAKS5cbiAgICAgIGxldCBzdGRlcnJCdWYgPSBcIlwiO1xuICAgICAgY29uc3QgU1RERVJSX0NBUCA9IDQwOTY7XG4gICAgICBjaGlsZC5zdGRlcnI/Lm9uKFwiZGF0YVwiLCAoZDogQnVmZmVyKSA9PiB7XG4gICAgICAgIHN0ZGVyckJ1ZiA9IChzdGRlcnJCdWYgKyBkLnRvU3RyaW5nKCkpLnNsaWNlKC1TVERFUlJfQ0FQKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3RkZXJyU3VmZml4ID0gKCkgPT4gKHN0ZGVyckJ1Zi50cmltKCkgPyBgIOKAlCBzdGRlcnI6ICR7c3RkZXJyQnVmLnRyaW0oKX1gIDogXCJcIik7XG4gICAgICAvLyBzcGF3biDsi5wg7JO0IOyehOyLnCDsi5zsiqTthZwg7ZSE66Gs7ZSE7Yq4IO2MjOydvCDsoJXrpqwo7ZWcIOuyiOunjCkuIOuqqOuToCDsooXro4wg6rK966Gc7JeQ7IScIO2YuOy2nO2VnOuLpC5cbiAgICAgIC8vIOuIhOudveuPvOuPhCDri6TsnYwgZW5zdXJlQ29uZmlnRGlyIOqwgCDrlJTroInthqDrpqzrpbwg7J6s7IKs7Jqp7ZWgIOu/kOydtOyngOunjCwgc2Vzc2lvbklkIOuzhCDtjIzsnbzsnbTrnbxcbiAgICAgIC8vIOyMk+ydtOuptCDrlJTsiqTtgazqsIAg7LCo66+A66GcIHNldHRsZSDsi5wg7KaJ7IucIOyngOyatOuLpC5cbiAgICAgIGNvbnN0IGNsZWFudXBTcGF3bkZpbGVzID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXN5c3RlbVByb21wdEZpbGUpIHJldHVybjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB1bmxpbmtTeW5jKHN5c3RlbVByb21wdEZpbGUpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyDsnbTrr7gg7JeG6rGw64KYIOq2jO2VnCDrrLjsoJzrqbQg66y07IucIOKAlCDsoJXrpqzripQgYmVzdC1lZmZvcnQuXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBsZXQgY2xlYW51cEFib3J0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cEFib3J0Py4oKTtcbiAgICAgICAgY2xlYW51cFNwYXduRmlsZXMoKTtcbiAgICAgICAgY2hpbGQua2lsbCgpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDbGF1ZGUgc2Vzc2lvbiB0aW1lb3V0IGFmdGVyICR7cmVxLnRpbWVvdXRNcyAvIDEwMDB9c2ApKTtcbiAgICAgIH0sIHJlcS50aW1lb3V0TXMpO1xuXG4gICAgICBjb25zdCBmaW5pc2ggPSAocmVzdWx0OiBDbGF1ZGVTdHJlYW1SZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIGNsZWFudXBBYm9ydD8uKCk7XG4gICAgICAgIGNsZWFudXBTcGF3bkZpbGVzKCk7XG4gICAgICAgIHJlc29sdmUoeyAuLi5yZXN1bHQsIHNlc3Npb25JZCwgd29ya2VySWQsIHR0ZnRNczogdHRmdFRyYWNrZXIudmFsdWUoKSB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICBjbGVhbnVwQWJvcnQ/LigpO1xuICAgICAgICBjbGVhbnVwU3Bhd25GaWxlcygpO1xuICAgICAgICBjaGlsZC5raWxsKCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJhYm9ydGVkXCIpKTtcbiAgICAgIH07XG4gICAgICBjbGVhbnVwQWJvcnQgPSAoKSA9PiByZXEuYWJvcnRTaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIHJlcS5hYm9ydFNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcblxuICAgICAgY2hpbGQuc3Rkb3V0Py5vbihcImRhdGFcIiwgKGQ6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBidWZmZXIgKz0gZC50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGJ1ZmZlci5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgYnVmZmVyID0gbGluZXMucG9wKCkgPz8gXCJcIjtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlU3RyZWFtSnNvbkxpbmUobGluZSwgb25UcmFja2VkRGVsdGEsIHtcbiAgICAgICAgICAgIHN0cnVjdHVyZWRPdXRwdXQ6IHVzZVN0cnVjdHVyZWQsXG4gICAgICAgICAgICBzdGF0ZTogc3RyZWFtU3RhdGUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgZmluaXNoKHJlc3VsdCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hpbGQub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICBjbGVhbnVwQWJvcnQ/LigpO1xuICAgICAgICBjbGVhbnVwU3Bhd25GaWxlcygpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDbGF1ZGUgc2Vzc2lvbiBjbG9zZWQgd2l0aG91dCByZXN1bHQke3N0ZGVyclN1ZmZpeCgpfWApKTtcbiAgICAgIH0pO1xuICAgICAgY2hpbGQub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICBjbGVhbnVwQWJvcnQ/LigpO1xuICAgICAgICBjbGVhbnVwU3Bhd25GaWxlcygpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDbGF1ZGUgc2Vzc2lvbiBzcGF3biBlcnJvcjogJHtlcnIubWVzc2FnZX1gKSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gc3RkaW4g7Jy866GcIOyeheugpSBKU09OTCDtnZjrpqzqs6Ag64ur64qU64ukLlxuICAgICAgdHRmdFRyYWNrZXIubWFya1N0YXJ0KCk7XG4gICAgICBjaGlsZC5zdGRpbj8ud3JpdGUoc3RkaW5QYXlsb2FkKTtcbiAgICAgIGNoaWxkLnN0ZGluPy5lbmQoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8vIHVzYWdlIOyerOuFuOy2nCjthYzsiqTtirgg7Y647J2YKS5cbmV4cG9ydCB0eXBlIHsgVG9rZW5Vc2FnZUJyZWFrZG93biB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlEQSxNQUFNLGdDQUFnQixJQUFJLElBQThCO0FBRXhELGVBQXNCLGdCQUFtQixXQUFtQixJQUFrQztDQUc1RixNQUFNLFFBRk8sY0FBYyxJQUFJLFNBQVMsS0FBSyxRQUFRLFFBQVEsRUFFaEQsQ0FBSyxLQUFLLElBQUksRUFBRTtDQUc3QixNQUFN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
276
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhdWRlLXNlc3Npb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvY2xhdWRlLXNlc3Npb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjbGF1ZGUtc2Vzc2lvbiDigJQgQ2xhdWRlIENMSSDshLjshZggc3Bhd24gKyBRZ3JpZFRocmVhZENvb3JkIOunpO2VkSArIHBlci1zZXNzaW9uIOudvS5cbiAqXG4gKiDrqYDti7DthLQ6IOunpCDtmLjstpwgZnJlc2ggYC0tc2Vzc2lvbi1pZCA8dXVpZD5g66GcIOyLpO2Wie2VnOuLpC4g7J6F66Cl7J2AIOyWtOuMke2EsOqwgCDrp4zrk6AgSlNPTkwg7J2EXG4gKiBzdGRpbiDsnLzroZwg7Z2Y66as6rOgKGAtLWlucHV0LWZvcm1hdCBzdHJlYW0tanNvbmApLCDstpzroKXsnYAg7YyM7ISc66GcIOyymOumrO2VnOuLpC5cbiAqXG4gKiDtlbXsi6wg6rOE7JW9OlxuICogIC0gY29vcmQg64qUIOyehOydmCDsoIDsnqXsnbQg7JWE64uI6528IOq4sOyhtCBRZ3JpZFRocmVhZENvb3Jke3dvcmtlcklkLHRocmVhZElkLGVwb2NoLHN5c3RlbUhhc2h9IOyXkFxuICogICAg66ek7ZWR7ZWc64ukLiB0aHJlYWRJZD3shLjshZggdXVpZCwgZXBvY2g9MCDqs6DsoJUod29ya2VyIHJlc3RhcnQg6rCc64WQIOyXhuydjCksIHdvcmtlcklkPXRva2VuIOq4sOuwmFxuICogICAg7JWI7KCVIO2VqeyEsSwgc3lzdGVtSGFzaD3smpTssq0gc3lzdGVtIO2VtOyLnC4gaXNzdWVDb252Q29udGV4dC9kZWNpZGVDb252Um91dGluZyDqs7wgcm91bmQtdHJpcC5cbiAqICAtIHdpdGhTZXNzaW9uTG9jayDsnYAgZXhwb3J0ZWQgcHJpbWl0aXZlIOuhnCDsnKDsp4DtlZzri6QuIOq4sOuzuCDqsr3roZzsl5DshJzripQg66ekIO2YuOy2nCDsg4ggc2Vzc2lvbi1pZCDrnbxcbiAqICAgIOyCrOyLpOyDgSBuby1jb250ZW50aW9uIOydtOyngOunjCwg7KeB7KCRIO2YuOy2nOyekC/thYzsiqTtirjsnZgg7KeB66Cs7ZmUIOuztOyepeydgCDrs7TsobTtlZzri6QuXG4gKiAgLSBzdHJlYW0tanNvbiDsp4HroKztmZQg7IucIFNESyBlbnZlbG9wZSh1dWlkL3Nlc3Npb25faWQvcGFyZW50X3Rvb2xfdXNlX2lkKSBkZWNvcmF0ZS5cbiAqICAtIHN0cnVjdHVyZWQgb3V0cHV0IOydvCDrlYwg7Lac66ClIO2MjOyEnOyXkCB7IHN0cnVjdHVyZWRPdXRwdXQ6IHRydWUgfSDsoITri6wo7JeG7Jy866m0IHN0cmVhbU9iamVjdCDquajsp5ApLlxuICovXG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgbWtkaXJTeW5jLCB1bmxpbmtTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcblxuaW1wb3J0IHsgcmVzb2x2ZUFudGhyb3BpY0VmZm9ydCB9IGZyb20gXCIuLi9jb21tb24vZWZmb3J0XCI7XG5pbXBvcnQgeyB0eXBlIEpzb25WYWx1ZSwgdHlwZSBUb2tlblVzYWdlQnJlYWtkb3duLCB0eXBlIFVzZXJJbnB1dCB9IGZyb20gXCIuLi9jb21tb24vcHJvdmlkZXItdHlwZXNcIjtcbmltcG9ydCB7XG4gIEFSR1ZfU0FGRV9NQVhfVVRGOF9CWVRFUyxcbiAgYXNzZXJ0QW50aHJvcGljU2NoZW1hQXJndlNpemUsXG59IGZyb20gXCIuLi9jb21tb24vc2NoZW1hLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGNyZWF0ZVR0ZnRUcmFja2VyIH0gZnJvbSBcIi4uL2NvbW1vbi90dGZ0XCI7XG5pbXBvcnQge1xuICBBTlRIUk9QSUNfQ0xBVURFX0NXRCxcbiAgYW50aHJvcGljQ29uZmlnRGlyLFxuICBBTlRIUk9QSUNfREVGQVVMVF9FRkZPUlQsXG4gIEFOVEhST1BJQ19ESVNBTExPV0VEX1RPT0xTLFxuICBhc3NlcnRTdXBwb3J0ZWRPbmVNaWxsaW9uU3VmZml4LFxuICBjYW5vbmljYWxBbnRocm9waWNNb2RlbCxcbiAgbmVlZHNDbGkxbVN1ZmZpeCxcbiAgc3VwcG9ydHMxTUNvbnRleHQsXG4gIHVzZXNBZGFwdGl2ZVRoaW5raW5nLFxufSBmcm9tIFwiLi9hbnRocm9waWMtY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBidWlsZFN0cmVhbUpzb25JbnB1dCxcbiAgdHlwZSBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUsXG4gIHR5cGUgQ2xhdWRlU3RyZWFtSnNvbkxpbmUsXG4gIHR5cGUgQ2xhdWRlU3RyZWFtUmVzdWx0LFxuICBoYW5kbGVTdHJlYW1Kc29uTGluZSxcbn0gZnJvbSBcIi4vc3RyZWFtLWpzb24tYWRhcHRlclwiO1xuXG4vLyDilIDilIAgcGVyLXNlc3Npb24g6529IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vLyBzZXNzaW9uLWlkIOuLqOychCDsp4HroKztmZQgcHJpbWl0aXZlLiDquLDrs7gg6rK966Gc7JeQ7ISc64qUIOunpCDtmLjstpwg7IOIIHV1aWQg6528IOyCrOyLpOyDgSBuby1vcCDsnbTsp4Drp4wsXG4vLyDqsJnsnYAgc2Vzc2lvbi1pZCDrpbwg7KeB7KCRIOyTsOuKlCDtmLjstpzsnpDripQg7Jes7KCE7Z6IIOyngeugrO2ZlCDrs7TsnqXsnYQg67Cb64qU64ukLlxuY29uc3Qgc2Vzc2lvbkNoYWlucyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PigpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFNlc3Npb25Mb2NrPFQ+KHNlc3Npb25JZDogc3RyaW5nLCBmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICBjb25zdCBwcmV2ID0gc2Vzc2lvbkNoYWlucy5nZXQoc2Vzc2lvbklkKSA/PyBQcm9taXNlLnJlc29sdmUoKTtcbiAgLy8g7J207KCEIHR1cm4g7J2YIOyEse2MqOyZgCDrrLTqtIDtlZjqsowg7KeB66CsIOyytOyduOydhCDsnofripTri6QuXG4gIGNvbnN0IG5leHQgPSBwcmV2LnRoZW4oZm4sIGZuKTtcbiAgLy8gdGFpbDog7ISx7YyoIOustOq0gCBzZXR0bGUg65CY64qUIO2VuOuTpC4g7J206rG4IOunteyXkCDrkZDqs6AsIGZpbmFsbHkg7JeQ7IScIFwi7Jes7KCE7Z6IIOuCtOqwgCDrgZ1cIuydvCDrlYzrp4wg7IKt7KCcLlxuICAvLyAoc2V0IOynge2bhCB1bmRlZmluZWQg6rKA7IKs66GcIO2VmOuptCDsoIjrjIAg7IKt7KCcIOyViCDrj7wg7IS47IWYIGlkIOqwgCDriITsiJjrkKgg4oCUIHRhaWwg7J287LmYIOqygOyCrOuhnCDtmoztlLwuKVxuICBjb25zdCB0YWlsID0gbmV4dC50aGVuKFxuICAgICgpID0+IHt9LFxuICAgICgpID0+IHt9LFxuICApO1xuICBzZXNzaW9uQ2hhaW5zLnNldChzZXNzaW9uSWQsIHRhaWwpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBuZXh0O1xuICB9IGZpbmFsbHkge1xuICAgIC8vIOq3uCDsgqzsnbQg64uk66W4IHR1cm4g7J20IOyytOyduOydhCDsnbTslrTrsJvslZjsnLzrqbQgdGFpbCDsnbQg6rWQ7LK064+8IOyeiOuLpCDigJQg6re465WM64qUIOyCreygnO2VmOyngCDslYrripTri6QuXG4gICAgaWYgKHNlc3Npb25DaGFpbnMuZ2V0KHNlc3Npb25JZCkgPT09IHRhaWwpIHNlc3Npb25DaGFpbnMuZGVsZXRlKHNlc3Npb25JZCk7XG4gIH1cbn1cblxuLy8g4pSA4pSAIGNvb3JkIOunpO2VkSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLy8gdG9rZW4g6riw67CYIOyViOyglSB3b3JrZXJJZCDtlanshLEuIEFudGhyb3BpYyDsnYAgd29ya2VyIHBvb2wg7J20IOyXhuycvOuvgOuhnCB0b2tlbklkIOulvCDqt7jrjIDroZwg7JO064ukLlxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VBbnRocm9waWNXb3JrZXJJZCh0b2tlbklkOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdG9rZW5JZDtcbn1cblxuLy8g4pSA4pSAIGVudmVsb3BlIGRlY29yYXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vLyBzdHJlYW0tanNvbiDsnoXroKUg65287J247JeQIFNESyBlbnZlbG9wZSDrtoDssKkg7ZuEIOyngeugrO2ZlC4gc2Vzc2lvbiDshozsnKDsnpDsnbgg7Jes6riw7IScIO2VnOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZUFuZFNlcmlhbGl6ZShcbiAgbGluZXM6IEFycmF5PENsYXVkZVN0cmVhbUpzb25MaW5lPixcbiAgc2Vzc2lvbklkOiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIGxpbmVzXG4gICAgICAubWFwKChsaW5lKSA9PlxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgLi4ubGluZSxcbiAgICAgICAgICBzZXNzaW9uX2lkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgdXVpZDogcmFuZG9tVVVJRCgpLFxuICAgICAgICAgIHBhcmVudF90b29sX3VzZV9pZDogbnVsbCxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuam9pbihcIlxcblwiKSArIFwiXFxuXCJcbiAgKTtcbn1cblxuLy8g4pSA4pSAIHNwYXduICsgY29uc3VtZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTZXNzaW9uUmVxdWVzdCB7XG4gIHRva2VuSWQ6IG51bWJlcjtcbiAgdG9rZW46IHN0cmluZzsgLy8gT0F1dGggYWNjZXNzIHRva2VuXG4gIG1vZGVsOiBzdHJpbmc7XG4gIHN5c3RlbT86IHN0cmluZztcbiAganNvblNjaGVtYT86IHN0cmluZzsgLy8g7J6I7Jy866m0IHN0cnVjdHVyZWQgb3V0cHV0XG4gIGVmZm9ydD86IHN0cmluZztcbiAgdGltZW91dE1zOiBudW1iZXI7XG4gIGNvbGRIaXN0b3J5PzogQXJyYXk8SnNvblZhbHVlPjtcbiAgaW5wdXQ6IEFycmF5PFVzZXJJbnB1dD47XG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsYXVkZVNlc3Npb25SZXN1bHQgZXh0ZW5kcyBDbGF1ZGVTdHJlYW1SZXN1bHQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgd29ya2VySWQ6IG51bWJlcjtcbiAgdHRmdE1zOiBudW1iZXIgfCBudWxsO1xufVxuXG4vLyBwZXItdG9rZW4gQ0xBVURFX0NPTkZJR19ESVIg67O07J6lKOqyqeumrCkuIOqyveuhnCDqt5zsuZnsnYAgYW50aHJvcGljQ29uZmlnRGlyKOyInOyImCDtlajsiJgp7J20IOyGjOycoCDigJRcbi8vIOyXrOq4sOyEoCDqt7gg6rK966Gc7JeQIOu5iCBzZXR0aW5ncyDrpbwg6rmU7JWEIGNsYXVkZS1tZW0gaG9vayDrk7HsnYQg7LCo64uo7ZWc64ukLiAoUjEwIOqyqeumrClcbi8vIOydtCBzZWVkIO2MjOydvOydgCBjbGF1ZGUtbWVtIGhvb2sgLyDsgqzsmqnsnpAg7ISk7KCVIOyYpOyXvCDssKjri6jsnYQg7JyE7ZWcIOqyqeumrCDqsr3qs4Tri6QuIOunpCDtmLjstpzrp4jri6Qg64uk7IucIOyNqOyEnFxuLy8g7Jm467aAIOuzgOyhsMK37IKt7KCcIO2bhOyXkOuPhCDri6TsnYwg7Iuk7ZaJ7JeQ7IScIHNlbGYtaGVhbGluZyDrkJjrj4TroZ0g6riw7KG0IHNlbWFudGljcyDrpbwg7Jyg7KeA7ZWc64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUNvbmZpZ0Rpcih0b2tlbklkOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBkaXIgPSBhbnRocm9waWNDb25maWdEaXIodG9rZW5JZCk7XG4gIG1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB3cml0ZUZpbGVTeW5jKGAke2Rpcn0vLmNsYXVkZS5qc29uYCwgXCJ7fVwiKTtcbiAgd3JpdGVGaWxlU3luYyhgJHtkaXJ9L3NldHRpbmdzLmpzb25gLCBcInt9XCIpO1xuICByZXR1cm4gZGlyO1xufVxuXG5sZXQgY3dkRW5zdXJlZCA9IGZhbHNlO1xuZnVuY3Rpb24gZW5zdXJlQ3dkKCk6IHZvaWQge1xuICBpZiAoY3dkRW5zdXJlZCkgcmV0dXJuO1xuICBta2RpclN5bmMoYCR7QU5USFJPUElDX0NMQVVERV9DV0R9Ly5jbGF1ZGVgLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgd3JpdGVGaWxlU3luYyhgJHtBTlRIUk9QSUNfQ0xBVURFX0NXRH0vLmNsYXVkZS9zZXR0aW5ncy5qc29uYCwgXCJ7fVwiKTtcbiAgY3dkRW5zdXJlZCA9IHRydWU7XG59XG5cbi8vIHNwYXduIGFyZ3Mg6rWs7ISxLiDrqYDti7DthLQv6rKp66asL3N0cnVjdHVyZWQg66qo65OcIOuwmOyYgS5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU9uZU1pbGxpb25TdWZmaXgobW9kZWw6IHN0cmluZywgbmVlZHNTdWZmaXg6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gY2Fub25pY2FsQW50aHJvcGljTW9kZWwobW9kZWwpO1xuICByZXR1cm4gbmVlZHNTdWZmaXggPyBgJHtiYXNlfVsxbV1gIDogYmFzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uZU1pbGxpb25FbnYoc3VwcG9ydGVkOiBib29sZWFuKTogeyBDTEFVREVfQ09ERV9ESVNBQkxFXzFNX0NPTlRFWFQ/OiBcIjFcIiB9IHtcbiAgcmV0dXJuIHN1cHBvcnRlZCA/IHt9IDogeyBDTEFVREVfQ09ERV9ESVNBQkxFXzFNX0NPTlRFWFQ6IFwiMVwiIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aGlua2luZ0Vudihtb2RlbDogc3RyaW5nKToge1xuICBDTEFVREVfQ09ERV9ESVNBQkxFX0FEQVBUSVZFX1RISU5LSU5HPzogXCIxXCI7XG4gIE1BWF9USElOS0lOR19UT0tFTlM/OiBcIjBcIjtcbn0ge1xuICByZXR1cm4gdXNlc0FkYXB0aXZlVGhpbmtpbmcobW9kZWwpXG4gICAgPyB7fVxuICAgIDoge1xuICAgICAgICBDTEFVREVfQ09ERV9ESVNBQkxFX0FEQVBUSVZFX1RISU5LSU5HOiBcIjFcIixcbiAgICAgICAgTUFYX1RISU5LSU5HX1RPS0VOUzogXCIwXCIsXG4gICAgICB9O1xufVxuXG4vLyBTT04tNDk1OiBzdHJ1Y3R1cmVkIG91dHB1dCByZXRyeSDrpbwgMSDroZwg6rOg7KCV7ZWc64ukLiBDQyDqsIAgYXR0ZW1wdCDrpbwgcmVqZWN0IO2VmOqzoCByZXRyeSDtlZjrqbRcbi8vIGB7cmVqZWN0ZWR9e2FjY2VwdGVkfWAg64iE7KCB7J20IEFJLVNESyDsnZggSlNPTi5wYXJzZSDrpbwg6rmo65yo66as66+A66GcLCByZXRyeSDsnpDssrTrpbwg66eJ7JWEIOq3uCDqsr3roZzrpbxcbi8vIOybkOyynCDssKjri6jtlZzri6QuIGAwYCDsnYAgQ0MgcXVlcnkgbG9vcChgY2FsbHNUaGlzUXVlcnkgPj0gbWF4UmV0cmllc2Ap6rCAIOyyqyBhdHRlbXB0IGVtaXQg7KCE7JeQXG4vLyDsi6TtjKjsi5ztgqTrr4DroZwoYGVycm9yX21heF9zdHJ1Y3R1cmVkX291dHB1dF9yZXRyaWVzYCkg7Jm467aAIOqwkuydtCAxIOuvuOunjOydtOyWtOuPhCAxIOuhnCDtgbTrnqjtlITtlZzri6QuXG5leHBvcnQgZnVuY3Rpb24gc3RydWN0dXJlZE91dHB1dFJldHJpZXNFbnYocmF3ID0gcHJvY2Vzcy5lbnYuTUFYX1NUUlVDVFVSRURfT1VUUFVUX1JFVFJJRVMpOiB7XG4gIE1BWF9TVFJVQ1RVUkVEX09VVFBVVF9SRVRSSUVTOiBzdHJpbmc7XG59IHtcbiAgaWYgKCFyYXcpIHJldHVybiB7IE1BWF9TVFJVQ1RVUkVEX09VVFBVVF9SRVRSSUVTOiBcIjFcIiB9O1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIucGFyc2VJbnQocmF3LCAxMCk7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkpIHJldHVybiB7IE1BWF9TVFJVQ1RVUkVEX09VVFBVVF9SRVRSSUVTOiBcIjFcIiB9O1xuICByZXR1cm4geyBNQVhfU1RSVUNUVVJFRF9PVVRQVVRfUkVUUklFUzogU3RyaW5nKE1hdGgubWF4KHBhcnNlZCwgMSkpIH07XG59XG5cbi8vIFNPTi00OTUg7J2YIHJldHJ5IOqzoOygleydgCBcIuyKpO2KuOumrOuwjSArIHN0cnVjdHVyZWRcIiDsobDtlakg7ZWc7KCVIOygleyxheydtOuLpC4g7Iqk7Yq466a87JeQ7IScIHJldHJ5IOqwgCDrj4zrqbRcbi8vIHdhbGwtY2xvY2sg7J20IDLrsLDqsIAg65CY7Ja0IOyLpOyaqeyEseydtCDsl4bquLAg65WM66y47J2064ukKOybkCDqsrDsoJUg7IKs7JygKS4g64W87Iqk7Yq466a8IGdlbmVyYXRlIOuKlCDslaDstIjsl5Ag7JmE66OM66W8XG4vLyDquLDri6Trpqzrr4DroZwg6re4IOyCrOycoOqwgCDshLHrpr3tlZjsp4Ag7JWK64qU64ukLiDrsJjrqbQgQ2xhdWRlIOqzhOyXtOydgCBPcGVuQUkg64yA67mEIHN0cnVjdHVyZWQgb3V0cHV0IOykgOyImOycqOydtFxuLy8g64Ku7JWELCDrhbzsiqTtirjrprzquYzsp4AgcmV0cnk9MSDroZwg66y27Jy866m0IDHtmowgcmVqZWN0IOqwgCDqs6frsJTroZxcbi8vIGBlcnJvcl9tYXhfc3RydWN0dXJlZF9vdXRwdXRfcmV0cmllc2Ag66GcIOyngeqysOuQnOuLpCjsi6TsuKE6IGRldGlfcHJvZHVjdGlvbiBvcHVzLTQtOCDsi6TtjKjsnKggMzkuNiUpLlxuLy8g7Iqk7Yq466as67CNIOyXrOu2gOuKlCBgLS1pbmNsdWRlLXBhcnRpYWwtbWVzc2FnZXNgIOulvCDrtpnsnbTripQgZ2VuZXJhdGVTdHJlYW0g6rK966Gc7JeQ7ISc66eMIHRydWUg6rCAIOuQmOuvgOuhnFxuLy8gKGFudGhyb3BpYy1kaXNwYXRjaGVyIOydmCBnZW5lcmF0ZS9nZW5lcmF0ZVN0cmVhbSDrtoTquLApIOydtOulvCDsi6Tsp4gg6rWs67aE7J6Q66GcIOyTtOuLpC5cbi8vIOu5hOyEseqztSBzdWJ0eXBlIOydhCDtla3sg4EgaXNFcnJvciDroZwg7Jis66as64qUIFNPTi00OTUg7J2YIOuCmOuouOyngCDsoIjrsJjsnYAg6re464yA66GcIOycoOyngOuQnOuLpCDigJQgcmV0cnkg7ZuE7JeQ64+EXG4vLyBkZWdlbmVyYXRlIOy2nOugpeydtOuptCDsobDsmqntnogg7Ya16rO87Iuc7YKk7KeAIOyViuqzoCDsoJXsp4HtlZjqsowg7Iuk7Yyo7ZWc64ukLlxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFBpblN0cnVjdHVyZWRSZXRyaWVzKG9wdHM6IHtcbiAgdXNlU3RydWN0dXJlZDogYm9vbGVhbjtcbiAgaW5jbHVkZVBhcnRpYWxNZXNzYWdlcz86IGJvb2xlYW47XG59KTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRzLnVzZVN0cnVjdHVyZWQgJiYgb3B0cy5pbmNsdWRlUGFydGlhbE1lc3NhZ2VzID09PSB0cnVlO1xufVxuXG4vLyBMaW51eCDri6jsnbwgYXJndiDsnbjsnpAg7ZWc6rOEKE1BWF9BUkdfU1RSTEVOID0gUEFHRV9TSVpFw5czMiA9IDEyOEtCLCDsu6TrhJAg7ZWY65Oc7L2U65SpIOyDgeyImClcbi8vIOyLnOyKpO2FnCDtlITroaztlITtirjqsIAg7J2066W8IOuEmOycvOuptCBleGVjdmUg6rCAIEUyQklHIOuhnCDqsbDrtoDrkJzri6QuIGRldGkg65OxIOuMgO2YlSDtlITroaztlITtirjripQg7Iuk7LihXG4vLyDtj4nqt6AgMzQzS0LCt+y1nOuMgCA0ODVLQihvcHVzLTQtOCnrnbwg7J287IOB7KCB7Jy866GcIOy0iOqzvO2VnOuLpC4g7ZWc6rOE7J2YIOygiOuwmCg2NEtCKeydhCDsnoTqs4TqsJLsnLzroZwg7J6h7JWEXG4vLyBVVEYtOCDrqYDti7DrsJTsnbTtirjCt+yYiOy4oSDrqrsg7ZWcIOyXrOycoOu2hOq5jOyngCDslYjsoIQg66eI7KeE7J2EIOuRlOuLpC5cbmV4cG9ydCBjb25zdCBTWVNURU1fUFJPTVBUX0FSR1ZfTUFYX0JZVEVTID0gQVJHVl9TQUZFX01BWF9VVEY4X0JZVEVTO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDbGF1ZGVBcmdzKG9wdHM6IHtcbiAgbW9kZWw6IHN0cmluZztcbiAgLy8g7Iuc7Iqk7YWcIO2UhOuhrO2UhO2KuCDsoITri6zsnYAg7YGs6riw66GcIOu2hOq4sO2VnOuLpCjtmLjstpzrtoDqsIAg6rKw7KCVKTpcbiAgLy8gIC0g7J6R7Jy866m0IHN5c3RlbShpbmxpbmUpIOKGkiAtLXN5c3RlbS1wcm9tcHQgPHRleHQ+ICjtjIzsnbwgSS9PIOyXhuydjCwg6riw7KG0IOqyveuhnClcbiAgLy8gIC0g7YGs66m0IHN5c3RlbVByb21wdEZpbGUo6rK966GcKSDihpIgLS1zeXN0ZW0tcHJvbXB0LWZpbGUgPHBhdGg+IChhcmd2IO2VnOqzhCDtmoztlLwpXG4gIC8vIC0tc3lzdGVtLXByb21wdC1maWxlIOydgCAtLXN5c3RlbS1wcm9tcHQg7JmAIOuPmeydvO2VmOqyjCBkZWZhdWx0IOulvCByZXBsYWNlIO2VnOuLpChhcHBlbmQg7JWE64uYIOKAlFxuICAvLyBSNyDqsqnrpqwg67O07KG0LCDsi6TsuKEg7ZmV7J24KS4g65GYIOuLpCDsl4bsnLzrqbQg67mIIC0tc3lzdGVtLXByb21wdChkZWZhdWx0IDIzayDso7zsnoUg67Cp7KeAKS5cbiAgc3lzdGVtPzogc3RyaW5nO1xuICBzeXN0ZW1Qcm9tcHRGaWxlPzogc3RyaW5nO1xuICBlZmZvcnQ/OiBzdHJpbmc7XG4gIGpzb25TY2hlbWE/OiBzdHJpbmc7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBuZWVkc09uZU1pbGxpb25TdWZmaXg/OiBib29sZWFuO1xuICBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzPzogYm9vbGVhbjtcbn0pOiBBcnJheTxzdHJpbmc+IHtcbiAgY29uc3QgdXNlU3RydWN0dXJlZCA9IEJvb2xlYW4ob3B0cy5qc29uU2NoZW1hICYmIG9wdHMuanNvblNjaGVtYS5sZW5ndGggPiAwKTtcbiAgaWYgKHVzZVN0cnVjdHVyZWQpIGFzc2VydEFudGhyb3BpY1NjaGVtYUFyZ3ZTaXplKG9wdHMuanNvblNjaGVtYSEpO1xuICAvLyAtLXRvb2xzIFwiXCIg66GcIOyghOyytCDssKjri6gsIHN0cnVjdHVyZWQoanNvblNjaGVtYSDsnojsnYwpIOuptCBTdHJ1Y3R1cmVkT3V0cHV0IOunjCDtl4jsmqkuXG4gIGNvbnN0IHRvb2xBcmdzID0gdXNlU3RydWN0dXJlZFxuICAgID8gW1wiLS10b29sc1wiLCBcIlwiLCBcIi0tYWxsb3dlZC10b29sc1wiLCBcIlN0cnVjdHVyZWRPdXRwdXRcIl1cbiAgICA6IFtcIi0tdG9vbHNcIiwgXCJcIl07XG5cbiAgLy8g7Iuc7Iqk7YWcIO2UhOuhrO2UhO2KuDog7YyM7J28IOqyveuhnOqwgCDsmKTrqbQgLS1zeXN0ZW0tcHJvbXB0LWZpbGUsIOyVhOuLiOuptCBpbmxpbmUgLS1zeXN0ZW0tcHJvbXB0LlxuICAvLyAo7Zi47Lac67aA6rCAIO2BrOq4sOuhnCDrtoTquLDtlbQg65GYIOykkSDtlZjrgpjrp4wg7LGE7Jq064ukLiDrkZgg64ukIOyXhuycvOuptCDruYggLS1zeXN0ZW0tcHJvbXB0LilcbiAgY29uc3Qgc3lzdGVtQXJncyA9IG9wdHMuc3lzdGVtUHJvbXB0RmlsZVxuICAgID8gW1wiLS1zeXN0ZW0tcHJvbXB0LWZpbGVcIiwgb3B0cy5zeXN0ZW1Qcm9tcHRGaWxlXVxuICAgIDogW1wiLS1zeXN0ZW0tcHJvbXB0XCIsIG9wdHMuc3lzdGVtID8/IFwiXCJdO1xuXG4gIGNvbnN0IGFyZ3M6IEFycmF5PHN0cmluZz4gPSBbXG4gICAgXCItcFwiLFxuICAgIC4uLnRvb2xBcmdzLFxuICAgIFwiLS1kaXNhbGxvd2VkVG9vbHNcIixcbiAgICAuLi5BTlRIUk9QSUNfRElTQUxMT1dFRF9UT09MUyxcbiAgICBcIi0taW5wdXQtZm9ybWF0XCIsXG4gICAgXCJzdHJlYW0tanNvblwiLFxuICAgIFwiLS1vdXRwdXQtZm9ybWF0XCIsXG4gICAgXCJzdHJlYW0tanNvblwiLFxuICAgIFwiLS12ZXJib3NlXCIsXG4gICAgLi4uKG9wdHMuaW5jbHVkZVBhcnRpYWxNZXNzYWdlcyA/IFtcIi0taW5jbHVkZS1wYXJ0aWFsLW1lc3NhZ2VzXCJdIDogW10pLFxuICAgIFwiLS1wZXJtaXNzaW9uLW1vZGVcIixcbiAgICBcImJ5cGFzc1Blcm1pc3Npb25zXCIsXG4gICAgXCItLXNldHRpbmctc291cmNlc1wiLFxuICAgIFwicHJvamVjdFwiLFxuICAgIFwiLS1tb2RlbFwiLFxuICAgIGFwcGx5T25lTWlsbGlvblN1ZmZpeChvcHRzLm1vZGVsLCBvcHRzLm5lZWRzT25lTWlsbGlvblN1ZmZpeCA/PyBmYWxzZSksXG4gICAgLy8gaW5saW5lIFtTeXN0ZW1dIOq4iOyngCDigJQg7KCV7IudIOyxhOuEkOunjChSNykuIOyDneuetSDsi5wgQ0MgZGVmYXVsdCgyM2spIOyjvOyeheuQmOuvgOuhnCDrsJjrk5zsi5wg66qF7IucLlxuICAgIC8vIO2BrOq4sOyXkCDrlLDrnbwgLS1zeXN0ZW0tcHJvbXB0KOyekeydjCkgLyAtLXN5c3RlbS1wcm9tcHQtZmlsZSjtgbwp66GcIOu2hOq4sChzeXN0ZW1BcmdzKS5cbiAgICAuLi5zeXN0ZW1BcmdzLFxuICAgIC8vIEZhYmxlIDUg64qUIGFkYXB0aXZlIHRoaW5raW5nIOydtCDtlYTsiJjsnbTqs6AsIE9wdXMgNSDripQg6rO17IudIOq4sOuzuCBhZGFwdGl2ZSDrj5nsnpHsnYQg67O07KG07ZWc64ukLlxuICAgIC4uLih1c2VzQWRhcHRpdmVUaGlua2luZyhvcHRzLm1vZGVsKSA/IFtdIDogW1wiLS10aGlua2luZ1wiLCBcImRpc2FibGVkXCJdKSxcbiAgICAvLyBDbGF1ZGUgQ29kZSDslrTtnJgg67CW7J2YIGVmZm9ydChPcGVuQUkg7KCE7JqpIHVsdHJhLCDsmJsgbm9uZS9taW5pbWFsIOuTsSnripQg7KGw7Jqp7Z6IIOuyhOumrOqzoCBxZ3JpZCDquLDrs7jsnYQg7JO064ukLlxuICAgIFwiLS1lZmZvcnRcIixcbiAgICByZXNvbHZlQW50aHJvcGljRWZmb3J0KG9wdHMuZWZmb3J0KSA/PyBBTlRIUk9QSUNfREVGQVVMVF9FRkZPUlQsXG4gICAgXCItLWRpc2FibGUtc2xhc2gtY29tbWFuZHNcIixcbiAgICBcIi0tc2Vzc2lvbi1pZFwiLFxuICAgIG9wdHMuc2Vzc2lvbklkLFxuICBdO1xuICBpZiAodXNlU3RydWN0dXJlZCkgYXJncy5wdXNoKFwiLS1qc29uLXNjaGVtYVwiLCBvcHRzLmpzb25TY2hlbWEhKTtcbiAgcmV0dXJuIGFyZ3M7XG59XG5cbi8qKlxuICogQ2xhdWRlIOyEuOyFmOydhCBzcGF3biDtlbQg7ZWcIHR1cm4g7J2EIOyLpO2Wie2VnOuLpC4gcGVyLXNlc3Npb24g65297Jy866GcIOyngeugrO2ZlOuQnOuLpC5cbiAqIEBwYXJhbSBvbkRlbHRhIOygkOynhCDthY3siqTtirggZGVsdGEoc3RyZWFtVGV4dCkg65iQ64qUIHN0cnVjdHVyZWQg67aA67aEIEpTT04oc3RyZWFtT2JqZWN0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNsYXVkZVNlc3Npb24oXG4gIHJlcTogQ2xhdWRlU2Vzc2lvblJlcXVlc3QsXG4gIG9uRGVsdGE6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQsXG4pOiBQcm9taXNlPENsYXVkZVNlc3Npb25SZXN1bHQ+IHtcbiAgLy8g7KCV6rec7ZmUIOq3nOy5meydgCBjYW5vbmljYWxBbnRocm9waWNNb2RlbCDsnbQg64uo64+FIOyGjOycoCDigJQgZGlzcGF0Y2hlciDqsIAg7J2066+4IGNhbm9uaWNhbCDsnYQg64SY6riw7KeA66eMLFxuICAvLyDsp4HsoJEg7Zi47LacKO2FjOyKpO2KuC/rr7jrnpggY2FsbGVyKSDrjIDruYQg67Cp7Ja07KCB7Jy866GcIO2VnCDrsogg642UIO2GteqzvOyLnO2CqOuLpCjsnbTrr7ggY2Fub25pY2FsIOydtOuptCBuby1vcCkuXG4gIGFzc2VydFN1cHBvcnRlZE9uZU1pbGxpb25TdWZmaXgocmVxLm1vZGVsKTtcbiAgY29uc3QgbW9kZWwgPSBjYW5vbmljYWxBbnRocm9waWNNb2RlbChyZXEubW9kZWwpO1xuICBjb25zdCBzdXBwb3J0c09uZU1pbGxpb24gPSBzdXBwb3J0czFNQ29udGV4dChtb2RlbCk7XG4gIGNvbnN0IG5lZWRzT25lTWlsbGlvblN1ZmZpeCA9IG5lZWRzQ2xpMW1TdWZmaXgobW9kZWwpO1xuICBjb25zdCBzZXNzaW9uSWQgPSByYW5kb21VVUlEKCk7XG4gIGNvbnN0IHVzZVN0cnVjdHVyZWQgPSBCb29sZWFuKHJlcS5qc29uU2NoZW1hICYmIHJlcS5qc29uU2NoZW1hLmxlbmd0aCA+IDApO1xuICBjb25zdCB3b3JrZXJJZCA9IG1ha2VBbnRocm9waWNXb3JrZXJJZChyZXEudG9rZW5JZCk7XG5cbiAgcmV0dXJuIHdpdGhTZXNzaW9uTG9jayhzZXNzaW9uSWQsICgpID0+IHtcbiAgICBlbnN1cmVDd2QoKTtcbiAgICBjb25zdCBjb25maWdEaXIgPSBlbnN1cmVDb25maWdEaXIocmVxLnRva2VuSWQpO1xuXG4gICAgLy8g7Iuc7Iqk7YWcIO2UhOuhrO2UhO2KuOulvCDtgazquLDroZwg67aE6riwOiAxMjhLQihhcmd2IO2VnOqzhCnsnZgg7KCI67CY7J2EIOuEmOycvOuptCDtjIzsnbzroZwg64SY6rKoIEUyQklHIO2ajO2UvC5cbiAgICAvLyDsnpHsnYAg7ZSE66Gs7ZSE7Yq464qUIO2MjOydvCBJL08g7JeG7J20IOq4sOyhtCBpbmxpbmUg6rK966Gc66W8IOq3uOuMgOuhnCDsk7Tri6Qo64yA67aA67aE7J2YIO2YuOy2nCkuXG4gICAgLy8g7Iuk7KCcIO2MjOydvCDsk7DquLDripQgYWJvcnQg7LK07YGsIOydtO2bhChQcm9taXNlIOyViCnroZwg66+466SELCDsnbTrr7gg7Leo7IaM65CcIOyalOyyreyXlCDsk7Dsp4Ag7JWK64qU64ukLlxuICAgIGNvbnN0IHN5c3RlbSA9IHJlcS5zeXN0ZW0gPz8gXCJcIjtcbiAgICBjb25zdCB1c2VTeXN0ZW1Qcm9tcHRGaWxlID0gQnVmZmVyLmJ5dGVMZW5ndGgoc3lzdGVtLCBcInV0ZjhcIikgPiBTWVNURU1fUFJPTVBUX0FSR1ZfTUFYX0JZVEVTO1xuICAgIGNvbnN0IHN5c3RlbVByb21wdEZpbGUgPSB1c2VTeXN0ZW1Qcm9tcHRGaWxlXG4gICAgICA/IGAke2NvbmZpZ0Rpcn0vc3lzdGVtLXByb21wdC0ke3Nlc3Npb25JZH0udHh0YFxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBhcmdzID0gYnVpbGRDbGF1ZGVBcmdzKHtcbiAgICAgIG1vZGVsLFxuICAgICAgc3lzdGVtOiB1c2VTeXN0ZW1Qcm9tcHRGaWxlID8gdW5kZWZpbmVkIDogcmVxLnN5c3RlbSxcbiAgICAgIHN5c3RlbVByb21wdEZpbGUsXG4gICAgICBlZmZvcnQ6IHJlcS5lZmZvcnQsXG4gICAgICBqc29uU2NoZW1hOiByZXEuanNvblNjaGVtYSxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIG5lZWRzT25lTWlsbGlvblN1ZmZpeCxcbiAgICAgIGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM6IHJlcS5pbmNsdWRlUGFydGlhbE1lc3NhZ2VzLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW5wdXRMaW5lcyA9IGJ1aWxkU3RyZWFtSnNvbklucHV0KHtcbiAgICAgIGNvbGRIaXN0b3J5OiByZXEuY29sZEhpc3RvcnksXG4gICAgICBpbnB1dDogcmVxLmlucHV0LFxuICAgIH0pO1xuICAgIGNvbnN0IHN0ZGluUGF5bG9hZCA9IGRlY29yYXRlQW5kU2VyaWFsaXplKGlucHV0TGluZXMsIHNlc3Npb25JZCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8Q2xhdWRlU2Vzc2lvblJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHJlcS5hYm9ydFNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKFwiYWJvcnRlZFwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8g64yA7ZiVIOyLnOyKpO2FnCDtlITroaztlITtirjripQgc3Bhd24g7KeB7KCE7JeQIO2MjOydvOuhnCDquLDroZ0oYXJndiBFMkJJRyDtmoztlLwpLiDsooXro4wg7IucIOygleumrO2VnOuLpC5cbiAgICAgIGlmIChzeXN0ZW1Qcm9tcHRGaWxlKSB3cml0ZUZpbGVTeW5jKHN5c3RlbVByb21wdEZpbGUsIHN5c3RlbSk7XG5cbiAgICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oXCJjbGF1ZGVcIiwgYXJncywge1xuICAgICAgICAvLyBzdGRlcnIg64+EIOy6oeyymDogaW52YWxpZCBPQXV0aCAvIOyemOuqu+uQnCDtlIzrnpjqt7ggLyBDTEkg6rKA7KadIOyLpO2MqOqwgFxuICAgICAgICAvLyBcImNsb3NlZCB3aXRob3V0IHJlc3VsdFwiIOuhnCDrrYnqsJzsp4Dsp4Ag7JWK6rKMIGNsb3NlL2Vycm9yIOyXkCBzdGRlcnIg66W8IOyLpOyWtCDrs7Trgrjri6QuXG4gICAgICAgIHN0ZGlvOiBbXCJwaXBlXCIsIFwicGlwZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIGN3ZDogQU5USFJPUElDX0NMQVVERV9DV0QsXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIFBBVEg6IHByb2Nlc3MuZW52LlBBVEgsXG4gICAgICAgICAgVE1QRElSOiBwcm9jZXNzLmVudi5UTVBESVIsXG4gICAgICAgICAgQ0xBVURFX0NPREVfT0FVVEhfVE9LRU46IHJlcS50b2tlbixcbiAgICAgICAgICBDTEFVREVfQ09ORklHX0RJUjogY29uZmlnRGlyLFxuICAgICAgICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQVVUT19NRU1PUlk6IFwiMVwiLFxuICAgICAgICAgIC4uLnRoaW5raW5nRW52KG1vZGVsKSxcbiAgICAgICAgICAuLi5vbmVNaWxsaW9uRW52KHN1cHBvcnRzT25lTWlsbGlvbiksXG4gICAgICAgICAgQ0xBVURFX0NPREVfRElTQUJMRV9DTEFVREVfTURTOiBcIjFcIixcbiAgICAgICAgICBDTEFVREVfQ09ERV9ESVNBQkxFX1RFUk1JTkFMX1RJVExFOiBcIjFcIixcbiAgICAgICAgICBDTEFVREVfQ09ERV9ESVNBQkxFX0JVTkRMRURfU0tJTExTOiBcIjFcIixcbiAgICAgICAgICBDTEFVREVfQ09ERV9ESVNBQkxFX1dPUktGTE9XUzogXCIxXCIsXG4gICAgICAgICAgQ0xBVURFX0NPREVfQVRUUklCVVRJT05fSEVBREVSOiBcIjBcIixcbiAgICAgICAgICAvLyBzdHJ1Y3R1cmVkICsg7Iqk7Yq466as67CN7J28IOuVjOunjCByZXRyeSDrpbwg6rOg7KCV7ZWc64ukKFNPTi00OTUpLiB0ZXh0IOuqqOuTnOyZgCDrhbzsiqTtirjrprxcbiAgICAgICAgICAvLyBnZW5lcmF0ZSDripQgQ0Mg6riw67O4IHJldHJ5IOulvCDqt7jrjIDroZwg7JO064ukLlxuICAgICAgICAgIC4uLihzaG91bGRQaW5TdHJ1Y3R1cmVkUmV0cmllcyh7XG4gICAgICAgICAgICB1c2VTdHJ1Y3R1cmVkLFxuICAgICAgICAgICAgaW5jbHVkZVBhcnRpYWxNZXNzYWdlczogcmVxLmluY2x1ZGVQYXJ0aWFsTWVzc2FnZXMsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAgID8gc3RydWN0dXJlZE91dHB1dFJldHJpZXNFbnYoKVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGxldCBidWZmZXIgPSBcIlwiO1xuICAgICAgY29uc3Qgc3RyZWFtU3RhdGU6IENsYXVkZVN0cmVhbUpzb25TdGF0ZSA9IHt9O1xuICAgICAgY29uc3QgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpO1xuICAgICAgY29uc3Qgb25UcmFja2VkRGVsdGEgPSB0dGZ0VHJhY2tlci53cmFwRGVsdGEob25EZWx0YSk7XG4gICAgICAvLyBib3VuZGVkIHN0ZGVyciDrsoTtjbwo7LWc6re8IH40S0Lrp4wg7Jyg7KeAIOKAlCDrrLTtlZwg64iE7KCBIOuwqeyngCkuXG4gICAgICBsZXQgc3RkZXJyQnVmID0gXCJcIjtcbiAgICAgIGNvbnN0IFNUREVSUl9DQVAgPSA0MDk2O1xuICAgICAgY2hpbGQuc3RkZXJyPy5vbihcImRhdGFcIiwgKGQ6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBzdGRlcnJCdWYgPSAoc3RkZXJyQnVmICsgZC50b1N0cmluZygpKS5zbGljZSgtU1RERVJSX0NBUCk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0ZGVyclN1ZmZpeCA9ICgpID0+IChzdGRlcnJCdWYudHJpbSgpID8gYCDigJQgc3RkZXJyOiAke3N0ZGVyckJ1Zi50cmltKCl9YCA6IFwiXCIpO1xuICAgICAgLy8gc3Bhd24g7IucIOyTtCDsnoTsi5wg7Iuc7Iqk7YWcIO2UhOuhrO2UhO2KuCDtjIzsnbwg7KCV66asKO2VnCDrsojrp4wpLiDrqqjrk6Ag7KKF66OMIOqyveuhnOyXkOyEnCDtmLjstpztlZzri6QuXG4gICAgICAvLyDriITrnb3rj7zrj4Qg64uk7J2MIGVuc3VyZUNvbmZpZ0RpciDqsIAg65SU66CJ7Yag66as66W8IOyerOyCrOyaqe2VoCDrv5DsnbTsp4Drp4wsIHNlc3Npb25JZCDrs4Qg7YyM7J287J206528XG4gICAgICAvLyDsjJPsnbTrqbQg65SU7Iqk7YGs6rCAIOywqOuvgOuhnCBzZXR0bGUg7IucIOymieyLnCDsp4DsmrTri6QuXG4gICAgICBjb25zdCBjbGVhbnVwU3Bhd25GaWxlcyA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFzeXN0ZW1Qcm9tcHRGaWxlKSByZXR1cm47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdW5saW5rU3luYyhzeXN0ZW1Qcm9tcHRGaWxlKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8g7J2066+4IOyXhuqxsOuCmCDqtoztlZwg66y47KCc66m0IOustOyLnCDigJQg7KCV66as64qUIGJlc3QtZWZmb3J0LlxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbGV0IGNsZWFudXBBYm9ydDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXBBYm9ydD8uKCk7XG4gICAgICAgIGNsZWFudXBTcGF3bkZpbGVzKCk7XG4gICAgICAgIGNoaWxkLmtpbGwoKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ2xhdWRlIHNlc3Npb24gdGltZW91dCBhZnRlciAke3JlcS50aW1lb3V0TXMgLyAxMDAwfXNgKSk7XG4gICAgICB9LCByZXEudGltZW91dE1zKTtcblxuICAgICAgY29uc3QgZmluaXNoID0gKHJlc3VsdDogQ2xhdWRlU3RyZWFtUmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICBjbGVhbnVwQWJvcnQ/LigpO1xuICAgICAgICBjbGVhbnVwU3Bhd25GaWxlcygpO1xuICAgICAgICByZXNvbHZlKHsgLi4ucmVzdWx0LCBzZXNzaW9uSWQsIHdvcmtlcklkLCB0dGZ0TXM6IHR0ZnRUcmFja2VyLnZhbHVlKCkgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvbkFib3J0ID0gKCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgY2xlYW51cEFib3J0Py4oKTtcbiAgICAgICAgY2xlYW51cFNwYXduRmlsZXMoKTtcbiAgICAgICAgY2hpbGQua2lsbCgpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKFwiYWJvcnRlZFwiKSk7XG4gICAgICB9O1xuICAgICAgY2xlYW51cEFib3J0ID0gKCkgPT4gcmVxLmFib3J0U2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgICByZXEuYWJvcnRTaWduYWw/LmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG5cbiAgICAgIGNoaWxkLnN0ZG91dD8ub24oXCJkYXRhXCIsIChkOiBCdWZmZXIpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgYnVmZmVyICs9IGQudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIGJ1ZmZlciA9IGxpbmVzLnBvcCgpID8/IFwiXCI7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGhhbmRsZVN0cmVhbUpzb25MaW5lKGxpbmUsIG9uVHJhY2tlZERlbHRhLCB7XG4gICAgICAgICAgICBzdHJ1Y3R1cmVkT3V0cHV0OiB1c2VTdHJ1Y3R1cmVkLFxuICAgICAgICAgICAgc3RhdGU6IHN0cmVhbVN0YXRlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGZpbmlzaChyZXN1bHQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgY2xlYW51cEFib3J0Py4oKTtcbiAgICAgICAgY2xlYW51cFNwYXduRmlsZXMoKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ2xhdWRlIHNlc3Npb24gY2xvc2VkIHdpdGhvdXQgcmVzdWx0JHtzdGRlcnJTdWZmaXgoKX1gKSk7XG4gICAgICB9KTtcbiAgICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgY2xlYW51cEFib3J0Py4oKTtcbiAgICAgICAgY2xlYW51cFNwYXduRmlsZXMoKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ2xhdWRlIHNlc3Npb24gc3Bhd24gZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCkpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIHN0ZGluIOycvOuhnCDsnoXroKUgSlNPTkwg7Z2Y66as6rOgIOuLq+uKlOuLpC5cbiAgICAgIHR0ZnRUcmFja2VyLm1hcmtTdGFydCgpO1xuICAgICAgY2hpbGQuc3RkaW4/LndyaXRlKHN0ZGluUGF5bG9hZCk7XG4gICAgICBjaGlsZC5zdGRpbj8uZW5kKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vLyB1c2FnZSDsnqzrhbjstpwo7YWM7Iqk7Yq4IO2OuOydmCkuXG5l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
@@ -0,0 +1,51 @@
1
+ import { openaiModelMaxEffort } from "./model-cost.js";
2
+ import { getLogger } from "@logtape/logtape";
3
+ //#region src/utils/providers/common/effort.ts
4
+ const logger = getLogger(["qgrid", "effort"]);
5
+ /**
6
+ * provider 별 reasoning effort 어휘.
7
+ *
8
+ * SDK 가 보낸 effort 문자열을 그대로 provider 에 넘기지 않는다. provider 마다 받는 값이 다르고,
9
+ * 모르는 값을 받았을 때의 반응도 다르다(Codex 백엔드는 400 이 예상되고, Claude Code 는 경고만
10
+ * 남기고 모델 기본 effort 로 실행한다). 각 provider dispatcher 가 요청을 만들 때 여기서 판정해,
11
+ * 맞지 않는 값은 오류 없이 버리고 "미지정" 과 같게 취급한다.
12
+ */
13
+ const OPENAI_EFFORTS = [
14
+ "low",
15
+ "medium",
16
+ "high",
17
+ "xhigh",
18
+ "max",
19
+ "ultra"
20
+ ];
21
+ const ANTHROPIC_EFFORTS = [
22
+ "low",
23
+ "medium",
24
+ "high",
25
+ "xhigh",
26
+ "max"
27
+ ];
28
+ function resolveWithin(levels, effort, max, target) {
29
+ if (effort === void 0) return void 0;
30
+ const rank = levels.indexOf(effort);
31
+ if (rank < 0) {
32
+ logger.debug(`ignoring effort "${effort}" for ${target}: not in ${levels.join("/")}`);
33
+ return;
34
+ }
35
+ if (max !== void 0 && rank > levels.indexOf(max)) {
36
+ logger.debug(`ignoring effort "${effort}" for ${target}: model supports up to "${max}"`);
37
+ return;
38
+ }
39
+ return effort;
40
+ }
41
+ /** canonical OpenAI model(`openai/` prefix 제거 후) 기준으로 effort 를 판정한다. */
42
+ function resolveOpenAIEffort(model, effort) {
43
+ return resolveWithin(OPENAI_EFFORTS, effort, openaiModelMaxEffort(model), `openai/${model}`);
44
+ }
45
+ function resolveAnthropicEffort(effort) {
46
+ return resolveWithin(ANTHROPIC_EFFORTS, effort, void 0, "anthropic");
47
+ }
48
+ //#endregion
49
+ export { ANTHROPIC_EFFORTS, OPENAI_EFFORTS, resolveAnthropicEffort, resolveOpenAIEffort };
50
+
51
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmb3J0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvY29tbW9uL2VmZm9ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBvcGVuYWlNb2RlbE1heEVmZm9ydCB9IGZyb20gXCIuL21vZGVsLWNvc3RcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwiZWZmb3J0XCJdKTtcblxuLyoqXG4gKiBwcm92aWRlciDrs4QgcmVhc29uaW5nIGVmZm9ydCDslrTtnJguXG4gKlxuICogU0RLIOqwgCDrs7TrgrggZWZmb3J0IOusuOyekOyXtOydhCDqt7jrjIDroZwgcHJvdmlkZXIg7JeQIOuEmOq4sOyngCDslYrripTri6QuIHByb3ZpZGVyIOuniOuLpCDrsJvripQg6rCS7J20IOuLpOultOqzoCxcbiAqIOuqqOultOuKlCDqsJLsnYQg67Cb7JWY7J2EIOuVjOydmCDrsJjsnZHrj4Qg64uk66W064ukKENvZGV4IOuwseyXlOuTnOuKlCA0MDAg7J20IOyYiOyDgeuQmOqzoCwgQ2xhdWRlIENvZGUg64qUIOqyveqzoOunjFxuICog64Ko6riw6rOgIOuqqOuNuCDquLDrs7ggZWZmb3J0IOuhnCDsi6TtlontlZzri6QpLiDqsIEgcHJvdmlkZXIgZGlzcGF0Y2hlciDqsIAg7JqU7LKt7J2EIOunjOuTpCDrlYwg7Jes6riw7IScIO2MkOygle2VtCxcbiAqIOunnuyngCDslYrripQg6rCS7J2AIOyYpOulmCDsl4bsnbQg67KE66as6rOgIFwi66+47KeA7KCVXCIg6rO8IOqwmeqyjCDst6jquIntlZzri6QuXG4gKi9cblxuLy8gQ29kZXgg6rWs64+FIOuwseyXlOuTnCDrqqjrjbgg7Lm07YOI66Gc6re4KH4vLmNvZGV4L21vZGVsc19jYWNoZS5qc29uKSDsnZggc3VwcG9ydGVkX3JlYXNvbmluZ19sZXZlbHMg7ZWp7KeR7ZWpLlxuLy8g6rO16rCcIE9wZW5BSSBBUEkg7J2YIGBub25lYC9gbWluaW1hbGAg7J2AIOydtCDqsr3roZzsl5Ag7JeG64ukLiDrqqjrjbjrs4Qg7IOB7ZWc7J2AIG1vZGVsLWNvc3QudHMg7J2YIOy5tO2DiOuhnOq3uOyXkCDsnojri6QuXG5leHBvcnQgY29uc3QgT1BFTkFJX0VGRk9SVFMgPSBbXCJsb3dcIiwgXCJtZWRpdW1cIiwgXCJoaWdoXCIsIFwieGhpZ2hcIiwgXCJtYXhcIiwgXCJ1bHRyYVwiXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIE9wZW5BSUVmZm9ydCA9ICh0eXBlb2YgT1BFTkFJX0VGRk9SVFMpW251bWJlcl07XG5cbi8vIENsYXVkZSBDb2RlIGAtLWVmZm9ydGAg7ZeI7Jqp6rCSLiDrqqjrjbjrs4Qg7IOB7ZWcKHhoaWdoX2VmZm9ydCAvIG1heF9lZmZvcnQgY2FwYWJpbGl0eSnsnYAgQ2xhdWRlIENvZGUg6rCAXG4vLyDsiqTsiqTroZwg7LKY66as7ZWY66+A66GcIHFncmlkIOuKlCBwcm92aWRlciDsp5Htlanrp4wg6rKA7IKs7ZWc64ukLlxuZXhwb3J0IGNvbnN0IEFOVEhST1BJQ19FRkZPUlRTID0gW1wibG93XCIsIFwibWVkaXVtXCIsIFwiaGlnaFwiLCBcInhoaWdoXCIsIFwibWF4XCJdIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQW50aHJvcGljRWZmb3J0ID0gKHR5cGVvZiBBTlRIUk9QSUNfRUZGT1JUUylbbnVtYmVyXTtcblxuLy8g7Ja07ZyYIOyViOyXkCDsnojqs6Ag7IOB7ZWcKOyeiOuLpOuptCkg7J207ZWY7J24IOqwkuunjCDthrXqs7zsi5ztgqjri6QuIOuCmOuouOyngOuKlCBkZWJ1ZyDroZzqt7gg7ZuEIOuvuOyngOyglS5cbmZ1bmN0aW9uIHJlc29sdmVXaXRoaW48VCBleHRlbmRzIHN0cmluZz4oXG4gIGxldmVsczogcmVhZG9ubHkgVFtdLFxuICBlZmZvcnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbWF4OiBUIHwgdW5kZWZpbmVkLFxuICB0YXJnZXQ6IHN0cmluZyxcbik6IFQgfCB1bmRlZmluZWQge1xuICBpZiAoZWZmb3J0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJhbmsgPSBsZXZlbHMuaW5kZXhPZihlZmZvcnQgYXMgVCk7XG4gIGlmIChyYW5rIDwgMCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgaWdub3JpbmcgZWZmb3J0IFwiJHtlZmZvcnR9XCIgZm9yICR7dGFyZ2V0fTogbm90IGluICR7bGV2ZWxzLmpvaW4oXCIvXCIpfWApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKG1heCAhPT0gdW5kZWZpbmVkICYmIHJhbmsgPiBsZXZlbHMuaW5kZXhPZihtYXgpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBpZ25vcmluZyBlZmZvcnQgXCIke2VmZm9ydH1cIiBmb3IgJHt0YXJnZXR9OiBtb2RlbCBzdXBwb3J0cyB1cCB0byBcIiR7bWF4fVwiYCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gZWZmb3J0IGFzIFQ7XG59XG5cbi8qKiBjYW5vbmljYWwgT3BlbkFJIG1vZGVsKGBvcGVuYWkvYCBwcmVmaXgg7KCc6rGwIO2bhCkg6riw7KSA7Jy866GcIGVmZm9ydCDrpbwg7YyQ7KCV7ZWc64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVPcGVuQUlFZmZvcnQobW9kZWw6IHN0cmluZywgZWZmb3J0Pzogc3RyaW5nKTogT3BlbkFJRWZmb3J0IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHJlc29sdmVXaXRoaW4oT1BFTkFJX0VGRk9SVFMsIGVmZm9ydCwgb3BlbmFpTW9kZWxNYXhFZmZvcnQobW9kZWwpLCBgb3BlbmFpLyR7bW9kZWx9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQW50aHJvcGljRWZmb3J0KGVmZm9ydD86IHN0cmluZyk6IEFudGhyb3BpY0VmZm9ydCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiByZXNvbHZlV2l0aGluKEFOVEhST1BJQ19FRkZPUlRTLCBlZmZvcnQsIHVuZGVmaW5lZCwgXCJhbnRocm9waWNcIik7XG59XG4iXSwibWFwcGluZ3MiOiI7OztBQUlBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxRQUFRLENBQUM7Ozs7Ozs7OztBQWE1QyxNQUFhLGlCQUFpQjtDQUFDO0NBQU87Q0FBVTtDQUFRO0NBQVM7Q0FBTztBQUFPO0FBSy9FLE1BQWEsb0JBQW9CO0NBQUM7Q0FBTztDQUFVO0NBQVE7Q0FBUztBQUFLO0FBSXpFLFNBQVMsY0FDUCxRQUNBLFFBQ0EsS0FDQSxRQUNlO0NBQ2YsSUFBSSxXQUFXLFFBQVcsT0FBTztDQUNqQyxNQUFNLE9BQU8sT0FBTyxRQUFRLE1BQVc7Q0FDdkMsSUFBSSxPQUFPLEdBQUc7RUFDWixPQUFPLE1BQU0sb0JBQW9CLE9BQU8sUUFBUSxPQUFPLFdBQVcsT0FBTyxLQUFLLEdBQUcsR0FBRztFQUNwRjtDQUNGO0NBQ0EsSUFBSSxRQUFRLFVBQWEsT0FBTyxPQUFPLFFBQVEsR0FBRyxHQUFHO0VBQ25ELE9BQU8sTUFBTSxvQkFBb0IsT0FBTyxRQUFRLE9BQU8sMEJBQTBCLElBQUksRUFBRTtFQUN2RjtDQUNGO0NBQ0EsT0FBTztBQUNUOztBQUdBLFNBQWdCLG9CQUFvQixPQUFlLFFBQTJDO0NBQzVGLE9BQU8sY0FBYyxnQkFBZ0IsUUFBUSxxQkFBcUIsS0FBSyxHQUFHLFVBQVUsT0FBTztBQUM3RjtBQUVBLFNBQWdCLHVCQUF1QixRQUE4QztDQUNuRixPQUFPLGNBQWMsbUJBQW1CLFFBQVEsUUFBVyxXQUFXO0FBQ3hFIn0=