esa-pcg-cli 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,6 +7,7 @@
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  const gateway_auth_1 = require("../../runtime/gateway-auth");
10
+ const cdn_purge_1 = require("../../runtime/cdn-purge");
10
11
  const QUERY_TIMEOUT = 3000;
11
12
  const WRITE_TIMEOUT = 5000;
12
13
  const BATCH_SIZE = 200;
@@ -19,6 +20,8 @@ class GatewayTagCache {
19
20
  this.mode = 'nextMode';
20
21
  this.config = null;
21
22
  this.configLoaded = false;
23
+ this.purgeClient = null;
24
+ this.purgeClientLoaded = false;
22
25
  }
23
26
  getConfig() {
24
27
  if (!this.configLoaded) {
@@ -27,6 +30,14 @@ class GatewayTagCache {
27
30
  }
28
31
  return this.config;
29
32
  }
33
+ getPurgeClient() {
34
+ if (!this.purgeClientLoaded) {
35
+ const cfg = (0, cdn_purge_1.loadCdnPurgeConfig)();
36
+ this.purgeClient = cfg ? (0, cdn_purge_1.createCdnPurgeClient)(cfg) : null;
37
+ this.purgeClientLoaded = true;
38
+ }
39
+ return this.purgeClient;
40
+ }
30
41
  buildTagKey(tag) {
31
42
  const config = this.getConfig();
32
43
  if (!config)
@@ -134,9 +145,24 @@ class GatewayTagCache {
134
145
  };
135
146
  });
136
147
  await this.batchWrite(config, rows);
