@sinequa/assistant 3.9.4 → 3.9.6-rc1

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 (69) hide show
  1. package/chat/chat-message/chat-message.component.d.ts +17 -25
  2. package/chat/chat-message/i18n/de.json +11 -0
  3. package/chat/chat-reference/chat-reference.component.d.ts +18 -8
  4. package/chat/chat-reference/i18n/de.json +4 -0
  5. package/chat/chat-settings-v3/i18n/de.json +14 -0
  6. package/chat/chat.component.d.ts +2 -1
  7. package/chat/debug-message/debug-message-details/debug-message-details.component.d.ts +2 -3
  8. package/chat/debug-message/i18n/de.json +3 -0
  9. package/chat/dialogs/i18n/de.json +19 -0
  10. package/chat/directives/copy-to-clipboard.directive.d.ts +8 -0
  11. package/chat/documents-upload/document-list/document-list.component.d.ts +4 -9
  12. package/chat/documents-upload/document-overview/document-overview.component.d.ts +3 -17
  13. package/chat/documents-upload/document-upload/document-upload.component.d.ts +3 -8
  14. package/chat/documents-upload/documents-upload.service.d.ts +7 -16
  15. package/chat/documents-upload/i18n/de.json +24 -0
  16. package/chat/i18n/de.json +42 -0
  17. package/chat/markdown-it-plugins/code-block.plugin.d.ts +2 -0
  18. package/chat/markdown-it-plugins/image-reference.plugin.d.ts +3 -0
  19. package/chat/markdown-it-plugins/link.plugin.d.ts +5 -0
  20. package/chat/markdown-it-plugins/page-reference.plugin.d.ts +3 -0
  21. package/chat/markdown-it-plugins/reference.plugin.d.ts +7 -0
  22. package/chat/public-api.d.ts +2 -1
  23. package/chat/references/i18n/de.json +6 -0
  24. package/chat/references/references.component.d.ts +43 -0
  25. package/chat/saved-chats/i18n/de.json +5 -0
  26. package/chat/services/app.service.d.ts +2 -1
  27. package/chat/services/custom-elements.service.d.ts +13 -0
  28. package/chat/smart-renderer/smart-renderer.d.ts +23 -0
  29. package/chat/token-progress-bar/i18n/de.json +4 -0
  30. package/chat/tooltip/tooltip.directive.d.ts +2 -2
  31. package/chat/types.d.ts +8 -42
  32. package/esm2022/chat/chat-message/chat-message.component.mjs +33 -135
  33. package/esm2022/chat/chat-reference/chat-reference.component.mjs +60 -26
  34. package/esm2022/chat/chat-settings-v3/chat-settings-v3.component.mjs +1 -1
  35. package/esm2022/chat/chat.component.mjs +50 -13
  36. package/esm2022/chat/chat.service.mjs +3 -2
  37. package/esm2022/chat/debug-message/debug-message-details/debug-message-details.component.mjs +2 -2
  38. package/esm2022/chat/debug-message/debug-message.service.mjs +4 -7
  39. package/esm2022/chat/directives/copy-to-clipboard.directive.mjs +68 -0
  40. package/esm2022/chat/documents-upload/document-list/document-list.component.mjs +21 -22
  41. package/esm2022/chat/documents-upload/document-overview/document-overview.component.mjs +8 -31
  42. package/esm2022/chat/documents-upload/document-upload/document-upload.component.mjs +12 -14
  43. package/esm2022/chat/documents-upload/documents-upload.service.mjs +25 -44
  44. package/esm2022/chat/markdown-it-plugins/code-block.plugin.mjs +14 -0
  45. package/esm2022/chat/markdown-it-plugins/image-reference.plugin.mjs +58 -0
  46. package/esm2022/chat/markdown-it-plugins/link.plugin.mjs +15 -0
  47. package/esm2022/chat/markdown-it-plugins/page-reference.plugin.mjs +60 -0
  48. package/esm2022/chat/markdown-it-plugins/reference.plugin.mjs +68 -0
  49. package/esm2022/chat/public-api.mjs +3 -2
  50. package/esm2022/chat/references/references.component.mjs +293 -0
  51. package/esm2022/chat/saved-chats/saved-chats.component.mjs +4 -3
  52. package/esm2022/chat/saved-chats/saved-chats.service.mjs +9 -12
  53. package/esm2022/chat/services/app.service.mjs +8 -2
  54. package/esm2022/chat/services/assistant-configuration.service.mjs +9 -18
  55. package/esm2022/chat/services/assistant-metadata.service.mjs +3 -3
  56. package/esm2022/chat/services/assistant-tokens-tracking.service.mjs +3 -6
  57. package/esm2022/chat/services/custom-elements.service.mjs +43 -0
  58. package/esm2022/chat/smart-renderer/smart-renderer.mjs +103 -0
  59. package/esm2022/chat/tooltip/tooltip.directive.mjs +9 -9
  60. package/esm2022/chat/types.mjs +2 -5
  61. package/fesm2022/sinequa-assistant-chat.mjs +913 -498
  62. package/fesm2022/sinequa-assistant-chat.mjs.map +1 -1
  63. package/package.json +4 -6
  64. package/chat/prompt.component.d.ts +0 -25
  65. package/chat/unified-plugins/embedded-image-reference.plugin.d.ts +0 -3
  66. package/chat/unified-plugins/embedded-page-reference.plugin.d.ts +0 -3
  67. package/esm2022/chat/prompt.component.mjs +0 -88
  68. package/esm2022/chat/unified-plugins/embedded-image-reference.plugin.mjs +0 -56
  69. package/esm2022/chat/unified-plugins/embedded-page-reference.plugin.mjs +0 -57
