@effect-app/infra 1.46.2 → 1.47.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/CHANGELOG.md +12 -0
- package/_cjs/api/setupRequest.cjs +1 -1
- package/_cjs/api/setupRequest.cjs.map +1 -1
- package/_cjs/logger/jsonLogger.cjs +2 -1
- package/_cjs/logger/jsonLogger.cjs.map +1 -1
- package/_cjs/services/QueueMaker/service.cjs.map +1 -1
- package/_cjs/services/RepositoryBase.cjs +1 -4
- package/_cjs/services/RepositoryBase.cjs.map +1 -1
- package/_cjs/services/Store/ContextMapContainer.cjs +6 -16
- package/_cjs/services/Store/ContextMapContainer.cjs.map +1 -1
- package/dist/RequestContext.d.ts.map +1 -1
- package/dist/api/internal/RequestContextMiddleware.d.ts +1 -1
- package/dist/api/internal/RequestContextMiddleware.d.ts.map +1 -1
- package/dist/api/internal/events.d.ts +1 -1
- package/dist/api/internal/events.d.ts.map +1 -1
- package/dist/api/setupRequest.d.ts +2 -3
- package/dist/api/setupRequest.d.ts.map +1 -1
- package/dist/api/setupRequest.js +3 -3
- package/dist/logger/jsonLogger.d.ts.map +1 -1
- package/dist/logger/jsonLogger.js +3 -2
- package/dist/services/QueueMaker/SQLQueue.d.ts +1 -1
- package/dist/services/QueueMaker/memQueue.d.ts +1 -1
- package/dist/services/QueueMaker/sbqueue.d.ts +1 -1
- package/dist/services/QueueMaker/service.d.ts +1 -2
- package/dist/services/QueueMaker/service.d.ts.map +1 -1
- package/dist/services/QueueMaker/service.js +1 -1
- package/dist/services/Repository/ext.d.ts +11 -11
- package/dist/services/RepositoryBase.d.ts +12 -13
- package/dist/services/RepositoryBase.d.ts.map +1 -1
- package/dist/services/RepositoryBase.js +3 -4
- package/dist/services/RequestFiberSet.d.ts +1 -1
- package/dist/services/Store/ContextMapContainer.d.ts +7 -31
- package/dist/services/Store/ContextMapContainer.d.ts.map +1 -1
- package/dist/services/Store/ContextMapContainer.js +6 -21
- package/examples/query.ts +1 -2
- package/package.json +1 -1
- package/src/api/setupRequest.ts +2 -2
- package/src/logger/jsonLogger.ts +2 -1
- package/src/services/QueueMaker/service.ts +1 -2
- package/src/services/RepositoryBase.ts +8 -9
- package/src/services/Store/ContextMapContainer.ts +8 -36
- package/test/dist/query.test.d.ts.map +1 -1
- package/test/query.test.ts +1 -2
- package/vitest.config.ts.timestamp-1711656440838-19c636fe320df.mjs +0 -0
- package/vitest.config.ts.timestamp-1711724061890-6ecedb0a07fdd.mjs +0 -0
- package/vitest.config.ts.timestamp-1711743489537-da8d9e5f66c9f.mjs +0 -0
- package/vitest.config.ts.timestamp-1711744615239-dcf257a844e01.mjs +0 -37
|
@@ -48,7 +48,7 @@ import type { FieldValues } from "../filter/types.js"
|
|
|
48
48
|
import { make as makeQuery } from "./query.js"
|
|
49
49
|
import type { QAll, Query, QueryEnd, QueryProjection, QueryWhere } from "./query.js"
|
|
50
50
|
import * as Q from "./query.js"
|
|
51
|
-
import {
|
|
51
|
+
import { getContextMap } from "./Store/ContextMapContainer.js"
|
|
52
52
|
|
|
53
53
|
export interface Mapped1<A, IdKey extends keyof A, R> {
|
|
54
54
|
all: Effect<A[], ParseResult.ParseError, R>
|
|
@@ -393,8 +393,7 @@ export function makeRepo<
|
|
|
393
393
|
)
|
|
394
394
|
|
|
395
395
|
const store = yield* mkStore(args.makeInitial, args.config)
|
|
396
|
-
const
|
|
397
|
-
const cms = Effect.andThen(get, (_) => ({
|
|
396
|
+
const cms = Effect.andThen(getContextMap.pipe(Effect.orDie), (_) => ({
|
|
398
397
|
get: (id: string) => _.get(`${name}.${id}`),
|
|
399
398
|
set: (id: string, etag: string | undefined) => _.set(`${name}.${id}`, etag)
|
|
400
399
|
}))
|
|
@@ -763,7 +762,7 @@ export interface Repos<
|
|
|
763
762
|
partitionValue?: (a: Encoded) => string
|
|
764
763
|
}
|
|
765
764
|
}
|
|
766
|
-
): Effect<Repository<T, Encoded, Evt, ItemType, IdKey>, E, StoreMaker |
|
|
765
|
+
): Effect<Repository<T, Encoded, Evt, ItemType, IdKey>, E, StoreMaker | R | RInitial | R2>
|
|
767
766
|
makeWith<Out, RInitial = never, E = never, R2 = never>(
|
|
768
767
|
args: [Evt] extends [never] ? {
|
|
769
768
|
makeInitial?: Effect<readonly T[], E, RInitial>
|
|
@@ -779,7 +778,7 @@ export interface Repos<
|
|
|
779
778
|
}
|
|
780
779
|
},
|
|
781
780
|
f: (r: Repository<T, Encoded, Evt, ItemType, IdKey>) => Out
|
|
782
|
-
): Effect<Out, E, StoreMaker |
|
|
781
|
+
): Effect<Out, E, StoreMaker | R | RInitial | R2>
|
|
783
782
|
readonly Q: ReturnType<typeof Q.make<Encoded>>
|
|
784
783
|
readonly type: Repository<T, Encoded, Evt, ItemType, IdKey>
|
|
785
784
|
}
|
|
@@ -1145,14 +1144,14 @@ export const RepositoryDefaultImpl2 = <Service, Evt = never>() => {
|
|
|
1145
1144
|
Service,
|
|
1146
1145
|
E1 | Layer.Layer.Error<Layers[number]>,
|
|
1147
1146
|
Exclude<
|
|
1148
|
-
R1 | R | StoreMaker
|
|
1147
|
+
R1 | R | StoreMaker,
|
|
1149
1148
|
{ [k in keyof Layers]: Layer.Layer.Success<Layers[k]> }[number]
|
|
1150
1149
|
>
|
|
1151
1150
|
>
|
|
1152
1151
|
DefaultWithoutDependencies: Layer.Layer<
|
|
1153
1152
|
Service,
|
|
1154
1153
|
E1,
|
|
1155
|
-
R1 | R | StoreMaker
|
|
1154
|
+
R1 | R | StoreMaker
|
|
1156
1155
|
>
|
|
1157
1156
|
}
|
|
1158
1157
|
& Repos<
|
|
@@ -1221,14 +1220,14 @@ export const RepositoryDefaultImpl2 = <Service, Evt = never>() => {
|
|
|
1221
1220
|
Service,
|
|
1222
1221
|
E1 | Layer.Layer.Error<Layers[number]>,
|
|
1223
1222
|
Exclude<
|
|
1224
|
-
R1 | R | StoreMaker
|
|
1223
|
+
R1 | R | StoreMaker,
|
|
1225
1224
|
{ [k in keyof Layers]: Layer.Layer.Success<Layers[k]> }[number]
|
|
1226
1225
|
>
|
|
1227
1226
|
>
|
|
1228
1227
|
DefaultWithoutDependencies: Layer.Layer<
|
|
1229
1228
|
Service,
|
|
1230
1229
|
E1,
|
|
1231
|
-
R1 | R | StoreMaker
|
|
1230
|
+
R1 | R | StoreMaker
|
|
1232
1231
|
>
|
|
1233
1232
|
}
|
|
1234
1233
|
& Repos<
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Data, Effect, FiberRef } from "effect-app"
|
|
2
2
|
import { ContextMap } from "./service.js"
|
|
3
3
|
|
|
4
4
|
// TODO: we have to create a new contextmap on every request.
|
|
@@ -7,40 +7,12 @@ import { ContextMap } from "./service.js"
|
|
|
7
7
|
// we can call another start after startup. but it would be even better if we could Die on accessing rootmap
|
|
8
8
|
// we could also make the ContextMap optional, and when missing, issue a warning instead?
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
* @tsplus companion ContextMapContainer.Ops
|
|
12
|
-
*/
|
|
13
|
-
export abstract class ContextMapContainer extends Context.TagId("effect-app/ContextMapContainer")<ContextMapContainer, {
|
|
14
|
-
get: Effect<ContextMap>
|
|
15
|
-
start: Effect<void>
|
|
16
|
-
}>() {
|
|
17
|
-
static get getOption() {
|
|
18
|
-
return Effect.flatMap(
|
|
19
|
-
Effect
|
|
20
|
-
.contextWith((_: Context<never>) => Context.getOption(_, ContextMapContainer)),
|
|
21
|
-
(ctx) =>
|
|
22
|
-
Option.isSome(ctx)
|
|
23
|
-
? Effect.map(ctx.value.get, Option.some)
|
|
24
|
-
: Effect.sync(() => Option.none())
|
|
25
|
-
)
|
|
26
|
-
}
|
|
10
|
+
const ContextMapContainer = FiberRef.unsafeMake<ContextMap | "root">("root")
|
|
27
11
|
|
|
28
|
-
|
|
29
|
-
.flatMap(
|
|
30
|
-
ContextMap.make,
|
|
31
|
-
FiberRef.make<ContextMap>
|
|
32
|
-
)
|
|
33
|
-
.pipe(
|
|
34
|
-
Effect
|
|
35
|
-
.map((ref) =>
|
|
36
|
-
ContextMapContainer.of({
|
|
37
|
-
get: FiberRef.get(ref),
|
|
38
|
-
start: Effect.flatMap(ContextMap.make, (_) => FiberRef.set(ref, _))
|
|
39
|
-
})
|
|
40
|
-
),
|
|
41
|
-
Layer.scoped(this)
|
|
42
|
-
)
|
|
43
|
-
}
|
|
12
|
+
export class ContextMapNotStartedError extends Data.TaggedError("ContextMapNotStartedError") {}
|
|
44
13
|
|
|
45
|
-
|
|
46
|
-
|
|
14
|
+
export const getContextMap = FiberRef.get(ContextMapContainer).pipe(
|
|
15
|
+
Effect.filterOrFail((_) => _ !== "root", () => new ContextMapNotStartedError())
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
export const startContextMap = Effect.flatMap(ContextMap.make, (_) => FiberRef.set(ContextMapContainer, _))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.test.d.ts","sourceRoot":"","sources":["../query.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAQ,KAAK,EAAgB,CAAC,EAAU,MAAM,YAAY,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"query.test.d.ts","sourceRoot":"","sources":["../query.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAQ,KAAK,EAAgB,CAAC,EAAU,MAAM,YAAY,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWlF,qBAAa,SAAU,SAAQ,cAK7B;CAAG;AACL,MAAM,CAAC,OAAO,WAAW,SAAS,CAAC;IACjC,UAAiB,OAAQ,SAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,SAAS,CAAC;KAAG;CACvE;;;;;;;;;;;;;;;;;;;;;;;;;AAGD,qBAAa,WAAY,SAAQ,gBAAgE;CAAG"}
|
package/test/query.test.ts
CHANGED
|
@@ -3,7 +3,6 @@ import { inspect } from "util"
|
|
|
3
3
|
import { expect, it } from "vitest"
|
|
4
4
|
import { and, make, one, or, order, page, project, toFilter, where } from "../src/services/query.js"
|
|
5
5
|
import { RepositoryDefaultImpl2 } from "../src/services/RepositoryBase.js"
|
|
6
|
-
import { ContextMapContainer } from "../src/services/Store/ContextMapContainer.js"
|
|
7
6
|
import { memFilter, MemoryStoreLive } from "../src/services/Store/Memory.js"
|
|
8
7
|
|
|
9
8
|
const str = S.Struct({ _tag: S.Literal("string"), value: S.String })
|
|
@@ -91,7 +90,7 @@ class SomethingRepo extends RepositoryDefaultImpl2<SomethingRepo>()(
|
|
|
91
90
|
{ idKey: "id" }
|
|
92
91
|
) {
|
|
93
92
|
static readonly Test = Layer.effect(SomethingRepo, SomethingRepo.makeWith({}, (_) => new SomethingRepo(_))).pipe(
|
|
94
|
-
Layer.provide(
|
|
93
|
+
Layer.provide(MemoryStoreLive)
|
|
95
94
|
)
|
|
96
95
|
}
|
|
97
96
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
// packages/infra/vitest.config.ts
|
|
2
|
-
import { defineConfig } from "file:///Users/patrickroza/pj/effect-app/libs/node_modules/.pnpm/vite@5.2.6_@types+node@20.11.30/node_modules/vite/dist/node/index.js";
|
|
3
|
-
|
|
4
|
-
// vite.config.base.ts
|
|
5
|
-
import path from "path";
|
|
6
|
-
import fs from "fs";
|
|
7
|
-
var __vite_injected_original_dirname = "/Users/patrickroza/pj/effect-app/libs";
|
|
8
|
-
function makeConfig(dirName) {
|
|
9
|
-
const prefix = path.resolve(__vite_injected_original_dirname, "packages");
|
|
10
|
-
const packages = fs.readdirSync(prefix).map((f) => prefix + "/" + f).filter((f) => fs.lstatSync(f).isDirectory());
|
|
11
|
-
const cfg = {
|
|
12
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
13
|
-
//plugins: [autoImport],
|
|
14
|
-
test: {
|
|
15
|
-
include: ["./test/**/*.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
|
|
16
|
-
reporters: "verbose",
|
|
17
|
-
globals: true
|
|
18
|
-
},
|
|
19
|
-
resolve: {
|
|
20
|
-
alias: packages.reduce((acc, cur) => {
|
|
21
|
-
acc[JSON.parse(fs.readFileSync(cur + "/package.json", "utf-8")).name] = path.resolve(cur, cur.endsWith("core") ? "dist" : "src");
|
|
22
|
-
return acc;
|
|
23
|
-
}, {})
|
|
24
|
-
// "@effect-app/core/Prelude": path.join(__dirname, "packages/core/src/Prelude.code.ts")
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
console.log(cfg);
|
|
28
|
-
return cfg;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// packages/infra/vitest.config.ts
|
|
32
|
-
var __vite_injected_original_dirname2 = "/Users/patrickroza/pj/effect-app/libs/packages/infra";
|
|
33
|
-
var vitest_config_default = defineConfig(makeConfig(__vite_injected_original_dirname2));
|
|
34
|
-
export {
|
|
35
|
-
vitest_config_default as default
|
|
36
|
-
};
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsicGFja2FnZXMvaW5mcmEvdml0ZXN0LmNvbmZpZy50cyIsICJ2aXRlLmNvbmZpZy5iYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL3BqL2VmZmVjdC1hcHAvbGlicy9wYWNrYWdlcy9pbmZyYVwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL3BqL2VmZmVjdC1hcHAvbGlicy9wYWNrYWdlcy9pbmZyYS92aXRlc3QuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9wYXRyaWNrcm96YS9wai9lZmZlY3QtYXBwL2xpYnMvcGFja2FnZXMvaW5mcmEvdml0ZXN0LmNvbmZpZy50c1wiOy8vLyA8cmVmZXJlbmNlIHR5cGVzPVwidml0ZXN0XCIgLz5cbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gXCJ2aXRlXCJcbmltcG9ydCBtYWtlQ29uZmlnIGZyb20gXCIuLi8uLi92aXRlLmNvbmZpZy5iYXNlXCJcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKG1ha2VDb25maWcoX19kaXJuYW1lKSlcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL3BqL2VmZmVjdC1hcHAvbGlic1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL3BqL2VmZmVjdC1hcHAvbGlicy92aXRlLmNvbmZpZy5iYXNlLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9wYXRyaWNrcm96YS9wai9lZmZlY3QtYXBwL2xpYnMvdml0ZS5jb25maWcuYmFzZS50c1wiOy8vLyA8cmVmZXJlbmNlIHR5cGVzPVwidml0ZXN0XCIgLz5cbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwiZnNcIlxuaW1wb3J0IEF1dG9JbXBvcnQgZnJvbSBcInVucGx1Z2luLWF1dG8taW1wb3J0L3ZpdGVcIlxuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInZpdGVzdC9jb25maWdcIlxuXG4vLyBjb25zdCBhdXRvSW1wb3J0ID0gQXV0b0ltcG9ydCh7XG4vLyAgIGR0czogXCIuL3Rlc3QvYXV0by1pbXBvcnRzLmQudHNcIixcbi8vICAgLy8gaW5jbHVkZTogW1xuLy8gICAvLyAgIC9cXC50ZXN0XFwuW3RqXXN4PyQvIC8vIC50cywgLnRzeCwgLmpzLCAuanN4XG4vLyAgIC8vIF0sXG4vLyAgIGltcG9ydHM6IFtcbi8vICAgICBcInZpdGVzdFwiXG4vLyAgIF1cbi8vIH0pXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1ha2VDb25maWcoZGlyTmFtZT86IHN0cmluZykge1xuICBjb25zdCBwcmVmaXggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcInBhY2thZ2VzXCIpXG4gIGNvbnN0IHBhY2thZ2VzID0gZnMucmVhZGRpclN5bmMocHJlZml4KS5tYXAoZiA9PiBwcmVmaXggKyBcIi9cIiArIGYpLmZpbHRlcihmID0+IGZzLmxzdGF0U3luYyhmKS5pc0RpcmVjdG9yeSgpIClcbiAgY29uc3QgY2ZnID0ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgLy9wbHVnaW5zOiBbYXV0b0ltcG9ydF0sXG4gICAgdGVzdDoge1xuICAgICAgaW5jbHVkZTogIFtcIi4vdGVzdC8qKi8qLnRlc3Que2pzLG1qcyxjanMsdHMsbXRzLGN0cyxqc3gsdHN4fVwiXSxcbiAgICAgIHJlcG9ydGVyczogXCJ2ZXJib3NlXCIsXG4gICAgICBnbG9iYWxzOiB0cnVlXG4gICAgfSxcbiAgICByZXNvbHZlOiB7XG4gICAgICBhbGlhczogcGFja2FnZXMucmVkdWNlKChhY2MsIGN1cikgPT4geyAvLyB3b3JrYXJvdW5kIGZvciAvUHJlbHVkZSBpc3N1ZVxuICAgICAgYWNjW0pTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGN1ciArIFwiL3BhY2thZ2UuanNvblwiLCBcInV0Zi04XCIpKS5uYW1lXSA9IHBhdGgucmVzb2x2ZShjdXIsIGN1ci5lbmRzV2l0aChcImNvcmVcIikgPyBcImRpc3RcIiA6IFwic3JjXCIpXG4gICAgICByZXR1cm4gYWNjXG4gICAgfSwgeyB9KSAvLyBcIkBlZmZlY3QtYXBwL2NvcmUvUHJlbHVkZVwiOiBwYXRoLmpvaW4oX19kaXJuYW1lLCBcInBhY2thZ2VzL2NvcmUvc3JjL1ByZWx1ZGUuY29kZS50c1wiKVxuICB9XG4gIH1cbiAgY29uc29sZS5sb2coY2ZnKVxuICByZXR1cm4gY2ZnXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQ0EsU0FBUyxvQkFBb0I7OztBQ0E3QixPQUFPLFVBQVU7QUFDakIsT0FBTyxRQUFRO0FBRmYsSUFBTSxtQ0FBbUM7QUFnQjFCLFNBQVIsV0FBNEIsU0FBa0I7QUFDbkQsUUFBTSxTQUFTLEtBQUssUUFBUSxrQ0FBVyxVQUFVO0FBQ2pELFFBQU0sV0FBVyxHQUFHLFlBQVksTUFBTSxFQUFFLElBQUksT0FBSyxTQUFTLE1BQU0sQ0FBQyxFQUFFLE9BQU8sT0FBSyxHQUFHLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBRTtBQUM3RyxRQUFNLE1BQU07QUFBQTtBQUFBO0FBQUEsSUFHVixNQUFNO0FBQUEsTUFDSixTQUFVLENBQUMsa0RBQWtEO0FBQUEsTUFDN0QsV0FBVztBQUFBLE1BQ1gsU0FBUztBQUFBLElBQ1g7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLE9BQU8sU0FBUyxPQUFPLENBQUMsS0FBSyxRQUFRO0FBQ3JDLFlBQUksS0FBSyxNQUFNLEdBQUcsYUFBYSxNQUFNLGlCQUFpQixPQUFPLENBQUMsRUFBRSxJQUFJLElBQUksS0FBSyxRQUFRLEtBQUssSUFBSSxTQUFTLE1BQU0sSUFBSSxTQUFTLEtBQUs7QUFDL0gsZUFBTztBQUFBLE1BQ1QsR0FBRyxDQUFFLENBQUM7QUFBQTtBQUFBLElBQ1I7QUFBQSxFQUNBO0FBQ0EsVUFBUSxJQUFJLEdBQUc7QUFDZixTQUFPO0FBQ1Q7OztBRHBDQSxJQUFNQSxvQ0FBbUM7QUFJekMsSUFBTyx3QkFBUSxhQUFhLFdBQVdDLGlDQUFTLENBQUM7IiwKICAibmFtZXMiOiBbIl9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lIiwgIl9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lIl0KfQo=
|