@milkio/redis 1.0.0-beta.176 → 1.0.0-beta.179

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/index.d.ts ADDED
@@ -0,0 +1,48 @@
1
+ export type MilkioRedisCacheOptions<T> = {
2
+ defaultValue?: T | undefined;
3
+ expireMs: number;
4
+ };
5
+ export type MilkioRedisFetchOptions<T> = {
6
+ defaultValue?: T | undefined;
7
+ expireMs: number;
8
+ realExpireMs?: number;
9
+ lockInterval?: number;
10
+ refreshLockInterval?: number;
11
+ notFoundExpireMs?: number;
12
+ fetch: () => T | undefined | Promise<T | undefined>;
13
+ };
14
+ export type MilkioRedis<RedisT = any> = {
15
+ redis: RedisT;
16
+ useCache: <T>(key: string, options?: MilkioRedisCacheOptions<T>) => {
17
+ set: (value: T, expireMs: number) => Promise<T>;
18
+ get: () => Promise<T | undefined>;
19
+ pull: () => Promise<T | undefined>;
20
+ has: () => Promise<boolean>;
21
+ del: () => Promise<void>;
22
+ };
23
+ useFetch: <T>(key: string, options: MilkioRedisFetchOptions<T>) => {
24
+ has: () => Promise<boolean>;
25
+ del: () => Promise<void>;
26
+ fetch: () => Promise<T>;
27
+ refresh: () => Promise<void>;
28
+ };
29
+ useCount: (key: string) => {
30
+ get: () => Promise<number>;
31
+ add: (amount: number, expireMs?: number) => Promise<number>;
32
+ sub: (amount: number) => Promise<number>;
33
+ };
34
+ useClockIn: (key: string, cleanDate: Date) => {
35
+ clockIn: (offset: number) => Promise<void>;
36
+ check: (offset: number) => Promise<boolean>;
37
+ firstClockIn: () => Promise<number>;
38
+ lastClockIn: () => Promise<number>;
39
+ toArray: (length: number) => Promise<boolean[]>;
40
+ count: () => Promise<number>;
41
+ clean: () => Promise<void>;
42
+ };
43
+ };
44
+ export declare function createRedis<RedisT extends {
45
+ PSETEX: any;
46
+ [others: string | number | symbol]: any;
47
+ }>(redisClient: RedisT): Promise<MilkioRedis<RedisT>>;
48
+ export type Redis = MilkioRedis;
package/index.js CHANGED
@@ -1,15 +1,9 @@
1
- import {
2
- __require,
3
- __toESM
4
- } from "./chunk-ns0dgdnb.js";
5
-
6
1
  // packages/milkio-redis/index.ts
