@defra/forms-model 3.0.429 → 3.0.431
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/README.md +163 -1
- package/dist/module/common/pagination/index.js +2 -2
- package/dist/module/common/pagination/index.js.map +1 -1
- package/dist/module/common/search/index.js +4 -4
- package/dist/module/common/search/index.js.map +1 -1
- package/dist/module/common/sorting/index.js +2 -2
- package/dist/module/common/sorting/index.js.map +1 -1
- package/dist/module/form/form-definition/index.js +156 -156
- package/dist/module/form/form-definition/index.js.map +1 -1
- package/dist/module/form/form-editor/index.js +47 -37
- package/dist/module/form/form-editor/index.js.map +1 -1
- package/dist/module/form/form-editor/types.js.map +1 -1
- package/dist/module/form/form-manager/index.js +3 -3
- package/dist/module/form/form-manager/index.js.map +1 -1
- package/dist/module/form/form-metadata/index.js +34 -34
- package/dist/module/form/form-metadata/index.js.map +1 -1
- package/dist/module/form/form-submission/index.js +13 -13
- package/dist/module/form/form-submission/index.js.map +1 -1
- package/dist/module/types/joi-to-json.d.js +2 -0
- package/dist/module/types/joi-to-json.d.js.map +1 -0
- package/dist/types/common/pagination/index.d.ts.map +1 -1
- package/dist/types/common/search/index.d.ts.map +1 -1
- package/dist/types/common/sorting/index.d.ts.map +1 -1
- package/dist/types/form/form-definition/index.d.ts.map +1 -1
- package/dist/types/form/form-editor/index.d.ts +17 -7
- package/dist/types/form/form-editor/index.d.ts.map +1 -1
- package/dist/types/form/form-editor/types.d.ts +45 -1
- package/dist/types/form/form-editor/types.d.ts.map +1 -1
- package/dist/types/form/form-manager/index.d.ts.map +1 -1
- package/dist/types/form/form-metadata/index.d.ts.map +1 -1
- package/dist/types/form/form-submission/index.d.ts.map +1 -1
- package/package.json +6 -4
- package/scripts/generate-schemas.js +238 -0
- package/scripts/schema-modules/constants.js +39 -0
- package/scripts/schema-modules/schema-processors.js +109 -0
- package/scripts/schema-modules/schema-simplifiers.js +351 -0
- package/scripts/schema-modules/title-processors.js +327 -0
- package/scripts/schema-modules/types.js +21 -0
- package/scripts/schema-modules/utils.js +41 -0
- package/src/common/pagination/index.ts +8 -1
- package/src/common/search/index.ts +17 -3
- package/src/common/sorting/index.ts +8 -2
- package/src/form/form-definition/index.ts +567 -238
- package/src/form/form-editor/index.ts +207 -24
- package/src/form/form-editor/types.ts +69 -0
- package/src/form/form-manager/index.ts +11 -2
- package/src/form/form-metadata/index.ts +118 -40
- package/src/form/form-submission/index.ts +33 -10
- package/src/types/joi-to-json.d.ts +15 -0
package/README.md
CHANGED
@@ -1,9 +1,171 @@
|
|
1
1
|
# Defra forms model
|
2
2
|
|
3
|
-
|
3
|
+
A model and validation library for Defra forms, providing the foundation for form definitions, components, validation, and data handling.
|
4
|
+
|
5
|
+
## Features
|
6
|
+
|
7
|
+
- **Form Definition** - Core structures for forms, pages, components, and conditions
|
8
|
+
- **Component Library** - Pre-defined form components with validation
|
9
|
+
- **JSON Schema** - Ready-to-use JSON schema files for cross-platform validation
|
10
|
+
- **Conditions Engine** - Logic for determining form flow and visibility
|
11
|
+
- **Type Definitions** - Complete TypeScript type safety
|
12
|
+
- **Metadata Handling** - Support for form metadata, versioning, and state management
|
13
|
+
|
14
|
+
## Installation
|
15
|
+
|
16
|
+
```shell
|
17
|
+
npm install @defra/forms-model
|
18
|
+
```
|
19
|
+
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
### Form Definition
|
23
|
+
|
24
|
+
```javascript
|
25
|
+
import { createForm } from '@defra/forms-model';
|
26
|
+
|
27
|
+
const form = createForm({
|
28
|
+
name: 'my-form',
|
29
|
+
pages: [
|
30
|
+
{
|
31
|
+
path: '/start',
|
32
|
+
title: 'Start page',
|
33
|
+
components: [/* components */]
|
34
|
+
}
|
35
|
+
],
|
36
|
+
sections: [/* sections */]
|
37
|
+
});
|
38
|
+
```
|
39
|
+
|
40
|
+
### Component Usage
|
41
|
+
|
42
|
+
```javascript
|
43
|
+
import { ComponentType } from '@defra/forms-model';
|
44
|
+
|
45
|
+
const textField = {
|
46
|
+
type: ComponentType.TextField,
|
47
|
+
name: 'fullName',
|
48
|
+
title: 'Full name',
|
49
|
+
schema: {
|
50
|
+
min: 2,
|
51
|
+
max: 100
|
52
|
+
}
|
53
|
+
};
|
54
|
+
```
|
55
|
+
|
56
|
+
### Form Validation
|
57
|
+
|
58
|
+
#### JSON Schema Files
|
59
|
+
|
60
|
+
This package includes pre-generated JSON schema files for use with external JSON Schema validators/ IDEs linting etc:
|
61
|
+
|
62
|
+
```javascript
|
63
|
+
import formSchema from '@defra/forms-model/schemas/form-definition-schema.json';
|
64
|
+
```
|
65
|
+
|
66
|
+
Available schema files include:
|
67
|
+
|
68
|
+
##### Form Definition Schemas
|
69
|
+
|
70
|
+
- `form-definition-schema.json` - Full form definition validation
|
71
|
+
- `form-definition-v2-payload-schema.json` - Form definition v2 payload validation
|
72
|
+
|
73
|
+
##### Component Schemas
|
74
|
+
|
75
|
+
- `component-schema.json` - Component validation
|
76
|
+
- `component-schema-v2.json` - Component validation (v2)
|
77
|
+
|
78
|
+
##### Page Schemas
|
79
|
+
|
80
|
+
- `page-schema.json` - Page validation
|
81
|
+
- `page-schema-v2.json` - Page validation (v2)
|
82
|
+
- `page-schema-payload-v2.json` - Page payload validation (v2)
|
83
|
+
|
84
|
+
##### List Schemas
|
85
|
+
|
86
|
+
- `list-schema.json` - List validation
|
87
|
+
- `list-schema-v2.json` - List validation (v2)
|
88
|
+
|
89
|
+
##### Form Metadata Schemas
|
90
|
+
|
91
|
+
- `form-metadata-schema.json` - Form metadata validation
|
92
|
+
- `form-metadata-author-schema.json` - Form metadata author validation
|
93
|
+
- `form-metadata-input-schema.json` - Form metadata input validation
|
94
|
+
- `form-metadata-state-schema.json` - Form metadata state validation
|
95
|
+
|
96
|
+
##### Form Metadata Field Schemas
|
97
|
+
|
98
|
+
- `form-metadata-contact-schema.json` - Contact information validation
|
99
|
+
- `form-metadata-email-schema.json` - Email validation
|
100
|
+
- `form-metadata-online-schema.json` - Online form metadata validation
|
101
|
+
|
102
|
+
##### Form Editor Schemas
|
103
|
+
|
104
|
+
- `form-editor-input-page-schema.json` - Form editor input page validation
|
105
|
+
- `form-editor-input-check-answers-setting-schema.json` - Check answers setting validation
|
106
|
+
- `form-editor-input-question-schema.json` - Question input validation
|
107
|
+
- `form-editor-input-page-settings-schema.json` - Page settings validation
|
108
|
+
|
109
|
+
##### Form Editor Field Schemas
|
110
|
+
|
111
|
+
- `page-type-schema.json` - Page type validation
|
112
|
+
- `question-type-schema.json` - Question type validation
|
113
|
+
- `question-type-full-schema.json` - Full question type validation
|
114
|
+
- `written-answer-sub-schema.json` - Written answer sub-schema validation
|
115
|
+
- `date-sub-schema.json` - Date sub-schema validation
|
116
|
+
|
117
|
+
##### Form Submission Schemas
|
118
|
+
|
119
|
+
- `form-submit-payload-schema.json` - Form submission payload validation
|
120
|
+
- `form-submit-record-schema.json` - Form submission record validation
|
121
|
+
- `form-submit-recordset-schema.json` - Form submission recordset validation
|
122
|
+
|
123
|
+
##### Form Manager Schemas
|
124
|
+
|
125
|
+
- `patch-page-schema.json` - Patch page validation
|
126
|
+
|
127
|
+
##### Section Schemas
|
128
|
+
|
129
|
+
- `question-schema.json` - Question validation
|
130
|
+
|
131
|
+
##### Validation Schemas
|
132
|
+
|
133
|
+
- `min-schema.json` - Minimum value validation
|
134
|
+
- `max-schema.json` - Maximum value validation
|
135
|
+
- `min-length-schema.json` - Minimum length validation
|
136
|
+
- `max-length-schema.json` - Maximum length validation
|
137
|
+
- `max-future-schema.json` - Maximum future date validation
|
138
|
+
- `max-past-schema.json` - Maximum past date validation
|
139
|
+
|
140
|
+
##### Common Schemas
|
141
|
+
|
142
|
+
- `search-options-schema.json` - Search options validation
|
143
|
+
- `query-options-schema.json` - Query options validation
|
144
|
+
- `pagination-options-schema.json` - Pagination options validation
|
145
|
+
- `sorting-options-schema.json` - Sorting options validation
|
146
|
+
|
147
|
+
## Development
|
148
|
+
|
149
|
+
### Test Coverage
|
4
150
|
|
5
151
|
Unit test coverage threshold, code coverage below which build will fail is set by using jest config, at the moment line coverage threshold is set as 92%, see [jest.config.js](jest.config.js)
|
6
152
|
|
153
|
+
### JSON Schema Generation and Publishing
|
154
|
+
|
155
|
+
This package generates JSON Schema files from Joi validation schemas during the build process. These schemas are included in the published npm package and are available at runtime.
|
156
|
+
|
157
|
+
#### How It Works
|
158
|
+
|
159
|
+
When you run `npm run build`, the script `scripts/generate-schemas.js` is executed which:
|
160
|
+
|
161
|
+
1. Converts Joi validation schemas to JSON Schema format
|
162
|
+
2. Enhances schemas with titles and descriptions
|
163
|
+
3. Writes schema files to the `schemas/` directory
|
164
|
+
|
165
|
+
#### Known Quirks
|
166
|
+
|
167
|
+
1. **First Build Required**: After a fresh clone, you must run `npm run build` before the schema files will be available locally.
|
168
|
+
|
7
169
|
## License
|
8
170
|
|
9
171
|
THIS INFORMATION IS LICENSED UNDER THE CONDITIONS OF THE OPEN GOVERNMENT LICENCE found at:
|
@@ -3,8 +3,8 @@ import Joi from 'joi';
|
|
3
3
|
* Field definitions for pagination options.
|
4
4
|
*/
|
5
5
|
export const paginationOptionFields = {
|
6
|
-
page: Joi.number().positive().integer().default(1).min(1).optional(),
|
7
|
-
perPage: Joi.number().positive().integer().default(24).min(1).max(200).optional()
|
6
|
+
page: Joi.number().positive().integer().default(1).min(1).optional().description('Current page number, starting from 1'),
|
7
|
+
perPage: Joi.number().positive().integer().default(24).min(1).max(200).optional().description('Number of items to display per page, between 1 and 200')
|
8
8
|
};
|
9
9
|
|
10
10
|
/**
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","names":["Joi","paginationOptionFields","page","number","positive","integer","default","min","optional","perPage","max","paginationOptionsSchema","object"],"sources":["../../../../src/common/pagination/index.ts"],"sourcesContent":["import Joi from 'joi'\n\nimport { type PaginationOptions } from '~/src/common/pagination/types.js'\n\n/**\n * Field definitions for pagination options.\n */\nexport const paginationOptionFields = {\n page: Joi.number().positive().integer().default(1).min(1).optional(),\n perPage: Joi.number()\n .positive()\n .integer()\n .default(24)\n .min(1)\n .max(200)\n .optional()\n}\n\n/**\n * Joi schema for `PaginationOptions` interface\n * @see {@link PaginationOptions}\n */\nexport const paginationOptionsSchema: Joi.ObjectSchema<PaginationOptions> =\n Joi.object(paginationOptionFields)\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,KAAK;AAIrB;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,GAAG;EACpCC,IAAI,EAAEF,GAAG,CAACG,MAAM,CAAC,CAAC,
|
1
|
+
{"version":3,"file":"index.js","names":["Joi","paginationOptionFields","page","number","positive","integer","default","min","optional","description","perPage","max","paginationOptionsSchema","object"],"sources":["../../../../src/common/pagination/index.ts"],"sourcesContent":["import Joi from 'joi'\n\nimport { type PaginationOptions } from '~/src/common/pagination/types.js'\n\n/**\n * Field definitions for pagination options.\n */\nexport const paginationOptionFields = {\n page: Joi.number()\n .positive()\n .integer()\n .default(1)\n .min(1)\n .optional()\n .description('Current page number, starting from 1'),\n perPage: Joi.number()\n .positive()\n .integer()\n .default(24)\n .min(1)\n .max(200)\n .optional()\n .description('Number of items to display per page, between 1 and 200')\n}\n\n/**\n * Joi schema for `PaginationOptions` interface\n * @see {@link PaginationOptions}\n */\nexport const paginationOptionsSchema: Joi.ObjectSchema<PaginationOptions> =\n Joi.object(paginationOptionFields)\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,KAAK;AAIrB;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,GAAG;EACpCC,IAAI,EAAEF,GAAG,CAACG,MAAM,CAAC,CAAC,CACfC,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,CAAC,CACTC,OAAO,CAAC,CAAC,CAAC,CACVC,GAAG,CAAC,CAAC,CAAC,CACNC,QAAQ,CAAC,CAAC,CACVC,WAAW,CAAC,sCAAsC,CAAC;EACtDC,OAAO,EAAEV,GAAG,CAACG,MAAM,CAAC,CAAC,CAClBC,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,CAAC,CACTC,OAAO,CAAC,EAAE,CAAC,CACXC,GAAG,CAAC,CAAC,CAAC,CACNI,GAAG,CAAC,GAAG,CAAC,CACRH,QAAQ,CAAC,CAAC,CACVC,WAAW,CAAC,wDAAwD;AACzE,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,MAAMG,uBAA4D,GACvEZ,GAAG,CAACa,MAAM,CAACZ,sBAAsB,CAAC","ignoreList":[]}
|
@@ -5,10 +5,10 @@ import { organisations } from "../../form/form-metadata/index.js";
|
|
5
5
|
* Field definitions for search options.
|
6
6
|
*/
|
7
7
|
export const searchOptionFields = {
|
8
|
-
title: Joi.string().trim().allow('').max(255).optional().default(''),
|
9
|
-
author: Joi.string().trim().allow('').max(100).optional().default(''),
|
10
|
-
organisations: Joi.array().items(Joi.string().valid(...organisations)).single().optional().default([]),
|
11
|
-
status: Joi.array().items(Joi.string().valid('draft', 'live')).single().optional().default([])
|
8
|
+
title: Joi.string().trim().allow('').max(255).optional().default('').description('Search by form title, empty string matches all'),
|
9
|
+
author: Joi.string().trim().allow('').max(100).optional().default('').description('Search by form author, empty string matches all'),
|
10
|
+
organisations: Joi.array().items(Joi.string().valid(...organisations)).single().optional().default([]).description('Filter by organisation(s), empty array matches all'),
|
11
|
+
status: Joi.array().items(Joi.string().valid('draft', 'live')).single().optional().default([]).description('Filter by form status(es), empty array matches all')
|
12
12
|
};
|
13
13
|
|
14
14
|
/**
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","names":["Joi","organisations","searchOptionFields","title","string","trim","allow","max","optional","default","author","array","items","valid","single","status","searchOptionsSchema","object"],"sources":["../../../../src/common/search/index.ts"],"sourcesContent":["import Joi from 'joi'\n\nimport { type SearchOptions } from '~/src/common/search/types.js'\nimport { organisations } from '~/src/form/form-metadata/index.js'\n\n/**\n * Field definitions for search options.\n */\nexport const searchOptionFields = {\n title: Joi.string().trim().allow('').max(255).optional().default(''),\n author: Joi.string().trim().allow('').max(100).optional().default(''),\n organisations: Joi.array()\n .items(Joi.string().valid(...organisations))\n .single()\n .optional()\n .default([]),\n status: Joi.array()\n .items(Joi.string().valid('draft', 'live'))\n .single()\n .optional()\n .default([])\n}\n\n/**\n * Joi schema for {@link SearchOptions} interface\n */\nexport const searchOptionsSchema: Joi.ObjectSchema<SearchOptions> =\n Joi.object(searchOptionFields)\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,KAAK;AAGrB,SAASC,aAAa;;AAEtB;AACA;AACA;AACA,OAAO,MAAMC,kBAAkB,GAAG;EAChCC,KAAK,EAAEH,GAAG,CAACI,MAAM,CAAC,CAAC,
|
1
|
+
{"version":3,"file":"index.js","names":["Joi","organisations","searchOptionFields","title","string","trim","allow","max","optional","default","description","author","array","items","valid","single","status","searchOptionsSchema","object"],"sources":["../../../../src/common/search/index.ts"],"sourcesContent":["import Joi from 'joi'\n\nimport { type SearchOptions } from '~/src/common/search/types.js'\nimport { organisations } from '~/src/form/form-metadata/index.js'\n\n/**\n * Field definitions for search options.\n */\nexport const searchOptionFields = {\n title: Joi.string()\n .trim()\n .allow('')\n .max(255)\n .optional()\n .default('')\n .description('Search by form title, empty string matches all'),\n author: Joi.string()\n .trim()\n .allow('')\n .max(100)\n .optional()\n .default('')\n .description('Search by form author, empty string matches all'),\n organisations: Joi.array()\n .items(Joi.string().valid(...organisations))\n .single()\n .optional()\n .default([])\n .description('Filter by organisation(s), empty array matches all'),\n status: Joi.array()\n .items(Joi.string().valid('draft', 'live'))\n .single()\n .optional()\n .default([])\n .description('Filter by form status(es), empty array matches all')\n}\n\n/**\n * Joi schema for {@link SearchOptions} interface\n */\nexport const searchOptionsSchema: Joi.ObjectSchema<SearchOptions> =\n Joi.object(searchOptionFields)\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,KAAK;AAGrB,SAASC,aAAa;;AAEtB;AACA;AACA;AACA,OAAO,MAAMC,kBAAkB,GAAG;EAChCC,KAAK,EAAEH,GAAG,CAACI,MAAM,CAAC,CAAC,CAChBC,IAAI,CAAC,CAAC,CACNC,KAAK,CAAC,EAAE,CAAC,CACTC,GAAG,CAAC,GAAG,CAAC,CACRC,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,EAAE,CAAC,CACXC,WAAW,CAAC,gDAAgD,CAAC;EAChEC,MAAM,EAAEX,GAAG,CAACI,MAAM,CAAC,CAAC,CACjBC,IAAI,CAAC,CAAC,CACNC,KAAK,CAAC,EAAE,CAAC,CACTC,GAAG,CAAC,GAAG,CAAC,CACRC,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,EAAE,CAAC,CACXC,WAAW,CAAC,iDAAiD,CAAC;EACjET,aAAa,EAAED,GAAG,CAACY,KAAK,CAAC,CAAC,CACvBC,KAAK,CAACb,GAAG,CAACI,MAAM,CAAC,CAAC,CAACU,KAAK,CAAC,GAAGb,aAAa,CAAC,CAAC,CAC3Cc,MAAM,CAAC,CAAC,CACRP,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,EAAE,CAAC,CACXC,WAAW,CAAC,oDAAoD,CAAC;EACpEM,MAAM,EAAEhB,GAAG,CAACY,KAAK,CAAC,CAAC,CAChBC,KAAK,CAACb,GAAG,CAACI,MAAM,CAAC,CAAC,CAACU,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAC1CC,MAAM,CAAC,CAAC,CACRP,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,EAAE,CAAC,CACXC,WAAW,CAAC,oDAAoD;AACrE,CAAC;;AAED;AACA;AACA;AACA,OAAO,MAAMO,mBAAoD,GAC/DjB,GAAG,CAACkB,MAAM,CAAChB,kBAAkB,CAAC","ignoreList":[]}
|
@@ -3,8 +3,8 @@ import Joi from 'joi';
|
|
3
3
|
* Field definitions for sorting options.
|
4
4
|
*/
|
5
5
|
export const sortingOptionFields = {
|
6
|
-
sortBy: Joi.string().valid('updatedAt', 'title').optional(),
|
7
|
-
order: Joi.string().valid('asc', 'desc').optional()
|
6
|
+
sortBy: Joi.string().valid('updatedAt', 'title').optional().description('Field to sort results by'),
|
7
|
+
order: Joi.string().valid('asc', 'desc').optional().description('Sort order (ascending or descending)')
|
8
8
|
};
|
9
9
|
|
10
10
|
/**
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","names":["Joi","sortingOptionFields","sortBy","string","valid","optional","order","sortingOptionsSchema","object"],"sources":["../../../../src/common/sorting/index.ts"],"sourcesContent":["import Joi from 'joi'\n\nimport { type SortingOptions } from '~/src/common/sorting/types.js'\n\n/**\n * Field definitions for sorting options.\n */\nexport const sortingOptionFields = {\n sortBy: Joi.string().valid('updatedAt', 'title').optional(),\n order: Joi.string().valid('asc', 'desc').optional()\n}\n\n/**\n * Joi schema for `SortingOptions` interface\n * @see {@link SortingOptions}\n */\nexport const sortingOptionsSchema: Joi.ObjectSchema<SortingOptions> =\n Joi.object(sortingOptionFields)\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,KAAK;AAIrB;AACA;AACA;AACA,OAAO,MAAMC,mBAAmB,GAAG;EACjCC,MAAM,EAAEF,GAAG,CAACG,MAAM,CAAC,CAAC,
|
1
|
+
{"version":3,"file":"index.js","names":["Joi","sortingOptionFields","sortBy","string","valid","optional","description","order","sortingOptionsSchema","object"],"sources":["../../../../src/common/sorting/index.ts"],"sourcesContent":["import Joi from 'joi'\n\nimport { type SortingOptions } from '~/src/common/sorting/types.js'\n\n/**\n * Field definitions for sorting options.\n */\nexport const sortingOptionFields = {\n sortBy: Joi.string()\n .valid('updatedAt', 'title')\n .optional()\n .description('Field to sort results by'),\n order: Joi.string()\n .valid('asc', 'desc')\n .optional()\n .description('Sort order (ascending or descending)')\n}\n\n/**\n * Joi schema for `SortingOptions` interface\n * @see {@link SortingOptions}\n */\nexport const sortingOptionsSchema: Joi.ObjectSchema<SortingOptions> =\n Joi.object(sortingOptionFields)\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,KAAK;AAIrB;AACA;AACA;AACA,OAAO,MAAMC,mBAAmB,GAAG;EACjCC,MAAM,EAAEF,GAAG,CAACG,MAAM,CAAC,CAAC,CACjBC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAC3BC,QAAQ,CAAC,CAAC,CACVC,WAAW,CAAC,0BAA0B,CAAC;EAC1CC,KAAK,EAAEP,GAAG,CAACG,MAAM,CAAC,CAAC,CAChBC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CACpBC,QAAQ,CAAC,CAAC,CACVC,WAAW,CAAC,sCAAsC;AACvD,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,MAAME,oBAAsD,GACjER,GAAG,CAACS,MAAM,CAACR,mBAAmB,CAAC","ignoreList":[]}
|