@kartverket/backstage-plugin-risk-scorecard 6.7.3 → 6.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/riScInfo/LockedRiScView.esm.js +58 -0
- package/dist/components/riScInfo/LockedRiScView.esm.js.map +1 -0
- package/dist/components/riScInfo/LockedRiScView.module.css.esm.js +8 -0
- package/dist/components/riScInfo/LockedRiScView.module.css.esm.js.map +1 -0
- package/dist/components/riScInfo/RiScSelectionCard.esm.js +29 -17
- package/dist/components/riScInfo/RiScSelectionCard.esm.js.map +1 -1
- package/dist/components/riScInfo/RiScSelectionCard.module.css.esm.js +2 -2
- package/dist/components/riScPlugin/RiScPlugin.esm.js +27 -2
- package/dist/components/riScPlugin/RiScPlugin.esm.js.map +1 -1
- package/dist/contexts/RiScContext.esm.js +33 -12
- package/dist/contexts/RiScContext.esm.js.map +1 -1
- package/dist/utils/translations.esm.js +11 -1
- package/dist/utils/translations.esm.js.map +1 -1
- package/dist/utils/types.esm.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Card, CardHeader, Flex, Text, CardBody, Button } from '@backstage/ui';
|
|
4
|
+
import { pluginRiScTranslationRef } from '../../utils/translations.esm.js';
|
|
5
|
+
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
6
|
+
import styles from './LockedRiScView.module.css.esm.js';
|
|
7
|
+
|
|
8
|
+
function LockedRiScView({ lockedRiSc }) {
|
|
9
|
+
const { t } = useTranslationRef(pluginRiScTranslationRef);
|
|
10
|
+
const [copied, setCopied] = useState(false);
|
|
11
|
+
const keyId = lockedRiSc.encryptionKeyId?.split("/").pop() ?? lockedRiSc.encryptionKeyId ?? "";
|
|
12
|
+
const handleCopy = () => {
|
|
13
|
+
navigator.clipboard.writeText(keyId).then(() => {
|
|
14
|
+
setCopied(true);
|
|
15
|
+
setTimeout(() => setCopied(false), 2e3);
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
return /* @__PURE__ */ jsxs(Card, { className: styles.card, children: [
|
|
19
|
+
/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(Flex, { justify: "center", children: /* @__PURE__ */ jsx(Text, { variant: "title-small", weight: "bold", children: t("lockedRiScCard.title") }) }) }),
|
|
20
|
+
/* @__PURE__ */ jsx(CardBody, { children: /* @__PURE__ */ jsxs(
|
|
21
|
+
Flex,
|
|
22
|
+
{
|
|
23
|
+
direction: "column",
|
|
24
|
+
align: "center",
|
|
25
|
+
gap: "8px",
|
|
26
|
+
className: styles.content,
|
|
27
|
+
style: { padding: "8px 0" },
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ jsx(Text, { children: t("lockedRiScCard.description") }),
|
|
30
|
+
keyId && /* @__PURE__ */ jsxs(Flex, { direction: "column", align: "center", gap: "4px", children: [
|
|
31
|
+
/* @__PURE__ */ jsx(Text, { children: t("lockedRiScCard.encryptedWithKey") }),
|
|
32
|
+
/* @__PURE__ */ jsxs(Flex, { align: "center", gap: "8px", children: [
|
|
33
|
+
/* @__PURE__ */ jsx(Text, { weight: "bold", children: keyId }),
|
|
34
|
+
/* @__PURE__ */ jsx(
|
|
35
|
+
Button,
|
|
36
|
+
{
|
|
37
|
+
variant: "tertiary",
|
|
38
|
+
size: "small",
|
|
39
|
+
iconStart: /* @__PURE__ */ jsx(
|
|
40
|
+
"i",
|
|
41
|
+
{
|
|
42
|
+
className: copied ? "ri-check-line" : "ri-file-copy-line"
|
|
43
|
+
}
|
|
44
|
+
),
|
|
45
|
+
onClick: handleCopy,
|
|
46
|
+
children: copied ? t("dictionary.copied") : t("dictionary.copy")
|
|
47
|
+
}
|
|
48
|
+
)
|
|
49
|
+
] })
|
|
50
|
+
] })
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
) })
|
|
54
|
+
] });
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export { LockedRiScView };
|
|
58
|
+
//# sourceMappingURL=LockedRiScView.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LockedRiScView.esm.js","sources":["../../../src/components/riScInfo/LockedRiScView.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Button, Card, CardBody, CardHeader, Flex, Text } from '@backstage/ui';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { LockedRiSc } from '../../utils/types';\nimport styles from './LockedRiScView.module.css';\n\ntype LockedRiScViewProps = {\n lockedRiSc: LockedRiSc;\n};\n\nexport function LockedRiScView({ lockedRiSc }: LockedRiScViewProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const [copied, setCopied] = useState(false);\n\n const keyId =\n lockedRiSc.encryptionKeyId?.split('/').pop() ??\n lockedRiSc.encryptionKeyId ??\n '';\n\n const handleCopy = () => {\n navigator.clipboard.writeText(keyId).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n };\n\n return (\n <Card className={styles.card}>\n <CardHeader>\n <Flex justify=\"center\">\n <Text variant=\"title-small\" weight=\"bold\">\n {t('lockedRiScCard.title')}\n </Text>\n </Flex>\n </CardHeader>\n <CardBody>\n <Flex\n direction=\"column\"\n align=\"center\"\n gap=\"8px\"\n className={styles.content}\n style={{ padding: '8px 0' }}\n >\n <Text>{t('lockedRiScCard.description')}</Text>\n {keyId && (\n <Flex direction=\"column\" align=\"center\" gap=\"4px\">\n <Text>{t('lockedRiScCard.encryptedWithKey')}</Text>\n <Flex align=\"center\" gap=\"8px\">\n <Text weight=\"bold\">{keyId}</Text>\n <Button\n variant=\"tertiary\"\n size=\"small\"\n iconStart={\n <i\n className={copied ? 'ri-check-line' : 'ri-file-copy-line'}\n />\n }\n onClick={handleCopy}\n >\n {copied ? t('dictionary.copied') : t('dictionary.copy')}\n </Button>\n </Flex>\n </Flex>\n )}\n </Flex>\n </CardBody>\n </Card>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAWO,SAAS,cAAA,CAAe,EAAE,UAAA,EAAW,EAAwB;AAClE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAE1C,EAAA,MAAM,KAAA,GACJ,WAAW,eAAA,EAAiB,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAC3C,UAAA,CAAW,eAAA,IACX,EAAA;AAEF,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,KAAK,CAAA,CAAE,KAAK,MAAM;AAC9C,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,GAAI,CAAA;AAAA,IACzC,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,IAAA,EACtB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,UACZ,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,aAAA,EAAc,QAAO,MAAA,EAChC,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAC3B,GACF,CAAA,EACF,CAAA;AAAA,wBACC,QAAA,EAAA,EACC,QAAA,kBAAA,IAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,QAAA;AAAA,QACV,KAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAI,KAAA;AAAA,QACJ,WAAW,MAAA,CAAO,OAAA;AAAA,QAClB,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,EAAQ;AAAA,QAE1B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,4BAA4B,CAAA,EAAE,CAAA;AAAA,UACtC,KAAA,yBACE,IAAA,EAAA,EAAK,SAAA,EAAU,UAAS,KAAA,EAAM,QAAA,EAAS,KAAI,KAAA,EAC1C,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,iCAAiC,CAAA,EAAE,CAAA;AAAA,4BAC5C,IAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,QAAA,EAAS,KAAI,KAAA,EACvB,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,MAAA,EAAO,MAAA,EAAQ,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,8BAC3B,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAQ,UAAA;AAAA,kBACR,IAAA,EAAK,OAAA;AAAA,kBACL,SAAA,kBACE,GAAA;AAAA,oBAAC,GAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAW,SAAS,eAAA,GAAkB;AAAA;AAAA,mBACxC;AAAA,kBAEF,OAAA,EAAS,UAAA;AAAA,kBAER,QAAA,EAAA,MAAA,GAAS,CAAA,CAAE,mBAAmB,CAAA,GAAI,EAAE,iBAAiB;AAAA;AAAA;AACxD,aAAA,EACF;AAAA,WAAA,EACF;AAAA;AAAA;AAAA,KAEJ,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
|
|
2
|
+
|
|
3
|
+
var css_248z = ".LockedRiScView_card__3c6faf2db4 {\n width: 520px;\n}\n\n.LockedRiScView_content__3c6faf2db4 {\n text-align: center;\n}\n";
|
|
4
|
+
var styles = {"card":"LockedRiScView_card__3c6faf2db4","content":"LockedRiScView_content__3c6faf2db4"};
|
|
5
|
+
styleInject(css_248z);
|
|
6
|
+
|
|
7
|
+
export { styles as default };
|
|
8
|
+
//# sourceMappingURL=LockedRiScView.module.css.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LockedRiScView.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
@@ -1,29 +1,41 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { useRiScs } from '../../contexts/RiScContext.esm.js';
|
|
3
3
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
4
4
|
import { pluginRiScTranslationRef } from '../../utils/translations.esm.js';
|
|
5
|
-
import { Flex
|
|
5
|
+
import { Flex } from '@backstage/ui';
|
|
6
|
+
import FormControl from '@mui/material/FormControl';
|
|
7
|
+
import ListSubheader from '@mui/material/ListSubheader';
|
|
8
|
+
import MenuItem from '@mui/material/MenuItem';
|
|
9
|
+
import MUISelect from '@mui/material/Select';
|
|
6
10
|
import riscStyles from './RiScSelectionCard.module.css.esm.js';
|
|
7
11
|
|
|
8
12
|
function RiScSelectionCard() {
|
|
9
|
-
const { riScs, selectedRiSc, selectRiSc } = useRiScs();
|
|
13
|
+
const { riScs, lockedRiScs, selectedRiSc, selectedLockedRiSc, selectRiSc } = useRiScs();
|
|
10
14
|
const { t } = useTranslationRef(pluginRiScTranslationRef);
|
|
11
|
-
|
|
12
|
-
|
|
15
|
+
const hasOptions = riScs !== null && riScs.length !== 0 || lockedRiScs.length !== 0;
|
|
16
|
+
return /* @__PURE__ */ jsx(Flex, { direction: "column", gap: "24px", children: hasOptions && /* @__PURE__ */ jsx(FormControl, { fullWidth: true, size: "small", children: /* @__PURE__ */ jsxs(
|
|
17
|
+
MUISelect,
|
|
13
18
|
{
|
|
14
|
-
value: selectedRiSc?.id,
|
|
15
|
-
|
|
16
|
-
"aria-label": t("contentHeader.multipleRiScs"),
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
value: selectedRiSc?.id ?? selectedLockedRiSc?.id ?? "",
|
|
20
|
+
onChange: (e) => selectRiSc(e.target.value),
|
|
21
|
+
inputProps: { "aria-label": t("contentHeader.multipleRiScs") },
|
|
22
|
+
MenuProps: { disablePortal: true },
|
|
23
|
+
children: [
|
|
24
|
+
(riScs ?? []).map((riSc) => /* @__PURE__ */ jsx(MenuItem, { value: riSc.id, children: riSc.content.title }, riSc.id)),
|
|
25
|
+
lockedRiScs.length > 0 && /* @__PURE__ */ jsx(
|
|
26
|
+
ListSubheader,
|
|
27
|
+
{
|
|
28
|
+
className: `${riscStyles.lockedSectionHeader} ${riScs && riScs.length > 0 ? riscStyles.lockedSectionHeaderWithDivider : ""}`,
|
|
29
|
+
children: t("contentHeader.lockedRiScsSection")
|
|
30
|
+
}
|
|
31
|
+
),
|
|
32
|
+
lockedRiScs.map((riSc) => /* @__PURE__ */ jsxs(MenuItem, { value: riSc.id, children: [
|
|
33
|
+
"\u{1F512} ",
|
|
34
|
+
riSc.id
|
|
35
|
+
] }, riSc.id))
|
|
36
|
+
]
|
|
25
37
|
}
|
|
26
|
-
) });
|
|
38
|
+
) }) });
|
|
27
39
|
}
|
|
28
40
|
|
|
29
41
|
export { RiScSelectionCard };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiScSelectionCard.esm.js","sources":["../../../src/components/riScInfo/RiScSelectionCard.tsx"],"sourcesContent":["import { useRiScs } from '../../contexts/RiScContext.tsx';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport {
|
|
1
|
+
{"version":3,"file":"RiScSelectionCard.esm.js","sources":["../../../src/components/riScInfo/RiScSelectionCard.tsx"],"sourcesContent":["import { useRiScs } from '../../contexts/RiScContext.tsx';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { Flex } from '@backstage/ui';\nimport FormControl from '@mui/material/FormControl';\nimport ListSubheader from '@mui/material/ListSubheader';\nimport MenuItem from '@mui/material/MenuItem';\nimport MUISelect from '@mui/material/Select';\nimport styles from './RiScSelectionCard.module.css';\n\nexport function RiScSelectionCard() {\n const { riScs, lockedRiScs, selectedRiSc, selectedLockedRiSc, selectRiSc } =\n useRiScs();\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const hasOptions =\n (riScs !== null && riScs.length !== 0) || lockedRiScs.length !== 0;\n\n return (\n <Flex direction=\"column\" gap=\"24px\">\n {hasOptions && (\n <FormControl fullWidth size=\"small\">\n <MUISelect\n value={selectedRiSc?.id ?? selectedLockedRiSc?.id ?? ''}\n onChange={e => selectRiSc(e.target.value)}\n inputProps={{ 'aria-label': t('contentHeader.multipleRiScs') }}\n MenuProps={{ disablePortal: true }}\n >\n {(riScs ?? []).map(riSc => (\n <MenuItem key={riSc.id} value={riSc.id}>\n {riSc.content.title}\n </MenuItem>\n ))}\n {lockedRiScs.length > 0 && (\n <ListSubheader\n className={`${styles.lockedSectionHeader} ${riScs && riScs.length > 0 ? styles.lockedSectionHeaderWithDivider : ''}`}\n >\n {t('contentHeader.lockedRiScsSection')}\n </ListSubheader>\n )}\n {lockedRiScs.map(riSc => (\n <MenuItem key={riSc.id} value={riSc.id}>\n 🔒 {riSc.id}\n </MenuItem>\n ))}\n </MUISelect>\n </FormControl>\n )}\n </Flex>\n );\n}\n"],"names":["styles"],"mappings":";;;;;;;;;;;AAUO,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,cAAc,kBAAA,EAAoB,UAAA,KAC5D,QAAA,EAAS;AACX,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,MAAM,aACH,KAAA,KAAU,IAAA,IAAQ,MAAM,MAAA,KAAW,CAAA,IAAM,YAAY,MAAA,KAAW,CAAA;AAEnE,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,GAAA,EAAI,MAAA,EAC1B,QAAA,EAAA,UAAA,oBACC,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAS,IAAA,EAAC,IAAA,EAAK,OAAA,EAC1B,QAAA,kBAAA,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,YAAA,EAAc,EAAA,IAAM,kBAAA,EAAoB,EAAA,IAAM,EAAA;AAAA,MACrD,QAAA,EAAU,CAAA,CAAA,KAAK,UAAA,CAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACxC,UAAA,EAAY,EAAE,YAAA,EAAc,CAAA,CAAE,6BAA6B,CAAA,EAAE;AAAA,MAC7D,SAAA,EAAW,EAAE,aAAA,EAAe,IAAA,EAAK;AAAA,MAE/B,QAAA,EAAA;AAAA,QAAA,CAAA,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAA,IAAA,yBAChB,QAAA,EAAA,EAAuB,KAAA,EAAO,IAAA,CAAK,EAAA,EACjC,QAAA,EAAA,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAA,EADD,IAAA,CAAK,EAEpB,CACD,CAAA;AAAA,QACA,WAAA,CAAY,SAAS,CAAA,oBACpB,GAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,EAAGA,UAAA,CAAO,mBAAmB,CAAA,CAAA,EAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,GAAIA,UAAA,CAAO,8BAAA,GAAiC,EAAE,CAAA,CAAA;AAAA,YAEjH,YAAE,kCAAkC;AAAA;AAAA,SACvC;AAAA,QAED,YAAY,GAAA,CAAI,CAAA,IAAA,0BACd,QAAA,EAAA,EAAuB,KAAA,EAAO,KAAK,EAAA,EAAI,QAAA,EAAA;AAAA,UAAA,YAAA;AAAA,UAClC,IAAA,CAAK;AAAA,SAAA,EAAA,EADI,IAAA,CAAK,EAEpB,CACD;AAAA;AAAA;AAAA,KAEL,CAAA,EAEJ,CAAA;AAEJ;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
|
|
2
2
|
|
|
3
|
-
var css_248z = ".
|
|
4
|
-
var riscStyles = {"
|
|
3
|
+
var css_248z = ".RiScSelectionCard_lockedSectionHeader__8c09a22d25 {\n font-weight: 700;\n font-size: 0.7rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n background-color: inherit !important;\n}\n\n.RiScSelectionCard_lockedSectionHeaderWithDivider__8c09a22d25 {\n border-top: 1px solid var(--ros-gray-200);\n margin-top: 4px;\n padding-top: 8px;\n}\n\n[role='listbox'] {\n max-height: 400px;\n overflow-y: auto;\n}\n\n.RiScSelectionCard_riScInfoDialog__8c09a22d25 {\n padding: 24px;\n border-radius: 4px;\n width: 800px;\n}\n\n.RiScSelectionCard_riscSelectionDialogHeader__8c09a22d25 {\n padding: 0 0 16px 0;\n}\n\n.RiScSelectionCard_riscSelectionDialogBody__8c09a22d25 {\n gap: 16px;\n padding: 16px 0 0 0;\n}\n\n.RiScSelectionCard_riscDescriptionComponent__8c09a22d25 {\n padding-bottom: 10px;\n}\n.RiScSelectionCard_componentLayout__8c09a22d25 {\n height: 60%;\n}\n\n.RiScSelectionCard_riscDescriptionContainer__8c09a22d25 {\n margin-bottom: 16px;\n}\n\n.RiScSelectionCard_riScInfoDialog__8c09a22d25 {\n background-color: var(--bui-bg-app);\n}\n";
|
|
4
|
+
var riscStyles = {"lockedSectionHeader":"RiScSelectionCard_lockedSectionHeader__8c09a22d25","lockedSectionHeaderWithDivider":"RiScSelectionCard_lockedSectionHeaderWithDivider__8c09a22d25","riScInfoDialog":"RiScSelectionCard_riScInfoDialog__8c09a22d25","riscDescriptionComponent":"RiScSelectionCard_riscDescriptionComponent__8c09a22d25","componentLayout":"RiScSelectionCard_componentLayout__8c09a22d25","riscDescriptionContainer":"RiScSelectionCard_riscDescriptionContainer__8c09a22d25"};
|
|
5
5
|
styleInject(css_248z);
|
|
6
6
|
|
|
7
7
|
export { riscStyles as default };
|
|
@@ -22,6 +22,7 @@ import styles from '../common/alertBar.module.css.esm.js';
|
|
|
22
22
|
import { RiScDescriptionCard } from '../riScInfo/RiScDescriptionCard.esm.js';
|
|
23
23
|
import riscStyles from '../riScInfo/RiScSelectionCard.module.css.esm.js';
|
|
24
24
|
import { ErrorState } from '../riScInfo/ErrorState.esm.js';
|
|
25
|
+
import { LockedRiScView } from '../riScInfo/LockedRiScView.esm.js';
|
|
25
26
|
import { ThreatActorsAndVulnerabilitiesCard } from '../threatActorsAndVulnerabilities/ThreatActorsAndVulnerabilitiesCard.esm.js';
|
|
26
27
|
|
|
27
28
|
function RiScPlugin() {
|
|
@@ -46,6 +47,7 @@ function RiScPlugin() {
|
|
|
46
47
|
const {
|
|
47
48
|
approveRiSc,
|
|
48
49
|
selectedRiSc,
|
|
50
|
+
selectedLockedRiSc,
|
|
49
51
|
isFetching,
|
|
50
52
|
resetResponse,
|
|
51
53
|
resetRiScStatus,
|
|
@@ -77,7 +79,7 @@ function RiScPlugin() {
|
|
|
77
79
|
) }),
|
|
78
80
|
scenarioWizardStep !== null ? /* @__PURE__ */ jsx(ScenarioWizard, { step: scenarioWizardStep }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
79
81
|
/* @__PURE__ */ jsx(RiScHeader, { onEditEncryption: openEditEncryptionDialog }),
|
|
80
|
-
!isFetching && riScs !== null && riScs.length === 0 && !selectedRiSc && !allRiScsFailedDecryption && /* @__PURE__ */ jsx(
|
|
82
|
+
!isFetching && riScs !== null && riScs.length === 0 && !selectedRiSc && !selectedLockedRiSc && !allRiScsFailedDecryption && /* @__PURE__ */ jsx(
|
|
81
83
|
Flex,
|
|
82
84
|
{
|
|
83
85
|
justify: "center",
|
|
@@ -86,7 +88,7 @@ function RiScPlugin() {
|
|
|
86
88
|
children: /* @__PURE__ */ jsx(FirstRiScDialog, { onNewRiSc: openCreateRiScDialog })
|
|
87
89
|
}
|
|
88
90
|
),
|
|
89
|
-
!isFetching && !selectedRiSc && (failedToFetchGcpCryptoKeys || allRiScsFailedDecryption) && /* @__PURE__ */ jsx(
|
|
91
|
+
!isFetching && !selectedRiSc && !selectedLockedRiSc && (failedToFetchGcpCryptoKeys || allRiScsFailedDecryption) && /* @__PURE__ */ jsx(
|
|
90
92
|
Flex,
|
|
91
93
|
{
|
|
92
94
|
align: "center",
|
|
@@ -96,6 +98,29 @@ function RiScPlugin() {
|
|
|
96
98
|
}
|
|
97
99
|
),
|
|
98
100
|
isFetching && /* @__PURE__ */ jsx(Spinner, { size: 80 }),
|
|
101
|
+
selectedLockedRiSc && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
102
|
+
/* @__PURE__ */ jsx(Grid, { container: true, spacing: 4, children: /* @__PURE__ */ jsx(Grid, { size: 12, children: /* @__PURE__ */ jsxs(Grid, { container: true, rowSpacing: 3, columnSpacing: 4, children: [
|
|
103
|
+
/* @__PURE__ */ jsx(Grid, { size: 8, children: /* @__PURE__ */ jsxs(Flex, { align: "center", justify: "between", children: [
|
|
104
|
+
/* @__PURE__ */ jsx(Text, { as: "h3", variant: "body-large", weight: "bold", children: t("contentHeader.multipleRiScs") }),
|
|
105
|
+
/* @__PURE__ */ jsx(
|
|
106
|
+
CreateNewRiScButton,
|
|
107
|
+
{
|
|
108
|
+
onCreateNew: openCreateRiScDialog
|
|
109
|
+
}
|
|
110
|
+
)
|
|
111
|
+
] }) }),
|
|
112
|
+
/* @__PURE__ */ jsx(Grid, { size: 8, children: /* @__PURE__ */ jsx(RiScSelectionCard, {}) })
|
|
113
|
+
] }) }) }),
|
|
114
|
+
/* @__PURE__ */ jsx(
|
|
115
|
+
Flex,
|
|
116
|
+
{
|
|
117
|
+
justify: "center",
|
|
118
|
+
align: "center",
|
|
119
|
+
className: riscStyles.componentLayout,
|
|
120
|
+
children: /* @__PURE__ */ jsx(LockedRiScView, { lockedRiSc: selectedLockedRiSc })
|
|
121
|
+
}
|
|
122
|
+
)
|
|
123
|
+
] }),
|
|
99
124
|
/* @__PURE__ */ jsx(Grid, { container: true, spacing: 4, children: selectedRiSc && /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Grid, { size: 12, children: /* @__PURE__ */ jsxs(Grid, { container: true, rowSpacing: 3, columnSpacing: 4, children: [
|
|
100
125
|
/* @__PURE__ */ jsx(Grid, { size: 8, children: /* @__PURE__ */ jsxs(Flex, { align: "center", justify: "between", children: [
|
|
101
126
|
/* @__PURE__ */ jsx(Text, { as: "h3", variant: "body-large", weight: "bold", children: t("contentHeader.multipleRiScs") }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiScPlugin.esm.js","sources":["../../../src/components/riScPlugin/RiScPlugin.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { ScenarioWizard } from '../scenarioWizard/ScenarioWizard';\nimport { ScenarioDrawer } from '../scenarioDrawer/ScenarioDrawer';\nimport { RiskMatrix } from '../riskMatrix/RiskMatrix';\nimport AlertBar from '../common/AlertBar/AlertBar';\nimport Grid from '@mui/material/Grid';\nimport { RiScDialog, RiScDialogStates } from '../riScDialog/RiScDialog';\nimport { Spinner } from '../common/Spinner';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport { ScenarioWizardSteps } from '../../contexts/ScenarioContext';\nimport { RiScHeader } from '../riScHeader/RiScHeader.tsx';\nimport { ScenarioTableWrapper } from '../scenarioTable/ScenarioTableWrapper.tsx';\nimport { FirstRiScDialog } from '../riScInfo/FirstRiScDialog.tsx';\nimport { Flex, Text } from '@backstage/ui';\nimport { CreateNewRiScButton } from '../riScInfo/CreateNewRiScButton.tsx';\nimport { RiScSelectionCard } from '../riScInfo/RiScSelectionCard.tsx';\nimport { RiScStatusComponent } from '../riScInfo/riScStatus/RiScStatusComponent.tsx';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport styles from '../common/alertBar.module.css';\nimport { RiScDescriptionCard } from '../riScInfo/RiScDescriptionCard.tsx';\nimport riscStyles from '../riScInfo/RiScSelectionCard.module.css';\nimport { ErrorState } from '../riScInfo/ErrorState.tsx';\nimport { ThreatActorsAndVulnerabilitiesCard } from '../threatActorsAndVulnerabilities/ThreatActorsAndVulnerabilitiesCard.tsx';\n\nexport function RiScPlugin() {\n const [riScDialogState, setRiScDialogState] = useState<RiScDialogStates>(\n RiScDialogStates.Closed,\n );\n\n function openCreateRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Create);\n }\n\n function openDeleteRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Delete);\n }\n\n function openEditRiScDialog() {\n return setRiScDialogState(RiScDialogStates.EditRiscInfo);\n }\n\n function openEditEncryptionDialog() {\n return setRiScDialogState(RiScDialogStates.EditEncryption);\n }\n\n function closeRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Closed);\n }\n\n const {\n approveRiSc,\n selectedRiSc,\n isFetching,\n resetResponse,\n resetRiScStatus,\n response,\n updateStatus,\n riScs,\n failedToFetchGcpCryptoKeys,\n allRiScsFailedDecryption,\n } = useRiScs();\n\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const [searchParams] = useSearchParams();\n const scenarioWizardStep = searchParams.get(\n 'step',\n ) as ScenarioWizardSteps | null;\n\n useEffect(() => {\n if (scenarioWizardStep !== null) {\n resetRiScStatus();\n resetResponse();\n }\n }, [resetRiScStatus, resetResponse, scenarioWizardStep]);\n\n return (\n <>\n <Flex className={styles.alertBarBox}>\n <AlertBar\n updateStatus={updateStatus}\n response={response}\n statusText={response?.statusMessage}\n />\n </Flex>\n {scenarioWizardStep !== null ? (\n <ScenarioWizard step={scenarioWizardStep} />\n ) : (\n <>\n <RiScHeader onEditEncryption={openEditEncryptionDialog} />\n {!isFetching &&\n riScs !== null &&\n riScs.length === 0 &&\n !selectedRiSc &&\n !allRiScsFailedDecryption && (\n <Flex\n justify=\"center\"\n align=\"center\"\n className={riscStyles.componentLayout}\n >\n <FirstRiScDialog onNewRiSc={openCreateRiScDialog} />\n </Flex>\n )}\n {/* Added isFetching condition to avoid showing error state when user e.g., adds new scorecard. */}\n {!isFetching &&\n !selectedRiSc &&\n (failedToFetchGcpCryptoKeys || allRiScsFailedDecryption) && (\n <Flex\n align=\"center\"\n justify=\"center\"\n className={riscStyles.componentLayout}\n >\n <ErrorState onCreateNew={openCreateRiScDialog} />\n </Flex>\n )}\n {isFetching && <Spinner size={80} />}\n\n <Grid container spacing={4}>\n {selectedRiSc && (\n <>\n <Grid size={12}>\n <Grid container rowSpacing={3} columnSpacing={4}>\n <Grid size={8}>\n <Flex align=\"center\" justify=\"between\">\n <Text as=\"h3\" variant=\"body-large\" weight=\"bold\">\n {t('contentHeader.multipleRiScs')}\n </Text>\n <CreateNewRiScButton\n onCreateNew={openCreateRiScDialog}\n />\n </Flex>\n </Grid>\n <Grid size={8}>\n <RiScSelectionCard />\n </Grid>\n <Grid size={4} />\n\n <Grid size={8}>\n <Flex gap=\"24px\" direction=\"column\">\n <RiScDescriptionCard\n riScWithMetadata={selectedRiSc}\n edit={openEditRiScDialog}\n />\n <ScenarioTableWrapper riScWithMetadata={selectedRiSc} />\n </Flex>\n </Grid>\n\n <Grid size={4}>\n <Flex direction=\"column\" gap=\"24px\">\n <RiScStatusComponent\n selectedRiSc={selectedRiSc}\n publishRiScFn={approveRiSc}\n />\n <RiskMatrix riScWithMetadata={selectedRiSc} />\n <ThreatActorsAndVulnerabilitiesCard\n scenarios={selectedRiSc.content.scenarios}\n />\n </Flex>\n </Grid>\n </Grid>\n </Grid>\n </>\n )}\n </Grid>\n </>\n )}\n\n {riScDialogState !== RiScDialogStates.Closed && (\n <RiScDialog\n onClose={closeRiScDialog}\n dialogState={riScDialogState}\n onDelete={openDeleteRiScDialog}\n />\n )}\n\n {!scenarioWizardStep && <ScenarioDrawer />}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RiScPlugin.esm.js","sources":["../../../src/components/riScPlugin/RiScPlugin.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { ScenarioWizard } from '../scenarioWizard/ScenarioWizard';\nimport { ScenarioDrawer } from '../scenarioDrawer/ScenarioDrawer';\nimport { RiskMatrix } from '../riskMatrix/RiskMatrix';\nimport AlertBar from '../common/AlertBar/AlertBar';\nimport Grid from '@mui/material/Grid';\nimport { RiScDialog, RiScDialogStates } from '../riScDialog/RiScDialog';\nimport { Spinner } from '../common/Spinner';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport { ScenarioWizardSteps } from '../../contexts/ScenarioContext';\nimport { RiScHeader } from '../riScHeader/RiScHeader.tsx';\nimport { ScenarioTableWrapper } from '../scenarioTable/ScenarioTableWrapper.tsx';\nimport { FirstRiScDialog } from '../riScInfo/FirstRiScDialog.tsx';\nimport { Flex, Text } from '@backstage/ui';\nimport { CreateNewRiScButton } from '../riScInfo/CreateNewRiScButton.tsx';\nimport { RiScSelectionCard } from '../riScInfo/RiScSelectionCard.tsx';\nimport { RiScStatusComponent } from '../riScInfo/riScStatus/RiScStatusComponent.tsx';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport styles from '../common/alertBar.module.css';\nimport { RiScDescriptionCard } from '../riScInfo/RiScDescriptionCard.tsx';\nimport riscStyles from '../riScInfo/RiScSelectionCard.module.css';\nimport { ErrorState } from '../riScInfo/ErrorState.tsx';\nimport { LockedRiScView } from '../riScInfo/LockedRiScView.tsx';\nimport { ThreatActorsAndVulnerabilitiesCard } from '../threatActorsAndVulnerabilities/ThreatActorsAndVulnerabilitiesCard.tsx';\n\nexport function RiScPlugin() {\n const [riScDialogState, setRiScDialogState] = useState<RiScDialogStates>(\n RiScDialogStates.Closed,\n );\n\n function openCreateRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Create);\n }\n\n function openDeleteRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Delete);\n }\n\n function openEditRiScDialog() {\n return setRiScDialogState(RiScDialogStates.EditRiscInfo);\n }\n\n function openEditEncryptionDialog() {\n return setRiScDialogState(RiScDialogStates.EditEncryption);\n }\n\n function closeRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Closed);\n }\n\n const {\n approveRiSc,\n selectedRiSc,\n selectedLockedRiSc,\n isFetching,\n resetResponse,\n resetRiScStatus,\n response,\n updateStatus,\n riScs,\n failedToFetchGcpCryptoKeys,\n allRiScsFailedDecryption,\n } = useRiScs();\n\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const [searchParams] = useSearchParams();\n const scenarioWizardStep = searchParams.get(\n 'step',\n ) as ScenarioWizardSteps | null;\n\n useEffect(() => {\n if (scenarioWizardStep !== null) {\n resetRiScStatus();\n resetResponse();\n }\n }, [resetRiScStatus, resetResponse, scenarioWizardStep]);\n\n return (\n <>\n <Flex className={styles.alertBarBox}>\n <AlertBar\n updateStatus={updateStatus}\n response={response}\n statusText={response?.statusMessage}\n />\n </Flex>\n {scenarioWizardStep !== null ? (\n <ScenarioWizard step={scenarioWizardStep} />\n ) : (\n <>\n <RiScHeader onEditEncryption={openEditEncryptionDialog} />\n {!isFetching &&\n riScs !== null &&\n riScs.length === 0 &&\n !selectedRiSc &&\n !selectedLockedRiSc &&\n !allRiScsFailedDecryption && (\n <Flex\n justify=\"center\"\n align=\"center\"\n className={riscStyles.componentLayout}\n >\n <FirstRiScDialog onNewRiSc={openCreateRiScDialog} />\n </Flex>\n )}\n {/* Added isFetching condition to avoid showing error state when user e.g., adds new scorecard. */}\n {!isFetching &&\n !selectedRiSc &&\n !selectedLockedRiSc &&\n (failedToFetchGcpCryptoKeys || allRiScsFailedDecryption) && (\n <Flex\n align=\"center\"\n justify=\"center\"\n className={riscStyles.componentLayout}\n >\n <ErrorState onCreateNew={openCreateRiScDialog} />\n </Flex>\n )}\n {isFetching && <Spinner size={80} />}\n\n {selectedLockedRiSc && (\n <>\n <Grid container spacing={4}>\n <Grid size={12}>\n <Grid container rowSpacing={3} columnSpacing={4}>\n <Grid size={8}>\n <Flex align=\"center\" justify=\"between\">\n <Text as=\"h3\" variant=\"body-large\" weight=\"bold\">\n {t('contentHeader.multipleRiScs')}\n </Text>\n <CreateNewRiScButton\n onCreateNew={openCreateRiScDialog}\n />\n </Flex>\n </Grid>\n <Grid size={8}>\n <RiScSelectionCard />\n </Grid>\n </Grid>\n </Grid>\n </Grid>\n <Flex\n justify=\"center\"\n align=\"center\"\n className={riscStyles.componentLayout}\n >\n <LockedRiScView lockedRiSc={selectedLockedRiSc} />\n </Flex>\n </>\n )}\n\n <Grid container spacing={4}>\n {selectedRiSc && (\n <>\n <Grid size={12}>\n <Grid container rowSpacing={3} columnSpacing={4}>\n <Grid size={8}>\n <Flex align=\"center\" justify=\"between\">\n <Text as=\"h3\" variant=\"body-large\" weight=\"bold\">\n {t('contentHeader.multipleRiScs')}\n </Text>\n <CreateNewRiScButton\n onCreateNew={openCreateRiScDialog}\n />\n </Flex>\n </Grid>\n <Grid size={8}>\n <RiScSelectionCard />\n </Grid>\n <Grid size={4} />\n\n <Grid size={8}>\n <Flex gap=\"24px\" direction=\"column\">\n <RiScDescriptionCard\n riScWithMetadata={selectedRiSc}\n edit={openEditRiScDialog}\n />\n <ScenarioTableWrapper riScWithMetadata={selectedRiSc} />\n </Flex>\n </Grid>\n\n <Grid size={4}>\n <Flex direction=\"column\" gap=\"24px\">\n <RiScStatusComponent\n selectedRiSc={selectedRiSc}\n publishRiScFn={approveRiSc}\n />\n <RiskMatrix riScWithMetadata={selectedRiSc} />\n <ThreatActorsAndVulnerabilitiesCard\n scenarios={selectedRiSc.content.scenarios}\n />\n </Flex>\n </Grid>\n </Grid>\n </Grid>\n </>\n )}\n </Grid>\n </>\n )}\n\n {riScDialogState !== RiScDialogStates.Closed && (\n <RiScDialog\n onClose={closeRiScDialog}\n dialogState={riScDialogState}\n onDelete={openDeleteRiScDialog}\n />\n )}\n\n {!scenarioWizardStep && <ScenarioDrawer />}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -30,9 +30,11 @@ function RiScProvider({ children }) {
|
|
|
30
30
|
publishRiScs
|
|
31
31
|
} = useAuthenticatedFetch();
|
|
32
32
|
const [riScs, setRiScs] = useState(null);
|
|
33
|
+
const [lockedRiScs, setLockedRiScs] = useState([]);
|
|
33
34
|
const [selectedRiSc, setSelectedRiSc] = useState(
|
|
34
35
|
null
|
|
35
36
|
);
|
|
37
|
+
const [selectedLockedRiSc, setSelectedLockedRiSc] = useState(null);
|
|
36
38
|
const [isFetching, setIsFetching] = useState(true);
|
|
37
39
|
const isFetchingRef = useRef(isFetching);
|
|
38
40
|
const [isFetchingRiScs, setIsFetchingRiScs] = useState(true);
|
|
@@ -137,12 +139,22 @@ function RiScProvider({ children }) {
|
|
|
137
139
|
const successfulRiScs = res.filter(
|
|
138
140
|
(risk) => risk.status === ContentStatus.Success
|
|
139
141
|
);
|
|
140
|
-
const
|
|
142
|
+
const decryptionFailedRiScs = res.filter(
|
|
143
|
+
(risk) => risk.status === ContentStatus.DecryptionFailed
|
|
144
|
+
);
|
|
145
|
+
const allFailed = res.length > 0 && res.every((r) => r.status === ContentStatus.DecryptionFailed);
|
|
141
146
|
setAllRiScsFailedDecryption(allFailed);
|
|
142
147
|
const fetchedRiScs = successfulRiScs.map(
|
|
143
148
|
mapRiScDtoToRiScWithMetadata
|
|
144
149
|
);
|
|
150
|
+
const fetchedLockedRiScs = decryptionFailedRiScs.map(
|
|
151
|
+
(risk) => ({
|
|
152
|
+
id: risk.riScId,
|
|
153
|
+
encryptionKeyId: risk.encryptionKeyId ?? null
|
|
154
|
+
})
|
|
155
|
+
);
|
|
145
156
|
setRiScs(fetchedRiScs);
|
|
157
|
+
setLockedRiScs(fetchedLockedRiScs);
|
|
146
158
|
isFetchingRiScsRef.current = false;
|
|
147
159
|
setIsFetchingRiScs(isFetchingRiScsRef.current);
|
|
148
160
|
if (!isFetchingGcpCryptoKeysRef.current) {
|
|
@@ -162,6 +174,9 @@ function RiScProvider({ children }) {
|
|
|
162
174
|
});
|
|
163
175
|
}
|
|
164
176
|
if (fetchedRiScs.length === 0) {
|
|
177
|
+
if (fetchedLockedRiScs.length > 0 && !riScIdFromParams) {
|
|
178
|
+
navigate(getRiScPath({ riScId: fetchedLockedRiScs[0].id }));
|
|
179
|
+
}
|
|
165
180
|
return;
|
|
166
181
|
}
|
|
167
182
|
if (!riScIdFromParams) {
|
|
@@ -169,7 +184,10 @@ function RiScProvider({ children }) {
|
|
|
169
184
|
return;
|
|
170
185
|
}
|
|
171
186
|
const riSc = fetchedRiScs.find((r) => r.id === riScIdFromParams);
|
|
172
|
-
|
|
187
|
+
const isLockedRiSc = fetchedLockedRiScs.some(
|
|
188
|
+
(r) => r.id === riScIdFromParams
|
|
189
|
+
);
|
|
190
|
+
if (!riSc && !isLockedRiSc) {
|
|
173
191
|
navigate(getRiScPath({ riScId: fetchedRiScs[0].id }), {
|
|
174
192
|
state: t("errorMessages.RiScDoesNotExist")
|
|
175
193
|
});
|
|
@@ -200,13 +218,17 @@ function RiScProvider({ children }) {
|
|
|
200
218
|
);
|
|
201
219
|
}, []);
|
|
202
220
|
useEffect(() => {
|
|
203
|
-
if (riScIdFromParams)
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
221
|
+
if (!riScIdFromParams) return;
|
|
222
|
+
const riSc = riScs?.find((r) => r.id === riScIdFromParams);
|
|
223
|
+
const lockedRiSc = lockedRiScs.find((r) => r.id === riScIdFromParams);
|
|
224
|
+
if (riSc) {
|
|
225
|
+
setSelectedRiSc(riSc);
|
|
226
|
+
setSelectedLockedRiSc(null);
|
|
227
|
+
} else if (lockedRiSc) {
|
|
228
|
+
setSelectedLockedRiSc(lockedRiSc);
|
|
229
|
+
setSelectedRiSc(null);
|
|
208
230
|
}
|
|
209
|
-
}, [riScs, riScIdFromParams]);
|
|
231
|
+
}, [riScs, lockedRiScs, riScIdFromParams]);
|
|
210
232
|
const resetRiScStatus = useCallback(() => {
|
|
211
233
|
dispatch({
|
|
212
234
|
type: "SET_STATUS",
|
|
@@ -223,10 +245,7 @@ function RiScProvider({ children }) {
|
|
|
223
245
|
[repoInfo.owner, repoInfo.name]
|
|
224
246
|
);
|
|
225
247
|
function selectRiSc(id) {
|
|
226
|
-
|
|
227
|
-
if (selectedRiScId) {
|
|
228
|
-
navigate(getRiScPath({ riScId: selectedRiScId }));
|
|
229
|
-
}
|
|
248
|
+
navigate(getRiScPath({ riScId: id }));
|
|
230
249
|
}
|
|
231
250
|
function createNewRiSc(riSc, generateInitialRisc, defaultRiScId) {
|
|
232
251
|
setIsFetching(true);
|
|
@@ -476,8 +495,10 @@ function RiScProvider({ children }) {
|
|
|
476
495
|
}
|
|
477
496
|
const value = {
|
|
478
497
|
riScs,
|
|
498
|
+
lockedRiScs,
|
|
479
499
|
selectRiSc,
|
|
480
500
|
selectedRiSc,
|
|
501
|
+
selectedLockedRiSc,
|
|
481
502
|
createNewRiSc,
|
|
482
503
|
deleteRiSc,
|
|
483
504
|
updateRiSc,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiScContext.esm.js","sources":["../../src/contexts/RiScContext.tsx"],"sourcesContent":["import {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n useReducer,\n} from 'react';\nimport {\n ContentStatus,\n ProcessingStatus,\n RiScStatus,\n RiScWithMetadata,\n SubmitResponseObject,\n} from '../utils/types';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n getTranslationKey,\n requiresNewApproval,\n} from '../utils/utilityfunctions';\nimport { riScRouteRef } from '../routes';\nimport { useLocation, useNavigate, useParams } from 'react-router';\nimport {\n dtoToRiSc,\n GcpCryptoKeyObject,\n ProcessRiScResultDTO,\n RiScContentResultDTO,\n RiScDTO,\n} from '../utils/DTOs';\nimport {\n buildFetchRiScErrorMessages,\n mapRiScDtoToRiScWithMetadata,\n withLoginRejected,\n} from '../utils/fetchRiScHelpers';\nimport {\n useAuthenticatedFetch,\n useGithubRepositoryInformation,\n} from '../utils/hooks';\nimport { latestSupportedVersion } from '../utils/constants';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../utils/translations';\n\nexport type UpdateStatus = {\n isLoading: boolean;\n isError: boolean;\n isSuccess: boolean;\n};\n\ntype RiScDrawerProps = {\n riScs: RiScWithMetadata[] | null;\n selectRiSc: (title: string) => void;\n selectedRiSc: RiScWithMetadata | null;\n createNewRiSc: (\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) => void;\n deleteRiSc: (onSuccess?: () => void, onError?: () => void) => void;\n updateRiSc: (\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void;\n showBlockedUpdateError: () => void;\n approveRiSc: () => void;\n updateStatus: UpdateStatus;\n resetRiScStatus: () => void;\n resetResponse: () => void;\n isFetching: boolean;\n isFetchingGcpCryptoKeys: boolean;\n failedToFetchGcpCryptoKeys: boolean;\n allRiScsFailedDecryption: boolean;\n gcpCryptoKeys: GcpCryptoKeyObject[];\n response: SubmitResponseObject | null;\n};\n\nconst RiScContext = createContext<RiScDrawerProps | undefined>(undefined);\n\nexport function RiScProvider({ children }: { children: ReactNode }) {\n const { riScId: riScIdFromParams } = useParams();\n const location = useLocation();\n const navigate = useNavigate();\n const getRiScPath = useRouteRef(riScRouteRef);\n const [isRequesting, setIsRequesting] = useState<boolean>(false);\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const repoInfo = useGithubRepositoryInformation();\n\n const {\n fetchRiScs,\n fetchGcpCryptoKeys,\n postRiScs,\n deleteRiScs,\n putRiScs,\n publishRiScs,\n } = useAuthenticatedFetch();\n\n const [riScs, setRiScs] = useState<RiScWithMetadata[] | null>(null);\n const [selectedRiSc, setSelectedRiSc] = useState<RiScWithMetadata | null>(\n null,\n );\n const [isFetching, setIsFetching] = useState(true);\n const isFetchingRef = useRef(isFetching);\n const [isFetchingRiScs, setIsFetchingRiScs] = useState(true);\n const isFetchingRiScsRef = useRef(isFetchingRiScs);\n const [isFetchingGcpCryptoKeys, setIsFetchingGcpCryptoKeys] = useState(true);\n const isFetchingGcpCryptoKeysRef = useRef(isFetchingGcpCryptoKeys);\n const gcpCryptoKeysFailed = useRef(false);\n const [failedToFetchGcpCryptoKeys, setFailedToFetchGcpCryptoKeys] =\n useState(false);\n\n type LocalState = {\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n type Action =\n | { type: 'SET_STATUS'; updateStatus: UpdateStatus }\n | { type: 'SET_RESPONSE'; response: SubmitResponseObject | null }\n | {\n type: 'SET_BOTH';\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n const initialLocalState: LocalState = {\n updateStatus: { isLoading: false, isError: false, isSuccess: false },\n response: null,\n };\n\n function reducer(state: LocalState, action: Action): LocalState {\n switch (action.type) {\n case 'SET_STATUS':\n return { ...state, updateStatus: action.updateStatus };\n case 'SET_RESPONSE':\n return { ...state, response: action.response };\n case 'SET_BOTH':\n return { updateStatus: action.updateStatus, response: action.response };\n default:\n return state;\n }\n }\n\n const [localState, dispatch] = useReducer(reducer, initialLocalState);\n\n const [gcpCryptoKeys, setGcpCryptoKeys] = useState<GcpCryptoKeyObject[]>([]);\n\n const [allRiScsFailedDecryption, setAllRiScsFailedDecryption] =\n useState(false);\n\n // Auto-clear response after a short duration to avoid the Alert sticking around\n const responseTimerRef = useRef<number | null>(null);\n useEffect(() => {\n if (localState.response) {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n }\n responseTimerRef.current = window.setTimeout(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n responseTimerRef.current = null;\n }, 10000);\n }\n\n return () => {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n responseTimerRef.current = null;\n }\n };\n }, [localState.response]);\n\n useEffect(() => {\n if (location.state) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: location.state,\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n }, [location, dispatch]);\n\n // Initial fetch of GCP crypto keys\n useEffect(() => {\n gcpCryptoKeysFailed.current = false;\n setFailedToFetchGcpCryptoKeys(false);\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchGcpCryptoKeys(\n res => {\n // Sorts the crypto keys by the number of permissions (descending)\n setGcpCryptoKeys(\n res.sort(\n (a, b) =>\n (b.userPermissions?.length ?? 0) -\n (a.userPermissions?.length ?? 0),\n ),\n );\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n (_error, loginRejected) => {\n gcpCryptoKeysFailed.current = true;\n setFailedToFetchGcpCryptoKeys(true);\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingGcpCryptoKeys,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingGcpCryptoKeys'),\n loginRejected,\n t,\n ),\n },\n });\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Initial fetch of RiScs\n useEffect(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchRiScs(\n res => {\n const successfulRiScs = res.filter(\n risk => risk.status === ContentStatus.Success,\n );\n\n // Check if all RiScs failed decryption (there are RiScs but all failed)\n const allFailed = res.length > 0 && successfulRiScs.length === 0;\n setAllRiScsFailedDecryption(allFailed);\n\n const fetchedRiScs: RiScWithMetadata[] = successfulRiScs.map(\n mapRiScDtoToRiScWithMetadata,\n );\n setRiScs(fetchedRiScs);\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n\n const errorRiScs: RiScContentResultDTO[] = res.filter(\n risk => risk.status !== ContentStatus.Success,\n );\n\n if (errorRiScs.length > 0) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: buildFetchRiScErrorMessages(errorRiScs, t),\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n\n // If there are no RiScs, don't set a selected RiSc\n if (fetchedRiScs.length === 0) {\n return;\n }\n\n // If there is no RiSc ID in the URL, navigate to the first RiSc\n if (!riScIdFromParams) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }));\n return;\n }\n\n const riSc = fetchedRiScs.find(r => r.id === riScIdFromParams);\n\n // If there is an invalid RiSc ID in the URL, navigate to the first RiSc with error state\n if (!riSc) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }), {\n state: t('errorMessages.RiScDoesNotExist'),\n });\n return;\n }\n },\n loginRejected => {\n if (!gcpCryptoKeysFailed.current) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingRiScs'),\n loginRejected,\n t,\n ),\n },\n });\n }\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Set selected RiSc based on URL\n useEffect(() => {\n if (riScIdFromParams) {\n const riSc = riScs?.find(r => r.id === riScIdFromParams);\n if (riSc) {\n setSelectedRiSc(riSc);\n }\n }\n }, [riScs, riScIdFromParams]);\n\n const resetRiScStatus = useCallback(() => {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: false, isSuccess: false, isError: false },\n });\n }, [dispatch]);\n\n // use callback to avoid infinite loop\n const resetResponse = useCallback(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n }, [dispatch]);\n\n const getTranslationContext = useCallback(\n (status: ProcessingStatus) => {\n return status === ProcessingStatus.ErrorWhenNoWriteAccessToRepository\n ? { owner: repoInfo.owner, name: repoInfo.name }\n : undefined;\n },\n [repoInfo.owner, repoInfo.name],\n );\n\n function selectRiSc(id: string) {\n const selectedRiScId = riScs?.find(riSc => riSc.id === id)?.id;\n if (selectedRiScId) {\n navigate(getRiScPath({ riScId: selectedRiScId }));\n }\n }\n\n function createNewRiSc(\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) {\n setIsFetching(true);\n setSelectedRiSc(null);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n const newRiSc: RiScWithMetadata = {\n ...riSc,\n schemaVersion: latestSupportedVersion,\n };\n postRiScs(\n newRiSc.content,\n generateInitialRisc,\n newRiSc.sopsConfig,\n defaultRiScId,\n res => {\n if (!res.riScId) throw new Error('No RiSc ID returned');\n if (!res.riScContent) throw new Error('No RiSc content returned');\n const json = JSON.parse(res.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n const riScWithMetaData: RiScWithMetadata = {\n id: res.riScId,\n status: RiScStatus.Draft,\n content: content,\n sopsConfig: riSc.sopsConfig,\n schemaVersion: riSc.schemaVersion,\n lastPublished: riSc.lastPublished,\n };\n setRiScs(riScs ? [...riScs, riScWithMetaData] : [riScWithMetaData]);\n setIsFetching(false);\n navigate(getRiScPath({ riScId: res.riScId }));\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error: ProcessRiScResultDTO, loginRejected: boolean) => {\n setSelectedRiSc(selectedRiSc);\n setIsFetching(false);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n\n function deleteRiSc(onSuccess?: () => void, onError?: () => void) {\n if (selectedRiSc && riScs) {\n const updatedRiSc = {\n ...selectedRiSc,\n status: RiScStatus.DeletionDraft,\n };\n const originalRiSc = selectedRiSc;\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n deleteRiScs(\n selectedRiSc.id,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n setIsRequesting(false);\n if (res.status === ProcessingStatus.DeletedRiSc) {\n setSelectedRiSc(\n riScs.find(riSc => riSc.id !== selectedRiSc.id) || null,\n );\n setRiScs(riScs.filter(riSc => riSc.id !== updatedRiSc.id));\n if (onSuccess) onSuccess();\n } else {\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(riSc =>\n riSc.id === selectedRiSc.id ? updatedRiSc : riSc,\n ),\n );\n }\n },\n (error, loginRejected) => {\n setSelectedRiSc(originalRiSc);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n },\n );\n }\n }\n\n const isRiScMarkedForDeletion =\n selectedRiSc?.status === RiScStatus.DeletionDraft ||\n selectedRiSc?.status === RiScStatus.DeletionSentForApproval;\n\n const showBlockedUpdateError = useCallback(() => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n status: ProcessingStatus.ErrorWhenUpdatingDeletedRiSc,\n statusMessage: t('errorMessages.ErrorWhenUpdatingDeletedRiSc'),\n },\n });\n }, [dispatch, t]);\n\n function updateRiSc(\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) {\n if (isRiScMarkedForDeletion) {\n showBlockedUpdateError();\n onError?.();\n return;\n }\n\n if (selectedRiSc && riScs) {\n const isRequiresNewApproval =\n selectedRiSc.migrationStatus?.migrationRequiresNewApproval ||\n requiresNewApproval(selectedRiSc.content, riSc.content);\n\n const updatedRiSc: RiScWithMetadata = {\n ...selectedRiSc,\n sopsConfig: riSc.sopsConfig,\n content: riSc.content,\n status:\n selectedRiSc.status !== RiScStatus.Draft && isRequiresNewApproval\n ? RiScStatus.Draft\n : selectedRiSc.status,\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n migrationStatus: {\n migrationChanges: false,\n migrationRequiresNewApproval: false,\n },\n };\n const originalRiSc = selectedRiSc;\n setSelectedRiSc(updatedRiSc);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n putRiScs(\n updatedRiSc,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n if ('pendingApproval' in res && res.pendingApproval?.pullRequestUrl) {\n updatedRiSc.pullRequestUrl = res.pendingApproval.pullRequestUrl;\n updatedRiSc.status = RiScStatus.SentForApproval;\n }\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n setIsRequesting(false);\n if (onSuccess) onSuccess();\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n setSelectedRiSc(originalRiSc);\n },\n );\n }\n }\n\n function approveRiSc() {\n if (selectedRiSc && riScs) {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n });\n publishRiScs(\n selectedRiSc.id,\n res => {\n const prUrl = res.pendingApproval?.pullRequestUrl;\n const updatedRiSc = {\n ...selectedRiSc,\n status:\n selectedRiSc.status === RiScStatus.Draft\n ? RiScStatus.SentForApproval\n : RiScStatus.DeletionSentForApproval,\n pullRequestUrl: prUrl,\n };\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n }\n\n const value = {\n riScs,\n selectRiSc,\n selectedRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\n showBlockedUpdateError,\n approveRiSc,\n updateStatus: localState.updateStatus,\n resetRiScStatus,\n resetResponse,\n isRequesting,\n isFetching,\n response: localState.response,\n gcpCryptoKeys,\n };\n\n return (\n <RiScContext.Provider\n value={{\n ...value,\n isFetchingGcpCryptoKeys: false,\n failedToFetchGcpCryptoKeys,\n allRiScsFailedDecryption,\n }}\n >\n {children}\n </RiScContext.Provider>\n );\n}\n\nexport function useRiScs() {\n const context = useContext(RiScContext);\n if (context === undefined) {\n throw new Error('useRiScs must be used within a RiScProvider');\n }\n return context;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RiScContext.esm.js","sources":["../../src/contexts/RiScContext.tsx"],"sourcesContent":["import {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n useReducer,\n} from 'react';\nimport {\n ContentStatus,\n LockedRiSc,\n ProcessingStatus,\n RiScStatus,\n RiScWithMetadata,\n SubmitResponseObject,\n} from '../utils/types';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n getTranslationKey,\n requiresNewApproval,\n} from '../utils/utilityfunctions';\nimport { riScRouteRef } from '../routes';\nimport { useLocation, useNavigate, useParams } from 'react-router';\nimport {\n dtoToRiSc,\n GcpCryptoKeyObject,\n ProcessRiScResultDTO,\n RiScContentResultDTO,\n RiScDTO,\n} from '../utils/DTOs';\nimport {\n buildFetchRiScErrorMessages,\n mapRiScDtoToRiScWithMetadata,\n withLoginRejected,\n} from '../utils/fetchRiScHelpers';\nimport {\n useAuthenticatedFetch,\n useGithubRepositoryInformation,\n} from '../utils/hooks';\nimport { latestSupportedVersion } from '../utils/constants';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../utils/translations';\n\nexport type UpdateStatus = {\n isLoading: boolean;\n isError: boolean;\n isSuccess: boolean;\n};\n\ntype RiScDrawerProps = {\n riScs: RiScWithMetadata[] | null;\n lockedRiScs: LockedRiSc[];\n selectRiSc: (title: string) => void;\n selectedRiSc: RiScWithMetadata | null;\n selectedLockedRiSc: LockedRiSc | null;\n createNewRiSc: (\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) => void;\n deleteRiSc: (onSuccess?: () => void, onError?: () => void) => void;\n updateRiSc: (\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void;\n showBlockedUpdateError: () => void;\n approveRiSc: () => void;\n updateStatus: UpdateStatus;\n resetRiScStatus: () => void;\n resetResponse: () => void;\n isFetching: boolean;\n isFetchingGcpCryptoKeys: boolean;\n failedToFetchGcpCryptoKeys: boolean;\n allRiScsFailedDecryption: boolean;\n gcpCryptoKeys: GcpCryptoKeyObject[];\n response: SubmitResponseObject | null;\n};\n\nconst RiScContext = createContext<RiScDrawerProps | undefined>(undefined);\n\nexport function RiScProvider({ children }: { children: ReactNode }) {\n const { riScId: riScIdFromParams } = useParams();\n const location = useLocation();\n const navigate = useNavigate();\n const getRiScPath = useRouteRef(riScRouteRef);\n const [isRequesting, setIsRequesting] = useState<boolean>(false);\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const repoInfo = useGithubRepositoryInformation();\n\n const {\n fetchRiScs,\n fetchGcpCryptoKeys,\n postRiScs,\n deleteRiScs,\n putRiScs,\n publishRiScs,\n } = useAuthenticatedFetch();\n\n const [riScs, setRiScs] = useState<RiScWithMetadata[] | null>(null);\n const [lockedRiScs, setLockedRiScs] = useState<LockedRiSc[]>([]);\n const [selectedRiSc, setSelectedRiSc] = useState<RiScWithMetadata | null>(\n null,\n );\n const [selectedLockedRiSc, setSelectedLockedRiSc] =\n useState<LockedRiSc | null>(null);\n const [isFetching, setIsFetching] = useState(true);\n const isFetchingRef = useRef(isFetching);\n const [isFetchingRiScs, setIsFetchingRiScs] = useState(true);\n const isFetchingRiScsRef = useRef(isFetchingRiScs);\n const [isFetchingGcpCryptoKeys, setIsFetchingGcpCryptoKeys] = useState(true);\n const isFetchingGcpCryptoKeysRef = useRef(isFetchingGcpCryptoKeys);\n const gcpCryptoKeysFailed = useRef(false);\n const [failedToFetchGcpCryptoKeys, setFailedToFetchGcpCryptoKeys] =\n useState(false);\n\n type LocalState = {\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n type Action =\n | { type: 'SET_STATUS'; updateStatus: UpdateStatus }\n | { type: 'SET_RESPONSE'; response: SubmitResponseObject | null }\n | {\n type: 'SET_BOTH';\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n const initialLocalState: LocalState = {\n updateStatus: { isLoading: false, isError: false, isSuccess: false },\n response: null,\n };\n\n function reducer(state: LocalState, action: Action): LocalState {\n switch (action.type) {\n case 'SET_STATUS':\n return { ...state, updateStatus: action.updateStatus };\n case 'SET_RESPONSE':\n return { ...state, response: action.response };\n case 'SET_BOTH':\n return { updateStatus: action.updateStatus, response: action.response };\n default:\n return state;\n }\n }\n\n const [localState, dispatch] = useReducer(reducer, initialLocalState);\n\n const [gcpCryptoKeys, setGcpCryptoKeys] = useState<GcpCryptoKeyObject[]>([]);\n\n const [allRiScsFailedDecryption, setAllRiScsFailedDecryption] =\n useState(false);\n\n // Auto-clear response after a short duration to avoid the Alert sticking around\n const responseTimerRef = useRef<number | null>(null);\n useEffect(() => {\n if (localState.response) {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n }\n responseTimerRef.current = window.setTimeout(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n responseTimerRef.current = null;\n }, 10000);\n }\n\n return () => {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n responseTimerRef.current = null;\n }\n };\n }, [localState.response]);\n\n useEffect(() => {\n if (location.state) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: location.state,\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n }, [location, dispatch]);\n\n // Initial fetch of GCP crypto keys\n useEffect(() => {\n gcpCryptoKeysFailed.current = false;\n setFailedToFetchGcpCryptoKeys(false);\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchGcpCryptoKeys(\n res => {\n // Sorts the crypto keys by the number of permissions (descending)\n setGcpCryptoKeys(\n res.sort(\n (a, b) =>\n (b.userPermissions?.length ?? 0) -\n (a.userPermissions?.length ?? 0),\n ),\n );\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n (_error, loginRejected) => {\n gcpCryptoKeysFailed.current = true;\n setFailedToFetchGcpCryptoKeys(true);\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingGcpCryptoKeys,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingGcpCryptoKeys'),\n loginRejected,\n t,\n ),\n },\n });\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Initial fetch of RiScs\n useEffect(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchRiScs(\n res => {\n const successfulRiScs = res.filter(\n risk => risk.status === ContentStatus.Success,\n );\n const decryptionFailedRiScs = res.filter(\n risk => risk.status === ContentStatus.DecryptionFailed,\n );\n\n // Check if all RiScs failed decryption (there are RiScs but all failed)\n const allFailed =\n res.length > 0 &&\n res.every(r => r.status === ContentStatus.DecryptionFailed);\n setAllRiScsFailedDecryption(allFailed);\n\n const fetchedRiScs: RiScWithMetadata[] = successfulRiScs.map(\n mapRiScDtoToRiScWithMetadata,\n );\n const fetchedLockedRiScs: LockedRiSc[] = decryptionFailedRiScs.map(\n risk => ({\n id: risk.riScId,\n encryptionKeyId: risk.encryptionKeyId ?? null,\n }),\n );\n setRiScs(fetchedRiScs);\n setLockedRiScs(fetchedLockedRiScs);\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n\n const errorRiScs: RiScContentResultDTO[] = res.filter(\n risk => risk.status !== ContentStatus.Success,\n );\n\n if (errorRiScs.length > 0) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: buildFetchRiScErrorMessages(errorRiScs, t),\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n\n // If there are no accessible RiScs, try to navigate to the first locked one\n if (fetchedRiScs.length === 0) {\n if (fetchedLockedRiScs.length > 0 && !riScIdFromParams) {\n navigate(getRiScPath({ riScId: fetchedLockedRiScs[0].id }));\n }\n return;\n }\n\n // If there is no RiSc ID in the URL, navigate to the first RiSc\n if (!riScIdFromParams) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }));\n return;\n }\n\n const riSc = fetchedRiScs.find(r => r.id === riScIdFromParams);\n const isLockedRiSc = fetchedLockedRiScs.some(\n r => r.id === riScIdFromParams,\n );\n\n // If there is an invalid RiSc ID in the URL (not accessible and not locked), navigate to the first RiSc\n if (!riSc && !isLockedRiSc) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }), {\n state: t('errorMessages.RiScDoesNotExist'),\n });\n return;\n }\n },\n loginRejected => {\n if (!gcpCryptoKeysFailed.current) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingRiScs'),\n loginRejected,\n t,\n ),\n },\n });\n }\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Set selected RiSc or locked RiSc based on URL\n useEffect(() => {\n if (!riScIdFromParams) return;\n const riSc = riScs?.find(r => r.id === riScIdFromParams);\n const lockedRiSc = lockedRiScs.find(r => r.id === riScIdFromParams);\n if (riSc) {\n setSelectedRiSc(riSc);\n setSelectedLockedRiSc(null);\n } else if (lockedRiSc) {\n setSelectedLockedRiSc(lockedRiSc);\n setSelectedRiSc(null);\n }\n }, [riScs, lockedRiScs, riScIdFromParams]);\n\n const resetRiScStatus = useCallback(() => {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: false, isSuccess: false, isError: false },\n });\n }, [dispatch]);\n\n // use callback to avoid infinite loop\n const resetResponse = useCallback(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n }, [dispatch]);\n\n const getTranslationContext = useCallback(\n (status: ProcessingStatus) => {\n return status === ProcessingStatus.ErrorWhenNoWriteAccessToRepository\n ? { owner: repoInfo.owner, name: repoInfo.name }\n : undefined;\n },\n [repoInfo.owner, repoInfo.name],\n );\n\n function selectRiSc(id: string) {\n navigate(getRiScPath({ riScId: id }));\n }\n\n function createNewRiSc(\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) {\n setIsFetching(true);\n setSelectedRiSc(null);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n const newRiSc: RiScWithMetadata = {\n ...riSc,\n schemaVersion: latestSupportedVersion,\n };\n postRiScs(\n newRiSc.content,\n generateInitialRisc,\n newRiSc.sopsConfig,\n defaultRiScId,\n res => {\n if (!res.riScId) throw new Error('No RiSc ID returned');\n if (!res.riScContent) throw new Error('No RiSc content returned');\n const json = JSON.parse(res.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n const riScWithMetaData: RiScWithMetadata = {\n id: res.riScId,\n status: RiScStatus.Draft,\n content: content,\n sopsConfig: riSc.sopsConfig,\n schemaVersion: riSc.schemaVersion,\n lastPublished: riSc.lastPublished,\n };\n setRiScs(riScs ? [...riScs, riScWithMetaData] : [riScWithMetaData]);\n setIsFetching(false);\n navigate(getRiScPath({ riScId: res.riScId }));\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error: ProcessRiScResultDTO, loginRejected: boolean) => {\n setSelectedRiSc(selectedRiSc);\n setIsFetching(false);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n\n function deleteRiSc(onSuccess?: () => void, onError?: () => void) {\n if (selectedRiSc && riScs) {\n const updatedRiSc = {\n ...selectedRiSc,\n status: RiScStatus.DeletionDraft,\n };\n const originalRiSc = selectedRiSc;\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n deleteRiScs(\n selectedRiSc.id,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n setIsRequesting(false);\n if (res.status === ProcessingStatus.DeletedRiSc) {\n setSelectedRiSc(\n riScs.find(riSc => riSc.id !== selectedRiSc.id) || null,\n );\n setRiScs(riScs.filter(riSc => riSc.id !== updatedRiSc.id));\n if (onSuccess) onSuccess();\n } else {\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(riSc =>\n riSc.id === selectedRiSc.id ? updatedRiSc : riSc,\n ),\n );\n }\n },\n (error, loginRejected) => {\n setSelectedRiSc(originalRiSc);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n },\n );\n }\n }\n\n const isRiScMarkedForDeletion =\n selectedRiSc?.status === RiScStatus.DeletionDraft ||\n selectedRiSc?.status === RiScStatus.DeletionSentForApproval;\n\n const showBlockedUpdateError = useCallback(() => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n status: ProcessingStatus.ErrorWhenUpdatingDeletedRiSc,\n statusMessage: t('errorMessages.ErrorWhenUpdatingDeletedRiSc'),\n },\n });\n }, [dispatch, t]);\n\n function updateRiSc(\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) {\n if (isRiScMarkedForDeletion) {\n showBlockedUpdateError();\n onError?.();\n return;\n }\n\n if (selectedRiSc && riScs) {\n const isRequiresNewApproval =\n selectedRiSc.migrationStatus?.migrationRequiresNewApproval ||\n requiresNewApproval(selectedRiSc.content, riSc.content);\n\n const updatedRiSc: RiScWithMetadata = {\n ...selectedRiSc,\n sopsConfig: riSc.sopsConfig,\n content: riSc.content,\n status:\n selectedRiSc.status !== RiScStatus.Draft && isRequiresNewApproval\n ? RiScStatus.Draft\n : selectedRiSc.status,\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n migrationStatus: {\n migrationChanges: false,\n migrationRequiresNewApproval: false,\n },\n };\n const originalRiSc = selectedRiSc;\n setSelectedRiSc(updatedRiSc);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n putRiScs(\n updatedRiSc,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n if ('pendingApproval' in res && res.pendingApproval?.pullRequestUrl) {\n updatedRiSc.pullRequestUrl = res.pendingApproval.pullRequestUrl;\n updatedRiSc.status = RiScStatus.SentForApproval;\n }\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n setIsRequesting(false);\n if (onSuccess) onSuccess();\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n setSelectedRiSc(originalRiSc);\n },\n );\n }\n }\n\n function approveRiSc() {\n if (selectedRiSc && riScs) {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n });\n publishRiScs(\n selectedRiSc.id,\n res => {\n const prUrl = res.pendingApproval?.pullRequestUrl;\n const updatedRiSc = {\n ...selectedRiSc,\n status:\n selectedRiSc.status === RiScStatus.Draft\n ? RiScStatus.SentForApproval\n : RiScStatus.DeletionSentForApproval,\n pullRequestUrl: prUrl,\n };\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n }\n\n const value = {\n riScs,\n lockedRiScs,\n selectRiSc,\n selectedRiSc,\n selectedLockedRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\n showBlockedUpdateError,\n approveRiSc,\n updateStatus: localState.updateStatus,\n resetRiScStatus,\n resetResponse,\n isRequesting,\n isFetching,\n response: localState.response,\n gcpCryptoKeys,\n };\n\n return (\n <RiScContext.Provider\n value={{\n ...value,\n isFetchingGcpCryptoKeys: false,\n failedToFetchGcpCryptoKeys,\n allRiScsFailedDecryption,\n }}\n >\n {children}\n </RiScContext.Provider>\n );\n}\n\nexport function useRiScs() {\n const context = useContext(RiScContext);\n if (context === undefined) {\n throw new Error('useRiScs must be used within a RiScProvider');\n }\n return context;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAiFA,MAAM,WAAA,GAAc,cAA2C,MAAS,CAAA;AAEjE,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAA4B;AAClE,EAAA,MAAM,EAAE,MAAA,EAAQ,gBAAA,EAAiB,GAAI,SAAA,EAAU;AAC/C,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,WAAA,GAAc,YAAY,YAAY,CAAA;AAC5C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAkB,KAAK,CAAA;AAC/D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,WAAW,8BAAA,EAA+B;AAEhD,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,kBAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,MACE,qBAAA,EAAsB;AAE1B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAoC,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA,CAAuB,EAAE,CAAA;AAC/D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAA;AAAA,IACtC;AAAA,GACF;AACA,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAC9C,SAA4B,IAAI,CAAA;AAClC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,IAAI,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgB,OAAO,UAAU,CAAA;AACvC,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3D,EAAA,MAAM,kBAAA,GAAqB,OAAO,eAAe,CAAA;AACjD,EAAA,MAAM,CAAC,uBAAA,EAAyB,0BAA0B,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3E,EAAA,MAAM,0BAAA,GAA6B,OAAO,uBAAuB,CAAA;AACjE,EAAA,MAAM,mBAAA,GAAsB,OAAO,KAAK,CAAA;AACxC,EAAA,MAAM,CAAC,0BAAA,EAA4B,6BAA6B,CAAA,GAC9D,SAAS,KAAK,CAAA;AAgBhB,EAAA,MAAM,iBAAA,GAAgC;AAAA,IACpC,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,IACnE,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,SAAS,OAAA,CAAQ,OAAmB,MAAA,EAA4B;AAC9D,IAAA,QAAQ,OAAO,IAAA;AAAM,MACnB,KAAK,YAAA;AACH,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,YAAA,EAAc,OAAO,YAAA,EAAa;AAAA,MACvD,KAAK,cAAA;AACH,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,OAAO,QAAA,EAAS;AAAA,MAC/C,KAAK,UAAA;AACH,QAAA,OAAO,EAAE,YAAA,EAAc,MAAA,CAAO,YAAA,EAAc,QAAA,EAAU,OAAO,QAAA,EAAS;AAAA,MACxE;AACE,QAAA,OAAO,KAAA;AAAA;AACX,EACF;AAEA,EAAA,MAAM,CAAC,UAAA,EAAY,QAAQ,CAAA,GAAI,UAAA,CAAW,SAAS,iBAAiB,CAAA;AAEpE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA,CAA+B,EAAE,CAAA;AAE3E,EAAA,MAAM,CAAC,wBAAA,EAA0B,2BAA2B,CAAA,GAC1D,SAAS,KAAK,CAAA;AAGhB,EAAA,MAAM,gBAAA,GAAmB,OAAsB,IAAI,CAAA;AACnD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,QAAA,MAAA,CAAO,YAAA,CAAa,iBAAiB,OAAO,CAAA;AAAA,MAC9C;AACA,MAAA,gBAAA,CAAiB,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AACjD,QAAA,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,MAAM,CAAA;AACjD,QAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAAA,MAC7B,GAAG,GAAK,CAAA;AAAA,IACV;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,QAAA,MAAA,CAAO,YAAA,CAAa,iBAAiB,OAAO,CAAA;AAC5C,QAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,CAAW,QAAQ,CAAC,CAAA;AAExB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,cAAA;AAAA,QACN,QAAA,EAAU;AAAA,UACR,eAAe,QAAA,CAAS,KAAA;AAAA,UACxB,QAAQ,gBAAA,CAAiB;AAAA;AAC3B,OACD,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,QAAQ,CAAC,CAAA;AAGvB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,OAAA,GAAU,KAAA;AAC9B,IAAA,6BAAA,CAA8B,KAAK,CAAA;AACnC,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,MAAM,CAAA;AACjD,IAAA,kBAAA;AAAA,MACE,CAAA,GAAA,KAAO;AAEL,QAAA,gBAAA;AAAA,UACE,GAAA,CAAI,IAAA;AAAA,YACF,CAAC,GAAG,CAAA,KAAA,CACD,CAAA,CAAE,iBAAiB,MAAA,IAAU,CAAA,KAC7B,CAAA,CAAE,eAAA,EAAiB,MAAA,IAAU,CAAA;AAAA;AAClC,SACF;AACA,QAAA,0BAAA,CAA2B,OAAA,GAAU,KAAA;AACrC,QAAA,0BAAA,CAA2B,2BAA2B,OAAO,CAAA;AAC7D,QAAA,IAAI,CAAC,mBAAmB,OAAA,EAAS;AAC/B,UAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,UAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,QACrC;AAAA,MACF,CAAA;AAAA,MACA,CAAC,QAAQ,aAAA,KAAkB;AACzB,QAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAC9B,QAAA,6BAAA,CAA8B,IAAI,CAAA;AAClC,QAAA,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,cAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,QAAQ,gBAAA,CAAiB,8BAAA;AAAA,YACzB,aAAA,EAAe,iBAAA;AAAA,cACb,EAAE,8CAA8C,CAAA;AAAA,cAChD,aAAA;AAAA,cACA;AAAA;AACF;AACF,SACD,CAAA;AACD,QAAA,0BAAA,CAA2B,OAAA,GAAU,KAAA;AACrC,QAAA,0BAAA,CAA2B,2BAA2B,OAAO,CAAA;AAC7D,QAAA,IAAI,CAAC,mBAAmB,OAAA,EAAS;AAC/B,UAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,UAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,KACF;AAAA,EAEF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,MAAM,CAAA;AACjD,IAAA,UAAA;AAAA,MACE,CAAA,GAAA,KAAO;AACL,QAAA,MAAM,kBAAkB,GAAA,CAAI,MAAA;AAAA,UAC1B,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAA,KAAW,aAAA,CAAc;AAAA,SACxC;AACA,QAAA,MAAM,wBAAwB,GAAA,CAAI,MAAA;AAAA,UAChC,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAA,KAAW,aAAA,CAAc;AAAA,SACxC;AAGA,QAAA,MAAM,SAAA,GACJ,GAAA,CAAI,MAAA,GAAS,CAAA,IACb,GAAA,CAAI,MAAM,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,KAAW,aAAA,CAAc,gBAAgB,CAAA;AAC5D,QAAA,2BAAA,CAA4B,SAAS,CAAA;AAErC,QAAA,MAAM,eAAmC,eAAA,CAAgB,GAAA;AAAA,UACvD;AAAA,SACF;AACA,QAAA,MAAM,qBAAmC,qBAAA,CAAsB,GAAA;AAAA,UAC7D,CAAA,IAAA,MAAS;AAAA,YACP,IAAI,IAAA,CAAK,MAAA;AAAA,YACT,eAAA,EAAiB,KAAK,eAAA,IAAmB;AAAA,WAC3C;AAAA,SACF;AACA,QAAA,QAAA,CAAS,YAAY,CAAA;AACrB,QAAA,cAAA,CAAe,kBAAkB,CAAA;AACjC,QAAA,kBAAA,CAAmB,OAAA,GAAU,KAAA;AAC7B,QAAA,kBAAA,CAAmB,mBAAmB,OAAO,CAAA;AAC7C,QAAA,IAAI,CAAC,2BAA2B,OAAA,EAAS;AACvC,UAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,UAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,QACrC;AAEA,QAAA,MAAM,aAAqC,GAAA,CAAI,MAAA;AAAA,UAC7C,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAA,KAAW,aAAA,CAAc;AAAA,SACxC;AAEA,QAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,cAAA;AAAA,YACN,QAAA,EAAU;AAAA,cACR,aAAA,EAAe,2BAAA,CAA4B,UAAA,EAAY,CAAC,CAAA;AAAA,cACxD,QAAQ,gBAAA,CAAiB;AAAA;AAC3B,WACD,CAAA;AAAA,QACH;AAGA,QAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,UAAA,IAAI,kBAAA,CAAmB,MAAA,GAAS,CAAA,IAAK,CAAC,gBAAA,EAAkB;AACtD,YAAA,QAAA,CAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,kBAAA,CAAmB,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAAA,UAC5D;AACA,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,UAAA,QAAA,CAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,YAAA,CAAa,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AACpD,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,OAAO,YAAA,CAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,gBAAgB,CAAA;AAC7D,QAAA,MAAM,eAAe,kBAAA,CAAmB,IAAA;AAAA,UACtC,CAAA,CAAA,KAAK,EAAE,EAAA,KAAO;AAAA,SAChB;AAGA,QAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,YAAA,EAAc;AAC1B,UAAA,QAAA,CAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,YAAA,CAAa,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,EAAG;AAAA,YACpD,KAAA,EAAO,EAAE,gCAAgC;AAAA,WAC1C,CAAA;AACD,UAAA;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,CAAA,aAAA,KAAiB;AACf,QAAA,IAAI,CAAC,oBAAoB,OAAA,EAAS;AAChC,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,cAAA;AAAA,YACN,QAAA,EAAU;AAAA,cACR,QAAQ,gBAAA,CAAiB,sBAAA;AAAA,cACzB,aAAA,EAAe,iBAAA;AAAA,gBACb,EAAE,sCAAsC,CAAA;AAAA,gBACxC,aAAA;AAAA,gBACA;AAAA;AACF;AACF,WACD,CAAA;AAAA,QACH;AACA,QAAA,kBAAA,CAAmB,OAAA,GAAU,KAAA;AAC7B,QAAA,kBAAA,CAAmB,mBAAmB,OAAO,CAAA;AAC7C,QAAA,IAAI,CAAC,2BAA2B,OAAA,EAAS;AACvC,UAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,UAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,KACF;AAAA,EAEF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACvB,IAAA,MAAM,OAAO,KAAA,EAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,gBAAgB,CAAA;AACvD,IAAA,MAAM,aAAa,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,gBAAgB,CAAA;AAClE,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,qBAAA,CAAsB,IAAI,CAAA;AAAA,IAC5B,WAAW,UAAA,EAAY;AACrB,MAAA,qBAAA,CAAsB,UAAU,CAAA;AAChC,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAEzC,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAM;AACxC,IAAA,QAAA,CAAS;AAAA,MACP,IAAA,EAAM,YAAA;AAAA,MACN,cAAc,EAAE,SAAA,EAAW,OAAO,SAAA,EAAW,KAAA,EAAO,SAAS,KAAA;AAAM,KACpE,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,MAAM,CAAA;AAAA,EACnD,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,qBAAA,GAAwB,WAAA;AAAA,IAC5B,CAAC,MAAA,KAA6B;AAC5B,MAAA,OAAO,MAAA,KAAW,gBAAA,CAAiB,kCAAA,GAC/B,EAAE,KAAA,EAAO,SAAS,KAAA,EAAO,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK,GAC7C,MAAA;AAAA,IACN,CAAA;AAAA,IACA,CAAC,QAAA,CAAS,KAAA,EAAO,QAAA,CAAS,IAAI;AAAA,GAChC;AAEA,EAAA,SAAS,WAAW,EAAA,EAAY;AAC9B,IAAA,QAAA,CAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,EAAA,EAAI,CAAC,CAAA;AAAA,EACtC;AAEA,EAAA,SAAS,aAAA,CACP,IAAA,EACA,mBAAA,EACA,aAAA,EACA;AACA,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,QAAA,CAAS;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,cAAc,EAAE,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,MAClE,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,GAAG,IAEL,CAAA;AACA,IAAA,SAAA;AAAA,MACE,OAAA,CAAQ,OAAA;AAAA,MACR,mBAAA;AAAA,MACA,OAAA,CAAQ,UAAA;AAAA,MACR,aAAA;AAAA,MACA,CAAA,GAAA,KAAO;AACL,QAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,MAAM,IAAI,MAAM,qBAAqB,CAAA;AACtD,QAAA,IAAI,CAAC,GAAA,CAAI,WAAA,EAAa,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAChE,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA;AACvC,QAAA,MAAM,OAAA,GAAU,UAAU,IAAI,CAAA;AAC9B,QAAA,MAAM,gBAAA,GAAqC;AAAA,UACzC,IAAI,GAAA,CAAI,MAAA;AAAA,UACR,QAAQ,UAAA,CAAW,KAAA;AAAA,UACnB,OAAA;AAAA,UACA,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,eAAe,IAAA,CAAK,aAAA;AAAA,UACpB,eAAe,IAAA,CAAK;AAAA,SACtB;AACA,QAAA,QAAA,CAAS,KAAA,GAAQ,CAAC,GAAG,KAAA,EAAO,gBAAgB,CAAA,GAAI,CAAC,gBAAgB,CAAC,CAAA;AAClE,QAAA,aAAA,CAAc,KAAK,CAAA;AACnB,QAAA,QAAA,CAAS,YAAY,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA;AAC5C,QAAA,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,UAAA;AAAA,UACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,KAAA,EAAO,WAAW,IAAA,EAAK;AAAA,UAClE,QAAA,EAAU;AAAA,YACR,GAAG,GAAA;AAAA,YACH,aAAA,EAAe,iBAAA,CAAkB,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC;AAAA;AACxD,SACD,CAAA;AAAA,MACH,CAAA;AAAA,MACA,CAAC,OAA6B,aAAA,KAA2B;AACvD,QAAA,eAAA,CAAgB,YAAY,CAAA;AAC5B,QAAA,aAAA,CAAc,KAAK,CAAA;AAEnB,QAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,KAAA,CAAM,MAAM,CAAA;AAE7D,QAAA,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,UAAA;AAAA,UACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,UAClE,QAAA,EAAU;AAAA,YACR,GAAG,KAAA;AAAA,YACH,aAAA,EAAe,iBAAA;AAAA,cACb,iBAAA,CAAkB,OAAA,EAAS,KAAA,CAAM,MAAA,EAAQ,GAAG,kBAAkB,CAAA;AAAA,cAC9D,aAAA;AAAA,cACA;AAAA;AACF;AACF,SACD,CAAA;AAAA,MACH;AAAA,KACF;AAAA,EACF;AAEA,EAAA,SAAS,UAAA,CAAW,WAAwB,OAAA,EAAsB;AAChE,IAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,GAAG,YAAA;AAAA,QACH,QAAQ,UAAA,CAAW;AAAA,OACrB;AACA,MAAA,MAAM,YAAA,GAAe,YAAA;AAErB,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,UAAA;AAAA,QACN,cAAc,EAAE,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,QAClE,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,WAAA;AAAA,QACE,YAAA,CAAa,EAAA;AAAA,QACb,CAAA,GAAA,KAAO;AACL,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,KAAA,EAAO,WAAW,IAAA,EAAK;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,GAAA;AAAA,cACH,aAAA,EAAe,iBAAA,CAAkB,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC;AAAA;AACxD,WACD,CAAA;AACD,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,GAAA,CAAI,MAAA,KAAW,gBAAA,CAAiB,WAAA,EAAa;AAC/C,YAAA,eAAA;AAAA,cACE,MAAM,IAAA,CAAK,CAAA,IAAA,KAAQ,KAAK,EAAA,KAAO,YAAA,CAAa,EAAE,CAAA,IAAK;AAAA,aACrD;AACA,YAAA,QAAA,CAAS,MAAM,MAAA,CAAO,CAAA,IAAA,KAAQ,KAAK,EAAA,KAAO,WAAA,CAAY,EAAE,CAAC,CAAA;AACzD,YAAA,IAAI,WAAW,SAAA,EAAU;AAAA,UAC3B,CAAA,MAAO;AACL,YAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,YAAA,QAAA;AAAA,cACE,KAAA,CAAM,GAAA;AAAA,gBAAI,CAAA,IAAA,KACR,IAAA,CAAK,EAAA,KAAO,YAAA,CAAa,KAAK,WAAA,GAAc;AAAA;AAC9C,aACF;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,CAAC,OAAO,aAAA,KAAkB;AACxB,UAAA,eAAA,CAAgB,YAAY,CAAA;AAE5B,UAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,KAAA,CAAM,MAAM,CAAA;AAE7D,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,KAAA;AAAA,cACH,aAAA,EAAe,iBAAA;AAAA,gBACb,iBAAA,CAAkB,OAAA,EAAS,KAAA,CAAM,MAAA,EAAQ,GAAG,kBAAkB,CAAA;AAAA,gBAC9D,aAAA;AAAA,gBACA;AAAA;AACF;AACF,WACD,CAAA;AACD,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,SAAS,OAAA,EAAQ;AAAA,QACvB;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,0BACJ,YAAA,EAAc,MAAA,KAAW,WAAW,aAAA,IACpC,YAAA,EAAc,WAAW,UAAA,CAAW,uBAAA;AAEtC,EAAA,MAAM,sBAAA,GAAyB,YAAY,MAAM;AAC/C,IAAA,QAAA,CAAS;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,MAClE,QAAA,EAAU;AAAA,QACR,QAAQ,gBAAA,CAAiB,4BAAA;AAAA,QACzB,aAAA,EAAe,EAAE,4CAA4C;AAAA;AAC/D,KACD,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,QAAA,EAAU,CAAC,CAAC,CAAA;AAEhB,EAAA,SAAS,UAAA,CACP,IAAA,EACA,SAAA,EACA,OAAA,EACA;AACA,IAAA,IAAI,uBAAA,EAAyB;AAC3B,MAAA,sBAAA,EAAuB;AACvB,MAAA,OAAA,IAAU;AACV,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,MAAA,MAAM,qBAAA,GACJ,aAAa,eAAA,EAAiB,4BAAA,IAC9B,oBAAoB,YAAA,CAAa,OAAA,EAAS,KAAK,OAAO,CAAA;AAExD,MAAA,MAAM,WAAA,GAAgC;AAAA,QACpC,GAAG,YAAA;AAAA,QACH,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,MAAA,EACE,aAAa,MAAA,KAAW,UAAA,CAAW,SAAS,qBAAA,GACxC,UAAA,CAAW,QACX,YAAA,CAAa,MAAA;AAAA,QACnB,qBAAA;AAAA,QACA,eAAe,IAAA,CAAK,aAAA;AAAA,QACpB,eAAA,EAAiB;AAAA,UACf,gBAAA,EAAkB,KAAA;AAAA,UAClB,4BAAA,EAA8B;AAAA;AAChC,OACF;AACA,MAAA,MAAM,YAAA,GAAe,YAAA;AACrB,MAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,UAAA;AAAA,QACN,cAAc,EAAE,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,QAClE,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,QAAA;AAAA,QACE,WAAA;AAAA,QACA,CAAA,GAAA,KAAO;AACL,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,KAAA,EAAO,WAAW,IAAA,EAAK;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,GAAA;AAAA,cACH,aAAA,EAAe,iBAAA,CAAkB,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC;AAAA;AACxD,WACD,CAAA;AACD,UAAA,IAAI,iBAAA,IAAqB,GAAA,IAAO,GAAA,CAAI,eAAA,EAAiB,cAAA,EAAgB;AACnE,YAAA,WAAA,CAAY,cAAA,GAAiB,IAAI,eAAA,CAAgB,cAAA;AACjD,YAAA,WAAA,CAAY,SAAS,UAAA,CAAW,eAAA;AAAA,UAClC;AACA,UAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,UAAA,QAAA;AAAA,YACE,KAAA,CAAM,IAAI,CAAA,CAAA,KAAM,CAAA,CAAE,OAAO,YAAA,CAAa,EAAA,GAAK,cAAc,CAAE;AAAA,WAC7D;AACA,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,WAAW,SAAA,EAAU;AAAA,QAC3B,CAAA;AAAA,QACA,CAAC,OAAO,aAAA,KAAkB;AACxB,UAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,KAAA,CAAM,MAAM,CAAA;AAE7D,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,KAAA;AAAA,cACH,aAAA,EAAe,iBAAA;AAAA,gBACb,iBAAA,CAAkB,OAAA,EAAS,KAAA,CAAM,MAAA,EAAQ,GAAG,kBAAkB,CAAA;AAAA,gBAC9D,aAAA;AAAA,gBACA;AAAA;AACF;AACF,WACD,CAAA;AACD,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,SAAS,OAAA,EAAQ;AACrB,UAAA,eAAA,CAAgB,YAAY,CAAA;AAAA,QAC9B;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,SAAS,WAAA,GAAc;AACrB,IAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,YAAA;AAAA,QACN,cAAc,EAAE,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA;AAAM,OACnE,CAAA;AACD,MAAA,YAAA;AAAA,QACE,YAAA,CAAa,EAAA;AAAA,QACb,CAAA,GAAA,KAAO;AACL,UAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAiB,cAAA;AACnC,UAAA,MAAM,WAAA,GAAc;AAAA,YAClB,GAAG,YAAA;AAAA,YACH,QACE,YAAA,CAAa,MAAA,KAAW,WAAW,KAAA,GAC/B,UAAA,CAAW,kBACX,UAAA,CAAW,uBAAA;AAAA,YACjB,cAAA,EAAgB;AAAA,WAClB;AACA,UAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,UAAA,QAAA;AAAA,YACE,KAAA,CAAM,IAAI,CAAA,CAAA,KAAM,CAAA,CAAE,OAAO,YAAA,CAAa,EAAA,GAAK,cAAc,CAAE;AAAA,WAC7D;AACA,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,KAAA,EAAO,WAAW,IAAA,EAAK;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,GAAA;AAAA,cACH,aAAA,EAAe,iBAAA,CAAkB,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC;AAAA;AACxD,WACD,CAAA;AAAA,QACH,CAAA;AAAA,QACA,CAAC,OAAO,aAAA,KAAkB;AACxB,UAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,KAAA,CAAM,MAAM,CAAA;AAE7D,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,KAAA;AAAA,cACH,aAAA,EAAe,iBAAA;AAAA,gBACb,iBAAA,CAAkB,OAAA,EAAS,KAAA,CAAM,MAAA,EAAQ,GAAG,kBAAkB,CAAA;AAAA,gBAC9D,aAAA;AAAA,gBACA;AAAA;AACF;AACF,WACD,CAAA;AAAA,QACH;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,KAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,sBAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAc,UAAA,CAAW,YAAA;AAAA,IACzB,eAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAU,UAAA,CAAW,QAAA;AAAA,IACrB;AAAA,GACF;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,WAAA,CAAY,QAAA;AAAA,IAAZ;AAAA,MACC,KAAA,EAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,uBAAA,EAAyB,KAAA;AAAA,QACzB,0BAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,QAAA,GAAW;AACzB,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,OAAA;AACT;;;;"}
|