@norskvideo/norsk-studio-alpha 1.27.0-2025-10-01-b3ce62aa → 1.27.0-2025-10-03-0518bc3b

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.
Files changed (44) hide show
  1. package/lib/info.js +6 -8
  2. package/lib/info.js.map +1 -1
  3. package/lib/{output.recorder → output.tams}/_gen/types.d.ts +124 -6
  4. package/lib/{output.player → output.tams}/_gen/types.js.map +1 -1
  5. package/lib/{output.recorder → output.tams}/info.d.ts +3 -3
  6. package/lib/{output.recorder → output.tams}/info.js +18 -11
  7. package/lib/output.tams/info.js.map +1 -0
  8. package/lib/{output.player/summary-view.d.ts → output.tams/inline-view.d.ts} +2 -2
  9. package/lib/output.tams/inline-view.js +36 -0
  10. package/lib/output.tams/inline-view.js.map +1 -0
  11. package/lib/{output.recorder → output.tams}/runtime.d.ts +11 -9
  12. package/lib/{output.recorder → output.tams}/runtime.js +119 -32
  13. package/lib/output.tams/runtime.js.map +1 -0
  14. package/lib/test/{output.recorder.js → output.tams.js} +111 -33
  15. package/lib/test/output.tams.js.map +1 -0
  16. package/package.json +10 -7
  17. package/client/info.js +0 -15459
  18. package/client/processor.audioLevel/styles.css +0 -165
  19. package/client/shared/style.css +0 -1627
  20. package/client/shared/tailwind.css +0 -31
  21. package/client/style.css +0 -1008
  22. package/lib/output.player/_gen/types.d.ts +0 -160
  23. package/lib/output.player/info.d.ts +0 -8
  24. package/lib/output.player/info.js +0 -65
  25. package/lib/output.player/info.js.map +0 -1
  26. package/lib/output.player/runtime.d.ts +0 -42
  27. package/lib/output.player/runtime.js +0 -205
  28. package/lib/output.player/runtime.js.map +0 -1
  29. package/lib/output.player/summary-view.js +0 -20
  30. package/lib/output.player/summary-view.js.map +0 -1
  31. package/lib/output.player/types.yaml +0 -79
  32. package/lib/output.recorder/_gen/types.js +0 -3
  33. package/lib/output.recorder/_gen/types.js.map +0 -1
  34. package/lib/output.recorder/info.js.map +0 -1
  35. package/lib/output.recorder/runtime.js.map +0 -1
  36. package/lib/output.recorder/types.yaml +0 -211
  37. package/lib/processor.actionReplay/types.yaml +0 -78
  38. package/lib/processor.audioLevel/types.yaml +0 -81
  39. package/lib/processor.delayAll/types.yaml +0 -23
  40. package/lib/processor.whisper-transcribe/types.yaml +0 -29
  41. package/lib/test/output.recorder.js.map +0 -1
  42. package/lib/util.timestamps/types.yaml +0 -70
  43. /package/lib/{output.player → output.tams}/_gen/types.js +0 -0
  44. /package/lib/test/{output.recorder.d.ts → output.tams.d.ts} +0 -0
package/lib/info.js CHANGED
@@ -17,18 +17,16 @@ function getNodeInfo(r, type) {
17
17
  }
18
18
  return InitialisedComponents[type];
19
19
  }
20
- const info_1 = __importDefault(require("./output.player/info"));
20
+ const info_1 = __importDefault(require("./output.tams/info"));
21
21
  AllComponents.push((r) => (0, info_1.default)(r));
22
- const info_2 = __importDefault(require("./output.recorder/info"));
22
+ const info_2 = __importDefault(require("./processor.actionReplay/info"));
23
23
  AllComponents.push((r) => (0, info_2.default)(r));
24
- const info_3 = __importDefault(require("./processor.actionReplay/info"));
24
+ const info_3 = __importDefault(require("./processor.audioLevel/info"));
25
25
  AllComponents.push((r) => (0, info_3.default)(r));
26
- const info_4 = __importDefault(require("./processor.audioLevel/info"));
26
+ const info_4 = __importDefault(require("./processor.delayAll/info"));
27
27
  AllComponents.push((r) => (0, info_4.default)(r));
28
- const info_5 = __importDefault(require("./processor.delayAll/info"));
28
+ const info_5 = __importDefault(require("./processor.whisper-transcribe/info"));
29
29
  AllComponents.push((r) => (0, info_5.default)(r));
30
- const info_6 = __importDefault(require("./processor.whisper-transcribe/info"));
30
+ const info_6 = __importDefault(require("./util.timestamps/info"));
31
31
  AllComponents.push((r) => (0, info_6.default)(r));
32
- const info_7 = __importDefault(require("./util.timestamps/info"));
33
- AllComponents.push((r) => (0, info_7.default)(r));
34
32
  //# sourceMappingURL=info.js.map