@@ -0,0 +1,58 @@
1
+ export const EMBEDDED_IMAGE_NAME = "embedded-image-reference";
2
+ const EMBEDDED_IMAGE_REGEX = /\[(Img-([0-9]+(?:\.[0-9]+){2}))\]/g;
3
+ export function markdownItImageReferencePlugin(md) {
4
+ md.core.ruler.after("inline", EMBEDDED_IMAGE_NAME, (state) => {
5
+ const getEmbeddedImageReference = state?.env?.getEmbeddedImageReference;
6
+ state.tokens.forEach((blockToken) => {
7
+ if (blockToken.type !== "inline" || !blockToken.children)
8
+ return;
9
+ const newChildren = [];
10
+ blockToken.children.forEach((token) => {
11
+ if (token.type !== "text") {
12
+ newChildren.push(token);
13
+ return;
14
+ }
15
+ let lastIndex = 0;
16
+ let match;
17
+ const text = token.content;
18
+ EMBEDDED_IMAGE_REGEX.lastIndex = 0; // Reset regex state
19
+ while ((match = EMBEDDED_IMAGE_REGEX.exec(text)) !== null) {
20
+ // Add leading text
21
+ if (match.index > lastIndex) {
22
+ const t = new state.Token("text", "", 0);
23
+ t.content = text.slice(lastIndex, match.index);
24
+ newChildren.push(t);
25
+ }
26
+ // Add embedded image reference token
27
+ const refToken = new state.Token(EMBEDDED_IMAGE_NAME, "", 0);
28
+ refToken.content = match[2]; // e.g., "1.2.3"
29
+ refToken.meta = { full: match[1] }; // e.g., "Img-1.2.3"
30
+ refToken.attrs = [];
31
+ if (getEmbeddedImageReference) {
32
+ const attachment = getEmbeddedImageReference(match[2]);
33
+ if (attachment) {
34
+ refToken.attrs.push(['attachment', btoa(encodeURIComponent(JSON.stringify(attachment)))]);
35
+ }
36
+ }
37
+ newChildren.push(refToken);
38
+ lastIndex = match.index + match[0].length;
39
+ }
40
+ // Add trailing text
41
+ if (lastIndex < text.length) {
42
+ const t = new state.Token("text", "", 0);
43
+ t.content = text.slice(lastIndex);
44
+ newChildren.push(t);
45
+ }
46
+ });
47
+ blockToken.children = newChildren;
48
+ });
49
+ });
50
+ // Optional: renderer for the custom token
51
+ md.renderer.rules[EMBEDDED_IMAGE_NAME] = (tokens, idx) => {
52
+ const imgId = tokens[idx].content;
53
+ const attrs = tokens[idx].attrs || [];
54
+ const attachment = attrs[0];
55
+ return `<image-reference id="${imgId}" attachment="${attachment ? attachment[1] : ''}" class="embedded-image-ref">Img-${imgId}</image-reference>`;
56
+ };
57
+ }
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcmVmZXJlbmNlLnBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L21hcmtkb3duLWl0LXBsdWdpbnMvaW1hZ2UtcmVmZXJlbmNlLnBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRywwQkFBMEIsQ0FBQztBQUM5RCxNQUFNLG9CQUFvQixHQUFHLG9DQUFvQyxDQUFDO0FBRWxFLE1BQU0sVUFBVSw4QkFBOEIsQ0FBQyxFQUFjO0lBQzNELEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUMzRCxNQUFNLHlCQUF5QixHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUseUJBQXlCLENBQUM7UUFDeEUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNsQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVE7Z0JBQUUsT0FBTztZQUVqRSxNQUFNLFdBQVcsR0FBWSxFQUFFLENBQUM7WUFFaEMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDcEMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO29CQUMxQixXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN4QixPQUFPO2dCQUNULENBQUM7Z0JBRUQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQixJQUFJLEtBQTZCLENBQUM7Z0JBQ2xDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBRTNCLG9CQUFvQixDQUFDLFNBQVMsR0FBRyxDQUFDLENB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QUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgTWFya2Rvd25JdCBmcm9tIFwibWFya2Rvd24taXRcIjtcclxuaW1wb3J0IFRva2VuIGZyb20gJ21hcmtkb3duLWl0L2xpYi90b2tlbi5tanMnO1xyXG5cclxuZXhwb3J0IGNvbnN0IEVNQkVEREVEX0lNQUdFX05BTUUgPSBcImVtYmVkZGVkLWltYWdlLXJlZmVyZW5jZVwiO1xyXG5jb25zdCBFTUJFRERFRF9JTUFHRV9SRUdFWCA9IC9cXFsoSW1nLShbMC05XSsoPzpcXC5bMC05XSspezJ9KSlcXF0vZztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtYXJrZG93bkl0SW1hZ2VSZWZlcmVuY2VQbHVnaW4obWQ6IE1hcmtkb3duSXQpIHtcclxuICBtZC5jb3JlLnJ1bGVyLmFmdGVyKFwiaW5saW5lXCIsIEVNQkVEREVEX0lNQUdFX05BTUUsIChzdGF0ZSkgPT4ge1xyXG4gICAgY29uc3QgZ2V0RW1iZWRkZWRJbWFnZVJlZmVyZW5jZSA9IHN0YXRlPy5lbnY/LmdldEVtYmVkZGVkSW1hZ2VSZWZlcmVuY2U7XHJcbiAgICBzdGF0ZS50b2tlbnMuZm9yRWFjaCgoYmxvY2tUb2tlbikgPT4ge1xyXG4gICAgICBpZiAoYmxvY2tUb2tlbi50eXBlICE9PSBcImlubGluZVwiIHx8ICFibG9ja1Rva2VuLmNoaWxkcmVuKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBuZXdDaGlsZHJlbjogVG9rZW5bXSA9IFtdO1xyXG5cclxuICAgICAgYmxvY2tUb2tlbi5jaGlsZHJlbi5mb3JFYWNoKCh0b2tlbikgPT4ge1xyXG4gICAgICAgIGlmICh0b2tlbi50eXBlICE9PSBcInRleHRcIikge1xyXG4gICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0b2tlbik7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbGFzdEluZGV4ID0gMDtcclxuICAgICAgICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IHRva2VuLmNvbnRlbnQ7XHJcblxyXG4gICAgICAgIEVNQkVEREVEX0lNQUdFX1JFR0VYLmxhc3RJbmRleCA9IDA7IC8vIFJlc2V0IHJlZ2V4IHN0YXRlXHJcbiAgICAgICAgd2hpbGUgKChtYXRjaCA9IEVNQkVEREVEX0lNQUdFX1JFR0VYLmV4ZWModGV4dCkpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAvLyBBZGQgbGVhZGluZyB0ZXh0XHJcbiAgICAgICAgICBpZiAobWF0Y2guaW5kZXggPiBsYXN0SW5kZXgpIHtcclxuICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBzdGF0ZS5Ub2tlbihcInRleHRcIiwgXCJcIiwgMCk7XHJcbiAgICAgICAgICAgIHQuY29udGVudCA9IHRleHQuc2xpY2UobGFzdEluZGV4LCBtYXRjaC5pbmRleCk7XHJcbiAgICAgICAgICAgIG5ld0NoaWxkcmVuLnB1c2godCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gQWRkIGVtYmVkZGVkIGltYWdlIHJlZmVyZW5jZSB0b2tlblxyXG4gICAgICAgICAgY29uc3QgcmVmVG9rZW4gPSBuZXcgc3RhdGUuVG9rZW4oRU1CRURERURfSU1BR0VfTkFNRSwgXCJcIiwgMCk7XHJcbiAgICAgICAgICByZWZUb2tlbi5jb250ZW50ID0gbWF0Y2hbMl07IC8vIGUuZy4sIFwiMS4yLjNcIlxyXG4gICAgICAgICAgcmVmVG9rZW4ubWV0YSA9IHsgZnVsbDogbWF0Y2hbMV0gfTsgLy8gZS5nLiwgXCJJbWctMS4yLjNcIlxyXG4gICAgICAgICAgcmVmVG9rZW4uYXR0cnMgPSBbXTtcclxuICAgICAgICAgIGlmIChnZXRFbWJlZGRlZEltYWdlUmVmZXJlbmNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBnZXRFbWJlZGRlZEltYWdlUmVmZXJlbmNlKG1hdGNoWzJdKTtcclxuICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnQpIHtcclxuICAgICAgICAgICAgICByZWZUb2tlbi5hdHRycy5wdXNoKFsnYXR0YWNobWVudCcsIGJ0b2EoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGF0dGFjaG1lbnQpKSldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChyZWZUb2tlbik7XHJcblxyXG4gICAgICAgICAgbGFzdEluZGV4ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBZGQgdHJhaWxpbmcgdGV4dFxyXG4gICAgICAgIGlmIChsYXN0SW5kZXggPCB0ZXh0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgY29uc3QgdCA9IG5ldyBzdGF0ZS5Ub2tlbihcInRleHRcIiwgXCJcIiwgMCk7XHJcbiAgICAgICAgICB0LmNvbnRlbnQgPSB0ZXh0LnNsaWNlKGxhc3RJbmRleCk7XHJcbiAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBibG9ja1Rva2VuLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgLy8gT3B0aW9uYWw6IHJlbmRlcmVyIGZvciB0aGUgY3VzdG9tIHRva2VuXHJcbiAgbWQucmVuZGVyZXIucnVsZXNbRU1CRURERURfSU1BR0VfTkFNRV0gPSAodG9rZW5zLCBpZHgpID0+IHtcclxuICAgIGNvbnN0IGltZ0lkID0gdG9rZW5zW2lkeF0uY29udGVudDtcclxuICAgIGNvbnN0IGF0dHJzID0gdG9rZW5zW2lkeF0uYXR0cnMgfHwgW107XHJcbiAgICBjb25zdCBhdHRhY2htZW50ID0gYXR0cnNbMF07XHJcbiAgICByZXR1cm4gYDxpbWFnZS1yZWZlcmVuY2UgaWQ9XCIke2ltZ0lkfVwiIGF0dGFjaG1lbnQ9XCIke2F0dGFjaG1lbnQgPyBhdHRhY2htZW50WzFdIDogJyd9XCIgY2xhc3M9XCJlbWJlZGRlZC1pbWFnZS1yZWZcIj5JbWctJHtpbWdJZH08L2ltYWdlLXJlZmVyZW5jZT5gO1xyXG4gIH07XHJcbn1cclxuIl19
@@ -0,0 +1,15 @@
1
+ /**
2
+ * This plugin overrides the default link renderer to add `target="_blank"` and `rel="noopener noreferrer"` to all links.
3
+ */
4
+ export function markdownItLinkPlugin(md) {
5
+ const defaultRender = md.renderer.rules.link_open || function (tokens, idx, options, env, self) {
6
+ return self.renderToken(tokens, idx, options);
7
+ };
8
+ md.renderer.rules.link_open = function (tokens, idx, options, env, self) {
9
+ tokens[idx].attrPush(['target', '_blank']);
10
+ tokens[idx].attrPush(['rel', 'noopener noreferrer']);
11
+ // pass token to default renderer.
12
+ return defaultRender(tokens, idx, options, env, self);
13
+ };
14
+ }
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay5wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9tYXJrZG93bi1pdC1wbHVnaW5zL2xpbmsucGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOztHQUVHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEVBQWM7SUFDakQsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLFVBQVMsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUk7UUFDM0YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQyxDQUFDO0lBRUYsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFVBQVMsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUk7UUFDcEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDO1FBRXJELGtDQUFrQztRQUNsQyxPQUFPLGFBQWEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIE1hcmtkb3duSXQgZnJvbSBcIm1hcmtkb3duLWl0XCI7XHJcblxyXG4vKipcclxuICogVGhpcyBwbHVnaW4gb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGxpbmsgcmVuZGVyZXIgdG8gYWRkIGB0YXJnZXQ9XCJfYmxhbmtcImAgYW5kIGByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJgIHRvIGFsbCBsaW5rcy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtYXJrZG93bkl0TGlua1BsdWdpbihtZDogTWFya2Rvd25JdCkge1xyXG4gIGNvbnN0IGRlZmF1bHRSZW5kZXIgPSBtZC5yZW5kZXJlci5ydWxlcy5saW5rX29wZW4gfHwgZnVuY3Rpb24odG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiwgc2VsZikge1xyXG4gICAgcmV0dXJuIHNlbGYucmVuZGVyVG9rZW4odG9rZW5zLCBpZHgsIG9wdGlvbnMpO1xyXG4gIH07XHJcblxyXG4gIG1kLnJlbmRlcmVyLnJ1bGVzLmxpbmtfb3BlbiA9IGZ1bmN0aW9uKHRva2VucywgaWR4LCBvcHRpb25zLCBlbnYsIHNlbGYpIHtcclxuICAgIHRva2Vuc1tpZHhdLmF0dHJQdXNoKFsndGFyZ2V0JywgJ19ibGFuayddKTtcclxuICAgIHRva2Vuc1tpZHhdLmF0dHJQdXNoKFsncmVsJywgJ25vb3BlbmVyIG5vcmVmZXJyZXInXSk7XHJcblxyXG4gICAgLy8gcGFzcyB0b2tlbiB0byBkZWZhdWx0IHJlbmRlcmVyLlxyXG4gICAgcmV0dXJuIGRlZmF1bHRSZW5kZXIodG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiwgc2VsZik7XHJcbiAgfTtcclxufVxyXG4iXX0=
@@ -0,0 +1,60 @@
1
+ export const EMBEDDED_PAGE_NAME = "embedded-page-reference";
2
+ const EMBEDDED_PAGE_REGEX = /\[(Page-(\d+\.\d+))\]/g;
3
+ export function markdownItPageReferencePlugin(md) {
4
+ md.core.ruler.after("inline", "embedded-page-reference", (state) => {
5
+ const getEmbeddedPageReference = state?.env?.getEmbeddedPageReference;
6
+ state.tokens.forEach((blockToken) => {
7
+ if (blockToken.type !== "inline" || !blockToken.children)
8
+ return;
9
+ const newChildren = [];
10
+ blockToken.children.forEach((token) => {
11
+ if (token.type !== "text") {
12
+ newChildren.push(token);
13
+ return;
14
+ }
15
+ let lastIndex = 0;
16
+ let match;
17
+ const text = token.content;
18
+ EMBEDDED_PAGE_REGEX.lastIndex = 0; // Reset regex state
19
+ while ((match = EMBEDDED_PAGE_REGEX.exec(text)) !== null) {
20
+ // Add leading text
21
+ if (match.index > lastIndex) {
22
+ const t = new state.Token("text", "", 0);
23
+ t.content = text.slice(lastIndex, match.index);
24
+ newChildren.push(t);
25
+ }
26
+ // Add embedded page reference token
27
+ const refToken = new state.Token(EMBEDDED_PAGE_NAME, "", 0);
28
+ refToken.content = match[2]; // e.g., "1.2"
29
+ refToken.meta = { full: match[1] }; // e.g., "Page-1.2"
30
+ refToken.attrs = [];
31
+ if (getEmbeddedPageReference) {
32
+ const attachment = getEmbeddedPageReference(match[2]);
33
+ if (attachment) {
34
+ refToken.attrs.push(['attachment', btoa(encodeURIComponent(JSON.stringify(attachment)))]);
35
+ }
36
+ }
37
+ newChildren.push(refToken);
38
+ lastIndex = match.index + match[0].length;
39
+ }
40
+ // Add trailing text
41
+ if (lastIndex < text.length) {
42
+ const t = new state.Token("text", "", 0);
43
+ t.content = text.slice(lastIndex);
44
+ newChildren.push(t);
45
+ }
46
+ });
47
+ blockToken.children = newChildren;
48
+ });
49
+ });
50
+ // Optional: renderer for the custom token
51
+ md.renderer.rules[EMBEDDED_PAGE_NAME] = (tokens, idx) => {
52
+ const page = tokens[idx].content;
53
+ // const getEmbeddedPageReference = tokens[idx].meta?.getEmbeddedPageReference;
54
+ // const attachment = getEmbeddedPageReference ? getEmbeddedPageReference(page) : null;
55
+ const attrs = tokens[idx].attrs || [];
56
+ const attachment = attrs[0];
57
+ return `<page-reference id=${page} attachment=${attachment[1]} class="embedded-page-ref">Page-${page}</page-reference>`;
58
+ };
59
+ }
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1yZWZlcmVuY2UucGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvbWFya2Rvd24taXQtcGx1Z2lucy9wYWdlLXJlZmVyZW5jZS5wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcseUJBQXlCLENBQUM7QUFDNUQsTUFBTSxtQkFBbUIsR0FBRyx3QkFBd0IsQ0FBQztBQUVyRCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsRUFBYztJQUMxRCxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLHlCQUF5QixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDakUsTUFBTSx3QkFBd0IsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLHdCQUF3QixDQUFDO1FBQ3RFLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDbEMsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRO2dCQUFFLE9BQU87WUFFakUsTUFBTSxXQUFXLEdBQVksRUFBRSxDQUFDO1lBRWhDLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3BDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztvQkFDMUIsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDeEIsT0FBTztnQkFDVCxDQUFDO2dCQUVELElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDbEIsSUFBSSxLQUE2QixDQUFDO2dCQUNsQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUUzQixtQkFBbUIsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFD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ZXNDb250ZW50IjpbImltcG9ydCB0eXBlIE1hcmtkb3duSXQgZnJvbSBcIm1hcmtkb3duLWl0XCI7XG5pbXBvcnQgVG9rZW4gZnJvbSAnbWFya2Rvd24taXQvbGliL3Rva2VuLm1qcyc7XG5cbmV4cG9ydCBjb25zdCBFTUJFRERFRF9QQUdFX05BTUUgPSBcImVtYmVkZGVkLXBhZ2UtcmVmZXJlbmNlXCI7XG5jb25zdCBFTUJFRERFRF9QQUdFX1JFR0VYID0gL1xcWyhQYWdlLShcXGQrXFwuXFxkKykpXFxdL2c7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZG93bkl0UGFnZVJlZmVyZW5jZVBsdWdpbihtZDogTWFya2Rvd25JdCkge1xuICBtZC5jb3JlLnJ1bGVyLmFmdGVyKFwiaW5saW5lXCIsIFwiZW1iZWRkZWQtcGFnZS1yZWZlcmVuY2VcIiwgKHN0YXRlKSA9PiB7XG4gICAgY29uc3QgZ2V0RW1iZWRkZWRQYWdlUmVmZXJlbmNlID0gc3RhdGU/LmVudj8uZ2V0RW1iZWRkZWRQYWdlUmVmZXJlbmNlO1xuICAgIHN0YXRlLnRva2Vucy5mb3JFYWNoKChibG9ja1Rva2VuKSA9PiB7XG4gICAgICBpZiAoYmxvY2tUb2tlbi50eXBlICE9PSBcImlubGluZVwiIHx8ICFibG9ja1Rva2VuLmNoaWxkcmVuKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG5ld0NoaWxkcmVuOiBUb2tlbltdID0gW107XG5cbiAgICAgIGJsb2NrVG9rZW4uY2hpbGRyZW4uZm9yRWFjaCgodG9rZW4pID0+IHtcbiAgICAgICAgaWYgKHRva2VuLnR5cGUgIT09IFwidGV4dFwiKSB7XG4gICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0b2tlbik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxhc3RJbmRleCA9IDA7XG4gICAgICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgICAgICAgY29uc3QgdGV4dCA9IHRva2VuLmNvbnRlbnQ7XG5cbiAgICAgICAgRU1CRURERURfUEFHRV9SRUdFWC5sYXN0SW5kZXggPSAwOyAvLyBSZXNldCByZWdleCBzdGF0ZVxuICAgICAgICB3aGlsZSAoKG1hdGNoID0gRU1CRURERURfUEFHRV9SRUdFWC5leGVjKHRleHQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFkZCBsZWFkaW5nIHRleHRcbiAgICAgICAgICBpZiAobWF0Y2guaW5kZXggPiBsYXN0SW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBuZXcgc3RhdGUuVG9rZW4oXCJ0ZXh0XCIsIFwiXCIsIDApO1xuICAgICAgICAgICAgdC5jb250ZW50ID0gdGV4dC5zbGljZShsYXN0SW5kZXgsIG1hdGNoLmluZGV4KTtcbiAgICAgICAgICAgIG5ld0NoaWxkcmVuLnB1c2godCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQWRkIGVtYmVkZGVkIHBhZ2UgcmVmZXJlbmNlIHRva2VuXG4gICAgICAgICAgY29uc3QgcmVmVG9rZW4gPSBuZXcgc3RhdGUuVG9rZW4oRU1CRURERURfUEFHRV9OQU1FLCBcIlwiLCAwKTtcbiAgICAgICAgICByZWZUb2tlbi5jb250ZW50ID0gbWF0Y2hbMl07IC8vIGUuZy4sIFwiMS4yXCJcbiAgICAgICAgICByZWZUb2tlbi5tZXRhID0geyBmdWxsOiBtYXRjaFsxXSB9OyAvLyBlLmcuLCBcIlBhZ2UtMS4yXCJcbiAgICAgICAgICByZWZUb2tlbi5hdHRycyA9IFtdO1xuICAgICAgICAgIGlmIChnZXRFbWJlZGRlZFBhZ2VSZWZlcmVuY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBnZXRFbWJlZGRlZFBhZ2VSZWZlcmVuY2UobWF0Y2hbMl0pO1xuICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnQpIHtcbiAgICAgICAgICAgICAgcmVmVG9rZW4uYXR0cnMucHVzaChbJ2F0dGFjaG1lbnQnLCBidG9hKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShhdHRhY2htZW50KSkpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG5ld0NoaWxkcmVuLnB1c2gocmVmVG9rZW4pO1xuXG4gICAgICAgICAgbGFzdEluZGV4ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdHJhaWxpbmcgdGV4dFxuICAgICAgICBpZiAobGFzdEluZGV4IDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCB0ID0gbmV3IHN0YXRlLlRva2VuKFwidGV4dFwiLCBcIlwiLCAwKTtcbiAgICAgICAgICB0LmNvbnRlbnQgPSB0ZXh0LnNsaWNlKGxhc3RJbmRleCk7XG4gICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGJsb2NrVG9rZW4uY2hpbGRyZW4gPSBuZXdDaGlsZHJlbjtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gT3B0aW9uYWw6IHJlbmRlcmVyIGZvciB0aGUgY3VzdG9tIHRva2VuXG4gIG1kLnJlbmRlcmVyLnJ1bGVzW0VNQkVEREVEX1BBR0VfTkFNRV0gPSAodG9rZW5zLCBpZHgpID0+IHtcbiAgICBjb25zdCBwYWdlID0gdG9rZW5zW2lkeF0uY29udGVudDtcbiAgICAvLyBjb25zdCBnZXRFbWJlZGRlZFBhZ2VSZWZlcmVuY2UgPSB0b2tlbnNbaWR4XS5tZXRhPy5nZXRFbWJlZGRlZFBhZ2VSZWZlcmVuY2U7XG4gICAgLy8gY29uc3QgYXR0YWNobWVudCA9IGdldEVtYmVkZGVkUGFnZVJlZmVyZW5jZSA/IGdldEVtYmVkZGVkUGFnZVJlZmVyZW5jZShwYWdlKSA6IG51bGw7XG4gICAgY29uc3QgYXR0cnMgPSB0b2tlbnNbaWR4XS5hdHRycyB8fCBbXTtcbiAgICBjb25zdCBhdHRhY2htZW50ID0gYXR0cnNbMF07XG4gICAgcmV0dXJuIGA8cGFnZS1yZWZlcmVuY2UgaWQ9JHtwYWdlfSBhdHRhY2htZW50PSR7YXR0YWNobWVudFsxXX0gY2xhc3M9XCJlbWJlZGRlZC1wYWdlLXJlZlwiPlBhZ2UtJHtwYWdlfTwvcGFnZS1yZWZlcmVuY2U+YDtcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,68 @@
1
+ /**
2
+ * A markdown-it plugin to convert [n] where n is a number into a <reference id="n">n</reference> HTML tag.
3
+ *
4
+ * For example, [123] will be converted to <reference id="123">123</reference>.
5
+ */
6
+ export function markdownItReferencePlugin(md) {
7
+ function referenceifyNumber(state, silent) {
8
+ const referencesMap = state.env.referencesMap || new Map();
9
+ const rank = state.env.rank || null;
10
+ const char = state.src.charCodeAt(state.pos);
11
+ // Check if the current character is '['
12
+ if (char !== 0x5B /* [ */) {
13
+ return false;
14
+ }
15
+ const start = state.pos + 1;
16
+ let end = -1;
17
+ // Find the closing ']'
18
+ for (let i = start; i < state.src.length; i++) {
19
+ if (state.src.charCodeAt(i) === 0x5D /* ] */) {
20
+ end = i;
21
+ break;
22
+ }
23
+ }
24
+ if (end === -1 || end === start) {
25
+ return false;
26
+ }
27
+ const content = state.src.slice(start, end);
28
+ // Match if content is a number or number.number (optionally allow whitespace)
29
+ if (!/^\s*\d+(?:\.\d+)?\s*$/.test(content.trim())) {
30
+ return false;
31
+ }
32
+ if (!silent) {
33
+ const n = content.trim();
34
+ // Open <reference>
35
+ const attachment = referencesMap.get(n) || n;
36
+ if (attachment) {
37
+ // add attachment if found in the references map from env (set in the component)
38
+ state.env.references(n.split('.')[0]);
39
+ const tokenOpen = state.push('reference_open', 'reference-component', 1);
40
+ // base64 encode the attachment if needed
41
+ if (typeof attachment === 'object') {
42
+ tokenOpen.attrs = [
43
+ ['id', n],
44
+ ['rank', rank],
45
+ ['attachment', btoa(encodeURIComponent(JSON.stringify(attachment)))]
46
+ ];
47
+ }
48
+ // Text content
49
+ const tokenText = state.push('text', '', 0);
50
+ tokenText.content = n;
51
+ // Close </reference>
52
+ state.push('reference_close', 'reference-component', -1);
53
+ }
54
+ else {
55
+ // If no attachment found, just create a span text node
56
+ const token = state.push('reference_open', 'span', 1);
57
+ token.attrs = [['class', 'reference']];
58
+ const tokenText = state.push('text', '', 0);
59
+ tokenText.content = n;
60
+ state.push('reference_close', 'span', -1);
61
+ }
62
+ }
63
+ state.pos = end + 1;
64
+ return true;
65
+ }
66
+ md.inline.ruler.after('text', 'referenceify_number', referenceifyNumber);
67
+ }
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlLnBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L21hcmtkb3duLWl0LXBsdWdpbnMvcmVmZXJlbmNlLnBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEVBQWM7SUFDdEQsU0FBUyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsTUFBTTtRQUN2QyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzNELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0Msd0NBQXdDO1FBQ3hDLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUM1QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUViLHVCQUF1QjtRQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM5QyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDN0MsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDUixNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDaEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTVDLDhFQUE4RTtRQUM5RSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbEQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRXpCLG1CQUFtQjtZQUNuQixNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxJQUFHLFVBQVUsRUFBQyxDQUFDO2dCQUNiLGdGQUFnRjtnQkFDaEYsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6RSx5Q0FBeUM7Z0JBQ3pDLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ25DLFNBQVMsQ0FBQyxLQUFLLEdBQUc7d0JBQ2hCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQzt3QkFDVCxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7d0JBQ2QsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNyRSxDQUFDO2dCQUNKLENBQUM7Z0JBRUQsZUFBZTtnQkFDZixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO2dCQUV0QixxQkFBcUI7Z0JBQ3JCLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sdURBQXVEO2dCQUN2RCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEQsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDNUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7Z0JBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUMsQ0FBQztRQUNILENBQUM7UUFFRCxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDcEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBQzNFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBNYXJrZG93bkl0IGZyb20gXCJtYXJrZG93bi1pdFwiO1xyXG4vKipcclxuICogQSBtYXJrZG93bi1pdCBwbHVnaW4gdG8gY29udmVydCBbbl0gd2hlcmUgbiBpcyBhIG51bWJlciBpbnRvIGEgPHJlZmVyZW5jZSBpZD1cIm5cIj5uPC9yZWZlcmVuY2U+IEhUTUwgdGFnLlxyXG4gKlxyXG4gKiBGb3IgZXhhbXBsZSwgWzEyM10gd2lsbCBiZSBjb252ZXJ0ZWQgdG8gPHJlZmVyZW5jZSBpZD1cIjEyM1wiPjEyMzwvcmVmZXJlbmNlPi5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtYXJrZG93bkl0UmVmZXJlbmNlUGx1Z2luKG1kOiBNYXJrZG93bkl0KSB7XHJcbiAgZnVuY3Rpb24gcmVmZXJlbmNlaWZ5TnVtYmVyKHN0YXRlLCBzaWxlbnQpIHtcclxuICAgIGNvbnN0IHJlZmVyZW5jZXNNYXAgPSBzdGF0ZS5lbnYucmVmZXJlbmNlc01hcCB8fCBuZXcgTWFwKCk7XHJcbiAgICBjb25zdCByYW5rID0gc3RhdGUuZW52LnJhbmsgfHwgbnVsbDtcclxuICAgIGNvbnN0IGNoYXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGF0ZS5wb3MpO1xyXG5cclxuICAgIC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyAnWydcclxuICAgIGlmIChjaGFyICE9PSAweDVCIC8qIFsgKi8pIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN0YXJ0ID0gc3RhdGUucG9zICsgMTtcclxuICAgIGxldCBlbmQgPSAtMTtcclxuXHJcbiAgICAvLyBGaW5kIHRoZSBjbG9zaW5nICddJ1xyXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RhdGUuc3JjLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChpKSA9PT0gMHg1RCAvKiBdICovKSB7XHJcbiAgICAgICAgZW5kID0gaTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChlbmQgPT09IC0xIHx8IGVuZCA9PT0gc3RhcnQpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRlbnQgPSBzdGF0ZS5zcmMuc2xpY2Uoc3RhcnQsIGVuZCk7XHJcblxyXG4gICAgLy8gTWF0Y2ggaWYgY29udGVudCBpcyBhIG51bWJlciBvciBudW1iZXIubnVtYmVyIChvcHRpb25hbGx5IGFsbG93IHdoaXRlc3BhY2UpXHJcbiAgICBpZiAoIS9eXFxzKlxcZCsoPzpcXC5cXGQrKT9cXHMqJC8udGVzdChjb250ZW50LnRyaW0oKSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghc2lsZW50KSB7XHJcbiAgICAgIGNvbnN0IG4gPSBjb250ZW50LnRyaW0oKTtcclxuXHJcbiAgICAgIC8vIE9wZW4gPHJlZmVyZW5jZT5cclxuICAgICAgY29uc3QgYXR0YWNobWVudCA9IHJlZmVyZW5jZXNNYXAuZ2V0KG4pIHx8IG47XHJcbiAgICAgIGlmKGF0dGFjaG1lbnQpe1xyXG4gICAgICAgIC8vIGFkZCBhdHRhY2htZW50IGlmIGZvdW5kIGluIHRoZSByZWZlcmVuY2VzIG1hcCBmcm9tIGVudiAoc2V0IGluIHRoZSBjb21wb25lbnQpXHJcbiAgICAgICAgc3RhdGUuZW52LnJlZmVyZW5jZXMobi5zcGxpdCgnLicpWzBdKTtcclxuICAgICAgICBjb25zdCB0b2tlbk9wZW4gPSBzdGF0ZS5wdXNoKCdyZWZlcmVuY2Vfb3BlbicsICdyZWZlcmVuY2UtY29tcG9uZW50JywgMSk7XHJcbiAgICAgICAgLy8gYmFzZTY0IGVuY29kZSB0aGUgYXR0YWNobWVudCBpZiBuZWVkZWRcclxuICAgICAgICBpZiAodHlwZW9mIGF0dGFjaG1lbnQgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICB0b2tlbk9wZW4uYXR0cnMgPSBbXHJcbiAgICAgICAgICAgIFsnaWQnLCBuXSxcclxuICAgICAgICAgICAgWydyYW5rJywgcmFua10sXHJcbiAgICAgICAgICAgIFsnYXR0YWNobWVudCcsIGJ0b2EoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGF0dGFjaG1lbnQpKSldXHJcbiAgICAgICAgICBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVGV4dCBjb250ZW50XHJcbiAgICAgICAgY29uc3QgdG9rZW5UZXh0ID0gc3RhdGUucHVzaCgndGV4dCcsICcnLCAwKTtcclxuICAgICAgICB0b2tlblRleHQuY29udGVudCA9IG47XHJcblxyXG4gICAgICAgIC8vIENsb3NlIDwvcmVmZXJlbmNlPlxyXG4gICAgICAgIHN0YXRlLnB1c2goJ3JlZmVyZW5jZV9jbG9zZScsICdyZWZlcmVuY2UtY29tcG9uZW50JywgLTEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIElmIG5vIGF0dGFjaG1lbnQgZm91bmQsIGp1c3QgY3JlYXRlIGEgc3BhbiB0ZXh0IG5vZGVcclxuICAgICAgICBjb25zdCB0b2tlbiA9IHN0YXRlLnB1c2goJ3JlZmVyZW5jZV9vcGVuJywgJ3NwYW4nLCAxKTtcclxuICAgICAgICB0b2tlbi5hdHRycyA9IFtbJ2NsYXNzJywgJ3JlZmVyZW5jZSddXTtcclxuICAgICAgICBjb25zdCB0b2tlblRleHQgPSBzdGF0ZS5wdXNoKCd0ZXh0JywgJycsIDApO1xyXG4gICAgICAgIHRva2VuVGV4dC5jb250ZW50ID0gbjtcclxuICAgICAgICBzdGF0ZS5wdXNoKCdyZWZlcmVuY2VfY2xvc2UnLCAnc3BhbicsIC0xKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRlLnBvcyA9IGVuZCArIDE7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG1kLmlubGluZS5ydWxlci5hZnRlcigndGV4dCcsICdyZWZlcmVuY2VpZnlfbnVtYmVyJywgcmVmZXJlbmNlaWZ5TnVtYmVyKTtcclxufVxyXG4iXX0=
@@ -6,11 +6,12 @@ export * from './initials-avatar/initials-avatar.component';
6
6
  export * from './format-icon/format-icon.component';
