@dollhousemcp/mcp-server 2.0.13 → 2.0.14

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.
Files changed (35) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/di/Container.d.ts.map +1 -1
  3. package/dist/di/Container.js +19 -9
  4. package/dist/elements/BaseElement.js +2 -2
  5. package/dist/elements/memories/Memory.d.ts.map +1 -1
  6. package/dist/elements/memories/Memory.js +3 -3
  7. package/dist/elements/skills/Skill.d.ts.map +1 -1
  8. package/dist/elements/skills/Skill.js +4 -4
  9. package/dist/elements/templates/Template.d.ts.map +1 -1
  10. package/dist/elements/templates/Template.js +4 -4
  11. package/dist/generated/version.d.ts +2 -2
  12. package/dist/generated/version.js +3 -3
  13. package/dist/handlers/ElementCRUDHandler.d.ts +10 -0
  14. package/dist/handlers/ElementCRUDHandler.d.ts.map +1 -1
  15. package/dist/handlers/ElementCRUDHandler.js +123 -1
  16. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +1 -0
  17. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  18. package/dist/handlers/mcp-aql/MCPAQLHandler.js +31 -2
  19. package/dist/services/ActivationStore.d.ts +20 -0
  20. package/dist/services/ActivationStore.d.ts.map +1 -1
  21. package/dist/services/ActivationStore.js +104 -1
  22. package/dist/web/console/IngestRoutes.d.ts +1 -0
  23. package/dist/web/console/IngestRoutes.d.ts.map +1 -1
  24. package/dist/web/console/IngestRoutes.js +4 -1
  25. package/dist/web/console/UnifiedConsole.js +2 -1
  26. package/dist/web/public/permissions.css +224 -16
  27. package/dist/web/public/permissions.js +326 -63
  28. package/dist/web/public/sessions.js +218 -98
  29. package/dist/web/public/styles.css +15 -10
  30. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  31. package/dist/web/routes/permissionRoutes.js +57 -19
  32. package/dist/web/server.d.ts.map +1 -1
  33. package/dist/web/server.js +2 -1
  34. package/package.json +1 -1
  35. package/server.json +2 -2
@@ -132,6 +132,7 @@ async function startAsLeader(options, election, consolePort = DEFAULT_CONSOLE_PO
132
132
  const ingestResult = createIngestRoutes({
133
133
  logBroadcast: (entry) => liveBroadcast?.(entry),
134
134
  metricsOnSnapshot: (snapshot) => liveMetricsOnSnapshot?.(snapshot),
135
+ storeMetricsSnapshot: (snapshot) => options.metricsSink?.onSnapshot(snapshot),
135
136
  });
136
137
  // Register the leader as a session
137
138
  ingestResult.registerLeaderSession(options.sessionId, process.pid);
@@ -232,4 +233,4 @@ async function startAsFollower(options, election, consolePort = DEFAULT_CONSOLE_
232
233
  },
233
234
  };
234
235
  }
