@cartanova/qgrid-cli 2.6.4 → 2.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +2 -0
- package/README.md +2 -0
- package/bundle/dist/application/qgrid/expired-token-reminder.js +61 -0
- package/bundle/dist/application/qgrid/qgrid.frame.js +1 -1
- package/bundle/dist/application/qgrid/slack-user-map.js +49 -0
- package/bundle/dist/application/qgrid/token-death.js +21 -5
- package/bundle/dist/application/token/token.model.js +21 -1
- package/bundle/dist/sonamu.config.js +4 -1
- package/bundle/dist/utils/slack-notify.js +2 -2
- package/bundle/src/application/qgrid/expired-token-reminder.test.ts +53 -0
- package/bundle/src/application/qgrid/expired-token-reminder.ts +74 -0
- package/bundle/src/application/qgrid/slack-user-map.ts +51 -0
- package/bundle/src/application/qgrid/token-death.ts +12 -3
- package/bundle/src/application/token/token.model.ts +19 -0
- package/bundle/src/sonamu.config.ts +7 -0
- package/bundle/src/utils/slack-notify.test.ts +6 -4
- package/bundle/src/utils/slack-notify.ts +10 -3
- package/bundle/web-dist/client/assets/index-B4GlN1IX.css +1 -0
- package/bundle/web-dist/client/assets/{index-CnNT0mdq.js → index-qs8K8bOv.js} +3 -3
- package/bundle/web-dist/client/assets/{logs-DCY81UWb.js → logs-CvmI4KuC.js} +1 -1
- package/bundle/web-dist/client/assets/{monit-D5OoAday.js → monit-CUueNzoL.js} +1 -1
- package/bundle/web-dist/client/assets/routes-CAfjRsMY.js +5 -0
- package/bundle/web-dist/client/assets/{show-BSX8ii7Z.js → show-C5vKpp5z.js} +1 -1
- package/bundle/web-dist/client/assets/tokens-C9KKP2Yq.js +1 -0
- package/bundle/web-dist/client/assets/use-oauth-login-flow-B3o4CXDW.js +1 -0
- package/bundle/web-dist/client/index.html +2 -2
- package/bundle/web-dist/server/assets/{routes-Sv_4FjtH.js → routes-BfoQmYud.js} +52 -3
- package/bundle/web-dist/server/assets/{tokens-h-2A3wfD.js → tokens-Dkd_uXEk.js} +1 -151
- package/bundle/web-dist/server/assets/use-oauth-login-flow-YM1nsd-H.js +161 -0
- package/bundle/web-dist/server/entry-server.generated.js +3 -3
- package/package.json +1 -1
- package/skills/qgrid/references/token-auth-quota-lifecycle.md +2 -0
- package/bundle/web-dist/client/assets/index-BGQSGMcK.css +0 -1
- package/bundle/web-dist/client/assets/routes-B4D9C86u.js +0 -5
- package/bundle/web-dist/client/assets/tokens-Gapk41cz.js +0 -1
- package/bundle/web-dist/client/assets/use-update-token-mutation-DqEpK7It.js +0 -1
- package/bundle/web-dist/server/assets/use-update-token-mutation-DHCaa7Ku.js +0 -7
package/README.ko.md
CHANGED
|
@@ -92,6 +92,8 @@ CLI는 실행 시 npm의 최신 버전을 확인하고 patch를 포함해 설치
|
|
|
92
92
|
| `QGRID_DB_NAME` | `qgrid` |
|
|
93
93
|
| `SLACK_BOT_TOKEN` | — (미설정 시 토큰 만료 알림 비활성) |
|
|
94
94
|
| `SLACK_CHANNEL_ID` | — |
|
|
95
|
+
| `SLACK_EXPIRY_REMINDER_INTERVAL_MINUTES` | — (미설정 시 만료 알림 반복 끔) |
|
|
96
|
+
| `SLACK_USER_MAP` | — (`토큰명:SlackUserId` 목록) |
|
|
95
97
|
|
|
96
98
|
서버 동작 관련 환경변수:
|
|
97
99
|
|
package/README.md
CHANGED
|
@@ -93,6 +93,8 @@ Without the `--db` flag, DB connection info is read from:
|
|
|
93
93
|
| `QGRID_DB_NAME` | `qgrid` |
|
|
94
94
|
| `SLACK_BOT_TOKEN` | — (unset disables token-expiry notifications) |
|
|
95
95
|
| `SLACK_CHANNEL_ID` | — |
|
|
96
|
+
| `SLACK_EXPIRY_REMINDER_INTERVAL_MINUTES` | — (unset disables session-expiry repeats) |
|
|
97
|
+
| `SLACK_USER_MAP` | — (`tokenName:SlackUserId` pairs) |
|
|
96
98
|
|
|
97
99
|
Server behavior variables:
|
|
98
100
|
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { SLACK_COLOR, notifySlack } from "../../utils/slack-notify.js";
|
|
2
|
+
import { TokenModel } from "../token/token.model.js";
|
|
3
|
+
import { getSlackUserMap, mentionFor } from "./slack-user-map.js";
|
|
4
|
+
import { getLogger } from "@logtape/logtape";
|
|
5
|
+
//#region src/application/qgrid/expired-token-reminder.ts
|
|
6
|
+
/**
|
|
7
|
+
* 세션 만료 알림 반복.
|
|
8
|
+
*
|
|
9
|
+
* 만료 순간의 알림(`token-death.ts`)은 그때 채널을 보지 않으면 놓친다. 재로그인은 사람이
|
|
10
|
+
* 해야 하는 일이라 놓치면 토큰이 계속 빠진 채로 남는다. 그래서 아직 재로그인되지 않은
|
|
11
|
+
* 토큰을 같은 문구로 다시 알린다 — 사건이 하나이므로 알림도 한 종류다.
|
|
12
|
+
*
|
|
13
|
+
* 여러 토큰이 만료돼 있으면 한 메시지에 모은다. 토큰마다 메시지를 보내면 채널이 시끄러워
|
|
14
|
+
* 정작 읽히지 않는다.
|
|
15
|
+
*
|
|
16
|
+
* 비활성 토큰이 없으면 보내지 않는다 — "이상 없음"을 주기적으로 알리면 채널이 무뎌진다.
|
|
17
|
+
*/
|
|
18
|
+
const logger = getLogger(["qgrid", "expired-reminder"]);
|
|
19
|
+
const MINUTE_MS = 6e4;
|
|
20
|
+
function buildReminderContext(tokens, userMap) {
|
|
21
|
+
return tokens.map((token) => {
|
|
22
|
+
const mention = mentionFor(token.name, userMap);
|
|
23
|
+
const label = token.name ?? "unnamed";
|
|
24
|
+
return mention ? `${mention} ${label}` : label;
|
|
25
|
+
}).join("\n");
|
|
26
|
+
}
|
|
27
|
+
async function sendReminder(userMap) {
|
|
28
|
+
const inactive = await TokenModel.findInactive("A");
|
|
29
|
+
if (inactive.length === 0) return;
|
|
30
|
+
await notifySlack({
|
|
31
|
+
title: "세션 만료",
|
|
32
|
+
subject: inactive.length > 1 ? `${inactive.length}건` : inactive[0].name ?? "unnamed",
|
|
33
|
+
context: `${buildReminderContext(inactive, userMap)}\n재로그인이 필요합니다`,
|
|
34
|
+
color: SLACK_COLOR.bad
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
let timer = null;
|
|
38
|
+
/**
|
|
39
|
+
* `SLACK_EXPIRY_REMINDER_INTERVAL_MINUTES` 가 양수일 때만 켜진다. 미설정·0 이면 비활성.
|
|
40
|
+
*
|
|
41
|
+
* 인스턴스가 여러 개면 각자 보낸다. 만료 순간 알림과 달리 상태 변화가 없어 DB 로 억제할 수
|
|
42
|
+
* 없고, 하루 몇 건 수준이라 중복을 감수하는 편이 잠금 장치를 두는 것보다 낫다.
|
|
43
|
+
*/
|
|
44
|
+
function startExpiredTokenReminder() {
|
|
45
|
+
const minutes = Number(process.env.SLACK_EXPIRY_REMINDER_INTERVAL_MINUTES ?? 0);
|
|
46
|
+
if (!Number.isFinite(minutes) || minutes <= 0) return;
|
|
47
|
+
const userMap = getSlackUserMap();
|
|
48
|
+
logger.info(`expired token reminder every ${minutes}m (${userMap.size} user mappings)`);
|
|
49
|
+
timer = setInterval(() => {
|
|
50
|
+
sendReminder(userMap).catch((e) => logger.warn(`reminder failed: ${e.message}`));
|
|
51
|
+
}, minutes * MINUTE_MS);
|
|
52
|
+
}
|
|
53
|
+
function stopExpiredTokenReminder() {
|
|
54
|
+
if (!timer) return;
|
|
55
|
+
clearInterval(timer);
|
|
56
|
+
timer = null;
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { buildReminderContext, startExpiredTokenReminder, stopExpiredTokenReminder };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwaXJlZC10b2tlbi1yZW1pbmRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvZXhwaXJlZC10b2tlbi1yZW1pbmRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIOyEuOyFmCDrp4zro4wg7JWM66a8IOuwmOuztS5cbiAqXG4gKiDrp4zro4wg7Iic6rCE7J2YIOyVjOumvChgdG9rZW4tZGVhdGgudHNgKeydgCDqt7jrlYwg7LGE64SQ7J2EIOuztOyngCDslYrsnLzrqbQg64aT7Lmc64ukLiDsnqzroZzqt7jsnbjsnYAg7IKs656M7J20XG4gKiDtlbTslbwg7ZWY64qUIOydvOydtOudvCDrhpPsuZjrqbQg7Yag7YGw7J20IOqzhOyGjSDruaDsp4Qg7LGE66GcIOuCqOuKlOuLpC4g6re4656Y7IScIOyVhOyngSDsnqzroZzqt7jsnbjrkJjsp4Ag7JWK7J2AXG4gKiDthqDtgbDsnYQg6rCZ7J2AIOusuOq1rOuhnCDri6Tsi5wg7JWM66aw64ukIOKAlCDsgqzqsbTsnbQg7ZWY64KY7J2066+A66GcIOyVjOumvOuPhCDtlZwg7KKF66WY64ukLlxuICpcbiAqIOyXrOufrCDthqDtgbDsnbQg66eM66OM64+8IOyeiOycvOuptCDtlZwg66mU7Iuc7KeA7JeQIOuqqOydgOuLpC4g7Yag7YGw66eI64ukIOuplOyLnOyngOulvCDrs7TrgrTrqbQg7LGE64SQ7J20IOyLnOuBhOufrOybjFxuICog7KCV7J6RIOydve2eiOyngCDslYrripTri6QuXG4gKlxuICog67mE7Zmc7ISxIO2GoO2BsOydtCDsl4bsnLzrqbQg67O064K07KeAIOyViuuKlOuLpCDigJQgXCLsnbTsg4Eg7JeG7J2MXCLsnYQg7KO86riw7KCB7Jy866GcIOyVjOumrOuptCDssYTrhJDsnbQg66y0646M7KeE64ukLlxuICovXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBub3RpZnlTbGFjaywgU0xBQ0tfQ09MT1IgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc2xhY2stbm90aWZ5XCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyBnZXRTbGFja1VzZXJNYXAsIG1lbnRpb25Gb3IgfSBmcm9tIFwiLi9zbGFjay11c2VyLW1hcFwiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJleHBpcmVkLXJlbWluZGVyXCJdKTtcblxuY29uc3QgTUlOVVRFX01TID0gNjBfMDAwO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSZW1pbmRlckNvbnRleHQoXG4gIHRva2VuczogeyBuYW1lOiBzdHJpbmcgfCBudWxsOyBwcm92aWRlcjogc3RyaW5nIH1bXSxcbiAgdXNlck1hcDogTWFwPHN0cmluZywgc3RyaW5nPixcbik6IHN0cmluZyB7XG4gIHJldHVybiB0b2tlbnNcbiAgICAubWFwKCh0b2tlbikgPT4ge1xuICAgICAgY29uc3QgbWVudGlvbiA9IG1lbnRpb25Gb3IodG9rZW4ubmFtZSwgdXNlck1hcCk7XG4gICAgICBjb25zdCBsYWJlbCA9IHRva2VuLm5hbWUgPz8gXCJ1bm5hbWVkXCI7XG4gICAgICAvLyDrqZjshZjsnbQg7J6I7Ja064+EIOyWtOuWpCDthqDtgbDsnbjsp4DripQg64Ko6ri064ukIOKAlCDtlZwg7IKs656M7J20IHByb3ZpZGVyIOuzhOuhnCDsl6zrn6wg6rCc66W8IOqwgOynhOuLpC5cbiAgICAgIHJldHVybiBtZW50aW9uID8gYCR7bWVudGlvbn0gJHtsYWJlbH1gIDogbGFiZWw7XG4gICAgfSlcbiAgICAuam9pbihcIlxcblwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VuZFJlbWluZGVyKHVzZXJNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaW5hY3RpdmUgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRJbmFjdGl2ZShcIkFcIik7XG4gIGlmIChpbmFjdGl2ZS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBhd2FpdCBub3RpZnlTbGFjayh7XG4gICAgLy8g66eM66OMIOyInOqwhCDslYzrprzqs7wg6rCZ7J2AIOygnOuqqeydhCDsk7Tri6QuIOqwmeydgCDsgqzqsbTsnbTrr4DroZwg64uk66W4IOydtOumhOydhCDrtpnsnbTrqbQg67OE6rCcIOusuOygnOuhnCDsnb3tnozri6QuXG4gICAgdGl0bGU6IFwi7IS47IWYIOunjOujjFwiLFxuICAgIHN1YmplY3Q6IGluYWN0aXZlLmxlbmd0aCA+IDEgPyBgJHtpbmFjdGl2ZS5sZW5ndGh96rG0YCA6IChpbmFjdGl2ZVswXSEubmFtZSA/PyBcInVubmFtZWRcIiksXG4gICAgY29udGV4dDogYCR7YnVpbGRSZW1pbmRlckNvbnRleHQoaW5hY3RpdmUsIHVzZXJNYXApfVxcbuyerOuhnOq3uOyduOydtCDtlYTsmpTtlanri4jri6RgLFxuICAgIGNvbG9yOiBTTEFDS19DT0xPUi5iYWQsXG4gIH0pO1xufVxuXG5sZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIGBTTEFDS19FWFBJUllfUkVNSU5ERVJfSU5URVJWQUxfTUlOVVRFU2Ag6rCAIOyWkeyImOydvCDrlYzrp4wg7Lyc7KeE64ukLiDrr7jshKTsoJXCtzAg7J2066m0IOu5hO2ZnOyEsS5cbiAqXG4gKiDsnbjsiqTthLTsiqTqsIAg7Jes65+sIOqwnOuptCDqsIHsnpAg67O064K464ukLiDrp4zro4wg7Iic6rCEIOyVjOumvOqzvCDri6zrpqwg7IOB7YOcIOuzgO2ZlOqwgCDsl4bslrQgREIg66GcIOyWteygnO2VoCDsiJhcbiAqIOyXhuqzoCwg7ZWY66OoIOuqhyDqsbQg7IiY7KSA7J206528IOykkeuzteydhCDqsJDsiJjtlZjripQg7Y647J20IOyeoOq4iCDsnqXsuZjrpbwg65GQ64qUIOqyg+uztOuLpCDrgqvri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydEV4cGlyZWRUb2tlblJlbWluZGVyKCk6IHZvaWQge1xuICBjb25zdCBtaW51dGVzID0gTnVtYmVyKHByb2Nlc3MuZW52LlNMQUNLX0VYUElSWV9SRU1JTkRFUl9JTlRFUlZBTF9NSU5VVEVTID8/IDApO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShtaW51dGVzKSB8fCBtaW51dGVzIDw9IDApIHJldHVybjtcblxuICBjb25zdCB1c2VyTWFwID0gZ2V0U2xhY2tVc2VyTWFwKCk7XG4gIGxvZ2dlci5pbmZvKGBleHBpcmVkIHRva2VuIHJlbWluZGVyIGV2ZXJ5ICR7bWludXRlc31tICgke3VzZXJNYXAuc2l6ZX0gdXNlciBtYXBwaW5ncylgKTtcblxuICB0aW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICBzZW5kUmVtaW5kZXIodXNlck1hcCkuY2F0Y2goKGUpID0+IGxvZ2dlci53YXJuKGByZW1pbmRlciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICB9LCBtaW51dGVzICogTUlOVVRFX01TKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0b3BFeHBpcmVkVG9rZW5SZW1pbmRlcigpOiB2b2lkIHtcbiAgaWYgKCF0aW1lcikgcmV0dXJuO1xuICBjbGVhckludGVydmFsKHRpbWVyKTtcbiAgdGltZXIgPSBudWxsO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsa0JBQWtCLENBQUM7QUFFdEQsTUFBTSxZQUFZO0FBRWxCLFNBQWdCLHFCQUNkLFFBQ0EsU0FDUTtDQUNSLE9BQU8sT0FDSixLQUFLLFVBQVU7RUFDZCxNQUFNLFVBQVUsV0FBVyxNQUFNLE1BQU0sT0FBTztFQUM5QyxNQUFNLFFBQVEsTUFBTSxRQUFRO0VBRTVCLE9BQU8sVUFBVSxHQUFHLFFBQVEsR0FBRyxVQUFVO0NBQzNDLENBQUMsQ0FBQyxDQUNELEtBQUssSUFBSTtBQUNkO0FBRUEsZUFBZSxhQUFhLFNBQTZDO0NBQ3ZFLE1BQU0sV0FBVyxNQUFNLFdBQVcsYUFBYSxHQUFHO0NBQ2xELElBQUksU0FBUyxXQUFXLEdBQUc7Q0FFM0IsTUFBTSxZQUFZO0VBRWhCLE9BQU87RUFDUCxTQUFTLFNBQVMsU0FBUyxJQUFJLEdBQUcsU0FBUyxPQUFPLEtBQU0sU0FBUyxFQUFFLENBQUUsUUFBUTtFQUM3RSxTQUFTLEdBQUcscUJBQXFCLFVBQVUsT0FBTyxFQUFFO0VBQ3BELE9BQU8sWUFBWTtDQUNyQixDQUFDO0FBQ0g7QUFFQSxJQUFJLFFBQStDOzs7Ozs7O0FBUW5ELFNBQWdCLDRCQUFrQztDQUNoRCxNQUFNLFVBQVUsT0FBTyxRQUFRLElBQUksMENBQTBDLENBQUM7Q0FDOUUsSUFBSSxDQUFDLE9BQU8sU0FBUyxPQUFPLEtBQUssV0FBVyxHQUFHO0NBRS9DLE1BQU0sVUFBVSxnQkFBZ0I7Q0FDaEMsT0FBTyxLQUFLLGdDQUFnQyxRQUFRLEtBQUssUUFBUSxLQUFLLGdCQUFnQjtDQUV0RixRQUFRLGtCQUFrQjtFQUN4QixhQUFhLE9BQU8sQ0FBQyxDQUFDLE9BQU8sTUFBTSxPQUFPLEtBQUssb0JBQXFCLEVBQVksU0FBUyxDQUFDO0NBQzVGLEdBQUcsVUFBVSxTQUFTO0FBQ3hCO0FBRUEsU0FBZ0IsMkJBQWlDO0NBQy9DLElBQUksQ0FBQyxPQUFPO0NBQ1osY0FBYyxLQUFLO0NBQ25CLFFBQVE7QUFDViJ9
|
|
@@ -5,10 +5,10 @@ import { ToolSchemaCompositionError } from "./tool-emulation-schema.js";
|
|
|
5
5
|
import { QgridDispatcher, buildAndValidateStrictOutputSchema } from "./qgrid.dispatcher.js";
|
|
6
6
|
import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorateMetadata.js";
|
|
7
7
|
import __decorate from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
|
|
8
|
+
import { TokenModel } from "../token/token.model.js";
|
|
8
9
|
import { CONSOLE_CALLBACK_URL, RefreshFailedError, buildAuthUrl, exchangeCodeForTokens, fetchUsage, generatePKCE, refreshAccessToken } from "./oauth.js";
|
|
9
10
|
import { MICRO_USD, RequestLogModel } from "../request-log/request-log.model.js";
|
|
10
11
|
import { afterQuery, beforeQuery, finishRunAborted, finishRunWithError } from "./qgrid-run-lifecycle.js";
|
|
11
|
-
import { TokenModel } from "../token/token.model.js";
|
|
12
12
|
import { TokenCredentials } from "../token/token.types.js";
|
|
13
13
|
import { deactivateAuthDeadToken, notifyTokenAdded } from "./token-death.js";
|
|
14
14
|
import { BadRequestException, BaseFrameClass, Sonamu, api, stream } from "sonamu";
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
//#region src/application/qgrid/slack-user-map.ts
|
|
2
|
+
/**
|
|
3
|
+
* 토큰 소유자 → Slack 사용자 멘션.
|
|
4
|
+
*
|
|
5
|
+
* Slack 표시 이름과 토큰명이 자주 어긋나(haze→haze.lee, byeongjun→potados) `users.list`
|
|
6
|
+
* 자동 매칭은 조용히 실패한다. 멘션이 빠지면 알림이 개인에게 닿지 않아 목적 자체가
|
|
7
|
+
* 사라지므로 `SLACK_USER_MAP` 명시 매핑만 쓴다.
|
|
8
|
+
*
|
|
9
|
+
* 공용 계정(bysuco, dev-common 등)은 매핑에 넣지 않는다 — 멘션 없이 이름만 나가는 것이
|
|
10
|
+
* 맞는 동작이다.
|
|
11
|
+
*/
|
|
12
|
+
/** `토큰명:SlackUserId` 목록을 파싱한다. */
|
|
13
|
+
function parseSlackUserMap(raw) {
|
|
14
|
+
const map = /* @__PURE__ */ new Map();
|
|
15
|
+
if (!raw) return map;
|
|
16
|
+
for (const entry of raw.split(",")) {
|
|
17
|
+
const [name, userId] = entry.split(":").map((s) => s.trim());
|
|
18
|
+
if (name && userId) map.set(name, userId);
|
|
19
|
+
}
|
|
20
|
+
return map;
|
|
21
|
+
}
|
|
22
|
+
/** `anthropic/yds` → `yds`. provider prefix 없이 저장된 이름도 그대로 받는다. */
|
|
23
|
+
function ownerOf(tokenName) {
|
|
24
|
+
if (!tokenName) return "";
|
|
25
|
+
const slash = tokenName.indexOf("/");
|
|
26
|
+
return slash === -1 ? tokenName : tokenName.slice(slash + 1);
|
|
27
|
+
}
|
|
28
|
+
/** 매핑이 있으면 `<@U...>`, 없으면 빈 문자열. 호출부가 멘션 유무로 문구를 고른다. */
|
|
29
|
+
function mentionFor(tokenName, userMap) {
|
|
30
|
+
const userId = userMap.get(ownerOf(tokenName));
|
|
31
|
+
return userId ? `<@${userId}>` : "";
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 환경변수는 프로세스 수명 동안 고정이라 매번 파싱할 이유가 없다. 사망 알림은 요청 경로에서
|
|
35
|
+
* 호출되므로 캐시해 둔다.
|
|
36
|
+
*/
|
|
37
|
+
let cached = null;
|
|
38
|
+
function getSlackUserMap() {
|
|
39
|
+
cached ??= parseSlackUserMap(process.env.SLACK_USER_MAP);
|
|
40
|
+
return cached;
|
|
41
|
+
}
|
|
42
|
+
/** 테스트에서 env 를 바꿔 끼울 때 쓴다. */
|
|
43
|
+
function resetSlackUserMapCache() {
|
|
44
|
+
cached = null;
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
export { getSlackUserMap, mentionFor, ownerOf, parseSlackUserMap, resetSlackUserMapCache };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stdXNlci1tYXAuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3NsYWNrLXVzZXItbWFwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog7Yag7YGwIOyGjOycoOyekCDihpIgU2xhY2sg7IKs7Jqp7J6QIOupmOyFmC5cbiAqXG4gKiBTbGFjayDtkZzsi5wg7J2066aE6rO8IO2GoO2BsOuqheydtCDsnpDso7wg7Ja06riL64KYKGhhemXihpJoYXplLmxlZSwgYnllb25nanVu4oaScG90YWRvcykgYHVzZXJzLmxpc3RgXG4gKiDsnpDrj5kg66ek7Lmt7J2AIOyhsOyaqe2eiCDsi6TtjKjtlZzri6QuIOupmOyFmOydtCDruaDsp4DrqbQg7JWM66a87J20IOqwnOyduOyXkOqyjCDri7/sp4Ag7JWK7JWEIOuqqeyggSDsnpDssrTqsIBcbiAqIOyCrOudvOyngOuvgOuhnCBgU0xBQ0tfVVNFUl9NQVBgIOuqheyLnCDrp6TtlZHrp4wg7JO064ukLlxuICpcbiAqIOqzteyaqSDqs4TsoJUoYnlzdWNvLCBkZXYtY29tbW9uIOuTsSnsnYAg66ek7ZWR7JeQIOuEo+yngCDslYrripTri6Qg4oCUIOupmOyFmCDsl4bsnbQg7J2066aE66eMIOuCmOqwgOuKlCDqsoPsnbRcbiAqIOunnuuKlCDrj5nsnpHsnbTri6QuXG4gKi9cblxuLyoqIGDthqDtgbDrqoU6U2xhY2tVc2VySWRgIOuqqeuhneydhCDtjIzsi7HtlZzri6QuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTbGFja1VzZXJNYXAocmF3OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgaWYgKCFyYXcpIHJldHVybiBtYXA7XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiByYXcuc3BsaXQoXCIsXCIpKSB7XG4gICAgY29uc3QgW25hbWUsIHVzZXJJZF0gPSBlbnRyeS5zcGxpdChcIjpcIikubWFwKChzKSA9PiBzLnRyaW0oKSk7XG4gICAgaWYgKG5hbWUgJiYgdXNlcklkKSBtYXAuc2V0KG5hbWUsIHVzZXJJZCk7XG4gIH1cbiAgcmV0dXJuIG1hcDtcbn1cblxuLyoqIGBhbnRocm9waWMveWRzYCDihpIgYHlkc2AuIHByb3ZpZGVyIHByZWZpeCDsl4bsnbQg7KCA7J6l65CcIOydtOumhOuPhCDqt7jrjIDroZwg67Cb64qU64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG93bmVyT2YodG9rZW5OYW1lOiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcbiAgaWYgKCF0b2tlbk5hbWUpIHJldHVybiBcIlwiO1xuICBjb25zdCBzbGFzaCA9IHRva2VuTmFtZS5pbmRleE9mKFwiL1wiKTtcbiAgcmV0dXJuIHNsYXNoID09PSAtMSA/IHRva2VuTmFtZSA6IHRva2VuTmFtZS5zbGljZShzbGFzaCArIDEpO1xufVxuXG4vKiog66ek7ZWR7J20IOyeiOycvOuptCBgPEBVLi4uPmAsIOyXhuycvOuptCDruYgg66y47J6Q7Je0LiDtmLjstpzrtoDqsIAg66mY7IWYIOycoOustOuhnCDrrLjqtazrpbwg6rOg66W464ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbnRpb25Gb3IodG9rZW5OYW1lOiBzdHJpbmcgfCBudWxsLCB1c2VyTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgY29uc3QgdXNlcklkID0gdXNlck1hcC5nZXQob3duZXJPZih0b2tlbk5hbWUpKTtcbiAgcmV0dXJuIHVzZXJJZCA/IGA8QCR7dXNlcklkfT5gIDogXCJcIjtcbn1cblxuLyoqXG4gKiDtmZjqsr3rs4DsiJjripQg7ZSE66Gc7IS47IqkIOyImOuqhSDrj5nslYgg6rOg7KCV7J206528IOunpOuyiCDtjIzsi7HtlaAg7J207Jyg6rCAIOyXhuuLpC4g7IKs66edIOyVjOumvOydgCDsmpTssq0g6rK966Gc7JeQ7IScXG4gKiDtmLjstpzrkJjrr4DroZwg7LqQ7Iuc7ZW0IOuRlOuLpC5cbiAqL1xubGV0IGNhY2hlZDogTWFwPHN0cmluZywgc3RyaW5nPiB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2xhY2tVc2VyTWFwKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjYWNoZWQgPz89IHBhcnNlU2xhY2tVc2VyTWFwKHByb2Nlc3MuZW52LlNMQUNLX1VTRVJfTUFQKTtcbiAgcmV0dXJuIGNhY2hlZDtcbn1cblxuLyoqIO2FjOyKpO2KuOyXkOyEnCBlbnYg66W8IOuwlOq/lCDrgbzsmrgg65WMIOyTtOuLpC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldFNsYWNrVXNlck1hcENhY2hlKCk6IHZvaWQge1xuICBjYWNoZWQgPSBudWxsO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFZQSxTQUFnQixrQkFBa0IsS0FBOEM7Q0FDOUUsTUFBTSxzQkFBTSxJQUFJLElBQW9CO0NBQ3BDLElBQUksQ0FBQyxLQUFLLE9BQU87Q0FFakIsS0FBSyxNQUFNLFNBQVMsSUFBSSxNQUFNLEdBQUcsR0FBRztFQUNsQyxNQUFNLENBQUMsTUFBTSxVQUFVLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxLQUFLLENBQUM7RUFDM0QsSUFBSSxRQUFRLFFBQVEsSUFBSSxJQUFJLE1BQU0sTUFBTTtDQUMxQztDQUNBLE9BQU87QUFDVDs7QUFHQSxTQUFnQixRQUFRLFdBQWtDO0NBQ3hELElBQUksQ0FBQyxXQUFXLE9BQU87Q0FDdkIsTUFBTSxRQUFRLFVBQVUsUUFBUSxHQUFHO0NBQ25DLE9BQU8sVUFBVSxLQUFLLFlBQVksVUFBVSxNQUFNLFFBQVEsQ0FBQztBQUM3RDs7QUFHQSxTQUFnQixXQUFXLFdBQTBCLFNBQXNDO0NBQ3pGLE1BQU0sU0FBUyxRQUFRLElBQUksUUFBUSxTQUFTLENBQUM7Q0FDN0MsT0FBTyxTQUFTLEtBQUssT0FBTyxLQUFLO0FBQ25DOzs7OztBQU1BLElBQUksU0FBcUM7QUFFekMsU0FBZ0Isa0JBQXVDO0NBQ3JELFdBQVcsa0JBQWtCLFFBQVEsSUFBSSxjQUFjO0NBQ3ZELE9BQU87QUFDVDs7QUFHQSxTQUFnQix5QkFBK0I7Q0FDN0MsU0FBUztBQUNYIn0=
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getRefreshToken } from "../../utils/providers/common/credentials.js";
|
|
2
|
-
import { TokenModel } from "../token/token.model.js";
|
|
3
2
|
import { SLACK_COLOR, notifySlack } from "../../utils/slack-notify.js";
|
|
3
|
+
import { TokenModel } from "../token/token.model.js";
|
|
4
|
+
import { getSlackUserMap, mentionFor } from "./slack-user-map.js";
|
|
4
5
|
import { getLogger } from "@logtape/logtape";
|
|
5
6
|
//#region src/application/qgrid/token-death.ts
|
|
6
7
|
/**
|
|
@@ -32,10 +33,16 @@ async function deactivateAuthDeadToken(token, usedRefreshToken, reasonCode) {
|
|
|
32
33
|
return false;
|
|
33
34
|
}
|
|
34
35
|
logger.warn(`token deactivated (auth dead): ${token.name}(id=${token.id}) reason=${reasonCode}`);
|
|
36
|
+
const mention = mentionFor(token.name, getSlackUserMap());
|
|
35
37
|
notifySlack({
|
|
36
38
|
title: "세션 만료",
|
|
37
39
|
subject: token.name,
|
|
38
|
-
context:
|
|
40
|
+
context: [
|
|
41
|
+
mention,
|
|
42
|
+
token.provider,
|
|
43
|
+
reasonCode,
|
|
44
|
+
"재로그인이 필요합니다"
|
|
45
|
+
].filter(Boolean).join(" · "),
|
|
39
46
|
color: SLACK_COLOR.bad
|
|
40
47
|
});
|
|
41
48
|
return true;
|
|
@@ -54,10 +61,15 @@ function notifyLastActiveTokenDying(token, reasonCode) {
|
|
|
54
61
|
const previous = lastActiveAlertAt.get(token.provider);
|
|
55
62
|
if (previous !== void 0 && now - previous < LAST_ACTIVE_ALERT_COOLDOWN_MS) return;
|
|
56
63
|
lastActiveAlertAt.set(token.provider, now);
|
|
64
|
+
const mention = mentionFor(token.name, getSlackUserMap());
|
|
57
65
|
notifySlack({
|
|
58
66
|
title: "마지막 토큰 사망",
|
|
59
67
|
subject: token.name,
|
|
60
|
-
context:
|
|
68
|
+
context: [
|
|
69
|
+
mention,
|
|
70
|
+
token.provider,
|
|
71
|
+
reasonCode
|
|
72
|
+
].filter(Boolean).join(" · ") + " · 풀이 비지 않도록 유지 중입니다. 전 토큰이 동시에 실패했다면 client_id 취소나 OAuth 계약 변경을 의심하세요",
|
|
61
73
|
color: SLACK_COLOR.bad
|
|
62
74
|
});
|
|
63
75
|
}
|
|
@@ -67,11 +79,15 @@ function notifyTokenAdded(name, provider) {
|
|
|
67
79
|
notifySlack({
|
|
68
80
|
title: "토큰 추가",
|
|
69
81
|
subject: name,
|
|
70
|
-
context:
|
|
82
|
+
context: [
|
|
83
|
+
mentionFor(name, getSlackUserMap()),
|
|
84
|
+
provider,
|
|
85
|
+
"요청 처리에 사용됩니다"
|
|
86
|
+
].filter(Boolean).join(" · "),
|
|
71
87
|
color: SLACK_COLOR.good
|
|
72
88
|
});
|
|
73
89
|
}
|
|
74
90
|
//#endregion
|
|
75
91
|
export { deactivateAuthDeadToken, notifyTokenAdded };
|
|
76
92
|
|
|
77
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
93
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tZGVhdGguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLWRlYXRoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog7IS47IWYIOunjOujjChhdXRoLWRlYWQpIO2GoO2BsOydmCDrnbzsmrDtjIUg7KCc7Jm4IOyngOygkC5cbiAqXG4gKiByZWZyZXNoIOqwgCDsnqzroZzqt7jsnbgg7Jm4IOuzteq1rCDrtojqsIDtlZwg7Iuk7Yyo66W8IOuwmO2ZmO2VnCDsiJzqsITsl5Drp4wg7Zi47Lac65Cc64ukLiDruYTtmZzshLHtmZTripRcbiAqIGBhY3RpdmU9dHJ1ZWAg7KGw6rG067aAIOqwseyLoCAx7ZqM7J206rOgLCDqt7gg6rCx7Iug7J2EIOydtOq4tCDtlITroZzshLjsiqTrp4wgU2xhY2sg7JWM66a87J2EIOuztOuCuOuLpCDigJRcbiAqIOqzteycoCBEQiDrpbwg7JOw64qUIOyduOyKpO2EtOyKpOqwgCDrqofsnbTrk6Ag7IKs6rG064u5IOyVjOumvOydgCAx6rG07J2064ukLlxuICovXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBnZXRSZWZyZXNoVG9rZW4gfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9jcmVkZW50aWFsc1wiO1xuaW1wb3J0IHsgbm90aWZ5U2xhY2ssIFNMQUNLX0NPTE9SIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3NsYWNrLW5vdGlmeVwiO1xuaW1wb3J0IHsgVG9rZW5Nb2RlbCB9IGZyb20gXCIuLi90b2tlbi90b2tlbi5tb2RlbFwiO1xuaW1wb3J0IHsgZ2V0U2xhY2tVc2VyTWFwLCBtZW50aW9uRm9yIH0gZnJvbSBcIi4vc2xhY2stdXNlci1tYXBcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9rZW4tZGVhdGhcIl0pO1xuXG50eXBlIERlYWRUb2tlblJlZiA9IHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBwcm92aWRlcjogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gdXNlZFJlZnJlc2hUb2tlbiDsi6TtjKjtlZwg7JqU7LKt7J20IOyLpOygnOuhnCDsgqzsmqntlZwgcmVmcmVzaCB0b2tlbi5cbiAqICAgcmVmcmVzaCB0b2tlbiDsnYAg7ZqM7KCEIOyggOyepeuQmOuvgOuhnCwg7J2066+4IO2ajOyghOuQnCDsmJsg7Yag7YGw7Jy866GcIOuKpuqyjCDrj4TssKntlZwg7J6s7Iuc64+E6rCAXG4gKiAgIDQwMCDsnYQg67Cb64qUIOqyg+ydgCDsoJXsg4Eg66CI7J207Iqk64ukLiBEQiDsnZgg7ZiE7J6sIOqwkuqzvCDri6TrpbTrqbQg7IKs66ed7Jy866GcIOuztOyngCDslYrripTri6QuXG4gKiBAcGFyYW0gcmVhc29uQ29kZSBgcHJvdmlkZXI6Y29kZWAg7ZiV7YOc7J2YIOuCtOu2gCDsvZTrk5wuIHByb3ZpZGVyIOydkeuLtSDrs7jrrLjsl5DripQg6rOE7KCVIOydtOuplOydvOydtOuCmFxuICogICDthqDtgbAg7KGw6rCB7J20IOyEnuydvCDsiJgg7J6I7Ja0IHJhdyDrqZTsi5zsp4Drpbwg6re464yA66GcIOyVjOumvOyXkCDsi6Psp4Ag7JWK64qU64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVhY3RpdmF0ZUF1dGhEZWFkVG9rZW4oXG4gIHRva2VuOiBEZWFkVG9rZW5SZWYsXG4gIHVzZWRSZWZyZXNoVG9rZW46IHN0cmluZyxcbiAgcmVhc29uQ29kZTogc3RyaW5nLFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRPbmUoXCJBXCIsIHsgaWQ6IHRva2VuLmlkIH0pO1xuICBpZiAoIWN1cnJlbnQpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBjdXJyZW50UmVmcmVzaFRva2VuID0gZ2V0UmVmcmVzaFRva2VuKGN1cnJlbnQuY3JlZGVudGlhbHMpO1xuICBpZiAoY3VycmVudFJlZnJlc2hUb2tlbiAmJiBjdXJyZW50UmVmcmVzaFRva2VuICE9PSB1c2VkUmVmcmVzaFRva2VuKSB7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgc2tpcHBpbmcgYXV0aC1kZWF0aCBmb3IgJHt0b2tlbi5uYW1lfShpZD0ke3Rva2VuLmlkfSk6IHJlZnJlc2ggdG9rZW4gcm90YXRlZCBzaW5jZSB0aGlzIGF0dGVtcHRgLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgeyBkZWFjdGl2YXRlZCwga2VwdEFzTGFzdEFjdGl2ZSB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5kZWFjdGl2YXRlSWZBY3RpdmUodG9rZW4uaWQpO1xuICBpZiAoIWRlYWN0aXZhdGVkKSB7XG4gICAgaWYgKGtlcHRBc0xhc3RBY3RpdmUpIG5vdGlmeUxhc3RBY3RpdmVUb2tlbkR5aW5nKHRva2VuLCByZWFzb25Db2RlKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsb2dnZXIud2FybihgdG9rZW4gZGVhY3RpdmF0ZWQgKGF1dGggZGVhZCk6ICR7dG9rZW4ubmFtZX0oaWQ9JHt0b2tlbi5pZH0pIHJlYXNvbj0ke3JlYXNvbkNvZGV9YCk7XG4gIC8vIOunjOujjCDsp4Htm4TqsIAg7J6s66Gc6re47J247ZWY6riwIOqwgOyepSDsoovsnYAg7YOA7J2067CN7J2064ukLiDshozsnKDsnpDrpbwg66mY7IWY7ZW0IOq3uCDsiJzqsIQg64u57IKs7J6Q7JeQ6rKMXG4gIC8vIOq9guuKlOuLpCDigJQg64uk7J207KCc7Iqk7Yq466W8IOq4sOuLpOumrOuptCDri6TsnYwg7KO86riw6rmM7KeAIO2GoO2BsOydtCDruaDsp4Qg7LGE66GcIOuCqOuKlOuLpC5cbiAgY29uc3QgbWVudGlvbiA9IG1lbnRpb25Gb3IodG9rZW4ubmFtZSwgZ2V0U2xhY2tVc2VyTWFwKCkpO1xuICB2b2lkIG5vdGlmeVNsYWNrKHtcbiAgICB0aXRsZTogXCLshLjshZgg66eM66OMXCIsXG4gICAgc3ViamVjdDogdG9rZW4ubmFtZSxcbiAgICBjb250ZXh0OiBbbWVudGlvbiwgdG9rZW4ucHJvdmlkZXIsIHJlYXNvbkNvZGUsIFwi7J6s66Gc6re47J247J20IO2VhOyalO2VqeuLiOuLpFwiXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oXCIgwrcgXCIpLFxuICAgIGNvbG9yOiBTTEFDS19DT0xPUi5iYWQsXG4gIH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiDrp4jsp4Drp4kg7Zmc7ISxIO2GoO2BsOydtCDso73sl4jsnYQg65WM7J2YIOyVjOumvCDsv6jri6TsmrQuXG4gKlxuICog7J20IOqyveyasCDthqDtgbDsnYAg67mE7Zmc7ISx7ZmU65CY7KeAIOyViuqzoCDsgrTslYTrgqjsnLzrr4DroZwsIOuSpOuUsOultOuKlCDsmpTssq3rp4jri6Qg6rCZ7J2AIOyLpO2MqOulvCDrsJjrs7XtlbRcbiAqIOyVjOumvOydtCDtj63so7ztlZzri6QuIOu5hO2ZnOyEse2ZlCDshLHqs7Ug6rK966Gc6rCAIOyhsOqxtOu2gCBVUERBVEUg66GcIOykkeuzteydhCDrp4nripQg6rKD6rO8IOuLrOumrCDsl6zquLDsl5RcbiAqIOyDge2DnCDrs4DtmZTqsIAg7JeG7Ja0IERCIOuhnCDslrXsoJztlaAg7IiYIOyXhuuLpCDigJQgcHJvdmlkZXIg64uo7JyE66GcIOyLnOqwhCDssL3snYQg65GU64ukLlxuICovXG5jb25zdCBMQVNUX0FDVElWRV9BTEVSVF9DT09MRE9XTl9NUyA9IDMwICogNjAgKiAxMDAwO1xuY29uc3QgbGFzdEFjdGl2ZUFsZXJ0QXQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG5mdW5jdGlvbiBub3RpZnlMYXN0QWN0aXZlVG9rZW5EeWluZyh0b2tlbjogRGVhZFRva2VuUmVmLCByZWFzb25Db2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcHJldmlvdXMgPSBsYXN0QWN0aXZlQWxlcnRBdC5nZXQodG9rZW4ucHJvdmlkZXIpO1xuICBpZiAocHJldmlvdXMgIT09IHVuZGVmaW5lZCAmJiBub3cgLSBwcmV2aW91cyA8IExBU1RfQUNUSVZFX0FMRVJUX0NPT0xET1dOX01TKSByZXR1cm47XG4gIGxhc3RBY3RpdmVBbGVydEF0LnNldCh0b2tlbi5wcm92aWRlciwgbm93KTtcblxuICBjb25zdCBtZW50aW9uID0gbWVudGlvbkZvcih0b2tlbi5uYW1lLCBnZXRTbGFja1VzZXJNYXAoKSk7XG4gIHZvaWQgbm90aWZ5U2xhY2soe1xuICAgIHRpdGxlOiBcIuuniOyngOuniSDthqDtgbAg7IKs66edXCIsXG4gICAgc3ViamVjdDogdG9rZW4ubmFtZSxcbiAgICBjb250ZXh0OlxuICAgICAgW21lbnRpb24sIHRva2VuLnByb3ZpZGVyLCByZWFzb25Db2RlXS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiDCtyBcIikgK1xuICAgICAgYCDCtyDtkoDsnbQg67mE7KeAIOyViuuPhOuhnSDsnKDsp4Ag7KSR7J6F64uI64ukLiBgICtcbiAgICAgIGDsoIQg7Yag7YGw7J20IOuPmeyLnOyXkCDsi6TtjKjtlojri6TrqbQgY2xpZW50X2lkIOy3qOyGjOuCmCBPQXV0aCDqs4Tslb0g67OA6rK97J2EIOydmOyLrO2VmOyEuOyalGAsXG4gICAgY29sb3I6IFNMQUNLX0NPTE9SLmJhZCxcbiAgfSk7XG59XG5cbi8qKiDroZzqt7jsnbjsnbQg7JmE66OM64+8IO2GoO2BsOydtCDsoIDsnqXrkJDsnYQg65WMLiDsi6Dqt5zCt+yerOuhnOq3uOyduOydhCDqsIDrpqzsp4Ag7JWK64qU64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vdGlmeVRva2VuQWRkZWQobmFtZTogc3RyaW5nLCBwcm92aWRlcjogc3RyaW5nKTogdm9pZCB7XG4gIGxvZ2dlci5pbmZvKGB0b2tlbiBhZGRlZDogJHtuYW1lfSAoJHtwcm92aWRlcn0pYCk7XG4gIGNvbnN0IG1lbnRpb24gPSBtZW50aW9uRm9yKG5hbWUsIGdldFNsYWNrVXNlck1hcCgpKTtcbiAgdm9pZCBub3RpZnlTbGFjayh7XG4gICAgdGl0bGU6IFwi7Yag7YGwIOy2lOqwgFwiLFxuICAgIHN1YmplY3Q6IG5hbWUsXG4gICAgY29udGV4dDogW21lbnRpb24sIHByb3ZpZGVyLCBcIuyalOyyrSDsspjrpqzsl5Ag7IKs7Jqp65Cp64uI64ukXCJdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIMK3IFwiKSxcbiAgICBjb2xvcjogU0xBQ0tfQ09MT1IuZ29vZCxcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFjQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsYUFBYSxDQUFDOzs7Ozs7OztBQWVqRCxlQUFzQix3QkFDcEIsT0FDQSxrQkFDQSxZQUNrQjtDQUNsQixNQUFNLFVBQVUsTUFBTSxXQUFXLFFBQVEsS0FBSyxFQUFFLElBQUksTUFBTSxHQUFHLENBQUM7Q0FDOUQsSUFBSSxDQUFDLFNBQVMsT0FBTztDQUVyQixNQUFNLHNCQUFzQixnQkFBZ0IsUUFBUSxXQUFXO0NBQy9ELElBQUksdUJBQXVCLHdCQUF3QixrQkFBa0I7RUFDbkUsT0FBTyxLQUNMLDJCQUEyQixNQUFNLEtBQUssTUFBTSxNQUFNLEdBQUcsNENBQ3ZEO0VBQ0EsT0FBTztDQUNUO0NBRUEsTUFBTSxFQUFFLGFBQWEscUJBQXFCLE1BQU0sV0FBVyxtQkFBbUIsTUFBTSxFQUFFO0NBQ3RGLElBQUksQ0FBQyxhQUFhO0VBQ2hCLElBQUksa0JBQWtCLDJCQUEyQixPQUFPLFVBQVU7RUFDbEUsT0FBTztDQUNUO0NBRUEsT0FBTyxLQUFLLGtDQUFrQyxNQUFNLEtBQUssTUFBTSxNQUFNLEdBQUcsV0FBVyxZQUFZO0NBRy9GLE1BQU0sVUFBVSxXQUFXLE1BQU0sTUFBTSxnQkFBZ0IsQ0FBQztDQUN4RCxBQUFLLFlBQVk7RUFDZixPQUFPO0VBQ1AsU0FBUyxNQUFNO0VBQ2YsU0FBUztHQUFDO0dBQVMsTUFBTTtHQUFVO0dBQVk7RUFBYSxDQUFDLENBQzFELE9BQU8sT0FBTyxDQUFDLENBQ2YsS0FBSyxLQUFLO0VBQ2IsT0FBTyxZQUFZO0NBQ3JCLENBQUM7Q0FDRCxPQUFPO0FBQ1Q7Ozs7Ozs7O0FBU0EsTUFBTSxnQ0FBZ0MsT0FBVTtBQUNoRCxNQUFNLG9DQUFvQixJQUFJLElBQW9CO0FBRWxELFNBQVMsMkJBQTJCLE9BQXFCLFlBQTBCO0NBQ2pGLE1BQU0sTUFBTSxLQUFLLElBQUk7Q0FDckIsTUFBTSxXQUFXLGtCQUFrQixJQUFJLE1BQU0sUUFBUTtDQUNyRCxJQUFJLGFBQWEsVUFBYSxNQUFNLFdBQVcsK0JBQStCO0NBQzlFLGtCQUFrQixJQUFJLE1BQU0sVUFBVSxHQUFHO0NBRXpDLE1BQU0sVUFBVSxXQUFXLE1BQU0sTUFBTSxnQkFBZ0IsQ0FBQztDQUN4RCxBQUFLLFlBQVk7RUFDZixPQUFPO0VBQ1AsU0FBUyxNQUFNO0VBQ2YsU0FDRTtHQUFDO0dBQVMsTUFBTTtHQUFVO0VBQVUsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLENBQUMsS0FBSyxLQUFLLElBQ2hFO0VBRUYsT0FBTyxZQUFZO0NBQ3JCLENBQUM7QUFDSDs7QUFHQSxTQUFnQixpQkFBaUIsTUFBYyxVQUF3QjtDQUNyRSxPQUFPLEtBQUssZ0JBQWdCLEtBQUssSUFBSSxTQUFTLEVBQUU7Q0FFaEQsQUFBSyxZQUFZO0VBQ2YsT0FBTztFQUNQLFNBQVM7RUFDVCxTQUFTO0dBSkssV0FBVyxNQUFNLGdCQUFnQixDQUlyQztHQUFTO0dBQVU7RUFBYyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsQ0FBQyxLQUFLLEtBQUs7RUFDdkUsT0FBTyxZQUFZO0NBQ3JCLENBQUM7QUFDSCJ9
|
|
@@ -97,6 +97,26 @@ var TokenModelClass = class extends BaseModelClass {
|
|
|
97
97
|
debug: false
|
|
98
98
|
})).rows;
|
|
99
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* 라우팅에서 빠진 토큰들. 세션 만료로 자동 비활성화된 것과 수동으로 끈 것이 섞여 있다 —
|
|
102
|
+
* 둘 다 "재로그인하면 살아나는" 상태라 알림 대상으로는 같게 본다.
|
|
103
|
+
*/
|
|
104
|
+
async findInactive(subset) {
|
|
105
|
+
const { qb } = this.getSubsetQueries(subset);
|
|
106
|
+
qb.where("tokens.active", false);
|
|
107
|
+
qb.orderBy("tokens.name", "asc");
|
|
108
|
+
const enhancers = this.createEnhancers({ A: (row) => ({ ...row }) });
|
|
109
|
+
return (await this.executeSubsetQuery({
|
|
110
|
+
subset,
|
|
111
|
+
qb,
|
|
112
|
+
params: {
|
|
113
|
+
num: 100,
|
|
114
|
+
page: 1
|
|
115
|
+
},
|
|
116
|
+
enhancers,
|
|
117
|
+
debug: false
|
|
118
|
+
})).rows;
|
|
119
|
+
}
|
|
100
120
|
async findActive(subset) {
|
|
101
121
|
const { qb } = this.getSubsetQueries(subset);
|
|
102
122
|
qb.where("tokens.active", true);
|
|
@@ -237,4 +257,4 @@ const TokenModel = new TokenModelClass();
|
|
|
237
257
|
//#endregion
|
|
238
258
|
export { TokenModel };
|
|
239
259
|
|
|
240
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4ubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQge1xuICBhcGksXG4gIGFzQXJyYXksXG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIEJhc2VNb2RlbENsYXNzLFxuICBleGhhdXN0aXZlLFxuICB0eXBlIExpc3RSZXN1bHQsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxufSBmcm9tIFwic29uYW11XCI7XG5cbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uLy4uL2kxOG4vc2QuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0S2V5LCB0eXBlIFRva2VuU3Vic2V0TWFwcGluZyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyB0b2tlbkxvYWRlclF1ZXJpZXMsIHRva2VuU3Vic2V0UXVlcmllcyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkLnNzb1wiO1xuaW1wb3J0IHsgdHlwZSBUb2tlbkxpc3RQYXJhbXMsIHR5cGUgVG9rZW5TYXZlUGFyYW1zIH0gZnJvbSBcIi4vdG9rZW4udHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9rZW5cIl0pO1xuXG5jb25zdCBERUZBVUxUX1FVT1RBX1RIUkVTSE9MRCA9IDgwO1xuY29uc3QgREVGQVVMVF9XRUlHSFQgPSAxO1xuXG5leHBvcnQgdHlwZSBUb2tlblVwZGF0ZUZpZWxkcyA9IHtcbiAgbmFtZT86IHN0cmluZztcbiAgcXVvdGFfdGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0PzogbnVtYmVyO1xufTtcblxuZnVuY3Rpb24gYXBwbHlDcmVhdGVEZWZhdWx0cyhzcDogVG9rZW5TYXZlUGFyYW1zKTogVG9rZW5TYXZlUGFyYW1zIHtcbiAgaWYgKHNwLmlkICE9PSB1bmRlZmluZWQpIHJldHVybiBzcDtcbiAgcmV0dXJuIHtcbiAgICAuLi5zcCxcbiAgICAuLi4oc3AucXVvdGFfdGhyZXNob2xkID09PSB1bmRlZmluZWQgPyB7IHF1b3RhX3RocmVzaG9sZDogREVGQVVMVF9RVU9UQV9USFJFU0hPTEQgfSA6IHt9KSxcbiAgICAuLi4oc3Aud2VpZ2h0ID09PSB1bmRlZmluZWQgPyB7IHdlaWdodDogREVGQVVMVF9XRUlHSFQgfSA6IHt9KSxcbiAgfTtcbn1cblxuY2xhc3MgVG9rZW5Nb2RlbENsYXNzIGV4dGVuZHMgQmFzZU1vZGVsQ2xhc3M8XG4gIFRva2VuU3Vic2V0S2V5LFxuICBUb2tlblN1YnNldE1hcHBpbmcsXG4gIHR5cGVvZiB0b2tlblN1YnNldFF1ZXJpZXMsXG4gIHR5cGVvZiB0b2tlbkxvYWRlclF1ZXJpZXNcbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlRva2VuXCIsIHRva2VuU3Vic2V0UXVlcmllcywgdG9rZW5Mb2FkZXJRdWVyaWVzKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiVG9rZW5cIiB9KVxuICBhc3luYyBmaW5kQnlJZDxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KHN1YnNldDogVCwgaWQ6IG51bWJlcik6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwgeyBpZCwgbnVtOiAxLCBwYWdlOiAxIH0pO1xuICAgIGlmICghcm93c1swXSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuZW50aXR5Tm90Rm91bmRcIikoXCJUb2tlblwiLCBpZCkpO1xuICAgIH1cbiAgICByZXR1cm4gcm93c1swXTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRPbmU8VCBleHRlbmRzIFRva2VuU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgbGlzdFBhcmFtczogVG9rZW5MaXN0UGFyYW1zLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXSB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7IC4uLmxpc3RQYXJhbXMsIG51bTogMSwgcGFnZTogMSB9KTtcbiAgICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJUb2tlbnNcIiB9KVxuICBhc3luYyBmaW5kTWFueTxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXksIExQIGV4dGVuZHMgVG9rZW5MaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFByb21pc2U8TGlzdFJlc3VsdDxMUCwgVG9rZW5TdWJzZXRNYXBwaW5nW1RdPj4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMjQsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoOiBcImlkXCIgYXMgY29uc3QsXG4gICAgICBvcmRlckJ5OiBcIm9yZC1hc2NcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBUb2tlbkxpc3RQYXJhbXM7XG5cbiAgICBjb25zdCB7IHFiLCBvblN1YnNldDogXyB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG5cbiAgICBpZiAocGFyYW1zLmlkKSB7XG4gICAgICBxYi53aGVyZUluKFwidG9rZW5zLmlkXCIsIGFzQXJyYXkocGFyYW1zLmlkKSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zZWFyY2ggJiYgcGFyYW1zLmtleXdvcmQgJiYgcGFyYW1zLmtleXdvcmQubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwiaWRcIikge1xuICAgICAgICBxYi53aGVyZShcInRva2Vucy5pZFwiLCBOdW1iZXIocGFyYW1zLmtleXdvcmQpKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJuYW1lXCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJ0b2tlbnMubmFtZVwiLCBcImxpa2VcIiwgYCUke3BhcmFtcy5rZXl3b3JkfSVgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IudW5rbm93blNlYXJjaEZpZWxkXCIpKHBhcmFtcy5zZWFyY2gpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLm9yZGVyQnkpIHtcbiAgICAgIGlmIChwYXJhbXMub3JkZXJCeSA9PT0gXCJpZC1kZXNjXCIpIHtcbiAgICAgICAgcWIub3JkZXJCeShcInRva2Vucy5pZFwiLCBcImRlc2NcIik7XG4gICAgICB9IGVsc2UgaWYgKHBhcmFtcy5vcmRlckJ5ID09PSBcIm9yZC1hc2NcIikge1xuICAgICAgICBxYi5vcmRlckJ5KFwidG9rZW5zLm9yZFwiLCBcImFzY1wiKTtcbiAgICAgICAgcWIub3JkZXJCeShcInRva2Vucy5pZFwiLCBcImFzY1wiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aGF1c3RpdmUocGFyYW1zLm9yZGVyQnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHtcbiAgICAgIEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7IHN1YnNldCwgcWIsIHBhcmFtcywgZW5oYW5jZXJzLCBkZWJ1ZzogZmFsc2UgfSk7XG4gIH1cblxuICBhc3luYyBmaW5kQnlBY2NvdW50SWRlbnRpZmllcjxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMucHJvdmlkZXJcIiwgcHJvdmlkZXIpO1xuICAgIGNvbnN0IGpzb25LZXkgPSBwcm92aWRlciA9PT0gXCJhbnRocm9waWNcIiA/IFwiYWNjb3VudFV1aWRcIiA6IFwiYWNjb3VudElkXCI7XG4gICAgcWIud2hlcmVSYXcoYHRva2Vucy5jcmVkZW50aWFscy0+Picke2pzb25LZXl9JyA9ID9gLCBbYWNjb3VudElkXSk7XG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoeyBBOiAocm93KSA9PiAoeyAuLi5yb3cgfSkgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXM6IHsgbnVtOiAxMDAsIHBhZ2U6IDEgfSxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gIH1cblxuICBhc3luYyBmaW5kQWN0aXZlQnlQcm92aWRlcjxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMuYWN0aXZlXCIsIHRydWUpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLnByb3ZpZGVyXCIsIHByb3ZpZGVyKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIGFzeW5jIGZpbmRBY3RpdmU8VCBleHRlbmRzIFRva2VuU3Vic2V0S2V5PihzdWJzZXQ6IFQpOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMuYWN0aXZlXCIsIHRydWUpO1xuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHsgQTogKHJvdykgPT4gKHsgLi4ucm93IH0pIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHtcbiAgICAgIHN1YnNldCxcbiAgICAgIHFiLFxuICAgICAgcGFyYW1zOiB7IG51bTogMTAwLCBwYWdlOiAxIH0sXG4gICAgICBlbmhhbmNlcnMsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHNhdmUoc3BhOiBUb2tlblNhdmVQYXJhbXNbXSk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCJ0b2tlbnNcIiwgYXBwbHlDcmVhdGVEZWZhdWx0cyhzcCkpO1xuICAgIH0pO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC51YlVwc2VydChcInRva2Vuc1wiKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUZpZWxkcyhpZDogbnVtYmVyLCBmaWVsZHM6IFRva2VuVXBkYXRlRmllbGRzKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oKHRyeCkgPT4gdHJ4LnRhYmxlKFwidG9rZW5zXCIpLndoZXJlKFwiaWRcIiwgaWQpLnVwZGF0ZShmaWVsZHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDshLjshZgg66eM66OMIO2GoO2BsOydhCDrnbzsmrDtjIXsl5DshJwg7KCc7Jm47ZWc64ukLiBgYWN0aXZlPXRydWVgIOyhsOqxtOu2gCDqsLHsi6DsnbTrr4DroZwg6rO17JygIERCIOulvCDsk7DripRcbiAgICog7Jes65+sIOyduOyKpO2EtOyKpOqwgCDrj5nsi5zsl5Ag6rCZ7J2AIOunjOujjOulvCDqsJDsp4DtlbTrj4QgdHJ1ZSDrpbwg67Cb64qUIO2UhOuhnOyEuOyKpOuKlCDtlZjrgpjrv5DsnbTri6RcbiAgICogKO2YuOy2nOu2gOydmCDslYzrprwg67Cc7IahIOqyjOydtO2KuCkuXG4gICAqXG4gICAqIOuLqCwg64yA7IOB7J20IO2VtOuLuSBwcm92aWRlciDsnZgg66eI7KeA66eJIO2ZnOyEsSDthqDtgbDsnbTrqbQg6rCx7Iug7ZWY7KeAIOyViuqzoCBmYWxzZSDrpbwg67CY7ZmY7ZWc64ukLlxuICAgKiBjbGllbnRfaWQg7Leo7IaM64KYIE9BdXRoIOqzhOyVvSDrs4Dqsr3sspjrn7wg7KCEIO2GoO2BsOydtCDrj5nsi5zsl5Ag7Iuk7Yyo7ZWY64qUIOyDge2ZqeyXkOyEnCDtkoDsnbRcbiAgICog7Ya17Ke466GcIOu5hOuKlCDqsoPsnYQg66eJ64qUIOyViOyghO2MkOydtOuLpC5cbiAgICovXG4gIC8qKlxuICAgKiDqsJnsnYAg6rOE7KCV7J2YIOq4sOyhtCDthqDtgbDsnYQg7KeA7Jqw6rOgIOyDiOuhnCDsoIDsnqXtlZzri6Qo66Gc6re47J24wrfsnqzroZzqt7jsnbgg6rO17Ya1IOqyveuhnCkuXG4gICAqXG4gICAqIHByb3ZpZGVyIOydkeuLteyXkCDqs4TsoJUg7Iud67OE7J6Q6rCAIOyXhuycvOuptCBkZWR1cCDsnpDssrTqsIAg67aI6rCA64ql7ZWY66+A66GcIOqyveqzoOunjCDrgqjquLDqs6BcbiAgICog7KSR67O1IOygnOqxsCDsl4bsnbQg7KCA7J6l7ZWc64ukKOyjveydgCByb3cg6rCAIOuCqOuKlOuLpCkuXG4gICAqL1xuICBhc3luYyByZXBsYWNlQnlBY2NvdW50KFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgYWNjb3VudElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc2F2ZVBhcmFtczogVG9rZW5TYXZlUGFyYW1zLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoYWNjb3VudElkKSB7XG4gICAgICBjb25zdCBvbGRFbnRyaWVzID0gYXdhaXQgdGhpcy5maW5kQnlBY2NvdW50SWRlbnRpZmllcihcIkFcIiwgcHJvdmlkZXIsIGFjY291bnRJZCk7XG4gICAgICBpZiAob2xkRW50cmllcy5sZW5ndGggPiAwKSBhd2FpdCB0aGlzLmRlbChvbGRFbnRyaWVzLm1hcCgobykgPT4gby5pZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYCR7cHJvdmlkZXJ9IGxvZ2luIHdpdGhvdXQgYWNjb3VudCBpZGVudGlmaWVyOiBkZWR1cCBza2lwcGVkIGZvciAke3NhdmVQYXJhbXMubmFtZSA/PyBcInVubmFtZWRcIn1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmUoW3NhdmVQYXJhbXNdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBgZGVhY3RpdmF0ZWRgIOuKlCDsnbQg7Zi47Lac7J20IOyLpOygnOuhnCDruYTtmZzshLHtmZTrpbwg7IiY7ZaJ7ZaI64qU7KeAIOKAlCDtmLjstpzrtoDsnZgg7JWM66a8XG4gICAqICAg6rKM7J207Yq464ukLiBga2VwdEFzTGFzdEFjdGl2ZWAg64qUIOuniOyngOuniSDtmZzshLEg7Yag7YGw7J206528IOqxsOu2gO2VnCDqsr3smrDroZwsIOyCrOunnSDsnpDssrTripRcbiAgICogICDsgqzsi6TsnbTsp4Drp4wg7ZKA7J2EIOu5hOyasOyngCDslYrsnLzroKTqs6Ag7IK066Ck65GUIOyDge2DnOuLpChzeXN0ZW1pYyDsi6TtjKgg7Iug7Zi4KS5cbiAgICovXG4gIGFzeW5jIGRlYWN0aXZhdGVJZkFjdGl2ZShcbiAgICBpZDogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgZGVhY3RpdmF0ZWQ6IGJvb2xlYW47IGtlcHRBc0xhc3RBY3RpdmU6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyDtmZzshLEg7Jes67aA7JmAIFwi66eI7KeA66eJIOuCqOydgCDthqDtgbDsnbjqsIBcIuulvCDtlZwgc3RhdGVtZW50IOyViOyXkOyEnCDtjJDsoJXtlZzri6QuIOuRkCDsobDqsbTsnYRcbiAgICAvLyDrlLDroZwg7J296rOgIOuCmOykkeyXkCDqsLHsi6DtlZjrqbQg6re4IOyCrOydtOyXkCDri6Trpbgg7J247Iqk7YS07Iqk6rCAIOqwmeydgCBwcm92aWRlciDsnZgg7Yag7YGw7J2EXG4gICAgLy8g67mE7Zmc7ISx7ZmU7ZW0IO2SgOydtCDthrXsp7jroZwg67mMIOyImCDsnojri6QuXG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHdkYi5rbmV4LnJhdzx7IHJvd0NvdW50OiBudW1iZXIgfT4oXG4gICAgICBgVVBEQVRFIHRva2VucyBTRVQgYWN0aXZlID0gZmFsc2VcbiAgICAgICBXSEVSRSBpZCA9ID8gQU5EIGFjdGl2ZSA9IHRydWVcbiAgICAgICAgIEFORCAoU0VMRUNUIGNvdW50KCopIEZST00gdG9rZW5zIHBlZXJcbiAgICAgICAgICAgICAgV0hFUkUgcGVlci5wcm92aWRlciA9IHRva2Vucy5wcm92aWRlciBBTkQgcGVlci5hY3RpdmUpID4gMWAsXG4gICAgICBbaWRdLFxuICAgICk7XG4gICAgaWYgKCh1cGRhdGVkLnJvd0NvdW50ID8/IDApID4gMCkgcmV0dXJuIHsgZGVhY3RpdmF0ZWQ6IHRydWUsIGtlcHRBc0xhc3RBY3RpdmU6IGZhbHNlIH07XG5cbiAgICAvLyDqsLHsi6DrkJjsp4Ag7JWK7J2AIOydtOycoOuKlCDrkZgg7KSRIO2VmOuCmOuLpDog7J2066+4IOu5hO2ZnOyEseydtOqxsOuCmCjsoJXsg4Eg6rK97J+BIOqysOqzvCksIOuniOyngOuniVxuICAgIC8vIO2ZnOyEsSDthqDtgbDsnbTqsbDrgpguIO2bhOyekOuKlCBzeXN0ZW1pYyDsi6TtjKgg7Iug7Zi46528IOuCqOqyqOyVvCDtlZjrr4DroZwg7J2065WM66eMIO2VnCDrsogg642UIOydveuKlOuLpC5cbiAgICBjb25zdCBzdXJ2aXZvciA9IChcbiAgICAgIGF3YWl0IHdkYi5rbmV4LnJhdzx7IHJvd3M6IHsgcHJvdmlkZXI6IHN0cmluZyB9W10gfT4oXG4gICAgICAgIFwiU0VMRUNUIHByb3ZpZGVyIEZST00gdG9rZW5zIFdIRVJFIGlkID0gPyBBTkQgYWN0aXZlID0gdHJ1ZVwiLFxuICAgICAgICBbaWRdLFxuICAgICAgKVxuICAgICkucm93c1swXTtcbiAgICBpZiAoc3Vydml2b3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgYHJlZnVzaW5nIHRvIGF1dG8tZGVhY3RpdmF0ZSB0b2tlbiAke2lkfTogbGFzdCBhY3RpdmUgJHtzdXJ2aXZvci5wcm92aWRlcn0gdG9rZW4g4oCUIGAgK1xuICAgICAgICAgIGBzeXN0ZW1pYyByZWZyZXNoIGZhaWx1cmUgc3VzcGVjdGVkLCBrZWVwaW5nIHRoZSBwb29sIG5vbi1lbXB0eWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHsgZGVhY3RpdmF0ZWQ6IGZhbHNlLCBrZXB0QXNMYXN0QWN0aXZlOiB0cnVlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGRlYWN0aXZhdGVkOiBmYWxzZSwga2VwdEFzTGFzdEFjdGl2ZTogZmFsc2UgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZW9yZGVyKGlkczogbnVtYmVyW10pOiBQcm9taXNlPHsgZG9uZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXdhaXQgdHJ4LnRhYmxlKFwidG9rZW5zXCIpLndoZXJlKFwiaWRcIiwgaWRzW2ldISkudXBkYXRlKHsgb3JkOiBpIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7IGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBkZWwoaWRzOiBudW1iZXJbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC50YWJsZShcInRva2Vuc1wiKS53aGVyZUluKFwidG9rZW5zLmlkXCIsIGlkcykuZGVsZXRlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlkcy5sZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFRva2VuTW9kZWwgPSBuZXcgVG9rZW5Nb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFnQkEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLE9BQU8sQ0FBQztBQUUzQyxNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLGlCQUFpQjtBQVF2QixTQUFTLG9CQUFvQixJQUFzQztDQUNqRSxJQUFJLEdBQUcsT0FBTyxRQUFXLE9BQU87Q0FDaEMsT0FBTztFQUNMLEdBQUc7RUFDSCxHQUFJLEdBQUcsb0JBQW9CLFNBQVksRUFBRSxpQkFBaUIsd0JBQXdCLElBQUksQ0FBQztFQUN2RixHQUFJLEdBQUcsV0FBVyxTQUFZLEVBQUUsUUFBUSxlQUFlLElBQUksQ0FBQztDQUM5RDtBQUNGO0FBRUEsSUFBTSxrQkFBTixjQUE4QixlQUs1QjtDQUNBLGNBQWM7RUFDWixNQUFNLFNBQVMsb0JBQW9CLGtCQUFrQjtDQUN2RDtDQUVBLE1BQ00sU0FBbUMsUUFBVyxJQUE0QztFQUM5RixNQUFNLEVBQUUsU0FBUyxNQUFNLEtBQUssU0FBUyxRQUFRO0dBQUU7R0FBSSxLQUFLO0dBQUcsTUFBTTtFQUFFLENBQUM7RUFDcEUsSUFBSSxDQUFDLEtBQUssSUFDUixNQUFNLElBQUksa0JBQWtCLEdBQUcsc0JBQXNCLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztFQUVyRSxPQUFPLEtBQUs7Q0FDZDtDQUVBLE1BQU0sUUFDSixRQUNBLFlBQ3VDO0VBQ3ZDLE1BQU0sRUFBRSxTQUFTLE1BQU0sS0FBSyxTQUFTLFFBQVE7R0FBRSxHQUFHO0dBQVksS0FBSztHQUFHLE1BQU07RUFBRSxDQUFDO0VBQy9FLE9BQU8sS0FBSyxNQUFNO0NBQ3BCO0NBRUEsTUFDTSxTQUNKLFFBQ0EsV0FDZ0Q7RUFDaEQsTUFBTSxT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
|
|
260
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4ubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQge1xuICBhcGksXG4gIGFzQXJyYXksXG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIEJhc2VNb2RlbENsYXNzLFxuICBleGhhdXN0aXZlLFxuICB0eXBlIExpc3RSZXN1bHQsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxufSBmcm9tIFwic29uYW11XCI7XG5cbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uLy4uL2kxOG4vc2QuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0S2V5LCB0eXBlIFRva2VuU3Vic2V0TWFwcGluZyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyB0b2tlbkxvYWRlclF1ZXJpZXMsIHRva2VuU3Vic2V0UXVlcmllcyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkLnNzb1wiO1xuaW1wb3J0IHsgdHlwZSBUb2tlbkxpc3RQYXJhbXMsIHR5cGUgVG9rZW5TYXZlUGFyYW1zIH0gZnJvbSBcIi4vdG9rZW4udHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9rZW5cIl0pO1xuXG5jb25zdCBERUZBVUxUX1FVT1RBX1RIUkVTSE9MRCA9IDgwO1xuY29uc3QgREVGQVVMVF9XRUlHSFQgPSAxO1xuXG5leHBvcnQgdHlwZSBUb2tlblVwZGF0ZUZpZWxkcyA9IHtcbiAgbmFtZT86IHN0cmluZztcbiAgcXVvdGFfdGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0PzogbnVtYmVyO1xufTtcblxuZnVuY3Rpb24gYXBwbHlDcmVhdGVEZWZhdWx0cyhzcDogVG9rZW5TYXZlUGFyYW1zKTogVG9rZW5TYXZlUGFyYW1zIHtcbiAgaWYgKHNwLmlkICE9PSB1bmRlZmluZWQpIHJldHVybiBzcDtcbiAgcmV0dXJuIHtcbiAgICAuLi5zcCxcbiAgICAuLi4oc3AucXVvdGFfdGhyZXNob2xkID09PSB1bmRlZmluZWQgPyB7IHF1b3RhX3RocmVzaG9sZDogREVGQVVMVF9RVU9UQV9USFJFU0hPTEQgfSA6IHt9KSxcbiAgICAuLi4oc3Aud2VpZ2h0ID09PSB1bmRlZmluZWQgPyB7IHdlaWdodDogREVGQVVMVF9XRUlHSFQgfSA6IHt9KSxcbiAgfTtcbn1cblxuY2xhc3MgVG9rZW5Nb2RlbENsYXNzIGV4dGVuZHMgQmFzZU1vZGVsQ2xhc3M8XG4gIFRva2VuU3Vic2V0S2V5LFxuICBUb2tlblN1YnNldE1hcHBpbmcsXG4gIHR5cGVvZiB0b2tlblN1YnNldFF1ZXJpZXMsXG4gIHR5cGVvZiB0b2tlbkxvYWRlclF1ZXJpZXNcbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlRva2VuXCIsIHRva2VuU3Vic2V0UXVlcmllcywgdG9rZW5Mb2FkZXJRdWVyaWVzKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiVG9rZW5cIiB9KVxuICBhc3luYyBmaW5kQnlJZDxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KHN1YnNldDogVCwgaWQ6IG51bWJlcik6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwgeyBpZCwgbnVtOiAxLCBwYWdlOiAxIH0pO1xuICAgIGlmICghcm93c1swXSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuZW50aXR5Tm90Rm91bmRcIikoXCJUb2tlblwiLCBpZCkpO1xuICAgIH1cbiAgICByZXR1cm4gcm93c1swXTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRPbmU8VCBleHRlbmRzIFRva2VuU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgbGlzdFBhcmFtczogVG9rZW5MaXN0UGFyYW1zLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXSB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7IC4uLmxpc3RQYXJhbXMsIG51bTogMSwgcGFnZTogMSB9KTtcbiAgICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJUb2tlbnNcIiB9KVxuICBhc3luYyBmaW5kTWFueTxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXksIExQIGV4dGVuZHMgVG9rZW5MaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFByb21pc2U8TGlzdFJlc3VsdDxMUCwgVG9rZW5TdWJzZXRNYXBwaW5nW1RdPj4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMjQsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoOiBcImlkXCIgYXMgY29uc3QsXG4gICAgICBvcmRlckJ5OiBcIm9yZC1hc2NcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBUb2tlbkxpc3RQYXJhbXM7XG5cbiAgICBjb25zdCB7IHFiLCBvblN1YnNldDogXyB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG5cbiAgICBpZiAocGFyYW1zLmlkKSB7XG4gICAgICBxYi53aGVyZUluKFwidG9rZW5zLmlkXCIsIGFzQXJyYXkocGFyYW1zLmlkKSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zZWFyY2ggJiYgcGFyYW1zLmtleXdvcmQgJiYgcGFyYW1zLmtleXdvcmQubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwiaWRcIikge1xuICAgICAgICBxYi53aGVyZShcInRva2Vucy5pZFwiLCBOdW1iZXIocGFyYW1zLmtleXdvcmQpKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJuYW1lXCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJ0b2tlbnMubmFtZVwiLCBcImxpa2VcIiwgYCUke3BhcmFtcy5rZXl3b3JkfSVgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IudW5rbm93blNlYXJjaEZpZWxkXCIpKHBhcmFtcy5zZWFyY2gpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLm9yZGVyQnkpIHtcbiAgICAgIGlmIChwYXJhbXMub3JkZXJCeSA9PT0gXCJpZC1kZXNjXCIpIHtcbiAgICAgICAgcWIub3JkZXJCeShcInRva2Vucy5pZFwiLCBcImRlc2NcIik7XG4gICAgICB9IGVsc2UgaWYgKHBhcmFtcy5vcmRlckJ5ID09PSBcIm9yZC1hc2NcIikge1xuICAgICAgICBxYi5vcmRlckJ5KFwidG9rZW5zLm9yZFwiLCBcImFzY1wiKTtcbiAgICAgICAgcWIub3JkZXJCeShcInRva2Vucy5pZFwiLCBcImFzY1wiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aGF1c3RpdmUocGFyYW1zLm9yZGVyQnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHtcbiAgICAgIEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7IHN1YnNldCwgcWIsIHBhcmFtcywgZW5oYW5jZXJzLCBkZWJ1ZzogZmFsc2UgfSk7XG4gIH1cblxuICBhc3luYyBmaW5kQnlBY2NvdW50SWRlbnRpZmllcjxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMucHJvdmlkZXJcIiwgcHJvdmlkZXIpO1xuICAgIGNvbnN0IGpzb25LZXkgPSBwcm92aWRlciA9PT0gXCJhbnRocm9waWNcIiA/IFwiYWNjb3VudFV1aWRcIiA6IFwiYWNjb3VudElkXCI7XG4gICAgcWIud2hlcmVSYXcoYHRva2Vucy5jcmVkZW50aWFscy0+Picke2pzb25LZXl9JyA9ID9gLCBbYWNjb3VudElkXSk7XG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoeyBBOiAocm93KSA9PiAoeyAuLi5yb3cgfSkgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXM6IHsgbnVtOiAxMDAsIHBhZ2U6IDEgfSxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gIH1cblxuICBhc3luYyBmaW5kQWN0aXZlQnlQcm92aWRlcjxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMuYWN0aXZlXCIsIHRydWUpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLnByb3ZpZGVyXCIsIHByb3ZpZGVyKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiDrnbzsmrDtjIXsl5DshJwg67mg7KeEIO2GoO2BsOuTpC4g7IS47IWYIOunjOujjOuhnCDsnpDrj5kg67mE7Zmc7ISx7ZmU65CcIOqyg+qzvCDsiJjrj5nsnLzroZwg64GIIOqyg+ydtCDshJ7sl6wg7J6I64ukIOKAlFxuICAgKiDrkZgg64ukIFwi7J6s66Gc6re47J247ZWY66m0IOyCtOyVhOuCmOuKlFwiIOyDge2DnOudvCDslYzrprwg64yA7IOB7Jy866Gc64qUIOqwmeqyjCDrs7jri6QuXG4gICAqL1xuICBhc3luYyBmaW5kSW5hY3RpdmU8VCBleHRlbmRzIFRva2VuU3Vic2V0S2V5PihzdWJzZXQ6IFQpOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMuYWN0aXZlXCIsIGZhbHNlKTtcbiAgICBxYi5vcmRlckJ5KFwidG9rZW5zLm5hbWVcIiwgXCJhc2NcIik7XG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoeyBBOiAocm93KSA9PiAoeyAuLi5yb3cgfSkgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXM6IHsgbnVtOiAxMDAsIHBhZ2U6IDEgfSxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gIH1cblxuICBhc3luYyBmaW5kQWN0aXZlPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oc3Vic2V0OiBUKTogUHJvbWlzZTxUb2tlblN1YnNldE1hcHBpbmdbVF1bXT4ge1xuICAgIGNvbnN0IHsgcWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLmFjdGl2ZVwiLCB0cnVlKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBzYXZlKHNwYTogVG9rZW5TYXZlUGFyYW1zW10pOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBzcGEuZm9yRWFjaCgoc3ApID0+IHtcbiAgICAgIHdkYi51YlJlZ2lzdGVyKFwidG9rZW5zXCIsIGFwcGx5Q3JlYXRlRGVmYXVsdHMoc3ApKTtcbiAgICB9KTtcbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIHJldHVybiB0cngudWJVcHNlcnQoXCJ0b2tlbnNcIik7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVGaWVsZHMoaWQ6IG51bWJlciwgZmllbGRzOiBUb2tlblVwZGF0ZUZpZWxkcyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKCh0cngpID0+IHRyeC50YWJsZShcInRva2Vuc1wiKS53aGVyZShcImlkXCIsIGlkKS51cGRhdGUoZmllbGRzKSk7XG4gIH1cblxuICAvKipcbiAgICog7IS47IWYIOunjOujjCDthqDtgbDsnYQg65287Jqw7YyF7JeQ7IScIOygnOyZuO2VnOuLpC4gYGFjdGl2ZT10cnVlYCDsobDqsbTrtoAg6rCx7Iug7J2066+A66GcIOqzteycoCBEQiDrpbwg7JOw64qUXG4gICAqIOyXrOufrCDsnbjsiqTthLTsiqTqsIAg64+Z7Iuc7JeQIOqwmeydgCDrp4zro4zrpbwg6rCQ7KeA7ZW064+EIHRydWUg66W8IOuwm+uKlCDtlITroZzshLjsiqTripQg7ZWY64KY67+Q7J2064ukXG4gICAqICjtmLjstpzrtoDsnZgg7JWM66a8IOuwnOyGoSDqsozsnbTtirgpLlxuICAgKlxuICAgKiDri6gsIOuMgOyDgeydtCDtlbTri7kgcHJvdmlkZXIg7J2YIOuniOyngOuniSDtmZzshLEg7Yag7YGw7J2066m0IOqwseyLoO2VmOyngCDslYrqs6AgZmFsc2Ug66W8IOuwmO2ZmO2VnOuLpC5cbiAgICogY2xpZW50X2lkIOy3qOyGjOuCmCBPQXV0aCDqs4Tslb0g67OA6rK97LKY65+8IOyghCDthqDtgbDsnbQg64+Z7Iuc7JeQIOyLpO2MqO2VmOuKlCDsg4Htmansl5DshJwg7ZKA7J20XG4gICAqIO2GteynuOuhnCDruYTripQg6rKD7J2EIOunieuKlCDslYjsoITtjJDsnbTri6QuXG4gICAqL1xuICAvKipcbiAgICog6rCZ7J2AIOqzhOygleydmCDquLDsobQg7Yag7YGw7J2EIOyngOyasOqzoCDsg4jroZwg7KCA7J6l7ZWc64ukKOuhnOq3uOyduMK37J6s66Gc6re47J24IOqzte2GtSDqsr3roZwpLlxuICAgKlxuICAgKiBwcm92aWRlciDsnZHri7Xsl5Ag6rOE7KCVIOyLneuzhOyekOqwgCDsl4bsnLzrqbQgZGVkdXAg7J6Q7LK06rCAIOu2iOqwgOuKpe2VmOuvgOuhnCDqsr3qs6Drp4wg64Ko6riw6rOgXG4gICAqIOykkeuztSDsoJzqsbAg7JeG7J20IOyggOyepe2VnOuLpCjso73snYAgcm93IOqwgCDrgqjripTri6QpLlxuICAgKi9cbiAgYXN5bmMgcmVwbGFjZUJ5QWNjb3VudChcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHNhdmVQYXJhbXM6IFRva2VuU2F2ZVBhcmFtcyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGFjY291bnRJZCkge1xuICAgICAgY29uc3Qgb2xkRW50cmllcyA9IGF3YWl0IHRoaXMuZmluZEJ5QWNjb3VudElkZW50aWZpZXIoXCJBXCIsIHByb3ZpZGVyLCBhY2NvdW50SWQpO1xuICAgICAgaWYgKG9sZEVudHJpZXMubGVuZ3RoID4gMCkgYXdhaXQgdGhpcy5kZWwob2xkRW50cmllcy5tYXAoKG8pID0+IG8uaWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGAke3Byb3ZpZGVyfSBsb2dpbiB3aXRob3V0IGFjY291bnQgaWRlbnRpZmllcjogZGVkdXAgc2tpcHBlZCBmb3IgJHtzYXZlUGFyYW1zLm5hbWUgPz8gXCJ1bm5hbWVkXCJ9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zYXZlKFtzYXZlUGFyYW1zXSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYGRlYWN0aXZhdGVkYCDripQg7J20IO2YuOy2nOydtCDsi6TsoJzroZwg67mE7Zmc7ISx7ZmU66W8IOyImO2Wie2WiOuKlOyngCDigJQg7Zi47Lac67aA7J2YIOyVjOumvFxuICAgKiAgIOqyjOydtO2KuOuLpC4gYGtlcHRBc0xhc3RBY3RpdmVgIOuKlCDrp4jsp4Drp4kg7Zmc7ISxIO2GoO2BsOydtOudvCDqsbDrtoDtlZwg6rK97Jqw66GcLCDsgqzrp50g7J6Q7LK064qUXG4gICAqICAg7IKs7Iuk7J207KeA66eMIO2SgOydhCDruYTsmrDsp4Ag7JWK7Jy866Ck6rOgIOyCtOugpOuRlCDsg4Htg5zri6Qoc3lzdGVtaWMg7Iuk7YyoIOyLoO2YuCkuXG4gICAqL1xuICBhc3luYyBkZWFjdGl2YXRlSWZBY3RpdmUoXG4gICAgaWQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IGRlYWN0aXZhdGVkOiBib29sZWFuOyBrZXB0QXNMYXN0QWN0aXZlOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuXG4gICAgLy8g7Zmc7ISxIOyXrOu2gOyZgCBcIuuniOyngOuniSDrgqjsnYAg7Yag7YGw7J246rCAXCLrpbwg7ZWcIHN0YXRlbWVudCDslYjsl5DshJwg7YyQ7KCV7ZWc64ukLiDrkZAg7KGw6rG07J2EXG4gICAgLy8g65Sw66GcIOydveqzoCDrgpjspJHsl5Ag6rCx7Iug7ZWY66m0IOq3uCDsgqzsnbTsl5Ag64uk66W4IOyduOyKpO2EtOyKpOqwgCDqsJnsnYAgcHJvdmlkZXIg7J2YIO2GoO2BsOydhFxuICAgIC8vIOu5hO2ZnOyEse2ZlO2VtCDtkoDsnbQg7Ya17Ke466GcIOu5jCDsiJgg7J6I64ukLlxuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB3ZGIua25leC5yYXc8eyByb3dDb3VudDogbnVtYmVyIH0+KFxuICAgICAgYFVQREFURSB0b2tlbnMgU0VUIGFjdGl2ZSA9IGZhbHNlXG4gICAgICAgV0hFUkUgaWQgPSA/IEFORCBhY3RpdmUgPSB0cnVlXG4gICAgICAgICBBTkQgKFNFTEVDVCBjb3VudCgqKSBGUk9NIHRva2VucyBwZWVyXG4gICAgICAgICAgICAgIFdIRVJFIHBlZXIucHJvdmlkZXIgPSB0b2tlbnMucHJvdmlkZXIgQU5EIHBlZXIuYWN0aXZlKSA+IDFgLFxuICAgICAgW2lkXSxcbiAgICApO1xuICAgIGlmICgodXBkYXRlZC5yb3dDb3VudCA/PyAwKSA+IDApIHJldHVybiB7IGRlYWN0aXZhdGVkOiB0cnVlLCBrZXB0QXNMYXN0QWN0aXZlOiBmYWxzZSB9O1xuXG4gICAgLy8g6rCx7Iug65CY7KeAIOyViuydgCDsnbTsnKDripQg65GYIOykkSDtlZjrgpjri6Q6IOydtOuvuCDruYTtmZzshLHsnbTqsbDrgpgo7KCV7IOBIOqyveyfgSDqsrDqs7wpLCDrp4jsp4Drp4lcbiAgICAvLyDtmZzshLEg7Yag7YGw7J206rGw64KYLiDtm4TsnpDripQgc3lzdGVtaWMg7Iuk7YyoIOyLoO2YuOudvCDrgqjqsqjslbwg7ZWY66+A66GcIOydtOuVjOunjCDtlZwg67KIIOuNlCDsnb3ripTri6QuXG4gICAgY29uc3Qgc3Vydml2b3IgPSAoXG4gICAgICBhd2FpdCB3ZGIua25leC5yYXc8eyByb3dzOiB7IHByb3ZpZGVyOiBzdHJpbmcgfVtdIH0+KFxuICAgICAgICBcIlNFTEVDVCBwcm92aWRlciBGUk9NIHRva2VucyBXSEVSRSBpZCA9ID8gQU5EIGFjdGl2ZSA9IHRydWVcIixcbiAgICAgICAgW2lkXSxcbiAgICAgIClcbiAgICApLnJvd3NbMF07XG4gICAgaWYgKHN1cnZpdm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgIGByZWZ1c2luZyB0byBhdXRvLWRlYWN0aXZhdGUgdG9rZW4gJHtpZH06IGxhc3QgYWN0aXZlICR7c3Vydml2b3IucHJvdmlkZXJ9IHRva2VuIOKAlCBgICtcbiAgICAgICAgICBgc3lzdGVtaWMgcmVmcmVzaCBmYWlsdXJlIHN1c3BlY3RlZCwga2VlcGluZyB0aGUgcG9vbCBub24tZW1wdHlgLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IGRlYWN0aXZhdGVkOiBmYWxzZSwga2VwdEFzTGFzdEFjdGl2ZTogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBkZWFjdGl2YXRlZDogZmFsc2UsIGtlcHRBc0xhc3RBY3RpdmU6IGZhbHNlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgcmVvcmRlcihpZHM6IG51bWJlcltdKTogUHJvbWlzZTx7IGRvbmU6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgYXdhaXQgd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGF3YWl0IHRyeC50YWJsZShcInRva2Vuc1wiKS53aGVyZShcImlkXCIsIGlkc1tpXSEpLnVwZGF0ZSh7IG9yZDogaSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4geyBkb25lOiB0cnVlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgZGVsKGlkczogbnVtYmVyW10pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgYXdhaXQgd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIHJldHVybiB0cngudGFibGUoXCJ0b2tlbnNcIikud2hlcmVJbihcInRva2Vucy5pZFwiLCBpZHMpLmRlbGV0ZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiBpZHMubGVuZ3RoO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBUb2tlbk1vZGVsID0gbmV3IFRva2VuTW9kZWxDbGFzcygpO1xu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
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { monitLogSink } from "./application/monit/log-buffer.js";
|
|
2
2
|
import { QgridDispatcher } from "./application/qgrid/qgrid.dispatcher.js";
|
|
3
|
+
import { startExpiredTokenReminder, stopExpiredTokenReminder } from "./application/qgrid/expired-token-reminder.js";
|
|
3
4
|
import { QgridFrame } from "./application/qgrid/qgrid.frame.js";
|
|
4
5
|
import { TokenSubscriber } from "./application/qgrid/token-subscriber.js";
|
|
5
6
|
import { ensureTokensTrigger } from "./application/qgrid/token-trigger-setup.js";
|
|
@@ -160,6 +161,7 @@ var sonamu_config_default = defineConfig({
|
|
|
160
161
|
QgridDispatcher.startupState.anthropic = "failed";
|
|
161
162
|
log.warn(`anthropic dispatcher failed: ${e.message}`);
|
|
162
163
|
}
|
|
164
|
+
startExpiredTokenReminder();
|
|
163
165
|
const anthropicCount = QgridDispatcher.anthropicDispatcher?.tokenCount ?? 0;
|
|
164
166
|
const openaiReady = QgridDispatcher.openaiDispatcher?.readyWorkerCount ?? 0;
|
|
165
167
|
const openaiTotal = QgridDispatcher.openaiDispatcher?.workerCount ?? 0;
|
|
@@ -170,6 +172,7 @@ var sonamu_config_default = defineConfig({
|
|
|
170
172
|
},
|
|
171
173
|
onShutdown: async () => {
|
|
172
174
|
const log = getLogger(["qgrid", "startup"]);
|
|
175
|
+
stopExpiredTokenReminder();
|
|
173
176
|
if (QgridDispatcher.openaiDispatcher) await QgridDispatcher.openaiDispatcher.stop();
|
|
174
177
|
if (QgridDispatcher.anthropicDispatcher) await QgridDispatcher.anthropicDispatcher.stop();
|
|
175
178
|
if (QgridDispatcher.subscriber) await QgridDispatcher.subscriber.stop();
|
|
@@ -184,4 +187,4 @@ var sonamu_config_default = defineConfig({
|
|
|
184
187
|
//#endregion
|
|
185
188
|
export { sonamu_config_default as default };
|
|
186
189
|
|
|
187
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgeyBDYWNoZVByZXNldHMsIGRlZmluZUNvbmZpZyB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGRyaXZlcnMgYXMgY2FjaGVEcml2ZXJzLCBzdG9yZSB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgbW9uaXRMb2dTaW5rIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vbW9uaXQvbG9nLWJ1ZmZlclwiO1xuaW1wb3J0IHsgUWdyaWREaXNwYXRjaGVyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgUWdyaWRGcmFtZSB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lXCI7XG5pbXBvcnQgeyBUb2tlblN1YnNjcmliZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC90b2tlbi1zdWJzY3JpYmVyXCI7XG5pbXBvcnQgeyBlbnN1cmVUb2tlbnNUcmlnZ2VyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tdHJpZ2dlci1zZXR1cFwiO1xuaW1wb3J0IHsgaGFuZGxlU2VydmVyRXJyb3IgfSBmcm9tIFwiLi9zZXJ2ZXItZXJyb3ItaGFuZGxlclwiO1xuaW1wb3J0IHsgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IE9wZW5BSURpc3BhdGNoZXIgfSBmcm9tIFwiLi91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1kaXNwYXRjaGVyXCI7XG5cbmNvbnN0IGhvc3QgPSBwcm9jZXNzLmVudi5IT1NUID8/IFwibG9jYWxob3N0XCI7XG5jb25zdCBwb3J0ID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQgPz8gNDQ5MDApO1xuXG5jb25zdCBjb25uQ29uZmlnID0ge1xuICBob3N0OiBwcm9jZXNzLmVudi5TT05BTVVfREJfSE9TVCA/PyBcImxvY2FsaG9zdFwiLFxuICBwb3J0OiBOdW1iZXIocHJvY2Vzcy5lbnYuU09OQU1VX0RCX1BPUlQgPz8gNTQzMiksXG4gIHVzZXI6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9VU0VSID8/IFwicG9zdGdyZXNcIixcbiAgcGFzc3dvcmQ6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9QQVNTV09SRCA/PyBcInBvc3RncmVzXCIsXG4gIGRhdGFiYXNlOiBwcm9jZXNzLmVudi5TT05BTVVfREJfTkFNRSA/PyBcInFncmlkXCIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBwcm9qZWN0TmFtZTogcHJvY2Vzcy5lbnYuUFJPSkVDVF9OQU1FID8/IFwiUWdyaWRcIixcbiAgZGF0YWJhc2U6IHtcbiAgICBkZWZhdWx0T3B0aW9uczoge1xuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAuLi5jb25uQ29uZmlnLFxuICAgICAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgICAgIGtlZXBBbGl2ZUluaXRpYWxEZWxheU1pbGxpczogMTAwMDAsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGFwaToge1xuICAgIGRpcjogXCJhcGlcIixcbiAgICB0aW1lem9uZTogXCJBc2lhL1Nlb3VsXCIsXG4gICAgcm91dGU6IHtcbiAgICAgIHByZWZpeDogXCIvYXBpXCIsXG4gICAgfSxcbiAgfSxcbiAgaTE4bjoge1xuICAgIGRlZmF1bHRMb2NhbGU6IFwia29cIixcbiAgICBzdXBwb3J0ZWRMb2NhbGVzOiBbXCJrb1wiLCBcImVuXCJdLFxuICB9LFxuICBzeW5jOiB7XG4gICAgdGFyZ2V0czogW1wid2ViXCJdLFxuICB9LFxuICB0ZXN0OiB7XG4gICAgcGFyYWxsZWw6IHRydWUsXG4gICAgbWF4V29ya2VyczogNCxcbiAgICBkZXZSdW5uZXI6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICB9LFxuICBsb2dnaW5nOiB7XG4gICAgc2lua3M6IHtcbiAgICAgIGNvbnNvbGU6IGdldENvbnNvbGVTaW5rKHtcbiAgICAgICAgZm9ybWF0dGVyOiBnZXRQcmV0dHlGb3JtYXR0ZXIoe1xuICAgICAgICAgIHRpbWVzdGFtcDogXCJ0aW1lXCIsXG4gICAgICAgICAgY2F0ZWdvcnlXaWR0aDogMjAsXG4gICAgICAgICAgY2F0ZWdvcnlUcnVuY2F0ZTogXCJtaWRkbGVcIixcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICAgIC8vIE1vbml0IO2DreyaqSBpbi1tZW1vcnkgcmluZyBidWZmZXIuIO2PrOunt+ydgCBzaW5rIOuzhCDigJQg7L2Y7IaUIOy2nOugpeydgCDqt7jrjIDroZzri6QuXG4gICAgICBtb25pdDogbW9uaXRMb2dTaW5rLFxuICAgIH0sXG4gICAgbG9nZ2VyczogW1xuICAgICAgLy8gcWdyaWQg66Gc6re4ICjsmpTssq0g67aE67CwLCBvYXV0aC91c2FnZSBBUEkpXG4gICAgICB7IGNhdGVnb3J5OiBbXCJxZ3JpZFwiXSwgc2lua3M6IFtcImNvbnNvbGVcIiwgXCJtb25pdFwiXSwgbG93ZXN0TGV2ZWw6IFwiaW5mb1wiIH0sXG4gICAgICAvLyBzb25hbXUg66Gc6re464qUIHdhcm5pbmcg7J207IOB66eMXG4gICAgICB7IGNhdGVnb3J5OiBbXCJzb25hbXVcIl0sIHNpbmtzOiBbXCJjb25zb2xlXCIsIFwibW9uaXRcIl0sIGxvd2VzdExldmVsOiBcIndhcm5pbmdcIiB9LFxuICAgICAgLy8gZmFzdGlmeSDroZzqt7gg7LCo64uoXG4gICAgICB7IGNhdGVnb3J5OiBbXCJmYXN0aWZ5XCJdLCBzaW5rczogW10sIGxvd2VzdExldmVsOiBcImZhdGFsXCIgfSxcbiAgICBdLFxuICB9LFxuICBzZXJ2ZXI6IHtcbiAgICBsaXN0ZW46IHsgcG9ydCwgaG9zdCB9LFxuICAgIGZhc3RpZnk6IHtcbiAgICAgIGJvZHlMaW1pdDogMTAgKiAxMDI0ICogMTAyNCxcbiAgICB9LFxuICAgIHBsdWdpbnM6IHtcbiAgICAgIGZvcm1ib2R5OiB0cnVlLFxuICAgICAgcXM6IHRydWUsXG4gICAgICBzc2U6IHRydWUsXG4gICAgICBtdWx0aXBhcnQ6IHsgbGltaXRzOiB7IGZpbGVTaXplOiAxMDI0ICogMTAyNCAqIDMwIH0gfSxcbiAgICAgIHN0YXRpYzoge1xuICAgICAgICByb290OiBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIvLi4vXCIsIFwicHVibGljXCIpLFxuICAgICAgICBwcmVmaXg6IFwiL2FwaS9wdWJsaWNcIixcbiAgICAgIH0sXG4gICAgICBjdXN0b206IChzZXJ2ZXIpID0+IHtcbiAgICAgICAgLy8gT0F1dGgg7L2c67CxIOKAlCBBbnRocm9waWPsnbQgL2NhbGxiYWNr7Jy866GcIOumrOuLpOydtOugie2KuFxuICAgICAgICBzZXJ2ZXIuZ2V0KFwiL2NhbGxiYWNrXCIsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgY29kZSwgc3RhdGUgfSA9IHJlcXVlc3QucXVlcnkgYXMgeyBjb2RlPzogc3RyaW5nOyBzdGF0ZT86IHN0cmluZyB9O1xuICAgICAgICAgIGlmICghY29kZSB8fCAhc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcIi8/b2F1dGg9ZXJyb3ImcmVhc29uPW1pc3NpbmdfcGFyYW1zXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIFFncmlkRnJhbWUuaGFuZGxlT0F1dGhDYWxsYmFjayhjb2RlLCBzdGF0ZSwgcmVwbHkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcbiAgICAgICAgICAgICAgYC8/b2F1dGg9ZXJyb3ImcmVhc29uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KChlIGFzIEVycm9yKS5tZXNzYWdlKX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE9wZW5BSSBPQXV0aCDripQgY29kZXggYXBwLXNlcnZlciDqsIAg7J6Q7LK0IGNhbGxiYWNrIOyEnOuyhOulvCDsmKzrprxcbiAgICAgICAgLy8gaGFuZGxlT3BlbkFJQ2FsbGJhY2sg67aI7ZWE7JqUIOKAlCBvYXV0aENvbXBsZXRlT3BlbkFJIEFQSSDroZwg7JmE66OMIO2ZleyduFxuICAgICAgfSxcbiAgICB9LFxuICAgIGFwaUNvbmZpZzoge1xuICAgICAgY29udGV4dFByb3ZpZGVyOiAoZGVmYXVsdENvbnRleHQsIHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5kZWZhdWx0Q29udGV4dCxcbiAgICAgICAgICBpcDogcmVxdWVzdC5pcCxcbiAgICAgICAgICBib2R5OiByZXF1ZXN0LmJvZHksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgZ3VhcmRIYW5kbGVyOiAoKSA9PiB7fSxcbiAgICAgIGNhY2hlQ29udHJvbEhhbmRsZXI6IChyZXEpID0+IHtcbiAgICAgICAgc3dpdGNoIChyZXEudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJhc3NldHNcIjpcbiAgICAgICAgICAgIC8vIEhhc2gg7Y+s7ZWo65CcIO2MjOydvDog7JiB6rWsIOy6kOyLnFxuICAgICAgICAgICAgaWYgKHJlcS5wYXRoLm1hdGNoKC8tW2EtZjAtOV0rXFwuLykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5pbW11dGFibGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmxvbmdMaXZlZDtcblxuICAgICAgICAgIGNhc2UgXCJhcGlcIjpcbiAgICAgICAgICAgIC8vIEdFVCDsmpTssq3rp4wg7LqQ7IuxIOqzoOugpFxuICAgICAgICAgICAgaWYgKHJlcS5tZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgICAgICAgLy8g7Yq57KCVIOqyveuhnOuKlCDsp6fsnYAg7LqQ7IucXG4gICAgICAgICAgICAgIGlmIChyZXEucGF0aC5zdGFydHNXaXRoKFwiL2FwaS9zdGF0aWMtZGF0YVwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuc2hvcnRMaXZlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVxLnBhdGguc3RhcnRzV2l0aChcIi9hcGkvdGVybXNcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLm1lZGl1bUxpdmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDquLDrs7g6IOy6kOyLnCDsl4bsnYxcbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubm9DYWNoZTtcblxuICAgICAgICAgIGNhc2UgXCJzc3JcIjpcbiAgICAgICAgICAgIC8vIFNTUiDtjpjsnbTsp4A6IDEw7LSIIOy6kOyLnFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zc3I7XG5cbiAgICAgICAgICBjYXNlIFwiY3NyXCI6XG4gICAgICAgICAgICAvLyBDU1IgZmFsbGJhY2sgKGluZGV4Lmh0bWwpOiAx67aEIOy6kOyLnFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zaG9ydExpdmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubm9DYWNoZTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjYWNoZToge1xuICAgICAgZGVmYXVsdDogXCJtYWluXCIsXG4gICAgICBzdG9yZXM6IHtcbiAgICAgICAgbWFpbjogc3RvcmUoKS51c2VMMUxheWVyKGNhY2hlRHJpdmVycy5tZW1vcnkoeyBtYXhTaXplOiBcIjUwbWJcIiB9KSksXG4gICAgICB9LFxuICAgICAgdHRsOiBcIjVtXCIsXG4gICAgICBwcmVmaXg6IFwiXCIsXG4gICAgfSxcbiAgICBsaWZlY3ljbGU6IHtcbiAgICAgIG9uU3RhcnQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbG9nID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3RhcnR1cFwiXSk7XG5cbiAgICAgICAgbGV0IHRyaWdnZXJSZWFkeSA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlVG9rZW5zVHJpZ2dlcihjb25uQ29uZmlnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJSZWFkeSA9IGZhbHNlO1xuICAgICAgICAgIGxvZy53YXJuKGB0cmlnZ2VyIHNldHVwIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YnNjcmliZXIgPSBuZXcgVG9rZW5TdWJzY3JpYmVyKGNvbm5Db25maWcsIFFncmlkRGlzcGF0Y2hlcik7XG4gICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcblxuICAgICAgICBjb25zdCBzdGFydGVkID0gYXdhaXQgc3Vic2NyaWJlci5zdGFydCgpO1xuXG4gICAgICAgIC8vIOq4sOuPmSDsg4Htg5zrpbwg64Ko6ri064ukIOKAlCBIVFRQIOuKlCDsnbTrr7gg7Je066CkIOyeiOyWtOyEnCwg7KSA67mEIOyghCDsmpTssq3snbQgXCLsnqDsi5wg7ZuEIOuQmOuKlOyngFwiXG4gICAgICAgIC8vIFwi7J6s7Iuc64+E7ZW064+EIOyViCDrkJjripTsp4BcIuulvCDqtazrtoTtlbQg7J2R64u17ZW07JW8IO2VnOuLpCg1MDMgdnMgNTAwKS5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvcGVuYWlEaXNwYXRjaGVyID0gbmV3IE9wZW5BSURpc3BhdGNoZXIoKTtcbiAgICAgICAgICBhd2FpdCBvcGVuYWlEaXNwYXRjaGVyLnN0YXJ0KCk7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIgPSBvcGVuYWlEaXNwYXRjaGVyO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUub3BlbmFpID0gXCJyZWFkeVwiO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZS5vcGVuYWkgPSBcImZhaWxlZFwiO1xuICAgICAgICAgIGxvZy53YXJuKGBvcGVuYWkgZGlzcGF0Y2hlciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFudGhyb3BpY0Rpc3BhdGNoZXIgPSBuZXcgQW50aHJvcGljRGlzcGF0Y2hlcigpO1xuICAgICAgICAgIGF3YWl0IGFudGhyb3BpY0Rpc3BhdGNoZXIuc3RhcnQoKTtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlciA9IGFudGhyb3BpY0Rpc3BhdGNoZXI7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZS5hbnRocm9waWMgPSBcInJlYWR5XCI7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3RhcnR1cFN0YXRlLmFudGhyb3BpYyA9IFwiZmFpbGVkXCI7XG4gICAgICAgICAgbG9nLndhcm4oYGFudGhyb3BpYyBkaXNwYXRjaGVyIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFudGhyb3BpY0NvdW50ID0gUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/LnRva2VuQ291bnQgPz8gMDtcbiAgICAgICAgY29uc3Qgb3BlbmFpUmVhZHkgPSBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8ucmVhZHlXb3JrZXJDb3VudCA/PyAwO1xuICAgICAgICBjb25zdCBvcGVuYWlUb3RhbCA9IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy53b3JrZXJDb3VudCA/PyAwO1xuXG4gICAgICAgIGxvZy5pbmZvKGBsaXN0ZW5pbmcgb24gaHR0cDovLyR7aG9zdH06JHtwb3J0fWApO1xuICAgICAgICBsb2cuaW5mbyhgYW50aHJvcGljOiAke2FudGhyb3BpY0NvdW50fSB0b2tlbnMgcmVhZHlgKTtcbiAgICAgICAgbG9nLmluZm8oYG9wZW5haTogJHtvcGVuYWlSZWFkeX0vJHtvcGVuYWlUb3RhbH0gdG9rZW5zIHJlYWR5YCk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBzdWJzY3JpYmVyOiAke3N0YXJ0ZWQgPyBcIkxJU1RFTiBhY3RpdmVcIiA6IFwiZGVncmFkZWRcIn0ke3RyaWdnZXJSZWFkeSA/IFwiXCIgOiBcIiwgdHJpZ2dlciBmYWlsZWRcIn1gLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIG9uU2h1dGRvd246IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbG9nID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3RhcnR1cFwiXSk7XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGxvZy5pbmZvKFwiZ3JhY2VmdWwgc2h1dGRvd25cIik7XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogKGVycm9yLCBfcmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgaGFuZGxlU2VydmVyRXJyb3IoZXJyb3IsIHJlcGx5KTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQWlCQSxNQUFNLE9BQU8sUUFBUSxJQUFJLFFBQVE7QUFDakMsTUFBTSxPQUFPLE9BQU8sUUFBUSxJQUFJLFFBQVEsS0FBSztBQUU3QyxNQUFNLGFBQWE7Q0FDakIsTUFBTSxRQUFRLElBQUksa0JBQWtCO0NBQ3BDLE1BQU0sT0FBTyxRQUFRLElBQUksa0JBQWtCLElBQUk7Q0FDL0MsTUFBTSxRQUFRLElBQUksa0JBQWtCO0NBQ3BDLFVBQVUsUUFBUSxJQUFJLHNCQUFzQjtDQUM1QyxVQUFVLFFBQVEsSUFBSSxrQkFBa0I7QUFDMUM7QUFFQSxJQUFBLHdCQUFlLGFBQWE7Q0FDMUIsYUFBYSxRQUFRLElBQUksZ0JBQWdCO0NBQ3pDLFVBQVUsRUFDUixnQkFBZ0IsRUFDZCxZQUFZO0VBQ1YsR0FBRztFQUNILFdBQVc7RUFDWCw2QkFBNkI7Q0FDL0IsRUFDRixFQUNGO0NBQ0EsS0FBSztFQUNILEtBQUs7RUFDTCxVQUFVO0VBQ1YsT0FBTyxFQUNMLFFBQVEsT0FDVjtDQUNGO0NBQ0EsTUFBTTtFQUNKLGVBQWU7RUFDZixrQkFBa0IsQ0FBQyxNQUFNLElBQUk7Q0FDL0I7Q0FDQSxNQUFNLEVBQ0osU0FBUyxDQUFDLEtBQUssRUFDakI7Q0FDQSxNQUFNO0VBQ0osVUFBVTtFQUNWLFlBQVk7RUFDWixXQUFXLEVBQUUsU0FBUyxLQUFLO0NB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
|
|
190
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgeyBDYWNoZVByZXNldHMsIGRlZmluZUNvbmZpZyB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGRyaXZlcnMgYXMgY2FjaGVEcml2ZXJzLCBzdG9yZSB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgbW9uaXRMb2dTaW5rIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vbW9uaXQvbG9nLWJ1ZmZlclwiO1xuaW1wb3J0IHtcbiAgc3RhcnRFeHBpcmVkVG9rZW5SZW1pbmRlcixcbiAgc3RvcEV4cGlyZWRUb2tlblJlbWluZGVyLFxufSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9leHBpcmVkLXRva2VuLXJlbWluZGVyXCI7XG5pbXBvcnQgeyBRZ3JpZERpc3BhdGNoZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBRZ3JpZEZyYW1lIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZnJhbWVcIjtcbmltcG9ydCB7IFRva2VuU3Vic2NyaWJlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLXN1YnNjcmliZXJcIjtcbmltcG9ydCB7IGVuc3VyZVRva2Vuc1RyaWdnZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC90b2tlbi10cmlnZ2VyLXNldHVwXCI7XG5pbXBvcnQgeyBoYW5kbGVTZXJ2ZXJFcnJvciB9IGZyb20gXCIuL3NlcnZlci1lcnJvci1oYW5kbGVyXCI7XG5pbXBvcnQgeyBBbnRocm9waWNEaXNwYXRjaGVyIH0gZnJvbSBcIi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9hbnRocm9waWMtZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXJcIjtcblxuY29uc3QgaG9zdCA9IHByb2Nlc3MuZW52LkhPU1QgPz8gXCJsb2NhbGhvc3RcIjtcbmNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCA/PyA0NDkwMCk7XG5cbmNvbnN0IGNvbm5Db25maWcgPSB7XG4gIGhvc3Q6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9IT1NUID8/IFwibG9jYWxob3N0XCIsXG4gIHBvcnQ6IE51bWJlcihwcm9jZXNzLmVudi5TT05BTVVfREJfUE9SVCA/PyA1NDMyKSxcbiAgdXNlcjogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX1VTRVIgPz8gXCJwb3N0Z3Jlc1wiLFxuICBwYXNzd29yZDogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX1BBU1NXT1JEID8/IFwicG9zdGdyZXNcIixcbiAgZGF0YWJhc2U6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9OQU1FID8/IFwicWdyaWRcIixcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHByb2plY3ROYW1lOiBwcm9jZXNzLmVudi5QUk9KRUNUX05BTUUgPz8gXCJRZ3JpZFwiLFxuICBkYXRhYmFzZToge1xuICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmNvbm5Db25maWcsXG4gICAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgICAga2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzOiAxMDAwMCxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgYXBpOiB7XG4gICAgZGlyOiBcImFwaVwiLFxuICAgIHRpbWV6b25lOiBcIkFzaWEvU2VvdWxcIixcbiAgICByb3V0ZToge1xuICAgICAgcHJlZml4OiBcIi9hcGlcIixcbiAgICB9LFxuICB9LFxuICBpMThuOiB7XG4gICAgZGVmYXVsdExvY2FsZTogXCJrb1wiLFxuICAgIHN1cHBvcnRlZExvY2FsZXM6IFtcImtvXCIsIFwiZW5cIl0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICB0YXJnZXRzOiBbXCJ3ZWJcIl0sXG4gIH0sXG4gIHRlc3Q6IHtcbiAgICBwYXJhbGxlbDogdHJ1ZSxcbiAgICBtYXhXb3JrZXJzOiA0LFxuICAgIGRldlJ1bm5lcjogeyBlbmFibGVkOiB0cnVlIH0sXG4gIH0sXG4gIGxvZ2dpbmc6IHtcbiAgICBzaW5rczoge1xuICAgICAgY29uc29sZTogZ2V0Q29uc29sZVNpbmsoe1xuICAgICAgICBmb3JtYXR0ZXI6IGdldFByZXR0eUZvcm1hdHRlcih7XG4gICAgICAgICAgdGltZXN0YW1wOiBcInRpbWVcIixcbiAgICAgICAgICBjYXRlZ29yeVdpZHRoOiAyMCxcbiAgICAgICAgICBjYXRlZ29yeVRydW5jYXRlOiBcIm1pZGRsZVwiLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgLy8gTW9uaXQg7YOt7JqpIGluLW1lbW9yeSByaW5nIGJ1ZmZlci4g7Y+s66e37J2AIHNpbmsg67OEIOKAlCDsvZjshpQg7Lac66Cl7J2AIOq3uOuMgOuhnOuLpC5cbiAgICAgIG1vbml0OiBtb25pdExvZ1NpbmssXG4gICAgfSxcbiAgICBsb2dnZXJzOiBbXG4gICAgICAvLyBxZ3JpZCDroZzqt7ggKOyalOyyrSDrtoTrsLAsIG9hdXRoL3VzYWdlIEFQSSlcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInFncmlkXCJdLCBzaW5rczogW1wiY29uc29sZVwiLCBcIm1vbml0XCJdLCBsb3dlc3RMZXZlbDogXCJpbmZvXCIgfSxcbiAgICAgIC8vIHNvbmFtdSDroZzqt7jripQgd2FybmluZyDsnbTsg4Hrp4xcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInNvbmFtdVwiXSwgc2lua3M6IFtcImNvbnNvbGVcIiwgXCJtb25pdFwiXSwgbG93ZXN0TGV2ZWw6IFwid2FybmluZ1wiIH0sXG4gICAgICAvLyBmYXN0aWZ5IOuhnOq3uCDssKjri6hcbiAgICAgIHsgY2F0ZWdvcnk6IFtcImZhc3RpZnlcIl0sIHNpbmtzOiBbXSwgbG93ZXN0TGV2ZWw6IFwiZmF0YWxcIiB9LFxuICAgIF0sXG4gIH0sXG4gIHNlcnZlcjoge1xuICAgIGxpc3RlbjogeyBwb3J0LCBob3N0IH0sXG4gICAgZmFzdGlmeToge1xuICAgICAgYm9keUxpbWl0OiAxMCAqIDEwMjQgKiAxMDI0LFxuICAgIH0sXG4gICAgcGx1Z2luczoge1xuICAgICAgZm9ybWJvZHk6IHRydWUsXG4gICAgICBxczogdHJ1ZSxcbiAgICAgIHNzZTogdHJ1ZSxcbiAgICAgIG11bHRpcGFydDogeyBsaW1pdHM6IHsgZmlsZVNpemU6IDEwMjQgKiAxMDI0ICogMzAgfSB9LFxuICAgICAgc3RhdGljOiB7XG4gICAgICAgIHJvb3Q6IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi8uLi9cIiwgXCJwdWJsaWNcIiksXG4gICAgICAgIHByZWZpeDogXCIvYXBpL3B1YmxpY1wiLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbTogKHNlcnZlcikgPT4ge1xuICAgICAgICAvLyBPQXV0aCDsvZzrsLEg4oCUIEFudGhyb3BpY+ydtCAvY2FsbGJhY2vsnLzroZwg66as64uk7J2066CJ7Yq4XG4gICAgICAgIHNlcnZlci5nZXQoXCIvY2FsbGJhY2tcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBjb2RlLCBzdGF0ZSB9ID0gcmVxdWVzdC5xdWVyeSBhcyB7IGNvZGU/OiBzdHJpbmc7IHN0YXRlPzogc3RyaW5nIH07XG4gICAgICAgICAgaWYgKCFjb2RlIHx8ICFzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249bWlzc2luZ19wYXJhbXNcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gUWdyaWRGcmFtZS5oYW5kbGVPQXV0aENhbGxiYWNrKGNvZGUsIHN0YXRlLCByZXBseSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFxuICAgICAgICAgICAgICBgLz9vYXV0aD1lcnJvciZyZWFzb249JHtlbmNvZGVVUklDb21wb25lbnQoKGUgYXMgRXJyb3IpLm1lc3NhZ2UpfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gT3BlbkFJIE9BdXRoIOuKlCBjb2RleCBhcHAtc2VydmVyIOqwgCDsnpDssrQgY2FsbGJhY2sg7ISc67KE66W8IOyYrOumvFxuICAgICAgICAvLyBoYW5kbGVPcGVuQUlDYWxsYmFjayDrtojtlYTsmpQg4oCUIG9hdXRoQ29tcGxldGVPcGVuQUkgQVBJIOuhnCDsmYTro4wg7ZmV7J24XG4gICAgICB9LFxuICAgIH0sXG4gICAgYXBpQ29uZmlnOiB7XG4gICAgICBjb250ZXh0UHJvdmlkZXI6IChkZWZhdWx0Q29udGV4dCwgcmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmRlZmF1bHRDb250ZXh0LFxuICAgICAgICAgIGlwOiByZXF1ZXN0LmlwLFxuICAgICAgICAgIGJvZHk6IHJlcXVlc3QuYm9keSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBndWFyZEhhbmRsZXI6ICgpID0+IHt9LFxuICAgICAgY2FjaGVDb250cm9sSGFuZGxlcjogKHJlcSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHJlcS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImFzc2V0c1wiOlxuICAgICAgICAgICAgLy8gSGFzaCDtj6ztlajrkJwg7YyM7J28OiDsmIHqtawg7LqQ7IucXG4gICAgICAgICAgICBpZiAocmVxLnBhdGgubWF0Y2goLy1bYS1mMC05XStcXC4vKSkge1xuICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmltbXV0YWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubG9uZ0xpdmVkO1xuXG4gICAgICAgICAgY2FzZSBcImFwaVwiOlxuICAgICAgICAgICAgLy8gR0VUIOyalOyyreunjCDsupDsi7Eg6rOg66CkXG4gICAgICAgICAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgICAgICAvLyDtirnsoJUg6rK966Gc64qUIOynp+ydgCDsupDsi5xcbiAgICAgICAgICAgICAgaWYgKHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvYXBpL3N0YXRpYy1kYXRhXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zaG9ydExpdmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChyZXEucGF0aC5zdGFydHNXaXRoKFwiL2FwaS90ZXJtc1wiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubWVkaXVtTGl2ZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOq4sOuzuDog7LqQ7IucIOyXhuydjFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuXG4gICAgICAgICAgY2FzZSBcInNzclwiOlxuICAgICAgICAgICAgLy8gU1NSIO2OmOydtOyngDogMTDstIgg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNzcjtcblxuICAgICAgICAgIGNhc2UgXCJjc3JcIjpcbiAgICAgICAgICAgIC8vIENTUiBmYWxsYmFjayAoaW5kZXguaHRtbCk6IDHrtoQg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNob3J0TGl2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIGNhY2hlOiB7XG4gICAgICBkZWZhdWx0OiBcIm1haW5cIixcbiAgICAgIHN0b3Jlczoge1xuICAgICAgICBtYWluOiBzdG9yZSgpLnVzZUwxTGF5ZXIoY2FjaGVEcml2ZXJzLm1lbW9yeSh7IG1heFNpemU6IFwiNTBtYlwiIH0pKSxcbiAgICAgIH0sXG4gICAgICB0dGw6IFwiNW1cIixcbiAgICAgIHByZWZpeDogXCJcIixcbiAgICB9LFxuICAgIGxpZmVjeWNsZToge1xuICAgICAgb25TdGFydDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcblxuICAgICAgICBsZXQgdHJpZ2dlclJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVUb2tlbnNUcmlnZ2VyKGNvbm5Db25maWcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlclJlYWR5ID0gZmFsc2U7XG4gICAgICAgICAgbG9nLndhcm4oYHRyaWdnZXIgc2V0dXAgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlciA9IG5ldyBUb2tlblN1YnNjcmliZXIoY29ubkNvbmZpZywgUWdyaWREaXNwYXRjaGVyKTtcbiAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIgPSBzdWJzY3JpYmVyO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBhd2FpdCBzdWJzY3JpYmVyLnN0YXJ0KCk7XG5cbiAgICAgICAgLy8g6riw64+ZIOyDge2DnOulvCDrgqjquLTri6Qg4oCUIEhUVFAg64qUIOydtOuvuCDsl7TroKQg7J6I7Ja07IScLCDspIDruYQg7KCEIOyalOyyreydtCBcIuyeoOyLnCDtm4Qg65CY64qU7KeAXCJcbiAgICAgICAgLy8gXCLsnqzsi5zrj4TtlbTrj4Qg7JWIIOuQmOuKlOyngFwi66W8IOq1rOu2hO2VtCDsnZHri7XtlbTslbwg7ZWc64ukKDUwMyB2cyA1MDApLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG9wZW5haURpc3BhdGNoZXIgPSBuZXcgT3BlbkFJRGlzcGF0Y2hlcigpO1xuICAgICAgICAgIGF3YWl0IG9wZW5haURpc3BhdGNoZXIuc3RhcnQoKTtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlciA9IG9wZW5haURpc3BhdGNoZXI7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZS5vcGVuYWkgPSBcInJlYWR5XCI7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3RhcnR1cFN0YXRlLm9wZW5haSA9IFwiZmFpbGVkXCI7XG4gICAgICAgICAgbG9nLndhcm4oYG9wZW5haSBkaXNwYXRjaGVyIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYW50aHJvcGljRGlzcGF0Y2hlciA9IG5ldyBBbnRocm9waWNEaXNwYXRjaGVyKCk7XG4gICAgICAgICAgYXdhaXQgYW50aHJvcGljRGlzcGF0Y2hlci5zdGFydCgpO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyID0gYW50aHJvcGljRGlzcGF0Y2hlcjtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3RhcnR1cFN0YXRlLmFudGhyb3BpYyA9IFwicmVhZHlcIjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUuYW50aHJvcGljID0gXCJmYWlsZWRcIjtcbiAgICAgICAgICBsb2cud2FybihgYW50aHJvcGljIGRpc3BhdGNoZXIgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnRFeHBpcmVkVG9rZW5SZW1pbmRlcigpO1xuXG4gICAgICAgIGNvbnN0IGFudGhyb3BpY0NvdW50ID0gUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/LnRva2VuQ291bnQgPz8gMDtcbiAgICAgICAgY29uc3Qgb3BlbmFpUmVhZHkgPSBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8ucmVhZHlXb3JrZXJDb3VudCA/PyAwO1xuICAgICAgICBjb25zdCBvcGVuYWlUb3RhbCA9IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy53b3JrZXJDb3VudCA/PyAwO1xuXG4gICAgICAgIGxvZy5pbmZvKGBsaXN0ZW5pbmcgb24gaHR0cDovLyR7aG9zdH06JHtwb3J0fWApO1xuICAgICAgICBsb2cuaW5mbyhgYW50aHJvcGljOiAke2FudGhyb3BpY0NvdW50fSB0b2tlbnMgcmVhZHlgKTtcbiAgICAgICAgbG9nLmluZm8oYG9wZW5haTogJHtvcGVuYWlSZWFkeX0vJHtvcGVuYWlUb3RhbH0gdG9rZW5zIHJlYWR5YCk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBzdWJzY3JpYmVyOiAke3N0YXJ0ZWQgPyBcIkxJU1RFTiBhY3RpdmVcIiA6IFwiZGVncmFkZWRcIn0ke3RyaWdnZXJSZWFkeSA/IFwiXCIgOiBcIiwgdHJpZ2dlciBmYWlsZWRcIn1gLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIG9uU2h1dGRvd246IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbG9nID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3RhcnR1cFwiXSk7XG4gICAgICAgIHN0b3BFeHBpcmVkVG9rZW5SZW1pbmRlcigpO1xuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBsb2cuaW5mbyhcImdyYWNlZnVsIHNodXRkb3duXCIpO1xuICAgICAgfSxcbiAgICAgIG9uRXJyb3I6IChlcnJvciwgX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGhhbmRsZVNlcnZlckVycm9yKGVycm9yLCByZXBseSk7XG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLE1BQU0sT0FBTyxRQUFRLElBQUksUUFBUTtBQUNqQyxNQUFNLE9BQU8sT0FBTyxRQUFRLElBQUksUUFBUSxLQUFLO0FBRTdDLE1BQU0sYUFBYTtDQUNqQixNQUFNLFFBQVEsSUFBSSxrQkFBa0I7Q0FDcEMsTUFBTSxPQUFPLFFBQVEsSUFBSSxrQkFBa0IsSUFBSTtDQUMvQyxNQUFNLFFBQVEsSUFBSSxrQkFBa0I7Q0FDcEMsVUFBVSxRQUFRLElBQUksc0JBQXNCO0NBQzVDLFVBQVUsUUFBUSxJQUFJLGtCQUFrQjtBQUMxQztBQUVBLElBQUEsd0JBQWUsYUFBYTtDQUMxQixhQUFhLFFBQVEsSUFBSSxnQkFBZ0I7Q0FDekMsVUFBVSxFQUNSLGdCQUFnQixFQUNkLFlBQVk7RUFDVixHQUFHO0VBQ0gsV0FBVztFQUNYLDZCQUE2QjtDQUMvQixFQUNGLEVBQ0Y7Q0FD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
|
|
@@ -45,8 +45,8 @@ async function notifySlack(notification) {
|
|
|
45
45
|
},
|
|
46
46
|
body: JSON.stringify({
|
|
47
47
|
channel,
|
|
48
|
-
text: subject ? `${title} — ${subject}` : title,
|
|
49
48
|
attachments: [{
|
|
49
|
+
fallback: subject ? `${title} — ${subject}` : title,
|
|
50
50
|
...color ? { color } : {},
|
|
51
51
|
blocks
|
|
52
52
|
}]
|
|
@@ -62,4 +62,4 @@ async function notifySlack(notification) {
|
|
|
62
62
|
//#endregion
|
|
63
63
|
export { SLACK_COLOR, notifySlack };
|
|
64
64
|
|
|
65
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stbm90aWZ5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zbGFjay1ub3RpZnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTbGFjayDslYzrprwgKGNoYXQucG9zdE1lc3NhZ2UpLlxuICpcbiAqIGZhaWwtb3BlbjogZW52IOuvuOyEpOygleydtOuptCDsobDsmqntnoggbm8tb3Ag7J206rOgLCDsoITshqEg7Iuk7Yyo64qUIHdhcm4g66Gc6re466Gc66eMIOuCqOq4tOuLpC5cbiAqIOyVjOumvCDqsr3roZzqsIAg7Yag7YGwIOudvOyasO2MheydtOuCmCDsmKTrpZgg7KCE7YyM66W8IOyngOyXsMK37LCo64uo7ZW07ISc64qUIOyViCDrkJzri6QuXG4gKi9cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInNsYWNrXCJdKTtcblxuY29uc3QgU0xBQ0tfUE9TVF9NRVNTQUdFX1VSTCA9IFwiaHR0cHM6Ly9zbGFjay5jb20vYXBpL2NoYXQucG9zdE1lc3NhZ2VcIjtcbmNvbnN0IFNMQUNLX1RJTUVPVVRfTVMgPSA1XzAwMDtcblxuLyoqIOyDge2DnOulvCDsg4nsnLzroZwg66i87KCAIOydve2eiOqyjCDtlZjripQgYXR0YWNobWVudCDsg4nsg4Eg67CULiAqL1xuZXhwb3J0IGNvbnN0IFNMQUNLX0NPTE9SID0ge1xuICBnb29kOiBcIiMyZWI4ODZcIixcbiAgYmFkOiBcIiNlMDFlNWFcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNsYWNrTm90aWZpY2F0aW9uID0ge1xuICAvKiog7ZWcIOykhCDsoJzrqqkuIOustOyKqCDsnbzsnbQg7J287Ja064Ks64qU7KeA66eMIOuLtOuKlOuLpC4gKi9cbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqIOygnOuqqSDsmIYg7L2U65OcIOyKpO2DgOydvOuhnCDrtpnripQg64yA7IOBIOyLneuzhOyekC4gKi9cbiAgc3ViamVjdD86IHN0cmluZztcbiAgLyoqIOygnOuqqSDslYTrnpgg7J6R7J2AIOq4gOyUqOuhnCDrgrTroKTqsIDripQg67aA6rCAIOygleuztCDigJQg7J297KeAIOyViuyVhOuPhCDrkJjripQg6rKD65OkLiAqL1xuICBjb250ZXh0Pzogc3RyaW5nO1xuICBjb2xvcj86ICh0eXBlb2YgU0xBQ0tfQ09MT1IpW2tleW9mIHR5cGVvZiBTTEFDS19DT0xPUl07XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbm90aWZ5U2xhY2sobm90aWZpY2F0aW9uOiBTbGFja05vdGlmaWNhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBib3RUb2tlbiA9IHByb2Nlc3MuZW52LlNMQUNLX0JPVF9UT0tFTjtcbiAgY29uc3QgY2hhbm5lbCA9IHByb2Nlc3MuZW52LlNMQUNLX0NIQU5ORUxfSUQ7XG4gIGNvbnN0IHsgdGl0bGUsIHN1YmplY3QsIGNvbnRleHQsIGNvbG9yIH0gPSBub3RpZmljYXRpb247XG4gIGlmICghYm90VG9rZW4gfHwgIWNoYW5uZWwpIHtcbiAgICBsb2dnZXIuZGVidWcoYHNsYWNrIG5vdCBjb25maWd1cmVkLCBza2lwcGluZyBub3RpZmljYXRpb246ICR7dGl0bGV9ICR7c3ViamVjdCA/
|
|
65
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stbm90aWZ5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zbGFjay1ub3RpZnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTbGFjayDslYzrprwgKGNoYXQucG9zdE1lc3NhZ2UpLlxuICpcbiAqIGZhaWwtb3BlbjogZW52IOuvuOyEpOygleydtOuptCDsobDsmqntnoggbm8tb3Ag7J206rOgLCDsoITshqEg7Iuk7Yyo64qUIHdhcm4g66Gc6re466Gc66eMIOuCqOq4tOuLpC5cbiAqIOyVjOumvCDqsr3roZzqsIAg7Yag7YGwIOudvOyasO2MheydtOuCmCDsmKTrpZgg7KCE7YyM66W8IOyngOyXsMK37LCo64uo7ZW07ISc64qUIOyViCDrkJzri6QuXG4gKi9cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInNsYWNrXCJdKTtcblxuY29uc3QgU0xBQ0tfUE9TVF9NRVNTQUdFX1VSTCA9IFwiaHR0cHM6Ly9zbGFjay5jb20vYXBpL2NoYXQucG9zdE1lc3NhZ2VcIjtcbmNvbnN0IFNMQUNLX1RJTUVPVVRfTVMgPSA1XzAwMDtcblxuLyoqIOyDge2DnOulvCDsg4nsnLzroZwg66i87KCAIOydve2eiOqyjCDtlZjripQgYXR0YWNobWVudCDsg4nsg4Eg67CULiAqL1xuZXhwb3J0IGNvbnN0IFNMQUNLX0NPTE9SID0ge1xuICBnb29kOiBcIiMyZWI4ODZcIixcbiAgYmFkOiBcIiNlMDFlNWFcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNsYWNrTm90aWZpY2F0aW9uID0ge1xuICAvKiog7ZWcIOykhCDsoJzrqqkuIOustOyKqCDsnbzsnbQg7J287Ja064Ks64qU7KeA66eMIOuLtOuKlOuLpC4gKi9cbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqIOygnOuqqSDsmIYg7L2U65OcIOyKpO2DgOydvOuhnCDrtpnripQg64yA7IOBIOyLneuzhOyekC4gKi9cbiAgc3ViamVjdD86IHN0cmluZztcbiAgLyoqIOygnOuqqSDslYTrnpgg7J6R7J2AIOq4gOyUqOuhnCDrgrTroKTqsIDripQg67aA6rCAIOygleuztCDigJQg7J297KeAIOyViuyVhOuPhCDrkJjripQg6rKD65OkLiAqL1xuICBjb250ZXh0Pzogc3RyaW5nO1xuICBjb2xvcj86ICh0eXBlb2YgU0xBQ0tfQ09MT1IpW2tleW9mIHR5cGVvZiBTTEFDS19DT0xPUl07XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbm90aWZ5U2xhY2sobm90aWZpY2F0aW9uOiBTbGFja05vdGlmaWNhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBib3RUb2tlbiA9IHByb2Nlc3MuZW52LlNMQUNLX0JPVF9UT0tFTjtcbiAgY29uc3QgY2hhbm5lbCA9IHByb2Nlc3MuZW52LlNMQUNLX0NIQU5ORUxfSUQ7XG4gIGNvbnN0IHsgdGl0bGUsIHN1YmplY3QsIGNvbnRleHQsIGNvbG9yIH0gPSBub3RpZmljYXRpb247XG4gIGlmICghYm90VG9rZW4gfHwgIWNoYW5uZWwpIHtcbiAgICBsb2dnZXIuZGVidWcoYHNsYWNrIG5vdCBjb25maWd1cmVkLCBza2lwcGluZyBub3RpZmljYXRpb246ICR7dGl0bGV9ICR7c3ViamVjdCA/PyBcIlwifWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJsb2NrczogdW5rbm93bltdID0gW1xuICAgIHtcbiAgICAgIHR5cGU6IFwic2VjdGlvblwiLFxuICAgICAgdGV4dDogeyB0eXBlOiBcIm1ya2R3blwiLCB0ZXh0OiBzdWJqZWN0ID8gYCoke3RpdGxlfSogIFxcYCR7c3ViamVjdH1cXGBgIDogYCoke3RpdGxlfSpgIH0sXG4gICAgfSxcbiAgXTtcbiAgaWYgKGNvbnRleHQpIHtcbiAgICBibG9ja3MucHVzaCh7IHR5cGU6IFwiY29udGV4dFwiLCBlbGVtZW50czogW3sgdHlwZTogXCJtcmtkd25cIiwgdGV4dDogY29udGV4dCB9XSB9KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goU0xBQ0tfUE9TVF9NRVNTQUdFX1VSTCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtib3RUb2tlbn1gLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgLy8gZmFsbGJhY2sg7J2AIGF0dGFjaG1lbnQg7JWI7JeQIOuRlOuLpC4g7LWc7IOB7JyEIHRleHQg66GcIOuztOuCtOuptCBibG9ja3Mg6rCAIOygleyDgSDroIzrjZTrkJjripRcbiAgICAgICAgLy8g7ZmU66m07JeQ7ISc64+EIO2VqOq7mCDstpzroKXrj7wg7KCc66qp7J20IOuRkCDrsogg67O07J2464ukLiBhdHRhY2htZW50IGZhbGxiYWNrIOydgCBibG9ja3Mg66W8XG4gICAgICAgIC8vIOuquyDqt7jrpqzripQg7YG065287J207Ja47Yq47JmAIO2RuOyLnCDslYzrprzsl5DshJzrp4wg7JOw7J2464ukLlxuICAgICAgICBhdHRhY2htZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZhbGxiYWNrOiBzdWJqZWN0ID8gYCR7dGl0bGV9IOKAlCAke3N1YmplY3R9YCA6IHRpdGxlLFxuICAgICAgICAgICAgLi4uKGNvbG9yID8geyBjb2xvciB9IDoge30pLFxuICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dChTTEFDS19USU1FT1VUX01TKSxcbiAgICB9KTtcblxuICAgIC8vIGJvdCDrr7jstIjrjIAobm90X2luX2NoYW5uZWwpwrfsnpjrqrvrkJwg7LGE64SQIOuTsSDqsIDsnqUg7Z2U7ZWcIOyYpOyEpOygleydgCBIVFRQIDIwMCArIG9rOmZhbHNlIOuhnCDsmKjri6QuXG4gICAgLy8gc3RhdHVzIOunjCDrs7TrqbQg7KGw7Jqp7Z6IIOyEseqztSDsspjrpqzrj7wg7JWM66a87J20IO2GteynuOuhnCDsgqzrnbzsp4Tri6QuXG4gICAgY29uc3QgYm9keSA9IChhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+IG51bGwpKSBhcyB7IG9rPzogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfSB8IG51bGw7XG4gICAgaWYgKCFib2R5Py5vaykge1xuICAgICAgbG9nZ2VyLndhcm4oYHNsYWNrIG5vdGlmaWNhdGlvbiByZWplY3RlZDogJHtib2R5Py5lcnJvciA/PyBgaHR0cCAke3Jlcy5zdGF0dXN9YH1gKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIud2Fybihgc2xhY2sgbm90aWZpY2F0aW9uIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxPQUFPLENBQUM7QUFFM0MsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSxtQkFBbUI7O0FBR3pCLE1BQWEsY0FBYztDQUN6QixNQUFNO0NBQ04sS0FBSztBQUNQO0FBWUEsZUFBc0IsWUFBWSxjQUFnRDtDQUNoRixNQUFNLFdBQVcsUUFBUSxJQUFJO0NBQzdCLE1BQU0sVUFBVSxRQUFRLElBQUk7Q0FDNUIsTUFBTSxFQUFFLE9BQU8sU0FBUyxTQUFTLFVBQVU7Q0FDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTO0VBQ3pCLE9BQU8sTUFBTSxnREFBZ0QsTUFBTSxHQUFHLFdBQVcsSUFBSTtFQUNyRjtDQUNGO0NBRUEsTUFBTSxTQUFvQixDQUN4QjtFQUNFLE1BQU07RUFDTixNQUFNO0dBQUUsTUFBTTtHQUFVLE1BQU0sVUFBVSxJQUFJLE1BQU0sT0FBTyxRQUFRLE1BQU0sSUFBSSxNQUFNO0VBQUc7Q0FDdEYsQ0FDRjtDQUNBLElBQUksU0FDRixPQUFPLEtBQUs7RUFBRSxNQUFNO0VBQVcsVUFBVSxDQUFDO0dBQUUsTUFBTTtHQUFVLE1BQU07RUFBUSxDQUFDO0NBQUUsQ0FBQztDQUdoRixJQUFJO0VBQ0YsTUFBTSxNQUFNLE1BQU0sTUFBTSx3QkFBd0I7R0FDOUMsUUFBUTtHQUNSLFNBQVM7SUFDUCxnQkFBZ0I7SUFDaEIsZUFBZSxVQUFVO0dBQzNCO0dBQ0EsTUFBTSxLQUFLLFVBQVU7SUFDbkI7SUFJQSxhQUFhLENBQ1g7S0FDRSxVQUFVLFVBQVUsR0FBRyxNQUFNLEtBQUssWUFBWTtLQUM5QyxHQUFJLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQztLQUN6QjtJQUNGLENBQ0Y7R0FDRixDQUFDO0dBQ0QsUUFBUSxZQUFZLFFBQVEsZ0JBQWdCO0VBQzlDLENBQUM7RUFJRCxNQUFNLE9BQVEsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLFlBQVksSUFBSTtFQUMvQyxJQUFJLENBQUMsTUFBTSxJQUNULE9BQU8sS0FBSyxnQ0FBZ0MsTUFBTSxTQUFTLFFBQVEsSUFBSSxVQUFVO0NBRXJGLFNBQVMsR0FBRztFQUNWLE9BQU8sS0FBSyw4QkFBK0IsRUFBWSxTQUFTO0NBQ2xFO0FBQ0YifQ==
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { buildReminderContext } from "./expired-token-reminder";
|
|
4
|
+
|
|
5
|
+
const userMap = new Map([
|
|
6
|
+
["yds", "U09NAJUQSFQ"],
|
|
7
|
+
["haze", "U09N96NHZB7"],
|
|
8
|
+
]);
|
|
9
|
+
|
|
10
|
+
describe("buildReminderContext", () => {
|
|
11
|
+
it("매핑된 토큰은 멘션으로 개인에게 꽂는다", () => {
|
|
12
|
+
const text = buildReminderContext([{ name: "anthropic/yds", provider: "anthropic" }], userMap);
|
|
13
|
+
|
|
14
|
+
expect(text).toBe("<@U09NAJUQSFQ> anthropic/yds");
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("공용 계정처럼 매핑이 없으면 멘션 없이 이름만 남긴다", () => {
|
|
18
|
+
const text = buildReminderContext(
|
|
19
|
+
[{ name: "anthropic/dev-common", provider: "anthropic" }],
|
|
20
|
+
userMap,
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
expect(text).toBe("anthropic/dev-common");
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("같은 사람의 provider 별 토큰을 각각 구분해 보여준다", () => {
|
|
27
|
+
const text = buildReminderContext(
|
|
28
|
+
[
|
|
29
|
+
{ name: "anthropic/yds", provider: "anthropic" },
|
|
30
|
+
{ name: "openai/yds", provider: "openai" },
|
|
31
|
+
],
|
|
32
|
+
userMap,
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
// 멘션만 두 번 나오면 어느 토큰인지 알 수 없다 — 토큰명이 함께 있어야 한다.
|
|
36
|
+
expect(text.split("\n")).toEqual([
|
|
37
|
+
"<@U09NAJUQSFQ> anthropic/yds",
|
|
38
|
+
"<@U09NAJUQSFQ> openai/yds",
|
|
39
|
+
]);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("provider prefix 없이 저장된 이름도 매핑한다", () => {
|
|
43
|
+
const text = buildReminderContext([{ name: "haze", provider: "anthropic" }], userMap);
|
|
44
|
+
|
|
45
|
+
expect(text).toBe("<@U09N96NHZB7> haze");
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("이름이 없는 토큰도 줄을 잃지 않는다", () => {
|
|
49
|
+
const text = buildReminderContext([{ name: null, provider: "openai" }], userMap);
|
|
50
|
+
|
|
51
|
+
expect(text).toBe("unnamed");
|
|
52
|
+
});
|
|
53
|
+
});
|