From ed82241fc31b8355721a28ce5bda28f1ef0113fa Mon Sep 17 00:00:00 2001
From: olevole
Date: Sun, 24 Nov 2024 16:25:39 +0300
Subject: [PATCH] fix link; improve bhyve vm create form
---
README.markdown | 2 +-
php/clonos.php | 63 +-
php/config.php | 25 +-
php/localization.php | 137 +
public/css/styles.css | 9 +
public/dialogs/bhyve-new.php | 2 -
public/dialogs/bhyve-obtain.php | 15 +-
public/index.php | 2 +-
public/js/clonos.js | 85 +-
.../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 275 bytes
.../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 372 bytes
.../__pycache__/auth_plugins.cpython-311.pyc | Bin 0 -> 6514 bytes
.../__pycache__/websocket.cpython-311.pyc | Bin 0 -> 35367 bytes
.../websocketproxy.cpython-311.pyc | Bin 0 -> 39428 bytes
.../websocketserver.cpython-311.pyc | Bin 0 -> 6039 bytes
.../websockifyserver.cpython-311.pyc | Bin 0 -> 43408 bytes
public/pages/overview/en.index.php | 2 +-
public/pages/overview/index.php | 46 +
public/pages/overview/orig.index.php | 46 +
public/pages/overview/ru.index.php | 2 +-
.../translate.cache/!dont.touch.files | 1 +
public/phpliteadmin.config.php | 85 +
public/phpliteadmin.php | 6264 +++++++++++++++++
version | 2 +-
24 files changed, 6749 insertions(+), 39 deletions(-)
create mode 100644 public/novnc/utils/websockify/websockify/__pycache__/__init__.cpython-311.pyc
create mode 100644 public/novnc/utils/websockify/websockify/__pycache__/__main__.cpython-311.pyc
create mode 100644 public/novnc/utils/websockify/websockify/__pycache__/auth_plugins.cpython-311.pyc
create mode 100644 public/novnc/utils/websockify/websockify/__pycache__/websocket.cpython-311.pyc
create mode 100644 public/novnc/utils/websockify/websockify/__pycache__/websocketproxy.cpython-311.pyc
create mode 100644 public/novnc/utils/websockify/websockify/__pycache__/websocketserver.cpython-311.pyc
create mode 100644 public/novnc/utils/websockify/websockify/__pycache__/websockifyserver.cpython-311.pyc
create mode 100644 public/pages/overview/index.php
create mode 100644 public/pages/overview/orig.index.php
create mode 100644 public/pages/overview/translate.cache/!dont.touch.files
create mode 100644 public/phpliteadmin.config.php
create mode 100644 public/phpliteadmin.php
diff --git a/README.markdown b/README.markdown
index fdad2c1d..98ade1e1 100644
--- a/README.markdown
+++ b/README.markdown
@@ -17,7 +17,7 @@ ClonOS is a free open-source FreeBSD-based platform for virtual environments cre
+ https://man.freebsd.org/vale/4 :: vale(4) as Virtual Ethernet Switch
+ http://man.freebsd.org/jail/8 :: jail(8) as container engine
-- https://www.bsdstore.ru/en/ :: CBSD Project as management tools
+- https://github.com/cbsd/cbsd :: CBSD Project as management tools
- https://puppet.com/ :: Puppet as configuration management
diff --git a/php/clonos.php b/php/clonos.php
index ee2b929f..fde6254a 100644
--- a/php/clonos.php
+++ b/php/clonos.php
@@ -94,7 +94,8 @@ class ClonOS {
$this->config=new Config();
$this->_locale = new Localization($this->realpath_public);
-
+ $this->_translate = new Translate($this->_locale,$this->realpath_page);
+
$this->_client_ip=$_SERVER['REMOTE_ADDR'];
if(isset($this->_vars['path'])){
@@ -103,12 +104,23 @@ class ClonOS {
$this->json_name=$this->realpath_page.'a.json.php';
//echo $this->realpath_page;
}else if($_SERVER['REQUEST_URI']){
+
+ if($this->uri_chunks[0]=='overview1')
+ {
+ $this->uri_chunks[0]='overview';
+ $this->realpath_page=$this->realpath_public.'pages/'.$this->uri_chunks[0].'/';
+ $this->_translate->translate($this->realpath_page,'index.php');
+ //break 1;
+ }
+
//$this->realpath_page=$this->realpath_public.'pages/'.trim($_SERVER['REQUEST_URI'],'/').'/';
if(isset($this->uri_chunks[0])){
$this->realpath_page=$this->realpath_public.'pages/'.$this->uri_chunks[0].'/';
}
}
+
+
if(isset($this->_vars['hash'])) $this->url_hash=preg_replace('/^#/','',$this->_vars['hash']);
// $this->json_name=$this->realpath_php.'pages'
@@ -1614,7 +1626,7 @@ class ClonOS {
$res=$db->selectOne("SELECT * FROM media WHERE idx=?", array([(int)$this->form['media_id'], PDO::PARAM_INT]));
if($res===false || empty($res)) return array('error'=>true,'res'=>print_r($res,true));
- //if($res['jname']=='-') // если медиа отвязана, то про
+ //if($res['jname']=='-') // если медиа отвязана, то про
$res=CBSD::run(
'media mode=remove name="%s" path="%s" jname="%s" type="%s"', //.$res['name']
@@ -2353,31 +2365,33 @@ class ClonOS {
$html=str_replace('#sel#',' selected="selected"',$html);
}
- $form_items=$this->getBhyve_formItems();
+ $form_items=$this->getBhyveFormItems();
return array('iso_list'=>$html,'form_items'=>$form_items);
}
- function getBhyve_formItems($os_name='')
+
+ function ccmd_vmOsInfo() //getVMOSListInfo
{
+ return array('form_items'=>$this->getBhyveFormItems($this->form['vmOsProfile'],$this->form['obtain']));
+ }
+
+ function getBhyveFormItems($os_name='',$obtain='')
+ {
+ $jname='undefined';
if($os_name!='')
{
- $res=array();
+ $arr=$this->config->os_types_getOne($os_name,$obtain);
}else{
- $arr=$this->config->os_types_getOne('first');
-//return $res;exit;
- $jname='undefined';
- $jres=$this->ccmd_getFreeJname(false,$arr['default_jname']);
- if(!$jres['error'])
- {
- $jname=$jres['freejname'];
- }
- //print_r($jres);exit;
- //$res['jname']=$jname;
- //var_dump($res);exit;
-
+ $arr=$this->config->os_types_getOne('first',$obtain);
}
-
+
+ $jres=$this->ccmd_getFreeJname(false,$arr['default_jname']);
+ if(!$jres['error'])
+ {
+ $jname=$jres['freejname'];
+ }
+
$res=array(
'jname'=>$jname, //$arr['jname'],
'imgsize'=>array(
@@ -2395,10 +2409,21 @@ class ClonOS {
'max'=>intval($arr['vm_ram_max']),
'cur'=>intval($arr['vm_ram'])
),
+ 'obtain'=>$obtain,
);
return $res;
}
+
+ function ccmd_getObtainFormItems($os_name='')
+ {
+ $res=array('form_items'=>$this->getBhyveFormItems($os_name,'obtain'));
+ return $res;
+ }
+
+
+
+
function get_interfaces_html(){
$if=$this->config->os_interfaces;
@@ -2501,7 +2526,7 @@ class ClonOS {
if($db->isConnected()) {
$res=$db->selectOne("SELECT username FROM auth_user WHERE username=?", array([$user_info['username']]));
if(!empty($res)){
- $res['user_exsts']=true;
+ $res['user_exists']=true; // было user_exsts, похоже была опечатка
return $res;
}
diff --git a/php/config.php b/php/config.php
index 8358a9ba..728effce 100644
--- a/php/config.php
+++ b/php/config.php
@@ -320,17 +320,32 @@ class Config
}
return $html;
}
- function os_types_getOne($name='first')
+ function os_types_getOne($name='first',$obtain='')
{
$res=array();
- $info=$this->os_types;
- if($name='first')
+ if($obtain=='obtain')
+ {
+ $info=$this->os_types_obtain;
+ }else{
+ $info=$this->os_types;
+ }
+
+ if($name=='first')
{
$res=current($info)['items'][0];
}else{
-
+ foreach($info as $type)
+ {
+ foreach($type['items'] as $arr)
+ {
+ if($arr['name']==$name)
+ {
+ $res=$arr;
+ break 2;
+ }
+ }
+ }
}
-
return $res;
}
diff --git a/php/localization.php b/php/localization.php
index d601eaab..629aa75f 100644
--- a/php/localization.php
+++ b/php/localization.php
@@ -22,4 +22,141 @@ class Localization
{
return (isset($this->translate_arr[$phrase])) ? $this->translate_arr[$phrase] : $phrase;
}
+}
+
+
+
+class Translate
+{
+ private $locale='';
+ private $language='';
+ private $realpath='';
+
+ function __construct($locale,$realpath)
+ {
+
+ $this->locale=$locale;
+ $this->language=$this->locale->get_lang();
+ $this->realpath=$realpath;
+ }
+
+ public function translate($path,$file_name)
+ {
+ $file=$path.$file_name;
+ $db=new Db('clonos');
+ if(!$db->isConnected()) return array('error'=>true,'error_message'=>'db connection lost!');
+ //$status=(new Db('base','cbsdtaskd'))->selectOne("SELECT status,logfile,errcode
+ // FROM taskd WHERE id=?", array([$task_id]);
+
+ if(file_exists($file))
+ {
+ $is_changed=false;
+ $txt=file_get_contents($file);
+ preg_match_all('#]*)>(.*)#',$txt,$res,PREG_SET_ORDER);
+// var_dump($res);exit;
+
+ foreach($res as $item)
+ {
+ $id=-1;
+ //$text='';
+ $update=false;
+ $params=[];
+ $tag=$item[0];
+ $attrs=$item[1];
+ $text=$item[2];
+
+ if($attrs!='')
+ {
+ //$txt=$item[2];
+ //echo ''.$txt;
+ preg_match_all('#((id)="?([\d]+)"?|update)#',$attrs,$params,PREG_SET_ORDER);
+ if(is_array($params) && $this->language!='en')
+ {
+ // если у пользователя язык интерфейса не английский, то переводим
+ foreach($params as $p)
+ {
+ if(isset($p[2]) && $p[2]=='id')
+ {
+ if(is_numeric($p[3]))
+ {
+ $id=$p[3];
+ $dbres=$db->selectOne("select text from lang_en where id=?",[[$id,PDO::PARAM_INT]]);
+ if(!empty($dbres))
+ {
+ var_dump($dbres);exit;
+ }else{
+ echo 'no data';
+ }
+
+
+ }else{
+ }
+ }
+
+ if($p[0]=='update' && $id>0)
+ {
+ echo "\tupdate id: ",$id,"\n";
+ }
+
+
+ //echo "\tupdate: ",var_dump($update),"\n";
+ }
+
+ }else{
+
+ }
+ //print_r($params);
+ }else{
+
+
+/*
+delete FROM "lang_en";
+VACUUM;
+UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = 'lang_en'
+*/
+
+ $dbres=$db->selectOne("select id from lang_en where text=?",[[$text, PDO::PARAM_STR]]); //,[[$text, PDO::PARAM_STR]]);
+ if(isset($dbres['error']) && $dbres['error'])
+ {
+ echo 'error db: ',$dbres['info'];
+ exit;
+ }
+ if(is_numeric($dbres['id']))
+ {
+ // если фраза есть в базе, то вписываем её ID в тэг
+ $new_text=''.$text."";
+ $txt=str_replace($tag,$new_text,$txt);
+ $is_changed=true;
+ }else{
+ if($dbres===false)
+ {
+ // если фразы нет в базе, то добавляем её туда и вписываем новый ID в тэг
+ $dbres=$db->insert("insert into lang_en (text) values (?)",[[$text, PDO::PARAM_STR]]);
+
+ if($dbres['error'])
+ return array('error'=>true,'error_message'=>$dbres['info']);
+
+ $new_text=''.$text."";
+ $txt=str_replace($tag,$new_text,$txt);
+ $is_changed=true;
+ }
+ }
+ }
+ }
+
+ if($is_changed)
+ {
+ rename($path.$file_name,$path.'orig.'.$file_name);
+ file_put_contents($path.$file_name,$txt);
+ }
+ echo $txt;
+ exit;
+ }else{
+
+ }
+
+ /*
+ ]*)>(.*)
+ */
+ }
}
\ No newline at end of file
diff --git a/public/css/styles.css b/public/css/styles.css
index 50689876..d3b16ed0 100644
--- a/public/css/styles.css
+++ b/public/css/styles.css
@@ -920,6 +920,15 @@ dialog.fullscreen #vnc-iframe {
.window-box .mrow.installed small {
color:silver;
}
+
+form.loading {
+ pointer-events: none;
+}
+form.loading input,
+form.loading select {
+ color:#AAA;
+ background:#F5F5F5;
+}
form.win .field-name {
display:block;
text-transform:uppercase;
diff --git a/public/dialogs/bhyve-new.php b/public/dialogs/bhyve-new.php
index 69f64639..f1ed6b82 100644
--- a/public/dialogs/bhyve-new.php
+++ b/public/dialogs/bhyve-new.php
@@ -47,7 +47,6 @@ err_messages.add({
-
@@ -56,7 +55,6 @@ err_messages.add({
-
diff --git a/public/dialogs/bhyve-obtain.php b/public/dialogs/bhyve-obtain.php
index d08589cc..704a9f38 100644
--- a/public/dialogs/bhyve-obtain.php
+++ b/public/dialogs/bhyve-obtain.php
@@ -5,7 +5,7 @@
translate('VM OS profile');?>:
-
@@ -29,11 +29,20 @@
translate('VM RAM');?>:
-
+
+
+
+
+
+
translate('VM Image size');?>:
-
+
+
+
+
+
translate('IP address');?>:
diff --git a/public/index.php b/public/index.php
index 46d108ea..8a9aa367 100644
--- a/public/index.php
+++ b/public/index.php
@@ -140,7 +140,7 @@ echo $menu->html;
- translate('DONATE'); ?>
+ translate('DONATE'); ?>
translate('VERSION'),': ',file_get_contents($clonos->realpath.'version'); ?>
diff --git a/public/js/clonos.js b/public/js/clonos.js
index dac87609..aac81c13 100644
--- a/public/js/clonos.js
+++ b/public/js/clonos.js
@@ -226,6 +226,7 @@ var clonos={
}
if(id=='bhyve-obtain')
{
+ this.getObtainFormItems(); // Берём с сервера свободное имя виртуалки и min/max ram/cpus
if(typeof this.vm_packages_obtain_min_id!='undefined')
$('#bhyveObtSettings select[name="vm_packages"]').val(this.vm_packages_obtain_min_id).change();
}
@@ -869,6 +870,7 @@ var clonos={
},
updateBhyveISO:function()
{
+ this.formDisable($('form#bhyveSettings'));
this.loadData('updateBhyveISO',$.proxy(this.onUpdateBhyveISO,this));
},
onUpdateBhyveISO:function(data)
@@ -892,14 +894,15 @@ var clonos={
'min':fi.vm_ram.min,
'max':fi.vm_ram.max
}).val(fi.vm_ram.cur);
- $('#bhyveSettings input[name="vm_ram_show"]').val(fi.vm_ram.cur);
+ $('#bhyveSettings input[name="vm_ram_show"]').val(fi.vm_ram.cur+'g');
$('#bhyveSettings input[name="vm_imgsize"]').prop({
'min':fi.imgsize.min,
'max':fi.imgsize.max
}).val(fi.imgsize.cur);
- $('#bhyveSettings input[name="vm_imgsize_show"]').val(fi.imgsize.cur);
+ $('#bhyveSettings input[name="vm_imgsize_show"]').val(fi.imgsize.cur+'g');
}
+ this.formEnable($('form#bhyveSettings'));
},
getFreeJname:function()
{
@@ -991,6 +994,39 @@ var clonos={
this.wssReload();
this.dataReload();
},
+ getObtainFormItems:function()
+ {
+ this.formDisable($('form#bhyveObtSettings'));
+ this.loadData('getObtainFormItems',$.proxy(this.onGetObtainFormItems,this));
+ },
+ onGetObtainFormItems:function(data)
+ {
+ //#bhyveObtSettings
+ if(typeof data.form_items!='undefined')
+ {
+ var fi=data.form_items;
+ $('#bhyveObtSettings input[name="vm_name"]').val(fi.jname);
+
+ $('#bhyveObtSettings input[name="vm_cpus"]').prop({
+ 'min':fi.vm_cpus.min,
+ 'max':fi.vm_cpus.max
+ }).val(fi.vm_cpus.cur);
+ $('#bhyveObtSettings input[name="vm_cpus_show"]').val(fi.vm_cpus.cur);
+
+ $('#bhyveObtSettings input[name="vm_ram"]').prop({
+ 'min':fi.vm_ram.min,
+ 'max':fi.vm_ram.max
+ }).val(fi.vm_ram.cur);
+ $('#bhyveObtSettings input[name="vm_ram_show"]').val(fi.vm_ram.cur+'g');
+
+ $('#bhyveObtSettings input[name="vm_size"]').prop({
+ 'min':fi.imgsize.min,
+ 'max':fi.imgsize.max
+ }).val(fi.imgsize.cur);
+ $('#bhyveObtSettings input[name="vm_imgsize_show"]').val(fi.imgsize.cur+'g');
+ }
+ this.formEnable($('form#bhyveObtSettings'));
+ },
loadData:function(mode,return_func,arr,spinner)
{
@@ -2184,9 +2220,39 @@ var clonos={
},
onChangeOsProfile:function(obj,event)
{
- var a=event.target;
- var i=a.selectedIndex;
- debugger;
+ var frm=$(obj).closest('form');
+ this.formDisable(frm);
+ var val=$(obj).val();
+ var txt=$("option:selected",obj).text();
+
+ var obtain='';
+ if($(frm).attr('id')=='bhyveObtSettings') obtain='obtain';
+ var posts=[{'name':'vmOsProfile','value':txt},{'name':'obtain','value':obtain}];
+ this.loadData('vmOsInfo',$.proxy(this.onVmOsInfoLoad,this),posts);
+ },
+ onVmOsInfoLoad:function(data)
+ {
+ var fi=data.form_items;
+ if(fi.obtain=='obtain') return this.onGetObtainFormItems(data);
+ var obj=$('form#bhyveSettings');
+ $('input[name="vm_name"]',obj).val(fi.jname);
+
+ $('input[name="vm_cpus"]',obj)
+ .attr('min',fi.vm_cpus.min)
+ .attr('max',fi.vm_cpus.max)
+ .val(fi.vm_cpus.cur);
+ $('input[name="vm_cpus_show"]',obj).val(fi.vm_cpus.cur);
+ $('input[name="vm_ram"]',obj)
+ .attr('min',fi.vm_ram.min)
+ .attr('max',fi.vm_ram.max)
+ .val(parseInt(fi.vm_ram.cur));
+ $('input[name="vm_ram_show"]',obj).val(fi.vm_ram.cur+'g');
+ $('input[name="vm_imgsize"]',obj)
+ .attr('min',fi.imgsize.min)
+ .attr('max',fi.imgsize.max)
+ .val(parseInt(fi.imgsize.cur));
+ $('input[name="vm_imgsize_show"]',obj).val(fi.imgsize.cur+'g');
+ this.formEnable($('form#bhyveSettings'));
},
loginAction:function(event)
@@ -2503,6 +2569,15 @@ var clonos={
},
+ formEnable(form)
+ {
+ $(form).removeClass('loading');
+ },
+ formDisable(form)
+ {
+ $(form).addClass('loading');
+ },
+
userEdit:function(user_id,tblid)
{
var mode='userEditInfo';
diff --git a/public/novnc/utils/websockify/websockify/__pycache__/__init__.cpython-311.pyc b/public/novnc/utils/websockify/websockify/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..70205440d48a269eccc44cbe47af096fe67277e6
GIT binary patch
literal 275
zcmZ3^%ge<81U+jOr+EYE#~=<2FhLog#ej_I3@HpLj5!P;5SkH4GX*nfGQR{V(qz2F
zsO6{0bW5Z>HK{m1IXg40QV+^ZEx9F$O|+mWzoK#_!)K8GUtap9#YOr#`N@en`sL;2
z`pG%@dHKcq1*J(jnaTQj`DJ;@`lThAImP-2qmY^L@tJv4
zBO~Jt2Ehw3^njVWqv{f~1Y41Hi`V37hUDdGg0
F0RYpCV*UUC
literal 0
HcmV?d00001
diff --git a/public/novnc/utils/websockify/websockify/__pycache__/auth_plugins.cpython-311.pyc b/public/novnc/utils/websockify/websockify/__pycache__/auth_plugins.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c6b89b31d29ce142935792d12d676aa2df0febaa
GIT binary patch
literal 6514
zcmcgwOKcm*8Qv!!BB=*y>t$J5%d#BC4<)u7%W;y{mS1X8<{>3cR3uw!cO@~VNOhKq
zY=SP-z(twDXw?*j(xyQPv~Xou2OWCwp@$~D^hgQ>L@Z#yK+%J56r_XUQ~!UKT<(%G
zVE52j?$4e1XaD(U_WK_*e+>kh7$~>b{yhDypJD!um1+?y58HR(VTIwC%Z$q0VpR4H
z$1wNcHp`^R;ef+y>>VC>a94O7eMNqad
zKhA^$N_A-buj;tn1C&%8Br>$1lc9K0
ziN=Q(7Z-<=cruaHhvpZi;xT0?k^C&73@xN$aeZh}o6?iYwb=9x`(tz=H7n0k-Sp%0
zHw=#~#}cuWET=;?t&dk5aZo(~WQi%YcV&g!zARkZsIMX*trQmi>BL;{umaz9oFVwl
z?=p7<;(-UlJ*!1kjp&9i6(uuTN}f&XDXTJ{Bq<#QN>B*m$nc}4S|SxwqA4xiVN=e|
zz(I635Kz$L&k6*PR~cHwxh0}=nk*YlvOJem7vlKrm*t-ukR*vb`YmXwRILof;xqjs%kc0!c7@4scCcl5sNu|L
z$p}!hfSO^KxQuX$5q
zu)9~5m3UOwWm!j1BCw<-3N0!=-LuO&TDV69=syJV7;v@c007@x>NpI4{!*w9{yYzT
z!R+@+?fu!y|M3LAaNl-sdO9~eow*Bt8Oy=7y12TS?>b%Zj1)a1`Rb1%;jT#bf?(2)
zqyq^;&wssMS(Od8qH+i}mCtZMg>S?)(dp7FuyaMy%@su@Q`7WeXI;8N-PEhn
z#q0B$lG0Qunb4%F^WwaF`Fp2=uKLCOl?E`QYJw2uU2l2n#0m@QWINue1
zICwlao10yC;Z^3@y(49j@pf%7y!XrwlCqPSus8(r$zdGH2E{NoB0(VQBS36WEOTxI
z;Ik2P5EP}rZ50c9C!om|Y%$P!z$1b$R0RmQqACJ)sSx-l-Kra?N9DjvdW`_Yi3iAr*-;H-!wFvup??
zSw-cXPWYyn5tmuw%80q@N?U#LL9KJz`koAv+tu=%*2#iz$_P&h4kDyV%+ERWGiIsN
z$(0y5$fVHmR>}alM;3z0vyJ=_lMoh}>-ZYS&=&zLjebkIQ
zhhDCssIK~?^rk0;8AqjLJWicd&o#Q%c1GKYIr|S
z|FAdm2n8Dfv?FkO>1Ya4k+jP+u1C1^>87#qw~vjCoH}#t5H+{tkDz&c`_sbNn&`XUKv(38tT0hH|8}OQw&$7DfoUOhP(^3
zhshK5`FJd4@Nq3+G}CAVnWL-_O@*ve)#joJRmK6rUYc3Zw1c#PN+gKnED*y-H84Gc
z5kOBMqZg1#bkS(5RinC`(ypfruhpcZwS)IIi)rfkk<;ByQ%CvLtacFi`aG-*Ca-(5
z0lZ4>`&X`gc`Y|oXg^VGKaus7eC=CIhqtd3>fH>5H$vgn7Yd=1#n4H}H3R*n);%jN
zU$zul4-{Ju^z+vd(aYGKJ-Z~rvcw$aj`Z)updl8v;5Y|C>CIMY
zqg5)j_7_|G^VJ`!eUSDjdze7mroU&y-&64S7X7{X>QBey>Rb2zbBCC35A~jR@!yFo
z(x$!VCFVP+ca-J-$*@2jISg7Q-rFw%frJ_}4i+OT2b~Jwr@eQ1c6m1E$$9d=
z@an|cha0|AdEcp0sAGBfVW@NYlo>_r@xhu;Kgd~OQZ}B-uGPhi&)F~^A>Ggua?=Cm
zANq2rq1U77K}GR5pq}n@Dqb_}E7%(?V~Kgtd|;i=HxCz@hl|a_dCzd8j#i|50p6(B
zQRP%V#;ys@Tn{uABeCDWY|^b)uU6b6Pg9@+NjiEi3aX4PVM%naZD30FW&jyTu^gp%l>R)mSt4!3lyxa&8F>
zw=AnkMV4vWXl_pt4g{B$pd$6V)t9jii3GQv1hQmZCE;>jxLg)ku>(eS5LdU@S7t0S
zB8XjO#v*=JJcVymh>H_7w#@8K&Do#^3fxwqwg9zfIX3Z|Ik%aZKPBgifGjkgu>=s`x2?4GjiwQFZ(Y>1TYLqNa;ea+dkrS6{Wh1+jt
z;dC0Lw{QqlA
z>_~e&&`XeS$B2hy>5z9NQhsNPY~Q=P?qy0f2F|+Kofy*6Ox76@w5WMi7=>
z9(`-ax@O8zyTv0u|rF!~k7K@YiR5c{bm1
zWObt8J5ltVxIggsBYEFN_&o?7S|7~^M+(7_VsIqy9|7R|FR{R>As^1loB@Q4qh7cH
z*!67lV`L!t5#0LgKx#%&5@zzkOj&SR1vL^shdcX5Vk(02B4IZ@Gc~*yuPfR-?h5Fc
z6+JDW@rl|Z9lOp_pLkv~k7(Z@Qy>YQn!Xn(gin?&b0Q1ps*Pj|+jeSj{#ce+K}ckJ9x*d`Wz$nJEDw(r=voj%m1k!)ex
K&MpkP;{OF~XK8o<
literal 0
HcmV?d00001
diff --git a/public/novnc/utils/websockify/websockify/__pycache__/websocket.cpython-311.pyc b/public/novnc/utils/websockify/websockify/__pycache__/websocket.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..db0ca2521fd2b82cf733f368d289992cce7da75d
GIT binary patch
literal 35367
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
literal 0
HcmV?d00001
diff --git a/public/novnc/utils/websockify/websockify/__pycache__/websocketproxy.cpython-311.pyc b/public/novnc/utils/websockify/websockify/__pycache__/websocketproxy.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2a25b6c4ba4096900da1eb432fd33b3e5ab6cb13
GIT binary patch
literal 39428
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
P(r-u{9F+)TIQoAB657~S
literal 0
HcmV?d00001
diff --git a/public/novnc/utils/websockify/websockify/__pycache__/websocketserver.cpython-311.pyc b/public/novnc/utils/websockify/websockify/__pycache__/websocketserver.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..015b9deea447f9f4150d2a6a9cb1fb5eaa9e70ea
GIT binary patch
literal 6039
zcmcgw&2JmW6`$qjl3MvwmSxo+tJsc3*&^%42$VEU{Sn1>Z7Z%NG!0vHL2*aYI?G*U
zW@%Z11LzQ-N+2LEn!*8^gNn9pjO5@$552a30VxoWuzpIps#fJ_tGWz1a_PNhNSE
z9qvBv&YOAj=FM;3d$a%O?adM>t6%?hW}=snZ}253DgWWwLwI;VbW$X`q{mFDD8YZ+
zj8)>rcqLIxNLZgRla*94RY@1q6}c!&Bt|Y1J^2yQQ#AE3PRLhqd!?8WyfpCShcV#5
z?Q^n%lL1baW@-Fk0=RJd+#bR00j@$59WoU?Hc4{5OMlGXTy*AaOMRD4Puk`8siShr
z?og&qmpIK{vga3>F+1m|Kl$<5v+6HwYN|I%%rUGe>(x=z8j{S3xp2V7OP*VNR*4+htz3e)ZD$#N>D$8;rh^%YKXcPvl~5|3%Q@
z%GA`&Tl9k}<<6CorJIzwS*)8BYUbi@CRE++4$6wk_4lxZl)%!FVoaBc@f9)yi}{gUOz3Gn@sU(a;$jt3dJ1TIh1`{jG8j~L
zd#^aod^p_F&o7xJ&Q-@&XU!^A7w9zitPE38=b)*|yt%0}RjcfPX-cNyEJBA_>daAA
z4zxlQ@fl(9>{mekBt0OG1P^{e*nJhekhL~WSV^L7Byvx>N3?JRolKHP(gc_^$*c2V
zXIaw>%WyQ!-R*0s&3Q`zZ4#WCGi(^oMuP<0HG7krZ#GmASsQpZDM9$*L?jx6;@%$pAs+zUK@3dr^{
zc_R0IoL)_D$OG&0KwTbe$b&U`aO+rpCDD)%*TnS_8}RUe+#|Q)
z-zz&C6O0#&?nl_!U_#ady>cG$d4g3WX{d8Y)(kIr!b=Xhv`IeIb=`s;Oghq<)%KsG-Dq_tW&m%2RCkVk64CFbD)
zCxhG0Dpe?KyR4>FY`tpYv!ZDqR7B_WJv=OifeMK<7QE
z1nPX=!&nBJB0)6rc_7=%prH5LOkAxct~O)wWT8oRAXzE-dXq#+N=m+lbv}XD)A;)R
z#G5dxP=-4!fiHT7tJmp+X`+}6{cuW;qvr)*Op3Db#Tns+v*3kO?%~h_M?=RAg$(Y1#1hjX
zdTW=*r=XS4d^%{Uf|jafvr5Sf=E(DbC83dsh=zq?%2f5T4lhiWOBPI0wINGjhOSc!
zBs+7cyx+^Qg$7kl#URLNSr<%aQ4vG)qE)%wFC+j^!oB|!9x!&cJ9vnKVOyvVPzY_b
z5Skg{q{EkvNVs*m4wz_q}V21$dD
zSSHCZUa%HbUY#BlD+k!GRJkKi
z0V@MzdF=plD)@Uy^kDgg{ZWosI>3(@Ai%S?JjkBNCEb(}T2OIroRuZc{;2JY$o+x`izPx&QLwR{!dAY6(HW>V*vXcV^dxgYgJV5uyU7DFDNZfpiVqcNJZF2ok;uA;sQq
z2lk8gc@bFavG>JxVg2{WTCz(GsOa1V7+|4os9AfTo!aK&6K>jfRBk48PPr5thOP{=
zJ~!>hXEzRMvzs*S1xR0a`HSoKWf+CqBXld3>$J81^b0f(!^|zPA;jr_>gBd_UCT
zg#)(;se=fh=#wqAy&w2azbl5>&pZZSn(JRqq>V^o^`!nz3YN|E6-l_W@I1{PxRpU%ydT#v004OiAWAIy(R}K{7!0tIOA#2_<=^Np>KI<>X+Kgrx64
zQf-ouX7XO1jyTi5hz7|ffOCW%qM}pr*yfkqfpO94G?ihQsH8!@$
z^?D17$5Xclzu)D(4^%7;H7tSEeLh&=i&j3w4ND>)_ZY)y=ON=HK8cy5><+cQli%>p
z{%^7?z(vFJUZBmmBuULwQc5%ll3hgVSDnT{seS*|Oze{2oZe0DUww+T
z&s(gQ#w7`0von1v>YulBZ^dF#rb)U9N6$Tt1Lt{*Elb$Co7}(s6lL;wH)
literal 0
HcmV?d00001
diff --git a/public/novnc/utils/websockify/websockify/__pycache__/websockifyserver.cpython-311.pyc b/public/novnc/utils/websockify/websockify/__pycache__/websockifyserver.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..706c25715af987a2af961882273ec2b086d9d17d
GIT binary patch
literal 43408
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