235
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5pZmllZENvbnNvbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL2NvbnNvbGUvVW5pZmllZENvbnNvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQU1ILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsV0FBVyxFQUNYLDJCQUEyQixFQUMzQixvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLHFCQUFxQixFQUNyQixrQkFBa0IsR0FFbkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGdCQUFnQixHQUNqQixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQztBQW9DNUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSwwQkFBMEIsQ0FDOUMsV0FBbUIsRUFDbkIsU0FBb0Msa0JBQWtCLEVBQ3RELE1BQXFCLE1BQU07SUFFM0IsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLEVBQUUsQ0FBQztRQUM5QixJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QixHQUFHLENBQUMsSUFBSSxDQUNOLDZFQUE2RTtnQkFDN0UsUUFBUSxNQUFNLENBQUMsR0FBRyxVQUFVLE1BQU0sQ0FBQyxJQUFJLDRCQUE0QjtnQkFDbkUs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R0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RixDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFeEMsd0NBQXdDO0lBQ3hDLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM5RixNQUFNLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBRS9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLEVBQUU7UUFDL0MsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFVBQVU7UUFDaEUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUc7UUFDaEYsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVM7S0FDaEQsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLElBQUksRUFBRSxVQUFVO1FBQ2hCLFFBQVE7UUFDUixPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbEIsTUFBTSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5QixNQUFNLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVuaWZpZWQgd2ViIGNvbnNvbGUgb3JjaGVzdHJhdG9yLlxuICpcbiAqIFRpZXMgdG9nZXRoZXIgbGVhZGVyIGVsZWN0aW9uLCBjb25zb2xlIHN0YXJ0dXAsIGZvbGxvd2VyIHdpcmluZyxcbiAqIGFuZCBzZXNzaW9uIGxpZmVjeWNsZSBtYW5hZ2VtZW50LiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50XG4gKiBjYWxsZWQgYnkgdGhlIERJIGNvbnRhaW5lciBkdXJpbmcgZGVmZXJyZWQgc2V0dXAuXG4gKlxuICogRmxvdzpcbiAqIDEuIFJ1biBsZWFkZXIgZWxlY3Rpb24gKHJlYWQgbG9jayBmaWxlLCBjbGFpbSBvciBmb2xsb3cpXG4gKiAyLiBJZiBsZWFkZXI6IHN0YXJ0IHdlYiBzZXJ2ZXIgb24gZml4ZWQgcG9ydCwgbW91bnQgaW5nZXN0IHJvdXRlcywgc3RhcnQgaGVhcnRiZWF0XG4gKiAzLiBJZiBmb2xsb3dlcjogcmVnaXN0ZXIgZm9yd2FyZGluZyBzaW5rcyB3aXRoIExvZ01hbmFnZXIsIHN0YXJ0IHNlc3Npb24gaGVhcnRiZWF0XG4gKlxuICogQHNpbmNlIHYyLjEuMCDigJQgSXNzdWUgIzE3MDBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFVuaWZpZWRMb2dFbnRyeSB9IGZyb20gJy4uLy4uL2xvZ2dpbmcvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZXRyaWNTbmFwc2hvdCB9IGZyb20gJy4uLy4uL21ldHJpY3MvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlMb2dTaW5rIH0gZnJvbSAnLi4vLi4vbG9nZ2luZy9zaW5rcy9NZW1vcnlMb2dTaW5rLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5TWV0cmljc1NpbmsgfSBmcm9tICcuLi8uLi9tZXRyaWNzL3NpbmtzL01lbW9yeU1ldHJpY3NTaW5rLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBlbGVjdExlYWRlcixcbiAgaXNMZWFkZXJXZWJDb25zb2xlUmVhY2hhYmxlLFxuICBmb3JjZUNsYWltTGVhZGVyc2hpcCxcbiAgc3RhcnRIZWFydGJlYXQsXG4gIHJlZ2lzdGVyTGVhZGVyQ2xlYW51cCxcbiAgZGV0ZWN0TGVnYWN5TGVhZGVyLFxuICB0eXBlIEVsZWN0aW9uUmVzdWx0LFxufSBmcm9tICcuL0xlYWRlckVsZWN0aW9uLmpzJztcbmltcG9ydCB7IGNyZWF0ZUluZ2VzdFJvdXRlcyB9IGZyb20gJy4vSW5nZXN0Um91dGVzLmpzJztcbmltcG9ydCB7XG4gIExlYWRlckZvcndhcmRpbmdMb2dTaW5rLFxuICBTZXNzaW9uSGVhcnRiZWF0LFxufSBmcm9tICcuL0xlYWRlckZvcndhcmRpbmdTaW5rLmpzJztcbmltcG9ydCB7IFByb21vdGlvbk1hbmFnZXIgfSBmcm9tICcuL1Byb21vdGlvbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQ29uc29sZVRva2VuU3RvcmUgfSBmcm9tICcuL2NvbnNvbGVUb2tlbi5qcyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi8uLi9jb25maWcvZW52LmpzJztcblxuLyoqXG4gKiBEZWZhdWx0IGNvbnNvbGUgcG9ydCBmcm9tIHRoZSBlbnYgdmFyLiBVc2VkIGFzIGZhbGxiYWNrIHdoZW4gbm8gcG9ydFxuICogaXMgcHJvdmlkZWQgdmlhIGNvbmZpZyBmaWxlIG9yIG9wdGlvbnMuIFRoZSByZXNvbHV0aW9uIGhpZXJhcmNoeSBpczpcbiAqICAgMS4gb3B0aW9ucy5wb3J0IChmcm9tIGNvbmZpZyBmaWxlLCByZXNvbHZlZCBieSB0aGUgREkgY29udGFpbmVyKVxuICogICAyLiBET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVCBlbnYgdmFyXG4gKiAgIDMuIDQxNzE1IChoYXJkY29kZWQgZGVmYXVsdCBpbiBlbnYudHMpXG4gKi9cbmNvbnN0IERFRkFVTFRfQ09OU09MRV9QT1JUID0gZW52LkRPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIHRoZSB1bmlmaWVkIGNvbnNvbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5pZmllZENvbnNvbGVPcHRpb25zIHtcbiAgLyoqIFRoaXMgcHJvY2VzcydzIHVuaXF1ZSBzZXNzaW9uIElEICovXG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICAvKiogUG9ydGZvbGlvIGJhc2UgZGlyZWN0b3J5IChmb3Igc3RhcnRXZWJTZXJ2ZXIpICovXG4gIHBvcnRmb2xpb0Rpcjogc3RyaW5nO1xuICAvKiogTG9nIG1lbW9yeSBzaW5rIChmb3IgY29uc29sZSBoaXN0b3J5KSAqL1xuICBtZW1vcnlTaW5rOiBNZW1vcnlMb2dTaW5rO1xuICAvKiogTWV0cmljcyBtZW1vcnkgc2luayAqL1xuICBtZXRyaWNzU2luaz86IE1lbW9yeU1ldHJpY3NTaW5rO1xuICAvKiogTUNQLUFRTCBoYW5kbGVyIGZvciBwZXJtaXNzaW9uIHJvdXRlcyAodHlwZWQgYXMgYW55IHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydHMpICovXG4gIG1jcEFxbEhhbmRsZXI/OiBhbnk7XG4gIC8qKiBDYWxsYmFjayB0byByZWdpc3RlciBhIGxvZyBzaW5rIHdpdGggdGhlIExvZ01hbmFnZXIgKi9cbiAgcmVnaXN0ZXJMb2dTaW5rOiAoc2luazogeyB3cml0ZShlbnRyeTogVW5pZmllZExvZ0VudHJ5KTogdm9pZDsgZmx1c2goKTogUHJvbWlzZTx2b2lkPjsgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB9KSA9PiB2b2lkO1xuICAvKiogQ2FsbGJhY2sgdG8gd2lyZSBTU0UgYnJvYWRjYXN0cyBhZnRlciB3ZWIgc2VydmVyIHN0YXJ0cyAqL1xuICB3aXJlU1NFQnJvYWRjYXN0czogKHdlYlJlc3VsdDogeyBsb2dCcm9hZGNhc3Q/OiAoZW50cnk6IFVuaWZpZWRMb2dFbnRyeSkgPT4gdm9pZDsgbWV0cmljc09uU25hcHNob3Q/OiAoc25hcHNob3Q6IE1ldHJpY1NuYXBzaG90KSA9PiB2b2lkIH0sIG1ldHJpY3NTaW5rPzogTWVtb3J5TWV0cmljc1NpbmspID0+IHZvaWQ7XG4gIC8qKiBDb25zb2xlIHBvcnQgb3ZlcnJpZGUgZnJvbSBjb25maWcgZmlsZS4gRmFsbHMgYmFjayB0byBlbnYgdmFyIGlmIG5vdCBwcm92aWRlZC4gKi9cbiAgcG9ydD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Ygc3RhcnRpbmcgdGhlIHVuaWZpZWQgY29uc29sZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbmlmaWVkQ29uc29sZVJlc3VsdCB7XG4gIHJvbGU6ICdsZWFkZXInIHwgJ2ZvbGxvd2VyJztcbiAgZWxlY3Rpb246IEVsZWN0aW9uUmVzdWx0O1xuICAvKiogUG9ydCB0aGUgY29uc29sZSBpcyBydW5uaW5nIG9uIChsZWFkZXIgb25seSkgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqIENsZWFudXAgZnVuY3Rpb24gdG8gY2FsbCBvbiBzaHV0ZG93biAqL1xuICBjbGVhbnVwOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIENoZWNrIGZvciBhIHJ1bm5pbmcgbGVnYWN5IChwcmUtYXV0aGVudGljYXRpb24pIERvbGxob3VzZU1DUCBjb25zb2xlIGFuZFxuICogbG9nIGEgV0FSTi1sZXZlbCBtZXNzYWdlIGlmIG9uZSBpcyBmb3VuZCAoIzE3OTQpLlxuICpcbiAqIEV4dHJhY3RlZCBmcm9tIGBzdGFydFVuaWZpZWRDb25zb2xlYCBzbyB0aGUgd2lyaW5nIGNhbiBiZSBpbnRlZ3JhdGlvbi1cbiAqIHRlc3RlZCBpbiBpc29sYXRpb24gd2l0aG91dCBzcGlubmluZyB1cCBhIGZ1bGwgd2ViIHNlcnZlciBhbmQgbGVhZGVyXG4gKiBlbGVjdGlvbi4gVGhlIGltcGxlbWVudGF0aW9uIGlzIGZpcmUtYW5kLWZvcmdldDogZGV0ZWN0aW9uIGZhaWx1cmVzXG4gKiBhcmUgbG9nZ2VkIGF0IERFQlVHIGFuZCBuZXZlciBwcm9wYWdhdGUsIGJlY2F1c2UgYSBmYWlsdXJlIGhlcmUgbXVzdFxuICogbm90IGJsb2NrIGxlYWRlciBlbGVjdGlvbiBvZiB0aGUgYXV0aGVudGljYXRlZCBjb25zb2xlLlxuICpcbiAqIEBwYXJhbSBjdXJyZW50UG9ydCAtIFRoZSBwb3J0IHRoZSBhdXRoZW50aWNhdGVkIGNvbnNvbGUgaW50ZW5kcyB0b1xuICogICAgICAgICAgICAgICAgICAgICAgYmluZCB0by4gVXNlZCBpbiB0aGUgd2FybmluZyBtZXNzYWdlIHRvIGhlbHAgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICB1c2VyIHRlbGwgdGhlIHR3byBjb25zb2xlcyBhcGFydC5cbiAqIEBwYXJhbSBkZXRlY3QgICAgICAtIE9wdGlvbmFsIGluamVjdGlvbiBwb2ludCBmb3IgdGhlIGRldGVjdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uIERlZmF1bHRzIHRvIGBkZXRlY3RMZWdhY3lMZWFkZXJgLiBUZXN0c1xuICogICAgICAgICAgICAgICAgICAgICAgcGFzcyBhIHN0dWIuXG4gKiBAcGFyYW0gbG9nICAgICAgICAgLSBPcHRpb25hbCBpbmplY3Rpb24gcG9pbnQgZm9yIHRoZSBsb2dnZXIuIERlZmF1bHRzXG4gKiAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgbW9kdWxlIGxvZ2dlci4gVGVzdHMgcGFzcyBhIHNweS5cbiAqIEByZXR1cm5zIFRoZSBsZWdhY3kgbGVhZGVyIGluZm8gZnJvbSBgZGV0ZWN0KClgLCBvciBudWxsIGlmIGRldGVjdGlvblxuICogICAgICAgICAgdGhyZXcuIEV4cG9zZWQgc28gdGVzdHMgY2FuIGFzc2VydCB0aGUgZnVsbCByZXN1bHQgc2hhcGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YXJuSWZMZWdhY3lDb25zb2xlUHJlc2VudChcbiAgY3VycmVudFBvcnQ6IG51bWJlcixcbiAgZGV0ZWN0OiB0eXBlb2YgZGV0ZWN0TGVnYWN5TGVhZGVyID0gZGV0ZWN0TGVnYWN5TGVhZGVyLFxuICBsb2c6IHR5cGVvZiBsb2dnZXIgPSBsb2dnZXIsXG4pOiBQcm9taXNlPEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZGV0ZWN0TGVnYWN5TGVhZGVyPj4gfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgbGVnYWN5ID0gYXdhaXQgZGV0ZWN0KCk7XG4gICAgaWYgKGxlZ2FjeS5sZWdhY3lSdW5uaW5nKSB7XG4gICAgICBsb2cud2FybihcbiAgICAgICAgYFtVbmlmaWVkQ29uc29sZV0gTGVnYWN5IChwcmUtYXV0aGVudGljYXRpb24pIERvbGxob3VzZU1DUCBjb25zb2xlIGRldGVjdGVkIGAgK1xuICAgICAgICBgKHBpZD0ke2xlZ2FjeS5waWR9LCBwb3J0PSR7bGVnYWN5LnBvcnR9KS4gQm90aCBjb25zb2xlcyB3aWxsIHJ1biBgICtcbiAgICAgICAgYGluZGVwZW5kZW50bHkgb24gZGlmZmVyZW50IHBvcnRzIHdpdGggZGlmZmVyZW50IHNlY3VyaXR5IHBvc3R1cmUuIGAgK1xuICAgICAgICBgVGhlIGF1dGhlbnRpY2F0ZWQgY29uc29sZSAodGhpcyBwcm9jZXNzKSB1c2VzIHBvcnQgJHtjdXJyZW50UG9ydH07IGAgK1xuICAgICAgICBgdGhlIGxlZ2FjeSBjb25zb2xlIHVzZXMgcG9ydCAke2xlZ2FjeS5wb3J0ID8/IDM5Mzl9LiBgICtcbiAgICAgICAgYEZvciBjb25zaXN0ZW50IHNlY3VyaXR5LCB1cGRhdGUgdGhlIGxlZ2FjeSBpbnN0YWxsYXRpb24gdG8gYSBgICtcbiAgICAgICAgYHZlcnNpb24gd2l0aCB0aGUgYXV0aGVudGljYXRlZCBjb25zb2xlLmAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbGVnYWN5O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBCZXN0LWVmZm9ydCDigJQgbmV2ZXIgYmxvY2sgZWxlY3Rpb24gb24gYSBkZXRlY3Rpb24gZmFpbHVyZVxuICAgIGxvZy5kZWJ1ZygnW1VuaWZpZWRDb25zb2xlXSBMZWdhY3kgbGVhZGVyIGRldGVjdGlvbiBmYWlsZWQnLCB7XG4gICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogU3RhcnQgdGhlIHVuaWZpZWQgd2ViIGNvbnNvbGUuXG4gKlxuICogUnVucyBsZWFkZXIgZWxlY3Rpb24sIHRoZW4gZWl0aGVyIHN0YXJ0cyB0aGUgZnVsbCBjb25zb2xlIChsZWFkZXIpXG4gKiBvciBzZXRzIHVwIGV2ZW50IGZvcndhcmRpbmcgKGZvbGxvd2VyKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0VW5pZmllZENvbnNvbGUob3B0aW9uczogVW5pZmllZENvbnNvbGVPcHRpb25zKTogUHJvbWlzZTxVbmlmaWVkQ29uc29sZVJlc3VsdD4ge1xuICAvLyBSZXNvbHZlIHBvcnQ6IG9wdGlvbnMgKGNvbmZpZyBmaWxlKSDihpIgZW52IHZhciDihpIgZGVmYXVsdFxuICBjb25zdCBjb25zb2xlUG9ydCA9IG9wdGlvbnMucG9ydCB8fCBERUZBVUxUX0NPTlNPTEVfUE9SVDtcbiAgbG9nZ2VyLmRlYnVnKGBbVW5pZmllZENvbnNvbGVdIFBvcnQgcmVzb2x2ZWQ6ICR7Y29uc29sZVBvcnR9YCArXG4gICAgKG9wdGlvbnMucG9ydCA/ICcgKGZyb20gY29uZmlnIGZpbGUpJyA6IGAgKGZyb20gZW52L2RlZmF1bHQpYCkpO1xuXG4gIC8vIExlZ2FjeS1sZWFkZXIgZGV0ZWN0aW9uICgjMTc5NCkg4oCUIHdhcm4gdGhlIHVzZXIgaWYgYSBwcmUtYXV0aFxuICAvLyBEb2xsaG91c2VNQ1AgY29uc29sZSBpcyBydW5uaW5nIGFsb25nc2lkZSB0aGlzIGF1dGhlbnRpY2F0ZWQgb25lLlxuICAvLyBUaGV5IHdpbGwgY29leGlzdCBmaW5lIGJlY2F1c2Ugb2YgcG9ydCArIGxvY2sgKyB0b2tlbiBmaWxlIGlzb2xhdGlvbixcbiAgLy8gYnV0IHRoZSB1c2VyIHNob3VsZCBrbm93IGJvdGggZXhpc3Qgc28gdGhlIGRpZmZlcmluZyBzZWN1cml0eSBwb3N0dXJlXG4gIC8vIGJldHdlZW4gdGhlbSBkb2Vzbid0IGxvb2sgbGlrZSBhIGJ1Zy5cbiAgYXdhaXQgd2FybklmTGVnYWN5Q29uc29sZVByZXNlbnQoY29uc29sZVBvcnQpO1xuXG4gIGxldCBlbGVjdGlvbiA9IGF3YWl0IGVsZWN0TGVhZGVyKG9wdGlvbnMuc2Vzc2lvbklkLCBjb25zb2xlUG9ydCk7XG5cbiAgLy8gSWYgd2UgbG9zdCB0aGUgZWxlY3Rpb24sIGNoZWNrIGlmIHRoZSBsZWFkZXIgaXMgYWN0dWFsbHkgcnVubmluZyBhIHdlYiBjb25zb2xlLlxuICAvLyBBbiBNQ1Agc3RkaW8gcHJvY2VzcyBtYXkgaG9sZCBsZWFkZXJzaGlwIGJ1dCBub3Qgc2VydmUgd2ViIHJvdXRlcy5cbiAgLy8gSW4gdGhhdCBjYXNlLCBmb3JjZSBhIHRha2VvdmVyIHNvIHRoZSB3ZWIgY29uc29sZSB3b3JrcyBwcm9wZXJseS5cbiAgaWYgKGVsZWN0aW9uLnJvbGUgPT09ICdmb2xsb3dlcicpIHtcbiAgICBjb25zdCByZWFjaGFibGUgPSBhd2FpdCBpc0xlYWRlcldlYkNvbnNvbGVSZWFjaGFibGUoZWxlY3Rpb24ubGVhZGVySW5mbyk7XG4gICAgaWYgKCFyZWFjaGFibGUpIHtcbiAgICAgIGVsZWN0aW9uID0gYXdhaXQgZm9yY2VDbGFpbUxlYWRlcnNoaXAob3B0aW9ucy5zZXNzaW9uSWQsIGNvbnNvbGVQb3J0KTtcbiAgICB9XG4gIH1cblxuICBpZiAoZWxlY3Rpb24ucm9sZSA9PT0gJ2xlYWRlcicpIHtcbiAgICByZXR1cm4gc3RhcnRBc0xlYWRlcihvcHRpb25zLCBlbGVjdGlvbiwgY29uc29sZVBvcnQpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdGFydEFzRm9sbG93ZXIob3B0aW9ucywgZWxlY3Rpb24sIGNvbnNvbGVQb3J0KTtcbiAgfVxufVxuXG4vKipcbiAqIFN0YXJ0IGFzIHRoZSBjb25zb2xlIGxlYWRlci5cbiAqIEJpbmRzIHRoZSByZXNvbHZlZCBjb25zb2xlIHBvcnQgKGNvbmZpZyBmaWxlIOKGkiBlbnYgdmFyIOKGkiBkZWZhdWx0KSxcbiAqIG1vdW50cyBhbGwgcm91dGVzIGluY2x1ZGluZyBpbmdlc3Rpb24sIHN0YXJ0cyBoZWFydGJlYXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0QXNMZWFkZXIoXG4gIG9wdGlvbnM6IFVuaWZpZWRDb25zb2xlT3B0aW9ucyxcbiAgZWxlY3Rpb246IEVsZWN0aW9uUmVzdWx0LFxuICBjb25zb2xlUG9ydDogbnVtYmVyID0gREVGQVVMVF9DT05TT0xFX1BPUlQsXG4pOiBQcm9taXNlPFVuaWZpZWRDb25zb2xlUmVzdWx0PiB7XG4gIGNvbnN0IHsgc3RhcnRXZWJTZXJ2ZXIgfSA9IGF3YWl0IGltcG9ydCgnLi4vc2VydmVyLmpzJyk7XG4gIGNvbnN0IHsgcGlja1JhbmRvbVRva2VuTmFtZSB9ID0gYXdhaXQgaW1wb3J0KCcuL1Nlc3Npb25OYW1lcy5qcycpO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIGNvbnNvbGUgdG9rZW4gc3RvcmUgKCMxNzgwKS4gQ3JlYXRlcyB0aGUgdG9rZW4gZmlsZSBvblxuICAvLyBmaXJzdCBydW4sIHJlYWRzIHRoZSBleGlzdGluZyB0b2tlbnMgb24gc3Vic2VxdWVudCBydW5zLiBUaGUgdG9rZW4gaXNcbiAgLy8gcGVyc2lzdGVudCBhY3Jvc3MgcmVzdGFydHMg4oCUIG9ubHkgcm90YXRlZCBvbiBleHBsaWNpdCByZXF1ZXN0IChQaGFzZSAyKS5cbiAgLy8gRmVhdHVyZSBmbGFnIERPTExIT1VTRV9XRUJfQVVUSF9FTkFCTEVEIGNvbnRyb2xzIGVuZm9yY2VtZW50OyB0aGUgZmlsZVxuICAvLyBpcyBnZW5lcmF0ZWQgcmVnYXJkbGVzcyBzbyBjb25zdW1lcnMgY2FuIGF0dGFjaCB0b2tlbnMgcHJlZW1wdGl2ZWx5LlxuICBjb25zdCB0b2tlblN0b3JlID0gbmV3IENvbnNvbGVUb2tlblN0b3JlKGVudi5ET0xMSE9VU0VfQ09OU09MRV9UT0tFTl9GSUxFKTtcbiAgY29uc3QgcHJpbWFyeVRva2VuID0gYXdhaXQgdG9rZW5TdG9yZS5lbnN1cmVJbml0aWFsaXplZChwaWNrUmFuZG9tVG9rZW5OYW1lKCkpO1xuICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBDb25zb2xlIHRva2VuIHN0b3JlIGluaXRpYWxpemVkJywge1xuICAgIHRva2VuSWQ6IHByaW1hcnlUb2tlbi5pZCxcbiAgICB0b2tlbk5hbWU6IHByaW1hcnlUb2tlbi5uYW1lLFxuICAgIGZpbGU6IHRva2VuU3RvcmUuZ2V0RmlsZVBhdGgoKSxcbiAgICBhdXRoRW5mb3JjZWQ6IGVudi5ET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCxcbiAgfSk7XG5cbiAgLy8gUHJlLWNyZWF0ZSBhIHBsYWNlaG9sZGVyIGJyb2FkY2FzdCB0aGF0IHdlJ2xsIHdpcmUgdXAgYWZ0ZXIgdGhlIHNlcnZlciBzdGFydHNcbiAgbGV0IGxpdmVCcm9hZGNhc3Q6ICgoZW50cnk6IFVuaWZpZWRMb2dFbnRyeSkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIGxldCBsaXZlTWV0cmljc09uU25hcHNob3Q6ICgoc25hcHNob3Q6IE1ldHJpY1NuYXBzaG90KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcblxuICAvLyBDcmVhdGUgaW5nZXN0aW9uIHJvdXRlcyB3aXRoIGEgZGVmZXJyZWQgYnJvYWRjYXN0ICh3aXJlZCBhZnRlciBzZXJ2ZXIgc3RhcnRzKVxuICBjb25zdCBpbmdlc3RSZXN1bHQgPSBjcmVhdGVJbmdlc3RSb3V0ZXMoe1xuICAgIGxvZ0Jyb2FkY2FzdDogKGVudHJ5KSA9PiBsaXZlQnJvYWRjYXN0Py4oZW50cnkpLFxuICAgIG1ldHJpY3NPblNuYXBzaG90OiAoc25hcHNob3QpID0+IGxpdmVNZXRyaWNzT25TbmFwc2hvdD8uKHNuYXBzaG90KSxcbiAgfSk7XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIGxlYWRlciBhcyBhIHNlc3Npb25cbiAgaW5nZXN0UmVzdWx0LnJlZ2lzdGVyTGVhZGVyU2Vzc2lvbihvcHRpb25zLnNlc3Npb25JZCwgcHJvY2Vzcy5waWQpO1xuXG4gIC8vIFJlZ2lzdGVyIHRoZSB3ZWIgY29uc29sZSBpdHNlbGYgc28gdGhlIHNlc3Npb24gaW5kaWNhdG9yIGlzIG5ldmVyIGVtcHR5ICgjMTgwNSlcbiAgaW5nZXN0UmVzdWx0LnJlZ2lzdGVyQ29uc29sZVNlc3Npb24oKTtcblxuICAvLyBTdGFydCB0aGUgd2ViIHNlcnZlciB3aXRoIGluZ2VzdCByb3V0ZXMgbW91bnRlZCBiZWZvcmUgdGhlIFNQQSBmYWxsYmFjay5cbiAgLy8gSWYgdGhlIHBvcnQgaXMgb2NjdXBpZWQgYnkgYSBzdGFsZSBwcm9jZXNzLCByZXRyeSB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gIGNvbnN0IHNlcnZlck9wdHMgPSB7XG4gICAgcG9ydGZvbGlvRGlyOiBvcHRpb25zLnBvcnRmb2xpb0RpcixcbiAgICBtZW1vcnlTaW5rOiBvcHRpb25zLm1lbW9yeVNpbmssXG4gICAgbWV0cmljc1Npbms6IG9wdGlvbnMubWV0cmljc1NpbmssXG4gICAgcG9ydDogY29uc29sZVBvcnQsXG4gICAgYWRkaXRpb25hbFJvdXRlcnM6IFtpbmdlc3RSZXN1bHQucm91dGVyXSxcbiAgICB0b2tlblN0b3JlLFxuICAgIC4uLihvcHRpb25zLm1jcEFxbEhhbmRsZXIgPyB7IG1jcEFxbEhhbmRsZXI6IG9wdGlvbnMubWNwQXFsSGFuZGxlciB9IDoge30pLFxuICB9O1xuICAvLyBiaW5kQW5kTGlzdGVuIG5vdyBoYW5kbGVzIEVBRERSSU5VU0UgYnkgZmluZGluZyBhbmQga2lsbGluZyB0aGUgc3RhbGVcbiAgLy8gcHJvY2VzcyBvbiB0aGUgcG9ydCwgdGhlbiByZXRyeWluZy4gTm8gZXh0ZXJuYWwgcmV0cnkgbG9vcCBuZWVkZWQuXG4gIGNvbnN0IHdlYlJlc3VsdCA9IGF3YWl0IHN0YXJ0V2ViU2VydmVyKHNlcnZlck9wdHMpO1xuXG4gIGlmICh3ZWJSZXN1bHQuYmluZFJlc3VsdCAmJiAhd2ViUmVzdWx0LmJpbmRSZXN1bHQuc3VjY2Vzcykge1xuICAgIGxvZ2dlci5lcnJvcihgW1VuaWZpZWRDb25zb2xlXSBMZWFkZXIgZmFpbGVkIHRvIGJpbmQgcG9ydCAke2NvbnNvbGVQb3J0fSDigJQgY29uc29sZSB1bmF2YWlsYWJsZWApO1xuICB9XG5cbiAgLy8gV2lyZSBTU0UgYnJvYWRjYXN0cyBmb3IgdGhpcyBsZWFkZXIncyBvd24gZXZlbnRzXG4gIG9wdGlvbnMud2lyZVNTRUJyb2FkY2FzdHMod2ViUmVzdWx0LCBvcHRpb25zLm1ldHJpY3NTaW5rKTtcblxuICAvLyBOb3cgd2lyZSB0aGUgbGl2ZSBicm9hZGNhc3QgZnVuY3Rpb25zIGludG8gdGhlIGluZ2VzdCByb3V0ZXNcbiAgaWYgKHdlYlJlc3VsdC5sb2dCcm9hZGNhc3QpIHtcbiAgICBjb25zdCBvcmlnaW5hbEJyb2FkY2FzdCA9IHdlYlJlc3VsdC5sb2dCcm9hZGNhc3Q7XG4gICAgLy8gU3RhbXAgbGVhZGVyJ3Mgb3duIGVudHJpZXMgd2l0aCBzZXNzaW9uIElEXG4gICAgbGl2ZUJyb2FkY2FzdCA9IChlbnRyeTogVW5pZmllZExvZ0VudHJ5KSA9PiB7XG4gICAgICBjb25zdCBzdGFtcGVkOiBVbmlmaWVkTG9nRW50cnkgPSB7XG4gICAgICAgIC4uLmVudHJ5LFxuICAgICAgICBkYXRhOiB7IC4uLmVudHJ5LmRhdGEsIF9zZXNzaW9uSWQ6IG9wdGlvbnMuc2Vzc2lvbklkIH0sXG4gICAgICB9O1xuICAgICAgb3JpZ2luYWxCcm9hZGNhc3Qoc3RhbXBlZCk7XG4gICAgfTtcbiAgfVxuICBsaXZlTWV0cmljc09uU25hcHNob3QgPSB3ZWJSZXN1bHQubWV0cmljc09uU25hcHNob3Q7XG5cbiAgbG9nZ2VyLmluZm8oJ1tVbmlmaWVkQ29uc29sZV0gSW5nZXN0aW9uIHJvdXRlcyBtb3VudGVkJyk7XG5cbiAgLy8gU3RhcnQgaGVhcnRiZWF0IGFuZCByZWdpc3RlciBjbGVhbnVwXG4gIGNvbnN0IHN0b3BIZWFydGJlYXQgPSBzdGFydEhlYXJ0YmVhdChlbGVjdGlvbi5sZWFkZXJJbmZvKTtcbiAgcmVnaXN0ZXJMZWFkZXJDbGVhbnVwKCk7XG5cbiAgbG9nZ2VyLmluZm8oJ1tVbmlmaWVkQ29uc29sZV0gTGVhZGVyIHN0YXJ0ZWQnLCB7XG4gICAgc2Vzc2lvbklkOiBvcHRpb25zLnNlc3Npb25JZCwgcG9ydDogY29uc29sZVBvcnQsIHBpZDogcHJvY2Vzcy5waWQsXG4gICAgcm9sZTogJ2xlYWRlcicsIGluZ2VzdFJvdXRlczogWycvYXBpL2luZ2VzdC9sb2dzJywgJy9hcGkvaW5nZXN0L21ldHJpY3MnLCAnL2FwaS9pbmdlc3Qvc2Vzc2lvbicsICcvYXBpL3Nlc3Npb25zJ10sXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcm9sZTogJ2xlYWRlcicsXG4gICAgZWxlY3Rpb24sXG4gICAgcG9ydDogY29uc29sZVBvcnQsXG4gICAgY2xlYW51cDogYXN5bmMgKCkgPT4ge1xuICAgICAgc3RvcEhlYXJ0YmVhdCgpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogU3RhcnQgYXMgYSBmb2xsb3dlci5cbiAqIFJlZ2lzdGVycyBmb3J3YXJkaW5nIHNpbmtzIHdpdGggdGhlIExvZ01hbmFnZXIsIHN0YXJ0cyBzZXNzaW9uIGhlYXJ0YmVhdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhcnRBc0ZvbGxvd2VyKFxuICBvcHRpb25zOiBVbmlmaWVkQ29uc29sZU9wdGlvbnMsXG4gIGVsZWN0aW9uOiBFbGVjdGlvblJlc3VsdCxcbiAgY29uc29sZVBvcnQ6IG51bWJlciA9IERFRkFVTFRfQ09OU09MRV9QT1JULFxuKTogUHJvbWlzZTxVbmlmaWVkQ29uc29sZVJlc3VsdD4ge1xuICBjb25zdCBsZWFkZXJVcmwgPSBgaHR0cDovLzEyNy4wLjAuMToke2VsZWN0aW9uLmxlYWRlckluZm8ucG9ydH1gO1xuXG4gIC8vIFJlYWQgdGhlIGNvbnNvbGUgYXV0aCB0b2tlbiAoIzE3ODApIHdyaXR0ZW4gYnkgdGhlIGxlYWRlci4gTWF5IGJlIG51bGxcbiAgLy8gaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCB5ZXQg4oCUIHRoZSBzaW5rcyBoYW5kbGUgdGhhdCBncmFjZWZ1bGx5IGFuZFxuICAvLyBzaW1wbHkgb21pdCB0aGUgQmVhcmVyIGhlYWRlciwgd2hpY2ggaXMgZmluZSB3aGVuIGF1dGggaXMgbm90IGVuZm9yY2VkLlxuICBjb25zdCB7IGdldFByaW1hcnlUb2tlbkZyb21GaWxlIH0gPSBhd2FpdCBpbXBvcnQoJy4vY29uc29sZVRva2VuLmpzJyk7XG4gIGNvbnN0IGF1dGhUb2tlbiA9IGF3YWl0IGdldFByaW1hcnlUb2tlbkZyb21GaWxlKGVudi5ET0xMSE9VU0VfQ09OU09MRV9UT0tFTl9GSUxFKTtcbiAgaWYgKGF1dGhUb2tlbikge1xuICAgIGxvZ2dlci5kZWJ1ZygnW1VuaWZpZWRDb25zb2xlXSBGb2xsb3dlciBsb2FkZWQgY29uc29sZSBhdXRoIHRva2VuJyk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdbVW5pZmllZENvbnNvbGVdIE5vIGNvbnNvbGUgYXV0aCB0b2tlbiBmaWxlIGZvdW5kOyBmb2xsb3dlciB3aWxsIFBPU1Qgd2l0aG91dCBCZWFyZXIgaGVhZGVyJyk7XG4gIH1cblxuICAvLyBQZXItaW5zdGFuY2UgcHJvbW90aW9uIG1hbmFnZXIg4oCUIHRyYWNrcyBpdHMgb3duIGF0dGVtcHQgY291bnRlciBzb1xuICAvLyBtdWx0aXBsZSBmb2xsb3dlcnMgZG9uJ3QgaW50ZXJmZXJlIHdpdGggZWFjaCBvdGhlcidzIHByb21vdGlvbiBidWRnZXRzLlxuICBjb25zdCBwcm9tb3Rpb25NZ3IgPSBuZXcgUHJvbW90aW9uTWFuYWdlcihvcHRpb25zLCBjb25zb2xlUG9ydCwgc3RhcnRBc0xlYWRlciwgc3RhcnRBc0ZvbGxvd2VyKTtcblxuICAvLyBEZWNsYXJlIHNlc3Npb25IZWFydGJlYXQgYmVmb3JlIHRoZSBzaW5rIHNvIHRoZSBjbG9zdXJlIGNhbiBjYXB0dXJlIGl0LlxuICAvLyBCb3RoIGFyZSBpbml0aWFsaXplZCBiZWZvcmUgdGhlIGNhbGxiYWNrIGNvdWxkIHBvc3NpYmx5IGZpcmUgKG5lZWRzIDUrIGZhaWxlZCBmbHVzaGVzKS5cbiAgbGV0IHNlc3Npb25IZWFydGJlYXQ6IFNlc3Npb25IZWFydGJlYXQ7XG5cbiAgLy8gUmVnaXN0ZXIgYSBmb3J3YXJkaW5nIGxvZyBzaW5rIHdpdGggbGVhZGVyLWRlYXRoIGNhbGxiYWNrICgjMTg1MCkuXG4gIGNvbnN0IGZvcndhcmRpbmdTaW5rID0gbmV3IExlYWRlckZvcndhcmRpbmdMb2dTaW5rKGxlYWRlclVybCwgb3B0aW9ucy5zZXNzaW9uSWQsIGF1dGhUb2tlbiwgKCkgPT4ge1xuICAgIHByb21vdGlvbk1nci5wcm9tb3RlKGZvcndhcmRpbmdTaW5rLCBzZXNzaW9uSGVhcnRiZWF0KVxuICAgICAgLmNhdGNoKGVyciA9PiBsb2dnZXIuZXJyb3IoJ1tVbmlmaWVkQ29uc29sZV0gUHJvbW90aW9uIGNyYXNoZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KSk7XG4gIH0pO1xuICBvcHRpb25zLnJlZ2lzdGVyTG9nU2luayhmb3J3YXJkaW5nU2luayk7XG5cbiAgLy8gU3RhcnQgc2Vzc2lvbiBoZWFydGJlYXQgdG8gdGhlIGxlYWRlclxuICBzZXNzaW9uSGVhcnRiZWF0ID0gbmV3IFNlc3Npb25IZWFydGJlYXQobGVhZGVyVXJsLCBvcHRpb25zLnNlc3Npb25JZCwgcHJvY2Vzcy5waWQsIGF1dGhUb2tlbik7XG4gIGF3YWl0IHNlc3Npb25IZWFydGJlYXQuc3RhcnQoKTtcblxuICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBGb2xsb3dlciBzdGFydGVkJywge1xuICAgIHNlc3Npb25JZDogb3B0aW9ucy5zZXNzaW9uSWQsIHBpZDogcHJvY2Vzcy5waWQsIHJvbGU6ICdmb2xsb3dlcicsXG4gICAgbGVhZGVyU2Vzc2lvbjogZWxlY3Rpb24ubGVhZGVySW5mby5zZXNzaW9uSWQsIGxlYWRlclBpZDogZWxlY3Rpb24ubGVhZGVySW5mby5waWQsXG4gICAgbGVhZGVyUG9ydDogZWxlY3Rpb24ubGVhZGVySW5mby5wb3J0LCBsZWFkZXJVcmwsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcm9sZTogJ2ZvbGxvd2VyJyxcbiAgICBlbGVjdGlvbixcbiAgICBjbGVhbnVwOiBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXNzaW9uSGVhcnRiZWF0LnN0b3AoKTtcbiAgICAgIGF3YWl0IGZvcndhcmRpbmdTaW5rLmNsb3NlKCk7XG4gICAgfSxcbiAgfTtcbn1cblxuIl19
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5pZmllZENvbnNvbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL2NvbnNvbGUvVW5pZmllZENvbnNvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQU1ILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsV0FBVyxFQUNYLDJCQUEyQixFQUMzQixvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLHFCQUFxQixFQUNyQixrQkFBa0IsR0FFbkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGdCQUFnQixHQUNqQixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQztBQW9DNUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSwwQkFBMEIsQ0FDOUMsV0FBbUIsRUFDbkIsU0FBb0Msa0JBQWtCLEVBQ3RELE1BQXFCLE1BQU07SUFFM0IsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLEVBQUUsQ0FBQztRQUM5QixJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QixHQUFHLENBQUMsSUFBSSxDQUNOLDZFQUE2RTtnQkFDN0UsUUFBUSxNQUFNLENBQUMsR0FBRyxVQUFVLE1BQU0sQ0FBQyxJQUFJLDRCQUE0QjtnQkFDbkUs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cmF0b3IuXG4gKlxuICogVGllcyB0b2dldGhlciBsZWFkZXIgZWxlY3Rpb24sIGNvbnNvbGUgc3RhcnR1cCwgZm9sbG93ZXIgd2lyaW5nLFxuICogYW5kIHNlc3Npb24gbGlmZWN5Y2xlIG1hbmFnZW1lbnQuIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnRcbiAqIGNhbGxlZCBieSB0aGUgREkgY29udGFpbmVyIGR1cmluZyBkZWZlcnJlZCBzZXR1cC5cbiAqXG4gKiBGbG93OlxuICogMS4gUnVuIGxlYWRlciBlbGVjdGlvbiAocmVhZCBsb2NrIGZpbGUsIGNsYWltIG9yIGZvbGxvdylcbiAqIDIuIElmIGxlYWRlcjogc3RhcnQgd2ViIHNlcnZlciBvbiBmaXhlZCBwb3J0LCBtb3VudCBpbmdlc3Qgcm91dGVzLCBzdGFydCBoZWFydGJlYXRcbiAqIDMuIElmIGZvbGxvd2VyOiByZWdpc3RlciBmb3J3YXJkaW5nIHNpbmtzIHdpdGggTG9nTWFuYWdlciwgc3RhcnQgc2Vzc2lvbiBoZWFydGJlYXRcbiAqXG4gKiBAc2luY2UgdjIuMS4wIOKAlCBJc3N1ZSAjMTcwMFxuICovXG5cbmltcG9ydCB0eXBlIHsgVW5pZmllZExvZ0VudHJ5IH0gZnJvbSAnLi4vLi4vbG9nZ2luZy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1ldHJpY1NuYXBzaG90IH0gZnJvbSAnLi4vLi4vbWV0cmljcy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeUxvZ1NpbmsgfSBmcm9tICcuLi8uLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlNZXRyaWNzU2luayB9IGZyb20gJy4uLy4uL21ldHJpY3Mvc2lua3MvTWVtb3J5TWV0cmljc1NpbmsuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7XG4gIGVsZWN0TGVhZGVyLFxuICBpc0xlYWRlcldlYkNvbnNvbGVSZWFjaGFibGUsXG4gIGZvcmNlQ2xhaW1MZWFkZXJzaGlwLFxuICBzdGFydEhlYXJ0YmVhdCxcbiAgcmVnaXN0ZXJMZWFkZXJDbGVhbnVwLFxuICBkZXRlY3RMZWdhY3lMZWFkZXIsXG4gIHR5cGUgRWxlY3Rpb25SZXN1bHQsXG59IGZyb20gJy4vTGVhZGVyRWxlY3Rpb24uanMnO1xuaW1wb3J0IHsgY3JlYXRlSW5nZXN0Um91dGVzIH0gZnJvbSAnLi9Jbmdlc3RSb3V0ZXMuanMnO1xuaW1wb3J0IHtcbiAgTGVhZGVyRm9yd2FyZGluZ0xvZ1NpbmssXG4gIFNlc3Npb25IZWFydGJlYXQsXG59IGZyb20gJy4vTGVhZGVyRm9yd2FyZGluZ1NpbmsuanMnO1xuaW1wb3J0IHsgUHJvbW90aW9uTWFuYWdlciB9IGZyb20gJy4vUHJvbW90aW9uTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBDb25zb2xlVG9rZW5TdG9yZSB9IGZyb20gJy4vY29uc29sZVRva2VuLmpzJztcbmltcG9ydCB7IGVudiB9IGZyb20gJy4uLy4uL2NvbmZpZy9lbnYuanMnO1xuXG4vKipcbiAqIERlZmF1bHQgY29uc29sZSBwb3J0IGZyb20gdGhlIGVudiB2YXIuIFVzZWQgYXMgZmFsbGJhY2sgd2hlbiBubyBwb3J0XG4gKiBpcyBwcm92aWRlZCB2aWEgY29uZmlnIGZpbGUgb3Igb3B0aW9ucy4gVGhlIHJlc29sdXRpb24gaGllcmFyY2h5IGlzOlxuICogICAxLiBvcHRpb25zLnBvcnQgKGZyb20gY29uZmlnIGZpbGUsIHJlc29sdmVkIGJ5IHRoZSBESSBjb250YWluZXIpXG4gKiAgIDIuIERPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUIGVudiB2YXJcbiAqICAgMy4gNDE3MTUgKGhhcmRjb2RlZCBkZWZhdWx0IGluIGVudi50cylcbiAqL1xuY29uc3QgREVGQVVMVF9DT05TT0xFX1BPUlQgPSBlbnYuRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlQ7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgdGhlIHVuaWZpZWQgY29uc29sZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbmlmaWVkQ29uc29sZU9wdGlvbnMge1xuICAvKiogVGhpcyBwcm9jZXNzJ3MgdW5pcXVlIHNlc3Npb24gSUQgKi9cbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIC8qKiBQb3J0Zm9saW8gYmFzZSBkaXJlY3RvcnkgKGZvciBzdGFydFdlYlNlcnZlcikgKi9cbiAgcG9ydGZvbGlvRGlyOiBzdHJpbmc7XG4gIC8qKiBMb2cgbWVtb3J5IHNpbmsgKGZvciBjb25zb2xlIGhpc3RvcnkpICovXG4gIG1lbW9yeVNpbms6IE1lbW9yeUxvZ1Npbms7XG4gIC8qKiBNZXRyaWNzIG1lbW9yeSBzaW5rICovXG4gIG1ldHJpY3NTaW5rPzogTWVtb3J5TWV0cmljc1Npbms7XG4gIC8qKiBNQ1AtQVFMIGhhbmRsZXIgZm9yIHBlcm1pc3Npb24gcm91dGVzICh0eXBlZCBhcyBhbnkgdG8gYXZvaWQgY2lyY3VsYXIgaW1wb3J0cykgKi9cbiAgbWNwQXFsSGFuZGxlcj86IGFueTtcbiAgLyoqIENhbGxiYWNrIHRvIHJlZ2lzdGVyIGEgbG9nIHNpbmsgd2l0aCB0aGUgTG9nTWFuYWdlciAqL1xuICByZWdpc3RlckxvZ1Npbms6IChzaW5rOiB7IHdyaXRlKGVudHJ5OiBVbmlmaWVkTG9nRW50cnkpOiB2b2lkOyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+OyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IH0pID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayB0byB3aXJlIFNTRSBicm9hZGNhc3RzIGFmdGVyIHdlYiBzZXJ2ZXIgc3RhcnRzICovXG4gIHdpcmVTU0VCcm9hZGNhc3RzOiAod2ViUmVzdWx0OiB7IGxvZ0Jyb2FkY2FzdD86IChlbnRyeTogVW5pZmllZExvZ0VudHJ5KSA9PiB2b2lkOyBtZXRyaWNzT25TbmFwc2hvdD86IChzbmFwc2hvdDogTWV0cmljU25hcHNob3QpID0+IHZvaWQgfSwgbWV0cmljc1Npbms/OiBNZW1vcnlNZXRyaWNzU2luaykgPT4gdm9pZDtcbiAgLyoqIENvbnNvbGUgcG9ydCBvdmVycmlkZSBmcm9tIGNvbmZpZyBmaWxlLiBGYWxscyBiYWNrIHRvIGVudiB2YXIgaWYgbm90IHByb3ZpZGVkLiAqL1xuICBwb3J0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBzdGFydGluZyB0aGUgdW5pZmllZCBjb25zb2xlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaWZpZWRDb25zb2xlUmVzdWx0IHtcbiAgcm9sZTogJ2xlYWRlcicgfCAnZm9sbG93ZXInO1xuICBlbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQ7XG4gIC8qKiBQb3J0IHRoZSBjb25zb2xlIGlzIHJ1bm5pbmcgb24gKGxlYWRlciBvbmx5KSAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogQ2xlYW51cCBmdW5jdGlvbiB0byBjYWxsIG9uIHNodXRkb3duICovXG4gIGNsZWFudXA6ICgpID0+IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQ2hlY2sgZm9yIGEgcnVubmluZyBsZWdhY3kgKHByZS1hdXRoZW50aWNhdGlvbikgRG9sbGhvdXNlTUNQIGNvbnNvbGUgYW5kXG4gKiBsb2cgYSBXQVJOLWxldmVsIG1lc3NhZ2UgaWYgb25lIGlzIGZvdW5kICgjMTc5NCkuXG4gKlxuICogRXh0cmFjdGVkIGZyb20gYHN0YXJ0VW5pZmllZENvbnNvbGVgIHNvIHRoZSB3aXJpbmcgY2FuIGJlIGludGVncmF0aW9uLVxuICogdGVzdGVkIGluIGlzb2xhdGlvbiB3aXRob3V0IHNwaW5uaW5nIHVwIGEgZnVsbCB3ZWIgc2VydmVyIGFuZCBsZWFkZXJcbiAqIGVsZWN0aW9uLiBUaGUgaW1wbGVtZW50YXRpb24gaXMgZmlyZS1hbmQtZm9yZ2V0OiBkZXRlY3Rpb24gZmFpbHVyZXNcbiAqIGFyZSBsb2dnZWQgYXQgREVCVUcgYW5kIG5ldmVyIHByb3BhZ2F0ZSwgYmVjYXVzZSBhIGZhaWx1cmUgaGVyZSBtdXN0XG4gKiBub3QgYmxvY2sgbGVhZGVyIGVsZWN0aW9uIG9mIHRoZSBhdXRoZW50aWNhdGVkIGNvbnNvbGUuXG4gKlxuICogQHBhcmFtIGN1cnJlbnRQb3J0IC0gVGhlIHBvcnQgdGhlIGF1dGhlbnRpY2F0ZWQgY29uc29sZSBpbnRlbmRzIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICBiaW5kIHRvLiBVc2VkIGluIHRoZSB3YXJuaW5nIG1lc3NhZ2UgdG8gaGVscCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgIHVzZXIgdGVsbCB0aGUgdHdvIGNvbnNvbGVzIGFwYXJ0LlxuICogQHBhcmFtIGRldGVjdCAgICAgIC0gT3B0aW9uYWwgaW5qZWN0aW9uIHBvaW50IGZvciB0aGUgZGV0ZWN0aW9uXG4gKiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4gRGVmYXVsdHMgdG8gYGRldGVjdExlZ2FjeUxlYWRlcmAuIFRlc3RzXG4gKiAgICAgICAgICAgICAgICAgICAgICBwYXNzIGEgc3R1Yi5cbiAqIEBwYXJhbSBsb2cgICAgICAgICAtIE9wdGlvbmFsIGluamVjdGlvbiBwb2ludCBmb3IgdGhlIGxvZ2dlci4gRGVmYXVsdHNcbiAqICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBtb2R1bGUgbG9nZ2VyLiBUZXN0cyBwYXNzIGEgc3B5LlxuICogQHJldHVybnMgVGhlIGxlZ2FjeSBsZWFkZXIgaW5mbyBmcm9tIGBkZXRlY3QoKWAsIG9yIG51bGwgaWYgZGV0ZWN0aW9uXG4gKiAgICAgICAgICB0aHJldy4gRXhwb3NlZCBzbyB0ZXN0cyBjYW4gYXNzZXJ0IHRoZSBmdWxsIHJlc3VsdCBzaGFwZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhcm5JZkxlZ2FjeUNvbnNvbGVQcmVzZW50KFxuICBjdXJyZW50UG9ydDogbnVtYmVyLFxuICBkZXRlY3Q6IHR5cGVvZiBkZXRlY3RMZWdhY3lMZWFkZXIgPSBkZXRlY3RMZWdhY3lMZWFkZXIsXG4gIGxvZzogdHlwZW9mIGxvZ2dlciA9IGxvZ2dlcixcbik6IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBkZXRlY3RMZWdhY3lMZWFkZXI+PiB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBsZWdhY3kgPSBhd2FpdCBkZXRlY3QoKTtcbiAgICBpZiAobGVnYWN5LmxlZ2FjeVJ1bm5pbmcpIHtcbiAgICAgIGxvZy53YXJuKFxuICAgICAgICBgW1VuaWZpZWRDb25zb2xlXSBMZWdhY3kgKHByZS1hdXRoZW50aWNhdGlvbikgRG9sbGhvdXNlTUNQIGNvbnNvbGUgZGV0ZWN0ZWQgYCArXG4gICAgICAgIGAocGlkPSR7bGVnYWN5LnBpZH0sIHBvcnQ9JHtsZWdhY3kucG9ydH0pLiBCb3RoIGNvbnNvbGVzIHdpbGwgcnVuIGAgK1xuICAgICAgICBgaW5kZXBlbmRlbnRseSBvbiBkaWZmZXJlbnQgcG9ydHMgd2l0aCBkaWZmZXJlbnQgc2VjdXJpdHkgcG9zdHVyZS4gYCArXG4gICAgICAgIGBUaGUgYXV0aGVudGljYXRlZCBjb25zb2xlICh0aGlzIHByb2Nlc3MpIHVzZXMgcG9ydCAke2N1cnJlbnRQb3J0fTsgYCArXG4gICAgICAgIGB0aGUgbGVnYWN5IGNvbnNvbGUgdXNlcyBwb3J0ICR7bGVnYWN5LnBvcnQgPz8gMzkzOX0uIGAgK1xuICAgICAgICBgRm9yIGNvbnNpc3RlbnQgc2VjdXJpdHksIHVwZGF0ZSB0aGUgbGVnYWN5IGluc3RhbGxhdGlvbiB0byBhIGAgK1xuICAgICAgICBgdmVyc2lvbiB3aXRoIHRoZSBhdXRoZW50aWNhdGVkIGNvbnNvbGUuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBsZWdhY3k7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIEJlc3QtZWZmb3J0IOKAlCBuZXZlciBibG9jayBlbGVjdGlvbiBvbiBhIGRldGVjdGlvbiBmYWlsdXJlXG4gICAgbG9nLmRlYnVnKCdbVW5pZmllZENvbnNvbGVdIExlZ2FjeSBsZWFkZXIgZGV0ZWN0aW9uIGZhaWxlZCcsIHtcbiAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBTdGFydCB0aGUgdW5pZmllZCB3ZWIgY29uc29sZS5cbiAqXG4gKiBSdW5zIGxlYWRlciBlbGVjdGlvbiwgdGhlbiBlaXRoZXIgc3RhcnRzIHRoZSBmdWxsIGNvbnNvbGUgKGxlYWRlcilcbiAqIG9yIHNldHMgdXAgZXZlbnQgZm9yd2FyZGluZyAoZm9sbG93ZXIpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRVbmlmaWVkQ29uc29sZShvcHRpb25zOiBVbmlmaWVkQ29uc29sZU9wdGlvbnMpOiBQcm9taXNlPFVuaWZpZWRDb25zb2xlUmVzdWx0PiB7XG4gIC8vIFJlc29sdmUgcG9ydDogb3B0aW9ucyAoY29uZmlnIGZpbGUpIOKGkiBlbnYgdmFyIOKGkiBkZWZhdWx0XG4gIGNvbnN0IGNvbnNvbGVQb3J0ID0gb3B0aW9ucy5wb3J0IHx8IERFRkFVTFRfQ09OU09MRV9QT1JUO1xuICBsb2dnZXIuZGVidWcoYFtVbmlmaWVkQ29uc29sZV0gUG9ydCByZXNvbHZlZDogJHtjb25zb2xlUG9ydH1gICtcbiAgICAob3B0aW9ucy5wb3J0ID8gJyAoZnJvbSBjb25maWcgZmlsZSknIDogYCAoZnJvbSBlbnYvZGVmYXVsdClgKSk7XG5cbiAgLy8gTGVnYWN5LWxlYWRlciBkZXRlY3Rpb24gKCMxNzk0KSDigJQgd2FybiB0aGUgdXNlciBpZiBhIHByZS1hdXRoXG4gIC8vIERvbGxob3VzZU1DUCBjb25zb2xlIGlzIHJ1bm5pbmcgYWxvbmdzaWRlIHRoaXMgYXV0aGVudGljYXRlZCBvbmUuXG4gIC8vIFRoZXkgd2lsbCBjb2V4aXN0IGZpbmUgYmVjYXVzZSBvZiBwb3J0ICsgbG9jayArIHRva2VuIGZpbGUgaXNvbGF0aW9uLFxuICAvLyBidXQgdGhlIHVzZXIgc2hvdWxkIGtub3cgYm90aCBleGlzdCBzbyB0aGUgZGlmZmVyaW5nIHNlY3VyaXR5IHBvc3R1cmVcbiAgLy8gYmV0d2VlbiB0aGVtIGRvZXNuJ3QgbG9vayBsaWtlIGEgYnVnLlxuICBhd2FpdCB3YXJuSWZMZWdhY3lDb25zb2xlUHJlc2VudChjb25zb2xlUG9ydCk7XG5cbiAgbGV0IGVsZWN0aW9uID0gYXdhaXQgZWxlY3RMZWFkZXIob3B0aW9ucy5zZXNzaW9uSWQsIGNvbnNvbGVQb3J0KTtcblxuICAvLyBJZiB3ZSBsb3N0IHRoZSBlbGVjdGlvbiwgY2hlY2sgaWYgdGhlIGxlYWRlciBpcyBhY3R1YWxseSBydW5uaW5nIGEgd2ViIGNvbnNvbGUuXG4gIC8vIEFuIE1DUCBzdGRpbyBwcm9jZXNzIG1heSBob2xkIGxlYWRlcnNoaXAgYnV0IG5vdCBzZXJ2ZSB3ZWIgcm91dGVzLlxuICAvLyBJbiB0aGF0IGNhc2UsIGZvcmNlIGEgdGFrZW92ZXIgc28gdGhlIHdlYiBjb25zb2xlIHdvcmtzIHByb3Blcmx5LlxuICBpZiAoZWxlY3Rpb24ucm9sZSA9PT0gJ2ZvbGxvd2VyJykge1xuICAgIGNvbnN0IHJlYWNoYWJsZSA9IGF3YWl0IGlzTGVhZGVyV2ViQ29uc29sZVJlYWNoYWJsZShlbGVjdGlvbi5sZWFkZXJJbmZvKTtcbiAgICBpZiAoIXJlYWNoYWJsZSkge1xuICAgICAgZWxlY3Rpb24gPSBhd2FpdCBmb3JjZUNsYWltTGVhZGVyc2hpcChvcHRpb25zLnNlc3Npb25JZCwgY29uc29sZVBvcnQpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChlbGVjdGlvbi5yb2xlID09PSAnbGVhZGVyJykge1xuICAgIHJldHVybiBzdGFydEFzTGVhZGVyKG9wdGlvbnMsIGVsZWN0aW9uLCBjb25zb2xlUG9ydCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0YXJ0QXNGb2xsb3dlcihvcHRpb25zLCBlbGVjdGlvbiwgY29uc29sZVBvcnQpO1xuICB9XG59XG5cbi8qKlxuICogU3RhcnQgYXMgdGhlIGNvbnNvbGUgbGVhZGVyLlxuICogQmluZHMgdGhlIHJlc29sdmVkIGNvbnNvbGUgcG9ydCAoY29uZmlnIGZpbGUg4oaSIGVudiB2YXIg4oaSIGRlZmF1bHQpLFxuICogbW91bnRzIGFsbCByb3V0ZXMgaW5jbHVkaW5nIGluZ2VzdGlvbiwgc3RhcnRzIGhlYXJ0YmVhdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhcnRBc0xlYWRlcihcbiAgb3B0aW9uczogVW5pZmllZENvbnNvbGVPcHRpb25zLFxuICBlbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQsXG4gIGNvbnNvbGVQb3J0OiBudW1iZXIgPSBERUZBVUxUX0NPTlNPTEVfUE9SVCxcbik6IFByb21pc2U8VW5pZmllZENvbnNvbGVSZXN1bHQ+IHtcbiAgY29uc3QgeyBzdGFydFdlYlNlcnZlciB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zZXJ2ZXIuanMnKTtcbiAgY29uc3QgeyBwaWNrUmFuZG9tVG9rZW5OYW1lIH0gPSBhd2FpdCBpbXBvcnQoJy4vU2Vzc2lvbk5hbWVzLmpzJyk7XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgY29uc29sZSB0b2tlbiBzdG9yZSAoIzE3ODApLiBDcmVhdGVzIHRoZSB0b2tlbiBmaWxlIG9uXG4gIC8vIGZpcnN0IHJ1biwgcmVhZHMgdGhlIGV4aXN0aW5nIHRva2VucyBvbiBzdWJzZXF1ZW50IHJ1bnMuIFRoZSB0b2tlbiBpc1xuICAvLyBwZXJzaXN0ZW50IGFjcm9zcyByZXN0YXJ0cyDigJQgb25seSByb3RhdGVkIG9uIGV4cGxpY2l0IHJlcXVlc3QgKFBoYXNlIDIpLlxuICAvLyBGZWF0dXJlIGZsYWcgRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQgY29udHJvbHMgZW5mb3JjZW1lbnQ7IHRoZSBmaWxlXG4gIC8vIGlzIGdlbmVyYXRlZCByZWdhcmRsZXNzIHNvIGNvbnN1bWVycyBjYW4gYXR0YWNoIHRva2VucyBwcmVlbXB0aXZlbHkuXG4gIGNvbnN0IHRva2VuU3RvcmUgPSBuZXcgQ29uc29sZVRva2VuU3RvcmUoZW52LkRPTExIT1VTRV9DT05TT0xFX1RPS0VOX0ZJTEUpO1xuICBjb25zdCBwcmltYXJ5VG9rZW4gPSBhd2FpdCB0b2tlblN0b3JlLmVuc3VyZUluaXRpYWxpemVkKHBpY2tSYW5kb21Ub2tlbk5hbWUoKSk7XG4gIGxvZ2dlci5pbmZvKCdbVW5pZmllZENvbnNvbGVdIENvbnNvbGUgdG9rZW4gc3RvcmUgaW5pdGlhbGl6ZWQnLCB7XG4gICAgdG9rZW5JZDogcHJpbWFyeVRva2VuLmlkLFxuICAgIHRva2VuTmFtZTogcHJpbWFyeVRva2VuLm5hbWUsXG4gICAgZmlsZTogdG9rZW5TdG9yZS5nZXRGaWxlUGF0aCgpLFxuICAgIGF1dGhFbmZvcmNlZDogZW52LkRPTExIT1VTRV9XRUJfQVVUSF9FTkFCTEVELFxuICB9KTtcblxuICAvLyBQcmUtY3JlYXRlIGEgcGxhY2Vob2xkZXIgYnJvYWRjYXN0IHRoYXQgd2UnbGwgd2lyZSB1cCBhZnRlciB0aGUgc2VydmVyIHN0YXJ0c1xuICBsZXQgbGl2ZUJyb2FkY2FzdDogKChlbnRyeTogVW5pZmllZExvZ0VudHJ5KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgbGV0IGxpdmVNZXRyaWNzT25TbmFwc2hvdDogKChzbmFwc2hvdDogTWV0cmljU25hcHNob3QpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG4gIC8vIENyZWF0ZSBpbmdlc3Rpb24gcm91dGVzIHdpdGggYSBkZWZlcnJlZCBicm9hZGNhc3QgKHdpcmVkIGFmdGVyIHNlcnZlciBzdGFydHMpXG4gIGNvbnN0IGluZ2VzdFJlc3VsdCA9IGNyZWF0ZUluZ2VzdFJvdXRlcyh7XG4gICAgbG9nQnJvYWRjYXN0OiAoZW50cnkpID0+IGxpdmVCcm9hZGNhc3Q/LihlbnRyeSksXG4gICAgbWV0cmljc09uU25hcHNob3Q6IChzbmFwc2hvdCkgPT4gbGl2ZU1ldHJpY3NPblNuYXBzaG90Py4oc25hcHNob3QpLFxuICAgIHN0b3JlTWV0cmljc1NuYXBzaG90OiAoc25hcHNob3QpID0+IG9wdGlvbnMubWV0cmljc1Npbms/Lm9uU25hcHNob3Qoc25hcHNob3QpLFxuICB9KTtcblxuICAvLyBSZWdpc3RlciB0aGUgbGVhZGVyIGFzIGEgc2Vzc2lvblxuICBpbmdlc3RSZXN1bHQucmVnaXN0ZXJMZWFkZXJTZXNzaW9uKG9wdGlvbnMuc2Vzc2lvbklkLCBwcm9jZXNzLnBpZCk7XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIHdlYiBjb25zb2xlIGl0c2VsZiBzbyB0aGUgc2Vzc2lvbiBpbmRpY2F0b3IgaXMgbmV2ZXIgZW1wdHkgKCMxODA1KVxuICBpbmdlc3RSZXN1bHQucmVnaXN0ZXJDb25zb2xlU2Vzc2lvbigpO1xuXG4gIC8vIFN0YXJ0IHRoZSB3ZWIgc2VydmVyIHdpdGggaW5nZXN0IHJvdXRlcyBtb3VudGVkIGJlZm9yZSB0aGUgU1BBIGZhbGxiYWNrLlxuICAvLyBJZiB0aGUgcG9ydCBpcyBvY2N1cGllZCBieSBhIHN0YWxlIHByb2Nlc3MsIHJldHJ5IHdpdGggZXhwb25lbnRpYWwgYmFja29mZi5cbiAgY29uc3Qgc2VydmVyT3B0cyA9IHtcbiAgICBwb3J0Zm9saW9EaXI6IG9wdGlvbnMucG9ydGZvbGlvRGlyLFxuICAgIG1lbW9yeVNpbms6IG9wdGlvbnMubWVtb3J5U2luayxcbiAgICBtZXRyaWNzU2luazogb3B0aW9ucy5tZXRyaWNzU2luayxcbiAgICBwb3J0OiBjb25zb2xlUG9ydCxcbiAgICBhZGRpdGlvbmFsUm91dGVyczogW2luZ2VzdFJlc3VsdC5yb3V0ZXJdLFxuICAgIHRva2VuU3RvcmUsXG4gICAgLi4uKG9wdGlvbnMubWNwQXFsSGFuZGxlciA/IHsgbWNwQXFsSGFuZGxlcjogb3B0aW9ucy5tY3BBcWxIYW5kbGVyIH0gOiB7fSksXG4gIH07XG4gIC8vIGJpbmRBbmRMaXN0ZW4gbm93IGhhbmRsZXMgRUFERFJJTlVTRSBieSBmaW5kaW5nIGFuZCBraWxsaW5nIHRoZSBzdGFsZVxuICAvLyBwcm9jZXNzIG9uIHRoZSBwb3J0LCB0aGVuIHJldHJ5aW5nLiBObyBleHRlcm5hbCByZXRyeSBsb29wIG5lZWRlZC5cbiAgY29uc3Qgd2ViUmVzdWx0ID0gYXdhaXQgc3RhcnRXZWJTZXJ2ZXIoc2VydmVyT3B0cyk7XG5cbiAgaWYgKHdlYlJlc3VsdC5iaW5kUmVzdWx0ICYmICF3ZWJSZXN1bHQuYmluZFJlc3VsdC5zdWNjZXNzKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBbVW5pZmllZENvbnNvbGVdIExlYWRlciBmYWlsZWQgdG8gYmluZCBwb3J0ICR7Y29uc29sZVBvcnR9IOKAlCBjb25zb2xlIHVuYXZhaWxhYmxlYCk7XG4gIH1cblxuICAvLyBXaXJlIFNTRSBicm9hZGNhc3RzIGZvciB0aGlzIGxlYWRlcidzIG93biBldmVudHNcbiAgb3B0aW9ucy53aXJlU1NFQnJvYWRjYXN0cyh3ZWJSZXN1bHQsIG9wdGlvbnMubWV0cmljc1NpbmspO1xuXG4gIC8vIE5vdyB3aXJlIHRoZSBsaXZlIGJyb2FkY2FzdCBmdW5jdGlvbnMgaW50byB0aGUgaW5nZXN0IHJvdXRlc1xuICBpZiAod2ViUmVzdWx0LmxvZ0Jyb2FkY2FzdCkge1xuICAgIGNvbnN0IG9yaWdpbmFsQnJvYWRjYXN0ID0gd2ViUmVzdWx0LmxvZ0Jyb2FkY2FzdDtcbiAgICAvLyBTdGFtcCBsZWFkZXIncyBvd24gZW50cmllcyB3aXRoIHNlc3Npb24gSURcbiAgICBsaXZlQnJvYWRjYXN0ID0gKGVudHJ5OiBVbmlmaWVkTG9nRW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHN0YW1wZWQ6IFVuaWZpZWRMb2dFbnRyeSA9IHtcbiAgICAgICAgLi4uZW50cnksXG4gICAgICAgIGRhdGE6IHsgLi4uZW50cnkuZGF0YSwgX3Nlc3Npb25JZDogb3B0aW9ucy5zZXNzaW9uSWQgfSxcbiAgICAgIH07XG4gICAgICBvcmlnaW5hbEJyb2FkY2FzdChzdGFtcGVkKTtcbiAgICB9O1xuICB9XG4gIGxpdmVNZXRyaWNzT25TbmFwc2hvdCA9IHdlYlJlc3VsdC5tZXRyaWNzT25TbmFwc2hvdDtcblxuICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBJbmdlc3Rpb24gcm91dGVzIG1vdW50ZWQnKTtcblxuICAvLyBTdGFydCBoZWFydGJlYXQgYW5kIHJlZ2lzdGVyIGNsZWFudXBcbiAgY29uc3Qgc3RvcEhlYXJ0YmVhdCA9IHN0YXJ0SGVhcnRiZWF0KGVsZWN0aW9uLmxlYWRlckluZm8pO1xuICByZWdpc3RlckxlYWRlckNsZWFudXAoKTtcblxuICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBMZWFkZXIgc3RhcnRlZCcsIHtcbiAgICBzZXNzaW9uSWQ6IG9wdGlvbnMuc2Vzc2lvbklkLCBwb3J0OiBjb25zb2xlUG9ydCwgcGlkOiBwcm9jZXNzLnBpZCxcbiAgICByb2xlOiAnbGVhZGVyJywgaW5nZXN0Um91dGVzOiBbJy9hcGkvaW5nZXN0L2xvZ3MnLCAnL2FwaS9pbmdlc3QvbWV0cmljcycsICcvYXBpL2luZ2VzdC9zZXNzaW9uJywgJy9hcGkvc2Vzc2lvbnMnXSxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICByb2xlOiAnbGVhZGVyJyxcbiAgICBlbGVjdGlvbixcbiAgICBwb3J0OiBjb25zb2xlUG9ydCxcbiAgICBjbGVhbnVwOiBhc3luYyAoKSA9PiB7XG4gICAgICBzdG9wSGVhcnRiZWF0KCk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFydCBhcyBhIGZvbGxvd2VyLlxuICogUmVnaXN0ZXJzIGZvcndhcmRpbmcgc2lua3Mgd2l0aCB0aGUgTG9nTWFuYWdlciwgc3RhcnRzIHNlc3Npb24gaGVhcnRiZWF0LlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEFzRm9sbG93ZXIoXG4gIG9wdGlvbnM6IFVuaWZpZWRDb25zb2xlT3B0aW9ucyxcbiAgZWxlY3Rpb246IEVsZWN0aW9uUmVzdWx0LFxuICBjb25zb2xlUG9ydDogbnVtYmVyID0gREVGQVVMVF9DT05TT0xFX1BPUlQsXG4pOiBQcm9taXNlPFVuaWZpZWRDb25zb2xlUmVzdWx0PiB7XG4gIGNvbnN0IGxlYWRlclVybCA9IGBodHRwOi8vMTI3LjAuMC4xOiR7ZWxlY3Rpb24ubGVhZGVySW5mby5wb3J0fWA7XG5cbiAgLy8gUmVhZCB0aGUgY29uc29sZSBhdXRoIHRva2VuICgjMTc4MCkgd3JpdHRlbiBieSB0aGUgbGVhZGVyLiBNYXkgYmUgbnVsbFxuICAvLyBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IHlldCDigJQgdGhlIHNpbmtzIGhhbmRsZSB0aGF0IGdyYWNlZnVsbHkgYW5kXG4gIC8vIHNpbXBseSBvbWl0IHRoZSBCZWFyZXIgaGVhZGVyLCB3aGljaCBpcyBmaW5lIHdoZW4gYXV0aCBpcyBub3QgZW5mb3JjZWQuXG4gIGNvbnN0IHsgZ2V0UHJpbWFyeVRva2VuRnJvbUZpbGUgfSA9IGF3YWl0IGltcG9ydCgnLi9jb25zb2xlVG9rZW4uanMnKTtcbiAgY29uc3QgYXV0aFRva2VuID0gYXdhaXQgZ2V0UHJpbWFyeVRva2VuRnJvbUZpbGUoZW52LkRPTExIT1VTRV9DT05TT0xFX1RPS0VOX0ZJTEUpO1xuICBpZiAoYXV0aFRva2VuKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdbVW5pZmllZENvbnNvbGVdIEZvbGxvd2VyIGxvYWRlZCBjb25zb2xlIGF1dGggdG9rZW4nKTtcbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIuZGVidWcoJ1tVbmlmaWVkQ29uc29sZV0gTm8gY29uc29sZSBhdXRoIHRva2VuIGZpbGUgZm91bmQ7IGZvbGxvd2VyIHdpbGwgUE9TVCB3aXRob3V0IEJlYXJlciBoZWFkZXInKTtcbiAgfVxuXG4gIC8vIFBlci1pbnN0YW5jZSBwcm9tb3Rpb24gbWFuYWdlciDigJQgdHJhY2tzIGl0cyBvd24gYXR0ZW1wdCBjb3VudGVyIHNvXG4gIC8vIG11bHRpcGxlIGZvbGxvd2VycyBkb24ndCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyJ3MgcHJvbW90aW9uIGJ1ZGdldHMuXG4gIGNvbnN0IHByb21vdGlvbk1nciA9IG5ldyBQcm9tb3Rpb25NYW5hZ2VyKG9wdGlvbnMsIGNvbnNvbGVQb3J0LCBzdGFydEFzTGVhZGVyLCBzdGFydEFzRm9sbG93ZXIpO1xuXG4gIC8vIERlY2xhcmUgc2Vzc2lvbkhlYXJ0YmVhdCBiZWZvcmUgdGhlIHNpbmsgc28gdGhlIGNsb3N1cmUgY2FuIGNhcHR1cmUgaXQuXG4gIC8vIEJvdGggYXJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgY2FsbGJhY2sgY291bGQgcG9zc2libHkgZmlyZSAobmVlZHMgNSsgZmFpbGVkIGZsdXNoZXMpLlxuICBsZXQgc2Vzc2lvbkhlYXJ0YmVhdDogU2Vzc2lvbkhlYXJ0YmVhdDtcblxuICAvLyBSZWdpc3RlciBhIGZvcndhcmRpbmcgbG9nIHNpbmsgd2l0aCBsZWFkZXItZGVhdGggY2FsbGJhY2sgKCMxODUwKS5cbiAgY29uc3QgZm9yd2FyZGluZ1NpbmsgPSBuZXcgTGVhZGVyRm9yd2FyZGluZ0xvZ1NpbmsobGVhZGVyVXJsLCBvcHRpb25zLnNlc3Npb25JZCwgYXV0aFRva2VuLCAoKSA9PiB7XG4gICAgcHJvbW90aW9uTWdyLnByb21vdGUoZm9yd2FyZGluZ1NpbmssIHNlc3Npb25IZWFydGJlYXQpXG4gICAgICAuY2F0Y2goZXJyID0+IGxvZ2dlci5lcnJvcignW1VuaWZpZWRDb25zb2xlXSBQcm9tb3Rpb24gY3Jhc2hlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pKTtcbiAgfSk7XG4gIG9wdGlvbnMucmVnaXN0ZXJMb2dTaW5rKGZvcndhcmRpbmdTaW5rKTtcblxuICAvLyBTdGFydCBzZXNzaW9uIGhlYXJ0YmVhdCB0byB0aGUgbGVhZGVyXG4gIHNlc3Npb25IZWFydGJlYXQgPSBuZXcgU2Vzc2lvbkhlYXJ0YmVhdChsZWFkZXJVcmwsIG9wdGlvbnMuc2Vzc2lvbklkLCBwcm9jZXNzLnBpZCwgYXV0aFRva2VuKTtcbiAgYXdhaXQgc2Vzc2lvbkhlYXJ0YmVhdC5zdGFydCgpO1xuXG4gIGxvZ2dlci5pbmZvKCdbVW5pZmllZENvbnNvbGVdIEZvbGxvd2VyIHN0YXJ0ZWQnLCB7XG4gICAgc2Vzc2lvbklkOiBvcHRpb25zLnNlc3Npb25JZCwgcGlkOiBwcm9jZXNzLnBpZCwgcm9sZTogJ2ZvbGxvd2VyJyxcbiAgICBsZWFkZXJTZXNzaW9uOiBlbGVjdGlvbi5sZWFkZXJJbmZvLnNlc3Npb25JZCwgbGVhZGVyUGlkOiBlbGVjdGlvbi5sZWFkZXJJbmZvLnBpZCxcbiAgICBsZWFkZXJQb3J0OiBlbGVjdGlvbi5sZWFkZXJJbmZvLnBvcnQsIGxlYWRlclVybCxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICByb2xlOiAnZm9sbG93ZXInLFxuICAgIGVsZWN0aW9uLFxuICAgIGNsZWFudXA6IGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHNlc3Npb25IZWFydGJlYXQuc3RvcCgpO1xuICAgICAgYXdhaXQgZm9yd2FyZGluZ1NpbmsuY2xvc2UoKTtcbiAgICB9LFxuICB9O1xufVxuIl19
@@ -59,11 +59,21 @@
59
59
  .perm-dashboard {
60
60
  display: grid;
61
61
  grid-template-columns: 1fr 1fr;
62
- gap: 1rem;
62
+ gap: 0.875rem;
63
+ }
64
+
65
+ #tab-permissions {
66
+ padding-inline: clamp(0.5rem, 1vw, 1rem);
67
+ padding-bottom: calc(var(--site-footer-height, 4.5rem) + 1.5rem);
63
68
  }