package/lib/info.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"info.js","sourceRoot":"","sources":["../src/info.ts"],"names":[],"mappings":";;;;;AAYA,8BASC;AAdD,MAAM,qBAAqB,GAA4C,EAAE,CAAC;AAC1E,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,MAAM,aAAa,GAAkD,EAAE,CAAC;AAExE,SAAwB,WAAW,CAAC,CAAe,EAAE,IAAY;IAC/D,IAAG,CAAC,WAAW,EAAE,CAAC;QAChB,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACf,qBAAqB,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAA;QACF,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;IACD,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,gEAAiD;AACjD,aAAa,CAAC,IAAI,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,IAAA,cAAa,EAAC,CAAC,CAAoC,CAAC,CAAC;AAC7F,kEAAqD;AACrD,aAAa,CAAC,IAAI,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,IAAA,cAAe,EAAC,CAAC,CAAoC,CAAC,CAAC;AAC/F,yEAAmE;AACnE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,IAAA,cAAsB,EAAC,CAAC,CAAoC,CAAC,CAAC;AACtG,uEAA+D;AAC/D,aAAa,CAAC,IAAI,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,IAAA,cAAoB,EAAC,CAAC,CAAoC,CAAC,CAAC;AACpG,qEAA2D;AAC3D,aAAa,CAAC,IAAI,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,IAAA,cAAkB,EAAC,CAAC,CAAoC,CAAC,CAAC;AAClG,+EAA+E;AAC/E,aAAa,CAAC,IAAI,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,IAAA,cAA4B,EAAC,CAAC,CAAoC,CAAC,CAAC;AAC5G,kEAAqD;AACrD,aAAa,CAAC,IAAI,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,IAAA,cAAe,EAAC,CAAC,CAAoC,CAAC,CAAC"}
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../src/info.ts"],"names":[],"mappings":";;;;;AAYA,8BASC;AAdD,MAAM,qBAAqB,GAA4C,EAAE,CAAC;AAC1E,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,MAAM,aAAa,GAAkD,EAAE,CAAC;AAExE,SAAwB,WAAW,CAAC,CAAe,EAAE,IAAY;IAC/D,IAAG,CAAC,WAAW,EAAE,CAAC;QAChB,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACf,qBAAqB,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAA;QACF,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;IACD,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,8DAA6C;AAC7C,aAAa,CAAC,IAAI,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,IAAA,cAAW,EAAC,CAAC,CAAoC,CAAC,CAAC;AAC3F,yEAAmE;AACnE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,IAAA,cAAsB,EAAC,CAAC,CAAoC,CAAC,CAAC;AACtG,uEAA+D;AAC/D,aAAa,CAAC,IAAI,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,IAAA,cAAoB,EAAC,CAAC,CAAoC,CAAC,CAAC;AACpG,qEAA2D;AAC3D,aAAa,CAAC,IAAI,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,IAAA,cAAkB,EAAC,CAAC,CAAoC,CAAC,CAAC;AAClG,+EAA+E;AAC/E,aAAa,CAAC,IAAI,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,IAAA,cAA4B,EAAC,CAAC,CAAoC,CAAC,CAAC;AAC5G,kEAAqD;AACrD,aAAa,CAAC,IAAI,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,IAAA,cAAe,EAAC,CAAC,CAAoC,CAAC,CAAC"}
@@ -21,9 +21,50 @@ export interface paths {
21
21
  };
22
22
  content: {
23
23
  "application/json": {
24
- start: string;
25
- duration_s: number;
26
- }[];
24
+ active?: {
25
+ audio: {
26
+ startIso: string;
27
+ durationMs: number;
28
+ streamNum?: number;
29
+ versionNum: number;
30
+ tamsId?: string;
31
+ active: boolean;
32
+ };
33
+ video: {
34
+ startIso: string;
35
+ durationMs: number;
36
+ streamNum?: number;
37
+ versionNum: number;
38
+ tamsId?: string;
39
+ active: boolean;
40
+ };
41
+ sessionNum: number;
42
+ };
43
+ sessions: {
44
+ audio: {
45
+ startIso: string;
46
+ durationMs: number;
47
+ streamNum?: number;
48
+ versionNum: number;
49
+ tamsId?: string;
50
+ active: boolean;
51
+ };
52
+ video: {
53
+ startIso: string;
54
+ durationMs: number;
55
+ streamNum?: number;
56
+ versionNum: number;
57
+ tamsId?: string;
58
+ active: boolean;
59
+ };
60
+ sessionNum: number;
61
+ }[];
62
+ cuts: {
63
+ id: number;
64
+ percent: number;
65
+ createdMs: number;
66
+ }[];
67
+ };
27
68
  };
28
69
  };
29
70
  };
