Merge branch 'master' of git://gitorious.org/fg/fgdata
This commit is contained in:
commit
1bf61bdbd6
6 changed files with 6 additions and 672 deletions
|
@ -32,6 +32,8 @@ var update_loop = func {
|
|||
var mp = aimodelsN.getChildren("multiplayer");
|
||||
|
||||
foreach (var a; ac ~ mp) {
|
||||
if (!a.getNode("valid", 1).getValue())
|
||||
continue;
|
||||
if (!a.getNode("tanker", 1).getValue())
|
||||
continue;
|
||||
if (!a.getNode("refuel/contact", 1).getValue())
|
||||
|
|
|
@ -19,11 +19,13 @@
|
|||
<weather-scenarios>
|
||||
<scenario>
|
||||
<name>Disabled</name>
|
||||
<description>METAR weather generation is disabled. Use 'Weather Conditions' and 'Clouds' dialogs to setup your weather.</description>
|
||||
<description>METAR weather generation is disabled. Use the above controls to setup your weather.</description>
|
||||
</scenario>
|
||||
<scenario>
|
||||
<name>Live data</name>
|
||||
<description>Fetch live weather data for your nearest airport from noaa.gov. You need a working internet connection.</description>
|
||||
<description>Fetch live weather data for your nearest airport from noaa.gov. You need a working internet connection.
|
||||
All the controls in this dialog are computed automatically, once a valid METAR is received.
|
||||
</description>
|
||||
</scenario>
|
||||
<scenario>
|
||||
<name>Manual input</name>
|
||||
|
|
|
@ -1,319 +0,0 @@
|
|||
<?xml version="1.0"?>
|
||||
|
||||
<PropertyList>
|
||||
<name>clouds</name>
|
||||
<layout>vbox</layout>
|
||||
|
||||
<text>
|
||||
<label>Weather - Clouds</label>
|
||||
</text>
|
||||
|
||||
<hrule/>
|
||||
|
||||
|
||||
<nasal>
|
||||
<open>
|
||||
var rebuild = func {
|
||||
var p = "/environment/rebuild-layers";
|
||||
setprop(p, getprop(p) + 1);
|
||||
}
|
||||
</open>
|
||||
</nasal>
|
||||
|
||||
|
||||
<!-- Header Row -->
|
||||
|
||||
<group>
|
||||
<layout>table</layout>
|
||||
<padding>7</padding>
|
||||
|
||||
<text>
|
||||
<label>Layer</label>
|
||||
<row>0</row>
|
||||
<col>0</col>
|
||||
</text>
|
||||
|
||||
<text>
|
||||
<label>Elevation (ft)</label>
|
||||
<row>0</row>
|
||||
<col>1</col>
|
||||
</text>
|
||||
|
||||
<text>
|
||||
<label>Coverage</label>
|
||||
<row>0</row>
|
||||
<col>2</col>
|
||||
<width>80</width>
|
||||
</text>
|
||||
|
||||
<text>
|
||||
<label>Thickness (ft)</label>
|
||||
<row>0</row>
|
||||
<col>3</col>
|
||||
</text>
|
||||
|
||||
|
||||
<!-- Layer 4 -->
|
||||
|
||||
<text>
|
||||
<label>4</label>
|
||||
<row>1</row>
|
||||
<col>0</col>
|
||||
</text>
|
||||
|
||||
<input>
|
||||
<row>1</row>
|
||||
<col>1</col>
|
||||
<live>true</live>
|
||||
<property>/environment/clouds/layer[4]/elevation-ft</property>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</input>
|
||||
|
||||
<combo>
|
||||
<row>1</row>
|
||||
<col>2</col>
|
||||
<pref-width>100</pref-width>
|
||||
<live>true</live>
|
||||
<property>/environment/clouds/layer[4]/coverage</property>
|
||||
<value>clear</value>
|
||||
<value>few</value>
|
||||
<value>scattered</value>
|
||||
<value>broken</value>
|
||||
<value>overcast</value>
|
||||
<value>cirrus</value>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>rebuild()</script>
|
||||
</binding>
|
||||
</combo>
|
||||
|
||||
<input>
|
||||
<row>1</row>
|
||||
<col>3</col>
|
||||
<live>true</live>
|
||||
<property>/environment/clouds/layer[4]/thickness-ft</property>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</input>
|
||||
|
||||
|
||||
<!-- Layer 3 -->
|
||||
|
||||
<text>
|
||||
<label>3</label>
|
||||
<row>2</row>
|
||||
<col>0</col>
|
||||
</text>
|
||||
|
||||
<input>
|
||||
<row>2</row>
|
||||
<col>1</col>
|
||||
<live>true</live>
|
||||
<property>/environment/clouds/layer[3]/elevation-ft</property>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</input>
|
||||
|
||||
<combo>
|
||||
<row>2</row>
|
||||
<col>2</col>
|
||||
<pref-width>100</pref-width>
|
||||
<live>true</live>
|
||||
<property>/environment/clouds/layer[3]/coverage</property>
|
||||
<value>clear</value>
|
||||
<value>few</value>
|
||||
<value>scattered</value>
|
||||
<value>broken</value>
|
||||
<value>overcast</value>
|
||||
<value>cirrus</value>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>rebuild()</script>
|
||||
</binding>
|
||||
</combo>
|
||||
|
||||
<input>
|
||||
<row>2</row>
|
||||
<col>3</col>
|
||||
<live>true</live>
|
||||
<property>/environment/clouds/layer[3]/thickness-ft</property>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</input>
|
||||
|
||||
|
||||
<!-- Layer 2 -->
|
||||
|
||||
<text>
|
||||
<label>2</label>
|
||||
<row>3</row>
|
||||
<col>0</col>
|
||||
</text>
|
||||
|
||||
<input>
|
||||
<row>3</row>
|
||||
<col>1</col>
|
||||
<live>true</live>
|
||||
<property>/environment/clouds/layer[2]/elevation-ft</property>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</input>
|
||||
|
||||
<combo>
|
||||
<row>3</row>
|
||||
<col>2</col>
|
||||
<pref-width>100</pref-width>
|
||||
<live>true</live>
|
||||
<property>/environment/clouds/layer[2]/coverage</property>
|
||||
<value>clear</value>
|
||||
<value>few</value>
|
||||
<value>scattered</value>
|
||||
<value>broken</value>
|
||||
<value>overcast</value>
|
||||
<value>cirrus</value>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>rebuild()</script>
|
||||
</binding>
|
||||
</combo>
|
||||
|
||||
<input>
|
||||
<row>3</row>
|
||||
<col>3</col>
|
||||
<live>true</live>
|
||||
<property>/environment/clouds/layer[2]/thickness-ft</property>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</input>
|
||||
|
||||
|
||||
<!-- Layer 1 -->
|
||||
|
||||
<text>
|
||||
<label>1</label>
|
||||
<row>4</row>
|
||||
<col>0</col>
|
||||
</text>
|
||||
|
||||
<input>
|
||||
<row>4</row>
|
||||
<col>1</col>
|
||||
<live>true</live>
|
||||
<property>/environment/clouds/layer[1]/elevation-ft</property>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</input>
|
||||
|
||||
<combo>
|
||||
<row>4</row>
|
||||
<col>2</col>
|
||||
<pref-width>100</pref-width>
|
||||
<live>true</live>
|
||||
<property>/environment/clouds/layer[1]/coverage</property>
|
||||
<value>clear</value>
|
||||
<value>few</value>
|
||||
<value>scattered</value>
|
||||
<value>broken</value>
|
||||
<value>overcast</value>
|
||||
<value>cirrus</value>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>rebuild()</script>
|
||||
</binding>
|
||||
</combo>
|
||||
|
||||
<input>
|
||||
<row>4</row>
|
||||
<col>3</col>
|
||||
<live>true</live>
|
||||
<property>/environment/clouds/layer[1]/thickness-ft</property>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</input>
|
||||
|
||||
|
||||
<!-- Layer 0 -->
|
||||
|
||||
<text>
|
||||
<label>0</label>
|
||||
<row>5</row>
|
||||
<col>0</col>
|
||||
</text>
|
||||
|
||||
<input>
|
||||
<row>5</row>
|
||||
<col>1</col>
|
||||
<live>true</live>
|
||||
<property>/environment/clouds/layer[0]/elevation-ft</property>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</input>
|
||||
|
||||
<combo>
|
||||
<row>5</row>
|
||||
<col>2</col>
|
||||
<pref-width>100</pref-width>
|
||||
<live>true</live>
|
||||
<editable>false</editable>
|
||||
<property>/environment/clouds/layer[0]/coverage</property>
|
||||
<value>clear</value>
|
||||
<value>few</value>
|
||||
<value>scattered</value>
|
||||
<value>broken</value>
|
||||
<value>overcast</value>
|
||||
<value>cirrus</value>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>rebuild()</script>
|
||||
</binding>
|
||||
</combo>
|
||||
|
||||
<input>
|
||||
<row>5</row>
|
||||
<col>3</col>
|
||||
<live>true</live>
|
||||
<property>/environment/clouds/layer[0]/thickness-ft</property>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</input>
|
||||
|
||||
</group>
|
||||
|
||||
|
||||
<!-- Buttons -->
|
||||
|
||||
<button>
|
||||
<legend>Close</legend>
|
||||
<default>true</default>
|
||||
<binding>
|
||||
<command>dialog-close</command>
|
||||
</binding>
|
||||
</button>
|
||||
|
||||
</PropertyList>
|
|
@ -1,60 +0,0 @@
|
|||
<?xml version="1.0"?>
|
||||
|
||||
<PropertyList>
|
||||
<name>rainsnow</name>
|
||||
<modal>false</modal>
|
||||
<layout>vbox</layout>
|
||||
|
||||
<text>
|
||||
<x>10</x>
|
||||
<y>540</y>
|
||||
<label>Rain and Snow configuration</label>
|
||||
</text>
|
||||
|
||||
<text>
|
||||
<x>10</x>
|
||||
<y>480</y>
|
||||
<label>Rain</label>
|
||||
</text>
|
||||
|
||||
<slider>
|
||||
<x>330</x>
|
||||
<y>0</y>
|
||||
<width>75</width>
|
||||
<height>25</height>
|
||||
<property>/environment/metar/rain-norm</property>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</slider>
|
||||
|
||||
<text>
|
||||
<x>10</x>
|
||||
<y>480</y>
|
||||
<label>Snow</label>
|
||||
</text>
|
||||
|
||||
<slider>
|
||||
<x>330</x>
|
||||
<y>0</y>
|
||||
<width>75</width>
|
||||
<height>25</height>
|
||||
<property>/environment/metar/snow-norm</property>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</slider>
|
||||
|
||||
<button>
|
||||
<legend>Close</legend>
|
||||
<default>true</default>
|
||||
<key>Esc</key>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>dialog-close</command>
|
||||
</binding>
|
||||
</button>
|
||||
|
||||
</PropertyList>
|
|
@ -113,10 +113,6 @@
|
|||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>rebuild()</script>
|
||||
</binding>
|
||||
</combo>
|
||||
|
||||
<input>
|
||||
|
@ -157,10 +153,6 @@
|
|||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>rebuild()</script>
|
||||
</binding>
|
||||
</combo>
|
||||
|
||||
<input>
|
||||
|
@ -201,10 +193,6 @@
|
|||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>rebuild()</script>
|
||||
</binding>
|
||||
</combo>
|
||||
|
||||
<input>
|
||||
|
@ -245,10 +233,6 @@
|
|||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>rebuild()</script>
|
||||
</binding>
|
||||
</combo>
|
||||
|
||||
<input>
|
||||
|
@ -290,10 +274,6 @@
|
|||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>rebuild()</script>
|
||||
</binding>
|
||||
</combo>
|
||||
|
||||
<input>
|
||||
|
|
|
@ -1,271 +0,0 @@
|
|||
<?xml version="1.0"?>
|
||||
|
||||
<PropertyList>
|
||||
<name>weather_scenario</name>
|
||||
<modal>false</modal>
|
||||
<layout>vbox</layout>
|
||||
<resizable>true</resizable>
|
||||
<default-padding>3</default-padding>
|
||||
|
||||
<group>
|
||||
<layout>hbox</layout>
|
||||
<default-padding>1</default-padding>
|
||||
|
||||
<empty><stretch>true</stretch></empty>
|
||||
|
||||
<text>
|
||||
<label>Automatic Weather Generation</label>
|
||||
</text>
|
||||
|
||||
<empty><stretch>true</stretch></empty>
|
||||
|
||||
<button>
|
||||
<legend></legend>
|
||||
<key>Esc</key>
|
||||
<pref-width>16</pref-width>
|
||||
<pref-height>16</pref-height>
|
||||
<border>2</border>
|
||||
<binding>
|
||||
<command>dialog-close</command>
|
||||
</binding>
|
||||
</button>
|
||||
</group>
|
||||
|
||||
<hrule/>
|
||||
<group>
|
||||
<layout>hbox</layout>
|
||||
<text>
|
||||
<label>METAR Source</label>
|
||||
</text>
|
||||
<empty><stretch>true</stretch></empty>
|
||||
</group>
|
||||
|
||||
<combo>
|
||||
<name>source-selection</name>
|
||||
<halign>fill</halign>
|
||||
<stretch>true</stretch>
|
||||
<property>sim/gui/dialogs/weather-scenario/source-selection</property>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
<object-name>source-selection</object-name>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>dialog-update</command>
|
||||
<object-name>metar</object-name>
|
||||
</binding>
|
||||
</combo>
|
||||
|
||||
<textbox>
|
||||
<name>description</name>
|
||||
<halign>fill</halign>
|
||||
<stretch>true</stretch>
|
||||
<pref-width>180</pref-width>
|
||||
<pref-height>100</pref-height>
|
||||
<slider>20</slider>
|
||||
<editable>false</editable>
|
||||
<wrap>true</wrap>
|
||||
<live>true</live>
|
||||
<property>sim/gui/dialogs/weather-scenario/description</property>
|
||||
</textbox>
|
||||
|
||||
<group>
|
||||
<layout>hbox</layout>
|
||||
<text>
|
||||
<label>METAR Data</label>
|
||||
</text>
|
||||
<empty><stretch>true</stretch></empty>
|
||||
</group>
|
||||
|
||||
<textbox>
|
||||
<name>metar</name>
|
||||
<halign>fill</halign>
|
||||
<stretch>true</stretch>
|
||||
<pref-width>180</pref-width>
|
||||
<pref-height>50</pref-height>
|
||||
<slider>20</slider>
|
||||
<editable>true</editable>
|
||||
<wrap>true</wrap>
|
||||
<live>false</live>
|
||||
<property>sim/gui/dialogs/weather-scenario/metar</property>
|
||||
</textbox>
|
||||
|
||||
<hrule/>
|
||||
|
||||
<group>
|
||||
<layout>hbox</layout>
|
||||
<empty><stretch>true</stretch></empty>
|
||||
<checkbox>
|
||||
<property>/environment/params/metar-updates-winds-aloft</property>
|
||||
<label>Update winds aloft</label>
|
||||
<name>aloft</name>
|
||||
</checkbox>
|
||||
<empty><stretch>true</stretch></empty>
|
||||
</group>
|
||||
|
||||
<group>
|
||||
<layout>hbox</layout>
|
||||
|
||||
<empty><stretch>true</stretch></empty>
|
||||
<button>
|
||||
<legend>OK</legend>
|
||||
<default>true</default>
|
||||
<equal>true</equal>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>dialog-close</command>
|
||||
</binding>
|
||||
</button>
|
||||
|
||||
<button>
|
||||
<legend>Apply</legend>
|
||||
<equal>true</equal>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>apply()</script>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</button>
|
||||
|
||||
<button>
|
||||
<legend>Instant-Apply</legend>
|
||||
<equal>true</equal>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>apply()</script>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>reinit</command>
|
||||
<subsystem>environment</subsystem>
|
||||
</binding>
|
||||
</button>
|
||||
|
||||
<button>
|
||||
<legend>Cancel</legend>
|
||||
<equal>true</equal>
|
||||
<key>Esc</key>
|
||||
<binding>
|
||||
<command>dialog-close</command>
|
||||
</binding>
|
||||
</button>
|
||||
|
||||
<empty><stretch>true</stretch></empty>
|
||||
</group>
|
||||
|
||||
<nasal>
|
||||
<open><![CDATA[
|
||||
var dlg_root = cmdarg();
|
||||
|
||||
var normalize_string = func(src) {
|
||||
if( src == nil ) src = "";
|
||||
var dst = "";
|
||||
for( var i = 0; i < size(src); i+=1 ) {
|
||||
if( src[i] == `\n` or src[i] == `\r` )
|
||||
src[i] = ` `;
|
||||
|
||||
if( i != 0 and src[i] == ` ` and src[i-1] == ` ` )
|
||||
continue;
|
||||
|
||||
dst = dst ~ " ";
|
||||
dst[size(dst)-1] = src[i];
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
var findScenarioByName = func(name) {
|
||||
var wsn = props.globals.getNode( "/environment/weather-scenarios" );
|
||||
if( wsn != nil ) {
|
||||
var scenarios = wsn.getChildren("scenario");
|
||||
foreach (var scenario; scenarios ) {
|
||||
if( scenario.getNode("name").getValue() == name )
|
||||
return scenario;
|
||||
}
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
var findElementByName = func(rootN, name) {
|
||||
foreach( var child; rootN.getChildren() ) {
|
||||
var n = child.getNode( "name" );
|
||||
if( n != nil and n.getValue() == name )
|
||||
return child;
|
||||
var f = findElementByName(child,name);
|
||||
if( f != nil ) return f;
|
||||
}
|
||||
return nil;
|
||||
};
|
||||
|
||||
var propertyChangeListener = setlistener( "sim/gui/dialogs/weather-scenario/source-selection", func(n) {
|
||||
description = "";
|
||||
metar = "nil";
|
||||
var scenario = findScenarioByName( n.getValue() );
|
||||
if( scenario != nil ) {
|
||||
description = normalize_string(scenario.getNode("description", 1 ).getValue());
|
||||
metar = normalize_string(scenario.getNode("metar", 1 ).getValue());
|
||||
}
|
||||
setprop("sim/gui/dialogs/weather-scenario/description", description );
|
||||
setprop("sim/gui/dialogs/weather-scenario/metar", metar );
|
||||
});
|
||||
|
||||
var metarListener = setlistener( "environment/metar/data", func(n) {
|
||||
var metar = n.getValue();
|
||||
if( metar == nil ) metar = "";
|
||||
metar = normalize_string(metar);
|
||||
setprop("sim/gui/dialogs/weather-scenario/metar", metar );
|
||||
gui.dialog_update( "weather_scenario", "metar" );
|
||||
}, 1, 0);
|
||||
|
||||
#initialize the METAR source selection
|
||||
if( getprop( "environment/params/metar-updates-environment" ) == 0 ) {
|
||||
setprop("sim/gui/dialogs/weather-scenario/source-selection", "Disabled" );
|
||||
} else if( getprop( "environment/params/real-world-weather-fetch" ) ) {
|
||||
setprop("sim/gui/dialogs/weather-scenario/source-selection", "Live data" );
|
||||
} else {
|
||||
setprop("sim/gui/dialogs/weather-scenario/source-selection", "Manual input" );
|
||||
}
|
||||
setprop( "sim/gui/dialogs/weather-scenario/metar", normalize_string(getprop("environment/metar/data")) );
|
||||
|
||||
|
||||
# fill the METAR source combo box
|
||||
var combo = findElementByName( dlg_root, "source-selection" );
|
||||
var wsn = props.globals.getNode( "/environment/weather-scenarios" );
|
||||
if( wsn != nil ) {
|
||||
var scenarios = wsn.getChildren("scenario");
|
||||
forindex (var i; scenarios )
|
||||
combo.getChild("value", i, 1).setValue(scenarios[i].getNode("name").getValue());
|
||||
}
|
||||
|
||||
|
||||
var apply = func {
|
||||
var scenarioName = getprop("sim/gui/dialogs/weather-scenario/source-selection");
|
||||
var metar = nil;
|
||||
if( scenarioName == "Disabled" ) {
|
||||
setprop( "/environment/params/metar-updates-environment", 0 );
|
||||
setprop( "/environment/params/real-world-weather-fetch", 0 );
|
||||
} else if( scenarioName == "Live data" ) {
|
||||
setprop( "/environment/params/metar-updates-environment", 1 );
|
||||
setprop( "/environment/params/real-world-weather-fetch", 1 );
|
||||
} else {
|
||||
setprop( "/environment/params/metar-updates-environment", 1 );
|
||||
setprop( "/environment/params/real-world-weather-fetch", 0 );
|
||||
metar = getprop( "sim/gui/dialogs/weather-scenario/metar" );
|
||||
}
|
||||
if( metar != nil )
|
||||
setprop( "environment/metar/data", normalize_string(metar) );
|
||||
}
|
||||
|
||||
]]></open>
|
||||
|
||||
<close><![CDATA[
|
||||
removelistener( propertyChangeListener );
|
||||
removelistener( metarListener );
|
||||
]]></close>
|
||||
|
||||
</nasal>
|
||||
</PropertyList>
|
Loading…
Add table
Reference in a new issue