mirror of
https://github.com/silenty4ng/k5web
synced 2025-01-06 20:02:38 +00:00
新的导入导出
This commit is contained in:
parent
cd2cbc5f0a
commit
9452eb8587
4 changed files with 257 additions and 8 deletions
|
@ -37,7 +37,8 @@
|
|||
"vue": "^3.2.40",
|
||||
"vue-echarts": "^6.2.3",
|
||||
"vue-i18n": "^9.2.2",
|
||||
"vue-router": "^4.0.14"
|
||||
"vue-router": "^4.0.14",
|
||||
"xlsx": "^0.18.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@arco-plugins/vite-vue": "^1.4.5",
|
||||
|
|
BIN
public/K5Channel.xlsx
Normal file
BIN
public/K5Channel.xlsx
Normal file
Binary file not shown.
|
@ -21,11 +21,28 @@
|
|||
</a-col>
|
||||
<a-col :span="12" style="text-align: right;">
|
||||
<a-space>
|
||||
<a-button type="primary" @click="saveChannel">
|
||||
保存
|
||||
<a-dropdown>
|
||||
<a-button>
|
||||
保存/加载(即将废弃)<icon-down />
|
||||
</a-button>
|
||||
<template #content>
|
||||
<a-button style="width: 200px; margin: 10px; margin-bottom: 0px;" type="primary" @click="saveChannel">
|
||||
保存
|
||||
</a-button>
|
||||
<br>
|
||||
<a-button style="width: 200px; margin: 10px;" @click="restoreChannel">
|
||||
加载
|
||||
</a-button>
|
||||
</template>
|
||||
</a-dropdown>
|
||||
<a-button type="text" @click="downloadExcelTemplate">
|
||||
下载导入模板
|
||||
</a-button>
|
||||
<a-button @click="restoreChannel">
|
||||
加载
|
||||
<a-button type="primary" @click="restoreExcelChannel">
|
||||
导入
|
||||
</a-button>
|
||||
<a-button @click="saveExcelChannel">
|
||||
导出
|
||||
</a-button>
|
||||
</a-space>
|
||||
</a-col>
|
||||
|
@ -89,6 +106,7 @@
|
|||
import { useAppStore } from '@/store';
|
||||
import { MoveIcon } from 'tdesign-icons-vue-next';
|
||||
import { toTraditional } from 'chinese-simple2traditional';
|
||||
import { read as xlsxRead, writeFile as xlsxWrite, utils as xlsxUtils } from "xlsx";
|
||||
|
||||
const appStore = useAppStore();
|
||||
|
||||
|
@ -358,12 +376,12 @@
|
|||
colKey: 'step',
|
||||
align: 'left',
|
||||
width: 150,
|
||||
cell: (h, { row }) => state.stepOption.indexOf(row.step) >= 0 ? row.step?.toFixed(1) : undefined,
|
||||
cell: (h, { row }) => state.stepOption.indexOf(row.step) >= 0 ? row.step?.toFixed(2) : undefined,
|
||||
edit: {
|
||||
component: Select,
|
||||
props: {
|
||||
clearable: true,
|
||||
options: state.stepOption.map(e=>{return {value: e, label: e.toFixed(1)}}),
|
||||
options: state.stepOption.map(e=>{return {value: e, label: e.toFixed(2)}}),
|
||||
},
|
||||
onEdited: (context: any) => {
|
||||
const newData = [...cstate.renderData];
|
||||
|
@ -646,12 +664,184 @@
|
|||
const input = document.createElement('input');
|
||||
input.type = 'file';
|
||||
input.onchange = async() => {
|
||||
const blob = new Blob([input.files[0]], {type: 'application/octet-stream' });
|
||||
const blob = new Blob([input.files[0]], {type: 'application/octet-stream'});
|
||||
const _json = await blob.text()
|
||||
cstate.renderData = JSON.parse(_json)
|
||||
};
|
||||
input.click();
|
||||
}
|
||||
const downloadExcelTemplate = () => {
|
||||
const a = document.createElement('a');
|
||||
a.href = '/K5Channel.xlsx';
|
||||
a.download = 'K5Channel.xlsx';
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
document.body.removeChild(a);
|
||||
};
|
||||
const saveExcelChannel = async () => {
|
||||
const template = await fetch('/K5Channel.xlsx');
|
||||
const workbook = xlsxRead(await template.arrayBuffer());
|
||||
const worksheet = workbook.Sheets[workbook.SheetNames[0]];
|
||||
for(let i = 2; i < 202; i++){
|
||||
if(cstate.renderData[i - 2]?.name){
|
||||
worksheet['B' + i] = {}
|
||||
worksheet['B' + i].v = cstate.renderData[i - 2]?.name
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.bandwidth){
|
||||
worksheet['C' + i] = {}
|
||||
worksheet['C' + i].v = state.bandwidthOption[cstate.renderData[i - 2]?.bandwidth]
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.rx){
|
||||
worksheet['D' + i] = {}
|
||||
worksheet['D' + i].v = cstate.renderData[i - 2]?.rx
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.tx){
|
||||
worksheet['E' + i] = {}
|
||||
worksheet['E' + i].v = cstate.renderData[i - 2]?.tx
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.power){
|
||||
worksheet['F' + i] = {}
|
||||
worksheet['F' + i].v = state.powerOption[cstate.renderData[i - 2]?.power]
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.rxTone){
|
||||
worksheet['G' + i] = {}
|
||||
worksheet['G' + i].v = state.toneOption[cstate.renderData[i - 2]?.rxTone]
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.rxCTCSS){
|
||||
worksheet['H' + i] = {}
|
||||
worksheet['H' + i].v = cstate.renderData[i - 2]?.rxCTCSS
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.rxDCS){
|
||||
worksheet['I' + i] = {}
|
||||
worksheet['I' + i].v = cstate.renderData[i - 2]?.rxDCS
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.txTone){
|
||||
worksheet['J' + i] = {}
|
||||
worksheet['J' + i].v = state.toneOption[cstate.renderData[i - 2]?.txTone]
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.txCTCSS){
|
||||
worksheet['K' + i] = {}
|
||||
worksheet['K' + i].v = cstate.renderData[i - 2]?.txCTCSS
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.txDCS){
|
||||
worksheet['L' + i] = {}
|
||||
worksheet['L' + i].v = cstate.renderData[i - 2]?.txDCS
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.step){
|
||||
worksheet['M' + i] = {}
|
||||
worksheet['M' + i].v = cstate.renderData[i - 2]?.step
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.reverse){
|
||||
worksheet['N' + i] = {}
|
||||
worksheet['N' + i].v = cstate.renderData[i - 2]?.reverse == true ? '开' : '关'
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.scramb){
|
||||
worksheet['O' + i] = {}
|
||||
worksheet['O' + i].v = cstate.renderData[i - 2]?.scramb
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.busy){
|
||||
worksheet['P' + i] = {}
|
||||
worksheet['P' + i].v = cstate.renderData[i - 2]?.busy == true ? '开' : '关'
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.pttid){
|
||||
worksheet['Q' + i] = {}
|
||||
worksheet['Q' + i].v = cstate.renderData[i - 2]?.pttid
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.mode){
|
||||
worksheet['R' + i] = {}
|
||||
worksheet['R' + i].v = state.modeOption[cstate.renderData[i - 2]?.mode]
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.dtmf){
|
||||
worksheet['S' + i] = {}
|
||||
worksheet['S' + i].v = cstate.renderData[i - 2]?.dtmf == true ? '开' : '关'
|
||||
}
|
||||
if(cstate.renderData[i - 2]?.scanlist){
|
||||
worksheet['T' + i] = {}
|
||||
worksheet['T' + i].v = cstate.renderData[i - 2]?.scanlist.join(',')
|
||||
}
|
||||
}
|
||||
xlsxWrite(workbook, 'K5Channel.xlsx');
|
||||
}
|
||||
const restoreExcelChannel = () => {
|
||||
const input = document.createElement('input');
|
||||
input.type = 'file';
|
||||
input.onchange = async() => {
|
||||
const blob = new Blob([input.files[0]], {type: 'application/octet-stream'});
|
||||
const reader = new FileReader();
|
||||
reader.onload = function(e) {
|
||||
const renderData : any = Array.from({length: 200}).map(e=>{return {scanlist: []}})
|
||||
var data = e.target?.result;
|
||||
var workbook = xlsxRead(data);
|
||||
for(let i = 2; i < 202; i++){
|
||||
if(workbook.Sheets.Sheet1['B' + i]?.w){
|
||||
renderData[i - 2]['name'] = workbook.Sheets.Sheet1['B' + i]?.w
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['C' + i]?.w){
|
||||
renderData[i - 2]['bandwidth'] = Object.keys(state.bandwidthOption).find(key=>state.bandwidthOption[key]==workbook.Sheets.Sheet1['C' + i]?.w)
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['D' + i]?.w){
|
||||
renderData[i - 2]['rx'] = workbook.Sheets.Sheet1['D' + i]?.w
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['E' + i]?.w){
|
||||
renderData[i - 2]['tx'] = workbook.Sheets.Sheet1['E' + i]?.w
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['F' + i]?.w){
|
||||
renderData[i - 2]['power'] = Object.keys(state.powerOption).find(key=>state.powerOption[key]==workbook.Sheets.Sheet1['F' + i]?.w)
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['G' + i]?.w){
|
||||
renderData[i - 2]['rxTone'] = Object.keys(state.toneOption).find(key=>state.toneOption[key]==workbook.Sheets.Sheet1['G' + i]?.w)
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['H' + i]?.w){
|
||||
renderData[i - 2]['rxCTCSS'] = parseFloat(workbook.Sheets.Sheet1['H' + i]?.w)
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['I' + i]?.w){
|
||||
renderData[i - 2]['rxDCS'] = parseFloat(workbook.Sheets.Sheet1['I' + i]?.w)
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['J' + i]?.w){
|
||||
renderData[i - 2]['txTone'] = Object.keys(state.toneOption).find(key=>state.toneOption[key]==workbook.Sheets.Sheet1['J' + i]?.w)
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['K' + i]?.w){
|
||||
renderData[i - 2]['txCTCSS'] = parseFloat(workbook.Sheets.Sheet1['K' + i]?.w)
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['L' + i]?.w){
|
||||
renderData[i - 2]['txDCS'] = parseFloat(workbook.Sheets.Sheet1['L' + i]?.w)
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['M' + i]?.w){
|
||||
renderData[i - 2]['step'] = parseFloat(workbook.Sheets.Sheet1['M' + i]?.w)
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['N' + i]?.w){
|
||||
renderData[i - 2]['reverse'] = workbook.Sheets.Sheet1['N' + i]?.w == '开' ? true : false
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['O' + i]?.w){
|
||||
renderData[i - 2]['scramb'] = parseFloat(workbook.Sheets.Sheet1['O' + i]?.w)
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['P' + i]?.w){
|
||||
renderData[i - 2]['busy'] = workbook.Sheets.Sheet1['P' + i]?.w == '开' ? true : false
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['Q' + i]?.w){
|
||||
renderData[i - 2]['pttid'] = workbook.Sheets.Sheet1['Q' + i]?.w
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['R' + i]?.w){
|
||||
renderData[i - 2]['mode'] = Object.keys(state.modeOption).find(key=>state.modeOption[key]==workbook.Sheets.Sheet1['R' + i]?.w)
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['S' + i]?.w){
|
||||
renderData[i - 2]['dtmf'] = workbook.Sheets.Sheet1['S' + i]?.w == '开' ? true : false
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['T' + i]?.w){
|
||||
if(workbook.Sheets.Sheet1['T' + i]?.w.split(',').indexOf('I') >= 0){
|
||||
renderData[i - 2]['scanlist'].push('I')
|
||||
}
|
||||
if(workbook.Sheets.Sheet1['T' + i]?.w.split(',').indexOf('II') >= 0){
|
||||
renderData[i - 2]['scanlist'].push('II')
|
||||
}
|
||||
}
|
||||
}
|
||||
cstate.renderData = renderData
|
||||
};
|
||||
reader.readAsArrayBuffer(blob);
|
||||
};
|
||||
input.click();
|
||||
}
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
|
|
58
yarn.lock
58
yarn.lock
|
@ -1606,6 +1606,11 @@ acorn@^8.10.0, acorn@^8.11.2, acorn@^8.11.3, acorn@^8.4.1:
|
|||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a"
|
||||
integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
|
||||
|
||||
adler-32@~1.3.0:
|
||||
version "1.3.1"
|
||||
resolved "https://repo.vicicode.com/repository/npm-proxy/adler-32/-/adler-32-1.3.1.tgz#1dbf0b36dda0012189a32b3679061932df1821e2"
|
||||
integrity sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==
|
||||
|
||||
aegis-web-sdk@^1.39.1:
|
||||
version "1.39.1"
|
||||
resolved "https://registry.yarnpkg.com/aegis-web-sdk/-/aegis-web-sdk-1.39.1.tgz#885531ad855ff7340a1728f0a6d4bf7ef1e6705e"
|
||||
|
@ -2174,6 +2179,14 @@ caw@^2.0.0, caw@^2.0.1:
|
|||
tunnel-agent "^0.6.0"
|
||||
url-to-options "^1.0.1"
|
||||
|
||||
cfb@~1.2.1:
|
||||
version "1.2.2"
|
||||
resolved "https://repo.vicicode.com/repository/npm-proxy/cfb/-/cfb-1.2.2.tgz#94e687628c700e5155436dac05f74e08df23bc44"
|
||||
integrity sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==
|
||||
dependencies:
|
||||
adler-32 "~1.3.0"
|
||||
crc-32 "~1.2.0"
|
||||
|
||||
chalk@^1.0.0:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
|
||||
|
@ -2313,6 +2326,11 @@ clone@^1.0.2:
|
|||
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
|
||||
integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==
|
||||
|
||||
codepage@~1.15.0:
|
||||
version "1.15.0"
|
||||
resolved "https://repo.vicicode.com/repository/npm-proxy/codepage/-/codepage-1.15.0.tgz#2e00519024b39424ec66eeb3ec07227e692618ab"
|
||||
integrity sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==
|
||||
|
||||
color-convert@^1.9.0, color-convert@^1.9.3:
|
||||
version "1.9.3"
|
||||
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
|
||||
|
@ -2526,6 +2544,11 @@ cosmiconfig@^8.0.0:
|
|||
parse-json "^5.2.0"
|
||||
path-type "^4.0.0"
|
||||
|
||||
crc-32@~1.2.0, crc-32@~1.2.1:
|
||||
version "1.2.2"
|
||||
resolved "https://repo.vicicode.com/repository/npm-proxy/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
|
||||
integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
|
||||
|
||||
create-require@^1.1.0:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
|
||||
|
@ -3758,6 +3781,11 @@ form-data@^4.0.0:
|
|||
combined-stream "^1.0.8"
|
||||
mime-types "^2.1.12"
|
||||
|
||||
frac@~1.1.2:
|
||||
version "1.1.2"
|
||||
resolved "https://repo.vicicode.com/repository/npm-proxy/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b"
|
||||
integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==
|
||||
|
||||
from2@^2.1.1:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
|
||||
|
@ -6791,6 +6819,13 @@ squeak@^1.0.0:
|
|||
console-stream "^0.1.1"
|
||||
lpad-align "^1.0.1"
|
||||
|
||||
ssf@~0.11.2:
|
||||
version "0.11.2"
|
||||
resolved "https://repo.vicicode.com/repository/npm-proxy/ssf/-/ssf-0.11.2.tgz#0b99698b237548d088fc43cdf2b70c1a7512c06c"
|
||||
integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==
|
||||
dependencies:
|
||||
frac "~1.1.2"
|
||||
|
||||
ssri@^9.0.0:
|
||||
version "9.0.1"
|
||||
resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057"
|
||||
|
@ -7586,11 +7621,21 @@ wide-align@^1.1.5:
|
|||
dependencies:
|
||||
string-width "^1.0.2 || 2 || 3 || 4"
|
||||
|
||||
wmf@~1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://repo.vicicode.com/repository/npm-proxy/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da"
|
||||
integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==
|
||||
|
||||
word-wrap@^1.2.3:
|
||||
version "1.2.5"
|
||||
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
|
||||
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
|
||||
|
||||
word@~0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://repo.vicicode.com/repository/npm-proxy/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961"
|
||||
integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==
|
||||
|
||||
wrap-ansi@^6.2.0:
|
||||
version "6.2.0"
|
||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
|
||||
|
@ -7614,6 +7659,19 @@ wrappy@1:
|
|||
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
|
||||
|
||||
xlsx@^0.18.5:
|
||||
version "0.18.5"
|
||||
resolved "https://repo.vicicode.com/repository/npm-proxy/xlsx/-/xlsx-0.18.5.tgz#16711b9113c848076b8a177022799ad356eba7d0"
|
||||
integrity sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==
|
||||
dependencies:
|
||||
adler-32 "~1.3.0"
|
||||
cfb "~1.2.1"
|
||||
codepage "~1.15.0"
|
||||
crc-32 "~1.2.1"
|
||||
ssf "~0.11.2"
|
||||
wmf "~1.0.1"
|
||||
word "~0.3.0"
|
||||
|
||||
xmlbuilder@^15.1.1:
|
||||
version "15.1.1"
|
||||
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5"
|
||||
|
|
Loading…
Reference in a new issue