@blinkk/root-cms 1.0.0-beta.6 → 1.0.0-beta.61

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/dist/core.js CHANGED
@@ -15,6 +15,7 @@ __export(schema_exports, {
15
15
  define: () => define,
16
16
  defineCollection: () => defineCollection,
17
17
  defineSchema: () => defineSchema,
18
+ file: () => file,
18
19
  image: () => image,
19
20
  multiselect: () => multiselect,
20
21
  number: () => number,
@@ -47,6 +48,9 @@ function multiselect(field) {
47
48
  function image(field) {
48
49
  return { ...field, type: "image" };
49
50
  }
51
+ function file(field) {
52
+ return { ...field, type: "file" };
53
+ }
50
54
  function object(field) {
51
55
  return { ...field, type: "object" };
52
56
  }
@@ -66,26 +70,17 @@ function defineCollection(collection2) {
66
70
  var collection = defineCollection;
67
71
 
68
72
  // core/runtime.ts
69
- import { initializeApp, getApps, applicationDefault } from "firebase-admin/app";
70
- import { getFirestore } from "firebase-admin/firestore";
71
- function getFirebaseApp(gcpProjectId) {
72
- const apps = getApps();
73
- if (apps.length > 0 && apps[0]) {
74
- return apps[0];
75
- }
76
- return initializeApp({
77
- projectId: gcpProjectId,
78
- credential: applicationDefault()
79
- });
80
- }
73
+ import {
74
+ FieldValue,
75
+ getFirestore
76
+ } from "firebase-admin/firestore";
81
77
  async function getDoc(rootConfig, collectionId, slug, options) {
82
78
  const cmsPlugin = getCmsPlugin(rootConfig);
83
79
  const cmsPluginOptions = cmsPlugin.getConfig();
84
80
  const projectId = cmsPluginOptions.id || "default";
85
- const gcpProjectId = cmsPluginOptions.firebaseConfig.projectId;
86
81
  const mode = options.mode;
87
82
  const modeCollection = mode === "draft" ? "Drafts" : "Published";
88
- const app = getFirebaseApp(gcpProjectId);
83
+ const app = cmsPlugin.getFirebaseApp();
89
84
  const db = getFirestore(app);
90
85
  slug = slug.replaceAll("/", "--");
91
86
  const dbPath = `Projects/${projectId}/Collections/${collectionId}/${modeCollection}/${slug}`;
@@ -98,6 +93,138 @@ async function getDoc(rootConfig, collectionId, slug, options) {
98
93
  console.log(`doc not found: ${dbPath}`);
99
94
  return null;
100
95
  }
96
+ async function listDocs(rootConfig, collectionId, options) {
97
+ const cmsPlugin = getCmsPlugin(rootConfig);
98
+ const cmsPluginOptions = cmsPlugin.getConfig();
99
+ const projectId = cmsPluginOptions.id || "default";
100
+ const mode = options.mode;
101
+ const modeCollection = mode === "draft" ? "Drafts" : "Published";
102
+ const app = cmsPlugin.getFirebaseApp();
103
+ const db = getFirestore(app);
104
+ const dbPath = `Projects/${projectId}/Collections/${collectionId}/${modeCollection}`;
105
+ let query = db.collection(dbPath);
106
+ if (options.limit) {
107
+ query = query.limit(options.limit);
108
+ }
109
+ if (options.offset) {
110
+ query = query.offset(options.offset);
111
+ }
112
+ if (options.orderBy) {
113
+ query = query.orderBy(options.orderBy, options.orderByDirection);
114
+ }
115
+ if (options.query) {
116
+ query = options.query(query);
117
+ }
118
+ const results = await query.get();
119
+ const docs = [];
120
+ results.forEach((result) => {
121
+ const doc = normalizeData(result.data());
122
+ docs.push(doc);
123
+ });
124
+ return { docs };
125
+ }
126
+ async function numDocs(rootConfig, collectionId, options) {
127
+ const cmsPlugin = getCmsPlugin(rootConfig);
128
+ const cmsPluginOptions = cmsPlugin.getConfig();
129
+ const projectId = cmsPluginOptions.id || "default";
130
+ const mode = options.mode;
131
+ const modeCollection = mode === "draft" ? "Drafts" : "Published";
132
+ const app = cmsPlugin.getFirebaseApp();
133
+ const db = getFirestore(app);
134
+ const dbPath = `Projects/${projectId}/Collections/${collectionId}/${modeCollection}`;
135
+ let query = db.collection(dbPath);
136
+ if (options.query) {
137
+ query = options.query(query);
138
+ }
139
+ const results = await query.count().get();
140
+ const count = results.data().count;
141
+ return count;
142
+ }
143
+ async function publishScheduledDocs(rootConfig) {
144
+ const cmsPlugin = getCmsPlugin(rootConfig);
145
+ const cmsPluginOptions = cmsPlugin.getConfig();
146
+ const projectId = cmsPluginOptions.id || "default";
147
+ const app = cmsPlugin.getFirebaseApp();
148
+ const db = getFirestore(app);
149
+ const projectCollectionsPath = `Projects/${projectId}/Collections`;
150
+ const now = Math.ceil(new Date().getTime());
151
+ const snapshot = await db.collectionGroup("Scheduled").get();
152
+ const docs = snapshot.docs.filter((d) => {
153
+ var _a;
154
+ if (!d.ref.path.startsWith(projectCollectionsPath)) {
155
+ return false;
156
+ }
157
+ const data = d.data() || {};
158
+ const scheduledAt = (_a = data.sys) == null ? void 0 : _a.scheduledAt;
159
+ return scheduledAt && scheduledAt.toMillis && scheduledAt.toMillis() <= now;
160
+ }).map((d) => {
161
+ const dbPath = d.ref.path;
162
+ const segments = dbPath.split("/");
163
+ const slug = segments.at(-1);
164
+ const collection2 = segments.at(-3);
165
+ const id = `${collection2}/${slug}`;
166
+ return {
167
+ data: d.data(),
168
+ id,
169
+ collection: collection2,
170
+ slug
171
+ };
172
+ });
173
+ if (docs.length === 0) {
174
+ console.log("no docs to schedule");
175
+ return [];
176
+ }
177
+ let batchCount = 0;
178
+ const batch = db.batch();
179
+ const publishedDocs = [];
180
+ for (const doc of docs) {
181
+ const { id, collection: collection2, slug, data } = doc;
182
+ const draftRef = db.doc(
183
+ `${projectCollectionsPath}/${collection2}/Drafts/${slug}`
184
+ );
185
+ const scheduledRef = db.doc(
186
+ `${projectCollectionsPath}/${collection2}/Scheduled/${slug}`
187
+ );
188
+ const publishedRef = db.doc(
189
+ `${projectCollectionsPath}/${collection2}/Published/${slug}`
190
+ );
191
+ const { scheduledAt, scheduledBy, ...sys } = data.sys || {};
192
+ const firstPublishedAt = sys.firstPublishedAt ?? scheduledAt;
193
+ const firstPublishedBy = sys.firstPublishedBy ?? (scheduledBy || "");
194
+ batch.set(publishedRef, {
195
+ id,
196
+ collection: collection2,
197
+ slug,
198
+ fields: data.fields || {},
199
+ sys: {
200
+ ...sys,
201
+ firstPublishedAt,
202
+ firstPublishedBy,
203
+ publishedAt: FieldValue.serverTimestamp(),
204
+ publishedBy: scheduledBy || ""
205
+ }
206
+ });
207
+ batchCount += 1;
208
+ batch.delete(scheduledRef);
209
+ batchCount += 1;
210
+ batch.update(draftRef, {
211
+ "sys.scheduledAt": FieldValue.delete(),
212
+ "sys.scheduledBy": FieldValue.delete(),
213
+ "sys.firstPublishedAt": firstPublishedAt,
214
+ "sys.firstPublishedBy": firstPublishedBy,
215
+ "sys.publishedAt": FieldValue.serverTimestamp(),
216
+ "sys.publishedBy": scheduledBy || ""
217
+ });
218
+ batchCount += 1;
219
+ publishedDocs.push(doc);
220
+ if (batchCount >= 498) {
221
+ break;
222
+ }
223
+ }
224
+ await batch.commit();
225
+ console.log(`published ${publishedDocs.length} docs!`);
226
+ return publishedDocs;
227
+ }
101
228
  function normalizeData(data) {
102
229
  const result = {};
103
230
  for (const key in data) {
@@ -128,11 +255,48 @@ function getCmsPlugin(rootConfig) {
128
255
  }
129
256
  return plugin;
130
257
  }
258
+ async function loadTranslations(rootConfig, options) {
259
+ const cmsPlugin = getCmsPlugin(rootConfig);
260
+ const cmsPluginOptions = cmsPlugin.getConfig();
261
+ const projectId = cmsPluginOptions.id || "default";
262
+ const app = cmsPlugin.getFirebaseApp();
263
+ const db = getFirestore(app);
264
+ const dbPath = `Projects/${projectId}/Translations`;
265
+ let query = db.collection(dbPath);
266
+ if (options == null ? void 0 : options.tags) {
267
+ query = query.where("tags", "array-contains-any", options.tags);
268
+ }
269
+ const querySnapshot = await query.get();
270
+ const translationsMap = {};
271
+ querySnapshot.forEach((doc) => {
272
+ const hash = doc.id;
273
+ translationsMap[hash] = doc.data();
274
+ });
275
+ return translationsMap;
276
+ }
277
+ async function loadTranslationsForLocale(rootConfig, locale, options) {
278
+ const translationsMap = await loadTranslations(rootConfig, options);
279
+ return translationsForLocale(translationsMap, locale);
280
+ }
281
+ function translationsForLocale(translationsMap, locale) {
282
+ const localeTranslations = {};
283
+ Object.values(translationsMap).forEach((string2) => {
284
+ const source = string2.source;
285
+ const translation = string2[locale] || string2.en || string2.source;
286
+ localeTranslations[source] = translation;
287
+ });
288
+ return localeTranslations;
289
+ }
131
290
  export {
132
291
  getCmsPlugin,
133
292
  getDoc,
134
- getFirebaseApp,
293
+ listDocs,
294
+ loadTranslations,
295
+ loadTranslationsForLocale,
135
296
  normalizeData,
136
- schema_exports as schema
297
+ numDocs,
298
+ publishScheduledDocs,
299
+ schema_exports as schema,
300
+ translationsForLocale
137
301
  };
138
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9zY2hlbWEudHMiLCAiLi4vY29yZS9ydW50aW1lLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge0Z1bmN0aW9uYWxDb21wb25lbnR9IGZyb20gJ3ByZWFjdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uRmllbGRQcm9wcyB7XG4gIHR5cGU6IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBoZWxwPzogc3RyaW5nO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgZGVmYXVsdD86IGFueTtcbiAgaGlkZGVuPzogYm9vbGVhbjtcbiAgZGVwcmVjYXRlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFN0cmluZ0ZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ3N0cmluZyc7XG4gIGRlZmF1bHQ/OiBzdHJpbmc7XG4gIHRyYW5zbGF0ZT86IGJvb2xlYW47XG4gIHZhcmlhbnQ/OiAnaW5wdXQnIHwgJ3RleHRhcmVhJztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmcoZmllbGQ6IE9taXQ8U3RyaW5nRmllbGQsICd0eXBlJz4pOiBTdHJpbmdGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdzdHJpbmcnfTtcbn1cblxuZXhwb3J0IHR5cGUgTnVtYmVyRmllbGQgPSBDb21tb25GaWVsZFByb3BzICYge1xuICB0eXBlOiAnbnVtYmVyJztcbiAgZGVmYXVsdD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXIoZmllbGQ6IE9taXQ8TnVtYmVyRmllbGQsICd0eXBlJz4pOiBOdW1iZXJGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdudW1iZXInfTtcbn1cblxuZXhwb3J0IHR5cGUgRGF0ZUZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ2RhdGUnO1xuICBkZWZhdWx0Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRhdGUoZmllbGQ6IE9taXQ8RGF0ZUZpZWxkLCAndHlwZSc+KTogRGF0ZUZpZWxkIHtcbiAgcmV0dXJuIHsuLi5maWVsZCwgdHlwZTogJ2RhdGUnfTtcbn1cblxuZXhwb3J0IHR5cGUgRGF0ZVRpbWVGaWVsZCA9IENvbW1vbkZpZWxkUHJvcHMgJiB7XG4gIHR5cGU6ICdkYXRldGltZSc7XG4gIGRlZmF1bHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZXRpbWUoZmllbGQ6IE9taXQ8RGF0ZVRpbWVGaWVsZCwgJ3R5cGUnPik6IERhdGVUaW1lRmllbGQge1xuICByZXR1cm4gey4uLmZpZWxkLCB0eXBlOiAnZGF0ZXRpbWUnfTtcbn1cblxuZXhwb3J0IHR5cGUgQm9vbGVhbkZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ2Jvb2xlYW4nO1xuICBkZWZhdWx0PzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBib29sZWFuKGZpZWxkOiBPbWl0PEJvb2xlYW5GaWVsZCwgJ3R5cGUnPik6IEJvb2xlYW5GaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdib29sZWFuJ307XG59XG5cbmV4cG9ydCB0eXBlIFNlbGVjdEZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ3NlbGVjdCc7XG4gIGRlZmF1bHQ/OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBBcnJheTx7dmFsdWU6IHN0cmluZzsgbGFiZWw/OiBzdHJpbmd9PiB8IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChmaWVsZDogT21pdDxTZWxlY3RGaWVsZCwgJ3R5cGUnPik6IFNlbGVjdEZpZWxkIHtcbiAgcmV0dXJuIHsuLi5maWVsZCwgdHlwZTogJ3NlbGVjdCd9O1xufVxuXG5leHBvcnQgdHlwZSBNdWx0aVNlbGVjdEZpZWxkID0gT21pdDxTZWxlY3RGaWVsZCwgJ3R5cGUnPiAmIHtcbiAgdHlwZTogJ211bHRpc2VsZWN0JztcbiAgLyoqIFNldCB0byBgdHJ1ZWAgdG8gYWxsb3cgdXNlcnMgdG8gY3JlYXRlIGFyYml0cmFyeSB2YWx1ZXMuICovXG4gIGNyZWF0YWJsZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlzZWxlY3QoXG4gIGZpZWxkOiBPbWl0PE11bHRpU2VsZWN0RmllbGQsICd0eXBlJz5cbik6IE11bHRpU2VsZWN0RmllbGQge1xuICByZXR1cm4gey4uLmZpZWxkLCB0eXBlOiAnbXVsdGlzZWxlY3QnfTtcbn1cblxuZXhwb3J0IHR5cGUgSW1hZ2VGaWVsZCA9IENvbW1vbkZpZWxkUHJvcHMgJiB7XG4gIHR5cGU6ICdpbWFnZSc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaW1hZ2UoZmllbGQ6IE9taXQ8SW1hZ2VGaWVsZCwgJ3R5cGUnPik6IEltYWdlRmllbGQge1xuICByZXR1cm4gey4uLmZpZWxkLCB0eXBlOiAnaW1hZ2UnfTtcbn1cblxuZXhwb3J0IHR5cGUgT2JqZWN0RmllbGQgPSBDb21tb25GaWVsZFByb3BzICYge1xuICB0eXBlOiAnb2JqZWN0JztcbiAgZmllbGRzOiBGaWVsZFdpdGhJZFtdO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdChmaWVsZDogT21pdDxPYmplY3RGaWVsZCwgJ3R5cGUnPik6IE9iamVjdEZpZWxkIHtcbiAgcmV0dXJuIHsuLi5maWVsZCwgdHlwZTogJ29iamVjdCd9O1xufVxuXG5leHBvcnQgdHlwZSBBcnJheUZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ2FycmF5JztcbiAgZGVmYXVsdD86IGFueVtdO1xuICAvKipcbiAgICogU3RyaW5nIGZvcm1hdCBmb3IgdGhlIHByZXZpZXcgbGluZSBvZiBhbiBpdGVtIGluIHRoZSBhcnJheS4gUGxhY2Vob2xkZXJcbiAgICogdmFsdWVzIHNob3VsZCB1c2UgYnJhY2tldHMsIGUuZy4gYG17X2luZGV4OjAyfToge190eXBlfWAuXG4gICAqXG4gICAqIE11bHRpcGxlIHZhbHVlcyBjYW4gYmUgcHJvdmlkZWQsIGluIHdoaWNoIGNhc2UgdGhlIGZpcnN0IHByZXZpZXcgbGluZSB3aXRoXG4gICAqIG5vIG1pc3NpbmcgcGxhY2Vob2xkZXIgdmFsdWVzIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogU3lzdGVtIGFkZGVkIHBsYWNlaG9sZGVyIHZhbHVlczpcbiAgICpcbiAgICogLSBfaW5kZXg6IFRoZSAwLWJhc2VkIGluZGV4LlxuICAgKiAtIF9pbmRleDowMjogQSBsZWZ0LXBhZGRlZCB2ZXJzaW9uIG9mIF9pbmRleCB0byAyIGRpZ2l0cy5cbiAgICogLSBfaW5kZXg6MDM6IEEgbGVmdC1wYWRkZWQgdmVyc2lvbiBvZiBfaW5kZXggdG8gMyBkaWdpdHMuXG4gICAqIC0gX3R5cGU6IEZvciBhcnJheSBvZiBvbmUtb2YgZmllbGRzLCB0aGUgdHlwZSBvZiB0aGUgc2VsZWN0ZWQgZmllbGQuXG4gICAqL1xuICBwcmV2aWV3Pzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8vIE5PVEUoc3RldmVubGUpOiB0aGUgYXJyYXkgZmllbGQgc2hvdWxkIG9ubHkgYWNjZXB0IG9iamVjdCB2YWx1ZXMgdG8ga2VlcFxuICAvLyB0aGUgc2NoZW1hcyBmdXR1cmUtZnJpZW5kbHkuIEZvciBleGFtcGxlLCBpZiB3ZSB3ZXJlIHRvIGFjY2VwdCBwcmltYXRpdmVzXG4gIC8vIChlLmcuIEFycmF5PHN0cmluZz4pIGFuZCB0aGUgZGV2ZWxvcGVyIGRlY2lkZXMgaW4gdGhlIGZ1dHVyZSB0aGF0IHRoZXlcbiAgLy8gbmVlZCB0byBhZGQgZXh0cmEgZmllbGRzIHRvIHRoYXQgYXJyYXkgdHlwZSwgdGhleSB3b3VsZCBoYXZlIHRvIGNyZWF0ZSBhXG4gIC8vIG5ldyBmaWVsZCwgY3JlYXRlIGEgbmV3IHNjaGVtYSBmaWVsZCwgYW5kIHRoZW4gcGVyZm9ybSBhIGRiIG1pZ3JhdGlvbiB0b1xuICAvLyB1cGRhdGUgZnJvbSB0aGUgb2xkIGZpZWxkIHR5cGUgdG8gdGhlIG5ldyBmaWVsZCB0eXBlLiBCdXQgaWYgd2UgZW5mb3JjZVxuICAvLyBvYmplY3RzIGhlcmUsIGEgZGV2ZWxvcGVyIHNob3VsZCB0ZWNobmljYWxseSBiZSBhYmxlIHRvIGFkZCBmaWVsZHMgdG8gdGhlXG4gIC8vIG5lc3RlZCBmaWVsZCBkZWZpbml0aW9uIHdpdGhvdXQgYnJlYWtpbmcgYW55IGV4aXN0aW5nIGRiIGVudHJpZXMuXG4gIG9mOiBPYmplY3RMaWtlRmllbGQ7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXkoZmllbGQ6IE9taXQ8QXJyYXlGaWVsZCwgJ3R5cGUnPik6IEFycmF5RmllbGQge1xuICByZXR1cm4gey4uLmZpZWxkLCB0eXBlOiAnYXJyYXknfTtcbn1cblxuZXhwb3J0IHR5cGUgT25lT2ZGaWVsZCA9IENvbW1vbkZpZWxkUHJvcHMgJiB7XG4gIHR5cGU6ICdvbmVvZic7XG4gIHR5cGVzOiBTY2hlbWFbXTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvbmVPZihmaWVsZDogT21pdDxPbmVPZkZpZWxkLCAndHlwZSc+KTogT25lT2ZGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdvbmVvZid9O1xufVxuXG5leHBvcnQgdHlwZSBGaWVsZCA9XG4gIHwgU3RyaW5nRmllbGRcbiAgfCBOdW1iZXJGaWVsZFxuICB8IERhdGVGaWVsZFxuICB8IERhdGVUaW1lRmllbGRcbiAgfCBCb29sZWFuRmllbGRcbiAgfCBTZWxlY3RGaWVsZFxuICB8IE11bHRpU2VsZWN0RmllbGRcbiAgfCBJbWFnZUZpZWxkXG4gIHwgT2JqZWN0RmllbGRcbiAgfCBBcnJheUZpZWxkXG4gIHwgT25lT2ZGaWVsZDtcblxuLyoqXG4gKiBTaW1pbGFyIHRvIHtAbGluayBGaWVsZH0gYnV0IHdpdGggYSByZXF1aXJlZCBgaWRgLlxuICogVE9ETyhzdGV2ZW5sZSk6IGZpeCB0aGlzLlxuICovXG5leHBvcnQgdHlwZSBGaWVsZFdpdGhJZCA9IEZpZWxkO1xuXG5leHBvcnQgdHlwZSBPYmplY3RMaWtlRmllbGQgPSBJbWFnZUZpZWxkIHwgT2JqZWN0RmllbGQgfCBPbmVPZkZpZWxkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGZpZWxkczogRmllbGRXaXRoSWRbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVNjaGVtYShzY2hlbWE6IFNjaGVtYSk6IFNjaGVtYSB7XG4gIHJldHVybiBzY2hlbWE7XG59XG5cbi8qKiBEZWZpbmVzIHRoZSBzY2hlbWEgZm9yIGEgY29sbGVjdGlvbiBvciByZXVzYWJsZSBjb21wb25lbnQuICovXG5leHBvcnQgY29uc3QgZGVmaW5lID0gZGVmaW5lU2NoZW1hO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uID0gU2NoZW1hICYge1xuICAvKiogVVJMIHBhdGggd2hlcmUgdGhlIGNvbGxlY3Rpb24gc2VydmVzIGZyb20uICovXG4gIHVybD86IHN0cmluZztcbiAgLyoqXG4gICAqIFVSTCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlbmRlciBhIHByZXZpZXcgcGFnZS4gVXNlZCBieSB0aGUgc2lkZS1ieS1zaWRlXG4gICAqIGVkaXRvciB0byByZW5kZXIgaW5zdGFudCBwcmV2aWV3cy4gSWYgYmxhbmssIGRlZmF1bHRzIHRvIHRoZSBgdXJsYCBjb25maWcuXG4gICAqL1xuICBwcmV2aWV3VXJsPzogc3RyaW5nO1xuICAvKiogUGFnZSBjb21wb25lbnQgdG8gcmVuZGVyIHRoZSBjb2xsZWN0aW9uIGZvciBpbnN0YW50IHByZXZpZXdzICovXG4gIENvbXBvbmVudD86IEZ1bmN0aW9uYWxDb21wb25lbnQ7XG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBmaWVsZHMgdG8gdXNlIGZvciBkb2N1bWVudCBwcmV2aWV3LiBEZWZhdWx0cyB0byBcInRpdGxlXCIgYW5kXG4gICAqIFwiaW1hZ2VcIi4gVXNlIGRvdCBub3RhdGlvbiBmb3IgbmVzdGVkIGZpZWxkcywgZS5nLiBcIm1ldGEudGl0bGVcIi5cbiAgICovXG4gIHByZXZpZXc/OiB7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgaW1hZ2U/OiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29sbGVjdGlvbihjb2xsZWN0aW9uOiBDb2xsZWN0aW9uKTogQ29sbGVjdGlvbiB7XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5leHBvcnQgY29uc3QgY29sbGVjdGlvbiA9IGRlZmluZUNvbGxlY3Rpb247XG4iLCAiaW1wb3J0IHtQbHVnaW4sIFJvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge2luaXRpYWxpemVBcHAsIGdldEFwcHMsIGFwcGxpY2F0aW9uRGVmYXVsdH0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vYXBwJztcbmltcG9ydCB7Z2V0RmlyZXN0b3JlfSBmcm9tICdmaXJlYmFzZS1hZG1pbi9maXJlc3RvcmUnO1xuaW1wb3J0IHtDTVNQbHVnaW59IGZyb20gJy4vcGx1Z2luLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcmViYXNlQXBwKGdjcFByb2plY3RJZDogc3RyaW5nKSB7XG4gIGNvbnN0IGFwcHMgPSBnZXRBcHBzKCk7XG4gIGlmIChhcHBzLmxlbmd0aCA+IDAgJiYgYXBwc1swXSkge1xuICAgIHJldHVybiBhcHBzWzBdO1xuICB9XG4gIHJldHVybiBpbml0aWFsaXplQXBwKHtcbiAgICBwcm9qZWN0SWQ6IGdjcFByb2plY3RJZCxcbiAgICBjcmVkZW50aWFsOiBhcHBsaWNhdGlvbkRlZmF1bHQoKSxcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgZG9jIGZyb20gUm9vdC5qcyBDTVMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREb2M8VD4oXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICBzbHVnOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHttb2RlOiAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCd9XG4pOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IGdjcFByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuZmlyZWJhc2VDb25maWcucHJvamVjdElkO1xuICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICBjb25zdCBhcHAgPSBnZXRGaXJlYmFzZUFwcChnY3BQcm9qZWN0SWQpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuICAvLyBTbHVncyB3aXRoIHNsYXNoZXMgYXJlIGVuY29kZWQgYXMgYC0tYCBpbiB0aGUgREIuXG4gIHNsdWcgPSBzbHVnLnJlcGxhY2VBbGwoJy8nLCAnLS0nKTtcbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gIGNvbnN0IGRvY1JlZiA9IGRiLmRvYyhkYlBhdGgpO1xuICBjb25zdCBkb2MgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gIGlmIChkb2MuZXhpc3RzKSB7XG4gICAgY29uc3QgZGF0YSA9IGRvYy5kYXRhKCk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZURhdGEoZGF0YSkgYXMgVDtcbiAgfVxuICBjb25zb2xlLmxvZyhgZG9jIG5vdCBmb3VuZDogJHtkYlBhdGh9YCk7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFdhbGtzIHRoZSBkYXRhIHRyZWUgYW5kIGNvbnZlcnRzIGFueSBUaW1lc3RhbXAgb2JqZWN0cyB0byBtaWxsaXMgYW5kIGFueVxuICogX2FycmF5IG1hcHMgdG8gbm9ybWFsIGFycmF5cy5cbiAqXG4gKiBFLmcuOlxuICpcbiAqIG5vcm1hbGl6ZURhdGEoe1xuICogICBzeXM6IHttb2RpZmllZEF0OiBUaW1lc3RhbXAoMTIzKX0sXG4gKiAgIGZpZWxkczoge1xuICogICAgIF9hcnJheTogWydhc2RmJ10sXG4gKiAgICAgYXNkZjoge3RpdGxlOiAnaGVsbG8nfVxuICogICB9XG4gKiB9KVxuICogLy8gPT4ge3N5czoge21vZGlmaWVkQXQ6IDEyM30sIGZpZWxkczoge2ZvbzogW3t0aXRsZTogJ2hlbGxvJ31dfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEoZGF0YTogYW55KTogYW55IHtcbiAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgIGNvbnN0IHZhbCA9IGRhdGFba2V5XTtcbiAgICBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgICAgaWYgKHZhbC50b01pbGxpcykge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbC50b01pbGxpcygpO1xuICAgICAgfSBlbHNlIGlmIChPYmplY3QuaGFzT3duKHZhbCwgJ19hcnJheScpICYmIEFycmF5LmlzQXJyYXkodmFsLl9hcnJheSkpIHtcbiAgICAgICAgY29uc3QgYXJyID0gdmFsLl9hcnJheS5tYXAoKGs6IHN0cmluZykgPT4gbm9ybWFsaXplRGF0YSh2YWxba10gfHwge30pKTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBhcnI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IG5vcm1hbGl6ZURhdGEodmFsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEgIT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZzogUm9vdENvbmZpZyk6IENNU1BsdWdpbiB7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gcm9vdENvbmZpZy5wbHVnaW5zIHx8IFtdO1xuICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zLmZpbmQoKHBsdWdpbikgPT4gcGx1Z2luLm5hbWUgPT09ICdyb290LWNtcycpO1xuICBpZiAoIXBsdWdpbikge1xuICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgcm9vdC1jbXMgcGx1Z2luIGNvbmZpZyBpbiByb290LmNvbmZpZy50cycpO1xuICB9XG4gIHJldHVybiBwbHVnaW4gYXMgQ01TUGx1Z2luO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW9CTyxTQUFTLE9BQU8sT0FBK0M7QUFDcEUsU0FBTyxFQUFDLEdBQUcsT0FBTyxNQUFNLFNBQVE7QUFDbEM7QUFPTyxTQUFTLE9BQU8sT0FBK0M7QUFDcEUsU0FBTyxFQUFDLEdBQUcsT0FBTyxNQUFNLFNBQVE7QUFDbEM7QUFPTyxTQUFTLEtBQUssT0FBMkM7QUFDOUQsU0FBTyxFQUFDLEdBQUcsT0FBTyxNQUFNLE9BQU07QUFDaEM7QUFPTyxTQUFTLFNBQVMsT0FBbUQ7QUFDMUUsU0FBTyxFQUFDLEdBQUcsT0FBTyxNQUFNLFdBQVU7QUFDcEM7QUFPTyxTQUFTLFFBQVEsT0FBaUQ7QUFDdkUsU0FBTyxFQUFDLEdBQUcsT0FBTyxNQUFNLFVBQVM7QUFDbkM7QUFRTyxTQUFTLE9BQU8sT0FBK0M7QUFDcEUsU0FBTyxFQUFDLEdBQUcsT0FBTyxNQUFNLFNBQVE7QUFD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
302
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9zY2hlbWEudHMiLCAiLi4vY29yZS9ydW50aW1lLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge0Z1bmN0aW9uYWxDb21wb25lbnR9IGZyb20gJ3ByZWFjdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uRmllbGRQcm9wcyB7XG4gIHR5cGU6IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBoZWxwPzogc3RyaW5nO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgZGVmYXVsdD86IGFueTtcbiAgaGlkZGVuPzogYm9vbGVhbjtcbiAgZGVwcmVjYXRlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFN0cmluZ0ZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ3N0cmluZyc7XG4gIGRlZmF1bHQ/OiBzdHJpbmc7XG4gIHRyYW5zbGF0ZT86IGJvb2xlYW47XG4gIHZhcmlhbnQ/OiAnaW5wdXQnIHwgJ3RleHRhcmVhJztcbiAgLyoqIEZvciB0ZXh0YXJlYSB2YXJpYW50LCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyBvZiB0ZXh0IHRvIHNob3cuICovXG4gIG1heFJvd3M/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nKGZpZWxkOiBPbWl0PFN0cmluZ0ZpZWxkLCAndHlwZSc+KTogU3RyaW5nRmllbGQge1xuICByZXR1cm4gey4uLmZpZWxkLCB0eXBlOiAnc3RyaW5nJ307XG59XG5cbmV4cG9ydCB0eXBlIE51bWJlckZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ251bWJlcic7XG4gIGRlZmF1bHQ/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyKGZpZWxkOiBPbWl0PE51bWJlckZpZWxkLCAndHlwZSc+KTogTnVtYmVyRmllbGQge1xuICByZXR1cm4gey4uLmZpZWxkLCB0eXBlOiAnbnVtYmVyJ307XG59XG5cbmV4cG9ydCB0eXBlIERhdGVGaWVsZCA9IENvbW1vbkZpZWxkUHJvcHMgJiB7XG4gIHR5cGU6ICdkYXRlJztcbiAgZGVmYXVsdD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlKGZpZWxkOiBPbWl0PERhdGVGaWVsZCwgJ3R5cGUnPik6IERhdGVGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdkYXRlJ307XG59XG5cbmV4cG9ydCB0eXBlIERhdGVUaW1lRmllbGQgPSBDb21tb25GaWVsZFByb3BzICYge1xuICB0eXBlOiAnZGF0ZXRpbWUnO1xuICBkZWZhdWx0Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRhdGV0aW1lKGZpZWxkOiBPbWl0PERhdGVUaW1lRmllbGQsICd0eXBlJz4pOiBEYXRlVGltZUZpZWxkIHtcbiAgcmV0dXJuIHsuLi5maWVsZCwgdHlwZTogJ2RhdGV0aW1lJ307XG59XG5cbmV4cG9ydCB0eXBlIEJvb2xlYW5GaWVsZCA9IENvbW1vbkZpZWxkUHJvcHMgJiB7XG4gIHR5cGU6ICdib29sZWFuJztcbiAgZGVmYXVsdD86IGJvb2xlYW47XG4gIGNoZWNrYm94TGFiZWw/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gYm9vbGVhbihmaWVsZDogT21pdDxCb29sZWFuRmllbGQsICd0eXBlJz4pOiBCb29sZWFuRmllbGQge1xuICByZXR1cm4gey4uLmZpZWxkLCB0eXBlOiAnYm9vbGVhbid9O1xufVxuXG5leHBvcnQgdHlwZSBTZWxlY3RGaWVsZCA9IENvbW1vbkZpZWxkUHJvcHMgJiB7XG4gIHR5cGU6ICdzZWxlY3QnO1xuICBkZWZhdWx0Pzogc3RyaW5nO1xuICBvcHRpb25zPzogQXJyYXk8e3ZhbHVlOiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nfT4gfCBzdHJpbmdbXTtcbiAgdHJhbnNsYXRlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3QoZmllbGQ6IE9taXQ8U2VsZWN0RmllbGQsICd0eXBlJz4pOiBTZWxlY3RGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdzZWxlY3QnfTtcbn1cblxuZXhwb3J0IHR5cGUgTXVsdGlTZWxlY3RGaWVsZCA9IE9taXQ8U2VsZWN0RmllbGQsICd0eXBlJz4gJiB7XG4gIHR5cGU6ICdtdWx0aXNlbGVjdCc7XG4gIC8qKiBTZXQgdG8gYHRydWVgIHRvIGFsbG93IHVzZXJzIHRvIGNyZWF0ZSBhcmJpdHJhcnkgdmFsdWVzLiAqL1xuICBjcmVhdGFibGU/OiBib29sZWFuO1xuICB0cmFuc2xhdGU/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpc2VsZWN0KFxuICBmaWVsZDogT21pdDxNdWx0aVNlbGVjdEZpZWxkLCAndHlwZSc+XG4pOiBNdWx0aVNlbGVjdEZpZWxkIHtcbiAgcmV0dXJuIHsuLi5maWVsZCwgdHlwZTogJ211bHRpc2VsZWN0J307XG59XG5cbmV4cG9ydCB0eXBlIEltYWdlRmllbGQgPSBDb21tb25GaWVsZFByb3BzICYge1xuICB0eXBlOiAnaW1hZ2UnO1xuICB0cmFuc2xhdGU/OiBib29sZWFuO1xuICAvKiogTGlzdCBvZiBzdXBwb3J0ZWQgZXh0cywgZS5nLiBgWycubXA0J11gLiAqL1xuICBleHRzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaW1hZ2UoZmllbGQ6IE9taXQ8SW1hZ2VGaWVsZCwgJ3R5cGUnPik6IEltYWdlRmllbGQge1xuICByZXR1cm4gey4uLmZpZWxkLCB0eXBlOiAnaW1hZ2UnfTtcbn1cblxuZXhwb3J0IHR5cGUgRmlsZUZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ2ZpbGUnO1xuICAvKiogTGlzdCBvZiBzdXBwb3J0ZWQgZXh0cywgZS5nLiBgWycubXA0J11gLiAqL1xuICBleHRzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZmlsZShmaWVsZDogT21pdDxGaWxlRmllbGQsICd0eXBlJz4pOiBGaWxlRmllbGQge1xuICByZXR1cm4gey4uLmZpZWxkLCB0eXBlOiAnZmlsZSd9O1xufVxuXG5leHBvcnQgdHlwZSBPYmplY3RGaWVsZCA9IENvbW1vbkZpZWxkUHJvcHMgJiB7XG4gIHR5cGU6ICdvYmplY3QnO1xuICBmaWVsZHM6IEZpZWxkV2l0aElkW107XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0KGZpZWxkOiBPbWl0PE9iamVjdEZpZWxkLCAndHlwZSc+KTogT2JqZWN0RmllbGQge1xuICByZXR1cm4gey4uLmZpZWxkLCB0eXBlOiAnb2JqZWN0J307XG59XG5cbmV4cG9ydCB0eXBlIEFycmF5RmllbGQgPSBDb21tb25GaWVsZFByb3BzICYge1xuICB0eXBlOiAnYXJyYXknO1xuICBkZWZhdWx0PzogYW55W107XG4gIC8qKlxuICAgKiBTdHJpbmcgZm9ybWF0IGZvciB0aGUgcHJldmlldyBsaW5lIG9mIGFuIGl0ZW0gaW4gdGhlIGFycmF5LiBQbGFjZWhvbGRlclxuICAgKiB2YWx1ZXMgc2hvdWxkIHVzZSBicmFja2V0cywgZS5nLiBgbXtfaW5kZXg6MDJ9OiB7X3R5cGV9YC5cbiAgICpcbiAgICogTXVsdGlwbGUgdmFsdWVzIGNhbiBiZSBwcm92aWRlZCwgaW4gd2hpY2ggY2FzZSB0aGUgZmlyc3QgcHJldmlldyBsaW5lIHdpdGhcbiAgICogbm8gbWlzc2luZyBwbGFjZWhvbGRlciB2YWx1ZXMgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBTeXN0ZW0gYWRkZWQgcGxhY2Vob2xkZXIgdmFsdWVzOlxuICAgKlxuICAgKiAtIF9pbmRleDogVGhlIDAtYmFzZWQgaW5kZXguXG4gICAqIC0gX2luZGV4OjAyOiBBIGxlZnQtcGFkZGVkIHZlcnNpb24gb2YgX2luZGV4IHRvIDIgZGlnaXRzLlxuICAgKiAtIF9pbmRleDowMzogQSBsZWZ0LXBhZGRlZCB2ZXJzaW9uIG9mIF9pbmRleCB0byAzIGRpZ2l0cy5cbiAgICogLSBfdHlwZTogRm9yIGFycmF5IG9mIG9uZS1vZiBmaWVsZHMsIHRoZSB0eXBlIG9mIHRoZSBzZWxlY3RlZCBmaWVsZC5cbiAgICovXG4gIHByZXZpZXc/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLy8gTk9URShzdGV2ZW5sZSk6IHRoZSBhcnJheSBmaWVsZCBzaG91bGQgb25seSBhY2NlcHQgb2JqZWN0IHZhbHVlcyB0byBrZWVwXG4gIC8vIHRoZSBzY2hlbWFzIGZ1dHVyZS1mcmllbmRseS4gRm9yIGV4YW1wbGUsIGlmIHdlIHdlcmUgdG8gYWNjZXB0IHByaW1hdGl2ZXNcbiAgLy8gKGUuZy4gQXJyYXk8c3RyaW5nPikgYW5kIHRoZSBkZXZlbG9wZXIgZGVjaWRlcyBpbiB0aGUgZnV0dXJlIHRoYXQgdGhleVxuICAvLyBuZWVkIHRvIGFkZCBleHRyYSBmaWVsZHMgdG8gdGhhdCBhcnJheSB0eXBlLCB0aGV5IHdvdWxkIGhhdmUgdG8gY3JlYXRlIGFcbiAgLy8gbmV3IGZpZWxkLCBjcmVhdGUgYSBuZXcgc2NoZW1hIGZpZWxkLCBhbmQgdGhlbiBwZXJmb3JtIGEgZGIgbWlncmF0aW9uIHRvXG4gIC8vIHVwZGF0ZSBmcm9tIHRoZSBvbGQgZmllbGQgdHlwZSB0byB0aGUgbmV3IGZpZWxkIHR5cGUuIEJ1dCBpZiB3ZSBlbmZvcmNlXG4gIC8vIG9iamVjdHMgaGVyZSwgYSBkZXZlbG9wZXIgc2hvdWxkIHRlY2huaWNhbGx5IGJlIGFibGUgdG8gYWRkIGZpZWxkcyB0byB0aGVcbiAgLy8gbmVzdGVkIGZpZWxkIGRlZmluaXRpb24gd2l0aG91dCBicmVha2luZyBhbnkgZXhpc3RpbmcgZGIgZW50cmllcy5cbiAgb2Y6IE9iamVjdExpa2VGaWVsZDtcbiAgLyoqXG4gICAqIExhYmVsIHRvIHVzZSBmb3IgdGhlIFwiYWRkIGl0ZW1cIiBidXR0b24uIERlZmF1bHRzIHRvIGBBZGRgLlxuICAgKi9cbiAgYnV0dG9uTGFiZWw/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXkoZmllbGQ6IE9taXQ8QXJyYXlGaWVsZCwgJ3R5cGUnPik6IEFycmF5RmllbGQge1xuICByZXR1cm4gey4uLmZpZWxkLCB0eXBlOiAnYXJyYXknfTtcbn1cblxuZXhwb3J0IHR5cGUgT25lT2ZGaWVsZCA9IENvbW1vbkZpZWxkUHJvcHMgJiB7XG4gIHR5cGU6ICdvbmVvZic7XG4gIHR5cGVzOiBTY2hlbWFbXTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvbmVPZihmaWVsZDogT21pdDxPbmVPZkZpZWxkLCAndHlwZSc+KTogT25lT2ZGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdvbmVvZid9O1xufVxuXG5leHBvcnQgdHlwZSBGaWVsZCA9XG4gIHwgU3RyaW5nRmllbGRcbiAgfCBOdW1iZXJGaWVsZFxuICB8IERhdGVGaWVsZFxuICB8IERhdGVUaW1lRmllbGRcbiAgfCBCb29sZWFuRmllbGRcbiAgfCBTZWxlY3RGaWVsZFxuICB8IE11bHRpU2VsZWN0RmllbGRcbiAgfCBJbWFnZUZpZWxkXG4gIHwgRmlsZUZpZWxkXG4gIHwgT2JqZWN0RmllbGRcbiAgfCBBcnJheUZpZWxkXG4gIHwgT25lT2ZGaWVsZDtcblxuLyoqXG4gKiBTaW1pbGFyIHRvIHtAbGluayBGaWVsZH0gYnV0IHdpdGggYSByZXF1aXJlZCBgaWRgLlxuICogVE9ETyhzdGV2ZW5sZSk6IGZpeCB0aGlzLlxuICovXG5leHBvcnQgdHlwZSBGaWVsZFdpdGhJZCA9IEZpZWxkO1xuXG5leHBvcnQgdHlwZSBPYmplY3RMaWtlRmllbGQgPSBJbWFnZUZpZWxkIHwgRmlsZUZpZWxkIHwgT2JqZWN0RmllbGQgfCBPbmVPZkZpZWxkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGZpZWxkczogRmllbGRXaXRoSWRbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVNjaGVtYShzY2hlbWE6IFNjaGVtYSk6IFNjaGVtYSB7XG4gIHJldHVybiBzY2hlbWE7XG59XG5cbi8qKiBEZWZpbmVzIHRoZSBzY2hlbWEgZm9yIGEgY29sbGVjdGlvbiBvciByZXVzYWJsZSBjb21wb25lbnQuICovXG5leHBvcnQgY29uc3QgZGVmaW5lID0gZGVmaW5lU2NoZW1hO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uID0gU2NoZW1hICYge1xuICAvKiogVVJMIHBhdGggd2hlcmUgdGhlIGNvbGxlY3Rpb24gc2VydmVzIGZyb20uICovXG4gIHVybD86IHN0cmluZztcbiAgLyoqXG4gICAqIFVSTCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlbmRlciBhIHByZXZpZXcgcGFnZS4gVXNlZCBieSB0aGUgc2lkZS1ieS1zaWRlXG4gICAqIGVkaXRvciB0byByZW5kZXIgaW5zdGFudCBwcmV2aWV3cy4gSWYgYmxhbmssIGRlZmF1bHRzIHRvIHRoZSBgdXJsYCBjb25maWcuXG4gICAqL1xuICBwcmV2aWV3VXJsPzogc3RyaW5nO1xuICAvKiogUGFnZSBjb21wb25lbnQgdG8gcmVuZGVyIHRoZSBjb2xsZWN0aW9uIGZvciBpbnN0YW50IHByZXZpZXdzICovXG4gIENvbXBvbmVudD86IEZ1bmN0aW9uYWxDb21wb25lbnQ7XG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBmaWVsZHMgdG8gdXNlIGZvciBkb2N1bWVudCBwcmV2aWV3LiBEZWZhdWx0cyB0byBcInRpdGxlXCIgYW5kXG4gICAqIFwiaW1hZ2VcIi4gVXNlIGRvdCBub3RhdGlvbiBmb3IgbmVzdGVkIGZpZWxkcywgZS5nLiBcIm1ldGEudGl0bGVcIi5cbiAgICovXG4gIHByZXZpZXc/OiB7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgaW1hZ2U/OiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29sbGVjdGlvbihjb2xsZWN0aW9uOiBDb2xsZWN0aW9uKTogQ29sbGVjdGlvbiB7XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5leHBvcnQgY29uc3QgY29sbGVjdGlvbiA9IGRlZmluZUNvbGxlY3Rpb247XG4iLCAiaW1wb3J0IHtQbHVnaW4sIFJvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge1xuICBGaWVsZFZhbHVlLFxuICBRdWVyeSxcbiAgVGltZXN0YW1wLFxuICBnZXRGaXJlc3RvcmUsXG59IGZyb20gJ2ZpcmViYXNlLWFkbWluL2ZpcmVzdG9yZSc7XG5cbmltcG9ydCB7Q01TUGx1Z2lufSBmcm9tICcuL3BsdWdpbi5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RG9jT3B0aW9ucyB7XG4gIG1vZGU6ICdkcmFmdCcgfCAncHVibGlzaGVkJztcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBkb2MgZnJvbSBSb290LmpzIENNUy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERvYzxUPihcbiAgcm9vdENvbmZpZzogUm9vdENvbmZpZyxcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gIHNsdWc6IHN0cmluZyxcbiAgb3B0aW9uczogR2V0RG9jT3B0aW9uc1xuKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICBjb25zdCBhcHAgPSBjbXNQbHVnaW4uZ2V0RmlyZWJhc2VBcHAoKTtcbiAgY29uc3QgZGIgPSBnZXRGaXJlc3RvcmUoYXBwKTtcbiAgLy8gU2x1Z3Mgd2l0aCBzbGFzaGVzIGFyZSBlbmNvZGVkIGFzIGAtLWAgaW4gdGhlIERCLlxuICBzbHVnID0gc2x1Zy5yZXBsYWNlQWxsKCcvJywgJy0tJyk7XG4gIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3Byb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259LyR7c2x1Z31gO1xuICBjb25zdCBkb2NSZWYgPSBkYi5kb2MoZGJQYXRoKTtcbiAgY29uc3QgZG9jID0gYXdhaXQgZG9jUmVmLmdldCgpO1xuICBpZiAoZG9jLmV4aXN0cykge1xuICAgIGNvbnN0IGRhdGEgPSBkb2MuZGF0YSgpO1xuICAgIHJldHVybiBub3JtYWxpemVEYXRhKGRhdGEpIGFzIFQ7XG4gIH1cbiAgY29uc29sZS5sb2coYGRvYyBub3QgZm91bmQ6ICR7ZGJQYXRofWApO1xuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0RG9jc09wdGlvbnMge1xuICBtb2RlOiAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG4gIG9mZnNldD86IG51bWJlcjtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIG9yZGVyQnk/OiBzdHJpbmc7XG4gIG9yZGVyQnlEaXJlY3Rpb24/OiAnYXNjJyB8ICdkZXNjJztcbiAgcXVlcnk/OiAocXVlcnk6IFF1ZXJ5KSA9PiBRdWVyeTtcbn1cblxuLyoqXG4gKiBMaXN0cyBkb2NzIGZyb20gYSBSb290LmpzIENNUyBjb2xsZWN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdERvY3M8VD4oXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICBvcHRpb25zOiBMaXN0RG9jc09wdGlvbnNcbik6IFByb21pc2U8e2RvY3M6IFRbXX0+IHtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBwcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgY29uc3QgYXBwID0gY21zUGx1Z2luLmdldEZpcmViYXNlQXBwKCk7XG4gIGNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGFwcCk7XG4gIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3Byb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259YDtcbiAgbGV0IHF1ZXJ5OiBRdWVyeSA9IGRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgaWYgKG9wdGlvbnMubGltaXQpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5LmxpbWl0KG9wdGlvbnMubGltaXQpO1xuICB9XG4gIGlmIChvcHRpb25zLm9mZnNldCkge1xuICAgIHF1ZXJ5ID0gcXVlcnkub2Zmc2V0KG9wdGlvbnMub2Zmc2V0KTtcbiAgfVxuICBpZiAob3B0aW9ucy5vcmRlckJ5KSB7XG4gICAgcXVlcnkgPSBxdWVyeS5vcmRlckJ5KG9wdGlvbnMub3JkZXJCeSwgb3B0aW9ucy5vcmRlckJ5RGlyZWN0aW9uKTtcbiAgfVxuICBpZiAob3B0aW9ucy5xdWVyeSkge1xuICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShxdWVyeSk7XG4gIH1cbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuICBjb25zdCBkb2NzOiBUW10gPSBbXTtcbiAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcbiAgICBjb25zdCBkb2MgPSBub3JtYWxpemVEYXRhKHJlc3VsdC5kYXRhKCkpIGFzIFQ7XG4gICAgZG9jcy5wdXNoKGRvYyk7XG4gIH0pO1xuICByZXR1cm4ge2RvY3N9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE51bURvY3NPcHRpb25zIHtcbiAgbW9kZTogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuICBxdWVyeT86IChxdWVyeTogUXVlcnkpID0+IFF1ZXJ5O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkb2NzIGluIGEgUm9vdC5qcyBDTVMgY29sbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG51bURvY3MoXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICBvcHRpb25zOiBOdW1Eb2NzT3B0aW9uc1xuKSB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gIGNvbnN0IGFwcCA9IGNtc1BsdWdpbi5nZXRGaXJlYmFzZUFwcCgpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufWA7XG4gIGxldCBxdWVyeTogUXVlcnkgPSBkYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KTtcbiAgfVxuICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuY291bnQoKS5nZXQoKTtcbiAgY29uc3QgY291bnQgPSByZXN1bHRzLmRhdGEoKS5jb3VudDtcbiAgcmV0dXJuIGNvdW50O1xufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBzY2hlZHVsZWQgZG9jcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hTY2hlZHVsZWREb2NzKHJvb3RDb25maWc6IFJvb3RDb25maWcpIHtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBwcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgY29uc3QgYXBwID0gY21zUGx1Z2luLmdldEZpcmViYXNlQXBwKCk7XG4gIGNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGFwcCk7XG5cbiAgY29uc3QgcHJvamVjdENvbGxlY3Rpb25zUGF0aCA9IGBQcm9qZWN0cy8ke3Byb2plY3RJZH0vQ29sbGVjdGlvbnNgO1xuICBjb25zdCBub3cgPSBNYXRoLmNlaWwobmV3IERhdGUoKS5nZXRUaW1lKCkpO1xuXG4gIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZGIuY29sbGVjdGlvbkdyb3VwKCdTY2hlZHVsZWQnKS5nZXQoKTtcbiAgY29uc3QgZG9jcyA9IHNuYXBzaG90LmRvY3NcbiAgICAuZmlsdGVyKChkKSA9PiB7XG4gICAgICAvLyBGaWx0ZXIgZG9jcyBieSBwcm9qZWN0LlxuICAgICAgaWYgKCFkLnJlZi5wYXRoLnN0YXJ0c1dpdGgocHJvamVjdENvbGxlY3Rpb25zUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gRmlsdGVyIGRvY3Mgd2hlcmUgc2NoZWR1bGVkQXQgaXMgaW4gdGhlIHBhc3QuXG4gICAgICAvLyBOT1RFKHN0ZXZlbmxlKTogdGhlIGZpbHRlcmluZyBpcyBkb25lIG1hbnVhbGx5IGluc3RlYWQgb2YgdXNpbmcgYSBxdWVyeVxuICAgICAgLy8gdG8gYXZvaWQgaGF2aW5nIHRvIGNyZWF0ZSBhbiBpbmRleCBpbiBmaXJlc3RvcmUuXG4gICAgICBjb25zdCBkYXRhID0gZC5kYXRhKCkgfHwge307XG4gICAgICBjb25zdCBzY2hlZHVsZWRBdDogVGltZXN0YW1wIHwgdW5kZWZpbmVkID0gZGF0YS5zeXM/LnNjaGVkdWxlZEF0O1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgc2NoZWR1bGVkQXQgJiYgc2NoZWR1bGVkQXQudG9NaWxsaXMgJiYgc2NoZWR1bGVkQXQudG9NaWxsaXMoKSA8PSBub3dcbiAgICAgICk7XG4gICAgfSlcbiAgICAubWFwKChkKSA9PiB7XG4gICAgICBjb25zdCBkYlBhdGggPSBkLnJlZi5wYXRoO1xuICAgICAgY29uc3Qgc2VnbWVudHMgPSBkYlBhdGguc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IHNsdWcgPSBzZWdtZW50cy5hdCgtMSk7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uID0gc2VnbWVudHMuYXQoLTMpO1xuICAgICAgY29uc3QgaWQgPSBgJHtjb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IGQuZGF0YSgpLFxuICAgICAgICBpZCxcbiAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgc2x1ZyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgaWYgKGRvY3MubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5sb2coJ25vIGRvY3MgdG8gc2NoZWR1bGUnKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvLyBFYWNoIHRyYW5zYWN0aW9uIG9yIGJhdGNoIGNhbiB3cml0ZSBhIG1heCBvZiA1MDAgb3BzLlxuICAvLyBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9maXJlc3RvcmUvbWFuYWdlLWRhdGEvdHJhbnNhY3Rpb25zXG4gIGxldCBiYXRjaENvdW50ID0gMDtcbiAgY29uc3QgYmF0Y2ggPSBkYi5iYXRjaCgpO1xuICBjb25zdCBwdWJsaXNoZWREb2NzOiBhbnlbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRvYyBvZiBkb2NzKSB7XG4gICAgY29uc3Qge2lkLCBjb2xsZWN0aW9uLCBzbHVnLCBkYXRhfSA9IGRvYztcbiAgICBjb25zdCBkcmFmdFJlZiA9IGRiLmRvYyhcbiAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vRHJhZnRzLyR7c2x1Z31gXG4gICAgKTtcbiAgICBjb25zdCBzY2hlZHVsZWRSZWYgPSBkYi5kb2MoXG4gICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1NjaGVkdWxlZC8ke3NsdWd9YFxuICAgICk7XG4gICAgY29uc3QgcHVibGlzaGVkUmVmID0gZGIuZG9jKFxuICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9QdWJsaXNoZWQvJHtzbHVnfWBcbiAgICApO1xuICAgIGNvbnN0IHtzY2hlZHVsZWRBdCwgc2NoZWR1bGVkQnksIC4uLnN5c30gPSBkYXRhLnN5cyB8fCB7fTtcblxuICAgIC8vIE9ubHkgdXBkYXRlIGBmaXJzdFB1Ymxpc2hlZGAgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQXQgPSBzeXMuZmlyc3RQdWJsaXNoZWRBdCA/PyBzY2hlZHVsZWRBdDtcbiAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEJ5ID0gc3lzLmZpcnN0UHVibGlzaGVkQnkgPz8gKHNjaGVkdWxlZEJ5IHx8ICcnKTtcblxuICAgIC8vIFNhdmUgcHVibGlzaGVkIGRvYy5cbiAgICBiYXRjaC5zZXQocHVibGlzaGVkUmVmLCB7XG4gICAgICBpZCxcbiAgICAgIGNvbGxlY3Rpb24sXG4gICAgICBzbHVnLFxuICAgICAgZmllbGRzOiBkYXRhLmZpZWxkcyB8fCB7fSxcbiAgICAgIHN5czoge1xuICAgICAgICAuLi5zeXMsXG4gICAgICAgIGZpcnN0UHVibGlzaGVkQXQ6IGZpcnN0UHVibGlzaGVkQXQsXG4gICAgICAgIGZpcnN0UHVibGlzaGVkQnk6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgIHB1Ymxpc2hlZEF0OiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICBwdWJsaXNoZWRCeTogc2NoZWR1bGVkQnkgfHwgJycsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgIC8vIFJlbW92ZSBwdWJsaXNoZWQgZG9jLlxuICAgIGJhdGNoLmRlbGV0ZShzY2hlZHVsZWRSZWYpO1xuICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgZHJhZnQgZG9jIHRvIHJlbW92ZSBgc2NoZWR1bGVkQXRgIGFuZCBgc2NoZWR1bGVkQnlgIGZpZWxkc1xuICAgIC8vIGFuZCB1cGRhdGUgdGhlIGBwdWJsaXNoZWRBdGAgYW5kIGBwdWJsaXNoZWRCeWAgZmllbGRzLlxuICAgIGJhdGNoLnVwZGF0ZShkcmFmdFJlZiwge1xuICAgICAgJ3N5cy5zY2hlZHVsZWRBdCc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAnc3lzLnNjaGVkdWxlZEJ5JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRBdCc6IGZpcnN0UHVibGlzaGVkQXQsXG4gICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQnknOiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgJ3N5cy5wdWJsaXNoZWRBdCc6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAnc3lzLnB1Ymxpc2hlZEJ5Jzogc2NoZWR1bGVkQnkgfHwgJycsXG4gICAgfSk7XG4gICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgcHVibGlzaGVkRG9jcy5wdXNoKGRvYyk7XG5cbiAgICBpZiAoYmF0Y2hDb3VudCA+PSA0OTgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICBjb25zb2xlLmxvZyhgcHVibGlzaGVkICR7cHVibGlzaGVkRG9jcy5sZW5ndGh9IGRvY3MhYCk7XG4gIHJldHVybiBwdWJsaXNoZWREb2NzO1xufVxuXG4vKipcbiAqIFdhbGtzIHRoZSBkYXRhIHRyZWUgYW5kIGNvbnZlcnRzIGFueSBUaW1lc3RhbXAgb2JqZWN0cyB0byBtaWxsaXMgYW5kIGFueVxuICogX2FycmF5IG1hcHMgdG8gbm9ybWFsIGFycmF5cy5cbiAqXG4gKiBFLmcuOlxuICpcbiAqIG5vcm1hbGl6ZURhdGEoe1xuICogICBzeXM6IHttb2RpZmllZEF0OiBUaW1lc3RhbXAoMTIzKX0sXG4gKiAgIGZpZWxkczoge1xuICogICAgIF9hcnJheTogWydhc2RmJ10sXG4gKiAgICAgYXNkZjoge3RpdGxlOiAnaGVsbG8nfVxuICogICB9XG4gKiB9KVxuICogLy8gPT4ge3N5czoge21vZGlmaWVkQXQ6IDEyM30sIGZpZWxkczoge2ZvbzogW3t0aXRsZTogJ2hlbGxvJ31dfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEoZGF0YTogYW55KTogYW55IHtcbiAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgIGNvbnN0IHZhbCA9IGRhdGFba2V5XTtcbiAgICBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgICAgaWYgKHZhbC50b01pbGxpcykge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbC50b01pbGxpcygpO1xuICAgICAgfSBlbHNlIGlmIChPYmplY3QuaGFzT3duKHZhbCwgJ19hcnJheScpICYmIEFycmF5LmlzQXJyYXkodmFsLl9hcnJheSkpIHtcbiAgICAgICAgY29uc3QgYXJyID0gdmFsLl9hcnJheS5tYXAoKGs6IHN0cmluZykgPT4gbm9ybWFsaXplRGF0YSh2YWxba10gfHwge30pKTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBhcnI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IG5vcm1hbGl6ZURhdGEodmFsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEgIT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZzogUm9vdENvbmZpZyk6IENNU1BsdWdpbiB7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gcm9vdENvbmZpZy5wbHVnaW5zIHx8IFtdO1xuICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zLmZpbmQoKHBsdWdpbikgPT4gcGx1Z2luLm5hbWUgPT09ICdyb290LWNtcycpO1xuICBpZiAoIXBsdWdpbikge1xuICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgcm9vdC1jbXMgcGx1Z2luIGNvbmZpZyBpbiByb290LmNvbmZpZy50cycpO1xuICB9XG4gIHJldHVybiBwbHVnaW4gYXMgQ01TUGx1Z2luO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0aW9uIHtcbiAgW2xvY2FsZTogc3RyaW5nXTogc3RyaW5nO1xuICBzb3VyY2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvbnNNYXAge1xuICBbaGFzaDogc3RyaW5nXTogVHJhbnNsYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxlVHJhbnNsYXRpb25zIHtcbiAgW3NvdXJjZTogc3RyaW5nXTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvYWRUcmFuc2xhdGlvbnNPcHRpb25zIHtcbiAgdGFncz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIExvYWRzIHRyYW5zbGF0aW9ucyBzYXZlZCBpbiB0aGUgdHJhc25sYXRpb25zIGNvbGxlY3Rpb24sIG9wdGlvbmFsbHkgZmlsdGVyZWRcbiAqIGJ5IHRhZy5cbiAqXG4gKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gKiBgYGBcbiAqIHtcbiAqICAgXCI8aGFzaD5cIjoge1wic291cmNlXCI6IFwiSGVsbG9cIiwgXCJlc1wiOiBcIkhvbGFcIiwgXCJmclwiOiBcIkJvbmpvdXJcIn0sXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRUcmFuc2xhdGlvbnMoXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIG9wdGlvbnM/OiBMb2FkVHJhbnNsYXRpb25zT3B0aW9uc1xuKTogUHJvbWlzZTxUcmFuc2xhdGlvbnNNYXA+IHtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBwcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgY29uc3QgYXBwID0gY21zUGx1Z2luLmdldEZpcmViYXNlQXBwKCk7XG4gIGNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGFwcCk7XG5cbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9UcmFuc2xhdGlvbnNgO1xuICBsZXQgcXVlcnk6IFF1ZXJ5ID0gZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICBpZiAob3B0aW9ucz8udGFncykge1xuICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoJ3RhZ3MnLCAnYXJyYXktY29udGFpbnMtYW55Jywgb3B0aW9ucy50YWdzKTtcbiAgfVxuXG4gIGNvbnN0IHF1ZXJ5U25hcHNob3QgPSBhd2FpdCBxdWVyeS5nZXQoKTtcbiAgY29uc3QgdHJhbnNsYXRpb25zTWFwOiBUcmFuc2xhdGlvbnNNYXAgPSB7fTtcbiAgcXVlcnlTbmFwc2hvdC5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBjb25zdCBoYXNoID0gZG9jLmlkO1xuICAgIHRyYW5zbGF0aW9uc01hcFtoYXNoXSA9IGRvYy5kYXRhKCkgYXMgVHJhbnNsYXRpb247XG4gIH0pO1xuICByZXR1cm4gdHJhbnNsYXRpb25zTWFwO1xufVxuXG4vKipcbiAqIExvYWRzIHRyYW5zbGF0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIGxvY2FsZS5cbiAqXG4gKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gKiBgYGBcbiAqIHtcbiAqICAgXCJIZWxsb1wiOiBcIkJvbmpvdXJcIixcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFRyYW5zbGF0aW9uc0ZvckxvY2FsZShcbiAgcm9vdENvbmZpZzogUm9vdENvbmZpZyxcbiAgbG9jYWxlOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBMb2FkVHJhbnNsYXRpb25zT3B0aW9uc1xuKTogUHJvbWlzZTxMb2NhbGVUcmFuc2xhdGlvbnM+IHtcbiAgY29uc3QgdHJhbnNsYXRpb25zTWFwID0gYXdhaXQgbG9hZFRyYW5zbGF0aW9ucyhyb290Q29uZmlnLCBvcHRpb25zKTtcbiAgcmV0dXJuIHRyYW5zbGF0aW9uc0ZvckxvY2FsZSh0cmFuc2xhdGlvbnNNYXAsIGxvY2FsZSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSB0cmFuc2xhdGlvbnMgbWFwIGZyb20gYGxvYWRUcmFuc2xhdGlvbnMoKWAgdG8gYSBtYXAgb2Ygc291cmNlIHRvXG4gKiB0cmFuc2xhdGVkIHN0cmluZyBmb3IgYSBwYXJ0aWN1bGFyIGxvY2FsZS5cbiAqXG4gKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gKiBgYGBcbiAqIHtcbiAqICAgXCJIZWxsb1wiOiBcIkJvbmpvdXJcIixcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRpb25zRm9yTG9jYWxlKFxuICB0cmFuc2xhdGlvbnNNYXA6IFRyYW5zbGF0aW9uc01hcCxcbiAgbG9jYWxlOiBzdHJpbmdcbikge1xuICBjb25zdCBsb2NhbGVUcmFuc2xhdGlvbnM6IExvY2FsZVRyYW5zbGF0aW9ucyA9IHt9O1xuICBPYmplY3QudmFsdWVzKHRyYW5zbGF0aW9uc01hcCkuZm9yRWFjaCgoc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgc291cmNlID0gc3RyaW5nLnNvdXJjZTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHN0cmluZ1tsb2NhbGVdIHx8IHN0cmluZy5lbiB8fCBzdHJpbmcuc291cmNlO1xuICAgIGxvY2FsZVRyYW5zbGF0aW9uc1tzb3VyY2VdID0gdHJhbnNsYXRpb247XG4gIH0pO1xuICByZXR1cm4gbG9jYWxlVHJhbnNsYXRpb25zO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBc0JPLFNBQVMsT0FBTyxPQUErQztBQUNwRSxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sU0FBUTtBQUNsQztBQU9PLFNBQVMsT0FBTyxPQUErQztBQUNwRSxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sU0FBUTtBQUNsQztBQU9PLFNBQVMsS0FBSyxPQUEyQztBQUM5RCxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sT0FBTTtBQUNoQztBQU9PLFNBQVMsU0FBUyxPQUFtRDtBQUMxRSxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sV0FBVTtBQUNwQztBQVFPLFNBQVMsUUFBUSxPQUFpRDtBQUN2RSxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sVUFBUztBQUNuQztBQVNPLFNBQVMsT0FBTyxPQUErQztBQUNwRSxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sU0FBUTtBQUNsQztBQVNPLFNBQVMsWUFDZCxPQUNrQjtBQUNsQixTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sY0FBYTtBQUN2QztBQVNPLFNBQVMsTUFBTSxPQUE2QztBQUNqRSxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sUUFBTztBQUNqQztBQVFPLFNBQVMsS0FBSyxPQUEyQztBQUM5RCxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sT0FBTTtBQUNoQztBQU9PLFNBQVMsT0FBTyxPQUErQztBQUNwRSxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sU0FBUTtBQUNsQztBQW1DTyxTQUFTLE1BQU0sT0FBNkM7QUFDakUsU0FBTyxF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
@@ -0,0 +1,13 @@
1
+ import * as firebase_functions_v2_scheduler from 'firebase-functions/v2/scheduler';
2
+ import { ScheduleOptions } from 'firebase-functions/v2/scheduler';
3
+
4
+ interface CronOptions {
5
+ rootDir?: string;
6
+ scheduleOptions?: Partial<ScheduleOptions>;
7
+ }
8
+ /**
9
+ * Runs offline CMS tasks, such as publishing of scheduled docs.
10
+ */
11
+ declare function cron(options?: CronOptions): firebase_functions_v2_scheduler.ScheduleFunction;
12
+
13
+ export { CronOptions, cron };
@@ -0,0 +1,120 @@
1
+ // core/functions.ts
2
+ import path from "node:path";
3
+ import { loadRootConfig } from "@blinkk/root/node";
4
+ import { onSchedule } from "firebase-functions/v2/scheduler";
5
+
6
+ // core/runtime.ts
7
+ import {
8
+ FieldValue,
9
+ getFirestore
10
+ } from "firebase-admin/firestore";
11
+ async function publishScheduledDocs(rootConfig) {
12
+ const cmsPlugin = getCmsPlugin(rootConfig);
13
+ const cmsPluginOptions = cmsPlugin.getConfig();
14
+ const projectId = cmsPluginOptions.id || "default";
15
+ const app = cmsPlugin.getFirebaseApp();
16
+ const db = getFirestore(app);
17
+ const projectCollectionsPath = `Projects/${projectId}/Collections`;
18
+ const now = Math.ceil(new Date().getTime());
19
+ const snapshot = await db.collectionGroup("Scheduled").get();
20
+ const docs = snapshot.docs.filter((d) => {
21
+ var _a;
22
+ if (!d.ref.path.startsWith(projectCollectionsPath)) {
23
+ return false;
24
+ }
25
+ const data = d.data() || {};
26
+ const scheduledAt = (_a = data.sys) == null ? void 0 : _a.scheduledAt;
27
+ return scheduledAt && scheduledAt.toMillis && scheduledAt.toMillis() <= now;
28
+ }).map((d) => {
29
+ const dbPath = d.ref.path;
30
+ const segments = dbPath.split("/");
31
+ const slug = segments.at(-1);
32
+ const collection = segments.at(-3);
33
+ const id = `${collection}/${slug}`;
34
+ return {
35
+ data: d.data(),
36
+ id,
37
+ collection,
38
+ slug
39
+ };
40
+ });
41
+ if (docs.length === 0) {
42
+ console.log("no docs to schedule");
43
+ return [];
44
+ }
45
+ let batchCount = 0;
46
+ const batch = db.batch();
47
+ const publishedDocs = [];
48
+ for (const doc of docs) {
49
+ const { id, collection, slug, data } = doc;
50
+ const draftRef = db.doc(
51
+ `${projectCollectionsPath}/${collection}/Drafts/${slug}`
52
+ );
53
+ const scheduledRef = db.doc(
54
+ `${projectCollectionsPath}/${collection}/Scheduled/${slug}`
55
+ );
56
+ const publishedRef = db.doc(
57
+ `${projectCollectionsPath}/${collection}/Published/${slug}`
58
+ );
59
+ const { scheduledAt, scheduledBy, ...sys } = data.sys || {};
60
+ const firstPublishedAt = sys.firstPublishedAt ?? scheduledAt;
61
+ const firstPublishedBy = sys.firstPublishedBy ?? (scheduledBy || "");
62
+ batch.set(publishedRef, {
63
+ id,
64
+ collection,
65
+ slug,
66
+ fields: data.fields || {},
67
+ sys: {
68
+ ...sys,
69
+ firstPublishedAt,
70
+ firstPublishedBy,
71
+ publishedAt: FieldValue.serverTimestamp(),
72
+ publishedBy: scheduledBy || ""
73
+ }
74
+ });
75
+ batchCount += 1;
76
+ batch.delete(scheduledRef);
77
+ batchCount += 1;
78
+ batch.update(draftRef, {
79
+ "sys.scheduledAt": FieldValue.delete(),
80
+ "sys.scheduledBy": FieldValue.delete(),
81
+ "sys.firstPublishedAt": firstPublishedAt,
82
+ "sys.firstPublishedBy": firstPublishedBy,
83
+ "sys.publishedAt": FieldValue.serverTimestamp(),
84
+ "sys.publishedBy": scheduledBy || ""
85
+ });
86
+ batchCount += 1;
87
+ publishedDocs.push(doc);
88
+ if (batchCount >= 498) {
89
+ break;
90
+ }
91
+ }
92
+ await batch.commit();
93
+ console.log(`published ${publishedDocs.length} docs!`);
94
+ return publishedDocs;
95
+ }
96
+ function getCmsPlugin(rootConfig) {
97
+ const plugins = rootConfig.plugins || [];
98
+ const plugin = plugins.find((plugin2) => plugin2.name === "root-cms");
99
+ if (!plugin) {
100
+ throw new Error("could not find root-cms plugin config in root.config.ts");
101
+ }
102
+ return plugin;
103
+ }
104
+
105
+ // core/functions.ts
106
+ function cron(options) {
107
+ const rootDir = path.resolve((options == null ? void 0 : options.rootDir) || process.cwd());
108
+ const scheduleOptions = {
109
+ schedule: "every 1 mins",
110
+ ...options == null ? void 0 : options.scheduleOptions
111
+ };
112
+ return onSchedule(scheduleOptions, async () => {
113
+ const rootConfig = await loadRootConfig(rootDir, { command: "cms-cron" });
114
+ await publishScheduledDocs(rootConfig);
115
+ });
116
+ }
117
+ export {
118
+ cron
119
+ };
120
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9mdW5jdGlvbnMudHMiLCAiLi4vY29yZS9ydW50aW1lLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtsb2FkUm9vdENvbmZpZ30gZnJvbSAnQGJsaW5ray9yb290L25vZGUnO1xuaW1wb3J0IHtTY2hlZHVsZU9wdGlvbnMsIG9uU2NoZWR1bGV9IGZyb20gJ2ZpcmViYXNlLWZ1bmN0aW9ucy92Mi9zY2hlZHVsZXInO1xuaW1wb3J0IHtwdWJsaXNoU2NoZWR1bGVkRG9jc30gZnJvbSAnLi9ydW50aW1lLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBDcm9uT3B0aW9ucyB7XG4gIHJvb3REaXI/OiBzdHJpbmc7XG4gIHNjaGVkdWxlT3B0aW9ucz86IFBhcnRpYWw8U2NoZWR1bGVPcHRpb25zPjtcbn1cblxuLyoqXG4gKiBSdW5zIG9mZmxpbmUgQ01TIHRhc2tzLCBzdWNoIGFzIHB1Ymxpc2hpbmcgb2Ygc2NoZWR1bGVkIGRvY3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcm9uKG9wdGlvbnM/OiBDcm9uT3B0aW9ucykge1xuICBjb25zdCByb290RGlyID0gcGF0aC5yZXNvbHZlKG9wdGlvbnM/LnJvb3REaXIgfHwgcHJvY2Vzcy5jd2QoKSk7XG4gIGNvbnN0IHNjaGVkdWxlT3B0aW9uczogU2NoZWR1bGVPcHRpb25zID0ge1xuICAgIHNjaGVkdWxlOiAnZXZlcnkgMSBtaW5zJyxcbiAgICAuLi5vcHRpb25zPy5zY2hlZHVsZU9wdGlvbnMsXG4gIH07XG4gIHJldHVybiBvblNjaGVkdWxlKHNjaGVkdWxlT3B0aW9ucywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBsb2FkUm9vdENvbmZpZyhyb290RGlyLCB7Y29tbWFuZDogJ2Ntcy1jcm9uJ30pO1xuICAgIGF3YWl0IHB1Ymxpc2hTY2hlZHVsZWREb2NzKHJvb3RDb25maWcpO1xuICB9KTtcbn1cbiIsICJpbXBvcnQge1BsdWdpbiwgUm9vdENvbmZpZ30gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7XG4gIEZpZWxkVmFsdWUsXG4gIFF1ZXJ5LFxuICBUaW1lc3RhbXAsXG4gIGdldEZpcmVzdG9yZSxcbn0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vZmlyZXN0b3JlJztcblxuaW1wb3J0IHtDTVNQbHVnaW59IGZyb20gJy4vcGx1Z2luLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBHZXREb2NPcHRpb25zIHtcbiAgbW9kZTogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhIGRvYyBmcm9tIFJvb3QuanMgQ01TLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RG9jPFQ+KFxuICByb290Q29uZmlnOiBSb290Q29uZmlnLFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgc2x1Zzogc3RyaW5nLFxuICBvcHRpb25zOiBHZXREb2NPcHRpb25zXG4pOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gIGNvbnN0IGFwcCA9IGNtc1BsdWdpbi5nZXRGaXJlYmFzZUFwcCgpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuICAvLyBTbHVncyB3aXRoIHNsYXNoZXMgYXJlIGVuY29kZWQgYXMgYC0tYCBpbiB0aGUgREIuXG4gIHNsdWcgPSBzbHVnLnJlcGxhY2VBbGwoJy8nLCAnLS0nKTtcbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gIGNvbnN0IGRvY1JlZiA9IGRiLmRvYyhkYlBhdGgpO1xuICBjb25zdCBkb2MgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gIGlmIChkb2MuZXhpc3RzKSB7XG4gICAgY29uc3QgZGF0YSA9IGRvYy5kYXRhKCk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZURhdGEoZGF0YSkgYXMgVDtcbiAgfVxuICBjb25zb2xlLmxvZyhgZG9jIG5vdCBmb3VuZDogJHtkYlBhdGh9YCk7XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3REb2NzT3B0aW9ucyB7XG4gIG1vZGU6ICdkcmFmdCcgfCAncHVibGlzaGVkJztcbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbiAgb3JkZXJCeT86IHN0cmluZztcbiAgb3JkZXJCeURpcmVjdGlvbj86ICdhc2MnIHwgJ2Rlc2MnO1xuICBxdWVyeT86IChxdWVyeTogUXVlcnkpID0+IFF1ZXJ5O1xufVxuXG4vKipcbiAqIExpc3RzIGRvY3MgZnJvbSBhIFJvb3QuanMgQ01TIGNvbGxlY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0RG9jczxUPihcbiAgcm9vdENvbmZpZzogUm9vdENvbmZpZyxcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IExpc3REb2NzT3B0aW9uc1xuKTogUHJvbWlzZTx7ZG9jczogVFtdfT4ge1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICBjb25zdCBhcHAgPSBjbXNQbHVnaW4uZ2V0RmlyZWJhc2VBcHAoKTtcbiAgY29uc3QgZGIgPSBnZXRGaXJlc3RvcmUoYXBwKTtcbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICBsZXQgcXVlcnk6IFF1ZXJ5ID0gZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICBpZiAob3B0aW9ucy5saW1pdCkge1xuICAgIHF1ZXJ5ID0gcXVlcnkubGltaXQob3B0aW9ucy5saW1pdCk7XG4gIH1cbiAgaWYgKG9wdGlvbnMub2Zmc2V0KSB7XG4gICAgcXVlcnkgPSBxdWVyeS5vZmZzZXQob3B0aW9ucy5vZmZzZXQpO1xuICB9XG4gIGlmIChvcHRpb25zLm9yZGVyQnkpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5Lm9yZGVyQnkob3B0aW9ucy5vcmRlckJ5LCBvcHRpb25zLm9yZGVyQnlEaXJlY3Rpb24pO1xuICB9XG4gIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KTtcbiAgfVxuICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gIGNvbnN0IGRvY3M6IFRbXSA9IFtdO1xuICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xuICAgIGNvbnN0IGRvYyA9IG5vcm1hbGl6ZURhdGEocmVzdWx0LmRhdGEoKSkgYXMgVDtcbiAgICBkb2NzLnB1c2goZG9jKTtcbiAgfSk7XG4gIHJldHVybiB7ZG9jc307XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTnVtRG9jc09wdGlvbnMge1xuICBtb2RlOiAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG4gIHF1ZXJ5PzogKHF1ZXJ5OiBRdWVyeSkgPT4gUXVlcnk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRvY3MgaW4gYSBSb290LmpzIENNUyBjb2xsZWN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbnVtRG9jcyhcbiAgcm9vdENvbmZpZzogUm9vdENvbmZpZyxcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IE51bURvY3NPcHRpb25zXG4pIHtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBwcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgY29uc3QgYXBwID0gY21zUGx1Z2luLmdldEZpcmViYXNlQXBwKCk7XG4gIGNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGFwcCk7XG4gIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3Byb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259YDtcbiAgbGV0IHF1ZXJ5OiBRdWVyeSA9IGRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgaWYgKG9wdGlvbnMucXVlcnkpIHtcbiAgICBxdWVyeSA9IG9wdGlvbnMucXVlcnkocXVlcnkpO1xuICB9XG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeS5jb3VudCgpLmdldCgpO1xuICBjb25zdCBjb3VudCA9IHJlc3VsdHMuZGF0YSgpLmNvdW50O1xuICByZXR1cm4gY291bnQ7XG59XG5cbi8qKlxuICogUHVibGlzaGVzIHNjaGVkdWxlZCBkb2NzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVibGlzaFNjaGVkdWxlZERvY3Mocm9vdENvbmZpZzogUm9vdENvbmZpZykge1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBhcHAgPSBjbXNQbHVnaW4uZ2V0RmlyZWJhc2VBcHAoKTtcbiAgY29uc3QgZGIgPSBnZXRGaXJlc3RvcmUoYXBwKTtcblxuICBjb25zdCBwcm9qZWN0Q29sbGVjdGlvbnNQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9Db2xsZWN0aW9uc2A7XG4gIGNvbnN0IG5vdyA9IE1hdGguY2VpbChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG5cbiAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBkYi5jb2xsZWN0aW9uR3JvdXAoJ1NjaGVkdWxlZCcpLmdldCgpO1xuICBjb25zdCBkb2NzID0gc25hcHNob3QuZG9jc1xuICAgIC5maWx0ZXIoKGQpID0+IHtcbiAgICAgIC8vIEZpbHRlciBkb2NzIGJ5IHByb2plY3QuXG4gICAgICBpZiAoIWQucmVmLnBhdGguc3RhcnRzV2l0aChwcm9qZWN0Q29sbGVjdGlvbnNQYXRoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBGaWx0ZXIgZG9jcyB3aGVyZSBzY2hlZHVsZWRBdCBpcyBpbiB0aGUgcGFzdC5cbiAgICAgIC8vIE5PVEUoc3RldmVubGUpOiB0aGUgZmlsdGVyaW5nIGlzIGRvbmUgbWFudWFsbHkgaW5zdGVhZCBvZiB1c2luZyBhIHF1ZXJ5XG4gICAgICAvLyB0byBhdm9pZCBoYXZpbmcgdG8gY3JlYXRlIGFuIGluZGV4IGluIGZpcmVzdG9yZS5cbiAgICAgIGNvbnN0IGRhdGEgPSBkLmRhdGEoKSB8fCB7fTtcbiAgICAgIGNvbnN0IHNjaGVkdWxlZEF0OiBUaW1lc3RhbXAgfCB1bmRlZmluZWQgPSBkYXRhLnN5cz8uc2NoZWR1bGVkQXQ7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzY2hlZHVsZWRBdCAmJiBzY2hlZHVsZWRBdC50b01pbGxpcyAmJiBzY2hlZHVsZWRBdC50b01pbGxpcygpIDw9IG5vd1xuICAgICAgKTtcbiAgICB9KVxuICAgIC5tYXAoKGQpID0+IHtcbiAgICAgIGNvbnN0IGRiUGF0aCA9IGQucmVmLnBhdGg7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IGRiUGF0aC5zcGxpdCgnLycpO1xuICAgICAgY29uc3Qgc2x1ZyA9IHNlZ21lbnRzLmF0KC0xKTtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBzZWdtZW50cy5hdCgtMyk7XG4gICAgICBjb25zdCBpZCA9IGAke2NvbGxlY3Rpb259LyR7c2x1Z31gO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogZC5kYXRhKCksXG4gICAgICAgIGlkLFxuICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICBzbHVnLFxuICAgICAgfTtcbiAgICB9KTtcblxuICBpZiAoZG9jcy5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmxvZygnbm8gZG9jcyB0byBzY2hlZHVsZScpO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIEVhY2ggdHJhbnNhY3Rpb24gb3IgYmF0Y2ggY2FuIHdyaXRlIGEgbWF4IG9mIDUwMCBvcHMuXG4gIC8vIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL2ZpcmVzdG9yZS9tYW5hZ2UtZGF0YS90cmFuc2FjdGlvbnNcbiAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICBjb25zdCBiYXRjaCA9IGRiLmJhdGNoKCk7XG4gIGNvbnN0IHB1Ymxpc2hlZERvY3M6IGFueVtdID0gW107XG4gIGZvciAoY29uc3QgZG9jIG9mIGRvY3MpIHtcbiAgICBjb25zdCB7aWQsIGNvbGxlY3Rpb24sIHNsdWcsIGRhdGF9ID0gZG9jO1xuICAgIGNvbnN0IGRyYWZ0UmVmID0gZGIuZG9jKFxuICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9EcmFmdHMvJHtzbHVnfWBcbiAgICApO1xuICAgIGNvbnN0IHNjaGVkdWxlZFJlZiA9IGRiLmRvYyhcbiAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vU2NoZWR1bGVkLyR7c2x1Z31gXG4gICAgKTtcbiAgICBjb25zdCBwdWJsaXNoZWRSZWYgPSBkYi5kb2MoXG4gICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1B1Ymxpc2hlZC8ke3NsdWd9YFxuICAgICk7XG4gICAgY29uc3Qge3NjaGVkdWxlZEF0LCBzY2hlZHVsZWRCeSwgLi4uc3lzfSA9IGRhdGEuc3lzIHx8IHt9O1xuXG4gICAgLy8gT25seSB1cGRhdGUgYGZpcnN0UHVibGlzaGVkYCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gICAgY29uc3QgZmlyc3RQdWJsaXNoZWRBdCA9IHN5cy5maXJzdFB1Ymxpc2hlZEF0ID8/IHNjaGVkdWxlZEF0O1xuICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQnkgPSBzeXMuZmlyc3RQdWJsaXNoZWRCeSA/PyAoc2NoZWR1bGVkQnkgfHwgJycpO1xuXG4gICAgLy8gU2F2ZSBwdWJsaXNoZWQgZG9jLlxuICAgIGJhdGNoLnNldChwdWJsaXNoZWRSZWYsIHtcbiAgICAgIGlkLFxuICAgICAgY29sbGVjdGlvbixcbiAgICAgIHNsdWcsXG4gICAgICBmaWVsZHM6IGRhdGEuZmllbGRzIHx8IHt9LFxuICAgICAgc3lzOiB7XG4gICAgICAgIC4uLnN5cyxcbiAgICAgICAgZmlyc3RQdWJsaXNoZWRBdDogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgZmlyc3RQdWJsaXNoZWRCeTogZmlyc3RQdWJsaXNoZWRCeSxcbiAgICAgICAgcHVibGlzaGVkQXQ6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgIHB1Ymxpc2hlZEJ5OiBzY2hlZHVsZWRCeSB8fCAnJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgLy8gUmVtb3ZlIHB1Ymxpc2hlZCBkb2MuXG4gICAgYmF0Y2guZGVsZXRlKHNjaGVkdWxlZFJlZik7XG4gICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBkcmFmdCBkb2MgdG8gcmVtb3ZlIGBzY2hlZHVsZWRBdGAgYW5kIGBzY2hlZHVsZWRCeWAgZmllbGRzXG4gICAgLy8gYW5kIHVwZGF0ZSB0aGUgYHB1Ymxpc2hlZEF0YCBhbmQgYHB1Ymxpc2hlZEJ5YCBmaWVsZHMuXG4gICAgYmF0Y2gudXBkYXRlKGRyYWZ0UmVmLCB7XG4gICAgICAnc3lzLnNjaGVkdWxlZEF0JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICdzeXMuc2NoZWR1bGVkQnknOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEF0JzogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRCeSc6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAnc3lzLnB1Ymxpc2hlZEF0JzogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICdzeXMucHVibGlzaGVkQnknOiBzY2hlZHVsZWRCeSB8fCAnJyxcbiAgICB9KTtcbiAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICBwdWJsaXNoZWREb2NzLnB1c2goZG9jKTtcblxuICAgIGlmIChiYXRjaENvdW50ID49IDQ5OCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgJHtwdWJsaXNoZWREb2NzLmxlbmd0aH0gZG9jcyFgKTtcbiAgcmV0dXJuIHB1Ymxpc2hlZERvY3M7XG59XG5cbi8qKlxuICogV2Fsa3MgdGhlIGRhdGEgdHJlZSBhbmQgY29udmVydHMgYW55IFRpbWVzdGFtcCBvYmplY3RzIHRvIG1pbGxpcyBhbmQgYW55XG4gKiBfYXJyYXkgbWFwcyB0byBub3JtYWwgYXJyYXlzLlxuICpcbiAqIEUuZy46XG4gKlxuICogbm9ybWFsaXplRGF0YSh7XG4gKiAgIHN5czoge21vZGlmaWVkQXQ6IFRpbWVzdGFtcCgxMjMpfSxcbiAqICAgZmllbGRzOiB7XG4gKiAgICAgX2FycmF5OiBbJ2FzZGYnXSxcbiAqICAgICBhc2RmOiB7dGl0bGU6ICdoZWxsbyd9XG4gKiAgIH1cbiAqIH0pXG4gKiAvLyA9PiB7c3lzOiB7bW9kaWZpZWRBdDogMTIzfSwgZmllbGRzOiB7Zm9vOiBbe3RpdGxlOiAnaGVsbG8nfV19fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRGF0YShkYXRhOiBhbnkpOiBhbnkge1xuICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgY29uc3QgdmFsID0gZGF0YVtrZXldO1xuICAgIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgICBpZiAodmFsLnRvTWlsbGlzKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsLnRvTWlsbGlzKCk7XG4gICAgICB9IGVsc2UgaWYgKE9iamVjdC5oYXNPd24odmFsLCAnX2FycmF5JykgJiYgQXJyYXkuaXNBcnJheSh2YWwuX2FycmF5KSkge1xuICAgICAgICBjb25zdCBhcnIgPSB2YWwuX2FycmF5Lm1hcCgoazogc3RyaW5nKSA9PiBub3JtYWxpemVEYXRhKHZhbFtrXSB8fCB7fSkpO1xuICAgICAgICByZXN1bHRba2V5XSA9IGFycjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gbm9ybWFsaXplRGF0YSh2YWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkgJiYgZGF0YSAhPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENtc1BsdWdpbihyb290Q29uZmlnOiBSb290Q29uZmlnKTogQ01TUGx1Z2luIHtcbiAgY29uc3QgcGx1Z2luczogUGx1Z2luW10gPSByb290Q29uZmlnLnBsdWdpbnMgfHwgW107XG4gIGNvbnN0IHBsdWdpbiA9IHBsdWdpbnMuZmluZCgocGx1Z2luKSA9PiBwbHVnaW4ubmFtZSA9PT0gJ3Jvb3QtY21zJyk7XG4gIGlmICghcGx1Z2luKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCByb290LWNtcyBwbHVnaW4gY29uZmlnIGluIHJvb3QuY29uZmlnLnRzJyk7XG4gIH1cbiAgcmV0dXJuIHBsdWdpbiBhcyBDTVNQbHVnaW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb24ge1xuICBbbG9jYWxlOiBzdHJpbmddOiBzdHJpbmc7XG4gIHNvdXJjZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0aW9uc01hcCB7XG4gIFtoYXNoOiBzdHJpbmddOiBUcmFuc2xhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2NhbGVUcmFuc2xhdGlvbnMge1xuICBbc291cmNlOiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZFRyYW5zbGF0aW9uc09wdGlvbnMge1xuICB0YWdzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogTG9hZHMgdHJhbnNsYXRpb25zIHNhdmVkIGluIHRoZSB0cmFzbmxhdGlvbnMgY29sbGVjdGlvbiwgb3B0aW9uYWxseSBmaWx0ZXJlZFxuICogYnkgdGFnLlxuICpcbiAqIFJldHVybnMgYSBtYXAgbGlrZTpcbiAqIGBgYFxuICoge1xuICogICBcIjxoYXNoPlwiOiB7XCJzb3VyY2VcIjogXCJIZWxsb1wiLCBcImVzXCI6IFwiSG9sYVwiLCBcImZyXCI6IFwiQm9uam91clwifSxcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFRyYW5zbGF0aW9ucyhcbiAgcm9vdENvbmZpZzogUm9vdENvbmZpZyxcbiAgb3B0aW9ucz86IExvYWRUcmFuc2xhdGlvbnNPcHRpb25zXG4pOiBQcm9taXNlPFRyYW5zbGF0aW9uc01hcD4ge1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBhcHAgPSBjbXNQbHVnaW4uZ2V0RmlyZWJhc2VBcHAoKTtcbiAgY29uc3QgZGIgPSBnZXRGaXJlc3RvcmUoYXBwKTtcblxuICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L1RyYW5zbGF0aW9uc2A7XG4gIGxldCBxdWVyeTogUXVlcnkgPSBkYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gIGlmIChvcHRpb25zPy50YWdzKSB7XG4gICAgcXVlcnkgPSBxdWVyeS53aGVyZSgndGFncycsICdhcnJheS1jb250YWlucy1hbnknLCBvcHRpb25zLnRhZ3MpO1xuICB9XG5cbiAgY29uc3QgcXVlcnlTbmFwc2hvdCA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuICBjb25zdCB0cmFuc2xhdGlvbnNNYXA6IFRyYW5zbGF0aW9uc01hcCA9IHt9O1xuICBxdWVyeVNuYXBzaG90LmZvckVhY2goKGRvYykgPT4ge1xuICAgIGNvbnN0IGhhc2ggPSBkb2MuaWQ7XG4gICAgdHJhbnNsYXRpb25zTWFwW2hhc2hdID0gZG9jLmRhdGEoKSBhcyBUcmFuc2xhdGlvbjtcbiAgfSk7XG4gIHJldHVybiB0cmFuc2xhdGlvbnNNYXA7XG59XG5cbi8qKlxuICogTG9hZHMgdHJhbnNsYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgbG9jYWxlLlxuICpcbiAqIFJldHVybnMgYSBtYXAgbGlrZTpcbiAqIGBgYFxuICoge1xuICogICBcIkhlbGxvXCI6IFwiQm9uam91clwiLFxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkVHJhbnNsYXRpb25zRm9yTG9jYWxlKFxuICByb290Q29uZmlnOiBSb290Q29uZmlnLFxuICBsb2NhbGU6IHN0cmluZyxcbiAgb3B0aW9ucz86IExvYWRUcmFuc2xhdGlvbnNPcHRpb25zXG4pOiBQcm9taXNlPExvY2FsZVRyYW5zbGF0aW9ucz4ge1xuICBjb25zdCB0cmFuc2xhdGlvbnNNYXAgPSBhd2FpdCBsb2FkVHJhbnNsYXRpb25zKHJvb3RDb25maWcsIG9wdGlvbnMpO1xuICByZXR1cm4gdHJhbnNsYXRpb25zRm9yTG9jYWxlKHRyYW5zbGF0aW9uc01hcCwgbG9jYWxlKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHRyYW5zbGF0aW9ucyBtYXAgZnJvbSBgbG9hZFRyYW5zbGF0aW9ucygpYCB0byBhIG1hcCBvZiBzb3VyY2UgdG9cbiAqIHRyYW5zbGF0ZWQgc3RyaW5nIGZvciBhIHBhcnRpY3VsYXIgbG9jYWxlLlxuICpcbiAqIFJldHVybnMgYSBtYXAgbGlrZTpcbiAqIGBgYFxuICoge1xuICogICBcIkhlbGxvXCI6IFwiQm9uam91clwiLFxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGlvbnNGb3JMb2NhbGUoXG4gIHRyYW5zbGF0aW9uc01hcDogVHJhbnNsYXRpb25zTWFwLFxuICBsb2NhbGU6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IGxvY2FsZVRyYW5zbGF0aW9uczogTG9jYWxlVHJhbnNsYXRpb25zID0ge307XG4gIE9iamVjdC52YWx1ZXModHJhbnNsYXRpb25zTWFwKS5mb3JFYWNoKChzdHJpbmcpID0+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBzdHJpbmcuc291cmNlO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gc3RyaW5nW2xvY2FsZV0gfHwgc3RyaW5nLmVuIHx8IHN0cmluZy5zb3VyY2U7XG4gICAgbG9jYWxlVHJhbnNsYXRpb25zW3NvdXJjZV0gPSB0cmFuc2xhdGlvbjtcbiAgfSk7XG4gIHJldHVybiBsb2NhbGVUcmFuc2xhdGlvbnM7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsT0FBTyxVQUFVO0FBQ2pCLFNBQVEsc0JBQXFCO0FBQzdCLFNBQXlCLGtCQUFpQjs7O0FDRDFDO0FBQUEsRUFDRTtBQUFBLEVBR0E7QUFBQSxPQUNLO0FBcUhQLGVBQXNCLHFCQUFxQixZQUF3QjtBQUNqRSxRQUFNLFlBQVksYUFBYSxVQUFVO0FBQ3pDLFFBQU0sbUJBQW1CLFVBQVUsVUFBVTtBQUM3QyxRQUFNLFlBQVksaUJBQWlCLE1BQU07QUFDekMsUUFBTSxNQUFNLFVBQVUsZUFBZTtBQUNyQyxRQUFNLEtBQUssYUFBYSxHQUFHO0FBRTNCLFFBQU0seUJBQXlCLFlBQVk7QUFDM0MsUUFBTSxNQUFNLEtBQUssS0FBSyxJQUFJLEtBQUssRUFBRSxRQUFRLENBQUM7QUFFMUMsUUFBTSxXQUFXLE1BQU0sR0FBRyxnQkFBZ0IsV0FBVyxFQUFFLElBQUk7QUFDM0QsUUFBTSxPQUFPLFNBQVMsS0FDbkIsT0FBTyxDQUFDLE1BQU07QUF2SW5CO0FBeUlNLFFBQUksQ0FBQyxFQUFFLElBQUksS0FBSyxXQUFXLHNCQUFzQixHQUFHO0FBQ2xELGFBQU87QUFBQSxJQUNUO0FBSUEsVUFBTSxPQUFPLEVBQUUsS0FBSyxLQUFLLENBQUM7QUFDMUIsVUFBTSxlQUFxQyxVQUFLLFFBQUwsbUJBQVU7QUFDckQsV0FDRSxlQUFlLFlBQVksWUFBWSxZQUFZLFNBQVMsS0FBSztBQUFBLEVBRXJFLENBQUMsRUFDQSxJQUFJLENBQUMsTUFBTTtBQUNWLFVBQU0sU0FBUyxFQUFFLElBQUk7QUFDckIsVUFBTSxXQUFXLE9BQU8sTUFBTSxHQUFHO0FBQ2pDLFVBQU0sT0FBTyxTQUFTLEdBQUcsRUFBRTtB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
package/dist/plugin.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { Request, Plugin } from '@blinkk/root';
2
+ import { App } from 'firebase-admin/app';
2
3
  import { DecodedIdToken } from 'firebase-admin/auth';
3
4
 
4
5
  type CMSUser = DecodedIdToken;
@@ -26,20 +27,36 @@ type CMSPluginOptions = {
26
27
  messagingSenderId: string;
27
28
  appId: string;
28
29
  };
29
- /** Secret value(s) used for signing the user authentication cookie. */
30
+ /**
31
+ * Secret value(s) used for signing the user authentication cookie.
32
+ * @deprecated This is now handled directly by root's sessionMiddleware under
33
+ * `server.sessionCookieSecret` in root.config.ts.
34
+ */
30
35
  cookieSecret?: string | string[];
31
36
  /** Function called to check if a user should have access to the CMS. */
32
37
  isUserAuthorized?: (req: Request, user: CMSUser) => boolean | Promise<boolean>;
33
38
  /**
34
39
  * URL to GCI service for transforming uploaded GCS images to a Google App
35
- * Engine Images API serving URL. Defaults to "https://gci.rootjs.dev". To
36
- * disable, set this value to `false`.
40
+ * Engine Images API serving URL.
41
+ *
42
+ * Setting this to `true` uses the default hosted service at
43
+ * https://gci.rootjs.dev.
44
+ *
45
+ * To set up GCI:
46
+ *
47
+ * - Create a GCS bucket with fine-grained permissions
48
+ * - Share owner access to the bucket with the service account returned in
49
+ * https://gci.rootjs.dev/_/service_account
50
+ *
51
+ * To disable GCI, leave this value empty or set to `false`, which which will
52
+ * serve images directly from GCS instead.
37
53
  */
38
54
  gci?: string | boolean;
39
55
  };
40
56
  type CMSPlugin = Plugin & {
41
57
  name: 'root-cms';
42
58
  getConfig: () => CMSPluginOptions;
59
+ getFirebaseApp: () => App;
43
60
  };
44
61
  declare function cmsPlugin(options: CMSPluginOptions): CMSPlugin;
45
62