metadidomi-builder 1.5.2411250404 → 1.6.2812251812

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -18,11 +18,12 @@
18
18
  5. **[Modes de Construction](#-modes-de-construction)** - Options de build
19
19
  6. **[Gestion des Dépendances](#-gestion-des-dépendances)** - Electron et Python
20
20
  7. **[Protection du Code](#-système-de-protection-avancé)** - Sécurité
21
- 8. **[Packaging Python](#-packaging-dapplications-python)** - Applications Python
22
- 9. **[Packaging Android](#-packaging-dapplications-android)** - Applications Android APK
23
- 10. **[Comparaison](#-comparaison-avec-electron-builder)** - vs electron-builder
24
- 11. **[Roadmap](#-roadmap)** - Futures versions
25
- 12. **[Support](#-support-et-contribution)** - Aide et contact
21
+ 8. **[Utilisation de jsMetadidomi](#-utilisation-de-jsmetadidomi)** - Protection JavaScript
22
+ 9. **[Packaging Python](#-packaging-dapplications-python)** - Applications Python
23
+ 10. **[Packaging Android](#-packaging-dapplications-android)** - Applications Android APK
24
+ 11. **[Comparaison](#-comparaison-avec-electron-builder)** - vs electron-builder
25
+ 12. **[Roadmap](#-roadmap)** - Futures versions
26
+ 13. **[Support](#-support-et-contribution)** - Aide et contact
26
27
 
27
28
  ---
28
29
 
@@ -60,7 +61,7 @@ npm install
60
61
  Si lors de l'installation le dossier `build_tools/vendor` n'est pas présent, suivez ces instructions :
61
62
 
62
63
  . Téléchargez le fichier `vendor.zip` depuis :
63
- https://github.com/METADIDOMIOFFICIEL/Metadidomi-Builder/releases/download/1.3.171125/vendor.zip
64
+ https://github.com/METADIDOMIOFFICIEL/Metadidomi-Builder/releases/download/1.3.171125/vendor.zi
64
65
 
65
66
  En suite télécharger le kit Android:
66
67
  https://github.com/METADIDOMIOFFICIEL/Metadidomi-Builder/releases/download/Android.zip/android.zip
@@ -548,6 +549,58 @@ node build_tools/builder.js --heavy-protection
548
549
 
549
550
  👉 **[📖 Documentation complète des protections →](build_tools_py/PROTECTION_COMMANDS.md)**
550
551
 
552
+ ---
553
+
554
+ ## 🚀 Utilisation de jsMetadidomi
555
+
556
+ **jsMetadidomi** est l'outil de protection JavaScript/HTML du builder. Il obfusque et chiffre votre code avec des couches de sécurité avancées.
557
+
558
+ ### Démarrage Rapide
559
+
560
+ #### Protéger un Fichier Individuel
561
+ ```powershell
562
+ # Protéger un fichier JavaScript
563
+ node node_modules/metadidomi-builder/build_tools/jsMetadidomi/protect.js mon-script.js dossier-sortie light
564
+
565
+ # Protéger un fichier HTML
566
+ node node_modules/metadidomi-builder/build_tools/jsMetadidomi/protect.js page.html dossier-sortie light
567
+ ```
568
+
569
+ #### Protéger un Dossier Complet
570
+ ```powershell
571
+ # Protéger tous les fichiers d'un dossier
572
+ node node_modules/metadidomi-builder/build_tools/jsMetadidomi/protect.js src protected-output medium
573
+ ```
574
+
575
+ ### Niveaux de Protection
576
+
577
+ | Niveau | Description | Cas d'usage |
578
+ |--------|-------------|-----------|
579
+ | **light** | Obfuscation basique + loader | Développement, tests rapides |
580
+ | **medium** | Obfuscation + anti-debug + dead code | Production standard |
581
+
582
+ ### Résultat de la Protection
583
+
584
+ Une fois la protection complétée, vous obtenez :
585
+ - 📄 **Fichiers protégés** - Code obfusqué et chiffré
586
+ - 🔑 **jsloader.js** - Loader de déchiffrement (généré automatiquement)
587
+
588
+ **⚠️ Important** : Distribuez le `jsloader.js` généré avec vos fichiers protégés. Le loader contient les clés et le bytecode nécessaires au déchiffrement.
589
+
590
+ ### Utilisation Programmatique
591
+
592
+ ```javascript
593
+ const { obfuscateFile, obfuscateApp } = require('metadidomi-builder/build_tools/jsMetadidomi/jsMetadidomi.js');
594
+
595
+ // Protéger un fichier
596
+ obfuscateFile('mon-script.js', 'dossier-sortie', 'light', true);
597
+
598
+ // Protéger un dossier
599
+ obfuscateApp('src', 'protected-output', 'medium', true);
600
+ ```
601
+
602
+ ---
603
+
551
604
  ## Construction LITE (optimisation)
552
605
  ```powershell
553
606
  $env:LITE_BUILD="true"
@@ -1164,6 +1217,31 @@ AUTHOR = "Votre Entreprise"
1164
1217
  ENTRY = "__main__"
1165
1218
  ```
1166
1219
 
1220
+ ### ⚠️ Point d'Entrée Unique (IMPORTANT)
1221
+
1222
+ Le builder utilise **un seul point d'entrée**, celui défini dans la clé `ENTRY` de `config.py`.
1223
+
1224
+ - ✅ **Seul le fichier défini dans `ENTRY`** sera utilisé comme point d'entrée principal
1225
+ - ❌ Les autres fichiers d'entrée potentiels (`main.py`, `app.py`, etc.) seront **ignorés et non embarqués** dans le launcher
1226
+ - 🔒 Cela garantit qu'il n'y a **aucune ambiguïté** sur le point d'entrée réel
1227
+
1228
+ **Exemple :**
1229
+ ```python
1230
+ # Si vous définissez dans config.py:
1231
+ ENTRY = "app_launcher"
1232
+
1233
+ # Alors SEUL app_launcher.py sera utilisé comme point d'entrée
1234
+ # Les fichiers main.py, __main__.py, app.py seront complètement ignorés
1235
+ ```
1236
+
1237
+ **Comportement du builder :**
1238
+ 1. Lit la clé `ENTRY` dans `config.py`
1239
+ 2. Cherche le fichier correspondant (ex: `app_launcher.py`)
1240
+ 3. L'embarque dans le launcher compilé
1241
+ 4. **Exclut tous les autres fichiers Python d'entrée** du payload
1242
+
1243
+ Cela évite les conflits et les comportements imprévisibles dus à plusieurs points d'entrée.
1244
+
1167
1245
  ### 📝 Exemple : __main__.py Minimal
1168
1246
 
1169
1247
  ```python
@@ -1271,6 +1349,43 @@ python builder.py --gui
1271
1349
  | `--gui` | Compiler en mode GUI (pas de console) | `--gui` |
1272
1350
  | `--no-pyc` | Ne pas compiler les .py en .pyc | `--no-pyc` |
1273
1351
  | `--key <clé>` | Clé de chiffrement personnalisée | `--key ma-clé` |
1352
+ | `--python-embed <chemin>` | Python embeddable personnalisé | `--python-embed D:\python-embed-amd64` |
1353
+
1354
+ ### 🐍 Utilisation d'un Python Embeddable Personnalisé
1355
+
1356
+ Le paramètre `--python-embed` permet d'utiliser votre propre distribution Python embeddable au lieu de celle par défaut. Cela est utile pour :
1357
+ - ✅ Utiliser une version Python différente
1358
+ - ✅ Utiliser un Python pré-configuré avec vos dépendances
1359
+ - ✅ Optimiser la taille du package final
1360
+ - ✅ Builds reproductibles avec un Python maîtrisé
1361
+
1362
+ **Utilisation :**
1363
+
1364
+ ```powershell
1365
+ # Utiliser un Python embeddable personnalisé
1366
+ python builder.py --python-embed D:\python-embed-amd64
1367
+
1368
+ # Combiné avec d'autres paramètres
1369
+ python builder.py --app-src D:\mon-app --output D:\dist --python-embed D:\python-embed-amd64 --gui
1370
+
1371
+ # Via variable d'environnement
1372
+ $env:PYTHON_EMBED = "D:\python-embed-amd64"
1373
+ python builder.py
1374
+ ```
1375
+
1376
+ **Structure attendue du dossier Python embeddable :**
1377
+
1378
+ ```
1379
+ python-embed-amd64/
1380
+ ├── python.exe ← Exécutable Python principal
1381
+ ├── python311.dll ← Librairie Python
1382
+ ├── Lib/ ← Librairies standard Python
1383
+ ├── DLLs/ ← DLLs compilées
1384
+ ├── Scripts/ ← Scripts exécutables
1385
+ └── site-packages/ ← Packages tiers installés
1386
+ ```
1387
+
1388
+ **Important :** Assurez-vous que votre dossier Python embeddable contient tous les fichiers standards et que les dépendances requises sont installées dans `site-packages/`.
1274
1389
 
1275
1390
  ### 💾 Architecture du Packaging Python
1276
1391
 
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const _0x434724=_0x26e4;(function(_0x4deeeb,_0x2f0897){const _0x5dc70c=_0x26e4,_0x51c87e=_0x4deeeb();while(!![]){try{const _0x522e4f=parseInt(_0x5dc70c(0x173))/0x1*(parseInt(_0x5dc70c(0x152))/0x2)+-parseInt(_0x5dc70c(0xe4))/0x3+parseInt(_0x5dc70c(0xf8))/0x4+-parseInt(_0x5dc70c(0xd5))/0x5*(parseInt(_0x5dc70c(0x166))/0x6)+-parseInt(_0x5dc70c(0x143))/0x7+-parseInt(_0x5dc70c(0x1bb))/0x8+parseInt(_0x5dc70c(0x155))/0x9;if(_0x522e4f===_0x2f0897)break;else _0x51c87e['push'](_0x51c87e['shift']());}catch(_0x325b7b){_0x51c87e['push'](_0x51c87e['shift']());}}}(_0x2770,0xb0e1e));const fs=require('fs'),path=require(_0x434724(0xef)),{execSync,spawnSync}=require(_0x434724(0x156)),startTime=Date['now']();let projectDir=null;function _0x2770(){const _0x2a39f6=['\x20échouée\x20(non\x20critique)','\x20\x20node\x20build_apk.js\x20/chemin/vers/projet','APKSigner','sep','substring','\x20(attendu:\x20','1391980BKLwuI','\x0aERREUR:\x20Dossier\x20du\x20projet\x20non\x20trouvé!','\x22\x20-keystore\x20\x22','\x0aERREUR:\x20lien\x20a\x20échoué.\x20R.java\x20n\x27a\x20probablement\x20pas\x20été\x20généré.','\x22\x20-storepass\x20123456\x20-keypass\x20123456\x20-keyalg\x20RSA\x20-keysize\x202048\x20-validity\x2010000','AndroidManifest.xml','\x20octets','exec','Android\x20JAR','\x0a===\x202)\x20LIAISON\x20DES\x20RESSOURCES\x20===','styles.xml','pipe','.java','\x0aRemarque:\x20utilisez\x20--fail-on-missing\x20pour\x20faire\x20échouer\x20le\x20build\x20lorsqu\x27un\x20fichier\x20manque,\x20ou\x20--ignore-missing\x20pour\x20continuer.','/compiledResources','7zip','pop','\x22\x20u\x20-y\x20\x22','Chemin\x20recherché:\x20','⚠\x20Dossier\x20classes\x20non\x20trouvé','appName','Variable\x20d\x27environnement\x20PROJECT_PATH\x20détectée:\x20','res/values/styles.xml','⚠\x20Aucun\x20fichier\x20Java\x20trouvé\x20—\x20génération\x20de\x20stubs\x20d\x27activité\x20pour\x20éviter\x20les\x20crashes','layout','.png','Aucun\x20fichier\x20.java\x20trouvé\x20après\x20suppression;\x20impossible\x20de\x20recompiler.','/values/','name','Le\x20fichier\x20source\x20correspondant\x20n\x27est\x20pas\x20un\x20fichier\x20généré\x20par\x20le\x20script.\x20Aucune\x20suppression\x20automatique\x20réalisée.','APK\x20créé:\x20','✓\x20Stub\x20activity\x20created:\x20','Avertissement:\x20impossible\x20d\x27ajouter\x20les\x20.java\x20générés:','Erreur\x20lors\x20de\x20la\x20tentative\x20de\x20correction\x20automatique:','split','--fail-on-missing','Avertissement:\x20Compilation\x20de\x20','renameSync','dirname','Zipalign','HOME','\x5cjar\x22\x20cvf\x20\x22','\x0a===\x201)\x20COMPILING\x20RESOURCES\x20===','.xml','Avertissement:\x20Génération\x20des\x20icônes\x20échouée\x20(non\x20critique\x20pour\x20le\x20build)','extname','Note:\x20Avertissements\x20de\x20signature\x20détectés\x20(non-bloquants)','basename','✓\x20R.java\x20généré\x20avec\x20succès:\x20','unlinkSync','Compiling\x20Java\x20files','\x22\x20--manifest\x20\x22','minSdkVersion','build-tools','ERREUR:\x20APK\x20non\x20généré\x20après\x20signature','JDK','d8_diagnostics','\x0a===\x20Conversion\x20en\x20DEX\x20===','Répertoire\x20de\x20génération\x20vérifier:\x20','log','cwd','\x5cjavap\x22\x20-v\x20\x22','Chemin\x20de\x20sortie\x20APK:\x20','values','\x0a===\x205)\x20CONVERSION\x20EN\x20DEX\x20===','\x20(non\x20critique)','Avertissement:\x20impossible\x20de\x20créer\x20un\x20stub\x20d\x27activité:','utf8','Recompiling\x20Java\x20files\x20after\x20removing\x20generated\x20source','✓\x20Keystore\x20créé','⚠\x20Aucun\x20fichier\x20Java\x20trouvé','Impossible\x20d\x27extraire\x20la\x20classe\x20pour\x20diagnostic.','\x0a✓\x20Restauration\x20complète!','apksigner.bat','javac.exe','3988376DjWyTq','unsigned.zip','\x22\x20-C\x20\x22','\x22\x20sign\x20--ks\x20\x22','ia32','\x20-\x20les\x20logs\x20de\x20compilation\x20`javac`\x20pour\x20erreurs','execSync','\x20\x203.\x20Tous\x20les\x20dossiers\x20res/layout/,\x20res/values/,\x20res/mipmap*\x20existent-ils?','\x5cjar\x22\x20tf\x20\x22','\x0a⚠\x20Vérification\x20projet:\x20fichiers\x20minimaux\x20manquants\x20détectés:','res/values/strings.xml','filter',';\x0a\x0aimport\x20android.app.Activity;\x0aimport\x20android.os.Bundle;\x0a\x0apublic\x20class\x20','Compilation\x20de:\x20','copyFileSync','4HjAoTC','⚠\x20classes.dex\x20non\x20trouvé','resolve','38720907DCnebW','child_process','Chemin\x20attendu:\x20','endsWith','push','MyApp','generate-resources.js','Avertissement:\x20erreur\x20lors\x20de\x20la\x20génération\x20des\x20stubs\x20d\x27activité:','\x0a===\x20Signing\x20APK\x20===','join','\x0aERREUR\x20CRITIQUE:\x20R.java\x20n\x27a\x20pas\x20été\x20généré\x20par\x20aapt2\x20link!','utf-8','✓\x20Conversion\x20DEX\x20réussie\x20après\x20correction\x20automatique','unsigned.apk','\x20===','\x0a===\x204)\x20CRÉATION\x20DU\x20JAR\x20===','replace','264zjlgiD','\x20a\x20échoué','parse','\x22\x20compile\x20-o\x20\x22','\x20(fichier\x20en\x20cours\x20d\x27utilisation)','win','ERREUR:\x20aligned.apk\x20introuvable','\x20\x20</style>\x0a','android.jar','map','\x0aERREUR:\x20Certaines\x20activities\x20déclarées\x20dans\x20AndroidManifest.xml\x20sont\x20absentes\x20du\x20JAR:','aligned.apk','✓\x20Aucune\x20activity\x20déclarée\x20dans\x20le\x20manifest\x20à\x20vérifier.','51581SIFCat','Avertissement:\x20AndroidManifest.xml\x20introuvable\x20—\x20vérification\x20sautée','error','app-config.json\x20trouvé\x20dans:\x20','\x20--out\x20\x22','startsWith','\x20extends\x20Activity\x20{\x0a\x20\x20\x20\x20@Override\x0a\x20\x20\x20\x20protected\x20void\x20onCreate(Bundle\x20savedInstanceState)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20super.onCreate(savedInstanceState);\x0a\x20\x20\x20\x20}\x0a}\x0a','\x22\x20-I\x20\x22','.jpeg','platforms','AAPT2','ERREUR:\x20classes.jar\x20introuvable\x20—\x20impossible\x20de\x20vérifier\x20les\x20classes','✓\x20Vérification\x20des\x20activities:\x20toutes\x20les\x20activities\x20du\x20manifest\x20sont\x20présentes\x20dans\x20classes.jar','//\x20GENERATED_BY_generate-resources','Exécution:\x20','\x20\x201.\x20Les\x20fichiers\x20XML\x20dans\x20res/values/\x20sont-ils\x20valides?','res','readFileSync','\x22\x20--output\x20\x22','isArray','\x0a--\x20Ignoring\x20missing\x20files\x20due\x20to\x20--ignore-missing','⚠\x20Zipalign\x20échoué,\x20copie\x20directe\x20de\x20unsigned.apk','\x22\x20-f\x204\x20\x22','app-config.json','\x0a---\x20javap\x20verbose\x20---','jdk','android-34','argv','\x0aVérifications\x20à\x20faire:','classes','minimalRequiredFiles','\x0aERREUR:\x20Fichiers\x20minimaux\x20manquants.\x20Arrêt\x20du\x20build.','\x5cjavac\x22\x20--release\x208\x20-Xlint:-options\x20-cp\x20','existsSync','/classes','R.java','\x22\x20link\x20-o\x20\x22','\x0a✓\x20Build\x20terminé\x20avec\x20succès!','missingFiles','---\x0a','Package:\x20','readdirSync','Message\x20d\x27erreur:','packageName','\x0a===\x206)\x20AJOUT\x20DU\x20DEX\x20À\x20L\x27APK\x20===','\x5ckeytool\x22\x20-genkey\x20-noprompt\x20-alias\x20key\x20-dname\x20\x22CN=','\x22\x20--ks-pass\x20pass:123456\x20--min-sdk-version\x20','src','length','7za.exe','generated','\x0aUsage:','Recreating\x20JAR\x20after\x20recompilation','✓\x20Ressources\x20liées\x20avec\x20succès','size','activity','.9.png','✓\x20Keystore\x20existant\x20réutilisé:\x20','\x0a===\x20✓\x20COMPILATION\x20RÉUSSIE\x20===','inherit','package\x20','\x20\x20PROJECT_PATH=/chemin/vers/projet\x20node\x20build_apk.js','/layout/','\x20--no-backup','aapt2.exe','\x0aOptions:','\x0a===\x20','7zip-bin','android','✓\x20Supprimé:\x20','Dossier\x20MyApp\x20trouvé\x20par\x20défaut:\x20','.apk','8637496EWrJdB','\x22\x20--auto-add-overlay\x20\x22','PROJECT_PATH','\x22\x20-o\x22','.webp','env','warn','message','⚠\x20Impossible\x20de\x20supprimer\x20','cmd.exe','Création\x20du\x20JAR','✓\x20APK\x20signé\x20avec\x20succès','--ignore-missing','ERREUR\x20lors\x20de\x20la\x20vérification\x20des\x20classes\x20dans\x20le\x20JAR:','rmSync','ERREUR:\x20app-config.json\x20non\x20trouvé\x20dans\x20le\x20projet!','toFixed','mkdirSync','\x0a===\x203)\x20COMPILATION\x20DE\x20JAVA\x20===','✓\x20DEX\x20ajouté\x20à\x20l\x27APK','\x22\x20--java\x20\x22','\x22\x20\x22','\x22\x20.','Argument\x20CLI\x20détecté:\x20','/compiledResources\x22\x20\x22','Aligning\x20APK','\x0aCause\x20probable:\x20les\x20sources\x20Java\x20n\x27ont\x20pas\x20été\x20trouvées/compilées\x20ou\x20le\x20package\x20des\x20.java\x20ne\x20correspond\x20pas\x20au\x20manifest.','⚠\x20JAR\x20non\x20trouvé,\x20création\x20DEX\x20vide','match','Classe\x20problématique\x20détectée:\x20','140155LTfgzW','node\x20\x22','compiledResources','34.0.0','\x0a✓\x20Vérification\x20projet:\x20tous\x20les\x20fichiers\x20minimaux\x20présents','timeout\x20/t\x201\x20/nobreak','\x20\x202.\x20AndroidManifest.xml\x20est-il\x20bien\x20formé?','exit','now','ignore','\x20-\x20que\x20`generate-resources.js`\x20n\x27a\x20pas\x20supprimé\x20des\x20fichiers\x20importants','includes','classes.jar','\x22\x20--lib\x20\x22','\x22\x20e\x20-y\x20\x22','3438453NuBLtQ','\x20-d\x20\x22','<resources>\x0a','hasJava','🔄\x20Restauration\x20des\x20fichiers\x20depuis\x20le\x20backup...\x0a','\x20-\x20que\x20les\x20.java\x20existent\x20dans\x20`src/`\x20avec\x20le\x20bon\x20`package`\x20en\x20tête','isDirectory','ERREUR:\x20D8\x20échoue\x20encore\x20après\x20tentative\x20de\x20correction\x20automatique.','\x0a===\x20Compile\x20','android-sdk','statSync','path','writeFileSync','--no-backup'];_0x2770=function(){return _0x2a39f6;};return _0x2770();}process[_0x434724(0x18e)][0x2]&&(projectDir=path[_0x434724(0x154)](process[_0x434724(0x18e)][0x2]),console[_0x434724(0x133)](_0x434724(0xce)+projectDir));!projectDir&&process[_0x434724(0x1c0)][_0x434724(0x1bd)]&&(projectDir=path['resolve'](process[_0x434724(0x1c0)]['PROJECT_PATH']),console[_0x434724(0x133)](_0x434724(0x10d)+projectDir));if(!projectDir){let searchDir=process[_0x434724(0x134)]();for(let i=0x0;i<0x5;i++){const configPath=path[_0x434724(0x15e)](searchDir,_0x434724(0x18a));if(fs[_0x434724(0x194)](configPath)){projectDir=searchDir,console[_0x434724(0x133)](_0x434724(0x176)+projectDir);break;}searchDir=path[_0x434724(0x11e)](searchDir);}}if(!projectDir){const defaultPaths=[path[_0x434724(0x15e)](__dirname,'..','..',_0x434724(0x15a)),path[_0x434724(0x154)](_0x434724(0x15a)),path[_0x434724(0x15e)](process['env']['USERPROFILE']||process[_0x434724(0x1c0)][_0x434724(0x120)]||'',_0x434724(0x15a))];for(const checkPath of defaultPaths){if(checkPath&&fs[_0x434724(0x194)](checkPath)&&fs[_0x434724(0x194)](path[_0x434724(0x15e)](checkPath,_0x434724(0x18a)))){projectDir=checkPath,console[_0x434724(0x133)](_0x434724(0x1b9)+projectDir);break;}}}(!projectDir||!fs[_0x434724(0x194)](projectDir))&&(console[_0x434724(0x175)](_0x434724(0xf9)),console[_0x434724(0x175)](_0x434724(0x1a6)),console[_0x434724(0x175)](_0x434724(0xf3)),console[_0x434724(0x175)](_0x434724(0x1b0)),console[_0x434724(0x175)](_0x434724(0x1b4)),process['exit'](0x1));const buildToolsDir=__dirname,skipBackup=process[_0x434724(0x18e)][_0x434724(0xe0)](_0x434724(0xf1)),restoreFromBackup=process[_0x434724(0x18e)][_0x434724(0xe0)]('--restore');if(restoreFromBackup){console[_0x434724(0x133)](_0x434724(0xe8));try{execSync(_0x434724(0xd6)+path[_0x434724(0x15e)](buildToolsDir,_0x434724(0x15b))+_0x434724(0xcc)+projectDir+'\x22\x20--restore',{'stdio':'inherit','shell':_0x434724(0x1c4)}),console[_0x434724(0x133)](_0x434724(0x140)),process['exit'](0x0);}catch(_0xadc543){console[_0x434724(0x175)]('ERREUR:\x20Restauration\x20échouée'),process['exit'](0x1);}}const configPath=path[_0x434724(0x15e)](projectDir,_0x434724(0x18a));!fs['existsSync'](configPath)&&(console[_0x434724(0x175)](_0x434724(0x1ca)),process[_0x434724(0xdc)](0x1));const appConfig=JSON[_0x434724(0x168)](fs[_0x434724(0x184)](configPath,_0x434724(0x160)));console['log'](_0x434724(0x150)+appConfig['appName']+'\x20v'+appConfig['appVersion']),console['log'](_0x434724(0x19b)+appConfig[_0x434724(0x19e)]),console['log'](_0x434724(0x19a)),console[_0x434724(0x133)]('Génération\x20des\x20ressources\x20dynamiques...');const backupOption=skipBackup?_0x434724(0x1b2):'';try{execSync(_0x434724(0xd6)+path['join'](buildToolsDir,_0x434724(0x15b))+_0x434724(0xcc)+projectDir+'\x22'+backupOption,{'stdio':_0x434724(0x1ae)});}catch(_0x5e91fa){console[_0x434724(0x175)]('ERREUR:\x20Génération\x20des\x20ressources\x20échouée'),process[_0x434724(0xdc)](0x1);}console[_0x434724(0x133)](''),console[_0x434724(0x133)]('Génération\x20des\x20icônes\x20pour\x20les\x20différentes\x20densités...');try{execSync(_0x434724(0xd6)+path[_0x434724(0x15e)](buildToolsDir,'generate-icons.js')+_0x434724(0xcc)+projectDir+'\x22',{'stdio':_0x434724(0x1ae),'shell':'cmd.exe'});}catch(_0x3968d9){console['warn'](_0x434724(0x124)),console['warn']('Détail:\x20'+_0x3968d9[_0x434724(0x1c2)][_0x434724(0xf6)](0x0,0x64));}console[_0x434724(0x133)]('');const ignoreMissing=process['argv'][_0x434724(0xe0)](_0x434724(0x1c7)),failOnMissing=process[_0x434724(0x18e)][_0x434724(0xe0)](_0x434724(0x11b));function scanProjectForMissingFiles(_0x5d2306,_0xa02bf0){const _0x36d2bd=_0x434724,_0x3be1ff=_0xa02bf0&&Array[_0x36d2bd(0x186)](_0xa02bf0[_0x36d2bd(0x191)])?_0xa02bf0[_0x36d2bd(0x191)]:[_0x36d2bd(0xfd),_0x36d2bd(0x14d),_0x36d2bd(0x10e),'res/layout/activity_main.xml'],_0x404080=[];for(const _0x18634c of _0x3be1ff){const _0x30e345=path[_0x36d2bd(0x15e)](_0x5d2306,_0x18634c);if(!fs[_0x36d2bd(0x194)](_0x30e345))_0x404080[_0x36d2bd(0x159)](_0x18634c);}let _0x193365=![];const _0x484e3c=path[_0x36d2bd(0x15e)](_0x5d2306,_0x36d2bd(0x1a2));if(fs[_0x36d2bd(0x194)](_0x484e3c)){const _0x369405=[_0x484e3c];while(_0x369405['length']){const _0x4e96cc=_0x369405[_0x36d2bd(0x108)]();try{for(const _0x487636 of fs[_0x36d2bd(0x19c)](_0x4e96cc)){const _0x24647e=path['join'](_0x4e96cc,_0x487636),_0xd5649b=fs[_0x36d2bd(0xee)](_0x24647e);if(_0xd5649b[_0x36d2bd(0xea)]())_0x369405['push'](_0x24647e);else{if(_0x487636[_0x36d2bd(0x158)](_0x36d2bd(0x104))){_0x193365=!![];break;}}}}catch(_0x34190d){}if(_0x193365)break;}}return{'missingFiles':_0x404080,'hasJava':_0x193365};}const scanResult=scanProjectForMissingFiles(projectDir,appConfig);if(scanResult['missingFiles'][_0x434724(0x1a3)]>0x0){console[_0x434724(0x1c1)](_0x434724(0x14c));for(const m of scanResult[_0x434724(0x199)])console[_0x434724(0x1c1)]('\x20-\x20'+m);!ignoreMissing?failOnMissing?(console[_0x434724(0x175)](_0x434724(0x192)),process['exit'](0x1)):console['warn'](_0x434724(0x105)):console[_0x434724(0x133)](_0x434724(0x187));}else console['log'](_0x434724(0xd9));!scanResult[_0x434724(0xe7)]&&console[_0x434724(0x1c1)]('\x0a⚠\x20Aucune\x20source\x20Java\x20détectée\x20sous\x20`src/`\x20—\x20le\x20build\x20générera\x20des\x20stubs\x20ou\x20utilisera\x20les\x20fichiers\x20générés\x20par\x20aapt2\x20si\x20nécessaire.');const VENDOR_DIR=path[_0x434724(0x15e)](buildToolsDir,'vendor'),SDK=path[_0x434724(0x15e)](VENDOR_DIR,_0x434724(0x1b7),_0x434724(0xed)),JDK=path[_0x434724(0x15e)](VENDOR_DIR,_0x434724(0x1b7),_0x434724(0x18c),'bin'),AAPT2=path['join'](SDK,_0x434724(0x12d),_0x434724(0xd8),_0x434724(0x1b3)),ANDROID_JAR=path[_0x434724(0x15e)](SDK,_0x434724(0x17c),_0x434724(0x18d),_0x434724(0x16e)),D8=path[_0x434724(0x15e)](SDK,_0x434724(0x12d),'34.0.0','d8.bat'),ZIPALIGN=path['join'](SDK,_0x434724(0x12d),_0x434724(0xd8),'zipalign.exe'),APKSIGNER=path['join'](SDK,_0x434724(0x12d),_0x434724(0xd8),_0x434724(0x141)),SEVENZIP=path[_0x434724(0x15e)](VENDOR_DIR,_0x434724(0x1b6),_0x434724(0x16b),_0x434724(0x147),_0x434724(0x1a4)),requiredTools=[{'name':_0x434724(0x17d),'path':AAPT2},{'name':_0x434724(0x100),'path':ANDROID_JAR},{'name':'D8','path':D8},{'name':_0x434724(0x11f),'path':ZIPALIGN},{'name':_0x434724(0xf4),'path':APKSIGNER},{'name':_0x434724(0x107),'path':SEVENZIP},{'name':_0x434724(0x12f),'path':path[_0x434724(0x15e)](JDK,_0x434724(0x142))}];for(const tool of requiredTools){!fs[_0x434724(0x194)](tool[_0x434724(0xef)])&&(console['error']('\x0aERREUR:\x20'+tool[_0x434724(0x114)]+'\x20non\x20trouvé\x20à:\x20'+tool[_0x434724(0xef)]),console[_0x434724(0x175)]('Vérifiez\x20que\x20le\x20SDK\x20Android\x20et\x20JDK\x20sont\x20correctement\x20installés.'),process['exit'](0x1));}const BUILD_DIR=path[_0x434724(0x15e)](projectDir,'build'),SRC_DIR=path[_0x434724(0x15e)](projectDir,_0x434724(0x1a2)),RES_DIR=path[_0x434724(0x15e)](projectDir,_0x434724(0x183));function run(_0x16287b,_0x46898d,_0x38ea70=projectDir){const _0x23d300=_0x434724;console[_0x23d300(0x133)](_0x23d300(0x1b5)+_0x46898d+'\x20===');try{const _0x227266=execSync(_0x16287b,{'cwd':_0x38ea70,'stdio':'inherit','shell':_0x23d300(0x1c4)});return!![];}catch(_0x292b76){console[_0x23d300(0x175)]('ERREUR:\x20'+_0x46898d+_0x23d300(0x167)),process[_0x23d300(0xdc)](0x1);}}function copyFile(_0x2d0b97,_0x1a2d02){const _0x29604e=_0x434724,_0x58eaac=path['dirname'](_0x1a2d02);!fs[_0x29604e(0x194)](_0x58eaac)&&fs[_0x29604e(0x1cc)](_0x58eaac,{'recursive':!![]}),fs[_0x29604e(0x151)](_0x2d0b97,_0x1a2d02);}function removeDir(_0x2390dd){const _0x5ee191=_0x434724;fs['existsSync'](_0x2390dd)&&fs[_0x5ee191(0x1c9)](_0x2390dd,{'recursive':!![],'force':!![]});}function makeDir(_0xdb35af){const _0x5a4803=_0x434724;!fs[_0x5a4803(0x194)](_0xdb35af)&&fs['mkdirSync'](_0xdb35af,{'recursive':!![]});}const APK_NAME=path[_0x434724(0x15e)](projectDir,appConfig[_0x434724(0x10c)][_0x434724(0x165)](/\s+/g,'')+_0x434724(0x1ba));console['log']('Nettoyage\x20complet\x20de\x20tous\x20les\x20fichiers\x20générés...'),removeDir(BUILD_DIR);if(fs['existsSync'](APK_NAME))try{fs[_0x434724(0x129)](APK_NAME),console['log'](_0x434724(0x1b8)+APK_NAME);}catch(_0x263f97){console['warn'](_0x434724(0x1c3)+APK_NAME+_0x434724(0x16a));}const keystoreName=appConfig[_0x434724(0x10c)]['replace'](/\s+/g,'')+'.keystore';console[_0x434724(0x133)]('✓\x20Structure\x20de\x20build\x20recréée\x0a'),makeDir(BUILD_DIR),makeDir(BUILD_DIR+_0x434724(0x195)),makeDir(BUILD_DIR+_0x434724(0x106));const stylesDir=path['join'](projectDir,_0x434724(0x183),_0x434724(0x137)),stylesPath=path[_0x434724(0x15e)](stylesDir,_0x434724(0x102));try{!fs[_0x434724(0x194)](stylesDir)&&fs[_0x434724(0x1cc)](stylesDir,{'recursive':!![]});if(!fs[_0x434724(0x194)](stylesPath)){const defaultStyles='<?xml\x20version=\x221.0\x22\x20encoding=\x22utf-8\x22?>\x0a'+_0x434724(0xe6)+'\x20\x20<style\x20name=\x22AppTheme\x22\x20parent=\x22android:Theme.DeviceDefault.Light.DarkActionBar\x22>\x0a'+_0x434724(0x16d)+'</resources>\x0a';fs[_0x434724(0xf0)](stylesPath,defaultStyles,'utf8'),console['log']('✓\x20styles.xml\x20par\x20défaut\x20créé\x20pour\x20éviter\x20les\x20erreurs\x20de\x20thème');}}catch(_0x33533a){console['warn']('Avertissement:\x20impossible\x20de\x20créer\x20styles.xml\x20par\x20défaut:',_0x33533a[_0x434724(0x1c2)]);}console[_0x434724(0x133)](_0x434724(0x122));const layoutFiles=fs[_0x434724(0x194)](path[_0x434724(0x15e)](RES_DIR,_0x434724(0x110)))?fs[_0x434724(0x19c)](path['join'](RES_DIR,'layout'))[_0x434724(0x14e)](_0x4ac8de=>_0x4ac8de[_0x434724(0x158)](_0x434724(0x123))):[],valueFiles=fs[_0x434724(0x194)](path[_0x434724(0x15e)](RES_DIR,_0x434724(0x137)))?fs[_0x434724(0x19c)](path[_0x434724(0x15e)](RES_DIR,_0x434724(0x137)))['filter'](_0x72b0d5=>_0x72b0d5['endsWith']('.xml')):[],allResources=[];for(const file of layoutFiles){console[_0x434724(0x133)](_0x434724(0xec)+path['join'](RES_DIR,_0x434724(0x110),file)+_0x434724(0x163));const cmd='\x22'+AAPT2+'\x22\x20compile\x20-o\x20\x22'+BUILD_DIR+_0x434724(0xcf)+path[_0x434724(0x15e)](RES_DIR,_0x434724(0x110),file)+'\x22';try{execSync(cmd,{'stdio':_0x434724(0x1ae),'shell':_0x434724(0x1c4)});}catch(_0xe69d6c){console['error'](_0x434724(0x11c)+file+_0x434724(0xf2));}allResources[_0x434724(0x159)](RES_DIR+_0x434724(0x1b1)+file);}for(const file of valueFiles){console['log'](_0x434724(0xec)+path[_0x434724(0x15e)](RES_DIR,_0x434724(0x137),file)+'\x20===');const cmd='\x22'+AAPT2+_0x434724(0x169)+BUILD_DIR+_0x434724(0xcf)+path[_0x434724(0x15e)](RES_DIR,_0x434724(0x137),file)+'\x22';try{execSync(cmd,{'stdio':_0x434724(0x1ae),'shell':'cmd.exe'});}catch(_0x3c23a7){console[_0x434724(0x175)](_0x434724(0x11c)+file+_0x434724(0xf2));}allResources[_0x434724(0x159)](RES_DIR+_0x434724(0x113)+file);}for(let mimapDir of fs[_0x434724(0x19c)](RES_DIR)[_0x434724(0x14e)](_0x4ba701=>_0x4ba701[_0x434724(0x178)]('mipmap'))){const mimapPath=path['join'](RES_DIR,mimapDir);if(fs[_0x434724(0xee)](mimapPath)['isDirectory']()){const files=fs[_0x434724(0x19c)](mimapPath)['filter'](_0x5463d8=>_0x5463d8[_0x434724(0x158)](_0x434724(0x111)));for(const file of files){console[_0x434724(0x133)](_0x434724(0xec)+path[_0x434724(0x15e)](mimapDir,file)+_0x434724(0x163));const cmd='\x22'+AAPT2+'\x22\x20compile\x20-o\x20\x22'+BUILD_DIR+_0x434724(0xcf)+path['join'](mimapPath,file)+'\x22';try{execSync(cmd,{'stdio':_0x434724(0x1ae),'shell':_0x434724(0x1c4)});}catch(_0x1711e8){console['error']('Avertissement:\x20Compilation\x20de\x20'+file+_0x434724(0xf2));}}}}console[_0x434724(0x133)]('\x0a===\x20Compile\x20récursif\x20des\x20ressources\x20restantes\x20===');const resourceExtensions=[_0x434724(0x123),_0x434724(0x111),'.jpg',_0x434724(0x17b),_0x434724(0x1bf),_0x434724(0x1ab)];function _0x26e4(_0x17ec2e,_0x4b0668){const _0x27700a=_0x2770();return _0x26e4=function(_0x26e48b,_0x347703){_0x26e48b=_0x26e48b-0xcb;let _0x4a2334=_0x27700a[_0x26e48b];return _0x4a2334;},_0x26e4(_0x17ec2e,_0x4b0668);}function walkDirForResources(_0x582f10){const _0x31960e=_0x434724,_0x2eec54=[];if(!fs[_0x31960e(0x194)](_0x582f10))return _0x2eec54;const _0x3851cb=fs['readdirSync'](_0x582f10);for(const _0x86f03f of _0x3851cb){const _0x3ac5f9=path[_0x31960e(0x15e)](_0x582f10,_0x86f03f),_0x3493a1=fs['statSync'](_0x3ac5f9);if(_0x3493a1[_0x31960e(0xea)]())_0x2eec54[_0x31960e(0x159)](...walkDirForResources(_0x3ac5f9));else{const _0x3ac3c9=path[_0x31960e(0x125)](_0x86f03f)['toLowerCase']();(resourceExtensions[_0x31960e(0xe0)](_0x3ac3c9)||_0x86f03f['endsWith'](_0x31960e(0x1ab)))&&_0x2eec54[_0x31960e(0x159)](_0x3ac5f9);}}return _0x2eec54;}const allResFiles=walkDirForResources(RES_DIR);for(const resFile of allResFiles){console['log'](_0x434724(0xec)+resFile+_0x434724(0x163));const compileCmd='\x22'+AAPT2+'\x22\x20compile\x20-o\x20\x22'+path[_0x434724(0x15e)](BUILD_DIR,_0x434724(0xd7))+_0x434724(0xcc)+resFile+'\x22';try{execSync(compileCmd,{'stdio':_0x434724(0x1ae),'shell':_0x434724(0x1c4)});}catch(_0x31a59c){console[_0x434724(0x1c1)]('Avertissement:\x20impossible\x20de\x20compiler\x20'+resFile+_0x434724(0x139));}}console['log'](_0x434724(0x101));const apkPath=path['join'](BUILD_DIR,_0x434724(0x144)),resourcesDir=path['join'](BUILD_DIR,'compiledResources'),generatedDir=path[_0x434724(0x154)](BUILD_DIR,_0x434724(0x1a5));if(!fs[_0x434724(0x194)](resourcesDir))fs['mkdirSync'](resourcesDir,{'recursive':!![]});if(!fs[_0x434724(0x194)](generatedDir))fs['mkdirSync'](generatedDir,{'recursive':!![]});const compiledFiles=fs[_0x434724(0x19c)](resourcesDir)[_0x434724(0x14e)](_0x4ed70c=>_0x4ed70c[_0x434724(0x158)]('.flat')||_0x4ed70c[_0x434724(0x158)]('.zip'))['map'](_0x313705=>path['join'](resourcesDir,_0x313705));console['log']('Création\x20de\x20la\x20structure\x20APK\x20et\x20génération\x20de\x20R.java...');try{let linkCmd;const manifestPath=path[_0x434724(0x15e)](projectDir,_0x434724(0xfd));if(compiledFiles[_0x434724(0x1a3)]>0x0){const compiledArgs=compiledFiles[_0x434724(0x16f)](_0x1a6cd6=>'\x22'+_0x1a6cd6+'\x22')[_0x434724(0x15e)]('\x20');linkCmd='\x22'+AAPT2+_0x434724(0x197)+apkPath+'\x22\x20-I\x20\x22'+ANDROID_JAR+'\x22\x20--manifest\x20\x22'+manifestPath+'\x22\x20--java\x20\x22'+generatedDir+'\x22\x20'+compiledArgs;}else linkCmd='\x22'+AAPT2+'\x22\x20link\x20-o\x20\x22'+apkPath+_0x434724(0x17a)+ANDROID_JAR+_0x434724(0x12b)+manifestPath+_0x434724(0xcb)+generatedDir+_0x434724(0x1bc)+path[_0x434724(0x15e)](projectDir,'res')+'\x22';console[_0x434724(0x133)](_0x434724(0x181)+linkCmd[_0x434724(0xf6)](0x0,0x64)+'...'),execSync(linkCmd,{'stdio':_0x434724(0x1ae),'shell':'cmd.exe'}),console[_0x434724(0x133)](_0x434724(0x1a8));}catch(_0x5bcb06){console['error'](_0x434724(0xfb)),console[_0x434724(0x175)](_0x434724(0x19d),_0x5bcb06[_0x434724(0x1c2)][_0x434724(0xf6)](0x0,0xc8)),process['exit'](0x1);}function findRJava(){const _0x1b4a4a=[];try{const _0x29caad=_0xcf5dad=>{const _0x58e361=_0x26e4,_0x49b06e=fs['readdirSync'](_0xcf5dad);for(const _0x528c55 of _0x49b06e){const _0x5cf883=path[_0x58e361(0x15e)](_0xcf5dad,_0x528c55),_0x1af0f5=fs[_0x58e361(0xee)](_0x5cf883);if(_0x1af0f5['isDirectory']())_0x29caad(_0x5cf883);else _0x528c55===_0x58e361(0x196)&&_0x1b4a4a[_0x58e361(0x159)](_0x5cf883);}};_0x29caad(generatedDir);}catch(_0x2b4caf){}return _0x1b4a4a;}const rJavaFiles=findRJava();rJavaFiles['length']===0x0&&(console[_0x434724(0x175)](_0x434724(0x15f)),console[_0x434724(0x175)](_0x434724(0x132)+generatedDir),console[_0x434724(0x175)]('Cause\x20possible:\x20fichiers\x20res/\x20mal\x20structurés,\x20XML\x20invalides,\x20ou\x20manifest\x20corrompu.'),console['error'](_0x434724(0x18f)),console[_0x434724(0x175)](_0x434724(0x182)),console[_0x434724(0x175)](_0x434724(0xdb)),console[_0x434724(0x175)](_0x434724(0x14a)),console[_0x434724(0x175)]('\x0aBuild\x20échouée\x20-\x20APK\x20n\x27est\x20pas\x20généré.'),process[_0x434724(0xdc)](0x1));console[_0x434724(0x133)](_0x434724(0x128)+rJavaFiles[0x0]),console[_0x434724(0x133)](_0x434724(0x1cd));const javaFiles=[],srcPath=SRC_DIR,findJavaFiles=_0x57b820=>{const _0x5b0f2c=_0x434724,_0x28f449=fs['readdirSync'](_0x57b820);for(const _0x5ab7b3 of _0x28f449){const _0x156ac2=path[_0x5b0f2c(0x15e)](_0x57b820,_0x5ab7b3),_0x1ee80e=fs[_0x5b0f2c(0xee)](_0x156ac2);if(_0x1ee80e[_0x5b0f2c(0xea)]())findJavaFiles(_0x156ac2);else _0x5ab7b3[_0x5b0f2c(0x158)](_0x5b0f2c(0x104))&&javaFiles[_0x5b0f2c(0x159)](_0x156ac2);}};fs[_0x434724(0x194)](srcPath)&&findJavaFiles(srcPath);const generatedJavaDir=path[_0x434724(0x15e)](BUILD_DIR,_0x434724(0x1a5));if(fs['existsSync'](generatedJavaDir)){const findGeneratedJavaFiles=_0x223307=>{const _0x44058f=_0x434724,_0x315613=[],_0x84a0b=fs[_0x44058f(0x19c)](_0x223307);for(const _0x5e1db5 of _0x84a0b){const _0xb52772=path['join'](_0x223307,_0x5e1db5),_0x1f8b91=fs[_0x44058f(0xee)](_0xb52772);if(_0x1f8b91['isDirectory']())_0x315613[_0x44058f(0x159)](...findGeneratedJavaFiles(_0xb52772));else _0x5e1db5['endsWith'](_0x44058f(0x104))&&_0x315613[_0x44058f(0x159)](_0xb52772);}return _0x315613;};try{const genFiles=findGeneratedJavaFiles(generatedJavaDir);genFiles[_0x434724(0x1a3)]>0x0&&(javaFiles['push'](...genFiles),console['log']('✓\x20'+genFiles[_0x434724(0x1a3)]+'\x20fichiers\x20Java\x20générés\x20par\x20aapt2\x20ajoutés\x20à\x20la\x20compilation'));}catch(_0x5e78cf){console['warn'](_0x434724(0x118),_0x5e78cf['message']);}}function ensureActivityStubs(){const _0x13047a=_0x434724;try{const _0x359096=path['join'](projectDir,'AndroidManifest.xml');if(!fs[_0x13047a(0x194)](_0x359096))return;const _0xe8bf08=fs[_0x13047a(0x184)](_0x359096,'utf8'),_0xe2a6f=_0xe8bf08[_0x13047a(0xd3)](/<manifest[^>]*\spackage\s*=\s*['"]([^'"]+)['"]/),_0x5f593c=_0xe2a6f?_0xe2a6f[0x1]:null,_0x365efa=/<activity[^>]*android:name\s*=\s*['\"]([^'\"]+)['\"]/g;let _0x3024c0;const _0x521059=new Set();while((_0x3024c0=_0x365efa[_0x13047a(0xff)](_0xe8bf08))!==null){_0x521059['add'](_0x3024c0[0x1]);}if(_0x521059[_0x13047a(0x1a9)]===0x0)return;const _0x376b1d=path['join'](BUILD_DIR,_0x13047a(0x1a5));if(!fs[_0x13047a(0x194)](_0x376b1d))fs['mkdirSync'](_0x376b1d,{'recursive':!![]});for(const _0x2495cd of _0x521059){let _0x586109=_0x2495cd;if(_0x2495cd[_0x13047a(0x178)]('.')){if(_0x5f593c)_0x586109=_0x5f593c+_0x2495cd;}else!_0x2495cd['includes']('.')&&_0x5f593c&&(_0x586109=_0x5f593c+'.'+_0x2495cd);const _0x32a838=_0x586109[_0x13047a(0x11a)]('.'),_0x35d09a=_0x32a838[_0x13047a(0x108)](),_0x5b2bd7=_0x32a838[_0x13047a(0x15e)](path[_0x13047a(0xf5)]),_0xbf70fd=path[_0x13047a(0x15e)](_0x376b1d,_0x5b2bd7);if(!fs[_0x13047a(0x194)](_0xbf70fd))fs[_0x13047a(0x1cc)](_0xbf70fd,{'recursive':!![]});const _0x5d7ede=path['join'](_0xbf70fd,_0x35d09a+_0x13047a(0x104));if(!fs['existsSync'](_0x5d7ede)){const _0x412a04=_0x13047a(0x1af)+_0x32a838[_0x13047a(0x15e)]('.')+_0x13047a(0x14f)+_0x35d09a+_0x13047a(0x179);try{fs[_0x13047a(0xf0)](_0x5d7ede,_0x412a04,_0x13047a(0x13b)),console[_0x13047a(0x133)](_0x13047a(0x117)+_0x5d7ede);}catch(_0x2f7fea){console[_0x13047a(0x1c1)](_0x13047a(0x13a),_0x2f7fea[_0x13047a(0x1c2)]);}}javaFiles[_0x13047a(0x159)](_0x5d7ede);}}catch(_0x5caca6){console[_0x13047a(0x1c1)](_0x13047a(0x15c),_0x5caca6[_0x13047a(0x1c2)]);}}javaFiles[_0x434724(0x1a3)]===0x0&&(console[_0x434724(0x1c1)](_0x434724(0x10f)),ensureActivityStubs());if(javaFiles[_0x434724(0x1a3)]===0x0)console[_0x434724(0x1c1)](_0x434724(0x13e));else{const classPath='\x22'+ANDROID_JAR+'\x22',javaFilesStr=javaFiles[_0x434724(0x16f)](_0x58ce53=>'\x22'+_0x58ce53+'\x22')[_0x434724(0x15e)]('\x20'),compileCmd='\x22'+JDK+_0x434724(0x193)+classPath+_0x434724(0xe5)+path['join'](BUILD_DIR,_0x434724(0x190))+'\x22\x20'+javaFilesStr;run(compileCmd,_0x434724(0x12a));}console[_0x434724(0x133)](_0x434724(0x164));const classesDir=path[_0x434724(0x15e)](BUILD_DIR,_0x434724(0x190)),jarPath=path[_0x434724(0x15e)](BUILD_DIR,_0x434724(0xe1));if(fs[_0x434724(0x194)](classesDir)){const jarCmd='\x22'+JDK+'\x5cjar\x22\x20cvf\x20\x22'+jarPath+_0x434724(0x145)+classesDir+_0x434724(0xcd);run(jarCmd,_0x434724(0x1c5));}else console[_0x434724(0x1c1)](_0x434724(0x10b));function checkManifestClassesPresentInJar(){const _0x5bdce2=_0x434724;try{!fs[_0x5bdce2(0x194)](jarPath)&&(console[_0x5bdce2(0x175)](_0x5bdce2(0x17e)),process[_0x5bdce2(0xdc)](0x1));const _0x1805ca=path[_0x5bdce2(0x15e)](projectDir,_0x5bdce2(0xfd));if(!fs[_0x5bdce2(0x194)](_0x1805ca)){console[_0x5bdce2(0x1c1)](_0x5bdce2(0x174));return;}const _0x5d0afb=fs['readFileSync'](_0x1805ca,_0x5bdce2(0x13b)),_0x46ecf7=_0x5d0afb[_0x5bdce2(0xd3)](/<manifest[^>]*\spackage\s*=\s*['"]([^'\"]+)['"]/),_0x5872f8=_0x46ecf7?_0x46ecf7[0x1]:appConfig&&appConfig[_0x5bdce2(0x19e)]||null,_0x35654c=/<activity[^>]*android:name\s*=\s*['\"]([^'\"]+)['\"]/g;let _0x1ecb4d;const _0x5d7d9a=[];while((_0x1ecb4d=_0x35654c[_0x5bdce2(0xff)](_0x5d0afb))!==null){let _0x564936=_0x1ecb4d[0x1];if(_0x564936[_0x5bdce2(0x178)]('.')){if(_0x5872f8)_0x564936=_0x5872f8+_0x564936;}else!_0x564936[_0x5bdce2(0xe0)]('.')&&_0x5872f8&&(_0x564936=_0x5872f8+'.'+_0x564936);_0x5d7d9a['push'](_0x564936);}if(_0x5d7d9a[_0x5bdce2(0x1a3)]===0x0){console[_0x5bdce2(0x133)](_0x5bdce2(0x172));return;}const _0x29f806=execSync('\x22'+JDK+_0x5bdce2(0x14b)+jarPath+'\x22',{'encoding':_0x5bdce2(0x13b),'stdio':[_0x5bdce2(0x103),_0x5bdce2(0x103),_0x5bdce2(0xde)]}),_0x34b2a3=[];for(const _0xb12943 of _0x5d7d9a){const _0x3e4a0b=_0xb12943[_0x5bdce2(0x165)](/\./g,'/')+'.class';!_0x29f806[_0x5bdce2(0xe0)](_0x3e4a0b)&&_0x34b2a3['push']({'activity':_0xb12943,'expected':_0x3e4a0b});}if(_0x34b2a3['length']>0x0){console[_0x5bdce2(0x175)](_0x5bdce2(0x170));for(const _0x2a4340 of _0x34b2a3){console[_0x5bdce2(0x175)]('\x20-\x20'+_0x2a4340[_0x5bdce2(0x1aa)]+_0x5bdce2(0xf7)+_0x2a4340['expected']+')');}console[_0x5bdce2(0x175)](_0x5bdce2(0xd1)),console['error']('Vérifiez:'),console['error'](_0x5bdce2(0xe9)),console[_0x5bdce2(0x175)](_0x5bdce2(0xdf)),console['error'](_0x5bdce2(0x148)),process[_0x5bdce2(0xdc)](0x1);}console[_0x5bdce2(0x133)](_0x5bdce2(0x17f));}catch(_0x5ca2ca){console[_0x5bdce2(0x175)](_0x5bdce2(0x1c8),_0x5ca2ca['message']),process[_0x5bdce2(0xdc)](0x1);}}checkManifestClassesPresentInJar(),console[_0x434724(0x133)](_0x434724(0x138));const dexPath=path['join'](BUILD_DIR,'classes.dex');if(fs[_0x434724(0x194)](jarPath)){const d8Cmd='\x22'+D8+_0x434724(0xe2)+ANDROID_JAR+_0x434724(0x185)+BUILD_DIR+_0x434724(0xcc)+jarPath+'\x22';console[_0x434724(0x133)](_0x434724(0x131));try{execSync(d8Cmd,{'stdio':'inherit','shell':_0x434724(0x1c4)}),console['log']('✓\x20Conversion\x20DEX\x20réussie');}catch(_0x617dee){const msg=_0x617dee&&_0x617dee['message']?_0x617dee[_0x434724(0x1c2)]:String(_0x617dee),classMatch=msg['match'](/([^:\s]+\.jar):([^:\s]+\.class)/);let problematicClassEntry=null;if(classMatch)problematicClassEntry=classMatch[0x2][_0x434724(0x165)](/\\\\/g,'/');else{const alt=msg[_0x434724(0xd3)](/(com\/[\w\/-]*\$?[^\s:]*\.class)/);if(alt)problematicClassEntry=alt[0x1];}console[_0x434724(0x175)]('\x0aERREUR:\x20D8\x20a\x20échoué\x20lors\x20de\x20la\x20conversion\x20en\x20DEX.');if(problematicClassEntry){console[_0x434724(0x175)](_0x434724(0xd4)+problematicClassEntry);try{const tmpDir=path['join'](BUILD_DIR,_0x434724(0x130));if(!fs['existsSync'](tmpDir))fs[_0x434724(0x1cc)](tmpDir,{'recursive':!![]});const extractCmd='\x22'+SEVENZIP+_0x434724(0xe3)+jarPath+_0x434724(0xcc)+problematicClassEntry+_0x434724(0x1be)+tmpDir+'\x22';try{execSync(extractCmd,{'stdio':'inherit','shell':'cmd.exe'});}catch(_0x38cae8){try{execSync('\x22'+SEVENZIP+'\x22\x20e\x20-y\x20\x22'+jarPath+'\x22\x20\x22*'+path['basename'](problematicClassEntry)+_0x434724(0x1be)+tmpDir+'\x22',{'stdio':_0x434724(0x1ae),'shell':_0x434724(0x1c4)});}catch(_0x5d9910){}}const extracted=path['join'](tmpDir,path[_0x434724(0x127)](problematicClassEntry));if(fs[_0x434724(0x194)](extracted)){console[_0x434724(0x133)]('\x0a✓\x20Classe\x20extraite\x20pour\x20diagnostic:\x20'+extracted);try{const javapCmd='\x22'+JDK+_0x434724(0x135)+extracted+'\x22';console[_0x434724(0x133)](_0x434724(0x18b)),execSync(javapCmd,{'stdio':_0x434724(0x1ae),'shell':'cmd.exe'}),console[_0x434724(0x133)]('---\x20fin\x20javap\x20---\x0a');}catch(_0x4a1229){console[_0x434724(0x1c1)]('Impossible\x20d\x27exécuter\x20javap\x20sur\x20la\x20classe\x20extraite:',_0x4a1229[_0x434724(0x1c2)]);}}else console[_0x434724(0x1c1)](_0x434724(0x13f));}catch(_0x3fe905){console[_0x434724(0x1c1)]('Erreur\x20durant\x20le\x20diagnostic\x20D8:',_0x3fe905[_0x434724(0x1c2)]);}}try{if(problematicClassEntry){const classPathNoDollar=problematicClassEntry[_0x434724(0x11a)]('$')[0x0],javaPath=path[_0x434724(0x15e)](projectDir,_0x434724(0x1a2),classPathNoDollar[_0x434724(0x165)](/\//g,path[_0x434724(0xf5)])+'.java');if(fs[_0x434724(0x194)](javaPath)){const content=fs[_0x434724(0x184)](javaPath,_0x434724(0x13b));if(content[_0x434724(0xe0)](_0x434724(0x180))){console['log']('\x0aTentative:\x20fichier\x20source\x20généré\x20détecté.\x20Suppression\x20et\x20recompilation.'),fs['unlinkSync'](javaPath),removeDir(path[_0x434724(0x15e)](BUILD_DIR,_0x434724(0x190))),makeDir(path[_0x434724(0x15e)](BUILD_DIR,_0x434724(0x190)));const javaFilesNow=[],findJavaFilesLocal=_0x537323=>{const _0x311c27=_0x434724,_0x41719a=fs[_0x311c27(0x19c)](_0x537323);for(const _0x5bffd2 of _0x41719a){const _0x523209=path['join'](_0x537323,_0x5bffd2),_0x208ab6=fs['statSync'](_0x523209);if(_0x208ab6[_0x311c27(0xea)]())findJavaFilesLocal(_0x523209);else{if(_0x5bffd2[_0x311c27(0x158)](_0x311c27(0x104)))javaFilesNow[_0x311c27(0x159)](_0x523209);}}};if(fs[_0x434724(0x194)](srcPath))findJavaFilesLocal(srcPath);if(fs[_0x434724(0x194)](path['join'](BUILD_DIR,_0x434724(0x1a5))))findJavaFilesLocal(path[_0x434724(0x15e)](BUILD_DIR,_0x434724(0x1a5)));if(javaFilesNow[_0x434724(0x1a3)]>0x0){const classPathArg='\x22'+ANDROID_JAR+'\x22',javaFilesStr2=javaFilesNow['map'](_0x351155=>'\x22'+_0x351155+'\x22')[_0x434724(0x15e)]('\x20'),compileCmd2='\x22'+JDK+_0x434724(0x193)+classPathArg+'\x20-d\x20\x22'+path[_0x434724(0x15e)](BUILD_DIR,_0x434724(0x190))+'\x22\x20'+javaFilesStr2;run(compileCmd2,_0x434724(0x13c));const jarCmd2='\x22'+JDK+_0x434724(0x121)+jarPath+_0x434724(0x145)+classesDir+_0x434724(0xcd);run(jarCmd2,_0x434724(0x1a7));try{execSync(d8Cmd,{'stdio':_0x434724(0x1ae),'shell':'cmd.exe'}),console[_0x434724(0x133)](_0x434724(0x161));}catch(_0x81de93){console[_0x434724(0x175)](_0x434724(0xeb)),process[_0x434724(0xdc)](0x1);}}else console[_0x434724(0x1c1)](_0x434724(0x112)),process[_0x434724(0xdc)](0x1);}else console['warn'](_0x434724(0x115));}else console[_0x434724(0x1c1)]('Fichier\x20source\x20Java\x20correspondant\x20introuvable:\x20'+javaPath);}}catch(_0x398e81){console[_0x434724(0x1c1)](_0x434724(0x119),_0x398e81[_0x434724(0x1c2)]);}process[_0x434724(0xdc)](0x1);}}else console[_0x434724(0x1c1)](_0x434724(0xd2));console[_0x434724(0x133)](_0x434724(0x19f));try{if(fs[_0x434724(0x194)](dexPath)){const unsignedApkFull=path['resolve'](BUILD_DIR,path[_0x434724(0x127)](apkPath)),classesDexFull=path[_0x434724(0x154)](dexPath),addDexCmd='\x22'+SEVENZIP+_0x434724(0x109)+unsignedApkFull+'\x22\x20\x22'+classesDexFull+'\x22';execSync(addDexCmd,{'cwd':path[_0x434724(0x154)](BUILD_DIR),'stdio':_0x434724(0x1ae),'shell':'cmd.exe','timeout':0xea60}),console[_0x434724(0x133)](_0x434724(0x1ce));}else console[_0x434724(0x1c1)](_0x434724(0x153));}catch(_0x3b25b5){console[_0x434724(0x175)]('ERREUR:\x20Ajout\x20du\x20DEX\x20échoué:\x20'+_0x3b25b5[_0x434724(0x1c2)]),process['exit'](0x1);}console['log']('\x0a===\x207)\x20ALIGNEMENT\x20DE\x20L\x27APK\x20===');const alignedApkPath=path['join'](BUILD_DIR,_0x434724(0x171)),unsignedApkPath=path['join'](BUILD_DIR,_0x434724(0x162));fs['existsSync'](apkPath)&&fs[_0x434724(0x11d)](apkPath,unsignedApkPath);try{run('\x22'+ZIPALIGN+_0x434724(0x189)+unsignedApkPath+_0x434724(0xcc)+alignedApkPath+'\x22',_0x434724(0xd0));}catch(_0x184d45){console[_0x434724(0x1c1)](_0x434724(0x188)),fs['copyFileSync'](unsignedApkPath,alignedApkPath);}console[_0x434724(0x133)]('\x0a===\x208)\x20SIGNATURE\x20DE\x20L\x27APK\x20===');const keystorePath=path['join'](projectDir,keystoreName);if(!fs[_0x434724(0x194)](keystorePath)){console[_0x434724(0x133)]('Création\x20du\x20keystore...');const keygenCmd='\x22'+JDK+_0x434724(0x1a0)+appConfig['appName']+_0x434724(0xfa)+keystorePath+_0x434724(0xfc);try{execSync(keygenCmd,{'cwd':projectDir,'stdio':'pipe','shell':_0x434724(0x1c4)}),console[_0x434724(0x133)](_0x434724(0x13d));}catch(_0x3137c8){console[_0x434724(0x175)]('ERREUR:\x20Impossible\x20de\x20créer\x20le\x20keystore'),process[_0x434724(0xdc)](0x1);}}else console[_0x434724(0x133)](_0x434724(0x1ac)+keystorePath);if(fs[_0x434724(0x194)](alignedApkPath)){const minSdkVersion=appConfig[_0x434724(0x12c)]||0x15,signCmd='\x22'+APKSIGNER+_0x434724(0x146)+keystorePath+_0x434724(0x1a1)+minSdkVersion+_0x434724(0x177)+APK_NAME+'\x22\x20\x22'+alignedApkPath+'\x22';console[_0x434724(0x133)](_0x434724(0x15d)),console[_0x434724(0x133)]('Commande:\x20'+signCmd),console[_0x434724(0x133)](_0x434724(0x136)+APK_NAME);try{const output=execSync(signCmd,{'cwd':projectDir,'stdio':_0x434724(0x103),'shell':'cmd.exe','encoding':'utf-8'});console[_0x434724(0x133)](_0x434724(0x1c6));}catch(_0x21ae02){console['log'](_0x434724(0x126)),console[_0x434724(0x133)]('Détails:\x20'+_0x21ae02[_0x434724(0x1c2)][_0x434724(0xf6)](0x0,0xc8));}const maxWait=0xbb8,startWait=Date['now']();while(!fs['existsSync'](APK_NAME)&&Date[_0x434724(0xdd)]()-startWait<maxWait){require(_0x434724(0x156))[_0x434724(0x149)](_0x434724(0xda),{'shell':_0x434724(0x1c4)});}if(fs[_0x434724(0x194)](APK_NAME)){const stats=fs[_0x434724(0xee)](APK_NAME),endTime=Date[_0x434724(0xdd)](),buildTime=((endTime-startTime)/0x3e8)[_0x434724(0x1cb)](0x2);console[_0x434724(0x133)](_0x434724(0x1ad)),console[_0x434724(0x133)](_0x434724(0x116)+APK_NAME),console[_0x434724(0x133)]('Taille:\x20'+stats[_0x434724(0x1a9)]+_0x434724(0xfe)),console['log']('Temps\x20de\x20build:\x20'+buildTime+'s'),console[_0x434724(0x133)](_0x434724(0x198));}else console['error'](_0x434724(0x12e)),console[_0x434724(0x175)](_0x434724(0x157)+APK_NAME),console['error']('Fichiers\x20dans\x20le\x20répertoire:',fs[_0x434724(0x19c)](projectDir)[_0x434724(0x14e)](_0x4ed6f2=>_0x4ed6f2[_0x434724(0x158)](_0x434724(0x1ba)))),process[_0x434724(0xdc)](0x1);}else console[_0x434724(0x175)](_0x434724(0x16c)),console['error'](_0x434724(0x10a)+alignedApkPath),process[_0x434724(0xdc)](0x1);
3
+ const a0_0x16d1d1=a0_0x22b6;(function(_0x58c2b0,_0x14dd59){const _0x5117eb=a0_0x22b6,_0x7cb952=_0x58c2b0();while(!![]){try{const _0x244a15=-parseInt(_0x5117eb(0x228))/0x1*(parseInt(_0x5117eb(0x2c9))/0x2)+-parseInt(_0x5117eb(0x2b1))/0x3+parseInt(_0x5117eb(0x1e7))/0x4+parseInt(_0x5117eb(0x2ad))/0x5+-parseInt(_0x5117eb(0x28c))/0x6*(parseInt(_0x5117eb(0x2a4))/0x7)+-parseInt(_0x5117eb(0x24c))/0x8+parseInt(_0x5117eb(0x218))/0x9;if(_0x244a15===_0x14dd59)break;else _0x7cb952['push'](_0x7cb952['shift']());}catch(_0x4fb313){_0x7cb952['push'](_0x7cb952['shift']());}}}(a0_0x4038,0x2f806));const fs=require('fs'),path=require(a0_0x16d1d1(0x2c8)),{execSync,spawnSync}=require('child_process'),startTime=Date[a0_0x16d1d1(0x235)]();let projectDir=null;process[a0_0x16d1d1(0x28a)][0x2]&&(projectDir=path[a0_0x16d1d1(0x2c6)](process['argv'][0x2]),console['log']('Argument\x20CLI\x20détecté:\x20'+projectDir));!projectDir&&process['env'][a0_0x16d1d1(0x253)]&&(projectDir=path[a0_0x16d1d1(0x2c6)](process[a0_0x16d1d1(0x1c5)][a0_0x16d1d1(0x253)]),console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x21c)+projectDir));if(!projectDir){let searchDir=process[a0_0x16d1d1(0x285)]();for(let i=0x0;i<0x5;i++){const configPath=path[a0_0x16d1d1(0x28d)](searchDir,'app-config.json');if(fs['existsSync'](configPath)){projectDir=searchDir,console['log'](a0_0x16d1d1(0x274)+projectDir);break;}searchDir=path[a0_0x16d1d1(0x201)](searchDir);}}if(!projectDir){const defaultPaths=[path[a0_0x16d1d1(0x28d)](__dirname,'..','..','MyApp'),path[a0_0x16d1d1(0x2c6)]('MyApp'),path[a0_0x16d1d1(0x28d)](process[a0_0x16d1d1(0x1c5)]['USERPROFILE']||process['env'][a0_0x16d1d1(0x24b)]||'',a0_0x16d1d1(0x238))];for(const checkPath of defaultPaths){if(checkPath&&fs[a0_0x16d1d1(0x1de)](checkPath)&&fs[a0_0x16d1d1(0x1de)](path[a0_0x16d1d1(0x28d)](checkPath,a0_0x16d1d1(0x28f)))){projectDir=checkPath,console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x263)+projectDir);break;}}}(!projectDir||!fs['existsSync'](projectDir))&&(console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x2ea)),console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x2bf)),console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x254)),console['error'](a0_0x16d1d1(0x1cb)),console['error']('\x0aOptions:'),process[a0_0x16d1d1(0x1ef)](0x1));const buildToolsDir=__dirname,skipBackup=process[a0_0x16d1d1(0x28a)][a0_0x16d1d1(0x20f)]('--no-backup'),restoreFromBackup=process[a0_0x16d1d1(0x28a)][a0_0x16d1d1(0x20f)]('--restore');if(restoreFromBackup){console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x251));try{execSync(a0_0x16d1d1(0x27e)+path[a0_0x16d1d1(0x28d)](buildToolsDir,a0_0x16d1d1(0x1c7))+a0_0x16d1d1(0x20a)+projectDir+a0_0x16d1d1(0x224),{'stdio':a0_0x16d1d1(0x25f),'shell':a0_0x16d1d1(0x27f)}),console['log'](a0_0x16d1d1(0x215)),process[a0_0x16d1d1(0x1ef)](0x0);}catch(a0_0x207960){console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x2b4)),process[a0_0x16d1d1(0x1ef)](0x1);}}const configPath=path[a0_0x16d1d1(0x28d)](projectDir,a0_0x16d1d1(0x28f));!fs[a0_0x16d1d1(0x1de)](configPath)&&(console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x268)),process[a0_0x16d1d1(0x1ef)](0x1));const appConfig=JSON['parse'](fs[a0_0x16d1d1(0x1b0)](configPath,'utf-8'));console[a0_0x16d1d1(0x2b2)]('Compilation\x20de:\x20'+appConfig[a0_0x16d1d1(0x277)]+'\x20v'+appConfig[a0_0x16d1d1(0x294)]),console['log'](a0_0x16d1d1(0x2b8)+appConfig[a0_0x16d1d1(0x1d6)]),console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x243));function extractClassesFromAARs(_0x5a8665){const _0x407a28=a0_0x16d1d1,_0x46f836=path[_0x407a28(0x28d)](_0x5a8665,_0x407a28(0x241)),_0x22d817=path[_0x407a28(0x28d)](_0x5a8665,_0x407a28(0x1c8));if(!fs[_0x407a28(0x1de)](_0x46f836))return console['log'](_0x407a28(0x281)),[];!fs['existsSync'](_0x22d817)&&fs[_0x407a28(0x2d0)](_0x22d817,{'recursive':!![]});let _0x20ed87=null;const _0x410a46=process[_0x407a28(0x1af)],_0x47d607=process[_0x407a28(0x2a5)];if(_0x410a46===_0x407a28(0x220)){const _0x1d524b=_0x47d607===_0x407a28(0x2b5)?'x64':_0x47d607==='arm64'?_0x407a28(0x1b3):_0x407a28(0x2da);_0x20ed87=path['join'](buildToolsDir,_0x407a28(0x1ec),_0x407a28(0x1bf),_0x407a28(0x289),_0x1d524b,_0x407a28(0x1c6));}else{if(_0x410a46==='linux')_0x20ed87=path[_0x407a28(0x28d)](buildToolsDir,_0x407a28(0x1ec),_0x407a28(0x1bf),'linux',_0x407a28(0x2b5),_0x407a28(0x296));else _0x410a46===_0x407a28(0x2c4)&&(_0x20ed87=path[_0x407a28(0x28d)](buildToolsDir,_0x407a28(0x1ec),_0x407a28(0x1bf),_0x407a28(0x256),_0x407a28(0x2b5),_0x407a28(0x296)));}if(!_0x20ed87||!fs[_0x407a28(0x1de)](_0x20ed87))return console[_0x407a28(0x258)](_0x407a28(0x248)+_0x410a46+'\x20'+_0x47d607+_0x407a28(0x221)+_0x20ed87),[];const _0x10e937=[];console[_0x407a28(0x2b2)]('\x0a📦\x20Extraction\x20des\x20classes.jar\x20depuis\x20les\x20AARs...');try{const _0xc0d002=fs[_0x407a28(0x22f)](_0x46f836);for(const _0x4e7844 of _0xc0d002){if(_0x4e7844['endsWith'](_0x407a28(0x2a2))){const _0x22f679=path[_0x407a28(0x28d)](_0x46f836,_0x4e7844),_0x5e8a5d=_0x4e7844[_0x407a28(0x2c0)]('.aar',_0x407a28(0x1df)),_0x5485b3=path[_0x407a28(0x28d)](_0x22d817,_0x5e8a5d);if(fs[_0x407a28(0x1de)](_0x5485b3)){_0x10e937[_0x407a28(0x287)](_0x5485b3),console[_0x407a28(0x2b2)](_0x407a28(0x2c5)+_0x5e8a5d);continue;}const _0x5577f7=path['join'](_0x22d817,_0x407a28(0x1fb)+Date[_0x407a28(0x235)]()+'_'+Math['random']()['toString'](0x24)[_0x407a28(0x222)](0x2,0x9));try{fs[_0x407a28(0x2d0)](_0x5577f7,{'recursive':!![]});const _0x391bb7='\x22'+_0x20ed87+'\x22\x20x\x20\x22'+_0x22f679+'\x22\x20-o\x22'+_0x5577f7+'\x22';console[_0x407a28(0x2b2)](_0x407a28(0x206)+_0x4e7844+_0x407a28(0x1bb)),execSync(_0x391bb7,{'stdio':_0x407a28(0x1d2),'shell':'cmd.exe'});const _0x54c286=path[_0x407a28(0x28d)](_0x5577f7,_0x407a28(0x227));fs[_0x407a28(0x1de)](_0x54c286)?(fs[_0x407a28(0x286)](_0x54c286,_0x5485b3),_0x10e937['push'](_0x5485b3),console['log'](_0x407a28(0x278)+_0x4e7844+'\x20->\x20'+_0x5e8a5d)):console[_0x407a28(0x258)](_0x407a28(0x207)+_0x4e7844);try{fs['rmSync'](_0x5577f7,{'recursive':!![],'force':!![]});}catch(_0xf4df1c){}}catch(_0x70f22e){console['warn']('⚠\x20Impossible\x20d\x27extraire\x20'+_0x4e7844+':\x20'+_0x70f22e[_0x407a28(0x2ce)]);try{fs[_0x407a28(0x298)](_0x5577f7,{'recursive':!![],'force':!![]});}catch(_0x18c961){}}}}}catch(_0x2d0f33){console[_0x407a28(0x258)]('⚠\x20Erreur\x20lors\x20de\x20la\x20lecture\x20du\x20répertoire\x20libs:\x20'+_0x2d0f33[_0x407a28(0x2ce)]);}return _0x10e937;}console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x2aa));const backupOption=skipBackup?a0_0x16d1d1(0x1b4):'';try{execSync(a0_0x16d1d1(0x27e)+path[a0_0x16d1d1(0x28d)](buildToolsDir,a0_0x16d1d1(0x1c7))+a0_0x16d1d1(0x20a)+projectDir+'\x22'+backupOption,{'stdio':a0_0x16d1d1(0x25f)});}catch(a0_0x233fc8){console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x292)),process[a0_0x16d1d1(0x1ef)](0x1);}console[a0_0x16d1d1(0x2b2)](''),console[a0_0x16d1d1(0x2b2)]('Génération\x20des\x20icônes\x20pour\x20les\x20différentes\x20densités...');const forceIcons=process[a0_0x16d1d1(0x28a)][a0_0x16d1d1(0x20f)](a0_0x16d1d1(0x1e4));function iconsExistInProject(_0x21c539){const _0x5e2f34=a0_0x16d1d1,_0x16c617=[path['join'](_0x21c539,_0x5e2f34(0x202),_0x5e2f34(0x1f7),'ic_launcher.xml'),path[_0x5e2f34(0x28d)](_0x21c539,_0x5e2f34(0x202),_0x5e2f34(0x1ce),_0x5e2f34(0x1f2)),path['join'](_0x21c539,_0x5e2f34(0x202),_0x5e2f34(0x239),_0x5e2f34(0x1f2)),path[_0x5e2f34(0x28d)](_0x21c539,_0x5e2f34(0x202),_0x5e2f34(0x20c),_0x5e2f34(0x1f2)),path[_0x5e2f34(0x28d)](_0x21c539,_0x5e2f34(0x202),_0x5e2f34(0x255),_0x5e2f34(0x1f2)),path[_0x5e2f34(0x28d)](_0x21c539,_0x5e2f34(0x202),_0x5e2f34(0x1c3),_0x5e2f34(0x1f2))];try{for(const _0x222870 of _0x16c617)if(fs[_0x5e2f34(0x1de)](_0x222870))return!![];}catch(_0x3f97ec){}return![];}if(!forceIcons&&iconsExistInProject(projectDir))console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x2c1));else try{execSync(a0_0x16d1d1(0x27e)+path[a0_0x16d1d1(0x28d)](buildToolsDir,'generate-icons.js')+a0_0x16d1d1(0x20a)+projectDir+'\x22',{'stdio':a0_0x16d1d1(0x25f),'shell':a0_0x16d1d1(0x27f)});}catch(a0_0x8f6319){console[a0_0x16d1d1(0x258)](a0_0x16d1d1(0x262)),console['warn'](a0_0x16d1d1(0x2b3)+a0_0x8f6319['message'][a0_0x16d1d1(0x1e8)](0x0,0x64));}console['log']('');const ignoreMissing=process['argv'][a0_0x16d1d1(0x20f)]('--ignore-missing'),failOnMissing=process[a0_0x16d1d1(0x28a)][a0_0x16d1d1(0x20f)](a0_0x16d1d1(0x2de));function scanProjectForMissingFiles(_0x14e70c,_0x3b7e5d){const _0x4a6b6d=a0_0x16d1d1,_0x5c53f1=_0x3b7e5d&&Array['isArray'](_0x3b7e5d['minimalRequiredFiles'])?_0x3b7e5d[_0x4a6b6d(0x203)]:['AndroidManifest.xml',_0x4a6b6d(0x269),'res/values/styles.xml',_0x4a6b6d(0x1d7)],_0x4c7fcb=[];for(const _0x17e8f9 of _0x5c53f1){const _0x182c39=path[_0x4a6b6d(0x28d)](_0x14e70c,_0x17e8f9);if(!fs[_0x4a6b6d(0x1de)](_0x182c39))_0x4c7fcb[_0x4a6b6d(0x287)](_0x17e8f9);}let _0x50e783=![];const _0x440653=path[_0x4a6b6d(0x28d)](_0x14e70c,_0x4a6b6d(0x229));if(fs[_0x4a6b6d(0x1de)](_0x440653)){const _0x5d9485=[_0x440653];while(_0x5d9485['length']){const _0x2e2a19=_0x5d9485[_0x4a6b6d(0x1ee)]();try{for(const _0x3a0916 of fs['readdirSync'](_0x2e2a19)){const _0x26fecf=path[_0x4a6b6d(0x28d)](_0x2e2a19,_0x3a0916),_0x3ec127=fs[_0x4a6b6d(0x1dc)](_0x26fecf);if(_0x3ec127['isDirectory']())_0x5d9485[_0x4a6b6d(0x287)](_0x26fecf);else{if(_0x3a0916[_0x4a6b6d(0x276)](_0x4a6b6d(0x297))){_0x50e783=!![];break;}}}}catch(_0x15070d){}if(_0x50e783)break;}}return{'missingFiles':_0x4c7fcb,'hasJava':_0x50e783};}const scanResult=scanProjectForMissingFiles(projectDir,appConfig);if(scanResult[a0_0x16d1d1(0x26b)][a0_0x16d1d1(0x2e1)]>0x0){console[a0_0x16d1d1(0x258)]('\x0a⚠\x20Vérification\x20projet:\x20fichiers\x20minimaux\x20manquants\x20détectés:');for(const m of scanResult[a0_0x16d1d1(0x26b)])console[a0_0x16d1d1(0x258)](a0_0x16d1d1(0x2b0)+m);!ignoreMissing?failOnMissing?(console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x1e0)),process[a0_0x16d1d1(0x1ef)](0x1)):console[a0_0x16d1d1(0x258)](a0_0x16d1d1(0x236)):console['log'](a0_0x16d1d1(0x21b));}else console['log']('\x0a✓\x20Vérification\x20projet:\x20tous\x20les\x20fichiers\x20minimaux\x20présents');!scanResult[a0_0x16d1d1(0x1fe)]&&console[a0_0x16d1d1(0x258)](a0_0x16d1d1(0x2a7));const VENDOR_DIR=path['join'](buildToolsDir,'vendor'),SDK=path['join'](VENDOR_DIR,a0_0x16d1d1(0x2bd),'android-sdk'),JDK=path[a0_0x16d1d1(0x28d)](VENDOR_DIR,a0_0x16d1d1(0x2bd),a0_0x16d1d1(0x1cd),a0_0x16d1d1(0x288)),AAPT2=path[a0_0x16d1d1(0x28d)](SDK,a0_0x16d1d1(0x23b),a0_0x16d1d1(0x1fa),a0_0x16d1d1(0x1e1)),ANDROID_JAR=path[a0_0x16d1d1(0x28d)](SDK,'platforms',a0_0x16d1d1(0x1f6),a0_0x16d1d1(0x24d)),D8=path['join'](SDK,a0_0x16d1d1(0x23b),'34.0.0',a0_0x16d1d1(0x2d4)),ZIPALIGN=path[a0_0x16d1d1(0x28d)](SDK,a0_0x16d1d1(0x23b),a0_0x16d1d1(0x1fa),a0_0x16d1d1(0x2cd)),APKSIGNER=path[a0_0x16d1d1(0x28d)](SDK,a0_0x16d1d1(0x23b),a0_0x16d1d1(0x1fa),a0_0x16d1d1(0x279)),SEVENZIP=path[a0_0x16d1d1(0x28d)](VENDOR_DIR,a0_0x16d1d1(0x1bf),a0_0x16d1d1(0x289),'ia32',a0_0x16d1d1(0x1c6)),requiredTools=[{'name':a0_0x16d1d1(0x216),'path':AAPT2},{'name':'Android\x20JAR','path':ANDROID_JAR},{'name':'D8','path':D8},{'name':a0_0x16d1d1(0x2ba),'path':ZIPALIGN},{'name':a0_0x16d1d1(0x1e2),'path':APKSIGNER},{'name':a0_0x16d1d1(0x22a),'path':SEVENZIP},{'name':a0_0x16d1d1(0x1cf),'path':path[a0_0x16d1d1(0x28d)](JDK,'javac.exe')}];for(const tool of requiredTools){!fs[a0_0x16d1d1(0x1de)](tool[a0_0x16d1d1(0x2c8)])&&(console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x2be)+tool[a0_0x16d1d1(0x2e2)]+a0_0x16d1d1(0x1f1)+tool[a0_0x16d1d1(0x2c8)]),console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x2dc)),process['exit'](0x1));}const BUILD_DIR=path[a0_0x16d1d1(0x28d)](projectDir,a0_0x16d1d1(0x29b)),SRC_DIR=path[a0_0x16d1d1(0x28d)](projectDir,a0_0x16d1d1(0x229)),RES_DIR=path[a0_0x16d1d1(0x28d)](projectDir,a0_0x16d1d1(0x202));function run(_0x284a93,_0xf805c7,_0x584927=projectDir){const _0x608d40=a0_0x16d1d1;console[_0x608d40(0x2b2)](_0x608d40(0x1bd)+_0xf805c7+_0x608d40(0x28e));try{const _0x4f35bd=execSync(_0x284a93,{'cwd':_0x584927,'stdio':_0x608d40(0x25f),'shell':'cmd.exe'});return!![];}catch(_0xcca0ed){console[_0x608d40(0x231)]('ERREUR:\x20'+_0xf805c7+_0x608d40(0x275)),process[_0x608d40(0x1ef)](0x1);}}function copyFile(_0x57530c,_0x3fc53e){const _0x5058f6=a0_0x16d1d1,_0x3779cb=path[_0x5058f6(0x201)](_0x3fc53e);!fs[_0x5058f6(0x1de)](_0x3779cb)&&fs[_0x5058f6(0x2d0)](_0x3779cb,{'recursive':!![]}),fs['copyFileSync'](_0x57530c,_0x3fc53e);}function removeDir(_0x17b240){const _0x4529bd=a0_0x16d1d1;fs['existsSync'](_0x17b240)&&fs[_0x4529bd(0x298)](_0x17b240,{'recursive':!![],'force':!![]});}function cleanBuildDir(_0x2249ab){const _0x31880c=a0_0x16d1d1;if(!fs[_0x31880c(0x1de)](_0x2249ab)){fs[_0x31880c(0x2d0)](_0x2249ab,{'recursive':!![]});return;}const _0x54c967=['classes',_0x31880c(0x2a1),_0x31880c(0x26c)],_0x3c3dc7=[_0x31880c(0x250),_0x31880c(0x227),'classes.dex','dependencies-config.json'];try{const _0x376260=fs[_0x31880c(0x22f)](_0x2249ab);for(const _0x4a2254 of _0x376260){const _0x5e2585=path[_0x31880c(0x28d)](_0x2249ab,_0x4a2254),_0x3cb216=fs[_0x31880c(0x1dc)](_0x5e2585);if(_0x3cb216[_0x31880c(0x1c1)]()&&_0x54c967[_0x31880c(0x20f)](_0x4a2254))console[_0x31880c(0x2b2)](_0x31880c(0x22b)+_0x4a2254+'/'),fs['rmSync'](_0x5e2585,{'recursive':!![],'force':!![]});else{if(_0x3cb216[_0x31880c(0x257)]()&&_0x3c3dc7['includes'](_0x4a2254))console[_0x31880c(0x2b2)]('\x20\x20Suppression:\x20'+_0x4a2254),fs['unlinkSync'](_0x5e2585);else _0x3cb216[_0x31880c(0x1c1)]()&&console[_0x31880c(0x2b2)](_0x31880c(0x2d3)+_0x4a2254+'/\x20(non\x20ciblé\x20par\x20le\x20nettoyage)');}}}catch(_0x4764e3){console[_0x31880c(0x258)]('⚠\x20Erreur\x20lors\x20du\x20nettoyage:\x20'+_0x4764e3[_0x31880c(0x2ce)]);}}function makeDir(_0x5ebcff){const _0x50a465=a0_0x16d1d1;!fs['existsSync'](_0x5ebcff)&&fs[_0x50a465(0x2d0)](_0x5ebcff,{'recursive':!![]});}const APK_NAME=path[a0_0x16d1d1(0x28d)](projectDir,appConfig['appName']['replace'](/\s+/g,'')+a0_0x16d1d1(0x1f5));console['log'](a0_0x16d1d1(0x1f3)),cleanBuildDir(BUILD_DIR);if(fs[a0_0x16d1d1(0x1de)](APK_NAME))try{fs[a0_0x16d1d1(0x232)](APK_NAME),console[a0_0x16d1d1(0x2b2)]('✓\x20Supprimé:\x20'+APK_NAME);}catch(a0_0x358767){console[a0_0x16d1d1(0x258)]('⚠\x20Impossible\x20de\x20supprimer\x20'+APK_NAME+a0_0x16d1d1(0x264));}const keystoreName=appConfig[a0_0x16d1d1(0x277)][a0_0x16d1d1(0x2c0)](/\s+/g,'')+a0_0x16d1d1(0x2d2);console['log'](a0_0x16d1d1(0x246));const libsDir=path[a0_0x16d1d1(0x28d)](BUILD_DIR,'libs'),libsExtractedDir=path[a0_0x16d1d1(0x28d)](BUILD_DIR,a0_0x16d1d1(0x1c8));if(fs['existsSync'](libsDir)){const libsCount=fs[a0_0x16d1d1(0x22f)](libsDir)[a0_0x16d1d1(0x2e1)];console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x2dd)+libsCount+a0_0x16d1d1(0x1fc));}if(fs[a0_0x16d1d1(0x1de)](libsExtractedDir)){const extractedCount=fs[a0_0x16d1d1(0x22f)](libsExtractedDir)[a0_0x16d1d1(0x2e1)];console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x2b7)+extractedCount+a0_0x16d1d1(0x23c));}console[a0_0x16d1d1(0x2b2)]('');const hasDependencies=appConfig[a0_0x16d1d1(0x1c9)]&&(appConfig[a0_0x16d1d1(0x1c9)][a0_0x16d1d1(0x2a3)]&&appConfig[a0_0x16d1d1(0x1c9)][a0_0x16d1d1(0x2a3)][a0_0x16d1d1(0x2e1)]>0x0||appConfig[a0_0x16d1d1(0x1c9)]['custom']&&appConfig[a0_0x16d1d1(0x1c9)][a0_0x16d1d1(0x26f)]['length']>0x0);if(hasDependencies){console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x2eb));try{execSync(a0_0x16d1d1(0x27e)+path[a0_0x16d1d1(0x28d)](buildToolsDir,'process-dependencies.js')+'\x22\x20\x22'+projectDir+'\x22',{'stdio':a0_0x16d1d1(0x25f)});}catch(a0_0x2215da){console[a0_0x16d1d1(0x258)](a0_0x16d1d1(0x2cb));}console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x1ff));try{execSync(a0_0x16d1d1(0x27e)+path[a0_0x16d1d1(0x28d)](buildToolsDir,a0_0x16d1d1(0x26d))+a0_0x16d1d1(0x20a)+projectDir+'\x22',{'stdio':a0_0x16d1d1(0x25f)});}catch(a0_0x4bd633){console['warn'](a0_0x16d1d1(0x2db));}}else console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x209));const extractedJars=hasDependencies?extractClassesFromAARs(BUILD_DIR):[];makeDir(BUILD_DIR),makeDir(BUILD_DIR+a0_0x16d1d1(0x1bc)),makeDir(BUILD_DIR+a0_0x16d1d1(0x213));const stylesDir=path[a0_0x16d1d1(0x28d)](projectDir,a0_0x16d1d1(0x202),a0_0x16d1d1(0x2bb)),stylesPath=path[a0_0x16d1d1(0x28d)](stylesDir,a0_0x16d1d1(0x21a));try{!fs[a0_0x16d1d1(0x1de)](stylesDir)&&fs[a0_0x16d1d1(0x2d0)](stylesDir,{'recursive':!![]});if(!fs[a0_0x16d1d1(0x1de)](stylesPath)){const defaultStyles=a0_0x16d1d1(0x217)+'<resources>\x0a'+'\x20\x20<style\x20name=\x22AppTheme\x22\x20parent=\x22android:Theme.DeviceDefault.Light.DarkActionBar\x22>\x0a'+'\x20\x20</style>\x0a'+a0_0x16d1d1(0x1d1);fs['writeFileSync'](stylesPath,defaultStyles,a0_0x16d1d1(0x1d8)),console[a0_0x16d1d1(0x2b2)]('✓\x20styles.xml\x20par\x20défaut\x20créé\x20pour\x20éviter\x20les\x20erreurs\x20de\x20thème');}}catch(a0_0x7483df){console[a0_0x16d1d1(0x258)](a0_0x16d1d1(0x282),a0_0x7483df['message']);}console['log'](a0_0x16d1d1(0x299));const layoutFiles=fs[a0_0x16d1d1(0x1de)](path[a0_0x16d1d1(0x28d)](RES_DIR,'layout'))?fs['readdirSync'](path['join'](RES_DIR,a0_0x16d1d1(0x240)))[a0_0x16d1d1(0x2e0)](_0xbdad5f=>_0xbdad5f[a0_0x16d1d1(0x276)](a0_0x16d1d1(0x2d7))):[],valueFiles=fs['existsSync'](path[a0_0x16d1d1(0x28d)](RES_DIR,'values'))?fs[a0_0x16d1d1(0x22f)](path[a0_0x16d1d1(0x28d)](RES_DIR,'values'))[a0_0x16d1d1(0x2e0)](_0x58239b=>_0x58239b[a0_0x16d1d1(0x276)]('.xml')):[],allResources=[];for(const file of layoutFiles){console[a0_0x16d1d1(0x2b2)]('\x0a===\x20Compile\x20'+path[a0_0x16d1d1(0x28d)](RES_DIR,a0_0x16d1d1(0x240),file)+a0_0x16d1d1(0x28e));const cmd='\x22'+AAPT2+a0_0x16d1d1(0x237)+BUILD_DIR+a0_0x16d1d1(0x1c4)+path['join'](RES_DIR,a0_0x16d1d1(0x240),file)+'\x22';try{execSync(cmd,{'stdio':a0_0x16d1d1(0x25f),'shell':a0_0x16d1d1(0x27f)});}catch(a0_0x30fa46){console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x283)+file+a0_0x16d1d1(0x271));}allResources['push'](RES_DIR+a0_0x16d1d1(0x27a)+file);}for(const file of valueFiles){console['log'](a0_0x16d1d1(0x223)+path[a0_0x16d1d1(0x28d)](RES_DIR,a0_0x16d1d1(0x2bb),file)+a0_0x16d1d1(0x28e));const cmd='\x22'+AAPT2+'\x22\x20compile\x20-o\x20\x22'+BUILD_DIR+a0_0x16d1d1(0x1c4)+path[a0_0x16d1d1(0x28d)](RES_DIR,a0_0x16d1d1(0x2bb),file)+'\x22';try{execSync(cmd,{'stdio':a0_0x16d1d1(0x25f),'shell':'cmd.exe'});}catch(a0_0xba16b0){console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x283)+file+a0_0x16d1d1(0x271));}allResources['push'](RES_DIR+a0_0x16d1d1(0x2a0)+file);}for(let mimapDir of fs[a0_0x16d1d1(0x22f)](RES_DIR)[a0_0x16d1d1(0x2e0)](_0x54f15c=>_0x54f15c[a0_0x16d1d1(0x2ac)](a0_0x16d1d1(0x1d3)))){const mimapPath=path['join'](RES_DIR,mimapDir);if(fs[a0_0x16d1d1(0x1dc)](mimapPath)['isDirectory']()){const files=fs[a0_0x16d1d1(0x22f)](mimapPath)['filter'](_0x5abfb0=>_0x5abfb0[a0_0x16d1d1(0x276)](a0_0x16d1d1(0x22c)));for(const file of files){console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x223)+path[a0_0x16d1d1(0x28d)](mimapDir,file)+a0_0x16d1d1(0x28e));const cmd='\x22'+AAPT2+a0_0x16d1d1(0x237)+BUILD_DIR+a0_0x16d1d1(0x1c4)+path['join'](mimapPath,file)+'\x22';try{execSync(cmd,{'stdio':a0_0x16d1d1(0x25f),'shell':a0_0x16d1d1(0x27f)});}catch(a0_0x21c6a7){console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x283)+file+'\x20échouée\x20(non\x20critique)');}}}}console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x23e));const resourceExtensions=[a0_0x16d1d1(0x2d7),a0_0x16d1d1(0x22c),a0_0x16d1d1(0x2a6),a0_0x16d1d1(0x2af),a0_0x16d1d1(0x21e),a0_0x16d1d1(0x1d0)];function walkDirForResources(_0x43e50c){const _0xe9ca5b=a0_0x16d1d1,_0x376d2e=[];if(!fs[_0xe9ca5b(0x1de)](_0x43e50c))return _0x376d2e;const _0x116789=fs[_0xe9ca5b(0x22f)](_0x43e50c);for(const _0x25b95d of _0x116789){const _0x53e58f=path[_0xe9ca5b(0x28d)](_0x43e50c,_0x25b95d),_0x2f34ad=fs[_0xe9ca5b(0x1dc)](_0x53e58f);if(_0x2f34ad[_0xe9ca5b(0x1c1)]())_0x376d2e[_0xe9ca5b(0x287)](...walkDirForResources(_0x53e58f));else{const _0x3d3e2b=path['extname'](_0x25b95d)['toLowerCase']();(resourceExtensions[_0xe9ca5b(0x20f)](_0x3d3e2b)||_0x25b95d[_0xe9ca5b(0x276)]('.9.png'))&&_0x376d2e[_0xe9ca5b(0x287)](_0x53e58f);}}return _0x376d2e;}const allResFiles=walkDirForResources(RES_DIR);for(const resFile of allResFiles){console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x223)+resFile+a0_0x16d1d1(0x28e));const compileCmd='\x22'+AAPT2+a0_0x16d1d1(0x237)+path[a0_0x16d1d1(0x28d)](BUILD_DIR,'compiledResources')+'\x22\x20\x22'+resFile+'\x22';try{execSync(compileCmd,{'stdio':'inherit','shell':a0_0x16d1d1(0x27f)});}catch(a0_0x1f3458){console[a0_0x16d1d1(0x258)]('Avertissement:\x20impossible\x20de\x20compiler\x20'+resFile+a0_0x16d1d1(0x219));}}function a0_0x4038(){const _0x59314a=['pop','exit','⚠\x20Aucun\x20fichier\x20Java\x20trouvé\x20—\x20génération\x20de\x20stubs\x20d\x27activité\x20pour\x20éviter\x20les\x20crashes','\x20non\x20trouvé\x20à:\x20','ic_launcher.png','Nettoyage\x20complet\x20de\x20tous\x20les\x20fichiers\x20générés...','\x0a✓\x20Classe\x20extraite\x20pour\x20diagnostic:\x20','.apk','android-34','mipmap-anydpi-v26','Répertoire\x20de\x20génération\x20vérifier:\x20','ERREUR:\x20Impossible\x20de\x20créer\x20le\x20keystore','34.0.0','temp_','\x20fichier(s)\x20dans\x20libs/','Recreating\x20JAR\x20after\x20recompilation','hasJava','\x0aRésolution\x20des\x20dépendances\x20transitives...','\x20-\x20les\x20logs\x20de\x20compilation\x20`javac`\x20pour\x20erreurs','dirname','res','minimalRequiredFiles','writeFileSync','ignore','\x20\x20Extraction:\x20','⚠\x20classes.jar\x20non\x20trouvé\x20dans\x20','minSdkVersion','ℹ️\x20\x20Aucune\x20dépendance\x20déclarée\x20-\x20étape\x20skippée\x0a','\x22\x20\x22','\x20fichiers\x20Java\x20générés\x20par\x20aapt2\x20ajoutés\x20à\x20la\x20compilation','mipmap-xhdpi','Classe\x20problématique\x20détectée:\x20','✓\x20Vérification\x20des\x20activities:\x20toutes\x20les\x20activities\x20du\x20manifest\x20sont\x20présentes\x20dans\x20classes.jar','includes','renameSync','✓\x20Conversion\x20DEX\x20réussie','AndroidManifest.xml','/compiledResources','Temps\x20de\x20build:\x20','\x0a✓\x20Restauration\x20complète!','AAPT2','<?xml\x20version=\x221.0\x22\x20encoding=\x22utf-8\x22?>\x0a','1047879lJSXpY','\x20(non\x20critique)','styles.xml','\x0a--\x20Ignoring\x20missing\x20files\x20due\x20to\x20--ignore-missing','Variable\x20d\x27environnement\x20PROJECT_PATH\x20détectée:\x20','\x0aERREUR:\x20D8\x20a\x20échoué\x20lors\x20de\x20la\x20conversion\x20en\x20DEX.','.webp','\x20\x202.\x20AndroidManifest.xml\x20est-il\x20bien\x20formé?','win32','\x20à\x20','substr','\x0a===\x20Compile\x20','\x22\x20--restore','\x5cjar\x22\x20cvf\x20\x22','✓\x20Aucune\x20activity\x20déclarée\x20dans\x20le\x20manifest\x20à\x20vérifier.','classes.jar','38pUmovH','src','7zip','\x20\x20Suppression:\x20','.png','.class','\x22\x20sign\x20--ks\x20\x22','readdirSync','\x22\x20--java\x20\x22','error','unlinkSync','size','\x20-\x20que\x20les\x20.java\x20existent\x20dans\x20`src/`\x20avec\x20le\x20bon\x20`package`\x20en\x20tête','now','\x0aRemarque:\x20utilisez\x20--fail-on-missing\x20pour\x20faire\x20échouer\x20le\x20build\x20lorsqu\x27un\x20fichier\x20manque,\x20ou\x20--ignore-missing\x20pour\x20continuer.','\x22\x20compile\x20-o\x20\x22','MyApp','mipmap-hdpi','exec','build-tools','\x20fichier(s)\x20dans\x20libs-extracted/','\x22\x20-C\x20\x22','\x0a===\x20Compile\x20récursif\x20des\x20ressources\x20restantes\x20===','Création\x20du\x20keystore...','layout','libs','undefined','---\x0a','\x0a===\x205)\x20CONVERSION\x20EN\x20DEX\x20===','\x22\x20e\x20-y\x20\x22','✓\x20Structure\x20de\x20build\x20recréée\x0a','map','⚠\x207za\x20non\x20trouvé\x20pour\x20','toFixed','\x5cjavap\x22\x20-v\x20\x22','HOME','974288uEHAzX','android.jar','Avertissement:\x20impossible\x20d\x27ajouter\x20les\x20.java\x20générés:','✓\x20Stub\x20activity\x20created:\x20','unsigned.zip','🔄\x20Restauration\x20des\x20fichiers\x20depuis\x20le\x20backup...\x0a','Chemin\x20de\x20sortie\x20APK:\x20','PROJECT_PATH','\x20\x20node\x20build_apk.js\x20/chemin/vers/projet','mipmap-xxhdpi','mac','isFile','warn','\x0a===\x208)\x20SIGNATURE\x20DE\x20L\x27APK\x20===','expected','ERREUR:\x20APK\x20non\x20généré\x20après\x20signature','Avertissement:\x20impossible\x20de\x20créer\x20un\x20stub\x20d\x27activité:','\x20-d\x20\x22','\x20extends\x20Activity\x20{\x0a\x20\x20\x20\x20@Override\x0a\x20\x20\x20\x20protected\x20void\x20onCreate(Bundle\x20savedInstanceState)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20super.onCreate(savedInstanceState);\x0a\x20\x20\x20\x20}\x0a}\x0a','inherit','ERREUR:\x20D8\x20échoue\x20encore\x20après\x20tentative\x20de\x20correction\x20automatique.','✓\x20R.java\x20généré\x20avec\x20succès:\x20','Avertissement:\x20Génération\x20des\x20icônes\x20échouée\x20(non\x20critique\x20pour\x20le\x20build)','Dossier\x20MyApp\x20trouvé\x20par\x20défaut:\x20','\x20(fichier\x20en\x20cours\x20d\x27utilisation)','basename',';\x0a\x0aimport\x20android.app.Activity;\x0aimport\x20android.os.Bundle;\x0a\x0apublic\x20class\x20','Vérifiez:','ERREUR:\x20app-config.json\x20non\x20trouvé\x20dans\x20le\x20projet!','res/values/strings.xml','aligned.apk','missingFiles','generated','resolve-transitive-deps.js','\x22\x20--manifest\x20\x22','custom','\x0aTentative:\x20fichier\x20source\x20généré\x20détecté.\x20Suppression\x20et\x20recompilation.','\x20échouée\x20(non\x20critique)','.flat','activity','app-config.json\x20trouvé\x20dans:\x20','\x20a\x20échoué','endsWith','appName','✓\x20Extrait:\x20','apksigner.bat','/layout/','\x0aERREUR:\x20Certaines\x20activities\x20déclarées\x20dans\x20AndroidManifest.xml\x20sont\x20absentes\x20du\x20JAR:','\x20dépendance(s))\x20===','Aucun\x20fichier\x20.java\x20trouvé\x20après\x20suppression;\x20impossible\x20de\x20recompiler.','node\x20\x22','cmd.exe','Avertissement:\x20AndroidManifest.xml\x20introuvable\x20—\x20vérification\x20sautée','ℹ️\x20\x20Aucun\x20répertoire\x20libs\x20trouvé','Avertissement:\x20impossible\x20de\x20créer\x20styles.xml\x20par\x20défaut:','Avertissement:\x20Compilation\x20de\x20','✓\x20APK\x20signé\x20avec\x20succès','cwd','copyFileSync','push','bin','win','argv','\x0a---\x20javap\x20verbose\x20---','41898fhqtgA','join','\x20===','app-config.json','d8_diagnostics','\x0a===\x20Signing\x20APK\x20===','ERREUR:\x20Génération\x20des\x20ressources\x20échouée','✓\x20Keystore\x20existant\x20réutilisé:\x20','appVersion','Chemin\x20recherché:\x20','7za','.java','rmSync','\x0a===\x201)\x20COMPILING\x20RESOURCES\x20===','\x20-\x20que\x20`generate-resources.js`\x20n\x27a\x20pas\x20supprimé\x20des\x20fichiers\x20importants','build','Erreur\x20durant\x20le\x20diagnostic\x20D8:','sep','Commande:\x20','split','/values/','compiledResources','.aar','androidx','161fzjDtg','arch','.jpg','\x0a⚠\x20Aucune\x20source\x20Java\x20détectée\x20sous\x20`src/`\x20—\x20le\x20build\x20générera\x20des\x20stubs\x20ou\x20utilisera\x20les\x20fichiers\x20générés\x20par\x20aapt2\x20si\x20nécessaire.','.zip','\x20(attendu:\x20','Génération\x20des\x20ressources\x20dynamiques...','\x0a===\x203)\x20COMPILATION\x20DE\x20JAVA\x20===','startsWith','578540toTEwv','\x22\x20--ks-pass\x20pass:123456\x20--min-sdk-version\x20','.jpeg','\x20-\x20','119247INuNcm','log','Détail:\x20','ERREUR:\x20Restauration\x20échouée','x64','ERREUR\x20lors\x20de\x20la\x20vérification\x20des\x20classes\x20dans\x20le\x20JAR:','✓\x20Cache\x20des\x20dépendances\x20extraites\x20préservé:\x20','Package:\x20','\x0a===\x207)\x20ALIGNEMENT\x20DE\x20L\x27APK\x20===','Zipalign','values','\x5cjar\x22\x20tf\x20\x22','android','\x0aERREUR:\x20','\x0aUsage:','replace','ℹ\x20Icônes\x20détectées\x20dans\x20le\x20projet\x20—\x20génération\x20d\x27icônes\x20ignorée\x20(utilisez\x20--force-icons\x20pour\x20forcer)','\x0a===\x204)\x20CRÉATION\x20DU\x20JAR\x20===','⚠\x20classes.dex\x20non\x20trouvé','darwin','✓\x20Existe\x20déjà:\x20','resolve','\x20--out\x20\x22','path','2524lCKkuC','\x20octets','Avertissement:\x20Traitement\x20des\x20dépendances\x20échoué\x20(non\x20critique)','Impossible\x20d\x27exécuter\x20javap\x20sur\x20la\x20classe\x20extraite:','zipalign.exe','message','\x20\x201.\x20Les\x20fichiers\x20XML\x20dans\x20res/values/\x20sont-ils\x20valides?','mkdirSync','\x5cjavac\x22\x20--release\x208\x20-Xlint:-options\x20-cp\x20','.keystore','\x20\x20Préservé:\x20','d8.bat','match','Le\x20fichier\x20source\x20correspondant\x20n\x27est\x20pas\x20un\x20fichier\x20généré\x20par\x20le\x20script.\x20Aucune\x20suppression\x20automatique\x20réalisée.','.xml','ERREUR:\x20Ajout\x20du\x20DEX\x20échoué:\x20','Message\x20d\x27erreur:','ia32','Avertissement:\x20Résolution\x20des\x20dépendances\x20transitives\x20échouée\x20(non\x20critique)','Vérifiez\x20que\x20le\x20SDK\x20Android\x20et\x20JDK\x20sont\x20correctement\x20installés.','✓\x20Cache\x20des\x20dépendances\x20préservé:\x20','--fail-on-missing','classes','filter','length','name','\x22\x20-f\x204\x20\x22','Exécution:\x20','\x22\x20.','⚠\x20Aucun\x20fichier\x20Java\x20trouvé','package\x20','Chemin\x20attendu:\x20','Recompiling\x20Java\x20files\x20after\x20removing\x20generated\x20source','\x0aERREUR:\x20Dossier\x20du\x20projet\x20non\x20trouvé!','Traitement\x20des\x20dépendances...','platform','readFileSync','✓\x20Conversion\x20DEX\x20réussie\x20après\x20correction\x20automatique','unsigned.apk','arm64','\x20--no-backup','Compiling\x20Java\x20files','✓\x20Keystore\x20créé','utf-8','\x0a===\x20Conversion\x20en\x20DEX\x20===','\x22\x20-o\x22','⚠\x20Zipalign\x20échoué,\x20copie\x20directe\x20de\x20unsigned.apk','...','/classes','\x0a===\x20','\x22\x20link\x20-o\x20\x22','7zip-bin','\x0aBuild\x20échouée\x20-\x20APK\x20n\x27est\x20pas\x20généré.','isDirectory','ERREUR:\x20classes.jar\x20introuvable\x20—\x20impossible\x20de\x20vérifier\x20les\x20classes','mipmap-xxxhdpi','/compiledResources\x22\x20\x22','env','7za.exe','generate-resources.js','libs-extracted','dependencies','✓\x20DEX\x20ajouté\x20à\x20l\x27APK','\x20\x20PROJECT_PATH=/chemin/vers/projet\x20node\x20build_apk.js','\x0a✓\x20Build\x20terminé\x20avec\x20succès!','jdk','mipmap-mdpi','JDK','.9.png','</resources>\x0a','pipe','mipmap','\x22\x20\x22*','\x22\x20u\x20-y\x20\x22','packageName','res/layout/activity_main.xml','utf8','Création\x20du\x20JAR','\x0a===\x202)\x20LIAISON\x20DES\x20RESSOURCES\x20===','Cause\x20possible:\x20fichiers\x20res/\x20mal\x20structurés,\x20XML\x20invalides,\x20ou\x20manifest\x20corrompu.','statSync','classes.dex','existsSync','.jar','\x0aERREUR:\x20Fichiers\x20minimaux\x20manquants.\x20Arrêt\x20du\x20build.','aapt2.exe','APKSigner','\x0aERREUR\x20CRITIQUE:\x20R.java\x20n\x27a\x20pas\x20été\x20généré\x20par\x20aapt2\x20link!','--force-icons','Erreur\x20lors\x20de\x20la\x20tentative\x20de\x20correction\x20automatique:','\x22\x20--output\x20\x22','1330108ZcbnoS','substring','\x22\x20-I\x20\x22','Avertissement:\x20erreur\x20lors\x20de\x20la\x20génération\x20des\x20stubs\x20d\x27activité:','Fichier\x20source\x20Java\x20correspondant\x20introuvable:\x20','vendor','timeout\x20/t\x201\x20/nobreak'];a0_0x4038=function(){return _0x59314a;};return a0_0x4038();}console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x1da));const apkPath=path[a0_0x16d1d1(0x28d)](BUILD_DIR,a0_0x16d1d1(0x250)),resourcesDir=path[a0_0x16d1d1(0x28d)](BUILD_DIR,a0_0x16d1d1(0x2a1)),generatedDir=path[a0_0x16d1d1(0x2c6)](BUILD_DIR,a0_0x16d1d1(0x26c));if(!fs[a0_0x16d1d1(0x1de)](resourcesDir))fs[a0_0x16d1d1(0x2d0)](resourcesDir,{'recursive':!![]});if(!fs[a0_0x16d1d1(0x1de)](generatedDir))fs[a0_0x16d1d1(0x2d0)](generatedDir,{'recursive':!![]});const compiledFiles=fs[a0_0x16d1d1(0x22f)](resourcesDir)['filter'](_0x2bf29f=>_0x2bf29f['endsWith'](a0_0x16d1d1(0x272))||_0x2bf29f['endsWith'](a0_0x16d1d1(0x2a8)))[a0_0x16d1d1(0x247)](_0x216d01=>path[a0_0x16d1d1(0x28d)](resourcesDir,_0x216d01));console[a0_0x16d1d1(0x2b2)]('Création\x20de\x20la\x20structure\x20APK\x20et\x20génération\x20de\x20R.java...');try{let linkCmd;const manifestPath=path[a0_0x16d1d1(0x28d)](projectDir,a0_0x16d1d1(0x212));if(compiledFiles['length']>0x0){const compiledArgs=compiledFiles[a0_0x16d1d1(0x247)](_0x5ef129=>'\x22'+_0x5ef129+'\x22')[a0_0x16d1d1(0x28d)]('\x20');linkCmd='\x22'+AAPT2+'\x22\x20link\x20-o\x20\x22'+apkPath+a0_0x16d1d1(0x1e9)+ANDROID_JAR+a0_0x16d1d1(0x26e)+manifestPath+a0_0x16d1d1(0x230)+generatedDir+'\x22\x20'+compiledArgs;}else linkCmd='\x22'+AAPT2+a0_0x16d1d1(0x1be)+apkPath+a0_0x16d1d1(0x1e9)+ANDROID_JAR+a0_0x16d1d1(0x26e)+manifestPath+'\x22\x20--java\x20\x22'+generatedDir+'\x22\x20--auto-add-overlay\x20\x22'+path[a0_0x16d1d1(0x28d)](projectDir,a0_0x16d1d1(0x202))+'\x22';console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x2e4)+linkCmd['substring'](0x0,0x64)+a0_0x16d1d1(0x1bb)),execSync(linkCmd,{'stdio':a0_0x16d1d1(0x25f),'shell':'cmd.exe'}),console[a0_0x16d1d1(0x2b2)]('✓\x20Ressources\x20liées\x20avec\x20succès');}catch(a0_0x16b5cb){console[a0_0x16d1d1(0x231)]('\x0aERREUR:\x20lien\x20a\x20échoué.\x20R.java\x20n\x27a\x20probablement\x20pas\x20été\x20généré.'),console['error'](a0_0x16d1d1(0x2d9),a0_0x16b5cb[a0_0x16d1d1(0x2ce)]['substring'](0x0,0xc8)),process[a0_0x16d1d1(0x1ef)](0x1);}function findRJava(){const _0x225f85=[];try{const _0x13a670=_0x3b0929=>{const _0x19eca9=a0_0x22b6,_0x1bde16=fs['readdirSync'](_0x3b0929);for(const _0xd45a17 of _0x1bde16){const _0x1ae02a=path['join'](_0x3b0929,_0xd45a17),_0x32ba88=fs[_0x19eca9(0x1dc)](_0x1ae02a);if(_0x32ba88['isDirectory']())_0x13a670(_0x1ae02a);else _0xd45a17==='R.java'&&_0x225f85['push'](_0x1ae02a);}};_0x13a670(generatedDir);}catch(_0x17e78e){}return _0x225f85;}const rJavaFiles=findRJava();function a0_0x22b6(_0x5bc01e,_0x27c71a){_0x5bc01e=_0x5bc01e-0x1af;const _0x40385b=a0_0x4038();let _0x22b6f3=_0x40385b[_0x5bc01e];return _0x22b6f3;}rJavaFiles['length']===0x0&&(console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x1e3)),console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x1f8)+generatedDir),console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x1db)),console[a0_0x16d1d1(0x231)]('\x0aVérifications\x20à\x20faire:'),console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x2cf)),console['error'](a0_0x16d1d1(0x21f)),console[a0_0x16d1d1(0x231)]('\x20\x203.\x20Tous\x20les\x20dossiers\x20res/layout/,\x20res/values/,\x20res/mipmap*\x20existent-ils?'),console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x1c0)),process[a0_0x16d1d1(0x1ef)](0x1));console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x261)+rJavaFiles[0x0]),console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x2ab));const javaFiles=[],srcPath=SRC_DIR,findJavaFiles=_0x508b40=>{const _0x457a85=a0_0x16d1d1,_0x5d087d=fs[_0x457a85(0x22f)](_0x508b40);for(const _0x72f940 of _0x5d087d){const _0xbf1e84=path[_0x457a85(0x28d)](_0x508b40,_0x72f940),_0x8e0301=fs[_0x457a85(0x1dc)](_0xbf1e84);if(_0x8e0301[_0x457a85(0x1c1)]())findJavaFiles(_0xbf1e84);else _0x72f940[_0x457a85(0x276)](_0x457a85(0x297))&&javaFiles['push'](_0xbf1e84);}};fs[a0_0x16d1d1(0x1de)](srcPath)&&findJavaFiles(srcPath);const generatedJavaDir=path[a0_0x16d1d1(0x28d)](BUILD_DIR,a0_0x16d1d1(0x26c));if(fs['existsSync'](generatedJavaDir)){const findGeneratedJavaFiles=_0x1be8ea=>{const _0x57c30b=a0_0x16d1d1,_0x5167f6=[],_0x538dfb=fs[_0x57c30b(0x22f)](_0x1be8ea);for(const _0x4fac8c of _0x538dfb){const _0x831cf2=path['join'](_0x1be8ea,_0x4fac8c),_0x361e38=fs[_0x57c30b(0x1dc)](_0x831cf2);if(_0x361e38[_0x57c30b(0x1c1)]())_0x5167f6[_0x57c30b(0x287)](...findGeneratedJavaFiles(_0x831cf2));else _0x4fac8c[_0x57c30b(0x276)](_0x57c30b(0x297))&&_0x5167f6['push'](_0x831cf2);}return _0x5167f6;};try{const genFiles=findGeneratedJavaFiles(generatedJavaDir);genFiles[a0_0x16d1d1(0x2e1)]>0x0&&(javaFiles[a0_0x16d1d1(0x287)](...genFiles),console[a0_0x16d1d1(0x2b2)]('✓\x20'+genFiles['length']+a0_0x16d1d1(0x20b)));}catch(a0_0x31487d){console['warn'](a0_0x16d1d1(0x24e),a0_0x31487d[a0_0x16d1d1(0x2ce)]);}}function ensureActivityStubs(){const _0x37b8f9=a0_0x16d1d1;try{const _0x55fb88=path[_0x37b8f9(0x28d)](projectDir,'AndroidManifest.xml');if(!fs['existsSync'](_0x55fb88))return;const _0x47f5e1=fs[_0x37b8f9(0x1b0)](_0x55fb88,_0x37b8f9(0x1d8)),_0x22a31e=_0x47f5e1[_0x37b8f9(0x2d5)](/<manifest[^>]*\spackage\s*=\s*['"]([^'"]+)['"]/),_0x4c38f7=_0x22a31e?_0x22a31e[0x1]:null,_0xe2d043=/<activity[^>]*android:name\s*=\s*['\"]([^'\"]+)['\"]/g;let _0x1616a1;const _0x403a1d=new Set();while((_0x1616a1=_0xe2d043['exec'](_0x47f5e1))!==null){_0x403a1d['add'](_0x1616a1[0x1]);}if(_0x403a1d[_0x37b8f9(0x233)]===0x0)return;const _0x33bb64=path[_0x37b8f9(0x28d)](BUILD_DIR,_0x37b8f9(0x26c));if(!fs['existsSync'](_0x33bb64))fs[_0x37b8f9(0x2d0)](_0x33bb64,{'recursive':!![]});for(const _0x342ddf of _0x403a1d){let _0x5c2247=_0x342ddf;if(_0x342ddf[_0x37b8f9(0x2ac)]('.')){if(_0x4c38f7)_0x5c2247=_0x4c38f7+_0x342ddf;}else!_0x342ddf[_0x37b8f9(0x20f)]('.')&&_0x4c38f7&&(_0x5c2247=_0x4c38f7+'.'+_0x342ddf);const _0xc60ab4=_0x5c2247[_0x37b8f9(0x29f)]('.'),_0x8e9399=_0xc60ab4['pop'](),_0x589446=_0xc60ab4[_0x37b8f9(0x28d)](path[_0x37b8f9(0x29d)]),_0x21911a=path['join'](_0x33bb64,_0x589446);if(!fs['existsSync'](_0x21911a))fs[_0x37b8f9(0x2d0)](_0x21911a,{'recursive':!![]});const _0x1b91c3=path[_0x37b8f9(0x28d)](_0x21911a,_0x8e9399+_0x37b8f9(0x297));if(!fs[_0x37b8f9(0x1de)](_0x1b91c3)){const _0x2d6b77=_0x37b8f9(0x2e7)+_0xc60ab4[_0x37b8f9(0x28d)]('.')+_0x37b8f9(0x266)+_0x8e9399+_0x37b8f9(0x25e);try{fs[_0x37b8f9(0x204)](_0x1b91c3,_0x2d6b77,'utf8'),console['log'](_0x37b8f9(0x24f)+_0x1b91c3);}catch(_0x3212fa){console['warn'](_0x37b8f9(0x25c),_0x3212fa[_0x37b8f9(0x2ce)]);}}javaFiles[_0x37b8f9(0x287)](_0x1b91c3);}}catch(_0x33e85c){console['warn'](_0x37b8f9(0x1ea),_0x33e85c[_0x37b8f9(0x2ce)]);}}javaFiles['length']===0x0&&(console[a0_0x16d1d1(0x258)](a0_0x16d1d1(0x1f0)),ensureActivityStubs());if(javaFiles[a0_0x16d1d1(0x2e1)]===0x0)console['warn'](a0_0x16d1d1(0x2e6));else{let classPathParts=['\x22'+ANDROID_JAR+'\x22'];extractedJars&&extractedJars[a0_0x16d1d1(0x2e1)]>0x0&&classPathParts[a0_0x16d1d1(0x287)](...extractedJars[a0_0x16d1d1(0x247)](_0x502046=>'\x22'+_0x502046+'\x22'));const classPath=classPathParts[a0_0x16d1d1(0x28d)](';'),javaFilesStr=javaFiles[a0_0x16d1d1(0x247)](_0xd86df9=>'\x22'+_0xd86df9+'\x22')[a0_0x16d1d1(0x28d)]('\x20'),compileCmd='\x22'+JDK+a0_0x16d1d1(0x2d1)+classPath+'\x20-d\x20\x22'+path[a0_0x16d1d1(0x28d)](BUILD_DIR,'classes')+'\x22\x20'+javaFilesStr;run(compileCmd,a0_0x16d1d1(0x1b5));}console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x2c2));const classesDir=path[a0_0x16d1d1(0x28d)](BUILD_DIR,a0_0x16d1d1(0x2df)),jarPath=path[a0_0x16d1d1(0x28d)](BUILD_DIR,'classes.jar');if(fs['existsSync'](classesDir)){const jarCmd='\x22'+JDK+a0_0x16d1d1(0x225)+jarPath+a0_0x16d1d1(0x23d)+classesDir+a0_0x16d1d1(0x2e5);run(jarCmd,a0_0x16d1d1(0x1d9));}else console[a0_0x16d1d1(0x258)]('⚠\x20Dossier\x20classes\x20non\x20trouvé');function checkManifestClassesPresentInJar(){const _0x4afaed=a0_0x16d1d1;try{!fs[_0x4afaed(0x1de)](jarPath)&&(console[_0x4afaed(0x231)](_0x4afaed(0x1c2)),process['exit'](0x1));const _0x29630a=path['join'](projectDir,_0x4afaed(0x212));if(!fs[_0x4afaed(0x1de)](_0x29630a)){console[_0x4afaed(0x258)](_0x4afaed(0x280));return;}const _0x56abbc=fs[_0x4afaed(0x1b0)](_0x29630a,_0x4afaed(0x1d8)),_0x3649c1=_0x56abbc[_0x4afaed(0x2d5)](/<manifest[^>]*\spackage\s*=\s*['"]([^'\"]+)['"]/),_0x22be07=_0x3649c1?_0x3649c1[0x1]:appConfig&&appConfig[_0x4afaed(0x1d6)]||null,_0x150d9d=/<activity[^>]*android:name\s*=\s*['\"]([^'\"]+)['\"]/g;let _0x2647dd;const _0x5d0dc4=[];while((_0x2647dd=_0x150d9d[_0x4afaed(0x23a)](_0x56abbc))!==null){let _0x34be31=_0x2647dd[0x1];if(_0x34be31[_0x4afaed(0x2ac)]('.')){if(_0x22be07)_0x34be31=_0x22be07+_0x34be31;}else!_0x34be31[_0x4afaed(0x20f)]('.')&&_0x22be07&&(_0x34be31=_0x22be07+'.'+_0x34be31);_0x5d0dc4[_0x4afaed(0x287)](_0x34be31);}if(_0x5d0dc4[_0x4afaed(0x2e1)]===0x0){console[_0x4afaed(0x2b2)](_0x4afaed(0x226));return;}const _0x5ac955=execSync('\x22'+JDK+_0x4afaed(0x2bc)+jarPath+'\x22',{'encoding':'utf8','stdio':['pipe',_0x4afaed(0x1d2),_0x4afaed(0x205)]}),_0x11df6e=[];for(const _0x545fcb of _0x5d0dc4){const _0x3c23d6=_0x545fcb['replace'](/\./g,'/')+_0x4afaed(0x22d);!_0x5ac955[_0x4afaed(0x20f)](_0x3c23d6)&&_0x11df6e[_0x4afaed(0x287)]({'activity':_0x545fcb,'expected':_0x3c23d6});}if(_0x11df6e['length']>0x0){console['error'](_0x4afaed(0x27b));for(const _0x45d399 of _0x11df6e){console['error'](_0x4afaed(0x2b0)+_0x45d399[_0x4afaed(0x273)]+_0x4afaed(0x2a9)+_0x45d399[_0x4afaed(0x25a)]+')');}console[_0x4afaed(0x231)]('\x0aCause\x20probable:\x20les\x20sources\x20Java\x20n\x27ont\x20pas\x20été\x20trouvées/compilées\x20ou\x20le\x20package\x20des\x20.java\x20ne\x20correspond\x20pas\x20au\x20manifest.'),console[_0x4afaed(0x231)](_0x4afaed(0x267)),console[_0x4afaed(0x231)](_0x4afaed(0x234)),console[_0x4afaed(0x231)](_0x4afaed(0x29a)),console[_0x4afaed(0x231)](_0x4afaed(0x200)),process[_0x4afaed(0x1ef)](0x1);}console[_0x4afaed(0x2b2)](_0x4afaed(0x20e));}catch(_0x50a15b){console['error'](_0x4afaed(0x2b6),_0x50a15b[_0x4afaed(0x2ce)]),process['exit'](0x1);}}checkManifestClassesPresentInJar(),console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x244));const dexPath=path['join'](BUILD_DIR,a0_0x16d1d1(0x1dd));if(fs['existsSync'](jarPath)){const jarsForDex=['\x22'+jarPath+'\x22'];typeof extractedJars!==a0_0x16d1d1(0x242)&&extractedJars&&extractedJars['length']>0x0&&jarsForDex[a0_0x16d1d1(0x287)](...extractedJars[a0_0x16d1d1(0x247)](_0x35046b=>'\x22'+_0x35046b+'\x22'));const d8Cmd='\x22'+D8+'\x22\x20--lib\x20\x22'+ANDROID_JAR+a0_0x16d1d1(0x1e6)+BUILD_DIR+'\x22\x20'+jarsForDex['join']('\x20');typeof extractedJars!==a0_0x16d1d1(0x242)&&extractedJars&&extractedJars[a0_0x16d1d1(0x2e1)]>0x0?console['log']('\x0a===\x20Conversion\x20en\x20DEX\x20(avec\x20'+extractedJars[a0_0x16d1d1(0x2e1)]+a0_0x16d1d1(0x27c)):console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x1b8));try{execSync(d8Cmd,{'stdio':a0_0x16d1d1(0x25f),'shell':a0_0x16d1d1(0x27f)}),console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x211));}catch(a0_0x306442){const msg=a0_0x306442&&a0_0x306442[a0_0x16d1d1(0x2ce)]?a0_0x306442[a0_0x16d1d1(0x2ce)]:String(a0_0x306442),classMatch=msg[a0_0x16d1d1(0x2d5)](/([^:\s]+\.jar):([^:\s]+\.class)/);let problematicClassEntry=null;if(classMatch)problematicClassEntry=classMatch[0x2][a0_0x16d1d1(0x2c0)](/\\\\/g,'/');else{const alt=msg[a0_0x16d1d1(0x2d5)](/(com\/[\w\/-]*\$?[^\s:]*\.class)/);if(alt)problematicClassEntry=alt[0x1];}console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x21d));if(problematicClassEntry){console['error'](a0_0x16d1d1(0x20d)+problematicClassEntry);try{const tmpDir=path[a0_0x16d1d1(0x28d)](BUILD_DIR,a0_0x16d1d1(0x290));if(!fs['existsSync'](tmpDir))fs[a0_0x16d1d1(0x2d0)](tmpDir,{'recursive':!![]});const extractCmd='\x22'+SEVENZIP+a0_0x16d1d1(0x245)+jarPath+'\x22\x20\x22'+problematicClassEntry+a0_0x16d1d1(0x1b9)+tmpDir+'\x22';try{execSync(extractCmd,{'stdio':'inherit','shell':a0_0x16d1d1(0x27f)});}catch(a0_0x31ea59){try{execSync('\x22'+SEVENZIP+a0_0x16d1d1(0x245)+jarPath+a0_0x16d1d1(0x1d4)+path['basename'](problematicClassEntry)+a0_0x16d1d1(0x1b9)+tmpDir+'\x22',{'stdio':'inherit','shell':a0_0x16d1d1(0x27f)});}catch(a0_0x5cd934){}}const extracted=path[a0_0x16d1d1(0x28d)](tmpDir,path['basename'](problematicClassEntry));if(fs['existsSync'](extracted)){console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x1f4)+extracted);try{const javapCmd='\x22'+JDK+a0_0x16d1d1(0x24a)+extracted+'\x22';console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x28b)),execSync(javapCmd,{'stdio':a0_0x16d1d1(0x25f),'shell':a0_0x16d1d1(0x27f)}),console['log']('---\x20fin\x20javap\x20---\x0a');}catch(a0_0x2c555b){console['warn'](a0_0x16d1d1(0x2cc),a0_0x2c555b[a0_0x16d1d1(0x2ce)]);}}else console[a0_0x16d1d1(0x258)]('Impossible\x20d\x27extraire\x20la\x20classe\x20pour\x20diagnostic.');}catch(a0_0x5d5719){console[a0_0x16d1d1(0x258)](a0_0x16d1d1(0x29c),a0_0x5d5719['message']);}}try{if(problematicClassEntry){const classPathNoDollar=problematicClassEntry[a0_0x16d1d1(0x29f)]('$')[0x0],javaPath=path[a0_0x16d1d1(0x28d)](projectDir,a0_0x16d1d1(0x229),classPathNoDollar['replace'](/\//g,path[a0_0x16d1d1(0x29d)])+a0_0x16d1d1(0x297));if(fs[a0_0x16d1d1(0x1de)](javaPath)){const content=fs[a0_0x16d1d1(0x1b0)](javaPath,a0_0x16d1d1(0x1d8));if(content[a0_0x16d1d1(0x20f)]('//\x20GENERATED_BY_generate-resources')){console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x270)),fs[a0_0x16d1d1(0x232)](javaPath),removeDir(path['join'](BUILD_DIR,a0_0x16d1d1(0x2df))),makeDir(path['join'](BUILD_DIR,a0_0x16d1d1(0x2df)));const javaFilesNow=[],findJavaFilesLocal=_0x21cb06=>{const _0x5645bf=a0_0x16d1d1,_0x53bd58=fs[_0x5645bf(0x22f)](_0x21cb06);for(const _0xaf9823 of _0x53bd58){const _0xca62de=path[_0x5645bf(0x28d)](_0x21cb06,_0xaf9823),_0x4c9076=fs[_0x5645bf(0x1dc)](_0xca62de);if(_0x4c9076[_0x5645bf(0x1c1)]())findJavaFilesLocal(_0xca62de);else{if(_0xaf9823[_0x5645bf(0x276)]('.java'))javaFilesNow[_0x5645bf(0x287)](_0xca62de);}}};if(fs[a0_0x16d1d1(0x1de)](srcPath))findJavaFilesLocal(srcPath);if(fs[a0_0x16d1d1(0x1de)](path['join'](BUILD_DIR,'generated')))findJavaFilesLocal(path[a0_0x16d1d1(0x28d)](BUILD_DIR,a0_0x16d1d1(0x26c)));if(javaFilesNow['length']>0x0){let classPathArgParts=['\x22'+ANDROID_JAR+'\x22'];extractedJars&&extractedJars[a0_0x16d1d1(0x2e1)]>0x0&&classPathArgParts[a0_0x16d1d1(0x287)](...extractedJars[a0_0x16d1d1(0x247)](_0x1b92c9=>'\x22'+_0x1b92c9+'\x22'));const classPathArg=classPathArgParts[a0_0x16d1d1(0x28d)](';'),javaFilesStr2=javaFilesNow[a0_0x16d1d1(0x247)](_0x85fc0f=>'\x22'+_0x85fc0f+'\x22')[a0_0x16d1d1(0x28d)]('\x20'),compileCmd2='\x22'+JDK+a0_0x16d1d1(0x2d1)+classPathArg+a0_0x16d1d1(0x25d)+path[a0_0x16d1d1(0x28d)](BUILD_DIR,'classes')+'\x22\x20'+javaFilesStr2;run(compileCmd2,a0_0x16d1d1(0x2e9));const jarCmd2='\x22'+JDK+a0_0x16d1d1(0x225)+jarPath+a0_0x16d1d1(0x23d)+classesDir+a0_0x16d1d1(0x2e5);run(jarCmd2,a0_0x16d1d1(0x1fd));try{execSync(d8Cmd,{'stdio':a0_0x16d1d1(0x25f),'shell':a0_0x16d1d1(0x27f)}),console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x1b1));}catch(a0_0x2dfcaa){console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x260)),process[a0_0x16d1d1(0x1ef)](0x1);}}else console[a0_0x16d1d1(0x258)](a0_0x16d1d1(0x27d)),process[a0_0x16d1d1(0x1ef)](0x1);}else console[a0_0x16d1d1(0x258)](a0_0x16d1d1(0x2d6));}else console[a0_0x16d1d1(0x258)](a0_0x16d1d1(0x1eb)+javaPath);}}catch(a0_0x43da6a){console[a0_0x16d1d1(0x258)](a0_0x16d1d1(0x1e5),a0_0x43da6a[a0_0x16d1d1(0x2ce)]);}process[a0_0x16d1d1(0x1ef)](0x1);}}else console[a0_0x16d1d1(0x258)]('⚠\x20JAR\x20non\x20trouvé,\x20création\x20DEX\x20vide');console[a0_0x16d1d1(0x2b2)]('\x0a===\x206)\x20AJOUT\x20DU\x20DEX\x20À\x20L\x27APK\x20===');try{if(fs[a0_0x16d1d1(0x1de)](dexPath)){const unsignedApkFull=path['resolve'](BUILD_DIR,path[a0_0x16d1d1(0x265)](apkPath)),classesDexFull=path[a0_0x16d1d1(0x2c6)](dexPath),addDexCmd='\x22'+SEVENZIP+a0_0x16d1d1(0x1d5)+unsignedApkFull+'\x22\x20\x22'+classesDexFull+'\x22';execSync(addDexCmd,{'cwd':path[a0_0x16d1d1(0x2c6)](BUILD_DIR),'stdio':a0_0x16d1d1(0x25f),'shell':a0_0x16d1d1(0x27f),'timeout':0xea60}),console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x1ca));}else console[a0_0x16d1d1(0x258)](a0_0x16d1d1(0x2c3));}catch(a0_0x1ce241){console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x2d8)+a0_0x1ce241[a0_0x16d1d1(0x2ce)]),process[a0_0x16d1d1(0x1ef)](0x1);}console['log'](a0_0x16d1d1(0x2b9));const alignedApkPath=path['join'](BUILD_DIR,a0_0x16d1d1(0x26a)),unsignedApkPath=path[a0_0x16d1d1(0x28d)](BUILD_DIR,a0_0x16d1d1(0x1b2));fs['existsSync'](apkPath)&&fs[a0_0x16d1d1(0x210)](apkPath,unsignedApkPath);try{run('\x22'+ZIPALIGN+a0_0x16d1d1(0x2e3)+unsignedApkPath+a0_0x16d1d1(0x20a)+alignedApkPath+'\x22','Aligning\x20APK');}catch(a0_0x4c2194){console[a0_0x16d1d1(0x258)](a0_0x16d1d1(0x1ba)),fs[a0_0x16d1d1(0x286)](unsignedApkPath,alignedApkPath);}console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x259));const keystorePath=path[a0_0x16d1d1(0x28d)](projectDir,keystoreName);if(!fs[a0_0x16d1d1(0x1de)](keystorePath)){console['log'](a0_0x16d1d1(0x23f));const keygenCmd='\x22'+JDK+'\x5ckeytool\x22\x20-genkey\x20-noprompt\x20-alias\x20key\x20-dname\x20\x22CN='+appConfig['appName']+'\x22\x20-keystore\x20\x22'+keystorePath+'\x22\x20-storepass\x20123456\x20-keypass\x20123456\x20-keyalg\x20RSA\x20-keysize\x202048\x20-validity\x2010000';try{execSync(keygenCmd,{'cwd':projectDir,'stdio':a0_0x16d1d1(0x1d2),'shell':a0_0x16d1d1(0x27f)}),console['log'](a0_0x16d1d1(0x1b6));}catch(a0_0x231a6){console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x1f9)),process[a0_0x16d1d1(0x1ef)](0x1);}}else console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x293)+keystorePath);if(fs[a0_0x16d1d1(0x1de)](alignedApkPath)){const minSdkVersion=appConfig[a0_0x16d1d1(0x208)]||0x15,signCmd='\x22'+APKSIGNER+a0_0x16d1d1(0x22e)+keystorePath+a0_0x16d1d1(0x2ae)+minSdkVersion+a0_0x16d1d1(0x2c7)+APK_NAME+a0_0x16d1d1(0x20a)+alignedApkPath+'\x22';console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x291)),console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x29e)+signCmd),console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x252)+APK_NAME);try{const output=execSync(signCmd,{'cwd':projectDir,'stdio':a0_0x16d1d1(0x1d2),'shell':a0_0x16d1d1(0x27f),'encoding':a0_0x16d1d1(0x1b7)});console['log'](a0_0x16d1d1(0x284));}catch(a0_0x2b3aae){console[a0_0x16d1d1(0x2b2)]('Note:\x20Avertissements\x20de\x20signature\x20détectés\x20(non-bloquants)'),console[a0_0x16d1d1(0x2b2)]('Détails:\x20'+a0_0x2b3aae[a0_0x16d1d1(0x2ce)][a0_0x16d1d1(0x1e8)](0x0,0xc8));}const maxWait=0xbb8,startWait=Date['now']();while(!fs[a0_0x16d1d1(0x1de)](APK_NAME)&&Date[a0_0x16d1d1(0x235)]()-startWait<maxWait){require('child_process')['execSync'](a0_0x16d1d1(0x1ed),{'shell':a0_0x16d1d1(0x27f)});}if(fs[a0_0x16d1d1(0x1de)](APK_NAME)){const stats=fs['statSync'](APK_NAME),endTime=Date[a0_0x16d1d1(0x235)](),buildTime=((endTime-startTime)/0x3e8)[a0_0x16d1d1(0x249)](0x2);console['log']('\x0a===\x20✓\x20COMPILATION\x20RÉUSSIE\x20==='),console[a0_0x16d1d1(0x2b2)]('APK\x20créé:\x20'+APK_NAME),console[a0_0x16d1d1(0x2b2)]('Taille:\x20'+stats[a0_0x16d1d1(0x233)]+a0_0x16d1d1(0x2ca)),console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x214)+buildTime+'s'),console[a0_0x16d1d1(0x2b2)](a0_0x16d1d1(0x1cc));}else console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x25b)),console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x2e8)+APK_NAME),console['error']('Fichiers\x20dans\x20le\x20répertoire:',fs[a0_0x16d1d1(0x22f)](projectDir)[a0_0x16d1d1(0x2e0)](_0x2eb84b=>_0x2eb84b[a0_0x16d1d1(0x276)](a0_0x16d1d1(0x1f5)))),process['exit'](0x1);}else console['error']('ERREUR:\x20aligned.apk\x20introuvable'),console[a0_0x16d1d1(0x231)](a0_0x16d1d1(0x295)+alignedApkPath),process[a0_0x16d1d1(0x1ef)](0x1);