@openhi/types 0.0.43 → 0.0.45

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.
@@ -1 +1,2 @@
1
+ export * from "./on-site-medical";
1
2
  export * from "./openhi";
@@ -14,5 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./on-site-medical"), exports);
17
18
  __exportStar(require("./openhi"), exports);
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXh0ZW5zaW9ucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vb3BlbmhpXCI7XG4iXX0=
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXh0ZW5zaW9ucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQWtDO0FBQ2xDLDJDQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL29uLXNpdGUtbWVkaWNhbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3BlbmhpXCI7XG4iXX0=
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Hand-authored identifier systems, extension URLs, schemas, and accessors
3
+ * for the recurring-appointment series contract.
4
+ *
5
+ * **Namespace provenance:** these URLs live in the `on-site-medical.app`
6
+ * namespace because the contract originated in the on-site-medical
7
+ * frontend (its ADR `docs/fhir-mapping/adr-recurring-appointments.md`) and
8
+ * live data already carries them — they are frozen. The concepts are not
9
+ * customer-specific: if recurring-series support is later promoted to a
10
+ * platform-level feature, the path is minting `hl7.openhi.org` URLs and
11
+ * migrating stored data, not re-typing. Until then this module is the
12
+ * single shared definition for both the OpenHI backend (series operations,
13
+ * `@openhi/constructs` `src/data/recurrence/`) and the on-site-medical
14
+ * frontend.
15
+ *
16
+ * A recurring series is N independent Appointments sharing the series
17
+ * identifier; each instance also carries a deterministic per-occurrence
18
+ * identifier (`<seriesId>/<occurrence instant ISO>` — the generated slot,
19
+ * stable across reschedules) and three re-expansion extensions (RRULE,
20
+ * IANA timezone, series anchor). Instances individually edited away from
21
+ * the series template are flagged `series-instance-overridden` so
22
+ * series-wide edits skip them.
23
+ */
24
+ import { z } from "zod";
25
+ import type { Appointment } from "../../data/appointment";
26
+ import type { Extension } from "../../data/extension";
27
+ import type { Identifier } from "../../data/identifier";
28
+ /** Identifier system shared by every instance of one series. */
29
+ export declare const APPOINTMENT_SERIES_SYSTEM: "https://on-site-medical.app/fhir/NamingSystem/appointment-series";
30
+ /** Identifier system for the deterministic per-occurrence key. */
31
+ export declare const APPOINTMENT_SERIES_OCCURRENCE_SYSTEM: "https://on-site-medical.app/fhir/NamingSystem/appointment-series-occurrence";
32
+ /** Extension carrying the RFC 5545 RRULE string (subset). */
33
+ export declare const RECURRENCE_RULE_EXTENSION_URL: "https://on-site-medical.app/fhir/StructureDefinition/recurrence-rule";
34
+ /** Extension carrying the series' IANA time zone. */
35
+ export declare const RECURRENCE_TIMEZONE_EXTENSION_URL: "https://on-site-medical.app/fhir/StructureDefinition/recurrence-timezone";
36
+ /** Extension carrying the series anchor (first-occurrence instant, DTSTART). */
37
+ export declare const RECURRENCE_ANCHOR_EXTENSION_URL: "https://on-site-medical.app/fhir/StructureDefinition/recurrence-anchor";
38
+ /** Extension flagging an instance as diverged from its series template. */
39
+ export declare const SERIES_INSTANCE_OVERRIDDEN_EXTENSION_URL: "https://on-site-medical.app/fhir/StructureDefinition/series-instance-overridden";
40
+ export declare const recurrenceRuleExtensionSchema: z.ZodObject<{
41
+ url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-rule">;
42
+ valueString: z.ZodString;
43
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
44
+ url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-rule">;
45
+ valueString: z.ZodString;
46
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
47
+ url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-rule">;
48
+ valueString: z.ZodString;
49
+ }, z.ZodTypeAny, "passthrough">>;
50
+ export type RecurrenceRuleExtension = z.infer<typeof recurrenceRuleExtensionSchema>;
51
+ export declare const recurrenceTimezoneExtensionSchema: z.ZodObject<{
52
+ url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-timezone">;
53
+ valueString: z.ZodString;
54
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
55
+ url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-timezone">;
56
+ valueString: z.ZodString;
57
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
58
+ url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-timezone">;
59
+ valueString: z.ZodString;
60
+ }, z.ZodTypeAny, "passthrough">>;
61
+ export type RecurrenceTimezoneExtension = z.infer<typeof recurrenceTimezoneExtensionSchema>;
62
+ export declare const recurrenceAnchorExtensionSchema: z.ZodObject<{
63
+ url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-anchor">;
64
+ valueDateTime: z.ZodString;
65
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
66
+ url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-anchor">;
67
+ valueDateTime: z.ZodString;
68
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
69
+ url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/recurrence-anchor">;
70
+ valueDateTime: z.ZodString;
71
+ }, z.ZodTypeAny, "passthrough">>;
72
+ export type RecurrenceAnchorExtension = z.infer<typeof recurrenceAnchorExtensionSchema>;
73
+ export declare const seriesInstanceOverriddenExtensionSchema: z.ZodObject<{
74
+ url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/series-instance-overridden">;
75
+ valueBoolean: z.ZodBoolean;
76
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
77
+ url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/series-instance-overridden">;
78
+ valueBoolean: z.ZodBoolean;
79
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
80
+ url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/series-instance-overridden">;
81
+ valueBoolean: z.ZodBoolean;
82
+ }, z.ZodTypeAny, "passthrough">>;
83
+ export type SeriesInstanceOverriddenExtension = z.infer<typeof seriesInstanceOverriddenExtensionSchema>;
84
+ /** Builds the shared series identifier stamped on every instance of a series. */
85
+ export declare function buildSeriesIdentifier(seriesId: string): Identifier;
86
+ /**
87
+ * Builds the deterministic per-occurrence identifier
88
+ * (`<seriesId>/<occurrence instant>`). The occurrence instant is the slot the
89
+ * instance was generated for; it stays stable if the instance is later
90
+ * rescheduled.
91
+ */
92
+ export declare function buildOccurrenceIdentifier(seriesId: string, occurrence: Date): Identifier;
93
+ /** Builds the extension carrying the RFC 5545 RRULE string. */
94
+ export declare function buildRecurrenceRuleExtension(rrule: string): Extension;
95
+ /** Builds the extension carrying the series' IANA time zone. */
96
+ export declare function buildRecurrenceTimezoneExtension(timezone: string): Extension;
97
+ /** Builds the extension carrying the series anchor (first-occurrence instant). */
98
+ export declare function buildRecurrenceAnchorExtension(anchor: Date): Extension;
99
+ /** Builds the extension that marks an instance as diverged from its series. */
100
+ export declare function buildSeriesInstanceOverriddenExtension(): Extension;
101
+ /** Returns the series id an Appointment belongs to, or null if it is standalone. */
102
+ export declare function getSeriesId(appointment: Appointment): string | null;
103
+ /** Returns the per-occurrence identifier value, or null. */
104
+ export declare function getOccurrenceIdentifier(appointment: Appointment): string | null;
105
+ /**
106
+ * Returns the occurrence's original slot instant (ISO string) parsed from the
107
+ * per-occurrence identifier (`<seriesId>/<instant>`), or null. Unlike the
108
+ * live `start`, this survives reschedules — it identifies the slot the
109
+ * instance was generated for, so it's the right key for "this and following"
110
+ * boundaries and append points.
111
+ */
112
+ export declare function getOccurrenceInstant(appointment: Appointment): string | null;
113
+ /** Returns the RRULE string carried on an Appointment, or null. */
114
+ export declare function getRecurrenceRule(appointment: Appointment): string | null;
115
+ /** Returns the series' IANA time zone, or null. */
116
+ export declare function getRecurrenceTimezone(appointment: Appointment): string | null;
117
+ /**
118
+ * Returns the series anchor (first-occurrence instant), or null when absent.
119
+ * Throws on a malformed stored value — that's a producer bug to surface, not
120
+ * a state to paper over.
121
+ */
122
+ export declare function getRecurrenceAnchor(appointment: Appointment): Date | null;
123
+ /** True when this instance has been edited away from its series template. */
124
+ export declare function isSeriesInstanceOverridden(appointment: Appointment): boolean;
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.seriesInstanceOverriddenExtensionSchema = exports.recurrenceAnchorExtensionSchema = exports.recurrenceTimezoneExtensionSchema = exports.recurrenceRuleExtensionSchema = exports.SERIES_INSTANCE_OVERRIDDEN_EXTENSION_URL = exports.RECURRENCE_ANCHOR_EXTENSION_URL = exports.RECURRENCE_TIMEZONE_EXTENSION_URL = exports.RECURRENCE_RULE_EXTENSION_URL = exports.APPOINTMENT_SERIES_OCCURRENCE_SYSTEM = exports.APPOINTMENT_SERIES_SYSTEM = void 0;
4
+ exports.buildSeriesIdentifier = buildSeriesIdentifier;
5
+ exports.buildOccurrenceIdentifier = buildOccurrenceIdentifier;
6
+ exports.buildRecurrenceRuleExtension = buildRecurrenceRuleExtension;
7
+ exports.buildRecurrenceTimezoneExtension = buildRecurrenceTimezoneExtension;
8
+ exports.buildRecurrenceAnchorExtension = buildRecurrenceAnchorExtension;
9
+ exports.buildSeriesInstanceOverriddenExtension = buildSeriesInstanceOverriddenExtension;
10
+ exports.getSeriesId = getSeriesId;
11
+ exports.getOccurrenceIdentifier = getOccurrenceIdentifier;
12
+ exports.getOccurrenceInstant = getOccurrenceInstant;
13
+ exports.getRecurrenceRule = getRecurrenceRule;
14
+ exports.getRecurrenceTimezone = getRecurrenceTimezone;
15
+ exports.getRecurrenceAnchor = getRecurrenceAnchor;
16
+ exports.isSeriesInstanceOverridden = isSeriesInstanceOverridden;
17
+ /**
18
+ * Hand-authored identifier systems, extension URLs, schemas, and accessors
19
+ * for the recurring-appointment series contract.
20
+ *
21
+ * **Namespace provenance:** these URLs live in the `on-site-medical.app`
22
+ * namespace because the contract originated in the on-site-medical
23
+ * frontend (its ADR `docs/fhir-mapping/adr-recurring-appointments.md`) and
24
+ * live data already carries them — they are frozen. The concepts are not
25
+ * customer-specific: if recurring-series support is later promoted to a
26
+ * platform-level feature, the path is minting `hl7.openhi.org` URLs and
27
+ * migrating stored data, not re-typing. Until then this module is the
28
+ * single shared definition for both the OpenHI backend (series operations,
29
+ * `@openhi/constructs` `src/data/recurrence/`) and the on-site-medical
30
+ * frontend.
31
+ *
32
+ * A recurring series is N independent Appointments sharing the series
33
+ * identifier; each instance also carries a deterministic per-occurrence
34
+ * identifier (`<seriesId>/<occurrence instant ISO>` — the generated slot,
35
+ * stable across reschedules) and three re-expansion extensions (RRULE,
36
+ * IANA timezone, series anchor). Instances individually edited away from
37
+ * the series template are flagged `series-instance-overridden` so
38
+ * series-wide edits skip them.
39
+ */
40
+ const zod_1 = require("zod");
41
+ /** Identifier system shared by every instance of one series. */
42
+ exports.APPOINTMENT_SERIES_SYSTEM = "https://on-site-medical.app/fhir/NamingSystem/appointment-series";
43
+ /** Identifier system for the deterministic per-occurrence key. */
44
+ exports.APPOINTMENT_SERIES_OCCURRENCE_SYSTEM = "https://on-site-medical.app/fhir/NamingSystem/appointment-series-occurrence";
45
+ /** Extension carrying the RFC 5545 RRULE string (subset). */
46
+ exports.RECURRENCE_RULE_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/recurrence-rule";
47
+ /** Extension carrying the series' IANA time zone. */
48
+ exports.RECURRENCE_TIMEZONE_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/recurrence-timezone";
49
+ /** Extension carrying the series anchor (first-occurrence instant, DTSTART). */
50
+ exports.RECURRENCE_ANCHOR_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/recurrence-anchor";
51
+ /** Extension flagging an instance as diverged from its series template. */
52
+ exports.SERIES_INSTANCE_OVERRIDDEN_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/series-instance-overridden";
53
+ exports.recurrenceRuleExtensionSchema = zod_1.z
54
+ .object({
55
+ url: zod_1.z.literal(exports.RECURRENCE_RULE_EXTENSION_URL),
56
+ valueString: zod_1.z.string(),
57
+ })
58
+ .passthrough();
59
+ exports.recurrenceTimezoneExtensionSchema = zod_1.z
60
+ .object({
61
+ url: zod_1.z.literal(exports.RECURRENCE_TIMEZONE_EXTENSION_URL),
62
+ valueString: zod_1.z.string(),
63
+ })
64
+ .passthrough();
65
+ exports.recurrenceAnchorExtensionSchema = zod_1.z
66
+ .object({
67
+ url: zod_1.z.literal(exports.RECURRENCE_ANCHOR_EXTENSION_URL),
68
+ valueDateTime: zod_1.z.string(),
69
+ })
70
+ .passthrough();
71
+ exports.seriesInstanceOverriddenExtensionSchema = zod_1.z
72
+ .object({
73
+ url: zod_1.z.literal(exports.SERIES_INSTANCE_OVERRIDDEN_EXTENSION_URL),
74
+ valueBoolean: zod_1.z.boolean(),
75
+ })
76
+ .passthrough();
77
+ /** Builds the shared series identifier stamped on every instance of a series. */
78
+ function buildSeriesIdentifier(seriesId) {
79
+ return { system: exports.APPOINTMENT_SERIES_SYSTEM, value: seriesId };
80
+ }
81
+ /**
82
+ * Builds the deterministic per-occurrence identifier
83
+ * (`<seriesId>/<occurrence instant>`). The occurrence instant is the slot the
84
+ * instance was generated for; it stays stable if the instance is later
85
+ * rescheduled.
86
+ */
87
+ function buildOccurrenceIdentifier(seriesId, occurrence) {
88
+ return {
89
+ system: exports.APPOINTMENT_SERIES_OCCURRENCE_SYSTEM,
90
+ value: `${seriesId}/${occurrence.toISOString()}`,
91
+ };
92
+ }
93
+ /** Builds the extension carrying the RFC 5545 RRULE string. */
94
+ function buildRecurrenceRuleExtension(rrule) {
95
+ return { url: exports.RECURRENCE_RULE_EXTENSION_URL, valueString: rrule };
96
+ }
97
+ /** Builds the extension carrying the series' IANA time zone. */
98
+ function buildRecurrenceTimezoneExtension(timezone) {
99
+ return { url: exports.RECURRENCE_TIMEZONE_EXTENSION_URL, valueString: timezone };
100
+ }
101
+ /** Builds the extension carrying the series anchor (first-occurrence instant). */
102
+ function buildRecurrenceAnchorExtension(anchor) {
103
+ return {
104
+ url: exports.RECURRENCE_ANCHOR_EXTENSION_URL,
105
+ valueDateTime: anchor.toISOString(),
106
+ };
107
+ }
108
+ /** Builds the extension that marks an instance as diverged from its series. */
109
+ function buildSeriesInstanceOverriddenExtension() {
110
+ return { url: exports.SERIES_INSTANCE_OVERRIDDEN_EXTENSION_URL, valueBoolean: true };
111
+ }
112
+ /** Returns the series id an Appointment belongs to, or null if it is standalone. */
113
+ function getSeriesId(appointment) {
114
+ const identifier = appointment.identifier?.find((id) => id.system === exports.APPOINTMENT_SERIES_SYSTEM);
115
+ return identifier?.value ?? null;
116
+ }
117
+ /** Returns the per-occurrence identifier value, or null. */
118
+ function getOccurrenceIdentifier(appointment) {
119
+ const identifier = appointment.identifier?.find((id) => id.system === exports.APPOINTMENT_SERIES_OCCURRENCE_SYSTEM);
120
+ return identifier?.value ?? null;
121
+ }
122
+ /**
123
+ * Returns the occurrence's original slot instant (ISO string) parsed from the
124
+ * per-occurrence identifier (`<seriesId>/<instant>`), or null. Unlike the
125
+ * live `start`, this survives reschedules — it identifies the slot the
126
+ * instance was generated for, so it's the right key for "this and following"
127
+ * boundaries and append points.
128
+ */
129
+ function getOccurrenceInstant(appointment) {
130
+ const value = getOccurrenceIdentifier(appointment);
131
+ if (!value)
132
+ return null;
133
+ const slash = value.indexOf("/");
134
+ if (slash === -1 || slash === value.length - 1) {
135
+ throw new Error(`Malformed occurrence identifier: ${value}`);
136
+ }
137
+ return value.slice(slash + 1);
138
+ }
139
+ /** Returns the RRULE string carried on an Appointment, or null. */
140
+ function getRecurrenceRule(appointment) {
141
+ const extension = appointment.extension?.find((ext) => ext.url === exports.RECURRENCE_RULE_EXTENSION_URL);
142
+ return extension?.valueString ?? null;
143
+ }
144
+ /** Returns the series' IANA time zone, or null. */
145
+ function getRecurrenceTimezone(appointment) {
146
+ const extension = appointment.extension?.find((ext) => ext.url === exports.RECURRENCE_TIMEZONE_EXTENSION_URL);
147
+ return extension?.valueString ?? null;
148
+ }
149
+ /**
150
+ * Returns the series anchor (first-occurrence instant), or null when absent.
151
+ * Throws on a malformed stored value — that's a producer bug to surface, not
152
+ * a state to paper over.
153
+ */
154
+ function getRecurrenceAnchor(appointment) {
155
+ const extension = appointment.extension?.find((ext) => ext.url === exports.RECURRENCE_ANCHOR_EXTENSION_URL);
156
+ if (!extension?.valueDateTime)
157
+ return null;
158
+ const anchor = new Date(extension.valueDateTime);
159
+ if (Number.isNaN(anchor.getTime())) {
160
+ throw new Error(`Invalid recurrence anchor on Appointment: ${extension.valueDateTime}`);
161
+ }
162
+ return anchor;
163
+ }
164
+ /** True when this instance has been edited away from its series template. */
165
+ function isSeriesInstanceOverridden(appointment) {
166
+ const extension = appointment.extension?.find((ext) => ext.url === exports.SERIES_INSTANCE_OVERRIDDEN_EXTENSION_URL);
167
+ return extension?.valueBoolean === true;
168
+ }
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwb2ludG1lbnQtc2VyaWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4dGVuc2lvbnMvb24tc2l0ZS1tZWRpY2FsL2FwcG9pbnRtZW50LXNlcmllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2RkEsc0RBRUM7QUFRRCw4REFRQztBQUdELG9FQUVDO0FBR0QsNEVBRUM7QUFHRCx3RUFLQztBQUdELHdGQUVDO0FBR0Qsa0NBS0M7QUFHRCwwREFPQztBQVNELG9EQVFDO0FBR0QsOENBS0M7QUFHRCxzREFLQztBQU9ELGtEQVlDO0FBR0QsZ0VBS0M7QUFwTkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCw2QkFBd0I7QUFLeEIsZ0VBQWdFO0FBQ25ELFFBQUEseUJBQXlCLEdBQ3BDLGtFQUEyRSxDQUFDO0FBRTlFLGtFQUFrRTtBQUNyRCxRQUFBLG9DQUFvQyxHQUMvQyw2RUFBc0YsQ0FBQztBQUV6Riw2REFBNkQ7QUFDaEQsUUFBQSw2QkFBNkIsR0FDeEMsc0VBQStFLENBQUM7QUFFbEYscURBQXFEO0FBQ3hDLFFBQUEsaUNBQWlDLEdBQzVDLDBFQUFtRixDQUFDO0FBRXRGLGdGQUFnRjtBQUNuRSxRQUFBLCtCQUErQixHQUMxQyx3RUFBaUYsQ0FBQztBQUVwRiwyRUFBMkU7QUFDOUQsUUFBQSx3Q0FBd0MsR0FDbkQsaUZBQTBGLENBQUM7QUFFaEYsUUFBQSw2QkFBNkIsR0FBRyxPQUFDO0tBQzNDLE1BQU0sQ0FBQztJQUNOLEdBQUcsRUFBRSxPQUFDLENBQUMsT0FBTyxDQUFDLHFDQUE2QixDQUFDO0lBQzdDLFdBQVcsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO0NBQ3hCLENBQUM7S0FDRCxXQUFXLEVBQUUsQ0FBQztBQUtKLFFBQUEsaUNBQWlDLEdBQUcsT0FBQztLQUMvQyxNQUFNLENBQUM7SUFDTixHQUFHLEVBQUUsT0FBQyxDQUFDLE9BQU8sQ0FBQyx5Q0FBaUMsQ0FBQztJQUNqRCxX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SUFBSSxLQUFLLENBQ2IsNkNBQTZDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FDdkUsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLFNBQWdCLDBCQUEwQixDQUFDLFdBQXdCO0lBQ2pFLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUMzQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxnREFBd0MsQ0FDOUQsQ0FBQztJQUNGLE9BQU8sU0FBUyxFQUFFLFlBQVksS0FBSyxJQUFJLENBQUM7QUFDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSGFuZC1hdXRob3JlZCBpZGVudGlmaWVyIHN5c3RlbXMsIGV4dGVuc2lvbiBVUkxzLCBzY2hlbWFzLCBhbmQgYWNjZXNzb3JzXG4gKiBmb3IgdGhlIHJlY3VycmluZy1hcHBvaW50bWVudCBzZXJpZXMgY29udHJhY3QuXG4gKlxuICogKipOYW1lc3BhY2UgcHJvdmVuYW5jZToqKiB0aGVzZSBVUkxzIGxpdmUgaW4gdGhlIGBvbi1zaXRlLW1lZGljYWwuYXBwYFxuICogbmFtZXNwYWNlIGJlY2F1c2UgdGhlIGNvbnRyYWN0IG9yaWdpbmF0ZWQgaW4gdGhlIG9uLXNpdGUtbWVkaWNhbFxuICogZnJvbnRlbmQgKGl0cyBBRFIgYGRvY3MvZmhpci1tYXBwaW5nL2Fkci1yZWN1cnJpbmctYXBwb2ludG1lbnRzLm1kYCkgYW5kXG4gKiBsaXZlIGRhdGEgYWxyZWFkeSBjYXJyaWVzIHRoZW0g4oCUIHRoZXkgYXJlIGZyb3plbi4gVGhlIGNvbmNlcHRzIGFyZSBub3RcbiAqIGN1c3RvbWVyLXNwZWNpZmljOiBpZiByZWN1cnJpbmctc2VyaWVzIHN1cHBvcnQgaXMgbGF0ZXIgcHJvbW90ZWQgdG8gYVxuICogcGxhdGZvcm0tbGV2ZWwgZmVhdHVyZSwgdGhlIHBhdGggaXMgbWludGluZyBgaGw3Lm9wZW5oaS5vcmdgIFVSTHMgYW5kXG4gKiBtaWdyYXRpbmcgc3RvcmVkIGRhdGEsIG5vdCByZS10eXBpbmcuIFVudGlsIHRoZW4gdGhpcyBtb2R1bGUgaXMgdGhlXG4gKiBzaW5nbGUgc2hhcmVkIGRlZmluaXRpb24gZm9yIGJvdGggdGhlIE9wZW5ISSBiYWNrZW5kIChzZXJpZXMgb3BlcmF0aW9ucyxcbiAqIGBAb3BlbmhpL2NvbnN0cnVjdHNgIGBzcmMvZGF0YS9yZWN1cnJlbmNlL2ApIGFuZCB0aGUgb24tc2l0ZS1tZWRpY2FsXG4gKiBmcm9udGVuZC5cbiAqXG4gKiBBIHJlY3VycmluZyBzZXJpZXMgaXMgTiBpbmRlcGVuZGVudCBBcHBvaW50bWVudHMgc2hhcmluZyB0aGUgc2VyaWVzXG4gKiBpZGVudGlmaWVyOyBlYWNoIGluc3RhbmNlIGFsc28gY2FycmllcyBhIGRldGVybWluaXN0aWMgcGVyLW9jY3VycmVuY2VcbiAqIGlkZW50aWZpZXIgKGA8c2VyaWVzSWQ+LzxvY2N1cnJlbmNlIGluc3RhbnQgSVNPPmAg4oCUIHRoZSBnZW5lcmF0ZWQgc2xvdCxcbiAqIHN0YWJsZSBhY3Jvc3MgcmVzY2hlZHVsZXMpIGFuZCB0aHJlZSByZS1leHBhbnNpb24gZXh0ZW5zaW9ucyAoUlJVTEUsXG4gKiBJQU5BIHRpbWV6b25lLCBzZXJpZXMgYW5jaG9yKS4gSW5zdGFuY2VzIGluZGl2aWR1YWxseSBlZGl0ZWQgYXdheSBmcm9tXG4gKiB0aGUgc2VyaWVzIHRlbXBsYXRlIGFyZSBmbGFnZ2VkIGBzZXJpZXMtaW5zdGFuY2Utb3ZlcnJpZGRlbmAgc29cbiAqIHNlcmllcy13aWRlIGVkaXRzIHNraXAgdGhlbS5cbiAqL1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQXBwb2ludG1lbnQgfSBmcm9tIFwiLi4vLi4vZGF0YS9hcHBvaW50bWVudFwiO1xuaW1wb3J0IHR5cGUgeyBFeHRlbnNpb24gfSBmcm9tIFwiLi4vLi4vZGF0YS9leHRlbnNpb25cIjtcbmltcG9ydCB0eXBlIHsgSWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9kYXRhL2lkZW50aWZpZXJcIjtcblxuLyoqIElkZW50aWZpZXIgc3lzdGVtIHNoYXJlZCBieSBldmVyeSBpbnN0YW5jZSBvZiBvbmUgc2VyaWVzLiAqL1xuZXhwb3J0IGNvbnN0IEFQUE9JTlRNRU5UX1NFUklFU19TWVNURU0gPVxuICBcImh0dHBzOi8vb24tc2l0ZS1tZWRpY2FsLmFwcC9maGlyL05hbWluZ1N5c3RlbS9hcHBvaW50bWVudC1zZXJpZXNcIiBhcyBjb25zdDtcblxuLyoqIElkZW50aWZpZXIgc3lzdGVtIGZvciB0aGUgZGV0ZXJtaW5pc3RpYyBwZXItb2NjdXJyZW5jZSBrZXkuICovXG5leHBvcnQgY29uc3QgQVBQT0lOVE1FTlRfU0VSSUVTX09DQ1VSUkVOQ0VfU1lTVEVNID1cbiAgXCJodHRwczovL29uLXNpdGUtbWVkaWNhbC5hcHAvZmhpci9OYW1pbmdTeXN0ZW0vYXBwb2ludG1lbnQtc2VyaWVzLW9jY3VycmVuY2VcIiBhcyBjb25zdDtcblxuLyoqIEV4dGVuc2lvbiBjYXJyeWluZyB0aGUgUkZDIDU1NDUgUlJVTEUgc3RyaW5nIChzdWJzZXQpLiAqL1xuZXhwb3J0IGNvbnN0IFJFQ1VSUkVOQ0VfUlVMRV9FWFRFTlNJT05fVVJMID1cbiAgXCJodHRwczovL29uLXNpdGUtbWVkaWNhbC5hcHAvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL3JlY3VycmVuY2UtcnVsZVwiIGFzIGNvbnN0O1xuXG4vKiogRXh0ZW5zaW9uIGNhcnJ5aW5nIHRoZSBzZXJpZXMnIElBTkEgdGltZSB6b25lLiAqL1xuZXhwb3J0IGNvbnN0IFJFQ1VSUkVOQ0VfVElNRVpPTkVfRVhURU5TSU9OX1VSTCA9XG4gIFwiaHR0cHM6Ly9vbi1zaXRlLW1lZGljYWwuYXBwL2ZoaXIvU3RydWN0dXJlRGVmaW5pdGlvbi9yZWN1cnJlbmNlLXRpbWV6b25lXCIgYXMgY29uc3Q7XG5cbi8qKiBFeHRlbnNpb24gY2FycnlpbmcgdGhlIHNlcmllcyBhbmNob3IgKGZpcnN0LW9jY3VycmVuY2UgaW5zdGFudCwgRFRTVEFSVCkuICovXG5leHBvcnQgY29uc3QgUkVDVVJSRU5DRV9BTkNIT1JfRVhURU5TSU9OX1VSTCA9XG4gIFwiaHR0cHM6Ly9vbi1zaXRlLW1lZGljYWwuYXBwL2ZoaXIvU3RydWN0dXJlRGVmaW5pdGlvbi9yZWN1cnJlbmNlLWFuY2hvclwiIGFzIGNvbnN0O1xuXG4vKiogRXh0ZW5zaW9uIGZsYWdnaW5nIGFuIGluc3RhbmNlIGFzIGRpdmVyZ2VkIGZyb20gaXRzIHNlcmllcyB0ZW1wbGF0ZS4gKi9cbmV4cG9ydCBjb25zdCBTRVJJRVNfSU5TVEFOQ0VfT1ZFUlJJRERFTl9FWFRFTlNJT05fVVJMID1cbiAgXCJodHRwczovL29uLXNpdGUtbWVkaWNhbC5hcHAvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL3Nlcmllcy1pbnN0YW5jZS1vdmVycmlkZGVuXCIgYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZWN1cnJlbmNlUnVsZUV4dGVuc2lvblNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdXJsOiB6LmxpdGVyYWwoUkVDVVJSRU5DRV9SVUxFX0VYVEVOU0lPTl9VUkwpLFxuICAgIHZhbHVlU3RyaW5nOiB6LnN0cmluZygpLFxuICB9KVxuICAucGFzc3Rocm91Z2goKTtcbmV4cG9ydCB0eXBlIFJlY3VycmVuY2VSdWxlRXh0ZW5zaW9uID0gei5pbmZlcjxcbiAgdHlwZW9mIHJlY3VycmVuY2VSdWxlRXh0ZW5zaW9uU2NoZW1hXG4+O1xuXG5leHBvcnQgY29uc3QgcmVjdXJyZW5jZVRpbWV6b25lRXh0ZW5zaW9uU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICB1cmw6IHoubGl0ZXJhbChSRUNVUlJFTkNFX1RJTUVaT05FX0VYVEVOU0lPTl9VUkwpLFxuICAgIHZhbHVlU3RyaW5nOiB6LnN0cmluZygpLFxuICB9KVxuICAucGFzc3Rocm91Z2goKTtcbmV4cG9ydCB0eXBlIFJlY3VycmVuY2VUaW1lem9uZUV4dGVuc2lvbiA9IHouaW5mZXI8XG4gIHR5cGVvZiByZWN1cnJlbmNlVGltZXpvbmVFeHRlbnNpb25TY2hlbWFcbj47XG5cbmV4cG9ydCBjb25zdCByZWN1cnJlbmNlQW5jaG9yRXh0ZW5zaW9uU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICB1cmw6IHoubGl0ZXJhbChSRUNVUlJFTkNFX0FOQ0hPUl9FWFRFTlNJT05fVVJMKSxcbiAgICB2YWx1ZURhdGVUaW1lOiB6LnN0cmluZygpLFxuICB9KVxuICAucGFzc3Rocm91Z2goKTtcbmV4cG9ydCB0eXBlIFJlY3VycmVuY2VBbmNob3JFeHRlbnNpb24gPSB6LmluZmVyPFxuICB0eXBlb2YgcmVjdXJyZW5jZUFuY2hvckV4dGVuc2lvblNjaGVtYVxuPjtcblxuZXhwb3J0IGNvbnN0IHNlcmllc0luc3RhbmNlT3ZlcnJpZGRlbkV4dGVuc2lvblNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdXJsOiB6LmxpdGVyYWwoU0VSSUVTX0lOU1RBTkNFX09WRVJSSURERU5fRVhURU5TSU9OX1VSTCksXG4gICAgdmFsdWVCb29sZWFuOiB6LmJvb2xlYW4oKSxcbiAgfSlcbiAgLnBhc3N0aHJvdWdoKCk7XG5leHBvcnQgdHlwZSBTZXJpZXNJbnN0YW5jZU92ZXJyaWRkZW5FeHRlbnNpb24gPSB6LmluZmVyPFxuICB0eXBlb2Ygc2VyaWVzSW5zdGFuY2VPdmVycmlkZGVuRXh0ZW5zaW9uU2NoZW1hXG4+O1xuXG4vKiogQnVpbGRzIHRoZSBzaGFyZWQgc2VyaWVzIGlkZW50aWZpZXIgc3RhbXBlZCBvbiBldmVyeSBpbnN0YW5jZSBvZiBhIHNlcmllcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNlcmllc0lkZW50aWZpZXIoc2VyaWVzSWQ6IHN0cmluZyk6IElkZW50aWZpZXIge1xuICByZXR1cm4geyBzeXN0ZW06IEFQUE9JTlRNRU5UX1NFUklFU19TWVNURU0sIHZhbHVlOiBzZXJpZXNJZCB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZGV0ZXJtaW5pc3RpYyBwZXItb2NjdXJyZW5jZSBpZGVudGlmaWVyXG4gKiAoYDxzZXJpZXNJZD4vPG9jY3VycmVuY2UgaW5zdGFudD5gKS4gVGhlIG9jY3VycmVuY2UgaW5zdGFudCBpcyB0aGUgc2xvdCB0aGVcbiAqIGluc3RhbmNlIHdhcyBnZW5lcmF0ZWQgZm9yOyBpdCBzdGF5cyBzdGFibGUgaWYgdGhlIGluc3RhbmNlIGlzIGxhdGVyXG4gKiByZXNjaGVkdWxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT2NjdXJyZW5jZUlkZW50aWZpZXIoXG4gIHNlcmllc0lkOiBzdHJpbmcsXG4gIG9jY3VycmVuY2U6IERhdGUsXG4pOiBJZGVudGlmaWVyIHtcbiAgcmV0dXJuIHtcbiAgICBzeXN0ZW06IEFQUE9JTlRNRU5UX1NFUklFU19PQ0NVUlJFTkNFX1NZU1RFTSxcbiAgICB2YWx1ZTogYCR7c2VyaWVzSWR9LyR7b2NjdXJyZW5jZS50b0lTT1N0cmluZygpfWAsXG4gIH07XG59XG5cbi8qKiBCdWlsZHMgdGhlIGV4dGVuc2lvbiBjYXJyeWluZyB0aGUgUkZDIDU1NDUgUlJVTEUgc3RyaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVjdXJyZW5jZVJ1bGVFeHRlbnNpb24ocnJ1bGU6IHN0cmluZyk6IEV4dGVuc2lvbiB7XG4gIHJldHVybiB7IHVybDogUkVDVVJSRU5DRV9SVUxFX0VYVEVOU0lPTl9VUkwsIHZhbHVlU3RyaW5nOiBycnVsZSB9O1xufVxuXG4vKiogQnVpbGRzIHRoZSBleHRlbnNpb24gY2FycnlpbmcgdGhlIHNlcmllcycgSUFOQSB0aW1lIHpvbmUuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSZWN1cnJlbmNlVGltZXpvbmVFeHRlbnNpb24odGltZXpvbmU6IHN0cmluZyk6IEV4dGVuc2lvbiB7XG4gIHJldHVybiB7IHVybDogUkVDVVJSRU5DRV9USU1FWk9ORV9FWFRFTlNJT05fVVJMLCB2YWx1ZVN0cmluZzogdGltZXpvbmUgfTtcbn1cblxuLyoqIEJ1aWxkcyB0aGUgZXh0ZW5zaW9uIGNhcnJ5aW5nIHRoZSBzZXJpZXMgYW5jaG9yIChmaXJzdC1vY2N1cnJlbmNlIGluc3RhbnQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVjdXJyZW5jZUFuY2hvckV4dGVuc2lvbihhbmNob3I6IERhdGUpOiBFeHRlbnNpb24ge1xuICByZXR1cm4ge1xuICAgIHVybDogUkVDVVJSRU5DRV9BTkNIT1JfRVhURU5TSU9OX1VSTCxcbiAgICB2YWx1ZURhdGVUaW1lOiBhbmNob3IudG9JU09TdHJpbmcoKSxcbiAgfTtcbn1cblxuLyoqIEJ1aWxkcyB0aGUgZXh0ZW5zaW9uIHRoYXQgbWFya3MgYW4gaW5zdGFuY2UgYXMgZGl2ZXJnZWQgZnJvbSBpdHMgc2VyaWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2VyaWVzSW5zdGFuY2VPdmVycmlkZGVuRXh0ZW5zaW9uKCk6IEV4dGVuc2lvbiB7XG4gIHJldHVybiB7IHVybDogU0VSSUVTX0lOU1RBTkNFX09WRVJSSURERU5fRVhURU5TSU9OX1VSTCwgdmFsdWVCb29sZWFuOiB0cnVlIH07XG59XG5cbi8qKiBSZXR1cm5zIHRoZSBzZXJpZXMgaWQgYW4gQXBwb2ludG1lbnQgYmVsb25ncyB0bywgb3IgbnVsbCBpZiBpdCBpcyBzdGFuZGFsb25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcmllc0lkKGFwcG9pbnRtZW50OiBBcHBvaW50bWVudCk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBpZGVudGlmaWVyID0gYXBwb2ludG1lbnQuaWRlbnRpZmllcj8uZmluZChcbiAgICAoaWQpID0+IGlkLnN5c3RlbSA9PT0gQVBQT0lOVE1FTlRfU0VSSUVTX1NZU1RFTSxcbiAgKTtcbiAgcmV0dXJuIGlkZW50aWZpZXI/LnZhbHVlID8/IG51bGw7XG59XG5cbi8qKiBSZXR1cm5zIHRoZSBwZXItb2NjdXJyZW5jZSBpZGVudGlmaWVyIHZhbHVlLCBvciBudWxsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9jY3VycmVuY2VJZGVudGlmaWVyKFxuICBhcHBvaW50bWVudDogQXBwb2ludG1lbnQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgaWRlbnRpZmllciA9IGFwcG9pbnRtZW50LmlkZW50aWZpZXI/LmZpbmQoXG4gICAgKGlkKSA9PiBpZC5zeXN0ZW0gPT09IEFQUE9JTlRNRU5UX1NFUklFU19PQ0NVUlJFTkNFX1NZU1RFTSxcbiAgKTtcbiAgcmV0dXJuIGlkZW50aWZpZXI/LnZhbHVlID8/IG51bGw7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb2NjdXJyZW5jZSdzIG9yaWdpbmFsIHNsb3QgaW5zdGFudCAoSVNPIHN0cmluZykgcGFyc2VkIGZyb20gdGhlXG4gKiBwZXItb2NjdXJyZW5jZSBpZGVudGlmaWVyIChgPHNlcmllc0lkPi88aW5zdGFudD5gKSwgb3IgbnVsbC4gVW5saWtlIHRoZVxuICogbGl2ZSBgc3RhcnRgLCB0aGlzIHN1cnZpdmVzIHJlc2NoZWR1bGVzIOKAlCBpdCBpZGVudGlmaWVzIHRoZSBzbG90IHRoZVxuICogaW5zdGFuY2Ugd2FzIGdlbmVyYXRlZCBmb3IsIHNvIGl0J3MgdGhlIHJpZ2h0IGtleSBmb3IgXCJ0aGlzIGFuZCBmb2xsb3dpbmdcIlxuICogYm91bmRhcmllcyBhbmQgYXBwZW5kIHBvaW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9jY3VycmVuY2VJbnN0YW50KGFwcG9pbnRtZW50OiBBcHBvaW50bWVudCk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB2YWx1ZSA9IGdldE9jY3VycmVuY2VJZGVudGlmaWVyKGFwcG9pbnRtZW50KTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHNsYXNoID0gdmFsdWUuaW5kZXhPZihcIi9cIik7XG4gIGlmIChzbGFzaCA9PT0gLTEgfHwgc2xhc2ggPT09IHZhbHVlLmxlbmd0aCAtIDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1hbGZvcm1lZCBvY2N1cnJlbmNlIGlkZW50aWZpZXI6ICR7dmFsdWV9YCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlLnNsaWNlKHNsYXNoICsgMSk7XG59XG5cbi8qKiBSZXR1cm5zIHRoZSBSUlVMRSBzdHJpbmcgY2FycmllZCBvbiBhbiBBcHBvaW50bWVudCwgb3IgbnVsbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWN1cnJlbmNlUnVsZShhcHBvaW50bWVudDogQXBwb2ludG1lbnQpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gYXBwb2ludG1lbnQuZXh0ZW5zaW9uPy5maW5kKFxuICAgIChleHQpID0+IGV4dC51cmwgPT09IFJFQ1VSUkVOQ0VfUlVMRV9FWFRFTlNJT05fVVJMLFxuICApO1xuICByZXR1cm4gZXh0ZW5zaW9uPy52YWx1ZVN0cmluZyA/PyBudWxsO1xufVxuXG4vKiogUmV0dXJucyB0aGUgc2VyaWVzJyBJQU5BIHRpbWUgem9uZSwgb3IgbnVsbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWN1cnJlbmNlVGltZXpvbmUoYXBwb2ludG1lbnQ6IEFwcG9pbnRtZW50KTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGFwcG9pbnRtZW50LmV4dGVuc2lvbj8uZmluZChcbiAgICAoZXh0KSA9PiBleHQudXJsID09PSBSRUNVUlJFTkNFX1RJTUVaT05FX0VYVEVOU0lPTl9VUkwsXG4gICk7XG4gIHJldHVybiBleHRlbnNpb24/LnZhbHVlU3RyaW5nID8/IG51bGw7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2VyaWVzIGFuY2hvciAoZmlyc3Qtb2NjdXJyZW5jZSBpbnN0YW50KSwgb3IgbnVsbCB3aGVuIGFic2VudC5cbiAqIFRocm93cyBvbiBhIG1hbGZvcm1lZCBzdG9yZWQgdmFsdWUg4oCUIHRoYXQncyBhIHByb2R1Y2VyIGJ1ZyB0byBzdXJmYWNlLCBub3RcbiAqIGEgc3RhdGUgdG8gcGFwZXIgb3Zlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlY3VycmVuY2VBbmNob3IoYXBwb2ludG1lbnQ6IEFwcG9pbnRtZW50KTogRGF0ZSB8IG51bGwge1xuICBjb25zdCBleHRlbnNpb24gPSBhcHBvaW50bWVudC5leHRlbnNpb24/LmZpbmQoXG4gICAgKGV4dCkgPT4gZXh0LnVybCA9PT0gUkVDVVJSRU5DRV9BTkNIT1JfRVhURU5TSU9OX1VSTCxcbiAgKTtcbiAgaWYgKCFleHRlbnNpb24/LnZhbHVlRGF0ZVRpbWUpIHJldHVybiBudWxsO1xuICBjb25zdCBhbmNob3IgPSBuZXcgRGF0ZShleHRlbnNpb24udmFsdWVEYXRlVGltZSk7XG4gIGlmIChOdW1iZXIuaXNOYU4oYW5jaG9yLmdldFRpbWUoKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCByZWN1cnJlbmNlIGFuY2hvciBvbiBBcHBvaW50bWVudDogJHtleHRlbnNpb24udmFsdWVEYXRlVGltZX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGFuY2hvcjtcbn1cblxuLyoqIFRydWUgd2hlbiB0aGlzIGluc3RhbmNlIGhhcyBiZWVuIGVkaXRlZCBhd2F5IGZyb20gaXRzIHNlcmllcyB0ZW1wbGF0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Nlcmllc0luc3RhbmNlT3ZlcnJpZGRlbihhcHBvaW50bWVudDogQXBwb2ludG1lbnQpOiBib29sZWFuIHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gYXBwb2ludG1lbnQuZXh0ZW5zaW9uPy5maW5kKFxuICAgIChleHQpID0+IGV4dC51cmwgPT09IFNFUklFU19JTlNUQU5DRV9PVkVSUklEREVOX0VYVEVOU0lPTl9VUkwsXG4gICk7XG4gIHJldHVybiBleHRlbnNpb24/LnZhbHVlQm9vbGVhbiA9PT0gdHJ1ZTtcbn1cbiJdfQ==
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Customer-namespaced (`on-site-medical.app`) extension and identifier
3
+ * contracts. Hand-authored, like `../openhi`. See the provenance note in
4
+ * each module — these are frozen wire contracts shared by the OpenHI
5
+ * backend and the on-site-medical frontend, candidates for promotion to
6
+ * platform (`hl7.openhi.org`) namespacing via a future data migration.
7
+ */
8
+ export * from "./appointment-series";
9
+ export * from "./supply-request-encounter";
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ /**
18
+ * Customer-namespaced (`on-site-medical.app`) extension and identifier
19
+ * contracts. Hand-authored, like `../openhi`. See the provenance note in
20
+ * each module — these are frozen wire contracts shared by the OpenHI
21
+ * backend and the on-site-medical frontend, candidates for promotion to
22
+ * platform (`hl7.openhi.org`) namespacing via a future data migration.
23
+ */
24
+ __exportStar(require("./appointment-series"), exports);
25
+ __exportStar(require("./supply-request-encounter"), exports);
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXh0ZW5zaW9ucy9vbi1zaXRlLW1lZGljYWwvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7R0FNRztBQUNILHVEQUFxQztBQUNyQyw2REFBMkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN1c3RvbWVyLW5hbWVzcGFjZWQgKGBvbi1zaXRlLW1lZGljYWwuYXBwYCkgZXh0ZW5zaW9uIGFuZCBpZGVudGlmaWVyXG4gKiBjb250cmFjdHMuIEhhbmQtYXV0aG9yZWQsIGxpa2UgYC4uL29wZW5oaWAuIFNlZSB0aGUgcHJvdmVuYW5jZSBub3RlIGluXG4gKiBlYWNoIG1vZHVsZSDigJQgdGhlc2UgYXJlIGZyb3plbiB3aXJlIGNvbnRyYWN0cyBzaGFyZWQgYnkgdGhlIE9wZW5ISVxuICogYmFja2VuZCBhbmQgdGhlIG9uLXNpdGUtbWVkaWNhbCBmcm9udGVuZCwgY2FuZGlkYXRlcyBmb3IgcHJvbW90aW9uIHRvXG4gKiBwbGF0Zm9ybSAoYGhsNy5vcGVuaGkub3JnYCkgbmFtZXNwYWNpbmcgdmlhIGEgZnV0dXJlIGRhdGEgbWlncmF0aW9uLlxuICovXG5leHBvcnQgKiBmcm9tIFwiLi9hcHBvaW50bWVudC1zZXJpZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N1cHBseS1yZXF1ZXN0LWVuY291bnRlclwiO1xuIl19
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Hand-authored contract for the `supply-request-encounter` extension —
3
+ * the `Encounter` a `SupplyRequest` belongs to.
4
+ *
5
+ * **Why it exists:** neither FHIR R4 nor R5 gives `SupplyRequest` an
6
+ * `encounter` field (R5 adds only `deliverFor` → Patient). The
7
+ * on-site-medical frontend carries the encounter reference in this narrow
8
+ * custom extension so supply orders can be filtered by visit — and, for
9
+ * facility orders (`deliverTo` = Location, not Patient), it is the only path
10
+ * from the order to its patient (order → Encounter → `Encounter.subject`).
11
+ *
12
+ * **Namespace provenance:** `on-site-medical.app` — the contract originated
13
+ * in the frontend and live data already carries it (frozen). This module is
14
+ * the single shared definition: the frontend writes the extension, and the
15
+ * OpenHI backend's `SupplyRequest ?encounter=` search filter matches against
16
+ * this same URL, so the two cannot drift.
17
+ *
18
+ * @see sites/app-ehr/docs/fhir/extensions/supply-request-encounter.md
19
+ */
20
+ import { z } from "zod";
21
+ import type { Extension } from "../../data/extension";
22
+ import type { Reference } from "../../data/reference";
23
+ import type { SupplyRequest } from "../../data/supplyrequest";
24
+ /** `SupplyRequest.extension.url` carrying the `Reference(Encounter)`. */
25
+ export declare const SUPPLY_REQUEST_ENCOUNTER_EXTENSION_URL: "https://on-site-medical.app/fhir/StructureDefinition/supply-request-encounter";
26
+ export declare const supplyRequestEncounterExtensionSchema: z.ZodObject<{
27
+ url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/supply-request-encounter">;
28
+ valueReference: z.ZodType<Reference, z.ZodTypeDef, Reference>;
29
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
30
+ url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/supply-request-encounter">;
31
+ valueReference: z.ZodType<Reference, z.ZodTypeDef, Reference>;
32
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
33
+ url: z.ZodLiteral<"https://on-site-medical.app/fhir/StructureDefinition/supply-request-encounter">;
34
+ valueReference: z.ZodType<Reference, z.ZodTypeDef, Reference>;
35
+ }, z.ZodTypeAny, "passthrough">>;
36
+ export type SupplyRequestEncounterExtension = z.infer<typeof supplyRequestEncounterExtensionSchema>;
37
+ /** Build the extension carrying the encounter a supply order belongs to. */
38
+ export declare function buildSupplyRequestEncounterExtension(encounter: Reference): Extension;
39
+ /**
40
+ * Returns the encounter reference (`Encounter/<id>`) a SupplyRequest belongs
41
+ * to, or null when the extension is absent.
42
+ */
43
+ export declare function getSupplyRequestEncounter(supplyRequest: SupplyRequest): string | null;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.supplyRequestEncounterExtensionSchema = exports.SUPPLY_REQUEST_ENCOUNTER_EXTENSION_URL = void 0;
4
+ exports.buildSupplyRequestEncounterExtension = buildSupplyRequestEncounterExtension;
5
+ exports.getSupplyRequestEncounter = getSupplyRequestEncounter;
6
+ /**
7
+ * Hand-authored contract for the `supply-request-encounter` extension —
8
+ * the `Encounter` a `SupplyRequest` belongs to.
9
+ *
10
+ * **Why it exists:** neither FHIR R4 nor R5 gives `SupplyRequest` an
11
+ * `encounter` field (R5 adds only `deliverFor` → Patient). The
12
+ * on-site-medical frontend carries the encounter reference in this narrow
13
+ * custom extension so supply orders can be filtered by visit — and, for
14
+ * facility orders (`deliverTo` = Location, not Patient), it is the only path
15
+ * from the order to its patient (order → Encounter → `Encounter.subject`).
16
+ *
17
+ * **Namespace provenance:** `on-site-medical.app` — the contract originated
18
+ * in the frontend and live data already carries it (frozen). This module is
19
+ * the single shared definition: the frontend writes the extension, and the
20
+ * OpenHI backend's `SupplyRequest ?encounter=` search filter matches against
21
+ * this same URL, so the two cannot drift.
22
+ *
23
+ * @see sites/app-ehr/docs/fhir/extensions/supply-request-encounter.md
24
+ */
25
+ const zod_1 = require("zod");
26
+ const reference_1 = require("../../data/reference");
27
+ /** `SupplyRequest.extension.url` carrying the `Reference(Encounter)`. */
28
+ exports.SUPPLY_REQUEST_ENCOUNTER_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/supply-request-encounter";
29
+ exports.supplyRequestEncounterExtensionSchema = zod_1.z
30
+ .object({
31
+ url: zod_1.z.literal(exports.SUPPLY_REQUEST_ENCOUNTER_EXTENSION_URL),
32
+ valueReference: reference_1.referenceSchema,
33
+ })
34
+ .passthrough();
35
+ /** Build the extension carrying the encounter a supply order belongs to. */
36
+ function buildSupplyRequestEncounterExtension(encounter) {
37
+ return {
38
+ url: exports.SUPPLY_REQUEST_ENCOUNTER_EXTENSION_URL,
39
+ valueReference: encounter,
40
+ };
41
+ }
42
+ /**
43
+ * Returns the encounter reference (`Encounter/<id>`) a SupplyRequest belongs
44
+ * to, or null when the extension is absent.
45
+ */
46
+ function getSupplyRequestEncounter(supplyRequest) {
47
+ const extension = supplyRequest.extension?.find((ext) => ext.url === exports.SUPPLY_REQUEST_ENCOUNTER_EXTENSION_URL);
48
+ return extension?.valueReference?.reference ?? null;
49
+ }
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwcGx5LXJlcXVlc3QtZW5jb3VudGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4dGVuc2lvbnMvb24tc2l0ZS1tZWRpY2FsL3N1cHBseS1yZXF1ZXN0LWVuY291bnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF3Q0Esb0ZBT0M7QUFNRCw4REFPQztBQTVERDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsNkJBQXdCO0FBR3hCLG9EQUF1RDtBQUd2RCx5RUFBeUU7QUFDNUQsUUFBQSxzQ0FBc0MsR0FDakQsK0VBQXdGLENBQUM7QUFFOUUsUUFBQSxxQ0FBcUMsR0FBRyxPQUFDO0tBQ25ELE1BQU0sQ0FBQztJQUNOLEdBQUcsRUFBRSxPQUFDLENBQUMsT0FBTyxDQUFDLDhDQUFzQyxDQUFDO0lBQ3RELGNBQWMsRUFBRSwyQkFBZTtDQUNoQyxDQUFDO0tBQ0QsV0FBVyxFQUFFLENBQUM7QUFLakIsNEVBQTRFO0FBQzVFLFNBQWdCLG9DQUFvQyxDQUNsRCxTQUFvQjtJQUVwQixPQUFPO1FBQ0wsR0FBRyxFQUFFLDhDQUFzQztRQUMzQyxjQUFjLEVBQUUsU0FBUztLQUMxQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLHlCQUF5QixDQUN2QyxhQUE0QjtJQUU1QixNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksQ0FDN0MsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssOENBQXNDLENBQzVELENBQUM7SUFDRixPQUFPLFNBQVMsRUFBRSxjQUFjLEVBQUUsU0FBUyxJQUFJLElBQUksQ0FBQztBQUN0RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIYW5kLWF1dGhvcmVkIGNvbnRyYWN0IGZvciB0aGUgYHN1cHBseS1yZXF1ZXN0LWVuY291bnRlcmAgZXh0ZW5zaW9uIOKAlFxuICogdGhlIGBFbmNvdW50ZXJgIGEgYFN1cHBseVJlcXVlc3RgIGJlbG9uZ3MgdG8uXG4gKlxuICogKipXaHkgaXQgZXhpc3RzOioqIG5laXRoZXIgRkhJUiBSNCBub3IgUjUgZ2l2ZXMgYFN1cHBseVJlcXVlc3RgIGFuXG4gKiBgZW5jb3VudGVyYCBmaWVsZCAoUjUgYWRkcyBvbmx5IGBkZWxpdmVyRm9yYCDihpIgUGF0aWVudCkuIFRoZVxuICogb24tc2l0ZS1tZWRpY2FsIGZyb250ZW5kIGNhcnJpZXMgdGhlIGVuY291bnRlciByZWZlcmVuY2UgaW4gdGhpcyBuYXJyb3dcbiAqIGN1c3RvbSBleHRlbnNpb24gc28gc3VwcGx5IG9yZGVycyBjYW4gYmUgZmlsdGVyZWQgYnkgdmlzaXQg4oCUIGFuZCwgZm9yXG4gKiBmYWNpbGl0eSBvcmRlcnMgKGBkZWxpdmVyVG9gID0gTG9jYXRpb24sIG5vdCBQYXRpZW50KSwgaXQgaXMgdGhlIG9ubHkgcGF0aFxuICogZnJvbSB0aGUgb3JkZXIgdG8gaXRzIHBhdGllbnQgKG9yZGVyIOKGkiBFbmNvdW50ZXIg4oaSIGBFbmNvdW50ZXIuc3ViamVjdGApLlxuICpcbiAqICoqTmFtZXNwYWNlIHByb3ZlbmFuY2U6KiogYG9uLXNpdGUtbWVkaWNhbC5hcHBgIOKAlCB0aGUgY29udHJhY3Qgb3JpZ2luYXRlZFxuICogaW4gdGhlIGZyb250ZW5kIGFuZCBsaXZlIGRhdGEgYWxyZWFkeSBjYXJyaWVzIGl0IChmcm96ZW4pLiBUaGlzIG1vZHVsZSBpc1xuICogdGhlIHNpbmdsZSBzaGFyZWQgZGVmaW5pdGlvbjogdGhlIGZyb250ZW5kIHdyaXRlcyB0aGUgZXh0ZW5zaW9uLCBhbmQgdGhlXG4gKiBPcGVuSEkgYmFja2VuZCdzIGBTdXBwbHlSZXF1ZXN0ID9lbmNvdW50ZXI9YCBzZWFyY2ggZmlsdGVyIG1hdGNoZXMgYWdhaW5zdFxuICogdGhpcyBzYW1lIFVSTCwgc28gdGhlIHR3byBjYW5ub3QgZHJpZnQuXG4gKlxuICogQHNlZSBzaXRlcy9hcHAtZWhyL2RvY3MvZmhpci9leHRlbnNpb25zL3N1cHBseS1yZXF1ZXN0LWVuY291bnRlci5tZFxuICovXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBFeHRlbnNpb24gfSBmcm9tIFwiLi4vLi4vZGF0YS9leHRlbnNpb25cIjtcbmltcG9ydCB0eXBlIHsgUmVmZXJlbmNlIH0gZnJvbSBcIi4uLy4uL2RhdGEvcmVmZXJlbmNlXCI7XG5pbXBvcnQgeyByZWZlcmVuY2VTY2hlbWEgfSBmcm9tIFwiLi4vLi4vZGF0YS9yZWZlcmVuY2VcIjtcbmltcG9ydCB0eXBlIHsgU3VwcGx5UmVxdWVzdCB9IGZyb20gXCIuLi8uLi9kYXRhL3N1cHBseXJlcXVlc3RcIjtcblxuLyoqIGBTdXBwbHlSZXF1ZXN0LmV4dGVuc2lvbi51cmxgIGNhcnJ5aW5nIHRoZSBgUmVmZXJlbmNlKEVuY291bnRlcilgLiAqL1xuZXhwb3J0IGNvbnN0IFNVUFBMWV9SRVFVRVNUX0VOQ09VTlRFUl9FWFRFTlNJT05fVVJMID1cbiAgXCJodHRwczovL29uLXNpdGUtbWVkaWNhbC5hcHAvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL3N1cHBseS1yZXF1ZXN0LWVuY291bnRlclwiIGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc3VwcGx5UmVxdWVzdEVuY291bnRlckV4dGVuc2lvblNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdXJsOiB6LmxpdGVyYWwoU1VQUExZX1JFUVVFU1RfRU5DT1VOVEVSX0VYVEVOU0lPTl9VUkwpLFxuICAgIHZhbHVlUmVmZXJlbmNlOiByZWZlcmVuY2VTY2hlbWEsXG4gIH0pXG4gIC5wYXNzdGhyb3VnaCgpO1xuZXhwb3J0IHR5cGUgU3VwcGx5UmVxdWVzdEVuY291bnRlckV4dGVuc2lvbiA9IHouaW5mZXI8XG4gIHR5cGVvZiBzdXBwbHlSZXF1ZXN0RW5jb3VudGVyRXh0ZW5zaW9uU2NoZW1hXG4+O1xuXG4vKiogQnVpbGQgdGhlIGV4dGVuc2lvbiBjYXJyeWluZyB0aGUgZW5jb3VudGVyIGEgc3VwcGx5IG9yZGVyIGJlbG9uZ3MgdG8uICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdXBwbHlSZXF1ZXN0RW5jb3VudGVyRXh0ZW5zaW9uKFxuICBlbmNvdW50ZXI6IFJlZmVyZW5jZSxcbik6IEV4dGVuc2lvbiB7XG4gIHJldHVybiB7XG4gICAgdXJsOiBTVVBQTFlfUkVRVUVTVF9FTkNPVU5URVJfRVhURU5TSU9OX1VSTCxcbiAgICB2YWx1ZVJlZmVyZW5jZTogZW5jb3VudGVyLFxuICB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGVuY291bnRlciByZWZlcmVuY2UgKGBFbmNvdW50ZXIvPGlkPmApIGEgU3VwcGx5UmVxdWVzdCBiZWxvbmdzXG4gKiB0bywgb3IgbnVsbCB3aGVuIHRoZSBleHRlbnNpb24gaXMgYWJzZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3VwcGx5UmVxdWVzdEVuY291bnRlcihcbiAgc3VwcGx5UmVxdWVzdDogU3VwcGx5UmVxdWVzdCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBleHRlbnNpb24gPSBzdXBwbHlSZXF1ZXN0LmV4dGVuc2lvbj8uZmluZChcbiAgICAoZXh0KSA9PiBleHQudXJsID09PSBTVVBQTFlfUkVRVUVTVF9FTkNPVU5URVJfRVhURU5TSU9OX1VSTCxcbiAgKTtcbiAgcmV0dXJuIGV4dGVuc2lvbj8udmFsdWVSZWZlcmVuY2U/LnJlZmVyZW5jZSA/PyBudWxsO1xufVxuIl19
package/package.json CHANGED
@@ -39,7 +39,7 @@
39
39
  "publishConfig": {
40
40
  "access": "public"
41
41
  },
42
- "version": "0.0.43",
42
+ "version": "0.0.45",
43
43
  "types": "lib/index.d.ts",
44
44
  "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"pnpm exec projen\".",
45
45
  "scripts": {