@hh.ru/magritte-ui-input 9.0.12 → 9.1.1
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/BaseInput.js +1 -1
- package/DateTimeInput.d.ts +2 -1
- package/DateTimeInput.js +7 -5
- package/DateTimeInput.js.map +1 -1
- package/UncontrolledDateTimeInput.d.ts +2 -1
- package/UncontrolledDateTimeInput.js +1 -1
- package/index.css +99 -99
- package/{index.esm-LrCm-Ziw.js → index.esm-CO13rGcB.js} +179 -2
- package/{index.esm-LrCm-Ziw.js.map → index.esm-CO13rGcB.js.map} +1 -1
- package/index.js +1 -1
- package/maskito-exports.d.ts +1 -1
- package/maskito-exports.js +1 -1
- package/package.json +5 -5
- package/types.d.ts +2 -0
- package/useDateTimeMask.d.ts +1 -1
- package/useDateTimeMask.js +14 -7
- package/useDateTimeMask.js.map +1 -1
package/index.js
CHANGED
|
@@ -26,6 +26,6 @@ import './useFocus.js';
|
|
|
26
26
|
import '@hh.ru/magritte-ui-typography';
|
|
27
27
|
import '@hh.ru/magritte-common-number-formatter';
|
|
28
28
|
import './useDateTimeMask.js';
|
|
29
|
-
import './index.esm-
|
|
29
|
+
import './index.esm-CO13rGcB.js';
|
|
30
30
|
import './useUncontrolledInput.js';
|
|
31
31
|
//# sourceMappingURL=index.js.map
|
package/maskito-exports.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { MASKITO_DEFAULT_OPTIONS, type MaskitoOptions, type MaskitoPreprocessor, type MaskitoPostprocessor, } from '@maskito/core';
|
|
2
|
-
export { type MaskitoDateMode, maskitoDateOptionsGenerator, maskitoDateTimeOptionsGenerator, maskitoTimeOptionsGenerator, } from '@maskito/kit';
|
|
2
|
+
export { type MaskitoDateMode, maskitoDateOptionsGenerator, maskitoDateRangeOptionsGenerator, maskitoDateTimeOptionsGenerator, maskitoTimeOptionsGenerator, } from '@maskito/kit';
|
|
3
3
|
export { useMaskito } from '@maskito/react';
|
package/maskito-exports.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import './index.css';
|
|
2
|
-
export { M as MASKITO_DEFAULT_OPTIONS, m as maskitoDateOptionsGenerator, a as
|
|
2
|
+
export { M as MASKITO_DEFAULT_OPTIONS, m as maskitoDateOptionsGenerator, a as maskitoDateRangeOptionsGenerator, b as maskitoDateTimeOptionsGenerator, c as maskitoTimeOptionsGenerator, u as useMaskito } from './index.esm-CO13rGcB.js';
|
|
3
3
|
import 'react';
|
|
4
4
|
//# sourceMappingURL=maskito-exports.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hh.ru/magritte-ui-input",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.1.1",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"sideEffects": [
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
"@hh.ru/magritte-common-use-multiple-refs": "1.1.9",
|
|
32
32
|
"@hh.ru/magritte-design-tokens": "23.2.2",
|
|
33
33
|
"@hh.ru/magritte-ui-breakpoint": "6.0.1",
|
|
34
|
-
"@hh.ru/magritte-ui-form-helper": "2.0.
|
|
35
|
-
"@hh.ru/magritte-ui-icon": "
|
|
34
|
+
"@hh.ru/magritte-ui-form-helper": "2.0.8",
|
|
35
|
+
"@hh.ru/magritte-ui-icon": "13.0.0",
|
|
36
36
|
"@hh.ru/magritte-ui-mock-component": "1.1.5",
|
|
37
|
-
"@hh.ru/magritte-ui-typography": "4.2.
|
|
37
|
+
"@hh.ru/magritte-ui-typography": "4.2.4"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@maskito/core": "2.4.0",
|
|
@@ -44,5 +44,5 @@
|
|
|
44
44
|
"publishConfig": {
|
|
45
45
|
"access": "public"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "d768537d405d3ee73756252543f1cba4402e3d0e"
|
|
48
48
|
}
|
package/types.d.ts
CHANGED
|
@@ -140,6 +140,8 @@ export type DateTimeInputProps = InputBaseProps & {
|
|
|
140
140
|
onButtonClick?: OnButtonClickType;
|
|
141
141
|
/** Флаг скрытия маски при вводе */
|
|
142
142
|
hideMask?: boolean;
|
|
143
|
+
/** Флаг ввода диапазона значений. Работает только с масками mm.yyyy и dd.mm.yyyy */
|
|
144
|
+
range?: boolean;
|
|
143
145
|
};
|
|
144
146
|
export type ControlledDateTimeInputProps = DateTimeInputProps & ControlledProps;
|
|
145
147
|
export type UncontrolledDateTimeInputProps = DateTimeInputProps & UncontrolledProps;
|
package/useDateTimeMask.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { RefCallback } from 'react';
|
|
2
2
|
import { type TimeInputRounding, type DateInputMask } from '@hh.ru/magritte-ui-input/types';
|
|
3
|
-
export declare const useDateTimeMask: (dateMask?: DateInputMask, timeMask?: boolean, timeRounding?: TimeInputRounding) => RefCallback<HTMLElement>;
|
|
3
|
+
export declare const useDateTimeMask: (dateMask?: DateInputMask, timeMask?: boolean, timeRounding?: TimeInputRounding, range?: boolean) => RefCallback<HTMLElement>;
|
package/useDateTimeMask.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './index.css';
|
|
2
2
|
import { useMemo } from 'react';
|
|
3
|
-
import { M as MASKITO_DEFAULT_OPTIONS,
|
|
3
|
+
import { M as MASKITO_DEFAULT_OPTIONS, b as maskitoDateTimeOptionsGenerator, a as maskitoDateRangeOptionsGenerator, m as maskitoDateOptionsGenerator, c as maskitoTimeOptionsGenerator, u as useMaskito } from './index.esm-CO13rGcB.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Округление времени (в формате 00:00) до ближайшего заданного шага
|
|
@@ -94,7 +94,7 @@ const formatDDMaskPostprocessor = (state) => {
|
|
|
94
94
|
}
|
|
95
95
|
return state;
|
|
96
96
|
};
|
|
97
|
-
const useDateTimeMask = (dateMask, timeMask, timeRounding) => {
|
|
97
|
+
const useDateTimeMask = (dateMask, timeMask, timeRounding, range) => {
|
|
98
98
|
const options = useMemo(() => {
|
|
99
99
|
// маска 'dd' - исключение, которого нету в maskito api:
|
|
100
100
|
if (dateMask === 'dd') {
|
|
@@ -105,6 +105,7 @@ const useDateTimeMask = (dateMask, timeMask, timeRounding) => {
|
|
|
105
105
|
}
|
|
106
106
|
const dateSeparator = '.';
|
|
107
107
|
const dateMode = dateMask?.replace(/\./g, '/');
|
|
108
|
+
const rangeSeparator = ' – ';
|
|
108
109
|
const timeMode = 'HH:MM';
|
|
109
110
|
let options = { ...MASKITO_DEFAULT_OPTIONS };
|
|
110
111
|
if (dateMask && timeMask) {
|
|
@@ -115,10 +116,16 @@ const useDateTimeMask = (dateMask, timeMask, timeRounding) => {
|
|
|
115
116
|
});
|
|
116
117
|
}
|
|
117
118
|
else if (dateMask) {
|
|
118
|
-
options =
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
119
|
+
options = range
|
|
120
|
+
? maskitoDateRangeOptionsGenerator({
|
|
121
|
+
mode: dateMode,
|
|
122
|
+
dateSeparator,
|
|
123
|
+
rangeSeparator,
|
|
124
|
+
})
|
|
125
|
+
: maskitoDateOptionsGenerator({
|
|
126
|
+
mode: dateMode,
|
|
127
|
+
separator: dateSeparator,
|
|
128
|
+
});
|
|
122
129
|
}
|
|
123
130
|
else if (timeMask) {
|
|
124
131
|
options = maskitoTimeOptionsGenerator({
|
|
@@ -137,7 +144,7 @@ const useDateTimeMask = (dateMask, timeMask, timeRounding) => {
|
|
|
137
144
|
roundTimePostprocessor(Boolean(timeRounding && timeMode), timeRounding),
|
|
138
145
|
],
|
|
139
146
|
};
|
|
140
|
-
}, [dateMask, timeMask, timeRounding]);
|
|
147
|
+
}, [dateMask, timeMask, timeRounding, range]);
|
|
141
148
|
return useMaskito({ options });
|
|
142
149
|
};
|
|
143
150
|
|
package/useDateTimeMask.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDateTimeMask.js","sources":["../src/useDateTimeMask.ts"],"sourcesContent":["import { RefCallback, useMemo } from 'react';\n\nimport {\n MASKITO_DEFAULT_OPTIONS,\n MaskitoOptions,\n MaskitoPreprocessor,\n MaskitoPostprocessor,\n MaskitoDateMode,\n maskitoDateOptionsGenerator,\n maskitoDateTimeOptionsGenerator,\n maskitoTimeOptionsGenerator,\n useMaskito,\n} from '@hh.ru/magritte-ui-input/maskito-exports';\nimport { type TimeInputRounding, type DateInputMask } from '@hh.ru/magritte-ui-input/types';\n\n/**\n * Округление времени (в формате 00:00) до ближайшего заданного шага\n *\n * @param dateTime {String} Строка с постфиксом HH:MM, где H - часы, M - минуты\n * @param roundValue {Number} Шаг для округления\n * @returns {String}\n *\n * @example\n * roundTime('20.12.2023 15:19', 15); // '20.12.2023 15:15'\n * @example\n * roundTime('15:31', 60); // '16:00'\n */\nconst roundTime = (dateTime: string, roundValue: TimeInputRounding): string => {\n const regexp = /(\\d{2}):(\\d{2})$/;\n const match = dateTime.match(regexp);\n const time = match?.[0];\n\n if (time) {\n const [hours, minutes] = time.split(':').map(Number);\n const totalMinutes = hours * 60 + minutes;\n const roundedMinutes = Math.round(totalMinutes / roundValue) * roundValue;\n const roundedHours = Math.floor(roundedMinutes / 60) % 24;\n const formattedHours = String(roundedHours).padStart(2, '0');\n const formattedMinutes = String(roundedMinutes % 60).padStart(2, '0');\n return dateTime.replace(regexp, `${formattedHours}:${formattedMinutes}`);\n }\n\n return dateTime;\n};\n\n/** Постпроцессор для округления времени до заданного шага */\nconst roundTimePostprocessor =\n (enabled: boolean, rounding?: TimeInputRounding): MaskitoPostprocessor =>\n (state) =>\n enabled && rounding ? { ...state, value: roundTime(state.value, rounding) } : state;\n\n/** Препроцессор для автоматического добавления разделителей из маски */\nconst autoSeparatorsPreprocessor = (mask: Array<RegExp | string>): MaskitoPreprocessor => {\n let lastActionIsInsert = false;\n\n return (state, actionType) => {\n if (actionType === 'insert') {\n lastActionIsInsert = true;\n return state;\n }\n\n const canAddSeparator = actionType === 'validation' && lastActionIsInsert;\n lastActionIsInsert = false;\n\n if (canAddSeparator) {\n const { value, selection } = state.elementState;\n const [from, to] = selection;\n let newValue = '';\n const dateArray = value.split('');\n\n for (let i = 0; i < mask.length; i++) {\n if (i < dateArray.length) {\n newValue += dateArray[i];\n } else if (typeof mask[i] === 'string') {\n newValue += mask[i];\n } else {\n break;\n }\n }\n\n const addedCharacters = newValue.length - value.length;\n\n return {\n ...state,\n elementState: {\n value: newValue,\n selection: [from + addedCharacters, to + addedCharacters],\n },\n };\n }\n\n return state;\n };\n};\n\n/** Препроцессор для замены разделителей \"., :;/_\" на точку */\nconst replaceSeparatorsPreprocessor: MaskitoPreprocessor = (state, actionType) => {\n if (actionType === 'insert') {\n return {\n ...state,\n data: state.data\n .replace(/[^0-9., :;/_]/g, '')\n .replace(/[., :;/_]/g, '.')\n .replace(/([^0-9])\\1+/g, '$1'),\n };\n }\n return state;\n};\n\n/** Постпроцессор для преобразования 4 -> 04 при вводе с маской dd */\nconst formatDDMaskPostprocessor: MaskitoPostprocessor = (state) => {\n if (state.value.length === 1 && Number(state.value) > 3) {\n const [from, to] = state.selection;\n return {\n ...state,\n value: state.value.padStart(2, '0'),\n selection: [from + 1, to + 1],\n };\n }\n return state;\n};\n\nexport const useDateTimeMask = (\n dateMask?: DateInputMask,\n timeMask?: boolean,\n timeRounding?: TimeInputRounding\n): RefCallback<HTMLElement> => {\n const options = useMemo<MaskitoOptions>(() => {\n // маска 'dd' - исключение, которого нету в maskito api:\n if (dateMask === 'dd') {\n return {\n mask: /^([0-9]|0\\d|1\\d|2[0-9]|3[01])$/,\n postprocessors: [formatDDMaskPostprocessor],\n };\n }\n\n const dateSeparator = '.';\n const dateMode = dateMask?.replace(/\\./g, '/') as MaskitoDateMode;\n const timeMode = 'HH:MM';\n let options: MaskitoOptions = { ...MASKITO_DEFAULT_OPTIONS };\n\n if (dateMask && timeMask) {\n options = maskitoDateTimeOptionsGenerator({\n dateMode,\n timeMode,\n dateSeparator,\n });\n } else if (dateMask) {\n options = maskitoDateOptionsGenerator({\n mode: dateMode,\n separator: dateSeparator,\n });\n } else if (timeMask) {\n options = maskitoTimeOptionsGenerator({\n mode: timeMode,\n });\n }\n\n return {\n ...options,\n preprocessors: [\n replaceSeparatorsPreprocessor,\n ...(options.preprocessors || []),\n autoSeparatorsPreprocessor(options.mask as Array<RegExp | string>),\n ],\n postprocessors: [\n ...(options.postprocessors || []),\n roundTimePostprocessor(Boolean(timeRounding && timeMode), timeRounding),\n ],\n };\n }, [dateMask, timeMask, timeRounding]);\n\n return useMaskito({ options });\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useDateTimeMask.js","sources":["../src/useDateTimeMask.ts"],"sourcesContent":["import { RefCallback, useMemo } from 'react';\n\nimport {\n MASKITO_DEFAULT_OPTIONS,\n MaskitoOptions,\n MaskitoPreprocessor,\n MaskitoPostprocessor,\n MaskitoDateMode,\n maskitoDateOptionsGenerator,\n maskitoDateRangeOptionsGenerator,\n maskitoDateTimeOptionsGenerator,\n maskitoTimeOptionsGenerator,\n useMaskito,\n} from '@hh.ru/magritte-ui-input/maskito-exports';\nimport { type TimeInputRounding, type DateInputMask } from '@hh.ru/magritte-ui-input/types';\n\n/**\n * Округление времени (в формате 00:00) до ближайшего заданного шага\n *\n * @param dateTime {String} Строка с постфиксом HH:MM, где H - часы, M - минуты\n * @param roundValue {Number} Шаг для округления\n * @returns {String}\n *\n * @example\n * roundTime('20.12.2023 15:19', 15); // '20.12.2023 15:15'\n * @example\n * roundTime('15:31', 60); // '16:00'\n */\nconst roundTime = (dateTime: string, roundValue: TimeInputRounding): string => {\n const regexp = /(\\d{2}):(\\d{2})$/;\n const match = dateTime.match(regexp);\n const time = match?.[0];\n\n if (time) {\n const [hours, minutes] = time.split(':').map(Number);\n const totalMinutes = hours * 60 + minutes;\n const roundedMinutes = Math.round(totalMinutes / roundValue) * roundValue;\n const roundedHours = Math.floor(roundedMinutes / 60) % 24;\n const formattedHours = String(roundedHours).padStart(2, '0');\n const formattedMinutes = String(roundedMinutes % 60).padStart(2, '0');\n return dateTime.replace(regexp, `${formattedHours}:${formattedMinutes}`);\n }\n\n return dateTime;\n};\n\n/** Постпроцессор для округления времени до заданного шага */\nconst roundTimePostprocessor =\n (enabled: boolean, rounding?: TimeInputRounding): MaskitoPostprocessor =>\n (state) =>\n enabled && rounding ? { ...state, value: roundTime(state.value, rounding) } : state;\n\n/** Препроцессор для автоматического добавления разделителей из маски */\nconst autoSeparatorsPreprocessor = (mask: Array<RegExp | string>): MaskitoPreprocessor => {\n let lastActionIsInsert = false;\n\n return (state, actionType) => {\n if (actionType === 'insert') {\n lastActionIsInsert = true;\n return state;\n }\n\n const canAddSeparator = actionType === 'validation' && lastActionIsInsert;\n lastActionIsInsert = false;\n\n if (canAddSeparator) {\n const { value, selection } = state.elementState;\n const [from, to] = selection;\n let newValue = '';\n const dateArray = value.split('');\n\n for (let i = 0; i < mask.length; i++) {\n if (i < dateArray.length) {\n newValue += dateArray[i];\n } else if (typeof mask[i] === 'string') {\n newValue += mask[i];\n } else {\n break;\n }\n }\n\n const addedCharacters = newValue.length - value.length;\n\n return {\n ...state,\n elementState: {\n value: newValue,\n selection: [from + addedCharacters, to + addedCharacters],\n },\n };\n }\n\n return state;\n };\n};\n\n/** Препроцессор для замены разделителей \"., :;/_\" на точку */\nconst replaceSeparatorsPreprocessor: MaskitoPreprocessor = (state, actionType) => {\n if (actionType === 'insert') {\n return {\n ...state,\n data: state.data\n .replace(/[^0-9., :;/_]/g, '')\n .replace(/[., :;/_]/g, '.')\n .replace(/([^0-9])\\1+/g, '$1'),\n };\n }\n return state;\n};\n\n/** Постпроцессор для преобразования 4 -> 04 при вводе с маской dd */\nconst formatDDMaskPostprocessor: MaskitoPostprocessor = (state) => {\n if (state.value.length === 1 && Number(state.value) > 3) {\n const [from, to] = state.selection;\n return {\n ...state,\n value: state.value.padStart(2, '0'),\n selection: [from + 1, to + 1],\n };\n }\n return state;\n};\n\nexport const useDateTimeMask = (\n dateMask?: DateInputMask,\n timeMask?: boolean,\n timeRounding?: TimeInputRounding,\n range?: boolean\n): RefCallback<HTMLElement> => {\n const options = useMemo<MaskitoOptions>(() => {\n // маска 'dd' - исключение, которого нету в maskito api:\n if (dateMask === 'dd') {\n return {\n mask: /^([0-9]|0\\d|1\\d|2[0-9]|3[01])$/,\n postprocessors: [formatDDMaskPostprocessor],\n };\n }\n\n const dateSeparator = '.';\n const dateMode = dateMask?.replace(/\\./g, '/') as MaskitoDateMode;\n const rangeSeparator = ' – ';\n const timeMode = 'HH:MM';\n let options: MaskitoOptions = { ...MASKITO_DEFAULT_OPTIONS };\n\n if (dateMask && timeMask) {\n options = maskitoDateTimeOptionsGenerator({\n dateMode,\n timeMode,\n dateSeparator,\n });\n } else if (dateMask) {\n options = range\n ? maskitoDateRangeOptionsGenerator({\n mode: dateMode,\n dateSeparator,\n rangeSeparator,\n })\n : maskitoDateOptionsGenerator({\n mode: dateMode,\n separator: dateSeparator,\n });\n } else if (timeMask) {\n options = maskitoTimeOptionsGenerator({\n mode: timeMode,\n });\n }\n\n return {\n ...options,\n preprocessors: [\n replaceSeparatorsPreprocessor,\n ...(options.preprocessors || []),\n autoSeparatorsPreprocessor(options.mask as Array<RegExp | string>),\n ],\n postprocessors: [\n ...(options.postprocessors || []),\n roundTimePostprocessor(Boolean(timeRounding && timeMode), timeRounding),\n ],\n };\n }, [dateMask, timeMask, timeRounding, range]);\n\n return useMaskito({ options });\n};\n"],"names":[],"mappings":";;;AAgBA;;;;;;;;;;;AAWG;AACH,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,UAA6B,KAAY;IAC1E,MAAM,MAAM,GAAG,kBAAkB,CAAC;IAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACrC,IAAA,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;IAExB,IAAI,IAAI,EAAE;AACN,QAAA,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACrD,QAAA,MAAM,YAAY,GAAG,KAAK,GAAG,EAAE,GAAG,OAAO,CAAC;AAC1C,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;AAC1E,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;AAC1D,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7D,QAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACtE,QAAA,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,CAAG,EAAA,cAAc,CAAI,CAAA,EAAA,gBAAgB,CAAE,CAAA,CAAC,CAAC;KAC5E;AAED,IAAA,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF;AACA,MAAM,sBAAsB,GACxB,CAAC,OAAgB,EAAE,QAA4B,KAC/C,CAAC,KAAK,KACF,OAAO,IAAI,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,GAAG,KAAK,CAAC;AAE5F;AACA,MAAM,0BAA0B,GAAG,CAAC,IAA4B,KAAyB;IACrF,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAE/B,IAAA,OAAO,CAAC,KAAK,EAAE,UAAU,KAAI;AACzB,QAAA,IAAI,UAAU,KAAK,QAAQ,EAAE;YACzB,kBAAkB,GAAG,IAAI,CAAC;AAC1B,YAAA,OAAO,KAAK,CAAC;SAChB;AAED,QAAA,MAAM,eAAe,GAAG,UAAU,KAAK,YAAY,IAAI,kBAAkB,CAAC;QAC1E,kBAAkB,GAAG,KAAK,CAAC;QAE3B,IAAI,eAAe,EAAE;YACjB,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC;AAChD,YAAA,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC;YAC7B,IAAI,QAAQ,GAAG,EAAE,CAAC;YAClB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAElC,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAClC,gBAAA,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE;AACtB,oBAAA,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;iBAC5B;qBAAM,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;AACpC,oBAAA,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;iBACvB;qBAAM;oBACH,MAAM;iBACT;aACJ;YAED,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YAEvD,OAAO;AACH,gBAAA,GAAG,KAAK;AACR,gBAAA,YAAY,EAAE;AACV,oBAAA,KAAK,EAAE,QAAQ;oBACf,SAAS,EAAE,CAAC,IAAI,GAAG,eAAe,EAAE,EAAE,GAAG,eAAe,CAAC;AAC5D,iBAAA;aACJ,CAAC;SACL;AAED,QAAA,OAAO,KAAK,CAAC;AACjB,KAAC,CAAC;AACN,CAAC,CAAC;AAEF;AACA,MAAM,6BAA6B,GAAwB,CAAC,KAAK,EAAE,UAAU,KAAI;AAC7E,IAAA,IAAI,UAAU,KAAK,QAAQ,EAAE;QACzB,OAAO;AACH,YAAA,GAAG,KAAK;YACR,IAAI,EAAE,KAAK,CAAC,IAAI;AACX,iBAAA,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;AAC7B,iBAAA,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC;AAC1B,iBAAA,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;SACrC,CAAC;KACL;AACD,IAAA,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF;AACA,MAAM,yBAAyB,GAAyB,CAAC,KAAK,KAAI;AAC9D,IAAA,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QACrD,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;QACnC,OAAO;AACH,YAAA,GAAG,KAAK;YACR,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;YACnC,SAAS,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;SAChC,CAAC;KACL;AACD,IAAA,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEK,MAAM,eAAe,GAAG,CAC3B,QAAwB,EACxB,QAAkB,EAClB,YAAgC,EAChC,KAAe,KACW;AAC1B,IAAA,MAAM,OAAO,GAAG,OAAO,CAAiB,MAAK;;AAEzC,QAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;YACnB,OAAO;AACH,gBAAA,IAAI,EAAE,gCAAgC;gBACtC,cAAc,EAAE,CAAC,yBAAyB,CAAC;aAC9C,CAAC;SACL;QAED,MAAM,aAAa,GAAG,GAAG,CAAC;QAC1B,MAAM,QAAQ,GAAG,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAoB,CAAC;QAClE,MAAM,cAAc,GAAG,KAAK,CAAC;QAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC;AACzB,QAAA,IAAI,OAAO,GAAmB,EAAE,GAAG,uBAAuB,EAAE,CAAC;AAE7D,QAAA,IAAI,QAAQ,IAAI,QAAQ,EAAE;YACtB,OAAO,GAAG,+BAA+B,CAAC;gBACtC,QAAQ;gBACR,QAAQ;gBACR,aAAa;AAChB,aAAA,CAAC,CAAC;SACN;aAAM,IAAI,QAAQ,EAAE;AACjB,YAAA,OAAO,GAAG,KAAK;kBACT,gCAAgC,CAAC;AAC7B,oBAAA,IAAI,EAAE,QAAQ;oBACd,aAAa;oBACb,cAAc;iBACjB,CAAC;kBACF,2BAA2B,CAAC;AACxB,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,SAAS,EAAE,aAAa;AAC3B,iBAAA,CAAC,CAAC;SACZ;aAAM,IAAI,QAAQ,EAAE;YACjB,OAAO,GAAG,2BAA2B,CAAC;AAClC,gBAAA,IAAI,EAAE,QAAQ;AACjB,aAAA,CAAC,CAAC;SACN;QAED,OAAO;AACH,YAAA,GAAG,OAAO;AACV,YAAA,aAAa,EAAE;gBACX,6BAA6B;AAC7B,gBAAA,IAAI,OAAO,CAAC,aAAa,IAAI,EAAE;AAC/B,gBAAA,0BAA0B,CAAC,OAAO,CAAC,IAA8B,CAAC;AACrE,aAAA;AACD,YAAA,cAAc,EAAE;AACZ,gBAAA,IAAI,OAAO,CAAC,cAAc,IAAI,EAAE;gBAChC,sBAAsB,CAAC,OAAO,CAAC,YAAY,IAAI,QAAQ,CAAC,EAAE,YAAY,CAAC;AAC1E,aAAA;SACJ,CAAC;KACL,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;AAE9C,IAAA,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AACnC;;;;"}
|