148
+ // 写库成功后,fire-and-forget 触发 ESA 边缘缓存失效。
149
+ // 任何失败都不应回灌到调用方,所以 catch 直接 warn,不 throw、不 await。
150
+ const purgeClient = this.getPurgeClient();
151
+ if (purgeClient) {
152
+ const tagStrs = tags
153
+ .map(t => (typeof t === 'string' ? t : t.tag))
154
+ .filter((s) => typeof s === 'string' && s.length > 0);
155
+ if (tagStrs.length > 0) {
156
+ purgeClient.purgeByTags(tagStrs).catch(err => {
157
+ var _a;
158
+ console.warn(`[tagCache] purge fan-out failed: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
159
+ });
160
+ }
161
+ }
137
162
  }
138
163
  // ---- private methods ----
139
164
  async batchGetTags(config, tags) {
165
+ var _a, _b;
140
166
  const primaryKeys = tags.map(tag => [
141
167
  { name: 'app_id', value: `${config.aliuid}/${config.routinename}` },
142
168
  { name: 'tag', value: this.buildTagKey(tag) },
@@ -157,6 +183,7 @@ class GatewayTagCache {
157
183
  return [];
158
184
  }
159
185
  const data = (await res.json());
186
+ console.log(`[tagCache] batch-get-row ok: tags=${tags.length} rows=${(_b = (_a = data.rows) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0}`);
160
187
  if (!data.rows)
161
188
  return [];
162
189
  return data.rows.map(row => {
@@ -195,6 +222,9 @@ class GatewayTagCache {
195
222
  if (!res.ok) {
196
223
  console.warn(`[tagCache] batch-write failed: status=${res.status}`);
197
224
  }
225
+ else {
226
+ console.log(`[tagCache] batch-write ok: rows=${batch.length}`);
227
+ }
198
228
  }
199
229
  catch (err) {
200
230
  if (err.name === 'AbortError') {
@@ -208,4 +238,4 @@ class GatewayTagCache {
208
238
  }
209
239
  }
210
240
  exports.default = GatewayTagCache;
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vdmVycmlkZXMvdGFnQ2FjaGUvZ2F0ZXdheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7O0FBRUgsNkRBSW9DO0FBRXBDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQztBQUMzQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDM0IsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO0FBRXZCLFNBQVMsaUJBQWlCLENBQUMsQ0FBUztJQUNsQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFnQkQsTUFBcUIsZUFBZTtJQUFwQztRQUNFLFNBQUksR0FBRyxtQkFBNEIsQ0FBQztRQUNwQyxTQUFJLEdBQUcsVUFBbUIsQ0FBQztRQUVuQixXQUFNLEdBQTZCLElBQUksQ0FBQztRQUN4QyxpQkFBWSxHQUFHLEtBQUssQ0FBQztJQTBOL0IsQ0FBQztJQXhOUyxTQUFTO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFBLG9DQUFxQixHQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVPLFdBQVcsQ0FBQyxHQUFXO1FBQzdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sR0FBRyxDQUFDO1FBQ3hCLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFjO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXRCLElBQUk7WUFDRixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ25ELElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUN0QixJQUFJLEdBQUcsQ0FBQyxhQUFhLElBQUksR0FBRyxDQUFDLGFBQWEsR0FBRyxnQkFBZ0IsRUFBRTtvQkFDN0QsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQztpQkFDdEM7YUFDRjtZQUNELE9BQU8sZ0JBQWdCLENBQUM7U0FDekI7UUFBQyxPQUFPLEdBQVEsRUFBRTtZQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNwRSxPQUFPLENBQUMsQ0FBQztTQUNWO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FDdEIsSUFBYyxFQUNkLFlBQXFCO1FBRXJCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTFCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFcEMsSUFBSTtZQUNGLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sRUFBRSxHQUFHLFlBQVksYUFBWixZQUFZLGNBQVosWUFBWSxHQUFJLENBQUMsQ0FBQztZQUU3QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtnQkFDdEIsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtvQkFDNUIsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRTt3QkFDeEMsT0FBTyxJQUFJLENBQUM7cUJBQ2I7aUJBQ0Y7Z0JBQ0QsSUFBSSxHQUFHLENBQUMsYUFBYSxLQUFLLFNBQVMsSUFBSSxHQUFHLENBQUMsYUFBYSxHQUFHLEVBQUUsRUFBRTtvQkFDN0QsT0FBTyxJQUFJLENBQUM7aUJBQ2I7YUFDRjtZQUNELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFBQyxPQUFPLEdBQVEsRUFBRTtZQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNwRSxPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBYyxFQUFFLFlBQXFCOztRQUNqRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUUxQixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXBDLElBQUk7WUFDRixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ25ELE1BQU0sRUFBRSxHQUFHLFlBQVksYUFBWixZQUFZLGNBQVosWUFBWSxHQUFJLENBQUMsQ0FBQztZQUU3QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtnQkFDdEIsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLFNBQVM7b0JBQUUsU0FBUztnQkFDdEMsTUFBTSxhQUFhLEdBQUcsTUFBQSxHQUFHLENBQUMsYUFBYSxtQ0FBSSxDQUFDLENBQUM7Z0JBQzdDLElBQUksYUFBYSxHQUFHLEVBQUUsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRTtvQkFDekMsT0FBTyxJQUFJLENBQUM7aUJBQ2I7YUFDRjtZQUNELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFBQyxPQUFPLEdBQVEsRUFBRTtZQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN6RCxPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBa0M7UUFDaEQsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBRXZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFFcEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRTNCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDNUIsTUFBTSxNQUFNLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDN0QsTUFBTSxLQUFLLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDbEUsTUFBTSxNQUFNLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUV4QyxNQUFNLE9BQU8sR0FBc0M7Z0JBQ2pELEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO2FBQzFDLENBQUM7WUFDRixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQy9DO1lBQ0QsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQzthQUNqRDtZQUVELE9BQU87Z0JBQ0wsVUFBVSxFQUFFO29CQUNWLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsRUFBRTtvQkFDbkUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7aUJBQy9CO2dCQUNELE9BQU87YUFDUixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCw0QkFBNEI7SUFFcEIsS0FBSyxDQUFDLFlBQVksQ0FDeEIsTUFBeUIsRUFDekIsSUFBYztRQUVkLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDbkUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1NBQzlDLENBQUMsQ0FBQztRQUVILE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSwyQkFBWSxFQUFDLE1BQU0sRUFBRSxzQkFBc0IsRUFBRTtZQUM3RCxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtZQUMvQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLFNBQVMsRUFBRSxhQUFhO1NBQ3pCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO1lBQ1gsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtnQkFDNUMsT0FBTyxDQUFDLEtBQUssQ0FDWCxzQ0FBc0MsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUNwRCxDQUFDO2FBQ0g7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQywyQ0FBMkMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDdkU7WUFDRCxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBRUQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FLN0IsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7O1lBQ3pCLE1BQU0sTUFBTSxHQUFXLEVBQUUsQ0FBQztZQUMxQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQUEsR0FBRyxDQUFDLE9BQU8sbUNBQUksRUFBRSxFQUFFO2dCQUNuQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssZUFBZSxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7b0JBQ2pFLE1BQU0sQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztpQkFDbEM7cUJBQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO29CQUNoRSxNQUFNLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7aUJBQzFCO3FCQUFNLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtvQkFDakUsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO2lCQUMzQjthQUNGO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLFVBQVUsQ0FDdEIsTUFBeUIsRUFDekIsSUFHRztRQUVILElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUU5QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksVUFBVSxFQUFFO1lBQ2hELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztZQUU1QyxJQUFJO2dCQUNGLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSwyQkFBWSxFQUFDLE1BQU0sRUFBRSxvQkFBb0IsRUFBRTtvQkFDM0QsTUFBTSxFQUFFLE1BQU07b0JBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO29CQUMvQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztvQkFDckMsU0FBUyxFQUFFLGFBQWE7aUJBQ3pCLENBQUMsQ0FBQztnQkFFSCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO29CQUM1QyxPQUFPLENBQUMsS0FBSyxDQUNYLG9DQUFvQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQ2xELENBQUM7b0JBQ0YsT0FBTztpQkFDUjtnQkFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtvQkFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztpQkFDckU7YUFDRjtZQUFDLE9BQU8sR0FBUSxFQUFFO2dCQUNqQixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFO29CQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxhQUFhLEtBQUssQ0FBQyxDQUFDO2lCQUNyRTtxQkFBTTtvQkFDTCxPQUFPLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztpQkFDOUQ7YUFDRjtTQUNGO0lBQ0gsQ0FBQztDQUNGO0FBL05ELGtDQStOQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2F0ZXdheSBUYWcg57yT5a2YIE92ZXJyaWRlIChuZXh0TW9kZSlcbiAqXG4gKiDkvb/nlKggT3Blbk5leHQg55qEIG5leHRNb2RlIOaOpeWPo++8jOmAmui/hyBHYXRld2F5IOS7o+eQhuivu+WGmSBUYWJsZVN0b3Jl44CCXG4gKiDpibTmnYPnu5/kuIDotbAgcnVudGltZS9nYXRld2F5LWF1dGjvvIhITUFDIOetvuWQjSArIDQgaGVhZGVy77yJ44CCXG4gKi9cblxuaW1wb3J0IHtcbiAgbG9hZEdhdGV3YXlBdXRoQ29uZmlnLFxuICBnYXRld2F5RmV0Y2gsXG4gIEdhdGV3YXlBdXRoQ29uZmlnLFxufSBmcm9tICcuLi8uLi9ydW50aW1lL2dhdGV3YXktYXV0aCc7XG5cbmNvbnN0IFFVRVJZX1RJTUVPVVQgPSAzMDAwO1xuY29uc3QgV1JJVEVfVElNRU9VVCA9IDUwMDA7XG5jb25zdCBCQVRDSF9TSVpFID0gMjAwO1xuXG5mdW5jdGlvbiBzdHJpcExlYWRpbmdTbGFzaChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcy5yZXBsYWNlKC9eXFwvKy8sICcnKTtcbn1cblxudHlwZSBOZXh0TW9kZVRhZ0NhY2hlV3JpdGVJbnB1dCA9XG4gIHwgc3RyaW5nXG4gIHwge1xuICAgICAgdGFnOiBzdHJpbmc7XG4gICAgICBzdGFsZT86IG51bWJlcjtcbiAgICAgIGV4cGlyZT86IG51bWJlcjtcbiAgICB9O1xuXG5pbnRlcmZhY2UgVGFnUm93IHtcbiAgcmV2YWxpZGF0ZWRBdD86IG51bWJlcjtcbiAgc3RhbGU/OiBudW1iZXI7XG4gIGV4cGlyZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2F0ZXdheVRhZ0NhY2hlIHtcbiAgbmFtZSA9ICdnYXRld2F5LXRhZy1jYWNoZScgYXMgY29uc3Q7XG4gIG1vZGUgPSAnbmV4dE1vZGUnIGFzIGNvbnN0O1xuXG4gIHByaXZhdGUgY29uZmlnOiBHYXRld2F5QXV0aENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbmZpZ0xvYWRlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZ2V0Q29uZmlnKCk6IEdhdGV3YXlBdXRoQ29uZmlnIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZ0xvYWRlZCkge1xuICAgICAgdGhpcy5jb25maWcgPSBsb2FkR2F0ZXdheUF1dGhDb25maWcoKTtcbiAgICAgIHRoaXMuY29uZmlnTG9hZGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRhZ0tleSh0YWc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIHRhZztcbiAgICByZXR1cm4gYCR7Y29uZmlnLnZlcnNpb259LyR7c3RyaXBMZWFkaW5nU2xhc2godGFnKX1gO1xuICB9XG5cbiAgYXN5bmMgZ2V0TGFzdFJldmFsaWRhdGVkKHRhZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gMDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5iYXRjaEdldFRhZ3MoY29uZmlnLCB0YWdzKTtcbiAgICAgIGxldCBtYXhSZXZhbGlkYXRlZEF0ID0gMDtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgaWYgKHJvdy5yZXZhbGlkYXRlZEF0ICYmIHJvdy5yZXZhbGlkYXRlZEF0ID4gbWF4UmV2YWxpZGF0ZWRBdCkge1xuICAgICAgICAgIG1heFJldmFsaWRhdGVkQXQgPSByb3cucmV2YWxpZGF0ZWRBdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1heFJldmFsaWRhdGVkQXQ7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBnZXRMYXN0UmV2YWxpZGF0ZWQgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYXNCZWVuUmV2YWxpZGF0ZWQoXG4gICAgdGFnczogc3RyaW5nW10sXG4gICAgbGFzdE1vZGlmaWVkPzogbnVtYmVyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0YWdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmJhdGNoR2V0VGFncyhjb25maWcsIHRhZ3MpO1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGxtID0gbGFzdE1vZGlmaWVkID8/IDA7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgaWYgKHJvdy5leHBpcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChyb3cuZXhwaXJlIDw9IG5vdyAmJiByb3cuZXhwaXJlID4gbG0pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocm93LnJldmFsaWRhdGVkQXQgIT09IHVuZGVmaW5lZCAmJiByb3cucmV2YWxpZGF0ZWRBdCA+IGxtKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGhhc0JlZW5SZXZhbGlkYXRlZCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc1N0YWxlKHRhZ3M6IHN0cmluZ1tdLCBsYXN0TW9kaWZpZWQ/OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGFncy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5iYXRjaEdldFRhZ3MoY29uZmlnLCB0YWdzKTtcbiAgICAgIGNvbnN0IGxtID0gbGFzdE1vZGlmaWVkID8/IDA7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgaWYgKHJvdy5zdGFsZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcmV2YWxpZGF0ZWRBdCA9IHJvdy5yZXZhbGlkYXRlZEF0ID8/IDA7XG4gICAgICAgIGlmIChyZXZhbGlkYXRlZEF0ID4gbG0gJiYgcm93LnN0YWxlID49IGxtKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGlzU3RhbGUgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgd3JpdGVUYWdzKHRhZ3M6IE5leHRNb2RlVGFnQ2FjaGVXcml0ZUlucHV0W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRhZ3MgfHwgdGFncy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybjtcblxuICAgIGNvbnN0IHdyaXRlVHMgPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3Qgcm93cyA9IHRhZ3MubWFwKGlucHV0ID0+IHtcbiAgICAgIGNvbnN0IHRhZ1N0ciA9IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyBpbnB1dCA6IGlucHV0LnRhZztcbiAgICAgIGNvbnN0IHN0YWxlID0gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IHVuZGVmaW5lZCA6IGlucHV0LnN0YWxlO1xuICAgICAgY29uc3QgZXhwaXJlID0gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IHVuZGVmaW5lZCA6IGlucHV0LmV4cGlyZTtcbiAgICAgIGNvbnN0IHRhZ0tleSA9IHRoaXMuYnVpbGRUYWdLZXkodGFnU3RyKTtcblxuICAgICAgY29uc3QgY29sdW1uczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBudW1iZXIgfVtdID0gW1xuICAgICAgICB7IG5hbWU6ICdyZXZhbGlkYXRlZEF0JywgdmFsdWU6IHdyaXRlVHMgfSxcbiAgICAgIF07XG4gICAgICBpZiAoc3RhbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb2x1bW5zLnB1c2goeyBuYW1lOiAnc3RhbGUnLCB2YWx1ZTogc3RhbGUgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXhwaXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29sdW1ucy5wdXNoKHsgbmFtZTogJ2V4cGlyZScsIHZhbHVlOiBleHBpcmUgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByaW1hcnlLZXk6IFtcbiAgICAgICAgICB7IG5hbWU6ICdhcHBfaWQnLCB2YWx1ZTogYCR7Y29uZmlnLmFsaXVpZH0vJHtjb25maWcucm91dGluZW5hbWV9YCB9LFxuICAgICAgICAgIHsgbmFtZTogJ3RhZycsIHZhbHVlOiB0YWdLZXkgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29sdW1ucyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmJhdGNoV3JpdGUoY29uZmlnLCByb3dzKTtcbiAgfVxuXG4gIC8vIC0tLS0gcHJpdmF0ZSBtZXRob2RzIC0tLS1cblxuICBwcml2YXRlIGFzeW5jIGJhdGNoR2V0VGFncyhcbiAgICBjb25maWc6IEdhdGV3YXlBdXRoQ29uZmlnLFxuICAgIHRhZ3M6IHN0cmluZ1tdXG4gICk6IFByb21pc2U8VGFnUm93W10+IHtcbiAgICBjb25zdCBwcmltYXJ5S2V5cyA9IHRhZ3MubWFwKHRhZyA9PiBbXG4gICAgICB7IG5hbWU6ICdhcHBfaWQnLCB2YWx1ZTogYCR7Y29uZmlnLmFsaXVpZH0vJHtjb25maWcucm91dGluZW5hbWV9YCB9LFxuICAgICAgeyBuYW1lOiAndGFnJywgdmFsdWU6IHRoaXMuYnVpbGRUYWdLZXkodGFnKSB9LFxuICAgIF0pO1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNvbmZpZywgJy90YWJsZS9iYXRjaC1nZXQtcm93Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHJpbWFyeUtleXMgfSksXG4gICAgICB0aW1lb3V0TXM6IFFVRVJZX1RJTUVPVVQsXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW3RhZ0NhY2hlXSBiYXRjaC1nZXQtcm93IHJlamVjdGVkICgke3Jlcy5zdGF0dXN9KWBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBiYXRjaC1nZXQtcm93IGZhaWxlZDogc3RhdHVzPSR7cmVzLnN0YXR1c31gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIHtcbiAgICAgIHJvd3M/OiB7XG4gICAgICAgIHByaW1hcnlLZXk/OiBhbnlbXTtcbiAgICAgICAgY29sdW1ucz86IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogbnVtYmVyIH1bXTtcbiAgICAgIH1bXTtcbiAgICB9O1xuXG4gICAgaWYgKCFkYXRhLnJvd3MpIHJldHVybiBbXTtcblxuICAgIHJldHVybiBkYXRhLnJvd3MubWFwKHJvdyA9PiB7XG4gICAgICBjb25zdCByZXN1bHQ6IFRhZ1JvdyA9IHt9O1xuICAgICAgZm9yIChjb25zdCBjb2wgb2Ygcm93LmNvbHVtbnMgPz8gW10pIHtcbiAgICAgICAgaWYgKGNvbC5uYW1lID09PSAncmV2YWxpZGF0ZWRBdCcgJiYgdHlwZW9mIGNvbC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXN1bHQucmV2YWxpZGF0ZWRBdCA9IGNvbC52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2wubmFtZSA9PT0gJ3N0YWxlJyAmJiB0eXBlb2YgY29sLnZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJlc3VsdC5zdGFsZSA9IGNvbC52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2wubmFtZSA9PT0gJ2V4cGlyZScgJiYgdHlwZW9mIGNvbC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXN1bHQuZXhwaXJlID0gY29sLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBiYXRjaFdyaXRlKFxuICAgIGNvbmZpZzogR2F0ZXdheUF1dGhDb25maWcsXG4gICAgcm93czoge1xuICAgICAgcHJpbWFyeUtleTogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfVtdO1xuICAgICAgY29sdW1uczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfVtdO1xuICAgIH1bXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkgKz0gQkFUQ0hfU0laRSkge1xuICAgICAgY29uc3QgYmF0Y2ggPSByb3dzLnNsaWNlKGksIGkgKyBCQVRDSF9TSVpFKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNvbmZpZywgJy90YWJsZS9iYXRjaC13cml0ZScsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHJvd3M6IGJhdGNoIH0pLFxuICAgICAgICAgIHRpbWVvdXRNczogV1JJVEVfVElNRU9VVCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFt0YWdDYWNoZV0gYmF0Y2gtd3JpdGUgcmVqZWN0ZWQgKCR7cmVzLnN0YXR1c30pYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFt0YWdDYWNoZV0gYmF0Y2gtd3JpdGUgZmFpbGVkOiBzdGF0dXM9JHtyZXMuc3RhdHVzfWApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBiYXRjaC13cml0ZSB0aW1lb3V0ICgke1dSSVRFX1RJTUVPVVR9bXMpYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGJhdGNoLXdyaXRlIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
241
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vdmVycmlkZXMvdGFnQ2FjaGUvZ2F0ZXdheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7O0FBRUgsNkRBSW9DO0FBQ3BDLHVEQUlpQztBQUVqQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDM0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDO0FBQzNCLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUV2QixTQUFTLGlCQUFpQixDQUFDLENBQVM7SUFDbEMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBZ0JELE1BQXFCLGVBQWU7SUFBcEM7UUFDRSxTQUFJLEdBQUcsbUJBQTRCLENBQUM7UUFDcEMsU0FBSSxHQUFHLFVBQW1CLENBQUM7UUFFbkIsV0FBTSxHQUE2QixJQUFJLENBQUM7UUFDeEMsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFFckIsZ0JBQVcsR0FBMEIsSUFBSSxDQUFDO1FBQzFDLHNCQUFpQixHQUFHLEtBQUssQ0FBQztJQXVQcEMsQ0FBQztJQXJQUyxTQUFTO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFBLG9DQUFxQixHQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVPLGNBQWM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFBLDhCQUFrQixHQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUEsZ0NBQW9CLEVBQUMsR0FBRyxDQUFDLENB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LENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtvQkFDNUMsT0FBTyxDQUFDLEtBQUssQ0FDWCxvQ0FBb0MsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUNsRCxDQUFDO29CQUNGLE9BQU87aUJBQ1I7Z0JBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7b0JBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7aUJBQ3JFO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUNBQW1DLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2lCQUNoRTthQUNGO1lBQUMsT0FBTyxHQUFRLEVBQUU7Z0JBQ2pCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUU7b0JBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLGFBQWEsS0FBSyxDQUFDLENBQUM7aUJBQ3JFO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2lCQUM5RDthQUNGO1NBQ0Y7SUFDSCxDQUFDO0NBQ0Y7QUEvUEQsa0NBK1BDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHYXRld2F5IFRhZyDnvJPlrZggT3ZlcnJpZGUgKG5leHRNb2RlKVxuICpcbiAqIOS9v+eUqCBPcGVuTmV4dCDnmoQgbmV4dE1vZGUg5o6l5Y+j77yM6YCa6L+HIEdhdGV3YXkg5Luj55CG6K+75YaZIFRhYmxlU3RvcmXjgIJcbiAqIOmJtOadg+e7n+S4gOi1sCBydW50aW1lL2dhdGV3YXktYXV0aO+8iEhNQUMg562+5ZCNICsgNCBoZWFkZXLvvInjgIJcbiAqL1xuXG5pbXBvcnQge1xuICBsb2FkR2F0ZXdheUF1dGhDb25maWcsXG4gIGdhdGV3YXlGZXRjaCxcbiAgR2F0ZXdheUF1dGhDb25maWcsXG59IGZyb20gJy4uLy4uL3J1bnRpbWUvZ2F0ZXdheS1hdXRoJztcbmltcG9ydCB7XG4gIGxvYWRDZG5QdXJnZUNvbmZpZyxcbiAgY3JlYXRlQ2RuUHVyZ2VDbGllbnQsXG4gIENkblB1cmdlQ2xpZW50LFxufSBmcm9tICcuLi8uLi9ydW50aW1lL2Nkbi1wdXJnZSc7XG5cbmNvbnN0IFFVRVJZX1RJTUVPVVQgPSAzMDAwO1xuY29uc3QgV1JJVEVfVElNRU9VVCA9IDUwMDA7XG5jb25zdCBCQVRDSF9TSVpFID0gMjAwO1xuXG5mdW5jdGlvbiBzdHJpcExlYWRpbmdTbGFzaChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcy5yZXBsYWNlKC9eXFwvKy8sICcnKTtcbn1cblxudHlwZSBOZXh0TW9kZVRhZ0NhY2hlV3JpdGVJbnB1dCA9XG4gIHwgc3RyaW5nXG4gIHwge1xuICAgICAgdGFnOiBzdHJpbmc7XG4gICAgICBzdGFsZT86IG51bWJlcjtcbiAgICAgIGV4cGlyZT86IG51bWJlcjtcbiAgICB9O1xuXG5pbnRlcmZhY2UgVGFnUm93IHtcbiAgcmV2YWxpZGF0ZWRBdD86IG51bWJlcjtcbiAgc3RhbGU/OiBudW1iZXI7XG4gIGV4cGlyZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2F0ZXdheVRhZ0NhY2hlIHtcbiAgbmFtZSA9ICdnYXRld2F5LXRhZy1jYWNoZScgYXMgY29uc3Q7XG4gIG1vZGUgPSAnbmV4dE1vZGUnIGFzIGNvbnN0O1xuXG4gIHByaXZhdGUgY29uZmlnOiBHYXRld2F5QXV0aENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbmZpZ0xvYWRlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcHVyZ2VDbGllbnQ6IENkblB1cmdlQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHVyZ2VDbGllbnRMb2FkZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGdldENvbmZpZygpOiBHYXRld2F5QXV0aENvbmZpZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5jb25maWdMb2FkZWQpIHtcbiAgICAgIHRoaXMuY29uZmlnID0gbG9hZEdhdGV3YXlBdXRoQ29uZmlnKCk7XG4gICAgICB0aGlzLmNvbmZpZ0xvYWRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHVyZ2VDbGllbnQoKTogQ2RuUHVyZ2VDbGllbnQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMucHVyZ2VDbGllbnRMb2FkZWQpIHtcbiAgICAgIGNvbnN0IGNmZyA9IGxvYWRDZG5QdXJnZUNvbmZpZygpO1xuICAgICAgdGhpcy5wdXJnZUNsaWVudCA9IGNmZyA/IGNyZWF0ZUNkblB1cmdlQ2xpZW50KGNmZykgOiBudWxsO1xuICAgICAgdGhpcy5wdXJnZUNsaWVudExvYWRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnB1cmdlQ2xpZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRhZ0tleSh0YWc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIHRhZztcbiAgICByZXR1cm4gYCR7Y29uZmlnLnZlcnNpb259LyR7c3RyaXBMZWFkaW5nU2xhc2godGFnKX1gO1xuICB9XG5cbiAgYXN5bmMgZ2V0TGFzdFJldmFsaWRhdGVkKHRhZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gMDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5iYXRjaEdldFRhZ3MoY29uZmlnLCB0YWdzKTtcbiAgICAgIGxldCBtYXhSZXZhbGlkYXRlZEF0ID0gMDtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgaWYgKHJvdy5yZXZhbGlkYXRlZEF0ICYmIHJvdy5yZXZhbGlkYXRlZEF0ID4gbWF4UmV2YWxpZGF0ZWRBdCkge1xuICAgICAgICAgIG1heFJldmFsaWRhdGVkQXQgPSByb3cucmV2YWxpZGF0ZWRBdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1heFJldmFsaWRhdGVkQXQ7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBnZXRMYXN0UmV2YWxpZGF0ZWQgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYXNCZWVuUmV2YWxpZGF0ZWQoXG4gICAgdGFnczogc3RyaW5nW10sXG4gICAgbGFzdE1vZGlmaWVkPzogbnVtYmVyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0YWdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmJhdGNoR2V0VGFncyhjb25maWcsIHRhZ3MpO1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGxtID0gbGFzdE1vZGlmaWVkID8/IDA7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgaWYgKHJvdy5leHBpcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChyb3cuZXhwaXJlIDw9IG5vdyAmJiByb3cuZXhwaXJlID4gbG0pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocm93LnJldmFsaWRhdGVkQXQgIT09IHVuZGVmaW5lZCAmJiByb3cucmV2YWxpZGF0ZWRBdCA+IGxtKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGhhc0JlZW5SZXZhbGlkYXRlZCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc1N0YWxlKHRhZ3M6IHN0cmluZ1tdLCBsYXN0TW9kaWZpZWQ/OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGFncy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5iYXRjaEdldFRhZ3MoY29uZmlnLCB0YWdzKTtcbiAgICAgIGNvbnN0IGxtID0gbGFzdE1vZGlmaWVkID8/IDA7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgaWYgKHJvdy5zdGFsZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcmV2YWxpZGF0ZWRBdCA9IHJvdy5yZXZhbGlkYXRlZEF0ID8/IDA7XG4gICAgICAgIGlmIChyZXZhbGlkYXRlZEF0ID4gbG0gJiYgcm93LnN0YWxlID49IGxtKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGlzU3RhbGUgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgd3JpdGVUYWdzKHRhZ3M6IE5leHRNb2RlVGFnQ2FjaGVXcml0ZUlucHV0W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRhZ3MgfHwgdGFncy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybjtcblxuICAgIGNvbnN0IHdyaXRlVHMgPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3Qgcm93cyA9IHRhZ3MubWFwKGlucHV0ID0+IHtcbiAgICAgIGNvbnN0IHRhZ1N0ciA9IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyBpbnB1dCA6IGlucHV0LnRhZztcbiAgICAgIGNvbnN0IHN0YWxlID0gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IHVuZGVmaW5lZCA6IGlucHV0LnN0YWxlO1xuICAgICAgY29uc3QgZXhwaXJlID0gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IHVuZGVmaW5lZCA6IGlucHV0LmV4cGlyZTtcbiAgICAgIGNvbnN0IHRhZ0tleSA9IHRoaXMuYnVpbGRUYWdLZXkodGFnU3RyKTtcblxuICAgICAgY29uc3QgY29sdW1uczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBudW1iZXIgfVtdID0gW1xuICAgICAgICB7IG5hbWU6ICdyZXZhbGlkYXRlZEF0JywgdmFsdWU6IHdyaXRlVHMgfSxcbiAgICAgIF07XG4gICAgICBpZiAoc3RhbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb2x1bW5zLnB1c2goeyBuYW1lOiAnc3RhbGUnLCB2YWx1ZTogc3RhbGUgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXhwaXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29sdW1ucy5wdXNoKHsgbmFtZTogJ2V4cGlyZScsIHZhbHVlOiBleHBpcmUgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByaW1hcnlLZXk6IFtcbiAgICAgICAgICB7IG5hbWU6ICdhcHBfaWQnLCB2YWx1ZTogYCR7Y29uZmlnLmFsaXVpZH0vJHtjb25maWcucm91dGluZW5hbWV9YCB9LFxuICAgICAgICAgIHsgbmFtZTogJ3RhZycsIHZhbHVlOiB0YWdLZXkgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29sdW1ucyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmJhdGNoV3JpdGUoY29uZmlnLCByb3dzKTtcblxuICAgIC8vIOWGmeW6k+aIkOWKn+WQjixmaXJlLWFuZC1mb3JnZXQg6Kem5Y+RIEVTQSDovrnnvJjnvJPlrZjlpLHmlYjjgIJcbiAgICAvLyDku7vkvZXlpLHotKXpg73kuI3lupTlm57ngYzliLDosIPnlKjmlrks5omA5LulIGNhdGNoIOebtOaOpSB3YXJuLOS4jSB0aHJvd+OAgeS4jSBhd2FpdOOAglxuICAgIGNvbnN0IHB1cmdlQ2xpZW50ID0gdGhpcy5nZXRQdXJnZUNsaWVudCgpO1xuICAgIGlmIChwdXJnZUNsaWVudCkge1xuICAgICAgY29uc3QgdGFnU3RycyA9IHRhZ3NcbiAgICAgICAgLm1hcCh0ID0+ICh0eXBlb2YgdCA9PT0gJ3N0cmluZycgPyB0IDogdC50YWcpKVxuICAgICAgICAuZmlsdGVyKChzKTogcyBpcyBzdHJpbmcgPT4gdHlwZW9mIHMgPT09ICdzdHJpbmcnICYmIHMubGVuZ3RoID4gMCk7XG4gICAgICBpZiAodGFnU3Rycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHB1cmdlQ2xpZW50LnB1cmdlQnlUYWdzKHRhZ1N0cnMpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIHB1cmdlIGZhbi1vdXQgZmFpbGVkOiAke2Vycj8ubWVzc2FnZSA/PyBlcnJ9YCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0gcHJpdmF0ZSBtZXRob2RzIC0tLS1cblxuICBwcml2YXRlIGFzeW5jIGJhdGNoR2V0VGFncyhcbiAgICBjb25maWc6IEdhdGV3YXlBdXRoQ29uZmlnLFxuICAgIHRhZ3M6IHN0cmluZ1tdXG4gICk6IFByb21pc2U8VGFnUm93W10+IHtcbiAgICBjb25zdCBwcmltYXJ5S2V5cyA9IHRhZ3MubWFwKHRhZyA9PiBbXG4gICAgICB7IG5hbWU6ICdhcHBfaWQnLCB2YWx1ZTogYCR7Y29uZmlnLmFsaXVpZH0vJHtjb25maWcucm91dGluZW5hbWV9YCB9LFxuICAgICAgeyBuYW1lOiAndGFnJywgdmFsdWU6IHRoaXMuYnVpbGRUYWdLZXkodGFnKSB9LFxuICAgIF0pO1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNvbmZpZywgJy90YWJsZS9iYXRjaC1nZXQtcm93Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHJpbWFyeUtleXMgfSksXG4gICAgICB0aW1lb3V0TXM6IFFVRVJZX1RJTUVPVVQsXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW3RhZ0NhY2hlXSBiYXRjaC1nZXQtcm93IHJlamVjdGVkICgke3Jlcy5zdGF0dXN9KWBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBiYXRjaC1nZXQtcm93IGZhaWxlZDogc3RhdHVzPSR7cmVzLnN0YXR1c31gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIHtcbiAgICAgIHJvd3M/OiB7XG4gICAgICAgIHByaW1hcnlLZXk/OiBhbnlbXTtcbiAgICAgICAgY29sdW1ucz86IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogbnVtYmVyIH1bXTtcbiAgICAgIH1bXTtcbiAgICB9O1xuXG4gICAgY29uc29sZS5sb2coXG4gICAgICBgW3RhZ0NhY2hlXSBiYXRjaC1nZXQtcm93IG9rOiB0YWdzPSR7dGFncy5sZW5ndGh9IHJvd3M9JHtkYXRhLnJvd3M/Lmxlbmd0aCA/PyAwfWBcbiAgICApO1xuXG4gICAgaWYgKCFkYXRhLnJvd3MpIHJldHVybiBbXTtcblxuICAgIHJldHVybiBkYXRhLnJvd3MubWFwKHJvdyA9PiB7XG4gICAgICBjb25zdCByZXN1bHQ6IFRhZ1JvdyA9IHt9O1xuICAgICAgZm9yIChjb25zdCBjb2wgb2Ygcm93LmNvbHVtbnMgPz8gW10pIHtcbiAgICAgICAgaWYgKGNvbC5uYW1lID09PSAncmV2YWxpZGF0ZWRBdCcgJiYgdHlwZW9mIGNvbC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXN1bHQucmV2YWxpZGF0ZWRBdCA9IGNvbC52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2wubmFtZSA9PT0gJ3N0YWxlJyAmJiB0eXBlb2YgY29sLnZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJlc3VsdC5zdGFsZSA9IGNvbC52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2wubmFtZSA9PT0gJ2V4cGlyZScgJiYgdHlwZW9mIGNvbC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXN1bHQuZXhwaXJlID0gY29sLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBiYXRjaFdyaXRlKFxuICAgIGNvbmZpZzogR2F0ZXdheUF1dGhDb25maWcsXG4gICAgcm93czoge1xuICAgICAgcHJpbWFyeUtleTogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfVtdO1xuICAgICAgY29sdW1uczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfVtdO1xuICAgIH1bXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkgKz0gQkFUQ0hfU0laRSkge1xuICAgICAgY29uc3QgYmF0Y2ggPSByb3dzLnNsaWNlKGksIGkgKyBCQVRDSF9TSVpFKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNvbmZpZywgJy90YWJsZS9iYXRjaC13cml0ZScsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHJvd3M6IGJhdGNoIH0pLFxuICAgICAgICAgIHRpbWVvdXRNczogV1JJVEVfVElNRU9VVCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFt0YWdDYWNoZV0gYmF0Y2gtd3JpdGUgcmVqZWN0ZWQgKCR7cmVzLnN0YXR1c30pYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFt0YWdDYWNoZV0gYmF0Y2gtd3JpdGUgZmFpbGVkOiBzdGF0dXM9JHtyZXMuc3RhdHVzfWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbdGFnQ2FjaGVdIGJhdGNoLXdyaXRlIG9rOiByb3dzPSR7YmF0Y2gubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBiYXRjaC13cml0ZSB0aW1lb3V0ICgke1dSSVRFX1RJTUVPVVR9bXMpYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGJhdGNoLXdyaXRlIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,53 @@
1
+ /**
2
+ * CDN Purge Runtime
3
+ *
4
+ * 在 revalidateTag / revalidatePath 后,fire-and-forget 触发 ESA 边缘缓存失效。
5
+ *
6
+ * 设计原则:
7
+ * - tag → paths 反查走 **本地** manifest(build 时由 pcg build 把
8
+ * .open-next/dynamodb-provider/dynamodb-cache.json 嵌入 FC bundle),
9
+ * 运行时第一次用到时 lazy 加载到内存 Map,后续 O(1) 查询,无网络往返
10
+ * - /cache/refresh 走 Gateway,沿用现有 HMAC 鉴权 + ESA 分流
11
+ * - 所有失败仅 warn,绝不抛错(purge 是优化,不是正确性)
12
+ * - hostname / siteId 走 per-request edge-context(AsyncLocalStorage),
13
+ * 由 node-server wrapper 从入站请求 header 注入;ctx 缺这两项时 skip + warn,
14
+ * 不再静默生效。鉴权(5 env)缺失则 loadCdnPurgeConfig 返回 null,
15
+ * 上游降级 no-op,连 client 都不构造。
16
+ * - 跨 tag 反查结果去重,每 path 追加 /_next/data/{buildId}/{path}.json
17
+ * - 调 /cache/refresh 时按 100 URL/批、batch 内并发上限 4
18
+ */
19
+ import { GatewayAuthConfig } from './gateway-auth';
20
+ export interface CdnPurgeConfig extends GatewayAuthConfig {
21
+ /**
22
+ * 覆盖默认 manifest 路径,主要给测试用。
23
+ * 默认 = path.join(__dirname, '__pcg_tag_manifest.json'),
24
+ * 即 FC bundle 内与 cache.cjs 同级。
25
+ */
26
+ manifestPath?: string;
27
+ }
28
+ export interface CdnPurgeClient {
29
+ /**
30
+ * 异步触发 ESA 缓存失效。不阻塞调用方,失败仅 warn。
31
+ * 内部完成 path 去重 + ISR 数据路径补全 + 限流。
32
+ */
33
+ purgeByPaths(paths: string[]): Promise<void>;
34
+ /**
35
+ * tag → paths 反查 + purge。
36
+ * 反查走本地嵌入的 manifest 文件,无网络 IO。
37
+ */
38
+ purgeByTags(tags: string[]): Promise<void>;
39
+ }
40
+ /**
41
+ * 加载 purge 配置。
42
+ *
43
+ * hostname / siteId 不再从 env 取,改由 node-server wrapper 在入口
44
+ * runWithEdgeContext(headers, …) 把请求头里的 host 与 x-alicdn-site-id 注入
45
+ * AsyncLocalStorage,refreshBatch 时即时读取。原因:
46
+ * - 一个 routine 可能服务多 site / 多 hostname,启动期 env 无法表达
47
+ * - 本地 dev 若没带头,这次 purge 直接 skip + warn,不再静默生效
48
+ *
49
+ * 复用 loadGatewayAuthConfig 的 5 个 env 做 HMAC 鉴权 / endpoint 选取。
50
+ * 缺这五个 env 返回 null,调用方应跳过 purge(不影响 tag 写库)。
51
+ */
52
+ export declare function loadCdnPurgeConfig(): CdnPurgeConfig | null;
53
+ export declare function createCdnPurgeClient(cfg: CdnPurgeConfig): CdnPurgeClient;
@@ -0,0 +1,259 @@
1
+ "use strict";
2
+ /**
3
+ * CDN Purge Runtime
4
+ *
5
+ * 在 revalidateTag / revalidatePath 后,fire-and-forget 触发 ESA 边缘缓存失效。
6
+ *
7
+ * 设计原则:
8
+ * - tag → paths 反查走 **本地** manifest(build 时由 pcg build 把
9
+ * .open-next/dynamodb-provider/dynamodb-cache.json 嵌入 FC bundle),
10
+ * 运行时第一次用到时 lazy 加载到内存 Map,后续 O(1) 查询,无网络往返
11
+ * - /cache/refresh 走 Gateway,沿用现有 HMAC 鉴权 + ESA 分流
12
+ * - 所有失败仅 warn,绝不抛错(purge 是优化,不是正确性)
13
+ * - hostname / siteId 走 per-request edge-context(AsyncLocalStorage),
14
+ * 由 node-server wrapper 从入站请求 header 注入;ctx 缺这两项时 skip + warn,
15
+ * 不再静默生效。鉴权(5 env)缺失则 loadCdnPurgeConfig 返回 null,
16
+ * 上游降级 no-op,连 client 都不构造。
17
+ * - 跨 tag 反查结果去重,每 path 追加 /_next/data/{buildId}/{path}.json
18
+ * - 调 /cache/refresh 时按 100 URL/批、batch 内并发上限 4
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.createCdnPurgeClient = exports.loadCdnPurgeConfig = void 0;
22
+ const fs = require("fs");
23
+ const path = require("path");
24
+ const gateway_auth_1 = require("./gateway-auth");
25
+ const edge_context_1 = require("./edge-context");
26
+ const REFRESH_TIMEOUT_MS = 15000;
27
+ const URL_BATCH_SIZE = 100;
28
+ const REFRESH_CONCURRENCY = 4;
29
+ // 与 build.ts 中 TAG_MANIFEST_FILENAME 保持一致(对侧是写入,这侧是读取)
30
+ const TAG_MANIFEST_FILENAME = '__pcg_tag_manifest.json';
31
+ function stripLeadingSlash(s) {
32
+ return s.replace(/^\/+/, '');
33
+ }
34
+ function ensureLeadingSlash(s) {
35
+ return s.startsWith('/') ? s : `/${s}`;
36
+ }
37
+ /**
38
+ * 加载 purge 配置。
39
+ *
40
+ * hostname / siteId 不再从 env 取,改由 node-server wrapper 在入口
41
+ * runWithEdgeContext(headers, …) 把请求头里的 host 与 x-alicdn-site-id 注入
42
+ * AsyncLocalStorage,refreshBatch 时即时读取。原因:
43
+ * - 一个 routine 可能服务多 site / 多 hostname,启动期 env 无法表达
44
+ * - 本地 dev 若没带头,这次 purge 直接 skip + warn,不再静默生效
45
+ *
46
+ * 复用 loadGatewayAuthConfig 的 5 个 env 做 HMAC 鉴权 / endpoint 选取。
47
+ * 缺这五个 env 返回 null,调用方应跳过 purge(不影响 tag 写库)。
48
+ */
49
+ function loadCdnPurgeConfig() {
50
+ const base = (0, gateway_auth_1.loadGatewayAuthConfig)();
51
+ if (!base)
52
+ return null;
53
+ return { ...base };
54
+ }
55
+ exports.loadCdnPurgeConfig = loadCdnPurgeConfig;
56
+ function createCdnPurgeClient(cfg) {
57
+ var _a;
58
+ const buildId = cfg.version;
59
+ const pathPrefix = `${buildId}/`;
60
+ const manifestPath = (_a = cfg.manifestPath) !== null && _a !== void 0 ? _a : path.join(__dirname, TAG_MANIFEST_FILENAME);
61
+ // lazy 加载;Promise 用于并发首次调用的合流
62
+ let manifestPromise = null;
63
+ async function loadManifest() {
64
+ if (manifestPromise)
65
+ return manifestPromise;
66
+ manifestPromise = (async () => {
67
+ var _a, _b, _c, _d;
68
+ const map = new Map();
69
+ let raw;
70
+ try {
71
+ raw = await fs.promises.readFile(manifestPath, 'utf-8');
72
+ }
73
+ catch (err) {
74
+ // ENOENT 是常见情况(纯静态项目无 tag,或老版 CLI 未嵌入),静默降级
75
+ if ((err === null || err === void 0 ? void 0 : err.code) !== 'ENOENT') {
76
+ console.warn(`[cdn-purge] manifest read error ${manifestPath}: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
77
+ }
78
+ return new Map();
79
+ }
80
+ let rows;
81
+ try {
82
+ const parsed = JSON.parse(raw);
83
+ rows = Array.isArray(parsed) ? parsed : [];
84
+ }
85
+ catch (err) {
86
+ console.warn(`[cdn-purge] manifest parse error ${manifestPath}: ${(_b = err === null || err === void 0 ? void 0 : err.message) !== null && _b !== void 0 ? _b : err}`);
87
+ return new Map();
88
+ }
89
+ for (const row of rows) {
90
+ const tagPk = (_c = row === null || row === void 0 ? void 0 : row.tag) === null || _c === void 0 ? void 0 : _c.S;
91
+ const pathPk = (_d = row === null || row === void 0 ? void 0 : row.path) === null || _d === void 0 ? void 0 : _d.S;
92
+ if (typeof tagPk !== 'string' || typeof pathPk !== 'string')
93
+ continue;
94
+ // 只接受当前 buildId 的行;OpenNext 已保证 prefix,但万一混入旧行就跳过
95
+ if (!tagPk.startsWith(pathPrefix))
96
+ continue;
97
+ if (!pathPk.startsWith(pathPrefix))
98
+ continue;
99
+ const tag = tagPk.slice(pathPrefix.length);
100
+ const p = pathPk.slice(pathPrefix.length);
101
+ if (!tag || !p)
102
+ continue;
103
+ let bucket = map.get(tag);
104
+ if (!bucket) {
105
+ bucket = new Set();
106
+ map.set(tag, bucket);
107
+ }
108
+ bucket.add(p);
109
+ }
110
+ const result = new Map();
111
+ let totalEntries = 0;
112
+ for (const [tag, set] of map) {
113
+ result.set(tag, Array.from(set));
114
+ totalEntries += set.size;
115
+ }
116
+ console.log(`[cdn-purge] manifest loaded: tags=${result.size} entries=${totalEntries} (${manifestPath})`);
117
+ return result;
118
+ })();
119
+ return manifestPromise;
120
+ }
121
+ /**
122
+ * 把若干 Next 路由 path 展开成需 purge 的 URL 列表:
123
+ * - 跳过空串、去重(基于规范化后的 leading "/")
124
+ * - 对每个 path 追加 /_next/data/{buildId}/{path}.json
125
+ * - 拼上 https://{hostname}
126
+ */
127
+ function expandPathsToUrls(paths, hostname) {
128
+ const normalized = new Set();
129
+ for (const p of paths) {
130
+ if (!p)
131
+ continue;
132
+ normalized.add(ensureLeadingSlash(p));
133
+ }
134
+ if (normalized.size === 0)
135
+ return [];
136
+ const urls = new Set();
137
+ for (const p of normalized) {
138
+ urls.add(`https://${hostname}${p}`);
139
+ const rel = stripLeadingSlash(p);
140
+ // pages router ISR 必需;app router 多打一条无副作用
141
+ urls.add(`https://${hostname}/_next/data/${buildId}/${rel || 'index'}.json`);
142
+ }
143
+ return Array.from(urls);
144
+ }
145
+ async function refreshBatch(urls, hostname, siteId) {
146
+ var _a;
147
+ const body = {
148
+ hostname,
149
+ siteId,
150
+ urls,
151
+ };
152
+ let res;
153
+ try {
154
+ res = await (0, gateway_auth_1.gatewayFetch)(cfg, '/cache/refresh', {
155
+ method: 'POST',
156
+ headers: { 'Content-Type': 'application/json' },
157
+ body: JSON.stringify(body),
158
+ timeoutMs: REFRESH_TIMEOUT_MS,
159
+ });
160
+ }
161
+ catch (err) {
162
+ console.warn(`[cdn-purge] cache/refresh error (${urls.length} urls): ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
163
+ return;
164
+ }
165
+ if (!res.ok) {
166
+ let detail = '';
167
+ try {
168
+ detail = (await res.text()).slice(0, 200);
169
+ }
170
+ catch (_b) {
171
+ /* ignore */
172
+ }
173
+ console.warn(`[cdn-purge] cache/refresh failed status=${res.status} urls=${urls.length} ${detail}`);
174
+ return;
175
+ }
176
+ console.log(`[cdn-purge] cache/refresh ok: urls=${urls.length}`);
177
+ }
178
+ async function refreshUrls(allUrls, hostname, siteId) {
179
+ if (allUrls.length === 0)
180
+ return;
181
+ const batches = [];
182
+ for (let i = 0; i < allUrls.length; i += URL_BATCH_SIZE) {
183
+ batches.push(allUrls.slice(i, i + URL_BATCH_SIZE));
184
+ }
185
+ // 并发上限 REFRESH_CONCURRENCY 的滑动窗口
186
+ let cursor = 0;
187
+ async function worker() {
188
+ while (cursor < batches.length) {
189
+ const idx = cursor++;
190
+ await refreshBatch(batches[idx], hostname, siteId);
191
+ }
192
+ }
193
+ const workers = Array.from({ length: Math.min(REFRESH_CONCURRENCY, batches.length) }, () => worker());
194
+ await Promise.all(workers);
195
+ }
196
+ /**
197
+ * 从当前请求的 AsyncLocalStorage 拿 hostname/siteId。
198
+ * 缺任一即返回 null,调用方 warn 后 skip — 本地无 header 路径就是这条降级。
199
+ */
200
+ function resolveTarget(action) {
201
+ const { hostname, siteId } = (0, edge_context_1.getEdgeContext)();
202
+ if (!hostname || siteId === undefined || siteId === '') {
203
+ console.warn(`[cdn-purge] ${action} skip: edge context missing (hostname=${hostname !== null && hostname !== void 0 ? hostname : '∅'} siteId=${siteId !== null && siteId !== void 0 ? siteId : '∅'}); ` +
204
+ `要求入站请求带 host 与 x-alicdn-site-id`);
205
+ return null;
206
+ }
207
+ return { hostname, siteId };
208
+ }
209
+ async function purgeByPaths(paths) {
210
+ var _a;
211
+ try {
212
+ const target = resolveTarget('purgeByPaths');
213
+ if (!target)
214
+ return;
215
+ const urls = expandPathsToUrls(paths, target.hostname);
216
+ console.log(`[cdn-purge] purgeByPaths: input=${paths.length} urls=${urls.length}`);
217
+ await refreshUrls(urls, target.hostname, target.siteId);
218
+ }
219
+ catch (err) {
220
+ console.warn(`[cdn-purge] purgeByPaths error: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
221
+ }
222
+ }
223
+ async function purgeByTags(tags) {
224
+ var _a;
225
+ try {
226
+ const uniqueTags = Array.from(new Set(tags
227
+ .map(t => (typeof t === 'string' ? t : ''))
228
+ .map(t => t.trim())
229
+ .filter(Boolean)));
230
+ if (uniqueTags.length === 0)
231
+ return;
232
+ const target = resolveTarget('purgeByTags');
233
+ if (!target)
234
+ return;
235
+ const map = await loadManifest();
236
+ const merged = new Set();
237
+ for (const t of uniqueTags) {
238
+ const paths = map.get(t);
239
+ if (!paths)
240
+ continue;
241
+ for (const p of paths)
242
+ merged.add(p);
243
+ }
244
+ if (merged.size === 0) {
245
+ console.log(`[cdn-purge] purgeByTags: input=${uniqueTags.length} matched=0 (manifest miss, skip)`);
246
+ return;
247
+ }
248
+ const urls = expandPathsToUrls(Array.from(merged), target.hostname);
249
+ console.log(`[cdn-purge] purgeByTags: input=${uniqueTags.length} matched=${merged.size} urls=${urls.length}`);
250
+ await refreshUrls(urls, target.hostname, target.siteId);
251
+ }
252
+ catch (err) {
253
+ console.warn(`[cdn-purge] purgeByTags error: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
254
+ }
255
+ }
256
+ return { purgeByPaths, purgeByTags };
257
+ }
258
+ exports.createCdnPurgeClient = createCdnPurgeClient;
259
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RuLXB1cmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvY2RuLXB1cmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7OztBQUVILHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFFN0IsaURBSXdCO0FBQ3hCLGlEQUFnRDtBQUVoRCxNQUFNLGtCQUFrQixHQUFHLEtBQU0sQ0FBQztBQUVsQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFDM0IsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFFOUIsdURBQXVEO0FBQ3ZELE1BQU0scUJBQXFCLEdBQUcseUJBQXlCLENBQUM7QUF5QnhELFNBQVMsaUJBQWlCLENBQUMsQ0FBUztJQUNsQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLENBQVM7SUFDbkMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDekMsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0Isa0JBQWtCO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLElBQUEsb0NBQXFCLEdBQUUsQ0FBQztJQUNyQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZCLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ3JCLENBQUM7QUFKRCxnREFJQztBQVlELFNBQWdCLG9CQUFvQixDQUFDLEdBQW1COztJQUN0RCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO0lBQzVCLE1BQU0sVUFBVSxHQUFHLEdBQUcsT0FBTyxHQUFHLENBQUM7SUFDakMsTUFBTSxZQUFZLEdBQ2hCLE1BQUEsR0FBRyxD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QWtDLFVBQVUsQ0FBQyxNQUFNLFlBQVksTUFBTSxDQUFDLElBQUksU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQ2pHLENBQUM7WUFDRixNQUFNLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDekQ7UUFBQyxPQUFPLEdBQVEsRUFBRTtZQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxNQUFBLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxPQUFPLG1DQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDdkU7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztBQUN2QyxDQUFDO0FBNU9ELG9EQTRPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ0ROIFB1cmdlIFJ1bnRpbWVcbiAqXG4gKiDlnKggcmV2YWxpZGF0ZVRhZyAvIHJldmFsaWRhdGVQYXRoIOWQjixmaXJlLWFuZC1mb3JnZXQg6Kem5Y+RIEVTQSDovrnnvJjnvJPlrZjlpLHmlYjjgIJcbiAqXG4gKiDorr7orqHljp/liJk6XG4gKiAgIC0gdGFnIOKGkiBwYXRocyDlj43mn6XotbAgKirmnKzlnLAqKiBtYW5pZmVzdChidWlsZCDml7bnlLEgcGNnIGJ1aWxkIOaKilxuICogICAgIC5vcGVuLW5leHQvZHluYW1vZGItcHJvdmlkZXIvZHluYW1vZGItY2FjaGUuanNvbiDltYzlhaUgRkMgYnVuZGxlKSxcbiAqICAgICDov5DooYzml7bnrKzkuIDmrKHnlKjliLDml7YgbGF6eSDliqDovb3liLDlhoXlrZggTWFwLOWQjue7rSBPKDEpIOafpeivoizml6DnvZHnu5zlvoDov5RcbiAqICAgLSAvY2FjaGUvcmVmcmVzaCDotbAgR2F0ZXdheSzmsr/nlKjnjrDmnIkgSE1BQyDpibTmnYMgKyBFU0Eg5YiG5rWBXG4gKiAgIC0g5omA5pyJ5aSx6LSl5LuFIHdhcm4s57ud5LiN5oqb6ZSZKHB1cmdlIOaYr+S8mOWMlizkuI3mmK/mraPnoa7mgKcpXG4gKiAgIC0gaG9zdG5hbWUgLyBzaXRlSWQg6LWwIHBlci1yZXF1ZXN0IGVkZ2UtY29udGV4dChBc3luY0xvY2FsU3RvcmFnZSksXG4gKiAgICAg55SxIG5vZGUtc2VydmVyIHdyYXBwZXIg5LuO5YWl56uZ6K+35rGCIGhlYWRlciDms6jlhaU7Y3R4IOe8uui/meS4pOmhueaXtiBza2lwICsgd2FybixcbiAqICAgICDkuI3lho3pnZnpu5jnlJ/mlYjjgILpibTmnYMoNSBlbnYp57y65aSx5YiZIGxvYWRDZG5QdXJnZUNvbmZpZyDov5Tlm54gbnVsbCxcbiAqICAgICDkuIrmuLjpmY3nuqcgbm8tb3As6L+eIGNsaWVudCDpg73kuI3mnoTpgKDjgIJcbiAqICAgLSDot6ggdGFnIOWPjeafpee7k+aenOWOu+mHjSzmr48gcGF0aCDov73liqAgL19uZXh0L2RhdGEve2J1aWxkSWR9L3twYXRofS5qc29uXG4gKiAgIC0g6LCDIC9jYWNoZS9yZWZyZXNoIOaXtuaMiSAxMDAgVVJML+aJueOAgWJhdGNoIOWGheW5tuWPkeS4iumZkCA0XG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IENhY2hlUmVmcmVzaFJlcXVlc3QgfSBmcm9tICdAcGNnL3Byb3RvY29sJztcbmltcG9ydCB7XG4gIGxvYWRHYXRld2F5QXV0aENvbmZpZyxcbiAgZ2F0ZXdheUZldGNoLFxuICBHYXRld2F5QXV0aENvbmZpZyxcbn0gZnJvbSAnLi9nYXRld2F5LWF1dGgnO1xuaW1wb3J0IHsgZ2V0RWRnZUNvbnRleHQgfSBmcm9tICcuL2VkZ2UtY29udGV4dCc7XG5cbmNvbnN0IFJFRlJFU0hfVElNRU9VVF9NUyA9IDE1XzAwMDtcblxuY29uc3QgVVJMX0JBVENIX1NJWkUgPSAxMDA7XG5jb25zdCBSRUZSRVNIX0NPTkNVUlJFTkNZID0gNDtcblxuLy8g5LiOIGJ1aWxkLnRzIOS4rSBUQUdfTUFOSUZFU1RfRklMRU5BTUUg5L+d5oyB5LiA6Ie0KOWvueS+p+aYr+WGmeWFpSzov5nkvqfmmK/or7vlj5YpXG5jb25zdCBUQUdfTUFOSUZFU1RfRklMRU5BTUUgPSAnX19wY2dfdGFnX21hbmlmZXN0Lmpzb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENkblB1cmdlQ29uZmlnIGV4dGVuZHMgR2F0ZXdheUF1dGhDb25maWcge1xuICAvKipcbiAgICog6KaG55uW6buY6K6kIG1hbmlmZXN0IOi3r+W+hCzkuLvopoHnu5nmtYvor5XnlKjjgIJcbiAgICog6buY6K6kID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ19fcGNnX3RhZ19tYW5pZmVzdC5qc29uJyksXG4gICAqIOWNsyBGQyBidW5kbGUg5YaF5LiOIGNhY2hlLmNqcyDlkIznuqfjgIJcbiAgICovXG4gIG1hbmlmZXN0UGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDZG5QdXJnZUNsaWVudCB7XG4gIC8qKlxuICAgKiDlvILmraXop6blj5EgRVNBIOe8k+WtmOWkseaViOOAguS4jemYu+Whnuiwg+eUqOaWuSzlpLHotKXku4Ugd2FybuOAglxuICAgKiDlhoXpg6jlrozmiJAgcGF0aCDljrvph40gKyBJU1Ig5pWw5o2u6Lev5b6E6KGl5YWoICsg6ZmQ5rWB44CCXG4gICAqL1xuICBwdXJnZUJ5UGF0aHMocGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogdGFnIOKGkiBwYXRocyDlj43mn6UgKyBwdXJnZeOAglxuICAgKiDlj43mn6XotbDmnKzlnLDltYzlhaXnmoQgbWFuaWZlc3Qg5paH5Lu2LOaXoOe9kee7nCBJT+OAglxuICAgKi9cbiAgcHVyZ2VCeVRhZ3ModGFnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5mdW5jdGlvbiBzdHJpcExlYWRpbmdTbGFzaChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcy5yZXBsYWNlKC9eXFwvKy8sICcnKTtcbn1cblxuZnVuY3Rpb24gZW5zdXJlTGVhZGluZ1NsYXNoKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzLnN0YXJ0c1dpdGgoJy8nKSA/IHMgOiBgLyR7c31gO1xufVxuXG4vKipcbiAqIOWKoOi9vSBwdXJnZSDphY3nva7jgIJcbiAqXG4gKiBob3N0bmFtZSAvIHNpdGVJZCDkuI3lho3ku44gZW52IOWPlizmlLnnlLEgbm9kZS1zZXJ2ZXIgd3JhcHBlciDlnKjlhaXlj6NcbiAqIHJ1bldpdGhFZGdlQ29udGV4dChoZWFkZXJzLCDigKYpIOaKiuivt+axguWktOmHjOeahCBob3N0IOS4jiB4LWFsaWNkbi1zaXRlLWlkIOazqOWFpVxuICogQXN5bmNMb2NhbFN0b3JhZ2UscmVmcmVzaEJhdGNoIOaXtuWNs+aXtuivu+WPluOAguWOn+WboDpcbiAqICAgLSDkuIDkuKogcm91dGluZSDlj6/og73mnI3liqHlpJogc2l0ZSAvIOWkmiBob3N0bmFtZSzlkK/liqjmnJ8gZW52IOaXoOazleihqOi+vlxuICogICAtIOacrOWcsCBkZXYg6Iul5rKh5bim5aS0LOi/measoSBwdXJnZSDnm7TmjqUgc2tpcCArIHdhcm4s5LiN5YaN6Z2Z6buY55Sf5pWIXG4gKlxuICog5aSN55SoIGxvYWRHYXRld2F5QXV0aENvbmZpZyDnmoQgNSDkuKogZW52IOWBmiBITUFDIOmJtOadgyAvIGVuZHBvaW50IOmAieWPluOAglxuICog57y66L+Z5LqU5LiqIGVudiDov5Tlm54gbnVsbCzosIPnlKjmlrnlupTot7Pov4cgcHVyZ2Uo5LiN5b2x5ZONIHRhZyDlhpnlupMp44CCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ2RuUHVyZ2VDb25maWcoKTogQ2RuUHVyZ2VDb25maWcgfCBudWxsIHtcbiAgY29uc3QgYmFzZSA9IGxvYWRHYXRld2F5QXV0aENvbmZpZygpO1xuICBpZiAoIWJhc2UpIHJldHVybiBudWxsO1xuICByZXR1cm4geyAuLi5iYXNlIH07XG59XG5cbi8qKlxuICogZHluYW1vZGItcHJvdmlkZXIvZHluYW1vZGItY2FjaGUuanNvbiDnmoTooYzmoLzlvI8g4oCU4oCUXG4gKiDnlLEgT3Blbk5leHQgYnVpbGQg55u05o6l5Lqn5Ye6LOWtl+auteWQjeWbuuWumuS4uiBEeW5hbW9EQiDlsZ7mgKfmmKDlsITmoLzlvI/jgIJcbiAqL1xuaW50ZXJmYWNlIER5bmFtb1RhZ1JvdyB7XG4gIHRhZzogeyBTOiBzdHJpbmcgfTtcbiAgcGF0aDogeyBTOiBzdHJpbmcgfTtcbiAgcmV2YWxpZGF0ZWRBdD86IHsgTjogc3RyaW5nIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDZG5QdXJnZUNsaWVudChjZmc6IENkblB1cmdlQ29uZmlnKTogQ2RuUHVyZ2VDbGllbnQge1xuICBjb25zdCBidWlsZElkID0gY2ZnLnZlcnNpb247XG4gIGNvbnN0IHBhdGhQcmVmaXggPSBgJHtidWlsZElkfS9gO1xuICBjb25zdCBtYW5pZmVzdFBhdGggPVxuICAgIGNmZy5tYW5pZmVzdFBhdGggPz8gcGF0aC5qb2luKF9fZGlybmFtZSwgVEFHX01BTklGRVNUX0ZJTEVOQU1FKTtcblxuICAvLyBsYXp5IOWKoOi9vTtQcm9taXNlIOeUqOS6juW5tuWPkemmluasoeiwg+eUqOeahOWQiOa1gVxuICBsZXQgbWFuaWZlc3RQcm9taXNlOiBQcm9taXNlPE1hcDxzdHJpbmcsIHN0cmluZ1tdPj4gfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBmdW5jdGlvbiBsb2FkTWFuaWZlc3QoKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBzdHJpbmdbXT4+IHtcbiAgICBpZiAobWFuaWZlc3RQcm9taXNlKSByZXR1cm4gbWFuaWZlc3RQcm9taXNlO1xuICAgIG1hbmlmZXN0UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gICAgICBsZXQgcmF3OiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICByYXcgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShtYW5pZmVzdFBhdGgsICd1dGYtOCcpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgLy8gRU5PRU5UIOaYr+W4uOingeaDheWGtSjnuq/pnZnmgIHpobnnm67ml6AgdGFnLOaIluiAgeeJiCBDTEkg5pyq5bWM5YWlKSzpnZnpu5jpmY3nuqdcbiAgICAgICAgaWYgKGVycj8uY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgW2Nkbi1wdXJnZV0gbWFuaWZlc3QgcmVhZCBlcnJvciAke21hbmlmZXN0UGF0aH06ICR7ZXJyPy5tZXNzYWdlID8/IGVycn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAgICAgfVxuICAgICAgbGV0IHJvd3M6IER5bmFtb1RhZ1Jvd1tdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpO1xuICAgICAgICByb3dzID0gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gcGFyc2VkIDogW107XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtjZG4tcHVyZ2VdIG1hbmlmZXN0IHBhcnNlIGVycm9yICR7bWFuaWZlc3RQYXRofTogJHtlcnI/Lm1lc3NhZ2UgPz8gZXJyfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICBjb25zdCB0YWdQayA9IHJvdz8udGFnPy5TO1xuICAgICAgICBjb25zdCBwYXRoUGsgPSByb3c/LnBhdGg/LlM7XG4gICAgICAgIGlmICh0eXBlb2YgdGFnUGsgIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwYXRoUGsgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgLy8g5Y+q5o6l5Y+X5b2T5YmNIGJ1aWxkSWQg55qE6KGMO09wZW5OZXh0IOW3suS/neivgSBwcmVmaXgs5L2G5LiH5LiA5re35YWl5pen6KGM5bCx6Lez6L+HXG4gICAgICAgIGlmICghdGFnUGsuc3RhcnRzV2l0aChwYXRoUHJlZml4KSkgY29udGludWU7XG4gICAgICAgIGlmICghcGF0aFBrLnN0YXJ0c1dpdGgocGF0aFByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB0YWcgPSB0YWdQay5zbGljZShwYXRoUHJlZml4Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHAgPSBwYXRoUGsuc2xpY2UocGF0aFByZWZpeC5sZW5ndGgpO1xuICAgICAgICBpZiAoIXRhZyB8fCAhcCkgY29udGludWU7XG4gICAgICAgIGxldCBidWNrZXQgPSBtYXAuZ2V0KHRhZyk7XG4gICAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgICAgYnVja2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgbWFwLnNldCh0YWcsIGJ1Y2tldCk7XG4gICAgICAgIH1cbiAgICAgICAgYnVja2V0LmFkZChwKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAgICAgbGV0IHRvdGFsRW50cmllcyA9IDA7XG4gICAgICBmb3IgKGNvbnN0IFt0YWcsIHNldF0gb2YgbWFwKSB7XG4gICAgICAgIHJlc3VsdC5zZXQodGFnLCBBcnJheS5mcm9tKHNldCkpO1xuICAgICAgICB0b3RhbEVudHJpZXMgKz0gc2V0LnNpemU7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFtjZG4tcHVyZ2VdIG1hbmlmZXN0IGxvYWRlZDogdGFncz0ke3Jlc3VsdC5zaXplfSBlbnRyaWVzPSR7dG90YWxFbnRyaWVzfSAoJHttYW5pZmVzdFBhdGh9KWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIG1hbmlmZXN0UHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmioroi6XlubIgTmV4dCDot6/nlLEgcGF0aCDlsZXlvIDmiJDpnIAgcHVyZ2Ug55qEIFVSTCDliJfooag6XG4gICAqICAgLSDot7Pov4fnqbrkuLLjgIHljrvph40o5Z+65LqO6KeE6IyD5YyW5ZCO55qEIGxlYWRpbmcgXCIvXCIpXG4gICAqICAgLSDlr7nmr4/kuKogcGF0aCDov73liqAgL19uZXh0L2RhdGEve2J1aWxkSWR9L3twYXRofS5qc29uXG4gICAqICAgLSDmi7zkuIogaHR0cHM6Ly97aG9zdG5hbWV9XG4gICAqL1xuICBmdW5jdGlvbiBleHBhbmRQYXRoc1RvVXJscyhwYXRoczogc3RyaW5nW10sIGhvc3RuYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcCBvZiBwYXRocykge1xuICAgICAgaWYgKCFwKSBjb250aW51ZTtcbiAgICAgIG5vcm1hbGl6ZWQuYWRkKGVuc3VyZUxlYWRpbmdTbGFzaChwKSk7XG4gICAgfVxuICAgIGlmIChub3JtYWxpemVkLnNpemUgPT09IDApIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHVybHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHAgb2Ygbm9ybWFsaXplZCkge1xuICAgICAgdXJscy5hZGQoYGh0dHBzOi8vJHtob3N0bmFtZX0ke3B9YCk7XG4gICAgICBjb25zdCByZWwgPSBzdHJpcExlYWRpbmdTbGFzaChwKTtcbiAgICAgIC8vIHBhZ2VzIHJvdXRlciBJU1Ig5b+F6ZyAO2FwcCByb3V0ZXIg5aSa5omT5LiA5p2h5peg5Ymv5L2c55SoXG4gICAgICB1cmxzLmFkZChcbiAgICAgICAgYGh0dHBzOi8vJHtob3N0bmFtZX0vX25leHQvZGF0YS8ke2J1aWxkSWR9LyR7cmVsIHx8ICdpbmRleCd9Lmpzb25gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh1cmxzKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hCYXRjaChcbiAgICB1cmxzOiBzdHJpbmdbXSxcbiAgICBob3N0bmFtZTogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJvZHk6IENhY2hlUmVmcmVzaFJlcXVlc3QgPSB7XG4gICAgICBob3N0bmFtZSxcbiAgICAgIHNpdGVJZCxcbiAgICAgIHVybHMsXG4gICAgfTtcblxuICAgIGxldCByZXM6IFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBhd2FpdCBnYXRld2F5RmV0Y2goY2ZnLCAnL2NhY2hlL3JlZnJlc2gnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICAgIHRpbWVvdXRNczogUkVGUkVTSF9USU1FT1VUX01TLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtjZG4tcHVyZ2VdIGNhY2hlL3JlZnJlc2ggZXJyb3IgKCR7dXJscy5sZW5ndGh9IHVybHMpOiAke2Vycj8ubWVzc2FnZSA/PyBlcnJ9YFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgbGV0IGRldGFpbCA9ICcnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGV0YWlsID0gKGF3YWl0IHJlcy50ZXh0KCkpLnNsaWNlKDAsIDIwMCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaWdub3JlICovXG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbY2RuLXB1cmdlXSBjYWNoZS9yZWZyZXNoIGZhaWxlZCBzdGF0dXM9JHtyZXMuc3RhdHVzfSB1cmxzPSR7dXJscy5sZW5ndGh9ICR7ZGV0YWlsfWBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBbY2RuLXB1cmdlXSBjYWNoZS9yZWZyZXNoIG9rOiB1cmxzPSR7dXJscy5sZW5ndGh9YCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoVXJscyhcbiAgICBhbGxVcmxzOiBzdHJpbmdbXSxcbiAgICBob3N0bmFtZTogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChhbGxVcmxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgYmF0Y2hlczogc3RyaW5nW11bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsVXJscy5sZW5ndGg7IGkgKz0gVVJMX0JBVENIX1NJWkUpIHtcbiAgICAgIGJhdGNoZXMucHVzaChhbGxVcmxzLnNsaWNlKGksIGkgKyBVUkxfQkFUQ0hfU0laRSkpO1xuICAgIH1cblxuICAgIC8vIOW5tuWPkeS4iumZkCBSRUZSRVNIX0NPTkNVUlJFTkNZIOeahOa7keWKqOeql+WPo1xuICAgIGxldCBjdXJzb3IgPSAwO1xuICAgIGFzeW5jIGZ1bmN0aW9uIHdvcmtlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBiYXRjaGVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBpZHggPSBjdXJzb3IrKztcbiAgICAgICAgYXdhaXQgcmVmcmVzaEJhdGNoKGJhdGNoZXNbaWR4XSwgaG9zdG5hbWUsIHNpdGVJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2VycyA9IEFycmF5LmZyb20oXG4gICAgICB7IGxlbmd0aDogTWF0aC5taW4oUkVGUkVTSF9DT05DVVJSRU5DWSwgYmF0Y2hlcy5sZW5ndGgpIH0sXG4gICAgICAoKSA9PiB3b3JrZXIoKVxuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwod29ya2Vycyk7XG4gIH1cblxuICAvKipcbiAgICog5LuO5b2T5YmN6K+35rGC55qEIEFzeW5jTG9jYWxTdG9yYWdlIOaLvyBob3N0bmFtZS9zaXRlSWTjgIJcbiAgICog57y65Lu75LiA5Y2z6L+U5ZueIG51bGws6LCD55So5pa5IHdhcm4g5ZCOIHNraXAg4oCUIOacrOWcsOaXoCBoZWFkZXIg6Lev5b6E5bCx5piv6L+Z5p2h6ZmN57qn44CCXG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlVGFyZ2V0KFxuICAgIGFjdGlvbjogc3RyaW5nXG4gICk6IHsgaG9zdG5hbWU6IHN0cmluZzsgc2l0ZUlkOiBzdHJpbmcgfCBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHsgaG9zdG5hbWUsIHNpdGVJZCB9ID0gZ2V0RWRnZUNvbnRleHQoKTtcbiAgICBpZiAoIWhvc3RuYW1lIHx8IHNpdGVJZCA9PT0gdW5kZWZpbmVkIHx8IHNpdGVJZCA9PT0gJycpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtjZG4tcHVyZ2VdICR7YWN0aW9ufSBza2lwOiBlZGdlIGNvbnRleHQgbWlzc2luZyAoaG9zdG5hbWU9JHtob3N0bmFtZSA/PyAn4oiFJ30gc2l0ZUlkPSR7c2l0ZUlkID8/ICfiiIUnfSk7IGAgK1xuICAgICAgICAgIGDopoHmsYLlhaXnq5nor7fmsYLluKYgaG9zdCDkuI4geC1hbGljZG4tc2l0ZS1pZGBcbiAgICAgICk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHsgaG9zdG5hbWUsIHNpdGVJZCB9O1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcHVyZ2VCeVBhdGhzKHBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KCdwdXJnZUJ5UGF0aHMnKTtcbiAgICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgICBjb25zdCB1cmxzID0gZXhwYW5kUGF0aHNUb1VybHMocGF0aHMsIHRhcmdldC5ob3N0bmFtZSk7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFtjZG4tcHVyZ2VdIHB1cmdlQnlQYXRoczogaW5wdXQ9JHtwYXRocy5sZW5ndGh9IHVybHM9JHt1cmxzLmxlbmd0aH1gXG4gICAgICApO1xuICAgICAgYXdhaXQgcmVmcmVzaFVybHModXJscywgdGFyZ2V0Lmhvc3RuYW1lLCB0YXJnZXQuc2l0ZUlkKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKGBbY2RuLXB1cmdlXSBwdXJnZUJ5UGF0aHMgZXJyb3I6ICR7ZXJyPy5tZXNzYWdlID8/IGVycn1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBwdXJnZUJ5VGFncyh0YWdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1bmlxdWVUYWdzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChcbiAgICAgICAgICB0YWdzXG4gICAgICAgICAgICAubWFwKHQgPT4gKHR5cGVvZiB0ID09PSAnc3RyaW5nJyA/IHQgOiAnJykpXG4gICAgICAgICAgICAubWFwKHQgPT4gdC50cmltKCkpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBpZiAodW5pcXVlVGFncy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldCgncHVyZ2VCeVRhZ3MnKTtcbiAgICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG1hcCA9IGF3YWl0IGxvYWRNYW5pZmVzdCgpO1xuXG4gICAgICBjb25zdCBtZXJnZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgdCBvZiB1bmlxdWVUYWdzKSB7XG4gICAgICAgIGNvbnN0IHBhdGhzID0gbWFwLmdldCh0KTtcbiAgICAgICAgaWYgKCFwYXRocykgY29udGludWU7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBwYXRocykgbWVyZ2VkLmFkZChwKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXJnZWQuc2l6ZSA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgW2Nkbi1wdXJnZV0gcHVyZ2VCeVRhZ3M6IGlucHV0PSR7dW5pcXVlVGFncy5sZW5ndGh9IG1hdGNoZWQ9MCAobWFuaWZlc3QgbWlzcywgc2tpcClgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXJscyA9IGV4cGFuZFBhdGhzVG9VcmxzKEFycmF5LmZyb20obWVyZ2VkKSwgdGFyZ2V0Lmhvc3RuYW1lKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgW2Nkbi1wdXJnZV0gcHVyZ2VCeVRhZ3M6IGlucHV0PSR7dW5pcXVlVGFncy5sZW5ndGh9IG1hdGNoZWQ9JHttZXJnZWQuc2l6ZX0gdXJscz0ke3VybHMubGVuZ3RofWBcbiAgICAgICk7XG4gICAgICBhd2FpdCByZWZyZXNoVXJscyh1cmxzLCB0YXJnZXQuaG9zdG5hbWUsIHRhcmdldC5zaXRlSWQpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtjZG4tcHVyZ2VdIHB1cmdlQnlUYWdzIGVycm9yOiAke2Vycj8ubWVzc2FnZSA/PyBlcnJ9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgcHVyZ2VCeVBhdGhzLCBwdXJnZUJ5VGFncyB9O1xufVxuIl19
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Edge Request Context
3
+ *
4
+ * 在 ESA / 边缘环境,siteId 和 hostname 从入站请求 header 取,不再依赖
5
+ * 启动时 env 注入。原因:
6
+ * - 一个 routine 实例可能服务多个 site / hostname(灰度、多版本、聚合域),
7
+ * 启动时 env 无法表达 per-request 变化
8
+ * - 让 ops 不必再为每个部署额外配两个 env
9
+ *
10
+ * 实现用 AsyncLocalStorage:
11
+ * - node-server wrapper 在 handler 入口处 runWithEdgeContext(headers, fn)
12
+ * - 下游 cdn-purge / 其他模块用 getEdgeContext() 同步读取
13
+ * - 即使 purge 是 fire-and-forget,promise 链也会继承当前 ALS,
14
+ * refreshBatch 内仍能拿到当时请求的 ctx
15
+ *
16
+ * 关键 header:
17
+ * - x-alicdn-site-id → siteId
18
+ * - host / x-forwarded-host → hostname(首选 host,缺失才退 x-forwarded-host)
19
+ */
20
+ export interface EdgeContext {
21
+ siteId?: string | number;
22
+ hostname?: string;
23
+ }
24
+ export declare function buildEdgeContextFromHeaders(headers: Record<string, string | undefined>): EdgeContext;
25
+ export declare function runWithEdgeContext<T>(headers: Record<string, string | undefined>, fn: () => T): T;
26
+ export declare function getEdgeContext(): EdgeContext;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ /**
3
+ * Edge Request Context
4
+ *
5
+ * 在 ESA / 边缘环境,siteId 和 hostname 从入站请求 header 取,不再依赖
6
+ * 启动时 env 注入。原因:
7
+ * - 一个 routine 实例可能服务多个 site / hostname(灰度、多版本、聚合域),
8
+ * 启动时 env 无法表达 per-request 变化
9
+ * - 让 ops 不必再为每个部署额外配两个 env
10
+ *
11
+ * 实现用 AsyncLocalStorage:
12
+ * - node-server wrapper 在 handler 入口处 runWithEdgeContext(headers, fn)
13
+ * - 下游 cdn-purge / 其他模块用 getEdgeContext() 同步读取
14
+ * - 即使 purge 是 fire-and-forget,promise 链也会继承当前 ALS,
15
+ * refreshBatch 内仍能拿到当时请求的 ctx
16
+ *
17
+ * 关键 header:
18
+ * - x-alicdn-site-id → siteId
19
+ * - host / x-forwarded-host → hostname(首选 host,缺失才退 x-forwarded-host)
20
+ */
21
+ var _a;
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.getEdgeContext = exports.runWithEdgeContext = exports.buildEdgeContextFromHeaders = void 0;
24
+ const node_async_hooks_1 = require("node:async_hooks");
25
+ // OpenNext build 把 wrapper / tagCache 等分别作为 esbuild 入口打包,即便同一 routine
26
+ // 里 edge-context.ts 也会被复制成多份 —— 每份各自 `new AsyncLocalStorage()`,
27
+ // store 互不可见,wrapper 注入的 ctx 在 cdn-purge 一侧读到永远是 undefined。
28
+ // 用 Symbol.for 把单例挂到 globalThis,所有副本拿到同一个 ALS。
29
+ const ALS_KEY = Symbol.for('pcg.edgeContext.als');
30
+ const globalRef = globalThis;
31
+ const storage = (_a = globalRef[ALS_KEY]) !== null && _a !== void 0 ? _a : (globalRef[ALS_KEY] = new node_async_hooks_1.AsyncLocalStorage());
32
+ const SITE_ID_HEADER = 'x-alicdn-site-id';
33
+ const HOSTNAME_HEADER = 'host';
34
+ const FORWARDED_HOSTNAME_HEADER = 'x-forwarded-host';
35
+ function pickHeader(headers, name) {
36
+ var _a;
37
+ return (_a = headers[name]) !== null && _a !== void 0 ? _a : headers[name.toLowerCase()];
38
+ }
39
+ function parseHostname(raw) {
40
+ var _a;
41
+ if (!raw)
42
+ return undefined;
43
+ const first = (_a = raw.split(',')[0]) === null || _a === void 0 ? void 0 : _a.trim();
44
+ return first || undefined;
45
+ }
46
+ function parseSiteId(raw) {
47
+ if (!raw)
48
+ return undefined;
49
+ const trimmed = raw.trim();
50
+ if (!trimmed)
51
+ return undefined;
52
+ const n = Number(trimmed);
53
+ return Number.isFinite(n) && trimmed === String(n) ? n : trimmed;
54
+ }
55
+ function buildEdgeContextFromHeaders(headers) {
56
+ var _a;
57
+ const ctx = {};
58
+ const siteId = parseSiteId(pickHeader(headers, SITE_ID_HEADER));
59
+ if (siteId !== undefined)
60
+ ctx.siteId = siteId;
61
+ const hostname = (_a = parseHostname(pickHeader(headers, HOSTNAME_HEADER))) !== null && _a !== void 0 ? _a : parseHostname(pickHeader(headers, FORWARDED_HOSTNAME_HEADER));
62
+ if (hostname)
63
+ ctx.hostname = hostname;
64
+ return ctx;
65
+ }
66
+ exports.buildEdgeContextFromHeaders = buildEdgeContextFromHeaders;
67
+ function runWithEdgeContext(headers, fn) {
68
+ const ctx = buildEdgeContextFromHeaders(headers);
69
+ return storage.run(ctx, fn);
70
+ }
71
+ exports.runWithEdgeContext = runWithEdgeContext;
72
+ function getEdgeContext() {
73
+ var _a;
74
+ return (_a = storage.getStore()) !== null && _a !== void 0 ? _a : {};
75
+ }
76
+ exports.getEdgeContext = getEdgeContext;
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvZWRnZS1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHOzs7O0FBRUgsdURBQXFEO0FBT3JELHNFQUFzRTtBQUN0RSxnRUFBZ0U7QUFDaEUsNERBQTREO0FBQzVELCtDQUErQztBQUMvQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFJbEQsTUFBTSxTQUFTLEdBQUcsVUFBMkIsQ0FBQztBQUM5QyxNQUFNLE9BQU8sR0FDWCxNQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsbUNBQ2xCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksb0NBQWlCLEVBQWUsQ0FBQyxDQUFDO0FBRTlELE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFDO0FBQzFDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUMvQixNQUFNLHlCQUF5QixHQUFHLGtCQUFrQixDQUFDO0FBRXJELFNBQVMsVUFBVSxDQUNqQixPQUEyQyxFQUMzQyxJQUFZOztJQUVaLE9BQU8sTUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLG1DQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsR0FBdUI7O0lBQzVDLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0IsTUFBTSxLQUFLLEdBQUcsTUFBQSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxJQUFJLEVBQUUsQ0FBQztJQUN4QyxPQUFPLEtBQUssSUFBSSxTQUFTLENBQUM7QUFDNUIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEdBQXVCO0lBQzFDLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0IsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDL0IsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUNuRSxDQUFDO0FBRUQsU0FBZ0IsMkJBQTJCLENBQ3pDLE9BQTJDOztJQUUzQyxNQUFNLEdBQUcsR0FBZ0IsRUFBRSxDQUFDO0lBQzVCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsSUFBSSxNQUFNLEtBQUssU0FBUztRQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQzlDLE1BQU0sUUFBUSxHQUNaLE1BQUEsYUFBYSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUMsbUNBQ25ELGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLHlCQUF5QixDQUFDLENBQUMsQ0FBQztJQUNoRSxJQUFJLFFBQVE7UUFBRSxHQUFHLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUN0QyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFYRCxrRUFXQztBQUVELFNBQWdCLGtCQUFrQixDQUNoQyxPQUEyQyxFQUMzQyxFQUFXO0lBRVgsTUFBTSxHQUFHLEdBQUcsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM5QixDQUFDO0FBTkQsZ0RBTUM7QUFFRCxTQUFnQixjQUFjOztJQUM1QixPQUFPLE1BQUEsT0FBTyxDQUFDLFFBQVEsRUFBRSxtQ0FBSSxFQUFFLENBQUM7QUFDbEMsQ0FBQztBQUZELHdDQUVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFZGdlIFJlcXVlc3QgQ29udGV4dFxuICpcbiAqIOWcqCBFU0EgLyDovrnnvJjnjq/looMsc2l0ZUlkIOWSjCBob3N0bmFtZSDku47lhaXnq5nor7fmsYIgaGVhZGVyIOWPlizkuI3lho3kvp3otZZcbiAqIOWQr+WKqOaXtiBlbnYg5rOo5YWl44CC5Y6f5ZugOlxuICogICAtIOS4gOS4qiByb3V0aW5lIOWunuS+i+WPr+iDveacjeWKoeWkmuS4qiBzaXRlIC8gaG9zdG5hbWUo54Gw5bqm44CB5aSa54mI5pys44CB6IGa5ZCI5Z+fKSxcbiAqICAgICDlkK/liqjml7YgZW52IOaXoOazleihqOi+viBwZXItcmVxdWVzdCDlj5jljJZcbiAqICAgLSDorqkgb3BzIOS4jeW/heWGjeS4uuavj+S4qumDqOe9sumineWklumFjeS4pOS4qiBlbnZcbiAqXG4gKiDlrp7njrDnlKggQXN5bmNMb2NhbFN0b3JhZ2U6XG4gKiAgIC0gbm9kZS1zZXJ2ZXIgd3JhcHBlciDlnKggaGFuZGxlciDlhaXlj6PlpIQgcnVuV2l0aEVkZ2VDb250ZXh0KGhlYWRlcnMsIGZuKVxuICogICAtIOS4i+a4uCBjZG4tcHVyZ2UgLyDlhbbku5bmqKHlnZfnlKggZ2V0RWRnZUNvbnRleHQoKSDlkIzmraXor7vlj5ZcbiAqICAgLSDljbPkvb8gcHVyZ2Ug5pivIGZpcmUtYW5kLWZvcmdldCxwcm9taXNlIOmTvuS5n+S8mue7p+aJv+W9k+WJjSBBTFMsXG4gKiAgICAgcmVmcmVzaEJhdGNoIOWGheS7jeiDveaLv+WIsOW9k+aXtuivt+axgueahCBjdHhcbiAqXG4gKiDlhbPplK4gaGVhZGVyOlxuICogICAtIHgtYWxpY2RuLXNpdGUtaWQgIOKGkiBzaXRlSWRcbiAqICAgLSBob3N0IC8geC1mb3J3YXJkZWQtaG9zdCDihpIgaG9zdG5hbWUo6aaW6YCJIGhvc3Qs57y65aSx5omN6YCAIHgtZm9yd2FyZGVkLWhvc3QpXG4gKi9cblxuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJztcblxuZXhwb3J0IGludGVyZmFjZSBFZGdlQ29udGV4dCB7XG4gIHNpdGVJZD86IHN0cmluZyB8IG51bWJlcjtcbiAgaG9zdG5hbWU/OiBzdHJpbmc7XG59XG5cbi8vIE9wZW5OZXh0IGJ1aWxkIOaKiiB3cmFwcGVyIC8gdGFnQ2FjaGUg562J5YiG5Yir5L2c5Li6IGVzYnVpbGQg5YWl5Y+j5omT5YyFLOWNs+S+v+WQjOS4gCByb3V0aW5lXG4vLyDph4wgZWRnZS1jb250ZXh0LnRzIOS5n+S8muiiq+WkjeWItuaIkOWkmuS7vSDigJTigJQg5q+P5Lu95ZCE6IeqIGBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKWAsXG4vLyBzdG9yZSDkupLkuI3lj6/op4Esd3JhcHBlciDms6jlhaXnmoQgY3R4IOWcqCBjZG4tcHVyZ2Ug5LiA5L6n6K+75Yiw5rC46L+c5pivIHVuZGVmaW5lZOOAglxuLy8g55SoIFN5bWJvbC5mb3Ig5oqK5Y2V5L6L5oyC5YiwIGdsb2JhbFRoaXMs5omA5pyJ5Ymv5pys5ou/5Yiw5ZCM5LiA5LiqIEFMU+OAglxuY29uc3QgQUxTX0tFWSA9IFN5bWJvbC5mb3IoJ3BjZy5lZGdlQ29udGV4dC5hbHMnKTtcbnR5cGUgR2xvYmFsV2l0aEFscyA9IHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICBbQUxTX0tFWV0/OiBBc3luY0xvY2FsU3RvcmFnZTxFZGdlQ29udGV4dD47XG59O1xuY29uc3QgZ2xvYmFsUmVmID0gZ2xvYmFsVGhpcyBhcyBHbG9iYWxXaXRoQWxzO1xuY29uc3Qgc3RvcmFnZTogQXN5bmNMb2NhbFN0b3JhZ2U8RWRnZUNvbnRleHQ+ID1cbiAgZ2xvYmFsUmVmW0FMU19LRVldID8/XG4gIChnbG9iYWxSZWZbQUxTX0tFWV0gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8RWRnZUNvbnRleHQ+KCkpO1xuXG5jb25zdCBTSVRFX0lEX0hFQURFUiA9ICd4LWFsaWNkbi1zaXRlLWlkJztcbmNvbnN0IEhPU1ROQU1FX0hFQURFUiA9ICdob3N0JztcbmNvbnN0IEZPUldBUkRFRF9IT1NUTkFNRV9IRUFERVIgPSAneC1mb3J3YXJkZWQtaG9zdCc7XG5cbmZ1bmN0aW9uIHBpY2tIZWFkZXIoXG4gIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG5hbWU6IHN0cmluZ1xuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGhlYWRlcnNbbmFtZV0gPz8gaGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldO1xufVxuXG5mdW5jdGlvbiBwYXJzZUhvc3RuYW1lKHJhdzogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpcnN0ID0gcmF3LnNwbGl0KCcsJylbMF0/LnRyaW0oKTtcbiAgcmV0dXJuIGZpcnN0IHx8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VTaXRlSWQocmF3OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAoIXJhdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdHJpbW1lZCA9IHJhdy50cmltKCk7XG4gIGlmICghdHJpbW1lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbiA9IE51bWJlcih0cmltbWVkKTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShuKSAmJiB0cmltbWVkID09PSBTdHJpbmcobikgPyBuIDogdHJpbW1lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRWRnZUNvbnRleHRGcm9tSGVhZGVycyhcbiAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPlxuKTogRWRnZUNvbnRleHQge1xuICBjb25zdCBjdHg6IEVkZ2VDb250ZXh0ID0ge307XG4gIGNvbnN0IHNpdGVJZCA9IHBhcnNlU2l0ZUlkKHBpY2tIZWFkZXIoaGVhZGVycywgU0lURV9JRF9IRUFERVIpKTtcbiAgaWYgKHNpdGVJZCAhPT0gdW5kZWZpbmVkKSBjdHguc2l0ZUlkID0gc2l0ZUlkO1xuICBjb25zdCBob3N0bmFtZSA9XG4gICAgcGFyc2VIb3N0bmFtZShwaWNrSGVhZGVyKGhlYWRlcnMsIEhPU1ROQU1FX0hFQURFUikpID8/XG4gICAgcGFyc2VIb3N0bmFtZShwaWNrSGVhZGVyKGhlYWRlcnMsIEZPUldBUkRFRF9IT1NUTkFNRV9IRUFERVIpKTtcbiAgaWYgKGhvc3RuYW1lKSBjdHguaG9zdG5hbWUgPSBob3N0bmFtZTtcbiAgcmV0dXJuIGN0eDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhFZGdlQ29udGV4dDxUPihcbiAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgZm46ICgpID0+IFRcbik6IFQge1xuICBjb25zdCBjdHggPSBidWlsZEVkZ2VDb250ZXh0RnJvbUhlYWRlcnMoaGVhZGVycyk7XG4gIHJldHVybiBzdG9yYWdlLnJ1bihjdHgsIGZuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVkZ2VDb250ZXh0KCk6IEVkZ2VDb250ZXh0IHtcbiAgcmV0dXJuIHN0b3JhZ2UuZ2V0U3RvcmUoKSA/PyB7fTtcbn1cbiJdfQ==