7
- async function createRedis(options) {
8
- const NodeRedis = await import("./chunk-yvgz16de.js");
9
- const redis = await NodeRedis.default.createClient(options).connect();
2
+ async function createRedis(redisClient) {
3
+ const redis = redisClient;
10
4
  const milkioRedis = {
11
5
  redis,
12
- useCache: (key, options2) => ({
6
+ useCache: (key, options) => ({
13
7
  set: async (value, expireMs) => {
14
8
  await redis.PSETEX(key, expireMs, JSON.stringify(value));
15
9
  return value;
@@ -17,14 +11,14 @@ async function createRedis(options) {
17
11
  get: async () => {
18
12
  const result = await redis.GET(key);
19
13
  if (result === null)
20
- return options2?.defaultValue;
14
+ return options?.defaultValue;
21
15
  return reviveJSONParse(JSON.parse(result));
22
16
  },
23
17
  pull: async () => {
24
18
  const resultRaw = await redis.MULTI().GET(key).DEL(key).EXEC();
25
19
  const result = resultRaw[0];
26
20
  if (result === null)
27
- return options2?.defaultValue;
21
+ return options?.defaultValue;
28
22
  return reviveJSONParse(JSON.parse(result));
29
23
  },
30
24
  has: async () => {
@@ -35,29 +29,29 @@ async function createRedis(options) {
35
29
  await redis.DEL(key);
36
30
  }
37
31
  }),
38
- useFetch: (key, options2) => {
39
- if (typeof options2.expireMs !== "number" || options2.expireMs <= 0) {
32
+ useFetch: (key, options) => {
33
+ if (typeof options.expireMs !== "number" || options.expireMs <= 0) {
40
34
  throw new Error("expireMs must be a positive number");
41
35
  }
42
- if (options2.lockInterval !== undefined && (typeof options2.lockInterval !== "number" || options2.lockInterval <= 0)) {
36
+ if (options.lockInterval !== undefined && (typeof options.lockInterval !== "number" || options.lockInterval <= 0)) {
43
37
  throw new Error("lockInterval must be a positive number if provided");
44
38
  }
45
- if (options2.realExpireMs !== undefined && (typeof options2.realExpireMs !== "number" || options2.realExpireMs <= 0)) {
39
+ if (options.realExpireMs !== undefined && (typeof options.realExpireMs !== "number" || options.realExpireMs <= 0)) {
46
40
  throw new Error("realExpireMs must be a positive number if provided");
47
41
  }
48
- if (options2.notFoundExpireMs !== undefined && (typeof options2.notFoundExpireMs !== "number" || options2.notFoundExpireMs <= 0)) {
42
+ if (options.notFoundExpireMs !== undefined && (typeof options.notFoundExpireMs !== "number" || options.notFoundExpireMs <= 0)) {
49
43
  throw new Error("notFoundExpireMs must be a positive number if provided");
50
44
  }
51
- if (options2.refreshLockInterval !== undefined) {
52
- if (typeof options2.refreshLockInterval !== "number" || options2.refreshLockInterval <= 0) {
45
+ if (options.refreshLockInterval !== undefined) {
46
+ if (typeof options.refreshLockInterval !== "number" || options.refreshLockInterval <= 0) {
53
47
  throw new Error("refreshLockInterval must be a positive number if provided");
54
48
  }
55
- const lockInterval = options2.lockInterval ?? 8192;
56
- if (options2.refreshLockInterval <= lockInterval) {
49
+ const lockInterval = options.lockInterval ?? 8192;
50
+ if (options.refreshLockInterval <= lockInterval) {
57
51
  throw new Error("refreshLockInterval must be greater than lockInterval");
58
52
  }
59
53
  }
60
- if (typeof options2.fetch !== "function") {
54
+ if (typeof options.fetch !== "function") {
61
55
  throw new Error("fetch must be a function");
62
56
  }
63
57
  return {
@@ -69,9 +63,9 @@ async function createRedis(options) {
69
63
  await redis.DEL(key);
70
64
  },
71
65
  fetch: async () => {
72
- const lockInterval = options2.lockInterval ?? 8192;
73
- const realExpireMs = options2.realExpireMs ?? Math.floor(options2.expireMs * (Math.random() + 0.5)) + 8192;
74
- const notFoundExpireMs = options2.notFoundExpireMs ?? Math.min(options2.expireMs, 16384);
66
+ const lockInterval = options.lockInterval ?? 8192;
67
+ const realExpireMs = options.realExpireMs ?? Math.floor(options.expireMs * (Math.random() + 0.5)) + 8192;
68
+ const notFoundExpireMs = options.notFoundExpireMs ?? Math.min(options.expireMs, 16384);
75
69
  const resultRaw = await redis.GET(key);
76
70
  const result = resultRaw ? reviveJSONParse(JSON.parse(resultRaw)) : undefined;
77
71
  const now = Date.now();
@@ -80,13 +74,13 @@ async function createRedis(options) {
80
74
  }
81
75
  const refreshLockKey = `${key}:refresh-lock`;
82
76
  if (await redis.EXISTS(refreshLockKey)) {
83
- return result ? result.R : options2?.defaultValue;
77
+ return result ? result.R : options?.defaultValue;
84
78
  }
85
79
  const lockKey = `${key}:lock`;
86
80
  const lockSet = await redis.SET(lockKey, "1", { PX: lockInterval, NX: true });
87
81
  const gotLock = lockSet === "OK";
88
82
  if (!gotLock)
89
- return result ? result.R : options2.defaultValue;
83
+ return result ? result.R : options.defaultValue;
90
84
  const recheckRaw = await redis.GET(key);
91
85
  const recheck = recheckRaw ? reviveJSONParse(JSON.parse(recheckRaw)) : undefined;
92
86
  if (recheck && recheck.T > now) {
@@ -94,14 +88,14 @@ async function createRedis(options) {
94
88
  }
95
89
  let data;
96
90
  try {
97
- data = await options2.fetch();
91
+ data = await options.fetch();
98
92
  } catch (error) {
99
93
  await redis.DEL(lockKey);
100
94
  throw error;
101
95
  }
102
- const effectiveExpireMs = data !== undefined ? options2.expireMs + realExpireMs : notFoundExpireMs;
96
+ const effectiveExpireMs = data !== undefined ? options.expireMs + realExpireMs : notFoundExpireMs;
103
97
  const cacheValue = {
104
- T: now + (data !== undefined ? options2.expireMs : notFoundExpireMs),
98
+ T: now + (data !== undefined ? options.expireMs : notFoundExpireMs),
105
99
  R: data
106
100
  };
107
101
  const refreshLockExists = await redis.EXISTS(refreshLockKey);
@@ -114,22 +108,22 @@ async function createRedis(options) {
114
108
  },
115
109
  refresh: async () => {
116
110
  const refreshLockKey = `${key}:refresh-lock`;
117
- const refreshLockInterval = options2.refreshLockInterval ?? (options2.lockInterval ?? 8192) + 1024;
111
+ const refreshLockInterval = options.refreshLockInterval ?? (options.lockInterval ?? 8192) + 1024;
118
112
  await redis.SET(refreshLockKey, "1", {
119
113
  PX: refreshLockInterval
120
114
  });
121
115
  const now = Date.now();
122
116
  let data;
123
117
  try {
124
- data = await options2.fetch();
118
+ data = await options.fetch();
125
119
  } catch (error) {
126
120
  await redis.DEL(refreshLockKey);
127
121
  throw error;
128
122
  }
129
- const realExpireMs = options2.realExpireMs ?? Math.floor(options2.expireMs * (Math.random() + 0.5)) + 8192;
130
- const effectiveExpireMs = data !== undefined ? options2.expireMs + realExpireMs : options2.notFoundExpireMs ?? Math.min(options2.expireMs, 16384);
123
+ const realExpireMs = options.realExpireMs ?? Math.floor(options.expireMs * (Math.random() + 0.5)) + 8192;
124
+ const effectiveExpireMs = data !== undefined ? options.expireMs + realExpireMs : options.notFoundExpireMs ?? Math.min(options.expireMs, 16384);
131
125
  const cacheValue = {
132
- T: now + (data !== undefined ? options2.expireMs : options2.notFoundExpireMs ?? Math.min(options2.expireMs, 16384)),
126
+ T: now + (data !== undefined ? options.expireMs : options.notFoundExpireMs ?? Math.min(options.expireMs, 16384)),
133
127
  R: data
134
128
  };
135
129
  await redis.PSETEX(key, effectiveExpireMs, JSON.stringify(cacheValue));
@@ -222,5 +216,5 @@ export {
222
216
  createRedis
223
217
  };
224
218
 
225
- //# debugId=6F6F9ACDCC3531F264756E2164756E21
226
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXGluZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIHsgUmVkaXNDbGllbnRPcHRpb25zIH0gZnJvbSBcInJlZGlzXCI7XHJcblxyXG5leHBvcnQgdHlwZSBNaWxraW9SZWRpc0NhY2hlT3B0aW9uczxUPiA9IHtcclxuICBkZWZhdWx0VmFsdWU/OiBUIHwgdW5kZWZpbmVkO1xyXG4gIGV4cGlyZU1zOiBudW1iZXI7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBNaWxraW9SZWRpc0ZldGNoT3B0aW9uczxUPiA9IHtcclxuICBkZWZhdWx0VmFsdWU/OiBUIHwgdW5kZWZpbmVkO1xyXG4gIGV4cGlyZU1zOiBudW1iZXI7XHJcbiAgcmVhbEV4cGlyZU1zPzogbnVtYmVyO1xyXG4gIGxvY2tJbnRlcnZhbD86IG51bWJlcjtcclxuICByZWZyZXNoTG9ja0ludGVydmFsPzogbnVtYmVyO1xyXG4gIG5vdEZvdW5kRXhwaXJlTXM/OiBudW1iZXI7XHJcbiAgZmV0Y2g6ICgpID0+IFQgfCB1bmRlZmluZWQgfCBQcm9taXNlPFQgfCB1bmRlZmluZWQ+O1xyXG59O1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlZGlzPE9wdGlvbnMgZXh0ZW5kcyBSZWRpc0NsaWVudE9wdGlvbnM+KG9wdGlvbnM6IE9wdGlvbnMpIHtcclxuICBjb25zdCBOb2RlUmVkaXMgPSBhd2FpdCBpbXBvcnQoXCJyZWRpc1wiKTtcclxuICBjb25zdCByZWRpcyA9IGF3YWl0IE5vZGVSZWRpcy5kZWZhdWx0LmNyZWF0ZUNsaWVudChvcHRpb25zKS5jb25uZWN0KCk7XHJcblxyXG4gIGNvbnN0IG1pbGtpb1JlZGlzID0ge1xyXG4gICAgcmVkaXMsXHJcbiAgICB1c2VDYWNoZTogPFQ+KGtleTogc3RyaW5nLCBvcHRpb25zPzogTWlsa2lvUmVkaXNDYWNoZU9wdGlvbnM8VD4pID0+ICh7XHJcbiAgICAgIHNldDogYXN5bmMgKHZhbHVlOiBULCBleHBpcmVNczogbnVtYmVyKTogUHJvbWlzZTxUPiA9PiB7XHJcbiAgICAgICAgYXdhaXQgcmVkaXMuUFNFVEVYKGtleSwgZXhwaXJlTXMsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICB9LFxyXG4gICAgICBnZXQ6IGFzeW5jICgpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+ID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5HRVQoa2V5KTtcclxuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gb3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIHJldHVybiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShyZXN1bHQpKTtcclxuICAgICAgfSxcclxuICAgICAgcHVsbDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdFJhdyA9IGF3YWl0IHJlZGlzLk1VTFRJKCkuR0VUKGtleSkuREVMKGtleSkuRVhFQygpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdFJhd1swXTtcclxuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gb3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIHJldHVybiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShyZXN1bHQgYXMgc3RyaW5nKSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGhhczogYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkdFVChrZXkpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQgIT09IG51bGw7XHJcbiAgICAgIH0sXHJcbiAgICAgIGRlbDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IHJlZGlzLkRFTChrZXkpO1xyXG4gICAgICB9LFxyXG4gICAgfSksXHJcblxyXG4gICAgdXNlRmV0Y2g6IDxPcHRpb25zIGV4dGVuZHMgTWlsa2lvUmVkaXNGZXRjaE9wdGlvbnM8YW55Pj4oa2V5OiBzdHJpbmcsIG9wdGlvbnM6IE9wdGlvbnMpID0+IHtcclxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmV4cGlyZU1zICE9PSBcIm51bWJlclwiIHx8IG9wdGlvbnMuZXhwaXJlTXMgPD0gMCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImV4cGlyZU1zIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXJcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChvcHRpb25zLmxvY2tJbnRlcnZhbCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2Ygb3B0aW9ucy5sb2NrSW50ZXJ2YWwgIT09IFwibnVtYmVyXCIgfHwgb3B0aW9ucy5sb2NrSW50ZXJ2YWwgPD0gMCkpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJsb2NrSW50ZXJ2YWwgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBpZiBwcm92aWRlZFwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG9wdGlvbnMucmVhbEV4cGlyZU1zICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBvcHRpb25zLnJlYWxFeHBpcmVNcyAhPT0gXCJudW1iZXJcIiB8fCBvcHRpb25zLnJlYWxFeHBpcmVNcyA8PSAwKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlYWxFeHBpcmVNcyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIGlmIHByb3ZpZGVkXCIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAob3B0aW9ucy5ub3RGb3VuZEV4cGlyZU1zICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBvcHRpb25zLm5vdEZvdW5kRXhwaXJlTXMgIT09IFwibnVtYmVyXCIgfHwgb3B0aW9ucy5ub3RGb3VuZEV4cGlyZU1zIDw9IDApKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90Rm91bmRFeHBpcmVNcyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIGlmIHByb3ZpZGVkXCIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAob3B0aW9ucy5yZWZyZXNoTG9ja0ludGVydmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVmcmVzaExvY2tJbnRlcnZhbCAhPT0gXCJudW1iZXJcIiB8fCBvcHRpb25zLnJlZnJlc2hMb2NrSW50ZXJ2YWwgPD0gMCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVmcmVzaExvY2tJbnRlcnZhbCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIGlmIHByb3ZpZGVkXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbG9ja0ludGVydmFsID0gb3B0aW9ucy5sb2NrSW50ZXJ2YWwgPz8gODE5MjtcclxuICAgICAgICBpZiAob3B0aW9ucy5yZWZyZXNoTG9ja0ludGVydmFsIDw9IGxvY2tJbnRlcnZhbCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVmcmVzaExvY2tJbnRlcnZhbCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBsb2NrSW50ZXJ2YWxcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmV0Y2ggIT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImZldGNoIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBoYXM6IGFzeW5jICgpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcclxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkdFVChrZXkpO1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCAhPT0gbnVsbDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRlbDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgYXdhaXQgcmVkaXMuREVMKGtleSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBmZXRjaDogYXN5bmMgKCk6IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPE9wdGlvbnNbXCJmZXRjaFwiXT4+PiA9PiB7XHJcbiAgICAgICAgICBjb25zdCBsb2NrSW50ZXJ2YWwgPSBvcHRpb25zLmxvY2tJbnRlcnZhbCA/PyA4MTkyO1xyXG4gICAgICAgICAgY29uc3QgcmVhbEV4cGlyZU1zID0gb3B0aW9ucy5yZWFsRXhwaXJlTXMgPz8gTWF0aC5mbG9vcihvcHRpb25zLmV4cGlyZU1zICogKE1hdGgucmFuZG9tKCkgKyAwLjUpKSArIDgxOTI7XHJcblxyXG4gICAgICAgICAgY29uc3Qgbm90Rm91bmRFeHBpcmVNcyA9IG9wdGlvbnMubm90Rm91bmRFeHBpcmVNcyA/PyBNYXRoLm1pbihvcHRpb25zLmV4cGlyZU1zLCAxNjM4NCk7XHJcblxyXG4gICAgICAgICAgY29uc3QgcmVzdWx0UmF3ID0gYXdhaXQgcmVkaXMuR0VUKGtleSk7XHJcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRSYXcgPyAocmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UocmVzdWx0UmF3KSkgYXMgeyBUOiBudW1iZXI7IFI6IEF3YWl0ZWQ8UmV0dXJuVHlwZTxPcHRpb25zW1wiZmV0Y2hcIl0+PiB9KSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuVCA+IG5vdykge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LlI7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgcmVmcmVzaExvY2tLZXkgPSBgJHtrZXl9OnJlZnJlc2gtbG9ja2A7XHJcbiAgICAgICAgICBpZiAoYXdhaXQgcmVkaXMuRVhJU1RTKHJlZnJlc2hMb2NrS2V5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID8gcmVzdWx0LlIgOiBvcHRpb25zPy5kZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgbG9ja0tleSA9IGAke2tleX06bG9ja2A7XHJcbiAgICAgICAgICBjb25zdCBsb2NrU2V0ID0gYXdhaXQgcmVkaXMuU0VUKGxvY2tLZXksIFwiMVwiLCB7IFBYOiBsb2NrSW50ZXJ2YWwsIE5YOiB0cnVlIH0pO1xyXG4gICAgICAgICAgY29uc3QgZ290TG9jayA9IGxvY2tTZXQgPT09IFwiT0tcIjtcclxuXHJcbiAgICAgICAgICBpZiAoIWdvdExvY2spIHJldHVybiByZXN1bHQgPyByZXN1bHQuUiA6IG9wdGlvbnMuZGVmYXVsdFZhbHVlO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHJlY2hlY2tSYXcgPSBhd2FpdCByZWRpcy5HRVQoa2V5KTtcclxuICAgICAgICAgIGNvbnN0IHJlY2hlY2sgPSByZWNoZWNrUmF3ID8gKHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKHJlY2hlY2tSYXcpKSBhcyB7IFQ6IG51bWJlcjsgUjogQXdhaXRlZDxSZXR1cm5UeXBlPE9wdGlvbnNbXCJmZXRjaFwiXT4+IH0pIDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAgIGlmIChyZWNoZWNrICYmIHJlY2hlY2suVCA+IG5vdykge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVjaGVjay5SO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBkYXRhOiBBd2FpdGVkPFJldHVyblR5cGU8T3B0aW9uc1tcImZldGNoXCJdPj47XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBkYXRhID0gYXdhaXQgb3B0aW9ucy5mZXRjaCgpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgYXdhaXQgcmVkaXMuREVMKGxvY2tLZXkpO1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBlZmZlY3RpdmVFeHBpcmVNcyA9IGRhdGEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZXhwaXJlTXMgKyByZWFsRXhwaXJlTXMgOiBub3RGb3VuZEV4cGlyZU1zO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGNhY2hlVmFsdWUgPSB7XHJcbiAgICAgICAgICAgIFQ6IG5vdyArIChkYXRhICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmV4cGlyZU1zIDogbm90Rm91bmRFeHBpcmVNcyksXHJcbiAgICAgICAgICAgIFI6IGRhdGEsXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGNvbnN0IHJlZnJlc2hMb2NrRXhpc3RzID0gYXdhaXQgcmVkaXMuRVhJU1RTKHJlZnJlc2hMb2NrS2V5KTtcclxuICAgICAgICAgIGlmIChyZWZyZXNoTG9ja0V4aXN0cykge1xyXG4gICAgICAgICAgICBhd2FpdCByZWRpcy5ERUwobG9ja0tleSk7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGF3YWl0IHJlZGlzLk1VTFRJKCkuUFNFVEVYKGtleSwgZWZmZWN0aXZlRXhwaXJlTXMsIEpTT04uc3RyaW5naWZ5KGNhY2hlVmFsdWUpKS5ERUwobG9ja0tleSkuRVhFQygpO1xyXG5cclxuICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVmcmVzaDogYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gICAgICAgICAgY29uc3QgcmVmcmVzaExvY2tLZXkgPSBgJHtrZXl9OnJlZnJlc2gtbG9ja2A7XHJcbiAgICAgICAgICBjb25zdCByZWZyZXNoTG9ja0ludGVydmFsID0gb3B0aW9ucy5yZWZyZXNoTG9ja0ludGVydmFsID8/IChvcHRpb25zLmxvY2tJbnRlcnZhbCA/PyA4MTkyKSArIDEwMjQ7XHJcblxyXG4gICAgICAgICAgYXdhaXQgcmVkaXMuU0VUKHJlZnJlc2hMb2NrS2V5LCBcIjFcIiwge1xyXG4gICAgICAgICAgICBQWDogcmVmcmVzaExvY2tJbnRlcnZhbCxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICBsZXQgZGF0YTogQXdhaXRlZDxSZXR1cm5UeXBlPE9wdGlvbnNbXCJmZXRjaFwiXT4+IHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IG9wdGlvbnMuZmV0Y2goKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHJlZGlzLkRFTChyZWZyZXNoTG9ja0tleSk7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IHJlYWxFeHBpcmVNcyA9IG9wdGlvbnMucmVhbEV4cGlyZU1zID8/IE1hdGguZmxvb3Iob3B0aW9ucy5leHBpcmVNcyAqIChNYXRoLnJhbmRvbSgpICsgMC41KSkgKyA4MTkyO1xyXG4gICAgICAgICAgY29uc3QgZWZmZWN0aXZlRXhwaXJlTXMgPSBkYXRhICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmV4cGlyZU1zICsgcmVhbEV4cGlyZU1zIDogKG9wdGlvbnMubm90Rm91bmRFeHBpcmVNcyA/PyBNYXRoLm1pbihvcHRpb25zLmV4cGlyZU1zLCAxNjM4NCkpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGNhY2hlVmFsdWUgPSB7XHJcbiAgICAgICAgICAgIFQ6IG5vdyArIChkYXRhICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmV4cGlyZU1zIDogKG9wdGlvbnMubm90Rm91bmRFeHBpcmVNcyA/PyBNYXRoLm1pbihvcHRpb25zLmV4cGlyZU1zLCAxNjM4NCkpKSxcclxuICAgICAgICAgICAgUjogZGF0YSxcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgYXdhaXQgcmVkaXMuUFNFVEVYKGtleSwgZWZmZWN0aXZlRXhwaXJlTXMsIEpTT04uc3RyaW5naWZ5KGNhY2hlVmFsdWUpKTsgLy8gRG8gbm90IGNsZWFuIHRoZSB1cGRhdGUgbG9jayEgSW5zdGVhZCwgd2FpdCBmb3IgaXQgdG8gZXhwaXJlIG5hdHVyYWxseVxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcbiAgICB9LFxyXG5cclxuICAgIHVzZUNvdW50OiAoa2V5OiBzdHJpbmcpID0+ICh7XHJcbiAgICAgIGdldDogYXN5bmMgKCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuR0VUKGtleSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdCA/IE51bWJlcihyZXN1bHQpIDogMDtcclxuICAgICAgfSxcclxuICAgICAgYWRkOiBhc3luYyAoYW1vdW50OiBudW1iZXIsIGV4cGlyZU1zPzogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICAgICAgICBpZiAoIWV4cGlyZU1zKSB7XHJcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5JTkNSQlkoa2V5LCBhbW91bnQpO1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuTVVMVEkoKS5JTkNSQlkoa2V5LCBhbW91bnQpLlBFWFBJUkUoa2V5LCBleHBpcmVNcykuRVhFQygpO1xyXG4gICAgICAgICAgcmV0dXJuIE51bWJlcihyZXN1bHRbMF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgc3ViOiBhc3luYyAoYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkRFQ1JCWShrZXksIGFtb3VudCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfSxcclxuICAgIH0pLFxyXG5cclxuICAgIHVzZUNsb2NrSW46IChrZXk6IHN0cmluZywgY2xlYW5EYXRlOiBEYXRlKSA9PiAoe1xyXG4gICAgICBjbG9ja0luOiBhc3luYyAob2Zmc2V0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICAgICAgICBhd2FpdCByZWRpcy5NVUxUSSgpLlNFVEJJVChrZXksIG9mZnNldCwgMSkuUEVYUElSRUFUKGtleSwgY2xlYW5EYXRlLmdldFRpbWUoKSkuRVhFQygpO1xyXG4gICAgICB9LFxyXG4gICAgICBjaGVjazogYXN5bmMgKG9mZnNldDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuR0VUQklUKGtleSwgb2Zmc2V0KTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSAxO1xyXG4gICAgICB9LFxyXG4gICAgICBmaXJzdENsb2NrSW46IGFzeW5jICgpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkJJVFBPUyhrZXksIDEpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH0sXHJcbiAgICAgIGxhc3RDbG9ja0luOiBhc3luYyAoKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5CSVRQT1Moa2V5LCAxLCAtMSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfSxcclxuICAgICAgdG9BcnJheTogYXN5bmMgKGxlbmd0aDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuW10+ID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHRSYXcgPSBhd2FpdCByZWRpcy5CSVRGSUVMRChrZXksIFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgb3BlcmF0aW9uOiBcIkdFVFwiLFxyXG4gICAgICAgICAgICBlbmNvZGluZzogYHUke2xlbmd0aH1gLFxyXG4gICAgICAgICAgICBvZmZzZXQ6IFwiIzBcIixcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gTnVtYmVyLnBhcnNlSW50KGAke3Jlc3VsdFJhd31gKS50b1N0cmluZygyKS5zcGxpdChcIlwiKTtcclxuICAgICAgICBjb25zdCBmaWxsID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGggLSByZXN1bHQubGVuZ3RoOyBpKyspIGZpbGwucHVzaChcIjBcIik7XHJcbiAgICAgICAgcmV0dXJuIFsuLi5maWxsLCAuLi5yZXN1bHRdLm1hcCgodikgPT4gdiA9PT0gXCIxXCIpO1xyXG4gICAgICB9LFxyXG4gICAgICBjb3VudDogYXN5bmMgKCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuQklUQ09VTlQoa2V5KTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9LFxyXG4gICAgICBjbGVhbjogYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gICAgICAgIGF3YWl0IHJlZGlzLkRFTChrZXkpO1xyXG4gICAgICB9LFxyXG4gICAgfSksXHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIG1pbGtpb1JlZGlzO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZXZpdmVKU09OUGFyc2U8VD4oanNvbjogVCk6IFQge1xyXG4gIGNvbnN0IGlzb0RhdGVQYXR0ZXJuID0gL14oXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGR7MSwzfSk/KShafFsrLV1cXGR7Mn06P1xcZHsyfSk/JC87XHJcblxyXG4gIGlmIChqc29uIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGpzb247XHJcbiAgaWYgKEFycmF5LmlzQXJyYXkoanNvbikpIHtcclxuICAgIHJldHVybiBqc29uLm1hcCgoaXRlbSkgPT4gcmV2aXZlSlNPTlBhcnNlKGl0ZW0pKSBhcyBhbnk7XHJcbiAgfVxyXG4gIGlmICh0eXBlb2YganNvbiA9PT0gXCJvYmplY3RcIiAmJiBqc29uICE9PSBudWxsKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoanNvbikucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xyXG4gICAgICBhY2Nba2V5IGFzIGtleW9mIFRdID0gcmV2aXZlSlNPTlBhcnNlKHZhbHVlKTtcclxuICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIHt9IGFzIFQpO1xyXG4gIH1cclxuICBpZiAodHlwZW9mIGpzb24gPT09IFwic3RyaW5nXCIpIHtcclxuICAgIGNvbnN0IG1hdGNoID0ganNvbi5tYXRjaChpc29EYXRlUGF0dGVybik7XHJcbiAgICBpZiAobWF0Y2gpIHtcclxuICAgICAgY29uc3Qgbm9ybWFsaXplZERhdGVTdHJpbmcgPSBtYXRjaFsyXSA/IGAke21hdGNoWzFdfSR7bWF0Y2hbMl0ucmVwbGFjZShcIjpcIiwgXCJcIil9YCA6IGAke21hdGNoWzFdfVpgO1xyXG4gICAgICByZXR1cm4gbmV3IERhdGUobm9ybWFsaXplZERhdGVTdHJpbmcpIGFzIGFueTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGpzb247XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFJlZGlzID0gQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVSZWRpcz4+O1xyXG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7QUFpQkEsZUFBc0IsV0FBK0MsQ0FBQyxTQUFrQjtBQUFBLEVBQ3RGLE1BQU0sWUFBWSxNQUFhO0FBQUEsRUFDL0IsTUFBTSxRQUFRLE1BQU0sVUFBVSxRQUFRLGFBQWEsT0FBTyxFQUFFLFFBQVE7QUFBQSxFQUVwRSxNQUFNLGNBQWM7QUFBQSxJQUNsQjtBQUFBLElBQ0EsVUFBVSxDQUFJLEtBQWEsY0FBMEM7QUFBQSxNQUNuRSxLQUFLLE9BQU8sT0FBVSxhQUFpQztBQUFBLFFBQ3JELE1BQU0sTUFBTSxPQUFPLEtBQUssVUFBVSxL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QUFPO0FBQUE7QUFBQSxNQUVULFNBQVMsT0FBTyxXQUF1QztBQUFBLFFBQ3JELE1BQU0sWUFBWSxNQUFNLE1BQU0sU0FBUyxLQUFLO0FBQUEsVUFDMUM7QUFBQSxZQUNFLFdBQVc7QUFBQSxZQUNYLFVBQVUsSUFBSTtBQUFBLFlBQ2QsUUFBUTtBQUFBLFVBQ1Y7QUFBQSxRQUNGLENBQUM7QUFBQSxRQUNELE1BQU0sU0FBUyxPQUFPLFNBQVMsR0FBRyxXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUUsTUFBTSxFQUFFO0FBQUEsUUFDbkUsTUFBTSxPQUFPLENBQUM7QUFBQSxRQUNkLFNBQVMsSUFBSSxFQUFHLElBQUksU0FBUyxPQUFPLFFBQVE7QUFBQSxVQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsUUFDOUQsT0FBTyxDQUFDLEdBQUcsTUFBTSxHQUFHLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxNQUFNLEdBQUc7QUFBQTtBQUFBLE1BRWxELE9BQU8sWUFBNkI7QUFBQSxRQUNsQyxNQUFNLFNBQVMsTUFBTSxNQUFNLFNBQVMsR0FBRztBQUFBLFFBQ3ZDLE9BQU87QUFBQTtBQUFBLE1BRVQsT0FBTyxZQUEyQjtBQUFBLFFBQ2hDLE1BQU0sTUFBTSxJQUFJLEdBQUc7QUFBQTtBQUFBLElBRXZCO0FBQUEsRUFDRjtBQUFBLEVBRUEsT0FBTztBQUFBO0FBR1QsU0FBUyxlQUFrQixDQUFDLE1BQVk7QUFBQSxFQUN0QyxNQUFNLGlCQUFpQjtBQUFBLEVBRXZCLElBQUksZ0JBQWdCO0FBQUEsSUFBTSxPQUFPO0FBQUEsRUFDakMsSUFBSSxNQUFNLFFBQVEsSUFBSSxHQUFHO0FBQUEsSUFDdkIsT0FBTyxLQUFLLElBQUksQ0FBQyxTQUFTLGdCQUFnQixJQUFJLENBQUM7QUFBQSxFQUNqRDtBQUFBLEVBQ0EsSUFBSSxPQUFPLFNBQVMsWUFBWSxTQUFTLE1BQU07QUFBQSxJQUM3QyxPQUFPLE9BQU8sUUFBUSxJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU0sS0FBSyxXQUFXO0FBQUEsTUFDeEQsSUFBSSxPQUFrQixnQkFBZ0IsS0FBSztBQUFBLE1BQzNDLE9BQU87QUFBQSxPQUNOLENBQUMsQ0FBTTtBQUFBLEVBQ1o7QUFBQSxFQUNBLElBQUksT0FBTyxTQUFTLFVBQVU7QUFBQSxJQUM1QixNQUFNLFFBQVEsS0FBSyxNQUFNLGNBQWM7QUFBQSxJQUN2QyxJQUFJLE9BQU87QUFBQSxNQUNULE1BQU0sdUJBQXVCLE1BQU0sS0FBSyxHQUFHLE1BQU0sS0FBSyxNQUFNLEdBQUcsUUFBUSxLQUFLLEVBQUUsTUFBTSxHQUFHLE1BQU07QUFBQSxNQUM3RixPQUFPLElBQUksS0FBSyxvQkFBb0I7QUFBQSxJQUN0QztBQUFBLEVBQ0Y7QUFBQSxFQUNBLE9BQU87QUFBQTsiLAogICJkZWJ1Z0lkIjogIjZGNkY5QUNEQ0MzNTMxRjI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
219
+ //# debugId=CA9C5C515377747D64756E2164756E21
220
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXGluZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImV4cG9ydCB0eXBlIE1pbGtpb1JlZGlzQ2FjaGVPcHRpb25zPFQ+ID0ge1xyXG4gICAgZGVmYXVsdFZhbHVlPzogVCB8IHVuZGVmaW5lZDtcclxuICAgIGV4cGlyZU1zOiBudW1iZXI7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBNaWxraW9SZWRpc0ZldGNoT3B0aW9uczxUPiA9IHtcclxuICAgIGRlZmF1bHRWYWx1ZT86IFQgfCB1bmRlZmluZWQ7XHJcbiAgICBleHBpcmVNczogbnVtYmVyO1xyXG4gICAgcmVhbEV4cGlyZU1zPzogbnVtYmVyO1xyXG4gICAgbG9ja0ludGVydmFsPzogbnVtYmVyO1xyXG4gICAgcmVmcmVzaExvY2tJbnRlcnZhbD86IG51bWJlcjtcclxuICAgIG5vdEZvdW5kRXhwaXJlTXM/OiBudW1iZXI7XHJcbiAgICBmZXRjaDogKCkgPT4gVCB8IHVuZGVmaW5lZCB8IFByb21pc2U8VCB8IHVuZGVmaW5lZD47XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBNaWxraW9SZWRpczxSZWRpc1QgPSBhbnk+ID0ge1xyXG4gICAgcmVkaXM6IFJlZGlzVDtcclxuICAgIHVzZUNhY2hlOiA8VD4oa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBNaWxraW9SZWRpc0NhY2hlT3B0aW9uczxUPikgPT4ge1xyXG4gICAgICAgIHNldDogKHZhbHVlOiBULCBleHBpcmVNczogbnVtYmVyKSA9PiBQcm9taXNlPFQ+O1xyXG4gICAgICAgIGdldDogKCkgPT4gUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcclxuICAgICAgICBwdWxsOiAoKSA9PiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+O1xyXG4gICAgICAgIGhhczogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcclxuICAgICAgICBkZWw6ICgpID0+IFByb21pc2U8dm9pZD47XHJcbiAgICB9O1xyXG4gICAgdXNlRmV0Y2g6IDxUPihrZXk6IHN0cmluZywgb3B0aW9uczogTWlsa2lvUmVkaXNGZXRjaE9wdGlvbnM8VD4pID0+IHtcclxuICAgICAgICBoYXM6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XHJcbiAgICAgICAgZGVsOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xyXG4gICAgICAgIGZldGNoOiAoKSA9PiBQcm9taXNlPFQ+O1xyXG4gICAgICAgIHJlZnJlc2g6ICgpID0+IFByb21pc2U8dm9pZD47XHJcbiAgICB9O1xyXG4gICAgdXNlQ291bnQ6IChrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGdldDogKCkgPT4gUHJvbWlzZTxudW1iZXI+O1xyXG4gICAgICAgIGFkZDogKGFtb3VudDogbnVtYmVyLCBleHBpcmVNcz86IG51bWJlcikgPT4gUHJvbWlzZTxudW1iZXI+O1xyXG4gICAgICAgIHN1YjogKGFtb3VudDogbnVtYmVyKSA9PiBQcm9taXNlPG51bWJlcj47XHJcbiAgICB9O1xyXG4gICAgdXNlQ2xvY2tJbjogKGtleTogc3RyaW5nLCBjbGVhbkRhdGU6IERhdGUpID0+IHtcclxuICAgICAgICBjbG9ja0luOiAob2Zmc2V0OiBudW1iZXIpID0+IFByb21pc2U8dm9pZD47XHJcbiAgICAgICAgY2hlY2s6IChvZmZzZXQ6IG51bWJlcikgPT4gUHJvbWlzZTxib29sZWFuPjtcclxuICAgICAgICBmaXJzdENsb2NrSW46ICgpID0+IFByb21pc2U8bnVtYmVyPjtcclxuICAgICAgICBsYXN0Q2xvY2tJbjogKCkgPT4gUHJvbWlzZTxudW1iZXI+O1xyXG4gICAgICAgIHRvQXJyYXk6IChsZW5ndGg6IG51bWJlcikgPT4gUHJvbWlzZTxib29sZWFuW10+O1xyXG4gICAgICAgIGNvdW50OiAoKSA9PiBQcm9taXNlPG51bWJlcj47XHJcbiAgICAgICAgY2xlYW46ICgpID0+IFByb21pc2U8dm9pZD47XHJcbiAgICB9O1xyXG59O1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlZGlzPFJlZGlzVCBleHRlbmRzIHsgUFNFVEVYOiBhbnksIFtvdGhlcnM6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbF06IGFueSB9PihyZWRpc0NsaWVudDogUmVkaXNUKTogUHJvbWlzZTxNaWxraW9SZWRpczxSZWRpc1Q+PiB7XHJcbiAgICAvLyBjb25zdCByZWRpcyA9IHJlZGlzQ2xpZW50IGFzIGFueSBhcyBBd2FpdGVkPFJldHVyblR5cGU8UmV0dXJuVHlwZTx0eXBlb2YgTm9kZVJlZGlzLmNyZWF0ZUNsaWVudD5bJ2Nvbm5lY3QnXT4+O1xyXG4gICAgY29uc3QgcmVkaXMgPSByZWRpc0NsaWVudCBhcyBhbnk7XHJcblxyXG4gICAgY29uc3QgbWlsa2lvUmVkaXM6IGFueSA9IHtcclxuICAgICAgICByZWRpcyxcclxuICAgICAgICB1c2VDYWNoZTogPFQ+KGtleTogc3RyaW5nLCBvcHRpb25zPzogTWlsa2lvUmVkaXNDYWNoZU9wdGlvbnM8VD4pID0+ICh7XHJcbiAgICAgICAgICAgIHNldDogYXN5bmMgKHZhbHVlOiBULCBleHBpcmVNczogbnVtYmVyKTogUHJvbWlzZTxUPiA9PiB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCByZWRpcy5QU0VURVgoa2V5LCBleHBpcmVNcywgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0OiBhc3luYyAoKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5HRVQoa2V5KTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybiBvcHRpb25zPy5kZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UocmVzdWx0IGFzIGFueSBhcyBzdHJpbmcpKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcHVsbDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0UmF3ID0gYXdhaXQgcmVkaXMuTVVMVEkoKS5HRVQoa2V5KS5ERUwoa2V5KS5FWEVDKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRSYXdbMF07XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gb3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKHJlc3VsdCBhcyBhbnkgYXMgc3RyaW5nKSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGhhczogYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuR0VUKGtleSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICE9PSBudWxsO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBkZWw6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHJlZGlzLkRFTChrZXkpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pLFxyXG5cclxuICAgICAgICB1c2VGZXRjaDogPE9wdGlvbnMgZXh0ZW5kcyBNaWxraW9SZWRpc0ZldGNoT3B0aW9uczxhbnk+PihrZXk6IHN0cmluZywgb3B0aW9uczogT3B0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZXhwaXJlTXMgIT09IFwibnVtYmVyXCIgfHwgb3B0aW9ucy5leHBpcmVNcyA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHBpcmVNcyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5sb2NrSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIG9wdGlvbnMubG9ja0ludGVydmFsICE9PSBcIm51bWJlclwiIHx8IG9wdGlvbnMubG9ja0ludGVydmFsIDw9IDApKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJsb2NrSW50ZXJ2YWwgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBpZiBwcm92aWRlZFwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVhbEV4cGlyZU1zICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBvcHRpb25zLnJlYWxFeHBpcmVNcyAhPT0gXCJudW1iZXJcIiB8fCBvcHRpb25zLnJlYWxFeHBpcmVNcyA8PSAwKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVhbEV4cGlyZU1zIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIgaWYgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLm5vdEZvdW5kRXhwaXJlTXMgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIG9wdGlvbnMubm90Rm91bmRFeHBpcmVNcyAhPT0gXCJudW1iZXJcIiB8fCBvcHRpb25zLm5vdEZvdW5kRXhwaXJlTXMgPD0gMCkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdEZvdW5kRXhwaXJlTXMgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBpZiBwcm92aWRlZFwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVmcmVzaExvY2tJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVmcmVzaExvY2tJbnRlcnZhbCAhPT0gXCJudW1iZXJcIiB8fCBvcHRpb25zLnJlZnJlc2hMb2NrSW50ZXJ2YWwgPD0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlZnJlc2hMb2NrSW50ZXJ2YWwgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBpZiBwcm92aWRlZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2NrSW50ZXJ2YWwgPSBvcHRpb25zLmxvY2tJbnRlcnZhbCA/PyA4MTkyO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVmcmVzaExvY2tJbnRlcnZhbCA8PSBsb2NrSW50ZXJ2YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWZyZXNoTG9ja0ludGVydmFsIG11c3QgYmUgZ3JlYXRlciB0aGFuIGxvY2tJbnRlcnZhbFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmZldGNoICE9PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImZldGNoIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGhhczogYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkdFVChrZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgIT09IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZGVsOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVkaXMuREVMKGtleSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmV0Y2g6IGFzeW5jICgpOiBQcm9taXNlPEF3YWl0ZWQ8UmV0dXJuVHlwZTxPcHRpb25zW1wiZmV0Y2hcIl0+Pj4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2tJbnRlcnZhbCA9IG9wdGlvbnMubG9ja0ludGVydmFsID8/IDgxOTI7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhbEV4cGlyZU1zID0gb3B0aW9ucy5yZWFsRXhwaXJlTXMgPz8gTWF0aC5mbG9vcihvcHRpb25zLmV4cGlyZU1zICogKE1hdGgucmFuZG9tKCkgKyAwLjUpKSArIDgxOTI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdEZvdW5kRXhwaXJlTXMgPSBvcHRpb25zLm5vdEZvdW5kRXhwaXJlTXMgPz8gTWF0aC5taW4ob3B0aW9ucy5leHBpcmVNcywgMTYzODQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRSYXcgPSBhd2FpdCByZWRpcy5HRVQoa2V5KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRSYXcgPyAocmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UocmVzdWx0UmF3IGFzIHN0cmluZykpIGFzIHsgVDogbnVtYmVyOyBSOiBBd2FpdGVkPFJldHVyblR5cGU8T3B0aW9uc1tcImZldGNoXCJdPj4gfSkgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuVCA+IG5vdykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LlI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWZyZXNoTG9ja0tleSA9IGAke2tleX06cmVmcmVzaC1sb2NrYDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXdhaXQgcmVkaXMuRVhJU1RTKHJlZnJlc2hMb2NrS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ID8gcmVzdWx0LlIgOiBvcHRpb25zPy5kZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NrS2V5ID0gYCR7a2V5fTpsb2NrYDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NrU2V0ID0gYXdhaXQgcmVkaXMuU0VUKGxvY2tLZXksIFwiMVwiLCB7IFBYOiBsb2NrSW50ZXJ2YWwsIE5YOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvdExvY2sgPSBsb2NrU2V0ID09PSBcIk9LXCI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZ290TG9jaykgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdC5SIDogb3B0aW9ucy5kZWZhdWx0VmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY2hlY2tSYXcgPSBhd2FpdCByZWRpcy5HRVQoa2V5KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNoZWNrID0gcmVjaGVja1JhdyA/IChyZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShyZWNoZWNrUmF3IGFzIHN0cmluZykpIGFzIHsgVDogbnVtYmVyOyBSOiBBd2FpdGVkPFJldHVyblR5cGU8T3B0aW9uc1tcImZldGNoXCJdPj4gfSkgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWNoZWNrICYmIHJlY2hlY2suVCA+IG5vdykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVjaGVjay5SO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGE6IEF3YWl0ZWQ8UmV0dXJuVHlwZTxPcHRpb25zW1wiZmV0Y2hcIl0+PjtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYXdhaXQgb3B0aW9ucy5mZXRjaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlZGlzLkRFTChsb2NrS2V5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RpdmVFeHBpcmVNcyA9IGRhdGEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZXhwaXJlTXMgKyByZWFsRXhwaXJlTXMgOiBub3RGb3VuZEV4cGlyZU1zO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZVZhbHVlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBUOiBub3cgKyAoZGF0YSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5leHBpcmVNcyA6IG5vdEZvdW5kRXhwaXJlTXMpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBSOiBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZnJlc2hMb2NrRXhpc3RzID0gYXdhaXQgcmVkaXMuRVhJU1RTKHJlZnJlc2hMb2NrS2V5KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVmcmVzaExvY2tFeGlzdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVkaXMuREVMKGxvY2tLZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlZGlzLk1VTFRJKCkuUFNFVEVYKGtleSwgZWZmZWN0aXZlRXhwaXJlTXMsIEpTT04uc3RyaW5naWZ5KGNhY2hlVmFsdWUpKS5ERUwobG9ja0tleSkuRVhFQygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICByZWZyZXNoOiBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmcmVzaExvY2tLZXkgPSBgJHtrZXl9OnJlZnJlc2gtbG9ja2A7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmcmVzaExvY2tJbnRlcnZhbCA9IG9wdGlvbnMucmVmcmVzaExvY2tJbnRlcnZhbCA/PyAob3B0aW9ucy5sb2NrSW50ZXJ2YWwgPz8gODE5MikgKyAxMDI0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWRpcy5TRVQocmVmcmVzaExvY2tLZXksIFwiMVwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFBYOiByZWZyZXNoTG9ja0ludGVydmFsLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhOiBBd2FpdGVkPFJldHVyblR5cGU8T3B0aW9uc1tcImZldGNoXCJdPj4gfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGF3YWl0IG9wdGlvbnMuZmV0Y2goKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWRpcy5ERUwocmVmcmVzaExvY2tLZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWxFeHBpcmVNcyA9IG9wdGlvbnMucmVhbEV4cGlyZU1zID8/IE1hdGguZmxvb3Iob3B0aW9ucy5leHBpcmVNcyAqIChNYXRoLnJhbmRvbSgpICsgMC41KSkgKyA4MTkyO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZUV4cGlyZU1zID0gZGF0YSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5leHBpcmVNcyArIHJlYWxFeHBpcmVNcyA6IChvcHRpb25zLm5vdEZvdW5kRXhwaXJlTXMgPz8gTWF0aC5taW4ob3B0aW9ucy5leHBpcmVNcywgMTYzODQpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FjaGVWYWx1ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVDogbm93ICsgKGRhdGEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZXhwaXJlTXMgOiAob3B0aW9ucy5ub3RGb3VuZEV4cGlyZU1zID8/IE1hdGgubWluKG9wdGlvbnMuZXhwaXJlTXMsIDE2Mzg0KSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBSOiBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlZGlzLlBTRVRFWChrZXksIGVmZmVjdGl2ZUV4cGlyZU1zLCBKU09OLnN0cmluZ2lmeShjYWNoZVZhbHVlKSk7IC8vIERvIG5vdCBjbGVhbiB0aGUgdXBkYXRlIGxvY2shIEluc3RlYWQsIHdhaXQgZm9yIGl0IHRvIGV4cGlyZSBuYXR1cmFsbHlcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgdXNlQ291bnQ6IChrZXk6IHN0cmluZykgPT4gKHtcclxuICAgICAgICAgICAgZ2V0OiBhc3luYyAoKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkdFVChrZXkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA/IE51bWJlcihyZXN1bHQpIDogMDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYWRkOiBhc3luYyAoYW1vdW50OiBudW1iZXIsIGV4cGlyZU1zPzogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghZXhwaXJlTXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5JTkNSQlkoa2V5LCBhbW91bnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5NVUxUSSgpLklOQ1JCWShrZXksIGFtb3VudCkuUEVYUElSRShrZXksIGV4cGlyZU1zKS5FWEVDKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcihyZXN1bHRbMF0pIGFzIG51bWJlcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3ViOiBhc3luYyAoYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuREVDUkJZKGtleSwgYW1vdW50KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgbnVtYmVyO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pLFxyXG5cclxuICAgICAgICB1c2VDbG9ja0luOiAoa2V5OiBzdHJpbmcsIGNsZWFuRGF0ZTogRGF0ZSkgPT4gKHtcclxuICAgICAgICAgICAgY2xvY2tJbjogYXN5bmMgKG9mZnNldDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCByZWRpcy5NVUxUSSgpLlNFVEJJVChrZXksIG9mZnNldCwgMSkuUEVYUElSRUFUKGtleSwgY2xlYW5EYXRlLmdldFRpbWUoKSkuRVhFQygpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjaGVjazogYXN5bmMgKG9mZnNldDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5HRVRCSVQoa2V5LCBvZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gMTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZmlyc3RDbG9ja0luOiBhc3luYyAoKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkJJVFBPUyhrZXksIDEpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBudW1iZXI7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGxhc3RDbG9ja0luOiBhc3luYyAoKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkJJVFBPUyhrZXksIDEsIC0xKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgbnVtYmVyO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0b0FycmF5OiBhc3luYyAobGVuZ3RoOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW5bXT4gPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0UmF3ID0gYXdhaXQgcmVkaXMuQklURklFTEQoa2V5LCBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IFwiR0VUXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBgdSR7bGVuZ3RofWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogXCIjMFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IE51bWJlci5wYXJzZUludChgJHtyZXN1bHRSYXd9YCkudG9TdHJpbmcoMikuc3BsaXQoXCJcIik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxsID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aCAtIHJlc3VsdC5sZW5ndGg7IGkrKykgZmlsbC5wdXNoKFwiMFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbLi4uZmlsbCwgLi4ucmVzdWx0XS5tYXAoKHYpID0+IHYgPT09IFwiMVwiKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY291bnQ6IGFzeW5jICgpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuQklUQ09VTlQoa2V5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgbnVtYmVyO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjbGVhbjogYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgcmVkaXMuREVMKGtleSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSksXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBtaWxraW9SZWRpcztcclxufVxyXG5cclxuZnVuY3Rpb24gcmV2aXZlSlNPTlBhcnNlPFQ+KGpzb246IFQpOiBUIHtcclxuICAgIGNvbnN0IGlzb0RhdGVQYXR0ZXJuID0gL14oXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGR7MSwzfSk/KShafFsrLV1cXGR7Mn06P1xcZHsyfSk/JC87XHJcblxyXG4gICAgaWYgKGpzb24gaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4ganNvbjtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24pKSB7XHJcbiAgICAgICAgcmV0dXJuIGpzb24ubWFwKChpdGVtKSA9PiByZXZpdmVKU09OUGFyc2UoaXRlbSkpIGFzIGFueTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YganNvbiA9PT0gXCJvYmplY3RcIiAmJiBqc29uICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGpzb24pLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICAgICAgYWNjW2tleSBhcyBrZXlvZiBUXSA9IHJldml2ZUpTT05QYXJzZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgfSwge30gYXMgVCk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGpzb24gPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICBjb25zdCBtYXRjaCA9IGpzb24ubWF0Y2goaXNvRGF0ZVBhdHRlcm4pO1xyXG4gICAgICAgIGlmIChtYXRjaCkge1xyXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkRGF0ZVN0cmluZyA9IG1hdGNoWzJdID8gYCR7bWF0Y2hbMV19JHttYXRjaFsyXS5yZXBsYWNlKFwiOlwiLCBcIlwiKX1gIDogYCR7bWF0Y2hbMV19WmA7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShub3JtYWxpemVkRGF0ZVN0cmluZykgYXMgYW55O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBqc29uO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBSZWRpcyA9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RUFDakMsSUFBSSxNQUFNLFFBQVEsSUFBSSxHQUFHO0FBQUEsSUFDckIsT0FBTyxLQUFLLElBQUksQ0FBQyxTQUFTLGdCQUFnQixJQUFJLENBQUM7QUFBQSxFQUNuRDtBQUFBLEVBQ0EsSUFBSSxPQUFPLFNBQVMsWUFBWSxTQUFTLE1BQU07QUFBQSxJQUMzQyxPQUFPLE9BQU8sUUFBUSxJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU0sS0FBSyxXQUFXO0FBQUEsTUFDdEQsSUFBSSxPQUFrQixnQkFBZ0IsS0FBSztBQUFBLE1BQzNDLE9BQU87QUFBQSxPQUNSLENBQUMsQ0FBTTtBQUFBLEVBQ2Q7QUFBQSxFQUNBLElBQUksT0FBTyxTQUFTLFVBQVU7QUFBQSxJQUMxQixNQUFNLFFBQVEsS0FBSyxNQUFNLGNBQWM7QUFBQSxJQUN2QyxJQUFJLE9BQU87QUFBQSxNQUNQLE1BQU0sdUJBQXVCLE1BQU0sS0FBSyxHQUFHLE1BQU0sS0FBSyxNQUFNLEdBQUcsUUFBUSxLQUFLLEVBQUUsTUFBTSxHQUFHLE1BQU07QUFBQSxNQUM3RixPQUFPLElBQUksS0FBSyxvQkFBb0I7QUFBQSxJQUN4QztBQUFBLEVBQ0o7QUFBQSxFQUNBLE9BQU87QUFBQTsiLAogICJkZWJ1Z0lkIjogIkNBOUM1QzUxNTM3Nzc0N0Q2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@milkio/redis","version":"1.0.0-beta.176","type":"module","exports":"./index.js","types":"./index.d.ts","dependencies":{}}
1
+ {"name":"@milkio/redis","version":"1.0.0-beta.179","type":"module","exports":"./index.js","types":"./index.d.ts","dependencies":{}}
package/chunk-ns0dgdnb.js DELETED
@@ -1,24 +0,0 @@
1
- import { createRequire } from "node:module";
2
- var __create = Object.create;
3
- var __getProtoOf = Object.getPrototypeOf;
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __toESM = (mod, isNodeMode, target) => {
8
- target = mod != null ? __create(__getProtoOf(mod)) : {};
9
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
- for (let key of __getOwnPropNames(mod))
11
- if (!__hasOwnProp.call(to, key))
12
- __defProp(to, key, {
13
- get: () => mod[key],
14
- enumerable: true
15
- });
16
- return to;
17
- };
18
- var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
19
- var __require = /* @__PURE__ */ createRequire(import.meta.url);
20
-
21
- export { __toESM, __commonJS, __require };
22
-
23
- //# debugId=B4D46D2A52F8E40A64756E2164756E21
24
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICBdLAogICJtYXBwaW5ncyI6ICIiLAogICJkZWJ1Z0lkIjogIkI0RDQ2RDJBNTJGOEU0MEE2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9