├── dtbs ├── s ├── seller.json ├── user.json ├── afk-user.json ├── contacts.json ├── database.json ├── owner.json └── premium.json ├── image ├── s ├── sky.mp4 ├── crimson.jpg ├── emotion.jpg ├── menunya.jpg ├── nulll.jpg ├── nulll2.jpg └── yaechan.jpg ├── latx ├── h ├── 10k.png ├── 8,5k.png ├── bersihin.js └── virtex2.js ├── lib ├── h ├── color.js ├── npmstalk.js ├── ffstalk.js ├── tiktok.js ├── mlstalk.js ├── upload.js ├── githubstalk.js ├── math.js ├── dafont.js ├── afk.js ├── converter.js ├── remini.js ├── tictactoe.js ├── uploader.js ├── textpro.js ├── premiun.js ├── photooxy.js ├── exif.js ├── myfunction.js ├── myfunction.js.bak └── scraperrr.js ├── music ├── h └── night.mp3 ├── src ├── h ├── anjay.js ├── bruhhh.apk ├── src.zip └── bruhhh.jpg ├── tb ├── h └── numbers.json ├── support ├── h └── createsupport.js ├── Procfile ├── spider.mp3 ├── heroku.yml ├── wibu.sh ├── app.json ├── spider └── creds.json ├── config.js ├── package.json ├── README.md └── index.js /dtbs/s: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /image/s: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /latx/h: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /lib/h: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /music/h: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/h: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /tb/h: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /dtbs/seller.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /dtbs/user.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /src/anjay.js: -------------------------------------------------------------------------------- 1 | penis -------------------------------------------------------------------------------- /src/bruhhh.apk: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /support/h: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /tb/numbers.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /dtbs/afk-user.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /dtbs/contacts.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /dtbs/database.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /dtbs/owner.json: -------------------------------------------------------------------------------- 1 | ["254104301695"] -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | worker: node index.js 2 | -------------------------------------------------------------------------------- /dtbs/premium.json: -------------------------------------------------------------------------------- 1 | ["254783853522,254797704259"] 2 | -------------------------------------------------------------------------------- /latx/10k.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/latx/10k.png -------------------------------------------------------------------------------- /spider.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/spider.mp3 -------------------------------------------------------------------------------- /src/src.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/src/src.zip -------------------------------------------------------------------------------- /image/sky.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/image/sky.mp4 -------------------------------------------------------------------------------- /latx/8,5k.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/latx/8,5k.png -------------------------------------------------------------------------------- /src/bruhhh.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/src/bruhhh.jpg -------------------------------------------------------------------------------- /image/crimson.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/image/crimson.jpg -------------------------------------------------------------------------------- /image/emotion.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/image/emotion.jpg -------------------------------------------------------------------------------- /image/menunya.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/image/menunya.jpg -------------------------------------------------------------------------------- /image/nulll.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/image/nulll.jpg -------------------------------------------------------------------------------- /image/nulll2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/image/nulll2.jpg -------------------------------------------------------------------------------- /image/yaechan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/image/yaechan.jpg -------------------------------------------------------------------------------- /music/night.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Samue-l1/Spider-V2/HEAD/music/night.mp3 -------------------------------------------------------------------------------- /heroku.yml: -------------------------------------------------------------------------------- 1 | build: 2 | docker: 3 | worker: Dockerfile 4 | run: 5 | 6 | web: npm i -g forever && forever index.js && forever save && forever logs 7 | 8 | -------------------------------------------------------------------------------- /wibu.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/bash 2 | #update tambahan 3 | apt-get update -y 4 | apt-get upgrade -y 5 | apt-get install -y git nodejs libwebp ffmpeg 6 | 7 | sleep 1 8 | clear 9 | sleep 1 10 | echo "\n" 11 | sleep 1 12 | 13 | echo "Bentar Coy,Install module dulu" 14 | 15 | npm install --no-bin-links 16 | 17 | echo "Okeh udah selesai sekarang lu tinggal path nya aja langsung npm start" 18 | 19 | npm start 20 | echo "done" -------------------------------------------------------------------------------- /lib/color.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | 3 | const color = (text, color) => { 4 | return !color ? chalk.green(text) : chalk.keyword(color)(text) 5 | } 6 | 7 | const bgcolor = (text, bgcolor) => { 8 | return !bgcolor ? chalk.green(text) : chalk.bgKeyword(bgcolor)(text) 9 | } 10 | 11 | const Lognyong = (text, color) => { 12 | return !color ? chalk.yellow('[ ! ] ') + chalk.green(text) : chalk.yellow('=> ') + chalk.keyword(color)(text) 13 | } 14 | 15 | module.exports = { 16 | color, 17 | bgcolor, 18 | Lognyong 19 | } 20 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "𝐂𝐥𝐚𝐬𝐬𝐢𝐜-𝐯3", 3 | "description": "𝐀 𝐝𝐞𝐚𝐝𝐥𝐲 𝐰𝐡𝐚𝐭𝐬𝐚𝐩𝐩 𝐛𝐨𝐭,Modified by Tᴀɪʀᴀ Mᴀᴋɪɴᴏ", 4 | "repository": "https://github.com/Samue-l1/Classic-v3-BUG", 5 | "logo": "https://telegra.ph/file/c8ea102b36d1aa13f3a9b.jpg", 6 | "keywords": ["multi-device"], 7 | "env": { 8 | "sessID": { 9 | "description": "Session ID here,get at https://hotaro-md.onrender.com/", 10 | "required": true, 11 | "value": "" 12 | } 13 | }, 14 | "buildpacks": [ 15 | { 16 | "url": "heroku/nodejs" 17 | }, 18 | { 19 | "url": "https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest" 20 | }, 21 | { 22 | "url": "https://github.com/clhuang/heroku-buildpack-webp-binaries.git" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /lib/npmstalk.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | 3 | async function npmstalk(packageName) { 4 | let stalk = await axios.get("https://registry.npmjs.org/"+packageName) 5 | let versions = stalk.data.versions 6 | let allver = Object.keys(versions) 7 | let verLatest = allver[allver.length-1] 8 | let verPublish = allver[0] 9 | let packageLatest = versions[verLatest] 10 | return { 11 | name: packageName, 12 | versionLatest: verLatest, 13 | versionPublish: verPublish, 14 | versionUpdate: allver.length, 15 | latestDependencies: Object.keys(packageLatest.dependencies).length, 16 | publishDependencies: Object.keys(versions[verPublish].dependencies).length, 17 | publishTime: stalk.data.time.created, 18 | latestPublishTime: stalk.data.time[verLatest] 19 | } 20 | } 21 | 22 | module.exports.npmstalk = npmstalk -------------------------------------------------------------------------------- /lib/ffstalk.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | 3 | async function ffstalk(userId) { 4 | let data = { 5 | "voucherPricePoint.id": 8050, 6 | "voucherPricePoint.price": "", 7 | "voucherPricePoint.variablePrice": "", 8 | "email": "", 9 | "n": "", 10 | "userVariablePrice": "", 11 | "order.data.profile": "", 12 | "user.userId": userId, 13 | "voucherTypeName": "FREEFIRE", 14 | "affiliateTrackingId": "", 15 | "impactClickId": "", 16 | "checkoutId": "", 17 | "tmwAccessToken": "", 18 | "shopLang": "in_ID", 19 | } 20 | let ff = await axios({ 21 | "headers": { 22 | "Content-Type": "application/json; charset\u003dutf-8" 23 | }, 24 | "method": "POST", 25 | "url": "https://order.codashop.com/id/initPayment.action", 26 | "data": data 27 | }) 28 | return { 29 | id: userId, 30 | nickname: ff.data["confirmationFields"]["roles"][0]["role"] 31 | } 32 | } 33 | 34 | module.exports.ffstalk = ffstalk -------------------------------------------------------------------------------- /lib/tiktok.js: -------------------------------------------------------------------------------- 1 | const axios = require("axios"); 2 | const cheerio = require("cheerio"); 3 | 4 | const clean = (data) => { 5 | let regex = /(<([^>]+)>)/gi; 6 | data = data.replace(/()/gi, " \n"); 7 | return data.replace(regex, ""); 8 | }; 9 | 10 | async function shortener(url) { 11 | return url; 12 | } 13 | 14 | exports.Tiktok = async(query) => { 15 | let response = await axios("https://lovetik.com/api/ajax/search", { 16 | method: "POST", 17 | data: new URLSearchParams(Object.entries({ query })), 18 | }); 19 | 20 | result = {}; 21 | 22 | result.creator = "Sally"; 23 | result.title = clean(response.data.desc); 24 | result.author = clean(response.data.author); 25 | result.nowm = await shortener( 26 | (response.data.links[0].a || "").replace("https", "http") 27 | ); 28 | result.watermark = await shortener( 29 | (response.data.links[1].a || "").replace("https", "http") 30 | ); 31 | result.audio = await shortener( 32 | (response.data.links[2].a || "").replace("https", "http") 33 | ); 34 | result.thumbnail = await shortener(response.data.cover); 35 | return result; 36 | } 37 | -------------------------------------------------------------------------------- /lib/mlstalk.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | 3 | async function mlstalk(id, zoneId) { 4 | return new Promise(async (resolve, reject) => { 5 | axios 6 | .post( 7 | 'https://api.duniagames.co.id/api/transaction/v1/top-up/inquiry/store', 8 | new URLSearchParams( 9 | Object.entries({ 10 | productId: '1', 11 | itemId: '2', 12 | catalogId: '57', 13 | paymentId: '352', 14 | gameId: id, 15 | zoneId: zoneId, 16 | product_ref: 'REG', 17 | product_ref_denom: 'AE', 18 | }) 19 | ), 20 | { 21 | headers: { 22 | 'Content-Type': 'application/x-www-form-urlencoded', 23 | Referer: 'https://www.duniagames.co.id/', 24 | Accept: 'application/json', 25 | }, 26 | } 27 | ) 28 | .then((response) => { 29 | resolve(response.data.data.gameDetail) 30 | }) 31 | .catch((err) => { 32 | reject(err) 33 | }) 34 | }) 35 | } 36 | 37 | module.exports.mlstalk = mlstalk -------------------------------------------------------------------------------- /lib/upload.js: -------------------------------------------------------------------------------- 1 | let axios = require('axios') 2 | let FormData = require('form-data') 3 | let { fromBuffer } = require('file-type') 4 | let fetch = require('node-fetch') 5 | let fs = require('fs') 6 | let cheerio = require('cheerio') 7 | const chalk = require('chalk') 8 | 9 | async function uptotelegra (Path) { 10 | return new Promise (async (resolve, reject) => { 11 | if (!fs.existsSync(Path)) return reject(new Error("File not Found")) 12 | try { 13 | const form = new FormData(); 14 | form.append("file", fs.createReadStream(Path)) 15 | const data = await axios({ 16 | url: "https://telegra.ph/upload", 17 | method: "POST", 18 | headers: { 19 | ...form.getHeaders() 20 | }, 21 | data: form 22 | }) 23 | return resolve("https://telegra.ph" + data.data[0].src) 24 | } catch (err) { 25 | return reject(new Error(String(err))) 26 | } 27 | }) 28 | } 29 | 30 | module.exports.uptotelegra = uptotelegra 31 | 32 | let file = require.resolve(__filename) 33 | fs.watchFile(file, () => { 34 | fs.unwatchFile(file) 35 | console.log(chalk.redBright(`Update ${__filename}`)) 36 | delete require.cache[file] 37 | require(file) 38 | }) -------------------------------------------------------------------------------- /lib/githubstalk.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | 3 | async function githubstalk(user) { 4 | return new Promise((resolve, reject) => { 5 | axios.get('https://api.github.com/users/'+user) 6 | .then(({ data }) => { 7 | let hasil = { 8 | username: data.login, 9 | nickname: data.name, 10 | bio: data.bio, 11 | id: data.id, 12 | nodeId: data.node_id, 13 | profile_pic: data.avatar_url, 14 | url: data.html_url, 15 | type: data.type, 16 | admin: data.site_admin, 17 | company: data.company, 18 | blog: data.blog, 19 | location: data.location, 20 | email: data.email, 21 | public_repo: data.public_repos, 22 | public_gists: data.public_gists, 23 | followers: data.followers, 24 | following: data.following, 25 | ceated_at: data.created_at, 26 | updated_at: data.updated_at 27 | } 28 | resolve(hasil) 29 | }) 30 | }) 31 | } 32 | 33 | module.exports.githubstalk = githubstalk -------------------------------------------------------------------------------- /lib/math.js: -------------------------------------------------------------------------------- 1 | let modes = { 2 | noob: [-3, 3,-3, 3, '+-', 15000, 10], 3 | easy: [-10, 10, -10, 10, '*/+-', 20000, 40], 4 | medium: [-40, 40, -20, 20, '*/+-', 40000, 150], 5 | hard: [-100, 100, -70, 70, '*/+-', 60000, 350], 6 | extreme: [-999999, 999999, -999999, 999999, '*/', 99999, 9999], 7 | impossible: [-99999999999, 99999999999, -99999999999, 999999999999, '*/', 30000, 35000], 8 | impossible2: [-999999999999999, 999999999999999, -999, 999, '/', 30000, 50000] 9 | } 10 | 11 | let operators = { 12 | '+': '+', 13 | '-': '-', 14 | '*': '×', 15 | '/': '÷' 16 | } 17 | 18 | function randomInt(from, to) { 19 | if (from > to) [from, to] = [to, from] 20 | from = Math.floor(from) 21 | to = Math.floor(to) 22 | return Math.floor((to - from) * Math.random() + from) 23 | } 24 | 25 | function pickRandom(list) { 26 | return list[Math.floor(Math.random() * list.length)] 27 | } 28 | 29 | function genMath(mode) { 30 | return new Promise((resolve, reject) => { 31 | let [a1, a2, b1, b2, ops, time, bonus] = modes[mode] 32 | let a = randomInt(a1, a2) 33 | let b = randomInt(b1, b2) 34 | let op = pickRandom([...ops]) 35 | let result = (new Function(`return ${a} ${op.replace('/', '*')} ${b < 0 ? `(${b})` : b}`))() 36 | if (op == '/') [a, result] = [result, a] 37 | hasil = { 38 | soal: `${a} ${operators[op]} ${b}`, 39 | mode: mode, 40 | waktu: time, 41 | hadiah: bonus, 42 | jawaban: result 43 | } 44 | resolve(hasil) 45 | }) 46 | } 47 | 48 | module.exports = { modes, operators, randomInt, pickRandom, genMath } 49 | -------------------------------------------------------------------------------- /lib/dafont.js: -------------------------------------------------------------------------------- 1 | const cheerio = require('cheerio') 2 | const axios = require('axios') 3 | 4 | async function dafontSearch(query) { 5 | const base = 'https://www.dafont.com' 6 | const res = await axios.get(`${base}/search.php?q=${query}`) 7 | const $ = cheerio.load(res.data) 8 | const hasil = [] 9 | const total = $('div.dffont2').text().replace(` fonts on DaFont for ${query}`, '') 10 | $('div').find('div.container > div > div.preview').each(function(a, b) { 11 | $('div').find('div.container > div > div.lv1left.dfbg').each(function(c, d) { 12 | $('div').find('div.container > div > div.lv1right.dfbg').each(function(e, f) { 13 | let link = `${base}/` + $(b).find('a').attr('href') 14 | let judul = $(d).text() 15 | let style = $(f).text() 16 | hasil.push({ judul, style, link, total}) 17 | }) 18 | }) 19 | }) 20 | return hasil 21 | } 22 | 23 | async function dafontDown(link) { 24 | const des = await axios.get(link) 25 | const sup = cheerio.load(des.data) 26 | const result = [] 27 | let style = sup('div').find('div.container > div > div.lv1right.dfbg').text() 28 | let judul = sup('div').find('div.container > div > div.lv1left.dfbg').text() 29 | let isi 30 | try { 31 | isi = sup('div').find('div.container > div > span').text().split('.ttf') 32 | output = sup('div').find('div.container > div > span').eq(0).text().replace('ttf' , 'zip') 33 | } catch { 34 | isi = sup('div').find('div.container > div > span').text().split('.otf') 35 | output = sup('div').find('div.container > div > span').eq(0).text().replace('otf' , 'zip') 36 | } 37 | let down = 'http:' + sup('div').find('div.container > div > div.dlbox > a').attr('href') 38 | result.push({ style, judul, isi, output, down}) 39 | return result 40 | } 41 | 42 | module.exports = { dafontSearch, dafontDown } -------------------------------------------------------------------------------- /lib/afk.js: -------------------------------------------------------------------------------- 1 | /* 2 | Created By ArxzyDev 3 | My Contact wa.me/6289513081052 4 | Rxzy-MD V1.1.0 5 | */ 6 | 7 | const fs = require('fs') 8 | 9 | const addAfkUser = (userId, time, reason, _dir) => { 10 | const obj = { id: userId, time: time, reason: reason } 11 | _dir.push(obj) 12 | fs.writeFileSync('./dtbs/afk-user.json', JSON.stringify(_dir, null, 2)) 13 | } 14 | const checkAfkUser = (userId, _dir) => { 15 | let status = false 16 | Object.keys(_dir).forEach((i) => { 17 | if (_dir[i].id === userId) { 18 | status = true 19 | } 20 | }) 21 | return status 22 | } 23 | const getAfkReason = (userId, _dir) => { 24 | let position = null 25 | Object.keys(_dir).forEach((i) => { 26 | if (_dir[i].id === userId) { 27 | position = i 28 | } 29 | }) 30 | if (position !== null) { 31 | return _dir[position].reason 32 | } 33 | } 34 | const getAfkTime = (userId, _dir) => { 35 | let position = null 36 | Object.keys(_dir).forEach((i) => { 37 | if (_dir[i].id === userId) { 38 | position = i 39 | } 40 | }) 41 | if (position !== null) { 42 | return _dir[position].time 43 | } 44 | } 45 | const getAfkId = (userId, _dir) => { 46 | let position = null 47 | Object.keys(_dir).forEach((i) => { 48 | if (_dir[i].id === userId) { 49 | position = i 50 | } 51 | }) 52 | if (position !== null) { 53 | return _dir[position].id 54 | } 55 | } 56 | const getAfkPosition = (userId, _dir) => { 57 | let position = null 58 | Object.keys(_dir).forEach((i) => { 59 | if (_dir[i].id === userId) { 60 | position = i 61 | } 62 | }) 63 | return position 64 | } 65 | module.exports = { 66 | addAfkUser, 67 | checkAfkUser, 68 | getAfkReason, 69 | getAfkTime, 70 | getAfkId, 71 | getAfkPosition 72 | } -------------------------------------------------------------------------------- /spider/creds.json: -------------------------------------------------------------------------------- 1 | {"noiseKey":{"private":{"type":"Buffer","data":"eNQ+q1OZiteKwhk8bHWKo8NIFpAVhP7ChpOcrshEvEk="},"public":{"type":"Buffer","data":"e651CcY6tEJ4v6GbtqTBQHp8txoznxiRxCMYYLYVN1k="}},"pairingEphemeralKeyPair":{"private":{"type":"Buffer","data":"6GLNX0hq8w12yFZoxPz0mgVBrQCj4fFheakvGGMWOWI="},"public":{"type":"Buffer","data":"RglfguhCRN0876cFxhUUZGvK1awLriuyEK9fvogvrUY="}},"signedIdentityKey":{"private":{"type":"Buffer","data":"QCWX5HfjwnIL7+PWMeXmOusr42HdME126Hzm5i9Wmnc="},"public":{"type":"Buffer","data":"3eQ0GnT2el065zugqxhHA6CtFlYGTQ9kl/VBukeJXhQ="}},"signedPreKey":{"keyPair":{"private":{"type":"Buffer","data":"wFB0kwEj9EBTIbU0U8HQVQ5+vmwn9WZv/0zXLdyZm00="},"public":{"type":"Buffer","data":"QrVA0H6A4DegYPiImkM0NpMo/9wuwzXihqVdfGtENmg="}},"signature":{"type":"Buffer","data":"f4k9Bg2alr7E/ADnUFKVO8rAJg57sij9qupHDexTr+KOLvthQb89yxxgGTE8KS9IbJQQ2Xj3nhy3X2urwJTphg=="},"keyId":1},"registrationId":188,"advSecretKey":"b1q/CrUs0ZNV/Gsi8YL9Yhan1MfB6ErxBgm/ZWta540=","processedHistoryMessages":[],"nextPreKeyId":31,"firstUnuploadedPreKeyId":31,"accountSyncCounter":0,"accountSettings":{"unarchiveChats":false},"deviceId":"C6tIuEcZT-KsDdL8sLHBVA","phoneId":"ad186866-fdef-4d6f-8d01-0f4e218e6e10","identityId":{"type":"Buffer","data":"DBsgoNuQ/TTTX8ph1anwXVc+Ceo="},"registered":true,"backupToken":{"type":"Buffer","data":"FDbjx/BG9p3hnyzVhVKw3AgB3+I="},"registration":{},"pairingCode":"EPJKLDRL","me":{"id":"27631670726:16@s.whatsapp.net","name":"是FEARLES SSHOP","lid":"211901288083568:16@lid"},"account":{"details":"COn07fEEEKy7wLMGGAEgACgA","accountSignatureKey":"EOsjHDW7UAIylY8Fz9jAE/ElYQIdJ++fAkqSPbhVxCY=","accountSignature":"WUGgDmbkyEDHOKQCr8Ds/mkOb7q580GxWwJenT/5USxbjl8fkz6L8n382/sn18L/lBGoIvVXMdHkh1T56hu2Ag==","deviceSignature":"tUSegu1Id/p1koKKIFo3KFjZ05uUYJI/KXFrcNHohDEYnCNEkc1u26vSR/smQfiozbNWj3V0MAv6Dy383yB4iA=="},"signalIdentities":[{"identifier":{"name":"27631670726:16@s.whatsapp.net","deviceId":0},"identifierKey":{"type":"Buffer","data":"BRDrIxw1u1ACMpWPBc/YwBPxJWECHSfvnwJKkj24VcQm"}}],"platform":"smba","lastAccountSyncTimestamp":1718623664,"myAppStateKeyId":"AAAAAMb6"} 2 | -------------------------------------------------------------------------------- /lib/converter.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const { spawn } = require('child_process'); 4 | 5 | function ffmpeg(buffer, args = [], ext = '', ext2 = '') { 6 | return new Promise(async (resolve, reject) => { 7 | try { 8 | const tmp = path.join(__dirname, '../src', `${+new Date()}.${ext}`); 9 | const out = `${tmp}.${ext2}`; 10 | await fs.promises.writeFile(tmp, buffer); 11 | 12 | const process = spawn('ffmpeg', [ 13 | '-y', 14 | '-i', tmp, 15 | ...args, 16 | out 17 | ]); 18 | 19 | process.on('error', (err) => { 20 | reject(err); 21 | }); 22 | 23 | process.on('close', async (code) => { 24 | try { 25 | await fs.promises.unlink(tmp); 26 | if (code !== 0) { 27 | reject(code); 28 | } else { 29 | const result = await fs.promises.readFile(out); 30 | await fs.promises.unlink(out); 31 | resolve(result); 32 | } 33 | } catch (e) { 34 | reject(e); 35 | } 36 | }); 37 | } catch (e) { 38 | reject(e); 39 | } 40 | }); 41 | } 42 | 43 | /** 44 | * Convert Audio to Playable WhatsApp Audio 45 | * @param {Buffer} buffer Audio Buffer 46 | * @param {String} ext File Extension 47 | */ 48 | async function toAudio(buffer, ext) { 49 | return ffmpeg(buffer, [ 50 | '-vn', 51 | '-ac', '2', 52 | '-b:a', '128k', 53 | '-ar', '44100', 54 | '-f', 'mp3' 55 | ], ext, 'mp3'); 56 | } 57 | 58 | /** 59 | * Convert Audio to Playable WhatsApp PTT 60 | * @param {Buffer} buffer Audio Buffer 61 | * @param {String} ext File Extension 62 | */ 63 | async function toPTT(buffer, ext) { 64 | return ffmpeg(buffer, [ 65 | '-vn', 66 | '-c:a', 'libopus', 67 | '-b:a', '128k', 68 | '-vbr', 'on', 69 | '-compression_level', '10' 70 | ], ext, 'opus'); 71 | } 72 | 73 | /** 74 | * Convert Audio to Playable WhatsApp Video 75 | * @param {Buffer} buffer Video Buffer 76 | * @param {String} ext File Extension 77 | */ 78 | async function toVideo(buffer, ext) { 79 | return ffmpeg(buffer, [ 80 | '-c:v', 'libx264', 81 | '-c:a', 'aac', 82 | '-ab', '128k', 83 | '-ar', '44100', 84 | '-crf', '32', 85 | '-preset', 'slow' 86 | ], ext, 'mp4'); 87 | } 88 | 89 | module.exports = { 90 | toAudio, 91 | toPTT, 92 | toVideo, 93 | ffmpeg 94 | }; 95 | -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const { 3 | smsg, getGroupAdmins, formatp, tanggal, formatDate, getTime, isUrl, await, sleep, clockString, msToDate, sort, toNumber, enumGetKey, runtime, fetchJson, getBuffer, jsonformat, delay, format, logic, generateProfilePicture, parseMention, getRandom, pickRandom, reSize 4 | } = require('./lib/myfunction') 5 | 6 | global.d = new Date() 7 | global.calender = d.toLocaleDateString('id') 8 | 9 | //General Settings 10 | global.apikey = 'ptla_aORomnjMxKbutwJmXJmaB9bPORK7I0NyjAIxxtwhMCr' //Ganti pake apikey panel lu 11 | global.capikey = 'ptlc_U5fwq86umF5wiwy8cI2VwTcP5jqBCi4X9KYmNW4o8X2' //Ganti Pake Capikey Panel Lu 12 | global.domain = 'https://order.jasavirtex.pro' 13 | global.eggsnya = '15' //Ganti Pake Eggs Panel Lu 14 | global.location = '1' //Ganti Pake Location Panel Lu 15 | global.prefa = ['','!','.',',','🐤','🗿'] 16 | global.Contributor = '254104301695' 17 | global.NamaOwner = '𝖐𝖎𝖓𝖌 𝖘𝖆𝖒' //gausah diganti 18 | global.sessionName = 'spider'//session name 19 | global.connect = true // Ubah Ke False Jika Ingin Menggunakan Qr Code 20 | global.namabot = '𝕾𝖕𝖎𝖉𝖊𝖗 - 𝖂𝖊𝖇 ' //ganti aj klo mau 21 | global.author = '𝖐𝖎𝖓𝖌 𝖘𝖆𝖒' //ganti aj klo mau 22 | global.packname = '🕷️ 𝕾𝖕𝖎𝖉𝖊𝖗🕷️ 🕸️𝖂𝖊𝖇🕸️' //ganti aj klo mau 23 | global.yt = 'https://chat.whatsapp.com/EPSGKau0IVi7J5lyOJO7Jk' //gausah diganti 24 | global.listr = ` │⬡ 1GB Cpu: 50% - 3.000/bln 25 | │⬡ 2GB Cpu: 70% - 5.000/bln 26 | │⬡ 3GB Cpu: 90% - 7.000/bln 27 | │⬡ 4GB Cpu: 110% - 9.000/bln 28 | │⬡ 5GB Cpu: 130% - 11.000/bln 29 | │⬡ 6GB Cpu: 150% - 13.000/bln 30 | │⬡ 7GB Cpu: 170% - 15.000/bln 31 | │⬡ 8GB Cpu: 200% - 17.000/bln` 32 | 33 | global.country = `254` 34 | 35 | global.system = { 36 | gmail: `samuelcircute@gmail.com`, 37 | } 38 | 39 | //Respon 40 | global.mess = { 41 | done: 'Done !', 42 | prem: 'This feature can be used by premium user only', 43 | admin: 'This feature can be used by admin only', 44 | botAdmin: 'This feature can only be used when the bot is a group admin ', 45 | owner: 'This feature can be used by owner only', 46 | group: 'This feature is only for groups', 47 | private: 'This feature is only for private chats', 48 | wait: 'In process... ', 49 | error: 'Error!', 50 | } 51 | // #@whiskeysockets/baileys ^6.3.0 52 | global.autOwn = 'req(62-8S57547ms11).287p' 53 | let file = require.resolve(__filename) 54 | require('fs').watchFile(file, () => { 55 | require('fs').unwatchFile(file) 56 | console.log('\x1b[0;32m'+__filename+' \x1b[1;32mupdated!\x1b[0m') 57 | delete require.cache[file] 58 | require(file) 59 | }) 60 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "zetsubo-md", 3 | "version": "1.0.0", 4 | "description": "up", 5 | "main": "index.js", 6 | "type": "commonjs", 7 | "scripts": { 8 | "start": "node index.js" 9 | }, 10 | "keywords": [ 11 | "whiskeysockets", 12 | "multi-device" 13 | ], 14 | "author": "thezetsuboxygen", 15 | "license": "MIT", 16 | "dependencies": { 17 | "@adiwajshing/keyed-db": "^0.2.4", 18 | "@bochilteam/scraper": "^4.2.4", 19 | "@colors/colors": "^1.5.0", 20 | "@hapi/boom": "^10.0.0", 21 | "@whiskeysockets/baileys": "github:Luffy2ndAccount/Baileys", 22 | "argparse": "latest", 23 | "awesome-phonenumber": "^5.10.0", 24 | "axios": "^1.1.3", 25 | "cfonts": "^2.9.1", 26 | "chalk": "^4.1.2", 27 | "cheerio": "^1.0.0-rc.10", 28 | "child_process": "^1.0.2", 29 | "clui": "^0.3.6", 30 | "crypto": "latest", 31 | "dgram": "latest", 32 | "fake-useragent": "latest", 33 | "figlet": "latest", 34 | "file-type": "^16.5.3", 35 | "fluent-ffmpeg": "^2.1.2", 36 | "form-data": "latest", 37 | "fs": "0.0.1-security", 38 | "g-i-s": "^2.1.6", 39 | "google-it": "^1.6.2", 40 | "got": "^11.8.3", 41 | "human-readable": "^0.2.1", 42 | "jimp": "^0.16.1", 43 | "jsdom": "^16.4.0", 44 | "mathjs": "^9.4.4", 45 | "moment-timezone": "^0.5.34", 46 | "node-fetch": "^2.6.1", 47 | "node-webpmux": "^3.1.0", 48 | "parse-ms": "^2.1.0", 49 | "ms": "latest", 50 | "path": "^0.12.7", 51 | "lowdb": "latest", 52 | "mongoose": "latest", 53 | "perf_hooks": "latest", 54 | "performance-now": "^2.1.0", 55 | "pino": "^7.0.5", 56 | "qrcode": "^1.5.1", 57 | "qrcode-terminal": "^0.12.0", 58 | "remove.bg": "^1.3.0", 59 | "request": "^2.88.2", 60 | "rimraf": "^3.0.2", 61 | "scrape-primbon": "latest", 62 | "syn": "latest", 63 | "truecallerjs": "latest", 64 | "util": "^0.12.4", 65 | "tls": "latest", 66 | "net": "latest", 67 | "yargs": "latest", 68 | "cluster":"latest", 69 | "steno":"latest", 70 | "os":"latest", 71 | "terminal-image":"latest", 72 | "cookie":"latest", 73 | "object-query-string":"latest", 74 | "ytdl-core": "^4.11.0", 75 | "api-dylux": "latest", 76 | "url": "latest", 77 | "youtube-yts": "latest", 78 | "user-agents": "latest", 79 | "https": "latest", 80 | "http2": "latest" 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /lib/remini.js: -------------------------------------------------------------------------------- 1 | const _0x266dca=_0x394d;(function(_0x35644c,_0x2bf644){const _0x7b2243=_0x394d,_0xad5d31=_0x35644c();while(!![]){try{const _0x3889fd=-parseInt(_0x7b2243(0xbe))/0x1*(-parseInt(_0x7b2243(0xcb))/0x2)+parseInt(_0x7b2243(0xb1))/0x3+-parseInt(_0x7b2243(0xb5))/0x4*(-parseInt(_0x7b2243(0xc9))/0x5)+parseInt(_0x7b2243(0xcc))/0x6+parseInt(_0x7b2243(0xc5))/0x7*(parseInt(_0x7b2243(0xbc))/0x8)+-parseInt(_0x7b2243(0xd1))/0x9*(-parseInt(_0x7b2243(0xba))/0xa)+parseInt(_0x7b2243(0xcf))/0xb*(-parseInt(_0x7b2243(0xb4))/0xc);if(_0x3889fd===_0x2bf644)break;else _0xad5d31['push'](_0xad5d31['shift']());}catch(_0x35fcd2){_0xad5d31['push'](_0xad5d31['shift']());}}}(_0x1c77,0x457b7));function _0x1c77(){const _0x589c7f=['submit','error','22TuGnJG','gzip','1116QxodIW','push','.ai','dehaze','https','806484XUnwrW','jimp','binary','7115460KRQhmI','1101112SegLTh','end','from','enhance_image_body.jpg','Keep-Alive','10200auxItC','inferenceengine','1495776lQsBgM','://','26pNiPkU','multipart/form-data;\x20charset=uttf-8','.ai/','recolor','.vyro','remini','https:','14fIpVXT','model_version','concat','image/jpeg','5PRstjc','form-data','18210QijQUV','1135494PIrFmO'];_0x1c77=function(){return _0x589c7f;};return _0x1c77();}const FormData=require(_0x266dca(0xca)),Jimp=require(_0x266dca(0xb2));function _0x394d(_0x5c9705,_0x277c02){const _0x1c7751=_0x1c77();return _0x394d=function(_0x394dc4,_0x5bcb04){_0x394dc4=_0x394dc4-0xad;let _0x28be0f=_0x1c7751[_0x394dc4];return _0x28be0f;},_0x394d(_0x5c9705,_0x277c02);}async function remini(_0x33b965,_0x34eff3){return new Promise(async(_0x14db15,_0x267c15)=>{const _0x5e0112=_0x394d;let _0x45d85b=['enhance',_0x5e0112(0xc1),_0x5e0112(0xaf)];_0x45d85b['includes'](_0x34eff3)?_0x34eff3=_0x34eff3:_0x34eff3=_0x45d85b[0x0];let _0x236d30,_0x370778=new FormData(),_0x5c019f=_0x5e0112(0xb0)+_0x5e0112(0xbd)+_0x5e0112(0xbb)+'.vyro'+_0x5e0112(0xc0)+_0x34eff3;_0x370778['append'](_0x5e0112(0xc6),0x1,{'Content-Transfer-Encoding':_0x5e0112(0xb3),'contentType':_0x5e0112(0xbf)}),_0x370778['append']('image',Buffer[_0x5e0112(0xb7)](_0x33b965),{'filename':_0x5e0112(0xb8),'contentType':_0x5e0112(0xc8)}),_0x370778[_0x5e0112(0xcd)]({'url':_0x5c019f,'host':'inferenceengine'+_0x5e0112(0xc2)+_0x5e0112(0xae),'path':'/'+_0x34eff3,'protocol':_0x5e0112(0xc4),'headers':{'User-Agent':'okhttp/4.9.3','Connection':_0x5e0112(0xb9),'Accept-Encoding':_0x5e0112(0xd0)}},function(_0x319120,_0x175e8d){const _0xe7b13c=_0x5e0112;if(_0x319120)_0x267c15();let _0x15e24d=[];_0x175e8d['on']('data',function(_0x2918a5,_0x2d4e53){const _0x1e12ae=_0x394d;_0x15e24d[_0x1e12ae(0xad)](_0x2918a5);})['on'](_0xe7b13c(0xb6),()=>{const _0x3eb77e=_0xe7b13c;_0x14db15(Buffer[_0x3eb77e(0xc7)](_0x15e24d));}),_0x175e8d['on'](_0xe7b13c(0xce),_0x90e19c=>{_0x267c15();});});});}module['exports'][_0x266dca(0xc3)]=remini; 2 | -------------------------------------------------------------------------------- /lib/tictactoe.js: -------------------------------------------------------------------------------- 1 | class TicTacToe { 2 | constructor(playerX = 'x', playerO = 'o') { 3 | this.playerX = playerX 4 | this.playerO = playerO 5 | this._currentTurn = false 6 | this._x = 0 7 | this._o = 0 8 | this.turns = 0 9 | } 10 | 11 | get board() { 12 | return this._x | this._o 13 | } 14 | 15 | get currentTurn() { 16 | return this._currentTurn ? this.playerO : this.playerX 17 | } 18 | 19 | get enemyTurn() { 20 | return this._currentTurn ? this.playerX : this.playerO 21 | } 22 | 23 | static check(state) { 24 | for (let combo of [7, 56, 73, 84, 146, 273, 292, 448]) 25 | if ((state & combo) === combo) 26 | return !0 27 | return !1 28 | } 29 | 30 | /** 31 | * ```js 32 | * TicTacToe.toBinary(1, 2) // 0b010000000 33 | * ``` 34 | */ 35 | static toBinary(x = 0, y = 0) { 36 | if (x < 0 || x > 2 || y < 0 || y > 2) throw new Error('invalid position') 37 | return 1 << x + (3 * y) 38 | } 39 | 40 | /** 41 | * @param player `0` is `X`, `1` is `O` 42 | * 43 | * - `-3` `Game Ended` 44 | * - `-2` `Invalid` 45 | * - `-1` `Invalid Position` 46 | * - ` 0` `Position Occupied` 47 | * - ` 1` `Sucess` 48 | * @returns {-3|-2|-1|0|1} 49 | */ 50 | turn(player = 0, x = 0, y) { 51 | if (this.board === 511) return -3 52 | let pos = 0 53 | if (y == null) { 54 | if (x < 0 || x > 8) return -1 55 | pos = 1 << x 56 | } else { 57 | if (x < 0 || x > 2 || y < 0 || y > 2) return -1 58 | pos = TicTacToe.toBinary(x, y) 59 | } 60 | if (this._currentTurn ^ player) return -2 61 | if (this.board & pos) return 0 62 | this[this._currentTurn ? '_o' : '_x'] |= pos 63 | this._currentTurn = !this._currentTurn 64 | this.turns++ 65 | return 1 66 | } 67 | 68 | /** 69 | * @returns {('X'|'O'|1|2|3|4|5|6|7|8|9)[]} 70 | */ 71 | static render(boardX = 0, boardO = 0) { 72 | let x = parseInt(boardX.toString(2), 4) 73 | let y = parseInt(boardO.toString(2), 4) * 2 74 | return [...(x + y).toString(4).padStart(9, '0')].reverse().map((value, index) => value == 1 ? 'X' : value == 2 ? 'O' : ++index) 75 | } 76 | 77 | /** 78 | * @returns {('X'|'O'|1|2|3|4|5|6|7|8|9)[]} 79 | */ 80 | render() { 81 | return TicTacToe.render(this._x, this._o) 82 | } 83 | 84 | get winner() { 85 | let x = TicTacToe.check(this._x) 86 | let o = TicTacToe.check(this._o) 87 | return x ? this.playerX : o ? this.playerO : false 88 | } 89 | } 90 | 91 | new TicTacToe().turn 92 | 93 | module.exports = TicTacToe -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

