@fboes/aerofly-custom-missions 1.3.0 → 1.3.1
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 +5 -0
- package/dist/dto/AeroflyMission.js +4 -4
- package/dist/dto/AeroflyMissionConditions.js +1 -3
- package/dist/dto/AeroflyMissionConditionsCloud.js +10 -5
- package/dist/dto/AeroflyMissionsList.js +2 -6
- package/dist/index.test.js +2 -1
- package/dist/node/AeroflyConfigurationNode.js +64 -29
- package/docs/custom_missions_user.tmc +6 -1
- package/docs/custom_missions_user.xml +4 -1
- package/package.json +1 -1
- package/src/dto/AeroflyMission.ts +5 -4
- package/src/dto/AeroflyMissionConditions.ts +1 -3
- package/src/dto/AeroflyMissionConditionsCloud.ts +10 -5
- package/src/dto/AeroflyMissionsList.ts +3 -7
- package/src/index.test.ts +2 -1
- package/src/node/AeroflyConfigurationNode.ts +57 -14
- package/types/dto/AeroflyMission.d.ts.map +1 -1
- package/types/dto/AeroflyMissionConditions.d.ts.map +1 -1
- package/types/dto/AeroflyMissionConditionsCloud.d.ts.map +1 -1
- package/types/dto/AeroflyMissionsList.d.ts.map +1 -1
- package/types/node/AeroflyConfigurationNode.d.ts +11 -1
- package/types/node/AeroflyConfigurationNode.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
This changelog documents all notable changes to the Aerofly Custom Missions project. Each version entry includes a list of changes, with the most recent version at the top.
|
|
4
4
|
|
|
5
|
+
## 1.3.1
|
|
6
|
+
|
|
7
|
+
- Re-introduced spacers between exported missions
|
|
8
|
+
- Re-introduced commented out nodes for exported missions
|
|
9
|
+
|
|
5
10
|
## 1.3.0
|
|
6
11
|
|
|
7
12
|
- Changed TMC code generation with nodes
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AeroflyConfigurationNode } from "../node/AeroflyConfigurationNode.js";
|
|
1
|
+
import { AeroflyConfigurationNode, AeroflyConfigurationNodeComment } from "../node/AeroflyConfigurationNode.js";
|
|
2
2
|
import { AeroflyMissionConditions } from "./AeroflyMissionConditions.js";
|
|
3
3
|
export const feetPerMeter = 3.28084;
|
|
4
4
|
export const meterPerStatuteMile = 1609.344;
|
|
@@ -130,9 +130,9 @@ export class AeroflyMission {
|
|
|
130
130
|
}
|
|
131
131
|
element.appendChild("string8", "flight_setting", this.flightSetting);
|
|
132
132
|
element.appendChild("string8u", "aircraft_name", this.aircraft.name);
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
133
|
+
if (this.aircraft.livery) {
|
|
134
|
+
element.append(new AeroflyConfigurationNodeComment("string8", "aircraft_livery", this.aircraft.livery));
|
|
135
|
+
}
|
|
136
136
|
element.appendChild("stringt8c", "aircraft_icao", this.aircraft.icao);
|
|
137
137
|
element.appendChild("stringt8c", "callsign", this.callsign);
|
|
138
138
|
element.appendChild("stringt8c", "origin_icao", this.origin.icao);
|
|
@@ -90,9 +90,7 @@ export class AeroflyMissionConditions {
|
|
|
90
90
|
* @returns {AeroflyConfigurationNode[]} cloud elements
|
|
91
91
|
*/
|
|
92
92
|
getCloudElements() {
|
|
93
|
-
return this.clouds
|
|
94
|
-
.slice(0, 2) // Aerofly FS4 supports max 2 cloud layers
|
|
95
|
-
.flatMap((c, index) => c.getElements(index));
|
|
93
|
+
return this.clouds.flatMap((c, index) => c.getElements(index));
|
|
96
94
|
}
|
|
97
95
|
/**
|
|
98
96
|
* @returns {string} to use in Aerofly FS4's `custom_missions_user.tmc`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AeroflyConfigurationNode } from "../node/AeroflyConfigurationNode.js";
|
|
1
|
+
import { AeroflyConfigurationNode, AeroflyConfigurationNodeComment } from "../node/AeroflyConfigurationNode.js";
|
|
2
2
|
import { feetPerMeter } from "./AeroflyMission.js";
|
|
3
3
|
/**
|
|
4
4
|
* @class
|
|
@@ -73,10 +73,15 @@ export class AeroflyMissionConditionsCloud {
|
|
|
73
73
|
}
|
|
74
74
|
};
|
|
75
75
|
const indexString = getIndexString(index);
|
|
76
|
-
return
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
return index <= 1
|
|
77
|
+
? [
|
|
78
|
+
new AeroflyConfigurationNode("float64", `${indexString}_cover`, this.cover ?? 0, this.cover_code),
|
|
79
|
+
new AeroflyConfigurationNode("float64", `${indexString}_base`, this.base, `${this.base_feet} ft AGL`),
|
|
80
|
+
]
|
|
81
|
+
: [
|
|
82
|
+
new AeroflyConfigurationNodeComment("float64", `${indexString}_cover`, this.cover ?? 0, this.cover_code),
|
|
83
|
+
new AeroflyConfigurationNodeComment("float64", `${indexString}_base`, this.base, `${this.base_feet} ft AGL`),
|
|
84
|
+
];
|
|
80
85
|
}
|
|
81
86
|
/**
|
|
82
87
|
* @param {number} index if used in an array will set the array index
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AeroflyConfigurationNode } from "../node/AeroflyConfigurationNode.js";
|
|
1
|
+
import { AeroflyConfigurationNode, AeroflyConfigurationNodeSpacer } from "../node/AeroflyConfigurationNode.js";
|
|
2
2
|
/**
|
|
3
3
|
* @class
|
|
4
4
|
* A list of flight plans.
|
|
@@ -15,11 +15,7 @@ export class AeroflyMissionsList {
|
|
|
15
15
|
this.missions = missions;
|
|
16
16
|
}
|
|
17
17
|
getElement() {
|
|
18
|
-
return new AeroflyConfigurationNode("file", "").append(new AeroflyConfigurationNode("tmmissions_list", "").append(new
|
|
19
|
-
const mission = m.getElement();
|
|
20
|
-
mission._comment = `End of ${mission.name}`;
|
|
21
|
-
return mission;
|
|
22
|
-
}))));
|
|
18
|
+
return new AeroflyConfigurationNode("file", "").append(new AeroflyConfigurationNode("tmmissions_list", "").append(new AeroflyConfigurationNodeSpacer("list_tmmission_definition", "missions").append(...this.missions.map((m) => m.getElement()))));
|
|
23
19
|
}
|
|
24
20
|
/**
|
|
25
21
|
* @returns {string} to use in Aerofly FS4's `custom_missions_user.tmc`
|
package/dist/index.test.js
CHANGED
|
@@ -147,6 +147,7 @@ const assertIncludes = (string, includes) => {
|
|
|
147
147
|
clouds: [
|
|
148
148
|
AeroflyMissionConditionsCloud.createInFeet(0.1, 5000),
|
|
149
149
|
AeroflyMissionConditionsCloud.createInFeet(0.2, 7500),
|
|
150
|
+
AeroflyMissionConditionsCloud.createInFeet(0.1, 9500),
|
|
150
151
|
],
|
|
151
152
|
});
|
|
152
153
|
assert.strictEqual(conditions.wind.direction, 190);
|
|
@@ -182,7 +183,7 @@ const assertIncludes = (string, includes) => {
|
|
|
182
183
|
flightSetting: "cruise",
|
|
183
184
|
aircraft: {
|
|
184
185
|
name: "c172",
|
|
185
|
-
livery: "",
|
|
186
|
+
livery: "default",
|
|
186
187
|
icao: "C172",
|
|
187
188
|
},
|
|
188
189
|
callsign: "N51911",
|
|
@@ -1,20 +1,14 @@
|
|
|
1
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
3
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
|
-
};
|
|
6
|
-
var _AeroflyConfigurationNode_instances, _AeroflyConfigurationNode_children, _AeroflyConfigurationNode_aeroflyEscape, _AeroflyConfigurationNode_xmlEscape;
|
|
7
1
|
export class AeroflyConfigurationNode {
|
|
8
2
|
constructor(type, name, value = "", _comment = "") {
|
|
9
3
|
this.type = type;
|
|
10
4
|
this.name = name;
|
|
11
5
|
this.value = value;
|
|
12
6
|
this._comment = _comment;
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
this.children = [];
|
|
8
|
+
this.space = "\n";
|
|
15
9
|
}
|
|
16
10
|
append(...nodes) {
|
|
17
|
-
|
|
11
|
+
this.children.push(...nodes);
|
|
18
12
|
return this;
|
|
19
13
|
}
|
|
20
14
|
appendChild(type, name, value = "", _comment = "") {
|
|
@@ -36,11 +30,11 @@ export class AeroflyConfigurationNode {
|
|
|
36
30
|
}
|
|
37
31
|
toString(indent = 0) {
|
|
38
32
|
const indentation = " ".repeat(4 * indent);
|
|
39
|
-
let tag = `${indentation}<[${this.type}][${this.name}][${
|
|
40
|
-
if (
|
|
41
|
-
tag +=
|
|
42
|
-
tag +=
|
|
43
|
-
tag +=
|
|
33
|
+
let tag = `${indentation}<[${this.type}][${this.name}][${this.aeroflyEscape(this.valueAsString)}]`;
|
|
34
|
+
if (this.children.length > 0) {
|
|
35
|
+
tag += this.space;
|
|
36
|
+
tag += this.children.map((child) => child.toString(indent + 1)).join(this.space);
|
|
37
|
+
tag += `${this.space}${indentation}>`;
|
|
44
38
|
}
|
|
45
39
|
else {
|
|
46
40
|
tag += ">";
|
|
@@ -50,33 +44,74 @@ export class AeroflyConfigurationNode {
|
|
|
50
44
|
}
|
|
51
45
|
return tag;
|
|
52
46
|
}
|
|
47
|
+
aeroflyEscape(text) {
|
|
48
|
+
return text.replace(/\[/g, "(").replace(/\]/g, ")");
|
|
49
|
+
}
|
|
53
50
|
toXmlString(indent = 0) {
|
|
54
51
|
const indentation = " ".repeat(4 * indent);
|
|
55
52
|
const name = this.name || this.type;
|
|
56
53
|
let tag = indentation;
|
|
57
|
-
if (
|
|
58
|
-
const index = this.valueAsString ? ` index="${
|
|
54
|
+
if (this.children.length > 0) {
|
|
55
|
+
const index = this.valueAsString ? ` index="${this.xmlEscape(this.valueAsString)}"` : "";
|
|
59
56
|
tag += `<${name} type="${this.type}"${index}>`;
|
|
60
57
|
tag += "\n";
|
|
61
|
-
tag +=
|
|
58
|
+
tag += this.children.map((child) => child.toXmlString(indent + 1)).join("\n");
|
|
62
59
|
tag += `\n${indentation}</${name}>`;
|
|
63
60
|
}
|
|
64
61
|
else {
|
|
65
|
-
tag += `<${name} type="${this.type}">${
|
|
62
|
+
tag += `<${name} type="${this.type}">${this.xmlEscape(this.valueAsString)}</${name}>`;
|
|
63
|
+
}
|
|
64
|
+
if (this._comment) {
|
|
65
|
+
tag += ` <!-- ${this.xmlEscape(this._comment)} -->`;
|
|
66
|
+
}
|
|
67
|
+
return tag;
|
|
68
|
+
}
|
|
69
|
+
xmlEscape(text) {
|
|
70
|
+
return text
|
|
71
|
+
.replace(/&/g, "&")
|
|
72
|
+
.replace(/</g, "<")
|
|
73
|
+
.replace(/>/g, ">")
|
|
74
|
+
.replace(/"/g, """)
|
|
75
|
+
.replace(/'/g, "'");
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export class AeroflyConfigurationNodeSpacer extends AeroflyConfigurationNode {
|
|
79
|
+
constructor() {
|
|
80
|
+
super(...arguments);
|
|
81
|
+
this.space = `\n// ${"-".repeat(77)}\n`;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export class AeroflyConfigurationNodeComment extends AeroflyConfigurationNode {
|
|
85
|
+
toString(indent = 0) {
|
|
86
|
+
const indentation = " ".repeat(4 * indent);
|
|
87
|
+
let tag = `${indentation}// <[${this.type}][${this.name}][${this.aeroflyEscape(this.valueAsString)}]`;
|
|
88
|
+
if (this.children.length > 0) {
|
|
89
|
+
tag += this.space;
|
|
90
|
+
tag += this.children.map((child) => child.toString(indent + 1)).join(this.space);
|
|
91
|
+
tag += `${this.space}${indentation}>`;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
tag += ">";
|
|
95
|
+
}
|
|
96
|
+
return tag;
|
|
97
|
+
}
|
|
98
|
+
toXmlString(indent = 0) {
|
|
99
|
+
const indentation = " ".repeat(4 * indent);
|
|
100
|
+
const name = this.name || this.type;
|
|
101
|
+
let tag = indentation;
|
|
102
|
+
if (this.children.length > 0) {
|
|
103
|
+
const index = this.valueAsString ? ` index="${this.xmlEscape(this.valueAsString)}"` : "";
|
|
104
|
+
tag += `<!-- ${name} type="${this.type}"${index}>`;
|
|
105
|
+
tag += "\n";
|
|
106
|
+
tag += this.children.map((child) => child.toXmlString(indent + 1)).join("\n");
|
|
107
|
+
tag += `\n${indentation}</${name} -->`;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
tag += `<!-- ${name} type="${this.type}">${this.xmlEscape(this.valueAsString)}</${name} -->`;
|
|
66
111
|
}
|
|
67
112
|
if (this._comment) {
|
|
68
|
-
tag += ` <!-- ${
|
|
113
|
+
tag += ` <!-- ${this.xmlEscape(this._comment)} -->`;
|
|
69
114
|
}
|
|
70
115
|
return tag;
|
|
71
116
|
}
|
|
72
117
|
}
|
|
73
|
-
_AeroflyConfigurationNode_children = new WeakMap(), _AeroflyConfigurationNode_instances = new WeakSet(), _AeroflyConfigurationNode_aeroflyEscape = function _AeroflyConfigurationNode_aeroflyEscape(text) {
|
|
74
|
-
return text.replace(/\[/g, "(").replace(/\]/g, ")");
|
|
75
|
-
}, _AeroflyConfigurationNode_xmlEscape = function _AeroflyConfigurationNode_xmlEscape(text) {
|
|
76
|
-
return text
|
|
77
|
-
.replace(/&/g, "&")
|
|
78
|
-
.replace(/</g, "<")
|
|
79
|
-
.replace(/>/g, ">")
|
|
80
|
-
.replace(/"/g, """)
|
|
81
|
-
.replace(/'/g, "'");
|
|
82
|
-
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<[file][][]
|
|
2
2
|
<[tmmissions_list][][]
|
|
3
3
|
<[list_tmmission_definition][missions][]
|
|
4
|
+
// -----------------------------------------------------------------------------
|
|
4
5
|
<[tmmission_definition][mission][]
|
|
5
6
|
<[string8][title][KCCR #1: Concord / Buchanan Field]>
|
|
6
7
|
<[string8][description][It is a gusty, clear early morning, and you are 8 NM to the north of the towered airport Concord / Buchanan Field (27ft). As the wind is 11 kts from 190°, the main landing runway is 19L (191° / 844m). Fly the pattern and land safely.
|
|
@@ -20,6 +21,7 @@
|
|
|
20
21
|
<[bool][is_featured][true]>
|
|
21
22
|
<[string8][flight_setting][cruise]>
|
|
22
23
|
<[string8u][aircraft_name][c172]>
|
|
24
|
+
// <[string8][aircraft_livery][default]>
|
|
23
25
|
<[stringt8c][aircraft_icao][C172]>
|
|
24
26
|
<[stringt8c][callsign][N51911]>
|
|
25
27
|
<[stringt8c][origin_icao][KCCR]>
|
|
@@ -54,6 +56,8 @@
|
|
|
54
56
|
<[float64][cloud_base][1523.9999512320016]> // 5000 ft AGL
|
|
55
57
|
<[float64][cirrus_cover][0.2]> // FEW
|
|
56
58
|
<[float64][cirrus_base][2285.9999268480024]> // 7500 ft AGL
|
|
59
|
+
// <[float64][cumulus_mediocris_cover][0.1]>
|
|
60
|
+
// <[float64][cumulus_mediocris_base][2895.599907340803]>
|
|
57
61
|
>
|
|
58
62
|
<[list_tmmission_checkpoint][checkpoints][]
|
|
59
63
|
<[tmmission_checkpoint][element][0]
|
|
@@ -93,7 +97,8 @@
|
|
|
93
97
|
<[bool][fly_over][false]>
|
|
94
98
|
>
|
|
95
99
|
>
|
|
96
|
-
>
|
|
100
|
+
>
|
|
101
|
+
// -----------------------------------------------------------------------------
|
|
97
102
|
>
|
|
98
103
|
>
|
|
99
104
|
>
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
<is_featured type="bool">true</is_featured>
|
|
22
22
|
<flight_setting type="string8">cruise</flight_setting>
|
|
23
23
|
<aircraft_name type="string8u">c172</aircraft_name>
|
|
24
|
+
<!-- aircraft_livery type="string8">default</aircraft_livery -->
|
|
24
25
|
<aircraft_icao type="stringt8c">C172</aircraft_icao>
|
|
25
26
|
<callsign type="stringt8c">N51911</callsign>
|
|
26
27
|
<origin_icao type="stringt8c">KCCR</origin_icao>
|
|
@@ -55,6 +56,8 @@
|
|
|
55
56
|
<cloud_base type="float64">1523.9999512320016</cloud_base> <!-- 5000 ft AGL -->
|
|
56
57
|
<cirrus_cover type="float64">0.2</cirrus_cover> <!-- FEW -->
|
|
57
58
|
<cirrus_base type="float64">2285.9999268480024</cirrus_base> <!-- 7500 ft AGL -->
|
|
59
|
+
<!-- cumulus_mediocris_cover type="float64">0.1</cumulus_mediocris_cover --> <!-- CLR -->
|
|
60
|
+
<!-- cumulus_mediocris_base type="float64">2895.599907340803</cumulus_mediocris_base --> <!-- 9500 ft AGL -->
|
|
58
61
|
</conditions>
|
|
59
62
|
<checkpoints type="list_tmmission_checkpoint">
|
|
60
63
|
<element type="tmmission_checkpoint" index="0">
|
|
@@ -94,7 +97,7 @@
|
|
|
94
97
|
<fly_over type="bool">false</fly_over>
|
|
95
98
|
</element>
|
|
96
99
|
</checkpoints>
|
|
97
|
-
</mission>
|
|
100
|
+
</mission>
|
|
98
101
|
</missions>
|
|
99
102
|
</tmmissions_list>
|
|
100
103
|
</file>
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AeroflyConfigurationNode } from "../node/AeroflyConfigurationNode.js";
|
|
1
|
+
import { AeroflyConfigurationNode, AeroflyConfigurationNodeComment } from "../node/AeroflyConfigurationNode.js";
|
|
2
2
|
import { AeroflyLocalizedText } from "./AeroflyLocalizedText.js";
|
|
3
3
|
import { AeroflyMissionCheckpoint } from "./AeroflyMissionCheckpoint.js";
|
|
4
4
|
import { AeroflyMissionConditions } from "./AeroflyMissionConditions.js";
|
|
@@ -311,9 +311,10 @@ export class AeroflyMission {
|
|
|
311
311
|
|
|
312
312
|
element.appendChild("string8", "flight_setting", this.flightSetting);
|
|
313
313
|
element.appendChild("string8u", "aircraft_name", this.aircraft.name);
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
314
|
+
|
|
315
|
+
if (this.aircraft.livery) {
|
|
316
|
+
element.append(new AeroflyConfigurationNodeComment("string8", "aircraft_livery", this.aircraft.livery));
|
|
317
|
+
}
|
|
317
318
|
element.appendChild("stringt8c", "aircraft_icao", this.aircraft.icao);
|
|
318
319
|
element.appendChild("stringt8c", "callsign", this.callsign);
|
|
319
320
|
element.appendChild("stringt8c", "origin_icao", this.origin.icao);
|
|
@@ -150,9 +150,7 @@ export class AeroflyMissionConditions {
|
|
|
150
150
|
* @returns {AeroflyConfigurationNode[]} cloud elements
|
|
151
151
|
*/
|
|
152
152
|
getCloudElements(): AeroflyConfigurationNode[] {
|
|
153
|
-
return this.clouds
|
|
154
|
-
.slice(0, 2) // Aerofly FS4 supports max 2 cloud layers
|
|
155
|
-
.flatMap((c: AeroflyMissionConditionsCloud, index: number) => c.getElements(index));
|
|
153
|
+
return this.clouds.flatMap((c: AeroflyMissionConditionsCloud, index: number) => c.getElements(index));
|
|
156
154
|
}
|
|
157
155
|
|
|
158
156
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AeroflyConfigurationNode } from "../node/AeroflyConfigurationNode.js";
|
|
1
|
+
import { AeroflyConfigurationNode, AeroflyConfigurationNodeComment } from "../node/AeroflyConfigurationNode.js";
|
|
2
2
|
import { feetPerMeter } from "./AeroflyMission.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -93,10 +93,15 @@ export class AeroflyMissionConditionsCloud {
|
|
|
93
93
|
|
|
94
94
|
const indexString = getIndexString(index);
|
|
95
95
|
|
|
96
|
-
return
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
return index <= 1
|
|
97
|
+
? [
|
|
98
|
+
new AeroflyConfigurationNode("float64", `${indexString}_cover`, this.cover ?? 0, this.cover_code),
|
|
99
|
+
new AeroflyConfigurationNode("float64", `${indexString}_base`, this.base, `${this.base_feet} ft AGL`),
|
|
100
|
+
]
|
|
101
|
+
: [
|
|
102
|
+
new AeroflyConfigurationNodeComment("float64", `${indexString}_cover`, this.cover ?? 0, this.cover_code),
|
|
103
|
+
new AeroflyConfigurationNodeComment("float64", `${indexString}_base`, this.base, `${this.base_feet} ft AGL`),
|
|
104
|
+
];
|
|
100
105
|
}
|
|
101
106
|
|
|
102
107
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AeroflyConfigurationNode } from "../node/AeroflyConfigurationNode.js";
|
|
1
|
+
import { AeroflyConfigurationNode, AeroflyConfigurationNodeSpacer } from "../node/AeroflyConfigurationNode.js";
|
|
2
2
|
import { AeroflyMission } from "./AeroflyMission.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -25,12 +25,8 @@ export class AeroflyMissionsList {
|
|
|
25
25
|
getElement(): AeroflyConfigurationNode {
|
|
26
26
|
return new AeroflyConfigurationNode("file", "").append(
|
|
27
27
|
new AeroflyConfigurationNode("tmmissions_list", "").append(
|
|
28
|
-
new
|
|
29
|
-
...this.missions.map((m): AeroflyConfigurationNode =>
|
|
30
|
-
const mission = m.getElement();
|
|
31
|
-
mission._comment = `End of ${mission.name}`;
|
|
32
|
-
return mission;
|
|
33
|
-
}),
|
|
28
|
+
new AeroflyConfigurationNodeSpacer("list_tmmission_definition", "missions").append(
|
|
29
|
+
...this.missions.map((m): AeroflyConfigurationNode => m.getElement()),
|
|
34
30
|
),
|
|
35
31
|
),
|
|
36
32
|
);
|
package/src/index.test.ts
CHANGED
|
@@ -174,6 +174,7 @@ const assertIncludes = (string: string, includes: string): void => {
|
|
|
174
174
|
clouds: [
|
|
175
175
|
AeroflyMissionConditionsCloud.createInFeet(0.1, 5000),
|
|
176
176
|
AeroflyMissionConditionsCloud.createInFeet(0.2, 7500),
|
|
177
|
+
AeroflyMissionConditionsCloud.createInFeet(0.1, 9500),
|
|
177
178
|
],
|
|
178
179
|
});
|
|
179
180
|
|
|
@@ -212,7 +213,7 @@ const assertIncludes = (string: string, includes: string): void => {
|
|
|
212
213
|
flightSetting: "cruise",
|
|
213
214
|
aircraft: {
|
|
214
215
|
name: "c172",
|
|
215
|
-
livery: "",
|
|
216
|
+
livery: "default",
|
|
216
217
|
icao: "C172",
|
|
217
218
|
},
|
|
218
219
|
callsign: "N51911",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export class AeroflyConfigurationNode {
|
|
2
|
-
|
|
2
|
+
protected children: AeroflyConfigurationNode[] = [];
|
|
3
|
+
protected space = "\n";
|
|
3
4
|
|
|
4
5
|
constructor(
|
|
5
6
|
public type: string,
|
|
@@ -9,7 +10,7 @@ export class AeroflyConfigurationNode {
|
|
|
9
10
|
) {}
|
|
10
11
|
|
|
11
12
|
append(...nodes: AeroflyConfigurationNode[]): AeroflyConfigurationNode {
|
|
12
|
-
this
|
|
13
|
+
this.children.push(...nodes);
|
|
13
14
|
return this;
|
|
14
15
|
}
|
|
15
16
|
|
|
@@ -38,11 +39,11 @@ export class AeroflyConfigurationNode {
|
|
|
38
39
|
toString(indent: number = 0): string {
|
|
39
40
|
const indentation = " ".repeat(4 * indent);
|
|
40
41
|
|
|
41
|
-
let tag = `${indentation}<[${this.type}][${this.name}][${this
|
|
42
|
-
if (this
|
|
43
|
-
tag +=
|
|
44
|
-
tag += this
|
|
45
|
-
tag +=
|
|
42
|
+
let tag = `${indentation}<[${this.type}][${this.name}][${this.aeroflyEscape(this.valueAsString)}]`;
|
|
43
|
+
if (this.children.length > 0) {
|
|
44
|
+
tag += this.space;
|
|
45
|
+
tag += this.children.map((child) => child.toString(indent + 1)).join(this.space);
|
|
46
|
+
tag += `${this.space}${indentation}>`;
|
|
46
47
|
} else {
|
|
47
48
|
tag += ">";
|
|
48
49
|
}
|
|
@@ -53,7 +54,7 @@ export class AeroflyConfigurationNode {
|
|
|
53
54
|
return tag;
|
|
54
55
|
}
|
|
55
56
|
|
|
56
|
-
|
|
57
|
+
protected aeroflyEscape(text: string): string {
|
|
57
58
|
return text.replace(/\[/g, "(").replace(/\]/g, ")");
|
|
58
59
|
}
|
|
59
60
|
|
|
@@ -62,23 +63,23 @@ export class AeroflyConfigurationNode {
|
|
|
62
63
|
const name = this.name || this.type;
|
|
63
64
|
|
|
64
65
|
let tag = indentation;
|
|
65
|
-
if (this
|
|
66
|
-
const index = this.valueAsString ? ` index="${this
|
|
66
|
+
if (this.children.length > 0) {
|
|
67
|
+
const index = this.valueAsString ? ` index="${this.xmlEscape(this.valueAsString)}"` : "";
|
|
67
68
|
tag += `<${name} type="${this.type}"${index}>`;
|
|
68
69
|
tag += "\n";
|
|
69
|
-
tag += this
|
|
70
|
+
tag += this.children.map((child) => child.toXmlString(indent + 1)).join("\n");
|
|
70
71
|
tag += `\n${indentation}</${name}>`;
|
|
71
72
|
} else {
|
|
72
|
-
tag += `<${name} type="${this.type}">${this
|
|
73
|
+
tag += `<${name} type="${this.type}">${this.xmlEscape(this.valueAsString)}</${name}>`;
|
|
73
74
|
}
|
|
74
75
|
|
|
75
76
|
if (this._comment) {
|
|
76
|
-
tag += ` <!-- ${this
|
|
77
|
+
tag += ` <!-- ${this.xmlEscape(this._comment)} -->`;
|
|
77
78
|
}
|
|
78
79
|
return tag;
|
|
79
80
|
}
|
|
80
81
|
|
|
81
|
-
|
|
82
|
+
protected xmlEscape(text: string): string {
|
|
82
83
|
return text
|
|
83
84
|
.replace(/&/g, "&")
|
|
84
85
|
.replace(/</g, "<")
|
|
@@ -87,3 +88,45 @@ export class AeroflyConfigurationNode {
|
|
|
87
88
|
.replace(/'/g, "'");
|
|
88
89
|
}
|
|
89
90
|
}
|
|
91
|
+
|
|
92
|
+
export class AeroflyConfigurationNodeSpacer extends AeroflyConfigurationNode {
|
|
93
|
+
protected space = `\n// ${"-".repeat(77)}\n`;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export class AeroflyConfigurationNodeComment extends AeroflyConfigurationNode {
|
|
97
|
+
toString(indent: number = 0): string {
|
|
98
|
+
const indentation = " ".repeat(4 * indent);
|
|
99
|
+
|
|
100
|
+
let tag = `${indentation}// <[${this.type}][${this.name}][${this.aeroflyEscape(this.valueAsString)}]`;
|
|
101
|
+
if (this.children.length > 0) {
|
|
102
|
+
tag += this.space;
|
|
103
|
+
tag += this.children.map((child) => child.toString(indent + 1)).join(this.space);
|
|
104
|
+
tag += `${this.space}${indentation}>`;
|
|
105
|
+
} else {
|
|
106
|
+
tag += ">";
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return tag;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
toXmlString(indent: number = 0): string {
|
|
113
|
+
const indentation = " ".repeat(4 * indent);
|
|
114
|
+
const name = this.name || this.type;
|
|
115
|
+
|
|
116
|
+
let tag = indentation;
|
|
117
|
+
if (this.children.length > 0) {
|
|
118
|
+
const index = this.valueAsString ? ` index="${this.xmlEscape(this.valueAsString)}"` : "";
|
|
119
|
+
tag += `<!-- ${name} type="${this.type}"${index}>`;
|
|
120
|
+
tag += "\n";
|
|
121
|
+
tag += this.children.map((child) => child.toXmlString(indent + 1)).join("\n");
|
|
122
|
+
tag += `\n${indentation}</${name} -->`;
|
|
123
|
+
} else {
|
|
124
|
+
tag += `<!-- ${name} type="${this.type}">${this.xmlEscape(this.valueAsString)}</${name} -->`;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (this._comment) {
|
|
128
|
+
tag += ` <!-- ${this.xmlEscape(this._comment)} -->`;
|
|
129
|
+
}
|
|
130
|
+
return tag;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AeroflyMission.d.ts","sourceRoot":"","sources":["../../src/dto/AeroflyMission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"AeroflyMission.d.ts","sourceRoot":"","sources":["../../src/dto/AeroflyMission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAmC,MAAM,qCAAqC,CAAC;AAChH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,eAAO,MAAM,YAAY,UAAU,CAAC;AACpC,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC3B,eAAe,GACf,cAAc,GACd,MAAM,GACN,SAAS,GACT,QAAQ,GACR,UAAU,GACV,SAAS,GACT,cAAc,GACd,SAAS,GACT,UAAU,CAAC;AAEjB;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;;;;GAOG;AACH,qBAAa,cAAc;IACvB;;OAEG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,cAAc,EAAE,oBAAoB,EAAE,CAAC;IAEvC;;OAEG;IACH,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf;;OAEG;IACH,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;IAE3B;;OAEG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B;;OAEG;IACH,aAAa,EAAE,qBAAqB,CAAC;IAErC;;OAEG;IACH,QAAQ,EAAE,sBAAsB,CAAC;IAEjC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,MAAM,EAAE,sBAAsB,CAAC;IAE/B;;OAEG;IACH,WAAW,EAAE,sBAAsB,CAAC;IAEpC;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAExB;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAExB;;OAEG;IACH,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAE5B;;OAEG;IACH,MAAM,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAEzC;;OAEG;IACH,UAAU,EAAE,wBAAwB,CAAC;IAErC;;OAEG;IACH,WAAW,EAAE,wBAAwB,EAAE,CAAC;IAExC;;;;;;;;;;;;;;;;;;;;OAoBG;gBAEC,KAAK,EAAE,MAAM,EACb,EACI,YAAmB,EACnB,WAAgB,EAChB,cAAmB,EACnB,IAAS,EACT,UAAiB,EACjB,UAAiB,EACjB,aAAsB,EACtB,QAIC,EACD,QAAa,EACb,MAMC,EACD,WAMC,EACD,QAAe,EACf,QAAe,EACf,WAAkB,EAClB,MAAa,EACb,UAA2C,EAC3C,WAAgB,GACnB,GAAE,OAAO,CAAC,cAAc,CAAM;IAsBnC;;OAEG;IACH,qBAAqB,IAAI,wBAAwB,EAAE;IAMnD;;OAEG;IACH,wBAAwB,IAAI,wBAAwB,EAAE;IAQtD;;OAEG;IACH,UAAU,IAAI,wBAAwB;IA4GtC;;OAEG;IACH,QAAQ,IAAI,MAAM;CAGrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AeroflyMissionConditions.d.ts","sourceRoot":"","sources":["../../src/dto/AeroflyMissionConditions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAE/E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;;;GAOG;AACH,qBAAa,wBAAwB;IACjC;;;OAGG;IACH,IAAI,EAAE,IAAI,CAAC;IAEX;;OAEG;IACH,IAAI,EAAE,4BAA4B,CAAC;IAEnC;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,MAAM,EAAE,6BAA6B,EAAE,CAAM;IAE7C;;;;;;;;;;;OAWG;gBACS,EACR,IAAiB,EACjB,IAIC,EACD,kBAAsB,EACtB,eAAmB,EACnB,UAAmB,EACnB,aAAiB,EACjB,WAAe,EACf,MAAW,GACd,GAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG;QACnC,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;KACnB;IAgBN;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;OAEG;IACH,IAAI,mBAAmB,IAAI,MAAM,CAMhC;IAED;;OAEG;IACH,IAAI,aAAa,CAAC,aAAa,EAAE,MAAM,EAEtC;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;;OAGG;IACH,IAAI,WAAW,CAAC,WAAW,EAAE,MAAM,EAGlC;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAExB;IAED;;OAEG;IACH,gBAAgB,IAAI,wBAAwB,EAAE;
|
|
1
|
+
{"version":3,"file":"AeroflyMissionConditions.d.ts","sourceRoot":"","sources":["../../src/dto/AeroflyMissionConditions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAE/E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;;;GAOG;AACH,qBAAa,wBAAwB;IACjC;;;OAGG;IACH,IAAI,EAAE,IAAI,CAAC;IAEX;;OAEG;IACH,IAAI,EAAE,4BAA4B,CAAC;IAEnC;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,MAAM,EAAE,6BAA6B,EAAE,CAAM;IAE7C;;;;;;;;;;;OAWG;gBACS,EACR,IAAiB,EACjB,IAIC,EACD,kBAAsB,EACtB,eAAmB,EACnB,UAAmB,EACnB,aAAiB,EACjB,WAAe,EACf,MAAW,GACd,GAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG;QACnC,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;KACnB;IAgBN;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;OAEG;IACH,IAAI,mBAAmB,IAAI,MAAM,CAMhC;IAED;;OAEG;IACH,IAAI,aAAa,CAAC,aAAa,EAAE,MAAM,EAEtC;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;;OAGG;IACH,IAAI,WAAW,CAAC,WAAW,EAAE,MAAM,EAGlC;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAExB;IAED;;OAEG;IACH,gBAAgB,IAAI,wBAAwB,EAAE;IAI9C;;OAEG;IACH,UAAU,IAAI,wBAAwB;IAsBtC;;OAEG;IACH,QAAQ,IAAI,MAAM;CAGrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AeroflyMissionConditionsCloud.d.ts","sourceRoot":"","sources":["../../src/dto/AeroflyMissionConditionsCloud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"AeroflyMissionConditionsCloud.d.ts","sourceRoot":"","sources":["../../src/dto/AeroflyMissionConditionsCloud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAmC,MAAM,qCAAqC,CAAC;AAGhH;;GAEG;AACH,MAAM,MAAM,sCAAsC,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAE3F;;;;;;;GAOG;AACH,qBAAa,6BAA6B;IACtC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;gBACS,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAKvC;;;;OAIG;IACH,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,6BAA6B;IAIpF;;OAEG;IACH,IAAI,SAAS,CAAC,SAAS,EAAE,MAAM,EAE9B;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,sCAAsC,CAWvD;IAED;;;OAGG;IACH,WAAW,CAAC,KAAK,GAAE,MAAU,GAAG,wBAAwB,EAAE;IA2B1D;;;OAGG;IACH,QAAQ,CAAC,KAAK,GAAE,MAAU,GAAG,MAAM;CAKtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AeroflyMissionsList.d.ts","sourceRoot":"","sources":["../../src/dto/AeroflyMissionsList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"AeroflyMissionsList.d.ts","sourceRoot":"","sources":["../../src/dto/AeroflyMissionsList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAkC,MAAM,qCAAqC,CAAC;AAC/G,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;;;;GAOG;AACH,qBAAa,mBAAmB;IAC5B;;OAEG;IACH,QAAQ,EAAE,cAAc,EAAE,CAAC;IAE3B;;OAEG;gBACS,QAAQ,GAAE,cAAc,EAAO;IAI3C,UAAU,IAAI,wBAAwB;IAUtC;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,WAAW,IAAI,MAAM;CAGxB"}
|
|
@@ -1,13 +1,23 @@
|
|
|
1
1
|
export declare class AeroflyConfigurationNode {
|
|
2
|
-
#private;
|
|
3
2
|
type: string;
|
|
4
3
|
name: string;
|
|
5
4
|
value: string | number | string[] | number[] | boolean;
|
|
6
5
|
_comment: string;
|
|
6
|
+
protected children: AeroflyConfigurationNode[];
|
|
7
|
+
protected space: string;
|
|
7
8
|
constructor(type: string, name: string, value?: string | number | string[] | number[] | boolean, _comment?: string);
|
|
8
9
|
append(...nodes: AeroflyConfigurationNode[]): AeroflyConfigurationNode;
|
|
9
10
|
appendChild(type: string, name: string, value?: string | number | string[] | number[] | boolean, _comment?: string): this;
|
|
10
11
|
get valueAsString(): string;
|
|
12
|
+
toString(indent?: number): string;
|
|
13
|
+
protected aeroflyEscape(text: string): string;
|
|
14
|
+
toXmlString(indent?: number): string;
|
|
15
|
+
protected xmlEscape(text: string): string;
|
|
16
|
+
}
|
|
17
|
+
export declare class AeroflyConfigurationNodeSpacer extends AeroflyConfigurationNode {
|
|
18
|
+
protected space: string;
|
|
19
|
+
}
|
|
20
|
+
export declare class AeroflyConfigurationNodeComment extends AeroflyConfigurationNode {
|
|
11
21
|
toString(indent?: number): string;
|
|
12
22
|
toXmlString(indent?: number): string;
|
|
13
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AeroflyConfigurationNode.d.ts","sourceRoot":"","sources":["../../src/node/AeroflyConfigurationNode.ts"],"names":[],"mappings":"AAAA,qBAAa,wBAAwB
|
|
1
|
+
{"version":3,"file":"AeroflyConfigurationNode.d.ts","sourceRoot":"","sources":["../../src/node/AeroflyConfigurationNode.ts"],"names":[],"mappings":"AAAA,qBAAa,wBAAwB;IAKtB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO;IACtD,QAAQ,EAAE,MAAM;IAP3B,SAAS,CAAC,QAAQ,EAAE,wBAAwB,EAAE,CAAM;IACpD,SAAS,CAAC,KAAK,SAAQ;gBAGZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAY,EAC3D,QAAQ,GAAE,MAAW;IAGhC,MAAM,CAAC,GAAG,KAAK,EAAE,wBAAwB,EAAE,GAAG,wBAAwB;IAKtE,WAAW,CACP,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAY,EAC3D,QAAQ,GAAE,MAAW;IAMzB,IAAI,aAAa,IAAI,MAAM,CAU1B;IAED,QAAQ,CAAC,MAAM,GAAE,MAAU,GAAG,MAAM;IAkBpC,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI7C,WAAW,CAAC,MAAM,GAAE,MAAU,GAAG,MAAM;IAqBvC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAQ5C;AAED,qBAAa,8BAA+B,SAAQ,wBAAwB;IACxE,SAAS,CAAC,KAAK,SAA8B;CAChD;AAED,qBAAa,+BAAgC,SAAQ,wBAAwB;IACzE,QAAQ,CAAC,MAAM,GAAE,MAAU,GAAG,MAAM;IAepC,WAAW,CAAC,MAAM,GAAE,MAAU,GAAG,MAAM;CAoB1C"}
|