64
69
 
65
70
  @media (max-width: 900px) {
66
71
  .perm-dashboard { grid-template-columns: 1fr; }
72
+
73
+ #tab-permissions {
74
+ padding-inline: 0.375rem;
75
+ padding-bottom: calc(var(--site-footer-height, 4.5rem) + 1.25rem);
76
+ }
67
77
  }
68
78
 
69
79
  /* ── Cards ─────────────────────────────────────────────────── */
@@ -73,6 +83,7 @@
73
83
  border: 1px solid var(--ink-100, #e2e8f0);
74
84
  border-radius: 0.5rem;
75
85
  overflow: hidden;
86
+ min-width: 0;
76
87
  }
77
88
 
78
89
  .perm-card--full {
@@ -83,7 +94,7 @@
83
94
  display: flex;
84
95
  align-items: center;
85
96
  justify-content: space-between;
86
- padding: 0.75rem 1rem;
97
+ padding: 0.65rem 0.875rem;
87
98
  background: var(--paper-base, #f8fafc);
88
99
  border-bottom: 1px solid var(--ink-100, #e2e8f0);
89
100
  cursor: pointer;
@@ -117,16 +128,113 @@
117
128
  }
118
129
 
119
130
  .perm-card-body {
120
- padding: 1rem;
131
+ padding: 0.875rem;
132
+ }
133
+
134
+ .perm-selected-header {
135
+ display: flex;
136
+ align-items: flex-start;
137
+ justify-content: space-between;
138
+ gap: 1rem;
139
+ margin-bottom: 1rem;
140
+ flex-wrap: wrap;
141
+ }
142
+
143
+ .perm-selected-header--compact {
144
+ margin-bottom: 0.875rem;
145
+ }
146
+
147
+ .perm-selected-title {
148
+ font-family: var(--font-heading, 'Plus Jakarta Sans', sans-serif);
149
+ font-size: 0.95rem;
150
+ font-weight: 700;
151
+ color: var(--ink-900, #0f172a);
152
+ }
153
+
154
+ .perm-selected-subtitle {
155
+ margin-top: 0.35rem;
156
+ color: var(--ink-500, #64748b);
157
+ font-size: 0.8125rem;
158
+ max-width: 58rem;
159
+ }
160
+
161
+ .perm-selected-badge {
162
+ display: inline-flex;
163
+ align-items: center;
164
+ padding: 0.2rem 0.5rem;
165
+ border-radius: 999px;
166
+ background: #fff7ed;
167
+ color: #9a3412;
168
+ border: 1px solid #fed7aa;
169
+ font-size: 0.7rem;
170
+ font-weight: 700;
171
+ letter-spacing: 0.04em;
172
+ text-transform: uppercase;
173
+ }
174
+
175
+ .perm-selected-grid {
176
+ display: grid;
177
+ grid-template-columns: repeat(2, minmax(0, 1fr));
178
+ gap: 0.875rem;
179
+ }
180
+
181
+ .perm-selected-panel {
182
+ border: 1px solid var(--ink-100, #e2e8f0);
183
+ border-radius: 0.5rem;
184
+ overflow: hidden;
185
+ background: var(--paper-base, #f8fafc);
186
+ min-width: 0;
187
+ }
188
+
189
+ .perm-selected-panel--wide {
190
+ grid-column: 1 / -1;
191
+ }
192
+
193
+ .perm-selected-panel-title {
194
+ margin: 0;
195
+ padding: 0.65rem 0.875rem;
196
+ border-bottom: 1px solid var(--ink-100, #e2e8f0);
197
+ font-family: var(--font-heading, 'Plus Jakarta Sans', sans-serif);
198
+ font-size: 0.8125rem;
199
+ font-weight: 700;
200
+ color: var(--ink-700, #334155);
201
+ }
202
+
203
+ .perm-panel-action {
204
+ border: 1px solid var(--ink-100, #cbd5e1);
205
+ border-radius: 999px;
206
+ background: var(--paper-strong, #fff);
207
+ color: var(--ink-700, #334155);
208
+ font-family: var(--font-mono, 'IBM Plex Mono', monospace);
209
+ font-size: 0.72rem;
210
+ padding: 0.28rem 0.65rem;
211
+ cursor: pointer;
212
+ white-space: nowrap;
213
+ }
214
+
215
+ .perm-panel-action:hover,
216
+ .perm-panel-action:focus-visible {
217
+ border-color: var(--signal-2, #3b82f6);
218
+ color: var(--signal-2, #3b82f6);
219
+ outline: none;
220
+ }
221
+
222
+ .perm-source-item--selected {
223
+ background: color-mix(in srgb, var(--signal-2, #3b82f6) 10%, transparent);
224
+ border-left: 3px solid var(--signal-2, #3b82f6);
225
+ padding-left: calc(0.75rem - 3px);
226
+ }
227
+
228
+ .perm-source-item--detail {
229
+ background: transparent;
121
230
  }
122
231
 
123
232
  /* ── Stat Grid ─────────────────────────────────────────────── */
124
233
 
125
234
  .perm-stat-grid {
126
235
  display: grid;
127
- grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
128
- gap: 0.75rem;
129
- margin-bottom: 1rem;
236
+ grid-template-columns: repeat(auto-fill, minmax(105px, 1fr));
237
+ gap: 0.625rem;
130
238
  }
131
239
 
132
240
  .perm-stat {
@@ -135,7 +243,7 @@
135
243
 
136
244
  .perm-stat-value {
137
245
  font-family: var(--font-mono, 'IBM Plex Mono', monospace);
138
- font-size: 1.5rem;
246
+ font-size: 1.25rem;
139
247
  font-weight: 700;
140
248
  line-height: 1.2;
141
249
  color: var(--ink-900, #0f172a);
@@ -160,13 +268,17 @@
160
268
  list-style: none;
161
269
  padding: 0;
162
270
  margin: 0;
271
+ max-height: 15rem;
272
+ overflow-y: scroll;
273
+ overscroll-behavior: contain;
274
+ scrollbar-gutter: stable;
163
275
  }
164
276
 
165
277
  .perm-pattern-item {
166
278
  display: flex;
167
279
  align-items: center;
168
280
  gap: 0.5rem;
169
- padding: 0.375rem 0.5rem;
281
+ padding: 0.325rem 0.45rem;
170
282
  font-family: var(--font-mono, 'IBM Plex Mono', monospace);
171
283
  font-size: 0.8125rem;
172
284
  border-bottom: 1px solid var(--ink-50, #f1f5f9);
@@ -220,12 +332,23 @@
220
332
  /* ── Live Feed ─────────────────────────────────────────────── */
221
333
 
222
334
  .perm-feed {
223
- max-height: 400px;
224
- overflow-y: auto;
335
+ height: 15rem;
336
+ max-height: 15rem;
337
+ min-height: 15rem;
338
+ overflow-y: scroll;
339
+ overflow-x: auto;
340
+ overscroll-behavior: contain;
341
+ scrollbar-gutter: stable both-edges;
225
342
  font-family: var(--font-mono, 'IBM Plex Mono', monospace);
226
343
  font-size: 0.8125rem;
227
344
  }
228
345
 
346
+ .perm-feed--modal {
347
+ height: calc(100vh - 11rem);
348
+ max-height: none;
349
+ min-height: 0;
350
+ }
351
+
229
352
  .perm-feed-empty {
230
353
  padding: 2rem;
231
354
  text-align: center;
@@ -237,7 +360,7 @@
237
360
  display: grid;
238
361
  grid-template-columns: 80px 60px 1fr auto;
239
362
  gap: 0.5rem;
240
- padding: 0.375rem 0.5rem;
363
+ padding: 0.325rem 0.45rem;
241
364
  border-bottom: 1px solid var(--ink-50, #f1f5f9);
242
365
  align-items: center;
243
366
  }
@@ -260,6 +383,12 @@
260
383
  .perm-feed-decision--deny { color: #ef4444; }
261
384
  .perm-feed-decision--ask { color: #f97316; }
262
385
 
386
+ @media (max-width: 900px) {
387
+ .perm-selected-grid {
388
+ grid-template-columns: 1fr;
389
+ }
390
+ }
391
+
263
392
  .perm-feed-tool {
264
393
  color: var(--ink-700, #334155);
265
394
  overflow: hidden;
@@ -276,20 +405,30 @@
276
405
  max-width: 200px;
277
406
  }
278
407
 
408
+ .perm-audit-modal-dialog {
409
+ width: min(82rem, 100%);
410
+ }
411
+
279
412
  /* ── Source Elements ───────────────────────────────────────── */
280
413
 
281
414
  .perm-source-list {
282
415
  list-style: none;
283
416
  padding: 0;
284
417
  margin: 0;
418
+ max-height: 16rem;
419
+ overflow-y: scroll;
420
+ overscroll-behavior: contain;
421
+ scrollbar-gutter: stable;
285
422
  }
286
423
 
287
424
  .perm-source-item {
288
425
  display: flex;
289
426
  align-items: center;
290
427
  gap: 0.5rem;
291
- padding: 0.5rem;
428
+ padding: 0.425rem 0.5rem;
292
429
  border-bottom: 1px solid var(--ink-50, #f1f5f9);
430
+ min-width: 0;
431
+ flex-wrap: wrap;
293
432
  }
294
433
 
295
434
  .perm-source-item:last-child {
@@ -310,6 +449,8 @@
310
449
  .perm-source-name {
311
450
  font-weight: 500;
312
451
  color: var(--ink-800, #1e293b);
452
+ min-width: 0;
453
+ overflow-wrap: anywhere;
313
454
  }
314
455
 
315
456
  /* ── Dark Mode ─────────────────────────────────────────────── */
@@ -321,28 +462,95 @@
321
462
  }
322
463
 
323
464
  [data-theme="dark"] .perm-card-header {
324
- background: var(--paper-strong, #1e293b);
465
+ background: color-mix(in srgb, var(--surface-1) 72%, var(--paper-strong));
325
466
  border-color: var(--ink-100, #334155);
326
467
  color: var(--ink-50, #f1f5f9);
327
468
  }
328
469
 
329
470
  [data-theme="dark"] .perm-card-header:hover {
330
- background: var(--ink-100, #334155);
471
+ background: color-mix(in srgb, var(--surface-2) 82%, var(--paper-strong));
472
+ }
473
+
474
+ [data-theme="dark"] .perm-card-body {
475
+ background: color-mix(in srgb, var(--paper) 25%, var(--paper-strong));
476
+ }
477
+
478
+ [data-theme="dark"] .perm-selected-panel {
479
+ background: color-mix(in srgb, var(--surface-1) 82%, var(--paper-strong));
480
+ border-color: var(--line, #2b3445);
481
+ }
482
+
483
+ [data-theme="dark"] .perm-selected-panel-title {
484
+ background: color-mix(in srgb, var(--surface-2) 62%, var(--paper-strong));
485
+ border-color: var(--line, #2b3445);
486
+ color: var(--ink-900, #dce6f2);
487
+ }
488
+
489
+ [data-theme="dark"] .perm-panel-action {
490
+ background: color-mix(in srgb, var(--surface-2) 58%, var(--paper-strong));
491
+ border-color: var(--line, #2b3445);
492
+ color: var(--ink-900, #dce6f2);
493
+ }
494
+
495
+ [data-theme="dark"] .perm-panel-action:hover,
496
+ [data-theme="dark"] .perm-panel-action:focus-visible {
497
+ background: color-mix(in srgb, var(--surface-2) 78%, var(--paper-strong));
331
498
  }
332
499
 
333
500
  [data-theme="dark"] .perm-stat-value {
334
501
  color: var(--ink-50, #f1f5f9);
335
502
  }
336
503
 
504
+ [data-theme="dark"] .perm-status-updated,
505
+ [data-theme="dark"] .perm-selected-subtitle,
506
+ [data-theme="dark"] .perm-feed-time,
507
+ [data-theme="dark"] .perm-feed-reason,
508
+ [data-theme="dark"] .perm-pattern-empty,
509
+ [data-theme="dark"] .perm-feed-empty,
510
+ [data-theme="dark"] .perm-card-toggle {
511
+ color: var(--ink-500, #7b93a7);
512
+ }
513
+
337
514
  [data-theme="dark"] .perm-stat-label,
338
515
  [data-theme="dark"] .perm-card-title,
516
+ [data-theme="dark"] .perm-selected-title,
517
+ [data-theme="dark"] .perm-feed-tool,
339
518
  [data-theme="dark"] .perm-pattern-text,
340
519
  [data-theme="dark"] .perm-source-name {
341
520
  color: var(--ink-200, #e2e8f0);
342
521
  }
343
522
 
344
- [data-theme="dark"] .perm-feed-entry {
345
- border-color: var(--ink-100, #334155);
523
+ [data-theme="dark"] .perm-source-list,
524
+ [data-theme="dark"] .perm-pattern-list,
525
+ [data-theme="dark"] .perm-feed {
526
+ background: color-mix(in srgb, var(--paper) 36%, var(--surface-1));
527
+ }
528
+
529
+ [data-theme="dark"] .perm-source-item,
530
+ [data-theme="dark"] .perm-pattern-item,
531
+ [data-theme="dark"] .perm-feed-row {
532
+ border-color: color-mix(in srgb, var(--line) 92%, transparent);
533
+ }
534
+
535
+ [data-theme="dark"] .perm-source-item:hover,
536
+ [data-theme="dark"] .perm-feed-row:hover {
537
+ background: color-mix(in srgb, var(--surface-2) 72%, var(--paper-strong));
538
+ }
539
+
540
+ [data-theme="dark"] .perm-source-type {
541
+ background: color-mix(in srgb, var(--surface-2) 90%, var(--paper-strong));
542
+ color: var(--ink-900, #dce6f2);
543
+ border: 1px solid color-mix(in srgb, var(--line) 80%, transparent);
544
+ }
545
+
546
+ [data-theme="dark"] .perm-source-item--selected {
547
+ background: color-mix(in srgb, var(--signal-2) 18%, var(--surface-1));
548
+ }
549
+
550
+ [data-theme="dark"] .perm-selected-badge {
551
+ background: color-mix(in srgb, var(--accent-soft) 92%, var(--paper-strong));
552
+ color: #fdba74;
553
+ border-color: color-mix(in srgb, #fdba74 35%, var(--line));
346
554
  }
347
555
 
348
556
  [data-theme="dark"] .perm-pattern-badge--deny {