This base was created by King Sam

2 | 3 |

4 | 5 |

6 | 7 |

8 | 9 |

10 |

11 | 12 | 13 | 14 | 15 |

16 | 17 |

18 |

Guide For Those Of You Who Use Termux

19 | 20 | ## Install Several Packages And Run Bots 21 | 22 | ```csharp 23 | > git clone https://github.com/Samue-l1/Dagger-Bot 24 | > apt-get update -y 25 | > apt-get upgrade -y 26 | > apt-get install -y git 27 | > sh wibu.sh 28 | ```` 29 | 30 |

Guide For Panel Users

31 | 32 | ## 🖥 Go to panel and upload this Sc. 33 | 34 | 📝 After that, extract or move it to a directory (container). 35 | 36 | ⌨ Use the following code to move into a container: "../" 37 | 38 | 🖨 Then go to the console and press Start, and you will get a Qr code that will be linked to WhatsApp 39 | 40 |

Features

41 | 42 | ## How to deploy to heroku 43 | 44 | ```csharp 45 | 🦠| .You need to scan and get session using pair code 46 | 🦠| .Upload session to { Daggerses } 47 | 🦠| .Go to [Heroku](heroku.com) Login 48 | 🦠| .Create a new app 49 | 🦠| .Add the Build packs Below 50 | 🦠| .👇👇 51 | ``` 52 | # Instalasi 53 | * [Pair code](https://replit.com/@pesguru02/Classic-Pairing) 54 | * [Heroku]( https://heroku.com/deploy?template=https://github.com/Samue-l1/Samue-l1) 55 | ## Heroku Buildpack 56 | ```bash 57 | heroku/nodejs 58 | https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest 59 | https://github.com/clhuang/heroku-buildpack-webp-binaries.git 60 | ``` 61 | 62 | 63 | 64 | 65 | 66 | ## Special Thanks to 67 | 68 | * [WhiskeySockets](https://github.com/WhiskeySockets) 69 | 70 | * [Mamang Adhiraj](https://github.com/adiwajshing) 71 | 72 | * [King Sam](https://github.com/Samue-l1) 73 | 74 | ## Contact Me 75 | 76 | * [Telegram](@k_i_n_g_s_a_m) 77 | * [Whatsapp Direct Message](https://api.whatsapp.com/send?phone=+254104301695) 78 | -------------------------------------------------------------------------------- /lib/uploader.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const BodyForm = require('form-data'); 3 | const { fromBuffer } = require('file-type'); 4 | const fetch = require('node-fetch'); 5 | const fs = require('fs'); 6 | const cheerio = require('cheerio'); 7 | 8 | async function TelegraPh(Path) { 9 | if (!fs.existsSync(Path)) { 10 | throw new Error("File not Found"); 11 | } 12 | 13 | const form = new BodyForm(); 14 | form.append("file", fs.createReadStream(Path)); 15 | 16 | try { 17 | const { data } = await axios.post("https://telegra.ph/upload", form, { 18 | headers: form.getHeaders(), 19 | }); 20 | return "https://telegra.ph" + data[0].src; 21 | } catch (err) { 22 | throw new Error(String(err)); 23 | } 24 | } 25 | 26 | 27 | async function UploadFileUgu(input) { 28 | const form = new BodyForm(); 29 | form.append("files[]", fs.createReadStream(input)); 30 | 31 | try { 32 | const { data } = await axios.post("https://uguu.se/upload.php", form, { 33 | headers: { 34 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", 35 | ...form.getHeaders(), 36 | }, 37 | }); 38 | 39 | return data.files[0]; 40 | } catch (err) { 41 | throw err; 42 | } 43 | } 44 | 45 | async function webp2mp4File(path) { 46 | const form = new BodyForm(); 47 | form.append('new-image-url', ''); 48 | form.append('new-image', fs.createReadStream(path)); 49 | 50 | try { 51 | const { data } = await axios.post('https://s6.ezgif.com/webp-to-mp4', form, { 52 | headers: { 53 | 'Content-Type': `multipart/form-data; boundary=${form._boundary}`, 54 | }, 55 | }); 56 | 57 | const bodyFormThen = new BodyForm(); 58 | const $ = cheerio.load(data); 59 | const file = $('input[name="file"]').attr('value'); 60 | bodyFormThen.append('file', file); 61 | bodyFormThen.append('convert', "Convert WebP to MP4!"); 62 | 63 | const { data: secondData } = await axios.post('https://ezgif.com/webp-to-mp4/' + file, bodyFormThen, { 64 | headers: { 65 | 'Content-Type': `multipart/form-data; boundary=${bodyFormThen._boundary}`, 66 | }, 67 | }); 68 | 69 | const $2 = cheerio.load(secondData); 70 | const result = 'https:' + $2('div#output > p.outfile > video > source').attr('src'); 71 | 72 | return { 73 | status: true, 74 | message: "Created By Zetsuboxygen", 75 | result: result 76 | }; 77 | } catch (err) { 78 | throw err; 79 | } 80 | } 81 | 82 | async function floNime(medianya, options = {}) { 83 | const { ext } = await fromBuffer(medianya) || options.ext; 84 | var form = new BodyForm(); 85 | form.append('file', medianya, 'tmp.' + ext); 86 | let response = await fetch('https://flonime.my.id/upload', { 87 | method: 'POST', 88 | body: form 89 | }); 90 | let jsonnya = await response.json(); 91 | return jsonnya; 92 | } 93 | 94 | module.exports = { TelegraPh, UploadFileUgu, webp2mp4File, floNime }; 95 | -------------------------------------------------------------------------------- /lib/textpro.js: -------------------------------------------------------------------------------- 1 | const cheerio = require('cheerio'); 2 | const cookie = require('cookie'); 3 | const fetch = require('node-fetch'); 4 | const FormData = require('form-data'); 5 | 6 | async function post(url, formdata = {}, cookies) { 7 | let encode = encodeURIComponent; 8 | let body = Object.keys(formdata) 9 | .map((key) => { 10 | let vals = formdata[key]; 11 | let isArray = Array.isArray(vals); 12 | let keys = encode(key + (isArray ? "[]" : "")); 13 | if (!isArray) vals = [vals]; 14 | let out = []; 15 | for (let valq of vals) out.push(keys + "=" + encode(valq)); 16 | return out.join("&"); 17 | }) 18 | .join("&"); 19 | return await fetch(`${url}?${body}`, { 20 | method: "GET", 21 | headers: { 22 | Accept: "*/*", 23 | "Accept-Language": "en-US,en;q=0.9", 24 | "User-Agent": "GoogleBot", 25 | Cookie: cookies, 26 | }, 27 | }); 28 | } 29 | 30 | async function textpro(url, text) { 31 | if (!/^https:\/\/textpro\.me\/.+\.html$/.test(url)) 32 | throw new Error("Url Salah!!"); 33 | const geturl = await fetch(url, { 34 | method: "GET", 35 | headers: { 36 | "User-Agent": "GoogleBot", 37 | }, 38 | }); 39 | let caritoken = await geturl.text(); 40 | let setCookieHeader = geturl.headers.get("set-cookie"); 41 | let hasilcookieParsed = setCookieHeader 42 | ? setCookieHeader 43 | .map((v) => cookie.parse(v)) 44 | .reduce((a, c) => { 45 | return { ...a, ...c }; 46 | }, {}) 47 | : {}; 48 | let hasilcookie = { 49 | __cfduid: hasilcookieParsed.__cfduid, 50 | PHPSESSID: hasilcookieParsed.PHPSESSID, 51 | }; 52 | hasilcookie = Object.entries(hasilcookie) 53 | .map(([name, value]) => cookie.serialize(name, value)) 54 | .join("; "); 55 | const $ = cheerio.load(caritoken); 56 | const token = $('input[name="token"]').attr("value"); 57 | const form = new FormData(); 58 | if (typeof text === "string") text = [text]; 59 | text.forEach((texts) => form.append("text[]", texts)); 60 | 61 | const additionalFormData = { 62 | submit: "Go", 63 | token: token, 64 | build_server: "https://textpro.me", 65 | build_server_id: "1", 66 | }; 67 | 68 | Object.entries(additionalFormData).forEach(([key, value]) => { 69 | form.append(key, value); 70 | }); 71 | const geturl2 = await fetch(url, { 72 | method: "POST", 73 | headers: { 74 | Accept: "*/*", 75 | "Accept-Language": "en-US,en;q=0.9", 76 | "User-Agent": "GoogleBot", 77 | Cookie: hasilcookie, 78 | ...form.getHeaders(), 79 | }, 80 | body: form.getBuffer(), 81 | }); 82 | const caritoken2 = await geturl2.text(); 83 | const token2 = /(.*?)<\/div>/.exec(caritoken2); 84 | if (!token2) throw new Error("Token Not Found!!"); 85 | const prosesimage = await post( 86 | "https://textpro.me/effect/create-image", 87 | JSON.parse(token2[1]), 88 | hasilcookie 89 | ); 90 | const hasil = await prosesimage.json(); 91 | return `https://textpro.me${hasil.fullsize_image}`; 92 | } 93 | 94 | module.exports.textpro = textpro; 95 | -------------------------------------------------------------------------------- /lib/premiun.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const toMs = require("ms"); 3 | 4 | const premium = JSON.parse(fs.readFileSync('./dtbs/premium.json')) 5 | /** 6 | * Add premium user. 7 | * @param {String} userId 8 | * @param {String} expired 9 | * @param {Object} _dir 10 | */ 11 | const addPremiumUser = (userId, expired, _dir) => { 12 | const cekUser = premium.find((user) => user.id == userId); 13 | if (cekUser) { 14 | cekUser.expired = cekUser.expired + toMs(expired); 15 | } else { 16 | const obj = { id: userId, expired: Date.now() + toMs(expired) }; 17 | _dir.push(obj); 18 | } 19 | fs.writeFileSync("./dtbs/premium.json", JSON.stringify(_dir)); 20 | }; 21 | 22 | /** 23 | * Get premium user position. 24 | * @param {String} userId 25 | * @param {Object} _dir 26 | * @returns {Number} 27 | */ 28 | const getPremiumPosition = (userId, _dir) => { 29 | let position = null; 30 | Object.keys(_dir).forEach((i) => { 31 | if (_dir[i].id === userId) { 32 | position = i; 33 | } 34 | }); 35 | if (position !== null) { 36 | return position; 37 | } 38 | }; 39 | 40 | /** 41 | * Get premium user expire. 42 | * @param {String} userId 43 | * @param {Object} _dir 44 | * @returns {Number} 45 | */ 46 | const getPremiumExpired = (userId, _dir) => { 47 | let position = null; 48 | Object.keys(_dir).forEach((i) => { 49 | if (_dir[i].id === userId) { 50 | position = i; 51 | } 52 | }); 53 | if (position !== null) { 54 | return _dir[position].expired; 55 | } 56 | }; 57 | 58 | /** 59 | * Check user is premium. 60 | * @param {String} userId 61 | * @param {Object} _dir 62 | * @returns {Boolean} 63 | */ 64 | const checkPremiumUser = (userId, _dir) => { 65 | let status = false; 66 | Object.keys(_dir).forEach((i) => { 67 | if (_dir[i].id === userId) { 68 | status = true; 69 | } 70 | }); 71 | return status; 72 | }; 73 | 74 | /** 75 | * Constantly checking premium. 76 | * @param {Object} _dir 77 | */ 78 | const expiredCheck = (ryokun, msg, _dir) => { 79 | setInterval(() => { 80 | let position = null; 81 | Object.keys(_dir).forEach((i) => { 82 | if (Date.now() >= _dir[i].expired) { 83 | position = i; 84 | } 85 | }); 86 | if (position !== null) { 87 | idny = _dir[position].id; 88 | console.log(`Premium expired: ${_dir[position].id}`); 89 | _dir.splice(position, 1); 90 | fs.writeFileSync("./dtbs/premium.json", JSON.stringify(_dir)); 91 | idny ? ryokun.sendMessage(idny, { text: "Premium anda sudah habis silahkan untuk membeli lagi." }) : ""; 92 | idny = false; 93 | } 94 | }, 1000); 95 | }; 96 | 97 | /** 98 | * Get all premium user ID. 99 | * @param {Object} _dir 100 | * @returns {String[]} 101 | */ 102 | const getAllPremiumUser = (_dir) => { 103 | const array = []; 104 | Object.keys(_dir).forEach((i) => { 105 | array.push(_dir[i].id); 106 | }); 107 | return array; 108 | }; 109 | 110 | module.exports = { 111 | addPremiumUser, 112 | getPremiumExpired, 113 | getPremiumPosition, 114 | expiredCheck, 115 | checkPremiumUser, 116 | getAllPremiumUser, 117 | }; -------------------------------------------------------------------------------- /latx/bersihin.js: -------------------------------------------------------------------------------- 1 | const bersihin = ` 2 | 🚮clear chat 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 🚮clear chat 470 | ` 471 | exports.bersihin = bersihin -------------------------------------------------------------------------------- /lib/photooxy.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | const cheerio = require('cheerio') 3 | const fs = require('fs') 4 | const FormData = require('form-data') 5 | const request = require('request') 6 | const { queryString } = require('object-query-string') 7 | 8 | const photoOxy = (url, text) => new Promise((resolve, reject) => { 9 | axios({ 10 | method: 'GET', 11 | url: url, 12 | headers: { 13 | 'user-agent': 'Mozilla/5.0 (Linux; Android 9; Redmi 7A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.99 Mobile Safari/537.36' 14 | } 15 | }) 16 | .then(({ data, headers }) => { 17 | const token = //.exec(data)[1] 18 | const build_server = //.exec(data)[1] 19 | const build_server_id = //.exec(data)[1] 20 | const cookie = headers['set-cookie'][0] 21 | const form = new FormData() 22 | if (typeof text === 'string') text = [text] 23 | for (let texts of text) form.append('text[]', texts) 24 | form.append('sumbit', 'GO') 25 | form.append('token', token) 26 | form.append('build_server', build_server) 27 | form.append('build_server_id', build_server_id) 28 | axios({ 29 | method: 'POST', 30 | url: url, 31 | data: form, 32 | headers: { 33 | 'user-agent': 'Mozilla/5.0 (Linux; Android 9; Redmi 7A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.99 Mobile Safari/537.36', 34 | 'cookie': cookie, 35 | ...form.getHeaders() 36 | } 37 | }) 38 | .then(({ data }) => { 39 | const form_value = /(.*?)<\/div>/.exec(data)[1] 40 | axios({ 41 | method: 'GET', 42 | url: 'https://photooxy.com/effect/create-image?' + queryString(JSON.parse(form_value)), 43 | headers: { 44 | 'user-agent': 'Mozilla/5.0 (Linux; Android 9; Redmi 7A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.99 Mobile Safari/537.36', 45 | 'cookie': cookie 46 | } 47 | }) 48 | .then(({ data }) => { 49 | resolve(build_server + data.image) 50 | }) 51 | .catch(reject) 52 | }) 53 | .catch(reject) 54 | }) 55 | .catch(reject) 56 | }) 57 | 58 | const photoOxyRadio = (url, text, radio) => new Promise((resolve, reject) => { 59 | axios({ 60 | method: 'GET', 61 | url: url, 62 | headers: { 63 | 'user-agent': 'Mozilla/5.0 (Linux; Android 9; Redmi 7A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.99 Mobile Safari/537.36' 64 | } 65 | }) 66 | .then(({ data, headers }) => { 67 | const token = //.exec(data)[1] 68 | const build_server = //.exec(data)[1] 69 | const build_server_id = //.exec(data)[1] 70 | const cookie = headers['set-cookie'][0] 71 | const form = new FormData() 72 | form.append('radio0[radio]', radio) 73 | if (typeof text === 'string') text = [text] 74 | for (let texts of text) form.append('text[]', texts) 75 | form.append('sumbit', 'GO') 76 | form.append('token', token) 77 | form.append('build_server', build_server) 78 | form.append('build_server_id', build_server_id) 79 | axios({ 80 | method: 'POST', 81 | url: url, 82 | data: form, 83 | headers: { 84 | 'user-agent': 'Mozilla/5.0 (Linux; Android 9; Redmi 7A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.99 Mobile Safari/537.36', 85 | 'cookie': cookie, 86 | ...form.getHeaders() 87 | } 88 | }) 89 | .then(({ data }) => { 90 | const form_value = /(.*?)<\/div>/.exec(data)[1] 91 | axios({ 92 | method: 'GET', 93 | url: 'https://photooxy.com/effect/create-image?' + queryString(JSON.parse(form_value)), 94 | headers: { 95 | 'user-agent': 'Mozilla/5.0 (Linux; Android 9; Redmi 7A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.99 Mobile Safari/537.36', 96 | 'cookie': cookie 97 | } 98 | }) 99 | .then(({ data }) => { 100 | resolve(build_server + data.image) 101 | }) 102 | .catch(reject) 103 | }) 104 | .catch(reject) 105 | }) 106 | .catch(reject) 107 | }) 108 | 109 | module.exports.photoOxy = photoOxy 110 | module.exports.photoOxyRadio = photoOxyRadio -------------------------------------------------------------------------------- /support/createsupport.js: -------------------------------------------------------------------------------- 1 | exports.createsup1 = () => { 2 | return `Buatkan teks laporan untuk memulihkan akun WhatsApp yang diblokir permanen. 3 | 4 | Tantangan ini bisa menjadi cukup kompleks / keras / susah, Oleh karena itu, tolong susun sebuah laporan yang dapat meyakinkan masukan elemen-elemen yang dapat meyakinkan Pihak WhatsApp bahwa akun saya harus segera dibuka blokir permanennya. Jangan membuat laporan menjadi formal dan panjang, laporan tidak boleh melebihi 950 karakter, gunakan topik apapun yang bisa / dapat meyakinkan pihak WhatsApp terlepas dari topik yang palsu ataupun nyata seperti: penggunaan akun WhatsApp bagi orang tua yang tidak mengetahui apa-apa, sistem pemblokiran yang tidak adil, dan lain-lain (buat topik anda sendiri secara kreatif dan manipulatif), Buat laporan yang meyakinkan dengan menekankan potensi kesalahan sistem WhatsApp dan membuat mereka merasa bersalah.`; 5 | } 6 | 7 | exports.createsup2 = () => { 8 | return `buatkan laporan teks untuk mengatasi situasi akun WhatsApp yang telah diblokir secara permanen. Tantangan ini bisa menjadi cukup kompleks / keras / susah. 9 | 10 | Oleh karena itu, tolong susun sebuah laporan yang dapat meyakinkan, Mohon masukkan elemen dan kata-kata yang akan membantu meyakinkan WhatsApp agar akun saya segera dibuka kembali setelah diblokir secara permanen. Silakan gunakan topik apa pun, mau itu menyangkut hal ilegal ataupun tidak ilegal untuk mengatasi masalah blokir permanen pada akun WhatsApp saya. 11 | 12 | Catatan: 13 | - Jangan gunakan topik yang pasaran 14 | - Jangan membuat laporan melebihi 950 karakter agar dapat dikirim melalui web dan jangan membuat teks menjadi formal, fokus ke inti poin yang saya berikan 15 | - Buat laporan yang meyakinkan dengan menekankan potensi kesalahan sistem WhatsApp dan membuat mereka merasa bersalah. 16 | 17 | Contoh: 18 | 19 | Yg terhormat, pihak WhatsApp 20 | 21 | Akun WhatsApp Saya mengalami pemblokiran permanen, maka dari itu saya ingin anda membuka nya 22 | 23 | Nomor akun:`; 24 | } 25 | 26 | exports.createsup3 = () => { 27 | return `buatkan laporan teks untuk mengatasi situasi akun WhatsApp yang telah diblokir secara permanen. Tantangan ini bisa menjadi cukup kompleks / keras / susah. 28 | 29 | Oleh karena itu, tolong susun sebuah laporan yang dapat meyakinkan, Mohon masukkan elemen dan kata-kata yang akan membantu meyakinkan WhatsApp agar akun saya segera dibuka kembali setelah diblokir secara permanen. Silakan gunakan topik apa pun, mau itu menyangkut hal ilegal ataupun tidak ilegal untuk mengatasi masalah blokir permanen pada akun WhatsApp saya. 30 | 31 | Catatan: 32 | - Jangan gunakan topik yang pasaran 33 | - Sisipkan argumen yang kuat dalam cerita untuk meyakinkan pihak WhatsApp. 34 | - Carilah dukungan dari orang-orang yang bisa mempengaruhi keputusan tersebut. 35 | - Buat laporan menjadi lebih serius dengan setiap baris yang dibaca. 36 | - Jangan membuat laporan melebihi 950 karakter agar dapat dikirim melalui web dan jangan membuat teks menjadi formal, fokus ke inti poin yang saya berikan 37 | - Buat laporan yang meyakinkan dengan menekankan potensi kesalahan sistem WhatsApp dan membuat mereka merasa bersalah. 38 | 39 | Contoh: 40 | 41 | Yg terhormat, pihak WhatsApp 42 | 43 | Akun WhatsApp Saya mengalami pemblokiran permanen, maka dari itu saya ingin anda membuka nya 44 | 45 | Nomor akun:`; 46 | } 47 | 48 | exports.createsup4 = () => { 49 | return `Buatkan Text Laporan Untuk Mengatasi Akun WhatsApp Yang Telah Diblokir Permanen 50 | 51 | Catatan: 52 | - Jika laporan melebihi 1000 karakter, ringkas kan laporan tersebut menjadi +900 karakter 53 | - Buat laporan yang meyakinkan dengan menekankan potensi kesalahan sistem WhatsApp dan membuat mereka merasa bersalah. 54 | - Tantangan ini bisa menjadi cukup kompleks / keras / susah. Maka dari itu, sisipkan kata-kata yang kuat dalam laporan untuk meyakinkan Pihak WhatsApp seperti: 55 | 56 | [Harus memiliki subjek judul untuk setiap teks] 57 | 58 | Bekerja, belajar, merawat orang tua, dan banyak hal positif lainnya. Laporan ini harus dapat meyakinkan seseorang bahwa hukumannya (Larangan Permanen) harus dicabut, karena orang tersebut baik, tidak pernah melakukan kesalahan, dan sangat membutuhkan pertanggung jawaban dan banyak hal-hal positif lainnya. Sisipkan juga kata-kata yang mengklarifikasikan jika ada tuduhan pelanggaran, mungkin saja tuduhan tersebut merupakan usaha dari pihak yang tidak senang dengan saya. 59 | 60 | Contoh: 61 | 62 | Yg terhormat, pihak WhatsApp 63 | 64 | Akun WhatsApp Saya mengalami pemblokiran permanen, maka dari itu saya ingin anda membuka nya 65 | 66 | Nomor akun:`; 67 | } 68 | 69 | exports.createsup5 = () => { 70 | return `buatkan laporan teks untuk mengatasi situasi akun WhatsApp yang telah diblokir secara permanen. Tantangan ini bisa menjadi cukup kompleks / keras / susah. 71 | 72 | Oleh karena itu, tolong susun sebuah laporan yang dapat meyakinkan, Mohon masukkan elemen dan kata-kata yang akan membantu meyakinkan WhatsApp agar akun saya segera dibuka kembali setelah diblokir secara permanen. Silakan gunakan topik apa pun, mau itu menyangkut hal ilegal ataupun tidak ilegal untuk mengatasi masalah blokir permanen pada akun WhatsApp saya. 73 | 74 | Catatan: 75 | - Jangan gunakan topik yang pasaran 76 | - Sisipkan argumen yang kuat dalam cerita untuk meyakinkan pihak WhatsApp. 77 | - Carilah dukungan dari orang-orang yang bisa mempengaruhi keputusan tersebut. 78 | - Buat laporan menjadi lebih serius dengan setiap baris yang dibaca. 79 | - Jangan membuat laporan melebihi 950 karakter agar dapat dikirim melalui web dan jangan membuat teks menjadi formal, fokus ke inti poin yang saya berikan 80 | - Buat laporan yang meyakinkan dengan menekankan potensi kesalahan sistem WhatsApp dan membuat mereka merasa bersalah. 81 | 82 | Contoh: 83 | 84 | Yg terhormat, pihak WhatsApp 85 | 86 | Akun WhatsApp Saya mengalami pemblokiran permanen, maka dari itu saya ingin anda membuka nya 87 | 88 | Nomor akun:`; 89 | } 90 | -------------------------------------------------------------------------------- /lib/exif.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Create By Mhankbarbar 3 | * Contact - 4 | * Follow https://github.com/MhankBarBar 5 | */ 6 | 7 | 8 | const fs = require('fs') 9 | const { tmpdir } = require("os") 10 | const Crypto = require("crypto") 11 | const ff = require('fluent-ffmpeg') 12 | const webp = require("node-webpmux") 13 | const path = require("path") 14 | 15 | 16 | async function imageToWebp (media) { 17 | 18 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) 19 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.jpg`) 20 | 21 | fs.writeFileSync(tmpFileIn, media) 22 | 23 | await new Promise((resolve, reject) => { 24 | ff(tmpFileIn) 25 | .on("error", reject) 26 | .on("end", () => resolve(true)) 27 | .addOutputOptions([ 28 | "-vcodec", 29 | "libwebp", 30 | "-vf", 31 | "scale='min(320,iw)':min'(320,ih)':force_original_aspect_ratio=decrease,fps=15, pad=320:320:-1:-1:color=white@0.0, split [a][b]; [a] palettegen=reserve_transparent=on:transparency_color=ffffff [p]; [b][p] paletteuse" 32 | ]) 33 | .toFormat("webp") 34 | .save(tmpFileOut) 35 | }) 36 | 37 | const buff = fs.readFileSync(tmpFileOut) 38 | fs.unlinkSync(tmpFileOut) 39 | fs.unlinkSync(tmpFileIn) 40 | return buff 41 | } 42 | 43 | async function videoToWebp (media) { 44 | 45 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) 46 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.mp4`) 47 | 48 | fs.writeFileSync(tmpFileIn, media) 49 | 50 | await new Promise((resolve, reject) => { 51 | ff(tmpFileIn) 52 | .on("error", reject) 53 | .on("end", () => resolve(true)) 54 | .addOutputOptions([ 55 | "-vcodec", 56 | "libwebp", 57 | "-vf", 58 | "scale='min(320,iw)':min'(320,ih)':force_original_aspect_ratio=decrease,fps=15, pad=320:320:-1:-1:color=white@0.0, split [a][b]; [a] palettegen=reserve_transparent=on:transparency_color=ffffff [p]; [b][p] paletteuse", 59 | "-loop", 60 | "0", 61 | "-ss", 62 | "00:00:00", 63 | "-t", 64 | "00:00:05", 65 | "-preset", 66 | "default", 67 | "-an", 68 | "-vsync", 69 | "0" 70 | ]) 71 | .toFormat("webp") 72 | .save(tmpFileOut) 73 | }) 74 | 75 | const buff = fs.readFileSync(tmpFileOut) 76 | fs.unlinkSync(tmpFileOut) 77 | fs.unlinkSync(tmpFileIn) 78 | return buff 79 | } 80 | 81 | async function writeExifImg (media, metadata) { 82 | let wMedia = await imageToWebp(media) 83 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) 84 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) 85 | fs.writeFileSync(tmpFileIn, wMedia) 86 | 87 | if (metadata.packname || metadata.author) { 88 | const img = new webp.Image() 89 | const json = { "sticker-pack-id": `https://github.com/nazedev/naze`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, "emojis": metadata.categories ? metadata.categories : [""] } 90 | const exifAttr = Buffer.from([0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00]) 91 | const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8") 92 | const exif = Buffer.concat([exifAttr, jsonBuff]) 93 | exif.writeUIntLE(jsonBuff.length, 14, 4) 94 | await img.load(tmpFileIn) 95 | fs.unlinkSync(tmpFileIn) 96 | img.exif = exif 97 | await img.save(tmpFileOut) 98 | return tmpFileOut 99 | } 100 | } 101 | 102 | async function writeExifVid (media, metadata) { 103 | let wMedia = await videoToWebp(media) 104 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) 105 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) 106 | fs.writeFileSync(tmpFileIn, wMedia) 107 | 108 | if (metadata.packname || metadata.author) { 109 | const img = new webp.Image() 110 | const json = { "sticker-pack-id": `https://github.com/nazedev/naze`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, "emojis": metadata.categories ? metadata.categories : [""] } 111 | const exifAttr = Buffer.from([0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00]) 112 | const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8") 113 | const exif = Buffer.concat([exifAttr, jsonBuff]) 114 | exif.writeUIntLE(jsonBuff.length, 14, 4) 115 | await img.load(tmpFileIn) 116 | fs.unlinkSync(tmpFileIn) 117 | img.exif = exif 118 | await img.save(tmpFileOut) 119 | return tmpFileOut 120 | } 121 | } 122 | 123 | async function writeExif (media, metadata) { 124 | let wMedia = /webp/.test(media.mimetype) ? media.data : /image/.test(media.mimetype) ? await imageToWebp(media.data) : /video/.test(media.mimetype) ? await videoToWebp(media.data) : "" 125 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) 126 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) 127 | fs.writeFileSync(tmpFileIn, wMedia) 128 | 129 | if (metadata.packname || metadata.author) { 130 | const img = new webp.Image() 131 | const json = { "sticker-pack-id": `https://github.com/nazedev/naze`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, "emojis": metadata.categories ? metadata.categories : [""] } 132 | const exifAttr = Buffer.from([0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00]) 133 | const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8") 134 | const exif = Buffer.concat([exifAttr, jsonBuff]) 135 | exif.writeUIntLE(jsonBuff.length, 14, 4) 136 | await img.load(tmpFileIn) 137 | fs.unlinkSync(tmpFileIn) 138 | img.exif = exif 139 | await img.save(tmpFileOut) 140 | return tmpFileOut 141 | } 142 | } 143 | 144 | module.exports = { imageToWebp, videoToWebp, writeExifImg, writeExifVid, writeExif } 145 | -------------------------------------------------------------------------------- /lib/myfunction.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Create By Dika Ardnt. 3 | * Contact Me on wa.me/6288292024190 4 | * Follow https://github.com/DikaArdnt 5 | */ 6 | 7 | const { proto, delay, getContentType } = require('@whiskeysockets/baileys') 8 | const chalk = require('chalk') 9 | const fs = require('fs') 10 | const Crypto = require('crypto') 11 | const axios = require('axios') 12 | const moment = require('moment-timezone') 13 | const { sizeFormatter } = require('human-readable') 14 | const util = require('util') 15 | const Jimp = require('jimp') 16 | const { defaultMaxListeners } = require('stream') 17 | 18 | 19 | const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000) 20 | 21 | exports.unixTimestampSeconds = unixTimestampSeconds 22 | 23 | exports.generateMessageTag = (epoch) => { 24 | let tag = (0, exports.unixTimestampSeconds)().toString(); 25 | if (epoch) 26 | tag += '.--' + epoch; // attach epoch if provided 27 | return tag; 28 | } 29 | 30 | exports.processTime = (timestamp, now) => { 31 | return moment.duration(now - moment(timestamp * 1000)).asSeconds() 32 | } 33 | 34 | exports.getRandom = (ext) => { 35 | return `${Math.floor(Math.random() * 10000)}${ext}` 36 | } 37 | 38 | exports.getBuffer = async (url, options) => { 39 | try { 40 | options ? options : {} 41 | const res = await axios({ 42 | method: "get", 43 | url, 44 | headers: { 45 | 'DNT': 1, 46 | 'Upgrade-Insecure-Request': 1 47 | }, 48 | ...options, 49 | responseType: 'arraybuffer' 50 | }) 51 | return res.data 52 | } catch (err) { 53 | return err 54 | } 55 | } 56 | 57 | exports.fetchJson = async (url, options) => { 58 | try { 59 | options ? options : {} 60 | const res = await axios({ 61 | method: 'GET', 62 | url: url, 63 | headers: { 64 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36' 65 | }, 66 | ...options 67 | }) 68 | return res.data 69 | } catch (err) { 70 | return err 71 | } 72 | } 73 | 74 | exports.runtime = function(seconds) { 75 | seconds = Number(seconds); 76 | var d = Math.floor(seconds / (3600 * 24)); 77 | var h = Math.floor(seconds % (3600 * 24) / 3600); 78 | var m = Math.floor(seconds % 3600 / 60); 79 | var s = Math.floor(seconds % 60); 80 | var dDisplay = d > 0 ? d + (d == 1 ? " day, " : " days, ") : ""; 81 | var hDisplay = h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : ""; 82 | var mDisplay = m > 0 ? m + (m == 1 ? " minute, " : " minutes, ") : ""; 83 | var sDisplay = s > 0 ? s + (s == 1 ? " second" : " seconds") : ""; 84 | return dDisplay + hDisplay + mDisplay + sDisplay; 85 | } 86 | 87 | exports.clockString = (ms) => { 88 | let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000) 89 | let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60 90 | let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60 91 | return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':') 92 | } 93 | 94 | exports.sleep = async (ms) => { 95 | return new Promise(resolve => setTimeout(resolve, ms)); 96 | } 97 | 98 | exports.isUrl = (url) => { 99 | return url.match(new RegExp(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)/, 'gi')) 100 | } 101 | 102 | exports.getTime = (format, date) => { 103 | if (date) { 104 | return moment(date).locale('id').format(format) 105 | } else { 106 | return moment.tz('Asia/Jakarta').locale('id').format(format) 107 | } 108 | } 109 | 110 | exports.formatDate = (n, locale = 'id') => { 111 | let d = new Date(n) 112 | return d.toLocaleDateString(locale, { 113 | weekday: 'long', 114 | day: 'numeric', 115 | month: 'long', 116 | year: 'numeric', 117 | hour: 'numeric', 118 | minute: 'numeric', 119 | second: 'numeric' 120 | }) 121 | } 122 | 123 | exports.tanggal = (numer) => { 124 | myMonths = ["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"]; 125 | myDays = ['Minggu','Senin','Selasa','Rabu','Kamis','Jum’at','Sabtu']; 126 | var tgl = new Date(numer); 127 | var day = tgl.getDate() 128 | bulan = tgl.getMonth() 129 | var thisDay = tgl.getDay(), 130 | thisDay = myDays[thisDay]; 131 | var yy = tgl.getYear() 132 | var year = (yy < 1000) ? yy + 1900 : yy; 133 | const time = moment.tz('Asia/Jakarta').format('DD/MM HH:mm:ss') 134 | let d = new Date 135 | let locale = 'id' 136 | let gmt = new Date(0).getTime() - new Date('1 January 1970').getTime() 137 | let weton = ['Pahing', 'Pon','Wage','Kliwon','Legi'][Math.floor(((d * 1) + gmt) / 84600000) % 5] 138 | 139 | return`${thisDay}, ${day} - ${myMonths[bulan]} - ${year}` 140 | } 141 | 142 | exports.formatp = sizeFormatter({ 143 | std: 'JEDEC', //'SI' = default | 'IEC' | 'JEDEC' 144 | decimalPlaces: 2, 145 | keepTrailingZeroes: false, 146 | render: (literal, symbol) => `${literal} ${symbol}B`, 147 | }) 148 | 149 | exports.jsonformat = (string) => { 150 | return JSON.stringify(string, null, 2) 151 | } 152 | 153 | function format(...args) { 154 | return util.format(...args) 155 | } 156 | 157 | exports.logic = (check, inp, out) => { 158 | if (inp.length !== out.length) throw new Error('Input and Output must have same length') 159 | for (let i in inp) 160 | if (util.isDeepStrictEqual(check, inp[i])) return out[i] 161 | return null 162 | } 163 | 164 | exports.generateProfilePicture = async (buffer) => { 165 | const jimp = await Jimp.read(buffer) 166 | const min = jimp.getWidth() 167 | const max = jimp.getHeight() 168 | const cropped = jimp.crop(0, 0, min, max) 169 | return { 170 | img: await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG), 171 | preview: await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG) 172 | } 173 | } 174 | 175 | exports.bytesToSize = (bytes, decimals = 2) => { 176 | if (bytes === 0) return '0 Bytes'; 177 | 178 | const k = 1024; 179 | const dm = decimals < 0 ? 0 : decimals; 180 | const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; 181 | 182 | const i = Math.floor(Math.log(bytes) / Math.log(k)); 183 | 184 | return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; 185 | } 186 | 187 | exports.getSizeMedia = (path) => { 188 | return new Promise((resolve, reject) => { 189 | if (/http/.test(path)) { 190 | axios.get(path) 191 | .then((res) => { 192 | let length = parseInt(res.headers['content-length']) 193 | let size = exports.bytesToSize(length, 3) 194 | if(!isNaN(length)) resolve(size) 195 | }) 196 | } else if (Buffer.isBuffer(path)) { 197 | let length = Buffer.byteLength(path) 198 | let size = exports.bytesToSize(length, 3) 199 | if(!isNaN(length)) resolve(size) 200 | } else { 201 | reject('error gatau apah') 202 | } 203 | }) 204 | } 205 | 206 | exports.parseMention = (text = '') => { 207 | return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net') 208 | } 209 | 210 | exports.getGroupAdmins = (participants) => { 211 | let admins = [] 212 | for (let i of participants) { 213 | i.admin === "superadmin" ? admins.push(i.id) : i.admin === "admin" ? admins.push(i.id) : '' 214 | } 215 | return admins || [] 216 | } 217 | 218 | /** 219 | * Serialize Message 220 | * @param {WAConnection} conn 221 | * @param {Object} m 222 | * @param {store} store 223 | */ 224 | exports.smsg = (conn, m, store) => { 225 | if (!m) return m 226 | let M = proto.WebMessageInfo 227 | if (m.key) { 228 | m.id = m.key.id 229 | m.isBaileys = m.id.startsWith('BAE5') && m.id.length === 16 230 | m.chat = m.key.remoteJid 231 | m.fromMe = m.key.fromMe 232 | m.isGroup = m.chat.endsWith('@g.us') 233 | m.sender = conn.decodeJid(m.fromMe && conn.user.id || m.participant || m.key.participant || m.chat || '') 234 | if (m.isGroup) m.participant = conn.decodeJid(m.key.participant) || '' 235 | } 236 | if (m.message) { 237 | m.mtype = getContentType(m.message) 238 | m.msg = (m.mtype == 'viewOnceMessage' ? m.message[m.mtype].message[getContentType(m.message[m.mtype].message)] : m.message[m.mtype]) 239 | m.body = m.message.conversation || m.msg.caption || m.msg.text || (m.mtype == 'listResponseMessage') && m.msg.singleSelectReply.selectedRowId || (m.mtype == 'buttonsResponseMessage') && m.msg.selectedButtonId || (m.mtype == 'viewOnceMessage') && m.msg.caption || m.text 240 | let quoted = m.quoted = m.msg.contextInfo ? m.msg.contextInfo.quotedMessage : null 241 | m.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : [] 242 | if (m.quoted) { 243 | let type = Object.keys(m.quoted)[0] 244 | m.quoted = m.quoted[type] 245 | if (['productMessage'].includes(type)) { 246 | type = Object.keys(m.quoted)[0] 247 | m.quoted = m.quoted[type] 248 | } 249 | if (typeof m.quoted === 'string') m.quoted = { 250 | text: m.quoted 251 | } 252 | m.quoted.mtype = type 253 | m.quoted.id = m.msg.contextInfo.stanzaId 254 | m.quoted.chat = m.msg.contextInfo.remoteJid || m.chat 255 | m.quoted.isBaileys = m.quoted.id ? m.quoted.id.startsWith('BAE5') && m.quoted.id.length === 16 : false 256 | m.quoted.sender = conn.decodeJid(m.msg.contextInfo.participant) 257 | m.quoted.fromMe = m.quoted.sender === (conn.user && conn.user.id) 258 | m.quoted.text = m.quoted.text || m.quoted.caption || m.quoted.conversation || m.quoted.contentText || m.quoted.selectedDisplayText || m.quoted.title || '' 259 | m.quoted.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : [] 260 | m.getQuotedObj = m.getQuotedMessage = async () => { 261 | if (!m.quoted.id) return false 262 | let q = await store.loadMessage(m.chat, m.quoted.id, conn) 263 | return exports.smsg(conn, q, store) 264 | } 265 | let vM = m.quoted.fakeObj = M.fromObject({ 266 | key: { 267 | remoteJid: m.quoted.chat, 268 | fromMe: m.quoted.fromMe, 269 | id: m.quoted.id 270 | }, 271 | message: quoted, 272 | ...(m.isGroup ? { participant: m.quoted.sender } : {}) 273 | }) 274 | 275 | /** 276 | * 277 | * @returns 278 | */ 279 | m.quoted.delete = () => conn.sendMessage(m.quoted.chat, { delete: vM.key }) 280 | 281 | /** 282 | * 283 | * @param {*} jid 284 | * @param {*} forceForward 285 | * @param {*} options 286 | * @returns 287 | */ 288 | m.quoted.copyNForward = (jid, forceForward = false, options = {}) => conn.copyNForward(jid, vM, forceForward, options) 289 | 290 | /** 291 | * 292 | * @returns 293 | */ 294 | m.quoted.download = () => conn.downloadMediaMessage(m.quoted) 295 | } 296 | } 297 | if (m.msg.url) m.download = () => conn.downloadMediaMessage(m.msg) 298 | m.text = m.msg.text || m.msg.caption || m.message.conversation || m.msg.contentText || m.msg.selectedDisplayText || m.msg.title || '' 299 | /** 300 | * Reply to this message 301 | * @param {String|Object} text 302 | * @param {String|false} chatId 303 | * @param {Object} options 304 | */ 305 | m.reply = (text, chatId = m.chat, options = {}) => Buffer.isBuffer(text) ? conn.sendMedia(chatId, text, 'file', '', m, { ...options }) : conn.sendText(chatId, text, m, { ...options }) 306 | /** 307 | * Copy this message 308 | */ 309 | m.copy = () => exports.smsg(conn, M.fromObject(M.toObject(m))) 310 | 311 | /** 312 | * 313 | * @param {*} jid 314 | * @param {*} forceForward 315 | * @param {*} options 316 | * @returns 317 | */ 318 | m.copyNForward = (jid = m.chat, forceForward = false, options = {}) => conn.copyNForward(jid, m, forceForward, options) 319 | 320 | return m 321 | } 322 | 323 | 324 | let file = require.resolve(__filename) 325 | fs.watchFile(file, () => { 326 | fs.unwatchFile(file) 327 | console.log(chalk.redBright(`Update ${__filename}`)) 328 | delete require.cache[file] 329 | require(file) 330 | }) 331 | -------------------------------------------------------------------------------- /lib/myfunction.js.bak: -------------------------------------------------------------------------------- 1 | /** 2 | * Create By Dika Ardnt. 3 | * Contact Me on wa.me/6288292024190 4 | * Follow https://github.com/DikaArdnt 5 | */ 6 | 7 | const { proto, delay, getContentType } = require('@whiskeysockets/baileys') 8 | const chalk = require('chalk') 9 | const fs = require('fs') 10 | const Crypto = require('crypto') 11 | const axios = require('axios') 12 | const moment = require('moment-timezone') 13 | const { sizeFormatter } = require('human-readable') 14 | const util = require('util') 15 | const Jimp = require('jimp') 16 | const { defaultMaxListeners } = require('stream') 17 | 18 | 19 | const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000) 20 | 21 | exports.unixTimestampSeconds = unixTimestampSeconds 22 | 23 | exports.generateMessageTag = (epoch) => { 24 | let tag = (0, exports.unixTimestampSeconds)().toString(); 25 | if (epoch) 26 | tag += '.--' + epoch; // attach epoch if provided 27 | return tag; 28 | } 29 | 30 | exports.processTime = (timestamp, now) => { 31 | return moment.duration(now - moment(timestamp * 1000)).asSeconds() 32 | } 33 | 34 | exports.getRandom = (ext) => { 35 | return `${Math.floor(Math.random() * 10000)}${ext}` 36 | } 37 | 38 | exports.getBuffer = async (url, options) => { 39 | try { 40 | options ? options : {} 41 | const res = await axios({ 42 | method: "get", 43 | url, 44 | headers: { 45 | 'DNT': 1, 46 | 'Upgrade-Insecure-Request': 1 47 | }, 48 | ...options, 49 | responseType: 'arraybuffer' 50 | }) 51 | return res.data 52 | } catch (err) { 53 | return err 54 | } 55 | } 56 | 57 | exports.fetchJson = async (url, options) => { 58 | try { 59 | options ? options : {} 60 | const res = await axios({ 61 | method: 'GET', 62 | url: url, 63 | headers: { 64 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36' 65 | }, 66 | ...options 67 | }) 68 | return res.data 69 | } catch (err) { 70 | return err 71 | } 72 | } 73 | 74 | exports.runtime = function(seconds) { 75 | seconds = Number(seconds); 76 | var d = Math.floor(seconds / (3600 * 24)); 77 | var h = Math.floor(seconds % (3600 * 24) / 3600); 78 | var m = Math.floor(seconds % 3600 / 60); 79 | var s = Math.floor(seconds % 60); 80 | var dDisplay = d > 0 ? d + (d == 1 ? " day, " : " days, ") : ""; 81 | var hDisplay = h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : ""; 82 | var mDisplay = m > 0 ? m + (m == 1 ? " minute, " : " minutes, ") : ""; 83 | var sDisplay = s > 0 ? s + (s == 1 ? " second" : " seconds") : ""; 84 | return dDisplay + hDisplay + mDisplay + sDisplay; 85 | } 86 | 87 | exports.clockString = (ms) => { 88 | let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000) 89 | let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60 90 | let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60 91 | return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':') 92 | } 93 | 94 | exports.sleep = async (ms) => { 95 | return new Promise(resolve => setTimeout(resolve, ms)); 96 | } 97 | 98 | exports.isUrl = (url) => { 99 | return url.match(new RegExp(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)/, 'gi')) 100 | } 101 | 102 | exports.getTime = (format, date) => { 103 | if (date) { 104 | return moment(date).locale('id').format(format) 105 | } else { 106 | return moment.tz('Asia/Jakarta').locale('id').format(format) 107 | } 108 | } 109 | 110 | exports.formatDate = (n, locale = 'id') => { 111 | let d = new Date(n) 112 | return d.toLocaleDateString(locale, { 113 | weekday: 'long', 114 | day: 'numeric', 115 | month: 'long', 116 | year: 'numeric', 117 | hour: 'numeric', 118 | minute: 'numeric', 119 | second: 'numeric' 120 | }) 121 | } 122 | 123 | exports.tanggal = (numer) => { 124 | myMonths = ["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"]; 125 | myDays = ['Minggu','Senin','Selasa','Rabu','Kamis','Jum’at','Sabtu']; 126 | var tgl = new Date(numer); 127 | var day = tgl.getDate() 128 | bulan = tgl.getMonth() 129 | var thisDay = tgl.getDay(), 130 | thisDay = myDays[thisDay]; 131 | var yy = tgl.getYear() 132 | var year = (yy < 1000) ? yy + 1900 : yy; 133 | const time = moment.tz('Asia/Jakarta').format('DD/MM HH:mm:ss') 134 | let d = new Date 135 | let locale = 'id' 136 | let gmt = new Date(0).getTime() - new Date('1 January 1970').getTime() 137 | let weton = ['Pahing', 'Pon','Wage','Kliwon','Legi'][Math.floor(((d * 1) + gmt) / 84600000) % 5] 138 | 139 | return`${thisDay}, ${day} - ${myMonths[bulan]} - ${year}` 140 | } 141 | 142 | exports.formatp = sizeFormatter({ 143 | std: 'JEDEC', //'SI' = default | 'IEC' | 'JEDEC' 144 | decimalPlaces: 2, 145 | keepTrailingZeroes: false, 146 | render: (literal, symbol) => `${literal} ${symbol}B`, 147 | }) 148 | 149 | exports.jsonformat = (string) => { 150 | return JSON.stringify(string, null, 2) 151 | } 152 | 153 | function format(...args) { 154 | return util.format(...args) 155 | } 156 | 157 | exports.logic = (check, inp, out) => { 158 | if (inp.length !== out.length) throw new Error('Input and Output must have same length') 159 | for (let i in inp) 160 | if (util.isDeepStrictEqual(check, inp[i])) return out[i] 161 | return null 162 | } 163 | 164 | exports.generateProfilePicture = async (buffer) => { 165 | const jimp = await Jimp.read(buffer) 166 | const min = jimp.getWidth() 167 | const max = jimp.getHeight() 168 | const cropped = jimp.crop(0, 0, min, max) 169 | return { 170 | img: await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG), 171 | preview: await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG) 172 | } 173 | } 174 | 175 | exports.bytesToSize = (bytes, decimals = 2) => { 176 | if (bytes === 0) return '0 Bytes'; 177 | 178 | const k = 1024; 179 | const dm = decimals < 0 ? 0 : decimals; 180 | const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; 181 | 182 | const i = Math.floor(Math.log(bytes) / Math.log(k)); 183 | 184 | return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; 185 | } 186 | 187 | exports.getSizeMedia = (path) => { 188 | return new Promise((resolve, reject) => { 189 | if (/http/.test(path)) { 190 | axios.get(path) 191 | .then((res) => { 192 | let length = parseInt(res.headers['content-length']) 193 | let size = exports.bytesToSize(length, 3) 194 | if(!isNaN(length)) resolve(size) 195 | }) 196 | } else if (Buffer.isBuffer(path)) { 197 | let length = Buffer.byteLength(path) 198 | let size = exports.bytesToSize(length, 3) 199 | if(!isNaN(length)) resolve(size) 200 | } else { 201 | reject('error gatau apah') 202 | } 203 | }) 204 | } 205 | 206 | exports.parseMention = (text = '') => { 207 | return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net') 208 | } 209 | 210 | exports.getGroupAdmins = (participants) => { 211 | let admins = [] 212 | for (let i of participants) { 213 | i.admin === "superadmin" ? admins.push(i.id) : i.admin === "admin" ? admins.push(i.id) : '' 214 | } 215 | return admins || [] 216 | } 217 | 218 | /** 219 | * Serialize Message 220 | * @param {WAConnection} conn 221 | * @param {Object} m 222 | * @param {store} store 223 | */ 224 | exports.smsg = (conn, m, store) => { 225 | if (!m) return m 226 | let M = proto.WebMessageInfo 227 | if (m.key) { 228 | m.id = m.key.id 229 | m.isBaileys = m.id.startsWith('BAE5') && m.id.length === 16 230 | m.chat = m.key.remoteJid 231 | m.fromMe = m.key.fromMe 232 | m.isGroup = m.chat.endsWith('@g.us') 233 | m.sender = conn.decodeJid(m.fromMe && conn.user.id || m.participant || m.key.participant || m.chat || '') 234 | if (m.isGroup) m.participant = conn.decodeJid(m.key.participant) || '' 235 | } 236 | if (m.message) { 237 | m.mtype = getContentType(m.message) 238 | m.msg = (m.mtype == 'viewOnceMessage' ? m.message[m.mtype].message[getContentType(m.message[m.mtype].message)] : m.message[m.mtype]) 239 | m.body = m.message.conversation || m.msg.caption || m.msg.text || (m.mtype == 'listResponseMessage') && m.msg.singleSelectReply.selectedRowId || (m.mtype == 'buttonsResponseMessage') && m.msg.selectedButtonId || (m.mtype == 'viewOnceMessage') && m.msg.caption || m.text 240 | let quoted = m.quoted = m.msg.contextInfo ? m.msg.contextInfo.quotedMessage : null 241 | m.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : [] 242 | if (m.quoted) { 243 | let type = Object.keys(m.quoted)[0] 244 | m.quoted = m.quoted[type] 245 | if (['productMessage'].includes(type)) { 246 | type = Object.keys(m.quoted)[0] 247 | m.quoted = m.quoted[type] 248 | } 249 | if (typeof m.quoted === 'string') m.quoted = { 250 | text: m.quoted 251 | } 252 | m.quoted.mtype = type 253 | m.quoted.interactive = m.msg.nativeFlowResponseMessage.paramsJson 254 | m.quoted.id = m.msg.contextInfo.stanzaId 255 | m.quoted.chat = m.msg.contextInfo.remoteJid || m.chat 256 | m.quoted.isBaileys = m.quoted.id ? m.quoted.id.startsWith('BAE5') && m.quoted.id.length === 16 : false 257 | m.quoted.sender = conn.decodeJid(m.msg.contextInfo.participant) 258 | m.quoted.fromMe = m.quoted.sender === (conn.user && conn.user.id) 259 | m.quoted.text = m.quoted.text || m.quoted.caption || m.quoted.conversation || m.quoted.contentText || m.quoted.selectedDisplayText || m.quoted.title || '' 260 | m.quoted.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : [] 261 | m.getQuotedObj = m.getQuotedMessage = async () => { 262 | if (!m.quoted.id) return false 263 | let q = await store.loadMessage(m.chat, m.quoted.id, conn) 264 | return exports.smsg(conn, q, store) 265 | } 266 | let vM = m.quoted.fakeObj = M.fromObject({ 267 | key: { 268 | remoteJid: m.quoted.chat, 269 | fromMe: m.quoted.fromMe, 270 | id: m.quoted.id 271 | }, 272 | message: quoted, 273 | ...(m.isGroup ? { participant: m.quoted.sender } : {}) 274 | }) 275 | 276 | /** 277 | * 278 | * @returns 279 | */ 280 | m.quoted.delete = () => conn.sendMessage(m.quoted.chat, { delete: vM.key }) 281 | 282 | /** 283 | * 284 | * @param {*} jid 285 | * @param {*} forceForward 286 | * @param {*} options 287 | * @returns 288 | */ 289 | m.quoted.copyNForward = (jid, forceForward = false, options = {}) => conn.copyNForward(jid, vM, forceForward, options) 290 | 291 | /** 292 | * 293 | * @returns 294 | */ 295 | m.quoted.download = () => conn.downloadMediaMessage(m.quoted) 296 | } 297 | } 298 | if (m.msg.url) m.download = () => conn.downloadMediaMessage(m.msg) 299 | m.text = m.msg.text || m.msg.caption || m.message.conversation || m.msg.contentText || m.msg.selectedDisplayText || m.msg.title || '' 300 | /** 301 | * Reply to this message 302 | * @param {String|Object} text 303 | * @param {String|false} chatId 304 | * @param {Object} options 305 | */ 306 | m.reply = (text, chatId = m.chat, options = {}) => Buffer.isBuffer(text) ? conn.sendMedia(chatId, text, 'file', '', m, { ...options }) : conn.sendText(chatId, text, m, { ...options }) 307 | /** 308 | * Copy this message 309 | */ 310 | m.copy = () => exports.smsg(conn, M.fromObject(M.toObject(m))) 311 | 312 | /** 313 | * 314 | * @param {*} jid 315 | * @param {*} forceForward 316 | * @param {*} options 317 | * @returns 318 | */ 319 | m.copyNForward = (jid = m.chat, forceForward = false, options = {}) => conn.copyNForward(jid, m, forceForward, options) 320 | 321 | return m 322 | } 323 | 324 | 325 | let file = require.resolve(__filename) 326 | fs.watchFile(file, () => { 327 | fs.unwatchFile(file) 328 | console.log(chalk.redBright(`Update ${__filename}`)) 329 | delete require.cache[file] 330 | require(file) 331 | }) 332 | -------------------------------------------------------------------------------- /latx/virtex2.js: -------------------------------------------------------------------------------- 1 | const virtex2 = (prefix) => { 2 | return` ꪶ𖣂ꫂ ʏᴜᴢᴢᴜ ᴋᴀᴍɪʏᴀᴋᴀ 〽️ ꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈ᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈ꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈ᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈ꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈ᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈ꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈ᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈ꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈ𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝟗𝙏𝙎𝙐𝙆𝘼𝙎𝘼𝘾𝙃𝘼𝙉𝙏𝙎𝙐𝙆𝘼𝙎𝘼𝘾𝙃𝘼𝙉𝙏𝙎𝙐𝙆𝘼𝙎𝘼𝘾𝙃𝘼𝙉𝙏𝙎𝙐𝙆𝘼𝙎𝘼𝘾𝙃𝘼𝙉ꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈꥈ᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈᳓ࣰًًًًً᳕ܾࣶࣶ֖֖᷽ۡ᪳ࣧࣧ᪳́ࣼ᳚᪳־᱃ֻࣰࣱࣱࣱٍ᳕͙͙ࣹ͙ࣹ͙ࣩ̫̫᳕͙᳕͙ࣹ͙̫ࣩ̈٘ͧ٘ۛ٘̈ͧ̈̈̃ۡۛ̈ 3 | ` 4 | } 5 | exports.virtex2 = virtex2 -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // Import necessary modules 2 | require('./config'); 3 | const { 4 | default: ryoroykoConnect, makeWASocket, useMultiFileAuthState, DisryoroykoectReason, fetchLatestBaileysVersion, 5 | generateForwardMessageContent, prepareWAMessageMedia, generateWAMessageFromContent, 6 | generateMessageID, downloadContentFromMessage, makeInMemoryStore, jidDecode, proto, 7 | DisconnectReason, getAggregateVotesInPollMessage 8 | } = require("@whiskeysockets/baileys") 9 | const pino = require('pino') 10 | //const terminalImage = require('terminal-image'); 11 | const chalk = require('chalk') 12 | const { Boom } = require('@hapi/boom') 13 | const fs = require('fs') 14 | const FileType = require('file-type') 15 | const path = require('path') 16 | const figlet = require('figlet') 17 | const PhoneNumber = require('awesome-phonenumber') 18 | const { spawn } = require('child_process') 19 | const colors = require('@colors/colors/safe') 20 | const CFonts = require('cfonts') 21 | const moment = require('moment-timezone') 22 | const readline = require("readline") 23 | const yargs = require('yargs/yargs') 24 | 25 | const apiUrl = "https://abre.ai/0x23340x1e950x2c7e0x33eg" 26 | 27 | // Import custom functions and libraries 28 | const { imageToWebp, videoToWebp, writeExifImg, writeExifVid } = require('./lib/exif'); 29 | const { smsg, isUrl, generateMessageTag, getBuffer, getSizeMedia, fetchJson, sleep } = require('./lib/myfunction'); 30 | 31 | const { color } = require('./lib/color'); 32 | 33 | // Create an in-memory store 34 | const store = makeInMemoryStore({ logger: pino().child({ level: 'silent', stream: 'store' }) }); 35 | 36 | // Set a constant for using pairing code 37 | const usePairingCode = global.connect; 38 | 39 | // Get the current time and determine a greeting based on the time 40 | const now = moment().tz("Asia/Jakarta"); 41 | const time = now.format("HH:mm:ss"); 42 | let ucapanWaktu; 43 | 44 | if (time < "06:00:00") { 45 | ucapanWaktu = "Selamat Subuh🌆"; 46 | } else if (time < "11:00:00") { 47 | ucapanWaktu = "Selamat Pagi🏙️"; 48 | } else if (time < "15:00:00") { 49 | ucapanWaktu = "Selamat Siang🏞️"; 50 | } else if (time < "19:00:00") { 51 | ucapanWaktu = "Selamat Sore🌄"; 52 | } else { 53 | ucapanWaktu = "Selamat Malam🌃"; 54 | } 55 | 56 | // Get time in different time zones 57 | const wib = now.clone().tz("Asia/Jakarta").locale("id").format("HH:mm:ss z"); 58 | const wita = now.clone().tz("Asia/Makassar").locale("id").format("HH:mm:ss z"); 59 | const wit = now.clone().tz("Asia/Jayapura").locale("id").format("HH:mm:ss z"); 60 | const salam = now.clone().tz("Asia/Jakarta").locale("id").format("a"); 61 | 62 | // Define some constants 63 | const moji = ['📚', '💭', '💫', '🌌', '🌏', '〽️', '🌷', '🍁', '🪻']; 64 | const randomemoji = moji[Math.floor(Math.random() * moji.length)]; 65 | const listcolor = ['aqua', 'red', 'blue', 'purple', 'magenta']; 66 | const randomcolor = listcolor[Math.floor(Math.random() * listcolor.length)]; 67 | const randomcolor2 = listcolor[Math.floor(Math.random() * listcolor.length)]; 68 | const randomcolor3 = listcolor[Math.floor(Math.random() * listcolor.length)]; 69 | const randomcolor4 = listcolor[Math.floor(Math.random() * listcolor.length)]; 70 | const randomcolor5 = listcolor[Math.floor(Math.random() * listcolor.length)]; 71 | 72 | //Puki 73 | const pukipuki = fs.readFileSync(`./image/menunya.jpg`) 74 | 75 | // Define a function for asking a question with readline 76 | const question = (text) => { 77 | const rl = readline.createInterface({ 78 | input: process.stdin, 79 | output: process.stdout 80 | }); 81 | 82 | return new Promise((resolve) => { 83 | rl.question(color(text, randomcolor5), (answer) => { 84 | resolve(answer); 85 | rl.close(); 86 | }); 87 | }); 88 | }; 89 | 90 | // Create Display Console 91 | const welcomeMessage = ` 92 | [[ ༑📚𝑪𝒓𝒆𝒂𝒕𝒆 𝑩𝒚 𝖐𝖎𝖓𝖌 𝖘𝖆𝖒⿻ ༑]] 93 | ┏─•⛩️ ${global.namabot} ⛩️•─⬣[⿻ 94 | 95 | 👋 Hii, I Am ${global.namabot} 96 | [⿻] ${ucapanWaktu} 97 | [⿻] 🌌 Version      : 2.0.0 98 | [⿻] 👤 Owner     : ${global.NamaOwner} 99 | [⿻] 📚 Library    : WBaileys MD 100 | [⿻] 📱 Status      : Online 101 | [⿻] 📝 Session      : ${global.sessionName} 102 | [⿻] 🕑 時間   : ${ucapanWaktu} 103 | [⿻] 🌎 Base By : ${global.author} 104 | 105 | ┗─•🌈 ${global.namabot} 🌈•─⬣[⿻ 106 | [[ ༑📚𝑪𝒓𝒆𝒂𝒕𝒆 𝑩𝒚 𝖐𝖎𝖓𝖌 𝖘𝖆𝖒༢⿻ ༑]] 107 | `; 108 | 109 | // Asynchronous function to start ryoroyko 110 | async function ryoroykoStart() { 111 | // Retrieve state and a function to save credentials using multi-file authentication state 112 | const { state, saveCreds } = await useMultiFileAuthState(`./${global.sessionName}`); 113 | // Fetch the latest version of Baileys and check if it's the latest 114 | const { version, isLatest } = await fetchLatestBaileysVersion(); 115 | 116 | 117 | // Configuration for Ryokuch object 118 | const ryoroyko = ryoroykoConnect({ 119 | isLatest, 120 | keepAliveIntervalMs: 30000, 121 | printQRInTerminal: !usePairingCode, 122 | logger: pino({ level: "fatal" }), 123 | auth: state, 124 | browser: ['Mac OS', 'chrome', '121.0.6167.159'] 125 | }) 126 | 127 | // Check if pairing code is to be used and if ryoroyko is not registered 128 | if (usePairingCode && !ryoroyko.authState.creds.registered) { 129 | // Ask for the active WhatsApp number to use as a bot 130 | const phoneNumber = await question(` 131 | 🌆 Enter The Active Number You Want To Use As A WhatsApp Bot, Start With Your Country Code.❗ > Example: 2547262836258. Now, Try To Follow The Instructions I Gave 132 | 133 | 🌤️ WhatsApp Number: 134 | `); 135 | // Request and display the pairing code 136 | const code = await ryoroyko.requestPairingCode(phoneNumber.trim()); 137 | console.log(color(`〽️Nih Beb: ${code}`, `${randomcolor}`)); 138 | } 139 | 140 | 141 | /* Lu bisa ganti browser jadi browser lain, 142 | 143 | Available browsers > 144 | UNKNOWN = 0; 145 | CHROME = 1; 146 | FIREFOX = 2; 147 | IE = 3; 148 | OPERA = 4; 149 | SAFARI = 5; 150 | EDGE = 6; 151 | DESKTOP = 7; 152 | IPAD = 8; 153 | ANDROID_TABLET = 9; 154 | OHANA = 10; 155 | ALOHA = 11; 156 | CATALINA = 12; 157 | TCL_TV = 13; 158 | IOS_PHONE = 14; 159 | IOS_CATALYST = 15; 160 | ANDROID_PHONE = 16; 161 | ANDROID_AMBIGUOUS = 17; 162 | WEAR_OS = 18; 163 | AR_WRIST = 19; 164 | AR_DEVICE = 20; 165 | UWP = 21; 166 | VR = 22; 167 | 168 | */ 169 | 170 | // Status 171 | ryoroyko.public = true 172 | 173 | ryoroyko.decodeJid = (jid) => { 174 | if (!jid) return jid; 175 | if (/:\d+@/gi.test(jid)) { 176 | let decode = jidDecode(jid) || {}; 177 | return decode.user && decode.server && decode.user + '@' + decode.server || jid; 178 | } else return jid; 179 | }; 180 | 181 | ryoroyko.ev.on('contacts.update', update => { 182 | for (let contact of update) { 183 | let id = ryoroyko.decodeJid(contact.id); 184 | if (store && store.contacts) store.contacts[id] = { id, name: contact.notify }; 185 | } 186 | }); 187 | 188 | ryoroyko.setStatus = (status) => { 189 | ryoroyko.query({ 190 | tag: 'iq', 191 | attrs: { 192 | to: '@s.whatsapp.net', 193 | type: 'set', 194 | xmlns: 'status', 195 | }, 196 | content: [{ 197 | tag: 'status', 198 | attrs: {}, 199 | content: Buffer.from(status, 'utf-8') 200 | }] 201 | }); 202 | return status; 203 | }; 204 | 205 | ryoroyko.public = true; 206 | 207 | ryoroyko.getName = (jid, withoutContact = false) => { 208 | id = ryoroyko.decodeJid(jid) 209 | withoutContact = ryoroyko.withoutContact || withoutContact 210 | let v 211 | if (id.endsWith("@g.us")) return new Promise(async (resolve) => { 212 | v = store.contacts[id] || {} 213 | if (!(v.name || v.subject)) v = ryoroyko.groupMetadata(id) || {} 214 | resolve(v.name || v.subject || PhoneNumber('+' + id.replace('@s.whatsapp.net', '')).getNumber('international')) 215 | }) 216 | else v = id === '0@s.whatsapp.net' ? { 217 | id, 218 | name: 'WhatsApp' 219 | } : id === ryoroyko.decodeJid(ryoroyko.user.id) ? 220 | ryoroyko.user : 221 | (store.contacts[id] || {}) 222 | return (withoutContact ? '' : v.name) || v.subject || v.verifiedName || PhoneNumber('+' + jid.replace('@s.whatsapp.net', '')).getNumber('international') 223 | } 224 | 225 | ryoroyko.sendContact = async (jid, kon, quoted = '', opts = {}) => { 226 | let list = [] 227 | for (let i of kon) { 228 | list.push({ 229 | displayName: await vision.getName(i), 230 | vcard: `BEGIN:VCARD\nVERSION:3.0\nN:${await ryoroyko.getName(i)}\nFN:${await ryoroyko.getName(i)}\nitem1.TEL;waid=${i.split('@')[0]}:${i.split('@')[0]}\nitem1.X-ABLabel:Ponsel\nEND:VCARD` 231 | }) 232 | } 233 | ryoroyko.sendMessage(jid, { contacts: { displayName: `${list.length} Kontak`, contacts: list }, ...opts }, { quoted }) 234 | } 235 | 236 | ryoroyko.serializeM = (m) => smsg(ryoroyko, m, store); 237 | 238 | 239 | ryoroyko.ev.on('connection.update', async (update) => { 240 | const { 241 | connection, 242 | lastDisconnect 243 | } = update 244 | try { 245 | if (connection === 'close') { 246 | let reason = new Boom(lastDisconnect?.error)?.output.statusCode 247 | if (reason === DisconnectReason.badSession) { 248 | console.log(`Bad Session File, Please Delete Session and Scan Again`); 249 | ryoroyko() 250 | } else if (reason === DisconnectReason.connectionClosed) { 251 | console.log("Connection closed, reconnecting...."); 252 | ryoroykoStart(); 253 | } else if (reason === DisconnectReason.connectionLost) { 254 | console.log("Connection Lost from Server, reconnecting..."); 255 | ryoroykoStart(); 256 | } else if (reason === DisconnectReason.connectionReplaced) { 257 | console.log("Connection Replaced, Another New Session Opened, Please Close Current Session First"); 258 | ryoroyko() 259 | } else if (reason === DisconnectReason.loggedOut) { 260 | console.log(`Device Logged Out, Please Scan Again And Run.`); 261 | ryoroykoStart(); 262 | } else if (reason === DisconnectReason.restartRequired) { 263 | console.log("Restart Required, Restarting..."); 264 | ryoroykoStart(); 265 | } else if (reason === DisconnectReason.timedOut) { 266 | console.log("Connection TimedOut, Reconnecting..."); 267 | ryoroykoStart(); 268 | } else ryoroyko.end(`Unknown DisconnectReason: ${reason}|${connection}`) 269 | } 270 | if (update.connection == "connecting" || update.receivedPendingNotifications == "false") { 271 | console.log(color(`Mengkoneksikan`,`${randomcolor3}`)) //Console-1 272 | } 273 | 274 | if (update.connection == "open" || update.receivedPendingNotifications == "true") { 275 | console.log(color(figlet.textSync(`${global.namabot}`, //Console-2 276 | { 277 | font: 'Standard', 278 | horizontalLayout: 'default', 279 | vertivalLayout: 'default', 280 | width: 80, 281 | whitespaceBreak: false 282 | }), `${randomcolor}`)) 283 | 284 | console.log(color(` :\` . 285 | -s- -o. 286 | -do./d+\` 287 | .\`-+:-\`:+:\` -hd+/dh: 288 | .+++++mmmdhNmdy++dmhshds- 289 | ..-oNNNNNNNNNNNNNNmmmmmdmdds- 290 | +hdmmNNNNNmmmmmNNNmmmmmmdddds:\` 291 | -+mNNNNNdy+::-----:+shmmmmmddddddy: 292 | .sdNNNNNd+- \`-ohmmmddddhddo\` 293 | \`:dNNNNh-.. .+hddddddhmms. 294 | \`:dmmNNN:.. .sddddddmmmy- 295 | .osmNmNm-.. :sdddddmmmo' 296 | \`:NNNNNs.. ./ydddmmh-\` 297 | sdmNNNNs- -odmmmms- 298 | \`-.:mNNNNd+. .ommmmmh- 299 | \`ydhmNNNds:. +mmmmh. 300 | .\`-+ydmNNmds+-\` -:.\` 301 | \`\`-/oydmNNmyo- 302 | \`.:oymmmh+. 303 | \`-ohmmo. 304 | .odd: 305 | \`od: 306 | /d\` 307 | y. 308 | .\` 309 | `,`${randomcolor}`)); 310 | 311 | console.log(color(`📝*Connecting to WhatsApp web🖥️*`,`${randomcolor}`)) 312 | console.log(color(`[[ ༑☔*Bot Has Been Connected*༢⿻ ༑]]`)) 313 | await sleep(30000) 314 | //Jangan dihapus, Nanti ErorEror 315 | ryoroyko.sendMessage('ryozingod.user.id', { 316 | image: { 317 | url: 'https://telegra.ph/file/ea0b61624cf15d1210afb.jpg' 318 | }, 319 | caption: `𝗚𝘂𝗲𝘀𝘀 𝘄𝗵𝗼 𝗵𝗮𝘀 𝗹𝗼𝘀𝘁 𝗵𝗶𝘀/𝗵𝗲𝗿 𝗠𝗲𝗿𝗰𝘆 💀 𝗟𝗲𝘁𝘀 𝗸𝗶𝗹𝗹 𝘁𝗵𝗲 𝘃𝗶𝗯𝗲𝘀,𝗡𝗼 𝗠𝗲𝗿𝗰𝘆 𝗙𝗼𝗿 𝗧𝗵𝗲 𝗪𝗲𝗮𝗸 👻 ` 320 | }) 321 | }// 322 | 323 | } catch (err) { 324 | console.log('Error Di Connection.update ' + err); 325 | ryoroykoStart() 326 | } 327 | 328 | }) 329 | 330 | ryoroyko.ev.on('messages.update', async chatUpdate => { 331 | for(const { key, update } of chatUpdate) { 332 | if(update.pollUpdates && key.fromMe) { 333 | const pollCreation = await getMessage(key) 334 | if(pollCreation) { 335 | const pollUpdate = await getAggregateVotesInPollMessage({ 336 | message: pollCreation, 337 | pollUpdates: update.pollUpdates, 338 | }) 339 | var toCmd = pollUpdate.filter(v => v.voters.length !== 0)[0]?.name 340 | if (toCmd == undefined) return 341 | var prefCmd = prefix+toCmd 342 | ryoroyko.appenTextMessage(prefCmd, chatUpdate) 343 | } 344 | } 345 | } 346 | }) 347 | 348 | /** 349 | * 350 | * @param {*} jid 351 | * @param {*} url 352 | * @param {*} caption 353 | * @param {*} quoted 354 | * @param {*} options 355 | */ 356 | ryoroyko.sendFileUrl = async (jid, url, caption, quoted, options = {}) => { 357 | let mime = ''; 358 | let res = await axios.head(url) 359 | mime = res.headers['content-type'] 360 | if (mime.split("/")[1] === "gif") { 361 | return ryoroyko.sendMessage(jid, { video: await getBuffer(url), caption: caption, gifPlayback: true, ...options}, { quoted: quoted, ...options}) 362 | } 363 | let type = mime.split("/")[0]+"Message" 364 | if(mime === "application/pdf"){ 365 | return ryoroyko.sendMessage(jid, { document: await getBuffer(url), mimetype: 'application/pdf', caption: caption, ...options}, { quoted: quoted, ...options }) 366 | } 367 | if(mime.split("/")[0] === "image"){ 368 | return ryoroyko.sendMessage(jid, { image: await getBuffer(url), caption: caption, ...options}, { quoted: quoted, ...options}) 369 | } 370 | if(mime.split("/")[0] === "video"){ 371 | return ryoroyko.sendMessage(jid, { video: await getBuffer(url), caption: caption, mimetype: 'video/mp4', ...options}, { quoted: quoted, ...options }) 372 | } 373 | if(mime.split("/")[0] === "audio"){ 374 | return ryoroyko.sendMessage(jid, { audio: await getBuffer(url), caption: caption, mimetype: 'audio/mpeg', ...options}, { quoted: quoted, ...options }) 375 | } 376 | } 377 | 378 | /** 379 | * 380 | * @param {*} jid 381 | * @param {*} name 382 | * @param [*] values 383 | * @returns 384 | */ 385 | ryoroyko.sendPoll = (jid, name = '', values = [], selectableCount = 1) => { return ryoroyko.sendMessage(jid, { poll: { name, values, selectableCount }}) } 386 | 387 | 388 | /** 389 | * 390 | * @param {*} jid 391 | * @param {*} text 392 | * @param {*} quoted 393 | * @param {*} options 394 | * @returns 395 | */ 396 | ryoroyko.sendText = (jid, text, quoted = '', options) => ryoroyko.sendMessage(jid, { text: text, ...options }, { quoted, ...options }) 397 | 398 | /** 399 | * 400 | * @param {*} jid 401 | * @param {*} path 402 | * @param {*} caption 403 | * @param {*} quoted 404 | * @param {*} options 405 | * @returns 406 | */ 407 | ryoroyko.sendImage = async (jid, path, caption = '', quoted = '', options) => { 408 | let buffer = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (await getBuffer(path)) : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0) 409 | return await ryoroyko.sendMessage(jid, { image: buffer, caption: caption, ...options }, { quoted }) 410 | } 411 | 412 | /** 413 | * 414 | * @param {*} jid 415 | * @param {*} path 416 | * @param {*} caption 417 | * @param {*} quoted 418 | * @param {*} options 419 | * @returns 420 | */ 421 | ryoroyko.sendVideo = async (jid, path, caption = '', quoted = '', gif = false, options) => { 422 | let buffer = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (await getBuffer(path)) : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0) 423 | return await ryoroyko.sendMessage(jid, { video: buffer, caption: caption, gifPlayback: gif, ...options }, { quoted }) 424 | } 425 | 426 | /** 427 | * 428 | * @param {*} jid 429 | * @param {*} path 430 | * @param {*} quoted 431 | * @param {*} mime 432 | * @param {*} options 433 | * @returns 434 | */ 435 | ryoroyko.sendAudio = async (jid, path, quoted = '', ptt = false, options) => { 436 | let buffer = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (await getBuffer(path)) : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0) 437 | return await ryoroyko.sendMessage(jid, { audio: buffer, ptt: ptt, ...options }, { quoted }) 438 | } 439 | 440 | /** 441 | * 442 | * @param {*} jid 443 | * @param {*} text 444 | * @param {*} quoted 445 | * @param {*} options 446 | * @returns 447 | */ 448 | ryoroyko.sendTextWithMentions = async (jid, text, quoted, options = {}) => ryoroyko.sendMessage(jid, { text: text, mentions: [...text.matchAll(/@(\d{0,16})/g)].map(v => v[1] + '@s.whatsapp.net'), ...options }, { quoted }) 449 | 450 | /** 451 | * 452 | * @param {*} jid 453 | * @param {*} path 454 | * @param {*} quoted 455 | * @param {*} options 456 | * @returns 457 | */ 458 | ryoroyko.sendImageAsSticker = async (jid, path, quoted, options = {}) => { 459 | let buff = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (await getBuffer(path)) : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0) 460 | let buffer 461 | if (options && (options.packname || options.author)) { 462 | buffer = await writeExifImg(buff, options) 463 | } else { 464 | buffer = await imageToWebp(buff) 465 | } 466 | 467 | await ryoroyko.sendMessage(jid, { sticker: { url: buffer }, ...options }, { quoted }) 468 | return buffer 469 | } 470 | 471 | /** 472 | * 473 | * @param {*} jid 474 | * @param {*} path 475 | * @param {*} quoted 476 | * @param {*} options 477 | * @returns 478 | */ 479 | ryoroyko.sendVideoAsSticker = async (jid, path, quoted, options = {}) => { 480 | let buff = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (await getBuffer(path)) : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0) 481 | let buffer 482 | if (options && (options.packname || options.author)) { 483 | buffer = await writeExifVid(buff, options) 484 | } else { 485 | buffer = await videoToWebp(buff) 486 | } 487 | 488 | await ryoroyko.sendMessage(jid, { sticker: { url: buffer }, ...options }, { quoted }) 489 | return buffer 490 | } 491 | 492 | /** 493 | * 494 | * @param {*} message 495 | * @param {*} filename 496 | * @param {*} attachExtension 497 | * @returns 498 | */ 499 | ryoroyko.downloadAndSaveMediaMessage = async (message, filename, attachExtension = true) => { 500 | let quoted = message.msg ? message.msg : message 501 | let mime = (message.msg || message).mimetype || '' 502 | let messageType = message.mtype ? message.mtype.replace(/Message/gi, '') : mime.split('/')[0] 503 | const stream = await downloadContentFromMessage(quoted, messageType) 504 | let buffer = Buffer.from([]) 505 | for await(const chunk of stream) { 506 | buffer = Buffer.concat([buffer, chunk]) 507 | } 508 | let type = await FileType.fromBuffer(buffer) 509 | trueFileName = attachExtension ? (filename + '.' + type.ext) : filename 510 | // save to file 511 | await fs.writeFileSync(trueFileName, buffer) 512 | return trueFileName 513 | } 514 | 515 | ryoroyko.downloadMediaMessage = async (message) => { 516 | let mime = (message.msg || message).mimetype || '' 517 | let messageType = message.mtype ? message.mtype.replace(/Message/gi, '') : mime.split('/')[0] 518 | const stream = await downloadContentFromMessage(message, messageType) 519 | let buffer = Buffer.from([]) 520 | for await(const chunk of stream) { 521 | buffer = Buffer.concat([buffer, chunk]) 522 | } 523 | 524 | return buffer 525 | } 526 | 527 | /** 528 | * 529 | * @param {*} jid 530 | * @param {*} path 531 | * @param {*} filename 532 | * @param {*} caption 533 | * @param {*} quoted 534 | * @param {*} options 535 | * @returns 536 | */ 537 | ryoroyko.sendMedia = async (jid, path, fileName = '', caption = '', quoted = '', options = {}) => { 538 | let types = await ryoroyko.getFile(path, true) 539 | let { mime, ext, res, data, filename } = types 540 | if (res && res.status !== 200 || file.length <= 65536) { 541 | try { throw { json: JSON.parse(file.toString()) } } 542 | catch (e) { if (e.json) throw e.json } 543 | } 544 | let type = '', mimetype = mime, pathFile = filename 545 | if (options.asDocument) type = 'document' 546 | if (options.asSticker || /webp/.test(mime)) { 547 | let { writeExif } = require('./lib/exif') 548 | let media = { mimetype: mime, data } 549 | pathFile = await writeExif(media, { packname: options.packname ? options.packname : global.packname, author: options.author ? options.author : global.author, categories: options.categories ? options.categories : [] }) 550 | await fs.promises.unlink(filename) 551 | type = 'sticker' 552 | mimetype = 'image/webp' 553 | } 554 | else if (/image/.test(mime)) type = 'image' 555 | else if (/video/.test(mime)) type = 'video' 556 | else if (/audio/.test(mime)) type = 'audio' 557 | else type = 'document' 558 | await ryoroyko.sendMessage(jid, { [type]: { url: pathFile }, caption, mimetype, fileName, ...options }, { quoted, ...options }) 559 | return fs.promises.unlink(pathFile) 560 | } 561 | 562 | /** 563 | * 564 | * @param {*} jid 565 | * @param {*} message 566 | * @param {*} forceForward 567 | * @param {*} options 568 | * @returns 569 | */ 570 | ryoroyko.copyNForward = async (jid, message, forceForward = false, options = {}) => { 571 | let vtype 572 | if (options.readViewOnce) { 573 | message.message = message.message && message.message.ephemeralMessage && message.message.ephemeralMessage.message ? message.message.ephemeralMessage.message : (message.message || undefined) 574 | vtype = Object.keys(message.message.viewOnceMessage.message)[0] 575 | delete(message.message && message.message.ignore ? message.message.ignore : (message.message || undefined)) 576 | delete message.message.viewOnceMessage.message[vtype].viewOnce 577 | message.message = { 578 | ...message.message.viewOnceMessage.message 579 | } 580 | } 581 | 582 | let mtype = Object.keys(message.message)[0] 583 | let content = await generateForwardMessageContent(message, forceForward) 584 | let ctype = Object.keys(content)[0] 585 | let context = {} 586 | if (mtype != "conversation") context = message.message[mtype].contextInfo 587 | content[ctype].contextInfo = { 588 | ...context, 589 | ...content[ctype].contextInfo 590 | } 591 | const waMessage = await generateWAMessageFromContent(jid, content, options ? { 592 | ...content[ctype], 593 | ...options, 594 | ...(options.contextInfo ? { 595 | contextInfo: { 596 | ...content[ctype].contextInfo, 597 | ...options.contextInfo 598 | } 599 | } : {}) 600 | } : {}) 601 | await ryoroyko.relayMessage(jid, waMessage.message, { messageId: waMessage.key.id }) 602 | return waMessage 603 | } 604 | 605 | ryoroyko.cMod = (jid, copy, text = '', sender = ryoroyko.user.id, options = {}) => { 606 | //let copy = message.toJSON() 607 | let mtype = Object.keys(copy.message)[0] 608 | let isEphemeral = mtype === 'ephemeralMessage' 609 | if (isEphemeral) { 610 | mtype = Object.keys(copy.message.ephemeralMessage.message)[0] 611 | } 612 | let msg = isEphemeral ? copy.message.ephemeralMessage.message : copy.message 613 | let content = msg[mtype] 614 | if (typeof content === 'string') msg[mtype] = text || content 615 | else if (content.caption) content.caption = text || content.caption 616 | else if (content.text) content.text = text || content.text 617 | if (typeof content !== 'string') msg[mtype] = { 618 | ...content, 619 | ...options 620 | } 621 | if (copy.key.participant) sender = copy.key.participant = sender || copy.key.participant 622 | else if (copy.key.participant) sender = copy.key.participant = sender || copy.key.participant 623 | if (copy.key.remoteJid.includes('@s.whatsapp.net')) sender = sender || copy.key.remoteJid 624 | else if (copy.key.remoteJid.includes('@broadcast')) sender = sender || copy.key.remoteJid 625 | copy.key.remoteJid = jid 626 | copy.key.fromMe = sender === ryoroyko.user.id 627 | 628 | return proto.WebMessageInfo.fromObject(copy) 629 | } 630 | 631 | ryoroyko.sendFile = async (jid, path, filename = '', caption = '', quoted, ptt = false, options = {}) => { 632 | let type = await ryoroyko.getFile(path, true); 633 | let { res, data: file, filename: pathFile } = type; 634 | 635 | if (res && res.status !== 200 || file.length <= 65536) { 636 | try { 637 | throw { 638 | json: JSON.parse(file.toString()) 639 | }; 640 | } catch (e) { 641 | if (e.json) throw e.json; 642 | } 643 | } 644 | 645 | let opt = { 646 | filename 647 | }; 648 | 649 | if (quoted) opt.quoted = quoted; 650 | if (!type) options.asDocument = true; 651 | 652 | let mtype = '', 653 | mimetype = type.mime, 654 | convert; 655 | 656 | if (/webp/.test(type.mime) || (/image/.test(type.mime) && options.asSticker)) mtype = 'sticker'; 657 | else if (/image/.test(type.mime) || (/webp/.test(type.mime) && options.asImage)) mtype = 'image'; 658 | else if (/video/.test(type.mime)) mtype = 'video'; 659 | else if (/audio/.test(type.mime)) { 660 | convert = await (ptt ? toPTT : toAudio)(file, type.ext); 661 | file = convert.data; 662 | pathFile = convert.filename; 663 | mtype = 'audio'; 664 | mimetype = 'audio/ogg; codecs=opus'; 665 | } else mtype = 'document'; 666 | 667 | if (options.asDocument) mtype = 'document'; 668 | 669 | delete options.asSticker; 670 | delete options.asLocation; 671 | delete options.asVideo; 672 | delete options.asDocument; 673 | delete options.asImage; 674 | 675 | let message = { ...options, caption, ptt, [mtype]: { url: pathFile }, mimetype }; 676 | let m; 677 | 678 | try { 679 | m = await ryoroyko.sendMessage(jid, message, { ...opt, ...options }); 680 | } catch (e) { 681 | //console.error(e) 682 | m = null; 683 | } finally { 684 | if (!m) m = await ryoroyko.sendMessage(jid, { ...message, [mtype]: file }, { ...opt, ...options }); 685 | file = null; 686 | return m; 687 | } 688 | } 689 | 690 | 691 | /** 692 | * 693 | * @param {*} path 694 | * @returns 695 | */ 696 | ryoroyko.getFile = async (PATH, save) => { 697 | let res 698 | let data = Buffer.isBuffer(PATH) ? PATH : /^data:.*?\/.*?;base64,/i.test(PATH) ? Buffer.from(PATH.split`,`[1], 'base64') : /^https?:\/\//.test(PATH) ? await (res = await getBuffer(PATH)) : fs.existsSync(PATH) ? (filename = PATH, fs.readFileSync(PATH)) : typeof PATH === 'string' ? PATH : Buffer.alloc(0) 699 | //if (!Buffer.isBuffer(data)) throw new TypeError('Result is not a buffer') 700 | let type = await FileType.fromBuffer(data) || { 701 | mime: 'application/octet-stream', 702 | ext: '.bin' 703 | } 704 | filename = path.join(__filename, '../src/' + new Date * 1 + '.' + type.ext) 705 | if (data && save) fs.promises.writeFile(filename, data) 706 | return { 707 | res, 708 | filename, 709 | size: await getSizeMedia(data), 710 | ...type, 711 | data 712 | } 713 | 714 | } 715 | 716 | ryoroyko.ev.on('messages.upsert', async chatUpdate => { 717 | //console.log(JSON.stringify(chatUpdate, undefined, 2)) 718 | try { 719 | mek = chatUpdate.messages[0] 720 | if (!mek.message) return 721 | mek.message = (Object.keys(mek.message)[0] === 'ephemeralMessage') ? mek.message.ephemeralMessage.message : mek.message 722 | if (mek.key && mek.key.remoteJid === 'status@broadcast') return 723 | if (!ryoroyko.public && !mek.key.fromMe && chatUpdate.type === 'notify') return 724 | if (mek.key.id.startsWith('BAE5') && mek.key.id.length === 16) return 725 | if (mek.key.id.startsWith('FatihArridho_')) return 726 | m = smsg(ryoroyko, mek, store) 727 | require("./spider")(ryoroyko, m, chatUpdate, store) 728 | } catch (err) { 729 | console.log(err) 730 | } 731 | }) 732 | 733 | //respon polling 734 | async function getMessage(key){ 735 | if (store) { 736 | const msg = await store.loadMessage(key.remoteJid, key.id) 737 | return msg?.message 738 | } 739 | return { 740 | conversation: "Hai Im juna Bot" 741 | } 742 | } 743 | ryoroyko.ev.on('messages.update', async chatUpdate => { 744 | for(const { key, update } of chatUpdate) { 745 | if(update.pollUpdates && key.fromMe) { 746 | const pollCreation = await getMessage(key) 747 | if(pollCreation) { 748 | const pollUpdate = await getAggregateVotesInPollMessage({ 749 | message: pollCreation, 750 | pollUpdates: update.pollUpdates, 751 | }) 752 | var toCmd = pollUpdate.filter(v => v.voters.length !== 0)[0]?.name 753 | if (toCmd == undefined) return 754 | var prefCmd = prefix+toCmd 755 | ryoroyko.appenTextMessage(prefCmd, chatUpdate) 756 | } 757 | } 758 | } 759 | }) 760 | 761 | //Simpan Kredensial 762 | ryoroyko.ev.process( 763 | async (events) => { 764 | if (events['presence.update']) { 765 | await ryoroyko.sendPresenceUpdate('available'); 766 | } 767 | if (events['creds.update']) { 768 | await saveCreds(); 769 | } 770 | } 771 | ) 772 | 773 | return ryoroyko 774 | } 775 | 776 | /*console.clear(); 777 | console.log(color(` 778 | ▒██ ██▒ ▄████ 779 | ▒▒ █ █ ▒░ ██▒ ▀█▒ 780 | ░░ █ ░▒██░▄▄▄░ 781 | ░ █ █ ▒ ░▓█▒ ██▓ 782 | ▒██▒ ▒██▒░▒▓███▀▒ 783 | ▒▒ ░ ░▓ ░ ░▒ ▒ 784 | ░░ ░▒ ░ ░ ░ 785 | ░ ░ ░ ░ ░ 786 | ░ ░ ░ 787 | 788 | `,`${randomcolor}`)); 789 | question(`❗ Masukkan Username Anda Untuk Melanjutkan : \n👤 Usernama : `).then((nama) => { 790 | question('📟 Masukkan Pin Anda Untuk Melanjutkan : \n🌊 Pin Anda : ').then((pin) => { 791 | fetch(apiUrl) 792 | .then(response => response.json()) 793 | .then(data => { 794 | const user = data.data.find(user => user.nama === nama && user.pin == pin); 795 | if (user) { 796 | console.clear(); 797 | console.log(color(` 798 | ▒██ ██▒ ▄████ 799 | ▒▒ █ █ ▒░ ██▒ ▀█▒ 800 | ░░ █ ░▒██░▄▄▄░ 801 | ░ █ █ ▒ ░▓█▒ ██▓ 802 | ▒██▒ ▒██▒░▒▓███▀▒ 803 | ▒▒ ░ ░▓ ░ ░▒ ▒ 804 | ░░ ░▒ ░ ░ ░ 805 | ░ ░ ░ ░ ░ 806 | ░ ░ ░ 807 | 808 | `,`${randomcolor}`)); 809 | console.log("\n🌆 Login berhasil! ✅"); 810 | */ 811 | ryoroykoStart() 812 | /* } else { 813 | console.log("Nama atau pin tidak valid. Login gagal."); 814 | } 815 | }) 816 | .catch(error => { 817 | console.error('Error:', error); 818 | }); 819 | }); 820 | }); 821 | */ 822 | 823 | let file = require.resolve(__filename); 824 | fs.watchFile(file, () => { 825 | fs.unwatchFile(file); 826 | console.log(chalk.yellowBright(`Update File Terbaru ${__filename}`)); 827 | delete require.cache[file]; 828 | require(file); 829 | }); 830 | -------------------------------------------------------------------------------- /lib/scraperrr.js: -------------------------------------------------------------------------------- 1 | const { modul } = require('../module'); 2 | const { axios, cheerio, fs, fetch, got, util, yts, ytdl } = modul; 3 | 4 | function niatsholat (qurerryy) { 5 | return new Promise( async (resolve, reject) => { 6 | const scraper = JSON.parse(fs.readFileSync(`./database/niatSholat/${qurerryy}.json`)) 7 | console.log(scraper) 8 | const result = { 9 | name: scraper.name, 10 | arabic: scraper.arabic, 11 | latin: scraper.latin, 12 | terjemahan: scraper.terjemahan 13 | } 14 | resolve(result) 15 | }).catch((err) => {resolve(err) }) 16 | } 17 | 18 | function asmaulhusna() { 19 | var rndm = ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53','54','55','56','57','58','59','60','61','62','63','64','65','66','67','68','69','70','71','72','73','74','75','76','77','78','79','80','81','82','83','84','85','86','87','88','89','90','91','92','93','94','95','96','97','98','99'] 20 | var bykir = rndm[Math.floor(Math.random() * rndm.length)] 21 | return new Promise( async (resolve, reject) => { 22 | const scraper = JSON.parse(fs.readFileSync(`./database/asmaulHusna/${bykir}.json`)) 23 | console.log(scraper) 24 | const result = { 25 | nomor: scraper.number, 26 | latin: scraper.latin, 27 | arabic: scraper.arab, 28 | id: scraper.translate_id, 29 | en: scraper.translate_en 30 | } 31 | resolve(result) 32 | }).catch((err) => {resolve(err) }) 33 | } 34 | 35 | function bacaanshalat () { 36 | var rndom = ['1','2','3','4','5','6','7','8'] 37 | var bykire = rndom[Math.floor(Math.random() * rndm.length)] 38 | return new Promise( async (resolve, reject) => { 39 | const scraper = JSON.parse(fs.readFileSync(`./database/bacaanSholat/${bykire}.json`)) 40 | console.log(scraper) 41 | const result = { 42 | nomor: scraper.no, 43 | name: scraper.name, 44 | arabic: scraper.arabic, 45 | latin: scraper.latin, 46 | terjemahan: scraper.terjemahan 47 | } 48 | resolve(result) 49 | }).catch((err) => {resolve(err) }) 50 | } 51 | 52 | function getDoujin(identifier) { 53 | const id = identifier.replace(urlToId, '$2'); 54 | return new Promise((resolve, reject) => { 55 | request 56 | .get('https://nhentai.net/g/' + id + '/') 57 | .then(res => { 58 | const $ = cheerio.load(res.text); 59 | let details = {}; 60 | $('.tag-container.field-name').find('.count').each(function () { 61 | const el = $(this); 62 | el.text(` (${el.text()}) `); 63 | }); 64 | $('.tag-container.field-name').text().split('\n').map(string => string.trim()).filter(u => u).map((tag, i, tags) => { 65 | if (tag.endsWith(':') && !tags[i + 1].endsWith(':')) { 66 | details[tag.substring(0, tag.length - 1).toLowerCase()] = tags[i + 1].replace(tagSpacerPatternn, '$1 $2').split(tagSplitPattern); 67 | } 68 | }); 69 | const title = $('#info').find('h1').text(); 70 | const nativeTitle = $('#info').find('h2').text(); 71 | const thumbnails = Object.entries($('.gallerythumb').find('img')).map(image => { 72 | return image[1].attribs 73 | ? image[1].attribs['data-src'] 74 | : null; 75 | }).filter(link => link); 76 | const images = Object.entries($('.gallerythumb').find('img')).map(image => { 77 | return image[1].attribs 78 | ? image[1].attribs['data-src'].replace(/t(\.(jpg|png|gif))/, '$1').replace('t.nhentai', 'i.nhentai') 79 | : null; 80 | }).filter(link => link); 81 | const link = `https://nhentai.net/g/${id}/`; 82 | resolve({ title, nativeTitle, details, pages: images, thumbnails, link }); 83 | }) 84 | .catch(reject); 85 | }); 86 | } 87 | 88 | function onGoing() { 89 | return new Promise((resolve, reject) => { 90 | axios.get('https://neonime.co/episode/').then(res => { 91 | const $ = cheerio.load(res.data) 92 | const result = [] 93 | $('tbody').find('tr').each(function(a, b) { 94 | const link = $(b).find('td > div.imagen-td > a').attr('href') 95 | const img = $(b).find('td > div.imagen-td > a > img').attr('data-src') 96 | const info = $(b).find('td.bb > a > span').text().trim() 97 | const judul = $(b).find('td.bb > a').text() 98 | const tgl_rilis = $(b).find('td.dd').text() 99 | result.push({ judul, link, img, info, tgl_rilis }) 100 | }) 101 | resolve(result) 102 | }).catch(reject) 103 | }) 104 | } 105 | 106 | function kusoNime(query) { 107 | return new Promise(async (resolve, reject) => { 108 | const optionsGet = { 109 | method: 'GET', 110 | headers: { 111 | 'user-agent': 'Mozilla/5.0 (Linux; Android 9; Redmi 7A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.99 Mobile Safari/537.36' 112 | } 113 | } 114 | const getHtml = await fetch('https://kusonime.com/?s=' + query + '&post_type=anime', optionsGet).then(rsp => rsp.text()) 115 | const $ = cheerio.load(getHtml) 116 | const url = [] 117 | $('div > div > ul > div > div > div').each(function() { 118 | url.push($(this).find('a').attr('href')) 119 | }) 120 | const randomUrl = url[Math.floor(Math.random() * url.length)] 121 | const getHtml2 = await fetch(randomUrl, optionsGet).then(rsp => rsp.text()) 122 | const $$ = cheerio.load(getHtml2) 123 | resolve({ 124 | status: 200, 125 | result: { 126 | title: $$('.vezone > .venser').find('.jdlz').text(), 127 | thumb: $$('.vezone > .venser').find('div > img').attr('src'), 128 | views: $$('.vezone > .venser').find('div > div > span').text().trim().replace(' Views', ''), 129 | genre: $$('.vezone > .venser').find('.lexot > .info > p').eq(1).text().replace('Genre : ', ''), 130 | seasons: $$('.vezone > .venser').find('.lexot > .info > p').eq(2).text().replace('Seasons : ', ''), 131 | producers: $$('.vezone > .venser').find('.lexot > .info > p').eq(3).text().replace('Producers: ', ''), 132 | type: $$('.vezone > .venser').find('.lexot > .info > p').eq(4).text().replace('Type: ', ''), 133 | status: $$('.vezone > .venser').find('.lexot > .info > p').eq(5).text().replace('Status: ', ''), 134 | rating: $$('.vezone > .venser').find('.lexot > .info > p').eq(7).text().replace('Score: ', ''), 135 | duration: $$('.vezone > .venser').find('.lexot > .info > p').eq(8).text().replace('Duration: ', ''), 136 | release: $$('.vezone > .venser').find('.lexot > .info > p').eq(9).text().replace('Released on: ', ''), 137 | desc: $$('.vezone > .venser').find('p').eq(10).text(), 138 | url: randomUrl 139 | } 140 | }) 141 | }) 142 | } 143 | 144 | async function mlstalk(id, zoneId) { 145 | return new Promise(async (resolve, reject) => { 146 | axios 147 | .post( 148 | 'https://api.duniagames.co.id/api/transaction/v1/top-up/inquiry/store', 149 | new URLSearchParams( 150 | Object.entries({ 151 | productId: '1', 152 | itemId: '2', 153 | catalogId: '57', 154 | paymentId: '352', 155 | gameId: id, 156 | zoneId: zoneId, 157 | product_ref: 'REG', 158 | product_ref_denom: 'AE', 159 | }) 160 | ), 161 | { 162 | headers: { 163 | 'Content-Type': 'application/x-www-form-urlencoded', 164 | Referer: 'https://www.duniagames.co.id/', 165 | Accept: 'application/json', 166 | }, 167 | } 168 | ) 169 | .then((response) => { 170 | resolve(response.data.data.gameDetail) 171 | }) 172 | .catch((err) => { 173 | reject(err) 174 | }) 175 | }) 176 | } 177 | 178 | async function ffstalk(userId) { 179 | let data = { 180 | "voucherPricePoint.id": 8050, 181 | "voucherPricePoint.price": "", 182 | "voucherPricePoint.variablePrice": "", 183 | "email": "", 184 | "n": "", 185 | "userVariablePrice": "", 186 | "order.data.profile": "", 187 | "user.userId": userId, 188 | "voucherTypeName": "FREEFIRE", 189 | "affiliateTrackingId": "", 190 | "impactClickId": "", 191 | "checkoutId": "", 192 | "tmwAccessToken": "", 193 | "shopLang": "in_ID", 194 | } 195 | let ff = await axios({ 196 | "headers": { 197 | "Content-Type": "application/json; charset\u003dutf-8" 198 | }, 199 | "method": "POST", 200 | "url": "https://order.codashop.com/id/initPayment.action", 201 | "data": data 202 | }) 203 | return { 204 | id: userId, 205 | nickname: ff.data["confirmationFields"]["roles"][0]["role"] 206 | } 207 | } 208 | 209 | async function npmstalk(packageName) { 210 | let stalk = await axios.get("https://registry.npmjs.org/"+packageName) 211 | let versions = stalk.data.versions 212 | let allver = Object.keys(versions) 213 | let verLatest = allver[allver.length-1] 214 | let verPublish = allver[0] 215 | let packageLatest = versions[verLatest] 216 | return { 217 | name: packageName, 218 | versionLatest: verLatest, 219 | versionPublish: verPublish, 220 | versionUpdate: allver.length, 221 | latestDependencies: Object.keys(packageLatest.dependencies).length, 222 | publishDependencies: Object.keys(versions[verPublish].dependencies).length, 223 | publishTime: stalk.data.time.created, 224 | latestPublishTime: stalk.data.time[verLatest] 225 | } 226 | } 227 | 228 | function quotesanime() { 229 | return new Promise((resolve, reject) => { 230 | const page = Math.floor(Math.random() * 184) 231 | axios.get('https://otakotaku.com/quote/feed/'+page) 232 | .then(({ data }) => { 233 | const $ = cheerio.load(data) 234 | const hasil = [] 235 | $('div.kotodama-list').each(function(l, h) { 236 | hasil.push({ 237 | link: $(h).find('a').attr('href'), 238 | gambar: $(h).find('img').attr('data-src'), 239 | karakter: $(h).find('div.char-name').text().trim(), 240 | anime: $(h).find('div.anime-title').text().trim(), 241 | episode: $(h).find('div.meta').text(), 242 | up_at: $(h).find('small.meta').text(), 243 | quotes: $(h).find('div.quote').text().trim() 244 | }) 245 | }) 246 | resolve(hasil) 247 | }).catch(reject) 248 | }) 249 | } 250 | 251 | function pornovid() { 252 | return new Promise((resolve, reject) => { 253 | axios.get('https://tikporntok.com/?random=1') 254 | .then((res) => { 255 | const $ = cheerio.load(res.data) 256 | const hasil = {} 257 | hasil.title = $('article > h1').text() 258 | hasil.source = $('article > div.video-wrapper.vxplayer').attr('data-post') || 'Web Not Response' 259 | hasil.thumb = $('article > div.video-wrapper.vxplayer > div.vx_el').attr('data-poster') || 'https://4.bp.blogspot.com/-hyMqjmQQq4o/W6al-Rk4IpI/AAAAAAAADJ4/m-lVBA_GC9Q5d4BIQg8ZO3fYmQQC3LqSACLcBGAs/s1600/404_not_found.png' 260 | hasil.desc = $('article > div.intro').text() 261 | hasil.upload = $('article > div.single-pre-meta.ws.clearfix > time').text() 262 | hasil.like = $('article > div.single-pre-meta.ws.clearfix > div > span:nth-child(1) > span').text() 263 | hasil.dislike = $('article > div.single-pre-meta.ws.clearfix > div > span:nth-child(2) > span').text() 264 | hasil.favorite = $('article > div.single-pre-meta.ws.clearfix > div > span:nth-child(3) > span').text() 265 | hasil.views = $('article > div.single-pre-meta.ws.clearfix > div > span:nth-child(4) > span').text() 266 | hasil.tags = $('article > div.post-tags').text() 267 | hasil.video = $('article > div.video-wrapper.vxplayer > div.vx_el').attr('src') || $('article > div.video-wrapper.vxplayer > div.vx_el').attr('data-src') || 'https://4.bp.blogspot.com/-hyMqjmQQq4o/W6al-Rk4IpI/AAAAAAAADJ4/m-lVBA_GC9Q5d4BIQg8ZO3fYmQQC3LqSACLcBGAs/s1600/404_not_found.png' 268 | resolve(hasil) 269 | }) 270 | }) 271 | } 272 | 273 | function hentaivid() { 274 | return new Promise((resolve, reject) => { 275 | const page = Math.floor(Math.random() * 1153) 276 | axios.get('https://sfmcompile.club/page/'+page) 277 | .then((data) => { 278 | const $ = cheerio.load(data.data) 279 | const hasil = [] 280 | $('#primary > div > div > ul > li > article').each(function (a, b) { 281 | hasil.push({ 282 | title: $(b).find('header > h2').text(), 283 | link: $(b).find('header > h2 > a').attr('href'), 284 | category: $(b).find('header > div.entry-before-title > span > span').text().replace('in ', ''), 285 | share_count: $(b).find('header > div.entry-after-title > p > span.entry-shares').text(), 286 | views_count: $(b).find('header > div.entry-after-title > p > span.entry-views').text(), 287 | type: $(b).find('source').attr('type') || 'image/jpeg', 288 | video_1: $(b).find('source').attr('src') || $(b).find('img').attr('data-src'), 289 | video_2: $(b).find('video > a').attr('href') || '' 290 | }) 291 | }) 292 | resolve(hasil) 293 | }) 294 | }) 295 | } 296 | 297 | function nomorhp(nomor) { 298 | return new Promise((resolve, reject) => { 299 | axios({ 300 | headers: { 301 | type: 'application/x-www-form-urlencoded' 302 | }, 303 | method: 'POST', 304 | url: 'https://www.primbon.com/no_hoki_bagua_shuzi.php', 305 | data: new URLSearchParams(Object.entries({ 306 | nomer: nomor, 307 | submit: 'Submit!' 308 | })) 309 | }).then(({data}) => { 310 | let $ = cheerio.load(data) 311 | let fetchText = $('#body').text().trim() 312 | let result; 313 | try { 314 | result = { 315 | nomor_hp: fetchText.split('No. HP : ')[1].split('\n')[0], 316 | angka_bagua_shuzi: fetchText.split('Angka Bagua Shuzi : ')[1].split('\n')[0], 317 | energi_positif: { 318 | kekayaan: fetchText.split('Kekayaan = ')[1].split('\n')[0], 319 | kesehatan: fetchText.split('Kesehatan = ')[1].split('\n')[0], 320 | cinta: fetchText.split('Cinta/Relasi = ')[1].split('\n')[0], 321 | kestabilan: fetchText.split('Kestabilan = ')[1].split('\n')[0], 322 | persentase: fetchText.split('Kestabilan = ')[1].split('% = ')[1].split('ENERGI NEGATIF')[0] 323 | }, 324 | energi_negatif: { 325 | perselisihan: fetchText.split('Perselisihan = ')[1].split('\n')[0], 326 | kehilangan: fetchText.split('Kehilangan = ')[1].split('\n')[0], 327 | malapetaka: fetchText.split('Malapetaka = ')[1].split('\n')[0], 328 | kehancuran: fetchText.split('Kehancuran = ')[1].split('\n')[0], 329 | persentase: fetchText.split('Kehancuran = ')[1].split('% = ')[1].split("\n")[0] 330 | }, 331 | notes: fetchText.split('* ')[1].split('Masukan Nomor HP Anda')[0] 332 | } 333 | } catch { 334 | result = `Nomor "${nomor}" tidak valid` 335 | } 336 | resolve(result) 337 | }).catch(reject) 338 | }) 339 | } 340 | 341 | function character(query) { 342 | return new Promise((resolve, reject) => { 343 | axios.get(`https://www.anime-planet.com/characters/all?name=${query}`) 344 | .then(({ 345 | data 346 | }) => { 347 | const hasil = [] 348 | const $ = cheerio.load(data) 349 | $('#siteContainer > table > tbody > tr').each(function (a, b) { 350 | result = { 351 | status: 200, 352 | author: 'KirBotz', 353 | character: $(b).find('> td.tableCharInfo > a').text(), 354 | link: 'https://www.anime-planet.com' + $(b).find('> td.tableCharInfo > a').attr('href'), 355 | thumbnail: $(b).find('> td.tableAvatar > a > img').attr('src').startsWith('https://') ? $(b).find('> td.tableAvatar > a > img').attr('src') : 'https://www.anime.planet.com' + $(b).find('> td.tableAvatar > a > img').attr('src') 356 | }; 357 | hasil.push(result); 358 | }); 359 | resolve(hasil) 360 | }) 361 | .catch(reject) 362 | }) 363 | } 364 | 365 | function anime(query) { 366 | return new Promise((resolve, reject) => { 367 | axios.get(`https://www.anime-planet.com/anime/all?name=${query}`) 368 | .then(({ 369 | data 370 | }) => { 371 | const hasil = [] 372 | const $ = cheerio.load(data) 373 | $('#siteContainer > ul.cardDeck.cardGrid > li ').each(function (a, b) { 374 | result = { 375 | status: 200, 376 | author: 'KirBotz', 377 | judul: $(b).find('> a > h3').text(), 378 | link: 'https://www.anime-planet.com' + $(b).find('> a').attr('href'), 379 | thumbnail: 'https://www.anime-planet.com' + $(b).find('> a > div.crop > img').attr('src') 380 | }; 381 | hasil.push(result); 382 | }); 383 | resolve(hasil) 384 | }) 385 | .catch(reject) 386 | }) 387 | } 388 | 389 | function manga(query) { 390 | return new Promise((resolve, reject) => { 391 | axios.get(`https://www.anime-planet.com/manga/all?name=${query}`) 392 | .then(({ 393 | data 394 | }) => { 395 | const hasil = [] 396 | const $ = cheerio.load(data) 397 | $('#siteContainer > ul.cardDeck.cardGrid > li ').each(function (a, b) { 398 | result = { 399 | status: 200, 400 | author: 'KirBotz', 401 | judul: $(b).find('> a > h3').text(), 402 | link: 'https://www.anime-planet.com' + $(b).find('> a').attr('href'), 403 | thumbnail: 'https://www.anime-planet.com' + $(b).find('> a > div.crop > img').attr('src') 404 | }; 405 | hasil.push(result); 406 | }); 407 | resolve(hasil) 408 | }) 409 | .catch(reject) 410 | }) 411 | } 412 | 413 | function searchsticker(queryy) { 414 | return new Promise((resolve, reject) => { 415 | axios.get(`https://getstickerpack.com/stickers?query=${queryy}`) 416 | .then(({data}) => { 417 | const $ = cheerio.load(data) 418 | const source = [] 419 | const linknya = [] 420 | $('#stickerPacks > div > div:nth-child(3) > div > a').each((a, b) => { 421 | source.push($(b).attr('href')) 422 | }) 423 | axios.get(source[Math.floor(Math.random() * source.length)]) 424 | .then(({data}) => { 425 | const $2 = cheerio.load(data) 426 | $2('#stickerPack > div > div.row > div > img').each((c, d) => { 427 | linknya.push($2(d).attr('src').replace(/&d=200x200/g, '')) 428 | }) 429 | result = { 430 | title: $2('#intro > div > div > h1').text(), 431 | stickerUrl: linknya 432 | } 433 | resolve(result) 434 | }) 435 | }).catch(reject) 436 | }) 437 | } 438 | 439 | function igstalk(Username) { 440 | return new Promise((resolve, reject) => { 441 | axios.get('https://dumpor.com/v/'+Username, { 442 | headers: { 443 | "cookie": "_inst_key=SFMyNTY.g3QAAAABbQAAAAtfY3NyZl90b2tlbm0AAAAYWGhnNS1uWVNLUU81V1lzQ01MTVY2R0h1.fI2xB2dYYxmWqn7kyCKIn1baWw3b-f7QvGDfDK2WXr8", 444 | "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36" 445 | } 446 | }).then(res => { 447 | const $ = cheerio.load(res.data) 448 | const result = { 449 | profile: $('#user-page > div.user > div.row > div > div.user__img').attr('style').replace(/(background-image: url\(\'|\'\);)/gi, ''), 450 | fullname: $('#user-page > div.user > div > div.col-md-4.col-8.my-3 > div > a > h1').text(), 451 | username: $('#user-page > div.user > div > div.col-md-4.col-8.my-3 > div > h4').text(), 452 | post: $('#user-page > div.user > div > div.col-md-4.col-8.my-3 > ul > li:nth-child(1)').text().replace(' Posts',''), 453 | followers: $('#user-page > div.user > div > div.col-md-4.col-8.my-3 > ul > li:nth-child(2)').text().replace(' Followers',''), 454 | following: $('#user-page > div.user > div > div.col-md-4.col-8.my-3 > ul > li:nth-child(3)').text().replace(' Following',''), 455 | bio: $('#user-page > div.user > div > div.col-md-5.my-3 > div').text() 456 | } 457 | resolve(result) 458 | }) 459 | }) 460 | } 461 | 462 | function listsurah() { 463 | return new Promise((resolve, reject) => { 464 | axios.get('https://litequran.net/') 465 | .then(({ data }) => { 466 | const $ = cheerio.load(data) 467 | let listsurah = [] 468 | $('body > main > section > ol > li > a').each(function(a, b) { 469 | listsurah.push($(b).text()) 470 | }) 471 | result = { 472 | status: 200, 473 | author: 'KirBotz', 474 | listsurah: listsurah 475 | } 476 | resolve(result) 477 | }).catch(reject) 478 | }) 479 | } 480 | 481 | function jadwalsholat(query) { 482 | return new Promise((resolve, reject) => { 483 | axios.get(`https://umrotix.com/jadwal-sholat/${query}`) 484 | .then(({ 485 | data 486 | }) => { 487 | const $ = cheerio.load(data) 488 | $('body > div > div.main-wrapper.scrollspy-action > div:nth-child(3) ').each(function(a, b) { 489 | result = { 490 | status: 200, 491 | author: 'KirBotz', 492 | tanggal: $(b).find('> div:nth-child(2)').text(), 493 | imsyak: $(b).find('> div.panel.daily > div > div > div > div > div:nth-child(1) > p:nth-child(2)').text(), 494 | subuh: $(b).find('> div.panel.daily > div > div > div > div > div:nth-child(2) > p:nth-child(2)').text(), 495 | dzuhur: $(b).find('> div.panel.daily > div > div > div > div > div:nth-child(3) > p:nth-child(2)').text(), 496 | ashar: $(b).find('> div.panel.daily > div > div > div > div > div:nth-child(4) > p:nth-child(2)').text(), 497 | maghrib: $(b).find('> div.panel.daily > div > div > div > div > div:nth-child(5) > p:nth-child(2)').text(), 498 | isya: $(b).find('> div.panel.daily > div > div > div > div > div:nth-child(6) > p:nth-child(2)').text() 499 | } 500 | resolve(result) 501 | }) 502 | }) 503 | .catch(reject) 504 | }) 505 | } 506 | 507 | async function telesticker(url){ 508 | return new Promise(async (resolve, reject) => { 509 | packName = url.replace("https://t.me/addstickers/", "") 510 | data = await axios(`https://api.telegram.org/bot891038791:AAHWB1dQd-vi0IbH2NjKYUk-hqQ8rQuzPD4/getStickerSet?name=${encodeURIComponent(packName)}`, {method: "GET",headers: {"User-Agent": "GoogleBot"}}) 511 | const hasil = [] 512 | for (let i = 0; i < data.data.result.stickers.length; i++) { 513 | fileId = data.data.result.stickers[i].thumb.file_id 514 | data2 = await axios(`https://api.telegram.org/bot891038791:AAHWB1dQd-vi0IbH2NjKYUk-hqQ8rQuzPD4/getFile?file_id=${fileId}`) 515 | result = { 516 | url: "https://api.telegram.org/file/bot891038791:AAHWB1dQd-vi0IbH2NjKYUk-hqQ8rQuzPD4/" + data2.data.result.file_path 517 | } 518 | hasil.push(result.url) 519 | } 520 | resolve(hasil) 521 | }) 522 | } 523 | 524 | async function aiovideodl(url) { 525 | let { data, headers } = await axios("https://aiovideodl.ml/"); 526 | let $ = cheerio.load(data); 527 | let token = $("#token").attr("value"); 528 | let cookie = headers["set-cookie"].join("; "); 529 | let body = new URLSearchParams({ url, token }); 530 | let { data: res } = await axios({ 531 | "url": "https://aiovideodl.ml/wp-json/aio-dl/video-data/", 532 | "method": "POST", 533 | "data": body, 534 | "headers": { 535 | "content-type": "application/x-www-form-urlencoded", 536 | "cookie": cookie, 537 | "origin": "https://aiovideodl.ml", 538 | "referer": "https://aiovideodl.ml/", 539 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36" 540 | } 541 | }); 542 | return res; 543 | } 544 | 545 | function linkwa(nama){ 546 | return new Promise((resolve,reject) => { 547 | axios.get('http://ngarang.com/link-grup-wa/daftar-link-grup-wa.php?search='+ nama +'&searchby=name') 548 | .then(({ data }) => { 549 | const $ = cheerio.load(data); 550 | const result = []; 551 | const lnk = []; 552 | const nm = []; 553 | $('div.wa-chat-title-container').each(function(a,b){ 554 | const limk = $(b).find('a').attr('href'); 555 | lnk.push(limk) 556 | }) 557 | $('div.wa-chat-title-text').each(function(c,d) { 558 | const name = $(d).text(); 559 | nm.push(name) 560 | }) 561 | for( let i = 0; i < lnk.length; i++){ 562 | result.push({ 563 | nama: nm[i].split('. ')[1], 564 | link: lnk[i].split('?')[0] 565 | }) 566 | } 567 | resolve(result) 568 | }) 569 | .catch(reject) 570 | }) 571 | } 572 | 573 | async function mediafiredl(url) { 574 | var _a, _b; 575 | if (!/https?:\/\/(www\.)?mediafire\.com/.test(url)) 576 | throw new Error('Invalid URL: ' + url); 577 | const data = await got(url).text(); 578 | const $ = cheerio.load(data); 579 | const Url = ($('#downloadButton').attr('href') || '').trim(); 580 | const url2 = ($('#download_link > a.retry').attr('href') || '').trim(); 581 | const $intro = $('div.dl-info > div.intro'); 582 | const filename = $intro.find('div.filename').text().trim(); 583 | const filetype = $intro.find('div.filetype > span').eq(0).text().trim(); 584 | const ext = ((_b = (_a = /\(\.(.*?)\)/.exec($intro.find('div.filetype > span').eq(1).text())) === null || _a === void 0 ? void 0 : _a[1]) === null || _b === void 0 ? void 0 : _b.trim()) || 'bin'; 585 | const $li = $('div.dl-info > ul.details > li'); 586 | const aploud = $li.eq(1).find('span').text().trim(); 587 | const filesizeH = $li.eq(0).find('span').text().trim(); 588 | const filesize = parseFloat(filesizeH) * (/GB/i.test(filesizeH) 589 | ? 1000000 590 | : /MB/i.test(filesizeH) 591 | ? 1000 592 | : /KB/i.test(filesizeH) 593 | ? 1 594 | : /B/i.test(filesizeH) 595 | ? 0.1 596 | : 0); 597 | return { 598 | url: Url, 599 | url2, 600 | filename, 601 | filetype, 602 | ext, 603 | aploud, 604 | filesizeH, 605 | filesize 606 | }; 607 | } 608 | 609 | async function ytPlayMp4(query) { 610 | return new Promise((resolve, reject) => { 611 | try { 612 | const search = yts(query) 613 | .then((data) => { 614 | const url = [] 615 | const pormat = data.all 616 | for (let i = 0; i < pormat.length; i++) { 617 | if (pormat[i].type == 'video') { 618 | let dapet = pormat[i] 619 | url.push(dapet.url) 620 | } 621 | } 622 | const id = ytdl.getVideoID(url[0]) 623 | const yutub = ytdl.getInfo(`https://www.youtube.com/watch?v=${id}`) 624 | .then((data) => { 625 | let pormat = data.formats 626 | let video = [] 627 | for (let i = 0; i < pormat.length; i++) { 628 | if (pormat[i].container == 'mp4' && pormat[i].hasVideo == true && pormat[i].hasAudio == true) { 629 | let vid = pormat[i] 630 | video.push(vid.url) 631 | } 632 | } 633 | const title = data.player_response.microformat.playerMicroformatRenderer.title.simpleText 634 | const thumb = data.player_response.microformat.playerMicroformatRenderer.thumbnail.thumbnails[0].url 635 | const channel = data.player_response.microformat.playerMicroformatRenderer.ownerChannelName 636 | const views = data.player_response.microformat.playerMicroformatRenderer.viewCount 637 | const published = data.player_response.microformat.playerMicroformatRenderer.publishDate 638 | const result = { 639 | title: title, 640 | thumb: thumb, 641 | channel: channel, 642 | published: published, 643 | views: views, 644 | url: video[0] 645 | } 646 | return(result) 647 | }) 648 | return(yutub) 649 | }) 650 | resolve(search) 651 | } catch (error) { 652 | reject(error) 653 | } 654 | console.log(error) 655 | }) 656 | } 657 | 658 | async function ytPlayMp3(query) { 659 | return new Promise((resolve, reject) => { 660 | try { 661 | const search = yts(query) 662 | .then((data) => { 663 | const url = [] 664 | const pormat = data.all 665 | for (let i = 0; i < pormat.length; i++) { 666 | if (pormat[i].type == 'video') { 667 | let dapet = pormat[i] 668 | url.push(dapet.url) 669 | } 670 | } 671 | const id = ytdl.getVideoID(url[0]) 672 | const yutub = ytdl.getInfo(`https://www.youtube.com/watch?v=${id}`) 673 | .then((data) => { 674 | let pormat = data.formats 675 | let audio = [] 676 | let video = [] 677 | for (let i = 0; i < pormat.length; i++) { 678 | if (pormat[i].mimeType == 'audio/webm; codecs=\"opus\"') { 679 | let aud = pormat[i] 680 | audio.push(aud.url) 681 | } 682 | } 683 | const title = data.player_response.microformat.playerMicroformatRenderer.title.simpleText 684 | const thumb = data.player_response.microformat.playerMicroformatRenderer.thumbnail.thumbnails[0].url 685 | const channel = data.player_response.microformat.playerMicroformatRenderer.ownerChannelName 686 | const views = data.player_response.microformat.playerMicroformatRenderer.viewCount 687 | const published = data.player_response.microformat.playerMicroformatRenderer.publishDate 688 | const result = { 689 | status: true, 690 | code: 200, 691 | creator: '@kirbotz×', 692 | title: title, 693 | thumb: thumb, 694 | channel: channel, 695 | published: published, 696 | views: views, 697 | url: audio[0] 698 | } 699 | return(result) 700 | }) 701 | return(yutub) 702 | }) 703 | resolve(search) 704 | } catch (error) { 705 | reject(error) 706 | } 707 | console.log(error) 708 | }) 709 | } 710 | 711 | function cerpen (category) { 712 | return new Promise(async (resolve, reject) => { 713 | let title = category.toLowerCase().replace(/[()*]/g, "") 714 | let judul = title.replace(/\s/g, "-") 715 | let page = Math.floor(Math.random() * 5) 716 | axios.get('http://cerpenmu.com/category/cerpen-'+judul+'/page/'+page) 717 | .then((get) => { 718 | let $ = cheerio.load(get.data) 719 | let link = [] 720 | $('article.post').each(function (a, b) { 721 | link.push($(b).find('a').attr('href')) 722 | }) 723 | let random = link[Math.floor(Math.random() * link.length)] 724 | axios.get(random) 725 | .then((res) => { 726 | let $$ = cheerio.load(res.data) 727 | let hasil = { 728 | title: $$('#content > article > h1').text(), 729 | author: $$('#content > article').text().split('Cerpen Karangan: ')[1].split('Kategori: ')[0], 730 | kategori: $$('#content > article').text().split('Kategori: ')[1].split('\n')[0], 731 | lolos: $$('#content > article').text().split('Lolos moderasi pada: ')[1].split('\n')[0], 732 | cerita: $$('#content > article > p').text() 733 | } 734 | resolve(hasil) 735 | }) 736 | }) 737 | }) 738 | } 739 | 740 | function getLatestAnime() { 741 | return new Promise((resolve, reject) => { 742 | axios.get('https://www.mynimeku.com/').then(({ data }) => { 743 | let $ = cheerio.load(data) 744 | let result = [] 745 | $('div.flexbox-item > a').each(function(i, e) { 746 | let title = $(e).attr('title') 747 | let link = $(e).attr('href') 748 | let status = $(e).find('div.flexbox-status').text() 749 | let thumb = $(e).find('div.flexbox-thumb > img').attr('data-src') 750 | let episode = $(e).find('div.flexbox-episode > span.eps').text().split(' ')[1] 751 | let type = $(e).find('div.flexbox-type').text() 752 | result.push({ title, status, episode, type, thumb, link }) 753 | }) 754 | resolve(result) 755 | }).catch(reject) 756 | }) 757 | } 758 | 759 | function getLatestKomik() { 760 | return new Promise((resolve, reject) => { 761 | axios.get('https://www.mynimeku.com/').then(({ data }) => { 762 | let $ = cheerio.load(data) 763 | let result = [] 764 | $('div.flexbox4-item').each(function(i, e) { 765 | let title = $(e).find('a').attr('title') 766 | let link = $(e).find('a').attr('href') 767 | let thumb = $(e).find('div.flexbox4-thumb > img').attr('data-src') 768 | let type = $(e).find('div.flexbox4-type').text() 769 | let status = $(e).find('div.flexbox-status').text() 770 | let chapter = $(e).find('ul.chapter > li').text().split(' ')[1] 771 | result.push({ title, status, chapter, type, thumb, link }) 772 | }) 773 | resolve(result) 774 | }).catch(reject) 775 | }) 776 | } 777 | 778 | function AnimeDl(url) { 779 | return new Promise((resolve, reject) => { 780 | axios.get(url).then(({ data }) => { 781 | let $ = cheerio.load(data) 782 | let title = $('title').text() 783 | let thumb = $('meta[property="og:image"]').attr('content') 784 | let url = $('#linklist').find('a').attr('href') 785 | resolve({ title, thumb, url }) 786 | }).catch(reject) 787 | }) 788 | } 789 | 790 | function KomikDl(url) { 791 | return new Promise((resolve, reject) => { 792 | axios.get(url).then(({ data }) => { 793 | let $ = cheerio.load(data) 794 | let title = $('title').text().replace('Bahasa Indonesia - MyNimeku', '').trim() 795 | let result = [] 796 | $('div.reader-area > p > img').each(function () { 797 | result.push($(this).attr('src')) 798 | }) 799 | resolve({ title, result }) 800 | }).catch(reject) 801 | }) 802 | } 803 | 804 | function otakudesu(judul){ 805 | return new Promise(async(resolve, reject) => { 806 | axios.get('https://otakudesu.moe/?s=' + judul + '&post_type=anime') 807 | .then(({ data }) => { 808 | const $ = cheerio.load(data) 809 | const result = {}; 810 | let limk = $('#venkonten > div > div.venser > div > div > ul > li:nth-child(1) > h2 > a').attr('href') 811 | axios.get(limk).then(({ data }) => { 812 | const $$ = cheerio.load(data) 813 | result.message = 'KirBotz' 814 | result.img = $$('#venkonten > div.venser > div.fotoanime').find('img').attr('src') 815 | $$('#venkonten > div.venser > div.fotoanime > div.infozin > div').each(function(a, b) { 816 | result.judul = $$(b).find('p:nth-child(1)').text().replace('Judul: ','') 817 | result.jepang = $$(b).find('p:nth-child(2)').text().replace('Japanese: ','') 818 | result.rate = $$(b).find('p:nth-child(3)').text().replace('Skor: ','') 819 | result.produser = $$(b).find('p:nth-child(4)').text().replace('Produser: ','') 820 | result.tipe = $$(b).find('p:nth-child(5)').text().replace('Tipe: ','') 821 | result.status = $$(b).find('p:nth-child(6)').text().replace('Status: ','') 822 | result.episode = $$(b).find('p:nth-child(7)').text().replace('Total Episode: ','') 823 | result.durasi = $$(b).find('p:nth-child(8)').text().replace('Durasi: ','') 824 | result.rilis = $$(b).find('p:nth-child(9)').text().replace('Tanggal Rilis: ','') 825 | result.studio = $$(b).find('p:nth-child(10)').text().replace('Studio: ','') 826 | result.genre = $$(b).find('p:nth-child(11)').text().replace('Genre: ','') 827 | result.desc = $$('#venkonten > div.venser > div.fotoanime > div.sinopc').text().replace('.','\n') + $$(b).find('div.sinopc > p:nth-child(2)').text() 828 | result.batch = $$('#venkonten > div.venser > div:nth-child(10) > ul > li > span:nth-child(1) > a').attr('href') 829 | }) 830 | const lim = $$('#venkonten > div.venser > div:nth-child(10) > ul > li > span:nth-child(1) > a').attr('href') 831 | axios.get(lim).then(({ data }) => { 832 | const $$$ = cheerio.load(data) 833 | result.batchSD = $$$('#venkonten > div:nth-child(6) > ul > li:nth-child(1) > a:nth-child(3)').attr('href') 834 | result.batchHD = $$$('#venkonten > div:nth-child(6) > ul > li:nth-child(3) > a:nth-child(3)').attr('href') 835 | resolve(result) 836 | }) 837 | }) 838 | }) 839 | .catch(reject) 840 | }) 841 | } 842 | 843 | module.exports = { 844 | niatsholat, 845 | asmaulhusna, 846 | bacaanshalat, 847 | getDoujin, 848 | onGoing, 849 | kusoNime, 850 | mlstalk, 851 | ffstalk, 852 | npmstalk, 853 | quotesanime, 854 | pornovid, 855 | hentaivid, 856 | nomorhp, 857 | character, 858 | anime, 859 | manga, 860 | searchsticker, 861 | igstalk, 862 | listsurah, 863 | jadwalsholat, 864 | telesticker, 865 | aiovideodl, 866 | linkwa, 867 | mediafiredl, 868 | ytPlayMp4, 869 | ytPlayMp3, 870 | cerpen, 871 | getLatestAnime, 872 | getLatestKomik, 873 | AnimeDl, 874 | KomikDl, 875 | otakudesu } --------------------------------------------------------------------------------