7
7
  export * from './types';
8
8
  export * from './instance-manager.service';
9
- export * from './prompt.component';
10
9
  export * from './documents-upload/document-upload/document-upload.component';
11
10
  export * from './documents-upload/document-list/document-list.component';
12
11
  export * from './documents-upload/documents-upload.service';
13
12
  export * from './documents-upload/documents-upload.model';
14
13
  export * from './documents-upload/document-overview/document-overview.component';
15
14
  export * from './services/notification.service';
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywrQ0FBK0MsQ0FBQztBQUM5RCxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsOERBQThELENBQUM7QUFDN0UsY0FBYywwREFBMEQsQ0FBQztBQUN6RSxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMsMkNBQTJDLENBQUM7QUFDMUQsY0FBYyxrRUFBa0UsQ0FBQztBQUNqRixjQUFjLGlDQUFpQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jaGF0LXNldHRpbmdzLXYzL2NoYXQtc2V0dGluZ3MtdjMuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vY2hhdC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9jaGF0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zYXZlZC1jaGF0cy9zYXZlZC1jaGF0cy5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9pbml0aWFscy1hdmF0YXIvaW5pdGlhbHMtYXZhdGFyLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2Zvcm1hdC1pY29uL2Zvcm1hdC1pY29uLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW5zdGFuY2UtbWFuYWdlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvbXB0LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2RvY3VtZW50cy11cGxvYWQvZG9jdW1lbnQtdXBsb2FkL2RvY3VtZW50LXVwbG9hZC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9kb2N1bWVudHMtdXBsb2FkL2RvY3VtZW50LWxpc3QvZG9jdW1lbnQtbGlzdC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9kb2N1bWVudHMtdXBsb2FkL2RvY3VtZW50cy11cGxvYWQuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2RvY3VtZW50cy11cGxvYWQvZG9jdW1lbnRzLXVwbG9hZC5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL2RvY3VtZW50cy11cGxvYWQvZG9jdW1lbnQtb3ZlcnZpZXcvZG9jdW1lbnQtb3ZlcnZpZXcuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuIl19
15
+ export * from './services/custom-elements.service';
16
+ export * from './references/references.component';
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywrQ0FBK0MsQ0FBQztBQUM5RCxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDhEQUE4RCxDQUFDO0FBQzdFLGNBQWMsMERBQTBELENBQUM7QUFDekUsY0FBYyw2Q0FBNkMsQ0FBQztBQUM1RCxjQUFjLDJDQUEyQyxDQUFDO0FBQzFELGNBQWMsa0VBQWtFLENBQUM7QUFDakYsY0FBYyxpQ0FBaUMsQ0FBQztBQUdoRCxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMsbUNBQW1DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NoYXQtc2V0dGluZ3MtdjMvY2hhdC1zZXR0aW5ncy12My5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9jaGF0LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2NoYXQuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NhdmVkLWNoYXRzL3NhdmVkLWNoYXRzLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2luaXRpYWxzLWF2YXRhci9pbml0aWFscy1hdmF0YXIuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZm9ybWF0LWljb24vZm9ybWF0LWljb24uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnN0YW5jZS1tYW5hZ2VyLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9kb2N1bWVudHMtdXBsb2FkL2RvY3VtZW50LXVwbG9hZC9kb2N1bWVudC11cGxvYWQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZG9jdW1lbnRzLXVwbG9hZC9kb2N1bWVudC1saXN0L2RvY3VtZW50LWxpc3QuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZG9jdW1lbnRzLXVwbG9hZC9kb2N1bWVudHMtdXBsb2FkLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9kb2N1bWVudHMtdXBsb2FkL2RvY3VtZW50cy11cGxvYWQubW9kZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9kb2N1bWVudHMtdXBsb2FkL2RvY3VtZW50LW92ZXJ2aWV3L2RvY3VtZW50LW92ZXJ2aWV3LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcblxuXG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2N1c3RvbS1lbGVtZW50cy5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcmVmZXJlbmNlcy9yZWZlcmVuY2VzLmNvbXBvbmVudCc7Il19
@@ -0,0 +1,293 @@
1
+ import { afterNextRender, Component, ElementRef, inject, Input, signal } from "@angular/core";
2
+ import { ChatReferenceComponent } from "../chat-reference/chat-reference.component";
3
+ import { CopyToClipboardDirective } from "../directives/copy-to-clipboard.directive";
4
+ import { TooltipDirective } from "../tooltip/tooltip.directive";
5
+ import { InlineImageReferenceComponent } from "./inline-image-reference";
6
+ import { InlinePageReferenceComponent } from "./inline-page-reference";
7
+ import * as i0 from "@angular/core";
8
+ /*
9
+ * Web Element Reference Component
10
+ * This component is used to display a reference in the chat interface.
11
+ * It uses a tooltip to show additional information about the reference.
12
+ * The component emits custom events when the user interacts with it.
13
+ *
14
+ * This component is based on the remark template.
15
+ *
16
+ * <!-- Chat reference (badge with file and part number) -->
17
+ * <ng-template remarkTemplate="chat-reference" let-ref>
18
+ * @let attachment = referenceMap.get(ref.refId);
19
+ * @if (attachment) {
20
+ * <a
21
+ * class="reference"
22
+ * role="button"
23
+ * [sqTooltip]="attachment"
24
+ * [sqTooltipTemplate]="tooltipTpl"
25
+ * [hoverableTooltip]="true"
26
+ * (click)="openAttachmentPreview(attachment, ref.refId)"
27
+ * >
28
+ * {{ref.refId}}
29
+ * </a>
30
+ * }
31
+ * @else {
32
+ * <ng-template #staticRefTpl>
33
+ * <span class="reference">{{ ref.refId }}</span>
34
+ * </ng-template>
35
+ * }
36
+ * </ng-template>
37
+ */
38
+ export class ReferenceComponent {
39
+ constructor() {
40
+ this.ref = signal({});
41
+ afterNextRender(() => {
42
+ const obj = JSON.parse(decodeURIComponent(atob(this.attachment)));
43
+ this.ref.set(obj);
44
+ });
45
+ }
46
+ onOpenPreview(attachment, partId) {
47
+ // Émettre un événement personnalisé pour le web element using the service
48
+ dispatchEvent(new CustomEvent("onOpenPreview", {
49
+ detail: { reference: attachment, partId: partId || this.id },
50
+ }));
51
+ }
52
+ onOpenDocument(attachment, partId) {
53
+ // Émettre un événement personnalisé pour le web element using the service
54
+ dispatchEvent(new CustomEvent("onOpenDocument", {
55
+ detail: { reference: attachment, partId: partId || this.id },
56
+ }));
57
+ }
58
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReferenceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
59
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ReferenceComponent, isStandalone: true, selector: "reference", inputs: { id: "id", attachment: "attachment", rank: "rank" }, providers: [], ngImport: i0, template: `
60
+ <a
61
+ class="reference"
62
+ role="button"
63
+ [sqTooltip]="ref()"
64
+ [sqTooltipTemplate]="tooltipTpl"
65
+ [hoverableTooltip]="true"
66
+ (click)="onOpenPreview(ref())"
67
+ >{{ id }}</a>
68
+
69
+ <!-- tooltip template -->
70
+ <ng-template #tooltipTpl>
71
+ <sq-chat-reference
72
+ class="expanded"
73
+ [attachment]="ref()"
74
+ [reference]="ref().contextId"
75
+ [partId]="ref().$partId"
76
+ (openPreview)="onOpenPreview($event, $event.$partId)"
77
+ (openDocument)="onOpenDocument($event, $event.$partId)"
78
+ ></sq-chat-reference>
79
+ </ng-template>
80
+ `, isInline: true, styles: ["div{border:1px solid #ccc;padding:8px;border-radius:4px;display:flex;gap:8px;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: TooltipDirective, selector: "[sqTooltip]", inputs: ["sqTooltip", "sqTooltipData", "sqTooltipTemplate", "placement", "fallbackPlacements", "delay", "hoverableTooltip", "tooltipClass"] }, { kind: "component", type: ChatReferenceComponent, selector: "sq-chat-reference", inputs: ["reference", "attachment", "partId", "referenceMap", "images", "pages"], outputs: ["openDocument", "openPreview"] }] }); }
81
+ }
82
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReferenceComponent, decorators: [{
83
+ type: Component,
84
+ args: [{ selector: "reference", imports: [TooltipDirective, ChatReferenceComponent], providers: [], template: `
85
+ <a
86
+ class="reference"
87
+ role="button"
88
+ [sqTooltip]="ref()"
89
+ [sqTooltipTemplate]="tooltipTpl"
90
+ [hoverableTooltip]="true"
91
+ (click)="onOpenPreview(ref())"
92
+ >{{ id }}</a>
93
+
94
+ <!-- tooltip template -->
95
+ <ng-template #tooltipTpl>
96
+ <sq-chat-reference
97
+ class="expanded"
98
+ [attachment]="ref()"
99
+ [reference]="ref().contextId"
100
+ [partId]="ref().$partId"
101
+ (openPreview)="onOpenPreview($event, $event.$partId)"
102
+ (openDocument)="onOpenDocument($event, $event.$partId)"
103
+ ></sq-chat-reference>
104
+ </ng-template>
105
+ `, standalone: true, styles: ["div{border:1px solid #ccc;padding:8px;border-radius:4px;display:flex;gap:8px;flex-direction:column}\n"] }]
106
+ }], ctorParameters: () => [], propDecorators: { id: [{
107
+ type: Input
108
+ }], attachment: [{
109
+ type: Input
110
+ }], rank: [{
111
+ type: Input
112
+ }] } });
113
+ export class PageReferenceComponent {
114
+ constructor() {
115
+ this.ref = signal({});
116
+ afterNextRender(() => {
117
+ const obj = JSON.parse(decodeURIComponent(atob(this.attachment)));
118
+ this.ref.set(obj);
119
+ });
120
+ }
121
+ onOpenPreview(attachment, partId) {
122
+ // Émettre un événement personnalisé pour le web element using the service
123
+ dispatchEvent(new CustomEvent("onOpenPreview", {
124
+ detail: { reference: attachment, partId: partId || this.id },
125
+ }));
126
+ }
127
+ onOpenDocument(attachment, partId) {
128
+ // Émettre un événement personnalisé pour le web element using the service
129
+ dispatchEvent(new CustomEvent("onOpenDocument", {
130
+ detail: { reference: attachment, partId: partId || this.id },
131
+ }));
132
+ }
133
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PageReferenceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
134
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PageReferenceComponent, isStandalone: true, selector: "page-reference", inputs: { id: "id", attachment: "attachment" }, providers: [], ngImport: i0, template: `
135
+ <span
136
+ class="reference"
137
+ [sqTooltip]="{ obj: ref(), id }"
138
+ [sqTooltipTemplate]="pageTooltipTpl"
139
+ [hoverableTooltip]="true"
140
+ >
141
+ Page-{{ id }}
142
+ </span>
143
+ <ng-template #pageTooltipTpl let-ref>
144
+ <InlinePageReference
145
+ style="max-width: 30vw;"
146
+ [id]="ref.id"
147
+ [ref]="ref.obj"
148
+ (openPreview)="onOpenPreview($event, $event.$partId)"
149
+ (openDocument)="onOpenPreview($event, $event.$partId)"
150
+ />
151
+ </ng-template>
152
+ `, isInline: true, styles: ["div{border:1px solid #ccc;padding:8px;border-radius:4px;display:flex;gap:8px;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: TooltipDirective, selector: "[sqTooltip]", inputs: ["sqTooltip", "sqTooltipData", "sqTooltipTemplate", "placement", "fallbackPlacements", "delay", "hoverableTooltip", "tooltipClass"] }, { kind: "component", type: InlinePageReferenceComponent, selector: "InlinePageReference", inputs: ["id", "ref"], outputs: ["openPreview", "openDocument", "openModal"] }] }); }
153
+ }
154
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PageReferenceComponent, decorators: [{
155
+ type: Component,
156
+ args: [{ selector: "page-reference", imports: [TooltipDirective, InlinePageReferenceComponent], providers: [], template: `
157
+ <span
158
+ class="reference"
159
+ [sqTooltip]="{ obj: ref(), id }"
160
+ [sqTooltipTemplate]="pageTooltipTpl"
161
+ [hoverableTooltip]="true"
162
+ >
163
+ Page-{{ id }}
164
+ </span>
165
+ <ng-template #pageTooltipTpl let-ref>
166
+ <InlinePageReference
167
+ style="max-width: 30vw;"
168
+ [id]="ref.id"
169
+ [ref]="ref.obj"
170
+ (openPreview)="onOpenPreview($event, $event.$partId)"
171
+ (openDocument)="onOpenPreview($event, $event.$partId)"
172
+ />
173
+ </ng-template>
174
+ `, standalone: true, styles: ["div{border:1px solid #ccc;padding:8px;border-radius:4px;display:flex;gap:8px;flex-direction:column}\n"] }]
175
+ }], ctorParameters: () => [], propDecorators: { id: [{
176
+ type: Input
177
+ }], attachment: [{
178
+ type: Input
179
+ }] } });
180
+ export class ImageReferenceComponent {
181
+ constructor() {
182
+ this.ref = signal({});
183
+ afterNextRender(() => {
184
+ const obj = JSON.parse(decodeURIComponent(atob(this.attachment)));
185
+ this.ref.set(obj);
186
+ });
187
+ }
188
+ onOpenPreview(attachment, partId) {
189
+ // Émettre un événement personnalisé pour le web element using the service
190
+ dispatchEvent(new CustomEvent("onOpenPreview", {
191
+ detail: { reference: attachment, partId: partId || this.id },
192
+ }));
193
+ }
194
+ onOpenDocument(attachment, partId) {
195
+ // Émettre un événement personnalisé pour le web element using the service
196
+ dispatchEvent(new CustomEvent("onOpenDocument", {
197
+ detail: { reference: attachment, partId: partId || this.id },
198
+ }));
199
+ }
200
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ImageReferenceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
201
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ImageReferenceComponent, isStandalone: true, selector: "image-reference", inputs: { id: "id", attachment: "attachment" }, providers: [], ngImport: i0, template: `
202
+ <span
203
+ class="reference"
204
+ [sqTooltip]="{ obj: ref(), id }"
205
+ [sqTooltipTemplate]="imageTooltipTpl"
206
+ [hoverableTooltip]="true"
207
+ >
208
+ Img-{{ this.id }}
209
+ </span>
210
+ <ng-template #imageTooltipTpl let-ref>
211
+ <InlineImageReference
212
+ style="max-width: 30vw;"
213
+ [id]="ref.id"
214
+ [ref]="ref.obj"
215
+ (openPreview)="onOpenPreview($event, $event.$partId)"
216
+ (openDocument)="onOpenDocument($event, $event.$partId)"
217
+ />
218
+ </ng-template>
219
+ `, isInline: true, styles: ["div{border:1px solid #ccc;padding:8px;border-radius:4px;display:flex;gap:8px;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: TooltipDirective, selector: "[sqTooltip]", inputs: ["sqTooltip", "sqTooltipData", "sqTooltipTemplate", "placement", "fallbackPlacements", "delay", "hoverableTooltip", "tooltipClass"] }, { kind: "component", type: InlineImageReferenceComponent, selector: "InlineImageReference", inputs: ["id", "ref"], outputs: ["openPreview", "openDocument", "openModal"] }] }); }
220
+ }
221
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ImageReferenceComponent, decorators: [{
222
+ type: Component,
223
+ args: [{ selector: "image-reference", imports: [TooltipDirective, InlineImageReferenceComponent], providers: [], template: `
224
+ <span
225
+ class="reference"
226
+ [sqTooltip]="{ obj: ref(), id }"
227
+ [sqTooltipTemplate]="imageTooltipTpl"
228
+ [hoverableTooltip]="true"
229
+ >
230
+ Img-{{ this.id }}
231
+ </span>
232
+ <ng-template #imageTooltipTpl let-ref>
233
+ <InlineImageReference
234
+ style="max-width: 30vw;"
235
+ [id]="ref.id"
236
+ [ref]="ref.obj"
237
+ (openPreview)="onOpenPreview($event, $event.$partId)"
238
+ (openDocument)="onOpenDocument($event, $event.$partId)"
239
+ />
240
+ </ng-template>
241
+ `, standalone: true, styles: ["div{border:1px solid #ccc;padding:8px;border-radius:4px;display:flex;gap:8px;flex-direction:column}\n"] }]
242
+ }], ctorParameters: () => [], propDecorators: { id: [{
243
+ type: Input
244
+ }], attachment: [{
245
+ type: Input
246
+ }] } });
247
+ export class CodeBlockReferenceComponent {
248
+ constructor() {
249
+ this.el = inject(ElementRef);
250
+ this.langname = "";
251
+ this.encodeCode = '';
252
+ }
253
+ ngAfterViewInit() {
254
+ // get the code content
255
+ const codeEl = this.el.nativeElement.querySelector("code");
256
+ const code = codeEl ? codeEl.textContent : "";
257
+ this.encodeCode = encodeURIComponent(code);
258
+ }
259
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CodeBlockReferenceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
260
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CodeBlockReferenceComponent, isStandalone: true, selector: "code-block-reference", inputs: { langname: "langname" }, ngImport: i0, template: `
261
+ <div class="card mb-2">
262
+ <div class="card-header d-flex justify-content-end align-items-center">
263
+ <span class="me-auto">{{ langname || 'code'}}</span>
264
+ <button class="btn btn-light btn-sm" copy-to-clipboard [text]="encodeCode">
265
+ <svg data-testid="geist-icon" height="16" stroke-linejoin="round" viewBox="0 0 16 16" width="16" aria-hidden="true" style="color: currentcolor;"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" fill="currentColor"></path></svg>
266
+ </button>
267
+ </div>
268
+ <ng-content></ng-content>
269
+ </div>
270
+ `, isInline: true, dependencies: [{ kind: "directive", type: CopyToClipboardDirective, selector: "[copy-to-clipboard]", inputs: ["text"] }] }); }
271
+ }
272
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CodeBlockReferenceComponent, decorators: [{
273
+ type: Component,
274
+ args: [{
275
+ selector: "code-block-reference",
276
+ imports: [CopyToClipboardDirective],
277
+ template: `
278
+ <div class="card mb-2">
279
+ <div class="card-header d-flex justify-content-end align-items-center">
280
+ <span class="me-auto">{{ langname || 'code'}}</span>
281
+ <button class="btn btn-light btn-sm" copy-to-clipboard [text]="encodeCode">
282
+ <svg data-testid="geist-icon" height="16" stroke-linejoin="round" viewBox="0 0 16 16" width="16" aria-hidden="true" style="color: currentcolor;"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" fill="currentColor"></path></svg>
283
+ </button>
284
+ </div>
285
+ <ng-content></ng-content>
286
+ </div>
287
+ `,
288
+ standalone: true,
289
+ }]
290
+ }], propDecorators: { langname: [{
291
+ type: Input
292
+ }] } });
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9yZWZlcmVuY2VzL3JlZmVyZW5jZXMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNyRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUdoRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFFdkU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBaUNILE1BQU0sT0FBTyxrQkFBa0I7SUFRN0I7UUFGQSxRQUFHLEdBQUcsTUFBTSxDQUF3QixFQUEyQixDQUFDLENBQUM7UUFHL0QsZUFBZSxDQUFDLEdBQUcsRUFBRTtZQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWEsQ0FBQyxVQUFpQyxFQUFFLE1BQWU7UUFDOUQsMEVBQTBFO1FBQzFFLGFBQWEsQ0FDWCxJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUU7WUFDL0IsTUFB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QUFDO1FBQzNELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxVQUFVLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQzsrR0FaVSwyQkFBMkI7bUdBQTNCLDJCQUEyQixrSEFiNUI7Ozs7Ozs7Ozs7R0FVVCw0REFYUyx3QkFBd0I7OzRGQWN2QiwyQkFBMkI7a0JBaEJ2QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLE9BQU8sRUFBRSxDQUFDLHdCQUF3QixDQUFDO29CQUNuQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7R0FVVDtvQkFDRCxVQUFVLEVBQUUsSUFBSTtpQkFDakI7OEJBSVUsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFmdGVyTmV4dFJlbmRlciwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBpbmplY3QsIElucHV0LCBzaWduYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBDaGF0UmVmZXJlbmNlQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NoYXQtcmVmZXJlbmNlL2NoYXQtcmVmZXJlbmNlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDb3B5VG9DbGlwYm9hcmREaXJlY3RpdmUgfSBmcm9tIFwiLi4vZGlyZWN0aXZlcy9jb3B5LXRvLWNsaXBib2FyZC5kaXJlY3RpdmVcIjtcclxuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gXCIuLi90b29sdGlwL3Rvb2x0aXAuZGlyZWN0aXZlXCI7XHJcbmltcG9ydCB7IENoYXRDb250ZXh0QXR0YWNobWVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xyXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VJbWFnZVJlZmVyZW5jZSB9IGZyb20gXCIuLi90eXBlcy9tZXNzYWdlLXJlZmVyZW5jZS50eXBlc1wiO1xyXG5pbXBvcnQgeyBJbmxpbmVJbWFnZVJlZmVyZW5jZUNvbXBvbmVudCB9IGZyb20gXCIuL2lubGluZS1pbWFnZS1yZWZlcmVuY2VcIjtcclxuaW1wb3J0IHsgSW5saW5lUGFnZVJlZmVyZW5jZUNvbXBvbmVudCB9IGZyb20gXCIuL2lubGluZS1wYWdlLXJlZmVyZW5jZVwiO1xyXG5cclxuLypcclxuICogV2ViIEVsZW1lbnQgUmVmZXJlbmNlIENvbXBvbmVudFxyXG4gKiBUaGlzIGNvbXBvbmVudCBpcyB1c2VkIHRvIGRpc3BsYXkgYSByZWZlcmVuY2UgaW4gdGhlIGNoYXQgaW50ZXJmYWNlLlxyXG4gKiBJdCB1c2VzIGEgdG9vbHRpcCB0byBzaG93IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZmVyZW5jZS5cclxuICogVGhlIGNvbXBvbmVudCBlbWl0cyBjdXN0b20gZXZlbnRzIHdoZW4gdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGggaXQuXHJcbiAqXHJcbiAqIFRoaXMgY29tcG9uZW50IGlzIGJhc2VkIG9uIHRoZSByZW1hcmsgdGVtcGxhdGUuXHJcbiAqXHJcbiAqIDwhLS0gQ2hhdCByZWZlcmVuY2UgKGJhZGdlIHdpdGggZmlsZSBhbmQgcGFydCBudW1iZXIpIC0tPlxyXG4gKiA8bmctdGVtcGxhdGUgcmVtYXJrVGVtcGxhdGU9XCJjaGF0LXJlZmVyZW5jZVwiIGxldC1yZWY+XHJcbiAqICAgICBAbGV0IGF0dGFjaG1lbnQgPSByZWZlcmVuY2VNYXAuZ2V0KHJlZi5yZWZJZCk7XHJcbiAqICAgICBAaWYgKGF0dGFjaG1lbnQpIHtcclxuICogICAgICAgPGFcclxuICogICAgICAgICBjbGFzcz1cInJlZmVyZW5jZVwiXHJcbiAqICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAqICAgICAgICAgW3NxVG9vbHRpcF09XCJhdHRhY2htZW50XCJcclxuICogICAgICAgICBbc3FUb29sdGlwVGVtcGxhdGVdPVwidG9vbHRpcFRwbFwiXHJcbiAqICAgICAgICAgW2hvdmVyYWJsZVRvb2x0aXBdPVwidHJ1ZVwiXHJcbiAqICAgICAgICAgKGNsaWNrKT1cIm9wZW5BdHRhY2htZW50UHJldmlldyhhdHRhY2htZW50LCByZWYucmVmSWQpXCJcclxuICogICAgICAgPlxyXG4gKiAgICAgICAgIHt7cmVmLnJlZklkfX1cclxuICogICAgICAgPC9hPlxyXG4gKiAgICAgfVxyXG4gKiAgICAgQGVsc2Uge1xyXG4gKiAgICAgICA8bmctdGVtcGxhdGUgI3N0YXRpY1JlZlRwbD5cclxuICogICAgICAgICA8c3BhbiBjbGFzcz1cInJlZmVyZW5jZVwiPnt7IHJlZi5yZWZJZCB9fTwvc3Bhbj5cclxuICogICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICogICAgIH1cclxuICogPC9uZy10ZW1wbGF0ZT5cclxuICovXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJyZWZlcmVuY2VcIixcclxuICBpbXBvcnRzOiBbVG9vbHRpcERpcmVjdGl2ZSwgQ2hhdFJlZmVyZW5jZUNvbXBvbmVudF0sXHJcbiAgcHJvdmlkZXJzOiBbXSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gIDxhXHJcbiAgICBjbGFzcz1cInJlZmVyZW5jZVwiXHJcbiAgICByb2xlPVwiYnV0dG9uXCJcclxuICAgIFtzcVRvb2x0aXBdPVwicmVmKClcIlxyXG4gICAgW3NxVG9vbHRpcFRlbXBsYXRlXT1cInRvb2x0aXBUcGxcIlxyXG4gICAgW2hvdmVyYWJsZVRvb2x0aXBdPVwidHJ1ZVwiXHJcbiAgICAoY2xpY2spPVwib25PcGVuUHJldmlldyhyZWYoKSlcIlxyXG4gICAgPnt7IGlkIH19PC9hPlxyXG5cclxuICAgIDwhLS0gdG9vbHRpcCB0ZW1wbGF0ZSAtLT5cclxuICAgIDxuZy10ZW1wbGF0ZSAjdG9vbHRpcFRwbD5cclxuICAgICAgPHNxLWNoYXQtcmVmZXJlbmNlXHJcbiAgICAgICAgY2xhc3M9XCJleHBhbmRlZFwiXHJcbiAgICAgICAgW2F0dGFjaG1lbnRdPVwicmVmKClcIlxyXG4gICAgICAgIFtyZWZlcmVuY2VdPVwicmVmKCkuY29udGV4dElkXCJcclxuICAgICAgICBbcGFydElkXT1cInJlZigpLiRwYXJ0SWRcIlxyXG4gICAgICAgIChvcGVuUHJldmlldyk9XCJvbk9wZW5QcmV2aWV3KCRldmVudCwgJGV2ZW50LiRwYXJ0SWQpXCJcclxuICAgICAgICAob3BlbkRvY3VtZW50KT1cIm9uT3BlbkRvY3VtZW50KCRldmVudCwgJGV2ZW50LiRwYXJ0SWQpXCJcclxuICAgICAgPjwvc3EtY2hhdC1yZWZlcmVuY2U+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIGAsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBzdHlsZXM6IGBcclxuICBkaXYgeyBib3JkZXI6IDFweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiA4cHg7Ym9yZGVyLXJhZGl1czogNHB4OyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgfVxyXG4gIGAsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZWZlcmVuY2VDb21wb25lbnQge1xyXG4gIC8vIGplIHN1aXMgb2JsaWfDqSBkJ3V0aWxpc2VyIGxlcyBkw6ljb3JhdGV1cnMgQElucHV0KCkgY2FyIEFuZ3VsYXIgbmUgc3VwcG9ydGUgcGFzIGxlcyBpbnB1dHMgKHNpZ25hbCkgZGFucyBsZXMgd2ViIGVsZW1lbnRzIGVuIEFuZ3VsYXIgdjE4XHJcbiAgQElucHV0KCkgaWQ7XHJcbiAgQElucHV0KCkgYXR0YWNobWVudDtcclxuICBASW5wdXQoKSByYW5rOiBudW1iZXI7XHJcblxyXG4gIHJlZiA9IHNpZ25hbDxDaGF0Q29udGV4dEF0dGFjaG1lbnQ+KHt9IGFzIENoYXRDb250ZXh0QXR0YWNobWVudCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcclxuICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQoYXRvYih0aGlzLmF0dGFjaG1lbnQpKSk7XHJcbiAgICAgIHRoaXMucmVmLnNldChvYmopO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbk9wZW5QcmV2aWV3KGF0dGFjaG1lbnQ6IENoYXRDb250ZXh0QXR0YWNobWVudCwgcGFydElkPzogbnVtYmVyKSB7XHJcbiAgICAvLyDDiW1ldHRyZSB1biDDqXbDqW5lbWVudCBwZXJzb25uYWxpc8OpIHBvdXIgbGUgd2ViIGVsZW1lbnQgdXNpbmcgdGhlIHNlcnZpY2VcclxuICAgIGRpc3BhdGNoRXZlbnQoXHJcbiAgICAgIG5ldyBDdXN0b21FdmVudChcIm9uT3BlblByZXZpZXdcIiwge1xyXG4gICAgICAgIGRldGFpbDogeyByZWZlcmVuY2U6IGF0dGFjaG1lbnQsIHBhcnRJZDogcGFydElkIHx8IHRoaXMuaWQgfSxcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvbk9wZW5Eb2N1bWVudChhdHRhY2htZW50OiBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIHBhcnRJZD86IG51bWJlcikge1xyXG4gICAgLy8gw4ltZXR0cmUgdW4gw6l2w6luZW1lbnQgcGVyc29ubmFsaXPDqSBwb3VyIGxlIHdlYiBlbGVtZW50IHVzaW5nIHRoZSBzZXJ2aWNlXHJcbiAgICBkaXNwYXRjaEV2ZW50KFxyXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoXCJvbk9wZW5Eb2N1bWVudFwiLCB7XHJcbiAgICAgICAgZGV0YWlsOiB7IHJlZmVyZW5jZTogYXR0YWNobWVudCwgcGFydElkOiBwYXJ0SWQgfHwgdGhpcy5pZCB9LFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcInBhZ2UtcmVmZXJlbmNlXCIsXHJcbiAgaW1wb3J0czogW1Rvb2x0aXBEaXJlY3RpdmUsIElubGluZVBhZ2VSZWZlcmVuY2VDb21wb25lbnRdLFxyXG4gIHByb3ZpZGVyczogW10sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxzcGFuXHJcbiAgICAgIGNsYXNzPVwicmVmZXJlbmNlXCJcclxuICAgICAgW3NxVG9vbHRpcF09XCJ7IG9iajogcmVmKCksIGlkIH1cIlxyXG4gICAgICBbc3FUb29sdGlwVGVtcGxhdGVdPVwicGFnZVRvb2x0aXBUcGxcIlxyXG4gICAgICBbaG92ZXJhYmxlVG9vbHRpcF09XCJ0cnVlXCJcclxuICAgID5cclxuICAgICAgUGFnZS17eyBpZCB9fVxyXG4gICAgPC9zcGFuPlxyXG4gICAgPG5nLXRlbXBsYXRlICNwYWdlVG9vbHRpcFRwbCBsZXQtcmVmPlxyXG4gICAgICA8SW5saW5lUGFnZVJlZmVyZW5jZVxyXG4gICAgICAgIHN0eWxlPVwibWF4LXdpZHRoOiAzMHZ3O1wiXHJcbiAgICAgICAgW2lkXT1cInJlZi5pZFwiXHJcbiAgICAgICAgW3JlZl09XCJyZWYub2JqXCJcclxuICAgICAgICAob3BlblByZXZpZXcpPVwib25PcGVuUHJldmlldygkZXZlbnQsICRldmVudC4kcGFydElkKVwiXHJcbiAgICAgICAgKG9wZW5Eb2N1bWVudCk9XCJvbk9wZW5QcmV2aWV3KCRldmVudCwgJGV2ZW50LiRwYXJ0SWQpXCJcclxuICAgICAgLz5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgYCxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHN0eWxlczogYFxyXG4gIGRpdiB7IGJvcmRlcjogMXB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDhweDtib3JkZXItcmFkaXVzOiA0cHg7IGRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyB9XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFBhZ2VSZWZlcmVuY2VDb21wb25lbnQge1xyXG4gIC8vIGplIHN1aXMgb2JsaWfDqSBkJ3V0aWxpc2VyIGxlcyBkw6ljb3JhdGV1cnMgQElucHV0KCkgY2FyIEFuZ3VsYXIgbmUgc3VwcG9ydGUgcGFzIGxlcyBpbnB1dHMgKHNpZ25hbCkgZGFucyBsZXMgd2ViIGVsZW1lbnRzIGVuIEFuZ3VsYXIgdjE4XHJcbiAgQElucHV0KCkgaWQ7XHJcbiAgQElucHV0KCkgYXR0YWNobWVudDtcclxuXHJcbiAgcmVmID0gc2lnbmFsPE1lc3NhZ2VJbWFnZVJlZmVyZW5jZT4oe30pO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9iaiA9IEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IodGhpcy5hdHRhY2htZW50KSkpO1xyXG4gICAgICB0aGlzLnJlZi5zZXQob2JqKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25PcGVuUHJldmlldyhhdHRhY2htZW50OiBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIHBhcnRJZD86IG51bWJlcikge1xyXG4gICAgLy8gw4ltZXR0cmUgdW4gw6l2w6luZW1lbnQgcGVyc29ubmFsaXPDqSBwb3VyIGxlIHdlYiBlbGVtZW50IHVzaW5nIHRoZSBzZXJ2aWNlXHJcbiAgICBkaXNwYXRjaEV2ZW50KFxyXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoXCJvbk9wZW5QcmV2aWV3XCIsIHtcclxuICAgICAgICBkZXRhaWw6IHsgcmVmZXJlbmNlOiBhdHRhY2htZW50LCBwYXJ0SWQ6IHBhcnRJZCB8fCB0aGlzLmlkIH0sXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb25PcGVuRG9jdW1lbnQoYXR0YWNobWVudDogQ2hhdENvbnRleHRBdHRhY2htZW50LCBwYXJ0SWQ/OiBudW1iZXIpIHtcclxuICAgIC8vIMOJbWV0dHJlIHVuIMOpdsOpbmVtZW50IHBlcnNvbm5hbGlzw6kgcG91ciBsZSB3ZWIgZWxlbWVudCB1c2luZyB0aGUgc2VydmljZVxyXG4gICAgZGlzcGF0Y2hFdmVudChcclxuICAgICAgbmV3IEN1c3RvbUV2ZW50KFwib25PcGVuRG9jdW1lbnRcIiwge1xyXG4gICAgICAgIGRldGFpbDogeyByZWZlcmVuY2U6IGF0dGFjaG1lbnQsIHBhcnRJZDogcGFydElkIHx8IHRoaXMuaWQgfSxcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJpbWFnZS1yZWZlcmVuY2VcIixcclxuICBpbXBvcnRzOiBbVG9vbHRpcERpcmVjdGl2ZSwgSW5saW5lSW1hZ2VSZWZlcmVuY2VDb21wb25lbnRdLFxyXG4gIHByb3ZpZGVyczogW10sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxzcGFuXHJcbiAgICAgIGNsYXNzPVwicmVmZXJlbmNlXCJcclxuICAgICAgW3NxVG9vbHRpcF09XCJ7IG9iajogcmVmKCksIGlkIH1cIlxyXG4gICAgICBbc3FUb29sdGlwVGVtcGxhdGVdPVwiaW1hZ2VUb29sdGlwVHBsXCJcclxuICAgICAgW2hvdmVyYWJsZVRvb2x0aXBdPVwidHJ1ZVwiXHJcbiAgICA+XHJcbiAgICAgIEltZy17eyB0aGlzLmlkIH19XHJcbiAgICA8L3NwYW4+XHJcbiAgICA8bmctdGVtcGxhdGUgI2ltYWdlVG9vbHRpcFRwbCBsZXQtcmVmPlxyXG4gICAgICA8SW5saW5lSW1hZ2VSZWZlcmVuY2VcclxuICAgICAgICBzdHlsZT1cIm1heC13aWR0aDogMzB2dztcIlxyXG4gICAgICAgIFtpZF09XCJyZWYuaWRcIlxyXG4gICAgICAgIFtyZWZdPVwicmVmLm9ialwiXHJcbiAgICAgICAgKG9wZW5QcmV2aWV3KT1cIm9uT3BlblByZXZpZXcoJGV2ZW50LCAkZXZlbnQuJHBhcnRJZClcIlxyXG4gICAgICAgIChvcGVuRG9jdW1lbnQpPVwib25PcGVuRG9jdW1lbnQoJGV2ZW50LCAkZXZlbnQuJHBhcnRJZClcIlxyXG4gICAgICAvPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICBgLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgc3R5bGVzOiBgXHJcbiAgZGl2IHsgYm9yZGVyOiAxcHggc29saWQgI2NjYzsgcGFkZGluZzogOHB4O2JvcmRlci1yYWRpdXM6IDRweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IH1cclxuICBgLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSW1hZ2VSZWZlcmVuY2VDb21wb25lbnQge1xyXG4gIC8vIGplIHN1aXMgb2JsaWfDqSBkJ3V0aWxpc2VyIGxlcyBkw6ljb3JhdGV1cnMgQElucHV0KCkgY2FyIEFuZ3VsYXIgbmUgc3VwcG9ydGUgcGFzIGxlcyBpbnB1dHMgKHNpZ25hbCkgZGFucyBsZXMgd2ViIGVsZW1lbnRzIGVuIEFuZ3VsYXIgdjE4XHJcbiAgQElucHV0KCkgaWQ7XHJcbiAgQElucHV0KCkgYXR0YWNobWVudDtcclxuXHJcbiAgcmVmID0gc2lnbmFsPE1lc3NhZ2VJbWFnZVJlZmVyZW5jZT4oe30pO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9iaiA9IEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IodGhpcy5hdHRhY2htZW50KSkpO1xyXG4gICAgICB0aGlzLnJlZi5zZXQob2JqKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25PcGVuUHJldmlldyhhdHRhY2htZW50OiBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIHBhcnRJZD86IG51bWJlcikge1xyXG4gICAgLy8gw4ltZXR0cmUgdW4gw6l2w6luZW1lbnQgcGVyc29ubmFsaXPDqSBwb3VyIGxlIHdlYiBlbGVtZW50IHVzaW5nIHRoZSBzZXJ2aWNlXHJcbiAgICBkaXNwYXRjaEV2ZW50KFxyXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoXCJvbk9wZW5QcmV2aWV3XCIsIHtcclxuICAgICAgICBkZXRhaWw6IHsgcmVmZXJlbmNlOiBhdHRhY2htZW50LCBwYXJ0SWQ6IHBhcnRJZCB8fCB0aGlzLmlkIH0sXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb25PcGVuRG9jdW1lbnQoYXR0YWNobWVudDogQ2hhdENvbnRleHRBdHRhY2htZW50LCBwYXJ0SWQ/OiBudW1iZXIpIHtcclxuICAgIC8vIMOJbWV0dHJlIHVuIMOpdsOpbmVtZW50IHBlcnNvbm5hbGlzw6kgcG91ciBsZSB3ZWIgZWxlbWVudCB1c2luZyB0aGUgc2VydmljZVxyXG4gICAgZGlzcGF0Y2hFdmVudChcclxuICAgICAgbmV3IEN1c3RvbUV2ZW50KFwib25PcGVuRG9jdW1lbnRcIiwge1xyXG4gICAgICAgIGRldGFpbDogeyByZWZlcmVuY2U6IGF0dGFjaG1lbnQsIHBhcnRJZDogcGFydElkIHx8IHRoaXMuaWQgfSxcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJjb2RlLWJsb2NrLXJlZmVyZW5jZVwiLFxyXG4gIGltcG9ydHM6IFtDb3B5VG9DbGlwYm9hcmREaXJlY3RpdmVdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbjxkaXYgY2xhc3M9XCJjYXJkIG1iLTJcIj5cclxuICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICA8c3BhbiBjbGFzcz1cIm1lLWF1dG9cIj57eyBsYW5nbmFtZSB8fCAnY29kZSd9fTwvc3Bhbj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbVwiIGNvcHktdG8tY2xpcGJvYXJkIFt0ZXh0XT1cImVuY29kZUNvZGVcIj5cclxuICAgICAgPHN2ZyBkYXRhLXRlc3RpZD1cImdlaXN0LWljb25cIiBoZWlnaHQ9XCIxNlwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBzdHlsZT1cImNvbG9yOiBjdXJyZW50Y29sb3I7XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTIuNzUgMC41QzEuNzgzNSAwLjUgMSAxLjI4MzUgMSAyLjI1VjkuNzVDMSAxMC43MTY1IDEuNzgzNSAxMS41IDIuNzUgMTEuNUgzLjc1SDQuNVYxMEgzLjc1SDIuNzVDMi42MTE5MyAxMCAyLjUgOS44ODgwNyAyLjUgOS43NVYyLjI1QzIuNSAyLjExMTkzIDIuNjExOTMgMiAyLjc1IDJIOC4yNUM4LjM4ODA3IDIgOC41IDIuMTExOTMgOC41IDIuMjVWM0gxMFYyLjI1QzEwIDEuMjgzNSA5LjIxNjUgMC41IDguMjUgMC41SDIuNzVaTTcuNzUgNC41QzYuNzgzNSA0LjUgNiA1LjI4MzUgNiA2LjI1VjEzLjc1QzYgMTQuNzE2NSA2Ljc4MzUgMTUuNSA3Ljc1IDE1LjVIMTMuMjVDMTQuMjE2NSAxNS41IDE1IDE0LjcxNjUgMTUgMTMuNzVWNi4yNUMxNSA1LjI4MzUgMTQuMjE2NSA0LjUgMTMuMjUgNC41SDcuNzVaTTcuNSA2LjI1QzcuNSA2LjExMTkzIDcuNjExOTMgNiA3Ljc1IDZIMTMuMjVDMTMuMzg4MSA2IDEzLjUgNi4xMTE5MyAxMy41IDYuMjVWMTMuNzVDMTMuNSAxMy44ODgxIDEzLjM4ODEgMTQgMTMuMjUgMTRINy43NUM3LjYxMTkzIDE0IDcuNSAxMy44ODgxIDcuNSAxMy43NVY2LjI1WlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3BhdGg+PC9zdmc+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbjwvZGl2PlxyXG4gIGAsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENvZGVCbG9ja1JlZmVyZW5jZUNvbXBvbmVudCB7XHJcbiAgZWwgPSBpbmplY3QoRWxlbWVudFJlZik7XHJcblxyXG4gIEBJbnB1dCgpIGxhbmduYW1lID0gXCJcIjtcclxuXHJcbiAgZW5jb2RlQ29kZSA9ICcnO1xyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAvLyBnZXQgdGhlIGNvZGUgY29udGVudFxyXG4gICAgY29uc3QgY29kZUVsID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJjb2RlXCIpO1xyXG4gICAgY29uc3QgY29kZSA9IGNvZGVFbCA/IGNvZGVFbC50ZXh0Q29udGVudCA6IFwiXCI7XHJcbiAgICB0aGlzLmVuY29kZUNvZGUgPSBlbmNvZGVVUklDb21wb25lbnQoY29kZSk7XHJcbiAgfVxyXG59Il19