@effect-app/cli 1.26.3 → 1.26.5
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/CHANGELOG.md +12 -0
- package/dist/gist.d.ts +90 -23
- package/dist/gist.d.ts.map +1 -1
- package/dist/gist.js +220 -100
- package/package.json +3 -3
- package/src/gist.ts +309 -135
- package/test.gists.yaml +15 -7
- package/tsconfig.json +0 -1
package/dist/gist.js
CHANGED
|
@@ -13,6 +13,7 @@ import { RunCommandService } from "./os-command.js";
|
|
|
13
13
|
export class GistEntry extends Schema.Class("GistEntry")({
|
|
14
14
|
description: Schema.String,
|
|
15
15
|
public: Schema.Boolean,
|
|
16
|
+
company: Schema.String,
|
|
16
17
|
files: Schema.Array(Schema.String)
|
|
17
18
|
}) {
|
|
18
19
|
}
|
|
@@ -76,16 +77,26 @@ export class GistEntryDecoded extends GistEntry.transformOrFail("GistEntryDecode
|
|
|
76
77
|
}) {
|
|
77
78
|
}
|
|
78
79
|
export class GistYAML extends Schema.Class("GistYAML")({
|
|
79
|
-
gists: Schema
|
|
80
|
+
gists: Schema
|
|
81
|
+
.Record({
|
|
80
82
|
key: Schema.String,
|
|
81
83
|
value: GistEntryDecoded
|
|
82
|
-
})
|
|
84
|
+
})
|
|
85
|
+
.pipe(Schema.optionalWith({
|
|
86
|
+
default: () => ({}),
|
|
87
|
+
nullable: true,
|
|
88
|
+
exact: true
|
|
89
|
+
})),
|
|
83
90
|
settings: Schema.Struct({
|
|
84
91
|
token_env: Schema.String,
|
|
85
92
|
base_directory: Schema.String
|
|
86
93
|
})
|
|
87
94
|
}) {
|
|
88
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Cache entry representing a gist mapping.
|
|
98
|
+
* Each entry contains the gist's human-readable name and GitHub ID.
|
|
99
|
+
*/
|
|
89
100
|
export class GistCacheEntry extends Schema.Class("GistCacheEntry")({
|
|
90
101
|
name: Schema.String,
|
|
91
102
|
id: Schema.String
|
|
@@ -93,23 +104,27 @@ export class GistCacheEntry extends Schema.Class("GistCacheEntry")({
|
|
|
93
104
|
}
|
|
94
105
|
export const GistCacheEntries = Schema.Array(GistCacheEntry);
|
|
95
106
|
/**
|
|
96
|
-
* Gist cache mapping YAML configuration names to GitHub gist IDs.
|
|
107
|
+
* Gist cache mapping YAML configuration names to GitHub gist IDs with company awareness.
|
|
97
108
|
*
|
|
98
109
|
* Since GitHub gists don't have user-defined names, we maintain a cache
|
|
99
110
|
* that maps the human-readable names from our YAML config to actual gist IDs.
|
|
111
|
+
* Each cache entry is associated with a company, enabling multi-tenant operations.
|
|
100
112
|
* This allows us to:
|
|
101
113
|
* - Update existing gists instead of creating duplicates
|
|
102
114
|
* - Clean up obsolete entries when gists are removed from config
|
|
103
115
|
* - Persist the name->ID mapping across CLI runs
|
|
116
|
+
* - Isolate gist operations by company context
|
|
104
117
|
*
|
|
105
118
|
* The cache itself is stored as a secret GitHub gist for persistence.
|
|
106
119
|
*/
|
|
107
120
|
export class GistCache {
|
|
108
121
|
entries;
|
|
109
122
|
gist_id;
|
|
110
|
-
|
|
123
|
+
company;
|
|
124
|
+
constructor({ company, entries, gist_id }) {
|
|
111
125
|
this.entries = entries;
|
|
112
126
|
this.gist_id = gist_id;
|
|
127
|
+
this.company = company;
|
|
113
128
|
}
|
|
114
129
|
}
|
|
115
130
|
//
|
|
@@ -118,20 +133,20 @@ export class GistCache {
|
|
|
118
133
|
//
|
|
119
134
|
class GistCacheNotFound extends Data.TaggedError("GistCacheNotFound") {
|
|
120
135
|
}
|
|
136
|
+
class GistCacheOfCompanyNotFound extends Data.TaggedError("GistCacheOfCompanyNotFound") {
|
|
137
|
+
}
|
|
121
138
|
class GistYAMLError extends Data.TaggedError("GistYAMLError") {
|
|
122
139
|
}
|
|
123
140
|
//
|
|
124
141
|
//
|
|
125
142
|
// Services
|
|
126
143
|
//
|
|
144
|
+
// @effect-diagnostics-next-line missingEffectServiceDependency:off
|
|
127
145
|
class GHGistService extends Effect.Service()("GHGistService", {
|
|
128
146
|
dependencies: [RunCommandService.Default],
|
|
129
147
|
effect: Effect.gen(function* () {
|
|
130
148
|
const CACHE_GIST_DESCRIPTION = "GIST_CACHE_DO_NOT_EDIT_effa_cli_internal";
|
|
131
149
|
const { runGetExitCode, runGetString } = yield* RunCommandService;
|
|
132
|
-
if ((yield* runGetExitCode("gh --version").pipe(Effect.orDie)) !== 0) {
|
|
133
|
-
return yield* Effect.dieMessage("GitHub CLI (gh) is not installed or not found in PATH. Please install it to use the gist command.");
|
|
134
|
-
}
|
|
135
150
|
// the client cannot recover from PlatformErrors, so we convert failures into defects to clean up the signatures
|
|
136
151
|
const runGetExitCodeSuppressed = (...args) => {
|
|
137
152
|
return runGetExitCode(...args).pipe(Effect.catchAll((e) => Effect.dieMessage(`Command failed: ${args.join(" ")}\nError: ${e.message}`)), Effect.asVoid);
|
|
@@ -150,7 +165,7 @@ class GHGistService extends Effect.Service()("GHGistService", {
|
|
|
150
165
|
return gist_id && gist_id.length > 0 ? Option.some(gist_id) : Option.none();
|
|
151
166
|
}
|
|
152
167
|
const loadGistCache = Effect
|
|
153
|
-
.fn("effa-cli.gist.loadGistCache")(function* () {
|
|
168
|
+
.fn("effa-cli.gist.loadGistCache")(function* (company, { recCache = false, recCacheCompany = false } = { recCache: false, recCacheCompany: false }) {
|
|
154
169
|
// search for existing cache gist
|
|
155
170
|
const output = yield* runGetStringSuppressed(`gh gist list --filter "${CACHE_GIST_DESCRIPTION}"`)
|
|
156
171
|
.pipe(Effect.orElse(() => Effect.succeed("")));
|
|
@@ -158,41 +173,56 @@ class GHGistService extends Effect.Service()("GHGistService", {
|
|
|
158
173
|
// extract first gist ID (should be our cache gist)
|
|
159
174
|
const firstLine = lines[0];
|
|
160
175
|
if (!firstLine) {
|
|
161
|
-
return yield* new GistCacheNotFound({
|
|
176
|
+
return yield* new GistCacheNotFound({ message: "Empty gist list output" });
|
|
162
177
|
}
|
|
163
178
|
const parts = firstLine.split(/\s+/);
|
|
164
179
|
const gist_id = parts[0]?.trim();
|
|
165
180
|
if (!gist_id) {
|
|
166
|
-
|
|
181
|
+
if (recCache) {
|
|
182
|
+
return yield* Effect.dieMessage("Failed to create or locate cache gist after creation attempt");
|
|
183
|
+
}
|
|
184
|
+
return yield* new GistCacheNotFound({ message: "No gist ID found in output" });
|
|
167
185
|
}
|
|
168
186
|
else {
|
|
169
187
|
yield* Effect.logInfo(`Found existing cache gist with ID ${gist_id}`);
|
|
170
188
|
}
|
|
171
|
-
// read cache
|
|
172
|
-
const
|
|
173
|
-
.
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
189
|
+
// read company-specific cache file
|
|
190
|
+
const filesInCache = yield* runGetStringSuppressed(`gh gist view ${gist_id} --files`).pipe(Effect.map((files) => files
|
|
191
|
+
.trim()
|
|
192
|
+
.split("\n")
|
|
193
|
+
.map((f) => f.trim())));
|
|
194
|
+
if (!filesInCache.includes(`${company}.json`)) {
|
|
195
|
+
if (recCacheCompany) {
|
|
196
|
+
return yield* Effect.dieMessage(`Failed to create or locate cache entry for company ${company} after creation attempt`);
|
|
197
|
+
}
|
|
198
|
+
return yield* new GistCacheOfCompanyNotFound({
|
|
199
|
+
message: `Cache gist not found of company ${company}`,
|
|
200
|
+
cache_gist_id: gist_id
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
const cacheContent = yield* runGetStringSuppressed(`gh gist view ${gist_id} -f "${company}.json"`);
|
|
205
|
+
const entries = yield* pipe(cacheContent, pipe(Schema.parseJson(GistCacheEntries), Schema.decodeUnknown), Effect.orDie);
|
|
206
|
+
return new GistCache({ entries, gist_id, company });
|
|
207
|
+
}
|
|
208
|
+
}, (_, company) => _.pipe(Effect.catchTag("GistCacheNotFound", () => Effect.gen(function* () {
|
|
178
209
|
yield* Effect.logInfo("Cache gist not found, creating new cache...");
|
|
179
|
-
|
|
180
|
-
//
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
})
|
|
187
|
-
|
|
188
|
-
})), Effect.map(({ entries, gist_id }) => new GistCache({ entries, gist_id })));
|
|
210
|
+
yield* runGetStringSuppressed(`echo "do_not_delete" | gh gist create --desc="${CACHE_GIST_DESCRIPTION}" -f effa-gist.cache -`);
|
|
211
|
+
// retry loading the cache after creating it
|
|
212
|
+
return yield* loadGistCache(company, { recCache: true });
|
|
213
|
+
}))), (_, company) => _.pipe(Effect.catchTag("GistCacheOfCompanyNotFound", (e) => Effect.gen(function* () {
|
|
214
|
+
yield* Effect.logInfo(`Cache for company ${company} not found, creating company-specific cache file...`);
|
|
215
|
+
yield* runGetStringSuppressed(`echo "[]" | gh gist edit ${e.cache_gist_id} -a ${company}.json -`);
|
|
216
|
+
// retry loading the cache after creating it
|
|
217
|
+
return yield* loadGistCache(company, { recCacheCompany: true });
|
|
218
|
+
}))));
|
|
189
219
|
const saveGistCache = Effect.fn("effa-cli.gist.saveGistCache")(function* (cache) {
|
|
190
220
|
const cacheJson = yield* pipe(cache.entries, pipe(Schema.parseJson(GistCacheEntries), Schema.encodeUnknown),
|
|
191
221
|
// cannot recover from parse errors in any case, better to die here instead of cluttering the signature
|
|
192
222
|
Effect.orDie);
|
|
193
|
-
yield* runGetExitCodeSuppressed(`echo '${cacheJson}' | gh gist edit ${cache.gist_id} -`);
|
|
223
|
+
yield* runGetExitCodeSuppressed(`echo '${cacheJson}' | gh gist edit ${cache.gist_id} -f ${cache.company}.json -`);
|
|
194
224
|
});
|
|
195
|
-
const createGistWithFiles = Effect.fn("GHGistService.createGistWithFiles")(function* ({
|
|
225
|
+
const createGistWithFiles = Effect.fn("GHGistService.createGistWithFiles")(function* ({ description, env, files, gist_name, is_public }) {
|
|
196
226
|
yield* Effect.logInfo(`Creating gist ${gist_name} with ${files.length} file(s)`);
|
|
197
227
|
const ghCommand = [
|
|
198
228
|
"gh",
|
|
@@ -200,63 +230,106 @@ class GHGistService extends Effect.Service()("GHGistService", {
|
|
|
200
230
|
"create",
|
|
201
231
|
`--desc="${description}"`,
|
|
202
232
|
is_public ? "--public" : "",
|
|
203
|
-
...files.map((
|
|
233
|
+
...files.map((file) => `"${file.path}"`)
|
|
204
234
|
]
|
|
205
235
|
.filter((x) => !!x)
|
|
206
236
|
.join(" ");
|
|
207
237
|
// create and capture the created gist URL
|
|
208
238
|
const gistUrl = yield* runGetStringSuppressed(ghCommand);
|
|
209
239
|
// extract ID from URL
|
|
210
|
-
|
|
240
|
+
const gistNameId = yield* pipe(gistUrl, extractGistIdFromUrl, Option.match({
|
|
211
241
|
onNone: () => Effect.dieMessage(`Failed to extract gist ID from URL: ${gistUrl}`),
|
|
212
242
|
onSome: (id) => Effect
|
|
213
|
-
.succeed(
|
|
214
|
-
gist_id: cache.gist_id,
|
|
215
|
-
entries: [...cache.entries, { name: gist_name, id }]
|
|
216
|
-
}))
|
|
243
|
+
.succeed({ name: gist_name, id })
|
|
217
244
|
.pipe(Effect.tap(Effect.logInfo(`Created gist with ID ${id}`)))
|
|
218
245
|
}));
|
|
246
|
+
// rename all files to include environment prefix for multi-environment support
|
|
247
|
+
for (const file of files) {
|
|
248
|
+
const originalName = file.name;
|
|
249
|
+
const name_with_env = `${env}.${originalName}`;
|
|
250
|
+
const ghRenameCommand = [
|
|
251
|
+
"gh",
|
|
252
|
+
"gist",
|
|
253
|
+
"rename",
|
|
254
|
+
gistNameId.id,
|
|
255
|
+
originalName,
|
|
256
|
+
name_with_env
|
|
257
|
+
]
|
|
258
|
+
.join(" ");
|
|
259
|
+
yield* Effect.logInfo(`Renaming file ${originalName} to ${name_with_env} in gist ${gist_name}`);
|
|
260
|
+
yield* runGetStringSuppressed(ghRenameCommand);
|
|
261
|
+
}
|
|
262
|
+
return gistNameId;
|
|
219
263
|
});
|
|
220
|
-
const getGistFileNames = Effect.fn("getGistFileNames")(function* ({ gist_id, gist_name }) {
|
|
264
|
+
const getGistFileNames = Effect.fn("getGistFileNames")(function* ({ env, gist_id, gist_name }) {
|
|
221
265
|
yield* Effect.logInfo(`Retrieving file names from gist ${gist_name} with ID ${gist_id}`);
|
|
222
266
|
const output = yield* runGetStringSuppressed(`gh gist view ${gist_id} --files`);
|
|
223
|
-
|
|
267
|
+
// filter file names by environment prefix and remove the prefix
|
|
268
|
+
// files in gists are prefixed with "env." to support multiple environments
|
|
269
|
+
return Array.filterMap(output
|
|
224
270
|
.trim()
|
|
225
|
-
.split("\n")
|
|
226
|
-
|
|
271
|
+
.split("\n"), (fn) => {
|
|
272
|
+
const fnTrimmed = fn.trim();
|
|
273
|
+
if (!fnTrimmed.startsWith(env + ".")) {
|
|
274
|
+
return Option.none();
|
|
275
|
+
}
|
|
276
|
+
return Option.some(fnTrimmed.substring(env.length + 1) // remove env prefix and dot
|
|
277
|
+
);
|
|
278
|
+
});
|
|
227
279
|
});
|
|
228
|
-
const removeFileFromGist = Effect.fn("removeFileFromGist")(function* ({ file_name, gist_id, gist_name }) {
|
|
229
|
-
|
|
230
|
-
|
|
280
|
+
const removeFileFromGist = Effect.fn("removeFileFromGist")(function* ({ env, file_name, gist_id, gist_name }) {
|
|
281
|
+
const name_with_env = `${env}.${file_name}`;
|
|
282
|
+
yield* Effect.logInfo(`Removing file ${name_with_env} from gist ${gist_name}`);
|
|
283
|
+
return yield* runGetExitCodeSuppressed(`gh gist edit ${gist_id} --remove "${name_with_env}"`);
|
|
231
284
|
});
|
|
232
|
-
const updateFileOfGist = Effect.fn("updateFileOfGist")(function* ({ file_name, file_path, gist_id, gist_name }) {
|
|
233
|
-
|
|
285
|
+
const updateFileOfGist = Effect.fn("updateFileOfGist")(function* ({ env, file_name, file_path, gist_id, gist_name }) {
|
|
286
|
+
const name_with_env = `${env}.${file_name}`;
|
|
287
|
+
yield* Effect.logInfo(`Updating file ${name_with_env} located at ${file_path} of gist ${gist_name}`);
|
|
288
|
+
// it seems this does not require renaming the file
|
|
234
289
|
const editCommand = [
|
|
235
290
|
"gh",
|
|
236
291
|
"gist",
|
|
237
292
|
"edit",
|
|
238
293
|
gist_id,
|
|
239
294
|
"-f",
|
|
240
|
-
|
|
295
|
+
name_with_env,
|
|
241
296
|
`"${file_path}"`
|
|
242
297
|
]
|
|
243
298
|
.join(" ");
|
|
244
299
|
return yield* runGetExitCodeSuppressed(editCommand);
|
|
245
300
|
});
|
|
246
|
-
const addFileToGist = Effect.fn("addFileToGist")(function* ({
|
|
247
|
-
yield* Effect.logInfo(`Adding file ${
|
|
301
|
+
const addFileToGist = Effect.fn("addFileToGist")(function* ({ env, file, gist_id, gist_name }) {
|
|
302
|
+
yield* Effect.logInfo(`Adding file ${file.path} to gist ${gist_name}`);
|
|
248
303
|
const editCommand = [
|
|
249
304
|
"gh",
|
|
250
305
|
"gist",
|
|
251
306
|
"edit",
|
|
252
307
|
gist_id,
|
|
253
308
|
"-a",
|
|
254
|
-
`"${
|
|
309
|
+
`"${file.path}"`
|
|
255
310
|
]
|
|
256
311
|
.join(" ");
|
|
257
|
-
|
|
312
|
+
yield* runGetExitCodeSuppressed(editCommand);
|
|
313
|
+
const renameCommand = [
|
|
314
|
+
"gh",
|
|
315
|
+
"gist",
|
|
316
|
+
"rename",
|
|
317
|
+
gist_id,
|
|
318
|
+
file.name,
|
|
319
|
+
`${env}.${file.name}`
|
|
320
|
+
]
|
|
321
|
+
.join(" ");
|
|
322
|
+
yield* Effect.logInfo(`Renaming file ${file.name} to ${env}.${file.name} in gist ${gist_name}`);
|
|
323
|
+
return yield* runGetExitCodeSuppressed(renameCommand);
|
|
324
|
+
});
|
|
325
|
+
const deleteGist = Effect.fn("deleteGist")(function* ({ gist_id, gist_name }) {
|
|
326
|
+
yield* Effect.logInfo(`Deleting gist ${gist_name} with ID ${gist_id}`);
|
|
327
|
+
return yield* runGetExitCodeSuppressed(`gh gist delete ${gist_id}`);
|
|
258
328
|
});
|
|
259
329
|
const login = Effect.fn("GHGistService.login")(function* (token) {
|
|
330
|
+
if ((yield* runGetExitCode("gh --version").pipe(Effect.orDie)) !== 0) {
|
|
331
|
+
return yield* Effect.dieMessage("GitHub CLI (gh) is not installed or not found in PATH. Please install it to use the gist command.");
|
|
332
|
+
}
|
|
260
333
|
const isLogged = yield* runGetExitCode(`echo ${token} | gh auth login --with-token`).pipe(Effect.orDie);
|
|
261
334
|
if (isLogged !== 0) {
|
|
262
335
|
return yield* Effect.fail(new Error("Failed to log in to GitHub CLI with provided token"));
|
|
@@ -289,51 +362,67 @@ class GHGistService extends Effect.Service()("GHGistService", {
|
|
|
289
362
|
*/
|
|
290
363
|
saveGistCache,
|
|
291
364
|
/**
|
|
292
|
-
* Creates a new GitHub gist with the specified files and
|
|
293
|
-
* Generates a GitHub CLI command to create the gist
|
|
365
|
+
* Creates a new GitHub gist with the specified files and renames them with environment prefixes.
|
|
366
|
+
* Generates a GitHub CLI command to create the gist, extracts the resulting gist ID,
|
|
367
|
+
* and renames all files with environment prefixes for multi-environment support.
|
|
294
368
|
*
|
|
295
|
-
* @param
|
|
296
|
-
* @param name - The human-readable name for this gist (used in cache mapping)
|
|
369
|
+
* @param gist_name - The human-readable name for this gist (used in cache mapping)
|
|
297
370
|
* @param description - The description for the GitHub gist
|
|
298
|
-
* @param files - Array of file
|
|
371
|
+
* @param files - Array of file objects with path and name properties to include in the gist
|
|
299
372
|
* @param is_public - Whether the gist should be public or private
|
|
300
|
-
* @
|
|
373
|
+
* @param env - Environment prefix to prepend to file names (e.g., "local-dev", "prod")
|
|
374
|
+
* @returns An Effect that yields a gist entry object with name and id properties
|
|
301
375
|
*/
|
|
302
376
|
createGistWithFiles,
|
|
303
377
|
/**
|
|
304
|
-
* Retrieves file names from a GitHub gist.
|
|
305
|
-
* Fetches the list of files contained in the specified gist
|
|
378
|
+
* Retrieves file names from a GitHub gist, filtered by environment prefix.
|
|
379
|
+
* Fetches the list of files contained in the specified gist and returns only
|
|
380
|
+
* those that match the current environment, with the environment prefix removed.
|
|
306
381
|
*
|
|
307
382
|
* @param gist_id - The GitHub gist ID to retrieve file names from
|
|
308
383
|
* @param gist_name - The human-readable name of the gist (for logging purposes)
|
|
309
|
-
* @
|
|
384
|
+
* @param env - Environment prefix to filter files by (e.g., "local-dev", "prod")
|
|
385
|
+
* @returns An Effect that yields an array of file names with environment prefix removed
|
|
310
386
|
*/
|
|
311
387
|
getGistFileNames,
|
|
312
388
|
/**
|
|
313
389
|
* Removes a file from a specified GitHub gist.
|
|
390
|
+
* The file name is automatically prefixed with the environment when removing.
|
|
314
391
|
* @param gist_id - The ID of the gist to modify
|
|
315
392
|
* @param gist_name - The human-readable name of the gist (for logging purposes)
|
|
316
|
-
* @param file_name - The name of the file to remove
|
|
393
|
+
* @param file_name - The base name of the file to remove (without environment prefix)
|
|
394
|
+
* @param env - Environment prefix that was used when the file was added
|
|
317
395
|
* @returns An Effect that succeeds when the file is removed
|
|
318
396
|
*/
|
|
319
397
|
removeFileFromGist,
|
|
320
398
|
/**
|
|
321
399
|
* Updates a file in a specified GitHub gist.
|
|
400
|
+
* The file name is automatically prefixed with the environment when updating.
|
|
322
401
|
* @param gist_id - The ID of the gist to modify
|
|
323
402
|
* @param gist_name - The human-readable name of the gist (for logging purposes)
|
|
324
|
-
* @param file_name - The name of the file to
|
|
403
|
+
* @param file_name - The base name of the file to update (without environment prefix)
|
|
325
404
|
* @param file_path - The local path of the file to update in the gist
|
|
405
|
+
* @param env - Environment prefix that was used when the file was added
|
|
326
406
|
* @returns An Effect that succeeds when the file is updated
|
|
327
407
|
*/
|
|
328
408
|
updateFileOfGist,
|
|
329
409
|
/**
|
|
330
410
|
* Adds a new file to a specified GitHub gist.
|
|
411
|
+
* The file is automatically renamed with an environment prefix for multi-environment support.
|
|
331
412
|
* @param gist_id - The ID of the gist to modify
|
|
332
413
|
* @param gist_name - The human-readable name of the gist (for logging purposes)
|
|
333
|
-
* @param
|
|
334
|
-
* @
|
|
414
|
+
* @param file - The file object containing path and name properties
|
|
415
|
+
* @param env - Environment prefix to prepend to the file name
|
|
416
|
+
* @returns An Effect that succeeds when the file is added and renamed
|
|
335
417
|
*/
|
|
336
|
-
addFileToGist
|
|
418
|
+
addFileToGist,
|
|
419
|
+
/**
|
|
420
|
+
* Deletes a specified GitHub gist by its ID.
|
|
421
|
+
* @param gist_id - The ID of the gist to delete
|
|
422
|
+
* @param gist_name - The human-readable name of the gist (for logging purposes)
|
|
423
|
+
* @returns An Effect that succeeds when the gist is deleted
|
|
424
|
+
*/
|
|
425
|
+
deleteGist
|
|
337
426
|
};
|
|
338
427
|
})
|
|
339
428
|
}) {
|
|
@@ -349,30 +438,40 @@ export class GistHandler extends Effect.Service()("GistHandler", {
|
|
|
349
438
|
const path = yield* Path.Path;
|
|
350
439
|
return {
|
|
351
440
|
handler: Effect.fn("effa-cli.gist.GistHandler")(function* ({ YAMLPath }) {
|
|
441
|
+
// load company and environment from environment variables
|
|
442
|
+
const CONFIG = yield* Effect.all({
|
|
443
|
+
company: Config.string("COMPANY"),
|
|
444
|
+
env: Config.string("ENV").pipe(Config.withDefault("local-dev"))
|
|
445
|
+
});
|
|
446
|
+
yield* Effect.logInfo(`Company: ${CONFIG.company}, ENV: ${CONFIG.env}`);
|
|
352
447
|
yield* Effect.logInfo(`Reading configuration from ${YAMLPath}`);
|
|
353
448
|
const configExists = yield* fs.exists(YAMLPath);
|
|
354
449
|
if (!configExists) {
|
|
355
450
|
return yield* Effect.fail(new Error(`Configuration file not found: ${YAMLPath}`));
|
|
356
451
|
}
|
|
357
|
-
const
|
|
452
|
+
const configFromYaml = yield* pipe(YAMLPath, fs.readFileString, Effect.andThen((content) => Effect.try({
|
|
358
453
|
try: () => yaml.load(content),
|
|
359
454
|
catch(error) {
|
|
360
|
-
return new GistYAMLError({
|
|
455
|
+
return new GistYAMLError({ message: `Failed to parse YAML: ${error.message}` });
|
|
361
456
|
}
|
|
362
457
|
})), Effect.andThen(Schema.decodeUnknown(GistYAML)));
|
|
363
458
|
// load GitHub token securely from environment variable
|
|
364
|
-
const redactedToken = yield* Config.redacted(
|
|
365
|
-
yield* Effect.logInfo(`Using GitHub token from environment variable: ${
|
|
459
|
+
const redactedToken = yield* Config.redacted(configFromYaml.settings.token_env);
|
|
460
|
+
yield* Effect.logInfo(`Using GitHub token from environment variable: ${configFromYaml.settings.token_env}`);
|
|
366
461
|
yield* Effect.logInfo(`Token loaded: ${redactedToken}`); // this will show <redacted> in logs
|
|
367
462
|
yield* GH.login(Redacted.value(redactedToken));
|
|
368
|
-
const cache = yield* SynchronizedRef.make(yield* GH.loadGistCache());
|
|
369
|
-
//
|
|
370
|
-
|
|
463
|
+
const cache = yield* SynchronizedRef.make(yield* GH.loadGistCache(CONFIG.company));
|
|
464
|
+
// filter YAML gists by company to ensure isolation between different organizations
|
|
465
|
+
// this prevents cross-company gist operations and maintains data separation
|
|
466
|
+
const thisCompanyGistsFromYaml = Object
|
|
467
|
+
.entries(configFromYaml.gists)
|
|
468
|
+
.filter(([, v]) => v.company === CONFIG.company);
|
|
469
|
+
for (const [name, gistConfig] of thisCompanyGistsFromYaml) {
|
|
371
470
|
const { description, files_with_name, public: is_public } = gistConfig;
|
|
372
471
|
yield* Effect.logInfo(`Processing gist ${name}`);
|
|
373
472
|
const filesOnDiskWithFullPath = yield* Effect
|
|
374
473
|
.all(files_with_name.map((f) => Effect.gen(function* () {
|
|
375
|
-
const fullPath = path.join(
|
|
474
|
+
const fullPath = path.join(configFromYaml.settings.base_directory, f.path);
|
|
376
475
|
const fileExists = yield* fs.exists(fullPath);
|
|
377
476
|
if (!fileExists) {
|
|
378
477
|
yield* Effect.logWarning(`File not found: ${fullPath}, skipping...`);
|
|
@@ -394,7 +493,8 @@ export class GistHandler extends Effect.Service()("GistHandler", {
|
|
|
394
493
|
// get current files in the gist to detect removed files
|
|
395
494
|
const gistFileNames = new Set(yield* GH.getGistFileNames({
|
|
396
495
|
gist_id: gistFromCache.id,
|
|
397
|
-
gist_name: gistFromCache.name
|
|
496
|
+
gist_name: gistFromCache.name,
|
|
497
|
+
env: CONFIG.env
|
|
398
498
|
}));
|
|
399
499
|
const expectedFiles = new Set(filesOnDiskWithFullPath.map(({ name }) => name));
|
|
400
500
|
// remove files that are no longer in YAML configuration
|
|
@@ -403,7 +503,8 @@ export class GistHandler extends Effect.Service()("GistHandler", {
|
|
|
403
503
|
yield* GH.removeFileFromGist({
|
|
404
504
|
gist_id: gistFromCache.id,
|
|
405
505
|
gist_name: gistFromCache.name,
|
|
406
|
-
file_name: gf
|
|
506
|
+
file_name: gf,
|
|
507
|
+
env: CONFIG.env
|
|
407
508
|
});
|
|
408
509
|
}
|
|
409
510
|
}
|
|
@@ -414,54 +515,73 @@ export class GistHandler extends Effect.Service()("GistHandler", {
|
|
|
414
515
|
gist_id: gistFromCache.id,
|
|
415
516
|
gist_name: gistFromCache.name,
|
|
416
517
|
file_name: f.name,
|
|
417
|
-
file_path: f.path
|
|
518
|
+
file_path: f.path,
|
|
519
|
+
env: CONFIG.env
|
|
418
520
|
});
|
|
419
521
|
}
|
|
420
522
|
else {
|
|
421
523
|
yield* GH.addFileToGist({
|
|
422
524
|
gist_id: gistFromCache.id,
|
|
423
525
|
gist_name: gistFromCache.name,
|
|
424
|
-
|
|
526
|
+
file: f,
|
|
527
|
+
env: CONFIG.env
|
|
425
528
|
});
|
|
426
529
|
}
|
|
427
530
|
}
|
|
428
531
|
}
|
|
429
532
|
else {
|
|
430
533
|
if (filesOnDiskWithFullPath.length !== 0) {
|
|
431
|
-
yield* SynchronizedRef.getAndUpdateEffect(cache, (cache)
|
|
432
|
-
return
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
534
|
+
yield* SynchronizedRef.getAndUpdateEffect(cache, Effect.fnUntraced(function* (cache) {
|
|
535
|
+
return new GistCache({
|
|
536
|
+
gist_id: cache.gist_id,
|
|
537
|
+
entries: [
|
|
538
|
+
...cache.entries,
|
|
539
|
+
{
|
|
540
|
+
...(yield* GH.createGistWithFiles({
|
|
541
|
+
gist_name: name,
|
|
542
|
+
description,
|
|
543
|
+
is_public,
|
|
544
|
+
files: filesOnDiskWithFullPath,
|
|
545
|
+
env: CONFIG.env
|
|
546
|
+
}))
|
|
547
|
+
}
|
|
548
|
+
],
|
|
549
|
+
company: cache.company
|
|
438
550
|
});
|
|
439
|
-
});
|
|
551
|
+
}));
|
|
440
552
|
}
|
|
441
553
|
else {
|
|
442
554
|
yield* Effect.logWarning(`No valid files found for gist ${name}, skipping creation...`);
|
|
443
555
|
}
|
|
444
556
|
}
|
|
445
|
-
// here the local cache has been updated, but not yet saved to GitHub
|
|
446
|
-
// we still want to remove gists from cache that are no longer in the configuration
|
|
447
|
-
const configGistNames = new Set(Object.entries(config.gists).map(([name]) => name));
|
|
448
|
-
const newCache = yield* SynchronizedRef.updateAndGetEffect(cache, Effect.fnUntraced(function* (cache) {
|
|
449
|
-
const newEntries = [...cache.entries];
|
|
450
|
-
for (let i = newEntries.length - 1; i >= 0; i--) {
|
|
451
|
-
const cacheEntry = newEntries[i];
|
|
452
|
-
if (cacheEntry && !configGistNames.has(cacheEntry.name)) {
|
|
453
|
-
yield* Effect.logInfo(`Obsolete gist ${cacheEntry.name} with ID ${cacheEntry.id}) will be removed from cache`);
|
|
454
|
-
newEntries.splice(i, 1);
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
return { ...cache, entries: newEntries };
|
|
458
|
-
}));
|
|
459
|
-
yield* GH.saveGistCache(newCache);
|
|
460
|
-
yield* Effect.logInfo("Gist operations completed");
|
|
461
557
|
}
|
|
558
|
+
// cache cleanup: remove gists that are no longer in YAML configuration
|
|
559
|
+
// only affects entries for the current company to maintain isolation
|
|
560
|
+
const configGistNames = new Set(thisCompanyGistsFromYaml
|
|
561
|
+
.map(([name]) => name));
|
|
562
|
+
const newCache = yield* SynchronizedRef.updateAndGetEffect(cache, Effect.fnUntraced(function* (cache) {
|
|
563
|
+
const newEntries = [...cache.entries];
|
|
564
|
+
// remove obsolete cache entries for current company only
|
|
565
|
+
// this ensures gists from other companies remain untouched
|
|
566
|
+
for (let i = newEntries.length - 1; i >= 0; i--) {
|
|
567
|
+
const cacheEntry = newEntries[i];
|
|
568
|
+
if (cacheEntry && !configGistNames.has(cacheEntry.name)) {
|
|
569
|
+
// delete the actual gist from GitHub
|
|
570
|
+
yield* GH.deleteGist({
|
|
571
|
+
gist_id: cacheEntry.id,
|
|
572
|
+
gist_name: cacheEntry.name
|
|
573
|
+
});
|
|
574
|
+
yield* Effect.logInfo(`Obsolete gist ${cacheEntry.name} of company ${CONFIG.company} with ID ${cacheEntry.id}) will be removed from cache`);
|
|
575
|
+
newEntries.splice(i, 1);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
return { ...cache, entries: newEntries };
|
|
579
|
+
}));
|
|
580
|
+
yield* GH.saveGistCache(newCache);
|
|
581
|
+
yield* Effect.logInfo("Gist operations completed");
|
|
462
582
|
})
|
|
463
583
|
};
|
|
464
584
|
})
|
|
465
585
|
}) {
|
|
466
586
|
}
|
|
467
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9naXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtEQUFrRDtBQUNsRCxxQ0FBcUM7QUFDckMsOENBQThDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFFbkQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUVsSCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQTtBQUMvQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUE7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFFbkQsRUFBRTtBQUNGLEVBQUU7QUFDRixVQUFVO0FBQ1YsRUFBRTtBQUVGLE1BQU0sT0FBTyxTQUFVLFNBQVEsTUFBTSxDQUFDLEtBQUssQ0FBWSxXQUFXLENBQUMsQ0FBQztJQUNsRSxXQUFXLEVBQUUsTUFBTSxDQUFDLE1BQU07SUFDMUIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPO0lBQ3RCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7Q0FDbkMsQ0FBQztDQUFHO0FBRUw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFNBQVMsQ0FBQyxlQUFlLENBQW1CLGtCQUFrQixDQUFDLENBQUM7SUFDcEcsZUFBZSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUMxQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDbkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNO0tBQ3BCLENBQUMsQ0FBQztDQUNK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
|
|
587
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9naXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtEQUFrRDtBQUNsRCxxQ0FBcUM7QUFDckMsOENBQThDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFFbkQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUVsSCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQTtBQUMvQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUE7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFFbkQsRUFBRTtBQUNGLEVBQUU7QUFDRixVQUFVO0FBQ1YsRUFBRTtBQUVGLE1BQU0sT0FBTyxTQUFVLFNBQVEsTUFBTSxDQUFDLEtBQUssQ0FBWSxXQUFXLENBQUMsQ0FBQztJQUNsRSxXQUFXLEVBQUUsTUFBTSxDQUFDLE1BQU07SUFDMUIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPO0lBQ3RCLE9BQU8sRUFBRSxNQUFNLENBQUMsTUFBTTtJQUN0QixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0NBQ25DLENBQUM7Q0FBRztBQUVMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxTQUFTLENBQUMsZUFBZSxDQUFtQixrQkFBa0IsQ0FBQyxDQUFDO0lBQ3BHLGVBQWUsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDMUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ25CLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTTtLQUNwQixDQUFDLENBQUM7Q0FDSixFQUFFO0lBQ0QsTUFBTSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHO1FBQy9DLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELElBQUksRUFBRSxJQUFJO1lBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsK0dBQStHO1NBQzFJLENBQUMsQ0FBQyxDQUFBO1FBRUgsaUNBQWlDO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFBO1FBQzNDLEtBQUssTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksZUFBZSxFQUFFLENBQUM7WUFDdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7WUFDdkIsQ0FBQztZQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ25DLENBQUM7UUFFRCw2Q0FBNkM7UUFDN0MsTUFBTSxVQUFVLEdBQTZCLEVBQUUsQ0FBQTtRQUMvQyxLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDbEQsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNyQixVQUFVLENBQUMsSUFBSSxDQUNiLElBQUksV0FBVyxDQUFDLElBQUksQ0FDbEIsR0FBRyxFQUNILEtBQUssRUFDTCxrQ0FBa0MsUUFBUSx1QkFBdUIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNwRixDQUNGLENBQUE7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELHFEQUFxRDtRQUNyRCxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxPQUFPLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3ZCLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FDdkIsR0FBRyxFQUNILEtBQUssQ0FBQyxLQUFLLEVBQ1gsVUFBVSxDQUNYLENBQ0YsQ0FBQTtRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDM0IsR0FBRyxLQUFLO1lBQ1IsZUFBZTtTQUNoQixDQUFDLENBQUE7SUFDSixDQUFDLENBQUM7SUFDRixNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Q0FDeEUsQ0FBQztDQUFHO0FBRUwsTUFBTSxPQUFPLFFBQVMsU0FBUSxNQUFNLENBQUMsS0FBSyxDQUFXLFVBQVUsQ0FBQyxDQUFDO0lBQy9ELEtBQUssRUFBRSxNQUFNO1NBQ1YsTUFBTSxDQUFDO1FBQ04sR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ2xCLEtBQUssRUFBRSxnQkFBZ0I7S0FDeEIsQ0FBQztTQUNELElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ3hCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuQixRQUFRLEVBQUUsSUFBSTtRQUNkLEtBQUssRUFBRSxJQUFJO0tBQ1osQ0FBQyxDQUFDO0lBQ0wsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDdEIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ3hCLGNBQWMsRUFBRSxNQUFNLENBQUMsTUFBTTtLQUM5QixDQUFDO0NBQ0gsQ0FBQztDQUFHO0FBRUw7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGNBQWUsU0FBUSxNQUFNLENBQUMsS0FBSyxDQUFpQixnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2pGLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTTtJQUNuQixFQUFFLEVBQUUsTUFBTSxDQUFDLE1BQU07Q0FDbEIsQ0FBQztDQUFHO0FBRUwsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtBQUc1RDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxPQUFPLFNBQVM7SUFDcEIsT0FBTyxDQUFrQjtJQUN6QixPQUFPLENBQVE7SUFFZixPQUFPLENBQVE7SUFFZixZQUFZLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQW1FO1FBQ3hHLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO0lBQ3hCLENBQUM7Q0FDRjtBQUVELEVBQUU7QUFDRixFQUFFO0FBQ0YsU0FBUztBQUNULEVBQUU7QUFDRixNQUFNLGlCQUFrQixTQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBRWxFO0NBQUc7QUFFTCxNQUFNLDBCQUEyQixTQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsNEJBQTRCLENBR3BGO0NBQUc7QUFFTCxNQUFNLGFBQWMsU0FBUSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FFMUQ7Q0FBRztBQUVMLEVBQUU7QUFDRixFQUFFO0FBQ0YsV0FBVztBQUNYLEVBQUU7QUFFRixtRUFBbUU7QUFDbkUsTUFBTSxhQUFjLFNBQVEsTUFBTSxDQUFDLE9BQU8sRUFBaUIsQ0FBQyxlQUFlLEVBQUU7SUFDM0UsWUFBWSxFQUFFLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDO0lBQ3pDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUMxQixNQUFNLHNCQUFzQixHQUFHLDBDQUEwQyxDQUFBO1FBQ3pFLE1BQU0sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsaUJBQWlCLENBQUE7UUFFakUsZ0hBQWdIO1FBQ2hILE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxHQUFHLElBQXVDLEVBQUUsRUFBRTtZQUM5RSxPQUFPLGNBQWMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FDakMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUNuRyxNQUFNLENBQUMsTUFBTSxDQUNkLENBQUE7UUFDSCxDQUFDLENBQUE7UUFFRCxnSEFBZ0g7UUFDaEgsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEdBQUcsSUFBcUMsRUFBRSxFQUFFO1lBQzFFLE9BQU8sWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUMvQixNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG1CQUFtQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQ3BHLENBQUE7UUFDSCxDQUFDLENBQUE7UUFFRDs7OztXQUlHO1FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxHQUFXO1lBQ3ZDLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUE7WUFDM0MsT0FBTyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUM3RSxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBR2dELE1BQU07YUFDdEUsRUFBRSxDQUFDLDZCQUE2QixDQUFDLENBQ2hDLFFBQVEsQ0FBQyxFQUNQLE9BQWUsRUFDZixFQUFFLFFBQVEsR0FBRyxLQUFLLEVBQUUsZUFBZSxHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFO1lBRTNGLGlDQUFpQztZQUNqQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQywwQkFBMEIsc0JBQXNCLEdBQUcsQ0FBQztpQkFDOUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFFaEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1lBRTdFLG1EQUFtRDtZQUNuRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDMUIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNmLE9BQU8sS0FBSyxDQUFDLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxDQUFDLENBQUE7WUFDNUUsQ0FBQztZQUVELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDcEMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFBO1lBRWhDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDYixJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNiLE9BQU8sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyw4REFBOEQsQ0FBQyxDQUFBO2dCQUNqRyxDQUFDO2dCQUNELE9BQU8sS0FBSyxDQUFDLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxDQUFDLENBQUE7WUFDaEYsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMscUNBQXFDLE9BQU8sRUFBRSxDQUFDLENBQUE7WUFDdkUsQ0FBQztZQUVELG1DQUFtQztZQUNuQyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsT0FBTyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQ3hGLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNuQixLQUFLO2lCQUNGLElBQUksRUFBRTtpQkFDTixLQUFLLENBQUMsSUFBSSxDQUFDO2lCQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQ3hCLENBQ0YsQ0FBQTtZQUVELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxJQUFJLGVBQWUsRUFBRSxDQUFDO29CQUNwQixPQUFPLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQzdCLHNEQUFzRCxPQUFPLHlCQUF5QixDQUN2RixDQUFBO2dCQUNILENBQUM7Z0JBQ0QsT0FBTyxLQUFLLENBQUMsQ0FBQyxJQUFJLDBCQUEwQixDQUFDO29CQUMzQyxPQUFPLEVBQUUsbUNBQW1DLE9BQU8sRUFBRTtvQkFDckQsYUFBYSxFQUFFLE9BQU87aUJBQ3ZCLENBQUMsQ0FBQTtZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsT0FBTyxRQUFRLE9BQU8sUUFBUSxDQUFDLENBQUE7Z0JBRWxHLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FDekIsWUFBWSxFQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUM5RCxNQUFNLENBQUMsS0FBSyxDQUNiLENBQUE7Z0JBRUQsT0FBTyxJQUFJLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUNyRCxDQUFDO1FBQ0gsQ0FBQyxFQUNELENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQ2IsQ0FBQyxDQUFDLElBQUksQ0FDSixNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxDQUN4QyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUNsQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLDZDQUE2QyxDQUFDLENBQUE7WUFFcEUsS0FBSyxDQUFDLENBQUMsc0JBQXNCLENBQzNCLGlEQUFpRCxzQkFBc0Isd0JBQXdCLENBQ2hHLENBQUE7WUFFRCw0Q0FBNEM7WUFDNUMsT0FBTyxLQUFLLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFDMUQsQ0FBQyxDQUFDLENBQUMsQ0FDTixFQUNILENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQ2IsQ0FBQyxDQUFDLElBQUksQ0FDSixNQUFNLENBQUMsUUFBUSxDQUFDLDRCQUE0QixFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDbEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDbEIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsT0FBTyxxREFBcUQsQ0FBQyxDQUFBO1lBRXhHLEtBQUssQ0FBQyxDQUFDLHNCQUFzQixDQUMzQiw0QkFBNEIsQ0FBQyxDQUFDLGFBQWEsT0FBTyxPQUFPLFNBQVMsQ0FDbkUsQ0FBQTtZQUVELDRDQUE0QztZQUM1QyxPQUFPLEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUNqRSxDQUFDLENBQUMsQ0FBQyxDQUNOLENBQ0osQ0FBQTtRQUVILE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsNkJBQTZCLENBQUMsQ0FDNUQsUUFBUSxDQUFDLEVBQUMsS0FBZ0I7WUFDeEIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUMzQixLQUFLLENBQUMsT0FBTyxFQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQztZQUM5RCx1R0FBdUc7WUFDdkcsTUFBTSxDQUFDLEtBQUssQ0FDYixDQUFBO1lBRUQsS0FBSyxDQUFDLENBQUMsd0JBQXdCLENBQzdCLFNBQVMsU0FBUyxvQkFBb0IsS0FBSyxDQUFDLE9BQU8sT0FBTyxLQUFLLENBQUMsT0FBTyxTQUFTLENBQ2pGLENBQUE7UUFDSCxDQUFDLENBQ0YsQ0FBQTtRQUVELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUN4RSxRQUFRLENBQUMsRUFBQyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBU3hEO1lBQ0MsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsU0FBUyxTQUFTLEtBQUssQ0FBQyxNQUFNLFVBQVUsQ0FBQyxDQUFBO1lBRWhGLE1BQU0sU0FBUyxHQUFHO2dCQUNoQixJQUFJO2dCQUNKLE1BQU07Z0JBQ04sUUFBUTtnQkFDUixXQUFXLFdBQVcsR0FBRztnQkFDekIsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzNCLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUM7YUFDekM7aUJBQ0UsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7WUFFWiwwQ0FBMEM7WUFDMUMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUE7WUFFeEQsc0JBQXNCO1lBQ3RCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FDNUIsT0FBTyxFQUNQLG9CQUFvQixFQUNwQixNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUNYLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLHVDQUF1QyxPQUFPLEVBQUUsQ0FBQztnQkFDakYsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FDYixNQUFNO3FCQUNILE9BQU8sQ0FDTixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQ3hCO3FCQUNBLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNwRSxDQUFDLENBQ0gsQ0FBQTtZQUVELCtFQUErRTtZQUMvRSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFBO2dCQUM5QixNQUFNLGFBQWEsR0FBRyxHQUFHLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtnQkFDOUMsTUFBTSxlQUFlLEdBQUc7b0JBQ3RCLElBQUk7b0JBQ0osTUFBTTtvQkFDTixRQUFRO29CQUNSLFVBQVUsQ0FBQyxFQUFFO29CQUNiLFlBQVk7b0JBQ1osYUFBYTtpQkFDZDtxQkFDRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBRVosS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsWUFBWSxPQUFPLGFBQWEsWUFBWSxTQUFTLEVBQUUsQ0FBQyxDQUFBO2dCQUMvRixLQUFLLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxlQUFlLENBQUMsQ0FBQTtZQUNoRCxDQUFDO1lBRUQsT0FBTyxVQUFVLENBQUE7UUFDbkIsQ0FBQyxDQUNGLENBQUE7UUFFRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FDcEQsUUFBUSxDQUFDLEVBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFJbEM7WUFDQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLG1DQUFtQyxTQUFTLFlBQVksT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUN4RixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsT0FBTyxVQUFVLENBQUMsQ0FBQTtZQUUvRSxnRUFBZ0U7WUFDaEUsMkVBQTJFO1lBQzNFLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FDcEIsTUFBTTtpQkFDSCxJQUFJLEVBQUU7aUJBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUNkLENBQUMsRUFBRSxFQUFFLEVBQUU7Z0JBQ0wsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBO2dCQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDckMsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUE7Z0JBQ3RCLENBQUM7Z0JBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUNoQixTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsNEJBQTRCO2lCQUNqRSxDQUFBO1lBQ0gsQ0FBQyxDQUNGLENBQUE7UUFDSCxDQUFDLENBQ0YsQ0FBQTtRQUVELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUN4RCxRQUFRLENBQUMsRUFBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFLN0M7WUFDQyxNQUFNLGFBQWEsR0FBRyxHQUFHLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQTtZQUMzQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixhQUFhLGNBQWMsU0FBUyxFQUFFLENBQUMsQ0FBQTtZQUM5RSxPQUFPLEtBQUssQ0FBQyxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixPQUFPLGNBQWMsYUFBYSxHQUFHLENBQUMsQ0FBQTtRQUMvRixDQUFDLENBQ0YsQ0FBQTtRQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUNwRCxRQUFRLENBQUMsRUFBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBTXhEO1lBQ0MsTUFBTSxhQUFhLEdBQUcsR0FBRyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUE7WUFDM0MsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsYUFBYSxlQUFlLFNBQVMsWUFBWSxTQUFTLEVBQUUsQ0FBQyxDQUFBO1lBRXBHLG1EQUFtRDtZQUNuRCxNQUFNLFdBQVcsR0FBRztnQkFDbEIsSUFBSTtnQkFDSixNQUFNO2dCQUNOLE1BQU07Z0JBQ04sT0FBTztnQkFDUCxJQUFJO2dCQUNKLGFBQWE7Z0JBQ2IsSUFBSSxTQUFTLEdBQUc7YUFDakI7aUJBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBRVosT0FBTyxLQUFLLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUNyRCxDQUFDLENBQ0YsQ0FBQTtRQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQzlDLFFBQVEsQ0FBQyxFQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQVF4QztZQUNDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxZQUFZLFNBQVMsRUFBRSxDQUFDLENBQUE7WUFDdEUsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCLElBQUk7Z0JBQ0osTUFBTTtnQkFDTixNQUFNO2dCQUNOLE9BQU87Z0JBQ1AsSUFBSTtnQkFDSixJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUc7YUFDakI7aUJBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBRVosS0FBSyxDQUFDLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLENBQUE7WUFFNUMsTUFBTSxhQUFhLEdBQUc7Z0JBQ3BCLElBQUk7Z0JBQ0osTUFBTTtnQkFDTixRQUFRO2dCQUNSLE9BQU87Z0JBQ1AsSUFBSSxDQUFDLElBQUk7Z0JBQ1QsR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTthQUN0QjtpQkFDRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7WUFFWixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxZQUFZLFNBQVMsRUFBRSxDQUFDLENBQUE7WUFDL0YsT0FBTyxLQUFLLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUN2RCxDQUFDLENBQ0YsQ0FBQTtRQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQ3hDLFFBQVEsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBMEM7WUFDdEUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsU0FBUyxZQUFZLE9BQU8sRUFBRSxDQUFDLENBQUE7WUFDdEUsT0FBTyxLQUFLLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxrQkFBa0IsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUNyRSxDQUFDLENBQ0YsQ0FBQTtRQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBQyxLQUFhO1lBQ3BFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNyRSxPQUFPLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQzdCLG1HQUFtRyxDQUNwRyxDQUFBO1lBQ0gsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEtBQUssK0JBQStCLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3ZHLElBQUksUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNuQixPQUFPLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQyxDQUFBO1lBQzVGLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHNDQUFzQyxDQUFDLENBQUE7WUFDL0QsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsT0FBTztZQUNMOzs7OztlQUtHO1lBQ0gsS0FBSztZQUVMOzs7OztlQUtHO1lBQ0gsYUFBYTtZQUViOzs7Ozs7ZUFNRztZQUNILGFBQWE7WUFFYjs7Ozs7Ozs7Ozs7ZUFXRztZQUNILG1CQUFtQjtZQUVuQjs7Ozs7Ozs7O2VBU0c7WUFDSCxnQkFBZ0I7WUFFaEI7Ozs7Ozs7O2VBUUc7WUFDSCxrQkFBa0I7WUFFbEI7Ozs7Ozs7OztlQVNHO1lBQ0gsZ0JBQWdCO1lBRWhCOzs7Ozs7OztlQVFHO1lBQ0gsYUFBYTtZQUViOzs7OztlQUtHO1lBQ0gsVUFBVTtTQUNYLENBQUE7SUFDSCxDQUFDLENBQUM7Q0FDSCxDQUFDO0NBQUc7QUFFTCxtRUFBbUU7QUFDbkUsTUFBTSxPQUFPLFdBQVksU0FBUSxNQUFNLENBQUMsT0FBTyxFQUFlLENBQUMsYUFBYSxFQUFFO0lBQzVFLFNBQVMsRUFBRSxJQUFJO0lBQ2YsWUFBWSxFQUFFLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztJQUNyQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDMUIsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsYUFBYSxDQUFBO1FBRS9CLDZFQUE2RTtRQUM3RSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFBO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUE7UUFFN0IsT0FBTztZQUNMLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLDJCQUEyQixDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUMsRUFBRSxRQUFRLEVBQXdCO2dCQUMxRiwwREFBMEQ7Z0JBQzFELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7b0JBQy9CLE9BQU8sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztvQkFDakMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ2hFLENBQUMsQ0FBQTtnQkFFRixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksTUFBTSxDQUFDLE9BQU8sVUFBVSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtnQkFFdkUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsUUFBUSxFQUFFLENBQUMsQ0FBQTtnQkFFL0QsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDL0MsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUNsQixPQUFPLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsaUNBQWlDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQTtnQkFDbkYsQ0FBQztnQkFFRCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQ2hDLFFBQVEsRUFDUixFQUFFLENBQUMsY0FBYyxFQUNqQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQztvQkFDVCxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7b0JBQzdCLEtBQUssQ0FBQyxLQUFLO3dCQUNULE9BQU8sSUFBSSxhQUFhLENBQUMsRUFBRSxPQUFPLEVBQUUseUJBQTBCLEtBQWUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUE7b0JBQzVGLENBQUM7aUJBQ0YsQ0FBQyxDQUNILEVBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQy9DLENBQUE7Z0JBRUQsdURBQXVEO2dCQUN2RCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBRS9FLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsaURBQWlELGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtnQkFDM0csS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsYUFBYSxFQUFFLENBQUMsQ0FBQSxDQUFDLG9DQUFvQztnQkFFNUYsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7Z0JBRTlDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQVksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtnQkFFN0YsbUZBQW1GO2dCQUNuRiw0RUFBNEU7Z0JBQzVFLE1BQU0sd0JBQXdCLEdBQUcsTUFBTTtxQkFDcEMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7cUJBQzdCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBRWxELEtBQ0UsTUFBTSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSx3QkFBd0IsRUFDcEQsQ0FBQztvQkFDRCxNQUFNLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsVUFBVSxDQUFBO29CQUV0RSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQyxDQUFBO29CQUVoRCxNQUFNLHVCQUF1QixHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU07eUJBQzFDLEdBQUcsQ0FDRixlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7d0JBQ2xCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO3dCQUMxRSxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO3dCQUU3QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7NEJBQ2hCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsbUJBQW1CLFFBQVEsZUFBZSxDQUFDLENBQUE7NEJBQ3BFLE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBO3dCQUN0QixDQUFDO3dCQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQzs0QkFDakIsSUFBSSxFQUFFLFFBQVE7NEJBQ2QsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO3lCQUNiLENBQUMsQ0FBQTtvQkFDSixDQUFDLENBQUMsQ0FDSCxFQUNEO3dCQUNFLFdBQVcsRUFBRSxXQUFXO3FCQUN6QixDQUNGO3lCQUNBLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO29CQUVuQyxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFBO29CQUU5RiwrREFBK0Q7b0JBQy9ELDBEQUEwRDtvQkFDMUQsSUFBSSxhQUFhLEVBQUUsQ0FBQzt3QkFDbEIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsYUFBYSxDQUFDLElBQUksWUFBWSxhQUFhLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTt3QkFFakcsd0RBQXdEO3dCQUN4RCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FDM0IsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDOzRCQUN6QixPQUFPLEVBQUUsYUFBYSxDQUFDLEVBQUU7NEJBQ3pCLFNBQVMsRUFBRSxhQUFhLENBQUMsSUFBSTs0QkFDN0IsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHO3lCQUNoQixDQUFDLENBQ0gsQ0FBQTt3QkFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO3dCQUU5RSx3REFBd0Q7d0JBQ3hELEtBQUssTUFBTSxFQUFFLElBQUksYUFBYSxFQUFFLENBQUM7NEJBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0NBQzNCLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztvQ0FDM0IsT0FBTyxFQUFFLGFBQWEsQ0FBQyxFQUFFO29DQUN6QixTQUFTLEVBQUUsYUFBYSxDQUFDLElBQUk7b0NBQzdCLFNBQVMsRUFBRSxFQUFFO29DQUNiLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztpQ0FDaEIsQ0FBQyxDQUFBOzRCQUNKLENBQUM7d0JBQ0gsQ0FBQzt3QkFFRCxzQ0FBc0M7d0JBQ3RDLEtBQUssTUFBTSxDQUFDLElBQUksdUJBQXVCLEVBQUUsQ0FBQzs0QkFDeEMsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dDQUM5QixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7b0NBQ3pCLE9BQU8sRUFBRSxhQUFhLENBQUMsRUFBRTtvQ0FDekIsU0FBUyxFQUFFLGFBQWEsQ0FBQyxJQUFJO29DQUM3QixTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUk7b0NBQ2pCLFNBQVMsRUFBRSxDQUFDLENBQUMsSUFBSTtvQ0FDakIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHO2lDQUNoQixDQUFDLENBQUE7NEJBQ0osQ0FBQztpQ0FBTSxDQUFDO2dDQUNOLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7b0NBQ3RCLE9BQU8sRUFBRSxhQUFhLENBQUMsRUFBRTtvQ0FDekIsU0FBUyxFQUFFLGFBQWEsQ0FBQyxJQUFJO29DQUM3QixJQUFJLEVBQUUsQ0FBQztvQ0FDUCxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7aUNBQ2hCLENBQUMsQ0FBQTs0QkFDSixDQUFDO3dCQUNILENBQUM7b0JBQ0gsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLElBQUksdUJBQXVCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDOzRCQUN6QyxLQUFLLENBQUMsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQ3ZDLEtBQUssRUFDTCxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFDLEtBQUs7Z0NBQy9CLE9BQU8sSUFBSSxTQUFTLENBQUM7b0NBQ25CLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztvQ0FDdEIsT0FBTyxFQUFFO3dDQUNQLEdBQUcsS0FBSyxDQUFDLE9BQU87d0NBQ2hCOzRDQUNFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUM7Z0RBQ2hDLFNBQVMsRUFBRSxJQUFJO2dEQUNmLFdBQVc7Z0RBQ1gsU0FBUztnREFFVCxLQUFLLEVBQUUsdUJBQXVCO2dEQUM5QixHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7NkNBQ2hCLENBQUMsQ0FBQzt5Q0FDSjtxQ0FDRjtvQ0FDRCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87aUNBQ3ZCLENBQUMsQ0FBQTs0QkFDSixDQUFDLENBQUMsQ0FDSCxDQUFBO3dCQUNILENBQUM7NkJBQU0sQ0FBQzs0QkFDTixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGlDQUFpQyxJQUFJLHdCQUF3QixDQUFDLENBQUE7d0JBQ3pGLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO2dCQUVELHVFQUF1RTtnQkFDdkUscUVBQXFFO2dCQUNyRSxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FDN0Isd0JBQXdCO3FCQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FDekIsQ0FBQTtnQkFFRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQ3hELEtBQUssRUFDTCxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFDLEtBQUs7b0JBQy9CLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7b0JBRXJDLHlEQUF5RDtvQkFDekQsMkRBQTJEO29CQUMzRCxLQUFLLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzt3QkFDaEQsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBO3dCQUNoQyxJQUFJLFVBQVUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7NEJBQ3hELHFDQUFxQzs0QkFDckMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQztnQ0FDbkIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxFQUFFO2dDQUN0QixTQUFTLEVBQUUsVUFBVSxDQUFDLElBQUk7NkJBQzNCLENBQUMsQ0FBQTs0QkFDRixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNuQixpQkFBaUIsVUFBVSxDQUFDLElBQUksZUFBZSxNQUFNLENBQUMsT0FBTyxZQUFZLFVBQVUsQ0FBQyxFQUFFLDhCQUE4QixDQUNySCxDQUFBOzRCQUNELFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO3dCQUN6QixDQUFDO29CQUNILENBQUM7b0JBRUQsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQTtnQkFDMUMsQ0FBQyxDQUFDLENBQ0gsQ0FBQTtnQkFFRCxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUVqQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUE7WUFDcEQsQ0FBQyxDQUFDO1NBQ0gsQ0FBQTtJQUNILENBQUMsQ0FBQztDQUNILENBQUM7Q0FBRyJ9
|