fieldsmith 0.1.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/LICENSE +21 -0
- package/README.md +843 -0
- package/assets/fonts/DotGothic16.ttf +0 -0
- package/assets/fonts/OFL.txt +93 -0
- package/dist/cli/exit.js +37 -0
- package/dist/cli/exit.js.map +1 -0
- package/dist/cli/index.js +699 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.js +61 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/progress.js +83 -0
- package/dist/cli/progress.js.map +1 -0
- package/dist/cli/promptInput.js +57 -0
- package/dist/cli/promptInput.js.map +1 -0
- package/dist/cli/schema.js +140 -0
- package/dist/cli/schema.js.map +1 -0
- package/dist/config.js +149 -0
- package/dist/config.js.map +1 -0
- package/dist/icon/emojiFont.js +163 -0
- package/dist/icon/emojiFont.js.map +1 -0
- package/dist/icon/render.js +136 -0
- package/dist/icon/render.js.map +1 -0
- package/dist/kintone/client.js +157 -0
- package/dist/kintone/client.js.map +1 -0
- package/dist/kintone/deploy.js +519 -0
- package/dist/kintone/deploy.js.map +1 -0
- package/dist/kintone/oauth.js +156 -0
- package/dist/kintone/oauth.js.map +1 -0
- package/dist/kintone/tokenStore.js +87 -0
- package/dist/kintone/tokenStore.js.map +1 -0
- package/dist/llm/generate.js +317 -0
- package/dist/llm/generate.js.map +1 -0
- package/dist/llm/prompt.js +142 -0
- package/dist/llm/prompt.js.map +1 -0
- package/dist/spec/appSpec.js +283 -0
- package/dist/spec/appSpec.js.map +1 -0
- package/dist/spec/diff.js +218 -0
- package/dist/spec/diff.js.map +1 -0
- package/dist/spec/fieldSpec.js +353 -0
- package/dist/spec/fieldSpec.js.map +1 -0
- package/dist/spec/fromKintone.js +230 -0
- package/dist/spec/fromKintone.js.map +1 -0
- package/dist/spec/layout.js +215 -0
- package/dist/spec/layout.js.map +1 -0
- package/dist/spec/toKintone.js +170 -0
- package/dist/spec/toKintone.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
import { toAppSpecFromKintone } from "../spec/fromKintone.js";
|
|
2
|
+
import { buildUpdatedLayout, collectLayoutFields, describeRows, ORPHAN_GROUP_CODE, ORPHAN_GROUP_LABEL, regroupLayout, } from "../spec/layout.js";
|
|
3
|
+
import { diffAppSpec } from "../spec/diff.js";
|
|
4
|
+
import { fieldGroups, parseAppSpec, resolveFieldCode, resolveLayout, } from "../spec/appSpec.js";
|
|
5
|
+
import { toAppSettings, toFieldProperties, toKintonePayloads, toViews, } from "../spec/toKintone.js";
|
|
6
|
+
import { backgroundFor, renderIcon } from "../icon/render.js";
|
|
7
|
+
import { apiPathPrefix, KintoneRequestError } from "./client.js";
|
|
8
|
+
/** フィールド追加 API 1 回あたりに送るフィールド数の上限。kintone の上限より十分小さく取る。 */
|
|
9
|
+
export const FIELD_CHUNK_SIZE = 100;
|
|
10
|
+
/** デプロイの途中で失敗したことを、作成済みアプリの ID とともに伝える。 */
|
|
11
|
+
export class DeployError extends Error {
|
|
12
|
+
appId;
|
|
13
|
+
step;
|
|
14
|
+
cause;
|
|
15
|
+
constructor(message, appId, step, cause) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.appId = appId;
|
|
18
|
+
this.step = step;
|
|
19
|
+
this.cause = cause;
|
|
20
|
+
this.name = "DeployError";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* AppSpec を kintone にデプロイする。
|
|
25
|
+
*
|
|
26
|
+
* 「動作テスト環境に変更を積む → 運用環境へ反映する」という kintone の 2 段構えをそのままなぞる:
|
|
27
|
+
* 1. テスト環境にアプリを作成
|
|
28
|
+
* 2. フィールドを追加
|
|
29
|
+
* 3. 一般設定を変更 (指定がある場合)
|
|
30
|
+
* 4. 一覧を変更 (指定がある場合)
|
|
31
|
+
* 5. 運用環境へ反映 (非同期)
|
|
32
|
+
* 6. 反映完了までポーリング
|
|
33
|
+
*
|
|
34
|
+
* 各ステップが返す revision を次の呼び出しに引き回すことで、
|
|
35
|
+
* 同じアプリを別の誰かが同時に編集していた場合に kintone 側で検出させる。
|
|
36
|
+
*/
|
|
37
|
+
export async function deployAppSpec(spec, kintone, options = {}) {
|
|
38
|
+
const payloads = toKintonePayloads(spec);
|
|
39
|
+
const report = options.onProgress ?? (() => { });
|
|
40
|
+
report({ step: "createApp", message: `アプリ「${payloads.appName}」を動作テスト環境に作成します` });
|
|
41
|
+
const created = await createPreviewApp(payloads.appName, kintone, options).catch((error) => {
|
|
42
|
+
throw new DeployError(describe("アプリの作成に失敗しました", error), null, "createApp", error);
|
|
43
|
+
});
|
|
44
|
+
const appId = created.app;
|
|
45
|
+
let revision = created.revision;
|
|
46
|
+
let step = "addFields";
|
|
47
|
+
report({
|
|
48
|
+
step: "createApp",
|
|
49
|
+
message: `アプリ ID ${appId} を作成しました`,
|
|
50
|
+
detail: `revision=${revision}`,
|
|
51
|
+
});
|
|
52
|
+
try {
|
|
53
|
+
step = "addFields";
|
|
54
|
+
const chunks = chunk(payloads.properties, FIELD_CHUNK_SIZE);
|
|
55
|
+
for (const [index, properties] of chunks.entries()) {
|
|
56
|
+
report({
|
|
57
|
+
step: "addFields",
|
|
58
|
+
message: chunks.length === 1
|
|
59
|
+
? `フィールドを ${Object.keys(properties).length} 件追加します`
|
|
60
|
+
: `フィールドを追加します (${index + 1}/${chunks.length})`,
|
|
61
|
+
});
|
|
62
|
+
const result = await kintone.call((client) => client.app.addFormFields({ app: appId, properties, revision }));
|
|
63
|
+
report({
|
|
64
|
+
step: "addFields",
|
|
65
|
+
message: `フィールドを追加しました`,
|
|
66
|
+
detail: `${Object.keys(properties).join(", ")} / revision ${revision} → ${result.revision}`,
|
|
67
|
+
});
|
|
68
|
+
revision = result.revision;
|
|
69
|
+
}
|
|
70
|
+
const layout = resolveLayout(spec);
|
|
71
|
+
if (layout.mode === "grouped") {
|
|
72
|
+
step = "updateLayout";
|
|
73
|
+
report({ step: "updateLayout", message: "フォームの並びを整えています" });
|
|
74
|
+
// 推測で組み立てず、kintone が実際に置いたレイアウトを取得して並べ替える。
|
|
75
|
+
// このAPIは「フォーム上のすべてのフィールド」の指定を求めるため、
|
|
76
|
+
// 実物を起点にするのが最も確実。
|
|
77
|
+
const current = await kintone.call((client) => client.app.getFormLayout({ app: appId, preview: true }));
|
|
78
|
+
const regrouped = regroupLayout(current.layout, {
|
|
79
|
+
maxPerRow: layout.maxPerRow,
|
|
80
|
+
// kintone のレイアウトには group が無いので、AppSpec 側の対応表を渡す。
|
|
81
|
+
groups: fieldGroups(spec),
|
|
82
|
+
});
|
|
83
|
+
const result = await kintone.call((client) => client.app.updateFormLayout({
|
|
84
|
+
app: appId,
|
|
85
|
+
revision,
|
|
86
|
+
layout: regrouped,
|
|
87
|
+
}));
|
|
88
|
+
report({
|
|
89
|
+
step: "updateLayout",
|
|
90
|
+
message: `フォームを ${regrouped.length} 行に整えました`,
|
|
91
|
+
detail: describeRows(regrouped
|
|
92
|
+
.filter((row) => row.type === "ROW")
|
|
93
|
+
.map((row) => row.fields)).join(" / ") + ` / revision ${revision} → ${result.revision}`,
|
|
94
|
+
});
|
|
95
|
+
revision = result.revision;
|
|
96
|
+
}
|
|
97
|
+
// アイコンは fileKey が要るので、一般設定を送る前にアップロードしておく。
|
|
98
|
+
let settings = payloads.settings;
|
|
99
|
+
if (spec.icon !== undefined) {
|
|
100
|
+
step = "uploadIcon";
|
|
101
|
+
const background = spec.iconBackground ?? backgroundFor(spec.name);
|
|
102
|
+
report({
|
|
103
|
+
step: "uploadIcon",
|
|
104
|
+
message: `アイコンを生成しています (${spec.icon})`,
|
|
105
|
+
detail: `背景色 ${background}`,
|
|
106
|
+
});
|
|
107
|
+
const icon = renderIcon({ glyph: spec.icon, background });
|
|
108
|
+
const { fileKey } = await kintone.call((client) => client.file.uploadFile({ file: { name: "app-icon.png", data: icon.png } }));
|
|
109
|
+
report({
|
|
110
|
+
step: "uploadIcon",
|
|
111
|
+
message: `アイコンをアップロードしました (${icon.mode === "emoji" ? "絵文字" : "文字"})`,
|
|
112
|
+
detail: `${Math.round(icon.png.length / 1024)}KB, fileKey=${fileKey}`,
|
|
113
|
+
});
|
|
114
|
+
settings = { ...(settings ?? {}), icon: { type: "FILE", file: { fileKey } } };
|
|
115
|
+
}
|
|
116
|
+
if (settings !== null) {
|
|
117
|
+
step = "updateSettings";
|
|
118
|
+
report({ step: "updateSettings", message: "アプリの一般設定を適用します" });
|
|
119
|
+
const result = await kintone.call((client) => client.app.updateAppSettings({
|
|
120
|
+
app: appId,
|
|
121
|
+
revision,
|
|
122
|
+
...settings,
|
|
123
|
+
}));
|
|
124
|
+
report({
|
|
125
|
+
step: "updateSettings",
|
|
126
|
+
message: "一般設定を適用しました",
|
|
127
|
+
detail: `${Object.keys(settings).join(", ")} / revision ${revision} → ${result.revision}`,
|
|
128
|
+
});
|
|
129
|
+
revision = result.revision;
|
|
130
|
+
}
|
|
131
|
+
if (payloads.views !== null) {
|
|
132
|
+
step = "updateViews";
|
|
133
|
+
report({ step: "updateViews", message: "一覧を設定します" });
|
|
134
|
+
const result = await kintone.call((client) => client.app.updateViews({
|
|
135
|
+
app: appId,
|
|
136
|
+
revision,
|
|
137
|
+
views: payloads.views,
|
|
138
|
+
}));
|
|
139
|
+
report({
|
|
140
|
+
step: "updateViews",
|
|
141
|
+
message: "一覧を設定しました",
|
|
142
|
+
detail: `${Object.keys(payloads.views).join(", ")} / revision ${revision} → ${result.revision}`,
|
|
143
|
+
});
|
|
144
|
+
revision = result.revision;
|
|
145
|
+
}
|
|
146
|
+
step = "deploy";
|
|
147
|
+
report({
|
|
148
|
+
step: "deploy",
|
|
149
|
+
message: "運用環境へ反映します",
|
|
150
|
+
detail: `POST /k/v1/preview/app/deploy.json (app=${appId}, revision=${revision})`,
|
|
151
|
+
});
|
|
152
|
+
await kintone.call((client) => client.app.deployApp({ apps: [{ app: appId, revision }] }));
|
|
153
|
+
step = "polling";
|
|
154
|
+
report({ step: "polling", message: "反映の完了を待っています" });
|
|
155
|
+
await waitForDeployment(appId, kintone, options.polling, report);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
if (error instanceof DeployError)
|
|
159
|
+
throw error;
|
|
160
|
+
if (options.revertOnFailure === true) {
|
|
161
|
+
await revertQuietly(appId, kintone);
|
|
162
|
+
}
|
|
163
|
+
throw new DeployError(`${describe("デプロイに失敗しました", error)}\n` +
|
|
164
|
+
(options.revertOnFailure === true
|
|
165
|
+
? `動作テスト環境の変更を破棄しました (アプリ ID: ${appId})。`
|
|
166
|
+
: `動作テスト環境にアプリ ID ${appId} が残っています。` +
|
|
167
|
+
" 破棄する場合は kintone の画面から、または --revert-on-failure を付けて再実行してください。"), appId, step, error);
|
|
168
|
+
}
|
|
169
|
+
return { appId, revision };
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 動作テスト環境にアプリを作成する。
|
|
173
|
+
*
|
|
174
|
+
* スペースを指定する場合は REST API を直接叩く。
|
|
175
|
+
* `@kintone/rest-api-client` の addApp() は、スペース指定時に
|
|
176
|
+
* デフォルトスレッドを調べるため `GET /k/v1/space.json` を呼ぶが、
|
|
177
|
+
* **この API は OAuth 認証に対応していない** (パスワード認証とセッション認証のみ) ため、
|
|
178
|
+
* OAuth で動く fieldsmith からは使えない。
|
|
179
|
+
*/
|
|
180
|
+
async function createPreviewApp(name, kintone, options) {
|
|
181
|
+
if (options.spaceId === undefined) {
|
|
182
|
+
return await kintone.call((client) => client.app.addApp({ name }));
|
|
183
|
+
}
|
|
184
|
+
const path = `${apiPathPrefix(options.guestSpaceId)}/preview/app.json`;
|
|
185
|
+
try {
|
|
186
|
+
return await kintone.request("POST", path, {
|
|
187
|
+
name,
|
|
188
|
+
space: options.spaceId,
|
|
189
|
+
...(options.threadId === undefined ? {} : { thread: options.threadId }),
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
if (error instanceof KintoneRequestError && options.threadId === undefined) {
|
|
194
|
+
throw new Error(`${error.message}\n` +
|
|
195
|
+
" スレッド ID の指定が必要な可能性があります。--thread <id> を付けて再実行してください。\n" +
|
|
196
|
+
" スレッド ID はスペースを開いたときの URL から読めます: /k/#/space/{スペースID}/thread/{スレッドID}");
|
|
197
|
+
}
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/** 運用環境への反映が完了するまで、指数バックオフで状況を確認し続ける。 */
|
|
202
|
+
export async function waitForDeployment(appId, kintone, options = {}, report = () => { }) {
|
|
203
|
+
const initialDelayMs = options.initialDelayMs ?? 1000;
|
|
204
|
+
const maxDelayMs = options.maxDelayMs ?? 5000;
|
|
205
|
+
const timeoutMs = options.timeoutMs ?? 5 * 60_000;
|
|
206
|
+
const sleep = options.sleep ?? defaultSleep;
|
|
207
|
+
const now = options.now ?? Date.now;
|
|
208
|
+
const startedAt = now();
|
|
209
|
+
let delay = initialDelayMs;
|
|
210
|
+
let attempt = 0;
|
|
211
|
+
for (;;) {
|
|
212
|
+
await sleep(delay);
|
|
213
|
+
attempt += 1;
|
|
214
|
+
const { apps } = await kintone.call((client) => client.app.getDeployStatus({ apps: [appId] }));
|
|
215
|
+
const status = apps.find((entry) => String(entry.app) === String(appId))?.status;
|
|
216
|
+
report({
|
|
217
|
+
step: "polling",
|
|
218
|
+
message: `反映状況: ${status ?? "不明"}`,
|
|
219
|
+
detail: `${attempt} 回目の確認 (${Math.round((now() - startedAt) / 1000)} 秒経過)`,
|
|
220
|
+
});
|
|
221
|
+
if (status === "SUCCESS")
|
|
222
|
+
return;
|
|
223
|
+
if (status === "FAIL") {
|
|
224
|
+
throw new Error(`運用環境への反映に失敗しました (アプリ ID: ${appId}, status: FAIL)`);
|
|
225
|
+
}
|
|
226
|
+
if (status === "CANCEL") {
|
|
227
|
+
throw new Error(`運用環境への反映がキャンセルされました (アプリ ID: ${appId}, status: CANCEL)。` +
|
|
228
|
+
" 同時に反映した別のアプリが失敗した可能性があります。");
|
|
229
|
+
}
|
|
230
|
+
if (now() - startedAt >= timeoutMs) {
|
|
231
|
+
throw new Error(`運用環境への反映が ${Math.round(timeoutMs / 1000)} 秒以内に完了しませんでした (アプリ ID: ${appId})。` +
|
|
232
|
+
" kintone の画面で反映状況を確認してください。");
|
|
233
|
+
}
|
|
234
|
+
delay = Math.min(delay * 2, maxDelayMs);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/** properties を指定件数ずつに分割する。フィールドの並び順は維持する。 */
|
|
238
|
+
export function chunk(properties, size) {
|
|
239
|
+
const entries = Object.entries(properties);
|
|
240
|
+
if (entries.length === 0)
|
|
241
|
+
return [];
|
|
242
|
+
const chunks = [];
|
|
243
|
+
for (let index = 0; index < entries.length; index += size) {
|
|
244
|
+
chunks.push(Object.fromEntries(entries.slice(index, index + size)));
|
|
245
|
+
}
|
|
246
|
+
return chunks;
|
|
247
|
+
}
|
|
248
|
+
async function revertQuietly(appId, kintone) {
|
|
249
|
+
try {
|
|
250
|
+
await kintone.call((client) => client.app.deployApp({ apps: [{ app: appId }], revert: true }));
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
// 破棄自体の失敗で元のエラーを覆い隠さない。アプリ ID は呼び出し元のメッセージに含まれる。
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
function describe(prefix, error) {
|
|
257
|
+
if (!(error instanceof Error))
|
|
258
|
+
return `${prefix}: ${String(error)}`;
|
|
259
|
+
const code = error.code;
|
|
260
|
+
if (code === "CB_OA01") {
|
|
261
|
+
// OAuth のスコープ不足。原文が "Cannot access protected resource" だけで
|
|
262
|
+
// 何が足りないのか分からないため、対処を添える。
|
|
263
|
+
return (`${prefix}: OAuth のスコープが不足しています (CB_OA01)。\n` +
|
|
264
|
+
" `fieldsmith login` を実行して認可をやり直してください。");
|
|
265
|
+
}
|
|
266
|
+
const suffix = typeof code === "string" ? ` [${code}]` : "";
|
|
267
|
+
return `${prefix}: ${error.message}${suffix}`;
|
|
268
|
+
}
|
|
269
|
+
function defaultSleep(ms) {
|
|
270
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* 既存アプリの設定を読み取って AppSpec に戻す。
|
|
274
|
+
*
|
|
275
|
+
* **読み取りしかしない。** kintone を一切変更しないので、いつ実行しても安全。
|
|
276
|
+
* 運用環境の設定を見るため preview は使わない (動作テスト環境に未反映の変更は含めない)。
|
|
277
|
+
*/
|
|
278
|
+
export async function pullApp(appId, kintone, options = {}) {
|
|
279
|
+
const report = options.onProgress ?? (() => { });
|
|
280
|
+
const preview = options.preview !== false;
|
|
281
|
+
report({ step: "createApp", message: `アプリ ${appId} の設定を取得しています` });
|
|
282
|
+
const [settings, form, layout, views] = await Promise.all([
|
|
283
|
+
kintone.call((client) => client.app.getAppSettings({ app: appId, preview })),
|
|
284
|
+
kintone.call((client) => client.app.getFormFields({ app: appId, preview })),
|
|
285
|
+
kintone.call((client) => client.app.getFormLayout({ app: appId, preview })),
|
|
286
|
+
kintone.call((client) => client.app.getViews({ app: appId, preview })),
|
|
287
|
+
]);
|
|
288
|
+
const pulled = toAppSpecFromKintone({
|
|
289
|
+
name: settings.name,
|
|
290
|
+
description: stripHtml(settings.description),
|
|
291
|
+
theme: settings.theme,
|
|
292
|
+
icon: settings.icon,
|
|
293
|
+
properties: form.properties,
|
|
294
|
+
layout: layout.layout,
|
|
295
|
+
views: views.views,
|
|
296
|
+
titleField: settings.titleField,
|
|
297
|
+
settings: settings,
|
|
298
|
+
});
|
|
299
|
+
report({
|
|
300
|
+
step: "createApp",
|
|
301
|
+
message: `「${settings.name}」を AppSpec にしました`,
|
|
302
|
+
detail: `フィールド ${pulled.spec["fields"].length} 件 / 警告 ${pulled.warnings.length} 件`,
|
|
303
|
+
});
|
|
304
|
+
return {
|
|
305
|
+
...pulled,
|
|
306
|
+
appId,
|
|
307
|
+
appName: settings.name,
|
|
308
|
+
hasOrphanGroup: Object.hasOwn(form.properties, ORPHAN_GROUP_CODE),
|
|
309
|
+
parkedCodes: parkedFieldCodes(layout.layout),
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
/** 削除候補グループの中に居るフィールドコード。 */
|
|
313
|
+
function parkedFieldCodes(layout) {
|
|
314
|
+
const group = layout.find((row) => row.type === "GROUP" && row.code === ORPHAN_GROUP_CODE);
|
|
315
|
+
if (group === undefined)
|
|
316
|
+
return [];
|
|
317
|
+
return collectLayoutFields((group.layout ?? [])).map((field) => field.code);
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* kintone のアプリ説明は HTML で返る。
|
|
321
|
+
* AppSpec は素のテキストとして扱うので、タグを落として改行に均す。
|
|
322
|
+
*/
|
|
323
|
+
function stripHtml(html) {
|
|
324
|
+
if (html === undefined || html === "")
|
|
325
|
+
return undefined;
|
|
326
|
+
const text = html
|
|
327
|
+
.replace(/<br\s*\/?>/gi, "\n")
|
|
328
|
+
.replace(/<\/(p|div)>/gi, "\n")
|
|
329
|
+
.replace(/<[^>]+>/g, "")
|
|
330
|
+
.replace(/</g, "<")
|
|
331
|
+
.replace(/>/g, ">")
|
|
332
|
+
.replace(/&/g, "&")
|
|
333
|
+
.replace(/ /g, " ")
|
|
334
|
+
// kintone は全角括弧なども数値文字参照で返す (( など)。
|
|
335
|
+
.replace(/&#x([0-9a-f]+);/gi, (_, hex) => String.fromCodePoint(parseInt(hex, 16)))
|
|
336
|
+
.replace(/&#(\d+);/g, (_, dec) => String.fromCodePoint(Number(dec)))
|
|
337
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
338
|
+
.trim();
|
|
339
|
+
return text === "" ? undefined : text;
|
|
340
|
+
}
|
|
341
|
+
/** 型変更のように、更新では実現できない要求。 */
|
|
342
|
+
export class UnsupportedUpdateError extends Error {
|
|
343
|
+
diff;
|
|
344
|
+
constructor(message, diff) {
|
|
345
|
+
super(message);
|
|
346
|
+
this.diff = diff;
|
|
347
|
+
this.name = "UnsupportedUpdateError";
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* 既存アプリを AppSpec の内容に近づける。
|
|
352
|
+
*
|
|
353
|
+
* **既定では動作テスト環境で止める。** 更新は新規作成と違って壊しうるので、
|
|
354
|
+
* kintone の画面で「変更を確認」してから人が反映を決められるようにする。
|
|
355
|
+
*
|
|
356
|
+
* 目標から消えたフィールドは**削除しない**。畳んだグループに移すだけで、データは残る。
|
|
357
|
+
*/
|
|
358
|
+
export async function updateApp(appId, desired, kintone, options = {}) {
|
|
359
|
+
const report = options.onProgress ?? (() => { });
|
|
360
|
+
const pulled = await pullApp(appId, kintone, { onProgress: report });
|
|
361
|
+
const current = parseAppSpec(pulled.spec);
|
|
362
|
+
const diff = diffAppSpec(current, desired);
|
|
363
|
+
if (diff.retyped.length > 0) {
|
|
364
|
+
// kintone は作成後の型を変えられない。黙って飛ばすと spec と実物がずれる。
|
|
365
|
+
const detail = diff.retyped
|
|
366
|
+
.map((entry) => ` ${entry.code}: ${entry.from} → ${entry.to}`)
|
|
367
|
+
.join("\n");
|
|
368
|
+
throw new UnsupportedUpdateError("kintone は作成後のフィールド型を変更できないため、この AppSpec は適用できません。\n" +
|
|
369
|
+
`${detail}\n` +
|
|
370
|
+
" 別のフィールドコードで新しいフィールドを作り、古い方は AppSpec から外してください" +
|
|
371
|
+
" (外したフィールドは削除候補に移ります。データは残ります)。", diff);
|
|
372
|
+
}
|
|
373
|
+
// 既に削除候補へ移してあるものは、もう動かす必要がない。
|
|
374
|
+
const parked = new Set(pulled.parkedCodes);
|
|
375
|
+
const orphanCodes = diff.orphaned
|
|
376
|
+
.map((entry) => entry.code)
|
|
377
|
+
.filter((code) => !parked.has(code));
|
|
378
|
+
const nothingToDo = diff.added.length === 0 &&
|
|
379
|
+
diff.updated.length === 0 &&
|
|
380
|
+
diff.app.length === 0 &&
|
|
381
|
+
diff.views.added.length === 0 &&
|
|
382
|
+
diff.views.updated.length === 0 &&
|
|
383
|
+
diff.views.removed.length === 0 &&
|
|
384
|
+
!diff.layout.willApply &&
|
|
385
|
+
orphanCodes.length === 0;
|
|
386
|
+
if (nothingToDo) {
|
|
387
|
+
return {
|
|
388
|
+
appId,
|
|
389
|
+
appName: pulled.appName,
|
|
390
|
+
diff,
|
|
391
|
+
revision: "-1",
|
|
392
|
+
deployed: false,
|
|
393
|
+
warnings: pulled.warnings,
|
|
394
|
+
pendingOrphans: [],
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
let revision = "-1";
|
|
398
|
+
const needsOrphanGroup = orphanCodes.length > 0 && !pulled.hasOrphanGroup;
|
|
399
|
+
// 追加するフィールド。削除候補グループもフィールドなので、無ければここで作る。
|
|
400
|
+
const additions = toFieldProperties(diff.added.map((entry) => entry.field));
|
|
401
|
+
if (needsOrphanGroup) {
|
|
402
|
+
additions[ORPHAN_GROUP_CODE] = {
|
|
403
|
+
type: "GROUP",
|
|
404
|
+
code: ORPHAN_GROUP_CODE,
|
|
405
|
+
label: ORPHAN_GROUP_LABEL,
|
|
406
|
+
// 畳んだ状態にして、普段は目に入らないようにする。
|
|
407
|
+
openGroup: false,
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
if (Object.keys(additions).length > 0) {
|
|
411
|
+
report({
|
|
412
|
+
step: "addFields",
|
|
413
|
+
message: `フィールドを ${Object.keys(additions).length} 件追加します`,
|
|
414
|
+
detail: Object.keys(additions).join(", "),
|
|
415
|
+
});
|
|
416
|
+
const result = await kintone.call((client) => client.app.addFormFields({ app: appId, properties: additions }));
|
|
417
|
+
revision = result.revision;
|
|
418
|
+
}
|
|
419
|
+
if (diff.updated.length > 0) {
|
|
420
|
+
// 変わったフィールドだけを送る (この API は部分指定でよい)。
|
|
421
|
+
const properties = toFieldProperties(diff.updated.map((entry) => entry.field));
|
|
422
|
+
report({
|
|
423
|
+
step: "addFields",
|
|
424
|
+
message: `フィールドを ${diff.updated.length} 件変更します`,
|
|
425
|
+
detail: diff.updated.map((entry) => entry.code).join(", "),
|
|
426
|
+
});
|
|
427
|
+
const result = await kintone.call((client) => client.app.updateFormFields({ app: appId, properties, revision }));
|
|
428
|
+
revision = result.revision;
|
|
429
|
+
}
|
|
430
|
+
if (diff.app.length > 0) {
|
|
431
|
+
const settings = toAppSettings(desired);
|
|
432
|
+
if (settings !== null) {
|
|
433
|
+
report({
|
|
434
|
+
step: "updateSettings",
|
|
435
|
+
message: "アプリの設定を変更します",
|
|
436
|
+
detail: diff.app.map((change) => change.key).join(", "),
|
|
437
|
+
});
|
|
438
|
+
const result = await kintone.call((client) => client.app.updateAppSettings({
|
|
439
|
+
app: appId,
|
|
440
|
+
revision,
|
|
441
|
+
name: desired.name,
|
|
442
|
+
...settings,
|
|
443
|
+
}));
|
|
444
|
+
revision = result.revision;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
if (diff.views.added.length + diff.views.updated.length + diff.views.removed.length > 0) {
|
|
448
|
+
report({
|
|
449
|
+
step: "updateViews",
|
|
450
|
+
message: "一覧を変更します",
|
|
451
|
+
detail: `+${diff.views.added.length} ~${diff.views.updated.length} -${diff.views.removed.length}`,
|
|
452
|
+
});
|
|
453
|
+
const result = await kintone.call((client) => client.app.updateViews({
|
|
454
|
+
app: appId,
|
|
455
|
+
revision,
|
|
456
|
+
views: toViews(desired.views ?? []),
|
|
457
|
+
}));
|
|
458
|
+
revision = result.revision;
|
|
459
|
+
}
|
|
460
|
+
if (orphanCodes.length > 0 || diff.layout.willApply) {
|
|
461
|
+
{
|
|
462
|
+
report({
|
|
463
|
+
step: "updateLayout",
|
|
464
|
+
message: orphanCodes.length > 0
|
|
465
|
+
? `${orphanCodes.length} 件のフィールドを削除候補へ移します`
|
|
466
|
+
: "フォームの並びを組み直します",
|
|
467
|
+
detail: orphanCodes.join(", "),
|
|
468
|
+
});
|
|
469
|
+
const layoutNow = await kintone.call((client) => client.app.getFormLayout({ app: appId, preview: true }));
|
|
470
|
+
const layout = buildUpdatedLayout({
|
|
471
|
+
current: layoutNow.layout,
|
|
472
|
+
desired: desired.fields.map((field) => ({
|
|
473
|
+
type: field.type,
|
|
474
|
+
code: resolveFieldCode(field),
|
|
475
|
+
})),
|
|
476
|
+
orphans: orphanCodes,
|
|
477
|
+
regroup: diff.layout.willApply,
|
|
478
|
+
maxPerRow: resolveLayout(desired).maxPerRow,
|
|
479
|
+
groups: fieldGroups(desired),
|
|
480
|
+
});
|
|
481
|
+
const result = await kintone.call((client) => client.app.updateFormLayout({
|
|
482
|
+
app: appId,
|
|
483
|
+
revision,
|
|
484
|
+
layout,
|
|
485
|
+
}));
|
|
486
|
+
revision = result.revision;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
if (options.deploy !== true) {
|
|
490
|
+
report({
|
|
491
|
+
step: "deploy",
|
|
492
|
+
message: "動作テスト環境まで反映しました (運用環境へは反映していません)",
|
|
493
|
+
detail: "kintone の画面で「変更を確認」してから、--deploy を付けて再実行してください",
|
|
494
|
+
});
|
|
495
|
+
return {
|
|
496
|
+
appId,
|
|
497
|
+
appName: pulled.appName,
|
|
498
|
+
diff,
|
|
499
|
+
revision,
|
|
500
|
+
deployed: false,
|
|
501
|
+
warnings: pulled.warnings,
|
|
502
|
+
pendingOrphans: orphanCodes,
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
report({ step: "deploy", message: "運用環境へ反映します", detail: `revision=${revision}` });
|
|
506
|
+
await kintone.call((client) => client.app.deployApp({ apps: [{ app: appId, revision }] }));
|
|
507
|
+
report({ step: "polling", message: "反映の完了を待っています" });
|
|
508
|
+
await waitForDeployment(appId, kintone, options.polling, report);
|
|
509
|
+
return {
|
|
510
|
+
appId,
|
|
511
|
+
appName: pulled.appName,
|
|
512
|
+
diff,
|
|
513
|
+
revision,
|
|
514
|
+
deployed: true,
|
|
515
|
+
warnings: pulled.warnings,
|
|
516
|
+
pendingOrphans: orphanCodes,
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/kintone/deploy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAA0B,MAAM,wBAAwB,CAAC;AACtF,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,GAEd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAA6B,MAAM,iBAAiB,CAAC;AACzE,OAAO,EACL,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,aAAa,GAEd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,OAAO,GAER,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAA6B,MAAM,aAAa,CAAC;AAE5F,2DAA2D;AAC3D,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AA+CpC,2CAA2C;AAC3C,MAAM,OAAO,WAAY,SAAQ,KAAK;IAGzB;IACA;IACS;IAJpB,YACE,OAAe,EACN,KAAoB,EACpB,IAA4B,EACnB,KAAe;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,UAAK,GAAL,KAAK,CAAe;QACpB,SAAI,GAAJ,IAAI,CAAwB;QACnB,UAAK,GAAL,KAAK,CAAU;QAGjC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAa,EACb,OAA6B,EAC7B,UAAyB,EAAE;IAE3B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEhD,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,QAAQ,CAAC,OAAO,iBAAiB,EAAE,CAAC,CAAC;IAEjF,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAC9E,CAAC,KAAc,EAAE,EAAE;QACjB,MAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IACpF,CAAC,CACF,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC;IAC1B,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAChC,IAAI,IAAI,GAA2B,WAAW,CAAC;IAE/C,MAAM,CAAC;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,UAAU,KAAK,UAAU;QAClC,MAAM,EAAE,YAAY,QAAQ,EAAE;KAC/B,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,IAAI,GAAG,WAAW,CAAC;QACnB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAC5D,KAAK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YACnD,MAAM,CAAC;gBACL,IAAI,EAAE,WAAW;gBACjB,OAAO,EACL,MAAM,CAAC,MAAM,KAAK,CAAC;oBACjB,CAAC,CAAC,UAAU,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,SAAS;oBACnD,CAAC,CAAC,gBAAgB,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG;aACpD,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3C,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAC/D,CAAC;YACF,MAAM,CAAC;gBACL,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,cAAc;gBACvB,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,QAAQ,MAAM,MAAM,CAAC,QAAQ,EAAE;aAC5F,CAAC,CAAC;YACH,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC7B,CAAC;QAED,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,GAAG,cAAc,CAAC;YACtB,MAAM,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAE5D,2CAA2C;YAC3C,oCAAoC;YACpC,kBAAkB;YAClB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC5C,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CACxD,CAAC;YACF,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,MAAgC,EAAE;gBACxE,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,iDAAiD;gBACjD,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC;aAC1B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3C,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC;gBAC1B,GAAG,EAAE,KAAK;gBACV,QAAQ;gBACR,MAAM,EAAE,SAAS;aACgD,CAAC,CACrE,CAAC;YACF,MAAM,CAAC;gBACL,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,SAAS,SAAS,CAAC,MAAM,UAAU;gBAC5C,MAAM,EACJ,YAAY,CACV,SAAS;qBACN,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC;qBACnC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAE,GAAoD,CAAC,MAAM,CAAC,CAC9E,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,eAAe,QAAQ,MAAM,MAAM,CAAC,QAAQ,EAAE;aACjE,CAAC,CAAC;YACH,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC7B,CAAC;QAED,2CAA2C;QAC3C,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACjC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,GAAG,YAAY,CAAC;YACpB,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,CAAC;gBACL,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,iBAAiB,IAAI,CAAC,IAAI,GAAG;gBACtC,MAAM,EAAE,OAAO,UAAU,EAAE;aAC5B,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC1D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAChD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAC3E,CAAC;YACF,MAAM,CAAC;gBACL,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,oBAAoB,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG;gBACpE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,OAAO,EAAE;aACtE,CAAC,CAAC;YAEH,QAAQ,GAAG,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAChF,CAAC;QAED,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,IAAI,GAAG,gBAAgB,CAAC;YACxB,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3C,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC;gBAC3B,GAAG,EAAE,KAAK;gBACV,QAAQ;gBACR,GAAG,QAAQ;aACuD,CAAC,CACtE,CAAC;YACF,MAAM,CAAC;gBACL,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,aAAa;gBACtB,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,QAAQ,MAAM,MAAM,CAAC,QAAQ,EAAE;aAC1F,CAAC,CAAC;YACH,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC7B,CAAC;QAED,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC5B,IAAI,GAAG,aAAa,CAAC;YACrB,MAAM,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3C,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;gBACrB,GAAG,EAAE,KAAK;gBACV,QAAQ;gBACR,KAAK,EAAE,QAAQ,CAAC,KAAK;aACuC,CAAC,CAChE,CAAC;YACF,MAAM,CAAC;gBACL,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,WAAW;gBACpB,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,QAAQ,MAAM,MAAM,CAAC,QAAQ,EAAE;aAChG,CAAC,CAAC;YACH,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC7B,CAAC;QAED,IAAI,GAAG,QAAQ,CAAC;QAChB,MAAM,CAAC;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,YAAY;YACrB,MAAM,EAAE,2CAA2C,KAAK,cAAc,QAAQ,GAAG;SAClF,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAE3F,IAAI,GAAG,SAAS,CAAC;QACjB,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;QACrD,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW;YAAE,MAAM,KAAK,CAAC;QAC9C,IAAI,OAAO,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,IAAI,WAAW,CACnB,GAAG,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI;YACnC,CAAC,OAAO,CAAC,eAAe,KAAK,IAAI;gBAC/B,CAAC,CAAC,8BAA8B,KAAK,IAAI;gBACzC,CAAC,CAAC,kBAAkB,KAAK,WAAW;oBAClC,+DAA+D,CAAC,EACtE,KAAK,EACL,IAAI,EACJ,KAAK,CACN,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,gBAAgB,CAC7B,IAAY,EACZ,OAA6B,EAC7B,OAAsB;IAEtB,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC;IACvE,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE;YACzC,IAAI;YACJ,KAAK,EAAE,OAAO,CAAC,OAAO;YACtB,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;SACxE,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,mBAAmB,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,CAAC,OAAO,IAAI;gBAClB,0DAA0D;gBAC1D,wEAAwE,CAC3E,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,yCAAyC;AACzC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAa,EACb,OAA6B,EAC7B,UAA0B,EAAE,EAC5B,SAA6C,GAAG,EAAE,GAAE,CAAC;IAErD,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC;IACtD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,GAAG,MAAM,CAAC;IAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IAEpC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;IACxB,IAAI,KAAK,GAAG,cAAc,CAAC;IAC3B,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,SAAS,CAAC;QACR,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC,CAAC;QAEb,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/F,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;QAEjF,MAAM,CAAC;YACL,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,SAAS,MAAM,IAAI,IAAI,EAAE;YAClC,MAAM,EAAE,GAAG,OAAO,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO;SAC3E,CAAC,CAAC;QAEH,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO;QACjC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,iBAAiB,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,gCAAgC,KAAK,oBAAoB;gBACvD,6BAA6B,CAChC,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,EAAE,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,aAAa,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,2BAA2B,KAAK,IAAI;gBAC3E,6BAA6B,CAChC,CAAC;QACJ,CAAC;QACD,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,KAAK,CACnB,UAAkC,EAClC,IAAY;IAEZ,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,MAAM,GAA6B,EAAE,CAAC;IAC5C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,KAAa,EAAE,OAA6B;IACvE,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjG,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,KAAc;IAC9C,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,GAAG,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAEpE,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;IAChD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,2DAA2D;QAC3D,0BAA0B;QAC1B,OAAO,CACL,GAAG,MAAM,oCAAoC;YAC7C,yCAAyC,CAC1C,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,OAAO,GAAG,MAAM,KAAK,KAAK,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,YAAY,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAcD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,KAAa,EACb,OAA6B,EAC7B,UAWI,EAAE;IAEN,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC;IAE1C,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,KAAK,cAAc,EAAE,CAAC,CAAC;IAEnE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;KACvE,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,oBAAoB,CAAC;QAClC,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC5C,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,IAAI,EAAE,QAAQ,CAAC,IAAqC;QACpD,UAAU,EAAE,IAAI,CAAC,UAA0C;QAC3D,MAAM,EAAE,MAAM,CAAC,MAA8C;QAC7D,KAAK,EAAE,KAAK,CAAC,KAA2D;QACxE,UAAU,EAAE,QAAQ,CAAC,UAAuD;QAC5E,QAAQ,EAAE,QAA8C;KACzD,CAAC,CAAC;IAEH,MAAM,CAAC;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,IAAI,QAAQ,CAAC,IAAI,kBAAkB;QAC5C,MAAM,EAAE,SAAU,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAe,CAAC,MAAM,WAAW,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI;KAClG,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,MAAM;QACT,KAAK;QACL,OAAO,EAAE,QAAQ,CAAC,IAAI;QACtB,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC;QACjE,WAAW,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAgC,CAAC;KACvE,CAAC;AACJ,CAAC;AAED,6BAA6B;AAC7B,SAAS,gBAAgB,CAAC,MAA4B;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CACvB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,IAAK,GAAyB,CAAC,IAAI,KAAK,iBAAiB,CACvF,CAAC;IACF,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,mBAAmB,CAAC,CAAE,KAAkC,CAAC,MAAM,IAAI,EAAE,CAAgB,CAAC,CAAC,GAAG,CAC/F,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CACtB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,IAAwB;IACzC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI;SACd,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;SAC7B,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC;SAC9B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;QACxB,2CAA2C;SAC1C,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;SACzF,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;SAC3E,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,IAAI,EAAE,CAAC;IACV,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED,4BAA4B;AAC5B,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAGpC;IAFX,YACE,OAAe,EACN,IAAa;QAEtB,KAAK,CAAC,OAAO,CAAC,CAAC;QAFN,SAAI,GAAJ,IAAI,CAAS;QAGtB,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAqBD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,KAAa,EACb,OAAgB,EAChB,OAA6B,EAC7B,UAAyB,EAAE;IAE3B,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE3C,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,8CAA8C;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO;aACxB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,EAAE,CAAC;aAChE,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,sBAAsB,CAC9B,qDAAqD;YACnD,GAAG,MAAM,IAAI;YACb,iDAAiD;YACjD,iCAAiC,EACnC,IAAI,CACL,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ;SAC9B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvC,MAAM,WAAW,GACf,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAC/B,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;QACtB,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC;IAE3B,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,KAAK;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI;YACJ,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,cAAc,EAAE,EAAE;SACnB,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;IAE1E,yCAAyC;IACzC,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5E,IAAI,gBAAgB,EAAE,CAAC;QACrB,SAAS,CAAC,iBAAiB,CAAC,GAAG;YAC7B,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,iBAAiB;YACvB,KAAK,EAAE,kBAAkB;YACzB,2BAA2B;YAC3B,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,UAAU,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,SAAS;YACzD,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SAC1C,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3C,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAChE,CAAC;QACF,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC7B,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,oCAAoC;QACpC,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,MAAM,SAAS;YAC/C,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SAC3D,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3C,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAClE,CAAC;QACF,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC7B,CAAC;IAED,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,MAAM,CAAC;gBACL,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,cAAc;gBACvB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;aACxD,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3C,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC;gBAC3B,GAAG,EAAE,KAAK;gBACV,QAAQ;gBACR,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,GAAG,QAAQ;aACuD,CAAC,CACtE,CAAC;YACF,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxF,MAAM,CAAC;YACL,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,UAAU;YACnB,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;SAClG,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3C,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;YACrB,GAAG,EAAE,KAAK;YACV,QAAQ;YACR,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;SACyB,CAAC,CAChE,CAAC;QACF,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC7B,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACpD,CAAC;YACC,MAAM,CAAC;gBACL,IAAI,EAAE,cAAc;gBACpB,OAAO,EACL,WAAW,CAAC,MAAM,GAAG,CAAC;oBACpB,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,oBAAoB;oBAC3C,CAAC,CAAC,gBAAgB;gBACtB,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;aAC/B,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC9C,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CACxD,CAAC;YACF,MAAM,MAAM,GAAG,kBAAkB,CAAC;gBAChC,OAAO,EAAE,SAAS,CAAC,MAAgC;gBACnD,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBACtC,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC;iBAC9B,CAAC,CAAC;gBACH,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBAC9B,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,SAAS;gBAC3C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC;aAC7B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3C,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC;gBAC1B,GAAG,EAAE,KAAK;gBACV,QAAQ;gBACR,MAAM;aAC2D,CAAC,CACrE,CAAC;YACF,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC5B,MAAM,CAAC;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,kCAAkC;YAC3C,MAAM,EAAE,gDAAgD;SACzD,CAAC,CAAC;QACH,OAAO;YACL,KAAK;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI;YACJ,QAAQ;YACR,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,cAAc,EAAE,WAAW;SAC5B,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,QAAQ,EAAE,EAAE,CAAC,CAAC;IAClF,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3F,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;IACrD,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAEjE,OAAO;QACL,KAAK;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI;QACJ,QAAQ;QACR,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,cAAc,EAAE,WAAW;KAC5B,CAAC;AACJ,CAAC"}
|