From 734726fc1230dc272abd818b018d011dd87d0038 Mon Sep 17 00:00:00 2001 From: Manan006 Date: Wed, 31 Jan 2024 17:57:16 +0530 Subject: [PATCH] Initial Commit --- .eslintignore | 1 + .eslintrc | 50 + .github/ISSUE_TEMPLATE/bug_report.md | 34 + .github/ISSUE_TEMPLATE/config.yml | 5 + .github/ISSUE_TEMPLATE/feature_request.md | 17 + .github/workflows/deploy.yml | 56 + .github/workflows/lint.yml | 19 + .github/workflows/test.yml | 28 + .gitignore | 12 + .gitmodules | 0 AUTHORS | 13 + LICENSE.txt | 62 + README.md | 59 + app/error-handler.js | 72 + app/images/alt.svg | 92 + app/images/clipboard.svg | 106 + app/images/connect.svg | 96 + app/images/ctrl.svg | 96 + app/images/ctrlaltdel.svg | 100 + app/images/disconnect.svg | 94 + app/images/download.gif | Bin 0 -> 123 bytes app/images/drag.svg | 76 + app/images/error.svg | 81 + app/images/esc.svg | 92 + app/images/expander.svg | 69 + app/images/fullscreen.svg | 93 + app/images/gamepad.png | Bin 0 -> 2098 bytes app/images/handle.svg | 82 + app/images/handle_bg.svg | 172 + .../icons/368_kasm_logo_only_120x120.png | Bin 0 -> 2421 bytes .../icons/368_kasm_logo_only_144x144.png | Bin 0 -> 2877 bytes .../icons/368_kasm_logo_only_152x152.png | Bin 0 -> 3009 bytes app/images/icons/368_kasm_logo_only_16x16.png | Bin 0 -> 393 bytes .../icons/368_kasm_logo_only_192x192.png | Bin 0 -> 3853 bytes app/images/icons/368_kasm_logo_only_24x24.png | Bin 0 -> 532 bytes app/images/icons/368_kasm_logo_only_32x32.png | Bin 0 -> 694 bytes app/images/icons/368_kasm_logo_only_48x48.png | Bin 0 -> 986 bytes app/images/icons/368_kasm_logo_only_60x60.png | Bin 0 -> 1195 bytes app/images/icons/368_kasm_logo_only_64x64.png | Bin 0 -> 1302 bytes app/images/icons/368_kasm_logo_only_72x72.png | Bin 0 -> 1443 bytes app/images/icons/368_kasm_logo_only_76x76.png | Bin 0 -> 1572 bytes app/images/icons/368_kasm_logo_only_96x96.png | Bin 0 -> 1903 bytes app/images/icons/Makefile | 42 + app/images/icons/kasm_logo.svg | 22 + app/images/icons/novnc-120x120.png | Bin 0 -> 2421 bytes app/images/icons/novnc-144x144.png | Bin 0 -> 2877 bytes app/images/icons/novnc-152x152.png | Bin 0 -> 3009 bytes app/images/icons/novnc-16x16.png | Bin 0 -> 393 bytes app/images/icons/novnc-192x192.png | Bin 0 -> 3853 bytes app/images/icons/novnc-24x24.png | Bin 0 -> 532 bytes app/images/icons/novnc-32x32.png | Bin 0 -> 694 bytes app/images/icons/novnc-48x48.png | Bin 0 -> 986 bytes app/images/icons/novnc-60x60.png | Bin 0 -> 1195 bytes app/images/icons/novnc-64x64.png | Bin 0 -> 1302 bytes app/images/icons/novnc-72x72.png | Bin 0 -> 1443 bytes app/images/icons/novnc-76x76.png | Bin 0 -> 1572 bytes app/images/icons/novnc-96x96.png | Bin 0 -> 1903 bytes app/images/icons/novnc-icon-sm.svg | 14 + app/images/icons/novnc-icon.svg | 14 + app/images/info.svg | 81 + app/images/keyboard.svg | 88 + app/images/pointer.svg | 78 + app/images/power.svg | 87 + app/images/refresh.gif | Bin 0 -> 137 bytes app/images/settings.svg | 76 + app/images/splash.jpg | Bin 0 -> 95489 bytes app/images/tab.svg | 86 + app/images/toggleextrakeys.svg | 90 + app/images/warning.svg | 81 + app/images/windows.svg | 65 + app/locale/README | 1 + app/locale/af.json | 120 + app/locale/af_ZA.json | 120 + app/locale/am.json | 120 + app/locale/am_ET.json | 120 + app/locale/ar.json | 120 + app/locale/ar_AE.json | 120 + app/locale/ar_BH.json | 120 + app/locale/ar_DZ.json | 120 + app/locale/ar_EG.json | 120 + app/locale/ar_IN.json | 120 + app/locale/ar_IQ.json | 120 + app/locale/ar_JO.json | 120 + app/locale/ar_KW.json | 120 + app/locale/ar_LB.json | 120 + app/locale/ar_LY.json | 120 + app/locale/ar_MA.json | 120 + app/locale/ar_OM.json | 120 + app/locale/ar_QA.json | 120 + app/locale/ar_SA.json | 120 + app/locale/ar_SD.json | 120 + app/locale/ar_SY.json | 120 + app/locale/ar_TN.json | 120 + app/locale/ar_YE.json | 120 + app/locale/az.json | 120 + app/locale/az_AZ.json | 120 + app/locale/be.json | 120 + app/locale/be_BY.json | 120 + app/locale/bg.json | 120 + app/locale/bg_BG.json | 120 + app/locale/bn.json | 120 + app/locale/bn_BD.json | 120 + app/locale/bn_IN.json | 120 + app/locale/bs.json | 120 + app/locale/bs_BA.json | 120 + app/locale/ca.json | 120 + app/locale/ca_AD.json | 120 + app/locale/ca_ES.json | 120 + app/locale/ca_FR.json | 120 + app/locale/ca_IT.json | 120 + app/locale/cs.json | 128 + app/locale/cs_CZ.json | 128 + app/locale/cy.json | 120 + app/locale/cy_GB.json | 120 + app/locale/da.json | 120 + app/locale/da_DK.json | 120 + app/locale/de.json | 128 + app/locale/de_AT.json | 128 + app/locale/de_BE.json | 128 + app/locale/de_CH.json | 128 + app/locale/de_DE.json | 120 + app/locale/de_LU.json | 120 + app/locale/es.json | 131 + app/locale/es_AR.json | 131 + app/locale/es_BO.json | 131 + app/locale/es_CL.json | 131 + app/locale/es_CO.json | 131 + app/locale/es_CR.json | 131 + app/locale/es_CU.json | 131 + app/locale/es_DO.json | 131 + app/locale/es_EC.json | 131 + app/locale/es_ES.json | 131 + app/locale/es_GT.json | 131 + app/locale/es_HN.json | 131 + app/locale/es_MX.json | 131 + app/locale/es_NI.json | 131 + app/locale/es_PA.json | 131 + app/locale/es_PE.json | 131 + app/locale/es_PR.json | 131 + app/locale/es_PY.json | 131 + app/locale/es_SV.json | 131 + app/locale/es_US.json | 131 + app/locale/es_UY.json | 131 + app/locale/es_VE.json | 131 + app/locale/et.json | 120 + app/locale/et_EE.json | 120 + app/locale/eu.json | 120 + app/locale/eu_ES.json | 120 + app/locale/fa.json | 120 + app/locale/fa_IR.json | 120 + app/locale/fi.json | 120 + app/locale/fi_FI.json | 120 + app/locale/fr.json | 120 + app/locale/fr_BE.json | 120 + app/locale/fr_CA.json | 120 + app/locale/fr_CH.json | 120 + app/locale/fr_FR.json | 120 + app/locale/fr_LU.json | 120 + app/locale/fy.json | 120 + app/locale/fy_DE.json | 120 + app/locale/fy_NL.json | 120 + app/locale/ga.json | 120 + app/locale/ga_IE.json | 120 + app/locale/gd.json | 120 + app/locale/gd_GB.json | 120 + app/locale/gl.json | 120 + app/locale/gl_ES.json | 120 + app/locale/gu.json | 120 + app/locale/gu_IN.json | 120 + app/locale/ha.json | 120 + app/locale/ha_NG.json | 120 + app/locale/he.json | 120 + app/locale/he_IL.json | 120 + app/locale/hi.json | 120 + app/locale/hi_IN.json | 120 + app/locale/hr.json | 120 + app/locale/hr_HR.json | 120 + app/locale/ht.json | 120 + app/locale/ht_HT.json | 120 + app/locale/hu.json | 120 + app/locale/hu_HU.json | 120 + app/locale/hy.json | 120 + app/locale/hy_AM.json | 120 + app/locale/id.json | 120 + app/locale/id_ID.json | 120 + app/locale/ig.json | 120 + app/locale/ig_NG.json | 120 + app/locale/is.json | 120 + app/locale/is_IS.json | 120 + app/locale/it.json | 120 + app/locale/it_CH.json | 120 + app/locale/it_IT.json | 120 + app/locale/ja.json | 120 + app/locale/ja_JP.json | 120 + app/locale/ka.json | 120 + app/locale/ka_GE.json | 120 + app/locale/kk.json | 120 + app/locale/kk_KZ.json | 120 + app/locale/km.json | 120 + app/locale/km_KH.json | 120 + app/locale/kn.json | 120 + app/locale/kn_IN.json | 120 + app/locale/ko.json | 128 + app/locale/ko_KR.json | 128 + app/locale/ku.json | 120 + app/locale/ku_TR.json | 120 + app/locale/ky.json | 120 + app/locale/ky_KG.json | 120 + app/locale/lb.json | 120 + app/locale/lb_LU.json | 120 + app/locale/lo.json | 120 + app/locale/lo_LA.json | 120 + app/locale/lt.json | 120 + app/locale/lt_LT.json | 120 + app/locale/lv.json | 120 + app/locale/lv_LV.json | 120 + app/locale/mg.json | 120 + app/locale/mg_MG.json | 120 + app/locale/mi.json | 120 + app/locale/mi_NZ.json | 120 + app/locale/mk.json | 120 + app/locale/mk_MK.json | 120 + app/locale/ml.json | 120 + app/locale/ml_IN.json | 120 + app/locale/mn.json | 120 + app/locale/mn_MN.json | 120 + app/locale/mr.json | 120 + app/locale/mr_IN.json | 120 + app/locale/ms.json | 120 + app/locale/ms_MY.json | 120 + app/locale/mt.json | 120 + app/locale/mt_MT.json | 120 + app/locale/my.json | 120 + app/locale/my_MM.json | 120 + app/locale/ne.json | 120 + app/locale/ne_NP.json | 120 + app/locale/nl.json | 128 + app/locale/nl_AW.json | 128 + app/locale/nl_BE.json | 128 + app/locale/nl_NL.json | 128 + app/locale/pa.json | 120 + app/locale/pa_IN.json | 120 + app/locale/pa_PK.json | 120 + app/locale/pl.json | 128 + app/locale/pl_PL.json | 128 + app/locale/ps.json | 120 + app/locale/ps_AF.json | 120 + app/locale/pt.json | 120 + app/locale/pt_BR.json | 120 + app/locale/pt_PT.json | 120 + app/locale/ro.json | 120 + app/locale/ro_RO.json | 120 + app/locale/ru.json | 128 + app/locale/ru_RU.json | 128 + app/locale/ru_UA.json | 128 + app/locale/sd.json | 120 + app/locale/sd_IN.json | 120 + app/locale/si.json | 120 + app/locale/si_LK.json | 120 + app/locale/sk.json | 120 + app/locale/sk_SK.json | 120 + app/locale/sl.json | 120 + app/locale/sl_SI.json | 120 + app/locale/so.json | 120 + app/locale/so_DJ.json | 120 + app/locale/so_ET.json | 120 + app/locale/so_KE.json | 120 + app/locale/so_SO.json | 120 + app/locale/sq.json | 120 + app/locale/sq_AL.json | 120 + app/locale/sq_MK.json | 120 + app/locale/st.json | 120 + app/locale/st_ZA.json | 120 + app/locale/sv.json | 120 + app/locale/sv_FI.json | 120 + app/locale/sv_SE.json | 120 + app/locale/sw.json | 120 + app/locale/sw_KE.json | 120 + app/locale/ta.json | 120 + app/locale/ta_IN.json | 120 + app/locale/ta_LK.json | 120 + app/locale/te.json | 120 + app/locale/te_IN.json | 120 + app/locale/tg.json | 120 + app/locale/tg_TJ.json | 120 + app/locale/th.json | 120 + app/locale/th_TH.json | 120 + app/locale/tl.json | 120 + app/locale/tl_PH.json | 120 + app/locale/tr.json | 128 + app/locale/tr_CY.json | 128 + app/locale/tr_TR.json | 128 + app/locale/tt.json | 120 + app/locale/tt_RU.json | 120 + app/locale/uk.json | 120 + app/locale/uk_UA.json | 120 + app/locale/ur.json | 120 + app/locale/ur_IN.json | 120 + app/locale/ur_PK.json | 120 + app/locale/uz.json | 120 + app/locale/uz_UZ.json | 120 + app/locale/vi.json | 120 + app/locale/vi_VN.json | 120 + app/locale/xh.json | 120 + app/locale/xh_ZA.json | 120 + app/locale/yi.json | 120 + app/locale/yi_US.json | 120 + app/locale/yo.json | 120 + app/locale/yo_NG.json | 120 + app/locale/zh_CN.json | 127 + app/locale/zh_TW.json | 127 + app/locale/zu.json | 120 + app/locale/zu_ZA.json | 120 + app/localization.js | 172 + app/sounds/CREDITS | 4 + app/sounds/bell.mp3 | Bin 0 -> 4531 bytes app/sounds/bell.oga | Bin 0 -> 8495 bytes app/styles/Orbitron700.ttf | Bin 0 -> 38580 bytes app/styles/Orbitron700.woff | Bin 0 -> 17472 bytes app/styles/base.css | 1193 + app/styles/bootstrap.min.css | 6 + app/ui.js | 2549 ++ app/webutil.js | 187 + core/base64.js | 100 + core/decoders/copyrect.js | 28 + core/decoders/hextile.js | 191 + core/decoders/qoi/decoder.js | 345 + core/decoders/qoi/qoi_viewer_bg.wasm | Bin 0 -> 37493 bytes core/decoders/raw.js | 66 + core/decoders/rre.js | 44 + core/decoders/tight.js | 540 + core/decoders/tightpng.js | 27 + core/decoders/udp.js | 283 + core/deflator.js | 85 + core/des.js | 266 + core/display.js | 697 + core/encodings.js | 73 + core/inflator.js | 66 + core/input/domkeytable.js | 311 + core/input/fixedkeys.js | 129 + core/input/gesturehandler.js | 567 + core/input/imekeys.js | 32 + core/input/keyboard.js | 533 + core/input/keysym.js | 616 + core/input/keysymdef.js | 688 + core/input/util.js | 191 + core/input/vkeys.js | 116 + core/input/xtscancodes.js | 173 + core/mousebuttonmapper.js | 67 + core/output/printer.js | 63 + core/rfb.js | 4333 +++ core/util/browser.js | 161 + core/util/cursor.js | 264 + core/util/element.js | 32 + core/util/events.js | 138 + core/util/eventtarget.js | 35 + core/util/int.js | 60 + core/util/logging.js | 56 + core/util/strings.js | 28 + core/websock.js | 351 + docs/API-internal.md | 89 + docs/API.md | 423 + docs/DEVELOP.md | 30 + docs/EMBEDDING.md | 105 + docs/LIBRARY.md | 31 + docs/LICENSE.BSD-2-Clause | 22 + docs/LICENSE.BSD-3-Clause | 24 + docs/LICENSE.MPL-2.0 | 373 + docs/LICENSE.OFL-1.1 | 91 + docs/flash_policy.txt | 4 + docs/links | 76 + docs/notes | 5 + docs/rfb_notes | 147 + docs/rfbproto-3.3.pdf | Bin 0 -> 110778 bytes docs/rfbproto-3.7.pdf | Bin 0 -> 165552 bytes docs/rfbproto-3.8.pdf | Bin 0 -> 143840 bytes karma.conf.js | 85 + package-lock.json | 29765 ++++++++++++++++ package.json | 97 + po/.eslintrc | 5 + po/Makefile | 35 + po/README.md | 26 + po/af.po | 354 + po/af_ZA.po | 354 + po/am.po | 354 + po/am_ET.po | 354 + po/ar.po | 354 + po/ar_AE.po | 354 + po/ar_BH.po | 354 + po/ar_DZ.po | 354 + po/ar_EG.po | 354 + po/ar_IN.po | 354 + po/ar_IQ.po | 354 + po/ar_JO.po | 354 + po/ar_KW.po | 354 + po/ar_LB.po | 354 + po/ar_LY.po | 354 + po/ar_MA.po | 354 + po/ar_OM.po | 354 + po/ar_QA.po | 354 + po/ar_SA.po | 354 + po/ar_SD.po | 354 + po/ar_SY.po | 354 + po/ar_TN.po | 354 + po/ar_YE.po | 354 + po/az.po | 354 + po/az_AZ.po | 354 + po/be.po | 354 + po/be_BY.po | 354 + po/bg.po | 354 + po/bg_BG.po | 354 + po/bn.po | 354 + po/bn_BD.po | 354 + po/bn_IN.po | 354 + po/bs.po | 354 + po/bs_BA.po | 354 + po/ca.po | 354 + po/ca_AD.po | 354 + po/ca_ES.po | 354 + po/ca_FR.po | 354 + po/ca_IT.po | 354 + po/cs.po | 465 + po/cs_CZ.po | 465 + po/cy.po | 354 + po/cy_GB.po | 354 + po/da.po | 354 + po/da_DK.po | 354 + po/de.po | 480 + po/de_AT.po | 480 + po/de_BE.po | 480 + po/de_CH.po | 480 + po/de_DE.po | 354 + po/de_LU.po | 354 + po/el.po | 320 + po/es.po | 472 + po/es_AR.po | 472 + po/es_BO.po | 472 + po/es_CL.po | 472 + po/es_CO.po | 472 + po/es_CR.po | 472 + po/es_CU.po | 472 + po/es_DO.po | 472 + po/es_EC.po | 472 + po/es_ES.po | 472 + po/es_GT.po | 472 + po/es_HN.po | 472 + po/es_MX.po | 472 + po/es_NI.po | 472 + po/es_PA.po | 472 + po/es_PE.po | 472 + po/es_PR.po | 472 + po/es_PY.po | 472 + po/es_SV.po | 472 + po/es_US.po | 472 + po/es_UY.po | 472 + po/es_VE.po | 472 + po/et.po | 354 + po/et_EE.po | 354 + po/eu.po | 354 + po/eu_ES.po | 354 + po/fa.po | 354 + po/fa_IR.po | 354 + po/fi.po | 354 + po/fi_FI.po | 354 + po/fr.po | 354 + po/fr_BE.po | 354 + po/fr_CA.po | 354 + po/fr_CH.po | 354 + po/fr_FR.po | 354 + po/fr_LU.po | 354 + po/fy.po | 354 + po/fy_DE.po | 354 + po/fy_NL.po | 354 + po/ga.po | 354 + po/ga_IE.po | 354 + po/gd.po | 354 + po/gd_GB.po | 354 + po/gl.po | 354 + po/gl_ES.po | 354 + po/gu.po | 354 + po/gu_IN.po | 354 + po/ha.po | 354 + po/ha_NG.po | 354 + po/he.po | 354 + po/he_IL.po | 354 + po/hi.po | 354 + po/hi_IN.po | 354 + po/hr.po | 354 + po/hr_HR.po | 354 + po/ht.po | 354 + po/ht_HT.po | 354 + po/hu.po | 354 + po/hu_HU.po | 354 + po/hy.po | 354 + po/hy_AM.po | 354 + po/id.po | 354 + po/id_ID.po | 354 + po/ig.po | 354 + po/ig_NG.po | 354 + po/is.po | 354 + po/is_IS.po | 354 + po/it.po | 354 + po/it_CH.po | 354 + po/it_IT.po | 354 + po/ja.po | 468 + po/ja_JP.po | 468 + po/ka.po | 354 + po/ka_GE.po | 354 + po/kk.po | 354 + po/kk_KZ.po | 354 + po/km.po | 354 + po/km_KH.po | 354 + po/kn.po | 354 + po/kn_IN.po | 354 + po/ko.po | 464 + po/ko_KR.po | 464 + po/ku.po | 354 + po/ku_TR.po | 354 + po/ky.po | 354 + po/ky_KG.po | 354 + po/lb.po | 354 + po/lb_LU.po | 354 + po/lo.po | 354 + po/lo_LA.po | 354 + po/lt.po | 354 + po/lt_LT.po | 354 + po/lv.po | 354 + po/lv_LV.po | 354 + po/mg.po | 354 + po/mg_MG.po | 354 + po/mi.po | 354 + po/mi_NZ.po | 354 + po/mk.po | 354 + po/mk_MK.po | 354 + po/ml.po | 354 + po/ml_IN.po | 354 + po/mn.po | 354 + po/mn_MN.po | 354 + po/mr.po | 354 + po/mr_IN.po | 354 + po/ms.po | 354 + po/ms_MY.po | 354 + po/mt.po | 354 + po/mt_MT.po | 354 + po/my.po | 354 + po/my_MM.po | 354 + po/ne.po | 354 + po/ne_NP.po | 354 + po/nl.po | 487 + po/nl_AW.po | 487 + po/nl_BE.po | 487 + po/nl_NL.po | 487 + po/noVNC.pot | 442 + po/pa.po | 354 + po/pa_IN.po | 354 + po/pa_PK.po | 354 + po/pl.po | 502 + po/pl_PL.po | 502 + po/po2js | 43 + po/ps.po | 354 + po/ps_AF.po | 354 + po/pt.po | 443 + po/pt_BR.po | 443 + po/pt_PT.po | 443 + po/ro.po | 354 + po/ro_RO.po | 354 + po/ru.po | 471 + po/ru_RU.po | 471 + po/ru_UA.po | 471 + po/sd.po | 354 + po/sd_IN.po | 354 + po/si.po | 354 + po/si_LK.po | 354 + po/sk.po | 354 + po/sk_SK.po | 354 + po/sl.po | 354 + po/sl_SI.po | 354 + po/so.po | 354 + po/so_DJ.po | 354 + po/so_ET.po | 354 + po/so_KE.po | 354 + po/so_SO.po | 354 + po/sq.po | 354 + po/sq_AL.po | 354 + po/sq_MK.po | 354 + po/st.po | 354 + po/st_ZA.po | 354 + po/sv.po | 443 + po/sv_FI.po | 443 + po/sv_SE.po | 443 + po/sw.po | 354 + po/sw_KE.po | 354 + po/ta.po | 354 + po/ta_IN.po | 354 + po/ta_LK.po | 354 + po/te.po | 354 + po/te_IN.po | 354 + po/tg.po | 354 + po/tg_TJ.po | 354 + po/th.po | 354 + po/th_TH.po | 354 + po/tl.po | 354 + po/tl_PH.po | 354 + po/tr.po | 465 + po/tr_CY.po | 465 + po/tr_TR.po | 465 + po/tt.po | 354 + po/tt_RU.po | 354 + po/uk.po | 354 + po/uk_UA.po | 354 + po/update_trans.sh | 299 + po/ur.po | 354 + po/ur_IN.po | 354 + po/ur_PK.po | 354 + po/uz.po | 354 + po/uz_UZ.po | 354 + po/vi.po | 354 + po/vi_VN.po | 354 + po/xgettext-html | 115 + po/xh.po | 354 + po/xh_ZA.po | 354 + po/yi.po | 354 + po/yi_US.po | 354 + po/yo.po | 354 + po/yo_NG.po | 354 + po/zh_CN.po | 458 + po/zh_TW.po | 459 + po/zu.po | 354 + po/zu_ZA.po | 354 + snap/hooks/configure | 3 + snap/local/svc_wrapper.sh | 29 + snap/snapcraft.yaml | 55 + tests/.eslintrc | 15 + tests/README.md | 49 + tests/assertions.js | 102 + tests/fake.websocket.js | 88 + tests/playback-ui.js | 215 + tests/playback.js | 178 + tests/test.base64.js | 33 + tests/test.copyrect.js | 83 + tests/test.deflator.js | 82 + tests/test.display.js | 399 + tests/test.gesturehandler.js | 1026 + tests/test.helper.js | 223 + tests/test.hextile.js | 232 + tests/test.inflator.js | 113 + tests/test.int.js | 16 + tests/test.jpeg.js | 288 + tests/test.keyboard.js | 521 + tests/test.localization.js | 69 + tests/test.ra2.js | 357 + tests/test.raw.js | 129 + tests/test.rfb.js | 4224 +++ tests/test.rre.js | 107 + tests/test.tight.js | 394 + tests/test.tightpng.js | 144 + tests/test.util.js | 89 + tests/test.websock.js | 552 + tests/test.webutil.js | 223 + tests/test.zrle.js | 124 + tests/vnc_playback.html | 36 + utils/.eslintrc | 8 + utils/README.md | 14 + utils/b64-to-binary.pl | 17 + utils/genkeysymdef.js | 127 + utils/launch.sh | 198 + utils/u2x11 | 28 + utils/use_require.js | 138 + utils/validate | 45 + vendor/interact.min.js | 3 + vendor/pako/LICENSE | 21 + vendor/pako/README.md | 6 + vendor/pako/lib/utils/common.js | 45 + vendor/pako/lib/zlib/adler32.js | 27 + vendor/pako/lib/zlib/constants.js | 47 + vendor/pako/lib/zlib/crc32.js | 36 + vendor/pako/lib/zlib/deflate.js | 1846 + vendor/pako/lib/zlib/gzheader.js | 35 + vendor/pako/lib/zlib/inffast.js | 324 + vendor/pako/lib/zlib/inflate.js | 1527 + vendor/pako/lib/zlib/inftrees.js | 322 + vendor/pako/lib/zlib/messages.js | 11 + vendor/pako/lib/zlib/trees.js | 1195 + vendor/pako/lib/zlib/zstream.js | 24 + vendor/promise.js | 255 + vnc.html | 607 + webpack.config.js | 138 + 687 files changed, 189411 insertions(+) create mode 100644 .eslintignore create mode 100644 .eslintrc create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/deploy.yml create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/test.yml create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 AUTHORS create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 app/error-handler.js create mode 100644 app/images/alt.svg create mode 100644 app/images/clipboard.svg create mode 100644 app/images/connect.svg create mode 100644 app/images/ctrl.svg create mode 100644 app/images/ctrlaltdel.svg create mode 100644 app/images/disconnect.svg create mode 100644 app/images/download.gif create mode 100644 app/images/drag.svg create mode 100644 app/images/error.svg create mode 100644 app/images/esc.svg create mode 100644 app/images/expander.svg create mode 100644 app/images/fullscreen.svg create mode 100644 app/images/gamepad.png create mode 100644 app/images/handle.svg create mode 100644 app/images/handle_bg.svg create mode 100644 app/images/icons/368_kasm_logo_only_120x120.png create mode 100644 app/images/icons/368_kasm_logo_only_144x144.png create mode 100644 app/images/icons/368_kasm_logo_only_152x152.png create mode 100644 app/images/icons/368_kasm_logo_only_16x16.png create mode 100644 app/images/icons/368_kasm_logo_only_192x192.png create mode 100644 app/images/icons/368_kasm_logo_only_24x24.png create mode 100644 app/images/icons/368_kasm_logo_only_32x32.png create mode 100644 app/images/icons/368_kasm_logo_only_48x48.png create mode 100644 app/images/icons/368_kasm_logo_only_60x60.png create mode 100644 app/images/icons/368_kasm_logo_only_64x64.png create mode 100644 app/images/icons/368_kasm_logo_only_72x72.png create mode 100644 app/images/icons/368_kasm_logo_only_76x76.png create mode 100644 app/images/icons/368_kasm_logo_only_96x96.png create mode 100644 app/images/icons/Makefile create mode 100644 app/images/icons/kasm_logo.svg create mode 100644 app/images/icons/novnc-120x120.png create mode 100644 app/images/icons/novnc-144x144.png create mode 100644 app/images/icons/novnc-152x152.png create mode 100644 app/images/icons/novnc-16x16.png create mode 100644 app/images/icons/novnc-192x192.png create mode 100644 app/images/icons/novnc-24x24.png create mode 100644 app/images/icons/novnc-32x32.png create mode 100644 app/images/icons/novnc-48x48.png create mode 100644 app/images/icons/novnc-60x60.png create mode 100644 app/images/icons/novnc-64x64.png create mode 100644 app/images/icons/novnc-72x72.png create mode 100644 app/images/icons/novnc-76x76.png create mode 100644 app/images/icons/novnc-96x96.png create mode 100644 app/images/icons/novnc-icon-sm.svg create mode 100644 app/images/icons/novnc-icon.svg create mode 100644 app/images/info.svg create mode 100644 app/images/keyboard.svg create mode 100644 app/images/pointer.svg create mode 100644 app/images/power.svg create mode 100644 app/images/refresh.gif create mode 100644 app/images/settings.svg create mode 100644 app/images/splash.jpg create mode 100644 app/images/tab.svg create mode 100644 app/images/toggleextrakeys.svg create mode 100644 app/images/warning.svg create mode 100644 app/images/windows.svg create mode 100644 app/locale/README create mode 100644 app/locale/af.json create mode 100644 app/locale/af_ZA.json create mode 100644 app/locale/am.json create mode 100644 app/locale/am_ET.json create mode 100644 app/locale/ar.json create mode 100644 app/locale/ar_AE.json create mode 100644 app/locale/ar_BH.json create mode 100644 app/locale/ar_DZ.json create mode 100644 app/locale/ar_EG.json create mode 100644 app/locale/ar_IN.json create mode 100644 app/locale/ar_IQ.json create mode 100644 app/locale/ar_JO.json create mode 100644 app/locale/ar_KW.json create mode 100644 app/locale/ar_LB.json create mode 100644 app/locale/ar_LY.json create mode 100644 app/locale/ar_MA.json create mode 100644 app/locale/ar_OM.json create mode 100644 app/locale/ar_QA.json create mode 100644 app/locale/ar_SA.json create mode 100644 app/locale/ar_SD.json create mode 100644 app/locale/ar_SY.json create mode 100644 app/locale/ar_TN.json create mode 100644 app/locale/ar_YE.json create mode 100644 app/locale/az.json create mode 100644 app/locale/az_AZ.json create mode 100644 app/locale/be.json create mode 100644 app/locale/be_BY.json create mode 100644 app/locale/bg.json create mode 100644 app/locale/bg_BG.json create mode 100644 app/locale/bn.json create mode 100644 app/locale/bn_BD.json create mode 100644 app/locale/bn_IN.json create mode 100644 app/locale/bs.json create mode 100644 app/locale/bs_BA.json create mode 100644 app/locale/ca.json create mode 100644 app/locale/ca_AD.json create mode 100644 app/locale/ca_ES.json create mode 100644 app/locale/ca_FR.json create mode 100644 app/locale/ca_IT.json create mode 100644 app/locale/cs.json create mode 100644 app/locale/cs_CZ.json create mode 100644 app/locale/cy.json create mode 100644 app/locale/cy_GB.json create mode 100644 app/locale/da.json create mode 100644 app/locale/da_DK.json create mode 100644 app/locale/de.json create mode 100644 app/locale/de_AT.json create mode 100644 app/locale/de_BE.json create mode 100644 app/locale/de_CH.json create mode 100644 app/locale/de_DE.json create mode 100644 app/locale/de_LU.json create mode 100644 app/locale/es.json create mode 100644 app/locale/es_AR.json create mode 100644 app/locale/es_BO.json create mode 100644 app/locale/es_CL.json create mode 100644 app/locale/es_CO.json create mode 100644 app/locale/es_CR.json create mode 100644 app/locale/es_CU.json create mode 100644 app/locale/es_DO.json create mode 100644 app/locale/es_EC.json create mode 100644 app/locale/es_ES.json create mode 100644 app/locale/es_GT.json create mode 100644 app/locale/es_HN.json create mode 100644 app/locale/es_MX.json create mode 100644 app/locale/es_NI.json create mode 100644 app/locale/es_PA.json create mode 100644 app/locale/es_PE.json create mode 100644 app/locale/es_PR.json create mode 100644 app/locale/es_PY.json create mode 100644 app/locale/es_SV.json create mode 100644 app/locale/es_US.json create mode 100644 app/locale/es_UY.json create mode 100644 app/locale/es_VE.json create mode 100644 app/locale/et.json create mode 100644 app/locale/et_EE.json create mode 100644 app/locale/eu.json create mode 100644 app/locale/eu_ES.json create mode 100644 app/locale/fa.json create mode 100644 app/locale/fa_IR.json create mode 100644 app/locale/fi.json create mode 100644 app/locale/fi_FI.json create mode 100644 app/locale/fr.json create mode 100644 app/locale/fr_BE.json create mode 100644 app/locale/fr_CA.json create mode 100644 app/locale/fr_CH.json create mode 100644 app/locale/fr_FR.json create mode 100644 app/locale/fr_LU.json create mode 100644 app/locale/fy.json create mode 100644 app/locale/fy_DE.json create mode 100644 app/locale/fy_NL.json create mode 100644 app/locale/ga.json create mode 100644 app/locale/ga_IE.json create mode 100644 app/locale/gd.json create mode 100644 app/locale/gd_GB.json create mode 100644 app/locale/gl.json create mode 100644 app/locale/gl_ES.json create mode 100644 app/locale/gu.json create mode 100644 app/locale/gu_IN.json create mode 100644 app/locale/ha.json create mode 100644 app/locale/ha_NG.json create mode 100644 app/locale/he.json create mode 100644 app/locale/he_IL.json create mode 100644 app/locale/hi.json create mode 100644 app/locale/hi_IN.json create mode 100644 app/locale/hr.json create mode 100644 app/locale/hr_HR.json create mode 100644 app/locale/ht.json create mode 100644 app/locale/ht_HT.json create mode 100644 app/locale/hu.json create mode 100644 app/locale/hu_HU.json create mode 100644 app/locale/hy.json create mode 100644 app/locale/hy_AM.json create mode 100644 app/locale/id.json create mode 100644 app/locale/id_ID.json create mode 100644 app/locale/ig.json create mode 100644 app/locale/ig_NG.json create mode 100644 app/locale/is.json create mode 100644 app/locale/is_IS.json create mode 100644 app/locale/it.json create mode 100644 app/locale/it_CH.json create mode 100644 app/locale/it_IT.json create mode 100644 app/locale/ja.json create mode 100644 app/locale/ja_JP.json create mode 100644 app/locale/ka.json create mode 100644 app/locale/ka_GE.json create mode 100644 app/locale/kk.json create mode 100644 app/locale/kk_KZ.json create mode 100644 app/locale/km.json create mode 100644 app/locale/km_KH.json create mode 100644 app/locale/kn.json create mode 100644 app/locale/kn_IN.json create mode 100644 app/locale/ko.json create mode 100644 app/locale/ko_KR.json create mode 100644 app/locale/ku.json create mode 100644 app/locale/ku_TR.json create mode 100644 app/locale/ky.json create mode 100644 app/locale/ky_KG.json create mode 100644 app/locale/lb.json create mode 100644 app/locale/lb_LU.json create mode 100644 app/locale/lo.json create mode 100644 app/locale/lo_LA.json create mode 100644 app/locale/lt.json create mode 100644 app/locale/lt_LT.json create mode 100644 app/locale/lv.json create mode 100644 app/locale/lv_LV.json create mode 100644 app/locale/mg.json create mode 100644 app/locale/mg_MG.json create mode 100644 app/locale/mi.json create mode 100644 app/locale/mi_NZ.json create mode 100644 app/locale/mk.json create mode 100644 app/locale/mk_MK.json create mode 100644 app/locale/ml.json create mode 100644 app/locale/ml_IN.json create mode 100644 app/locale/mn.json create mode 100644 app/locale/mn_MN.json create mode 100644 app/locale/mr.json create mode 100644 app/locale/mr_IN.json create mode 100644 app/locale/ms.json create mode 100644 app/locale/ms_MY.json create mode 100644 app/locale/mt.json create mode 100644 app/locale/mt_MT.json create mode 100644 app/locale/my.json create mode 100644 app/locale/my_MM.json create mode 100644 app/locale/ne.json create mode 100644 app/locale/ne_NP.json create mode 100644 app/locale/nl.json create mode 100644 app/locale/nl_AW.json create mode 100644 app/locale/nl_BE.json create mode 100644 app/locale/nl_NL.json create mode 100644 app/locale/pa.json create mode 100644 app/locale/pa_IN.json create mode 100644 app/locale/pa_PK.json create mode 100644 app/locale/pl.json create mode 100644 app/locale/pl_PL.json create mode 100644 app/locale/ps.json create mode 100644 app/locale/ps_AF.json create mode 100644 app/locale/pt.json create mode 100644 app/locale/pt_BR.json create mode 100644 app/locale/pt_PT.json create mode 100644 app/locale/ro.json create mode 100644 app/locale/ro_RO.json create mode 100644 app/locale/ru.json create mode 100644 app/locale/ru_RU.json create mode 100644 app/locale/ru_UA.json create mode 100644 app/locale/sd.json create mode 100644 app/locale/sd_IN.json create mode 100644 app/locale/si.json create mode 100644 app/locale/si_LK.json create mode 100644 app/locale/sk.json create mode 100644 app/locale/sk_SK.json create mode 100644 app/locale/sl.json create mode 100644 app/locale/sl_SI.json create mode 100644 app/locale/so.json create mode 100644 app/locale/so_DJ.json create mode 100644 app/locale/so_ET.json create mode 100644 app/locale/so_KE.json create mode 100644 app/locale/so_SO.json create mode 100644 app/locale/sq.json create mode 100644 app/locale/sq_AL.json create mode 100644 app/locale/sq_MK.json create mode 100644 app/locale/st.json create mode 100644 app/locale/st_ZA.json create mode 100644 app/locale/sv.json create mode 100644 app/locale/sv_FI.json create mode 100644 app/locale/sv_SE.json create mode 100644 app/locale/sw.json create mode 100644 app/locale/sw_KE.json create mode 100644 app/locale/ta.json create mode 100644 app/locale/ta_IN.json create mode 100644 app/locale/ta_LK.json create mode 100644 app/locale/te.json create mode 100644 app/locale/te_IN.json create mode 100644 app/locale/tg.json create mode 100644 app/locale/tg_TJ.json create mode 100644 app/locale/th.json create mode 100644 app/locale/th_TH.json create mode 100644 app/locale/tl.json create mode 100644 app/locale/tl_PH.json create mode 100644 app/locale/tr.json create mode 100644 app/locale/tr_CY.json create mode 100644 app/locale/tr_TR.json create mode 100644 app/locale/tt.json create mode 100644 app/locale/tt_RU.json create mode 100644 app/locale/uk.json create mode 100644 app/locale/uk_UA.json create mode 100644 app/locale/ur.json create mode 100644 app/locale/ur_IN.json create mode 100644 app/locale/ur_PK.json create mode 100644 app/locale/uz.json create mode 100644 app/locale/uz_UZ.json create mode 100644 app/locale/vi.json create mode 100644 app/locale/vi_VN.json create mode 100644 app/locale/xh.json create mode 100644 app/locale/xh_ZA.json create mode 100644 app/locale/yi.json create mode 100644 app/locale/yi_US.json create mode 100644 app/locale/yo.json create mode 100644 app/locale/yo_NG.json create mode 100644 app/locale/zh_CN.json create mode 100644 app/locale/zh_TW.json create mode 100644 app/locale/zu.json create mode 100644 app/locale/zu_ZA.json create mode 100644 app/localization.js create mode 100644 app/sounds/CREDITS create mode 100644 app/sounds/bell.mp3 create mode 100644 app/sounds/bell.oga create mode 100644 app/styles/Orbitron700.ttf create mode 100644 app/styles/Orbitron700.woff create mode 100644 app/styles/base.css create mode 100644 app/styles/bootstrap.min.css create mode 100644 app/ui.js create mode 100644 app/webutil.js create mode 100644 core/base64.js create mode 100644 core/decoders/copyrect.js create mode 100644 core/decoders/hextile.js create mode 100644 core/decoders/qoi/decoder.js create mode 100644 core/decoders/qoi/qoi_viewer_bg.wasm create mode 100644 core/decoders/raw.js create mode 100644 core/decoders/rre.js create mode 100644 core/decoders/tight.js create mode 100644 core/decoders/tightpng.js create mode 100644 core/decoders/udp.js create mode 100644 core/deflator.js create mode 100644 core/des.js create mode 100644 core/display.js create mode 100644 core/encodings.js create mode 100644 core/inflator.js create mode 100644 core/input/domkeytable.js create mode 100644 core/input/fixedkeys.js create mode 100644 core/input/gesturehandler.js create mode 100644 core/input/imekeys.js create mode 100644 core/input/keyboard.js create mode 100644 core/input/keysym.js create mode 100644 core/input/keysymdef.js create mode 100644 core/input/util.js create mode 100644 core/input/vkeys.js create mode 100644 core/input/xtscancodes.js create mode 100644 core/mousebuttonmapper.js create mode 100644 core/output/printer.js create mode 100644 core/rfb.js create mode 100644 core/util/browser.js create mode 100644 core/util/cursor.js create mode 100644 core/util/element.js create mode 100644 core/util/events.js create mode 100644 core/util/eventtarget.js create mode 100644 core/util/int.js create mode 100644 core/util/logging.js create mode 100644 core/util/strings.js create mode 100644 core/websock.js create mode 100644 docs/API-internal.md create mode 100644 docs/API.md create mode 100644 docs/DEVELOP.md create mode 100644 docs/EMBEDDING.md create mode 100644 docs/LIBRARY.md create mode 100644 docs/LICENSE.BSD-2-Clause create mode 100644 docs/LICENSE.BSD-3-Clause create mode 100644 docs/LICENSE.MPL-2.0 create mode 100644 docs/LICENSE.OFL-1.1 create mode 100644 docs/flash_policy.txt create mode 100644 docs/links create mode 100644 docs/notes create mode 100644 docs/rfb_notes create mode 100644 docs/rfbproto-3.3.pdf create mode 100644 docs/rfbproto-3.7.pdf create mode 100644 docs/rfbproto-3.8.pdf create mode 100644 karma.conf.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 po/.eslintrc create mode 100644 po/Makefile create mode 100644 po/README.md create mode 100644 po/af.po create mode 100644 po/af_ZA.po create mode 100644 po/am.po create mode 100644 po/am_ET.po create mode 100644 po/ar.po create mode 100644 po/ar_AE.po create mode 100644 po/ar_BH.po create mode 100644 po/ar_DZ.po create mode 100644 po/ar_EG.po create mode 100644 po/ar_IN.po create mode 100644 po/ar_IQ.po create mode 100644 po/ar_JO.po create mode 100644 po/ar_KW.po create mode 100644 po/ar_LB.po create mode 100644 po/ar_LY.po create mode 100644 po/ar_MA.po create mode 100644 po/ar_OM.po create mode 100644 po/ar_QA.po create mode 100644 po/ar_SA.po create mode 100644 po/ar_SD.po create mode 100644 po/ar_SY.po create mode 100644 po/ar_TN.po create mode 100644 po/ar_YE.po create mode 100644 po/az.po create mode 100644 po/az_AZ.po create mode 100644 po/be.po create mode 100644 po/be_BY.po create mode 100644 po/bg.po create mode 100644 po/bg_BG.po create mode 100644 po/bn.po create mode 100644 po/bn_BD.po create mode 100644 po/bn_IN.po create mode 100644 po/bs.po create mode 100644 po/bs_BA.po create mode 100644 po/ca.po create mode 100644 po/ca_AD.po create mode 100644 po/ca_ES.po create mode 100644 po/ca_FR.po create mode 100644 po/ca_IT.po create mode 100644 po/cs.po create mode 100644 po/cs_CZ.po create mode 100644 po/cy.po create mode 100644 po/cy_GB.po create mode 100644 po/da.po create mode 100644 po/da_DK.po create mode 100644 po/de.po create mode 100644 po/de_AT.po create mode 100644 po/de_BE.po create mode 100644 po/de_CH.po create mode 100644 po/de_DE.po create mode 100644 po/de_LU.po create mode 100644 po/el.po create mode 100644 po/es.po create mode 100644 po/es_AR.po create mode 100644 po/es_BO.po create mode 100644 po/es_CL.po create mode 100644 po/es_CO.po create mode 100644 po/es_CR.po create mode 100644 po/es_CU.po create mode 100644 po/es_DO.po create mode 100644 po/es_EC.po create mode 100644 po/es_ES.po create mode 100644 po/es_GT.po create mode 100644 po/es_HN.po create mode 100644 po/es_MX.po create mode 100644 po/es_NI.po create mode 100644 po/es_PA.po create mode 100644 po/es_PE.po create mode 100644 po/es_PR.po create mode 100644 po/es_PY.po create mode 100644 po/es_SV.po create mode 100644 po/es_US.po create mode 100644 po/es_UY.po create mode 100644 po/es_VE.po create mode 100644 po/et.po create mode 100644 po/et_EE.po create mode 100644 po/eu.po create mode 100644 po/eu_ES.po create mode 100644 po/fa.po create mode 100644 po/fa_IR.po create mode 100644 po/fi.po create mode 100644 po/fi_FI.po create mode 100644 po/fr.po create mode 100644 po/fr_BE.po create mode 100644 po/fr_CA.po create mode 100644 po/fr_CH.po create mode 100644 po/fr_FR.po create mode 100644 po/fr_LU.po create mode 100644 po/fy.po create mode 100644 po/fy_DE.po create mode 100644 po/fy_NL.po create mode 100644 po/ga.po create mode 100644 po/ga_IE.po create mode 100644 po/gd.po create mode 100644 po/gd_GB.po create mode 100644 po/gl.po create mode 100644 po/gl_ES.po create mode 100644 po/gu.po create mode 100644 po/gu_IN.po create mode 100644 po/ha.po create mode 100644 po/ha_NG.po create mode 100644 po/he.po create mode 100644 po/he_IL.po create mode 100644 po/hi.po create mode 100644 po/hi_IN.po create mode 100644 po/hr.po create mode 100644 po/hr_HR.po create mode 100644 po/ht.po create mode 100644 po/ht_HT.po create mode 100644 po/hu.po create mode 100644 po/hu_HU.po create mode 100644 po/hy.po create mode 100644 po/hy_AM.po create mode 100644 po/id.po create mode 100644 po/id_ID.po create mode 100644 po/ig.po create mode 100644 po/ig_NG.po create mode 100644 po/is.po create mode 100644 po/is_IS.po create mode 100644 po/it.po create mode 100644 po/it_CH.po create mode 100644 po/it_IT.po create mode 100644 po/ja.po create mode 100644 po/ja_JP.po create mode 100644 po/ka.po create mode 100644 po/ka_GE.po create mode 100644 po/kk.po create mode 100644 po/kk_KZ.po create mode 100644 po/km.po create mode 100644 po/km_KH.po create mode 100644 po/kn.po create mode 100644 po/kn_IN.po create mode 100644 po/ko.po create mode 100644 po/ko_KR.po create mode 100644 po/ku.po create mode 100644 po/ku_TR.po create mode 100644 po/ky.po create mode 100644 po/ky_KG.po create mode 100644 po/lb.po create mode 100644 po/lb_LU.po create mode 100644 po/lo.po create mode 100644 po/lo_LA.po create mode 100644 po/lt.po create mode 100644 po/lt_LT.po create mode 100644 po/lv.po create mode 100644 po/lv_LV.po create mode 100644 po/mg.po create mode 100644 po/mg_MG.po create mode 100644 po/mi.po create mode 100644 po/mi_NZ.po create mode 100644 po/mk.po create mode 100644 po/mk_MK.po create mode 100644 po/ml.po create mode 100644 po/ml_IN.po create mode 100644 po/mn.po create mode 100644 po/mn_MN.po create mode 100644 po/mr.po create mode 100644 po/mr_IN.po create mode 100644 po/ms.po create mode 100644 po/ms_MY.po create mode 100644 po/mt.po create mode 100644 po/mt_MT.po create mode 100644 po/my.po create mode 100644 po/my_MM.po create mode 100644 po/ne.po create mode 100644 po/ne_NP.po create mode 100644 po/nl.po create mode 100644 po/nl_AW.po create mode 100644 po/nl_BE.po create mode 100644 po/nl_NL.po create mode 100644 po/noVNC.pot create mode 100644 po/pa.po create mode 100644 po/pa_IN.po create mode 100644 po/pa_PK.po create mode 100644 po/pl.po create mode 100644 po/pl_PL.po create mode 100755 po/po2js create mode 100644 po/ps.po create mode 100644 po/ps_AF.po create mode 100644 po/pt.po create mode 100644 po/pt_BR.po create mode 100644 po/pt_PT.po create mode 100644 po/ro.po create mode 100644 po/ro_RO.po create mode 100644 po/ru.po create mode 100644 po/ru_RU.po create mode 100644 po/ru_UA.po create mode 100644 po/sd.po create mode 100644 po/sd_IN.po create mode 100644 po/si.po create mode 100644 po/si_LK.po create mode 100644 po/sk.po create mode 100644 po/sk_SK.po create mode 100644 po/sl.po create mode 100644 po/sl_SI.po create mode 100644 po/so.po create mode 100644 po/so_DJ.po create mode 100644 po/so_ET.po create mode 100644 po/so_KE.po create mode 100644 po/so_SO.po create mode 100644 po/sq.po create mode 100644 po/sq_AL.po create mode 100644 po/sq_MK.po create mode 100644 po/st.po create mode 100644 po/st_ZA.po create mode 100644 po/sv.po create mode 100644 po/sv_FI.po create mode 100644 po/sv_SE.po create mode 100644 po/sw.po create mode 100644 po/sw_KE.po create mode 100644 po/ta.po create mode 100644 po/ta_IN.po create mode 100644 po/ta_LK.po create mode 100644 po/te.po create mode 100644 po/te_IN.po create mode 100644 po/tg.po create mode 100644 po/tg_TJ.po create mode 100644 po/th.po create mode 100644 po/th_TH.po create mode 100644 po/tl.po create mode 100644 po/tl_PH.po create mode 100644 po/tr.po create mode 100644 po/tr_CY.po create mode 100644 po/tr_TR.po create mode 100644 po/tt.po create mode 100644 po/tt_RU.po create mode 100644 po/uk.po create mode 100644 po/uk_UA.po create mode 100644 po/update_trans.sh create mode 100644 po/ur.po create mode 100644 po/ur_IN.po create mode 100644 po/ur_PK.po create mode 100644 po/uz.po create mode 100644 po/uz_UZ.po create mode 100644 po/vi.po create mode 100644 po/vi_VN.po create mode 100755 po/xgettext-html create mode 100644 po/xh.po create mode 100644 po/xh_ZA.po create mode 100644 po/yi.po create mode 100644 po/yi_US.po create mode 100644 po/yo.po create mode 100644 po/yo_NG.po create mode 100644 po/zh_CN.po create mode 100644 po/zh_TW.po create mode 100644 po/zu.po create mode 100644 po/zu_ZA.po create mode 100644 snap/hooks/configure create mode 100755 snap/local/svc_wrapper.sh create mode 100644 snap/snapcraft.yaml create mode 100644 tests/.eslintrc create mode 100644 tests/README.md create mode 100644 tests/assertions.js create mode 100644 tests/fake.websocket.js create mode 100644 tests/playback-ui.js create mode 100644 tests/playback.js create mode 100644 tests/test.base64.js create mode 100644 tests/test.copyrect.js create mode 100644 tests/test.deflator.js create mode 100644 tests/test.display.js create mode 100644 tests/test.gesturehandler.js create mode 100644 tests/test.helper.js create mode 100644 tests/test.hextile.js create mode 100644 tests/test.inflator.js create mode 100644 tests/test.int.js create mode 100644 tests/test.jpeg.js create mode 100644 tests/test.keyboard.js create mode 100644 tests/test.localization.js create mode 100644 tests/test.ra2.js create mode 100644 tests/test.raw.js create mode 100644 tests/test.rfb.js create mode 100644 tests/test.rre.js create mode 100644 tests/test.tight.js create mode 100644 tests/test.tightpng.js create mode 100644 tests/test.util.js create mode 100644 tests/test.websock.js create mode 100644 tests/test.webutil.js create mode 100644 tests/test.zrle.js create mode 100644 tests/vnc_playback.html create mode 100644 utils/.eslintrc create mode 100644 utils/README.md create mode 100755 utils/b64-to-binary.pl create mode 100755 utils/genkeysymdef.js create mode 100755 utils/launch.sh create mode 100755 utils/u2x11 create mode 100755 utils/use_require.js create mode 100755 utils/validate create mode 100644 vendor/interact.min.js create mode 100644 vendor/pako/LICENSE create mode 100644 vendor/pako/README.md create mode 100644 vendor/pako/lib/utils/common.js create mode 100644 vendor/pako/lib/zlib/adler32.js create mode 100644 vendor/pako/lib/zlib/constants.js create mode 100644 vendor/pako/lib/zlib/crc32.js create mode 100644 vendor/pako/lib/zlib/deflate.js create mode 100644 vendor/pako/lib/zlib/gzheader.js create mode 100644 vendor/pako/lib/zlib/inffast.js create mode 100644 vendor/pako/lib/zlib/inflate.js create mode 100644 vendor/pako/lib/zlib/inftrees.js create mode 100644 vendor/pako/lib/zlib/messages.js create mode 100644 vendor/pako/lib/zlib/trees.js create mode 100644 vendor/pako/lib/zlib/zstream.js create mode 100644 vendor/promise.js create mode 100644 vnc.html create mode 100644 webpack.config.js diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..d381628 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +**/xtscancodes.js diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..a53bb40 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,50 @@ +{ + "env": { + "browser": true, + "es6": true + }, + "parserOptions": { + "sourceType": "module" + }, + "extends": "eslint:recommended", + "rules": { + // Unsafe or confusing stuff that we forbid + + "no-unused-vars": ["error", { "vars": "all", "args": "none", "ignoreRestSiblings": true }], + "no-constant-condition": ["error", { "checkLoops": false }], + "no-var": "error", + "no-useless-constructor": "error", + "object-shorthand": ["error", "methods", { "avoidQuotes": true }], + "prefer-arrow-callback": "error", + "arrow-body-style": ["error", "as-needed", { "requireReturnForObjectLiteral": false } ], + "arrow-parens": ["error", "as-needed", { "requireForBlockBody": true }], + "arrow-spacing": ["error"], + "no-confusing-arrow": ["error", { "allowParens": true }], + + // Enforced coding style + + "brace-style": ["error", "1tbs", { "allowSingleLine": true }], + "indent": ["error", 4, { "SwitchCase": 1, + "FunctionDeclaration": { "parameters": "first" }, + "CallExpression": { "arguments": "first" }, + "ArrayExpression": "first", + "ObjectExpression": "first", + "ignoreComments": true }], + "comma-spacing": ["error"], + "comma-style": ["error"], + "curly": ["error", "multi-line"], + "func-call-spacing": ["error"], + "func-names": ["error"], + "func-style": ["error", "declaration", { "allowArrowFunctions": true }], + "key-spacing": ["error"], + "keyword-spacing": ["error"], + "no-trailing-spaces": ["error"], + "semi": ["error"], + "space-before-blocks": ["error"], + "space-before-function-paren": ["error", { "anonymous": "always", + "named": "never", + "asyncArrow": "always" }], + "switch-colon-spacing": ["error"], + "camelcase": ["error", { allow: ["^XK_", "^XF86XK_"] }], + } +} diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..94ac6f8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,34 @@ +--- +name: Bug report +about: Create a report to help us improve + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Client (please complete the following information):** + - OS: [e.g. iOS] + - Browser: [e.g. chrome, safari] + - Browser version: [e.g. 22] + +**Server (please complete the following information):** + - noVNC version: [e.g. 1.0.0 or git commit id] + - VNC server: [e.g. QEMU, TigerVNC] + - WebSocket proxy: [e.g. websockify] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..cbd35aa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Question or discussion + url: https://groups.google.com/forum/?fromgroups#!forum/novnc + about: Ask a question or start a discussion diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..066b2d9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,17 @@ +--- +name: Feature request +about: Suggest an idea for this project + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..6b0ac96 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,56 @@ +name: Publish + +on: + push: + pull_request: + release: + types: [published] + +jobs: + npm: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + # Needs to be explicitly specified for auth to work + registry-url: 'https://registry.npmjs.org' + - run: npm install + - uses: actions/upload-artifact@v2 + with: + name: npm + path: lib + - run: npm publish --access public + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + if: ${{ github.event_name == 'release' && !github.event.release.prerelease }} + - run: npm publish --access public --tag beta + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + if: ${{ github.event_name == 'release' && github.event.release.prerelease }} + snap: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - run: | + VERSION=$(grep '"version"' package.json | cut -d '"' -f 4) + echo $VERSION + sed -i "s/@VERSION@/$VERSION/g" snap/snapcraft.yaml + - uses: snapcore/action-build@v1 + id: snapcraft + - uses: actions/upload-artifact@v2 + with: + name: snap + path: ${{ steps.snapcraft.outputs.snap }} + - uses: snapcore/action-publish@v1 + with: + store_login: ${{ secrets.SNAPCRAFT_LOGIN }} + snap: ${{ steps.build.outputs.snap }} + release: stable + if: ${{ github.event_name == 'release' && !github.event.release.prerelease }} + - uses: snapcore/action-publish@v1 + with: + store_login: ${{ secrets.SNAPCRAFT_LOGIN }} + snap: ${{ steps.build.outputs.snap }} + release: beta + if: ${{ github.event_name == 'release' && github.event.release.prerelease }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..aaa3673 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,19 @@ +name: Lint + +on: [push, pull_request] + +jobs: + eslint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + - run: npm install + - run: npm run lint + html: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + - run: npm install + - run: git ls-tree --name-only -r HEAD | grep -E "[.](html|css)$" | xargs ./utils/validate diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..a0bcb36 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,28 @@ +name: Test + +on: [push, pull_request] + +jobs: + test: + strategy: + matrix: + os: + - ubuntu-latest + - windows-latest + browser: + - ChromeHeadless + - FirefoxHeadless + include: + - os: macos-latest + browser: Safari + - os: windows-latest + browser: EdgeHeadless + fail-fast: false + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + - run: npm install + - run: npm run test + env: + TEST_BROWSER_NAME: ${{ matrix.browser }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c178dba --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +*.pyc +*.o +tests/data_*.js +utils/rebind.so +utils/websockify +/node_modules +/build +/lib +recordings +*.swp +*~ +noVNC-*.tgz diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e69de29 diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..dec0e89 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,13 @@ +maintainers: +- Joel Martin (@kanaka) +- Solly Ross (@directxman12) +- Samuel Mannehed for Cendio AB (@samhed) +- Pierre Ossman for Cendio AB (@CendioOssman) +maintainersEmeritus: +- @astrand +contributors: +# There are a bunch of people that should be here. +# If you want to be on this list, feel free send a PR +# to add yourself. +- jalf +- NTT corp. diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..ee81d20 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,62 @@ +noVNC is Copyright (C) 2019 The noVNC Authors +(./AUTHORS) + +The noVNC core library files are licensed under the MPL 2.0 (Mozilla +Public License 2.0). The noVNC core library is composed of the +Javascript code necessary for full noVNC operation. This includes (but +is not limited to): + + core/**/*.js + app/*.js + test/playback.js + +The HTML, CSS, font and images files that included with the noVNC +source distibution (or repository) are not considered part of the +noVNC core library and are licensed under more permissive licenses. +The intent is to allow easy integration of noVNC into existing web +sites and web applications. + +The HTML, CSS, font and image files are licensed as follows: + + *.html : 2-Clause BSD license + + app/styles/*.css : 2-Clause BSD license + + app/styles/Orbitron* : SIL Open Font License 1.1 + (Copyright 2009 Matt McInerney) + + app/images/ : Creative Commons Attribution-ShareAlike + http://creativecommons.org/licenses/by-sa/3.0/ + +Some portions of noVNC are copyright to their individual authors. +Please refer to the individual source files and/or to the noVNC commit +history: https://github.com/novnc/noVNC/commits/master + +The are several files and projects that have been incorporated into +the noVNC core library. Here is a list of those files and the original +licenses (all MPL 2.0 compatible): + + core/base64.js : MPL 2.0 + + core/des.js : Various BSD style licenses + + vendor/pako/ : MIT + +Any other files not mentioned above are typically marked with +a copyright/license header at the top of the file. The default noVNC +license is MPL-2.0. + +The following license texts are included: + + docs/LICENSE.MPL-2.0 + docs/LICENSE.OFL-1.1 + docs/LICENSE.BSD-3-Clause (New BSD) + docs/LICENSE.BSD-2-Clause (Simplified BSD / FreeBSD) + vendor/pako/LICENSE (MIT) + +Or alternatively the license texts may be found here: + + http://www.mozilla.org/MPL/2.0/ + http://scripts.sil.org/OFL + http://en.wikipedia.org/wiki/BSD_licenses + https://opensource.org/licenses/MIT diff --git a/README.md b/README.md new file mode 100644 index 0000000..d77cb51 --- /dev/null +++ b/README.md @@ -0,0 +1,59 @@ +## KasmVNC Web Front-End + + + +KasmVNC provides remote web-based access to a Desktop or application. While VNC is in the name, KasmVNC differs from other VNC variants such as TigerVNC, RealVNC, and TurboVNC. KasmVNC has broken from the RFB specification which defines VNC, in order to support modern technologies and increase security. KasmVNC is accessed by users from any modern browser and does not support legacy VNC viewer applications. KasmVNC uses a modern YAML based configuration at the server and user level, allowing for ease of management. + +[Kasm Technologies](https://www.kasmweb.com) developed Kasm Workspaces, the Containerized Streaming Platform. Kasm has open-sourced the Workspace docker images, which include containerized [full desktops and apps](https://github.com/kasmtech/workspaces-images) and [base images](https://github.com/kasmtech/workspaces-core-images) intended for developers to create custimized streaming containers. These containers can be used standalone or within the [Kasm Workspaces Platform](https://www.kasmweb.com) which provides a full Enterprise feature set. + +## News/Help/Contact + +For support with KasmVNC, post on the [KasmVNC Project](https://github.com/kasmtech/KasmVNC). + +## Documentation + +**Do not use the README from the master branch**, unless you are compiling KasmVNC yourself from the tip of master. Use the documentation for your specific release. + + - [KasmVNC 1.0.0 Documentation](https://www.kasmweb.com/kasmvnc/docs/1.0.0/index.html) + + For beta releases prior to version 1.0.0, use the README in this github project on the tagged commit for that release. + +## Features + + - Webp image compression for better bandwidth usage + - Automatic mixing of webp and jpeg based on CPU availability on server + - WebRTC UDP Transit + - Lossless QOI Image format for Local LAN + - [Dynamic jpeg/webp image coompression](https://github.com/kasmtech/KasmVNC/wiki/Video-Rendering-Options#dynamic-image-quality) quality settings based on screen change rates + - Seemless clipboard support (on Chromium based browsers) + - Binary clipboard support for text, images, and formatted text (on Chromium based browsers) + - Allow client to set/change most configuration settings + - Multi-User support with permissions that can be changed via the API + - Web UI uses a webpack for faster load times. + - Network and CPU bottleneck statistics + - Relative cursor support (game pointer mode) + - Cursor lock + - IME support for languages with extended characters + - Better mobile support + +## Screenshots + + + + +## Browser Requirements + +For a full listing of features and minimum browser version required for each browser, see this [KasmVNC Wiki Article](https://github.com/kasmtech/KasmVNC/wiki/Browser-Support). + + +## Server Requirements + +KasmVNC is an absolute requirement. This fork of noVNC is explicitly modified to work with KasmVNC and breaks the RFB specification. It will not work with legacy VNC servers. + +## Running noVNC + +KasmVNC has a built in web server and the web code is baked into KasmVNC. There are no instructions to provide, just install KasmVNC follow the instructions to configure and run it. + +## Development + +The noVNC code is webpacked for performance reasons. The CI pipeline in the KasmVNC project is responsible for building the web code and packaging it with KasmVNC. diff --git a/app/error-handler.js b/app/error-handler.js new file mode 100644 index 0000000..cf966f4 --- /dev/null +++ b/app/error-handler.js @@ -0,0 +1,72 @@ +/* + * noVNC: HTML5 VNC client + * Copyright (C) 2019 The noVNC Authors + * Licensed under MPL 2.0 (see LICENSE.txt) + * + * See README.md for usage and integration instructions. + */ + +// NB: this should *not* be included as a module until we have +// native support in the browsers, so that our error handler +// can catch script-loading errors. + +// No ES6 can be used in this file since it's used for the translation +/* eslint-disable prefer-arrow-callback */ + +(function _scope() { + "use strict"; + + // Fallback for all uncaught errors + function handleError(event, err) { + try { + const msg = document.getElementById('noVNC_fallback_errormsg'); + + // Only show the initial error + if (msg.hasChildNodes()) { + return false; + } + + // Skip allowed errors + let allowedErrors = [ "The user has exited the lock before this request was completed." ]; + if (event.message && allowedErrors.includes(event.message)) { + return false; + } + + let div = document.createElement("div"); + div.classList.add('noVNC_message'); + div.appendChild(document.createTextNode(event.message)); + msg.appendChild(div); + + if (event.filename) { + div = document.createElement("div"); + div.className = 'noVNC_location'; + let text = event.filename; + if (event.lineno !== undefined) { + text += ":" + event.lineno; + if (event.colno !== undefined) { + text += ":" + event.colno; + } + } + div.appendChild(document.createTextNode(text)); + msg.appendChild(div); + } + + if (err && err.stack) { + div = document.createElement("div"); + div.className = 'noVNC_stack'; + div.appendChild(document.createTextNode(err.stack)); + msg.appendChild(div); + } + + document.getElementById('noVNC_fallback_error') + .classList.add("noVNC_open"); + } catch (exc) { + document.write("Kasm encountered an error."); + } + // Don't return true since this would prevent the error + // from being printed to the browser console. + return false; + } + window.addEventListener('error', function onerror(evt) { handleError(evt, evt.error); }); + window.addEventListener('unhandledrejection', function onreject(evt) { handleError(evt.reason, evt.reason); }); +})(); diff --git a/app/images/alt.svg b/app/images/alt.svg new file mode 100644 index 0000000..e5bb461 --- /dev/null +++ b/app/images/alt.svg @@ -0,0 +1,92 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/app/images/clipboard.svg b/app/images/clipboard.svg new file mode 100644 index 0000000..79af275 --- /dev/null +++ b/app/images/clipboard.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/app/images/connect.svg b/app/images/connect.svg new file mode 100644 index 0000000..56cde41 --- /dev/null +++ b/app/images/connect.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/app/images/ctrl.svg b/app/images/ctrl.svg new file mode 100644 index 0000000..856e939 --- /dev/null +++ b/app/images/ctrl.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/app/images/ctrlaltdel.svg b/app/images/ctrlaltdel.svg new file mode 100644 index 0000000..d7744ea --- /dev/null +++ b/app/images/ctrlaltdel.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/app/images/disconnect.svg b/app/images/disconnect.svg new file mode 100644 index 0000000..6be7d18 --- /dev/null +++ b/app/images/disconnect.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/app/images/download.gif b/app/images/download.gif new file mode 100644 index 0000000000000000000000000000000000000000..3a524069f5cafa07610cc5ac6df466d7b304b7f4 GIT binary patch literal 123 zcmZ?wbhEHblw=TNXkcLY4+e_=1f7dg6H8K46v{J8G8EiBeFGR2f3h%gF)%XdFaQBa zIRlezPyT|gx7(Gf{iANJITlbIP@AOI7yEK<#;i%%A_vxs=zl$P;?2D6HaEO(gm6e4 WJEEC4sgK*(q|&VYlICUx25SJxxGx?6 literal 0 HcmV?d00001 diff --git a/app/images/drag.svg b/app/images/drag.svg new file mode 100644 index 0000000..139caf9 --- /dev/null +++ b/app/images/drag.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/app/images/error.svg b/app/images/error.svg new file mode 100644 index 0000000..8356d3f --- /dev/null +++ b/app/images/error.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/app/images/esc.svg b/app/images/esc.svg new file mode 100644 index 0000000..830152b --- /dev/null +++ b/app/images/esc.svg @@ -0,0 +1,92 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/app/images/expander.svg b/app/images/expander.svg new file mode 100644 index 0000000..e163535 --- /dev/null +++ b/app/images/expander.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/app/images/fullscreen.svg b/app/images/fullscreen.svg new file mode 100644 index 0000000..29bd05d --- /dev/null +++ b/app/images/fullscreen.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/app/images/gamepad.png b/app/images/gamepad.png new file mode 100644 index 0000000000000000000000000000000000000000..5ea9f1e98fa0404252317c721f6d91bfb2368dff GIT binary patch literal 2098 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIjKx9jP7LeL$-D$|4y8tTruq6Z zXaU(A4D5_T49p-UK*+!-#lQ+?GcY7EO2gS%j2ciiOh7e;3_y}W5QvKyjlgUXAiJeK zlYs@QcLtCK0S_PsnhK!o>zjI0cdtc*+*3{Aicpdj-C zMudA7Fu~1~T)>QAgAAW)RJj01aTa()7Bet#3xhBt!>lsd^Q;1t47vHWgMtW^QUpqC!P(PF}H9g{=};g%ywu64qBz04piUwpEJo4N!2- zFG^J~(=*UBP_pAvP*AWbN=dT{a&d!d2l8x{GD=Dctn~HE%ggo3jrH=2()A53EiLs8 zjP#9+bb%^#i!1X=5-W7`ij^UTz|3(;Elw`VEGWs$&r<-Io0ybeT4JlD1hNPYAnr`9 z$VAwbR}A$Q(1ZFQ8GS=N1AT1TfS!fB4@Fl+VgXJ~C7EeB>;lQ))RvMAx2mADCKQE)+Ga;lx74cIftLWq!ns0Jsa2$xKt ziN(NBvokV<>Oq&lsxcCmMkEO&jljUOaxO{*CEAeu{2V*3 zNva(vwd)!f=^B}az*0LzJCYhC-JpQB3Q8@`&nX3^j?lc!5<4RseQd($x}5WK3yM;U z!NFqy)q*UBuHL^W6Bs>-AZtJ|0JZ{I3|)N$!dZ6aFgGC!qHBo6rU6+HNkdAqRdH!j zR%&tyIJdzw0XW+^C8p~m3ESvnsVr zrl*TzhzIZ65bKP|fg*nYW(4&Q(-|+i9q25g&PZB zD7bBqkP;}JV%54zLsF)vQ7tzo$?%Ee>;yTJt(EOIzJKywahjj>x3;>$J^k~qbC%z0 z{{LO?vT64}Z?+{#!M|(v37<{-?6x=VdT&pUjpkIZ&yOEJ{#m!?Zr*)+GqWa+*lH#HJ_K4S5~QD@x_kB{4KY0i%M0v+099U#qpIW-VhsA+0yvJ9cG=m&P?c5iaeE871$`#Wrt`KAIHBenaPQ!Y?-kfeW8X zt4roQ;$wdHxpMl=9J}rZh5g4rGh8W^+AOjE!S{rE7iRr$Tv8E&>z7@A`EuT&Jrhr+ zkro6eb!Kyz81|5sZw*YA1h z)~L0I-D{6$8SFpd^j56us$TLUei8QCbMp?(QG9SDj!9`{gRE*b`%kHl@-2>YHylm6 zdHU+Tpj@-tjx}HAv!n>wTz7mpHOH)4YPCiI zT{!ak>#BeiCz>6dvw%RJ*_i9p(@ombPuDj6VUh}8!6CKoQ{|gBU0vNwjeAoMCVWsi zz|qry^v|eqc^=ZtmMj5%&%qI>g1^qzCTG<&5(Do&MkRimV++)@`PKRK2DvZ^6~zjnKNd1Ox9K7WpfrZf0J6z zbN{>b&t1L+Qr~X5X*ApxIU@aK#+$b)^W@4nV_FVAytJe7`iXayt+IUWLi(?DcgDoI zUn*XFafZ?Zze`zL<*sFzY%jdb_n={O)n2 + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/app/images/handle_bg.svg b/app/images/handle_bg.svg new file mode 100644 index 0000000..7579c42 --- /dev/null +++ b/app/images/handle_bg.svg @@ -0,0 +1,172 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/app/images/icons/368_kasm_logo_only_120x120.png b/app/images/icons/368_kasm_logo_only_120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2c4a4823058f09a2249907ba584ea85e89b702 GIT binary patch literal 2421 zcmV-*35xcKP)6I@}yhJ1tIvZZdXQ_RPvY`Vlo5uhE2(n2;K~!ko#aq{wgeVXdM1m1>;{U&MQM+5f zLT!6@ww~tn5iX&)6(G}7AXI`&sjvox2akK)rPjKhCk$P-NAC0B?GFChqJL6s-*7$7f zoXLQ6568|Z32OXstiGs}J_VkqB78hH3#P|oXWBd;%L6h0ozQHGR~d#O_&ZqKmBb*e zhbJY__6Sjf#Lee8$sqUzn1GMG}xY{19V67EP#P`symYFrfRh2eRDq@8Z#!w!Y};(;f4Hc&BC2YG?A`L~3g7`2IWAKE_Ydnp>`IkM#Vgo1c(vuQ}GQ ztq~u&P_FPfvg@rc$0v)ATxoS!KE*wF>tl7t9^;1pg#5upyDeHABd<$W!f3)M=hbcEla8$ssQ0(n-vbtjNqWNYJgPw`(P`y$Z#<8Y zqVYbC#1{L=<`!^o(rvioYE!3YFBz!EMUNC}KP!@PW^&IlLJL3#*pTXjBYUbw5A1pi z6IatG!9gs2W79P-ZsB>WNogPGlr(CjeC(cxOW+2cyvS6TUhzhvKLVMKCCwGE?b7Z0 z&D0%JrH=(2kx71xGLFDg30QwQs;0QZm2y%Ci&l;N)^nm`>Yg@K(R}~?VGRa?iC+nVYB6$b927dWIfiE z?d!R~II1)5yySq4$~poW*@;gv*~d}yuyBrt9A1RVKCIy@w>%71tV0#8bQ)G6TNPd|?l>z+M z`+zZ^jI!amK_r)ncuDiAL7h|!&E)~+Ii%B*Nqy%j+5LE1 zNUtm80Tu~##Sy3+VA5}Y6eR~PnKT|?bX00KsuWrpuWzBk)3wl3e&=$UI7q=|8L+5Jv{1BeR0RAk3RCMJj!rauJp3Xl$px)deq52XXJawp#+Q~FTK&g z(MdGO8ZwO2eFD*>TSLSH1J{N{26kam-z8=ChE=@ME>swHu{)YrmVIF)Ov`#z|BTJ` z_UA5$t<``jD-7yl(_I^}6PG=g4|st56~pB^-?HKR=qm>FrQ|*j1af^^^R~`z+4SOj z$Q)ZwI+!os({k2EGQ)3@&0LA)FWHrY`|hoFk_R&+^IdT5b;ZFHj6<1F8bZef#xpD6 z>bz*Zu?L)v2z-{@jth*tmoeZE*jb7Q-0*3J9@0e}cT#g+mbwf^KcPc zIpOgZfN(qi;s)j@?{(De@@x{S!F}S4R8<9}jB85ML-=*=2w)0Yi&XHQ-AcZs0w3Zv zS!eW~2g2*)KJFo>LP5nUl280b_IAo8P($K_ysSjDLd9^AtUy=5+|A;=_bgO*k?WEJ z_ZH{+%cG{borL_XA`ewqlM~!BQ=;|Uhr3}M`1A8yb->`lqEpZ1q37p~Q*|LpI|@au zG+Qdny3w(B3xm(;MHcVskwpkaA1Xz|DN4(vD3UU5<4h>!@MeyzidD_;0dGieTsMJQ zrE$0vfcVlNx&DE=+Sd2#<<+5W$w1#147_?VB*xzAqAcrS%9=22vN3M+iuo$3t6Ks! z$??F`0Y&5o*O!K zl6Cppz=W1-0t1&Fef?B)_{W~TS7~QiuG#wo0}pSaKlHHa@bT-`xn@Z{4Nlh{47^4Q zeUNlVJNN(?(Lv!czs^{`)dtWP}CejWpXWf_g9=IAG2ZKi41^=VR(4=^J#$)oA2&-w6{nLMS_*Pcyl<(H5Kz{`6+T$CQhJQ=O z{ME3xna-;DGi2I~o71(K&ipU`N5jhV*7T2YKUMt{{V8s?8=GY0e+J8A%gEK)-<&ti nQs!o&hDQ9yWWvMg(>V1HGP{OiGB`RC00000NkvXXu0mjf3EZ`3 literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_144x144.png b/app/images/icons/368_kasm_logo_only_144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..74e1926b46f13fe77927dc5d069735a057056a15 GIT binary patch literal 2877 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 literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_192x192.png b/app/images/icons/368_kasm_logo_only_192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..edf21cd52d26faf074d9a122427ff687cde96a8a GIT binary patch literal 3853 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 P00000NkvXXu0mjfOS2ob literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_24x24.png b/app/images/icons/368_kasm_logo_only_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..c002335258d0e13bfdaf7d4915de884b69b72383 GIT binary patch literal 532 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAB?S0{xVjhkykNEhAr|WwjFun- zWPn7#Y&aJ#1z`XcKp0G52Am5K1d?nvFPK0ksDu>@0PT`53GxeOP>~7S{>xj0`O6tD zy|-6mTGqN0RM^Z6?0dTS{z3kdEh_=hq=Hw?N@0k(#$l7h`*}xm2&N~ji zI1ryyHL=6hf78xwa&wpbTHQYXb4tvUg362q-}!tJZQon+ieE|3OE6*U`kcO6-m1!Q`I?Ud=KSY;k@frYe3)|H e{BxN8pWRhV;1r>XYh3Ob6Mw<&;$S}VCeJ! literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_32x32.png b/app/images/icons/368_kasm_logo_only_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f3aa4083d78427d91494b35faab27756fda0612f GIT binary patch literal 694 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy2?0JKuI>dsFPJP}Fj~G~wgQnX z)=)MRmQH+%B@6vG$K-;_i-KKuA%T~^+U*A*`8k^A#yZvLOA9Acjy`*C{0?9Hv$gYAB* zU1)n!usTFZ|FrmmD_RW;r!wSpFXy{kSj}K-VZ^**p(%ski8|*4`x>^fwK8R;?wHRl zUnF>I8^c?RnV+}4+VyVNw>@|JIt7ZD4I|$&`aE8H_j#z}Ue@a&$0I_;4@j2OGChl& zG=61kH{fAUuzt@>Y+j@(YMU=CWuwt0>jGqb{v z;5HHdsYiPjd=nD+JZ*-tiHOJHZ!TxQ^NDOznz~}<{>|&{4sc~UPM&9>d{(Q9bIDG( zN0KuVdzH@xA5T+cIhb}LLh#uBhGkPVCWq+h6;!==YaHmVv$iZ-aRbv_d*N28;JImA ztXRIN=iW__-tjzj(YuPa8&fx$Z?xrJ5LUnZmsZ-$$Qu!xkMCYvV&9xqZ?`w_^{dZ? seb!>EE%Nnxa?3?ObN%vf`t?peX{skfVXsRHFmW(=y85}Sb4q9e0CCnaT>t<8 literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_48x48.png b/app/images/icons/368_kasm_logo_only_48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..dc65cc46772110d2a891a4024cc091e1b9e6de7e GIT binary patch literal 986 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-su>n3IuI>dsFPN-eFk8J~vV6g4 z`GN(=0CRyNKrRr0q^w@BScBLQH4qY_07$|aAO$d8V7)FT=fr^)$(0281v7ZeO?bCd zl3DQgE%v}kN)|;1-`bC6IXp|$7YrYl_w8yOgw`8-`5Lp+Z6PQ7_)wE|Cra#xeW z4uy43|H^-6ap~SaZ|1W_vWoI4>koOHxVpl9ihe>?_>-$ELpoor?pHi|d3xlcm;>ufgp4%GlbtnXKV5ZZ`l|W5 ziFr=(jwZGR-}gH6-kxB2e$7hh>x#6TfCau$dT)(i1 z++BH@N9W`AoHmd3PuRY=$nWDTE(n|Q>VZp4g0#NS0`sFX-#)vw=;VCeA{^Z+k$SvO z=BN0L(|Rgvm)OPLaHQ-xUaqx|ccw`*Ktc)!;-F3Y_g(~x)J?6r#nA=0`I*iA}=l; z22bzU(2 z+ljeL_bqFYwUf>bU7=7F^3NvM^W)By_xrq$sZA?=^K#OWlM`y+$-0|rg@}gedOqWx z_R7>Vr;vHi_N2UximJDY=ESYNvF=~N@0>t+2g45mb5|`rt6|)^IQfg*%~U6!f09gh zRy0}{&p7L4@*nu?FF%*#?9I!P**2^v$`5St zQ7hTmx?@eGm6mhPMb@>oNxPp`s4ti;S#sM@dV5KToBgLE?$n}v{1-lz+1y+3^et;q z&HLG392xh1`50Tr{zun&nG3^=NxrqVkDqgY`Be9P@*il%Vzql0uDHsX z(e^J_fpcc_)=5|G?>Fj7B>7E~zuLRzf&9;%^S8a-cIgZ-4>5SU`njxgN@xNARwd0z literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_60x60.png b/app/images/icons/368_kasm_logo_only_60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..717211f32cee41b181c920d81714ff8d62460a69 GIT binary patch literal 1195 zcmV;c1XTNpP)6>0zg03CEvPE!CbXY4}5 zy!ZnO7?{}+sZSp`vgBNj%z2=MaVGLV`zpHt00ZMmL_t(Y$DNkf0;DJqMFB~Q0Tj&s z|8FiyMBDD!nR*nC6cug(0FYuoUX9Juv<&ZSM~yfD0FvXIEdb!++u}ZPAiuN60L%XS z>aKw~e%OrIkJS+jzhL&w>6%b$;1_Apy)HfvXF`_FzQC-WSG-Nf(MyQYJl=mWR;YFM z3bVGWY#snQj@BgvRQMLwS%u`jz(c`003zIb7?kwr>$F2)_71ZaP6sU?FlM#f1p5O# zpc2S_dcqAt0B~LZgh%Y13|@ndkcETH;P?xsO}>|x<&6bffcvT)oITxcEAZXo!AH@R z(pe7IGjoZ(o&98s$^Bq32qCRAc<=aRX&TQi6*9IE%&Ov5pbb}{0lo?v+#1l)0j^L_ zda>Aso++JVge?oe`T~y*;;VO?Yif%u_{?l6SBJw(znCfIuFc^&B}E{=@1YRh@vcwlTyl8fP7Upu zP4B{0jZXphA#-U68`m7JoeaC`tLSzGBohhecSUVDpx;@4iUD#7kzTT%A}@V;sQc2H zDsS3_^c}8FSQUP24h!t8imn0p95X%}{z{GCc@J2sVIQ#OIXZpez)Ruud#XY**T*#V z6|1ijn_i0~Ci9Ui;V3?%bi{ls&(y#b^{3#x#7K}Kvb~q*Ih~xx!8v@5rhdyh#!G4p zD7Ye0o=1n?l%{qGVdL5aDLM~^qPw@Goij#68lT-GyLCdiI@?^QV6puvfcE)vI!@rn zu#kP4TH8{8sOOARTdqM&GE;Q91Tw}theODqb_Zy(EExjxO7mabrtM+5FW$s9YIJTeBEDZA7?`gWNpP>;*2c@}ukwOr!KV zty(3u_hV4P`fbo1wf#JF-^a68R6>qd`1s9Q8l4I=jMm5_*Y&T(iz@U?Vg%WL@{trs>@>5Ky>X!fj002ov JPDHLkV1ioIICB61 literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_64x64.png b/app/images/icons/368_kasm_logo_only_64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..0c34b70b3f2179fa4db58cf64e271084ae98ef64 GIT binary patch literal 1302 zcmV+x1?l>UP)xf~+76MMV%11uTH& z|9|t+ER3VOck{Bdk{n4pi2wl9%I!f^XN;+zPAf73D|oH8M->VHA0Cf4nF9dV?L{UI z%-gvXfT=fy$_V*(zAa#SJ>TSG1UA)Jk)YcCCaM#K6Y#7t^j*7bTTNTN3^zwRRE|y_ z0937W4gqMljo3eskA@@|O3)jL4X!BxhtV_EV9%@II<1*k|0aF;SvUX_=9 z?d0YHDPHYGeOxs|P7;9LHRdaVut8MDyFaze3cUgh1=JQ{+7VF6^g6Ga34FD0Gu)p> z7XW2b=MaX{EAzIm$4TSs#u)1(VGkBUo?KI~c`3z)u>?Y%HL5Gl( z_6vXvH-|nA#nO*S`pTIIe-NHxatAP1b)xY{_#m6|^FQ3(04j5u6r|1W8KCue{;a;l zpx)nr7ZdGqnbWa=yV;Q+whg380n}Wp9l$Io=3#28t&%-Ov7hFMg()v&3Q%L7qrF%| z&c=f-tEGscJHwDIDZqOA+Ubz!;Z;Z$4ZE8s8nj4~gcN0JT?700x>n z!7etw>+VC}Cz?AK;OLc;AlCS-FdC};bJ&Rx#Ixn*B#kE#8XX7O2if`>r1R0HkUSJp z9?JD&F;QVut?gMz!$T>@a>Z#FJ6}LW?6XU$eQBmPT(ck-`#HF7){|&hn#So24v$UC zyS<#HL9x-r&Ut(ee|FYA{5K8SO^ zw-40ELzX-X(>1Uo+vmb{OKZl!q)n(wC^R9|9|iFOP^qqZ|S{=_cJ1CudJ@@xP3@thETkTs;76 zU+q({_E;6=VC8d1Qa{+c_yvTf<(^tUx3n&;pn}qLPXI7p!N8F^xov5F48juK7R{`r z&@Bd4B&e9l`>H!wJt1S+UzhE{=658&Shm$Hx-Cwi3xFMV{n6m>+xph1`?3u(cKx_{ z2e7nHm=D7afC{!G)A9s({AOyVwax8#sK=ajXqyPW_ M07*qoM6N<$g89{BaR2}S literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_72x72.png b/app/images/icons/368_kasm_logo_only_72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..9af2ec220f54e7c35e8ee3f686610381a9aa5e29 GIT binary patch literal 1443 zcmV;U1zh@xP)npI%Nk5;IIeGtO3`(W2qRGs?rV(&IrjqIm*b6v>w2@zXOIX{7J(e==0DnI>o*V{^R;0K zP@Aun$bSZr35u202~g<*y*KzL5N_}V@xvbx}qF~*CzB6{{8;AS;mKd#fD&GAF#SFuc)nqA^RsLH<@ z%I%!d;UbV);$6HV6T4fv*QmWbXi^|?;WVgE_{-v>$HRnDAT9Z^1XgHCdOm&;o9ODb z@gS9CKLT51DYCiPj|t7Ws=~U$cMz`7S%P}C#Uz`JPX?@-J%kHX?x1CcoZLZ#b9rcC zHsnyzDC##&B#BSm-9b(CvQ_~(Tnpmso`OkJ6He$b zKH;vu_$!FLfrziXrK=ol^f|y%V_FE?#m9CVwwNnujA~ESU4lQBax?Z2b%LAM&JqI3 zKut`bc}Sg1NA52_2W0RrNQ|H%mst}hTlG0b_7r%il!xkAkf<5&QF3@KN*^GCm%(kC zrQ4b;wnL$Apg4V&?UPKzI?-$^QYee30Q@Lyu}WKZGI<6Q+Rq~ng_v!>kHTh+H1vB6 z3}|mDLpCa#2g*$RsCvg}(C0)vO6}T|WGX$9 zEV?;uz~^(Cj6l>xjmSRbN+xATaKXua4(4~#633z zA^NPJ9EMEU%NTEnm&6q!3_`7F*?G;{W1LCXtC-w#p7ztXi=VDt@T1{*U$cc3@uH)@ zUPWm)EB8~z17znaY{>6-T6guKbK(XGTJ@*PakwB)3%r0>AuEOd4055MyQyAmX6AL# zOJUUGHxk+(pts*fXzo%}<>}uvuv}1>Za}sElNiWbFL7=9KZ2Wnu)?41^v^tZe5&hprqN8--_8;BCPO1`L_ly7l002ovPDHLkV1g0OrTqW^ literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_76x76.png b/app/images/icons/368_kasm_logo_only_76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..984d7a8ed36722d97536fd4e6e0dd7c8b605d299 GIT binary patch literal 1572 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 literal 0 HcmV?d00001 diff --git a/app/images/icons/Makefile b/app/images/icons/Makefile new file mode 100644 index 0000000..8aba655 --- /dev/null +++ b/app/images/icons/Makefile @@ -0,0 +1,42 @@ +ICONS := \ + 368_kasm_logo_only_16x16.png \ + 368_kasm_logo_only_24x24.png \ + 368_kasm_logo_only_32x32.png \ + 368_kasm_logo_only_48x48.png \ + 368_kasm_logo_only_64x64.png + +ANDROID_LAUNCHER := \ + 368_kasm_logo_only_48x48.png \ + 368_kasm_logo_only_-72x72.png \ + 368_kasm_logo_only_96x96.png \ + 368_kasm_logo_only_144x144.png \ + 368_kasm_logo_only_192x192.png + +IPHONE_LAUNCHER := \ + 368_kasm_logo_only_60x60.png \ + 368_kasm_logo_only_120x120.png + +IPAD_LAUNCHER := \ + 368_kasm_logo_only_76x76.png \ + 368_kasm_logo_only_152x152.png + +ALL_ICONS := $(ICONS) $(ANDROID_LAUNCHER) $(IPHONE_LAUNCHER) $(IPAD_LAUNCHER) + +all: $(ALL_ICONS) + +368_kasm_logo_only_16x16.png: kasm-icon-sm.svg + convert -density 90 \ + -background transparent "$<" "$@" +368_kasm_logo_only_24x24.png: kasm-icon-sm.svg + convert -density 135 \ + -background transparent "$<" "$@" +368_kasm_logo_only_32x32.png: kasm-icon-sm.svg + convert -density 180 \ + -background transparent "$<" "$@" + +368_kasm_logo_only_%.png: kasm-icon.svg + convert -density $$[`echo $* | cut -d x -f 1` * 90 / 48] \ + -background transparent "$<" "$@" + +clean: + rm -f *.png diff --git a/app/images/icons/kasm_logo.svg b/app/images/icons/kasm_logo.svg new file mode 100644 index 0000000..1de2030 --- /dev/null +++ b/app/images/icons/kasm_logo.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/images/icons/novnc-120x120.png b/app/images/icons/novnc-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2c4a4823058f09a2249907ba584ea85e89b702 GIT binary patch literal 2421 zcmV-*35xcKP)6I@}yhJ1tIvZZdXQ_RPvY`Vlo5uhE2(n2;K~!ko#aq{wgeVXdM1m1>;{U&MQM+5f zLT!6@ww~tn5iX&)6(G}7AXI`&sjvox2akK)rPjKhCk$P-NAC0B?GFChqJL6s-*7$7f zoXLQ6568|Z32OXstiGs}J_VkqB78hH3#P|oXWBd;%L6h0ozQHGR~d#O_&ZqKmBb*e zhbJY__6Sjf#Lee8$sqUzn1GMG}xY{19V67EP#P`symYFrfRh2eRDq@8Z#!w!Y};(;f4Hc&BC2YG?A`L~3g7`2IWAKE_Ydnp>`IkM#Vgo1c(vuQ}GQ ztq~u&P_FPfvg@rc$0v)ATxoS!KE*wF>tl7t9^;1pg#5upyDeHABd<$W!f3)M=hbcEla8$ssQ0(n-vbtjNqWNYJgPw`(P`y$Z#<8Y zqVYbC#1{L=<`!^o(rvioYE!3YFBz!EMUNC}KP!@PW^&IlLJL3#*pTXjBYUbw5A1pi z6IatG!9gs2W79P-ZsB>WNogPGlr(CjeC(cxOW+2cyvS6TUhzhvKLVMKCCwGE?b7Z0 z&D0%JrH=(2kx71xGLFDg30QwQs;0QZm2y%Ci&l;N)^nm`>Yg@K(R}~?VGRa?iC+nVYB6$b927dWIfiE z?d!R~II1)5yySq4$~poW*@;gv*~d}yuyBrt9A1RVKCIy@w>%71tV0#8bQ)G6TNPd|?l>z+M z`+zZ^jI!amK_r)ncuDiAL7h|!&E)~+Ii%B*Nqy%j+5LE1 zNUtm80Tu~##Sy3+VA5}Y6eR~PnKT|?bX00KsuWrpuWzBk)3wl3e&=$UI7q=|8L+5Jv{1BeR0RAk3RCMJj!rauJp3Xl$px)deq52XXJawp#+Q~FTK&g z(MdGO8ZwO2eFD*>TSLSH1J{N{26kam-z8=ChE=@ME>swHu{)YrmVIF)Ov`#z|BTJ` z_UA5$t<``jD-7yl(_I^}6PG=g4|st56~pB^-?HKR=qm>FrQ|*j1af^^^R~`z+4SOj z$Q)ZwI+!os({k2EGQ)3@&0LA)FWHrY`|hoFk_R&+^IdT5b;ZFHj6<1F8bZef#xpD6 z>bz*Zu?L)v2z-{@jth*tmoeZE*jb7Q-0*3J9@0e}cT#g+mbwf^KcPc zIpOgZfN(qi;s)j@?{(De@@x{S!F}S4R8<9}jB85ML-=*=2w)0Yi&XHQ-AcZs0w3Zv zS!eW~2g2*)KJFo>LP5nUl280b_IAo8P($K_ysSjDLd9^AtUy=5+|A;=_bgO*k?WEJ z_ZH{+%cG{borL_XA`ewqlM~!BQ=;|Uhr3}M`1A8yb->`lqEpZ1q37p~Q*|LpI|@au zG+Qdny3w(B3xm(;MHcVskwpkaA1Xz|DN4(vD3UU5<4h>!@MeyzidD_;0dGieTsMJQ zrE$0vfcVlNx&DE=+Sd2#<<+5W$w1#147_?VB*xzAqAcrS%9=22vN3M+iuo$3t6Ks! z$??F`0Y&5o*O!K zl6Cppz=W1-0t1&Fef?B)_{W~TS7~QiuG#wo0}pSaKlHHa@bT-`xn@Z{4Nlh{47^4Q zeUNlVJNN(?(Lv!czs^{`)dtWP}CejWpXWf_g9=IAG2ZKi41^=VR(4=^J#$)oA2&-w6{nLMS_*Pcyl<(H5Kz{`6+T$CQhJQ=O z{ME3xna-;DGi2I~o71(K&ipU`N5jhV*7T2YKUMt{{V8s?8=GY0e+J8A%gEK)-<&ti nQs!o&hDQ9yWWvMg(>V1HGP{OiGB`RC00000NkvXXu0mjf3EZ`3 literal 0 HcmV?d00001 diff --git a/app/images/icons/novnc-144x144.png b/app/images/icons/novnc-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..74e1926b46f13fe77927dc5d069735a057056a15 GIT binary patch literal 2877 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 literal 0 HcmV?d00001 diff --git a/app/images/icons/novnc-192x192.png b/app/images/icons/novnc-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..edf21cd52d26faf074d9a122427ff687cde96a8a GIT binary patch literal 3853 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 P00000NkvXXu0mjfOS2ob literal 0 HcmV?d00001 diff --git a/app/images/icons/novnc-24x24.png b/app/images/icons/novnc-24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..c002335258d0e13bfdaf7d4915de884b69b72383 GIT binary patch literal 532 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAB?S0{xVjhkykNEhAr|WwjFun- zWPn7#Y&aJ#1z`XcKp0G52Am5K1d?nvFPK0ksDu>@0PT`53GxeOP>~7S{>xj0`O6tD zy|-6mTGqN0RM^Z6?0dTS{z3kdEh_=hq=Hw?N@0k(#$l7h`*}xm2&N~ji zI1ryyHL=6hf78xwa&wpbTHQYXb4tvUg362q-}!tJZQon+ieE|3OE6*U`kcO6-m1!Q`I?Ud=KSY;k@frYe3)|H e{BxN8pWRhV;1r>XYh3Ob6Mw<&;$S}VCeJ! literal 0 HcmV?d00001 diff --git a/app/images/icons/novnc-32x32.png b/app/images/icons/novnc-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f3aa4083d78427d91494b35faab27756fda0612f GIT binary patch literal 694 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy2?0JKuI>dsFPJP}Fj~G~wgQnX z)=)MRmQH+%B@6vG$K-;_i-KKuA%T~^+U*A*`8k^A#yZvLOA9Acjy`*C{0?9Hv$gYAB* zU1)n!usTFZ|FrmmD_RW;r!wSpFXy{kSj}K-VZ^**p(%ski8|*4`x>^fwK8R;?wHRl zUnF>I8^c?RnV+}4+VyVNw>@|JIt7ZD4I|$&`aE8H_j#z}Ue@a&$0I_;4@j2OGChl& zG=61kH{fAUuzt@>Y+j@(YMU=CWuwt0>jGqb{v z;5HHdsYiPjd=nD+JZ*-tiHOJHZ!TxQ^NDOznz~}<{>|&{4sc~UPM&9>d{(Q9bIDG( zN0KuVdzH@xA5T+cIhb}LLh#uBhGkPVCWq+h6;!==YaHmVv$iZ-aRbv_d*N28;JImA ztXRIN=iW__-tjzj(YuPa8&fx$Z?xrJ5LUnZmsZ-$$Qu!xkMCYvV&9xqZ?`w_^{dZ? seb!>EE%Nnxa?3?ObN%vf`t?peX{skfVXsRHFmW(=y85}Sb4q9e0CCnaT>t<8 literal 0 HcmV?d00001 diff --git a/app/images/icons/novnc-48x48.png b/app/images/icons/novnc-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..dc65cc46772110d2a891a4024cc091e1b9e6de7e GIT binary patch literal 986 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-su>n3IuI>dsFPN-eFk8J~vV6g4 z`GN(=0CRyNKrRr0q^w@BScBLQH4qY_07$|aAO$d8V7)FT=fr^)$(0281v7ZeO?bCd zl3DQgE%v}kN)|;1-`bC6IXp|$7YrYl_w8yOgw`8-`5Lp+Z6PQ7_)wE|Cra#xeW z4uy43|H^-6ap~SaZ|1W_vWoI4>koOHxVpl9ihe>?_>-$ELpoor?pHi|d3xlcm;>ufgp4%GlbtnXKV5ZZ`l|W5 ziFr=(jwZGR-}gH6-kxB2e$7hh>x#6TfCau$dT)(i1 z++BH@N9W`AoHmd3PuRY=$nWDTE(n|Q>VZp4g0#NS0`sFX-#)vw=;VCeA{^Z+k$SvO z=BN0L(|Rgvm)OPLaHQ-xUaqx|ccw`*Ktc)!;-F3Y_g(~x)J?6r#nA=0`I*iA}=l; z22bzU(2 z+ljeL_bqFYwUf>bU7=7F^3NvM^W)By_xrq$sZA?=^K#OWlM`y+$-0|rg@}gedOqWx z_R7>Vr;vHi_N2UximJDY=ESYNvF=~N@0>t+2g45mb5|`rt6|)^IQfg*%~U6!f09gh zRy0}{&p7L4@*nu?FF%*#?9I!P**2^v$`5St zQ7hTmx?@eGm6mhPMb@>oNxPp`s4ti;S#sM@dV5KToBgLE?$n}v{1-lz+1y+3^et;q z&HLG392xh1`50Tr{zun&nG3^=NxrqVkDqgY`Be9P@*il%Vzql0uDHsX z(e^J_fpcc_)=5|G?>Fj7B>7E~zuLRzf&9;%^S8a-cIgZ-4>5SU`njxgN@xNARwd0z literal 0 HcmV?d00001 diff --git a/app/images/icons/novnc-60x60.png b/app/images/icons/novnc-60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..717211f32cee41b181c920d81714ff8d62460a69 GIT binary patch literal 1195 zcmV;c1XTNpP)6>0zg03CEvPE!CbXY4}5 zy!ZnO7?{}+sZSp`vgBNj%z2=MaVGLV`zpHt00ZMmL_t(Y$DNkf0;DJqMFB~Q0Tj&s z|8FiyMBDD!nR*nC6cug(0FYuoUX9Juv<&ZSM~yfD0FvXIEdb!++u}ZPAiuN60L%XS z>aKw~e%OrIkJS+jzhL&w>6%b$;1_Apy)HfvXF`_FzQC-WSG-Nf(MyQYJl=mWR;YFM z3bVGWY#snQj@BgvRQMLwS%u`jz(c`003zIb7?kwr>$F2)_71ZaP6sU?FlM#f1p5O# zpc2S_dcqAt0B~LZgh%Y13|@ndkcETH;P?xsO}>|x<&6bffcvT)oITxcEAZXo!AH@R z(pe7IGjoZ(o&98s$^Bq32qCRAc<=aRX&TQi6*9IE%&Ov5pbb}{0lo?v+#1l)0j^L_ zda>Aso++JVge?oe`T~y*;;VO?Yif%u_{?l6SBJw(znCfIuFc^&B}E{=@1YRh@vcwlTyl8fP7Upu zP4B{0jZXphA#-U68`m7JoeaC`tLSzGBohhecSUVDpx;@4iUD#7kzTT%A}@V;sQc2H zDsS3_^c}8FSQUP24h!t8imn0p95X%}{z{GCc@J2sVIQ#OIXZpez)Ruud#XY**T*#V z6|1ijn_i0~Ci9Ui;V3?%bi{ls&(y#b^{3#x#7K}Kvb~q*Ih~xx!8v@5rhdyh#!G4p zD7Ye0o=1n?l%{qGVdL5aDLM~^qPw@Goij#68lT-GyLCdiI@?^QV6puvfcE)vI!@rn zu#kP4TH8{8sOOARTdqM&GE;Q91Tw}theODqb_Zy(EExjxO7mabrtM+5FW$s9YIJTeBEDZA7?`gWNpP>;*2c@}ukwOr!KV zty(3u_hV4P`fbo1wf#JF-^a68R6>qd`1s9Q8l4I=jMm5_*Y&T(iz@U?Vg%WL@{trs>@>5Ky>X!fj002ov JPDHLkV1ioIICB61 literal 0 HcmV?d00001 diff --git a/app/images/icons/novnc-64x64.png b/app/images/icons/novnc-64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..0c34b70b3f2179fa4db58cf64e271084ae98ef64 GIT binary patch literal 1302 zcmV+x1?l>UP)xf~+76MMV%11uTH& z|9|t+ER3VOck{Bdk{n4pi2wl9%I!f^XN;+zPAf73D|oH8M->VHA0Cf4nF9dV?L{UI z%-gvXfT=fy$_V*(zAa#SJ>TSG1UA)Jk)YcCCaM#K6Y#7t^j*7bTTNTN3^zwRRE|y_ z0937W4gqMljo3eskA@@|O3)jL4X!BxhtV_EV9%@II<1*k|0aF;SvUX_=9 z?d0YHDPHYGeOxs|P7;9LHRdaVut8MDyFaze3cUgh1=JQ{+7VF6^g6Ga34FD0Gu)p> z7XW2b=MaX{EAzIm$4TSs#u)1(VGkBUo?KI~c`3z)u>?Y%HL5Gl( z_6vXvH-|nA#nO*S`pTIIe-NHxatAP1b)xY{_#m6|^FQ3(04j5u6r|1W8KCue{;a;l zpx)nr7ZdGqnbWa=yV;Q+whg380n}Wp9l$Io=3#28t&%-Ov7hFMg()v&3Q%L7qrF%| z&c=f-tEGscJHwDIDZqOA+Ubz!;Z;Z$4ZE8s8nj4~gcN0JT?700x>n z!7etw>+VC}Cz?AK;OLc;AlCS-FdC};bJ&Rx#Ixn*B#kE#8XX7O2if`>r1R0HkUSJp z9?JD&F;QVut?gMz!$T>@a>Z#FJ6}LW?6XU$eQBmPT(ck-`#HF7){|&hn#So24v$UC zyS<#HL9x-r&Ut(ee|FYA{5K8SO^ zw-40ELzX-X(>1Uo+vmb{OKZl!q)n(wC^R9|9|iFOP^qqZ|S{=_cJ1CudJ@@xP3@thETkTs;76 zU+q({_E;6=VC8d1Qa{+c_yvTf<(^tUx3n&;pn}qLPXI7p!N8F^xov5F48juK7R{`r z&@Bd4B&e9l`>H!wJt1S+UzhE{=658&Shm$Hx-Cwi3xFMV{n6m>+xph1`?3u(cKx_{ z2e7nHm=D7afC{!G)A9s({AOyVwax8#sK=ajXqyPW_ M07*qoM6N<$g89{BaR2}S literal 0 HcmV?d00001 diff --git a/app/images/icons/novnc-72x72.png b/app/images/icons/novnc-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..9af2ec220f54e7c35e8ee3f686610381a9aa5e29 GIT binary patch literal 1443 zcmV;U1zh@xP)npI%Nk5;IIeGtO3`(W2qRGs?rV(&IrjqIm*b6v>w2@zXOIX{7J(e==0DnI>o*V{^R;0K zP@Aun$bSZr35u202~g<*y*KzL5N_}V@xvbx}qF~*CzB6{{8;AS;mKd#fD&GAF#SFuc)nqA^RsLH<@ z%I%!d;UbV);$6HV6T4fv*QmWbXi^|?;WVgE_{-v>$HRnDAT9Z^1XgHCdOm&;o9ODb z@gS9CKLT51DYCiPj|t7Ws=~U$cMz`7S%P}C#Uz`JPX?@-J%kHX?x1CcoZLZ#b9rcC zHsnyzDC##&B#BSm-9b(CvQ_~(Tnpmso`OkJ6He$b zKH;vu_$!FLfrziXrK=ol^f|y%V_FE?#m9CVwwNnujA~ESU4lQBax?Z2b%LAM&JqI3 zKut`bc}Sg1NA52_2W0RrNQ|H%mst}hTlG0b_7r%il!xkAkf<5&QF3@KN*^GCm%(kC zrQ4b;wnL$Apg4V&?UPKzI?-$^QYee30Q@Lyu}WKZGI<6Q+Rq~ng_v!>kHTh+H1vB6 z3}|mDLpCa#2g*$RsCvg}(C0)vO6}T|WGX$9 zEV?;uz~^(Cj6l>xjmSRbN+xATaKXua4(4~#633z zA^NPJ9EMEU%NTEnm&6q!3_`7F*?G;{W1LCXtC-w#p7ztXi=VDt@T1{*U$cc3@uH)@ zUPWm)EB8~z17znaY{>6-T6guKbK(XGTJ@*PakwB)3%r0>AuEOd4055MyQyAmX6AL# zOJUUGHxk+(pts*fXzo%}<>}uvuv}1>Za}sElNiWbFL7=9KZ2Wnu)?41^v^tZe5&hprqN8--_8;BCPO1`L_ly7l002ovPDHLkV1g0OrTqW^ literal 0 HcmV?d00001 diff --git a/app/images/icons/novnc-76x76.png b/app/images/icons/novnc-76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..984d7a8ed36722d97536fd4e6e0dd7c8b605d299 GIT binary patch literal 1572 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 literal 0 HcmV?d00001 diff --git a/app/images/icons/novnc-icon-sm.svg b/app/images/icons/novnc-icon-sm.svg new file mode 100644 index 0000000..a775dd4 --- /dev/null +++ b/app/images/icons/novnc-icon-sm.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/app/images/icons/novnc-icon.svg b/app/images/icons/novnc-icon.svg new file mode 100644 index 0000000..a775dd4 --- /dev/null +++ b/app/images/icons/novnc-icon.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/app/images/info.svg b/app/images/info.svg new file mode 100644 index 0000000..557b772 --- /dev/null +++ b/app/images/info.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/app/images/keyboard.svg b/app/images/keyboard.svg new file mode 100644 index 0000000..137b350 --- /dev/null +++ b/app/images/keyboard.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/app/images/pointer.svg b/app/images/pointer.svg new file mode 100644 index 0000000..7cbb3c7 --- /dev/null +++ b/app/images/pointer.svg @@ -0,0 +1,78 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/app/images/power.svg b/app/images/power.svg new file mode 100644 index 0000000..4925d3e --- /dev/null +++ b/app/images/power.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/app/images/refresh.gif b/app/images/refresh.gif new file mode 100644 index 0000000000000000000000000000000000000000..cfa80ce0e0434e9a3d2f38fb4420a84fd3c6838d GIT binary patch literal 137 zcmZ?wbhEHblw^=%XkcLY4+e_=1f7dg6H8K46v{J8G8EiBeFGR2f3h%gF)%XdFaQBa zIRle-Pyfo*58nHwFy0Dh+%2QmSJLSks~k2-XxGfuZbxsbY%j6R*2zn-e!rVh**+#f lLA$;@lEosGP`?eo#ZQ6MG=_UpSYXC`2Hs}BV literal 0 HcmV?d00001 diff --git a/app/images/settings.svg b/app/images/settings.svg new file mode 100644 index 0000000..dbb2e80 --- /dev/null +++ b/app/images/settings.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/app/images/splash.jpg b/app/images/splash.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a600b5a9bd68e2f8a22c9bb41109465352dc15b6 GIT binary patch literal 95489 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 z
Lgq(VkIT8nRqDieH%NW5ZT8K7vsuD3bupGA@s8dy_Q`38JWwaQacsOE(szq*R zE?Hg-59FrW-*+X~B4sABLGZlRXF8$Wf-_CH=r1{1XEr1_&wAveHAq3GnV|gkZ8ib8 zBn&9k$r;cH@2EWy-AC7(0vFn7!?&j3??u z3W}Ch)0~lOx*9BOVDDsaC4iB{`Ntfu5?ZUOE;pxtX>f9NdtuN{c4jIT=v|2W*c!achM45(e{-U4j*V{oO{ z2KULkcd%n37uDCLIoArNJ+}Y`1xMV3vYc%W>$?S#xIE#NRrfTp5N= zN{+Ey*)rV%Qf>iNw}6)3MT3MJ$&>}?A0w)Z;+sLLXU$>#YWtKatx$z^vs*yZ_6x~~ z8_D8EtlcdjZQnR-V>&ym4Mw(6xwVcAai8w~ea+K&>C?JdTv2@%N#f^a9O02;JVF|&6Ka3-*#p#E?nmhH#@UT!VzK+_hHCS& z?B1sRXVCnD!CTLY%+q3ZSkn{|=i}tJ?-0rXcO_CZVM-S9PxOO0MI*x~F2lDvYATWWcRbhFmhw^S`bk8ZR? z9Y3`k2`L#Ksjzv~K>t{YLL*Zr;{6H9b1?_SsCIt+H}(^OnCe^}e$rVdP9J(7a)rkH zJBvF(g`J+kvLY)>wkP>)$CggPk(!SVr#xsvcm(1Ti?|{8?-G>Q(@mjXW@}YgjXwL} z)4i;9vTNe4=Pj5=%0mk$C7o$e*C4S=*#U20Z@REmT1P3xSvT3mY8&ID9=K&&^_U8b zH4t(C=cW=1JMF)|-{rm#5=0SF+7IW5+1rHQg)fC;cKlDw)rwd{ZviW|=BHVgDViWk zPP4hiy<31W4raaa+_Qi7;YZOepu;tR_-Y2`M%2bU2X7Zvz z>BO11tx#@NT=YHSv&%|`zvpH&9d9<`_~Ge|P7X!n!UEx=VDT5wU}5>}H%Zh{%Q1?22$ zT`F7^HQxfb)7Av2>i5DHj|H~73oLPluI9*e{Hm-Odu+ZA6Z!d3zOL-j_q@U8#&?>$ zS(i)8cz=3MY{s@?FGZ6)Jfudt0sLnsUy!`Xb67`)S#9Q-f$-CmA?$cX&{GF?t}z+; zs#D=t*Hq&tr;>yDY=tcO>K)Ggjo*w)%S zy{_LEtjEIns8ti>p{Se@2JsAALE=wf^8YCMJQ2N~$ICaAK}Eu_#Gm9-3-SQrzl_NCZ&;(ZHq|mXMN|QGP}+ zM3H5mPMx&gN0l#VCt{#%zi=2G)> z`js;f-LX-j+CJKNB!uMIl9Pag6N~L6i4!3XM$XW5$j3ibr|f+CSh!ea>H)SOV4cn2 z`^nXTUo-X;hf&X)E*4S|5QL*>20kBdS!wi8D-l3OsC!6ML=Bd10SG9LjzeDQQ!A~} znu2kF6_wLZgD;Bgc}A?`#7k^d6)!{}h|7q1SSHm&`Gb_17Pi4?Lf!E`hXP#L{X>hzz6C)>dV!683^rLH?He!x@LW20K?D zzHQ?DoZk~`>y+~fHJqz_AU#f==p*Z9V#_yW#J0oOS%q#H{-Ao=SFY>oo07HyIb%l!FW zBekz9SQDl10@mz#_HO~i#25)=xGv$%OfI_Ky!qFT>_oRkQOfM8XCM2DoC_=Lsv-y$ zW;PN0Pf_K&)vq14*^u52`mxW>;mh0~P#dR~+A&W`)-I1Dj@_rjiv9B&hj6cYQjnq$ z`7<=JgRVbNu&ULCdQQICn%U}YRlkjG+vzf|!DhYU)|4GelKz3ql#Ydi7IWW49W#rx zar0Z_i2iXcl0z5b>*aYk(NqKYvg~z^W!>~}0PIv(?a+Zs&Qs*{0E;t%f)nHCUgx)f z1h#)U`SJDX4obmD-u;Sl{Yd9{B((;3fHD#V#Q@(m`EXOO(>pp=+=yvBRdIAClgOyX zJ*?u2t>i)Fgx1^YSQ?yygmZKQ!#YIHiW;8$AO3Ln^uda5%2`arzDP$hcQI>wa(AKe zwuH(Cf&7e;&1c#%;O>2=6N4?b*C)Q9Oi}CqF z(Lup$3#!kf!K>Yt>zLPq??@qYo$36MIG~PmksuggV;c=Vjs%4uxb9c-@x}JyQ>R9^ z69`d9;#MX;H?V>lZLL`?_*p}roTeIlL;x|2L@{y+DaNf*D=BkRUz9Pzt-5dLF7LfL zcW-3T&rEdNVSG_x(@|?Gdae^K-d+dPnNZ8cH#-jvrhC6<_%X){s@kNFVIYT>FO z$YrJ&^Q-+$#D@jOXU_fpI+HO02O)YV*F*+S)u?#Y@CT`8gXikmzfN!IInNOKvU;@> z#FN-%)zmXPFn{pBmbzn2+Ia zbSkpTMefapsQEup`{Vh2uCc>SzHvM;Szv#yP^?+{ejOch)TftwNSCX{R!YGD=qV10 zd)J7np4Sr`UYi^6$Ygn5Ij_!cHu+#%);or8ady!%$HaobU*t8bMvvxn|M8}W8{gZS zl!fMotN{CjBiLwyN49UG!K`XVTpTKmgmhDhfRmP3Pp=e=(!U!{s$KJ`Dvx4OQ>R7> zO^sHHBM0IL#VQ&M?|vy7LPx*!eTwywj_#p>o|ekzxvYBIV+*4<`QVrNk)_?AMa7YB zLP6S#v_h`l#`$`A1Mbka-257bq=KRwjlP}>MQDm&=hakQZZDJPDC-m5y0jmd2Z4S& zp%WuGVw&58^~06zWDMrS>vV2K_PyoUpt*CF$DOcGMU!Q*;=Y`5jqh*fOvEPRY0ZK^7}$^3>KJIdA~6`XVQA zVP(9a=4p{lF*ude#}L?ncD3DCVvX&!waYqv)P7QF?T2-5+&j5APPw++uz7!esd0WH z-ee$OOm?K02vxBunJQ~$xvByX}T;QO6c9U_reRV*E#km@!65$c)kPjgQ+kUV`d z$@OR%`J-RoEpsbmO~4o@ddw7k65OidOGNnGc?0;V`vTeMY4Ot-#9YBGU~m8T^xLgV zi|&i7uD4HQvB@S6hnLR^L#~dwhhoexTX#z4+X>PZa*sBGe3l^F)&C;Di}hpB6w7|plk$?~P+D*`|E8a~)W8%YwZ#nZP; zc@681GU4S=doaQK-n&r}`QE26tAJR%VsM?3nxBz=S0OMW!2r}{%fNum6vzaDBBEwK z>Gd>k1k_Edg)}CfFGR@4`+d7GG3N3~fBmE6<7K>JTgFn)rzT{#s1ieJs+oHOcY_m! zh7wx>PVl0yTV8=a!eLT<62fp2oQf+R_b8nl#fktUhW>Jdw8>~@{8S%=cqZ@*HOKwm#v_VWK z^SoB6BhxC>A(X_iE3}HJ*$1^GJ!lAP@WktjTfkdS^O|Bn)D#bXi_ZN~wZ|g^It>Ii zkGE8GF{dwrECPd-U5>Y0`rZxiKzARTMC?PynruY{lw&%!y$`S<@*eBIP8v^t-?R!e z>AKl1H{Ma4%Qnk5D9|8NdK}jve$eIwE@-v#@&X)EO1JScPw6|!_$ z6x{XNwkZg7A>ZdUVYLfbdo_OL+uuLi4N3O3P8{&b{o&}!3q>yI6v9qe@b#?`;J}&Ln34SMu2p3;_*bdWX*mZr<*8_mVGF`D0 zWu3fpH^$m^$Th2EH(pF5yqzICl+(~-@VuPhb>X{d=7%0Lg$;{QLVQ~Frs9LKwFc9> zzMlRGjVZccW0016-I{y96;?v|P7-iyxBFQs*PqXH}-(Q7Y(jcTD-ZGPq!V8D(e zYD6X*Lc(HpT18IR_vaRhRg=HL794RxGLjkf(1}9dE>e=DT}>$w#EhnGDP1H|Er~4q zLZ*}iBEc7pu8y$PmkZPWV<4+=)BEvUVJXab5XYpFgcY+L6hEn$`813_%svx}_}FDO znj-*h78cTJ@b%c%0Q1NA$?{4!GCc3gA>`|=(R5Wt)6~f+GT}DI3XaHD8Snt?T^m$v zd(S1|RlrThS<16tJ2)o-b0RPBFK@bVwUqNB&{EQ6KMs@5YPE~}t9&KFHE`T3H*gns z1IDk1%zzj)kg+q=1#lm%d`8a9S|Fv@)qPb3oz|S4vg5sHUBC^o>KM;@SKY?ksSAQzcr8xiGl-F>wQ#}b94NHE6wCJ{H5;U6u5i1RVSrRsL#(t zsL!5G~ZfkT;+ zaE>)^&W@86!CQcNZ6d#uXnSaqez^E|3}ag2j#!&SuGvZZBhMr9y`EE$ntWYORbnWa zdtk0{8K*r zLCiYEBUt7a;*FY58kk##WA-VFejVawSaGWx>_#qRFm(_$-PNePC%Bs?`&Guu?!_31 z=lHeYQ9xL|twjZn2?rGHKe8otl!dKWt3#zXfeToO^(LUnMxA=O+`!b|9T zj$TIFU|d)p?J-f*TZ7nN=+V8&AOw=s62)oPJ4t_cPWK+3N=y!IPfF#Nsv~prkh&3| zb8D7b=v#SJuN7FY{B(?~Mf5@D8VD0Znic-mIC_taCT<#Vyr=b;K>SM**Mi3E{2>BD z@-AL=bjnHX+I&QOFsvhO==Y;zX$$kFEsN)KllN%~933MU)>08%hGvG*rQ-U`Xo()& zqS++YP|}a&LDEvs(5R%-`YLlXXs9FZ_ts!~<^S>859KfsIo-#GEi6kLpHj}c0M2sAb9@3-WGVM2J2FpPM=> z(heSHlZunF75|NVKqh~WMf3cf%qTcH5KU8!bM;^69BdVTH`u%dU~y_cTZ2jPk3PrJ z{+go(O8V_xbFRsWAIEITF?V}r-We5wGH_YXbz_Vf!JMCSNKSm^nzwgf7@zn++pA3a zntX-DVvy@ng_I2L)8%izOlChISA0@NB{u1BCCL3Q(+Ap*^#L>bLY$4llk$xsnfAudlhKG1-?(P6I+d)&ohjWl z=OX?A-3sXLYcIKHQra5aC>lB%KHMuHQqIHK_QBcsT-oit>pdG)#ZQ|;*bP(WhZ z*yDW|Nfh1mjtV= zAXC`dz6@IY7D$=%{o}DOyKzO5+?~VX`%_%#;aUt6DI{GgLV>-I>(6XPm1fOiUQUYv zNISGhgz#gKy!Fvz@)o}rLwf1-%PF1Y4k4}KZ(P)So8?)Ii;J@m@aVX?-w#Jx8xh< z>({htxGf`R_baLl^9Hit)QGwfxFRi}ds8Oudd#WIT-AyOF#e>z*u8l8Tzp^hYc9rB z$zFb+2o(m!>}39EIv()iho(Jljp&jXLltMYX}vZ{v@@~q4nO$NF0za+7H6}h@nN+} z_(4V-7dLMZ{_iV7sA~6oZUGB7hp$DrZ9$>ljeEFAk2cs-1IzvK`GC+_oEw(3bqh!y z+KU!Q_ZqqBNE8?Ub9600yfxj=v2jd9TQ$PKY8Ayr>x6EOgq@=bCi)HWzG79xF2mXs z9OYC7iJmIViR@E#99?oVh*iv}6Z2(@ zl8P*xoclv`1ikoC|0~Oii5;kq$Djp8w_owS5Lb+A9h2+4cDi#@AB2LhW0R6{jglY{ z5jXC1>Cpi&(_u46gJl@Y|xQ4GXLQuBCd7K)?g zv#R+I;sA`ux%k}ur9;qtEtd%_Rt@KDR zF2o8n1h-y!?Fz2cw<2&YM~L$Cv+diwxh!X+d>!b3@d^%Nr^R08i82;pHk^}PA35B8 zS93=QuP@3b@Z_=-7Y$cB9Kv1@aP?8?=e5IJm@Y#>+|>r%2l$|LD2K79*K}We`O}X_ z;LYpOsdd)tV0*E}qrI!Z^U-=g`7927C`4Rf$kqt0JbV39Dqj00ZO6Ei`wN?f3&?XQ zB#gwn*@34L(IIg6?Wh&3n#E|6GYVn9<|)R&)sG-M1JCGxxK4 zjTyW+=>3b_;pg=#3<@uu;`3kqHfiM75@KY$pO(5iq9;_gHM?`vdX&Jj`K~M2b7wT? zQ6x>Rk~V|dRE8qZtZ<68hx9Xxzp<+MEWgA6&8Ri=QEk(kZ!DKC)s2$UD#>%0%pALHQLIb(Ps`-hb^O5P=4#qynAvHk z&Rc`UJJ(AJ`S$0bmYJJj*yAo|HS6rHFL8^9-e6Pk1uADW9n=%&oZ3T`%Smk%|8xK; zm|3SRKyV*zjMEGqNPVAuUfd+Bn)2zmsiJ|dtbS&^hK*U4e+X7`D_+N!4@4C*u(!{EHa4(DDPv#TDp39i`4~mN8tX!b&(}fBH~xd* z;nj6@@_|hOlfx0A@;Urd*J?e@=Qd>5((xwo(|Q_w5!{lFa!hK95jA)R=8q<}sxamX zqpxffkEByyfOB!7eN_Z-3s+M zY^7^CyswXWgF|jn^%Rw2v@_u{V2BXjU=6IFD9O9Cf|i1% zpsIz`UmhN{^BaBxg=W;eu69qXA5c&~I$+VwEP6K4YUJ07(3vQ+8IP+v`q{ldR7BlYJe#i(2w)Qdv{{U%@k_y?fXtMz)U|zf6-?a}@SQ zTZ2RWmNRAbT!)OrA%lHA>R?0qm^@UcCA_FbH`J;3G{t23jpuPeK$@WhF)aguxc_w? zo~+n-MYhOQa_CKZ#c<>JkXGBT0)?oz^Gqwdyd)ZuoCP{|29Jig_}`^0`bdiC$_5Um zUad3F>wp}3Ie%}PTEzhAQyO6f!0mG@{#{MUvNi1qek#yZ}I$Lb0lqxUEqH7zLRLeD(sic*!}JajDjjxzzc zFpNhC(#TFRYdm$ov+5w{fQ>q@`txI0p*MH(^&nO?xLTV$;1pPM&wY7>%-*vIrH#&^3ykM51zjr*E9HKc3w2InT#Y6LA}V zl&V-Q8V5H*bTPg`?_XPn{}XJ|*qzKLHfYhDoS367#)BEZmWP_Mqgh&9=fGOR_}uoy8Lf$+rf^O=m9C>d0a zpIaLbky!*`N%@1>SK)KH5Py8pN1pVAq)w&Xx&iQG8yw$n!8NJbaG$N@&im}R1Q$gVoRkPj<)ozhJc$>-K~L*%Tstk56PK=&l6oAp z-87dZF$v6NNFeS>VtDpqXnFyGx%22OJG;P>+Y}cR;5lf)ZCW3)|MmVXrapo#c-~aY z&Pgn*R%|m5!O}q)Vw|#I(io;D{|`l2(tAr01A$5z9y^=r@wIx! z<@pyQJ<&^X#uo+8@-zkyp`-d47FGj!q9Rn1Dt>byyk#$*85eBv`m%BCbo!;3ap~(5Cmc5eeSNBr3`}iQCz`&Pg6^k1#o<$5HS?ea z@7?F2*|Mn@watB{&M(`(h^^rQf+uS!7M)y%Pp?7G?6*2%4zwD}fA4L|{?kFTHbW1; z1*Cu3^2zfB8~@frhlQ$Ll)=~I@PxA=jkEO+(7E=>mXX%W7Ba_;ES1kKcI-|kJKMJ)`(ZCr_e>1ag&O%x|OTFQGM$wBpWmkE!Sx;&F-vK zStAXMdla!V%In*m7xxa`(_$dVtD4~nX@|F~pzd4hGAAxHXhKZ6r;zNwF?5eq!Ie#! zXl8f>k*Ml|P&TL2kugu;aSt$zaO|PRn0Q-Q)$aiimDXic=_d?`66o6@NoF#Tjo#@s zWtEzmg;|rSVU2rE#v~IA=GBxUL2gqF6$8nM&70))Yl<^xw)>1eP+K+R$z^4G2XUR+ zb0Me9D!#bxUb=;)vB-E`-I^ly{a=^t)FKbBgMt*yVpv{08LXZ=9c=vCsj%1av-KJD zQh%mLw!ePkq0CKNk$VGntXLD|(jh&dFxm?078yIe1q^PSdha^qXKOSzJXsz|xAXQ4 z`O)dXXj(Lj>&T#yR%u@%j5gk@&!+djIU|fU3`*1?TGg~56<5YXlN5z?U60=ExXDyahCxv{J(Og?*q5Jae(+zc7Zfh;n zky(QOIEg6C#(EA&;8+&o8sXBCJwGSS+9?)^zJ}*QI|OWR?7`d>bEEm1`ns+LrGja% zIZ9{O5uRK+F>l&lav{EOVrU~>;1mOyHOjC*DoP13HF`9xELZTeCi9eD5?F2z;foJp zMgf(rHR~P{yCCM|Z8dR1oZOPdo=b0YN1YMPW(WcMI*fS2U0XJ#NQj8??Zhi{=;?lN zn2XNRO*i(qQWfz^mrJTjSOs~@i}w|gb~LG4RjT}%PgH+`CO8pB7pdBazp5~h zhwvb?l$*_t<~&uoqzt~Pe{q_s!$c}sV|S27I~(P%*E_aPzyuUM@Znb{vWuzO_I|kJ zzm;yTU~+7cxj84y$6`c~D`hKHy|Z{C*&+F$wD!{`hF+C-cd~YWK&rKVJ$e7Q?(wwD z>nPuy%a*ODy6j_;qpCXB`x;`;>^oHHxQr?s*eqY~xpPq|W3$KER(lfkhUo$l3}R8*7|Z8Ru^ zY@TLK(rLE&)XwCre37Yb)S{@5!7EFf1h@0=M%b?by)2xj3F~NPD)&ok|3-{ptavMo z&@*}b(#M-=n+7cCCEWh!tEu|FqAFf{tOmBeRz^!;`{`pROZ*?Iz^`JA1d19mMnfm^3E~ESpDFlviU8sBAH4Jk7q>qY;{zN zny(5t=;8V?DCMXK0NZB2J3v0atSTOI818zbYr zKd^ksn4GQ z5HVb%c!kuwIo?B%`nse7#ZmDU((?}NSn-vTAR-P)j2eH%Zv-K;OPbV}zmE+q_BSIB zx##rD8|d$4dMzz)G-x^38}Yuiigv@)!=L&2PT#rFY?BOySsmSIA^58hG>daK;_W_x z@b?HV0|xRI&OF*TraEid;4osaHD9m+9D!9ek@6WTY*L)m%wYBqp|7^7Acw!O!Ch{G-OX5j(+Z4^9Hc29N}2=Qz7|e z1$Far)@i$v0p)uAM)9w4oLEV9*bSv;RRI@s8$U3($$YdkgxGFEvR}#xu z9*dRDe&3j$?ygn;rJbX9=^*$)%nM#EWg!$TkY@KT9W31V$mpxU8zQd5XEJk2{Q=&3 z%*7lTG8C9yMxUkP&&x4+?cX;-_J^>s!A3k}(63#tR-7|06TrqTR1e!Xj+_$=1!XbtS{w(3e7e#w=lfj7^q}^F3|I_7O5g z6P_J4R-4V@o|}!_6dZ{R*ASW0prEbe+EvLfvx~xU1|DWWe+7EGn_m&tpCyT%6Yh+U za_~3cG(AVTe>%<+@(eFfN{!}oX2#lgUY8^l6*$K~iBMZ1wb+ABSpv;mxtZRW4popZ(Gi=mU&thSno*23GSoBFD7ZC$InLDaSKK#ol$ZP3 z$9}wZNMBWVW~sGe(p5mUn$50oICpW%{RA+-3w-k&+)Dfv6U`&IqG9@(cHB;0&|32y znj3-4et$!~TQ3HA_FIV!@q7c~4^?~|DQ2y4?;){9YJ3Z@A`yIS80GRs(?Y}anApuu z3{fLd!AGny3Qkmd{46cark570N<&Li^EqESouMAik)%!z?2k10j1#e7_db04wMKVe z>V(b+6%n7woJre&-%g{TPAO+uwzDy&@BzzyRHYMUrqC!HBK(@k1=v-X#{S9;SmFQd?9c~5M+ff8q3vnA6wmp<;3x^n6nPKmx(wQ$+*dsa1! z9dCr!dI@!sQu1N!)fW6vbh}Zu)f0~j@YP8r-%}P!EDZ=WJB_Nv5t)blv%scXx99Kc z6ZV#ks=LlTXY%qmZRpJc%1X~Pl{)XvAR|L{|5@8uHHmf&DG4bCZ*jDqdGF*h_q6%! zsX~&>xs-wuoqdXKa<$+#Z~4aKJ-otxJ<2^g zbUoP-3#oP@(I6$K1=7+dQ;;dDKUb#@s#I+NS%CFl`J7GYJOzi;F&Bal2d|FxZUIkX zp4>Cbb{Bpn+1oc@_QuC~bt?RBg!7|0Sc8k1;5!Tnfy5N<6EgfH7(}XujUVTVDZj9z zF=o2$Hk9kc z)3t&ptB$4-eKtc3P}ozHq`v*%w-Aaa)DCuN9ya^&oXC;5PwGGpB_pX zQD0$pYM+2aCn4mu0(u7;BG0w4aTVBd5vKFD0&4(HIEie=@GEYbZX^34r_C5gSaXFe zoU)YH7T(TDE|D{Wq;5W`;B{gy%N_;SD%on-oG39H)SjqTPzo+gOfsN1HeZD|-zQ-R zfoO6+*iKT}u0%LSk6svfqouZfMGGnEsg_$)m?E=zz->y^f*)0|#W+<8>URD-AgDPO zk~*+Ilp=+S9-An=FRnh}w-AR5l$)>3Ar~Kf%b~VnwR9u9>|QzydM7t{9il!L8us+& z9a~`AcKQ9un9$j9aVKk%iNHcq`Qtl_wM3!EG<`k@y`}L&GouYhkZCna}fy zIhHFn1BF>qc?*=2z7>ex>P*o_F_us5h$w1GaH{MBO z-KWrJas4cki&dDOiyGELDG~Rr9l2A@Z&Ml8{0dJ!tw zZk$|&=bYh}7K1PhM|nzBNV^u8F1II`z43IKtogK1CON|6^R*sx1RXN+XvS?tkpf17 zvfn0#rbv|CMLO#R*ITla_AV9euUx2QXQ?aysl+JXb<#CpHOM$>nt3e@8`h=WDK+Ei zD0Zx4>B{C4>?Va4L>-%2`B!sTeokfKEe03cB&RK(IvC`&%vQq zN$p5u#}nAo<>#K~fq!V!LhR;tq%7%NTiw82&ljuiuGdMtM}Il0Tph&)eItIksS&v3V`e`}bkYF9eKC_=@6;(+vP+Ddfy}?_{ybW|tBp{C8MF-Q#ZGY~el%(8 zGaZOfb{j`8&$`C2<3uW%y%%pqsPsNnc`>%12pE+~h2Q^F8hVtKU1VeQpe*D6W9huZ z+1~&6e@;t{qDDCOUNKtKOqJRZGqECCMa(ElsZpc$CRXg)JF!EpDmAJ$L9528JxZ&# z;(Xuz{C-#ahs4!O|M1T1^}O%QpYAvN5COxpaq`-K@;ZeLLax47byCty8SF&8zFon#Dcd^OwC?Vi&!e|_ZN4ux@vbhJ;sdsADvt9N?_R9z8)LCP;u$h%zpRtIHAOI4g*S}Rvuyv<&|%fN5X4pGxoXeb4!G}SOC z5uMG#Yh5jE@^34^GwV(~Os+m(VdFVfU9P)4l3An=TWTvw%SWPu^efHuA`|8{7o5Qz z2-yRRJf-(R{x)O%U7S@Y?xFPlnCy|*yLM`O1P#rXYO)k9yuA}cC= zPZXP=6?&*#i3z2eklD7oR5_|JwDk5;#kU(Kv2E@Sp(K*tIy%oNeeTN1a~K`>T4E5p zx$p}1p*xQCRWb&-xZszPxOjkS=m1^-Z;%$3c?ixAmzk;}P6#>8*IHb-> znlJZE4M)ccPQi0ekHS-rI1=*MlV#xm4^l3~94tgNeaYz_U#t9dER zjL2i;-+e)%Ti;bk-Y=VKtQtSf&T&qW@*$9U-nQcl^mtvF+^DD5S=0I)6V9-!h9-28 z{>Klb#@k+UaV8~c7TW70+dDbEJeQ@+O%Zp^BE(Os!`3T%Gd&~R5(L`Ls-L?h@FDw{ zNw!9E5#p@czZPt%ud4H4?@pdai!4bf=EFJAlorpU42|u4)6r^P3A$em$Robkw>W){l~vmkks`J~#Ifm#HnRBs zuHc75+IA1~;q~d|D>=;X(MHpnu+ow1HkS*7R z#zA8JfX!T_T_#U2{ajJT*HOFJvP`m|R7PFR5btgItaP0T6GTeAZ?EYDT;y<2|_hKbGSi{pD6!RJr%7wDosi5woYf)0&fFq{# zs?X1V5Fu76HCrrKWd23*lQ0}enKtCIk=(cQqQ;0%PS9p6_0d4_a;i1b~p~ zpG5IG)z<6I%A_>iwZM5_-YJpTTk5Z|x@1D42l@>dArMWNyLv2{5>~BHPfhD)6?Gq0 z-3F3g;x&|Bh=cwwbCH@TgEzFdDA{Vy+1Z`Gw|e&}{`1M|Xd8OHg3Cg^QmIxw(V(4@ z`R|!`{_M4m6Gkc$6L`5UL+T^j)t{^IB)RcjNY(W0`OxNftCa5X{5s)l-$VBY_+iZi zVT3fYbA;JSPND(VC1g9O8p|R&bdnN%w}N}=NbrRjQ2+yQV02kNLF@6uMFlG01paf{ zdF+EAVcWUE>3r2hA5P#II=B$Xe9#2&!~^QvqH^vxq_@OD#4VG?phv|didMgp-4ACo z?3dRSdJ+LiD$AcpL1}~>n$b`FRJ^AYqcp-#LG^oXHs+!QpCXkp8t5~Orx|l-M;i$x z{baDoRa?P-57nUklqKpuu1ie9N%D;l+L-MqVl{fUek=u_+=X{}vY$9W!z)Y4Ub@@? zxpP>>zhi9ZXsVt<6SPIPVXL}*IhKfKox#&*-$)Y~ zE%oGjQ(sfGxm1&FdK8(soG5|jHk^dw! zR8WL)v(F@UUC2c!1)3pMNe?Uk9ljSQLlXxdu8GE@E98a-bG#>3Z)@iW7-x%?@wQaa zs!?fTfKe#jq!Ne|g)zl}p%QsLhJ_K%5n+ssNC9IYL6Hb&50e8TN84dcF+hSAfQdEf zu_j~~Y9wD+7JxwmL3>7OqyRs)T}nDD6VO6|xZ)|Xq{D9; zSW)_LP@7AFtyJR7N4E=q&S^Sql){y?2qK=W8kxXV-$M!(*-Fu?=Mp#G%M37TL&TEr|eun4{DN0_{v$4p9gVMK)Kw3}O(< z(p`~F9LNMLEu~kroeyJSE1_R_bFj|93>9|^k<64(f2bJq5&mdr_J&ZK@ve7(e~wYp zj@jd5^zh7ub)8YcDf-9WDZzL1C}V8e9w12sMGtsC{)sE`Mqf|J#=5G`?jZ8EwGE%^jkYY%-Lh1P z6=PyT%I4DZ2S)(mkYIi16^qi--J#i?(__vq4lk7?|Bqyg#RFv$x)~WL`*klKmz$Ad2Y`vbL$AwwFr>Ts#b4Q?w$`P zWgY69dGf}Bk!LuU8FI9%bG76PjnUs4CBMs^zFeEHy}S$n3=iYxeIGUC2q+>PjEt9< zvKgaw(`ICTeJ#Vn(vX391o2ct&8PS1B6Enm)n8oFH*4oHN^e!3U3%!^-Z=Ky?hpF# z_F~K)mbpR}5X!KJ-BNNLV3)n~e1qcD4zJltSHZrU8%&;}C(W`lM$c&70;ilbRvNfJ z&6Ko|P_@~+H`?t??ed{K+bPi|e0;QU8op{ieryjFRFEFXl~IvN!vMXE zF%BtN35N000}*gZ+-GU9=ARfHz*+wJCFYG9(qq>kOzLgK=m{yA7z>&zIHvbdk>AS! zGH>-00QN!O1CuhF>KU&}5~&%@fwak8xD)FD20xMIc^PjMHG2X@A>|mQD0cx9QV~q`J(_$_)8U#RcmhrytVKW4MsgJ_Jh}kL}%jzjIn`vnBZ2gY|JZSO44(_I6ZTo6mU_PRZq${Ob4X%7ri>7sO;r1whco zg5}iIGIQCizKw_|A})QDALYJ7|~5<6Z#Ge$0#=1aB~Eqxc(9o0Y=ayc5oPIZJSNmKu>GQex6PwTh?>HqtOL zGs0X5hX`)FDV}er)E#zrumXE&UUL9ET=`X^-+B05MaPFjdvx{BNa_lSE_#`=&poMH z)L@6EjlEo?=f2u0eHh0$b825QPbX?$O(nJW>wO4Cf`&b4tsZU4N5a5T2o(IXWoL=t z1w=-iw%#pT&k;}^y;U4^^Ciliw?b5!%?u-x9(HM2_Mlkd>O0_jfF1Mn$Rt2j>>4TN z#8@jqC4lw2M-KqlPTqh33m-aC{N3_6#PyJSF?w|LP$V7Tkzn=OdbFB{mEcReDVcDl zvw>#jh&RqrK*^9^mxjhmghfFo2rv5vt>=-W>uW&q-0oS5Cb&aL?DrI`eqw>XUcCW^ z5_oRX`YJ5Lmjze)PfYW_>eS}cFF_`mPm4o7UVf|Ue=)opoE5TA(eu_l_=(c`ZykUn z<+S)=Fh0-*yinCw&n-xJF}~aWqcWJqv+Z0*x&6vvQ#dD2Q>hLo?w4te)&BPnF(vEY zwWJdR;4!xX%a~s07Vv4>$X|wGI>YX-iDr+G)rrpGbS)9_j~m?#;eEoPZvs|FpruCQ zqtn9%nMRxq(<3XHoB`diTtg!dg!FX5^Bm>SLz@HH;V_#UkyR3t2?>Jp4eQ_l`*j+L6 z=u6Y9WxRi2X6BRR=n(D}q&4@$a&56>1tZ>2?i*1aypeUhxif|)z=2TCmd*3)TJZ4l z<)z1nr-C~K+dO0lmX{R6>lZMBr*}~tqfayk3*=-mU5>Zl4qPAkKlbhmR;J!j397gu zGjv+Tj>V85e<}s4QHv?@RxWUcd{*6N8b1o7NAiHXZ|0Xv6iQRS8LUiILPN8%vZLxu3?tmbhPC};y67M(n?fH5R_=^rcR|P zC|Dt-4mXkqbJfpQv~En2))RB}i~1M2B>4JGv-p~z&Sgq}E-`#@CS%{Hm^OwCkslCA zi!$Eg%tAmD5v`h`IZ&BGHxJ3z;#0h4fd$z_go&l3n=yWIkp$IS9fm24AH-SLRlJ7? z)LL69p8xJPcS!kmDY2>;G81IfY4aTF+6DhYAnJgq> z4SR|Cpmyl`iOTMm4#6L6=xdGALyz)zrgt3YQmzc9Dqc?(z`T(4eS0LR<`N9~ON)Nt zlaJDE>9vZ-(!tm-Wo*X~r@Zj}4+sm1>(=e$^B>y*@zUx{-RB)%9v ziLaHu{Olfl*Z(Ty$q8TExu(PM6W?onqN?I%risF*`h^tg0a>st=pE2B;7cZCatmn9 z0E`=j{{1?7VZwViaAtMO_|G#@`-*#zbeIBI@Yv1 z_sTIwk(@vnjXR8YvSIA+we6|d?6Xm6jQ~wI5u>Jf*&tDF-Ca5!^icJ{ zZE*ZTzfN04{4pj`Pi(PHOfPCD_#`oPt#$(DIo3 zl@VJuB5DN9e1oqyHKLnsXEzWHIG0lIeQ&P&HCB(!32w|qK<^B}px8$aBUe?Up~h6@ zx7sI-$@7nqBZ7gxK4#9qxdW405gYc0JEdjWKIM4*8f03PWTioMuN)L}8-tw@CNTij zJRBOPmR~m*5w{=A4K|B#w{ZSgssSWt?}`2LdPzIO?}&d^q#7?#25)sy&JuR)HjV1q z+AG9ck7rp~sLcl$TAnwC1n4dxK=IVdmJNjsvA8&kl^E+lOR!h`%4Z$TXH_nNMJ>KY!`>S$wnn4mBoyh94}CkcldU>e?1<#M_4B994dZ z^v6klJlTpnZ{`CPE#h*6kB~cp5+280t2(L2o^vb#+*a*MiW!IO>ZtUHu;`Iz{38*9 z=~Z?|h*_L-(M*0Kg?SJ#?L`Ax+T}A8A~IE08#}sHa<^P0U1iTDWn8re5Fv~&mC#lN z1y9d53-)*_l-V54T+jN>7A{?ZdV}uW=#Bo`G~ghdUoY6ZQyJ*|n||RE{pP9VG0#Z| zrF*dFuu8c{US^1d0>8J0noUBM^n;c9xL#Q}6(s`{$>*GGB`5L{=1{)CM-XdrX?zkjlEFV_?4c9DO$s-MZ0o98+fPWe}8w6x(t`9y6@1mU8kWJULf9? zIE#vk{?pfEYIlD9GJAH%5gk@Xu?sWs=Qf|-vd|m4e=%-YXo$1+WFhnM? znTU--I+~T)y|VK7BqyPM4@-)xrYA2N3KL^FX)`6OU;i3*&Tg2G9tNm>fI8 z^YMxbYuuAEZ6uIuAy(+vb8$7)XvFHMt4-p_*nlP(E^M=6Fuk|p?;t2{@rNF$AS&A|#X56|o91ODJ!}fqcEhd{=dzCC0}-sM(GnZjK$L zSAM_0%-x&143L?NhpYp*5NHZ91WZ7hu5)P{5`4zr8rFG^d650<37;++aB@NbBu8R# zBR~^c?XncuHPTe4V?TX>-$nh(2?xd!qv?WQd~JWOYuCAp!Gp(9o9okWLYf4)_3DAmP0n9C$2>~+R%yrVSY0IOC+P~K&0&o3FMB3dbxbND zjGw3s=su$uo681d6Sc7s^s9OriD^|($!fK}L{~%v!&kkhfRQ8j>O&t#+;#E&n6Vo& zAUPYM8}dI97FfK!N&9;vp8GL7^+KbhJduOeb^1E~N?|X$n!lANj2o%iZlyL1|7=Ig z(^cqkehA4k)ZgWVbkUUyU%mkh>)mm$(o{b}sG74Vwl5MyTUaZ~@hBn^MCB|N3KT5? z5*UE?B|>FDOs_u*Ilp?BTeUdN^Ym#iDLM0;~=3fSgb8L4Ly$vtX75!hPf^+r{leRe^@4b z-i=asO(tfuHrN~};7nib+f!b=Nz2rlOH11@;&SjCz1n>W3tK3REL6k7n#BR`krDyH z+RNwY*wQQgIBnfVef2*)g9#yXV+s%2u%bq;E?xM(2}-LJ1%_Xdv{1TnS5#EleU@^G zPZ^_i|GLc`bK#!fA6dEC@ABZ7SX7Wh8qCh%(Uak2GO2(P6TIJnaVsstD-Sj2v$DlV za&Y-7S~yr&!YX3tQIno)oSNtsrhJB_RE|;vr0GIMMH~Tj<5PC2xb%IaM{`KElDP*Y zk^2!C?4*4o0tOtD0%U4*`0sp&q8MP%Mu45C(u-Nsfw3D*SNTVJ%If`tcmrfy6d3mZ zhk8L!y|$(tV~clL6%?4XW5B~t6Z56qR?$u93x*_wmGX?c)K(;LM$=hV*)M zfDUrlprIU~?*|8}!47EE7R)(sW^Ov5L#hVlJ#F`S=<8LcqICLfV~1ol;BpZTNW1&n z-i?EncB-#fPtrA^tqO{O;KC;&;gI=*&fM3&jugVA~MOgBJ_kgNk!% zkkl_zBtYV#@1ajU3j-H^sgkab;XBZj(jb@2=f?umR2Zu+8U@Pc1yVoVfWIR5YPgS5 zQ=h4xUVO?N++`T&swNpgCI+v*jiRzB^vl-p#Sm@07Gcj1_AmlT1_TxcrwQ|A|A`{E z0NV3Mf|0a0Bry*PLN(ltUDY84dhuh*DoY7ylkO|eagcY8>l2|_8KPLPJ;vKEV&USJ zB$=Du>+kt6wu}r<*9igZu!!slf%}E}6%)p|GBSg?KVS7zsf4xY<16)SvKh8*Wke?W znTwVI9eCV2`G7d;dF3>SAC7ltB}@zYHB(qsqNA>Y#NPPN|MGQno!;uzybUmp?O)~Q z7&zc#mDlpETX4uN%fn08GX7`Hcs&!G3w0k}FK_@8|16E?(}3h3%}q^B5yY~|8_o)X zw2nF;?Xx|sC0&6S08I<~v82wBUF0G;1=AKo$n5|?>&U>*fc{B_i?7Na^XTG30a!r0O*tM}dCL`kPP;^A#rE|rtcsEtqXcal)5 zt_g<_aJTW$*E-#(N16uZ!NnO9e5^T6?+e>+QC^pPdF}1WXVME>KSG*0;5oVG z&kV}p3RUTJvqLki^H}GZTqaD)9AmCoY}f*Y8R7%*|B(GXW`6scLF0veQx^<8n2jYr zso~=YdiKqY7~0Y=(PouF+YoYPFupVYf*P&?jjJ|WmVAPiGYNu~t2b$|v7tb_S z>o@UL)K}h6p`feEc+ZJ0BIK9YiyidXe!xPds}(iopZ4QCYz^vlduu2S~ zOEdq=kw%8g`!f2n0v)Eb4*4tzY)hS%m}Ppj+4ik_2DF2vd8u8XD()l-emT5e%0DHc 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