@@ -204,11 +245,88 @@ export interface components {
204
245
  RecorderSettings: {
205
246
  id: string;
206
247
  displayName: string;
207
- store_path: string;
208
- cuts_path: string;
209
- expiry_hours: number;
248
+ storePath: string;
249
+ cutsPath?: string | null;
250
+ expiryHours: number;
210
251
  pruneIntervalMs?: number | null;
211
252
  };
253
+ RecordedStreams: {
254
+ active?: {
255
+ audio: {
256
+ startIso: string;
257
+ durationMs: number;
258
+ streamNum?: number;
259
+ versionNum: number;
260
+ tamsId?: string;
261
+ active: boolean;
262
+ };
263
+ video: {
264
+ startIso: string;
265
+ durationMs: number;
266
+ streamNum?: number;
267
+ versionNum: number;
268
+ tamsId?: string;
269
+ active: boolean;
270
+ };
271
+ sessionNum: number;
272
+ };
273
+ sessions: {
274
+ audio: {
275
+ startIso: string;
276
+ durationMs: number;
277
+ streamNum?: number;
278
+ versionNum: number;
279
+ tamsId?: string;
280
+ active: boolean;
281
+ };
282
+ video: {
283
+ startIso: string;
284
+ durationMs: number;
285
+ streamNum?: number;
286
+ versionNum: number;
287
+ tamsId?: string;
288
+ active: boolean;
289
+ };
290
+ sessionNum: number;
291
+ }[];
292
+ cuts: {
293
+ id: number;
294
+ percent: number;
295
+ createdMs: number;
296
+ }[];
297
+ };
298
+ StreamPair: {
299
+ audio: {
300
+ startIso: string;
301
+ durationMs: number;
302
+ streamNum?: number;
303
+ versionNum: number;
304
+ tamsId?: string;
305
+ active: boolean;
306
+ };
307
+ video: {
308
+ startIso: string;
309
+ durationMs: number;
310
+ streamNum?: number;
311
+ versionNum: number;
312
+ tamsId?: string;
313
+ active: boolean;
314
+ };
315
+ sessionNum: number;
316
+ };
317
+ StreamVersion: {
318
+ startIso: string;
319
+ durationMs: number;
320
+ streamNum?: number;
321
+ versionNum: number;
322
+ tamsId?: string;
323
+ active: boolean;
324
+ };
325
+ Cut: {
326
+ id: number;
327
+ percent: number;
328
+ createdMs: number;
329
+ };
212
330
  AvailableData: {
213
331
  start: string;
214
332
  duration_s: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/output.player/_gen/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/output.tams/_gen/types.ts"],"names":[],"mappings":""}
@@ -3,8 +3,8 @@ import type Registration from "@norskvideo/norsk-studio/lib/extension/registrati
3
3
  export default function (R: Registration): import("@norskvideo/norsk-studio/lib/extension/client-types").NodeInfo<{
4
4
  id: string;
5
5
  displayName: string;
6
- store_path: string;
7
- cuts_path: string;
8
- expiry_hours: number;
6
+ storePath: string;
7
+ cutsPath?: string | null;
8
+ expiryHours: number;
9
9
  pruneIntervalMs?: number | null;
10
10
  }, RecorderState, RecorderCommand, RecorderEvent>;
@@ -1,14 +1,18 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.default = default_1;
4
7
  const util_1 = require("@norskvideo/norsk-studio/lib/shared/util");
8
+ const inline_view_1 = __importDefault(require("./inline-view"));
5
9
  function default_1(R) {
6
10
  const { defineComponent, } = R;
7
11
  return defineComponent({
8
- identifier: 'output.recorder',
12
+ identifier: 'output.tams',
9
13
  category: 'output',
10
- name: "Stream Recorder",
11
- description: "Record a video and audio stream and provide an API for creating cuts",
14
+ name: "TAMS",
15
+ description: "Record video and audio streams into the Time Addressable Media Store (TAMS) and open a player for the recording.",
12
16
  subscription: {
13
17
  accepts: {
14
18
  type: "simple-stream",
@@ -19,14 +23,16 @@ function default_1(R) {
19
23
  display: (_desc) => { return {}; },
20
24
  runtime: {
21
25
  initialState: () => ({
22
- timeline: [],
26
+ active: undefined,
27
+ sessions: [],
23
28
  cuts: [],
24
29
  }),
25
30
  handleEvent: (ev, s) => {
26
31
  const evt = ev.type;
27
32
  switch (evt) {
28
- case "timeline-updated":
29
- s.timeline = ev.timeline;
33
+ case "updated":
34
+ s.active = ev.active;
35
+ s.sessions = ev.sessions;
30
36
  break;
31
37
  case 'cut-started':
32
38
  s.cuts.push({ id: ev.id, percent: 0.0, createdMs: ev.createdMs });
@@ -44,11 +50,12 @@ function default_1(R) {
44
50
  s.cuts.splice(0, 1);
45
51
  }
46
52
  return { ...s };
47
- }
53
+ },
54
+ inline: inline_view_1.default,
48
55
  },
49
56
  configForm: {
50
57
  form: {
51
- store_path: {
58
+ storePath: {
52
59
  help: "The path to which recordings will be made",
53
60
  hint: {
54
61
  type: 'text',
@@ -56,15 +63,15 @@ function default_1(R) {
56
63
  optional: false,
57
64
  }
58
65
  },
59
- cuts_path: {
66
+ cutsPath: {
60
67
  help: "The path to which cuts will be made",
61
68
  hint: {
62
69
  type: 'text',
63
70
  envOverride: true,
64
- optional: false,
71
+ optional: true,
65
72
  }
66
73
  },
67
- expiry_hours: {
74
+ expiryHours: {
68
75
  help: "Expiry time in hours for the store",
69
76
  hint: {
70
77
  type: "numeric",
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/output.tams/info.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { RecorderState, RecorderSettings, RecorderCommand } from "./runtime";
2
- declare function SummaryView({ state }: {
2
+ declare function InlineView({ state, }: {
3
3
  state: RecorderState;
4
4
  config: RecorderSettings;
5
5
  sendCommand: (cmd: RecorderCommand) => void;
6
6
  }): import("react/jsx-runtime").JSX.Element;
7
- export default SummaryView;
7
+ export default InlineView;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const jsx_runtime_1 = require("react/jsx-runtime");
4
+ const norsk_player_react_1 = require("@norskvideo/norsk-player-react");
5
+ const react_1 = require("react");
6
+ function InlineView({ state, }) {
7
+ const [playing, setPlaying] = (0, react_1.useState)();
8
+ if (playing) {
9
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col gap-2", children: [(0, jsx_runtime_1.jsx)("button", { onClick: () => setPlaying(undefined), className: "px-4 py-2 bg-slate-700 hover:bg-slate-600 text-white rounded-lg transition-colors self-start", children: "Close" }), (0, jsx_runtime_1.jsx)("div", { style: { width: '420px', height: '280px' }, children: (0, jsx_runtime_1.jsx)(norsk_player_react_1.Player, { src: playing, className: "w-full h-full", fillContainer: true }, playing) })] }));
10
+ }
11
+ const hasSessions = (state.active || state.sessions.length > 0);
12
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "bg-slate-950 p-6 overflow-auto", style: { maxHeight: '600px', maxWidth: '450px' }, children: [!hasSessions && ((0, jsx_runtime_1.jsx)("div", { className: "text-slate-400 text-center py-8", children: "No active or recorded sessions" })), displaySessions("Active Sessions", state.active ? [state.active] : [], setPlaying), displaySessions("Past Sessions", state.sessions, setPlaying)] }));
13
+ }
14
+ const sessionLink = ({ audio, video }) => {
15
+ if (!audio.tamsId || !video.tamsId)
16
+ return;
17
+ const tamsUrl = ({ tamsId }) => `http://localhost:6791/x-tams/flows/${tamsId}`;
18
+ return `${tamsUrl(audio)},${tamsUrl(video)}`;
19
+ };
20
+ const displaySessions = (name, sessions, setPlaying) => {
21
+ if (!sessions.length)
22
+ return null;
23
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "mb-6", children: [(0, jsx_runtime_1.jsx)("h3", { className: "text-lg font-semibold mb-3 text-slate-300", children: name }), (0, jsx_runtime_1.jsx)("div", { className: "space-y-2", children: sessions
24
+ .slice()
25
+ .reverse()
26
+ .map((session) => {
27
+ const url = sessionLink(session);
28
+ if (!url)
29
+ return null;
30
+ const duration = (session.video.durationMs / 60_000).toFixed(0);
31
+ const time = new Date(session.video.startIso).toLocaleTimeString();
32
+ return ((0, jsx_runtime_1.jsxs)("button", { onClick: () => setPlaying(url), className: "w-full px-4 py-3 bg-slate-800 hover:bg-slate-700 text-slate-200 rounded-lg transition-colors text-left", children: ["Play session ", time, " (", duration, " minutes)"] }, session.video.startIso));
33
+ }) })] }));
34
+ };
35
+ exports.default = InlineView;
36
+ //# sourceMappingURL=inline-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inline-view.js","sourceRoot":"","sources":["../../src/output.tams/inline-view.tsx"],"names":[],"mappings":"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"}
@@ -1,11 +1,12 @@
1
1
  import { MediaStoreRecorderNode, Norsk, StreamKeyOverrideNode } from '@norskvideo/norsk-sdk';
2
2
  import { CreatedMediaNode, InstanceRouteArgs, OnCreated, RelatedMediaNodes, RuntimeUpdates, ServerComponentDefinition, StudioComponentInputStream, StudioRuntime, ServerComponentSchemas } from '@norskvideo/norsk-studio/lib/extension/runtime-types';
3
3
  import { components } from './_gen/types';
4
- export type AvailableData = components['schemas']['AvailableData'];
5
- export type CutStatus = components['schemas']['CutStatus'];
4
+ export type RecordedStreams = components['schemas']['RecordedStreams'];
6
5
  export type RecorderSettings = components['schemas']['RecorderSettings'];
6
+ export type CutStatus = components['schemas']['CutStatus'];
7
7
  export type RecorderState = {
8
- timeline: AvailableData[];
8
+ active: RecordedStreams['active'];
9
+ sessions: RecordedStreams['sessions'];
9
10
  cuts: {
10
11
  id: number;
11
12
  percent: number;
@@ -13,8 +14,9 @@ export type RecorderState = {
13
14
  }[];
14
15
  };
15
16
  export type RecorderEvent = {
16
- type: 'timeline-updated';
17
- timeline: AvailableData[];
17
+ type: 'updated';
18
+ active: RecordedStreams['active'];
19
+ sessions: RecordedStreams['sessions'];
18
20
  } | {
19
21
  type: 'cut-started';
20
22
  id: number;
@@ -39,9 +41,9 @@ export default class RecorderDefinition implements ServerComponentDefinition<Rec
39
41
  instanceRoutes(): Promise<import("@norskvideo/norsk-studio/lib/extension/runtime-types").RouteInfo<InstanceRouteArgs<{
40
42
  id: string;
41
43
  displayName: string;
42
- store_path: string;
43
- cuts_path: string;
44
- expiry_hours: number;
44
+ storePath: string;
45
+ cutsPath?: string | null;
46
+ expiryHours: number;
45
47
  pruneIntervalMs?: number | null;
46
48
  }, Recorder, RecorderState, RecorderCommand, RecorderEvent>>[]>;
47
49
  }
@@ -56,7 +58,7 @@ export declare class Recorder implements CreatedMediaNode {
56
58
  cfg: RecorderSettings;
57
59
  cutting: boolean;
58
60
  cutIndex: number;
59
- timer: NodeJS.Timeout;
61
+ timer?: NodeJS.Timeout;
60
62
  constructor(norsk: Norsk, { updates }: StudioRuntime<RecorderState, RecorderCommand, RecorderEvent>, cfg: RecorderSettings);
61
63
  pruneCutStore(): Promise<void>;
62
64
  relatedMediaNodes: RelatedMediaNodes;
@@ -7,13 +7,16 @@ exports.Recorder = void 0;
7
7
  const norsk_sdk_1 = require("@norskvideo/norsk-sdk");
8
8
  const runtime_types_1 = require("@norskvideo/norsk-studio/lib/extension/runtime-types");
9
9
  const api_1 = require("@norskvideo/norsk-studio/lib/server/api");
10
- const promises_1 = __importDefault(require("fs/promises"));
11
10
  const path_1 = __importDefault(require("path"));
12
- const logging_1 = require("@norskvideo/norsk-studio/lib/server/logging");
11
+ const promises_1 = __importDefault(require("fs/promises"));
13
12
  const util_1 = require("@norskvideo/norsk-studio/lib/shared/util");
14
13
  const schemas_1 = require("@norskvideo/norsk-studio-built-ins/lib/shared/schemas");
14
+ const config_1 = __importDefault(require("@norskvideo/norsk-studio/lib/server/config"));
15
+ const logging_1 = require("@norskvideo/norsk-studio/lib/server/logging");
15
16
  function idToPath(id, cfg) {
16
- return path_1.default.join(cfg.cuts_path, `cut-${id}.mp4`);
17
+ if (!cfg.cutsPath)
18
+ throw new Error("Not configured for cuts");
19
+ return path_1.default.join(cfg.cutsPath, `cut-${id}.mp4`);
17
20
  }
18
21
  class RecorderDefinition {
19
22
  async create(norsk, cfg, cb, runtime) {
@@ -44,7 +47,11 @@ class RecorderDefinition {
44
47
  }
45
48
  },
46
49
  '/cut': {
47
- post: ({ runtime }) => async (req, res) => {
50
+ post: ({ runtime, config }) => async (req, res) => {
51
+ if (!config.cutsPath) {
52
+ res.status(400).json("Not configured for cuts");
53
+ return;
54
+ }
48
55
  const previousCuts = runtime.updates.latest().cuts;
49
56
  const previousCutId = previousCuts.at(-1)?.id;
50
57
  if (previousCuts.length > 0 && previousCuts[previousCuts.length - 1].percent < 100.0) {
@@ -133,8 +140,7 @@ class RecorderDefinition {
133
140
  return;
134
141
  });
135
142
  (0, logging_1.debuglog)("Sending file to client", pathToFile);
136
- res.contentType(".mp4");
137
- res.sendFile(pathToFile);
143
+ res.sendFile(pathToFile, { headers: { "Content-Type": "video/mp4" } });
138
144
  }
139
145
  }
140
146
  });
@@ -172,14 +178,18 @@ class Recorder {
172
178
  this.updates = updates;
173
179
  this.relatedMediaNodes = new runtime_types_1.RelatedMediaNodes();
174
180
  this.initialised = this.initialise();
175
- this.timer = setInterval(() => void this.pruneCutStore(), this.cfg.pruneIntervalMs ?? 60000);
181
+ if (this.cfg.cutsPath) {
182
+ this.timer = setInterval(() => void this.pruneCutStore(), this.cfg.pruneIntervalMs ?? 60000);
183
+ }
176
184
  }
177
185
  async pruneCutStore() {
178
- const files = await promises_1.default.readdir(this.cfg.cuts_path);
186
+ if (!this.cfg.cutsPath)
187
+ return;
188
+ const files = await promises_1.default.readdir(this.cfg.cutsPath);
179
189
  const now = new Date().valueOf();
180
- const expiryMs = this.cfg.expiry_hours * 60 * 60 * 1000;
190
+ const expiryMs = this.cfg.expiryHours * 60 * 60 * 1000;
181
191
  for (const f of files) {
182
- const full = path_1.default.join(this.cfg.cuts_path, f);
192
+ const full = path_1.default.join(this.cfg.cutsPath, f);
183
193
  const info = await promises_1.default.stat(full);
184
194
  if (!info.isFile())
185
195
  continue;
@@ -196,13 +206,13 @@ class Recorder {
196
206
  relatedMediaNodes;
197
207
  async initialise() {
198
208
  this.recorder = await this.norsk.mediaStore.recorder({
199
- id: `${this.id}-recorder`,
209
+ id: `${this.id}-player-recorder`,
200
210
  name: this.id,
201
- path: this.cfg.store_path,
202
- chunkFileDurationSeconds: 3600,
211
+ path: this.cfg.storePath,
212
+ chunkFileDurationSeconds: 10,
203
213
  expiry: {
204
214
  expire: 'byTime',
205
- durationS: this.cfg.expiry_hours * 60 * 60
215
+ durationS: this.cfg.expiryHours * 60 * 60
206
216
  },
207
217
  onClose: () => {
208
218
  this.recorder = undefined;
@@ -219,27 +229,60 @@ class Recorder {
219
229
  { source: this.audioKey, sourceSelector: norsk_sdk_1.selectAudio }
220
230
  ]);
221
231
  this.relatedMediaNodes.addInputs([this.audioKey, this.videoKey]);
222
- const update = () => {
223
- const work = async () => {
224
- if (!this.recorder)
225
- return;
226
- const d = await this.recorder.metadata();
227
- const timeline = d
228
- .flatMap(({ streams }) => streams.flatMap((s) => s.versions.map((v) => ({
229
- start: v.startDateTime.toISOString(),
230
- duration_s: v.durationMs / 1000.0
231
- }))));
232
- this.updates.raiseEvent({
233
- type: 'timeline-updated',
234
- timeline
232
+ const TAMS_URL = `http://${config_1.default.norsk.host()}:${config_1.default.norsk.support_port()}/x-tams`;
233
+ const update = async () => {
234
+ if (!this.recorder)
235
+ return;
236
+ const d = await this.recorder.metadata();
237
+ const storeSessions = [];
238
+ for (const session of d) {
239
+ const detected = detectStreams(session.streams);
240
+ if (!detected)
241
+ continue;
242
+ const { audio: { item: { versions: audios }, index: audioIndex }, video: { item: { versions: videos }, index: videoIndex } } = detected;
243
+ const paired = audios.flatMap((audioVersion) => {
244
+ let found;
245
+ for (const video of videos) {
246
+ const overlap = concomitant(audioVersion, video);
247
+ if (!overlap)
248
+ continue;
249
+ if (!found)
250
+ found = video;
251
+ else if (overlap > concomitant(audioVersion, found))
252
+ found = video;
253
+ }
254
+ if (!found)
255
+ return [];
256
+ return [{
257
+ audio: { ...audioVersion, streamNum: audioIndex + 1 },
258
+ video: { ...found, streamNum: videoIndex + 1 },
259
+ session: session.sessionNum
260
+ }];
235
261
  });
236
- };
237
- void work().then(() => {
238
- if (this.recorder)
239
- setTimeout(update, 1000);
262
+ storeSessions.push(...paired);
263
+ }
264
+ const sources = await (await fetch(`${TAMS_URL}/sources`)).json();
265
+ const sessions = storeSessions.map(av => {
266
+ const sessionSources = sources.filter(tagFilter({
267
+ "__mediaStoreName": this.id,
268
+ "__mediaStoreSession": av.session,
269
+ "__mediaStoreType": "version",
270
+ }));
271
+ return {
272
+ audio: toAPI(av.audio, sessionSources),
273
+ video: toAPI(av.video, sessionSources),
274
+ sessionNum: av.session,
275
+ };
240
276
  });
277
+ const active = sessions.slice().reverse().find(av => av.audio.active && av.video.active);
278
+ this.updates.raiseEvent({
279
+ type: 'updated',
280
+ active,
281
+ sessions,
282
+ });
283
+ setTimeout(() => void update(), 1000);
241
284
  };
242
- update();
285
+ void update();
243
286
  }
244
287
  async makeCut(start, durationS) {
245
288
  if (!this.recorder) {
@@ -298,4 +341,48 @@ class Recorder {
298
341
  }
299
342
  }
300
343
  exports.Recorder = Recorder;
344
+ const detectStreams = (streams) => {
345
+ const indexed = streams.map((item, index) => ({ item, index }));
346
+ const audio = indexed.find(({ item: { streamKey } }) => (0, norsk_sdk_1.streamKeysAreEqual)(streamKey, AudioKey));
347
+ const video = indexed.find(({ item: { streamKey } }) => (0, norsk_sdk_1.streamKeysAreEqual)(streamKey, VideoKey));
348
+ if (!audio || !video)
349
+ return;
350
+ return { audio, video };
351
+ };
352
+ const concomitant = (audio, video) => {
353
+ const aStart = audio.startDateTime.getTime();
354
+ const aEnd = aStart + audio.durationMs;
355
+ const vStart = video.startDateTime.getTime();
356
+ const vEnd = vStart + video.durationMs;
357
+ const start = Math.max(aStart, vStart);
358
+ const end = Math.min(aEnd, vEnd);
359
+ return start < end ? end - start : 0;
360
+ };
361
+ const toAPI = (ver, sources) => ({
362
+ startIso: ver.startDateTime.toISOString(),
363
+ durationMs: ver.durationMs,
364
+ streamNum: ver.streamNum,
365
+ versionNum: ver.versionNum,
366
+ active: ver.active,
367
+ tamsId: sources.find(tagFilter({
368
+ "__mediaStoreType": "version",
369
+ "__mediaStoreVersion": ver.versionNum,
370
+ "__mediaStoreStream": ver.streamNum,
371
+ }))?.id,
372
+ });
373
+ const tagFilter = (spec) => {
374
+ return ({ tags }) => {
375
+ for (const [k, filter] of Object.entries(spec)) {
376
+ if (typeof filter === 'string' || typeof filter === 'number') {
377
+ if (tags[k] !== filter.toString())
378
+ return false;
379
+ }
380
+ else {
381
+ if (!filter(tags[k]))
382
+ return false;
383
+ }
384
+ }
385
+ return true;
386
+ };
387
+ };
301
388
  //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/output.tams/runtime.ts"],"names":[],"mappings":";;;;;;AAAA,qDAA+K;AAC/K,wFAAuP;AACvP,iEAAoE;AAGpE,gDAAwB;AACxB,2DAA6B;AAC7B,mEAA+F;AAC/F,mFAAwF;AACxF,wFAAgE;AAChE,yEAA6F;AAmC7F,SAAS,QAAQ,CAAC,EAAU,EAAE,GAAqB;IACjD,IAAI,CAAC,GAAG,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC9D,OAAO,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,MAAqB,kBAAkB;IACrC,KAAK,CAAC,MAAM,CAAC,KAAY,EAAE,GAAqB,EAAE,EAAuB,EAAE,OAAqE;QAC9I,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAC/C,MAAM,IAAI,CAAC,WAAW,CAAC;QACvB,EAAE,CAAC,IAAI,CAAC,CAAC;IACX,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,IAAA,yBAAe,EAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE;YACzD,MAAM,EAAE,kBAAkB;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,QAAkB,EAAE,OAAwB;QACxD,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;QACxB,QAAQ,EAAE,EAAE,CAAC;YACX,KAAK,UAAU;gBACb,KAAK,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;gBAClE,MAAM;YACR;gBACE,IAAA,wBAAiB,EAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,IAAA,eAAS,EACd,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAClC;YACE,WAAW,EAAE;gBACX,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;oBACxC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;gBAChD,CAAC;aACF;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;oBAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;wBACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;wBAChD,OAAO;oBACT,CAAC;oBACD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;oBACnD,MAAM,aAAa,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;oBAE9C,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,EAAE,CAAC;wBACrF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;wBAChD,OAAO;oBACT,CAAC;oBAED,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;oBAE5C,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;wBACrC,OAAO;oBACT,CAAC;oBACD,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;wBACzC,OAAO;oBACT,CAAC;oBAED,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;wBAC1B,IAAI,EAAE,UAAU;wBAChB,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK;wBACrB,UAAU,EAAE,CAAC;qBACd,CAAC,CAAA;oBAEF,MAAM,IAAA,uBAAgB,EAAC,GAAG,EAAE;wBAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;wBAC7C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,aAAa;4BAAE,OAAO,IAAI,CAAC;wBACrF,OAAO,KAAK,CAAC;oBAEf,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;wBACb,IAAA,kBAAQ,EAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC;wBAC1C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBACxB,OAAO;oBACT,CAAC,CAAC,CAAA;oBAEF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;oBAE7C,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,aAAa,EAAE,CAAC;wBACxE,IAAA,oBAAU,EAAC,iDAAiD,CAAC,CAAC;wBAC9D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;wBAC7C,OAAO;oBACT,CAAC;oBAED,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAE1C,IAAA,kBAAQ,EAAC,0BAA0B,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;oBAEjD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBACnB,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC9B,GAAG,EAAE,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;qBAChD,CAAC,CAAC;gBACL,CAAC;aACF;YACD,WAAW,EAAE;gBACX,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;oBACvC,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBAEvC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;wBACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;wBACnC,OAAO;oBACT,CAAC;oBAED,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;oBAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;oBAEzC,IAAI,CAAC,GAAG,EAAE,CAAC;wBACT,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;wBACtC,OAAO;oBACT,CAAC;oBAED,IAAI,MAAiB,CAAC;oBACtB,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC;wBACzB,MAAM,GAAG;4BACP,MAAM,EAAE,OAAO;4BACf,GAAG,EAAE,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;yBAC5C,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,MAAM,GAAG;4BACP,MAAM,EAAE,WAAW;4BACnB,gBAAgB,EAAE,GAAG,CAAC,OAAO;yBAC9B,CAAC;oBACJ,CAAC;oBACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC7B,OAAO;gBACT,CAAC;aACF;YACD,oBAAoB,EAAE;gBACpB,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;oBACtC,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBAE3C,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;wBACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;wBACnC,OAAO;oBACT,CAAC;oBAED,MAAM,UAAU,GAAG,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;oBACxC,MAAM,kBAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;wBACnC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;wBAC1C,OAAO;oBACT,CAAC,CAAC,CAAA;oBAEF,IAAA,kBAAQ,EAAC,wBAAwB,EAAE,UAAU,CAAC,CAAC;oBAC/C,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;gBACzE,CAAC;aACF;SACF,CAAC,CAAC;IACP,CAAC;CACF;AApJD,qCAoJC;AAQD,MAAM,QAAQ,GAAc;IAC1B,QAAQ,EAAE,GAAG;IACb,aAAa,EAAE,CAAC;IAChB,UAAU,EAAE,UAAU;IACtB,aAAa,EAAE,SAAS;CACzB,CAAA;AACD,MAAM,QAAQ,GAAc;IAC1B,QAAQ,EAAE,GAAG;IACb,aAAa,EAAE,CAAC;IAChB,UAAU,EAAE,UAAU;IACtB,aAAa,EAAE,SAAS;CACzB,CAAA;AAED,MAAa,QAAQ;IACnB,WAAW,CAAgB;IAC3B,KAAK,CAAQ;IACb,OAAO,CAAgE;IACvE,QAAQ,CAA0B;IAClC,QAAQ,CAAyB;IACjC,QAAQ,CAAyB;IAEjC,EAAE,CAAS;IACX,GAAG,CAAmB;IACtB,OAAO,GAAY,KAAK,CAAC;IACzB,QAAQ,GAAW,CAAC,CAAC;IACrB,KAAK,CAAkB;IAEvB,YAAY,KAAY,EAAE,EAAE,OAAO,EAAgE,EAAE,GAAqB;QACxH,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,iBAAiB,GAAG,IAAI,iCAAiB,EAAE,CAAC;QACjD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,IAAI,KAAK,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ;YAAE,OAAO;QAC/B,MAAM,KAAK,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACvD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAAE,SAAS;YAC7B,IAAI,cAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM;gBAAE,SAAS;YACzC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;gBAClC,IAAA,kBAAQ,EAAC,uBAAuB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClD,MAAM,kBAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;oBAC7C,IAAA,kBAAQ,EAAC,qBAAqB,EAAE,CAAC,CAAC,CAAA;gBACpC,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,iBAAiB,CAAoB;IAErC,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;YACnD,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,kBAAkB;YAChC,IAAI,EAAE,IAAI,CAAC,EAAE;YACb,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS;YACxB,wBAAwB,EAAE,EAAE;YAC5B,MAAM,EAAE;gBACN,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,GAAG,EAAE;aAC1C;YACD,OAAO,EAAE,GAAG,EAAE;gBACZ,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC5B,CAAC;SACF,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,iBAAiB,CAAC;YACrE,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,iBAAiB,CAAC;YACrE,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YACtB,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,uBAAW,EAAE;YACtD,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,uBAAW,EAAE;SACvD,CAAC,CAAA;QACF,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEjE,MAAM,QAAQ,GAAG,UAAU,gBAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,gBAAM,CAAC,KAAK,CAAC,YAAY,EAAE,SAAS,CAAC;QAEvF,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;YACxB,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAC3B,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,aAAa,GAIb,EAAE,CAAC;YACT,KAAK,MAAM,OAAO,IAAI,CAAC,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAChD,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBACxB,MAAM,EACJ,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EACxD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EACzD,GAAG,QAAQ,CAAC;gBACb,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;oBAC7C,IAAI,KAAK,CAAC;oBACV,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;wBAC3B,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;wBACjD,IAAI,CAAC,OAAO;4BAAE,SAAS;wBACvB,IAAI,CAAC,KAAK;4BAAE,KAAK,GAAG,KAAK,CAAC;6BACrB,IAAI,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,KAAK,CAAC;4BAAE,KAAK,GAAG,KAAK,CAAC;oBACrE,CAAC;oBACD,IAAI,CAAC,KAAK;wBAAE,OAAO,EAAE,CAAC;oBACtB,OAAO,CAAC;4BACN,KAAK,EAAE,EAAE,GAAG,YAAY,EAAE,SAAS,EAAE,UAAU,GAAG,CAAC,EAAE;4BACrD,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,UAAU,GAAG,CAAC,EAAE;4BAC9C,OAAO,EAAE,OAAO,CAAC,UAAU;yBAC5B,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;gBACH,aAAa,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;YAChC,CAAC;YAED,MAAM,OAAO,GAAa,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,QAAQ,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAE5E,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBACtC,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;oBAC9C,kBAAkB,EAAE,IAAI,CAAC,EAAE;oBAC3B,qBAAqB,EAAE,EAAE,CAAC,OAAO;oBACjC,kBAAkB,EAAE,SAAS;iBAC9B,CAAC,CAAC,CAAC;gBACJ,OAAO;oBACL,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC;oBACtC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC;oBACtC,UAAU,EAAE,EAAE,CAAC,OAAO;iBACvB,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAEzF,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;gBACtB,IAAI,EAAE,SAAS;gBACf,MAAM;gBACN,QAAQ;aACT,CAAC,CAAC;YACH,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;QACxC,CAAC,CAAA;QACD,KAAK,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAW,EAAE,SAAiB;QAC1C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAA,oBAAU,EAAC,4BAA4B,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAA,oBAAU,EAAC,yBAAyB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,MAAM,KAAK,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC;QAE9B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YACtB,IAAI,EAAE,aAAa;YACnB,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;SAChC,CAAC,CAAA;QAEF,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,kBAAE,CAAC,KAAK,CAAC,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;YACxC,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,QAAQ,KAAK,EAAE;YAC7B,UAAU,EAAE,KAAK;YACjB,IAAI,EAAE;gBACJ,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;oBACzB,eAAe,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBAC7D,eAAe,EAAE,KAAK;oBACtB,aAAa,EAAE,KAAK;oBACpB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;iBACzC,CAAC;aACH;YACD,QAAQ,EAAE,UAAU;YACpB,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE;gBAChB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;oBACtB,IAAI,EAAE,cAAc;oBACpB,UAAU,EAAE,CAAC;oBACb,EAAE,EAAE,KAAK;iBACV,CAAC,CAAA;YACJ,CAAC;SACF,CAAC,CAAA;QACF,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;gBACtB,IAAI,EAAE,cAAc;gBACpB,UAAU,EAAE,GAAG;gBACf,EAAE,EAAE,KAAK;aACV,CAAC,CAAA;YACF,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;gBACtB,IAAI,EAAE,cAAc;gBACpB,EAAE,EAAE,KAAK;aACV,CAAC,CAAA;QACJ,CAAC,CAAC,CAAC;IAEL,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAqC;QAEnD,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QAC1F,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAC5F,CAAC;CACF;AApMD,4BAoMC;AAED,MAAM,aAAa,GAAG,CAAwC,OAAe,EAAE,EAAE;IAC/E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,IAAA,8BAAkB,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjG,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,IAAA,8BAAkB,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjG,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK;QAAE,OAAO;IAC7B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC,CAAC;AACF,MAAM,WAAW,GAAG,CAAC,KAA8B,EAAE,KAA8B,EAAE,EAAE;IACrF,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC;IAEvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjC,OAAO,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC;AACF,MAAM,KAAK,GAAG,CAAC,GAAoD,EAAE,OAAiB,EAAE,EAAE,CAAC,CAAC;IAC1F,QAAQ,EAAE,GAAG,CAAC,aAAa,CAAC,WAAW,EAAE;IACzC,UAAU,EAAE,GAAG,CAAC,UAAU;IAC1B,SAAS,EAAE,GAAG,CAAC,SAAS;IACxB,UAAU,EAAE,GAAG,CAAC,UAAU;IAC1B,MAAM,EAAE,GAAG,CAAC,MAAM;IAClB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;QAC7B,kBAAkB,EAAE,SAAS;QAC7B,qBAAqB,EAAE,GAAG,CAAC,UAAU;QACrC,oBAAoB,EAAE,GAAG,CAAC,SAAS;KACpC,CAAC,CAAC,EAAE,EAAE;CAER,CAAC,CAAC;AACH,MAAM,SAAS,GACb,CAAC,IAAgF,EAC1B,EAAE;IACzD,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;QAClB,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC7D,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,QAAQ,EAAE;oBAAE,OAAO,KAAK,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAC;YACrC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC,CAAC"}