@blinkk/root-cms 1.0.0-beta.31 → 1.0.0-beta.33

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/cli.js CHANGED
@@ -1,15 +1,22 @@
1
1
  // core/runtime.ts
2
- import { initializeApp, getApps, applicationDefault } from "firebase-admin/app";
3
- import { getFirestore } from "firebase-admin/firestore";
2
+ import { applicationDefault, getApp, initializeApp } from "firebase-admin/app";
3
+ import { FieldValue, getFirestore } from "firebase-admin/firestore";
4
+ var APP_NAME = "root-cms";
4
5
  function getFirebaseApp(gcpProjectId) {
5
- const apps = getApps();
6
- if (apps.length > 0 && apps[0]) {
7
- return apps[0];
8
- }
9
- return initializeApp({
10
- projectId: gcpProjectId,
11
- credential: applicationDefault()
12
- });
6
+ try {
7
+ return getApp(APP_NAME);
8
+ } catch (err) {
9
+ if (err && err.code === "app/no-app") {
10
+ return initializeApp(
11
+ {
12
+ projectId: gcpProjectId,
13
+ credential: applicationDefault()
14
+ },
15
+ APP_NAME
16
+ );
17
+ }
18
+ throw err;
19
+ }
13
20
  }
14
21
  function getCmsPlugin(rootConfig) {
15
22
  const plugins = rootConfig.plugins || [];
@@ -228,4 +235,4 @@ export {
228
235
  generateTypes,
229
236
  initFirebase
230
237
  };
231
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9ydW50aW1lLnRzIiwgIi4uL2NvcmUvc2VjdXJpdHkudHMiLCAiLi4vY2xpL2NvbW1hbmRzL2luaXQtZmlyZWJhc2UudHMiLCAiLi4vY2xpL2NvbW1hbmRzL2dlbmVyYXRlLXR5cGVzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge1BsdWdpbiwgUm9vdENvbmZpZ30gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7aW5pdGlhbGl6ZUFwcCwgZ2V0QXBwcywgYXBwbGljYXRpb25EZWZhdWx0fSBmcm9tICdmaXJlYmFzZS1hZG1pbi9hcHAnO1xuaW1wb3J0IHtRdWVyeSwgZ2V0RmlyZXN0b3JlfSBmcm9tICdmaXJlYmFzZS1hZG1pbi9maXJlc3RvcmUnO1xuXG5pbXBvcnQge0NNU1BsdWdpbn0gZnJvbSAnLi9wbHVnaW4uanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlyZWJhc2VBcHAoZ2NwUHJvamVjdElkOiBzdHJpbmcpIHtcbiAgY29uc3QgYXBwcyA9IGdldEFwcHMoKTtcbiAgaWYgKGFwcHMubGVuZ3RoID4gMCAmJiBhcHBzWzBdKSB7XG4gICAgcmV0dXJuIGFwcHNbMF07XG4gIH1cbiAgcmV0dXJuIGluaXRpYWxpemVBcHAoe1xuICAgIHByb2plY3RJZDogZ2NwUHJvamVjdElkLFxuICAgIGNyZWRlbnRpYWw6IGFwcGxpY2F0aW9uRGVmYXVsdCgpLFxuICB9KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXREb2NPcHRpb25zIHtcbiAgbW9kZTogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhIGRvYyBmcm9tIFJvb3QuanMgQ01TLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RG9jPFQ+KFxuICByb290Q29uZmlnOiBSb290Q29uZmlnLFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgc2x1Zzogc3RyaW5nLFxuICBvcHRpb25zOiBHZXREb2NPcHRpb25zXG4pOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IGdjcFByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuZmlyZWJhc2VDb25maWcucHJvamVjdElkO1xuICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICBjb25zdCBhcHAgPSBnZXRGaXJlYmFzZUFwcChnY3BQcm9qZWN0SWQpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuICAvLyBTbHVncyB3aXRoIHNsYXNoZXMgYXJlIGVuY29kZWQgYXMgYC0tYCBpbiB0aGUgREIuXG4gIHNsdWcgPSBzbHVnLnJlcGxhY2VBbGwoJy8nLCAnLS0nKTtcbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gIGNvbnN0IGRvY1JlZiA9IGRiLmRvYyhkYlBhdGgpO1xuICBjb25zdCBkb2MgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gIGlmIChkb2MuZXhpc3RzKSB7XG4gICAgY29uc3QgZGF0YSA9IGRvYy5kYXRhKCk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZURhdGEoZGF0YSkgYXMgVDtcbiAgfVxuICBjb25zb2xlLmxvZyhgZG9jIG5vdCBmb3VuZDogJHtkYlBhdGh9YCk7XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3REb2NzT3B0aW9ucyB7XG4gIG1vZGU6ICdkcmFmdCcgfCAncHVibGlzaGVkJztcbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbiAgb3JkZXJCeT86IHN0cmluZztcbiAgb3JkZXJCeURpcmVjdGlvbj86ICdhc2MnIHwgJ2Rlc2MnO1xuICAvLyBUT0RPKHN0ZXZlbmxlKTogc3VwcG9ydCBmaWx0ZXJzLlxufVxuXG4vKipcbiAqIExpc3RzIGRvY3MgZnJvbSBhIFJvb3QuanMgQ01TIGNvbGxlY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0RG9jczxUPihcbiAgcm9vdENvbmZpZzogUm9vdENvbmZpZyxcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IExpc3REb2NzT3B0aW9uc1xuKTogUHJvbWlzZTx7ZG9jczogVFtdfT4ge1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBnY3BQcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmZpcmViYXNlQ29uZmlnLnByb2plY3RJZDtcbiAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgY29uc3QgYXBwID0gZ2V0RmlyZWJhc2VBcHAoZ2NwUHJvamVjdElkKTtcbiAgY29uc3QgZGIgPSBnZXRGaXJlc3RvcmUoYXBwKTtcbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICBsZXQgcXVlcnk6IFF1ZXJ5ID0gZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICBpZiAob3B0aW9ucy5saW1pdCkge1xuICAgIHF1ZXJ5ID0gcXVlcnkubGltaXQob3B0aW9ucy5saW1pdCk7XG4gIH1cbiAgaWYgKG9wdGlvbnMub2Zmc2V0KSB7XG4gICAgcXVlcnkgPSBxdWVyeS5vZmZzZXQob3B0aW9ucy5vZmZzZXQpO1xuICB9XG4gIGlmIChvcHRpb25zLm9yZGVyQnkpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5Lm9yZGVyQnkob3B0aW9ucy5vcmRlckJ5LCBvcHRpb25zLm9yZGVyQnlEaXJlY3Rpb24pO1xuICB9XG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeS5nZXQoKTtcbiAgY29uc3QgZG9jczogVFtdID0gW107XG4gIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XG4gICAgY29uc3QgZG9jID0gbm9ybWFsaXplRGF0YShyZXN1bHQuZGF0YSgpKSBhcyBUO1xuICAgIGRvY3MucHVzaChkb2MpO1xuICB9KTtcbiAgcmV0dXJuIHtkb2NzfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOdW1Eb2NzT3B0aW9ucyB7XG4gIG1vZGU6ICdkcmFmdCcgfCAncHVibGlzaGVkJztcbiAgLy8gVE9ETyhzdGV2ZW5sZSk6IHN1cHBvcnQgZmlsdGVycy5cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZG9jcyBpbiBhIFJvb3QuanMgQ01TIGNvbGxlY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBudW1Eb2NzKFxuICByb290Q29uZmlnOiBSb290Q29uZmlnLFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgb3B0aW9uczogTnVtRG9jc09wdGlvbnNcbikge1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBnY3BQcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmZpcmViYXNlQ29uZmlnLnByb2plY3RJZDtcbiAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgY29uc3QgYXBwID0gZ2V0RmlyZWJhc2VBcHAoZ2NwUHJvamVjdElkKTtcbiAgY29uc3QgZGIgPSBnZXRGaXJlc3RvcmUoYXBwKTtcbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICBjb25zdCBxdWVyeTogUXVlcnkgPSBkYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gIC8vIFRPRE8oc3RldmVubGUpOiBzdXBwb3J0IGZpbHRlcnMgaGVyZS5cbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmNvdW50KCkuZ2V0KCk7XG4gIGNvbnN0IGNvdW50ID0gcmVzdWx0cy5kYXRhKCkuY291bnQ7XG4gIHJldHVybiBjb3VudDtcbn1cblxuLyoqXG4gKiBXYWxrcyB0aGUgZGF0YSB0cmVlIGFuZCBjb252ZXJ0cyBhbnkgVGltZXN0YW1wIG9iamVjdHMgdG8gbWlsbGlzIGFuZCBhbnlcbiAqIF9hcnJheSBtYXBzIHRvIG5vcm1hbCBhcnJheXMuXG4gKlxuICogRS5nLjpcbiAqXG4gKiBub3JtYWxpemVEYXRhKHtcbiAqICAgc3lzOiB7bW9kaWZpZWRBdDogVGltZXN0YW1wKDEyMyl9LFxuICogICBmaWVsZHM6IHtcbiAqICAgICBfYXJyYXk6IFsnYXNkZiddLFxuICogICAgIGFzZGY6IHt0aXRsZTogJ2hlbGxvJ31cbiAqICAgfVxuICogfSlcbiAqIC8vID0+IHtzeXM6IHttb2RpZmllZEF0OiAxMjN9LCBmaWVsZHM6IHtmb286IFt7dGl0bGU6ICdoZWxsbyd9XX19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVEYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICBjb25zdCB2YWwgPSBkYXRhW2tleV07XG4gICAgaWYgKGlzT2JqZWN0KHZhbCkpIHtcbiAgICAgIGlmICh2YWwudG9NaWxsaXMpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWwudG9NaWxsaXMoKTtcbiAgICAgIH0gZWxzZSBpZiAoT2JqZWN0Lmhhc093bih2YWwsICdfYXJyYXknKSAmJiBBcnJheS5pc0FycmF5KHZhbC5fYXJyYXkpKSB7XG4gICAgICAgIGNvbnN0IGFyciA9IHZhbC5fYXJyYXkubWFwKChrOiBzdHJpbmcpID0+IG5vcm1hbGl6ZURhdGEodmFsW2tdIHx8IHt9KSk7XG4gICAgICAgIHJlc3VsdFtrZXldID0gYXJyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBub3JtYWxpemVEYXRhKHZhbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhICE9PSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWc6IFJvb3RDb25maWcpOiBDTVNQbHVnaW4ge1xuICBjb25zdCBwbHVnaW5zOiBQbHVnaW5bXSA9IHJvb3RDb25maWcucGx1Z2lucyB8fCBbXTtcbiAgY29uc3QgcGx1Z2luID0gcGx1Z2lucy5maW5kKChwbHVnaW4pID0+IHBsdWdpbi5uYW1lID09PSAncm9vdC1jbXMnKTtcbiAgaWYgKCFwbHVnaW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCBmaW5kIHJvb3QtY21zIHBsdWdpbiBjb25maWcgaW4gcm9vdC5jb25maWcudHMnKTtcbiAgfVxuICByZXR1cm4gcGx1Z2luIGFzIENNU1BsdWdpbjtcbn1cbiIsICJpbXBvcnQge2dldFNlY3VyaXR5UnVsZXN9IGZyb20gJ2ZpcmViYXNlLWFkbWluL3NlY3VyaXR5LXJ1bGVzJztcblxuaW1wb3J0IHtnZXRGaXJlYmFzZUFwcH0gZnJvbSAnLi9ydW50aW1lLmpzJztcblxuZXhwb3J0IGNvbnN0IEZJUkVTVE9SRV9SVUxFUyA9IGBydWxlc192ZXJzaW9uID0gJzInO1xuc2VydmljZSBjbG91ZC5maXJlc3RvcmUge1xuICBtYXRjaCAvZGF0YWJhc2VzL3tkYXRhYmFzZX0vZG9jdW1lbnRzIHtcbiAgICBtYXRjaCAvUHJvamVjdHMve3Byb2plY3R9L3tkb2N1bWVudD0qKn0ge1xuICAgICAgYWxsb3cgd3JpdGU6XG4gICAgICAgIGlmIHJlcXVlc3QuYXV0aCAhPSBudWxsXG4gICAgICAgICYmIGV4aXN0cygvZGF0YWJhc2VzLyQoZGF0YWJhc2UpL2RvY3VtZW50cy9Qcm9qZWN0cy8kKHByb2plY3QpKVxuICAgICAgICAmJiBnZXQoL2RhdGFiYXNlcy8kKGRhdGFiYXNlKS9kb2N1bWVudHMvUHJvamVjdHMvJChwcm9qZWN0KSkuZGF0YS5yb2xlc1tyZXF1ZXN0LmF1dGgudG9rZW4uZW1haWxdIGluIFsnQURNSU4nLCAnRURJVE9SJ107XG4gICAgICBhbGxvdyByZWFkOlxuICAgICAgICBpZiByZXF1ZXN0LmF1dGggIT0gbnVsbFxuICAgICAgICAmJiBleGlzdHMoL2RhdGFiYXNlcy8kKGRhdGFiYXNlKS9kb2N1bWVudHMvUHJvamVjdHMvJChwcm9qZWN0KSlcbiAgICAgICAgJiYgZ2V0KC9kYXRhYmFzZXMvJChkYXRhYmFzZSkvZG9jdW1lbnRzL1Byb2plY3RzLyQocHJvamVjdCkpLmRhdGEucm9sZXNbcmVxdWVzdC5hdXRoLnRva2VuLmVtYWlsXSBpbiBbJ0FETUlOJywgJ0VESVRPUicsICdWSUVXRVInXTtcbiAgICB9XG5cbiAgICBtYXRjaCAvUHJvamVjdHMve3Byb2plY3R9L0NvbGxlY3Rpb25zL3tjb2xsZWN0aW9ufS97ZG9jdW1lbnQ9Kip9IHtcbiAgICAgIGFsbG93IHdyaXRlOlxuICAgICAgICBpZiByZXF1ZXN0LmF1dGggIT0gbnVsbFxuICAgICAgICAmJiBleGlzdHMoL2RhdGFiYXNlcy8kKGRhdGFiYXNlKS9kb2N1bWVudHMvUHJvamVjdHMvJChwcm9qZWN0KS9Db2xsZWN0aW9ucy8kKGNvbGxlY3Rpb24pKVxuICAgICAgICAmJiBnZXQoL2RhdGFiYXNlcy8kKGRhdGFiYXNlKS9kb2N1bWVudHMvUHJvamVjdHMvJChwcm9qZWN0KS9Db2xsZWN0aW9ucy8kKGNvbGxlY3Rpb24pKS5kYXRhLnJvbGVzW3JlcXVlc3QuYXV0aC50b2tlbi5lbWFpbF0gaW4gWydBRE1JTicsICdFRElUT1InXTtcbiAgICAgIGFsbG93IHJlYWQ6XG4gICAgICAgIGlmIHJlcXVlc3QuYXV0aCAhPSBudWxsXG4gICAgICAgICYmIGV4aXN0cygvZGF0YWJhc2VzLyQoZGF0YWJhc2UpL2RvY3VtZW50cy9Qcm9qZWN0cy8kKHByb2plY3QpL0NvbGxlY3Rpb25zLyQoY29sbGVjdGlvbikpXG4gICAgICAgICYmIGdldCgvZGF0YWJhc2VzLyQoZGF0YWJhc2UpL2RvY3VtZW50cy9Qcm9qZWN0cy8kKHByb2plY3QpL0NvbGxlY3Rpb25zLyQoY29sbGVjdGlvbikpLmRhdGEucm9sZXNbcmVxdWVzdC5hdXRoLnRva2VuLmVtYWlsXSBpbiBbJ0FETUlOJywgJ0VESVRPUicsICdWSUVXRVInXTtcbiAgICB9XG4gIH1cbn1cbmA7XG5cbi8qKlxuICogQWRkcyB0aGUgcm9vdC1jbXMgc2VjdXJpdHkgcnVsZXMgdG8gYSBGaXJlYmFzZSBwcm9qZWN0LlxuICogTk9URTogVGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgcnVsZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseVNlY3VyaXR5UnVsZXMocHJvamVjdElkOiBzdHJpbmcpIHtcbiAgY29uc3QgYXBwID0gZ2V0RmlyZWJhc2VBcHAocHJvamVjdElkKTtcbiAgY29uc3Qgc2VjdXJpdHlSdWxlcyA9IGdldFNlY3VyaXR5UnVsZXMoYXBwKTtcbiAgYXdhaXQgc2VjdXJpdHlSdWxlcy5yZWxlYXNlRmlyZXN0b3JlUnVsZXNldEZyb21Tb3VyY2UoRklSRVNUT1JFX1JVTEVTKTtcbn1cbiIsICJpbXBvcnQge1Jvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5cbmltcG9ydCB7Z2V0Q21zUGx1Z2lufSBmcm9tICcuLi8uLi9jb3JlL3J1bnRpbWUuanMnO1xuaW1wb3J0IHthcHBseVNlY3VyaXR5UnVsZXN9IGZyb20gJy4uLy4uL2NvcmUvc2VjdXJpdHkuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluaXRGaXJlYmFzZU9wdGlvbnMge1xuICAvKiogR0NQIHByb2plY3QgaWQuICovXG4gIHByb2plY3Q/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0RmlyZWJhc2Uocm9vdENvbmZpZzogUm9vdENvbmZpZykge1xuICByZXR1cm4gKG9wdGlvbnM6IEluaXRGaXJlYmFzZU9wdGlvbnMpID0+IHtcbiAgICBsZXQgZ2NwUHJvamVjdElkOiBzdHJpbmc7XG4gICAgaWYgKG9wdGlvbnMucHJvamVjdCkge1xuICAgICAgZ2NwUHJvamVjdElkID0gb3B0aW9ucy5wcm9qZWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gICAgICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICAgICAgZ2NwUHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5maXJlYmFzZUNvbmZpZy5wcm9qZWN0SWQ7XG4gICAgfVxuICAgIGlmICghZ2NwUHJvamVjdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpcmViYXNlQ29uZmlnLnByb2plY3RJZCBub3Qgc2V0IGluIGNtcyBwbHVnaW4gb3B0aW9ucycpO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBnY3AgcHJvamVjdDogJHtnY3BQcm9qZWN0SWR9YCk7XG4gICAgY29uc29sZS5sb2coJ1x1RDgzRFx1REM2RSB1cGRhdGluZyBzZWN1cml0eSBydWxlcy4uLicpO1xuICAgIGFwcGx5U2VjdXJpdHlSdWxlcyhnY3BQcm9qZWN0SWQpO1xuICAgIGNvbnNvbGUubG9nKCdkb25lIGluaXRpYWxpemluZyBmaXJlYmFzZSBwcm9qZWN0IScpO1xuICB9O1xufVxuIiwgImltcG9ydCB7cHJvbWlzZXMgYXMgZnN9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7ZmlsZVVSTFRvUGF0aH0gZnJvbSAnbm9kZTp1cmwnO1xuXG5pbXBvcnQge1Jvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge3ZpdGVTc3JMb2FkTW9kdWxlfSBmcm9tICdAYmxpbmtrL3Jvb3Qvbm9kZSc7XG5pbXBvcnQgKiBhcyBkb20gZnJvbSAnZHRzLWRvbSc7XG5cbmltcG9ydCB7RmllbGQsIFNjaGVtYX0gZnJvbSAnLi4vLi4vY29yZS9zY2hlbWEuanMnO1xuXG50eXBlIFByb2plY3RNb2R1bGUgPSB0eXBlb2YgaW1wb3J0KCcuLi8uLi9jb3JlL3Byb2plY3QuanMnKTtcbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUeXBlcyhyb290Q29uZmlnOiBSb290Q29uZmlnKSB7XG4gIGNvbnN0IHJvb3REaXIgPSByb290Q29uZmlnLnJvb3REaXI7XG4gIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbW9kdWxlUGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL3Byb2plY3QuanMnKTtcbiAgICBjb25zdCBwcm9qZWN0ID0gKGF3YWl0IHZpdGVTc3JMb2FkTW9kdWxlKFxuICAgICAgcm9vdENvbmZpZyxcbiAgICAgIG1vZHVsZVBhdGhcbiAgICApKSBhcyBQcm9qZWN0TW9kdWxlO1xuICAgIGNvbnN0IHNjaGVtYXMgPSBwcm9qZWN0LmdldFByb2plY3RTY2hlbWFzKCk7XG4gICAgY29uc29sZS5sb2coYGdlbmVyYXRpbmcgcm9vdC1jbXMuZC50cyBmcm9tICR7cm9vdERpcn0uLi5gKTtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXIsICdyb290LWNtcy5kLnRzJyk7XG4gICAgYXdhaXQgZ2VuZXJhdGVTY2hlbWFEdHMob3V0cHV0UGF0aCwgc2NoZW1hcyk7XG4gICAgY29uc29sZS5sb2coJ3NhdmVkIHJvb3QtY21zLmQudHMhJyk7XG4gIH07XG59XG5cbi8vIFRoZSBgZHRzLWRvbWAgcGFja2FnZSB1c2VzIDQtc3BhY2UgaW5kZW50cywgdXNlIHRoZSBzYW1lIGZvciBjb25zaXN0ZW5jeS5cbmNvbnN0IFRFTVBMQVRFID0gYC8qKiBSb290LmpzIENNUyB0eXBlcy4gVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU0RvYzxGaWVsZHMgZXh0ZW5kcyB7fT4ge1xuICAgIC8qKiBUaGUgaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzL2Zvby1iYXJcIi4gKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29sbGVjdGlvbiBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXNcIi4gKi9cbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZztcbiAgICAvKiogVGhlIHNsdWcgb2YgdGhlIGRvYywgZS5nLiBcImZvby1iYXJcIi4gKi9cbiAgICBzbHVnOiBzdHJpbmc7XG4gICAgLyoqIFN5c3RlbS1sZXZlbCBtZXRhZGF0YS4gKi9cbiAgICBzeXM6IHtcbiAgICAgICAgY3JlYXRlZEF0OiBudW1iZXI7XG4gICAgICAgIGNyZWF0ZWRCeTogc3RyaW5nO1xuICAgICAgICBtb2RpZmllZEF0OiBudW1iZXI7XG4gICAgICAgIG1vZGlmaWVkQnk6IHN0cmluZztcbiAgICAgICAgZmlyc3RQdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICAgICAgZmlyc3RQdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICAgICAgcHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgICAgIHB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xuICAgIH07XG4gICAgLyoqIFVzZXItZW50ZXJlZCBmaWVsZCB2YWx1ZXMgZnJvbSB0aGUgQ01TLiAqL1xuICAgIGZpZWxkcz86IEZpZWxkcztcbn1gO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJvb3QtY21zLmQudHMgZmlsZSBmcm9tIHRoZSAuc2NoZW1hLnRzIGZpbGVzIGluIHRoZSBwcm9qZWN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTY2hlbWFEdHMoXG4gIG91dHB1dFBhdGg6IHN0cmluZyxcbiAgc2NoZW1hczogUmVjb3JkPHN0cmluZywgU2NoZW1hPlxuKSB7XG4gIGNvbnN0IHJlc3VsdHMgPSBbVEVNUExBVEVdO1xuICBmb3IgKGNvbnN0IGZpbGVJZCBpbiBzY2hlbWFzKSB7XG4gICAgY29uc3Qgc2NoZW1hID0gc2NoZW1hc1tmaWxlSWRdO1xuICAgIHJlc3VsdHMucHVzaChyZW5kZXJTY2hlbWEoZmlsZUlkLCBzY2hlbWEpKTtcbiAgfVxuICBjb25zdCBvdXRwdXQgPSByZXN1bHRzXG4gICAgLmpvaW4oJ1xcblxcbicpXG4gICAgLnJlcGxhY2VBbGwoJy8qKiAgJywgJy8qKiAnKVxuICAgIC5yZXBsYWNlQWxsKCcgICovJywgJyAqLycpXG4gICAgLnJlcGxhY2UoL1xcclxcbnxcXHJ8XFxuL2csICdcXG4nKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKG91dHB1dFBhdGgsIG91dHB1dCwgJ3V0Zi04Jyk7XG59XG5cbmZ1bmN0aW9uIGZpZWxkUHJvcGVydHkoZmllbGQ6IEZpZWxkKTogZG9tLlByb3BlcnR5RGVjbGFyYXRpb24ge1xuICBjb25zdCBwcm9wID0gZG9tLmNyZWF0ZS5wcm9wZXJ0eShcbiAgICBmaWVsZC5pZCEsXG4gICAgZmllbGRUeXBlKGZpZWxkKSxcbiAgICBkb20uRGVjbGFyYXRpb25GbGFncy5PcHRpb25hbFxuICApO1xuICBjb25zdCBqc2RvYyA9IFtdO1xuICBpZiAoZmllbGQubGFiZWwpIHtcbiAgICBpZiAoZmllbGQuaGVscCkge1xuICAgICAganNkb2MucHVzaChgJHtmaWVsZC5sYWJlbH0uICR7ZmllbGQuaGVscH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAganNkb2MucHVzaChmaWVsZC5sYWJlbCk7XG4gICAgfVxuICB9XG4gIGlmIChmaWVsZC5kZXByZWNhdGVkKSB7XG4gICAganNkb2MucHVzaCgnQGRlcHJlY2F0ZWQnKTtcbiAgfVxuICBpZiAoanNkb2MubGVuZ3RoID4gMCkge1xuICAgIHByb3AuanNEb2NDb21tZW50ID0ganNkb2Muam9pbignXFxuJyk7XG4gIH1cbiAgcmV0dXJuIHByb3A7XG59XG5cbmZ1bmN0aW9uIGZpZWxkVHlwZShmaWVsZDogRmllbGQpOiBkb20uVHlwZSB7XG4gIGlmIChmaWVsZC50eXBlID09PSAnYXJyYXknKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLmFycmF5KGZpZWxkVHlwZShmaWVsZC5vZikpO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnaW1hZ2UnKSB7XG4gICAgcmV0dXJuIGRvbS5jcmVhdGUub2JqZWN0VHlwZShbXG4gICAgICBkb20uY3JlYXRlLnByb3BlcnR5KCdzcmMnLCBkb20udHlwZS5zdHJpbmcpLFxuICAgICAgZG9tLmNyZWF0ZS5wcm9wZXJ0eShcbiAgICAgICAgJ2FsdCcsXG4gICAgICAgIGRvbS50eXBlLnN0cmluZyxcbiAgICAgICAgZG9tLkRlY2xhcmF0aW9uRmxhZ3MuT3B0aW9uYWxcbiAgICAgICksXG4gICAgICBkb20uY3JlYXRlLnByb3BlcnR5KFxuICAgICAgICAnd2lkdGgnLFxuICAgICAgICBkb20udHlwZS5udW1iZXIsXG4gICAgICAgIGRvbS5EZWNsYXJhdGlvbkZsYWdzLk9wdGlvbmFsXG4gICAgICApLFxuICAgICAgZG9tLmNyZWF0ZS5wcm9wZXJ0eShcbiAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgIGRvbS50eXBlLm51bWJlcixcbiAgICAgICAgZG9tLkRlY2xhcmF0aW9uRmxhZ3MuT3B0aW9uYWxcbiAgICAgICksXG4gICAgXSk7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaWxlJykge1xuICAgIHJldHVybiBkb20uY3JlYXRlLm9iamVjdFR5cGUoW2RvbS5jcmVhdGUucHJvcGVydHkoJ3NyYycsIGRvbS50eXBlLnN0cmluZyldKTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgIHJldHVybiBkb20udHlwZS5hcnJheShkb20udHlwZS5zdHJpbmcpO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnc2VsZWN0Jykge1xuICAgIHJldHVybiBkb20udHlwZS5zdHJpbmc7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLnN0cmluZztcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBzdWJwcm9wZXJ0aWVzID0gKGZpZWxkLmZpZWxkcyB8fCBbXSkubWFwKChmKSA9PiBmaWVsZFByb3BlcnR5KGYpKTtcbiAgICByZXR1cm4gZG9tLmNyZWF0ZS5vYmplY3RUeXBlKHN1YnByb3BlcnRpZXMpO1xuICB9XG4gIHJldHVybiBkb20udHlwZS51bmtub3duO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTY2hlbWEoZmlsZUlkOiBzdHJpbmcsIHNjaGVtYTogU2NoZW1hKTogc3RyaW5nIHtcbiAgY29uc3QganNkb2MgPSBgR2VuZXJhdGVkIGZyb20gXFxgJHtmaWxlSWR9XFxgLmA7XG4gIGNvbnN0IGlkID0gcGF0aC5wYXJzZShmaWxlSWQpLm5hbWUuc3BsaXQoJy4nKVswXTtcbiAgY29uc3QgZmllbGRzSW50ZXJmYWNlID0gYCR7aWR9RmllbGRzYDtcbiAgY29uc3QgZmllbGRzID0gZG9tLmNyZWF0ZS5pbnRlcmZhY2UoXG4gICAgZmllbGRzSW50ZXJmYWNlLFxuICAgIGRvbS5EZWNsYXJhdGlvbkZsYWdzLkV4cG9ydFxuICApO1xuICBmaWVsZHMuanNEb2NDb21tZW50ID0ganNkb2M7XG4gIGZvciAoY29uc3QgZmllbGQgb2Ygc2NoZW1hLmZpZWxkcykge1xuICAgIGlmICghZmllbGQuaWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmaWVsZHMubWVtYmVycy5wdXNoKGZpZWxkUHJvcGVydHkoZmllbGQpKTtcbiAgfVxuXG4gIGNvbnN0IGZpZWxkc1R5cGVPdXRwdXQgPSBkb21cbiAgICAuZW1pdChmaWVsZHMsIHtzaW5nbGVMaW5lSnNEb2NDb21tZW50czogdHJ1ZX0pXG4gICAgLnRyaW0oKTtcbiAgaWYgKGZpbGVJZC5zdGFydHNXaXRoKCcvY29sbGVjdGlvbnMvJykpIHtcbiAgICBjb25zdCBiYXNlVHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TRG9jJyk7XG4gICAgYmFzZVR5cGUudHlwZUFyZ3VtZW50cy5wdXNoKGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKGZpZWxkc0ludGVyZmFjZSkpO1xuICAgIGNvbnN0IGRvY1R5cGUgPSBkb20uY3JlYXRlLmFsaWFzKFxuICAgICAgYCR7aWR9RG9jYCxcbiAgICAgIGJhc2VUeXBlLFxuICAgICAgZG9tLkRlY2xhcmF0aW9uRmxhZ3MuRXhwb3J0XG4gICAgKTtcbiAgICBkb2NUeXBlLmpzRG9jQ29tbWVudCA9IGpzZG9jO1xuXG4gICAgY29uc3QgZG9jVHlwZU91dHB1dCA9IGRvbVxuICAgICAgLmVtaXQoZG9jVHlwZSwge3NpbmdsZUxpbmVKc0RvY0NvbW1lbnRzOiB0cnVlfSlcbiAgICAgIC50cmltKCk7XG4gICAgcmV0dXJuIGZpZWxkc1R5cGVPdXRwdXQgKyAnXFxuXFxuJyArIGRvY1R5cGVPdXRwdXQ7XG4gIH1cbiAgcmV0dXJuIGZpZWxkc1R5cGVPdXRwdXQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQ0EsU0FBUSxlQUFlLFNBQVMsMEJBQXlCO0FBQ3pELFNBQWUsb0JBQW1CO0FBSTNCLFNBQVMsZUFBZSxjQUFzQjtBQUNuRCxRQUFNLE9BQU8sUUFBUTtBQUNyQixNQUFJLEtBQUssU0FBUyxLQUFLLEtBQUssSUFBSTtBQUM5QixXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQ0EsU0FBTyxjQUFjO0FBQUEsSUFDbkIsV0FBVztBQUFBLElBQ1gsWUFBWSxtQkFBbUI7QUFBQSxFQUNqQyxDQUFDO0FBQ0g7QUFxSk8sU0FBUyxhQUFhLFlBQW1DO0FBQzlELFFBQU0sVUFBb0IsV0FBVyxXQUFXLENBQUM7QUFDakQsUUFBTSxTQUFTLFFBQVEsS0FBSyxDQUFDQSxZQUFXQSxRQUFPLFNBQVMsVUFBVTtBQUNsRSxNQUFJLENBQUMsUUFBUTtBQUNYLFVBQU0sSUFBSSxNQUFNLHlEQUF5RDtBQUFBLEVBQzNFO0FBQ0EsU0FBTztBQUNUOzs7QUMzS0EsU0FBUSx3QkFBdUI7QUFJeEIsSUFBTSxrQkFBa0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0MvQixlQUFzQixtQkFBbUIsV0FBbUI7QUFDMUQsUUFBTSxNQUFNLGVBQWUsU0FBUztBQUNwQyxRQUFNLGdCQUFnQixpQkFBaUIsR0FBRztBQUMxQyxRQUFNLGNBQWMsa0NBQWtDLGVBQWU7QUFDdkU7OztBQzlCTyxTQUFTLGFBQWEsWUFBd0I7QUFDbkQsU0FBTyxDQUFDLFlBQWlDO0FBQ3ZDLFFBQUk7QUFDSixRQUFJLFFBQVEsU0FBUztBQUNuQixxQkFBZSxRQUFRO0FBQUEsSUFDekIsT0FBTztBQUNMLFlB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
238
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9ydW50aW1lLnRzIiwgIi4uL2NvcmUvc2VjdXJpdHkudHMiLCAiLi4vY2xpL2NvbW1hbmRzL2luaXQtZmlyZWJhc2UudHMiLCAiLi4vY2xpL2NvbW1hbmRzL2dlbmVyYXRlLXR5cGVzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge1BsdWdpbiwgUm9vdENvbmZpZ30gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7YXBwbGljYXRpb25EZWZhdWx0LCBnZXRBcHAsIGluaXRpYWxpemVBcHB9IGZyb20gJ2ZpcmViYXNlLWFkbWluL2FwcCc7XG5pbXBvcnQge0ZpZWxkVmFsdWUsIFF1ZXJ5LCBnZXRGaXJlc3RvcmV9IGZyb20gJ2ZpcmViYXNlLWFkbWluL2ZpcmVzdG9yZSc7XG5cbmltcG9ydCB7Q01TUGx1Z2lufSBmcm9tICcuL3BsdWdpbi5qcyc7XG5cbmNvbnN0IEFQUF9OQU1FID0gJ3Jvb3QtY21zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcmViYXNlQXBwKGdjcFByb2plY3RJZDogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldEFwcChBUFBfTkFNRSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgPT09ICdhcHAvbm8tYXBwJykge1xuICAgICAgcmV0dXJuIGluaXRpYWxpemVBcHAoXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9qZWN0SWQ6IGdjcFByb2plY3RJZCxcbiAgICAgICAgICBjcmVkZW50aWFsOiBhcHBsaWNhdGlvbkRlZmF1bHQoKSxcbiAgICAgICAgfSxcbiAgICAgICAgQVBQX05BTUVcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldERvY09wdGlvbnMge1xuICBtb2RlOiAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgZG9jIGZyb20gUm9vdC5qcyBDTVMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREb2M8VD4oXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICBzbHVnOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEdldERvY09wdGlvbnNcbik6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBwcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgY29uc3QgZ2NwUHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5maXJlYmFzZUNvbmZpZy5wcm9qZWN0SWQ7XG4gIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gIGNvbnN0IGFwcCA9IGdldEZpcmViYXNlQXBwKGdjcFByb2plY3RJZCk7XG4gIGNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGFwcCk7XG4gIC8vIFNsdWdzIHdpdGggc2xhc2hlcyBhcmUgZW5jb2RlZCBhcyBgLS1gIGluIHRoZSBEQi5cbiAgc2x1ZyA9IHNsdWcucmVwbGFjZUFsbCgnLycsICctLScpO1xuICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgY29uc3QgZG9jUmVmID0gZGIuZG9jKGRiUGF0aCk7XG4gIGNvbnN0IGRvYyA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgaWYgKGRvYy5leGlzdHMpIHtcbiAgICBjb25zdCBkYXRhID0gZG9jLmRhdGEoKTtcbiAgICByZXR1cm4gbm9ybWFsaXplRGF0YShkYXRhKSBhcyBUO1xuICB9XG4gIGNvbnNvbGUubG9nKGBkb2Mgbm90IGZvdW5kOiAke2RiUGF0aH1gKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdERvY3NPcHRpb25zIHtcbiAgbW9kZTogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuICBvZmZzZXQ/OiBudW1iZXI7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvcmRlckJ5Pzogc3RyaW5nO1xuICBvcmRlckJ5RGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYyc7XG4gIC8vIFRPRE8oc3RldmVubGUpOiBzdXBwb3J0IGZpbHRlcnMuXG59XG5cbi8qKlxuICogTGlzdHMgZG9jcyBmcm9tIGEgUm9vdC5qcyBDTVMgY29sbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3REb2NzPFQ+KFxuICByb290Q29uZmlnOiBSb290Q29uZmlnLFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgb3B0aW9uczogTGlzdERvY3NPcHRpb25zXG4pOiBQcm9taXNlPHtkb2NzOiBUW119PiB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IGdjcFByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuZmlyZWJhc2VDb25maWcucHJvamVjdElkO1xuICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICBjb25zdCBhcHAgPSBnZXRGaXJlYmFzZUFwcChnY3BQcm9qZWN0SWQpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufWA7XG4gIGxldCBxdWVyeTogUXVlcnkgPSBkYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gIGlmIChvcHRpb25zLmxpbWl0KSB7XG4gICAgcXVlcnkgPSBxdWVyeS5saW1pdChvcHRpb25zLmxpbWl0KTtcbiAgfVxuICBpZiAob3B0aW9ucy5vZmZzZXQpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5Lm9mZnNldChvcHRpb25zLm9mZnNldCk7XG4gIH1cbiAgaWYgKG9wdGlvbnMub3JkZXJCeSkge1xuICAgIHF1ZXJ5ID0gcXVlcnkub3JkZXJCeShvcHRpb25zLm9yZGVyQnksIG9wdGlvbnMub3JkZXJCeURpcmVjdGlvbik7XG4gIH1cbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuICBjb25zdCBkb2NzOiBUW10gPSBbXTtcbiAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcbiAgICBjb25zdCBkb2MgPSBub3JtYWxpemVEYXRhKHJlc3VsdC5kYXRhKCkpIGFzIFQ7XG4gICAgZG9jcy5wdXNoKGRvYyk7XG4gIH0pO1xuICByZXR1cm4ge2RvY3N9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE51bURvY3NPcHRpb25zIHtcbiAgbW9kZTogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuICAvLyBUT0RPKHN0ZXZlbmxlKTogc3VwcG9ydCBmaWx0ZXJzLlxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkb2NzIGluIGEgUm9vdC5qcyBDTVMgY29sbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG51bURvY3MoXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICBvcHRpb25zOiBOdW1Eb2NzT3B0aW9uc1xuKSB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IGdjcFByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuZmlyZWJhc2VDb25maWcucHJvamVjdElkO1xuICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICBjb25zdCBhcHAgPSBnZXRGaXJlYmFzZUFwcChnY3BQcm9qZWN0SWQpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufWA7XG4gIGNvbnN0IHF1ZXJ5OiBRdWVyeSA9IGRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgLy8gVE9ETyhzdGV2ZW5sZSk6IHN1cHBvcnQgZmlsdGVycyBoZXJlLlxuICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuY291bnQoKS5nZXQoKTtcbiAgY29uc3QgY291bnQgPSByZXN1bHRzLmRhdGEoKS5jb3VudDtcbiAgcmV0dXJuIGNvdW50O1xufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBzY2hlZHVsZWQgZG9jcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hTY2hlZHVsZWREb2NzKHJvb3RDb25maWc6IFJvb3RDb25maWcpIHtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBwcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgY29uc3QgZ2NwUHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5maXJlYmFzZUNvbmZpZy5wcm9qZWN0SWQ7XG4gIGNvbnN0IGFwcCA9IGdldEZpcmViYXNlQXBwKGdjcFByb2plY3RJZCk7XG4gIGNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGFwcCk7XG5cbiAgY29uc3QgcHJvamVjdENvbGxlY3Rpb25zUGF0aCA9IGBQcm9qZWN0cy8ke3Byb2plY3RJZH0vQ29sbGVjdGlvbnNgO1xuXG4gIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZGIuY29sbGVjdGlvbkdyb3VwKCdTY2hlZHVsZWQnKS5nZXQoKTtcbiAgY29uc3QgZG9jcyA9IHNuYXBzaG90LmRvY3NcbiAgICAuZmlsdGVyKChkKSA9PiBkLnJlZi5wYXRoLnN0YXJ0c1dpdGgocHJvamVjdENvbGxlY3Rpb25zUGF0aCkpXG4gICAgLm1hcCgoZCkgPT4ge1xuICAgICAgY29uc3QgZGJQYXRoID0gZC5yZWYucGF0aDtcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gZGJQYXRoLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCBzbHVnID0gc2VnbWVudHMuYXQoLTEpO1xuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IHNlZ21lbnRzLmF0KC0zKTtcbiAgICAgIGNvbnN0IGlkID0gYCR7Y29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBkLmRhdGEoKSxcbiAgICAgICAgaWQsXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIHNsdWcsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gIGlmIChkb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUubG9nKCdubyBkb2NzIHRvIHNjaGVkdWxlJyk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8gRWFjaCB0cmFuc2FjdGlvbiBvciBiYXRjaCBjYW4gd3JpdGUgYSBtYXggb2YgNTAwIG9wcy5cbiAgLy8gaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvZmlyZXN0b3JlL21hbmFnZS1kYXRhL3RyYW5zYWN0aW9uc1xuICBsZXQgYmF0Y2hDb3VudCA9IDA7XG4gIGNvbnN0IGJhdGNoID0gZGIuYmF0Y2goKTtcbiAgY29uc3QgcHVibGlzaGVkRG9jczogYW55W10gPSBbXTtcbiAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgIGNvbnN0IHtpZCwgY29sbGVjdGlvbiwgc2x1ZywgZGF0YX0gPSBkb2M7XG4gICAgY29uc3QgZHJhZnRSZWYgPSBkYi5kb2MoXG4gICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L0RyYWZ0cy8ke3NsdWd9YFxuICAgICk7XG4gICAgY29uc3Qgc2NoZWR1bGVkUmVmID0gZGIuZG9jKFxuICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9TY2hlZHVsZWQvJHtzbHVnfWBcbiAgICApO1xuICAgIGNvbnN0IHB1Ymxpc2hlZFJlZiA9IGRiLmRvYyhcbiAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vUHVibGlzaGVkLyR7c2x1Z31gXG4gICAgKTtcbiAgICBjb25zdCB7c2NoZWR1bGVkQXQsIHNjaGVkdWxlZEJ5LCAuLi5zeXN9ID0gZGF0YS5zeXMgfHwge307XG5cbiAgICAvLyBTYXZlIHB1Ymxpc2hlZCBkb2MuXG4gICAgYmF0Y2guc2V0KHB1Ymxpc2hlZFJlZiwge1xuICAgICAgaWQsXG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgc2x1ZyxcbiAgICAgIGZpZWxkczogZGF0YS5maWVsZHMgfHwge30sXG4gICAgICBzeXM6IHtcbiAgICAgICAgLi4uc3lzLFxuICAgICAgICAvLyBPbmx5IHVwZGF0ZSBgZmlyc3RQdWJsaXNoZWRgIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAgICAgICAgZmlyc3RQdWJsaXNoZWRBdDogc3lzLmZpcnN0UHVibGlzaGVkQXQgPz8gc2NoZWR1bGVkQXQsXG4gICAgICAgIGZpcnN0UHVibGlzaGVkQnk6IHN5cy5maXJzdFB1Ymxpc2hlZEJ5ID8/IChzY2hlZHVsZWRCeSB8fCAnJyksXG4gICAgICAgIHB1Ymxpc2hlZEF0OiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICBwdWJsaXNoZWRCeTogc2NoZWR1bGVkQnkgfHwgJycsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgIC8vIFJlbW92ZSBwdWJsaXNoZWQgZG9jLlxuICAgIGJhdGNoLmRlbGV0ZShzY2hlZHVsZWRSZWYpO1xuICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgZHJhZnQgZG9jIHRvIHJlbW92ZSBgc2NoZWR1bGVkQXRgIGFuZCBgc2NoZWR1bGVkQnlgIGZpZWxkc1xuICAgIC8vIGFuZCB1cGRhdGUgdGhlIGBwdWJsaXNoZWRBdGAgYW5kIGBwdWJsaXNoZWRCeWAgZmllbGRzLlxuICAgIGJhdGNoLnVwZGF0ZShkcmFmdFJlZiwge1xuICAgICAgJ3N5cy5zY2hlZHVsZWRBdCc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAnc3lzLnNjaGVkdWxlZEJ5JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICdzeXMucHVibGlzaGVkQXQnOiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgJ3N5cy5wdWJsaXNoZWRCeSc6IHNjaGVkdWxlZEJ5IHx8ICcnLFxuICAgIH0pO1xuICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgIHB1Ymxpc2hlZERvY3MucHVzaChkb2MpO1xuXG4gICAgaWYgKGJhdGNoQ291bnQgPj0gNDk4KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgY29uc29sZS5sb2coYHB1Ymxpc2hlZCAke3B1Ymxpc2hlZERvY3MubGVuZ3RofSBkb2NzIWApO1xuICByZXR1cm4gcHVibGlzaGVkRG9jcztcbn1cblxuLyoqXG4gKiBXYWxrcyB0aGUgZGF0YSB0cmVlIGFuZCBjb252ZXJ0cyBhbnkgVGltZXN0YW1wIG9iamVjdHMgdG8gbWlsbGlzIGFuZCBhbnlcbiAqIF9hcnJheSBtYXBzIHRvIG5vcm1hbCBhcnJheXMuXG4gKlxuICogRS5nLjpcbiAqXG4gKiBub3JtYWxpemVEYXRhKHtcbiAqICAgc3lzOiB7bW9kaWZpZWRBdDogVGltZXN0YW1wKDEyMyl9LFxuICogICBmaWVsZHM6IHtcbiAqICAgICBfYXJyYXk6IFsnYXNkZiddLFxuICogICAgIGFzZGY6IHt0aXRsZTogJ2hlbGxvJ31cbiAqICAgfVxuICogfSlcbiAqIC8vID0+IHtzeXM6IHttb2RpZmllZEF0OiAxMjN9LCBmaWVsZHM6IHtmb286IFt7dGl0bGU6ICdoZWxsbyd9XX19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVEYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICBjb25zdCB2YWwgPSBkYXRhW2tleV07XG4gICAgaWYgKGlzT2JqZWN0KHZhbCkpIHtcbiAgICAgIGlmICh2YWwudG9NaWxsaXMpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWwudG9NaWxsaXMoKTtcbiAgICAgIH0gZWxzZSBpZiAoT2JqZWN0Lmhhc093bih2YWwsICdfYXJyYXknKSAmJiBBcnJheS5pc0FycmF5KHZhbC5fYXJyYXkpKSB7XG4gICAgICAgIGNvbnN0IGFyciA9IHZhbC5fYXJyYXkubWFwKChrOiBzdHJpbmcpID0+IG5vcm1hbGl6ZURhdGEodmFsW2tdIHx8IHt9KSk7XG4gICAgICAgIHJlc3VsdFtrZXldID0gYXJyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBub3JtYWxpemVEYXRhKHZhbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhICE9PSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWc6IFJvb3RDb25maWcpOiBDTVNQbHVnaW4ge1xuICBjb25zdCBwbHVnaW5zOiBQbHVnaW5bXSA9IHJvb3RDb25maWcucGx1Z2lucyB8fCBbXTtcbiAgY29uc3QgcGx1Z2luID0gcGx1Z2lucy5maW5kKChwbHVnaW4pID0+IHBsdWdpbi5uYW1lID09PSAncm9vdC1jbXMnKTtcbiAgaWYgKCFwbHVnaW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCBmaW5kIHJvb3QtY21zIHBsdWdpbiBjb25maWcgaW4gcm9vdC5jb25maWcudHMnKTtcbiAgfVxuICByZXR1cm4gcGx1Z2luIGFzIENNU1BsdWdpbjtcbn1cbiIsICJpbXBvcnQge2dldFNlY3VyaXR5UnVsZXN9IGZyb20gJ2ZpcmViYXNlLWFkbWluL3NlY3VyaXR5LXJ1bGVzJztcblxuaW1wb3J0IHtnZXRGaXJlYmFzZUFwcH0gZnJvbSAnLi9ydW50aW1lLmpzJztcblxuZXhwb3J0IGNvbnN0IEZJUkVTVE9SRV9SVUxFUyA9IGBydWxlc192ZXJzaW9uID0gJzInO1xuc2VydmljZSBjbG91ZC5maXJlc3RvcmUge1xuICBtYXRjaCAvZGF0YWJhc2VzL3tkYXRhYmFzZX0vZG9jdW1lbnRzIHtcbiAgICBtYXRjaCAvUHJvamVjdHMve3Byb2plY3R9L3tkb2N1bWVudD0qKn0ge1xuICAgICAgYWxsb3cgd3JpdGU6XG4gICAgICAgIGlmIHJlcXVlc3QuYXV0aCAhPSBudWxsXG4gICAgICAgICYmIGV4aXN0cygvZGF0YWJhc2VzLyQoZGF0YWJhc2UpL2RvY3VtZW50cy9Qcm9qZWN0cy8kKHByb2plY3QpKVxuICAgICAgICAmJiBnZXQoL2RhdGFiYXNlcy8kKGRhdGFiYXNlKS9kb2N1bWVudHMvUHJvamVjdHMvJChwcm9qZWN0KSkuZGF0YS5yb2xlc1tyZXF1ZXN0LmF1dGgudG9rZW4uZW1haWxdIGluIFsnQURNSU4nLCAnRURJVE9SJ107XG4gICAgICBhbGxvdyByZWFkOlxuICAgICAgICBpZiByZXF1ZXN0LmF1dGggIT0gbnVsbFxuICAgICAgICAmJiBleGlzdHMoL2RhdGFiYXNlcy8kKGRhdGFiYXNlKS9kb2N1bWVudHMvUHJvamVjdHMvJChwcm9qZWN0KSlcbiAgICAgICAgJiYgZ2V0KC9kYXRhYmFzZXMvJChkYXRhYmFzZSkvZG9jdW1lbnRzL1Byb2plY3RzLyQocHJvamVjdCkpLmRhdGEucm9sZXNbcmVxdWVzdC5hdXRoLnRva2VuLmVtYWlsXSBpbiBbJ0FETUlOJywgJ0VESVRPUicsICdWSUVXRVInXTtcbiAgICB9XG5cbiAgICBtYXRjaCAvUHJvamVjdHMve3Byb2plY3R9L0NvbGxlY3Rpb25zL3tjb2xsZWN0aW9ufS97ZG9jdW1lbnQ9Kip9IHtcbiAgICAgIGFsbG93IHdyaXRlOlxuICAgICAgICBpZiByZXF1ZXN0LmF1dGggIT0gbnVsbFxuICAgICAgICAmJiBleGlzdHMoL2RhdGFiYXNlcy8kKGRhdGFiYXNlKS9kb2N1bWVudHMvUHJvamVjdHMvJChwcm9qZWN0KS9Db2xsZWN0aW9ucy8kKGNvbGxlY3Rpb24pKVxuICAgICAgICAmJiBnZXQoL2RhdGFiYXNlcy8kKGRhdGFiYXNlKS9kb2N1bWVudHMvUHJvamVjdHMvJChwcm9qZWN0KS9Db2xsZWN0aW9ucy8kKGNvbGxlY3Rpb24pKS5kYXRhLnJvbGVzW3JlcXVlc3QuYXV0aC50b2tlbi5lbWFpbF0gaW4gWydBRE1JTicsICdFRElUT1InXTtcbiAgICAgIGFsbG93IHJlYWQ6XG4gICAgICAgIGlmIHJlcXVlc3QuYXV0aCAhPSBudWxsXG4gICAgICAgICYmIGV4aXN0cygvZGF0YWJhc2VzLyQoZGF0YWJhc2UpL2RvY3VtZW50cy9Qcm9qZWN0cy8kKHByb2plY3QpL0NvbGxlY3Rpb25zLyQoY29sbGVjdGlvbikpXG4gICAgICAgICYmIGdldCgvZGF0YWJhc2VzLyQoZGF0YWJhc2UpL2RvY3VtZW50cy9Qcm9qZWN0cy8kKHByb2plY3QpL0NvbGxlY3Rpb25zLyQoY29sbGVjdGlvbikpLmRhdGEucm9sZXNbcmVxdWVzdC5hdXRoLnRva2VuLmVtYWlsXSBpbiBbJ0FETUlOJywgJ0VESVRPUicsICdWSUVXRVInXTtcbiAgICB9XG4gIH1cbn1cbmA7XG5cbi8qKlxuICogQWRkcyB0aGUgcm9vdC1jbXMgc2VjdXJpdHkgcnVsZXMgdG8gYSBGaXJlYmFzZSBwcm9qZWN0LlxuICogTk9URTogVGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgcnVsZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseVNlY3VyaXR5UnVsZXMocHJvamVjdElkOiBzdHJpbmcpIHtcbiAgY29uc3QgYXBwID0gZ2V0RmlyZWJhc2VBcHAocHJvamVjdElkKTtcbiAgY29uc3Qgc2VjdXJpdHlSdWxlcyA9IGdldFNlY3VyaXR5UnVsZXMoYXBwKTtcbiAgYXdhaXQgc2VjdXJpdHlSdWxlcy5yZWxlYXNlRmlyZXN0b3JlUnVsZXNldEZyb21Tb3VyY2UoRklSRVNUT1JFX1JVTEVTKTtcbn1cbiIsICJpbXBvcnQge1Jvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5cbmltcG9ydCB7Z2V0Q21zUGx1Z2lufSBmcm9tICcuLi8uLi9jb3JlL3J1bnRpbWUuanMnO1xuaW1wb3J0IHthcHBseVNlY3VyaXR5UnVsZXN9IGZyb20gJy4uLy4uL2NvcmUvc2VjdXJpdHkuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluaXRGaXJlYmFzZU9wdGlvbnMge1xuICAvKiogR0NQIHByb2plY3QgaWQuICovXG4gIHByb2plY3Q/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0RmlyZWJhc2Uocm9vdENvbmZpZzogUm9vdENvbmZpZykge1xuICByZXR1cm4gKG9wdGlvbnM6IEluaXRGaXJlYmFzZU9wdGlvbnMpID0+IHtcbiAgICBsZXQgZ2NwUHJvamVjdElkOiBzdHJpbmc7XG4gICAgaWYgKG9wdGlvbnMucHJvamVjdCkge1xuICAgICAgZ2NwUHJvamVjdElkID0gb3B0aW9ucy5wcm9qZWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gICAgICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICAgICAgZ2NwUHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5maXJlYmFzZUNvbmZpZy5wcm9qZWN0SWQ7XG4gICAgfVxuICAgIGlmICghZ2NwUHJvamVjdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpcmViYXNlQ29uZmlnLnByb2plY3RJZCBub3Qgc2V0IGluIGNtcyBwbHVnaW4gb3B0aW9ucycpO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBnY3AgcHJvamVjdDogJHtnY3BQcm9qZWN0SWR9YCk7XG4gICAgY29uc29sZS5sb2coJ1x1RDgzRFx1REM2RSB1cGRhdGluZyBzZWN1cml0eSBydWxlcy4uLicpO1xuICAgIGFwcGx5U2VjdXJpdHlSdWxlcyhnY3BQcm9qZWN0SWQpO1xuICAgIGNvbnNvbGUubG9nKCdkb25lIGluaXRpYWxpemluZyBmaXJlYmFzZSBwcm9qZWN0IScpO1xuICB9O1xufVxuIiwgImltcG9ydCB7cHJvbWlzZXMgYXMgZnN9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7ZmlsZVVSTFRvUGF0aH0gZnJvbSAnbm9kZTp1cmwnO1xuXG5pbXBvcnQge1Jvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge3ZpdGVTc3JMb2FkTW9kdWxlfSBmcm9tICdAYmxpbmtrL3Jvb3Qvbm9kZSc7XG5pbXBvcnQgKiBhcyBkb20gZnJvbSAnZHRzLWRvbSc7XG5cbmltcG9ydCB7RmllbGQsIFNjaGVtYX0gZnJvbSAnLi4vLi4vY29yZS9zY2hlbWEuanMnO1xuXG50eXBlIFByb2plY3RNb2R1bGUgPSB0eXBlb2YgaW1wb3J0KCcuLi8uLi9jb3JlL3Byb2plY3QuanMnKTtcbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUeXBlcyhyb290Q29uZmlnOiBSb290Q29uZmlnKSB7XG4gIGNvbnN0IHJvb3REaXIgPSByb290Q29uZmlnLnJvb3REaXI7XG4gIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbW9kdWxlUGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL3Byb2plY3QuanMnKTtcbiAgICBjb25zdCBwcm9qZWN0ID0gKGF3YWl0IHZpdGVTc3JMb2FkTW9kdWxlKFxuICAgICAgcm9vdENvbmZpZyxcbiAgICAgIG1vZHVsZVBhdGhcbiAgICApKSBhcyBQcm9qZWN0TW9kdWxlO1xuICAgIGNvbnN0IHNjaGVtYXMgPSBwcm9qZWN0LmdldFByb2plY3RTY2hlbWFzKCk7XG4gICAgY29uc29sZS5sb2coYGdlbmVyYXRpbmcgcm9vdC1jbXMuZC50cyBmcm9tICR7cm9vdERpcn0uLi5gKTtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXIsICdyb290LWNtcy5kLnRzJyk7XG4gICAgYXdhaXQgZ2VuZXJhdGVTY2hlbWFEdHMob3V0cHV0UGF0aCwgc2NoZW1hcyk7XG4gICAgY29uc29sZS5sb2coJ3NhdmVkIHJvb3QtY21zLmQudHMhJyk7XG4gIH07XG59XG5cbi8vIFRoZSBgZHRzLWRvbWAgcGFja2FnZSB1c2VzIDQtc3BhY2UgaW5kZW50cywgdXNlIHRoZSBzYW1lIGZvciBjb25zaXN0ZW5jeS5cbmNvbnN0IFRFTVBMQVRFID0gYC8qKiBSb290LmpzIENNUyB0eXBlcy4gVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU0RvYzxGaWVsZHMgZXh0ZW5kcyB7fT4ge1xuICAgIC8qKiBUaGUgaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzL2Zvby1iYXJcIi4gKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29sbGVjdGlvbiBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXNcIi4gKi9cbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZztcbiAgICAvKiogVGhlIHNsdWcgb2YgdGhlIGRvYywgZS5nLiBcImZvby1iYXJcIi4gKi9cbiAgICBzbHVnOiBzdHJpbmc7XG4gICAgLyoqIFN5c3RlbS1sZXZlbCBtZXRhZGF0YS4gKi9cbiAgICBzeXM6IHtcbiAgICAgICAgY3JlYXRlZEF0OiBudW1iZXI7XG4gICAgICAgIGNyZWF0ZWRCeTogc3RyaW5nO1xuICAgICAgICBtb2RpZmllZEF0OiBudW1iZXI7XG4gICAgICAgIG1vZGlmaWVkQnk6IHN0cmluZztcbiAgICAgICAgZmlyc3RQdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICAgICAgZmlyc3RQdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICAgICAgcHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgICAgIHB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xuICAgIH07XG4gICAgLyoqIFVzZXItZW50ZXJlZCBmaWVsZCB2YWx1ZXMgZnJvbSB0aGUgQ01TLiAqL1xuICAgIGZpZWxkcz86IEZpZWxkcztcbn1gO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJvb3QtY21zLmQudHMgZmlsZSBmcm9tIHRoZSAuc2NoZW1hLnRzIGZpbGVzIGluIHRoZSBwcm9qZWN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTY2hlbWFEdHMoXG4gIG91dHB1dFBhdGg6IHN0cmluZyxcbiAgc2NoZW1hczogUmVjb3JkPHN0cmluZywgU2NoZW1hPlxuKSB7XG4gIGNvbnN0IHJlc3VsdHMgPSBbVEVNUExBVEVdO1xuICBmb3IgKGNvbnN0IGZpbGVJZCBpbiBzY2hlbWFzKSB7XG4gICAgY29uc3Qgc2NoZW1hID0gc2NoZW1hc1tmaWxlSWRdO1xuICAgIHJlc3VsdHMucHVzaChyZW5kZXJTY2hlbWEoZmlsZUlkLCBzY2hlbWEpKTtcbiAgfVxuICBjb25zdCBvdXRwdXQgPSByZXN1bHRzXG4gICAgLmpvaW4oJ1xcblxcbicpXG4gICAgLnJlcGxhY2VBbGwoJy8qKiAgJywgJy8qKiAnKVxuICAgIC5yZXBsYWNlQWxsKCcgICovJywgJyAqLycpXG4gICAgLnJlcGxhY2UoL1xcclxcbnxcXHJ8XFxuL2csICdcXG4nKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKG91dHB1dFBhdGgsIG91dHB1dCwgJ3V0Zi04Jyk7XG59XG5cbmZ1bmN0aW9uIGZpZWxkUHJvcGVydHkoZmllbGQ6IEZpZWxkKTogZG9tLlByb3BlcnR5RGVjbGFyYXRpb24ge1xuICBjb25zdCBwcm9wID0gZG9tLmNyZWF0ZS5wcm9wZXJ0eShcbiAgICBmaWVsZC5pZCEsXG4gICAgZmllbGRUeXBlKGZpZWxkKSxcbiAgICBkb20uRGVjbGFyYXRpb25GbGFncy5PcHRpb25hbFxuICApO1xuICBjb25zdCBqc2RvYyA9IFtdO1xuICBpZiAoZmllbGQubGFiZWwpIHtcbiAgICBpZiAoZmllbGQuaGVscCkge1xuICAgICAganNkb2MucHVzaChgJHtmaWVsZC5sYWJlbH0uICR7ZmllbGQuaGVscH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAganNkb2MucHVzaChmaWVsZC5sYWJlbCk7XG4gICAgfVxuICB9XG4gIGlmIChmaWVsZC5kZXByZWNhdGVkKSB7XG4gICAganNkb2MucHVzaCgnQGRlcHJlY2F0ZWQnKTtcbiAgfVxuICBpZiAoanNkb2MubGVuZ3RoID4gMCkge1xuICAgIHByb3AuanNEb2NDb21tZW50ID0ganNkb2Muam9pbignXFxuJyk7XG4gIH1cbiAgcmV0dXJuIHByb3A7XG59XG5cbmZ1bmN0aW9uIGZpZWxkVHlwZShmaWVsZDogRmllbGQpOiBkb20uVHlwZSB7XG4gIGlmIChmaWVsZC50eXBlID09PSAnYXJyYXknKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLmFycmF5KGZpZWxkVHlwZShmaWVsZC5vZikpO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnaW1hZ2UnKSB7XG4gICAgcmV0dXJuIGRvbS5jcmVhdGUub2JqZWN0VHlwZShbXG4gICAgICBkb20uY3JlYXRlLnByb3BlcnR5KCdzcmMnLCBkb20udHlwZS5zdHJpbmcpLFxuICAgICAgZG9tLmNyZWF0ZS5wcm9wZXJ0eShcbiAgICAgICAgJ2FsdCcsXG4gICAgICAgIGRvbS50eXBlLnN0cmluZyxcbiAgICAgICAgZG9tLkRlY2xhcmF0aW9uRmxhZ3MuT3B0aW9uYWxcbiAgICAgICksXG4gICAgICBkb20uY3JlYXRlLnByb3BlcnR5KFxuICAgICAgICAnd2lkdGgnLFxuICAgICAgICBkb20udHlwZS5udW1iZXIsXG4gICAgICAgIGRvbS5EZWNsYXJhdGlvbkZsYWdzLk9wdGlvbmFsXG4gICAgICApLFxuICAgICAgZG9tLmNyZWF0ZS5wcm9wZXJ0eShcbiAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgIGRvbS50eXBlLm51bWJlcixcbiAgICAgICAgZG9tLkRlY2xhcmF0aW9uRmxhZ3MuT3B0aW9uYWxcbiAgICAgICksXG4gICAgXSk7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaWxlJykge1xuICAgIHJldHVybiBkb20uY3JlYXRlLm9iamVjdFR5cGUoW2RvbS5jcmVhdGUucHJvcGVydHkoJ3NyYycsIGRvbS50eXBlLnN0cmluZyldKTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgIHJldHVybiBkb20udHlwZS5hcnJheShkb20udHlwZS5zdHJpbmcpO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnc2VsZWN0Jykge1xuICAgIHJldHVybiBkb20udHlwZS5zdHJpbmc7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLnN0cmluZztcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBzdWJwcm9wZXJ0aWVzID0gKGZpZWxkLmZpZWxkcyB8fCBbXSkubWFwKChmKSA9PiBmaWVsZFByb3BlcnR5KGYpKTtcbiAgICByZXR1cm4gZG9tLmNyZWF0ZS5vYmplY3RUeXBlKHN1YnByb3BlcnRpZXMpO1xuICB9XG4gIHJldHVybiBkb20udHlwZS51bmtub3duO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTY2hlbWEoZmlsZUlkOiBzdHJpbmcsIHNjaGVtYTogU2NoZW1hKTogc3RyaW5nIHtcbiAgY29uc3QganNkb2MgPSBgR2VuZXJhdGVkIGZyb20gXFxgJHtmaWxlSWR9XFxgLmA7XG4gIGNvbnN0IGlkID0gcGF0aC5wYXJzZShmaWxlSWQpLm5hbWUuc3BsaXQoJy4nKVswXTtcbiAgY29uc3QgZmllbGRzSW50ZXJmYWNlID0gYCR7aWR9RmllbGRzYDtcbiAgY29uc3QgZmllbGRzID0gZG9tLmNyZWF0ZS5pbnRlcmZhY2UoXG4gICAgZmllbGRzSW50ZXJmYWNlLFxuICAgIGRvbS5EZWNsYXJhdGlvbkZsYWdzLkV4cG9ydFxuICApO1xuICBmaWVsZHMuanNEb2NDb21tZW50ID0ganNkb2M7XG4gIGZvciAoY29uc3QgZmllbGQgb2Ygc2NoZW1hLmZpZWxkcykge1xuICAgIGlmICghZmllbGQuaWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmaWVsZHMubWVtYmVycy5wdXNoKGZpZWxkUHJvcGVydHkoZmllbGQpKTtcbiAgfVxuXG4gIGNvbnN0IGZpZWxkc1R5cGVPdXRwdXQgPSBkb21cbiAgICAuZW1pdChmaWVsZHMsIHtzaW5nbGVMaW5lSnNEb2NDb21tZW50czogdHJ1ZX0pXG4gICAgLnRyaW0oKTtcbiAgaWYgKGZpbGVJZC5zdGFydHNXaXRoKCcvY29sbGVjdGlvbnMvJykpIHtcbiAgICBjb25zdCBiYXNlVHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TRG9jJyk7XG4gICAgYmFzZVR5cGUudHlwZUFyZ3VtZW50cy5wdXNoKGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKGZpZWxkc0ludGVyZmFjZSkpO1xuICAgIGNvbnN0IGRvY1R5cGUgPSBkb20uY3JlYXRlLmFsaWFzKFxuICAgICAgYCR7aWR9RG9jYCxcbiAgICAgIGJhc2VUeXBlLFxuICAgICAgZG9tLkRlY2xhcmF0aW9uRmxhZ3MuRXhwb3J0XG4gICAgKTtcbiAgICBkb2NUeXBlLmpzRG9jQ29tbWVudCA9IGpzZG9jO1xuXG4gICAgY29uc3QgZG9jVHlwZU91dHB1dCA9IGRvbVxuICAgICAgLmVtaXQoZG9jVHlwZSwge3NpbmdsZUxpbmVKc0RvY0NvbW1lbnRzOiB0cnVlfSlcbiAgICAgIC50cmltKCk7XG4gICAgcmV0dXJuIGZpZWxkc1R5cGVPdXRwdXQgKyAnXFxuXFxuJyArIGRvY1R5cGVPdXRwdXQ7XG4gIH1cbiAgcmV0dXJuIGZpZWxkc1R5cGVPdXRwdXQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQ0EsU0FBUSxvQkFBb0IsUUFBUSxxQkFBb0I7QUFDeEQsU0FBUSxZQUFtQixvQkFBbUI7QUFJOUMsSUFBTSxXQUFXO0FBRVYsU0FBUyxlQUFlLGNBQXNCO0FBQ25ELE1BQUk7QUFDRixXQUFPLE9BQU8sUUFBUTtBQUFBLEVBQ3hCLFNBQVMsS0FBUDtBQUNBLFFBQUksT0FBTyxJQUFJLFNBQVMsY0FBYztBQUNwQyxhQUFPO0FBQUEsUUFDTDtBQUFBLFVBQ0UsV0FBVztBQUFBLFVBQ1gsWUFBWSxtQkFBbUI7QUFBQSxRQUNqQztBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUNBLFVBQU07QUFBQSxFQUNSO0FBQ0Y7QUFxUE8sU0FBUyxhQUFhLFlBQW1DO0FBQzlELFFBQU0sVUFBb0IsV0FBVyxXQUFXLENBQUM7QUFDakQsUUFBTSxTQUFTLFFBQVEsS0FBSyxDQUFDQSxZQUFXQSxRQUFPLFNBQVMsVUFBVTtBQUNsRSxNQUFJ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
package/dist/core.d.ts CHANGED
@@ -33,6 +33,10 @@ interface NumDocsOptions {
33
33
  * Returns the number of docs in a Root.js CMS collection.
34
34
  */
35
35
  declare function numDocs(rootConfig: RootConfig, collectionId: string, options: NumDocsOptions): Promise<number>;
36
+ /**
37
+ * Publishes scheduled docs.
38
+ */
39
+ declare function publishScheduledDocs(rootConfig: RootConfig): Promise<any[]>;
36
40
  /**
37
41
  * Walks the data tree and converts any Timestamp objects to millis and any
38
42
  * _array maps to normal arrays.
@@ -51,4 +55,4 @@ declare function numDocs(rootConfig: RootConfig, collectionId: string, options:
51
55
  declare function normalizeData(data: any): any;
52
56
  declare function getCmsPlugin(rootConfig: RootConfig): CMSPlugin;
53
57
 
54
- export { GetDocOptions, ListDocsOptions, NumDocsOptions, getCmsPlugin, getDoc, getFirebaseApp, listDocs, normalizeData, numDocs };
58
+ export { GetDocOptions, ListDocsOptions, NumDocsOptions, getCmsPlugin, getDoc, getFirebaseApp, listDocs, normalizeData, numDocs, publishScheduledDocs };
package/dist/core.js CHANGED
@@ -70,17 +70,24 @@ function defineCollection(collection2) {
70
70
  var collection = defineCollection;
71
71
 
72
72
  // core/runtime.ts
73
- import { initializeApp, getApps, applicationDefault } from "firebase-admin/app";
74
- import { getFirestore } from "firebase-admin/firestore";
73
+ import { applicationDefault, getApp, initializeApp } from "firebase-admin/app";
74
+ import { FieldValue, getFirestore } from "firebase-admin/firestore";
75
+ var APP_NAME = "root-cms";
75
76
  function getFirebaseApp(gcpProjectId) {
76
- const apps = getApps();
77
- if (apps.length > 0 && apps[0]) {
78
- return apps[0];
77
+ try {
78
+ return getApp(APP_NAME);
79
+ } catch (err) {
80
+ if (err && err.code === "app/no-app") {
81
+ return initializeApp(
82
+ {
83
+ projectId: gcpProjectId,
84
+ credential: applicationDefault()
85
+ },
86
+ APP_NAME
87
+ );
88
+ }
89
+ throw err;
79
90
  }
80
- return initializeApp({
81
- projectId: gcpProjectId,
82
- credential: applicationDefault()
83
- });
84
91
  }
85
92
  async function getDoc(rootConfig, collectionId, slug, options) {
86
93
  const cmsPlugin = getCmsPlugin(rootConfig);
@@ -145,6 +152,79 @@ async function numDocs(rootConfig, collectionId, options) {
145
152
  const count = results.data().count;
146
153
  return count;
147
154
  }
155
+ async function publishScheduledDocs(rootConfig) {
156
+ const cmsPlugin = getCmsPlugin(rootConfig);
157
+ const cmsPluginOptions = cmsPlugin.getConfig();
158
+ const projectId = cmsPluginOptions.id || "default";
159
+ const gcpProjectId = cmsPluginOptions.firebaseConfig.projectId;
160
+ const app = getFirebaseApp(gcpProjectId);
161
+ const db = getFirestore(app);
162
+ const projectCollectionsPath = `Projects/${projectId}/Collections`;
163
+ const snapshot = await db.collectionGroup("Scheduled").get();
164
+ const docs = snapshot.docs.filter((d) => d.ref.path.startsWith(projectCollectionsPath)).map((d) => {
165
+ const dbPath = d.ref.path;
166
+ const segments = dbPath.split("/");
167
+ const slug = segments.at(-1);
168
+ const collection2 = segments.at(-3);
169
+ const id = `${collection2}/${slug}`;
170
+ return {
171
+ data: d.data(),
172
+ id,
173
+ collection: collection2,
174
+ slug
175
+ };
176
+ });
177
+ if (docs.length === 0) {
178
+ console.log("no docs to schedule");
179
+ return [];
180
+ }
181
+ let batchCount = 0;
182
+ const batch = db.batch();
183
+ const publishedDocs = [];
184
+ for (const doc of docs) {
185
+ const { id, collection: collection2, slug, data } = doc;
186
+ const draftRef = db.doc(
187
+ `${projectCollectionsPath}/${collection2}/Drafts/${slug}`
188
+ );
189
+ const scheduledRef = db.doc(
190
+ `${projectCollectionsPath}/${collection2}/Scheduled/${slug}`
191
+ );
192
+ const publishedRef = db.doc(
193
+ `${projectCollectionsPath}/${collection2}/Published/${slug}`
194
+ );
195
+ const { scheduledAt, scheduledBy, ...sys } = data.sys || {};
196
+ batch.set(publishedRef, {
197
+ id,
198
+ collection: collection2,
199
+ slug,
200
+ fields: data.fields || {},
201
+ sys: {
202
+ ...sys,
203
+ firstPublishedAt: sys.firstPublishedAt ?? scheduledAt,
204
+ firstPublishedBy: sys.firstPublishedBy ?? (scheduledBy || ""),
205
+ publishedAt: FieldValue.serverTimestamp(),
206
+ publishedBy: scheduledBy || ""
207
+ }
208
+ });
209
+ batchCount += 1;
210
+ batch.delete(scheduledRef);
211
+ batchCount += 1;
212
+ batch.update(draftRef, {
213
+ "sys.scheduledAt": FieldValue.delete(),
214
+ "sys.scheduledBy": FieldValue.delete(),
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
+ }
148
228
  function normalizeData(data) {
149
229
  const result = {};
150
230
  for (const key in data) {
@@ -182,6 +262,7 @@ export {
182
262
  listDocs,
183
263
  normalizeData,
184
264
  numDocs,
265
+ publishScheduledDocs,
185
266
  schema_exports as schema
186
267
  };
187
- //# 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/OiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29sbGVjdGlvbihjb2xsZWN0aW9uOiBDb2xsZWN0aW9uKTogQ29sbGVjdGlvbiB7XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5leHBvcnQgY29uc3QgY29sbGVjdGlvbiA9IGRlZmluZUNvbGxlY3Rpb247XG4iLCAiaW1wb3J0IHtQbHVnaW4sIFJvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge2luaXRpYWxpemVBcHAsIGdldEFwcHMsIGFwcGxpY2F0aW9uRGVmYXVsdH0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vYXBwJztcbmltcG9ydCB7UXVlcnksIGdldEZpcmVzdG9yZX0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vZmlyZXN0b3JlJztcblxuaW1wb3J0IHtDTVNQbHVnaW59IGZyb20gJy4vcGx1Z2luLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcmViYXNlQXBwKGdjcFByb2plY3RJZDogc3RyaW5nKSB7XG4gIGNvbnN0IGFwcHMgPSBnZXRBcHBzKCk7XG4gIGlmIChhcHBzLmxlbmd0aCA+IDAgJiYgYXBwc1swXSkge1xuICAgIHJldHVybiBhcHBzWzBdO1xuICB9XG4gIHJldHVybiBpbml0aWFsaXplQXBwKHtcbiAgICBwcm9qZWN0SWQ6IGdjcFByb2plY3RJZCxcbiAgICBjcmVkZW50aWFsOiBhcHBsaWNhdGlvbkRlZmF1bHQoKSxcbiAgfSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RG9jT3B0aW9ucyB7XG4gIG1vZGU6ICdkcmFmdCcgfCAncHVibGlzaGVkJztcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBkb2MgZnJvbSBSb290LmpzIENNUy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERvYzxUPihcbiAgcm9vdENvbmZpZzogUm9vdENvbmZpZyxcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gIHNsdWc6IHN0cmluZyxcbiAgb3B0aW9uczogR2V0RG9jT3B0aW9uc1xuKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBnY3BQcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmZpcmViYXNlQ29uZmlnLnByb2plY3RJZDtcbiAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgY29uc3QgYXBwID0gZ2V0RmlyZWJhc2VBcHAoZ2NwUHJvamVjdElkKTtcbiAgY29uc3QgZGIgPSBnZXRGaXJlc3RvcmUoYXBwKTtcbiAgLy8gU2x1Z3Mgd2l0aCBzbGFzaGVzIGFyZSBlbmNvZGVkIGFzIGAtLWAgaW4gdGhlIERCLlxuICBzbHVnID0gc2x1Zy5yZXBsYWNlQWxsKCcvJywgJy0tJyk7XG4gIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3Byb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259LyR7c2x1Z31gO1xuICBjb25zdCBkb2NSZWYgPSBkYi5kb2MoZGJQYXRoKTtcbiAgY29uc3QgZG9jID0gYXdhaXQgZG9jUmVmLmdldCgpO1xuICBpZiAoZG9jLmV4aXN0cykge1xuICAgIGNvbnN0IGRhdGEgPSBkb2MuZGF0YSgpO1xuICAgIHJldHVybiBub3JtYWxpemVEYXRhKGRhdGEpIGFzIFQ7XG4gIH1cbiAgY29uc29sZS5sb2coYGRvYyBub3QgZm91bmQ6ICR7ZGJQYXRofWApO1xuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0RG9jc09wdGlvbnMge1xuICBtb2RlOiAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG4gIG9mZnNldD86IG51bWJlcjtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIG9yZGVyQnk/OiBzdHJpbmc7XG4gIG9yZGVyQnlEaXJlY3Rpb24/OiAnYXNjJyB8ICdkZXNjJztcbiAgLy8gVE9ETyhzdGV2ZW5sZSk6IHN1cHBvcnQgZmlsdGVycy5cbn1cblxuLyoqXG4gKiBMaXN0cyBkb2NzIGZyb20gYSBSb290LmpzIENNUyBjb2xsZWN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdERvY3M8VD4oXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICBvcHRpb25zOiBMaXN0RG9jc09wdGlvbnNcbik6IFByb21pc2U8e2RvY3M6IFRbXX0+IHtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBwcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgY29uc3QgZ2NwUHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5maXJlYmFzZUNvbmZpZy5wcm9qZWN0SWQ7XG4gIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gIGNvbnN0IGFwcCA9IGdldEZpcmViYXNlQXBwKGdjcFByb2plY3RJZCk7XG4gIGNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGFwcCk7XG4gIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3Byb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259YDtcbiAgbGV0IHF1ZXJ5OiBRdWVyeSA9IGRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgaWYgKG9wdGlvbnMubGltaXQpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5LmxpbWl0KG9wdGlvbnMubGltaXQpO1xuICB9XG4gIGlmIChvcHRpb25zLm9mZnNldCkge1xuICAgIHF1ZXJ5ID0gcXVlcnkub2Zmc2V0KG9wdGlvbnMub2Zmc2V0KTtcbiAgfVxuICBpZiAob3B0aW9ucy5vcmRlckJ5KSB7XG4gICAgcXVlcnkgPSBxdWVyeS5vcmRlckJ5KG9wdGlvbnMub3JkZXJCeSwgb3B0aW9ucy5vcmRlckJ5RGlyZWN0aW9uKTtcbiAgfVxuICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gIGNvbnN0IGRvY3M6IFRbXSA9IFtdO1xuICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xuICAgIGNvbnN0IGRvYyA9IG5vcm1hbGl6ZURhdGEocmVzdWx0LmRhdGEoKSkgYXMgVDtcbiAgICBkb2NzLnB1c2goZG9jKTtcbiAgfSk7XG4gIHJldHVybiB7ZG9jc307XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTnVtRG9jc09wdGlvbnMge1xuICBtb2RlOiAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG4gIC8vIFRPRE8oc3RldmVubGUpOiBzdXBwb3J0IGZpbHRlcnMuXG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRvY3MgaW4gYSBSb290LmpzIENNUyBjb2xsZWN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbnVtRG9jcyhcbiAgcm9vdENvbmZpZzogUm9vdENvbmZpZyxcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IE51bURvY3NPcHRpb25zXG4pIHtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBwcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgY29uc3QgZ2NwUHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5maXJlYmFzZUNvbmZpZy5wcm9qZWN0SWQ7XG4gIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gIGNvbnN0IGFwcCA9IGdldEZpcmViYXNlQXBwKGdjcFByb2plY3RJZCk7XG4gIGNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGFwcCk7XG4gIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3Byb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259YDtcbiAgY29uc3QgcXVlcnk6IFF1ZXJ5ID0gZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICAvLyBUT0RPKHN0ZXZlbmxlKTogc3VwcG9ydCBmaWx0ZXJzIGhlcmUuXG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeS5jb3VudCgpLmdldCgpO1xuICBjb25zdCBjb3VudCA9IHJlc3VsdHMuZGF0YSgpLmNvdW50O1xuICByZXR1cm4gY291bnQ7XG59XG5cbi8qKlxuICogV2Fsa3MgdGhlIGRhdGEgdHJlZSBhbmQgY29udmVydHMgYW55IFRpbWVzdGFtcCBvYmplY3RzIHRvIG1pbGxpcyBhbmQgYW55XG4gKiBfYXJyYXkgbWFwcyB0byBub3JtYWwgYXJyYXlzLlxuICpcbiAqIEUuZy46XG4gKlxuICogbm9ybWFsaXplRGF0YSh7XG4gKiAgIHN5czoge21vZGlmaWVkQXQ6IFRpbWVzdGFtcCgxMjMpfSxcbiAqICAgZmllbGRzOiB7XG4gKiAgICAgX2FycmF5OiBbJ2FzZGYnXSxcbiAqICAgICBhc2RmOiB7dGl0bGU6ICdoZWxsbyd9XG4gKiAgIH1cbiAqIH0pXG4gKiAvLyA9PiB7c3lzOiB7bW9kaWZpZWRBdDogMTIzfSwgZmllbGRzOiB7Zm9vOiBbe3RpdGxlOiAnaGVsbG8nfV19fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRGF0YShkYXRhOiBhbnkpOiBhbnkge1xuICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgY29uc3QgdmFsID0gZGF0YVtrZXldO1xuICAgIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgICBpZiAodmFsLnRvTWlsbGlzKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsLnRvTWlsbGlzKCk7XG4gICAgICB9IGVsc2UgaWYgKE9iamVjdC5oYXNPd24odmFsLCAnX2FycmF5JykgJiYgQXJyYXkuaXNBcnJheSh2YWwuX2FycmF5KSkge1xuICAgICAgICBjb25zdCBhcnIgPSB2YWwuX2FycmF5Lm1hcCgoazogc3RyaW5nKSA9PiBub3JtYWxpemVEYXRhKHZhbFtrXSB8fCB7fSkpO1xuICAgICAgICByZXN1bHRba2V5XSA9IGFycjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gbm9ybWFsaXplRGF0YSh2YWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkgJiYgZGF0YSAhPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENtc1BsdWdpbihyb290Q29uZmlnOiBSb290Q29uZmlnKTogQ01TUGx1Z2luIHtcbiAgY29uc3QgcGx1Z2luczogUGx1Z2luW10gPSByb290Q29uZmlnLnBsdWdpbnMgfHwgW107XG4gIGNvbnN0IHBsdWdpbiA9IHBsdWdpbnMuZmluZCgocGx1Z2luKSA9PiBwbHVnaW4ubmFtZSA9PT0gJ3Jvb3QtY21zJyk7XG4gIGlmICghcGx1Z2luKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCByb290LWNtcyBwbHVnaW4gY29uZmlnIGluIHJvb3QuY29uZmlnLnRzJyk7XG4gIH1cbiAgcmV0dXJuIHBsdWdpbiBhcyBDTVNQbHVnaW47XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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
268
+ //# 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/OiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29sbGVjdGlvbihjb2xsZWN0aW9uOiBDb2xsZWN0aW9uKTogQ29sbGVjdGlvbiB7XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5leHBvcnQgY29uc3QgY29sbGVjdGlvbiA9IGRlZmluZUNvbGxlY3Rpb247XG4iLCAiaW1wb3J0IHtQbHVnaW4sIFJvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge2FwcGxpY2F0aW9uRGVmYXVsdCwgZ2V0QXBwLCBpbml0aWFsaXplQXBwfSBmcm9tICdmaXJlYmFzZS1hZG1pbi9hcHAnO1xuaW1wb3J0IHtGaWVsZFZhbHVlLCBRdWVyeSwgZ2V0RmlyZXN0b3JlfSBmcm9tICdmaXJlYmFzZS1hZG1pbi9maXJlc3RvcmUnO1xuXG5pbXBvcnQge0NNU1BsdWdpbn0gZnJvbSAnLi9wbHVnaW4uanMnO1xuXG5jb25zdCBBUFBfTkFNRSA9ICdyb290LWNtcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaXJlYmFzZUFwcChnY3BQcm9qZWN0SWQ6IHN0cmluZykge1xuICB0cnkge1xuICAgIHJldHVybiBnZXRBcHAoQVBQX05BTUUpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnYXBwL25vLWFwcCcpIHtcbiAgICAgIHJldHVybiBpbml0aWFsaXplQXBwKFxuICAgICAgICB7XG4gICAgICAgICAgcHJvamVjdElkOiBnY3BQcm9qZWN0SWQsXG4gICAgICAgICAgY3JlZGVudGlhbDogYXBwbGljYXRpb25EZWZhdWx0KCksXG4gICAgICAgIH0sXG4gICAgICAgIEFQUF9OQU1FXG4gICAgICApO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXREb2NPcHRpb25zIHtcbiAgbW9kZTogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhIGRvYyBmcm9tIFJvb3QuanMgQ01TLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RG9jPFQ+KFxuICByb290Q29uZmlnOiBSb290Q29uZmlnLFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgc2x1Zzogc3RyaW5nLFxuICBvcHRpb25zOiBHZXREb2NPcHRpb25zXG4pOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IGdjcFByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuZmlyZWJhc2VDb25maWcucHJvamVjdElkO1xuICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICBjb25zdCBhcHAgPSBnZXRGaXJlYmFzZUFwcChnY3BQcm9qZWN0SWQpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuICAvLyBTbHVncyB3aXRoIHNsYXNoZXMgYXJlIGVuY29kZWQgYXMgYC0tYCBpbiB0aGUgREIuXG4gIHNsdWcgPSBzbHVnLnJlcGxhY2VBbGwoJy8nLCAnLS0nKTtcbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gIGNvbnN0IGRvY1JlZiA9IGRiLmRvYyhkYlBhdGgpO1xuICBjb25zdCBkb2MgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gIGlmIChkb2MuZXhpc3RzKSB7XG4gICAgY29uc3QgZGF0YSA9IGRvYy5kYXRhKCk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZURhdGEoZGF0YSkgYXMgVDtcbiAgfVxuICBjb25zb2xlLmxvZyhgZG9jIG5vdCBmb3VuZDogJHtkYlBhdGh9YCk7XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3REb2NzT3B0aW9ucyB7XG4gIG1vZGU6ICdkcmFmdCcgfCAncHVibGlzaGVkJztcbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbiAgb3JkZXJCeT86IHN0cmluZztcbiAgb3JkZXJCeURpcmVjdGlvbj86ICdhc2MnIHwgJ2Rlc2MnO1xuICAvLyBUT0RPKHN0ZXZlbmxlKTogc3VwcG9ydCBmaWx0ZXJzLlxufVxuXG4vKipcbiAqIExpc3RzIGRvY3MgZnJvbSBhIFJvb3QuanMgQ01TIGNvbGxlY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0RG9jczxUPihcbiAgcm9vdENvbmZpZzogUm9vdENvbmZpZyxcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IExpc3REb2NzT3B0aW9uc1xuKTogUHJvbWlzZTx7ZG9jczogVFtdfT4ge1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBnY3BQcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmZpcmViYXNlQ29uZmlnLnByb2plY3RJZDtcbiAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgY29uc3QgYXBwID0gZ2V0RmlyZWJhc2VBcHAoZ2NwUHJvamVjdElkKTtcbiAgY29uc3QgZGIgPSBnZXRGaXJlc3RvcmUoYXBwKTtcbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICBsZXQgcXVlcnk6IFF1ZXJ5ID0gZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICBpZiAob3B0aW9ucy5saW1pdCkge1xuICAgIHF1ZXJ5ID0gcXVlcnkubGltaXQob3B0aW9ucy5saW1pdCk7XG4gIH1cbiAgaWYgKG9wdGlvbnMub2Zmc2V0KSB7XG4gICAgcXVlcnkgPSBxdWVyeS5vZmZzZXQob3B0aW9ucy5vZmZzZXQpO1xuICB9XG4gIGlmIChvcHRpb25zLm9yZGVyQnkpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5Lm9yZGVyQnkob3B0aW9ucy5vcmRlckJ5LCBvcHRpb25zLm9yZGVyQnlEaXJlY3Rpb24pO1xuICB9XG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeS5nZXQoKTtcbiAgY29uc3QgZG9jczogVFtdID0gW107XG4gIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XG4gICAgY29uc3QgZG9jID0gbm9ybWFsaXplRGF0YShyZXN1bHQuZGF0YSgpKSBhcyBUO1xuICAgIGRvY3MucHVzaChkb2MpO1xuICB9KTtcbiAgcmV0dXJuIHtkb2NzfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOdW1Eb2NzT3B0aW9ucyB7XG4gIG1vZGU6ICdkcmFmdCcgfCAncHVibGlzaGVkJztcbiAgLy8gVE9ETyhzdGV2ZW5sZSk6IHN1cHBvcnQgZmlsdGVycy5cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZG9jcyBpbiBhIFJvb3QuanMgQ01TIGNvbGxlY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBudW1Eb2NzKFxuICByb290Q29uZmlnOiBSb290Q29uZmlnLFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgb3B0aW9uczogTnVtRG9jc09wdGlvbnNcbikge1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBnY3BQcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmZpcmViYXNlQ29uZmlnLnByb2plY3RJZDtcbiAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgY29uc3QgYXBwID0gZ2V0RmlyZWJhc2VBcHAoZ2NwUHJvamVjdElkKTtcbiAgY29uc3QgZGIgPSBnZXRGaXJlc3RvcmUoYXBwKTtcbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICBjb25zdCBxdWVyeTogUXVlcnkgPSBkYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gIC8vIFRPRE8oc3RldmVubGUpOiBzdXBwb3J0IGZpbHRlcnMgaGVyZS5cbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmNvdW50KCkuZ2V0KCk7XG4gIGNvbnN0IGNvdW50ID0gcmVzdWx0cy5kYXRhKCkuY291bnQ7XG4gIHJldHVybiBjb3VudDtcbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgc2NoZWR1bGVkIGRvY3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWJsaXNoU2NoZWR1bGVkRG9jcyhyb290Q29uZmlnOiBSb290Q29uZmlnKSB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IGdjcFByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuZmlyZWJhc2VDb25maWcucHJvamVjdElkO1xuICBjb25zdCBhcHAgPSBnZXRGaXJlYmFzZUFwcChnY3BQcm9qZWN0SWQpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuXG4gIGNvbnN0IHByb2plY3RDb2xsZWN0aW9uc1BhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L0NvbGxlY3Rpb25zYDtcblxuICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGRiLmNvbGxlY3Rpb25Hcm91cCgnU2NoZWR1bGVkJykuZ2V0KCk7XG4gIGNvbnN0IGRvY3MgPSBzbmFwc2hvdC5kb2NzXG4gICAgLmZpbHRlcigoZCkgPT4gZC5yZWYucGF0aC5zdGFydHNXaXRoKHByb2plY3RDb2xsZWN0aW9uc1BhdGgpKVxuICAgIC5tYXAoKGQpID0+IHtcbiAgICAgIGNvbnN0IGRiUGF0aCA9IGQucmVmLnBhdGg7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IGRiUGF0aC5zcGxpdCgnLycpO1xuICAgICAgY29uc3Qgc2x1ZyA9IHNlZ21lbnRzLmF0KC0xKTtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBzZWdtZW50cy5hdCgtMyk7XG4gICAgICBjb25zdCBpZCA9IGAke2NvbGxlY3Rpb259LyR7c2x1Z31gO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogZC5kYXRhKCksXG4gICAgICAgIGlkLFxuICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICBzbHVnLFxuICAgICAgfTtcbiAgICB9KTtcblxuICBpZiAoZG9jcy5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmxvZygnbm8gZG9jcyB0byBzY2hlZHVsZScpO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIEVhY2ggdHJhbnNhY3Rpb24gb3IgYmF0Y2ggY2FuIHdyaXRlIGEgbWF4IG9mIDUwMCBvcHMuXG4gIC8vIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL2ZpcmVzdG9yZS9tYW5hZ2UtZGF0YS90cmFuc2FjdGlvbnNcbiAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICBjb25zdCBiYXRjaCA9IGRiLmJhdGNoKCk7XG4gIGNvbnN0IHB1Ymxpc2hlZERvY3M6IGFueVtdID0gW107XG4gIGZvciAoY29uc3QgZG9jIG9mIGRvY3MpIHtcbiAgICBjb25zdCB7aWQsIGNvbGxlY3Rpb24sIHNsdWcsIGRhdGF9ID0gZG9jO1xuICAgIGNvbnN0IGRyYWZ0UmVmID0gZGIuZG9jKFxuICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9EcmFmdHMvJHtzbHVnfWBcbiAgICApO1xuICAgIGNvbnN0IHNjaGVkdWxlZFJlZiA9IGRiLmRvYyhcbiAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vU2NoZWR1bGVkLyR7c2x1Z31gXG4gICAgKTtcbiAgICBjb25zdCBwdWJsaXNoZWRSZWYgPSBkYi5kb2MoXG4gICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1B1Ymxpc2hlZC8ke3NsdWd9YFxuICAgICk7XG4gICAgY29uc3Qge3NjaGVkdWxlZEF0LCBzY2hlZHVsZWRCeSwgLi4uc3lzfSA9IGRhdGEuc3lzIHx8IHt9O1xuXG4gICAgLy8gU2F2ZSBwdWJsaXNoZWQgZG9jLlxuICAgIGJhdGNoLnNldChwdWJsaXNoZWRSZWYsIHtcbiAgICAgIGlkLFxuICAgICAgY29sbGVjdGlvbixcbiAgICAgIHNsdWcsXG4gICAgICBmaWVsZHM6IGRhdGEuZmllbGRzIHx8IHt9LFxuICAgICAgc3lzOiB7XG4gICAgICAgIC4uLnN5cyxcbiAgICAgICAgLy8gT25seSB1cGRhdGUgYGZpcnN0UHVibGlzaGVkYCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gICAgICAgIGZpcnN0UHVibGlzaGVkQXQ6IHN5cy5maXJzdFB1Ymxpc2hlZEF0ID8/IHNjaGVkdWxlZEF0LFxuICAgICAgICBmaXJzdFB1Ymxpc2hlZEJ5OiBzeXMuZmlyc3RQdWJsaXNoZWRCeSA/PyAoc2NoZWR1bGVkQnkgfHwgJycpLFxuICAgICAgICBwdWJsaXNoZWRBdDogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgcHVibGlzaGVkQnk6IHNjaGVkdWxlZEJ5IHx8ICcnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAvLyBSZW1vdmUgcHVibGlzaGVkIGRvYy5cbiAgICBiYXRjaC5kZWxldGUoc2NoZWR1bGVkUmVmKTtcbiAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGRyYWZ0IGRvYyB0byByZW1vdmUgYHNjaGVkdWxlZEF0YCBhbmQgYHNjaGVkdWxlZEJ5YCBmaWVsZHNcbiAgICAvLyBhbmQgdXBkYXRlIHRoZSBgcHVibGlzaGVkQXRgIGFuZCBgcHVibGlzaGVkQnlgIGZpZWxkcy5cbiAgICBiYXRjaC51cGRhdGUoZHJhZnRSZWYsIHtcbiAgICAgICdzeXMuc2NoZWR1bGVkQXQnOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgJ3N5cy5zY2hlZHVsZWRCeSc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAnc3lzLnB1Ymxpc2hlZEF0JzogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICdzeXMucHVibGlzaGVkQnknOiBzY2hlZHVsZWRCeSB8fCAnJyxcbiAgICB9KTtcbiAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICBwdWJsaXNoZWREb2NzLnB1c2goZG9jKTtcblxuICAgIGlmIChiYXRjaENvdW50ID49IDQ5OCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgJHtwdWJsaXNoZWREb2NzLmxlbmd0aH0gZG9jcyFgKTtcbiAgcmV0dXJuIHB1Ymxpc2hlZERvY3M7XG59XG5cbi8qKlxuICogV2Fsa3MgdGhlIGRhdGEgdHJlZSBhbmQgY29udmVydHMgYW55IFRpbWVzdGFtcCBvYmplY3RzIHRvIG1pbGxpcyBhbmQgYW55XG4gKiBfYXJyYXkgbWFwcyB0byBub3JtYWwgYXJyYXlzLlxuICpcbiAqIEUuZy46XG4gKlxuICogbm9ybWFsaXplRGF0YSh7XG4gKiAgIHN5czoge21vZGlmaWVkQXQ6IFRpbWVzdGFtcCgxMjMpfSxcbiAqICAgZmllbGRzOiB7XG4gKiAgICAgX2FycmF5OiBbJ2FzZGYnXSxcbiAqICAgICBhc2RmOiB7dGl0bGU6ICdoZWxsbyd9XG4gKiAgIH1cbiAqIH0pXG4gKiAvLyA9PiB7c3lzOiB7bW9kaWZpZWRBdDogMTIzfSwgZmllbGRzOiB7Zm9vOiBbe3RpdGxlOiAnaGVsbG8nfV19fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRGF0YShkYXRhOiBhbnkpOiBhbnkge1xuICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgY29uc3QgdmFsID0gZGF0YVtrZXldO1xuICAgIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgICBpZiAodmFsLnRvTWlsbGlzKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsLnRvTWlsbGlzKCk7XG4gICAgICB9IGVsc2UgaWYgKE9iamVjdC5oYXNPd24odmFsLCAnX2FycmF5JykgJiYgQXJyYXkuaXNBcnJheSh2YWwuX2FycmF5KSkge1xuICAgICAgICBjb25zdCBhcnIgPSB2YWwuX2FycmF5Lm1hcCgoazogc3RyaW5nKSA9PiBub3JtYWxpemVEYXRhKHZhbFtrXSB8fCB7fSkpO1xuICAgICAgICByZXN1bHRba2V5XSA9IGFycjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gbm9ybWFsaXplRGF0YSh2YWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkgJiYgZGF0YSAhPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENtc1BsdWdpbihyb290Q29uZmlnOiBSb290Q29uZmlnKTogQ01TUGx1Z2luIHtcbiAgY29uc3QgcGx1Z2luczogUGx1Z2luW10gPSByb290Q29uZmlnLnBsdWdpbnMgfHwgW107XG4gIGNvbnN0IHBsdWdpbiA9IHBsdWdpbnMuZmluZCgocGx1Z2luKSA9PiBwbHVnaW4ubmFtZSA9PT0gJ3Jvb3QtY21zJyk7XG4gIGlmICghcGx1Z2luKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCByb290LWNtcyBwbHVnaW4gY29uZmlnIGluIHJvb3QuY29uZmlnLnRzJyk7XG4gIH1cbiAgcmV0dXJuIHBsdWdpbiBhcyBDTVNQbHVnaW47XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFzQk8sU0FBUyxPQUFPLE9BQStDO0FBQ3BFLFNBQU8sRUFBQyxHQUFHLE9BQU8sTUFBTSxTQUFRO0FBQ2xDO0FBT08sU0FBUyxPQUFPLE9BQStDO0FBQ3BFLFNBQU8sRUFBQyxHQUFHLE9BQU8sTUFBTSxTQUFRO0FBQ2xDO0FBT08sU0FBUyxLQUFLLE9BQTJDO0FBQzlELFNBQU8sRUFBQyxHQUFHLE9BQU8sTUFBTSxPQUFNO0FBQ2hDO0FBT08sU0FBUyxTQUFTLE9BQW1EO0FBQzFFLFNBQU8sRUFBQyxHQUFHLE9BQU8sTUFBTSxXQUFVO0FBQ3BDO0FBUU8sU0FBUyxRQUFRLE9BQWlEO0FBQ3ZFLFNBQU8sRUFBQyxHQUFHLE9BQU8sTUFBTSxVQUFTO0FBQ25DO0FBU08sU0FBUyxPQUFPLE9BQStDO0FBQ3BFLFNBQU8sRUFBQyxHQUFHLE9BQU8sTUFBTSxTQUFRO0FBQ2xDO0FBU08sU0FBUyxZQUNkLE9BQ2tCO0FBQ2xCLFNBQU8sRUFBQyxHQUFHLE9BQU8sTUFBTSxjQUFhO0FBQ3ZDO0FBU08sU0FBUyxNQUFNLE9BQTZDO0FBQ2pFLFNBQU8sRUFBQyxHQUFHLE9BQU8sTUFBTSxRQUFPO0FBQ2pDO0FBUU8sU0FBUyxLQUFLLE9BQTJDO0FBQzlELFNBQU8sRUFBQyxHQUFHLE9BQU8sTUFBTSxPQUFNO0FBQ2hDO0FBT08sU0FBUyxPQUFPLE9BQStDO0FBQ3BFLFNBQU8sRUFBQyxHQUFHLE9BQU8sTUFBTSxTQUFRO0FBQ2xDO0FBbUNPLFNBQVMsTUFBTSxPQUE2QztBQUNqRSxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sUUFBTztBQUNqQztBQU9PLFNBQVMsTUFBTSxPQUE2QztBQUNqRSxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sUUFBTztBQUNqQztBQThCTyxTQUFTLGFBQWEsUUFBd0I7QUFDbkQsU0FBTztBQUNUO0FBR08sSUFBTSxTQUFTO0FBc0JmLFNBQVMsaUJBQWlCQSxhQUFvQztBQUNuRSxTQUFPQTtBQUNUO0FBRU8sSUFBTSxhQUFhOzs7QUM3TjFCLFNBQVEsb0JBQW9CLFFBQVEscUJBQW9CO0FBQ3hELFNBQVEsWUFBbUIsb0JBQW1CO0FBSTlDLElBQU0sV0FBVztBQUVWLFNBQVMsZUFBZSxjQUFzQjtBQUNuRCxNQUFJO0FBQ0YsV0FBTyxPQUFPLFFBQVE7QUFBQSxFQUN4QixTQUFTLEtBQVA7QUFDQSxRQUFJLE9BQU8sSUFBSSxTQUFTLGNBQWM7QUFDcEMsYUFBTztBQUFBLFFBQ0w7QUFBQSxVQUNFLFdBQVc7QUFBQSxVQUNYLFlBQVksbUJBQW1CO0FBQUEsUUFDakM7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFDQSxVQUFNO0FBQUEsRUFDUjtBQUNGO0FBU0EsZUFBc0IsT0FDcEIsWUFDQSxjQUNBLE1BQ0EsU0FDbUI7QUFDbkIsUUFBTSxZQUFZLGFBQWEsVUFBVTtBQUN6QyxRQUFNLG1CQUFtQixVQUFVLFVBQVU7QUFDN0MsUUFBTSxZQUFZLGlCQUFpQixNQUFNO0FBQ3pDLFFBQU0sZUFBZSxpQkFBaUIsZUFBZTtBQUNyRCxRQUFNLE9BQU8sUUFBUTtBQUNyQixRQUFNLGlCQUFpQixTQUFTLFVBQVUsV0FBVztBQUNyRCxRQUFNLE1BQU0sZUFBZSxZQUFZO0FBQ3ZDLFFBQU0sS0FBSyxhQUFhLEdBQUc7QUFFM0IsU0FBTyxLQUFLLFdBQVcsS0FBSyxJQUFJO0FBQ2hDLFFBQU0sU0FBUyxZQUFZLHlCQUF5QixnQkFBZ0Isa0JBQWtCO0FBQ3RGLFFBQU0sU0FBUyxHQUFHLElBQUksTUFBTTtBQUM1QixRQUFNLE1BQU0sTUFBTSxPQUFPLElBQUk7QUFDN0IsTUFBSSxJQUFJLFFBQVE7QUFDZCxVQUFNLE9BQU8sSUFBSSxLQUFLO0FBQ3RCLFdBQU8sY0FBYyxJQUFJO0FBQUEsRUFDM0I7QUFDQSxVQUFRLElBQUksa0JBQWtCLFFBQVE7QUFDdEMsU0FBTztBQUNUO0FBY0EsZUFBc0IsU0FDcEIsWUFDQSxjQUNBLFNBQ3NCO0FBQ3RCLFFBQU0sWUFBWSxhQUFhLFVBQVU7QUFDekMsUUFBTSxtQkFBbUIsVUFBVSxVQUFVO0FBQzdDLFFBQU0sWUFBWSxpQkFBaUIsTUFBTTtBQUN6QyxRQUFNLGVBQWUsaUJBQWlCLGVBQWU7QUFDckQsUUFBTSxPQUFPLFFBQVE7QUFDckIsUUFBTSxpQkFBaUIsU0FBUyxVQUFVLFdBQVc7QUFDckQsUUFBTSxNQUFNLGVBQWUsWUFBWTtBQUN2QyxRQUFNLEtBQUssYUFBYSxHQUFHO0FBQzNCLFFBQU0sU0FBUyxZQUFZLHlCQUF5QixnQkFBZ0I7QUFDcEUsTUFBSSxRQUFlLEdBQUcsV0FBVyxNQUFNO0FBQ3ZDLE1BQUksUUFBUSxPQUFPO0FBQ2pCLFlBQVEsTUFBTSxNQUFNLFFBQVEsS0FBSztBQUFBLEVBQ25DO0FBQ0EsTUFBSSxRQUFRLFFBQVE7QUFDbEIsWUFBUSxNQUFNLE9BQU8sUUFBUSxNQUFNO0FBQUEsRUFDckM7QUFDQSxNQUFJLFFBQVEsU0FBUztBQUNuQixZQUFRLE1BQU0sUUFBUSxRQUFRLFNBQVMsUUFBUSxnQkFBZ0I7QUFBQSxFQUNqRTtBQUNBLFFBQU0sVUFBVSxNQUFNLE1BQU0sSUFBSTtBQUNoQyxRQUFNLE9BQVksQ0FBQztBQUNuQixVQUFRLFFBQVEsQ0FBQyxXQUFXO0FBQzFCLFVBQU0sTUFBTSxjQUFjLE9BQU8sS0FBSyxDQUFDO0FBQ3ZDLFNBQUssS0FBSyxHQUFHO0FBQUEsRUFDZixDQUFDO0FBQ0QsU0FBTyxFQUFDLEtBQUk7QUFDZDtBQVVBLGVBQXNCLFFBQ3BCLFlBQ0EsY0FDQSxTQUNBO0FBQ0EsUUFBTSxZQUFZLGFBQWEsVUFBVTtBQUN6QyxRQUFNLG1CQUFtQixVQUFVLFVBQVU7QUFDN0MsUUFBTSxZQUFZLGlCQUFpQixNQUFNO0FBQ3pDLFFBQU0sZUFBZSxpQkFBaUIsZUFBZTtBQUNyRCxRQUFNLE9BQU8sUUFBUTtBQUNyQixRQUFNLGlCQUFpQixTQUFTLFVBQVUsV0FBVztBQUNyRCxRQUFNLE1BQU0sZUFBZSxZQUFZO0FBQ3ZDLFFBQU0sS0FBSyxhQUFhLEdBQUc7QUFDM0IsUUFBTSxTQUFTLFlBQVkseUJBQXlCLGdCQUFnQjtBQUNwRSxRQUFNLFFBQWUsR0FBRyxXQUFXLE1BQU07QUFFekMsUUFBTSxVQUFVLE1BQU0sTUFBTSxNQUFNLEVBQUUsSUFBSTtBQUN4QyxRQUFNLFFBQVEsUUFBUSxLQUFLLEVBQUU7QUFDN0IsU0FBTztBQUNUO0FBS0EsZUFBc0IscUJBQXFCLFlBQXdCO0FBQ2pFLFFBQU0sWUFBWSxhQUFhLFVBQVU7QUFDekMsUUFBTSxtQkFBbUIsVUFBVSxVQUFVO0FBQzdDLFFBQU0sWUFBWSxpQkFBaUIsTUFBTTtBQUN6QyxRQUFNLGVBQWUsaUJBQWlCLGVBQWU7QUFDckQsUUFBTSxNQUFNLGVBQWUsWUFBWTtBQUN2QyxRQUFNLEtBQUssYUFBYSxHQUFHO0FBRTNCLFFBQU0seUJBQXlCLFlBQVk7QUFFM0MsUUFBTSxXQUFXLE1BQU0sR0FBRyxnQkFBZ0IsV0FBVyxFQUFFLElBQUk7QUFDM0QsUUFBTSxPQUFPLFNBQVMsS0FDbkIsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEtBQUssV0FBVyxzQkFBc0IsQ0FBQyxFQUMzRCxJQUFJLENBQUMsTUFBTTtBQUNWLFVBQU0sU0FBUyxFQUFFLElBQUk7QUFDckIsVUFBTSxXQUFXLE9BQU8sTUFBTSxHQUFHO0FBQ2pDLFVBQU0sT0FBTyxTQUFTLEdBQUcsRUFBRTtBQUMzQixVQUFNQyxjQUFhLFNBQVMsR0FBRyxFQUFFO0FBQ2pDLFVBQU0sS0FBSyxHQUFHQSxlQUFjO0FBQzVCLFdBQU87QUFBQSxNQUNMLE1BQU0sRUFBRSxLQUFLO0FBQUEsTUFDYjtBQUFBLE1BQ0EsWUFBQUE7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUVILE1BQUksS0FBSyxXQUFXLEdBQUc7QUFDckIsWUFBUSxJQUFJLHFCQUFxQjtBQUNqQyxXQUFPLENBQUM7QUFBQSxFQUNWO0FBSUEsTUFBSSxhQUFhO0FBQ2pCLFFBQU0sUUFBUSxHQUFHLE1BQU07QUFDdkIsUUFBTSxnQkFBdUIsQ0FBQztBQUM5QixhQUFXLE9BQU8sTUFBTTtBQUN0QixVQUFNLEVBQUMsSUFBSSxZQUFBQSxhQUFZLE1BQU0sS0FBSSxJQUFJO0FBQ3JDLFVBQU0sV0FBVyxHQUFHO0FBQUEsTUFDbEIsR0FBRywwQkFBMEJBLHNCQUFxQjtBQUFBLElBQ3BEO0FBQ0EsVUFBTSxlQUFlLEdBQUc7QUFBQSxNQUN0QixHQUFHLDBCQUEwQkEseUJBQXdCO0FBQUEsSUFDdkQ7QUFDQSxVQUFNLGVBQWUsR0FBRztBQUFBLE1BQ3RCLEdBQUcsMEJBQTBCQSx5QkFBd0I7QUFBQSxJQUN2RDtBQUNBLFVBQU0sRUFBQyxhQUFhLGdCQUFnQixJQUFHLElBQUksS0FBSyxPQUFPLENBQUM7QUFHeEQsVUFBTSxJQUFJLGNBQWM7QUFBQSxNQUN0QjtBQUFBLE1BQ0EsWUFBQUE7QUFBQSxNQUNBO0FBQUEsTUFDQSxRQUFRLEtBQUssVUFBVSxDQUFDO0FBQUEsTUFDeEIsS0FBSztBQUFBLFFBQ0gsR0FBRztBQUFBLFFBRUgsa0JBQWtCLElBQUksb0JBQW9CO0FBQUEsUUFDMUMsa0JBQWtCLElBQUkscUJBQXFCLGVBQWU7QUFBQSxRQUMxRCxhQUFhLFdBQVcsZ0JBQWdCO0FBQUEsUUFDeEMsYUFBYSxlQUFlO0FBQUEsTUFDOUI7QUFBQSxJQUNGLENBQUM7QUFDRCxrQkFBYztBQUdkLFVBQU0sT0FBTyxZQUFZO0FBQ3pCLGtCQUFjO0FBSWQsVUFBTSxPQUFPLFVBQVU7QUFBQSxNQUNyQixtQkFBbUIsV0FBVyxPQUFPO0FBQUEsTUFDckMsbUJBQW1CLFdBQVcsT0FBTztBQUFBLE1BQ3JDLG1CQUFtQixXQUFXLGdCQUFnQjtBQUFBLE1BQzlDLG1CQUFtQixlQUFlO0FBQUEsSUFDcEMsQ0FBQztBQUNELGtCQUFjO0FBRWQsa0JBQWMsS0FBSyxHQUFHO0FBRXRCLFFBQUksY0FBYyxLQUFLO0FBQ3JCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLE1BQU0sT0FBTztBQUNuQixVQUFRLElBQUksYUFBYSxjQUFjLGNBQWM7QUFDckQsU0FBTztBQUNUO0FBaUJPLFNBQVMsY0FBYyxNQUFnQjtBQUM1QyxRQUFNLFNBQWMsQ0FBQztBQUNyQixhQUFXLE9BQU8sTUFBTTtBQUN0QixVQUFNLE1BQU0sS0FBSztBQUNqQixRQUFJLFNBQVMsR0FBRyxHQUFHO0FBQ2pCLFVBQUksSUFBSSxVQUFVO0FBQ2hCLGVBQU8sT0FBTyxJQUFJLFNBQVM7QUFBQSxNQUM3QixXQUFXLE9BQU8sT0FBTyxLQUFLLFFBQVEsS0FBSyxNQUFNLFFBQVEsSUFBSSxNQUFNLEdBQUc7QUFDcEUsY0FBTSxNQUFNLElBQUksT0FBTyxJQUFJLENBQUMsTUFBYyxjQUFjLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNyRSxlQUFPLE9BQU87QUFBQSxNQUNoQixPQUFPO0FBQ0wsZUFBTyxPQUFPLGNBQWMsR0FBRztBQUFBLE1BQ2pDO0FBQUEsSUFDRixPQUFPO0FBQ0wsYUFBTyxPQUFPO0FBQUEsSUFDaEI7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBRUEsU0FBUyxTQUFTLE1BQW9CO0FBQ3BDLFNBQU8sT0FBTyxTQUFTLFlBQVksQ0FBQyxNQUFNLFFBQVEsSUFBSSxLQUFLLFNBQVM7QUFDdEU7QUFFTyxTQUFTLGFBQWEsWUFBbUM7QUFDOUQsUUFBTSxVQUFvQixXQUFXLFdBQVcsQ0FBQztBQUNqRCxRQUFNLFNBQVMsUUFBUSxLQUFLLENBQUNDLFlBQVdBLFFBQU8sU0FBUyxVQUFVO0FBQ2xFLE1BQUksQ0FBQyxRQUFRO0FBQ1gsVUFBTSxJQUFJLE1BQU0seURBQXlEO0FBQUEsRUFDM0U7QUFDQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbImNvbGxlY3Rpb24iLCAiY29sbGVjdGlvbiIsICJwbHVnaW4iXQp9Cg==
@@ -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,123 @@
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 { applicationDefault, getApp, initializeApp } from "firebase-admin/app";
8
+ import { FieldValue, getFirestore } from "firebase-admin/firestore";
9
+ var APP_NAME = "root-cms";
10
+ function getFirebaseApp(gcpProjectId) {
11
+ try {
12
+ return getApp(APP_NAME);
13
+ } catch (err) {
14
+ if (err && err.code === "app/no-app") {
15
+ return initializeApp(
16
+ {
17
+ projectId: gcpProjectId,
18
+ credential: applicationDefault()
19
+ },
20
+ APP_NAME
21
+ );
22
+ }
23
+ throw err;
24
+ }
25
+ }
26
+ async function publishScheduledDocs(rootConfig) {
27
+ const cmsPlugin = getCmsPlugin(rootConfig);
28
+ const cmsPluginOptions = cmsPlugin.getConfig();
29
+ const projectId = cmsPluginOptions.id || "default";
30
+ const gcpProjectId = cmsPluginOptions.firebaseConfig.projectId;
31
+ const app = getFirebaseApp(gcpProjectId);
32
+ const db = getFirestore(app);
33
+ const projectCollectionsPath = `Projects/${projectId}/Collections`;
34
+ const snapshot = await db.collectionGroup("Scheduled").get();
35
+ const docs = snapshot.docs.filter((d) => d.ref.path.startsWith(projectCollectionsPath)).map((d) => {
36
+ const dbPath = d.ref.path;
37
+ const segments = dbPath.split("/");
38
+ const slug = segments.at(-1);
39
+ const collection = segments.at(-3);
40
+ const id = `${collection}/${slug}`;
41
+ return {
42
+ data: d.data(),
43
+ id,
44
+ collection,
45
+ slug
46
+ };
47
+ });
48
+ if (docs.length === 0) {
49
+ console.log("no docs to schedule");
50
+ return [];
51
+ }
52
+ let batchCount = 0;
53
+ const batch = db.batch();
54
+ const publishedDocs = [];
55
+ for (const doc of docs) {
56
+ const { id, collection, slug, data } = doc;
57
+ const draftRef = db.doc(
58
+ `${projectCollectionsPath}/${collection}/Drafts/${slug}`
59
+ );
60
+ const scheduledRef = db.doc(
61
+ `${projectCollectionsPath}/${collection}/Scheduled/${slug}`
62
+ );
63
+ const publishedRef = db.doc(
64
+ `${projectCollectionsPath}/${collection}/Published/${slug}`
65
+ );
66
+ const { scheduledAt, scheduledBy, ...sys } = data.sys || {};
67
+ batch.set(publishedRef, {
68
+ id,
69
+ collection,
70
+ slug,
71
+ fields: data.fields || {},
72
+ sys: {
73
+ ...sys,
74
+ firstPublishedAt: sys.firstPublishedAt ?? scheduledAt,
75
+ firstPublishedBy: sys.firstPublishedBy ?? (scheduledBy || ""),
76
+ publishedAt: FieldValue.serverTimestamp(),
77
+ publishedBy: scheduledBy || ""
78
+ }
79
+ });
80
+ batchCount += 1;
81
+ batch.delete(scheduledRef);
82
+ batchCount += 1;
83
+ batch.update(draftRef, {
84
+ "sys.scheduledAt": FieldValue.delete(),
85
+ "sys.scheduledBy": FieldValue.delete(),
86
+ "sys.publishedAt": FieldValue.serverTimestamp(),
87
+ "sys.publishedBy": scheduledBy || ""
88
+ });
89
+ batchCount += 1;
90
+ publishedDocs.push(doc);
91
+ if (batchCount >= 498) {
92
+ break;
93
+ }
94
+ }
95
+ await batch.commit();
96
+ console.log(`published ${publishedDocs.length} docs!`);
97
+ return publishedDocs;
98
+ }
99
+ function getCmsPlugin(rootConfig) {
100
+ const plugins = rootConfig.plugins || [];
101
+ const plugin = plugins.find((plugin2) => plugin2.name === "root-cms");
102
+ if (!plugin) {
103
+ throw new Error("could not find root-cms plugin config in root.config.ts");
104
+ }
105
+ return plugin;
106
+ }
107
+
108
+ // core/functions.ts
109
+ function cron(options) {
110
+ const rootDir = path.resolve((options == null ? void 0 : options.rootDir) || process.cwd());
111
+ const scheduleOptions = {
112
+ schedule: "every 1 mins",
113
+ ...options == null ? void 0 : options.scheduleOptions
114
+ };
115
+ return onSchedule(scheduleOptions, async () => {
116
+ const rootConfig = await loadRootConfig(rootDir, { command: "cms-cron" });
117
+ await publishScheduledDocs(rootConfig);
118
+ });
119
+ }
120
+ export {
121
+ cron
122
+ };
123
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9mdW5jdGlvbnMudHMiLCAiLi4vY29yZS9ydW50aW1lLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtsb2FkUm9vdENvbmZpZ30gZnJvbSAnQGJsaW5ray9yb290L25vZGUnO1xuaW1wb3J0IHtTY2hlZHVsZU9wdGlvbnMsIG9uU2NoZWR1bGV9IGZyb20gJ2ZpcmViYXNlLWZ1bmN0aW9ucy92Mi9zY2hlZHVsZXInO1xuaW1wb3J0IHtwdWJsaXNoU2NoZWR1bGVkRG9jc30gZnJvbSAnLi9ydW50aW1lLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBDcm9uT3B0aW9ucyB7XG4gIHJvb3REaXI/OiBzdHJpbmc7XG4gIHNjaGVkdWxlT3B0aW9ucz86IFBhcnRpYWw8U2NoZWR1bGVPcHRpb25zPjtcbn1cblxuLyoqXG4gKiBSdW5zIG9mZmxpbmUgQ01TIHRhc2tzLCBzdWNoIGFzIHB1Ymxpc2hpbmcgb2Ygc2NoZWR1bGVkIGRvY3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcm9uKG9wdGlvbnM/OiBDcm9uT3B0aW9ucykge1xuICBjb25zdCByb290RGlyID0gcGF0aC5yZXNvbHZlKG9wdGlvbnM/LnJvb3REaXIgfHwgcHJvY2Vzcy5jd2QoKSk7XG4gIGNvbnN0IHNjaGVkdWxlT3B0aW9uczogU2NoZWR1bGVPcHRpb25zID0ge1xuICAgIHNjaGVkdWxlOiAnZXZlcnkgMSBtaW5zJyxcbiAgICAuLi5vcHRpb25zPy5zY2hlZHVsZU9wdGlvbnMsXG4gIH07XG4gIHJldHVybiBvblNjaGVkdWxlKHNjaGVkdWxlT3B0aW9ucywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBsb2FkUm9vdENvbmZpZyhyb290RGlyLCB7Y29tbWFuZDogJ2Ntcy1jcm9uJ30pO1xuICAgIGF3YWl0IHB1Ymxpc2hTY2hlZHVsZWREb2NzKHJvb3RDb25maWcpO1xuICB9KTtcbn1cbiIsICJpbXBvcnQge1BsdWdpbiwgUm9vdENvbmZpZ30gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7YXBwbGljYXRpb25EZWZhdWx0LCBnZXRBcHAsIGluaXRpYWxpemVBcHB9IGZyb20gJ2ZpcmViYXNlLWFkbWluL2FwcCc7XG5pbXBvcnQge0ZpZWxkVmFsdWUsIFF1ZXJ5LCBnZXRGaXJlc3RvcmV9IGZyb20gJ2ZpcmViYXNlLWFkbWluL2ZpcmVzdG9yZSc7XG5cbmltcG9ydCB7Q01TUGx1Z2lufSBmcm9tICcuL3BsdWdpbi5qcyc7XG5cbmNvbnN0IEFQUF9OQU1FID0gJ3Jvb3QtY21zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcmViYXNlQXBwKGdjcFByb2plY3RJZDogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldEFwcChBUFBfTkFNRSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgPT09ICdhcHAvbm8tYXBwJykge1xuICAgICAgcmV0dXJuIGluaXRpYWxpemVBcHAoXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9qZWN0SWQ6IGdjcFByb2plY3RJZCxcbiAgICAgICAgICBjcmVkZW50aWFsOiBhcHBsaWNhdGlvbkRlZmF1bHQoKSxcbiAgICAgICAgfSxcbiAgICAgICAgQVBQX05BTUVcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldERvY09wdGlvbnMge1xuICBtb2RlOiAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgZG9jIGZyb20gUm9vdC5qcyBDTVMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREb2M8VD4oXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICBzbHVnOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEdldERvY09wdGlvbnNcbik6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBwcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgY29uc3QgZ2NwUHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5maXJlYmFzZUNvbmZpZy5wcm9qZWN0SWQ7XG4gIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gIGNvbnN0IGFwcCA9IGdldEZpcmViYXNlQXBwKGdjcFByb2plY3RJZCk7XG4gIGNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGFwcCk7XG4gIC8vIFNsdWdzIHdpdGggc2xhc2hlcyBhcmUgZW5jb2RlZCBhcyBgLS1gIGluIHRoZSBEQi5cbiAgc2x1ZyA9IHNsdWcucmVwbGFjZUFsbCgnLycsICctLScpO1xuICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgY29uc3QgZG9jUmVmID0gZGIuZG9jKGRiUGF0aCk7XG4gIGNvbnN0IGRvYyA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgaWYgKGRvYy5leGlzdHMpIHtcbiAgICBjb25zdCBkYXRhID0gZG9jLmRhdGEoKTtcbiAgICByZXR1cm4gbm9ybWFsaXplRGF0YShkYXRhKSBhcyBUO1xuICB9XG4gIGNvbnNvbGUubG9nKGBkb2Mgbm90IGZvdW5kOiAke2RiUGF0aH1gKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdERvY3NPcHRpb25zIHtcbiAgbW9kZTogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuICBvZmZzZXQ/OiBudW1iZXI7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvcmRlckJ5Pzogc3RyaW5nO1xuICBvcmRlckJ5RGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYyc7XG4gIC8vIFRPRE8oc3RldmVubGUpOiBzdXBwb3J0IGZpbHRlcnMuXG59XG5cbi8qKlxuICogTGlzdHMgZG9jcyBmcm9tIGEgUm9vdC5qcyBDTVMgY29sbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3REb2NzPFQ+KFxuICByb290Q29uZmlnOiBSb290Q29uZmlnLFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgb3B0aW9uczogTGlzdERvY3NPcHRpb25zXG4pOiBQcm9taXNlPHtkb2NzOiBUW119PiB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IGdjcFByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuZmlyZWJhc2VDb25maWcucHJvamVjdElkO1xuICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICBjb25zdCBhcHAgPSBnZXRGaXJlYmFzZUFwcChnY3BQcm9qZWN0SWQpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufWA7XG4gIGxldCBxdWVyeTogUXVlcnkgPSBkYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gIGlmIChvcHRpb25zLmxpbWl0KSB7XG4gICAgcXVlcnkgPSBxdWVyeS5saW1pdChvcHRpb25zLmxpbWl0KTtcbiAgfVxuICBpZiAob3B0aW9ucy5vZmZzZXQpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5Lm9mZnNldChvcHRpb25zLm9mZnNldCk7XG4gIH1cbiAgaWYgKG9wdGlvbnMub3JkZXJCeSkge1xuICAgIHF1ZXJ5ID0gcXVlcnkub3JkZXJCeShvcHRpb25zLm9yZGVyQnksIG9wdGlvbnMub3JkZXJCeURpcmVjdGlvbik7XG4gIH1cbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuICBjb25zdCBkb2NzOiBUW10gPSBbXTtcbiAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcbiAgICBjb25zdCBkb2MgPSBub3JtYWxpemVEYXRhKHJlc3VsdC5kYXRhKCkpIGFzIFQ7XG4gICAgZG9jcy5wdXNoKGRvYyk7XG4gIH0pO1xuICByZXR1cm4ge2RvY3N9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE51bURvY3NPcHRpb25zIHtcbiAgbW9kZTogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuICAvLyBUT0RPKHN0ZXZlbmxlKTogc3VwcG9ydCBmaWx0ZXJzLlxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkb2NzIGluIGEgUm9vdC5qcyBDTVMgY29sbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG51bURvY3MoXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICBvcHRpb25zOiBOdW1Eb2NzT3B0aW9uc1xuKSB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IGdjcFByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuZmlyZWJhc2VDb25maWcucHJvamVjdElkO1xuICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICBjb25zdCBhcHAgPSBnZXRGaXJlYmFzZUFwcChnY3BQcm9qZWN0SWQpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufWA7XG4gIGNvbnN0IHF1ZXJ5OiBRdWVyeSA9IGRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgLy8gVE9ETyhzdGV2ZW5sZSk6IHN1cHBvcnQgZmlsdGVycyBoZXJlLlxuICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuY291bnQoKS5nZXQoKTtcbiAgY29uc3QgY291bnQgPSByZXN1bHRzLmRhdGEoKS5jb3VudDtcbiAgcmV0dXJuIGNvdW50O1xufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBzY2hlZHVsZWQgZG9jcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hTY2hlZHVsZWREb2NzKHJvb3RDb25maWc6IFJvb3RDb25maWcpIHtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBwcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgY29uc3QgZ2NwUHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5maXJlYmFzZUNvbmZpZy5wcm9qZWN0SWQ7XG4gIGNvbnN0IGFwcCA9IGdldEZpcmViYXNlQXBwKGdjcFByb2plY3RJZCk7XG4gIGNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGFwcCk7XG5cbiAgY29uc3QgcHJvamVjdENvbGxlY3Rpb25zUGF0aCA9IGBQcm9qZWN0cy8ke3Byb2plY3RJZH0vQ29sbGVjdGlvbnNgO1xuXG4gIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZGIuY29sbGVjdGlvbkdyb3VwKCdTY2hlZHVsZWQnKS5nZXQoKTtcbiAgY29uc3QgZG9jcyA9IHNuYXBzaG90LmRvY3NcbiAgICAuZmlsdGVyKChkKSA9PiBkLnJlZi5wYXRoLnN0YXJ0c1dpdGgocHJvamVjdENvbGxlY3Rpb25zUGF0aCkpXG4gICAgLm1hcCgoZCkgPT4ge1xuICAgICAgY29uc3QgZGJQYXRoID0gZC5yZWYucGF0aDtcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gZGJQYXRoLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCBzbHVnID0gc2VnbWVudHMuYXQoLTEpO1xuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IHNlZ21lbnRzLmF0KC0zKTtcbiAgICAgIGNvbnN0IGlkID0gYCR7Y29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBkLmRhdGEoKSxcbiAgICAgICAgaWQsXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIHNsdWcsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gIGlmIChkb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUubG9nKCdubyBkb2NzIHRvIHNjaGVkdWxlJyk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8gRWFjaCB0cmFuc2FjdGlvbiBvciBiYXRjaCBjYW4gd3JpdGUgYSBtYXggb2YgNTAwIG9wcy5cbiAgLy8gaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvZmlyZXN0b3JlL21hbmFnZS1kYXRhL3RyYW5zYWN0aW9uc1xuICBsZXQgYmF0Y2hDb3VudCA9IDA7XG4gIGNvbnN0IGJhdGNoID0gZGIuYmF0Y2goKTtcbiAgY29uc3QgcHVibGlzaGVkRG9jczogYW55W10gPSBbXTtcbiAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgIGNvbnN0IHtpZCwgY29sbGVjdGlvbiwgc2x1ZywgZGF0YX0gPSBkb2M7XG4gICAgY29uc3QgZHJhZnRSZWYgPSBkYi5kb2MoXG4gICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L0RyYWZ0cy8ke3NsdWd9YFxuICAgICk7XG4gICAgY29uc3Qgc2NoZWR1bGVkUmVmID0gZGIuZG9jKFxuICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9TY2hlZHVsZWQvJHtzbHVnfWBcbiAgICApO1xuICAgIGNvbnN0IHB1Ymxpc2hlZFJlZiA9IGRiLmRvYyhcbiAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vUHVibGlzaGVkLyR7c2x1Z31gXG4gICAgKTtcbiAgICBjb25zdCB7c2NoZWR1bGVkQXQsIHNjaGVkdWxlZEJ5LCAuLi5zeXN9ID0gZGF0YS5zeXMgfHwge307XG5cbiAgICAvLyBTYXZlIHB1Ymxpc2hlZCBkb2MuXG4gICAgYmF0Y2guc2V0KHB1Ymxpc2hlZFJlZiwge1xuICAgICAgaWQsXG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgc2x1ZyxcbiAgICAgIGZpZWxkczogZGF0YS5maWVsZHMgfHwge30sXG4gICAgICBzeXM6IHtcbiAgICAgICAgLi4uc3lzLFxuICAgICAgICAvLyBPbmx5IHVwZGF0ZSBgZmlyc3RQdWJsaXNoZWRgIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAgICAgICAgZmlyc3RQdWJsaXNoZWRBdDogc3lzLmZpcnN0UHVibGlzaGVkQXQgPz8gc2NoZWR1bGVkQXQsXG4gICAgICAgIGZpcnN0UHVibGlzaGVkQnk6IHN5cy5maXJzdFB1Ymxpc2hlZEJ5ID8/IChzY2hlZHVsZWRCeSB8fCAnJyksXG4gICAgICAgIHB1Ymxpc2hlZEF0OiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICBwdWJsaXNoZWRCeTogc2NoZWR1bGVkQnkgfHwgJycsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgIC8vIFJlbW92ZSBwdWJsaXNoZWQgZG9jLlxuICAgIGJhdGNoLmRlbGV0ZShzY2hlZHVsZWRSZWYpO1xuICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgZHJhZnQgZG9jIHRvIHJlbW92ZSBgc2NoZWR1bGVkQXRgIGFuZCBgc2NoZWR1bGVkQnlgIGZpZWxkc1xuICAgIC8vIGFuZCB1cGRhdGUgdGhlIGBwdWJsaXNoZWRBdGAgYW5kIGBwdWJsaXNoZWRCeWAgZmllbGRzLlxuICAgIGJhdGNoLnVwZGF0ZShkcmFmdFJlZiwge1xuICAgICAgJ3N5cy5zY2hlZHVsZWRBdCc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAnc3lzLnNjaGVkdWxlZEJ5JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICdzeXMucHVibGlzaGVkQXQnOiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgJ3N5cy5wdWJsaXNoZWRCeSc6IHNjaGVkdWxlZEJ5IHx8ICcnLFxuICAgIH0pO1xuICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgIHB1Ymxpc2hlZERvY3MucHVzaChkb2MpO1xuXG4gICAgaWYgKGJhdGNoQ291bnQgPj0gNDk4KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgY29uc29sZS5sb2coYHB1Ymxpc2hlZCAke3B1Ymxpc2hlZERvY3MubGVuZ3RofSBkb2NzIWApO1xuICByZXR1cm4gcHVibGlzaGVkRG9jcztcbn1cblxuLyoqXG4gKiBXYWxrcyB0aGUgZGF0YSB0cmVlIGFuZCBjb252ZXJ0cyBhbnkgVGltZXN0YW1wIG9iamVjdHMgdG8gbWlsbGlzIGFuZCBhbnlcbiAqIF9hcnJheSBtYXBzIHRvIG5vcm1hbCBhcnJheXMuXG4gKlxuICogRS5nLjpcbiAqXG4gKiBub3JtYWxpemVEYXRhKHtcbiAqICAgc3lzOiB7bW9kaWZpZWRBdDogVGltZXN0YW1wKDEyMyl9LFxuICogICBmaWVsZHM6IHtcbiAqICAgICBfYXJyYXk6IFsnYXNkZiddLFxuICogICAgIGFzZGY6IHt0aXRsZTogJ2hlbGxvJ31cbiAqICAgfVxuICogfSlcbiAqIC8vID0+IHtzeXM6IHttb2RpZmllZEF0OiAxMjN9LCBmaWVsZHM6IHtmb286IFt7dGl0bGU6ICdoZWxsbyd9XX19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVEYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICBjb25zdCB2YWwgPSBkYXRhW2tleV07XG4gICAgaWYgKGlzT2JqZWN0KHZhbCkpIHtcbiAgICAgIGlmICh2YWwudG9NaWxsaXMpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWwudG9NaWxsaXMoKTtcbiAgICAgIH0gZWxzZSBpZiAoT2JqZWN0Lmhhc093bih2YWwsICdfYXJyYXknKSAmJiBBcnJheS5pc0FycmF5KHZhbC5fYXJyYXkpKSB7XG4gICAgICAgIGNvbnN0IGFyciA9IHZhbC5fYXJyYXkubWFwKChrOiBzdHJpbmcpID0+IG5vcm1hbGl6ZURhdGEodmFsW2tdIHx8IHt9KSk7XG4gICAgICAgIHJlc3VsdFtrZXldID0gYXJyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBub3JtYWxpemVEYXRhKHZhbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhICE9PSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWc6IFJvb3RDb25maWcpOiBDTVNQbHVnaW4ge1xuICBjb25zdCBwbHVnaW5zOiBQbHVnaW5bXSA9IHJvb3RDb25maWcucGx1Z2lucyB8fCBbXTtcbiAgY29uc3QgcGx1Z2luID0gcGx1Z2lucy5maW5kKChwbHVnaW4pID0+IHBsdWdpbi5uYW1lID09PSAncm9vdC1jbXMnKTtcbiAgaWYgKCFwbHVnaW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCBmaW5kIHJvb3QtY21zIHBsdWdpbiBjb25maWcgaW4gcm9vdC5jb25maWcudHMnKTtcbiAgfVxuICByZXR1cm4gcGx1Z2luIGFzIENNU1BsdWdpbjtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxPQUFPLFVBQVU7QUFDakIsU0FBUSxzQkFBcUI7QUFDN0IsU0FBeUIsa0JBQWlCOzs7QUNEMUMsU0FBUSxvQkFBb0IsUUFBUSxxQkFBb0I7QUFDeEQsU0FBUSxZQUFtQixvQkFBbUI7QUFJOUMsSUFBTSxXQUFXO0FBRVYsU0FBUyxlQUFlLGNBQXNCO0FBQ25ELE1BQUk7QUFDRixXQUFPLE9BQU8sUUFBUTtBQUFBLEVBQ3hCLFNBQVMsS0FBUDtBQUNBLFFBQUksT0FBTyxJQUFJLFNBQVMsY0FBYztBQUNwQyxhQUFPO0FBQUEsUUFDTDtBQUFBLFVBQ0UsV0FBVztBQUFBLFVBQ1gsWUFBWSxtQkFBbUI7QUFBQSxRQUNqQztBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUNBLFVBQU07QUFBQSxFQUNSO0FBQ0Y7QUFpSEEsZUFBc0IscUJBQXFCLFlBQXdCO0FBQ2pFLFFBQU0sWUFBWSxhQUFhLFVBQVU7QUFDekMsUUFBTSxtQkFBbUIsVUFBVSxVQUFVO0FBQzdDLFFBQU0sWUFBWSxpQkFBaUIsTUFBTTtBQUN6QyxRQUFNLGVBQWUsaUJBQWlCLGVBQWU7QUFDckQsUUFBTSxNQUFNLGVBQWUsWUFBWTtBQUN2QyxRQUFNLEtBQUssYUFBYSxHQUFHO0FBRTNCLFFBQU0seUJBQXlCLFlB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