添加音量调节功能
This commit is contained in:
parent
3d7f9b82ea
commit
b3507de614
|
@ -426,7 +426,6 @@ export default class ClientConnection {
|
||||||
|
|
||||||
public async addMode(group_uuid?: string, name?: string, index?: number) {
|
public async addMode(group_uuid?: string, name?: string, index?: number) {
|
||||||
try {
|
try {
|
||||||
console.log(index);
|
|
||||||
return await this.doRpc<Protocol.AddModeResponseEntity>(
|
return await this.doRpc<Protocol.AddModeResponseEntity>(
|
||||||
new Protocol.AddModeRequestEntity(0, name, group_uuid, index)
|
new Protocol.AddModeRequestEntity(0, name, group_uuid, index)
|
||||||
);
|
);
|
||||||
|
@ -626,6 +625,15 @@ export default class ClientConnection {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public async setWindowVolume(window_id: number, volume: number) {
|
||||||
|
try {
|
||||||
|
return await this.doRpc<Protocol.NoneResponse>(
|
||||||
|
new Protocol.SetWindowVolumeRequestEntity(window_id, volume, 0)
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public restartDevice(delay_ms?: number) {
|
public restartDevice(delay_ms?: number) {
|
||||||
this.ws?.send(
|
this.ws?.send(
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
<template>
|
||||||
|
<q-dialog v-model="show_dialog">
|
||||||
|
<q-card
|
||||||
|
class="overflow-hidden"
|
||||||
|
style="overflow-y: scroll; max-width: 60vw; max-height: 40vh"
|
||||||
|
>
|
||||||
|
<q-card-section style="width: 30vw; height: 10vh">
|
||||||
|
<q-item>
|
||||||
|
<q-item-section avatar>{{ $t("volume") }} :</q-item-section>
|
||||||
|
<q-item-section>
|
||||||
|
<q-slider
|
||||||
|
v-model="volume"
|
||||||
|
:min="0"
|
||||||
|
:max="100"
|
||||||
|
label
|
||||||
|
label-always
|
||||||
|
@change="volume_changed"
|
||||||
|
/>
|
||||||
|
</q-item-section>
|
||||||
|
</q-item>
|
||||||
|
</q-card-section>
|
||||||
|
</q-card>
|
||||||
|
</q-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped></style>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent, ref, watch, computed } from "vue";
|
||||||
|
import { useStore } from "src/store";
|
||||||
|
import { useQuasar, date, copyToClipboard } from "quasar";
|
||||||
|
import { useI18n } from "vue-i18n";
|
||||||
|
import GlobalData from "src/common/GlobalData";
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: "EditVolumeDialog",
|
||||||
|
|
||||||
|
setup() {
|
||||||
|
let $store = useStore();
|
||||||
|
let $q = useQuasar();
|
||||||
|
let $t = useI18n();
|
||||||
|
|
||||||
|
let show_dialog = ref(false);
|
||||||
|
let loading = ref(false);
|
||||||
|
let volume = ref(0);
|
||||||
|
|
||||||
|
let window_id = 0;
|
||||||
|
return {
|
||||||
|
loading,
|
||||||
|
show_dialog,
|
||||||
|
volume,
|
||||||
|
|
||||||
|
showDialog(_window_id: number, _volume: number) {
|
||||||
|
if (_volume < 0) {
|
||||||
|
_volume = 0;
|
||||||
|
}
|
||||||
|
if (_volume > 100) {
|
||||||
|
_volume = 100;
|
||||||
|
}
|
||||||
|
window_id = _window_id;
|
||||||
|
volume.value = _volume;
|
||||||
|
show_dialog.value = true;
|
||||||
|
},
|
||||||
|
volume_changed(val: number) {
|
||||||
|
GlobalData.getInstance()
|
||||||
|
.getCurrentClient()
|
||||||
|
?.setWindowVolume(window_id, volume.value);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
|
@ -257,7 +257,6 @@ export default defineComponent({
|
||||||
tree_nodes,
|
tree_nodes,
|
||||||
showDialog(options: any) {
|
showDialog(options: any) {
|
||||||
if (options) {
|
if (options) {
|
||||||
console.log(options);
|
|
||||||
type.value = options.type ?? 1;
|
type.value = options.type ?? 1;
|
||||||
if (type.value == 2) {
|
if (type.value == 2) {
|
||||||
name.value = options.data?.name ?? null;
|
name.value = options.data?.name ?? null;
|
||||||
|
|
|
@ -520,7 +520,6 @@ export default defineComponent({
|
||||||
timing_cycle.value = $t.t("disable");
|
timing_cycle.value = $t.t("disable");
|
||||||
week_days.value = EWeekDays.EWeekAll;
|
week_days.value = EWeekDays.EWeekAll;
|
||||||
if (type.value == 2) {
|
if (type.value == 2) {
|
||||||
console.log(options);
|
|
||||||
name.value = options.data?.name ?? $t.t("new plan 1");
|
name.value = options.data?.name ?? $t.t("new plan 1");
|
||||||
selected.value = options.data?.item_data?.group_uuid ?? null;
|
selected.value = options.data?.item_data?.group_uuid ?? null;
|
||||||
uuid.value = options.data?.item_data?.uuid ?? null;
|
uuid.value = options.data?.item_data?.uuid ?? null;
|
||||||
|
|
|
@ -13,11 +13,28 @@
|
||||||
@mouseup="onMouseLeave"
|
@mouseup="onMouseLeave"
|
||||||
>
|
>
|
||||||
<q-popup-proxy context-menu>
|
<q-popup-proxy context-menu>
|
||||||
<q-popup-proxy context-menu />
|
|
||||||
<q-list>
|
<q-list>
|
||||||
<q-item
|
<q-item
|
||||||
clickable
|
clickable
|
||||||
v-close-popup
|
v-close-popup
|
||||||
|
:disable="$props.disable"
|
||||||
|
@click="$emit('edit_volume', $props.window.window_id)"
|
||||||
|
v-if="!$props.window.muted"
|
||||||
|
>
|
||||||
|
<q-item-section> {{ $t("edit volume") }} </q-item-section>
|
||||||
|
</q-item>
|
||||||
|
<q-item
|
||||||
|
clickable
|
||||||
|
v-close-popup
|
||||||
|
:disable="$props.disable"
|
||||||
|
@click="$emit('mute_unmute', $props.window.window_id)"
|
||||||
|
>
|
||||||
|
<q-item-section> {{ $t("mute") }} </q-item-section>
|
||||||
|
</q-item>
|
||||||
|
<q-item
|
||||||
|
clickable
|
||||||
|
v-close-popup
|
||||||
|
:disable="$props.disable"
|
||||||
@click="$emit('close_this_window', $props.window.window_id)"
|
@click="$emit('close_this_window', $props.window.window_id)"
|
||||||
>
|
>
|
||||||
<q-item-section> {{ $t("close this window") }} </q-item-section>
|
<q-item-section> {{ $t("close this window") }} </q-item-section>
|
||||||
|
@ -25,6 +42,7 @@
|
||||||
<q-item
|
<q-item
|
||||||
clickable
|
clickable
|
||||||
v-close-popup
|
v-close-popup
|
||||||
|
:disable="$props.disable"
|
||||||
@click="$emit('close_other_windows', $props.window.window_id)"
|
@click="$emit('close_other_windows', $props.window.window_id)"
|
||||||
>
|
>
|
||||||
<q-item-section>
|
<q-item-section>
|
||||||
|
@ -34,6 +52,7 @@
|
||||||
<q-item
|
<q-item
|
||||||
clickable
|
clickable
|
||||||
v-close-popup
|
v-close-popup
|
||||||
|
:disable="$props.disable"
|
||||||
@click="$emit('close_all_windows', $props.window.window_id)"
|
@click="$emit('close_all_windows', $props.window.window_id)"
|
||||||
>
|
>
|
||||||
<q-item-section> {{ $t("close all windwos") }} </q-item-section>
|
<q-item-section> {{ $t("close all windwos") }} </q-item-section>
|
||||||
|
@ -46,7 +65,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
v-if="selected && can_resize"
|
v-if="!$props.disable && selected && can_resize"
|
||||||
class="resize_div absolute_up"
|
class="resize_div absolute_up"
|
||||||
ref="resize_up"
|
ref="resize_up"
|
||||||
@mousedown="onMouseDown"
|
@mousedown="onMouseDown"
|
||||||
|
@ -55,7 +74,7 @@
|
||||||
@mouseup="onMouseLeave"
|
@mouseup="onMouseLeave"
|
||||||
></div>
|
></div>
|
||||||
<div
|
<div
|
||||||
v-if="selected && can_resize"
|
v-if="!$props.disable && selected && can_resize"
|
||||||
class="resize_div absolute_down"
|
class="resize_div absolute_down"
|
||||||
ref="resize_down"
|
ref="resize_down"
|
||||||
@mousedown="onMouseDown"
|
@mousedown="onMouseDown"
|
||||||
|
@ -64,7 +83,7 @@
|
||||||
@mouseup="onMouseLeave"
|
@mouseup="onMouseLeave"
|
||||||
></div>
|
></div>
|
||||||
<div
|
<div
|
||||||
v-if="selected && can_resize"
|
v-if="!$props.disable && selected && can_resize"
|
||||||
class="resize_div absolute_left"
|
class="resize_div absolute_left"
|
||||||
ref="resize_left"
|
ref="resize_left"
|
||||||
@mousedown="onMouseDown"
|
@mousedown="onMouseDown"
|
||||||
|
@ -73,7 +92,7 @@
|
||||||
@mouseup="onMouseLeave"
|
@mouseup="onMouseLeave"
|
||||||
></div>
|
></div>
|
||||||
<div
|
<div
|
||||||
v-if="selected && can_resize"
|
v-if="!$props.disable && selected && can_resize"
|
||||||
class="resize_div absolute_right"
|
class="resize_div absolute_right"
|
||||||
ref="resize_right"
|
ref="resize_right"
|
||||||
@mousedown="onMouseDown"
|
@mousedown="onMouseDown"
|
||||||
|
@ -82,7 +101,7 @@
|
||||||
@mouseup="onMouseLeave"
|
@mouseup="onMouseLeave"
|
||||||
></div>
|
></div>
|
||||||
<div
|
<div
|
||||||
v-if="selected && can_resize"
|
v-if="!$props.disable && selected && can_resize"
|
||||||
class="resize_div absolute_left_up"
|
class="resize_div absolute_left_up"
|
||||||
ref="resize_left_up"
|
ref="resize_left_up"
|
||||||
@mousedown="onMouseDown"
|
@mousedown="onMouseDown"
|
||||||
|
@ -93,7 +112,7 @@
|
||||||
@mouseup="onMouseLeave"
|
@mouseup="onMouseLeave"
|
||||||
></div>
|
></div>
|
||||||
<div
|
<div
|
||||||
v-if="selected && can_resize"
|
v-if="!$props.disable && selected && can_resize"
|
||||||
class="resize_div absolute_right_up"
|
class="resize_div absolute_right_up"
|
||||||
ref="resize_right_up"
|
ref="resize_right_up"
|
||||||
@mousedown="onMouseDown"
|
@mousedown="onMouseDown"
|
||||||
|
@ -104,7 +123,7 @@
|
||||||
@mouseup="onMouseLeave"
|
@mouseup="onMouseLeave"
|
||||||
></div>
|
></div>
|
||||||
<div
|
<div
|
||||||
v-if="selected && can_resize"
|
v-if="!$props.disable && selected && can_resize"
|
||||||
class="resize_div absolute_left_down"
|
class="resize_div absolute_left_down"
|
||||||
ref="resize_left_down"
|
ref="resize_left_down"
|
||||||
@mousedown="onMouseDown"
|
@mousedown="onMouseDown"
|
||||||
|
@ -115,7 +134,7 @@
|
||||||
@mouseup="onMouseLeave"
|
@mouseup="onMouseLeave"
|
||||||
></div>
|
></div>
|
||||||
<div
|
<div
|
||||||
v-if="selected && can_resize"
|
v-if="!$props.disable && selected && can_resize"
|
||||||
class="resize_div absolute_right_down"
|
class="resize_div absolute_right_down"
|
||||||
ref="resize_right_down"
|
ref="resize_right_down"
|
||||||
@mousedown="onMouseDown"
|
@mousedown="onMouseDown"
|
||||||
|
@ -262,6 +281,9 @@ export default defineComponent({
|
||||||
type: Object,
|
type: Object,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
|
disable: {
|
||||||
|
type: Boolean,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
emits: [
|
emits: [
|
||||||
"reset_geometry_offset",
|
"reset_geometry_offset",
|
||||||
|
@ -270,6 +292,8 @@ export default defineComponent({
|
||||||
"close_other_windows",
|
"close_other_windows",
|
||||||
"close_all_windows",
|
"close_all_windows",
|
||||||
"window_fouse_in",
|
"window_fouse_in",
|
||||||
|
"edit_volume",
|
||||||
|
"mute_unmute",
|
||||||
],
|
],
|
||||||
setup(props, { emit }) {
|
setup(props, { emit }) {
|
||||||
const $store = useStore();
|
const $store = useStore();
|
||||||
|
@ -354,6 +378,9 @@ export default defineComponent({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onMouseDown(evt: MouseEvent) {
|
onMouseDown(evt: MouseEvent) {
|
||||||
|
if (props.disable) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (selected.value) {
|
if (selected.value) {
|
||||||
if (evt.button == 0) {
|
if (evt.button == 0) {
|
||||||
mouse_down_flag = true;
|
mouse_down_flag = true;
|
||||||
|
|
|
@ -22,6 +22,10 @@ export class MultimediaWindowEntity extends BaseEntity {
|
||||||
signal_source_table_uuid: string = "";
|
signal_source_table_uuid: string = "";
|
||||||
|
|
||||||
window_state = new WindowStates();
|
window_state = new WindowStates();
|
||||||
|
volume: number = 80;
|
||||||
|
muted: boolean = false;
|
||||||
|
paused: boolean = false;
|
||||||
|
play_speed: number = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class WindowOpenNotifyEntity extends MultimediaWindowEntity {
|
export class WindowOpenNotifyEntity extends MultimediaWindowEntity {
|
||||||
|
|
|
@ -220,6 +220,10 @@ export namespace Protocol {
|
||||||
return Commands.PROTOCOL_PREFIX + "RpcRestoreOutputBoard";
|
return Commands.PROTOCOL_PREFIX + "RpcRestoreOutputBoard";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static get kSetWindowVolume() {
|
||||||
|
return Commands.PROTOCOL_PREFIX + "SetWindowVolume";
|
||||||
|
}
|
||||||
|
|
||||||
static _all_commands = new Set([
|
static _all_commands = new Set([
|
||||||
Commands.kUnKnowCommand,
|
Commands.kUnKnowCommand,
|
||||||
Commands.kSearchDevice,
|
Commands.kSearchDevice,
|
||||||
|
@ -270,6 +274,7 @@ export namespace Protocol {
|
||||||
Commands.kRpcRestoreOutputBoard,
|
Commands.kRpcRestoreOutputBoard,
|
||||||
Commands.kRpcSetOutputBoardSetting,
|
Commands.kRpcSetOutputBoardSetting,
|
||||||
Commands.kRpcGetOutputBoardSetting,
|
Commands.kRpcGetOutputBoardSetting,
|
||||||
|
Commands.kSetWindowVolume,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
public static get AllCommands() {
|
public static get AllCommands() {
|
||||||
|
@ -300,6 +305,9 @@ export namespace Protocol {
|
||||||
timeout = 15 * 1000;
|
timeout = 15 * 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class NoneResponse extends PacketEntity {
|
||||||
|
timestamp = new Date().getMilliseconds();
|
||||||
|
}
|
||||||
export class LoginRequest extends PacketEntity {
|
export class LoginRequest extends PacketEntity {
|
||||||
user_name = "";
|
user_name = "";
|
||||||
password = "";
|
password = "";
|
||||||
|
@ -463,6 +471,11 @@ export namespace Protocol {
|
||||||
y: number = 0;
|
y: number = 0;
|
||||||
width: number = 0;
|
width: number = 0;
|
||||||
height: number = 0;
|
height: number = 0;
|
||||||
|
volume: number = 80;
|
||||||
|
muted: boolean = false;
|
||||||
|
paused: boolean = false;
|
||||||
|
play_speed: number = 1;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
signal_source: string,
|
signal_source: string,
|
||||||
x: number,
|
x: number,
|
||||||
|
@ -495,6 +508,10 @@ export namespace Protocol {
|
||||||
y: number = 0;
|
y: number = 0;
|
||||||
width: number = 0;
|
width: number = 0;
|
||||||
height: number = 0;
|
height: number = 0;
|
||||||
|
volume: number = 80;
|
||||||
|
muted: boolean = false;
|
||||||
|
paused: boolean = false;
|
||||||
|
play_speed: number = 1;
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
this.command = Commands.kOpenWindow;
|
this.command = Commands.kOpenWindow;
|
||||||
|
@ -1321,4 +1338,17 @@ export namespace Protocol {
|
||||||
this.command = Protocol.Commands.kRpcRestoreOutputBoard;
|
this.command = Protocol.Commands.kRpcRestoreOutputBoard;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class SetWindowVolumeRequestEntity extends Protocol.PacketEntity {
|
||||||
|
window_id: number;
|
||||||
|
volume: number;
|
||||||
|
|
||||||
|
constructor(window_id: number, volume: number, rcp_id?: number) {
|
||||||
|
super();
|
||||||
|
this.rpc_id = rcp_id ?? 0;
|
||||||
|
this.command = Protocol.Commands.kSetWindowVolume;
|
||||||
|
this.window_id = window_id;
|
||||||
|
this.volume = volume;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -270,4 +270,7 @@ export default {
|
||||||
"restart command send": "重启指令发送",
|
"restart command send": "重启指令发送",
|
||||||
"the sound card takes effect only after it is restarted. Restart the system":
|
"the sound card takes effect only after it is restarted. Restart the system":
|
||||||
"声卡修改后重启才会生效,是否重启",
|
"声卡修改后重启才会生效,是否重启",
|
||||||
|
"please input mode index": "请输入模式索引(0自动生成)",
|
||||||
|
"mode index": "模式索引",
|
||||||
|
"edit volume": "修改音量",
|
||||||
};
|
};
|
||||||
|
|
|
@ -17,11 +17,14 @@
|
||||||
@close_all_windows="closeAllWindows"
|
@close_all_windows="closeAllWindows"
|
||||||
@window_fouse_in="windowFocusIn"
|
@window_fouse_in="windowFocusIn"
|
||||||
@dblclick="(evt) => windowDBClick(item.window_id)"
|
@dblclick="(evt) => windowDBClick(item.window_id)"
|
||||||
|
@edit_volume="edit_volume"
|
||||||
|
@mute_unmute="mute_unmute"
|
||||||
:ref="'window_' + item.window_id"
|
:ref="'window_' + item.window_id"
|
||||||
:id="'window_' + item.window_id"
|
:id="'window_' + item.window_id"
|
||||||
v-for="(item, index) in windows"
|
v-for="(item, index) in windows"
|
||||||
:uuid="item.uuid"
|
:uuid="item.uuid"
|
||||||
:key="index"
|
:key="index"
|
||||||
|
:disable="plan_running"
|
||||||
class="window"
|
class="window"
|
||||||
:signal_source_table_uuid="item.signal_source_table_uuid"
|
:signal_source_table_uuid="item.signal_source_table_uuid"
|
||||||
:window="item"
|
:window="item"
|
||||||
|
@ -82,6 +85,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<edit-volume-dialog ref="edit_volume_dialog" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
@ -119,15 +123,19 @@ import WindowOtherStateChangeNotifyEntity from "src/entities/WindowOtherStateCha
|
||||||
import { useQuasar } from "quasar";
|
import { useQuasar } from "quasar";
|
||||||
import { NotifyMessage } from "src/common/ClientConnection";
|
import { NotifyMessage } from "src/common/ClientConnection";
|
||||||
|
|
||||||
|
import EditVolumeDialog from "src/components/EditVolumeDialog.vue";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "PageWall",
|
name: "PageWall",
|
||||||
|
|
||||||
components: { Window },
|
components: { Window, EditVolumeDialog },
|
||||||
setup() {
|
setup() {
|
||||||
const $q = useQuasar();
|
const $q = useQuasar();
|
||||||
const $store = useStore();
|
const $store = useStore();
|
||||||
const $t = useI18n();
|
const $t = useI18n();
|
||||||
|
|
||||||
|
const edit_volume_dialog: Ref<any> = ref(null);
|
||||||
|
|
||||||
const plan_running = ref(false);
|
const plan_running = ref(false);
|
||||||
|
|
||||||
const windows = computed({
|
const windows = computed({
|
||||||
|
@ -330,6 +338,7 @@ export default defineComponent({
|
||||||
wall_width_scaler,
|
wall_width_scaler,
|
||||||
wall_height_scaler,
|
wall_height_scaler,
|
||||||
plan_running,
|
plan_running,
|
||||||
|
edit_volume_dialog,
|
||||||
onDrop(e: DragEvent) {
|
onDrop(e: DragEvent) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
let target = e.target as any;
|
let target = e.target as any;
|
||||||
|
@ -509,11 +518,31 @@ export default defineComponent({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
windowDBClick(window_id: number) {
|
windowDBClick(window_id: number) {
|
||||||
|
if (plan_running.value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
GlobalData.getInstance().getCurrentClient()?.windowFitGrid(window_id);
|
GlobalData.getInstance().getCurrentClient()?.windowFitGrid(window_id);
|
||||||
},
|
},
|
||||||
closeWindow(window_id: number) {
|
closeWindow(window_id: number) {
|
||||||
GlobalData.getInstance().getCurrentClient()?.closeWindow(window_id);
|
GlobalData.getInstance().getCurrentClient()?.closeWindow(window_id);
|
||||||
},
|
},
|
||||||
|
edit_volume(window_id: number) {
|
||||||
|
const window = windows.value.find(
|
||||||
|
(element) => element && element.window_id == window_id
|
||||||
|
);
|
||||||
|
if (window) {
|
||||||
|
edit_volume_dialog.value?.showDialog(window_id, window.volume);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mute_unmute(window_id: number) {
|
||||||
|
console.log(windows.value);
|
||||||
|
|
||||||
|
const window = windows.value.find(
|
||||||
|
(element) => element && element.window_id == window_id
|
||||||
|
);
|
||||||
|
if (window) {
|
||||||
|
}
|
||||||
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue