devicely 2.0.11 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/devicely.js +1 -1
- package/lib/.env.example +20 -0
- package/lib/androidDeviceDetection.js +1 -1
- package/lib/appMappings.js +1 -1
- package/lib/deviceDetection.js +1 -1
- package/lib/devices.js +1 -1
- package/lib/doctor.js +1 -1
- package/lib/executor.js +1 -1
- package/lib/frontend/static/js/main.96600727.js +3 -1
- package/lib/logger.js +1 -1
- package/lib/server.js +1 -1
- package/package.json +7 -2
- package/scripts/shell/android_device_control.enc +1 -0
- package/scripts/shell/connect_android_usb_multi_final.enc +1 -0
- package/scripts/shell/connect_android_wireless.enc +1 -0
- package/scripts/shell/connect_android_wireless_multi_final.enc +1 -0
- package/scripts/shell/connect_ios_usb_multi_final.enc +1 -0
- package/scripts/shell/connect_ios_wireless_multi_final.enc +1 -0
- package/scripts/shell/ios_device_control.enc +1 -0
- package/config/apps_presets.conf +0 -271
- package/config/devices.conf +0 -24
- package/scripts/shell/android_device_control.sh +0 -64
- package/scripts/shell/connect_android_usb_multi_final.sh +0 -64
- package/scripts/shell/connect_android_wireless.sh +0 -64
- package/scripts/shell/connect_android_wireless_multi_final.sh +0 -64
- package/scripts/shell/connect_ios_usb_multi_final.sh +0 -64
- package/scripts/shell/connect_ios_wireless_multi_final.sh +0 -64
- package/scripts/shell/create_production_scripts.sh +0 -64
- package/scripts/shell/install_uiautomator2.sh +0 -64
- package/scripts/shell/ios_device_control.sh +0 -64
- package/scripts/shell/organize_project.sh +0 -64
- package/scripts/shell/pre-publish-check.sh +0 -64
- package/scripts/shell/publish-to-npm.sh +0 -64
- package/scripts/shell/publish.sh +0 -64
- package/scripts/shell/setup.sh +0 -64
- package/scripts/shell/start.sh +0 -64
- package/scripts/shell/sync-to-npm-package-final.sh +0 -64
- package/scripts/shell/sync-to-npm-package.sh +0 -64
- package/scripts/shell/test-local-package.sh +0 -64
- package/scripts/shell/verify-shell-protection.sh +0 -64
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: '61eca9ae13095e7b4f859d455dc8a8c0',
|
|
33
|
-
content: '39f91434d1e6cf3e515f9fc32984b8a98c6d3d65ccae442ce877737f9d69b23a3d3d497137812dd8b53a42ee62b6f355c97a82cd842e9c0b5c4fca6caf25802dc2438192f1637c193f09f92699fad25265a6b5ea3c64b08d14a3ba7fa190a268ea969877db8e145a83b080478d77ada5e0041d85043671418252c114994c9066365b61ff253542211d003b75b3edfdbcb5d2ee027a8a4ead8f53c7dd497f10f23e40e331facfa9be38c28ab2e03d5edf62800af52f42c9eda382583607a780c26988ef51a83602ee4ce57711309f1fc6c18200d8e6a76bf7c806b3a01b0377eea84ca34c9cff16bb4c262eb031e1c5e1cb414099d90ccfecfa861a95db494ffe16a7d842a911974619d2f4af15e1342f6e879063cd46b74313890531708b82410f362c598219c6c7be5de2a7bf96df971592e36b4e151d4165861cb360ee038a069b1a3e9798988b01b3c93f07147f69e1216ce17ebd0a67e3ccd6813f8911e772d287519f5cf87f0854787aff9512b5b5fe24ae3a42b77ef46a3405c0cad5dd3d16ba7105d2d6bf13595b30220fe17cebf255da092bd00f730600fa3f0d9db04cc866240a24cb6760191b0b42e7a1045d96845b74c04d2715bd0cb7f2b4d3b1693ef58b947f3888f07f14b6d7b16c5b41aba2632fee715cdac81a38d977926574557837af012c88a9262956d54913cbc5331c50b779a5c7ed225354017ab239d1b26956cc36024a3f15cd28ca846966982f54aedd8df9cb74494357ecd193c4121b58f1c409c183fc1c721533644eb6462c64c7e91435fbd37fbb99cf3692e7b7700cf949312616c466b5a6f7aa342921ae9a7adbbd7fa1e24719ab939a622eca325ee905f008549570f116484f9a311400aea1a6a3053498506aeefe0e8fc2b9a49dc90dc4be15afde8165d8e1d1e59e8169af935179b8cb1b2282ea4c1d3a4b215ef7d25b9e93c6c040e4e02cc7d2df702eba43250944173666b6f5ab01f510252e7c916872cba2a513f976c55788f52cd84c53742e677d774d9e98b6cb52171f0279560e1b171a0faff7fdf1b796eec7636f6a4c98372e175a2922de906bde5ff3b2a605b1440a49992285ec8ecaa7c2493dc86e8fd1afda2636ea847d058bfdee2917f2f0a89f9f9d7cd51eb9f3688415eef20279f428309daf94412ffd7037600535ebbab067c9d3915ade79aaf50228b8ee881f1aa96f9fb7aff465c70291e9352cc458c657cce72e10a04b0d707cfc833ea3bcd1cbac96ecdf915e927e67cb7745b7621d20c2651d418ccf711c1fb063fd22c68f8d90596fe770f6ea952b0ddff44208539e8b1a9c149d03f21d746505ab7b776336df29632a071215b268c05dc5c972e6019a704a00d4b32bda5a31ca081ccd0383ffada8441a03aeaa4371dbba4712a045cccf170835a45270c0305a8426e9e6882b73e22b7fca10b0314d55f7870793c93116f306228c769fe5ab34f5c13022fc38715d5ce2b12b4161e8921206388f2fd71d88893c14c023311c04db7bb5f88de097be99d54b5fe06f2ed35d5ffc39c9eeed411ae60822ad62cbbbbbec20d0b943c3600e796ada'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
const args = process.argv.slice(2);
|
|
41
|
-
|
|
42
|
-
// Create a temporary file for the decrypted script
|
|
43
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
44
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
45
|
-
|
|
46
|
-
// Execute the decrypted script with arguments using spawn
|
|
47
|
-
const child = spawn(tmpScript, args, {
|
|
48
|
-
stdio: 'inherit',
|
|
49
|
-
env: process.env
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
child.on('exit', (code) => {
|
|
53
|
-
// Clean up temp file
|
|
54
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
55
|
-
process.exit(code || 0);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
child.on('error', (error) => {
|
|
59
|
-
// Clean up temp file on error
|
|
60
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
61
|
-
console.error('Error executing script:', error);
|
|
62
|
-
process.exit(1);
|
|
63
|
-
});
|
|
64
|
-
"
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: '59d1e27e9a21c35d59fa8c5db73049fb',
|
|
33
|
-
content: '26f9a3287711f4534e6132af9946432d911e9f8f5cc13e1813cb721608e65f3d7704de341dcf3ae62d4d1253ae17d72b41e985400e665f4681b387786fd55e5d84dd2bfb31a64ac28456aedf0854e6766a9615c8513727072d4139aa98902c2c07a940a1e7095306dfb983f56a33036aa912d191d4d873b990fbd2c478c2667891621ffbff37309e6748edb6f02497f9612c13f2aca8a281a1f81738d873cc25717c0570e1b21e832a08a9d0c51d5aad91aa4b9cdf0cdb2d633d86ae7b6da89f1dbe51a7fa8697ec7c47e6bc2d54e1e3e0a84610bea62a31d6adebd13cca00f4a04b9273249f23ed34e0cce0ad6c48b7e583d2005629fcc88c814a7c068fb69d623c873526b3635115305dc0b902f2925f8b7360c4d4374007b7d25ad6090eab4e61c10a74ad7829e00054adbb19fe08cced4baba7053002fc7abe62333642b48084651b9b86cb0c0a3cb51187131cb525c97199832e40fb1d35d25eb878adf9bb2f885fb6dafe994dd17d291e3dd4d83c3fcc8f9c8a1d5c656f5ad54032f6d7d8926a6b7c839db55204db1c27a7435c3c03cd899c4774b923312e3c2130d5687c4463d54c37ebe70b1f236937a159ac5e0dd5d934eb69c08eccdabbae1a1593769c69c773fe9bf6dc1e958dedb60ea77dfca362eb312edd1794be44b6e588a72e116bf329bcf5f3c8c15d3c3f48c8d86f83b267d9db8b0c3669623d09ddda2a4125766b9a448f0134b5e071ec43987d1bf5f8f662eba524985846722ec0b1bf291000217122101b803e8d256bb5363f77f00753b47638c2fb86f099c108b44e38c9a49770c38306ddf30d93afb22753f2ad454fe78587e1b142d14ed037b6f00350865d82ae3263c2bfa0639eb449ec1b849f01bd92f523d09ff7048607ac546348bbc2fbf53fa66b2b7cbec629898895a28887474963f008fc80615bc64087c5e8df9b16aa0a861b63a20f81f99c7021bb38852965dcba9b4c0d10c0bc6c78459c476c0a263969fb74fb70ea87ad72e1676be11a4d772441586808b99c77d752cc300205984773927b641fbbf3f9f9e5a2245ab344e70e4b41c6f0c18a6d0e2d2b0800dcac847780079f6a3f79cfc8e662e2d53ca2297f142bcf8207d42269840b8fcca0841a1ee2a5b461a113c4848f743ef70b43a99622fcb1c478cd0454bba73e3ba1a727eed03e737d86028c730c4781ab8fb32cc574cf50f581525ac1d3a507d7ccf92673533c27a22a03c83dce92819720c82f8c8872f27b1e9e8cfb87446788d46d8b7a030feb7284ded5deab5b43c6fca99277eab94d7d400bf14b944d0f5aa5f2ac203c7e732c26109cb7b05db86d46f5d13e201f7457e6af372fad75569dad6eedf796e8dc4cde88bb3b91a23f93c503496f71351cd1efd769dc00b457f8e9c6f4aac9f2ed4391b9278eaf6dd647d80ff95edc7f2a84f8c3faa9b174bc22ab12508f7eab991279b86f4dae255112a3375c99b33e216a61578367cf5cf9a150d0818187634bf904d306a93688931327412a472f3806b6b47354025f623de438de2213d33a0a4b62e4d6496bf3c9a6bdc0ddc7d61fd8b828f62575e74fc8301233db2ace9e22cced28fe200f2de767e92ab135a85bd9b04f233685796c38f2a6fbf7306dcc01fe72c81ebfe9d1261bced4ca7e849727bac46ca97c6e76857c2477b07b0b661484ba99366cc8988aa30c9d273fb19b8c894a9c9b949da14db321ae4173c754ca74a3c78449d8860d57948ba3932245eadf968e886a4b0af4afd999fff747b9ce59b49233bb6404742b54529fbb32b5bbcdd7635641d7205e11fa836df6efde11def11b4456d1649804c1fb724f78167ea5056814216019d50196c9f8b7d93921c08c987a1802b2fb0030e92852174f8a677920f83436f616e3d68d438e5aa920ea1657944aaa0c120d2ca2c21f54fe45e328486b6faf4e8b3754c8bed1c63ea82e88431d3ec5b841d5493daeaaff846f395ae7a63f87d6b33147807b11a1d207b5920db26c5a79fcea3d69195a793857975be313830303c73e8b9fc6d992b0bc787bcd6f2dcbd81815f070e8d605dd3b4bb81f5d96bc87549edfc45ded2cc5e85d224031e65781634d66d650a91b3522bb150ecde638d3702b0d079d33fc3cbd2222c7e52190b0f15eab8e66a75512b236b9e51ede319733b88dcdbd5d8b0652f4222c0e65d518a038d31dac89e17f932849f0020a1c84c5cb8032f73172f1b6a105a96e5bec7fb37b815a085af87d3da8abe0c1ed12059b8aeffa1dbe9c55f58d80d78aac589172de64e280648400c5911077c7f0ee7770ca8fab5570adf4983c5f9cd0e0c4e6a93846a60ec27d444e79419b282a569bb5da443e7729d57bf403fe65cda490b2bd456b3f855127156f8fd25355a91f43e82ee5d0faa7119a09218d1bd9f28f1b7f578fa31a4a0585a868843ac0e4f31389073e5efd12093b4b8de9b499ab5fbc7c55bf5b3439bb462b85486ef5b77266ad312468700f82932408caa1639f5482ddd29577279deee6ed01e294c86d45ed902afe3aab268503a65af3e6d224823be459df8cb042a571e718dacb58796bad5e4650f07b491b22e2dff1fd49dc6aa5d9df0e9ea7d9b46ced8ea31501ca05a1ae1f50d7c00785fd4056a3650134049caf8b6b2e1d1908b022e1a65e53f7ca8066b48952c94b72564bee125632c65c44ccb38f4e829bb6715fcbace0a54f2793107d28b46a1b81d44072a050bd43f441b6d5e597e287f046050934dd8edc04f558081960971402a84f390560cec009e620be934ebb8e473d8ad02aaa002e79e075190ad64f2f273c5facd7ca861e43d30a1995e2b1135586e4d7e0ab23c19448bf39ebeca947a10df563b65a42ee8f9789dc0ac2538529b8768038b83a4944b89970aac3142a5c6fd92afb0e25b3ffa107b42fad47c4d4bc7c0cdf1f67891fbc768e0172c4f0026d0f717f95925ef84d7de7d09b289e5dacf9514bc849709b598fc155eb7ba8c1c5c53062062cd0b6bf490df32233361d4f735c52d22cc7c37f86b869186ddb1d3887118357468465ece788153b0cb99f86a221159e1508135d22a722442fa9d2c1f97e67476a42d7e8c9732b4aea10023707222487ebabc65935e202d6be4ffee140e7833433d3b93969774c962171827d87a08f35d333d21915d13285c846826cf80ea3121ae4d9fc9b6461bdc1bac8c066930516f193bb9569f4b6fdf1e2a2a892fee353b36972701ec81155434eb2980c32e511c6bb7169eb5092dbedc7cdabebf0bc7f56605a8c939bcfe5536cf8a56fe25e6f3021bb2776b0fe9364c3cffe6f81439fac90dc7f9539c7010b400adb3152bc5d8d7b4e91301a959c9ca04e3cdf14828b38d34d6901582006ce0e4ab446bd5ce68145416f71eaf60ad8018988ae5e4d95df5ed974ba380c010d8cc5323f2adecfdf89abff34a2a652263dddcca2eb3d81061249f528732be882e52536a54c5fbb95756c5d3700dd972eda2d7a318dae3ef73aeda3416569a3d17e8e3decd63033a81ade892ed93562baba7b07df3032d73c7d51b35fb8f9e5ad3935dece5edbd401f554862282a2c2de245c9923914ca70333b02f2dd936e676d448cc22c169c45f2c1e81723bfcdc243d977810fc7d2c0874eb6feba3e97b48b716c108005733cbed70dc248ed72b1fe97bfab650d9a4f712'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
const args = process.argv.slice(2);
|
|
41
|
-
|
|
42
|
-
// Create a temporary file for the decrypted script
|
|
43
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
44
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
45
|
-
|
|
46
|
-
// Execute the decrypted script with arguments using spawn
|
|
47
|
-
const child = spawn(tmpScript, args, {
|
|
48
|
-
stdio: 'inherit',
|
|
49
|
-
env: process.env
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
child.on('exit', (code) => {
|
|
53
|
-
// Clean up temp file
|
|
54
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
55
|
-
process.exit(code || 0);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
child.on('error', (error) => {
|
|
59
|
-
// Clean up temp file on error
|
|
60
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
61
|
-
console.error('Error executing script:', error);
|
|
62
|
-
process.exit(1);
|
|
63
|
-
});
|
|
64
|
-
"
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: 'b6dcd1353c00dee21f7ca54f5387c740',
|
|
33
|
-
content: '5322c2f19688d27a99f4a740ff206fe4203715ccac3fd3a588f152cfca1c43c3d7be20b9573a6e93005e7b3ecdef0cca5039627c37a07097b3a779e53fc873d0b6e322e2e9c47f4bc0cca57637f42eb3c639d80a11d00d504a7a4a65459a16fc6a6746aee8f3f854afd9724687cfa80c6b4d314257e088bdde1b27fed6f931f5f354e06f3b4eaff24b45e9b9b1ee2602e7a2058f19df383085f9fa513c8e132690e81dbb806f93073c5409416e6f2efad8072d01e6f4b40ec7b8801c9269de43dc17e7fcb7fcb119c4bd4fa29669e126d067e8b485526df03981af56a267b85c5f2d026f5f65cb6cb603fc6893ae4ebea0424c291d3fc69fc816819c79051a9194b951c119c0c7c6a067fc5edc3bb05423320d8c5427ef78ae6485d4bb8bfd3b02adc44347847376d5094801073ab54c93b919b1e5fee7ec4530c800132e59615fa2ae73271de796b52b3989edb2d49ebf8689e59302374acd9480fe83191d77f42a58b34f0bc13d0e5f1911478901251953cd15d4974e4fda25ee07c4200a8520f2ec33618da7900d7b24071931fe9678ebcda5385e69bc9ec820a517bd25aa4afb2a7a73c383b31d9dbce06da0edcdad1b34a9da88f8e19a58416f039a6765edc57034a0285cf4ed921c960bb7dd5ca438ec7ee217fcf8073cf372fc99da2988e3a58f463b437167d50ed15dcfc3a221e6b9c29626b395b607f82e03f06c1ea6589f5297d48db60bd0b110b44a3b2840ccdde53a655f65bae6d822e0f69fe02611b4ecb73f9d90c30281dfe1a156997f7d71bdf62577733aa3e63424802f5dc34c204e323296610d2ec23b11d646c49289861e35d378d5d434f1efc736d876124aa788fb0eb45f4e7f4ee016d6b87c4beedcc336ed45ec0183f5be44189b29a9b31961e37686a321b51f114e05fd24304284490fb9626665eda70821c0df600d3b2415bfab767a470cbb820841b3a50eaaa9abf12ba22aa323c7d875ead3f2c2b9992b29fab298a3a35d3ed7262841ef7acdce0c87fcc0faf483f615b9bbf6ddff104e916d8b186474b3f8012b12662066d7cc2c8991abbf5912afb47cb6157bf1f4f50f8a5df8ea9d41db30ec162f363d3c908581d22e9d428f80748d55b1f3046aefc27bfd7e41a7f8d8af990f712bba761a2ae5a5f88a48a39d527e2b0e65572ba950cf879a0d5a067b27a94e91aa78b7eb19e32d11bd81604e7bac5decb295f8352b300e7b755b7034273dee3127b74d781b0416a42751304dd9dec14a72bb886dac5bf27cf3bbbfe000bc33a1202afdbe5654c1a6ab0b9d05bc4429dd94c36253899d8b49f02dcdad480fc480526f75058c00fe20be14a9e844dab40e445e275fd8a05f331d9a66ef459b3b9ac8a0f10462281b1926dc225739852986c2476d2e54cd6f6910e27c7bc53da76a049538f75e660702af010c8d15e0049647aff4e216329715da6443368c92934646a52bbf341461d11d7b73d4bbc13d938d7ccf179d53e40625888bb2dee23b38bf184976573cef6fc2423a53f66aed7a475774edc4e7d19cf2b7444c4efcf6628ad12c08126921b8193dc067ecc6c09fb9fefe893cdd1237c220a8702f94cefb40c2d010757df569f0361962ccca07916efb0087458632e9fe25b5bce8d42e3431dee1754de025846f22396de6b4602a72e74216187217c22fd5305c9127ff0634d44cce19f09cdb227c57cf4016a963b6c1d546465eb1acbc8c2c055ab78436dda985d1c30148e6b1cd07f99c6e95b618108919958fcc4b69d9e0319b141ab12f9037981a511cb1856cb8329a5f771805c0a8fe2ab6379fc3db45e3e17c63192c28a7c4f9580604954daf9f0945eb49739f507bde26f3ddf6f947440c79b6412cdb54a0dce344e15b37384e0f0c7fed275ef09109bb6bb70229642e4bb805d151b60f5fd643e3fa979502f1e5f704544e587d0a5ad1931bf8d564f03fc0c2f33405a10a5c8370e175a74c2fe239777413d144c764aad7c9d78d4acdccce42067f81f433b3dd37f8397dabcbe5fe31094fd08a7686f2c969a8bf8d15c23b3158f0cee31d6c262ec3286a00b053a3dfd673b77306dadf69a2e651b312420cc8742880836b5f30cc848bb7c5a9439febf4206fed2f8512d177f482855bc81df86db7ce2a1e34c75c566ba30a7f1466f39de0119f6f9ab9c366c64cbef8157ec5b06cbea432b65ef3457a364e76900929c58003f3413575bc60db5c7b537f6a0b1f4087a53b16c4af9c90cfb2f6068f25c4de1bd918f6f2ca0bb0b3ad78ac7af038a31c482f8c5a48f815f958e2bffe8e62c87c43f71d0ad727568ef65c2d5d28d4bc8c27ce09c94e00c168fabb07b637d51b91e3499ad20bf6a9a9582f1b83c3c974dd1052cddd133f32e30f65ba0d920fe477a4bfdff4bd7cd00722223f0a4b65f23796a602eba24bcd6e57a0d9ad9ab5e3162ae9b3b6068d2db4b392471ced14fca7420c30a760aa0ef10f4b3aebcf15ad2d859e8ee59f18f58a37c88d2fcff1c6f26a886e5593146be07921ece5a2e16683198a1d9f45a689bac82deeb7e3710708afceb807a2bab094d2d9dc13b14528b8c797148e140de2d0cdc3ed04eb19906a2d870658576d2589f8cf49f375b41bdb4362dd23fe2f2f9a14e3ca24dd5d65ea88522892a0a6d1424ee1f8c645c73e8a00aab1456c90f10f0b4e5b3f03196bde0bbfae39e213c1c2efefddaf5cc8bb6dc440cb975010b1eeb53386ca7f8ab69da359d7ce4131cd80358597c373a3bad9b7bb7426b0f9e95ba5c648daf808404c949003848d1132e0c63fb497bed950b5278fa512e399ff06f3a92ac70f85a5c08542079359b7ed39a82a8adc75b73f3dd277fd3d51d1853fa7804c9b1e91b93f2c81d6a9558b1e46b4120132e81eea58f6478b85e9d6520834d888b8b724c130b06c87f9917c3046e5aa3ea22f6a0113cce802f705226ada85c0154df1f1064a1c9200fb1723eb4d4fbe827894064c533794bf9e67e9c0966b9ced03ffba447a7c420e999051146ee1e4a8ad417a74f6dff0da48b8495ff2e562f5c3c515f818d074cfe8835441c9d6c41c5f537394197285a509e07fe8b31e2f0dfd402e938705ab3aafdad6084d030cf12b7261c85ce48e4c4b0ed1e8b459fa2095956edd93f1d07cf213ffee9d367389784e711daf51e8f0d9948e6e93842dd24f94f3bf6021eee2b99fd00d8e44397be45f93d435e3ac94e58ee1e46d26ac81027232c471c241af525acac94327ab495127c0f2ac0239a356379ee180eaaefb4a9c600e2b3437a2d839cda106414978fa273cda9fedcc59b95ee569ed7d0c70e4233062f81847aad37516f3bd72a6afbb63a601044589537ab37834c7896299c0e8886b4fbefef8cb6a3df88fb67d32e75ca7e039f8114e7a5949c342708467793de3be9d0c34c7973b59a986d31f9d370a156eba4052b56cece1caed36c4d0ee9ec4ac2accdef435f0369bc50bc7f915240944029fc7401f07a48016b1e197bae81d115438f1cf10617078181ee2959b2efc83cb5de779e7423e878826085f3d7b989a006890c77d2fc498af40f75dca9ee45a38329e040fcb61dc9fe0603002b958a1adcf96e7b789b6df1c2cd7bff402945247a458a3dd87c46605d954ebeb90b291918ce8f2fc538fd6666725abdcb7c27a2233b7426fb0bd73d1b4eec0c9ad79e916722656761f1339a8453d37e969727cebaf6733f0374327b372739ce61570e4ca9d3b9a9ab586c2719c55a51fa062b4e2696160c3b3bba21dcddc0c4bf55792c6ef4dca71915cd29b89959b97a71e068dc615259f9963d11da411896c26ef0247ecb8a40feeec59ea2e24da852319233df20e3171b2ae2b892f4e809e90b3075de40690dc6e68b6525643020addb6d42c51b87ccad701c698a9f68cecf051ea06e06ac8d01b6d8094ba912cb376bdc6a802ed8c88a849f543c7161240287dc0154bc84cedb00002f7dd54968af478bc8660daf315770ea9b94ad8531a2d99e725c859e71e1bc243f04922cbcfb25ca21819f55d1b602abe564e24c8b0d9d959395ed05757381f0f7ffbbcd150947e949452930f4f944dc4901552e3f3a8cfdccd355a9225d8e479e54701147a3e4733536215327300c920155604d3d8cc3ab871bbc6403b5a411d67b71dea836bf203eb8235567975a92c87d2a1f85d44a1a0a43cbbc87471ee7039cd5b5e5dce0c041f1b41639f78e88a30edecf17935923d28c8c76840ab0741950bebbc9bf9ead4d48502dec51b232b7327c74b4e77b02195c07285d2c8b33d4d13ea29308d7b6b4a5ee73bd2e0db3c32943e6d8086d620c6aada6c6ba093af60f99c686ff2466d2a07cfc0b679abc659c4b6504fc63928b042ecee374ad1b8fb25f1779d8af2ecef05c583069a0c3d3e0a7319094ec01cb4117b052c56ff61f5fb6b634ba938a06f1777b1200ba30a76405b64aa9cfed2b2c85a99eca4edb828cce5848edbb4905384a8b3f60639193a320c441986c8eeb5deae1c4dc58ea3797063edcde776b61bab9c34f41ca3dfb6b3ca00a140bac3edb49f33960c1b978347183117f0af6a342dda616ca7a1e0c7f66ee2340ef7510f42b165ab67a3e189ae99317d6d883e2a6037d34355318623be1099f04b81d614b0b96ab84617d55635840be34044ba6b9357135146e16dac942ce7f5739eb63440d6d8030f5aca8f3d5005084817bc116668f72e2885938232a0971d4dca6eb0ef51122f54d10117a3888ba40e191602215a84e085dbe75f7f3394fcaff2e131b6160b36c4f492f0de7184bb31a93ba9cdffefaf73a2e211dc7f71628f02e68792669a367f3a035e7d5cbe53d90d442bc007bcdca2bf7bc48d8bd74823f11d53a14a1aa98117a08116b0d0fb44047a3ec7668fdaf6ca68846b0b0b6775208027bde1b80ab7ae634413820dbf72315b23f345fc9b6811c317bd3e32c6b3c125cc1860872af6b54f95cad1b9ab3ceff1ba58fcb72cae9e19616731c4f9ec3719e3babc8131569ab62c98fffd8e5678ec5d0a6109465e79d60dee458b4b6f6e4b82523d3f522297bb737d10969d3299fedb2d1a42bc693002f1415ce784c5e24ee06eadb25e20ebb2404dce2578b4606635e8b1de25290be6572fe8308616184e21a7d2372d361ff5756c44e059311191466cfe9813d04c3dc6d93ae58c6f715323cbb99b75ee2663de2546708d23f460dd71ab99dc0d224383b0637eebd07294fe13e100b3573d34cd856da5fe6e46e8baf2b5824618a535117a30e93495d37d980b331d43307557de941ec7c61013d267cd6c40484ba1b9f58ab271b1372df3dd7351e5782e49274adee084f5c1cdd2970b807d5d3af71fcbdffd8dc0d0b94b98edd4f5598141a70e683aa5cea281d79a9866e15ce2bc91813b8ab397e859905d525f4c004a48beb88e6a3964132de219caf5a0ac729393493f99dda602deb550a2e7661d8c5e3974bae89b06a2836d32d99fe7344c909ec6fc44e4052970ad576708e18c9b6df4728a7824ce5ef497a8ada53c98ef2c2192e130072bf8f327a22711d7cb28d5d19331ea128db4e318c3ed0e26b8ab9d789562cddec3dce0bd6e7fdcb24bae5413bf22d5ec4bee7d995c398a109424a5de722f3c0a88aa47c7f5097546837c979538dcfcaa2be8ae912f3c1398024b85a502d0190047992dbfb5ea1feb5e78cf1ee7262ad25f4edd5e8f5034e52d5d99a50843329438ade3493052cd9727a058a1da44ab356e3836d49200a8bed3dc5dfbf6382e1cb88e4cdece1e03a95d8635c78445e72ed0c33d35414a3008d44d86fe6cac13267b91bf4552855b192d3a484e317283c5fbfa91c4fba140fed20375ce3a3c48e342987874f64853bf88ea62ed873626861b93e454e17394e26b2feeb5a6db34f4271d26e9f7635d25bce5cd72e9a16334915951c39017801c2bc073c0bbdc4bfc5893927db74b33b07873987a16d40fa4d885c4bfbf932b28a167e6d551c181611b061199bfe96bec22c15b410f1f066e52b300d0d027d0f107214b473a3d3bb8cb9554799f8ebae546924ea501c55b8d8b1ba219ec8427c1da4d702aaf4d458acc48a87a09e9df59bcf10cefd03546a7bdb6e99f470017ab237ab8a3b0b4bf677e53f33f8e29e9e7498979e58f2070d54c850e99fb8a1b0b361bb5447902bd4c9c2b815287c9af8d06fd58bb8333f91fb36af9d66a052b24da65f760a421d4b967d1380ad8d26d91aac63f2bfc8eb0134379d6993504ddc8b0f3392ba7ed67e120b3ac5c63cdcbde6fc819bad503c2c0eaf8e3836fa223c7064f5435160516094548d9def0b1a23b1f6fb0fc38808138ccc71cdaf6304640f38f6cddfe2775b1ca8f65df3730d8f985c48c2f9b9d11d603aadb1e997ec594be440e258ee1bd35c627bcecdf345b0a7826bc31d5103ba0096cb6f7fa05d93479b4e8f57285a652ef8a31cfe2dc0253d3de9bc693ccfaf740c05655d2eece1966ac9180aff65cc8ef888dbee629639916dd5b2a97f8259f89f560f9b9af3fd8df7db6c5c54a6878a9fb73b9a9ae3632119290844820db885f33002092dff136953bb815e72ab9b9ae24fd428946b0f16f8fc19079c60b2d9e52506e8881ad32c239cb920c6851ee73343a1450aa271522138b004c8852347ad50f3c1bb8cc9ef5830bb01a98335adb19d8de836bcbbeaf9149f59865c6468143193873759cfeae8e63886f45803020813c252c726a70eeab417ae12945ddbec9a965f1fb660c43a732afb854bdc3e5bef8a3aa561a1e4cdb87bae80c734cdc28a7687be2571bd42ad47084b150023c7d98026a14409477a7a04457992aa372c051faf17b8386b43cbacc21dac90765c2695ac61652bc933bce3a7ae7d9c9ca4b85cc180172106e181dc20a4fe500598fe1f774b21e8314e8f785774381e32c75aed209e28757c680b3fe9e39b36070263be4b734dda5e50265cec80a2815511fe9b482d108654bc4ad7436bfbf55c2e8ffa5a955f58ffa7f582c3b48454c11fee0f88451965f760a5034c2f97cc68a8b09fac4e3096d16bc14553b0e7654db7d772376e0433812dfc2f76b6a83ec11328de8af54b48011a7c68cbdcab3b77cd87821b8280dd568a19fbc80ccd2c2d6cf8c9e0f9e5245f2c287e72cc616f1bd0459461c501af08c53b5e7becf5718b697e70c7db60dde967dcdee3e1c87ff109d06c1131585aa079241e74eef81ccba5c17d1e7e77bf722aa7060c0d380985dcbde13e7a747da707acc785c963a462452c20ae61100e9450190ca516706a4deb592ecb32a07934972f0fddb88e33534113da0a03df826c6a0cda3c4d0d03b2182626be7162e47d4aafaba56bba0f7ada5f941f9041d93a2909d002ad2519df811cda2082749152ab6e063509a4398a0fafb9001008df595604531a61cb62ebd2a3f02205b3db307b2846fd9444a26ea5c247ba0d421ee5428e430664fe5662216bfc323b92069ce5d75fd706b170c677a2b0db22a23098aa0062ef056dcae2b4967c8db1ec010e0c165ab78edbaa38c6653fd67a9a14645257024f1d7180652304f6fd287f18e6ee7bef808e089e6508de38b42f885add186f1cd548777dd9092214dfa5b11c8c3bb518c710d16fdd188d8a767caa32b159f55f0aba0ff2645b7121269ce654f0d2d639509012bd8a0769fa9586a872e2f3aed20ea72eec87aa9ccec9f9a7e47052421647087a1130cff0e342e5b67f4541bccdd8194472a3234c6608db01b996e8ad499a599f37b63feb3f0ad9b80b1c386d63446b04861dae251b36f452647f37e14bba912f170a57344a412a342c3a9fbfa39b8f86f155b64503410484b247d08dcd3e0781edbee6852cfc9bc70c05e6e755fa32216c66d02f61198e93a444dc975e19cc81c88dc29e7d0768e5bcfd2a21537e6f555f4cfd8dcbc187cb35f1a8e219dda2ef23d03370e6c6b1a02d4ccc99dd7d7ef2314a0a3305102c4618c949fdf45f59cc2342155cfafe5fffaba264a413bff90fa555f55b54e1d37194672bda51f1901d47bb684ed677af168d6e8a85315f4d04712ec4545b3bff36a017c28ad197e2f4048a1c632b6912e778136565a05d05231a824ef14b3f6596d834db4bb874f4ad7e219f853c2a9b21386040421f4969ea6cf0d039a234c82ed45cf53b02cd02199f2d1da30d8720f58b323a80865cf5fc18f6fdbc00a583f35bfadf8cd83e1580548f8762afa2163613b711d7465ecbfd24bea84260243f01c552cade9577be14a9835ed016dfb149730facac8980c55c9b2087b2bebf71a7022eb8b0527fa930b243e928cfa3b9126573841793a242209d0f744a704b3f8e81ca439e2ccaeab38dfbddabbda655316e6d9e722e78b78803b480af4af505c17cb96b5293660d5aa5ac10d77490498f5bb0153e9033a0035b52511fd36d05f26ed35df2f1633d7da499e45f8cbc81f6b7a1f473132f8815ce5b898332fe9f1367a514cf38c1e4ef68425c3cfbdbb4bf54286b14bef7c63b9ce096068fdd18342f9a607ef3823aa11f96da493f45a531714393a8cae722b805e051f608f9c46d80c51880c5a91c163351947c82236eff19e22766de9cbbb9e67ab949860b4701ad3d71e5ea70df9f580a4215fd42128b7bfbfe4c246a9e44bcaf2292be7b3bfde4ae790308b96e7cdb38da988c4617343709ae8c78d4d46af0528304267b234e8bc1dfd71a0c1de5932b831596d26daf182744f37d53f85b66c5d4507001bb12ebd94f642dcc5ce221647da875caa4755445e4c7673d905b8b05f0a2d346e4cc76b0029b6dcc37e2e29c0eb82d7f82a1ac6a6922688a8bfc424e18d174c349ee52ed134df54ce4d469c381c5e603e0f2bee3c2c115306390f807c3dfb6ab3ec551ef434f6e9314779aaff036da64ba5907d72741b6d6acfd2a2aa7cfddb35394237f6bfd382db3056a47a65c3bb4b8ab4dfaf9f4174d2514f612163294483e9f64eec2866683521e3d74f62f3ea0558382e3fcd23ee33557c745b8dc4ca4aa7cc3d0cb0e761d24506db889f79da74e3ab9ba7c8a54b749f76b3ff71e1f6702d90728a6c103438d419a7b51f918fb5c1b41a87f70a302dc8f9280dc46c1a699b8aeadf826bc1e1eb578e388c29'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
const args = process.argv.slice(2);
|
|
41
|
-
|
|
42
|
-
// Create a temporary file for the decrypted script
|
|
43
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
44
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
45
|
-
|
|
46
|
-
// Execute the decrypted script with arguments using spawn
|
|
47
|
-
const child = spawn(tmpScript, args, {
|
|
48
|
-
stdio: 'inherit',
|
|
49
|
-
env: process.env
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
child.on('exit', (code) => {
|
|
53
|
-
// Clean up temp file
|
|
54
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
55
|
-
process.exit(code || 0);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
child.on('error', (error) => {
|
|
59
|
-
// Clean up temp file on error
|
|
60
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
61
|
-
console.error('Error executing script:', error);
|
|
62
|
-
process.exit(1);
|
|
63
|
-
});
|
|
64
|
-
"
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: '86ee61b4088259196eb502484d32451c',
|
|
33
|
-
content: 'c7dbd1e90eface9cc2492e71fc1e9bfa490cc6773acfbf74fa087408689a06ea37d7804f4cc44a695f5a267d4d06ba745edce944e59c77c9655c99a0ee741e374d222086819ebb7745b0ef1cff4808ae7fc0bdfb2ea5c8fd5b8ae3122be808849f7636d60dbcf7a8a5825bc0306413617c89070f7cf1ce457d633170b71189f0f65e20ae589748702abf901c927f66b4876d7b86925f16407bfc6ec1f2bba58bfbc8f2a5120c057572c651138a0190eca0d1b6154ab2ac5992e36a8787da7ab66c28c3533a43a0809761cd1ffcd76a055d90f02860d25708979128f830524af3237fd71d07674a6377d6c17ee441514d6e1eac4bd16d0d93d960384a18df6d7d36550bf5309e7518f544e1013b2fd03a309c84644627bafb98a7015eac06bcc84fcfe07540bd1f778e6201898030a78efe781392964bfdf8bd2b92600a10258e16e63576e7a9f40a980eedf4bfd15bbc28444787e428ffeae5dc02046559d4f40ba92b452a78152dba2967dc4da308b73e61057b0d4959e3349d7d0c56b88618712027ea35ae5d08e2e66c8d6815aabc0680c5dd82135434b9e6d04419f6aadb424b30974c97f59edf0efa57e5c01a84f11435aa117fa9c89b5e4afea7cb4503700f037fd0a57a91b25703f0574fcf9bd353fada58336ad5673392f98e2ed61fafc2228025382511dba3a879be27010b52c77a67399d5aacca26e53e2918c4b2d6eef0ec7557c4d54608694edcf091e4ecaed7994e286470ad29268515348447dd78f109f8aa778c1fc97801c222b4efe0fb5c7805a8be52a02f2c087893c74a1642eb6823fff06c3167b92f1233dc66775566f16c88f295d6805a49dc8de7ae8c6a12a038bba3bc08d9637a954275cecf74f336ae7a16c2ae6e4ee36cc34a6a4c0c4b3fd6adbea5077fea0ea9ddbac150659359d7e4f444944c1a2a76715d46ae5987608c78aba8348d59cf6ac45a486c226e07661734d70a8e8ab3f847b2e1cb2ab90d42bb4f67fbe6a3ef3a3e5859854d696e4ef8ece98e33b71a7f6185551ff2ee049422c71459187e8c4b03625b0bb8526889b8b4748c2fa3e9cc069246aa9be237f0aa22fcf09f12d691bc032242162e909c580e2205b3dcd4b246f77fe8ff679e386bcb5b4f8b86efb6c7b9d60b6994233c9f1d82260140b767e804cf2f596d43e73a566f6982125376a8f4ec4d97ecd83c95b6388db667093caec6dd2d5483fc21197c18deccd2534837c4f226f7a0283219a3d2bd9ab0b2a3a5b1ce040f8f214845499ac6ffa50d4252203946f8d0a0cb686cb051be0a23ecb0c9f5a216494eea87b9333076df4486773c5b15135b32b0dd2cb1098c671a11141f75e90e05971f1b1714a340c3f42ed2c6a92caa135dee5f16464d4b5230df23d545e30456f8f0103b240ce4d416fdf1bf1f1f1d62a2b1c436aaeadb6201197a2b51e36b1f1137c7bd096b980073006053c6d97890e868e7ef4822cfd8e94386bbb3cf6066ed5a132540fe1ec3bc6f513fbbcd0f05fc46b6d25830312caaee5065cd4a1ebccdf23460041f1599497732f5d72e158c8c300343c14bdce247612b59c9d3330ee6027a9d984cc645774baacbf08d5ca00dd8cb1a165c746efe1c8ff7cc029d6139efccbe97cbd017320aff17d54faaef87fdb051eaf5ea582100d393858afe2f8dc2122752808078bfda68123e9bddca4f0e061d932b82e027e36be11662b302c957342307c4df3b01488231eb8f5c1e9052f1339183290699d8e7c12a007cb24aeb9278c98ac9d78869657869d4b57965529f27e0b49a8ad0001d62757866490e0683158701ec42c80a05d017b49877514f7a65623983b30107ef7d63b5404b933df675b1daa6f1c0ca6ff8be0da4cb4b0619373baa2a3e1df964113095cceb6db86c4f6fdb3210efe8920f12e0c2ad192e16d19176a096bfd6659ce3675d84e7a1efaedff9db676437b4bb07ad41757bf4830763dd220d26c76e7aa916a688bdac0337874f5ebe431122ee3d84aceb9aaafc78434094ca7d311d49d59f7843cc2e9bfbae599f67de0189a60089fe237f676c018443e745924ff05288d0eecc94ba91045bef6f7fc67d6e7bc1af0ea7f74cdfc4854c4bd8fc244ef533b01ee269bf4113ad37f1511010d43b95a7a9b66ee100a68987f63ea10baf4b49d4a1ce579d3ee8af889f202433c6b1fe77ecff81b815510b671f7fba9a123da17cccffa0da43deb0f338f570d270df8ef8c0392ea0a677e8456f275515ba74642fecfd652c18e4dce6ea4669e523896dc67a4c230ff509e998b63544d33b1800d58665e9309c51909dbb2f6a8c6e8889fd06a7318900e094e7392b6a8073d303'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
const args = process.argv.slice(2);
|
|
41
|
-
|
|
42
|
-
// Create a temporary file for the decrypted script
|
|
43
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
44
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
45
|
-
|
|
46
|
-
// Execute the decrypted script with arguments using spawn
|
|
47
|
-
const child = spawn(tmpScript, args, {
|
|
48
|
-
stdio: 'inherit',
|
|
49
|
-
env: process.env
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
child.on('exit', (code) => {
|
|
53
|
-
// Clean up temp file
|
|
54
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
55
|
-
process.exit(code || 0);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
child.on('error', (error) => {
|
|
59
|
-
// Clean up temp file on error
|
|
60
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
61
|
-
console.error('Error executing script:', error);
|
|
62
|
-
process.exit(1);
|
|
63
|
-
});
|
|
64
|
-
"
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: 'cba0c294497fc2df8c2f99e9f00b4267',
|
|
33
|
-
content: 'f0c198334ba25f1f4547ce6a52fa48d8b7b1f71e9995728114d0fa17e4fa182d232711872d9b02f1304a2e44b73d04c82a71a23d4efa64419b5f706fa565f7afe41f57c8df29fc95a490459891546692d20bb221f99964b547c39e80e1d96c9d57acff5d6ba3aecb7d9cb0c731d3b6c05c9d04da5cf8e744a0dce7320bd9c27cb31c8bab0d0934b836b8a7ac09c6a1f1f1700484f5d595c2669671d4382293ab256f6343acc38d1a9ed6d264bb0dccb0fb6bf7e0760a5011fe398b92783edcde381f8bb4bc7a9c1964842e1b5a5d5d564becb9d941b15769e478d7be61a0dc2772738b4954c048c12bd2cb94b6d15a5d82fb3984e6c2d3a5c74f44066c672f847e766ab7b77a5ec75d9649ba292a6a76b58a877b97e928019c7f9dba569dce4dc50000877ce21ff3b0b5768da72b28c6d8a95a544cd0c58e3f019d65bcdf7b9cbee9b64911825b93b33bd0500d1011c56a70fd1a399fbc20f00fc6b3fcb2d982478ba6851d35e97501ef6848a5fb4eb0f71eec497917af6b82ef6437aa893449c8b0b0c76065a0d91d3ca28c99ac312bba1d23be80e6e808a4c27df615365b705ff22af82241a16a1a50a8e701749f633b954c49b5563fb9333792d9e33fa2b78c8f66702dafedf576f7c8e39fca812feb4592394581ac7c65c7be96181b285217c939416fe81e850e5b2467b19e14bef4b4dfdca7b8de44311da0f878153259fbd984fd47448a1cc12040083dadc923a84c55bd1851070a2e2233829cdfb3d13c5dcb28e09d0ced479889af4cf23ddaf1dce803af0da4898087609eaecaf91a11866d56699d7b737a1a4eb7d57bd36689230316578d1a73616f6d639b53fe77ba8f5d2fb980e158fff71ac79f075240544e67afebdc1f26055674950c9cdaf8a7bfdbe25cacf500be0dafb5d9b71b6aa70a37359cdb0c00afcf29dda20ee49560896a45591ea7a27f9a17b3ace8c85c3d39c40c1f00f40e8c361c58c997a4465ed23469a83f7ab9244556dadd3a91cbb2e5679536560e150dce16ba4f0baa74c19c523b87cb1e1f265ec89adabba8b39d0daedbe0689e56aea4e7296332ea8733a03097cc1bdbc5d0abb45418b29bf834201abf65985cc841271b8d09569f87a243e11b978b1facefec69e215d701f896cd59cbd0c97cdad2a414e54b23456d3dcfc4a6eadaa2d279ae738c70ae07e0307690df5482f0bef5b0d1ee7e1372309979dfbb06b51997ac3c2b802d404d31ae67b360a8c4d1e444d438ed136c810185f3cc35d341db109dcfbcb2a7d1feca9e7d28dc184dc3db626204184e4a49640f3ca78107f22c7f33a20a1410c60522039c3a0c1824094e57c78f114531002570f9195be6e25b4fe08d4c8a7f5e429725726492ff2e1626bd7b475173c9e790245827d53e48f6c67b1eb15ef5b757a922bdd71033b1354826b1662e6ea9ed8e2ff1d9eee6db70a4b06f66f444ff8e0e793642be0265f8ec1c7b9d028f674d6d0150b66038d66309414641dd18866e70c627f81e84d11f6395f235ad903b02ae4cfefda4d70905e5e5744af4ddc0f5f693bceaffdfaad9eea381769d6ce59826a304449fe646e3888db2765c311ad4009ab5585d2d0523c8f0f716968d122d501309ae8aa56dcfc1bbe7ac93cf55ca5fb526d4d0d7541696b6fa43181adccb6d0e1c74d4dbbaca441e18d046552342c198d85ec68f6fd10e3e500c7abb9cb43d5f385aae2a01fe8a16758fd7c898aad2050aff558a13534ba44c7db2509237762b9dafc74c3cba4f80d42e9916b767888d7433ed0a03274fe740fe90360c7e04b77d8bbd02d24fb41bc2d27ad7a9780929b1615e1ac92fb9c9b91b146f6e63c5432b976597c068c89ad80a85db390033b9b92e7fb7e68aa264922f095c3d42a6d621030dd6d036c2d5f6d2d9a434e64bd7b0ce8ce288fbf65413a7b0d957bc2c33b573edf9e7d51264d14a4f6cf1d96456084331abfbc4f4c7b55a3a9771962699bb45066c26cee1fbcca0ef581d00e87f240a43d0e16ddcb8fad5cee503be7ed3c01d95b8ce8065c51257cb5be30d1c532cd0b3d5ee5baac4184019e8ee0cf23328700dc969cfb49f76eac7a35d59a1507d2afe6fbe085046345342f4b7580974fed8530969b37045532cf8443c7d7ff3a6b814e721a5e4aca8cb9e457a93f73c5b208220ba45463989547615ca973e346fc79f3be25e89ecb161b3e01b1920dead340b5b7fe9a3857f3dc1c6a41d2c3feec7314dc0bbf011837b3b8b83c9a28c41845076d509c3582df7f3fd92212650c820c39f9834d963ec4971be2578a6ff7c3260f82f0b440358b8f95ea68ec00eb590f8f591cc484913c1e23bd042ad8694fb0790f113e3bfd6c6c15006e6f40c1b57610cb7cfbd77d1c78e4327168e2fb0ed4b0ca002a23638323dd6c0ea017996803c1b2eecce1678fb3c5cc89c081ed717edefd1c5be28733010f2a0d6932bfd59d6fab2f62965c6a90dc519a6d7e2428f497d6201eb9804335aa0ddc40e271b33f8db3716a63d9c856043804ccd72a24330f0ba0bb73789d3c31ea29c1c232c8a6b12d6c125b849e5601e184c0402386366ff36ce3af78268fae57f18fc4cf2fcebb91537efc6bc523f8d07442410eaa02d1ce0eaa4e6d6b95b03d7f2170b90a927a347379ced9bde1b60ddd731ada73cc7cc67f5dcf88f176465fc706889f4810fb2a50b2caa2263354aff94a83991e4004adfef8a5d01557f64447d3ef969788e9af33d6f1d3ae3f347c4c2726fc6e33f91568482371d1bacfe0b90c33ec1481ca8bf2b66c9b139329d2b110721bad3bb3cbce9c8c9258d2b44a35431c3e16505c5243dea969d4c7c4f089dadbc97d9005a26e44d8016d80f474792a1cf6b62f1f657da8a1cd76291659dd144fcb94fa4fae36a025fffcee9d0c35a1af6fce2bc424b5a423d58cbba8def3c72c45c7dd57a21080605f9e5a013048e92a2302c8acbbb0b1bf2e7a63ee71064f48748d3acca73f8d0f49da39fd74a3aa0208afa5e414397d27cc5a07414718ac2cdda55c520b92dda1e202d94be22993831a66fe487432399efba01d98899cb87c6f94d9df5f48a63ac944f44d3843da2043857c1b19a6ce24f70467d275287283720da882c6532c8837b6796bc142fc67e4bcb82f1c2e772342437647443208adefa65bed5e9d9f5896cd0ab5d101b3a557828ca8549b6b6133b486bd8a7cdcccbd2fec86e5e1d825b0499793e8dd0f1d67c39af5ca04f791033fa4192c7cc3176722cb4769d984618c45e7498c8ecb0fc851a8f01e3557611d07100fe1c200eb1ffed4e78b51a2f11f2d30aab50ac6ff0b70f7f988b2793cf7ea4a3bc0c68197360d4d5df8aea6d18ff91aa817d14e8a5ec66a599020b7d959ba3d0be67e8aaa0c3f80eb4f5ffd9fce008bcfe1386530e478a3689fc2d2845e91cdd46ffa8c88cc20a781d6fbfc6f9b4f5f3c7821301d78bd5f7adbd369c4fb70c788c9bdbac6a7341cc35ee74c88a6287b1e2bb5a230eeb4a9918ea94c6ad9963c3eb254a64b52bba71ccc5122e703e058130432b2ab9495d77263bfc2fa9d8f66227554078c106441072764ee6711911dfcd3b4acd7d32517f679da75949b3cf6806b7d02daf521d3fac178387f68af2adca49ec873a61a7b62c46bbee17957316aa07a8321a23314e886e25316f671bcbf695fb3fd77f6acd0c55468660ebc1d27fffbd2c7193ef0d5d49c47c56eabdaae4fda0e1f33a603a2bba0a66efcc210e7fd510f0a9d6cc9a1170cd4a5b43d678bd9178de1d9e58ddb881ecf64032ced2830a63df7da258dde196a19b979302aa16c5efdc099ae2fa4bf4cb8f40a159e7acdfb26eaa0aeec8b3c54db438e6734d5bf1c57115d44d8f5118c653a23d9df54842fdf56112841fb33974116557498a036e8551e4a3fe8c3ff5d2f30409355fc3f4789098982388980ecae9516fc49469690adc87c2cf1b4db3abb50e3c30991abf1d6b1e0785bde925785610207c23fdcfaa3d05919ab7c856e2a9d4764237208ec0eef1d1b90d5c3dce2b7165f5f6b1f440f8f360d6c505f01c8817a6bfe51b5c2d29ccaf377c3e6569a378f5b6a914ec98bcf6cec7760f2b59c1469c73b5f2415843b393d80d09be8b0e0fbe0ff27cdd20f17a1d095a9163b203b8e1d7ee72fd278f56ac79c2099ea0605b35bf012f7905b589b6052b3d0955cf6ca46ce678a4d3819228f21ce7279926e785b42fb29c7acfd5dc98a29d4b89918f7a95eb97ecf724c40feac3c587c80b30ed8f7db64023d0405629e59f323822cfd82edd2171e1197c391b945cb95668b8eb146186f54c30974488f80b71c80894b2a32a82cfe42d50bbc10a482e1a361b0e8c4426faa502a72e79ebcea7cbd293fcb1580e3ec8c923b862167f7bb31d45e3a6183147f395b3807477c0a589d9a44752f58b0083d9d8b8228435ba7ba3ad61b351996b266f291b02cb2c577b6cf75a133590fcd1993bdda62f91afd1de4c7036bc3037f18e308c9ee9e68853e996d31d33767aa5f309b68106a912f9c7ee37e6202329b106d76f7c20895864a1bcd514e4f63a00ed79dc9ee0ff93fcc073a767aaa3e1ed0b67f55a3f952ae33d99397c456f590b0ffd33ca708694d0e0b2a22a8d0ecf5da275ce6e7cecd171c5d31549b06aac397f92ca033db30940ea597d3fccd6fafcafaba92f575db7e94bdc271452ee8499b00236eb75fe705c00b9118c3175a511ee6495f27956871d822570cccbaed2afdcadca6cde8189e0f8a6e0d7921d03b5aea522afb9adb3aa36a4009410ee047513b335cd035c1d3b0cd408f26a8162383258b812910ae47be4ae193df5c09a0f4315997f1e7f7fcd1c4fd4af322c63a04eef1f7a6159beea645a8de0bfca043481cee7374d3229d8804de557cc474180e3ee431e0f2c8bab5d1bc134355d57d23d7c4f8c66ebdc88822c881bf4b9d239929dde7450a8a9feb096d074f3b99ff80a7804545576af675f7f6fd1bfa5f97d4606735bae4ad778fd9fdc31cd49793d0e3d17bfe3111f24dd0c0ac5d426c6b43d321871d2c2c8d32ce7a8070e17959d3483d0c4acb756e4fa05865091b99ad3183e1706af0c19fd691d738b417e9f538c3ed02a24d7e2674a69c1e3e8b16acf83422b11b554242ce995633cc839aed0e7c5493af5ea7f016e361700c16d4c0d787c56c01ff93817cc157f6f3b0cbcc25f687da29f72e7d32d574fa47b53fa7bd33dc8825bbaf0eb6afb4ee010f416ae1227e79dce8a1bcaae000f627692a116649a61079b738e9c6ba8cc0d7c0b39aa73eca762588d7fdc44d217d4f9271aae51d3ffa0e62e38eaa2e51b5255e2142ef0987816b0f29064334219fd08a5f72bd3cc2c3b66a9e28a0f9a8de84f9373356209c0bbabefb26bc8ab0b39f880d0426d530788c497c92da343b2d94eb223171effb233abbabfd17df674c1c959fc4933b79059982308cf8fadae2cf2c7f2b46317418fa4b3ef786afd0aa88a0fad86f9b9e845c0035c258664a21859fda2b545cf8b198ce9d8a328848e62a826a2aa9e99a172cda4cdea39f354eada2a50a0a4cbb5c7e11ce2b4ee473986390cdc2beacf43a4e5aba41bc7a666ca67e4d765ebaa23cb10c08843d3f3e7d09a20f017e0acdfa64c5f57a9d8716f786d8e3c6b3e6393639679481221995e457b218f8a099118a17bcef4d838e07c05f4af200cca15f80433f530e036fd5c7dbcff6d3c91682c38cc8da30d0b98c682d15691ecb57422cd275fd050ce60ca678d47af9c3653added08add9e00614691e43c81f44425f025f1e7169d597bb26efec5debbafd7019e0fa2753767aa65a0f17c6bc0b38c4c88929c4a6bc4bc9871450552d8028da01b5bca901b07fd66aadfe4b2b7570309653c0ef21bb633e14e14ff5c60b01a0e21d77039376ea639a51eabdc6cad6bfbf09a88fa78ba9c79d54360a1d4f4c78c416278fdd558e2f6391e1a2379e57f6a44c3e02aff4e2a60e4c42e3bded31931c7742985f7744f423190858f8ca5c7fd0904d271098dee92529b3ead1f2876c7442c012877d8e0d6578ddd1dbcccb0186a2cec2c2d5fde15b5962381edf7815fbd6d370b93b95e5456a2361e4ea9723cc1490505a5139040d12f9007b0637b55ce219f1ce6b8be545d1f8fa6a05efeeb3a7dcae2518e42e0616c08802858729f0996957a3666423025dbbb242031d7f5c0f91c2b8bc5a1ab9c82efa54eefa9b7509e6fd90fba6b1c5851b25d422619192fe415ed7b5c56662a19bbae978fe14d15b7ba721e270968e47eba88e3b08467f58dea28af6c5e0722ffcbf6de3d08ab47c288e91395d93ad66059848e9deb7f59e5a0f483232ef03df7c155e2c9824c2f719f657f4061da0f8f086b5aa4f3cdb242d285fed1999e874639bdc4d7eb3c698ca7eb2e2c23697bce8f85ed42e0e579502d3869835b151fa218a100906c9c5194f3cc3e513ac1e437f88b6aebe1db593408ba7fe6b595b90efc33a542745c799be382a124fe1e7694d0d70650868b18a7a1961cf08948ffef20b65890eb175cbab35d1962213521ab0e1dd5a53c3ff8ce4def574becf5cbe8fe21e263ba6de0543e214866758547bcafa39c091a152177ba1b41ce60ac7dd9807b762430cdbe3f3cb3e9a4c2ace987bb4b1269c2bf3f1c4ccc426687895532cb7ca4a780b92c879ad4b9a23a26b46591016b5fe7d66121a87a971d13fb8525f059c81388c0090f03452659a3dd4d63b30638f00a7d686c2401d5952b30cc3a7085fde0d9acd7f73a6a83e22ab1f85fc33b213b0707f83784f23c6c5f3f8d6e7726d196299c1456e8ee4c87090d3922f00c2be064bacdb57889608b943af45edf7883f11573f72458933b59572ed7d8d9aa9cd705b4ba04177066bd0b882652265195fe55c55670aded9d40e456e4ca6b181134c0c96ca8d9967ffb896f485d98ab3224bfc0067d44decaac921294a5a3f5a4fb3ed41766cdee880028ee80cc0ce84bfb5180b0984050eda4841977ec6e6486e1dd6ccd9a6e9807df531a278f3b1877d687770a43b84dfec68ab8459d7ad0b6286ddeb3b81d797c6095b50845d155a828071545fc486648216d61211bbad8ca97c2c92dae2f20c7f9a5922580ca53977a82310247309b3183567b2f1f33bfb68b2cdc72ba44610ab4196b0869707ff00f5c047bb096e0233e718790a0a4cdca394746c4478f0b2e4122b1b5f2c39391958a2f1172d58d12e6a277030fcc7ffd495ff2ce68a254f278e48e8979d3dc5fbbbf245c0eb6c02343859a1299f786e0af97321ba6e9e3bf976d9fe6f55a2e7cae11a3345cf5a1a96c4b963ea024a2a8e31219a7c2e81583e6e390d38e7b6cdad4464826ba1bd31aff0e1e6a6874c64aac0f804428393fb387b4793604fe31376521898135f325622224442bb33e652ab34c27a8b12416b97110c4ebc476f63d1565583eca2012c504c78f6ae8a9efc6b113f8b610700a189e72c577074f81ec25855f735fa2ce694fcf606257df10ea84721341a21a5d2c3a9deb9fac9d0dea7e2a5c4301694281fc3d7d8ce16278cd4796c257950b910b28fc60fbcf4b771cc545ef7303822d65c3104c892af7214f569c2f3d44359af4ca532ae3187ed0f90f6b9c906250d1f361f1680242fb639af1fdf3b4adf32a147f61c4d61686adea1270d5f32e645694e39155dc4aa1a4cd3f22b0a3c1fd618dc50a8e6a043fdcbb0b3bbb1ee8b834b444fe408d9b042fd7e4d54973d5883169a66f1149101f602cfb33abc2e5f33851e0f56db86a5a83a7a686287b918ff409ba2d2ecd9e1fbb22385d8f905382d0bf7d4b62f0a268387187a61614fd0b2fec839f973cbd3430a691ae836ed566a0daa470500524072a278f1f63e511efb65c46c0c433daba80c5be2182bc17e465466ab28a1c0a767214763d8c9df63d748c9e7170d314834a69436b978fd3ac296a99ffdcd4c71160fd2f8cf89b4663c7001587facbf7939f8288d79f4da99ba4558131d1daa90e998ded343c94cdaf0cc571aa1ff7b98a8e45e6c09f462a5f49cf90047934cb67e8d6d917bbce9164f27f9a52cc71310e1825f8d1789b20821912bfadfd7b858e45df3224108d5fbf5630f37ff403a4152d748808a986fa641be81526b494187efa4984a061054e8ab00b264f28a213d132b987f0d3d7691698c79a2037340bceb90c86de9741b31ea49e08cdc53c91556c30208af768db954c21b940de25fb55a56f73b9b5afb456b2de1da060e94088c3f158393b22ebf9cceb5808424037ce5e5f2d07bc564c0347aec9f2c91dde9bc1f3e19a033ff1b2abfca16aeba9c288af4d2558058f373df5adb78fc31b619a2addf57059eb44ccf032eac1888e115960d5747223aed5e73cf82c7aeef36f1b62a8a77fc4bd924a06a36f15dca495ec8843146ae0af3115d582ab3240b373e634ddef3e56e3b55eedc9d3eb4741f5abc30143ee2fc81e8e9736127c05e50cbbe3999791ea177cb22f554e2b432ba630fdaf5f0d01587225971d676514973788de553c0979abeef7f2eb995cfb7fe64119ed0f7c280de949dc0e22d6c3e269f828f45fbcb067ff58bd001984fba617065d6953e325dc8e5edfeb5aae530b6f5617afd8b9d647c9a89465fdd8bf0c246b5674754765c3027a15387bd7817a6c0f2ac8f8980696da03d95c55db0cb5259749a23d3a822650ac13e8b4f198bad2a5e691a5944abfa7ae77e96a3a135bfb9fdc5ee799cb7ee36651899fdc8deb1a770ff5c45572ad9c9b65e6764604a6a9f21e4ea2fd5ce746d8162af8c66dd86201b962a6737247321bdb1eaf047abea5d4c43538ca879fc1b9bfa1eab6c0200fc0a87cd350d2bd448b239df56d6331f76453635b6a8e7c30ec4ebfc612a22798097f39d7c0f2ef2655b6bb168a4f25fb3f4ea0ebe7a846e8172a86a9b78603c777fc78769dea3b51d6ed60121696893c091ec15317e04f125ce55dca3cb78cb5d93845e878a4e5c4a766afd0fe708a6d36075827e021535c60e6be8e84083d3ea3ac4132952524990bb863622d732e8aa3a97d0b94d6bf5524b845af056e76a6f1f1c7bf405a8049d10dec7297f656b43d636d47ade7114e38cd724cc133586671eac50cbddcd2b9091daba53538568df263dd1b28ba6f35d628d440fd9f1fa72f02e98100f8970c721c814e5d639222ab4e4157f6f4da71d402e92ffe9c7a6ca16220be2985fba86a31c855d1d1c5e6d605a20b7689922a3b2d2cad91ec6e02642df57e4016818e9dcf3c6617919164c955c3eb0c5546938b9fb5cc701056ab4dae17ee9b335b94e4cbfa11dde8957cc1987bf70a0922690e820cf23c1eefb7b295f91a95a4cf24d50219156e0a300350cb0f77f0d59ddb1c0d43aa9bec2c75391f338bcae91e0513351b925f8b33692f12abd44f0ee105f2cf672d5255c7f53b93bd390ff564325a1c9378d91bdc25f6cfa64a7297e3fb707bd7c2cc31ee77c4fa843c985f159045dc3662cb1148ac73daeb6e17709fe9151dd1548d15d334408e3d55e8173d8023e1328fedd0cf11aa0a9df04c272bbbe3a8fab9cc357358f6452e2bec047f93dc2dbdf8c6af4f449ef91c38238ee2959982528702502fd0f7c2d3f33e9c28c935ef4e1a565a459ce8da2058fb804892c7cceb2f4a909aff1166d17526a3d8961c843cb1ee3d89fe928332de8057ab2cdb3de295dd73b642a592042c833c0a9872e6c6e72c6125aec02c709f5ef393ea25fa0e4e0efd89b160c3dc4a073aa548a656a9473439112844e183ec62c4528d4f64ef7c7bcf22da98665995f47221abc4cc2c54054c9c11f295b7d35cc0e1e9e29dab97c5fcae4127a494fbbc682ed9fb6cafa124d3508c5167dc03e54fe338085d2b45e6eef1379f53394d912067bfd94bbddaca739020b63db6a5265efe2088f8018afa6d38b17617553f9af9ea1eac5f4ffebd78f55ced43eb079a23682a3405c6a1431437b16c096cada1154214003adf3e9d0a2d2d1f9e6de3067c191e937d8801f1af247cdd369bdd4c99c7bac551652de9a9be2d9b4e2df95cef5311c549c80b253d77c7a672354b2ceb39d110cdc29c63e0b3ddafcdd80607cab89324bc9974130f088230c5c437d6cadf5802f25ad5984dec64965262dcdc79c6dfe3d867fcc33c94ce0fde80fb9cae3441b23b29b8ac10f8a2c0ba1402c61b39218c81030779e3872ae89a65c27835538959f9d9ee8cbbfd6daffd8cdb0a92a36a0fa4c0b1049eea97c4c755201af53a288ca7ac31f8703633f81ee446aed06cec02ab97f6c1c4708cb3a51b72be02c8179ea836da26820e9c35a4e7b4b26198a38c44909a6bbd854cf1a8d5cd0e6955c97efd3141c6c4c72c7139c9055b7f41018a762f5491ac6e49f4983dc2df0612b5871174b3e729cbcf6c714edd28d3a7436b4228a66ad6ee326f06790a9b15714b049461fa8e56d76628a7839037609d2658afb5170957f1b33472b35b6fc580d980084947d161315191be079d31e409358f527bed3d8b1c90e4457e9f0e5a74b10ae55084ff90aa6b317a8749e675421d177119c95889f48ed8a20c8a69efb8843f53024d7186a0dc69d158d18ab853f3088ef685ece180024cf64e0a89e12b2dba179581eb46c95665be9ea4a529e0283e87e95e7d3e861c66716d217aa01182e1d9b2773c03c37c368b9ce1ea052530b9bcb46c8c28eb0ef6d2069ca1273bf89db29b9eb0b97257972cc4ebebe21257378f697ad99cd64ea0fd68e4c6ed247dc0b69d2c7ac526a6c9f7f46384247cc0c7d2ecbe0089a956450028ad6979384b0baa951b7764fbe1475c19864d9284dd4624cc8999f5c1294b475f72a351773280809749909a939298104076c42aa76fdbbd8e89adf09e53af713e62c3b51a1582666919718cd38293f56efb3151bf9c0ecb4fb2b1547133eed42fd301d04eb852af20d964e5eb4c7c3b61e8eeeeb26245568abe284d7278fdafb3e8b2391ad716eb727fd9347445dae09c5763b559d2f63fb7c44610edca8a1452c657499141e98d85f09dfca730fe5d7611a7c60a6127c9edd57c0640a1fbfe397d91f46fe2b6920f8fd69304938885f4cbe35cc6be76c856731704b3f5561c8f06e8ddde50e70dcd24adb352a908c5356d346cb452eb868b791605d8fc4d6970f012840f83e4374d921b11be04655584195ad60a3952fdcc5541690442fc5d02555f854c136f8ffbb7b6e2a654c4c499e9ff54d5182c7d033e8c01168f50a3a94303be1755bbd8ae65ea9c3140ada71bb96433b33a172341eb2ad3d6868d684b11facce7daaf84f4edc2693a5d2987436ac7eef47b94d6042e2ea2a2670681d8c9ac41a037e31d4c72fe71202b8ef5d1e0a158535b581dfe16c3529533c0fb7dbde3fed33aa37c7e07348a64a6a49b720b82ad2bfab58d7ffa4a234af582245a58e9952f92ae7a6c4f42d2ef2cd5095d836017cad4ebe0f5ac3402d50b589b63f78f35bb01ece547c2db8f2119fbca3bda1df7e1e81fcb9a5216bf75560474cb0da455321e2c28522f2e9e868ea37951b3517934038c675c8ee4485663279cbe37987481f932278b24bc11623f2ff758c40c0ec509a25a6e158e0c90ba90118a7761a1eac478155477a62091fc74bc1048eb135c62089bf761f89cfacf19c1a63fdd5871fae1de90a3c14579b11175c4a7e2d439d2de56d352e537d8ee3160bb4706649ad2180d1b3f2e948382ad779b746e1b615a3bba349e567dc04b763d38d78743fcf9bbf4670c84bc7a02b0d376b27bfe7be80ad84e004bf906789e895f2a0e9b8071b9076ec1a188bef8b1d51dbe1f34f8ddf84af8cedc0e5fa945323d34a1d0501109c613a516ccd6de0929dfdd9462e3c0c272c9f5a41c1d881965fa10e8892caed2a9140111d26115a20ce681ee19777d1969b728b4bb3f7525cec0c427d146cd1e6693859f0c1b734c33bbc57b2fa7635ef3300ced2343a82346fbfe256293ce0ec887e4f5a6cfab79389305dddf341861b16c6c53e472a9422b5131d356edf082b6fc7513e94f83e8197133705da5f3a4a47776e90ebd359b7dad2b40c4d221186dc1724a5cb10b625c7c2b049c26e0be79a68c476d433afc0a07399c50ff68f6dbca73d20009ebed54fda7c4ccf70ea1e235182e92bc32f10cb6c42b7b80897fef8abdb02c9f50aea0f244a0a3ea0efd1e343f42a14b69c46e1eb739ee3cd4f73f17c870dbf331dcecc1de4be533ce485753b442166d0703ac18eaa0fc0cb0b4b7fe344a327535aa0fd8a8f95447e98317f285a595c25405a10023e0dcfa011901ec77f4b1c567bd45e09ea235b380061b3853bab606966e4ff1a805d439f0fb660e8990f87a8409ff9f756fab5a0d22f73174a9854a9307caec371bb83fcdf61e5363a753569838a44e2532676d1bc205661c2d06e071308877bbbe18d090271a4035573e3652621db5b3733d7f17138bc467cd2ff874cf2616cc7f5cd986d2a57fcb0237c352a1c07275e51445baa93318e17c08dca9dfe347af1c886c0c56f5435d2bbea410f13956256d76c826749292b22b9f4925aae2788ebfa23520001bc571731347aefb1a7ab899f9754c37d8b6f62d9dac6e139bf7b1ad01cbfb2563a653eae68b15be3bb360317b86a4804fe1bf0deceb77e7022e229a11b6915001de710c4a79cd5f2b2e2dfa6f05b5eeddacb0ea9a66b5d24830b40f2d8329cf41d8e45054dde189e4534be12ef5fcb24955ccae54b1c49248187d06dd3be5644e7e75e5490f5155814167c8082271f93f38345b2d52f5f2b687e0196a2f47e756524aa0396944e4ed516a309c46bb6a0f1d4814421a16481bceb1918907e7139a803b63901c80c2448e353ac2a3025b9f245a7c7cd32cfaf5a443f96996aea60a64d846b8e960becca2ebe64281fd92fed3f7529b57660c7b1977bfe6fd2566d77f0e2d62453251c39f8221af3fc86e536bb4fa74100683bd8b33634dcee887c0c2eae28503332bcfaa541e673b963641d3a51e507b2df839ad5ac6c0f672f0205d0c79d01865eea918b34eb3ded74f52c84ce408fbf7faee0011b1771e4c8f408fef30454508b638e82aed6dbe59dba83fd79df67c0bf50df364e401caa450d5fd5667854ca14d5cae044f8c46bbda2196b57426506e06d24a45f767f39dfaeec9c9461b28e714f78ed29ae6d80f746817b421283d883d538a2750675b21301127181d13082c2a69f21306dba0bd624fa043be1ed389f6aec4e5fc93cd24988526576914f2321e0e820b4cd4cec8917c4a927d84f3f825329296a885f0c7401429d0643f07b41f96168604d509f97dd485fd7d044945c966d716e4e55025544192fc7c0dc7cee64e6394c3f3fe85c64182c14272cbc3db577f4bea0f82ef1d8714f2330be755dd26ab009ecc3b0f06f7e552a53729a5cbbc0b14ac3bf4dec0e1a5c2289f1594f6fca9d5652c8c95f3e3807adbf83d9a70bffb5d3a277f9f939d8a966a3e3d0e46e32219512e66abb0786a71d141e43c4f83bed0bae59835cfff13e022143a238c6134d1aaeaa5dbeee9d769cc3b13448ac4624053b733f7a41af8e963ad545649bcb4083792579a0a87ea0c3b11cb0f7de594855e2c2e66bba684f998eb3a2c5647c269edea8041aedc906771c8b11cc3ea1d8324f34e74587d0840f19ea8a718ad693fee7180603081b36ff333ec8720038abc90779421112da5ceae2f37e53ca514c9483688ef6b6b483b3059fa1e52def8952c2291b279be0c0f0641c16ba78f3ea6c8cc41daa000f622b63be7bfa41f290d080b94b4ea35598cc644b2b2e2d8775d81849a81d42e0b8c41cfccf92944fa9a49afce87179f2ce1ab314aa0e5d5e2d4f33b29c21b8a2e706149dfb0e92ffca6bf18375b2099a164a583015102c04e0b24e0fc9ec3f81adb2c3bfa9f2013691950f6c20f2f3ce9cedf073bfd086e3c16baf408e22e05f399b4e3c0e36778c92449f9b45fa46cf562bfdbb08ebfe74dd9'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
const args = process.argv.slice(2);
|
|
41
|
-
|
|
42
|
-
// Create a temporary file for the decrypted script
|
|
43
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
44
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
45
|
-
|
|
46
|
-
// Execute the decrypted script with arguments using spawn
|
|
47
|
-
const child = spawn(tmpScript, args, {
|
|
48
|
-
stdio: 'inherit',
|
|
49
|
-
env: process.env
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
child.on('exit', (code) => {
|
|
53
|
-
// Clean up temp file
|
|
54
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
55
|
-
process.exit(code || 0);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
child.on('error', (error) => {
|
|
59
|
-
// Clean up temp file on error
|
|
60
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
61
|
-
console.error('Error executing script:', error);
|
|
62
|
-
process.exit(1);
|
|
63
|
-
});
|
|
64
|
-
"
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: 'e33604cc2468450f1f6b77db9818b7e1',
|
|
33
|
-
content: '60f1664c0a6feb686f26965bab26cc372fe541e91d76d5fc8d00bfc620b1bf52e48696173004e507afa619da2d17f99fee3672f3ec9c062298efa69a26172cd0e1f4a092673a164cbb3078599f6c78118c0e3e9bf1fce020d7451164799b04bc2d74cf11336309856623ad5c0fd8f39e37549c3e5d058711c552bde1a649ca2232662d2595282a5a425c64ec53553ee4bc5329193a4a423a12c5272e31c44d2e12dd68d99635903ca379771081e42aa72d0843c9e2588823bbfb6c5a9d6837e44304e24eb231731ea42080c08eab1b39612b7e3e64e97b7c310501b1fc8cb717ebe22074d7e8c9838a63fdd8d9f303cb3c88024907da56bf7ceca28efc39b9220071c47adb668c364bf1be9e99f306d2900d92275a63ce406cfe4d748dff6fd6319daebb446305dc411d941e282d6b60c5fb546e91f88d5ea66fcbe794f32e67a0a00fb2c8c27367448c0d783a1809a8da1e868e18c5ee7dd13e9047e8d29cf181a69bedff4fd9a1d40d18bd9fa8eb71b8b2bfe3f62d4d9247d33ee5476f33f036eb133deabd4de533b459e7f6b5d64c78daf163bab2a6679305b739d051f0497025e866df76f667d429ea2c3665653c9a31d6b1eee491f2e023d2542a6cf4a4e9628c1168cbc87fa3af00384d34209f93cfda7181274ab115ac2cd45cc5f0fb1bf260a77c2450d319fbfa71caca76ea0cfd7f485ea5863d7706401815b490efc4a543597c013ba190fe8a080ec94d9480e3e2f637ad3eb22223b7557a849bc05296450974b4e6aee9d94f864b00ceb795fccd6ef2fb4cfa9a40aabbf17363de3bc054ed6a5a411b8e36777ff96e610e5cf233b5e2ba6f83b2436cb8f34a1588edc83425b0c4e473db5d8735444557e35c816f7e15c12a611db3ba824a66aa06f875d314b0b3a0b7e7bad823eb26c41a403b99b84de9ff9580d2439d11c9e0d7d80393601b72cfb631f220336dc08cc80982e759cb14a7e063e933f4dec29ed8d0bda35e085241371b6b9161a43d572d185aa3c6f45f6c3185a22b967fa0ad6196c3452fb6d11ca2136dcc64cf3c62fee58923a005147cbd1c8e58a0a30c4f4cdd28c0e9e7413048246f0f32d901734d983bbd30f977778acd746991d0d294437b5f447490b0474228d5905270ef98e27cc1831d65eafb865d22704fa763fdc8a9e34b07926d68355d8d6a9c2df7ded9d9a787f33eb7c10ac096d0b262c9dc132ee3d808742add8816b2e3a8d315c74ef356583cc6a46d6e8bf3c04bcf202116ea931764697617f6778eab5db5ffe72b4e14894048587ebd7c5899e882274f97c3111c86daffef5fa1ee31d982e2178e38b894ec6b00ead3368421e626651be1e2f2bcc84712afe1760d3eb53a3a07924143666ac13191274854eb1d801e898a819acae4c5abfd3b7634679d45d1cd50d09f96db5095c835c5770ceb9717aa2e613b12ae597fdc7fabf7094b633aa0be7f5eaa050072f8fe119fe768fb05b55a8564888fdd89d6e6197a1ddf7bf1efb1768443b9ca4595e0e838c7eff8ea41d0cc418b6a6c68a10fdfe4a130f9b7e302f3eb4365e347331c0d242822c3fbd626bf3b4b57a5c0b3bc1295dea2b403d0a37f33d14c938c5ead01a88b9c91773c322ce013a88f1389dfab2d41e13a6285fcda231f5d357ae4e7d16d3fbbf1c7e5854d7b94f7eab74e3b69460491e556577aae8264da780c557bec50599ae41b97be2cb78c26ced360406182ab364d6cac228ea736da71822cdc3e073d7b44bfcd3fccbb0204c79b4e88813b945e0b159ae82a74d93dfa0d29c2c58649a7edd9f5e7f2cd20b9ab77a9e4806d793cb03d1b5b07da797fce6fd08b2b130f02c95f9e21ddeb5631c499eb38860c14ca98803e14b4ef316adf29466a43e5f07b333288ab70c4a7f8c920510ad7c269a92fd704c19faa674013c4e4d24a0398ed2a62f270b188d683cac7363ffe8da88e46bbe3456cbdd852a66435996820b3071f9878e23bdb21f78391ec33b7203fd774c0a8f10b001a64fdc588a9c5922e18b297b1a38be6756a7a23f8cd5d188077bef53e35b00cf0c61534b116c3e1dd21fa474e854b287a94d188c9f194e4358b41805d2876009a139337cbbd5da0b75e3106e7d322c80d8cae710fcfff4940f0b6b32b40359171fafe4b409b85925c7020b3dde6da7fe7268ca26394881aff5e04c1565e81c828794c994e54e83ee04b825322db604d2e0c6f4ce27934d8b982d6c8b757322aae8d20e04a321a010ddbfd192ed4ae4d48797c3e7c4c43478313af7ebdc85b8b9fd113ac502e8f433412aa9a36797aa9c84971b26beae89571322a0177687449847b77f0b614ec334e2f3aa0eac7cf2c030cb9c1b037016b714ac15599af9ba6abc31b4937c2495a18a1ccc43abdee5596dc3497bf14b443ee92f228ec8b2c430be47367fd9aaa6327ea77a3e02cfe54a6ec3dd383e2274e9fc0539ff5e1fe7cb03f859ba6d45c84179155db3e7c0970ec6719701646dd46731a9412ccbc04a09d7ea809ff620141156dc895cc95c30c59e1ee33c421b87764b52d1f9ae411c97da69c3ee78faa035ef3bf78328da1d44f3a19e9ec7a0ef3586493aa02fe878ec7ed27a36b3da6dbee4bd31627b4990157b99d399d0619a0a787e8044d86c8a05c242c858027a0fbb5580f0416d95ef9ff5ce535faca7259fad8a569bb1b682fb93bb1c0a18fd41a5dd4a0826ee71c2df75ea8698837add1abad04232f88cb0fb1064259bfcb80443755325ef164fc95a163eb361e130d6f4681387a7342e978f9be71e243ee82234a57d30d17586de60c22275f5ebfc88b446e43d7190b137ca2e0244cd18b1b95a50e93092766718e1edd899a0f3bf9500f1caadc453cbd52a0479ba643e0a01dab59b7b9de6e0bdba7b54cbb6a0076e882adce30f7dd658b01a695d9a2b149fb426e654a06cb45b235f6841b87d5b1d6318ac2bdc1a99af789b57f354575d6a931c7df07dc49b196a63fec5855768754031210f487fd1f74a45aa723a20f433a75fa2eb632d7706250e1c859b00002b2826731db798773a73a19f1b51694fc22a4a7e1f260218dfe7d1e2cd5116f1ea4b130eb20e0619799ce65f2eeb8bab8b24ab4b38fcdf79ca6163784829d4c532a428e6abfa30619fde7b68874fe18d14141b19b4c348b4de521b2a8389d62b69b59f40ad0a90f36f42229daf0d8f35ee772f380a0e5c976d51ba2632caff257e4e70af87d3c37b5728df37c2cd84abd88cce7421860bbe249d03a828c43fbff58a90ae30680a5f80d1ff37f11357d50bb7431806562450784c18db09b8957b81eb61bb054b0acb8cf3d1a5664ef0697c4408335a175d16a9b0e322f60da202662e54b42e3b787076b664b894ef52d7bc3b9c0e20fba7f71edc4276d353932a3bc86afded40d7df1ab9597aed1a8578a56563a6f148fa2ec1e09d28a667a3e736fab5284dc710c9382c672f5c8ee6b8a2b4d500fdad6980a562ada0049b442e2c14ed30884647cfdf78cf2db765fea3cb950aa0232994395b08dadae170828afce9c474fe4f21e770c4bbf2aea0db9d40759eedabac5823b4255f60b29f925838ea73862a56561a9b5abf54aa0e350a9e30f317d27fd8e4435b292daf47dfcf5db14e2a73a5e8acebc70a66b007d21174eb821b3ab8030c484cc3154fcb2c981f3014883be91bf7418e38efff254eeae3da99ae64eb367340719f74bd1d723c672de45141ab6a052405597daedd129707627416ae4cd9b2dd869fb866ccd70b871cada1f36c663eb9f867df57a6167ce7d5310d35f5c5b6c3b0efca653d1b437b6ea8114cb47145a4c245c46aeb54c1767f0ee71620e2db67ac8b240d83ee7636c8d4e0671a46f426a813368aa5372695ccc74e48bcd2ad5ece2da8f567e0302034c1af205b2d9de74c5b4fbe22b9ebb9120347528718a7b83c5a38914fa47501356f849c2e16f5a6ccd765ca774a379334548278410a164ff87dc13682c242b0aa3ae7180976c186976ad03110739c26bcf42f0da81ac368615c2a72bf06e4f7c3adfca57f2ab25880058a7a7c486c59436fadb33dce9f48ddf9f1fbdc3c1bb1f9daaf07da920b2bee19ad88b7cdc8b17cbd6a98ef51adb40403c9af9deee7c5a0c9cd0636bf8b369a9605ef6383e79a976a73c54336fc6b33ead60a82700281400878e6c80b5184ba000c2da2cdcea4bb2005cbe8ad91939b34ef3dcd9cc976597764bc8b411262ea55a343570e8aa5fdd7e73cb64a03d927888100ab339b5e82d1e206914052d8f65cb370ba83f41fc0ee5e873d2eaa0693c971a8587020abcff28ffc2e01f0f3192fa9f97cf719647fe4d5c326e570d1269eedf81f49c6fe17ded31800f65c96e46d298788a69f51300bc13a253b03da04c498c998579b191618f7e78e24a6bca077bec4b030b2072c0f66897d0086929b809d57fab373884275181e5c31fd98963a4f3188fa3b7970ff18d85c2877aae26d2523cd7f1929e31c9aeef73f0c12662647617311aefc5abf729f6576b990e1801d19e53396fc28195994bedae65d82e006c370f007e8968c952cbd96775098c72ecc0097b65cadd1537f280ccd28d84af27a6efaad496792bf0f2ccde61fac4d3b83ea88d86262c270d06c631acdcd06f98b531d25822f9fc7417e152c9821b257df483f86753f99a682ee2017e1f8a728e9c1e98270ac6e26fe9f0a8fc85c054a739dad19d9db1d453ed24db48fe9f6ee97eef49ba2a4ca57e0e930349583d6c64cae548887e621f64b2ed279c91fd84364c6c834601b772f749603800f521ec2091a832ae709214ea9f5e401585e3644bec249c897eeafa517139da76e8f0877096e12f05d9c0793e15587ec6d11c3b1b92c7cd9dd394196e05da54ed166fe1bddc73af13100ebc8d0eea4c8996636e0b621252a85b6012c52e5346b92ff4d42fe76350f87a06e47570875950cdb83c738133bd610af09eae11d611688feee159b8eccf77a5b60a8d25d62f6f278e58c362886a34faf0663eeb30fde2813fc96413d75ee5d6d06cedf5b9193a9436043106af337ed0abd651fe19186a0433e97cad2bc6cdc2f5fa3316bce41e767ec52b6100c075a034fcd486cd1fdfaf725f81b83682869242b03a905b9dddd4e5c6bc715ae427c07dab2a81186a155590af1a6ea84f3af41395082ca0477dfebbd084c0c367440d1d0e36a1e926fdb6d67811f638f4a8456f749b3fd810dc2cd00fbaa202c19c72adc872de4361a89548eb4f643b796f9f887a473f81b6e66f0d019247fd3866c387da58c68841949edd979d208b1c838695e2247425a6acd90fa8a0c7137c4202a1c54340d639581c2f305d9869b1f5618ffb809cb41c66f8d53669d2ccb16f96f044a4f433afde429b542c81627b87317cb6f3d4ea302f9b3b8f70375919f0a3f39127fdb443fd676dc27893afc0fc0541c6f9b3d9e0947e9524c58759288678062dd085845f8eb666bdcfe77d9443bbe41d348e5ccfce117a2cbdb9c4d7ab18b19bba268ae3a12a5e6a0affc8b569e5a3f35298804bae802c4213cc8576a9e9302cb94e51c11b142c865abbd52f41822fb96ac6e13f5643e58d405d7b148b336d845d0e77a5d982cc9eaf3c1f898132a02687eb9e93afc77f76886dd148414b2722edfaaf76c233d51ec1be86e35654d713e29205ea576aaa754ad9d91cb0a4af5db0b4f11d122e91988f5f14cce5459e314074abcb61370f847048acc6699e0e1bba35d43838d97906b3c355641de598cb15b97df086e630c25a2c3f11277593a9a85eba8aab0c5f423eafc5383151c87148a132bf3335f17b5701b9a06a1bbc32c2e061939216e1f319b01bda23d45b80f2e45bbd12e00df37224e07fc861a7c1758de39fc1ab302feb2d3f64a80d8d21534a2df34b74283dd6b3fd120ae8b489f06e43401559ae75881b0d0e5e145a6f517063874bee16821afea3283ce9c3d5d1f5f2dc0a42ee7d6296aa0f70d4d3c03552698f73b5deed413c2f8befc499d712ecef4311e0a577dc708434b160feacab104005d7d94303571b9795fd688740b1beb52a9585278d8366859e8d4928d58fa87fd26e9734648ddd77cbdabb5d71ad57c65a69c348040bfbc4238763ba209d5687aff1080ad17504cd64dce93525c26ba5c9fb8cdcd873889452cc032ff255d85dc4d9ebc301e428c63fc815ddaed3bd983762d67f730b228a85d8fedf5a5366847931de1777d45af14bc893df2b6d4d5635eaf27a7fbbc11f30debb63da227d25e80d3ba11b54196a59d4b9ddd4bc9e87ed79ef91ea8857db984ddf6195d6670138629be7d6c26adaced2dad98baedf737075cf3c20254b3a78753afa9d5960719618d9e96daddf620ed1995b87e22de73df429e520f2594c44725cd270defbe7a556216ca8917eaa5ec713e5fe5ca0f83576a4155919eb88e7b9078011b3161ed240bf7e0c0f679c807916302eb0e9a2f3969b27b21bb9d1cc2f4bd1cdcc3487ce42013179f52e16eb3e753cbb40e57722e8f9fef201ddae619e2399b1961f55d4d0d5ca8f438bcd16a8fe4bf19755cb8878d77295a4ae02b8b901d963140ef15412af4317bd88892ab0194835ec6a067e17a327e5a66a5eabbd393151d550a18c92b822d8bd94e1ffe899d1962a4338f54b8c9040fdf793b1b583252d9cdafc70e3ee83f6c08c97e65504a2a2979a18caaf44a17d558608520bca6faad39369b91cec311f14dc0d53491271862249a256e24bc99ad604d6307685b1eed7c140b98ca007cfebe2332e323d73d891be355cf7bd3441eee8fe55e9dc29b426d08cfff1f98cc86faba249fdb9ea3ac4f3217333ae93aeb8e161345fe43944441944e31d843e615e8c25e2b837e2b6a1fa469c38cd65f9dcc798f03758ff9a86c97fb816a1d95898c5a48a963b2e622eb8b74ffd3ba33c575a191e7acb526f52590d57af5772f1c3c946bf826969d8cf0d4a0a33e10d8111f325f3ae692ac832cf3c978254671d1262a862c4735a2b88f54ad4c017e55d4f33791fb2aefc7f7dec772d8cc4ae11d715d61c1d6cef06fc0010897845f5eda046dc33d5461d0dfc12f4b7b4e839b8b5c9e53e9fde9b4dcbf3d2344c93664403274bbf950128d73c7495a4af3b005b595737aa0a8ac5b8d38d2263d378e973c7e6d537f50885bc8425a565c2735772289303a38e000c2a4c42ee6407c1c64b3d280c633417b116fe3d391e538c4431fefe6d56ae4e3b02776aea5b1cc5f1e62b1391e86b651e8acf2cc996baec7346f49ac6141d403f879fb647971161f37335cc33ebe9eb14d4b3e3d575b1ef95e1fba711a0ef0e6fb6ffd0c0209a43a0a70275729b117de7e8e0b9b7bd2e539d7f424605a59c2b4203c5c9ba75fd836aee04e3c2495058b6a6fb02c92c4e31be6c585b4791c0c5df1f9a6dbdbb7fb2f0c0082e450f3f95aa8968bea1bdc5f743d415f8f98aa6220c943643f02a2f53048933f0c3b187a516160d23c19c198a7d423b9f3b7447d5525755f50403854d63af28cfa298f1311a711c7afc243746804380fefc790e6d2b0ac2feacece929e210b200f1b6d50d2a71f8e4d1db548890912191567c889beb4cc0a6444f6e27f3e5f3515fd4511158062ba045aecab66528532732d93287c1048701c081119282a68491b89517fba4864149195e8abc417e168795c2a8ce6ea45c8fe37f74e987279af6df6a13e3a3ef59e49243eb2e15e9d70722ea45e642f8b1634f055c57805b96f954cd1bd0d907baa5b425d7829ad5b1250bddce05eebafc6151e0b9f7bebbaf105f0eace8848feef5cda1b460d15d081025e626e81bdc7517aa73fcae86581d7388100ce821e13c02d741de3f7414d5bfd74455099be7355aa0d7f1bb793560e7aafb115fad6cbb7c830ac50cb97289371d9782c882943603179179259d43e4792b0a4cb3d7cd9d38558da28b864d81082eec0f1b75db5ee02275effd3fdbed54b09f18ea8e67130ed35ab4f5bb405e36364670af5fd205de21aba467b0a8e2706b11317642f50524c5cc471f043bfdb7e6644838fbefc46a8228d8ce2576987b0b1e6adca5f4e88b035d39db95cc861db3e494d9c60281ec7e8db4cff399d3eb6a5ccf9bf46305bdceeeef9b6de972a63c5249b8bc8d3fc65ea00ce01d69e7bcd161c45da4e271cf56ff865c37031ab57d8fd1d57a1981c59c68ca7fbf4d5fb3822e754d6f10b95d7c1e93a86ffa4138969fe4607b19d8d302dc1781581294ad80cce387a5057c7372ff58f4723c4c1f26df2e87cdba14140a9d18a8de133ee6dfe9da7c042bd27db85ce9cab64b7548de964ce6fa6e32c3d6787197581d147f0794b5ba9b55fe810e71242560bb87189a369e25598b0e930289b828535643aaa9ddde913381debb6a38ab03ce8a7b82c49b14a33bf47d26db801eb6415aac7b6e7085928fd05c6598640995ebadfbad6d0a2e0a84caa53d31bc46ace4e850208a64042fa321f2643ab6fb4539f5185efaafd6d746d03bb39ef011d1bfff235b0cafd3d8bee15d2e3811bc0fe10f1043910efd9e36e8019d55f88b2f48bce1b2a6733f597f879097fd231c84bd78dfc45b0efc19d073f18d0a130720510661bfe173caa4088b908d7d2f3fa0c761d6a46d0b4d318c8804726b62b48c5956edc0a7bf81b1b290575288e4dc91720ebc6aa5d044e33c881f210bc259cbe351ac03e0af5df39e8366101fd896b38bb3c674174d7f7644e32aeba3e3130b903ad31845bff2d53c5961d11f2e7b6b533f09b9f6548a147cd401c8063b5ebb9026bd5e7cb6626fbc7cbe5dc60067192fd7332b1587b6088ae9fa1bdec477ae1b2beb10adae8113ad8acd4dac4a47f733d99fee2bd1d216dff8e10e33b7a956d1d71d8c6231c63a1eee3e92ad0f988c4a0c64fbaec576906300e98ad16685e7f604a31ee51e464f33de37fb796cb48181df6573ead70bf3de0d395aec69da28bf71ca1ea58e655b178611fdc8554903de5ba9f7881840d113f431965d02bc46d63e3611167f5f231e8b6d621f33c58cca2c40748bc1e94a57fac98b1c4178d2f7fe02b5356b66ee4588b2b92e04f0be4f639a44bed3e83786b20f10561ea1567c8b6f0b83efa3c4993929f5eeee968b8d8a3417ecc0d427d650cba3055835745a5c9ea55637fc700955111ffb308ae85b03f9166470a30d4ac626672782580f1f88cea0669afdbea41bff7dcee6821267ad68744261562c16a16aaa3d057b40b3e8824127c7f8cb46f250abd6c2ee7b935860f0908d11dc98ac45f1ae79d53b5013055c2c097c5eea2aba44f0e6059c036a4e35261bb283d405db00fc53c9753a0a2a3267f835a8ba0cd1da9cb29216c1cc0827eece7c6dba07a089150587cc2d3e07ca7a6fe1df6cd1b01e0270e78fe8195b98103ccdf43780e904d6618dba3d2e1bf9257b4f623fc518c05420601cd1008c7ca99a52898fa49df02cd662752087ac3adede8dd9a47b09ddbd51fc192f704e60cae544149b7f67405214ca9d1a62a01e5c22beef78eca20f27a6771edd8988079f2a89fc589da4769fce17250d376328d9c1aa4246f8739acdc5d202b89b96bc37afbc3bcb7499367d8e1fbab47791736469e490f38d1e166d9d78770ceac25a59fcbf1a96b4002f1e705ebcbfad749ecbd8b7bb6f628c036f3bd1e8d0a1e592707ec8ba045fe5d4c3eba7284b694af128ca004a06ce854579e7c7076a436ff66cd7dcde3d4d36ed729ead5a819a41b7e80277348aa206e93f26597a93c20676e2331f0bce752ea735e98ef175b79b2cc9a967520d92f33348be75479fbef9f712b0a811591f3f9be62ab622f5661672f6e41b9fd51b7d5909992f8e06d3966495682eac6e9c97701865368b2b5fddd200c906c219df2c70b4aa3f74761e9400774d39d3a88516bc636a1a28d2d394ab72b45db71374fae7296b8a2d81f73b5eb5cd64f17980c04a71cf5bcaa1167e51ef5ae85a00e7cfc42f614ad5c8c0c3b56868a3db389628a17420b37200ccdb5bafc861175f8c922371374cb66fa1655e35cd6e6fb221376f0028bfc3c835cff85bc5e5e2346cd2e962a4f51454e13adfe7a5094a7d4e211a99a6db6d95bdeb4ec043de429456136e6c38d6ec258a90a97101c6bbe8d4f2ce27d18e2008c26773b427cddbc609518d9e8b001779a125fbee14dbfb621401f01ec7c8fc34008d15551ef3a60dee2e46e18c022a4abe07560600fec9f153faaea15c9701def5a7b71b9e5c514503998d1d313ed200bba549afea66cef11e202b2094d9a78d4300086382cac5e24c66e36475c727c0cb0ff2d57bd63f0eb484a19a1a37b15f90288290b016417918df6077206711c996fb117812e2bf5691c9ee662299327d833f179121e9253be169fe211ef30e1adbafd80fd3ddd55f711b31dc8ed875d01f98c25818ddc6a8bb1f85b93a945513f0b6ac9a094b061c75b499217798b5098b43861017a69d4bdabeb0b16b853d98ebe3d48e177c11d7be79b95f0cb4ef694f213505ef4f535ae619fd5161e999a1fed614a76a62a97c7dc9ab23b8c9db0b8b7d5683f5cc0c87551a80eab51947a1341b2f9da42dafce7a42691dd7408deba2aad9acba05a4bce3f946a5557b6865291a05932b8f74e27185112952ebbeb21f054b10c4bc7961d863720fdfaba742f33bb03452fb3dd38dd8a9f88a2717049f2b5283a249f5b8950e7a1a496e7fdbd430b7de944316a2a804d243e01945e817c70fc28cb67f206acf12988687f9477adf97cf1367d8173857d9c86846a5054c67b1a001a97339fd4973fd0b58649f5bb1edbb4d938a2abebdc5d262cc48252be28c2a8fdf107b283d3a38a6657c018e4ace855152cef8df3f5ad4fe7439930993d09fff0e1bb09e8156017c68b257994fecea918b791e4aca9259af7aa8ca88dbde045523375c8fc6de5c3be0ac4c24d0c3cd7de2b0d92f58d1670202c86b0a90e924e5af21a3938a7699d9e047d623a1f0ed4d8d974378000d7ab98614c0c321ba2d3abc6cd83015720fe606305b0ee182d265216005beb44aea145e8aee14d637906f078a23d3aaee36e52e9e64696e9cb3d8aacb5ccc7ad4eb324a08525669bdf49de622060613c9a56db2483a7052c242cb82cad49875eff8b027be501644c9acb437193e95eda76508805acbb3ae1d7f4a155efb06acae22d199dcfa93beb92d8cf33078a697fc75ba83c65070421746ea107760ee9f060721c3089c889b86186ababeaeb4e469fbbe9822d143ac8b0b19828d684a7cd0fd7f8fb6ee3fb2700a2c66de280a112f308b4a8e4f69c1a368dd3e12da6e7cf40c36da918e79d1d32a17e16d1dd2d0729ad8bf099148564c576e83aba0327d24ccbb979c9182dac962aabb491e8f1c1363bd3fba00ad2436b630e9e970901cc55af691f37961e54984a287297fb73f408104b55c4e2463015d890eef568d672540c4b7eae90af1af209fb7dea46e73a05163989dd52628d622e14e4569422156474cab746d52c0489884a05e919286a5544cee854f58933912fa4e1f564cd793545de920236e4c5dc6de4d418563d9ece75b3b3e4ab3149bd594d3b393a85c5de08b111627334aa06ada909c8c41ce7e2619147ce25117eddc7565b0518f0dbc74917e6257163d4c8d13f60a4e80edbfd41f25057eefe4ebd04c9c30d8fc3f8ffb069a3f1fe1047335d64c5beef6f1ff77aa6d01b25becbbe9491d18efeb14581be73353178c177ce5dec09b3a91d94c828525af95d09f41f0c12be98f9bcec54ec57bf78c0a03ebe67fee866c29224e2a4e2e4ea299a92711c798993e86dce2778334e015dfaa191a650b3f3eac69f9b8dffa174e000edc1aca9919e24080683051ac8be19ce20619f2bfd8a7617ba1d32ba80ff00a2e5cce8be07a9b2e2452c43758ba903ae7aad67a842455f6ce45c2bdd1908db27123595a6f0970a19e3d06a9887c5377c6052176458810668add1e6f0f2ba7c19246200e5c936cdfb8ead699f039785dd390e67cb5fc15db4a321d35777334f474f2a54d7d09152b724062a8ac9757c3178c33f625c4af994b4b873c9b27a34bb0a0c82aa35b24fbd66e7db835aeff263a9ad32c70b70f583dc28f13285023b091c6dc8a5e886a40aae7720349027bebc267997d6b6268fe3f361eba8c924455cfde308acee070129032665725373493965245774531c3fbd3da064b073660a590b094d9997bc1c8c77464822e14204f0f791b8e9a77efa8dd5c3073ca969e234e888b0d2e3c9da002265e07dbe80f3a90c7d59a1b7e3d02b51cc52176ef1a3d75213221eba002852469286200ce1b0eaf1af21693e03f9168bb6ca52a472a199d6a5d030242221196f21e029e6e50e0d7d24ba3fce95f36d5a6ff14d395d5e68714e39bb1b48f090284c5c872e816f184c95a4b94782176786891ec1791a95fc2353993376c7c239a711c099313eca04d53ec72db69744565d4da60df4d1ee2742e3da0050ea98feb0dd25287ec93f440f751dcaad56ca86cebbed5287fe1c3a68e272570161117b45c777bfbd8695ed572dbf7f5b097ca08aaf558626636e651ff7aa1d542519859af8461b9ca2fc8c86e24e92433bd267010578bedf0a4f2933e7af45525919b3df6ca7afa900fd1661da5ec1a1841da55191ad9edb94171eab53f08149f499422f96377277a5c6ac551dc738a6a5a10cad70c225183ab85af12a53d6026d3c0a9c233ed59d0009eb06bbbc98a8371647526faac40bb70e96f235a15341fada2a286c40680b1c23b8824566b67574b14d2aa2304749adfa2c75dc51d8fa063ec0df918aa8cbe753f34031c2243db4d59a41f2b5102d52b6cf61632423d645310c43978a7f0369ba465855e45d11f2e49316117d929b9351223dc92e625cee9fd3a3647598464aeab6dd3f39e0e5b78e9fa44363e382e68344396883c8e87493f1d1b30864c0712b86574c8c4a772b9ccd8d5cdcbbea886ba0795a9e152e6752326213f1c673ff792cb0ba5e3176faa67b4983201f339019514d9c265db3067fa442f6cca5aa33bfb3c7e1a87ebb14f617fe64166a7501319947386e60528f89bd65a0f10dbb31001ae4477a8d1f7bfc66816e85de1f873c4cd55b193196baa0dcee52a4bbf35a47fd70be8d1c9254701e67c18719cfc029438d47c38677f2a6a1771e018d084cf03d6410a40c43f219ce68db3ee0fb9fe4d3418b2868e69ab0801e074a650ede094084965ecf2083e83dad129c20516b461df919c153c08a0a1e23cedaf0b83d5714ee1673c497c9c6883be9cf562004b20a2eba438ba8ee5c572c13d7bf1d6b091b0c59dc7b86299ada5b9970ea9d73afa839d41259fff9070b5580a7c5c3b4d3c10d5dd24a9a18f614bac55952f07bc575ea74e4d8514e1809074140ab65c9488440f1bf7c1135383167c800f0f9dcc3b311d10122928ed97de6b6285cee8f47bb6160912fc73747761ac83302757869ac90c0b3b6ad9c53408e906d7d3d827ab817e249a99a09a7ee234f7689969f8dc3c6831b43be23d5523ca7a1f25276b09113f3d8cb10a068b719f6a3851a2ba289395db139c975aa7a9a1be948160d2c05d16f57198d3bb4695f81d5e78c150a99ada4f0d7ef10b27df3204fa4c75dedfa20a203c5bbb8acabb43d3d308f25a402cfcb32a99c4e937cdef6b401ae575381923b1658f3f22f8ebfc2261d57f3bee590ca5191dc10e039dacb13bb6dc7cacc5cf8f8f453ba72a98d05c8e127833d42da6ada7fb339354bbd138ca28d10e622a4ce6770c1ab21f1507a633f9004793fdc32a9cb80083c6c53fa930f3f37c378d14c198b527827eb97b7d436278778e96c9952acdfd0c87308585e0885df643a2947bdfea286facb2a5b26a7c9ee2311750fac7f2da499544749847e3935ea374c874cc2405f5234e6c2f994c516a5715bcacf177fa70654ca0b4be14a0cb3ce2fa9c056f9c4d444ed953f25ba42efca81be6f149b755bc6f6f1bdac61ffa480b691ca46b0788ca1b9e8f6d19aecc50c614fa6abc87dc1efe84fcceef1680af12b835e694cbf7ce98d4e81bc34c1f89c3e886c6ca702e317230aaf56b4b92adca9d48e96b4380f5834757ecd79c886848fd2c91a6ad46ffd9cda18aa5b9671310e470ad26948d836eeb443d0d9ca4bbf45a20396b4e5c576da30c7bf311378ec6bd3e9f3dc97273ed344194515945f7cdf4ad74f4eb8393a18a0dac96c23f5f1b8ad944fede247465e6645366375a8a554db8aa12f5f036f6221f79728f55bc8566ea09fc4479109152c928e8b1ac9cd6d22532a8c0ae33c56254ecf66d8032d080e833435b632cc2e314dcbdcc4b34640b59df0a9e85b1ccb008309fd3ac290f4b62cd9746ca088661876cd5e8b64994f2bfa7d164b8c17c4c2f96ff572e5a5882dd417a0201d5b0a45ee3aff00a62c4de3e1fb67437ab8dc6b900432155e60ae1645144d0b481ae6dbe22e4729446be0acf89009ceb654c3d73385c057675530f196efd5643d1d26c71212ca5024d1a15bbda23962a85a36256bfd91beb87732cbb86dce40b4df4b3e2ddfea235479cbc8393d3aec1278b80ecb891972fad911513bc9d249ee33f897a1f287e77c43ee08b301caa6e3e7be2914ed9d522f7dcee1780960ba9b597455b4f7d97cc3212bb3506c59d19e365447faa1ce290c825857ec691ee4929c40e996d7662260202c44d4baf3206d127f5f0773133f3ee7574c07e835cc6bf4917e5aeb33d9b56df107065e326b102edfd146e51bcfea7d467d5e3b08c9eb0cfe879ae03e420f141f9cf507265d6d8beb0279ea8443014705c0f818ec91023702b560a7a882d13e01f0aa10c40f6e1d151a1d81a46fe365acef02c775ca773ed1947b389c6359756f64e0fb96d9d56df55954d075502534b81da35b23fd1a7dc94a56643d6fb9a81b6f40642a177bdd0f01a491492db9c12bfab7263449556a72d00825df9299c4fb7f3f4fdde0bea3e232ac031d72fa62964bb23562c50f7c2944c2f8b13ed83a0fd977ab793e79ab38f684e59c7f6853996024b4cc9fd51ecfb06e33ce90ac5ee026ea2108ea720518a7b287dfb826d910eadb4c8e8f4ceb98da041ecc8242f53554c1913d5cc76979602621e0fbda600544f28afa41e1d33a57ceee4718ec1c42244d5b25ded269b157a2af204ae824451ac5a9aea6e0a6cb82c32982fd0468a406f77b70d71e3dec35f07f290fd4bbef9b012e672c08911e1f8148fb7ec9761886b30684f9a1b84e7c826ad50582b8590366459abe3d27921b40b1052df7c37a4221a004ce612dbffa72a851e0af596d714c6dab259dae883e5a77b4fb31010230b0d75a9501af63bd0e711a6e88f0695af544ef579ca95ea4e65610db75a17e1f95d5b44606d605c04a11b41df4a5e333b88255393f6b0bd58b4583afe1c815cb70b8d63e9ead611b0266a7992df084a26ece16d3ecbb83fa97051cc0c244c7e7dbd7d1c7c9ccb805480a0df409b698bf76a43cc8df06cf618d4861f186cd15f9eddff23ddcf4865e2b5c4f6a9d1812fd53add5fb047ca185485090cfee14d24f7542d8633365c76215144b5208f9b3a895ef53fde1b750929e80aea045873b0f2685b10becf9e4366876dfe8e277b1dd7c4a2d2a36e82796772a2a754784ef46f011eec8ca49c88466ed010381d46218c15157fa73a835b880cc550633f6846baa124b971768b3fe1c468a02b95e6be54e10009a0ec5d4a6b0f3afc41d7af2b8741be7be16f68b0ecc7e05c073a156822332be216a32c004c9fec11777e2fa41db6725749e2bb5d4b1d8227f90882174c04150b582b1a81beebb6785c692c7cc61a011e0ced66aa7830c6b323f3af7c421f25adad330b688f7b18e36b85dbce8304b3f37292692a8d0562c4a83c9fb76129f4e6d3d86e4bb5de1038c51f1e69bb29565e8308b6ee139d5507d90842923b1a10de90a76802f72543e8a66ae6effd13343e8862bb1cbf252bd7ebf4f00540a5eafb47fe5dbb43d613e39115e0adf70e7261983cefef5e5fe07a2e4f33709910b21650c3cbe6722f16e119aa4768f8ca34b37ff6acdbcd735a143485a815a017d579383213a5573a90aa09b569cc1f48dd7d78a032a1c2fc5773a9c5e872dd463964d61cb95aa93a5082b10f6e4360509b828e23ce3603f23e1c8c3bd01d7932f69cea95a50dee0c5278c46e7a6615c698b19996054987efd6ffbccb2fd3d40306fd5a7e5fd8d6035ea63437036abe69a59b874867041049427c756fc6d63f3c2b20fbe5d3c3cd56e5e65822b5219499f24b108c856dba78a4c369701b9fb614a83fb86cb4dc1181bf4af8f907520fb18eb543df6519b2906da28b6f5917b0586c4a83752caee0952cee8f17ede40715ca815254e6bea385ba20a38f1e151e00ca0dcd23437ef04c97452526ece41c84543e21b91d30dfa47474eebeb4d5596a787ed25b32b55fcaf20ddfb6091e07b577af11b61cfe28d1386fc7346174548bf83273840318fe88650c5b686cf3e496406246dd402ff86295082035056f95d00f3b334e3f07429df8417cb7e5d8db0b3eb4f25a2ff71ab05744084835a8826a37ecc895dc1ca8072bc2bd266fb6d3c6f9d9f8bfddd6dabe753122486488a4377d48e60d3eb576d900c0b48d441e91a126eb848854091b7bd76c5818603dae10ba9210bf1ac71fcffdecc2f37e6602162a885c8843268faad86463f45371752ff020aab683c37c03c21d828e80672c81dc77f1842e91cab286a00a91711267846054eb8bfd8505f59ccda63b636d6f998f3939e46177c2422e9e2f624ef0478ca715d70a1cd13d7d8da85f93a9b5a9c389f3f4aa1842aef8935f6bb10bfb6e2ee7a9afe044e07fa68a6d90645daa3fba3f3afec7cf304231b995288a51078b49258431bb41be59fd20c5648524c4c1b23ec43c267a966576d6f516e7aa6b29ba89a0dc2a0cf6c5eae1c0a261ee583cba9d4a391654bddecfe05369a64f6929a206258f8b9078ad9d7f9b0a55db760c2975431ccf20cf42064e9f088f97869fd8f5a4f6b106fadf866d6d1ff8f7f69cc85276a4423c202551dde67b27b03fd1ed914bd099cd484bb62190ad91c7ff5d66e653f02aa5b56763ea64ea33943ee085b52abb8ab94de86ede7b924aa4d7276c22369185930a79a2239c3b7fd004985e4feb42963a794d1c016f2ae5d3f90173dc7f7d5a86f990e8bc373e23e8240d3051c1df54e1ff7e7d6f0d945e3d59ed16975822746f2f2ec4080e43897da6b85140436c4f7a1d6a29037e6547927856fde4755e4f632179c91828756011205c6da3b8cf4a2fd67c8871e1e41fad08ecef92ebedfb8e3247ff67c47923e752d845726d9a2edf81b81b5a97c95acc6a3435b7e7f7329e5a073bd2c5f5e0ad6309d0981c2811b7213d50c1a58ab3514b6ef35329df6cd4eb049e8c9a424de74a18f04a8e7d1210f099fd481b4202ec25de2322328db1a02afc26b373897622790ee6bbec47248e54dcfedd9b709cd2001050738d17b8f02348f0c79941edc99317c064ea83ba6daf0db751c479f438e4d56644fa34eb6439e26b739d34a251e6d7071e20966542e3dd23f33f6c4550eb7da6869b5fe0f9f147e77c5dd169959376a0afd87f3e3664518c7316b499e51010c22393f5a8c7c4c5189dd63173f678355d66926b86f72ac6cee540c56b756a8600dc88c6816302d93a24949ad16005a86ffed5ed39ceca4d1d836106ceb705c17e7c97f93511224404adc3236eed43f716f7bf2f708faa1f9cf10f4296e4ac2d41770db017f38a1e3aceee6a590874dbde3eb1768afc6c02ec13291238edb91fbba5d2a5d827555373098ce138a8ff6d6f709a2315a6781f67b533e15a2e133b6776ece8376792ba333690d4f04eb406e927caac569d5c24a9b1c45deb4ca708f77b0c293ddeff0bdf68d368ddb8d20b2c70aaf011af614c9fb17492b61a2293caafa1984578a8df98aede7f5b4ef621caf896a3f176cf266d48705a2267dd9c6425179aec6c80195beeb9c7cd866cf7f5c5e19ebb8066bec23719e6ea0c16b147f0da2a4d8f3d3d24880ac49c7f6d23572cd5906a70b5f9a9403fb5c8a3ed4897486119ab6771f5ce4af39b5de2be02b718620c18a16739429c2c7f21dda2f6322fea8701e6e8969b1f97785db9ed65aaf3b8068b20462c21d6214c7c5c2f021554b7fdba155ea905b51a3305e0bed9b39c5b164dc51c0b7aa87bf7dd81e7d4f9d7348989f5db5d79493b3aafbf6a112cf4900d7e7cafd69d5a63eae04d032ec88b5980aa9bfe1a072884d75f70a9a59e706ef14380d7b649f35fac137f8ac831ee57477fed9360ff85f52afee283e848e987902b5de3668226c3464bda5ec31c7c69acf64ef67f415675c1074365f64ac8c8b3cf94e4daac2d2da1055715d426a6bcea1cbc8fa104debb3af208a2ef0eebfa02bab8feb6dc4ea0ddcfd6a3f7df26a662fd8d2ea04af232d333d96eaa650fbfd76693d5051e63260d1d7ca31ac908398b8409fa8dbc7f5efacc5a145d227d4e4e2545514c807b39ca16aaff9c1f0545d0823f15adff066db3fa84b897e19a35ce37bdb3c72bf4959d29a60ae864905e4076ccf449e3da2ce1d17c1ba8805b31eb6dce92ef4e555b3ccb710f337d6ce4ab09c4bdb7b8551c10f77dabadde2c069621658739d78e70a707aec4ed1ece185feb5ee7a7b4961a7c42c18baf5bf2f405f2263e9d2bd42d9fec52f6aeac58ab6b43fb4d58fbe44f5b745e61c50c9a427993fcff18c52a51e2ccddfd23c01b51d047f9b952b82ce9819697e4dbb8235d54612ad73c41cb3e44e0d10b402186ed9d405fece6f422639a821a00d7b43ff1593363dcb85a424b41379a92fc2616fc5616a6d0a617f879999bbe0e379665d19cff5954ed54d545f578bf36eb27660e6b518f7b7cfce3993df04bb3688e55f3ec9a1a3c391eafba5fbcc88448c6084746a42f83d39847782780d5f73184701d4640707cc76a494703734e0527dfa1c437bf720546cab63d769322b4a54ac771acc6791784882f702a3f22a0255fa794dcd5185add0b1d41c03b712787b0505310d1cefb598af2a5d26b4f65e5c02a5ba750ef32e80dfd9943bb889f63cc0221dc654b9501d0574dfb3fa89c682ffa415a52c91a15de0fc8b8a4e9cfb7c9b89c1122d59b190d'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
const args = process.argv.slice(2);
|
|
41
|
-
|
|
42
|
-
// Create a temporary file for the decrypted script
|
|
43
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
44
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
45
|
-
|
|
46
|
-
// Execute the decrypted script with arguments using spawn
|
|
47
|
-
const child = spawn(tmpScript, args, {
|
|
48
|
-
stdio: 'inherit',
|
|
49
|
-
env: process.env
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
child.on('exit', (code) => {
|
|
53
|
-
// Clean up temp file
|
|
54
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
55
|
-
process.exit(code || 0);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
child.on('error', (error) => {
|
|
59
|
-
// Clean up temp file on error
|
|
60
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
61
|
-
console.error('Error executing script:', error);
|
|
62
|
-
process.exit(1);
|
|
63
|
-
});
|
|
64
|
-
"
|
package/scripts/shell/publish.sh
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: '99b6e59821ca71a4808c97625f7120be',
|
|
33
|
-
content: '57575ca3ae010a08574ff6252514953f375b923158374e244b6c3084345f280405cc811f0d3ea3172e95afafb11f93324b2eb6c9d189cd777620cf3d1674b5878ef45293b1693ed3323ecc780d652543f4485fb80ca2ed0a447886402c8abda81087779460b6eeb2873e718dcde6080d11c56878d4b7c9ca408bed569cc1f7188d5745fca3ba46e9edc11d40193054f911466fe10ba14c70fda6bcffb3316986d020a575e2b1441e2da866203a7ba86fbc8350fe9ae70ec76fe15d54932eb117166283a568ef16e74d1c85c1fff2399e35ba29c03f89183277c73b1789f14f1eee618122f1c8caeba98ede2bbcba284ebafb7716ed50e6987924c61f125030510e3516aabfa41786a03be9dd78b5cac9874a870b917764b1dea484e2748d6ceda887b847f013992d338dea8263f45d7f7000cf07c3f8fac05724823b590eaea893dcff5806ca9e74751077af7dabd676bbd7cc7abe7a44597bc7eb84f61c758107fa933d1a08a525cbea0f6e62a38ae62e1643bbd792b4f5822900e3253b31ce30a4c7fbe384f646c5f5e04fa8d220bd93dd43bb2b516219ee5e3eb7be5b50bc3beee84682d06795e6a6db751d68ab13ae5dbb071a62d00fe9c4a123fec518494b78f784223f55171005bbfa286bf3308d8040a8d63c5a568373a397e093d83b25ce10ef0cb2937fce5af28327b4c25f846ab288f14d3752ce12ddd1a4d93cb6617b4f371325ea6ee669435ca5b558a4c6f11c85fad9b10cd8ae4cb5620e590522abcaa8819a26663bda227bf79133f9fddefbc8dc576e05f02d44499c84750a2d41a218d0b8734b965105dce5c38e456f40dbeb36c8ebbb9b917fbf43816baaf3bff741eb0be699a9ff8fe9ac0df1062d9eeac8ed559902eccbea9cba0b7e340e4a1f70661ff88486ef64f0bd215af5c1e5eebb212ab0bace166e62267229463ce661a59c6b80737faf881032f3be00dfc649c2103f7d1b496e454803253fe78f7d7e1bef929491978ddf8e2402c1d22076731e4c0bfa438d5fff847dfa6be0093eac98f23c34073bd99535026790e270206b64d864ceef19d7583a96300c907227fed8057dfb0d2e4cf6b08f75a161a6ac05422482e85c1041bc396b102310a6df0c68ab535bcc26aa69067a3c4c36c9e9946234c95f9ed4748a47185afe933183acb5e160db429c5e17e1859f5898abe2d6947b74de349c23b4cc2a8c5425bf61705b99b3422babea861fe985c8660152f64fc70b68092b0aebe4cf68c6eba93e79ec058aa1def0eea5daedeb80b279f2c84c468101096d898175a1f19852592a6ce9077312b81ba794e928c381ca647269f0730fd483c2b305245b5dc2fa7c4c592f404fc08659cbc6877f36c581c8106770227e8ff71145749a589b66afd196df9df125e0939627a250f7ea618b6e251c506c5bcd28b9e7c5d965447279e9fe59a7e9eae3bbe7f5cbbb23cdc5ad43ed62a1a1cca5d1bfa2cfa6186ae0b0ce33334e0cc17d81e2d0b3d477c65dd911a3437e1538f25c9bafc267782b0ae28577bfef1390ccd8dabfad89b6fd2e52d73ad3a50f16924ad092c024e9a5d10eb78958e0e929af3df588895007e1e5561050194c9455058b5484213aa90678faac7db5f2aa25e79a8b543336d0e3867ed4ad37e53a62a40a9ee0c00cb24dbabead1cf0b62e5052c4ed51cfc7915bafa09bdd1f630d22a7e0b3e0ae77767e5336e423de12d7c9e427748704b637e465fe55a60f773c602e68d780bf0216fe86cdfd3dd8fb59f381ccde1105a6120e53b6017ab4acbacc31b26ce618d0f6b1a61eab67ea7b056e7f9a83bbb6096a8c16b4bd038864c352ca78eaae42697f4e0d44db69f6df31f0393d2a564362937ee4ba6907c637e5b8a23cdd18e3e1166319b77bbaacfcf02fbbf7eb0c1939e1f8e1b7810171be3dc0a3c189c6fee21367643f0802d43dd7b9ab87017b17241eab9dae8d7ef80a1cb94e1101ea9a93e6fca8e94f1c5b87c7712450b32fc65d0d1dc89dbada047f057d9f0f275a5349856ae1b5afccdf887030dc43b92884b898ff2e2488726b63a60a5a03f5ba1d62dcdd024896758e6f8cf9884e031e8bd6377d8012c7419fecc5704f24d0c8b179b5d69cd13ee34df2313dfdf888c85c1b9c39d15b7f6be2e5ff8dbd46d317d6f7643a7efd6d31feebb1dc6ec42c6407114792e7b3617608f368129870be26495d199c64b24d91ea2b820d77d94d98fa0cb8f8ca5e06aaa9855c79b937e7e091eb8e9f3e590c05e9dce626aa8579db8082861b229916b562742d11ff1ae2c16402e4ecc5c40447b439c1a943aa5cd956888c02f78380a5b46ad3bad52310eac6d5375d24c4474a840e060b42b50c44909bf56b6660b777e70eb02ab622b62dd2cfc09c02a7eb77b06c0d26239ef38394d81ab3e3f00b523e49fea6596aa52e9c7f1b3cbb04f08931438f7fd638d2ee2f00e3285a171ae29e4bd02e8dd754609a2f9d946a19a9611eb6ce2a486113f194a3900ad50ff1ad905814db5f30d5fd5c79bbb558be52e9ad532ecde20afb997e1e6d22d3685997fbf02ca00b32a862a8372a2ffb75ea2c1ba36aedc949a7912dd6fa92372e003b0f8ee3639d6383759af9b04e170361ebb6508ffb78fb197054b659a4538ba7ba8b3a25c8a20b387eef35e8e5f5e5079f8b8f0b70010b9455a65b2fe5051fb0e6be0655c339f53aaaf498f43860600796308cc048bc5be6b79481b7fcb5c4d6ed00153c0802c9c669fa46283644224846fed653dedf10a5b57852bbf73d1ce6f49e3decb64bc07af022808ca38c01b0f290ee188958ad5b50b9951b364debc8cec630a41ed887135f2cc42e066d9da301e318b0bb10da7d7a03cd1396aed2f4773b643eaabfe81c2d6be4e78c5364807c78d7283f33af4a3bb12bbbc3c565c9025b794aa29e9d8075a1b43cdfde3479f9985b4f94449017eb3fa2138d17aaae8a8581d1d503b886b3a1c596fe211310ef0240eb3a825a26da3f8e1b6ae85f72713f4477b5db7a9e8d8cc0aa123383a60728f524240c8f02238474fac9adf2f5ae92d610f184cc37ebb551affbf1806cdeeaa04b4098aacab09bcd6b9f6c1342126720d0b56e7cf7efdb6e95a1cdc7ee61f5e47d8c75da6bd7fc78e32368769fd6ee557978596cc4974295e714fc318dbe3b09db15432ff7408c93bea34d29cf8ec6a02ca9eb38e459dc208edd98bc4fe15d9ebd8781a85466488120b782acbfc54f7074040fe7c9a456c273fe86d6d193801a7d464ffb54e1c8e3eb2c12a0b9ca1c1b1be8721794e58027fab4f2cd8df6d70fd9a546912bb5882e2d55581f73eb793a1c17a5106d78d9cf52485e144108f3a8ac9d0733a43f04a03e3a0b13549695f628c9ed04443d8a978d2c2ee9e9adb7ca9f8376b422500c56f59bdfcfd7b7abcc656cf8ed199fd372a3e27c06e7df923552a69404467b1f6e7edfdfe9586181e18c25b31a3ddcb00f344885bc521537c7525ae92430b55544911e67e6882cc0984430a34365313ae7974ed9f782e7fa5483decc3e88c0fe9de254c709ee028750504cf485f957128a2bc55aad9dca5781ffe1a1e0c1f469a4f3ce8ce127180841fb07f4f251d28de621eee3d11c77beb5e420898c89d1859b7408d515e8a74378f70563f467e430190279e92e0944a34d14d85edb05f3e3642919f11129efe1f99fa352497dfdffe8a4a3191ce6cd8b4926360602b5cce41c0ac12093c0a0efa38afc91f50a1d7cc059b9f24fa75543b9027646ba669046249ac6accb731fcd9f003cdb4c1a3eb174581fed6b7ce58a0cacde00e0affb1da06c42ba6a095c47aad881c4a134f9bf61256bba6ed48785a0d3bc0342ed3458b4562c3e3293c6ed11bfd78aed0cd0a0d455171f33a79b3cd8f3696fe8eea60a593d52d58253d74a4247e9d72b08112d18faa03342a5b7200097d89d05bd67a5d0c2b979e06160ee91d1a20696213eb0d3e6bc85f50f16fe9f9daf1d9f36a0df25bc6ddf5833578cfb3193310420f89d222f2453dac47ec3fca48223d051dffcf6dd03527552f62ab2d7f1633c07e10a8ad2b86115d69459d623ee5c6e0bfc26094da4afcb3683c7df4edc8016c1a32b8513407e2971c7d78d088a52ac362426b7cfc9359b2da1200616c7a911543c39eb8fd3799e143558ce4852b7d070b46af2a056165cbc46c7a13c78fc56c650852bf1a042d50c06b09a0fa544db2b4342d3655380186ca04c5ce7be81be4aafcab8330694841a946970f3a5c989828561404754884bc388e6962d9e740e56aeddd4627be985d0253c15125ff60f5a7e35c8d466f1295e6c9507dffc5f20a53eccddeaf01d9b20ffb9b8a3c90cfce86464e65f95ff2e846bba002c20684b2fb0fe5a151edd407428cf06e4329b3ec381f08df963820e9723cb749b3ce21ae7c22336b7321f6cca143c1af717d65551590d2654bcf310f03b55d22b59df42ae77db5faf0b68a7c43fc7aa4bc52a78939c8b14aa7a14d4430209d00229797bb018310825d60d8436a6b993231cbfd4bd769c811f2fcc11293d86ecf34dd6372a98e441fce3ad75a816da18b59d5d5372380e7df5c6d8e203bcd1e8eefb3d8fabe6ba3566de26b95a9af901ee2ac0e0b2da9eac1ed11a0f723f2dacf92d3f7191d8d905fd7d36cf28fa05937f262c51918528f667cb8b0342801c0d8ab20bab3d02ec838decd01549f4945d6d58771b8fe18432e1efb21b771091644383540d89c1058309609bf8278b3d47c7e307d864faea653db446257e34642ba8c79a0a820a5bf8a1362b2b33754bfc4fb54debfda7655131600a6e9c804b911ac4cb7f1cbfd2f5872bb2b67bccdeb3eafcbfdb75acf44e516ce64c'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
const args = process.argv.slice(2);
|
|
41
|
-
|
|
42
|
-
// Create a temporary file for the decrypted script
|
|
43
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
44
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
45
|
-
|
|
46
|
-
// Execute the decrypted script with arguments using spawn
|
|
47
|
-
const child = spawn(tmpScript, args, {
|
|
48
|
-
stdio: 'inherit',
|
|
49
|
-
env: process.env
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
child.on('exit', (code) => {
|
|
53
|
-
// Clean up temp file
|
|
54
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
55
|
-
process.exit(code || 0);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
child.on('error', (error) => {
|
|
59
|
-
// Clean up temp file on error
|
|
60
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
61
|
-
console.error('Error executing script:', error);
|
|
62
|
-
process.exit(1);
|
|
63
|
-
});
|
|
64
|
-
"
|