Add calibration finetuning
This commit is contained in:
parent
e68f136a13
commit
89931c2817
190
core.js
190
core.js
@ -16,6 +16,13 @@ var lang_cur_direction = "ltr";
|
|||||||
var gj = 0;
|
var gj = 0;
|
||||||
var gu = 0;
|
var gu = 0;
|
||||||
|
|
||||||
|
// DS5 finetuning
|
||||||
|
var finetune_original_data = []
|
||||||
|
var last_written_finetune_data = []
|
||||||
|
var finetune_visible = false
|
||||||
|
var on_finetune_updating = false
|
||||||
|
|
||||||
|
|
||||||
// Alphabetical order
|
// Alphabetical order
|
||||||
var available_langs = {
|
var available_langs = {
|
||||||
"ar_ar": { "name": "العربية", "file": "ar_ar.json", "direction": "rtl"},
|
"ar_ar": { "name": "العربية", "file": "ar_ar.json", "direction": "rtl"},
|
||||||
@ -896,6 +903,169 @@ function alloc_req(id, data=[]) {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function on_finetune_change(x) {
|
||||||
|
list = ["LL", "LT", "RL", "RT", "LR", "LB", "RR", "RB", "LX", "LY", "RX", "RY"]
|
||||||
|
|
||||||
|
out=[]
|
||||||
|
for(i=0;i<12;i++) {
|
||||||
|
v = $("#finetune" + list[i]).val()
|
||||||
|
out.push(parseInt(v))
|
||||||
|
}
|
||||||
|
await write_finetune_data(out)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function ds5_finetune() {
|
||||||
|
// Lock NVS before
|
||||||
|
nvs = await ds5_nvstatus();
|
||||||
|
if(nvs == 0) {
|
||||||
|
await ds5_nvlock();
|
||||||
|
nvs = await ds5_nvstatus();
|
||||||
|
if(nvs != 1) {
|
||||||
|
show_popup("ERROR: Cannot lock NVS (" + nvs + ")");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if(nvs != 1) {
|
||||||
|
show_popup("ERROR: Cannot read NVS status. Finetuning is not safe on this device.");
|
||||||
|
}
|
||||||
|
|
||||||
|
data = await read_finetune_data();
|
||||||
|
if (data == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
curModal = new bootstrap.Modal(document.getElementById('finetuneModal'), {})
|
||||||
|
curModal.show();
|
||||||
|
|
||||||
|
list = ["LL", "LT", "RL", "RT", "LR", "LB", "RR", "RB", "LX", "LY", "RX", "RY"]
|
||||||
|
for(i=0;i<12;i++) {
|
||||||
|
$("#finetune" + list[i]).attr("value", data[i])
|
||||||
|
$("#finetune" + list[i]).on('change', on_finetune_change)
|
||||||
|
}
|
||||||
|
|
||||||
|
finetune_original_data = data
|
||||||
|
finetune_visible = true
|
||||||
|
|
||||||
|
refresh_finetune()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function read_finetune_data() {
|
||||||
|
await device.sendFeatureReport(0x80, alloc_req(0x80, [12,2]))
|
||||||
|
var data = await device.receiveFeatureReport(0x81)
|
||||||
|
var cmd = data.getUint8(0, true);
|
||||||
|
var p1 = data.getUint8(1, true);
|
||||||
|
var p2 = data.getUint8(2, true);
|
||||||
|
var p3 = data.getUint8(3, true);
|
||||||
|
if(cmd != 129 || p1 != 12 || p2 != 2 || p3 != 2)
|
||||||
|
{
|
||||||
|
finetune_close();
|
||||||
|
show_popup("ERROR: Cannot read calibration data");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var out = []
|
||||||
|
for(i=0;i<12;i++)
|
||||||
|
out.push(data.getUint16(4+i*2, true))
|
||||||
|
last_written_finetune_data = out
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function write_finetune_data(data) {
|
||||||
|
if (data.length != 12) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (data == last_written_finetune_data) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
last_written_finetune_data = data
|
||||||
|
pkg = [12,1]
|
||||||
|
for(i=0;i<data.length;i++) {
|
||||||
|
x = data[i]
|
||||||
|
pkg.push(x & 0xff)
|
||||||
|
pkg.push(x >> 8)
|
||||||
|
}
|
||||||
|
await device.sendFeatureReport(0x80, alloc_req(0x80, pkg))
|
||||||
|
}
|
||||||
|
|
||||||
|
function refresh_finetune() {
|
||||||
|
if (!finetune_visible)
|
||||||
|
return;
|
||||||
|
if (on_finetune_updating)
|
||||||
|
return;
|
||||||
|
|
||||||
|
on_finetune_updating = true
|
||||||
|
setTimeout(ds5_finetune_update_all, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
function ds5_finetune_update_all() {
|
||||||
|
ds5_finetune_update("finetuneStickCanvasL", last_lx, last_ly)
|
||||||
|
ds5_finetune_update("finetuneStickCanvasR", last_rx, last_ry)
|
||||||
|
}
|
||||||
|
|
||||||
|
function ds5_finetune_update(name, plx, ply) {
|
||||||
|
on_finetune_updating = false
|
||||||
|
var c = document.getElementById(name);
|
||||||
|
var ctx = c.getContext("2d");
|
||||||
|
var sz = 60;
|
||||||
|
var hb = 20 + sz;
|
||||||
|
var yb = 15 + sz;
|
||||||
|
var w = c.width;
|
||||||
|
ctx.clearRect(0, 0, c.width, c.height);
|
||||||
|
ctx.lineWidth = 1;
|
||||||
|
ctx.fillStyle = '#ffffff';
|
||||||
|
ctx.strokeStyle = '#000000';
|
||||||
|
|
||||||
|
// Left circle
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(hb, yb, sz, 0, 2 * Math.PI);
|
||||||
|
ctx.closePath();
|
||||||
|
ctx.fill();
|
||||||
|
ctx.stroke();
|
||||||
|
|
||||||
|
ctx.strokeStyle = '#aaaaaa';
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.moveTo(hb-sz, yb);
|
||||||
|
ctx.lineTo(hb+sz, yb);
|
||||||
|
ctx.closePath();
|
||||||
|
ctx.stroke();
|
||||||
|
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.moveTo(hb, yb-sz);
|
||||||
|
ctx.lineTo(hb, yb+sz);
|
||||||
|
ctx.closePath();
|
||||||
|
ctx.stroke();
|
||||||
|
|
||||||
|
ctx.fillStyle = '#000000';
|
||||||
|
ctx.strokeStyle = '#000000';
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(hb+plx*sz,yb+ply*sz,4, 0, 2*Math.PI);
|
||||||
|
ctx.fill();
|
||||||
|
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.moveTo(hb, yb);
|
||||||
|
ctx.lineTo(hb+plx*sz, yb+ply*sz);
|
||||||
|
ctx.stroke();
|
||||||
|
}
|
||||||
|
|
||||||
|
function finetune_close() {
|
||||||
|
$("#finetuneModal").modal("hide");
|
||||||
|
finetune_visible = false
|
||||||
|
|
||||||
|
finetune_original_data = []
|
||||||
|
}
|
||||||
|
|
||||||
|
function finetune_save() {
|
||||||
|
finetune_close();
|
||||||
|
|
||||||
|
// Unlock button
|
||||||
|
update_nvs_changes_status(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function finetune_cancel() {
|
||||||
|
if(finetune_original_data.length == 12)
|
||||||
|
await write_finetune_data(finetune_original_data)
|
||||||
|
|
||||||
|
finetune_close();
|
||||||
|
}
|
||||||
|
|
||||||
var last_lx = 0, last_ly = 0, last_rx = 0, last_ry = 0;
|
var last_lx = 0, last_ly = 0, last_rx = 0, last_ry = 0;
|
||||||
var ll_updated = false;
|
var ll_updated = false;
|
||||||
|
|
||||||
@ -1265,6 +1435,7 @@ function process_ds_input(data) {
|
|||||||
last_ry = new_ry;
|
last_ry = new_ry;
|
||||||
ll_updated = true;
|
ll_updated = true;
|
||||||
refresh_sticks();
|
refresh_sticks();
|
||||||
|
refresh_finetune();
|
||||||
}
|
}
|
||||||
|
|
||||||
var bat = data.data.getUint8(52);
|
var bat = data.data.getUint8(52);
|
||||||
@ -1309,7 +1480,8 @@ async function continue_connection(report) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(device.productId == 0x05c4) {
|
if(device.productId == 0x05c4) {
|
||||||
$("#infoshowall").hide();
|
$("#infoshowall").hide()
|
||||||
|
$("#ds5finetune").hide()
|
||||||
if(await ds4_info()) {
|
if(await ds4_info()) {
|
||||||
connected = true;
|
connected = true;
|
||||||
mode = 1;
|
mode = 1;
|
||||||
@ -1317,7 +1489,8 @@ async function continue_connection(report) {
|
|||||||
device.oninputreport = process_ds4_input;
|
device.oninputreport = process_ds4_input;
|
||||||
}
|
}
|
||||||
} else if(device.productId == 0x09cc) {
|
} else if(device.productId == 0x09cc) {
|
||||||
$("#infoshowall").hide();
|
$("#infoshowall").hide()
|
||||||
|
$("#ds5finetune").hide()
|
||||||
if(await ds4_info()) {
|
if(await ds4_info()) {
|
||||||
connected = true;
|
connected = true;
|
||||||
mode = 1;
|
mode = 1;
|
||||||
@ -1325,7 +1498,8 @@ async function continue_connection(report) {
|
|||||||
device.oninputreport = process_ds4_input;
|
device.oninputreport = process_ds4_input;
|
||||||
}
|
}
|
||||||
} else if(device.productId == 0x0ce6) {
|
} else if(device.productId == 0x0ce6) {
|
||||||
$("#infoshowall").show();
|
$("#infoshowall").show()
|
||||||
|
$("#ds5finetune").show()
|
||||||
if(await ds5_info()) {
|
if(await ds5_info()) {
|
||||||
connected = true;
|
connected = true;
|
||||||
mode = 2;
|
mode = 2;
|
||||||
@ -1333,7 +1507,8 @@ async function continue_connection(report) {
|
|||||||
device.oninputreport = process_ds_input;
|
device.oninputreport = process_ds_input;
|
||||||
}
|
}
|
||||||
} else if(device.productId == 0x0df2) {
|
} else if(device.productId == 0x0df2) {
|
||||||
$("#infoshowall").hide();
|
$("#infoshowall").hide()
|
||||||
|
$("#ds5finetune").hide()
|
||||||
if(await ds5_info()) {
|
if(await ds5_info()) {
|
||||||
connected = true;
|
connected = true;
|
||||||
mode = 0;
|
mode = 0;
|
||||||
@ -1395,7 +1570,7 @@ function update_disable_btn() {
|
|||||||
} else if(disable_btn & 2 && !(last_disable_btn & 2)) {
|
} else if(disable_btn & 2 && !(last_disable_btn & 2)) {
|
||||||
show_popup(l("This DualSense controller has outdated firmware.") + "<br>" + l("Please update the firmware and try again."), true);
|
show_popup(l("This DualSense controller has outdated firmware.") + "<br>" + l("Please update the firmware and try again."), true);
|
||||||
} else if(disable_btn & 8 && !(last_disable_btn & 8)) {
|
} else if(disable_btn & 8 && !(last_disable_btn & 8)) {
|
||||||
show_popup(l("Calibration of the DualSense Edge is not currently supported."));
|
show_edge_modal();
|
||||||
} else if(disable_btn & 4 && !(last_disable_btn & 4)) {
|
} else if(disable_btn & 4 && !(last_disable_btn & 4)) {
|
||||||
show_popup(l("Please charge controller battery over 30% to use this tool."));
|
show_popup(l("Please charge controller battery over 30% to use this tool."));
|
||||||
}
|
}
|
||||||
@ -1617,6 +1792,11 @@ function show_donate_modal() {
|
|||||||
new bootstrap.Modal(document.getElementById('donateModal'), {}).show()
|
new bootstrap.Modal(document.getElementById('donateModal'), {}).show()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function show_edge_modal() {
|
||||||
|
la("edge_modal");
|
||||||
|
new bootstrap.Modal(document.getElementById('edgeModal'), {}).show()
|
||||||
|
}
|
||||||
|
|
||||||
function show_info_modal() {
|
function show_info_modal() {
|
||||||
la("info_modal");
|
la("info_modal");
|
||||||
new bootstrap.Modal(document.getElementById('infoModal'), {}).show()
|
new bootstrap.Modal(document.getElementById('infoModal'), {}).show()
|
||||||
|
152
index.html
152
index.html
@ -137,6 +137,8 @@ dl.row dd { font-family: monospace; }
|
|||||||
<div class="vstack gap-2 p-2">
|
<div class="vstack gap-2 p-2">
|
||||||
<button type="button" class="btn btn-primary ds-btn ds-i18n" onclick="calib_open()">Calibrate stick center</button>
|
<button type="button" class="btn btn-primary ds-btn ds-i18n" onclick="calib_open()">Calibrate stick center</button>
|
||||||
<button type="button" class="btn btn-primary ds-btn ds-i18n" onclick="multi_calibrate_range()">Calibrate stick range</button>
|
<button type="button" class="btn btn-primary ds-btn ds-i18n" onclick="multi_calibrate_range()">Calibrate stick range</button>
|
||||||
|
<button type="button" class="btn btn-primary ds-btn" onclick="ds5_finetune()" id="ds5finetune"><span class="ds-i18n">Finetune stick calibration</span> <i id="ds-i18n">(beta)</i></button>
|
||||||
|
<hr>
|
||||||
<button id="savechanges" type="button" class="btn btn-success ds-btn ds-i18n" onclick="multi_flash()" id="resetBtn">Save changes permanently</button>
|
<button id="savechanges" type="button" class="btn btn-success ds-btn ds-i18n" onclick="multi_flash()" id="resetBtn">Save changes permanently</button>
|
||||||
<button type="button" class="btn btn-danger ds-btn ds-i18n" onclick="multi_reset()" id="resetBtn">Reboot controller</button>
|
<button type="button" class="btn btn-danger ds-btn ds-i18n" onclick="multi_reset()" id="resetBtn">Reboot controller</button>
|
||||||
|
|
||||||
@ -225,6 +227,130 @@ dl.row dd { font-family: monospace; }
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Finetune Modal -->
|
||||||
|
<div class="modal fade" id="finetuneModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="finetuneModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-dialog-centered modal-lg modal-fullscreen-lg-down">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h1 class="modal-title fs-5 ds-i18n" id="finetuneModalLabel">Finetune stick calibration</h1>
|
||||||
|
<button type="button" class="btn-close" aria-label="Close" onclick="finetune_cancel()"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<p class="ds-i18n">This screen allows to finetune raw calibration data on your controller</p>
|
||||||
|
<div style="width: 100%; display: flex; justify-content: center;">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col col-lg-6 col-12">
|
||||||
|
|
||||||
|
<div class="card text-bg-light" >
|
||||||
|
<div class="card-header"><span class="ds-i18n">Left stick</span></div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<table>
|
||||||
|
<tr><td></td><td style="text-align: center;">
|
||||||
|
<input id="finetuneLT" type="number" class="form-control" min="0" max="65535" value="0">
|
||||||
|
</td><td></td></tr>
|
||||||
|
<tr>
|
||||||
|
<td height="160px" style="vertical-align: middle; align: right;">
|
||||||
|
<input id="finetuneLL" type="number" class="form-control" min="0" max="65535" value="0">
|
||||||
|
</td>
|
||||||
|
<td><canvas id="finetuneStickCanvasL" width="150" height="150"></canvas></td>
|
||||||
|
<td height="160px" style="vertical-align: middle; align: left;">
|
||||||
|
<input id="finetuneLR" type="number" class="form-control" min="0" max="65535" value="0">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr><td></td><td style="text-align: center;">
|
||||||
|
<input id="finetuneLB" type="number" class="form-control" min="0" max="65535" value="0">
|
||||||
|
</td><td></td></tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col"></div>
|
||||||
|
<div class="col col-auto">
|
||||||
|
<label for="finetuneLX" class="col-form-label ds-i18n">Center X</label>
|
||||||
|
</div>
|
||||||
|
<div class="col col-auto">
|
||||||
|
<input id="finetuneLX" type="number" class="form-control" min="0" max="65535" value="0">
|
||||||
|
</div>
|
||||||
|
<div class="col"></div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col"></div>
|
||||||
|
<div class="col-auto">
|
||||||
|
<label for="finetuneLY" class="col-form-label ds-i18n">Center Y</label>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto">
|
||||||
|
<input id="finetuneLY" type="number" class="form-control" min="0" max="65535" value="0">
|
||||||
|
</div>
|
||||||
|
<div class="col"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div> <!-- col -->
|
||||||
|
<div class="col col-lg-6 col-12">
|
||||||
|
<div class="card text-bg-light" >
|
||||||
|
<div class="card-header"><span class="ds-i18n">Right stick</span></div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<table>
|
||||||
|
<tr><td></td><td style="text-align: center;">
|
||||||
|
<input id="finetuneRT" type="number" class="form-control" min="0" max="65535" value="0">
|
||||||
|
</td><td></td></tr>
|
||||||
|
<tr>
|
||||||
|
<td height="160px" style="vertical-align: middle; align: right;">
|
||||||
|
<input id="finetuneRL" type="number" class="form-control" min="0" max="65535" value="0">
|
||||||
|
</td>
|
||||||
|
<td><canvas id="finetuneStickCanvasR" width="150" height="150"></canvas></td>
|
||||||
|
<td height="160px" style="vertical-align: middle; align: left;">
|
||||||
|
<input id="finetuneRR" type="number" class="form-control" min="0" max="65535" value="0">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr><td></td><td style="text-align: center;">
|
||||||
|
<input id="finetuneRB" type="number" class="form-control" min="0" max="65535" value="0">
|
||||||
|
</td><td></td></tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col"></div>
|
||||||
|
<div class="col col-auto">
|
||||||
|
<label for="finetuneRX" class="col-form-label ds-i18n">Center X</label>
|
||||||
|
</div>
|
||||||
|
<div class="col col-auto">
|
||||||
|
<input id="finetuneRX" type="number" class="form-control" min="0" max="65535" value="0">
|
||||||
|
</div>
|
||||||
|
<div class="col"></div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col"></div>
|
||||||
|
<div class="col-auto">
|
||||||
|
<label for="finetuneRY" class="col-form-label ds-i18n">Center Y</label>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto">
|
||||||
|
<input id="finetuneRY" type="number" class="form-control" min="0" max="65535" value="0">
|
||||||
|
</div>
|
||||||
|
<div class="col"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div> <!-- col -->
|
||||||
|
</div> <!-- row -->
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button direction="button" class="btn btn-secondary ds-i18n" onclick="finetune_cancel()">Cancel</button>
|
||||||
|
<button type="button" class="btn btn-primary ds-i18n" onclick="finetune_save()">Save</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Welcome Modal -->
|
<!-- Welcome Modal -->
|
||||||
<div class="modal fade" id="welcomeModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="welcomeModalLabel" aria-hidden="true">
|
<div class="modal fade" id="welcomeModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="welcomeModalLabel" aria-hidden="true">
|
||||||
<div class="modal-dialog modal-dialog-centered modal-lg">
|
<div class="modal-dialog modal-dialog-centered modal-lg">
|
||||||
@ -388,6 +514,30 @@ dl.row dd { font-family: monospace; }
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="modal fade" id="edgeModal" tabindex="-1" aria-labelledby="modal-title" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-dialog-centered">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title ds-i18n">Dualsense Edge Compatibility</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-body p-4" id="donateBody">
|
||||||
|
<p class="ds-i18n">The DualShock Calibration GUI does not currently support the DualSense Edge.</p>
|
||||||
|
<p class="ds-i18n">I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.</p>
|
||||||
|
<p><span class="ds-i18n">If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a</span>
|
||||||
|
<a href="https://paypal.me/alaincarlucci" target="_blank" class="text-body-secondary ds-i18n">donation</a>.</p>
|
||||||
|
<p class="ds-i18n">Thank you for your generosity and support!</p>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button onclick="window.open('https://paypal.me/alaincarlucci')" type="button" class="btn btn-success" data-bs-dismiss="modal">
|
||||||
|
<svg class="bi" width="18" height="18"><use xlink:href="#paypal"/></svg> <span class="ds-i18n">Support this project</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="modal fade" id="donateModal" tabindex="-1" aria-labelledby="modal-title" aria-hidden="true">
|
<div class="modal fade" id="donateModal" tabindex="-1" aria-labelledby="modal-title" aria-hidden="true">
|
||||||
<div class="modal-dialog modal-dialog-centered">
|
<div class="modal-dialog modal-dialog-centered">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
@ -607,7 +757,7 @@ dl.row dd { font-family: monospace; }
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<footer>
|
<footer>
|
||||||
<div class="d-flex flex-column flex-sm-row justify-content-between py-4 my-4 border-top" id="footbody">
|
<div class="d-flex flex-column flex-sm-row justify-content-between py-4 my-4 border-top" id="footbody">
|
||||||
<p><a target="_blank" href="https://github.com/dualshock-tools/dualshock-tools.github.io/commits/main/"><span class="ds-i18n">Version</span> 1.9</a> (2025-01-05) - <a href="#" class="ds-i18n" onclick="show_donate_modal();">Support this project</a> <span id="authorMsg"></span></p>
|
<p><a target="_blank" href="https://github.com/dualshock-tools/dualshock-tools.github.io/commits/main/"><span class="ds-i18n">Version</span> 2.0</a> (2025-01-18) - <a href="#" class="ds-i18n" onclick="show_donate_modal();">Support this project</a> <span id="authorMsg"></span></p>
|
||||||
|
|
||||||
<ul class="list-unstyled d-flex">
|
<ul class="list-unstyled d-flex">
|
||||||
<li class="ms-3"><a class="link-body-emphasis" href="mailto:ds4@the.al" target="_blank"><svg class="bi" width="24" height="24"><use xlink:href="#mail"/></svg></a></li>
|
<li class="ms-3"><a class="link-body-emphasis" href="mailto:ds4@the.al" target="_blank"><svg class="bi" width="24" height="24"><use xlink:href="#mail"/></svg></a></li>
|
||||||
|
@ -188,5 +188,20 @@
|
|||||||
"Touchpad ID": "Touchpad ID",
|
"Touchpad ID": "Touchpad ID",
|
||||||
"Bluetooth Address": "عنوان البلوتوث",
|
"Bluetooth Address": "عنوان البلوتوث",
|
||||||
"Show all": "عرض الكل",
|
"Show all": "عرض الكل",
|
||||||
|
|
||||||
|
"Finetune stick calibration": "",
|
||||||
|
"(beta)": "",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "",
|
||||||
|
"Left stick": "",
|
||||||
|
"Right stick": "",
|
||||||
|
"Center X": "",
|
||||||
|
"Center Y": "",
|
||||||
|
"Save": "",
|
||||||
|
"Cancel": "",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||||
|
"Thank you for your generosity and support!": "",
|
||||||
"": ""
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -198,5 +198,19 @@
|
|||||||
"Bluetooth Address": "",
|
"Bluetooth Address": "",
|
||||||
"Show all": "",
|
"Show all": "",
|
||||||
|
|
||||||
|
"Finetune stick calibration": "",
|
||||||
|
"(beta)": "",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "",
|
||||||
|
"Left stick": "",
|
||||||
|
"Right stick": "",
|
||||||
|
"Center X": "",
|
||||||
|
"Center Y": "",
|
||||||
|
"Save": "",
|
||||||
|
"Cancel": "",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||||
|
"Thank you for your generosity and support!": "",
|
||||||
"": ""
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -200,5 +200,19 @@
|
|||||||
"Bluetooth Address": "",
|
"Bluetooth Address": "",
|
||||||
"Show all": "",
|
"Show all": "",
|
||||||
|
|
||||||
|
"Finetune stick calibration": "",
|
||||||
|
"(beta)": "",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "",
|
||||||
|
"Left stick": "",
|
||||||
|
"Right stick": "",
|
||||||
|
"Center X": "",
|
||||||
|
"Center Y": "",
|
||||||
|
"Save": "",
|
||||||
|
"Cancel": "",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||||
|
"Thank you for your generosity and support!": "",
|
||||||
"": ""
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -199,5 +199,20 @@
|
|||||||
"Bluetooth Address": "",
|
"Bluetooth Address": "",
|
||||||
"Show all": "Alles anzeigen",
|
"Show all": "Alles anzeigen",
|
||||||
|
|
||||||
|
"Finetune stick calibration": "Feinabstimmung der Stick-Kalibrierung",
|
||||||
|
"(beta)": "(beta)",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "Dieser Bildschirm ermöglicht die Feinabstimmung der Rohkalibrierungsdaten Ihres Controllers.",
|
||||||
|
"Left stick": "Linker Stick",
|
||||||
|
"Right stick": "Rechter Stick",
|
||||||
|
"Center X": "Zentrum X",
|
||||||
|
"Center Y": "Zentrum Y",
|
||||||
|
"Save": "Speichern",
|
||||||
|
"Cancel": "Abbrechen",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "Das DualShock-Kalibrierungstool unterstützt derzeit nicht den DualSense Edge.",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "Ich arbeite aktiv daran, die Kompatibilität hinzuzufügen. Die größte Herausforderung besteht darin, Daten in die Stick-Module zu speichern.",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "Wenn Ihnen dieses Tool geholfen hat oder Sie möchten, dass die DualSense-Edge-Unterstützung schneller verfügbar ist, ziehen Sie bitte in Betracht, das Projekt mit einem Beitrag zu unterstützen",
|
||||||
|
"Thank you for your generosity and support!": "Vielen Dank für Ihre Großzügigkeit und Unterstützung!",
|
||||||
|
|
||||||
"": ""
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -198,5 +198,19 @@
|
|||||||
"Bluetooth Address": "",
|
"Bluetooth Address": "",
|
||||||
"Show all": "",
|
"Show all": "",
|
||||||
|
|
||||||
|
"Finetune stick calibration": "",
|
||||||
|
"(beta)": "",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "",
|
||||||
|
"Left stick": "",
|
||||||
|
"Right stick": "",
|
||||||
|
"Center X": "",
|
||||||
|
"Center Y": "",
|
||||||
|
"Save": "",
|
||||||
|
"Cancel": "",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||||
|
"Thank you for your generosity and support!": "",
|
||||||
"": ""
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -196,5 +196,19 @@
|
|||||||
"Bluetooth Address": "",
|
"Bluetooth Address": "",
|
||||||
"Show all": "",
|
"Show all": "",
|
||||||
|
|
||||||
|
"Finetune stick calibration": "",
|
||||||
|
"(beta)": "",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "",
|
||||||
|
"Left stick": "",
|
||||||
|
"Right stick": "",
|
||||||
|
"Center X": "",
|
||||||
|
"Center Y": "",
|
||||||
|
"Save": "",
|
||||||
|
"Cancel": "",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||||
|
"Thank you for your generosity and support!": "",
|
||||||
"": ""
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -198,5 +198,19 @@
|
|||||||
"Bluetooth Address": "",
|
"Bluetooth Address": "",
|
||||||
"Show all": "",
|
"Show all": "",
|
||||||
|
|
||||||
|
"Finetune stick calibration": "",
|
||||||
|
"(beta)": "",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "",
|
||||||
|
"Left stick": "",
|
||||||
|
"Right stick": "",
|
||||||
|
"Center X": "",
|
||||||
|
"Center Y": "",
|
||||||
|
"Save": "",
|
||||||
|
"Cancel": "",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||||
|
"Thank you for your generosity and support!": "",
|
||||||
"": ""
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -198,5 +198,20 @@
|
|||||||
"Bluetooth Address": "Indirizzo Bluetooth",
|
"Bluetooth Address": "Indirizzo Bluetooth",
|
||||||
"Show all": "Mostra tutto",
|
"Show all": "Mostra tutto",
|
||||||
|
|
||||||
|
"Finetune stick calibration": "Affina calibrazione joystick",
|
||||||
|
"(beta)": "(beta)",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "Questa schermata perfette di affinare i dati grezzi di calibrazione del controller.",
|
||||||
|
"Left stick": "Levetta sinistra",
|
||||||
|
"Right stick": "Levetta destra",
|
||||||
|
"Center X": "Centro X",
|
||||||
|
"Center Y": "Centro Y",
|
||||||
|
"Save": "Salva",
|
||||||
|
"Cancel": "Annulla",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "DualShock Calibration GUI non supporta ancora il DualSense Edge.",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "Sto lavorando attivamente per renderlo compatibile, ma la sfida principale rimane salvare i dati nei moduli degli stick.",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "Se questo strumento ti è stato utile o desideri che il supporto per il DualSense Edge arrivi più rapidamente, considera di supportare il progetto con una",
|
||||||
|
"Thank you for your generosity and support!": "Grazie per la tua generosità e per il supporto!",
|
||||||
|
|
||||||
"": ""
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -199,5 +199,20 @@
|
|||||||
"Bluetooth Address": "",
|
"Bluetooth Address": "",
|
||||||
"Show all": "",
|
"Show all": "",
|
||||||
|
|
||||||
|
"Finetune stick calibration": "スティックの微調整キャリブレーション",
|
||||||
|
"(beta)": "(ベータ版)",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "この画面ではコントローラーの生データを微調整できます。",
|
||||||
|
"Left stick": "左スティック",
|
||||||
|
"Right stick": "右スティック",
|
||||||
|
"Center X": "中心 X",
|
||||||
|
"Center Y": "中心 Y",
|
||||||
|
"Save": "保存",
|
||||||
|
"Cancel": "キャンセル",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "DualShockキャリブレーションGUIは現在、DualSense Edgeをサポートしていません。",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "互換性を追加するために取り組んでいますが、主な課題はスティックモジュールへのデータ保存です。",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "このツールが役に立った場合、またはDualSense Edgeのサポートを早く実現したい場合は、プロジェクトへの支援をご検討ください。",
|
||||||
|
"Thank you for your generosity and support!": "ご支援とご厚意に感謝します!",
|
||||||
|
|
||||||
"": ""
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -199,5 +199,19 @@
|
|||||||
"Bluetooth Address": "Bluetooth Address",
|
"Bluetooth Address": "Bluetooth Address",
|
||||||
"Show all": "모두 보기",
|
"Show all": "모두 보기",
|
||||||
|
|
||||||
|
"Finetune stick calibration": "",
|
||||||
|
"(beta)": "",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "",
|
||||||
|
"Left stick": "",
|
||||||
|
"Right stick": "",
|
||||||
|
"Center X": "",
|
||||||
|
"Center Y": "",
|
||||||
|
"Save": "",
|
||||||
|
"Cancel": "",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||||
|
"Thank you for your generosity and support!": "",
|
||||||
"": ""
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -198,5 +198,19 @@
|
|||||||
"Bluetooth Address": "",
|
"Bluetooth Address": "",
|
||||||
"Show all": "",
|
"Show all": "",
|
||||||
|
|
||||||
|
"Finetune stick calibration": "",
|
||||||
|
"(beta)": "",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "",
|
||||||
|
"Left stick": "",
|
||||||
|
"Right stick": "",
|
||||||
|
"Center X": "",
|
||||||
|
"Center Y": "",
|
||||||
|
"Save": "",
|
||||||
|
"Cancel": "",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||||
|
"Thank you for your generosity and support!": "",
|
||||||
"": ""
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -201,5 +201,19 @@
|
|||||||
"Bluetooth Address": "Adres Bluetooth",
|
"Bluetooth Address": "Adres Bluetooth",
|
||||||
"Show all": "Pokaż wszystko",
|
"Show all": "Pokaż wszystko",
|
||||||
|
|
||||||
|
"Finetune stick calibration": "",
|
||||||
|
"(beta)": "",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "",
|
||||||
|
"Left stick": "",
|
||||||
|
"Right stick": "",
|
||||||
|
"Center X": "",
|
||||||
|
"Center Y": "",
|
||||||
|
"Save": "",
|
||||||
|
"Cancel": "",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||||
|
"Thank you for your generosity and support!": "",
|
||||||
"": ""
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -199,5 +199,19 @@
|
|||||||
"Bluetooth Address": "",
|
"Bluetooth Address": "",
|
||||||
"Show all": "",
|
"Show all": "",
|
||||||
|
|
||||||
|
"Finetune stick calibration": "",
|
||||||
|
"(beta)": "",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "",
|
||||||
|
"Left stick": "",
|
||||||
|
"Right stick": "",
|
||||||
|
"Center X": "",
|
||||||
|
"Center Y": "",
|
||||||
|
"Save": "",
|
||||||
|
"Cancel": "",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||||
|
"Thank you for your generosity and support!": "",
|
||||||
"": ""
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -199,5 +199,19 @@
|
|||||||
"Bluetooth Address": "",
|
"Bluetooth Address": "",
|
||||||
"Show all": "",
|
"Show all": "",
|
||||||
|
|
||||||
"": ""
|
"Finetune stick calibration": "",
|
||||||
|
"(beta)": "",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "",
|
||||||
|
"Left stick": "",
|
||||||
|
"Right stick": "",
|
||||||
|
"Center X": "",
|
||||||
|
"Center Y": "",
|
||||||
|
"Save": "",
|
||||||
|
"Cancel": "",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||||
|
"Thank you for your generosity and support!": "",
|
||||||
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -199,5 +199,19 @@
|
|||||||
"Bluetooth Address": "",
|
"Bluetooth Address": "",
|
||||||
"Show all": "",
|
"Show all": "",
|
||||||
|
|
||||||
"": ""
|
"Finetune stick calibration": "",
|
||||||
|
"(beta)": "",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "",
|
||||||
|
"Left stick": "",
|
||||||
|
"Right stick": "",
|
||||||
|
"Center X": "",
|
||||||
|
"Center Y": "",
|
||||||
|
"Save": "",
|
||||||
|
"Cancel": "",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||||
|
"Thank you for your generosity and support!": "",
|
||||||
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -199,5 +199,19 @@
|
|||||||
"Bluetooth Address": "Bluetooth адреса",
|
"Bluetooth Address": "Bluetooth адреса",
|
||||||
"Show all": "Показати все",
|
"Show all": "Показати все",
|
||||||
|
|
||||||
|
"Finetune stick calibration": "",
|
||||||
|
"(beta)": "",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "",
|
||||||
|
"Left stick": "",
|
||||||
|
"Right stick": "",
|
||||||
|
"Center X": "",
|
||||||
|
"Center Y": "",
|
||||||
|
"Save": "",
|
||||||
|
"Cancel": "",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||||
|
"Thank you for your generosity and support!": "",
|
||||||
"": ""
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -200,5 +200,19 @@
|
|||||||
"Bluetooth Address": "蓝牙地址",
|
"Bluetooth Address": "蓝牙地址",
|
||||||
"Show all": "显示全部信息",
|
"Show all": "显示全部信息",
|
||||||
|
|
||||||
|
"Finetune stick calibration": "",
|
||||||
|
"(beta)": "",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "",
|
||||||
|
"Left stick": "",
|
||||||
|
"Right stick": "",
|
||||||
|
"Center X": "",
|
||||||
|
"Center Y": "",
|
||||||
|
"Save": "",
|
||||||
|
"Cancel": "",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||||
|
"Thank you for your generosity and support!": "",
|
||||||
"": ""
|
"": ""
|
||||||
}
|
}
|
||||||
|
@ -196,5 +196,19 @@
|
|||||||
"Bluetooth Address": "",
|
"Bluetooth Address": "",
|
||||||
"Show all": "",
|
"Show all": "",
|
||||||
|
|
||||||
|
"Finetune stick calibration": "",
|
||||||
|
"(beta)": "",
|
||||||
|
"This screen allows to finetune raw calibration data on your controller": "",
|
||||||
|
"Left stick": "",
|
||||||
|
"Right stick": "",
|
||||||
|
"Center X": "",
|
||||||
|
"Center Y": "",
|
||||||
|
"Save": "",
|
||||||
|
"Cancel": "",
|
||||||
|
|
||||||
|
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||||
|
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||||
|
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||||
|
"Thank you for your generosity and support!": "",
|
||||||
"": ""
|
"": ""
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user