diff --git a/.gitignore b/.gitignore index 46e8321..668135f 100644 --- a/.gitignore +++ b/.gitignore @@ -213,3 +213,1577 @@ Translate/Translate/obj/Debug/net8.0/Translate.GlobalUsings.g.cs Translate/Translate/obj/Debug/net8.0/translate.pdb Translate/Translate/obj/Debug/net8.0/ref/translate.dll Translate/Translate/obj/Debug/net8.0/refint/translate.dll +eNavigator/eNavigatorUI/.vscode/chrome-debug/BrowserMetrics-spare.pma +eNavigator/eNavigatorUI/.vscode/chrome-debug/First Run +eNavigator/eNavigatorUI/.vscode/chrome-debug/first_party_sets.db +eNavigator/eNavigatorUI/.vscode/chrome-debug/first_party_sets.db-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Last Version +eNavigator/eNavigatorUI/.vscode/chrome-debug/Local State +eNavigator/eNavigatorUI/.vscode/chrome-debug/Variations +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AD +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AF +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AL +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AU +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AX +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/AZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BB +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BD +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BF +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BI +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BJ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BQ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BW +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/BZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CC +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CD +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CF +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CI +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CL +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CU +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CV +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CX +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/CZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/DE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/DJ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/DK +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/DM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/DO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/DZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/EC +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/EE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/EG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/EH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ER +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ES +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ET +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/FI +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/FJ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/FM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/FO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/FR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GB +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GD +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GF +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GL +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GP +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GQ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GW +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/GY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/HK +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/HN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/HR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/HT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/HU +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ID +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/IE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/IL +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/IM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/IN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/IQ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/IR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/IS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/IT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/JE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/JM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/JO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/JP +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KI +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KP +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KW +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/KZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LB +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LC +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LI +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LK +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LU +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LV +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/LY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MD +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ME +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MK +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ML +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MP +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MQ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MU +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MV +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MW +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MX +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/MZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NC +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NI +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NL +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NP +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NU +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/NZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/OM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PF +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PK +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PL +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PW +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/PY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/QA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/RE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/RO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/RS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/RU +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/RW +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SB +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SC +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SD +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SI +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SJ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SK +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SL +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ST +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SV +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/SZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TC +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TD +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TH +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TJ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TK +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TL +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TO +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TR +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TV +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TW +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/TZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/UA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/UG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/US +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/UY +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/UZ +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/VC +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/VE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/VG +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/VI +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/VN +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/VU +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/WF +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/WS +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/XK +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/YE +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/YT +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ZA +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ZM +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/ZW +eNavigator/eNavigatorUI/.vscode/chrome-debug/AutofillStates/2024.7.12.235938/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9603/crl-set +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9603/LICENSE +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9603/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9603/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9603/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9610/crl-set +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9610/LICENSE +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9610/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9610/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/CertificateRevocation/9610/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/Crowd Deny/2025.3.4.1202/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/Crowd Deny/2025.3.4.1202/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/Crowd Deny/2025.3.4.1202/Preload Data +eNavigator/eNavigatorUI/.vscode/chrome-debug/Crowd Deny/2025.3.4.1202/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/.org.chromium.Chromium.2hquzb +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/.org.chromium.Chromium.CRAZN7 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/.org.chromium.Chromium.dH6Xi6 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/.org.chromium.Chromium.DnmcsX +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/.org.chromium.Chromium.iKVmv5 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Affiliation Database +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Affiliation Database-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/BrowsingTopicsSiteData +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/BrowsingTopicsSiteData-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/BrowsingTopicsState +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cookies +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cookies-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DIPS +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DIPS-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Favicons +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Favicons-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/heavy_ad_intervention_opt_out.db +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/heavy_ad_intervention_opt_out.db-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/History +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/History-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/InterestGroups +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/InterestGroups-wal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Login Data +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Login Data For Account +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Login Data For Account-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Login Data-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Network Action Predictor +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Network Action Predictor-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Network Persistent State +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Preferences +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/PreferredApps +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/PrivateAggregation +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/PrivateAggregation-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/README +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Reporting and NEL +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Reporting and NEL-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Safe Browsing Cookies +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Safe Browsing Cookies-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/SCT Auditing Pending Reports +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Secure Preferences +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/SharedStorage +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Shortcuts +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Shortcuts-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Top Sites +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Top Sites-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/TransportSecurity +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Trust Tokens +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Trust Tokens-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/trusted_vault.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Visited Links +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Web Data +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Web Data-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/AutofillStrikeDatabase/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/AutofillStrikeDatabase/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/AutofillStrikeDatabase/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/BudgetDatabase/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/BudgetDatabase/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/BudgetDatabase/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0a0fb489a230a4a1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0bd4674e62b97884_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0bf16d9c867a2daa_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0c1dd70f3180f989_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/00d2a42d63db7841_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0d3635ea8555db62_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0e8af0eb6f212e1d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/00e9750514cd514a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0f1b96d8acbc54c4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0f38d426e2d8462a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1a100a0072ee54ce_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1addba6edada2e9a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1affbc558c7f2811_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1bbb0e5c3c783297_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1c336f8588e58c70_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1d01eb226fffa768_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1d3bee652933ffa0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1d09bb23b3998cdc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1d8761faed13d5c5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1e066f6b4fc9b474_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1ee562894820ac70_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2a5e9023eb19227f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2af6b44897b1a680_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2af39d42981e0889_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/02b5e14dfc80cf42_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2b9367e229eaa1ff_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2bb12769f78684a4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2bddb3d029abf83d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2d658284fe26dae9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2d4032085695322d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2dc7d67e12f4affb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2dc15a63709d8e3a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2df7e008cb85230b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2dffc0699ef373d7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2e2b6739a69fd0a3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2e09e6fb29846430_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2e20f2a0f46140c7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2ec449d6d7e569ff_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2ed5ae3816ed6830_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2ef51f0ede11e643_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2f484c2d4233b168_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2f899538adf5bae8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2f4250155b66717c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/03acbe3b78dddb4d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3bb1428a173912f5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/03c3dab0cacce38c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3cc08e6c7c8520f6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3d436dd166dd189b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3eb935c8f2d07d16_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3ef117c4e731b406_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3fd23a31de1aa9b5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3fe561e424006b63_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/04bc77d2f3934972_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4beac0c972a77ba7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4c8aa10094e098c3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4c50e0720f781411_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4ce4425bc7c0c5a8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4cfb2d3a1264a518_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4d5e10c2441b2a20_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4d50c2293fcfc828_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4d7995dac92c6696_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4da27f4bbeb649a4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4dfd3ba21ecdb215_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4e9203b96c32c931_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4f231dd5771baea5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5a54e00228beed4b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5a88a75e50aec531_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5a722e3d0f87a8aa_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5aa75711b462f907_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5af23f7d32acbc2f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5bf1bb6e19dd4f3f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5c5eb60328c65486_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5ed3b0f91e23449c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5efc079d6ff3e2a5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5f91897a69fe3a73_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6ae3b1c6a6e4e158_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6b3e0c8c2284ff25_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6b446973891d17b3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6bdb29d5c2b71a39_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/06bf675b5128bf23_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6c987a3ac29d9e1e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6cc9a0e5bcbed2e1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6cf540e09b40095b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6d0a0443c225095d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6dce5da19946369b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6e1680c48fae9086_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6ec3033511f52862_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7a2880339b2d2689_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/07ab9474baabf5af_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7ae20c37631f4b57_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7b53ff4a370ed1a8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7c2beebd3bc4ed55_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7c066f807447d38d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7cbb2b8333717edb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7d9598262d18b86f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7dc22048c587150b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7e5ab28d2054ba33_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7e99da0bfd064cd8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7e4317fff948564e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7efaccfbb47d7a84_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7f9f3a928e117c65_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7faa73f9dee2f773_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8a089b0af3a6ba24_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8badac44d82d96ce_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8bc98d6f98dd6ca1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8ceb2a5c52e05a3b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8db00ecacc585b54_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8e2d94d4376c93ab_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8e814c2a00399dec_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8f820c27350b37de_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8f02668c0c5ae8c0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8ff3a91513adc560_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9bc098b8cccbcf93_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9c0a8312e401831c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9c70e53847c38d16_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9cbd42fd196c079d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9d4ca6f24f6a0f3c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9ddf347c8160d9da_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9eced8c7b8b67437_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9fb99d746074aa10_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/11d8899db7e42557_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/11e9ac77ce805720_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/13f3738206617928_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/13ffa2b4ceebe804_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/15b72bec5b5b4ca5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/15c1db5237306e29_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/16a6f531cef9584f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/17a5c92c848e1e56_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/19fa243120ba7058_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/20b021a80c30301a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/20b83461296be7db_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/20e4b0fcb00f9dd5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/20f8c756dbfc7ce3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/021fc8a372b4db2e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/22b9a88adc7de473_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/23a5c0461a6e697a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/023aab326f7ca4ae_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/023c853b6a819924_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/24f460e19ab756fa_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/25a9c4dc7adf34c7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/25df1fa95ffaec7e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/29c348f4be877e66_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/31af91d3e3335af4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/33c0b158094ea216_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/36ffef5ba52f0cb8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/37ad0a189f23c740_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/39d896bfd26b9242_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/41a9f5f3c1503744_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/41c087987c2382ae_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/42c5c02c50069a49_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/43c75a00dba82a08_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/46fbdb35f62ae3a4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/47b3abc14004ead1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/47c1683b4da6381d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/47ecac95eca8686c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/49b4e95447a1e8ca_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/49e27805fd5d5941_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/50dd0d91369b90fa_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/51aa3eb270eb264c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/51eb3e9c3a9ebeff_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/53e359996b959f60_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/56e4725e80b8f809_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/56f89ed697204517_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/58af09d3896594ac_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/60dd1e31f5698aa5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/60fc9d222b00874f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/61d0fb8e2ec50b47_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/62cee9ee341be97d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/62ff9c3e1132741f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/65d7871f91a646c2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/66a79f7fcd002328_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/68a08ba6c212bdf6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/70bdca58424e4838_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/72f0d4e3c90e50a2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/74aabb1e4f6d540c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/74b94df4a62112a8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/75c2f3ebdb77ae4e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/75ebd2670dd5b9dc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/75ed5f995d70c7ca_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/78ba7c04a98b8ec0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/78d1c78e79663697_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/79a131ddd0638b20_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/080eda7bc761e158_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/82a55857e68f890a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/82e2aca7dcc80fd1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/82e28df9ed603e63_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/083ee2a9e435e482_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/85aedd2200d384ed_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/85f7315d7b299a44_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/86c051813c43f768_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/86eecd222b4ae151_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/89d83331222e53c2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/90e5d43799e65f8f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/92c85924306ca92f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/93b444b67830bd59_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/93c6f5db73b1857d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/93d81321f8c35eab_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/94ff6ae2ead9a37d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/96a82e6fd3c3dbae_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/97d472ad17a09e71_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/101ed8de0d699c9a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/102d898b131eef1b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/134d7991b1f16ce2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/137d9a06e3b2b9f2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/164bf0dd89475a9d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/179cb74b9cf62054_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/201cd9bd1a34ddd7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/00209b0914edb6fc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/232d45e9a83d6252_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/252f3c92c14244f5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/257b9ada9582cd59_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/382d6b33d8ee4450_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/393d52e9d34a281c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/411e4d3859637210_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/420c0bb2a22aa4d4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/421dffa84b8e6e7c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/437bde8abc8b01c8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/452f530d6d340dbb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0481c23fa4f55727_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/482e5b5da4673333_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/493a1229f626ad87_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/503dc8060bbde6df_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/518ed87a330043c9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/558c25b144f5e339_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/650a6fb5c8c13cb1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/654f0cf247e0871f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/669f9cc804c906dc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/682d11580072eeed_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/764b59ee0918edaf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/00767e3bf3613963_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/810e73f0f05908a7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/816e219f84814a28_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/820afbbc5d94ea79_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/848bbd428ba4bf8b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/860d3c63b3374a95_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/876df51692b3de7f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/928f63ad843ebc19_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/949c213ef980ae58_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/951cd4f906b91619_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/970d39d313391937_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/980d1b2cde38e5f8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/983a571b8702b667_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/1982a060167c78a0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2167e76970110ac9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/2947c593d7b976bd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3167a8c7ee975511_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3405d1653639c199_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/03417ca4c715cfcb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4234cb350db9cfdd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4846d5bc32d48390_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4888efb6e8801d3b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6225de45b25c77eb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6663a150c467348e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6736a8afd768543c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7064b74fce6ec57d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7320cc6282f4beeb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7378ef7ae4d7ffa0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7532cdc84777c4a5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7603e59d3afe67af_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7908a02466229e56_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8212aed81c3ee4a1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8702a043a57d3522_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8857ceba65652826_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8891f3f4912e358b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9041f4451810fd96_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9129f3e48085fc2c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9137c22af8e92409_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9216aa7f23fa0c04_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9754e94edd482054_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/9965b828282a6e6b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/12606f898579d450_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/18983b4bb0e11ea8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/25587c4bce26bf42_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/29206fb343975224_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/29497e1fed536235_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/32194dd0bb16af33_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/40854d3e15f43a59_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/50532f5b450f3840_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/53899c486fe75590_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/69114b121af6cfd6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/73988f892865cdc0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/77234dc44c4a62f6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/79440f4f3943b680_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/81368a571fd353f8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/81748a974032f176_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/85979d6f320b08e9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/87762aa742a57bd6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/90617b7fc2ac4c68_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/119222e8e2ec426b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/138489f334bad118_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0148081ee028a2f2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/0168148b2ae8b26c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/175304b605cce8cc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/224882c1153876e3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/276840cf55b6d378_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/332636a61a1a4cd0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/459639f1537adb8b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/481486e38149712c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/570720e66f22e4db_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/581392a987ce522e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/672150b88a31c4a1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/744854f8054fc435_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/761307ffe29616fe_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/809867e8e6b4ca72_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/904394eeae9b203a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/948325a909d83769_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/952364b4766efcdf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3640545b2742a5fc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5198966a522758f1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5439955c1fba6b45_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/5554085be01bab26_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/6060781ff50be050_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/15145040f7f12f31_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/17179511b76bf644_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/60797177f6fa2495_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/83403720cd6f862b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/235294880a1bd386_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/308775642fc48353_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/401913909aa42260_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/445892548de12d07_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/448820310ea803d1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/820275419acb8a6d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/859430074fc3c947_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/3141746876f4a523_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/7818172825e606c0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/8022019877b53019_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/14383641564a06dd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/4271504103873c3c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a5b57fbc8e034bcf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a6c33adacbe8506b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a8c01c294639af80_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a8d6e59c7d2afcfb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a8f69ebfb46f29e4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a9c3bc6a9e0d86a1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a53d0820f038f6a5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a57a843ad21df102_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a63e5f0bb42b8bb8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a67c70d3fd6780bc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a590e8bfc56ca086_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a611b95e503f5fd5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a10931a1a69c1edf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a534891105b3e625_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a7904172400cb5d5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/a139100911159bd5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/aa0c99b3b0b17dbf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/aa5f31029fd0dcb2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/aa507364dac3e224_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ab2d1d8c2fa6548d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ab3fa0201edf7a80_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ab4f4f01bb58f9bd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ab7a6c9de1731108_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ab7368be61d71212_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/abad948868888ad4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ac0cbebe054d26be_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ac2aad74b2791c36_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ac8c197cf9141314_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/acc5c2bbf5ad5da8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/acd080f9d15b5078_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/acff44dae6755a8c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ad3a92df062b1a2c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/adbee61c62df1b44_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ae3cb5f2e7d2f405_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ae21ed4a4b5e55fd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/aed6dfa2cf63614f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/aef641c9b3c683ce_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/af05b8ddef67dff5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/af9769fa010d464b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b5cca6ee37b08b8b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b5d03d4e138b1fbf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b9b9254eaa6d7961_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b11ee7825ab38c7c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b30b81163b170dca_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b50c76f2cfde9d36_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b60badfdd1c74835_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b9147cf17966e9f5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b9342fc013e98a93_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/b107574ffa8a9512_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ba0e3914f44a083d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ba2feb89db36e17c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bae56f121e46934c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bb37ee141498f83c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bb415d779b1d0784_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bbf9db8a58aa84b0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bc0fb7d6a90f2f8e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bc0fc72965d4e2ac_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bc8cd33893bbb79c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bd9f3b1857b618fa_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bd41d17b37743781_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bd810a6e3d078362_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bdce0e6109b47f55_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bddf87b029f5bac5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/be0b4d7af5896f70_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/be13dc2f1a395bed_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bee17c8085c3f576_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/bf72232f95ae888c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c2efab0a274b112d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c3a0319bc618e776_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c5ce415b92beac63_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c6ee2a65fc7b08f7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c7cc51d6f5281896_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c8fa1c7e70a04c80_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c9ad41221a962d57_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c72f48a3aea0551e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c127d597560a2baf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c292e072c86ce10b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c758c811e133be98_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c839f790ed7bd09f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c6137faad6f2f478_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c9361f5a6e021d98_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c9630e837d3e965a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c30528c930b74eed_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/c9359153cc747231_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cb26d0c5232dc512_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cc0fb5bfd3eaa3fb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ccc66c5395126290_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ccefea220dc5b0a8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cd8cac6ff7873804_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cd93d8a86ed99b98_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cde91af872531f96_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cdee31d1ef510c43_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cdf7b9063975414a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cdf676bab8dd7abd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cdfa73996de710fd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ce5057e18179d2ca_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cedc98f6bbd4cd77_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cfa6a8e613ab1b36_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/cfd1a074b71743df_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d1e3a896a963b310_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d3a1f43e8758f54c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d04c232764c297d9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d4f4b96721eb9e16_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d4fd5aa7c6a55337_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d8fa51dd4b1e6b0d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d26ae16005a21333_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d44faa11ecc2dbab_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d86a7063405c6ac0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d92d4770f43105ff_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d457f780f97a253e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d667b265bb34de0c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d885b4d5f0d3f251_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d1073ec659e263a3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d3869f1d98aa3f16_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d5959e3a3f2cbfaf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d7576d5f00dd1465_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d37930c46a7f2677_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d67591def52a244a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d97662a9eb22805f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d928922fadd71458_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/d60834870a7b351d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/da1db25c0e3935ce_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/da104e24aca267da_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/dae926831eb3636a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/db38854c81c6ecbd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/dd0202e65e16d83a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ddbc6181f275b641_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/deeac2621301a255_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/df2471fed7015ffa_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/dfce60148e4bd0db_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/dfe3930400651aac_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e2c5efd87d0a9f69_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e3e15e177b3aa467_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e5c68e360ac3d91d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e5dfe271eb937c8d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e6ba18841ee0a5d2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e7dd57e45d7f7eef_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e8f1dba8c3306437_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e50cd2315f54da51_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e73f20cd41f932c4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e74ccb92362268ce_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e85ac8952d7783d7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e245e16d9f0f1d6c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e5388b7d95ecdf12_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/e52645bafca7137f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ea5208cac1e3a534_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/eb6bb261458329df_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/eb41a78379534cdd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ec4c7c205aa9bc71_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ec9a10e4821714e4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/eca8c1f18c539b98_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/eca890e3d2f7e101_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ed69dc39f602eb16_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ed5152d08612b2ae_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/edeaa3a9da304e5a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ee6ec258d942c52d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ee971ee482cc2469_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/efaa6782067314e7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f0f7206b3d0542a6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f2c5bb49e2af5579_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f4dba657e1857320_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f5e3f9054cc9c3c6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f5f2d62674e7a936_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f6b1f0f85fbc35fc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f7be5fd113dc69f5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f15a91be97b954a7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f88a7365c4137206_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f94e05c34585dfa2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f380bf29a4b8954f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f612e69a0c8128d8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f4892ee3837a550f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f680230f72e4a86c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f713894f2e69c4a8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f1607311ba1fc7b3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f6088892425c5d64_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/f123997397309b8d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fa989c2ae1a1f7b6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fb30a97ffc5aa136_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fc4c3b79d13b657c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fc8ed6a10b259a5a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fce3abe9b2ebdf4a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fdc29bb14a090dd8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fdc69935efd3bf0b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fe05da4c82a8b22e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/fe28cb3a9f3f0d35_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/feb289bffaff2d07_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ff54a890ae093e64_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/ffbaffad25ab43e7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Cache/Cache_Data/index-dir/the-real-index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/ClientCertificates/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/ClientCertificates/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/ClientCertificates/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/0a6c40fb87866435_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/00b019bfa7ae0aca_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/0cf009985fcc4a31_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/0e7a81002fefa053_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/0eae13b097ef39ab_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/1a848d5ba1d9da73_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/1ac060d4d43687f1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/1ae721bf27996952_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/1b6753ef78015a7c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/1d04bef2abfa72c6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/1da273e328e26897_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/1e2c59325da00830_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2a30697c9aa9b7d8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2ae0b3e2a7b386b7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2b1a8882c9eee352_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2b1ffa2862c1ce9a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2d034a82d03f3337_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2f7a42ddcac67e88_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2fb7acae2f037641_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2fd767a8ae73b55d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/3c878b9c6b2711ba_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/3cd88d1a85541c35_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/3d9b9a333a31dff6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/3f0a8c245e2a507f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/03f122cad8335b14_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/3fd7d957874e232a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/5bc3a646e6bcc707_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/5e0a2cb89d6bdbb2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/5e1b061a6ddc79cd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/5e5bfd612034cd68_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/5f85a38150a6929f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/6bc2c651c0d6f31a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/6c083ed099de1edc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/6c138a7cc5550d6b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/6d0b78a7984afdac_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/6d81ce5a2d8c39f1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/7b4311b2387bfb57_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/7bf6821e52fee8c2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/7f5f1d50bb614e5f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8a97abef9c409a22_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8a34617c17c4b579_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8aff6df68f0dc96c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8c81dd785243063f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8c73333a4dfe61d7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8cd4eae1c08033a9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8d68870333143e6b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8e080e94ff96b703_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8ffe2a5d972b104c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/09a7b9084a99801e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/9b94093e6cbbbbcd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/9be0cb6716587df8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/9c1af8385f6aadcd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/9e8e4d8b8189cbdd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/12e2c4b18dbb728d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/12f835541d1dab48_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/013d518ee7cc0f82_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/13f162154fad7955_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/16af11a7a348424b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/19fc1df34a20b146_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/21b9cb134a6868d9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/21c21c5d6a3777cf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/21da5745358f908a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/24bc1b34cae9933b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/25bb9134685b9002_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/25d24c50d6908129_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/29d5a8880ca97c1c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/30b05ce35f4bdde4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/32e84752da5337b3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/34b57dffbf78b854_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/39e113aab00b8b7b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/44d5079ad5841b25_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/47a4811439b25efc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/49c5284b87bca143_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/52d4fec1241d1282_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/58c1c0b242b5e0c3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/62bb6b5b8c0b581d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/69a2ac0955e7ba62_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/069dc562a85e7ed8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/70a4e14b79e4e6db_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/73b3bde7fda36205_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/78d67e085e223791_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/83b4cd320063f228_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/86b0b750eb02bbcd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/89b595bc24ea0441_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/89db893576032902_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/92e1d1d087833f0b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/93ba11a3dd17446c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/95fb9af30631c702_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/138e76a2a3ff46b3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/158b72197c7cef46_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/172b237bc017862d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/481a039d98aa0e8c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/545f9bf761103f1c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/577d78f09bce4035_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/653a86096b47192c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/672b8245ed7b50ff_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/762df6759f04cf22_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/0835c6c01209a860_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/844ab8cb8e603034_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2810afaaf190228f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2940f1b866286526_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/4147f026c6db26ef_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/5216d040d17acde9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/6793a0a065f88506_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/6966b0e2eb85f5f6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/7019b151dc0ae6de_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/8712c7933ba9e94d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/19152b7f8e8efcb9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/20850c409e895015_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/22510e6f41637f30_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/28428cc358c9a654_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/33421b9681ef958c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/76791e3058f0e8ea_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/90513cc6a23414c3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/99422e7e0aeaae38_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/154000feacda5f15_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/0508217b08f99cf3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/0587842c7942e87a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/617885bb170208d2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/2127222b73f24cdb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/6168649e6abb0ac4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/83884321280c179f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/a1c9b1d6263f92ce_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/a1e8104971366de7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/a2af1a89ad11c65b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/a24e7986ec3623cd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/a92fc2d2b9d9f0a4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/a851b595bd85f42b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/a69226eb7e1fcb4a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/aa33a951e0e2fb80_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/b0ef456cf74c90e6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/b9fea8e9b56f6f59_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/b13e1e19feff933d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/b62fd1180d39c14c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/b77cc7fdb69c2940_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/b97c948285070cc1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/b190a9e98a3382ef_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/b492dd9f8c950142_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/ba678a2fbd8c358c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/ba872977e7eafed0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/bb73c6570251aa2d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/bcbd34f004ee44e8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/bdbb32c140428cdd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/bdcad5d2ccc5e29a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c2b4e8597e4738ff_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c2fc02437f318960_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c4abc04011f93372_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c7cf3d7e1fd24514_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c9f0ddcbab423344_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c041c29b492faf43_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c916ae6dbdf101a4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c1171d10046ce47e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c1217f17274291f3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/c494825d97b4425f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/cb62217fd6d67a53_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/cc3ad7087279ec82_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/ccd66b3f4ba78e13_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/cf89c1b1aabc0399_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/cfb0462fc698bd2c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/d6ee63056e09487e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/d7ad3808076f82b7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/d44b902c1fdedf0f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/d248e09813c348fb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/d9249ef35eeb907b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/d96890d33e3a1aeb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/d941724cafd2b8da_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/d05522793999cdd7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/db80d672a14a2d79_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/dc4c5a1acfc9933b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/dc100c144b67a5e2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/dc8468664a0ce1de_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/dce3001693bfcf17_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/def8392308044387_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/df9da550ea6d3003_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e2ff477fbcffa50d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e3ee5f6523268f92_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e6f3131849f40447_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e8cc62188ae19862_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e37e0bf86bc3effd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e42ff61463b1cb5d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e43f8d2f78e0c1f2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e703d7f949c59f94_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e31381c9078227af_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/e5411017fc547b9d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/ece31a5f0788ad08_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/ede8b2e2df482b40_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/ee08c28427b16c56_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/ef69ae87f07a0e56_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/eff2a3dcbe82a847_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f6c9287d878fb9af_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f9ff70d6603acee9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f013d4ba17d15fe5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f29fc4182015cd04_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f50d9e69434308c0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f0572c9ab2f19dd1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f735b670a4f7a234_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f2508f9f774dff5a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/f19837c40ebfe846_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/fa5e20b09bcfadde_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/fc466e6d9d6351a3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/fd66fe581b302149_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/fed0cd31909da4d4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/js/index-dir/the-real-index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/wasm/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Code Cache/wasm/index-dir/the-real-index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnGraphiteCache/data_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnGraphiteCache/data_1 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnGraphiteCache/data_2 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnGraphiteCache/data_3 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnGraphiteCache/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnWebGPUCache/data_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnWebGPUCache/data_1 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnWebGPUCache/data_2 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnWebGPUCache/data_3 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/DawnWebGPUCache/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Download Service/EntryDB/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Download Service/EntryDB/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Download Service/EntryDB/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Rules/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Rules/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Rules/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Rules/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Rules/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Rules/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Scripts/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Scripts/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Scripts/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Scripts/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Scripts/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension Scripts/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension State/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension State/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension State/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension State/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension State/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Extension State/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Feature Engagement Tracker/AvailabilityDB/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Feature Engagement Tracker/AvailabilityDB/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Feature Engagement Tracker/AvailabilityDB/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Feature Engagement Tracker/EventDB/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Feature Engagement Tracker/EventDB/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Feature Engagement Tracker/EventDB/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GCM Store/Encryption/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GCM Store/Encryption/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GCM Store/Encryption/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GCM Store/Encryption/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GCM Store/Encryption/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GCM Store/Encryption/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GPUCache/data_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GPUCache/data_1 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GPUCache/data_2 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GPUCache/data_3 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/GPUCache/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/1a +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/1b +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/1c +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/1d +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/1e +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/2 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/3 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/19 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/c +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.blob/1/00/d +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.leveldb/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.leveldb/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.leveldb/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.leveldb/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/IndexedDB/chrome-extension_cjpalhdlnbpafiamejdnhcphjbkeiagm_0.indexeddb.leveldb/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/000005.ldb +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/000007.ldb +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/000009.ldb +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/000012.ldb +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/000014.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/000015.ldb +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Storage/leveldb/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Storage/leveldb/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Storage/leveldb/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Storage/leveldb/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Storage/leveldb/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Local Storage/leveldb/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Managed Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Managed Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Managed Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Managed Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Managed Extension Settings/cjpalhdlnbpafiamejdnhcphjbkeiagm/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/PersistentOriginTrials/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/PersistentOriginTrials/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/PersistentOriginTrials/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SegmentInfoDB/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SegmentInfoDB/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SegmentInfoDB/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SignalDB/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SignalDB/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SignalDB/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SignalStorageConfigDB/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SignalStorageConfigDB/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Segmentation Platform/SignalStorageConfigDB/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/index.txt +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/0b4d39f7c888ce6d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/0be2ed6d42a9bc71_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/0c101b2c7692e517_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/1a0a3f4995bb2254_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/1c58bd0ce3c2af44_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/1c767435e2b74058_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/1de2d63e560cff4e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/1deb0446904a14ec_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/2a3fd85baff92641_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/2aa94ba10ce985b3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/2d51d21683d3fde3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/2dd865860acf1df6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/2fb3acb31a6157db_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/02ff7cae1f02ea90_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/3a3c1e7deafaa3f0_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/3ae49ef07252d0e7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/3bc17776b7895e6b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/3cc69b60590705df_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/3e7a9f2e98beca43_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/3fd5acd9febb1950_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/4becd8fef8cdd9a7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/4d91ebf20aa6dc0e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/4e3fd70f6550d2bd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/4f99ee371139dd67_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5ba1b2dd3979e8bb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5c24768b720cca22_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5cf4bb4ec500fc07_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5d9b1ad5657d9e30_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5d2717b456787461_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5de4214638b5ff9f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5ebe3b55686a70ac_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5f8249bcd3c827b3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/6b7ce08a3c9b7b02_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/6bfc300a65ac3801_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/06e9d20a3677562f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/6ee218e86a97ba4f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7a1f7aa11e0c4911_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7a2d990b7e561e5d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7a78c84e93dad7f4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/07af79ed3b8c71b4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7d0f086d22cfa8cd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7f2bc84c488a4bca_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7f008bbe6b6ba551_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7fb67b4c9e30015a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/8a7ca7cce107b5af_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/8b9d0aa2e871fef9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/8b182da30663dbc5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/8bc91157a69279f2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/8c113148776ca08a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/9a054be393d9e993_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/9f5205a7f43d8eec_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/11f06e6887c225a1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/14fba6121164f44b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/16b53456ddc6a407_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/20d9288178ecce81_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/22f456b328716eb1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/23abcef69d11dcd5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/024ee9dc8ad4b28f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/28fc6da58d469960_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/29b4fd6b2e84980d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/30bacaa729ddf977_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/30bd121aaed082b1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/32a556399ad31da9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/038e0e73b9419fb8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/55eaaf868a203587_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/62af9519f2bfccec_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/62f75c6b929a3394_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/70ea646235216476_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/071fd5518b458788_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/80fc0b9486e2e2d3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/82e684081ff46275_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/91c526f662b5d097_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/94d10c26dbf94abd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/181b13709b51420e_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/264be3d81568c0a3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/277efa448ed6e836_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/294b479dd89c282d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/368ff8d500f354db_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/388f7f7e301a6f33_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/453b326c9b483f72_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/503e55b5bfab95f7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/512c17a10870b718_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/537a0c8ca8fd2443_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/688e48d7ca0897b8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/705f7018b47a29cf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/725f7497cd40b2fe_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/822bca40375f23fe_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/824aa4a7e03a50c3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/863f86ae0627beaa_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/899e555350d20456_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/2105dfc980ad01ca_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/2200faf93675cedc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/2594e0654b9f1c9d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/5354af84e21f1d51_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/6592c3dc31836c8f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7494b6ec8f790902_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7568dcb9954ab512_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/9533cefd5b4a4429_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/9647d418c3605ddf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/24028cc485b4fbda_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/35765d1c2d3ebf50_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/45980bdf89d08647_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/56265e5315bdcc87_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/73147f1662329c92_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/90264d330cab75d1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/91499ff8bef69901_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/99089d7968ba6414_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/6465164d74f23ed6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/7651369e11f1ba66_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/96168239cc7d2c90_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/41226524674f27cb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/6009529258122241_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a4d061cb66b90a27_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a9e0fced5020478a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a54f933e8c613d51_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a57c5e14ba469d25_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a79b73092c936306_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a138afc515e3bdd7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a369eaf00da1bff9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a733e074169ad2cb_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a867a39acf1e0343_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a901c78bd3cf7452_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a9524c52054c2256_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/a589173f36eac2b9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/ab63ef0e85babf15_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/ad1a8603189ec68a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/af05b011f8a8484d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/af38e3e7c42594b8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b2d2ed0043bca05d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b6aa7eda6e6aca4a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b6c9cc537f24ac62_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b7b8abeed0f4309b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b13f2bdd129d4593_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b81da747bbed99c3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b1052bab4fd60612_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b02675d98516e1c2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b2944bbdd1bf16e9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/b500347a1d1a8e4b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/baa0a691db5ffdfa_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/bba78a1679c4dac3_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/bd3e0c130699c6bd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/be461a3891907918_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/bf033e3e0c890938_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c2d4052f4766a029_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c9c2d57715ca7870_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c14fe20a087cd28b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c29c988b8c1cea93_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c52ee76d94b0d050_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c442e5a9886bda6a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c9941d683a51bd18_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c18552b0dea7a484_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c81262da6da3cfea_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/c166259646762d91_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/ca6b9c1a3b2abd40_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/cc1bd9bce7706839_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/cd0d94947736d958_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/d3be535795e422c8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/d89f088d3f826fad_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/d91a3f244bb1dce4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/d99d76b9b209f8a9_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/d0145cf6ddf78a7f_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/d507f22da6734180_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/d2807a6000673a76_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/d27467bc8d4c5103_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/dc7d745af4c8f586_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/dc9f4abe71a09653_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/dd2099898fcf2bb1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/de14b5d1d6e407cf_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/dee688216ed694a4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/df889a0bee6afa9a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/e0e75eaf75966c14_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/e1fe2789a2617592_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/e54ac6d9bcf2a8b7_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/e8148a749af52df5_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/e8150f448b975161_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/e762262ba54125ba_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/eafc88d9f3f14543_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/eb767bec8f3de370_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/edae1db52fdc125a_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/ef976bc05b8a2845_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f0d4bba25458ef42_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f3ac3f3ad2f1827c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f3ae20fda594d6c8_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f4bcc398ba7c1f7b_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f8c627ca53d41d37_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f49c875bb6fcc5f1_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f067a9499c0ae505_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f70cba5d315da8ef_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f95dd273c1d239fd_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/f84717a666713fc2_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/fa24731edec0762c_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/fc495a1e1463e3a4_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/fcf71213bf914edc_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/fd2124ea46425448_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/fe45b2d2398e2c7d_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/CacheStorage/32ca933a601fe25c432e90d75876e839c9dbd1e8/f1e25c4a-d383-4006-9fe1-c46b2819198c/index-dir/the-real-index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/Database/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/Database/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/Database/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/Database/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/Database/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/Database/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/ScriptCache/2cc80dabc69f58b6_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/ScriptCache/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Service Worker/ScriptCache/index-dir/the-real-index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Session Storage/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Session Storage/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Session Storage/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Session Storage/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Session Storage/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Session Storage/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sessions/Session_13386251160424781 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sessions/Session_13386252129146048 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sessions/Tabs_13386251840469301 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sessions/Tabs_13386251991261332 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Shared Dictionary/db +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Shared Dictionary/db-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Shared Dictionary/cache/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Shared Dictionary/cache/index-dir/the-real-index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Site Characteristics Database/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Site Characteristics Database/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Site Characteristics Database/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Site Characteristics Database/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Site Characteristics Database/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Site Characteristics Database/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sync Data/LevelDB/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sync Data/LevelDB/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sync Data/LevelDB/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sync Data/LevelDB/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sync Data/LevelDB/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/Sync Data/LevelDB/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/WebStorage/QuotaManager +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/WebStorage/QuotaManager-journal +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/chrome_cart_db/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/chrome_cart_db/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/chrome_cart_db/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/commerce_subscription_db/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/commerce_subscription_db/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/commerce_subscription_db/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/coupon_db/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/coupon_db/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/coupon_db/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/discounts_db/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/discounts_db/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/discounts_db/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/optimization_guide_hint_cache_store/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/optimization_guide_hint_cache_store/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/optimization_guide_hint_cache_store/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/parcel_tracking_db/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/parcel_tracking_db/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/parcel_tracking_db/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/metadata/000003.log +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/metadata/CURRENT +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/metadata/LOCK +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/metadata/LOG +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/metadata/LOG.old +eNavigator/eNavigatorUI/.vscode/chrome-debug/Default/shared_proto_db/metadata/MANIFEST-000001 +eNavigator/eNavigatorUI/.vscode/chrome-debug/Dictionaries/en-US-10-1.bdic +eNavigator/eNavigatorUI/.vscode/chrome-debug/FileTypePolicies/67/download_file_types.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/FileTypePolicies/67/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/FileTypePolicies/67/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/FileTypePolicies/67/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/FirstPartySetsPreloaded/2025.2.25.0/LICENSE +eNavigator/eNavigatorUI/.vscode/chrome-debug/FirstPartySetsPreloaded/2025.2.25.0/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/FirstPartySetsPreloaded/2025.2.25.0/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/FirstPartySetsPreloaded/2025.2.25.0/sets.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/FirstPartySetsPreloaded/2025.2.25.0/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/GrShaderCache/data_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/GrShaderCache/data_1 +eNavigator/eNavigatorUI/.vscode/chrome-debug/GrShaderCache/data_2 +eNavigator/eNavigatorUI/.vscode/chrome-debug/GrShaderCache/data_3 +eNavigator/eNavigatorUI/.vscode/chrome-debug/GrShaderCache/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/GraphiteDawnCache/data_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/GraphiteDawnCache/data_1 +eNavigator/eNavigatorUI/.vscode/chrome-debug/GraphiteDawnCache/data_2 +eNavigator/eNavigatorUI/.vscode/chrome-debug/GraphiteDawnCache/data_3 +eNavigator/eNavigatorUI/.vscode/chrome-debug/GraphiteDawnCache/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/MEIPreload/1.0.7.1652906823/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/MEIPreload/1.0.7.1652906823/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/MEIPreload/1.0.7.1652906823/preloaded_data.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/MEIPreload/1.0.7.1652906823/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/OnDeviceHeadSuggestModel/20250226.732734858.14/cr_en-us_500000_index.bin +eNavigator/eNavigatorUI/.vscode/chrome-debug/OnDeviceHeadSuggestModel/20250226.732734858.14/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/OnDeviceHeadSuggestModel/20250226.732734858.14/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/OnDeviceHeadSuggestModel/20250226.732734858.14/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/OptimizationHints/490/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/OptimizationHints/490/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/OptimizationHints/490/optimization-hints.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/OptimizationHints/490/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/OriginTrials/1.0.0.17/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/OriginTrials/1.0.0.17/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/OriginTrials/1.0.0.17/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1244/crs.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1244/ct_config.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1244/kp_pinslist.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1244/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1244/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1244/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1249/crs.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1249/ct_config.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1249/kp_pinslist.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1249/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1249/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/PKIMetadata/1249/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/PrivacySandboxAttestationsPreloaded/2025.2.21.0/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/PrivacySandboxAttestationsPreloaded/2025.2.21.0/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/PrivacySandboxAttestationsPreloaded/2025.2.21.0/privacy-sandbox-attestations.dat +eNavigator/eNavigatorUI/.vscode/chrome-debug/PrivacySandboxAttestationsPreloaded/2025.2.21.0/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/SSLErrorAssistant/7/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/SSLErrorAssistant/7/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/SSLErrorAssistant/7/ssl_error_assistant.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/SSLErrorAssistant/7/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/SafetyTips/3064/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/SafetyTips/3064/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/SafetyTips/3064/safety_tips.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/SafetyTips/3064/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/SafetyTips/3065/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/SafetyTips/3065/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/SafetyTips/3065/safety_tips.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/SafetyTips/3065/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/ShaderCache/data_0 +eNavigator/eNavigatorUI/.vscode/chrome-debug/ShaderCache/data_1 +eNavigator/eNavigatorUI/.vscode/chrome-debug/ShaderCache/data_2 +eNavigator/eNavigatorUI/.vscode/chrome-debug/ShaderCache/data_3 +eNavigator/eNavigatorUI/.vscode/chrome-debug/ShaderCache/index +eNavigator/eNavigatorUI/.vscode/chrome-debug/Subresource Filter/Indexed Rules/36/9.55.0/Ruleset Data +eNavigator/eNavigatorUI/.vscode/chrome-debug/Subresource Filter/Unindexed Rules/9.55.0/Filtering Rules +eNavigator/eNavigatorUI/.vscode/chrome-debug/Subresource Filter/Unindexed Rules/9.55.0/LICENSE.txt +eNavigator/eNavigatorUI/.vscode/chrome-debug/Subresource Filter/Unindexed Rules/9.55.0/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/Subresource Filter/Unindexed Rules/9.55.0/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/Subresource Filter/Unindexed Rules/9.55.0/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/TpcdMetadata/2025.3.10.1/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/TpcdMetadata/2025.3.10.1/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/TpcdMetadata/2025.3.10.1/metadata.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/TpcdMetadata/2025.3.10.1/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/TpcdMetadata/2025.3.8.1/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/TpcdMetadata/2025.3.8.1/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/TpcdMetadata/2025.3.8.1/metadata.pb +eNavigator/eNavigatorUI/.vscode/chrome-debug/TpcdMetadata/2025.3.8.1/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/TrustTokenKeyCommitments/2025.1.17.1/keys.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/TrustTokenKeyCommitments/2025.1.17.1/LICENSE +eNavigator/eNavigatorUI/.vscode/chrome-debug/TrustTokenKeyCommitments/2025.1.17.1/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/TrustTokenKeyCommitments/2025.1.17.1/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/TrustTokenKeyCommitments/2025.1.17.1/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/english_wikipedia.txt +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/female_names.txt +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/male_names.txt +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/passwords.txt +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/ranked_dicts +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/surnames.txt +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/us_tv_and_film.txt +eNavigator/eNavigatorUI/.vscode/chrome-debug/ZxcvbnData/3/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/eeigpngbgcognadeebkilcpcaedhellh_1.8814cb6cab024b119ab991ad7acd74f4df7bc68bbf86c0903c8be9852a5baa55 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/efniojlnjndmcbiieegkicadnoecjjef_1.d66493bde74e078e8c2805eb80b3e6c086436545a859af43deb91d54788319b9 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/gcmjkmgdlgnkkcocmoeiminaijmmjnii_1.6af08fc2b0dd497e30e40290efcb817b9b1f7dc7f734ab1a9dd000ae01f36050 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/ggkkehgbnfjpeggfpleeakpidbkibbmn_1.d1946dacbc7fa6bebbf52d4f09160b462f69342198cd34de08f94b27c32a0c73 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/giekcmmlnklenlaomppkphknjmnnpneh_1.3eb16d6c28b502ac4cfee8f4a148df05f4d93229fa36a71db8b08d06329ff18a +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/gonpemdgkjcecdgbnaabipppbmgfggbe_1.7c7087f1e01a939b41851a790125c2fed32542cba2ff03cd364e3292810704b2 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/hfnkpimlhhgieaddgfemjhofmfblmnib_1.1950bceba96ac03150a63ab2cef89c42b25a408d9c9182c54bb1875c9ef738e8 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/jamhcnnkihinmdlkakkaopbjbbcngflc_1.c52c62a7c50daf7d3f73ec16977cd4b0ea401710807d5dbe3850941dd1b73a70 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/jflhchccmppkfebkiaminageehmchikm_1.9f64d174f399031b59ba557c2fc3d355f329ade8a1114cab159b928ca1b0a237 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/jflookgnkcckhobaglndicnbbgbonegd_1.63868a769fa0a0d9b29403d397874e07c21258dc176528df388e09e42ce1461d +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/khaoiebndkojlmppeemjhbpbandiljpe_1.05399c5840405f4af2454470ceccaa3d097f07e271705cf37c1e5559ce793eeb +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/kiabhabjdbkjdpjbpigfodbdjmbglcoo_1.1987650928271ad440c2b8a50f309139de82c742fb6f1f3ea055b35718ac46e7 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/laoigpblnllgcgjnjnllmfolckpjlhki_1.29661be65c8fb50d3d4df2fe040a1cc6dd525f50a95850aae6a191301c3de744 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/llkgjffcdpffmhiakmfcdcblohccpfmo_1.2638e3c2d1fa1d417bfdc31dd21bc938f106d3b436a6488b41b014ca9e2b7541 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/lmelglejhemejginpboagddgdfbepgmp_1.735e672dfc473cd68910fe5beb9b40609ef66162b030f06af3aa37876febd90d +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/mfhmdacoffpmifoibamicehhklffanao_1.5d909a5170a955937f7e351112e7cf8cfad773e1fdc4f7880c370aee193bd9cd +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/niikhdgajlphfehepabhhblakbdgeefj_1.780ed8a4eda82d8fef820781c32c60705576b4feb90d1fc4306966ecc4ebaf73 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/obedbbhbpmojnkanicioggnmelmoomoc_1.a77dc10f747e4dd1922e396acb7a68ae40ad1a5e50da0b1d3c2c70933e40b8c6 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/oimompecagnajdejgnnjijobebaeigek_1.c28ebc536851070d5ecefe023e5308aacfee71d18e5b0fc27d152964d1312836 +eNavigator/eNavigatorUI/.vscode/chrome-debug/component_crx_cache/ojhpjlocmbogdgmfpkhlaaeamibhnphh_1.545666a4efd056351597bb386aea1368105ededc976ed5650d8682daab9f37ff +eNavigator/eNavigatorUI/.vscode/chrome-debug/extensions_crx_cache/aleakchihdccplidncghkekgioiakgal_1.2007b59ca6741d4e9552b51f25a19010041a7e775020cd0add78607d75f8deec +eNavigator/eNavigatorUI/.vscode/chrome-debug/extensions_crx_cache/cjpalhdlnbpafiamejdnhcphjbkeiagm_1.94025c6277ef9e9568c92f2d4364c6b2d98503a3c2bbfe324b265971949d9679 +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-af.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-as.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-be.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-bg.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-bn.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-cs.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-cu.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-cy.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-da.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-de-1901.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-de-1996.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-de-ch-1901.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-el.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-en-gb.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-en-us.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-es.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-et.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-eu.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-fr.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-ga.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-gl.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-gu.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-hi.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-hr.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-hu.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-hy.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-it.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-ka.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-kn.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-la.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-lt.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-lv.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-ml.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-mn-cyrl.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-mr.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-mul-ethi.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-nb.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-nl.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-nn.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-or.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-pa.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-pt.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-ru.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-sk.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-sl.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-sq.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-sv.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-ta.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-te.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-tk.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-uk.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/hyph-und-ethi.hyb +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/manifest.fingerprint +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/manifest.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/hyphen-data/120.0.6050.0/_metadata/verified_contents.json +eNavigator/eNavigatorUI/.vscode/chrome-debug/segmentation_platform/ukm_db +eNavigator/eNavigatorUI/.vscode/chrome-debug/segmentation_platform/ukm_db-journal diff --git a/eNavigator/MarketDataLib/MarketDataLib.csproj b/eNavigator/MarketDataLib/MarketDataLib.csproj new file mode 100644 index 0000000..1111f48 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataLib.csproj @@ -0,0 +1,12 @@ + + + net8.0 + enable + enable + CS0108;CS8602;CS8601;CS8620;CS8618;CS8603;CS8767;CS8625;CS8604;CS8600;CS8604 + + + + + + diff --git a/eNavigator/MarketDataLib/MarketDataModel/BollingerBand.cs b/eNavigator/MarketDataLib/MarketDataModel/BollingerBand.cs new file mode 100755 index 0000000..55deb27 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/BollingerBand.cs @@ -0,0 +1,161 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Linq; +using MarketData.Utils; +using MarketData.Numerical; + +namespace MarketData.MarketDataModel +{ + public class BollingerBandElementsByDate : Dictionary + { + public BollingerBandElementsByDate() + { + } + } + public class BollingerBands : BollingerBandElements + { + public BollingerBands() + { + } + public BollingerBands(List bollingerBandElements) + { + foreach(BollingerBandElement bollingerBandElement in bollingerBandElements)Add(bollingerBandElement); + } + public static String GetHeader(int movingAverageDays) + { + StringBuilder sb = new StringBuilder(); + sb.Append("Date,Symbol,Open,High,Low,Close,Volume,SMA(").Append(movingAverageDays).Append("),StDev(").Append(movingAverageDays).Append("),K,L,K-1,L+1"); + return sb.ToString(); + } + public BollingerBandElementsByDate GetBollingerBandElementsByDate() + { + BollingerBandElementsByDate bollingerBandElementsByDate = new BollingerBandElementsByDate(); + for (int index = 0; index < Count; index++) + { + BollingerBandElement bollingerBandElement = this[index]; + if (!bollingerBandElementsByDate.ContainsKey(bollingerBandElement.Date)) bollingerBandElementsByDate.Add(bollingerBandElement.Date, bollingerBandElement); + } + return bollingerBandElementsByDate; + } + } + public class BollingerBandElements : List + { + public BollingerBandElements() + { + } + public BollingerBandElements(List bollingerBandElements) + { + foreach(BollingerBandElement bollingerBandElement in bollingerBandElements)Add(bollingerBandElement); + } + public LeastSquaresResult LeastSquaresFitClose() + { + double[] closingPrices=(from BollingerBandElement bollingerBandElement in this select bollingerBandElement.Close).ToList().ToArray(); + LeastSquaresResult leastSquaresResult=Numerics.LeastSquares(closingPrices); + return leastSquaresResult; + } + } + public class BollingerBandElement + { + private DateTime date; + private String symbol; + private double open; + private double high; + private double low; + private double close; + private long volume; + private double smaN; + private double stdevN; + private double k; + private double l; + private double kl1; + private double lp1; + + public BollingerBandElement() + { + } + public DateTime Date + { + get { return date; } + set { date = value; } + } + public String Symbol + { + get { return symbol; } + set { symbol = value; } + } + public double Open + { + get { return open; } + set { open = value; } + } + public double High + { + get { return high; } + set { high = value; } + } + public double Low + { + get { return low; } + set { low = value; } + } + public double Close + { + get { return close; } + set { close = value; } + } + public double SMAN + { + get { return smaN; } + set { smaN = value; } + } + public double StDevN + { + get { return stdevN; } + set { stdevN = value; } + } + public long Volume + { + get { return volume; } + set { volume = value; } + } + public double K + { + get { return k; } + set { k = value; } + } + public double L + { + get { return l; } + set { l = value; } + } + public double KL1 + { + get { return kl1; } + set { kl1 = value; } + } + public double LP1 + { + get { return lp1; } + set { lp1 = value; } + } + public override String ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append(Utility.DateTimeToStringMMSDDSYYYY(Date)).Append(","); + sb.Append(Symbol).Append(","); + sb.Append(Open).Append(","); + sb.Append(High).Append(","); + sb.Append(Low).Append(","); + sb.Append(Close).Append(","); + sb.Append(Volume).Append(","); + sb.Append(SMAN).Append(","); + sb.Append(StDevN).Append(","); + sb.Append(K).Append(","); + sb.Append(L).Append(","); + sb.Append(KL1).Append(","); + sb.Append(LP1); + return sb.ToString(); + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/Constants.cs b/eNavigator/MarketDataLib/MarketDataModel/Constants.cs new file mode 100755 index 0000000..d97ef18 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/Constants.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MarketData.MarketDataModel +{ + public class Constants + { + public const String CONST_ALL ="{All}"; + public const String CONST_DASHES = "---"; + public const String NA = "N.A."; + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/GainLoss.cs b/eNavigator/MarketDataLib/MarketDataModel/GainLoss.cs new file mode 100755 index 0000000..794cf5f --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/GainLoss.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MarketData.MarketDataModel +{ + public class GainLossSummaryItemCollection : List + { + public GainLossSummaryItemCollection() + { + } + public GainLossSummaryItemCollection(List gainLossSummaryItemCollection) + { + foreach(GainLossSummaryItem gainLossSummaryItem in gainLossSummaryItemCollection)Add(gainLossSummaryItem); + } + public GainLossSummaryItemCollection SortByChange() + { + GainLossSummaryItemCollection gainLossSummaryCollection=new GainLossSummaryItemCollection((from GainLossSummaryItem gainLossSummaryItem in this orderby gainLossSummaryItem.Date descending,gainLossSummaryItem.Change descending, gainLossSummaryItem.Symbol descending select gainLossSummaryItem).ToList()); + return gainLossSummaryCollection; + } + } + public class GainLossSummaryItem + { + public GainLossSummaryItem() + { + } + public DateTime Date{get;set;} + public String Symbol{get;set;} + public String CompanyName{get;set;} + public double CurrentGainLoss{get;set;} + public double PreviousGainLoss{get;set;} + public double Change{get;set;} + public double ChangePercent{get;set;} + public bool HasStopLimit{get;set;} + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/GainLoss/DMAValue.cs b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/DMAValue.cs new file mode 100755 index 0000000..278379e --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/DMAValue.cs @@ -0,0 +1,35 @@ +using System; + +namespace MarketData.MarketDataModel.GainLoss +{ + public class DMAValue + { + private DateTime date; + private double value; + private double maValue; + + public DMAValue() + { + } + public DMAValue(DateTime date, double value) + { + this.date = date; + this.value = value; + } + public DateTime Date + { + get { return date; } + set { date = value; } + } + public double Value + { + get { return value; } + set { this.value = value; } + } + public double MAValue + { + get { return maValue; } + set { this.maValue = value; } + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/GainLoss/DMAValues.cs b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/DMAValues.cs new file mode 100755 index 0000000..d78bbe0 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/DMAValues.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; + +namespace MarketData.MarketDataModel.GainLoss +{ + public class DMAValues : List + { + public DMAValues() + { + } + public float[] GetValues(int startIndex, int count) + { + if (startIndex + count > Count) return null; + float[] valuesArray = new float[count]; + for (int index = startIndex, arrayIndex = 0; index < startIndex + count; index++, arrayIndex++) + { + valuesArray[arrayIndex] = (float)this[index].Value; + } + return valuesArray; + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossCompoundModel.cs b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossCompoundModel.cs new file mode 100755 index 0000000..1e0cfa4 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossCompoundModel.cs @@ -0,0 +1,19 @@ +using System; + +namespace MarketData.MarketDataModel.GainLoss +{ +// ************************************************************************************************************************************************************** +// *********************************************** G A I N / L O S S C O M P O U N D M O D E L **************************************** +// ************************************************************************************************************************************************************** +// This GainLossModel will be used to model the GainLossView in terms of surfacing the Active Gain/Loss, Active Exposure, Active Gain/Loss%, Total Gain/Loss, Total Gain/Loss % data + public class GainLossCompoundModel + { + public DateTime Date{get;set;} + public double ActiveExposure{get;set;} + public double ActiveGainLoss{get;set;} + public double ActiveGainLossPercent{get;set;} + public double TotalGainLoss{get;set;} + public double TotalGainLossPercent{get;set;} + public double TotalDividendsPaid{get;set;} + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossCompoundModelCollection.cs b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossCompoundModelCollection.cs new file mode 100755 index 0000000..922ad99 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossCompoundModelCollection.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; + +namespace MarketData.MarketDataModel.GainLoss +{ +// The GainLossCompoundModelCollection contains both the active gain loss and the total gain loss time series data + public class GainLossCompoundModelCollection : List + { + public GainLossCompoundModelCollection() + { + } + public GainLossCompoundModelCollection(List items) + { + foreach(GainLossCompoundModel item in items)Add(item); + } + public GainLossCompoundModelCollection(GainLossCollection activeGainLossCollection,TotalGainLossCollection totalGainLossCollection) + { + if(null==activeGainLossCollection||null==totalGainLossCollection)return; + Dictionary activeGainLossCollectionByDate=new Dictionary(); + Dictionary totalGainLossCollectionByDate=new Dictionary(); + foreach(GainLossItem gainLossItem in activeGainLossCollection)if(!activeGainLossCollectionByDate.ContainsKey(gainLossItem.Date))activeGainLossCollectionByDate.Add(gainLossItem.Date,gainLossItem); + foreach(TotalGainLossItem gainLossItem in totalGainLossCollection)if(!totalGainLossCollectionByDate.ContainsKey(gainLossItem.Date))totalGainLossCollectionByDate.Add(gainLossItem.Date,gainLossItem); + List dates=new List(activeGainLossCollectionByDate.Keys); + dates.Sort(); + foreach(DateTime date in dates) + { + GainLossItem activeGainLossItem=activeGainLossCollectionByDate[date]; + if(!totalGainLossCollectionByDate.ContainsKey(date))continue; + TotalGainLossItem totalGainLossItem=totalGainLossCollectionByDate[date]; + GainLossCompoundModel gainLossModel=new GainLossCompoundModel(); + gainLossModel.Date=activeGainLossItem.Date; + gainLossModel.ActiveExposure=activeGainLossItem.Exposure; + gainLossModel.ActiveGainLoss=activeGainLossItem.GainLoss; + gainLossModel.ActiveGainLossPercent=activeGainLossItem.GainLossPercent; + gainLossModel.TotalGainLoss=totalGainLossItem.TotalGainLoss; + gainLossModel.TotalGainLossPercent=totalGainLossItem.TotalGainLossPercent; + gainLossModel.TotalDividendsPaid=totalGainLossItem.TotalDividendsPaid; + Add(gainLossModel); + } + } + public DMAValues DMAValuesActiveGainLoss + { + get + { + DMAValues dmaValues = new DMAValues(); + foreach (GainLossCompoundModel gainLoss in this) + { + dmaValues.Add(new DMAValue(gainLoss.Date,gainLoss.ActiveGainLoss)); + } + return dmaValues; + } + } + public DMAValues DMAValuesTotalGainLoss + { + get + { + DMAValues dmaValues = new DMAValues(); + foreach (GainLossCompoundModel gainLoss in this) + { + dmaValues.Add(new DMAValue(gainLoss.Date,gainLoss.TotalGainLoss)); + } + return dmaValues; + } + } + public DMAValues DMAValuesActiveGainLossPercent + { + get + { + DMAValues dmaValues = new DMAValues(); + foreach (GainLossCompoundModel gainLoss in this) + { + dmaValues.Add(new DMAValue(gainLoss.Date,gainLoss.ActiveGainLossPercent)); + } + return dmaValues; + } + } + public DMAValues DMAValuesTotalGainLossPercent + { + get + { + DMAValues dmaValues = new DMAValues(); + foreach (GainLossCompoundModel gainLoss in this) + { + dmaValues.Add(new DMAValue(gainLoss.Date,gainLoss.TotalGainLossPercent)); + } + return dmaValues; + } + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossItem.cs b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossItem.cs new file mode 100755 index 0000000..2bfa7a0 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/GainLossItem.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using MarketData.Utils; + +namespace MarketData.MarketDataModel.GainLoss +{ +// ********************************************************************************************************************************************************************* +// ************************************************************************ G A I N L O S S ************************************************************************** +// ********************************************************************************************************************************************************************* +// This gain loss provides a picture of the Active Gain/Loss. The gain loss on open positions + public class GainLossItem : IComparable + { + private DateTime date; + private double gainLoss; + private double gainLossPercent; + private double exposure; + private double dividends; + private bool valueIsPercent; + public GainLossItem() + { + } + public GainLossItem(DateTime date, double gainLoss,double exposure,bool valueIsPercent) + { + this.date = date; + this.gainLoss = gainLoss; + this.exposure = exposure; + this.valueIsPercent = valueIsPercent; + } + public GainLossItem(DateTime date, double gainLoss,double gainLossPercent,double exposure,bool valueIsPercent) + { + this.date = date; + this.gainLoss = gainLoss; + this.gainLossPercent=gainLossPercent; + this.exposure = exposure; + this.valueIsPercent = valueIsPercent; + } + public GainLossItem(DateTime date, double gainLoss,double gainLossPercent,double exposure,double dividends,bool valueIsPercent) + { + this.date = date; + this.gainLoss = gainLoss; + this.gainLossPercent=gainLossPercent; + this.exposure = exposure; + this.dividends=dividends; + this.valueIsPercent = valueIsPercent; + } + public DateTime Date + { + get { return date; } + } + public double Exposure + { + get + { + return exposure; + } + } + public double GainLoss + { + get { return gainLoss; } + } + public double Dividends + { + get{return dividends;} + } + public double GainLossPercent + { + get { return gainLossPercent; } + } + public bool ValueIsPercent + { + get + { + return valueIsPercent; + } + set + { + valueIsPercent = value; + } + } + public String FormattedGainLoss + { + get + { + if (valueIsPercent) return Utility.FormatNumber(gainLoss); + return Utility.FormatCurrency(gainLoss); + } + } + public int CompareTo(Object obj) + { + if (!obj.GetType().IsInstanceOfType(this)) throw new Exception("Expected GainLoss"); + GainLossItem that = (GainLossItem)obj; + return date.CompareTo(that.Date); + } + } + public class GainLossCollection : List + { + public GainLossCollection(ICollection gainLoss) + : base(gainLoss) + { + } + public DMAValues DMAValues + { + get + { + DMAValues dmaValues = new DMAValues(); + foreach (GainLossItem gainLoss in this) + { + dmaValues.Add(new DMAValue(gainLoss.Date,gainLoss.GainLoss)); + } + return dmaValues; + } + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/GainLoss/TotalGainLossCollection.cs b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/TotalGainLossCollection.cs new file mode 100755 index 0000000..27910ab --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/TotalGainLossCollection.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace MarketData.MarketDataModel.GainLoss +{ +// **************************************************************************************************************************************************** +// ********************************************************************** T O T A L G A I N L O S S ************************************************* +// **************************************************************************************************************************************************** +// This Gain/Loss provides a picture of the total Gain/Loss. This is Gain/Loss generated by all trades + public class TotalGainLossCollection : List + { + public TotalGainLossCollection(ICollection gainLoss) + : base(gainLoss) + { + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/GainLoss/TotalGainLossItem.cs b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/TotalGainLossItem.cs new file mode 100755 index 0000000..dd10f9b --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/GainLoss/TotalGainLossItem.cs @@ -0,0 +1,49 @@ +using System; +//using System.Collections.Generic; +//using System.Linq; +//using System.Text; +//using System.IO; +//using MarketData.Utils; +//using System.Collections.ObjectModel; +//using MarketData.Generator.GainLoss; +//using MarketData.DataAccess; + +namespace MarketData.MarketDataModel.GainLoss +{ +// **************************************************************************************************************************************************** +// ********************************************************************** T O T A L G A I N L O S S ************************************************* +// **************************************************************************************************************************************************** +// This Gain/Loss provides a picture of the total Gain/Loss. This is Gain/Loss generated by all trades + public class TotalGainLossItem : IComparable + { + public TotalGainLossItem(DateTime date,double totalGainLoss,double totalGainLossPercent,double totalExposure,double totalMarketValue) + { + Date=date; + TotalGainLoss=totalGainLoss; + TotalExposure=totalExposure; + TotalMarketValue=totalMarketValue; + TotalGainLossPercent=totalGainLossPercent; + } + public TotalGainLossItem(DateTime date,double totalGainLoss,double totalGainLossPercent,double totalExposure,double totalMarketValue,double totalDividendsPaid) + { + Date=date; + TotalGainLoss=totalGainLoss; + TotalExposure=totalExposure; + TotalMarketValue=totalMarketValue; + TotalGainLossPercent=totalGainLossPercent; + TotalDividendsPaid=totalDividendsPaid; + } + public DateTime Date{get;private set;} + public double TotalGainLoss{get;private set;} + public double TotalGainLossPercent{get;private set;} + public double TotalExposure{get;private set;} + public double TotalMarketValue{get;private set;} + public double TotalDividendsPaid{get;private set;} + public int CompareTo(Object obj) + { + if (!obj.GetType().IsInstanceOfType(this)) throw new Exception("Expected GainLoss"); + TotalGainLossItem that = (TotalGainLossItem)obj; + return Date.CompareTo(that.Date); + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/Headlines.cs b/eNavigator/MarketDataLib/MarketDataModel/Headlines.cs new file mode 100755 index 0000000..18ea819 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/Headlines.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MarketData.MarketDataModel +{ + public class Headlines : List + { + } + public class Headline + { + public Headline() + { + } + public Headline(Headline headline) + { + Date=headline.Date; + Symbol=headline.Symbol; + CompanyName=headline.CompanyName; + Entry=headline.Entry; + Modified=headline.Modified; + Source=headline.Source; + } + public Headline(String symbol,DateTime date,String entry) + { + Symbol=symbol; + Date=date; + Entry=entry; + Modified=DateTime.Now; + } + public DateTime Date{get;set;} + public String Symbol{get;set;} + public String CompanyName{get;set;} + public String Entry{get;set;} + public DateTime Modified{get;set;} + public String Source{get;set;} + } +} + diff --git a/eNavigator/MarketDataLib/MarketDataModel/MobileDataModels.cs b/eNavigator/MarketDataLib/MarketDataModel/MobileDataModels.cs new file mode 100755 index 0000000..093aeab --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/MobileDataModels.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using MarketData.Generator; + +namespace MarketData.MarketDataModel +{ +// These are models that were designed to be consumed by the mobile platform + public class PortfolioTradesWithParityPrice + { + public PortfolioTradesWithParityPrice(PortfolioTrades portfolioTrades, Price parityPrice) + { + Trades = portfolioTrades; + ParityPrice = parityPrice; + } + public Price ParityPrice { get; set; } + public PortfolioTrades Trades { get; set; } + } +// ************************************************************************************ + public class GainLossSummaryItemDetail: GainLossSummaryItem + { + public GainLossSummaryItemDetail() + { + } + public GainLossSummaryItemDetail(GainLossSummaryItem gainLossSummaryItem) + { + this.Date=gainLossSummaryItem.Date; + this.Symbol=gainLossSummaryItem.Symbol; + this.CompanyName=gainLossSummaryItem.CompanyName; + this.CurrentGainLoss=gainLossSummaryItem.CurrentGainLoss; + this.PreviousGainLoss=gainLossSummaryItem.PreviousGainLoss; + this.Change=gainLossSummaryItem.Change; + this.ChangePercent=gainLossSummaryItem.ChangePercent; + this.HasStopLimit = gainLossSummaryItem.HasStopLimit; + } + public int Lots{get;set;} + public double Shares{get;set;} + public double Exposure{get;set;} + public double DividendYield{get;set;} // decimal + public double AnnualDividend{get;set;} // amount + public ParityElement ParityElement{get;set;} + public String ParityElementDescription{get{return null==ParityElement?"":ParityElement.ToString();}} + public double AllTimeGainLossPercent{get;set;} + public double PercentDistanceFromAllTimeGainLossPercent{get;set;} + public Price LatestPrice{get;set;} + public double PriceChange{get;set;} + public bool HasStopLimit{get;set;} + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/ModelTrade.cs b/eNavigator/MarketDataLib/MarketDataModel/ModelTrade.cs new file mode 100755 index 0000000..01637bd --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/ModelTrade.cs @@ -0,0 +1,96 @@ +using System; +using System.Text; +using MarketData.Utils; +using MarketData.MarketDataModel; + +namespace MarketData.MarketDataModel +{ + public class ModelTrade + { + public enum TradeType { Buy, Sell }; + private DateTime tradeDate; + private String symbol; + private int shares; + private double price; + private TradeType tradeType; + private int daysHeld; + private double gainLoss; + private double exposure; + private double returnOnPosition; + private String comment; + + public ModelTrade() + { + } + public String Symbol + { + get { return symbol; } + set { symbol = value; } + } + public DateTime TradeDate + { + get { return tradeDate; } + set { tradeDate = value; } + } + public int Shares + { + get { return shares; } + set { shares = value; } + } + public double Price + { + get { return price; } + set { price = value; } + } + public int DaysHeld + { + get { return daysHeld; } + set { daysHeld = value; } + } + public double GainLoss + { + get { return gainLoss; } + set { gainLoss = value; } + } + public double Return + { + get { return returnOnPosition; } + set { returnOnPosition = value; } + } + public double Exposure + { + get { return exposure; } + set { exposure = value; } + } + public String Comment + { + get { return comment; } + set { comment = value; } + } + public ModelTrade.TradeType Type + { + get { return tradeType; } + set { tradeType = value; } + } + public static String Header + { + get + { + return "Date,Buy/Sell,Symbol,Shares,Price,Gain/Loss,Days Held,Comment"; + } + } + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append(Utility.DateTimeToStringMMSDDSYYYY(TradeDate)).Append(","); + sb.Append(tradeType.Equals(ModelTrade.TradeType.Sell) ? "Sell" : "Buy").Append(","); + sb.Append(Symbol).Append(","); + sb.Append(Shares).Append(","); + sb.Append("\"" + String.Format("{0:C}", price) + "\"").Append(","); + sb.Append("\"" + String.Format("{0:C}", gainLoss) + "\"").Append(","); + sb.Append(daysHeld).Append(","); + sb.Append("\"").Append(null!=comment?comment:"").Append("\""); + return sb.ToString(); + } + } +} \ No newline at end of file diff --git a/eNavigator/MarketDataLib/MarketDataModel/ParityElement.cs b/eNavigator/MarketDataLib/MarketDataModel/ParityElement.cs new file mode 100755 index 0000000..6c6dd15 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/ParityElement.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MarketData.Utils; + +namespace MarketData.MarketDataModel +{ + public class ParityElement + { + public String Symbol { get; set; } + public DateTime PricingDate { get; set; } + public double ParityOffsetPrice { get; set; } + public double ParityOffsetPercent { get; set; } // This is not a percent it needs to be multiplied by 100 to be a percentage + public override String ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("Even @").Append(Utility.FormatCurrency(ParityOffsetPrice)).Append(" (").Append(ParityOffsetPercent > 0 ? "+" : "").Append(Utility.FormatPercent(ParityOffsetPercent)).Append(")"); + return sb.ToString(); + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/Portfolio.cs b/eNavigator/MarketDataLib/MarketDataModel/Portfolio.cs new file mode 100755 index 0000000..6286df0 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/Portfolio.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +//using MarketData.DataAccess; + +namespace MarketData.MarketDataModel +{ + public class Portfolio + { + private List trades = new List(); + private bool openPosition = false; + private double availableCash; + private double initialCash; + + public Portfolio(double initialCash) + { + this.initialCash = this.availableCash = initialCash; + } + public List Trades + { + get { return trades; } + set { trades = value; } + } + public double AvailableCash + { + get { return availableCash; } + set { availableCash = value; } + } + public double GetPortfolioReturn(Price priceOpenPosition) + { + return (GetPortfolioValue(priceOpenPosition)-initialCash)/initialCash; + } + // pass in latest price so we can price any open position + public double GetPortfolioValue(Price priceOpenPosition) + { + double cashValue = AvailableCash; + if (0 != trades.Count) + { + ModelTrade lastTrade = trades[trades.Count - 1]; + if (lastTrade.Type.Equals(ModelTrade.TradeType.Buy)) cashValue += (lastTrade.Shares * priceOpenPosition.Close); + } + return cashValue; + } + public void Add(ModelTrade trade) + { + trades.Add(trade); + } + public ModelTrade GetLastTrade() + { + return trades[trades.Count - 1]; + } + public bool HasOpenPosition + { + get { return openPosition; } + set { openPosition = value; } + } + public int GetTradeCount() + { + return trades.Count; + } + public double GetAverageGainLoss() + { + double totalGainLoss = 0; + for (int index = 0; index < trades.Count; index++) + { + totalGainLoss += trades[index].GainLoss; + } + return totalGainLoss / trades.Count; + } + public int GetAverageHoldingDays() + { + int totalHoldingDays = 0; + int numberOfSellTrades = 0; + for (int index = 0; index < trades.Count; index++) + { + ModelTrade trade = trades[index]; + if (trade.Type == ModelTrade.TradeType.Sell) + { + totalHoldingDays += trades[index].DaysHeld; + numberOfSellTrades++; + } + } + return (numberOfSellTrades>0?totalHoldingDays / numberOfSellTrades:0); + } + public int GetMinHoldingDays() + { + int minHoldingDays = Int16.MaxValue; + for (int index = 0; index < trades.Count; index++) + { + ModelTrade trade = trades[index]; + int holdingDays = trade.DaysHeld; + if (trade.Type == ModelTrade.TradeType.Sell && holdingDays < minHoldingDays) minHoldingDays = holdingDays; + } + return minHoldingDays; + } + public int GetMaxHoldingDays() + { + int maxHoldingDays =0; + for (int index = 0; index < trades.Count; index++) + { + ModelTrade trade = trades[index]; + int holdingDays = trade.DaysHeld; + if (trade.Type==ModelTrade.TradeType.Sell && holdingDays > maxHoldingDays) maxHoldingDays = holdingDays; + } + return maxHoldingDays; + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/PortfolioTrade.cs b/eNavigator/MarketDataLib/MarketDataModel/PortfolioTrade.cs new file mode 100755 index 0000000..a281463 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/PortfolioTrade.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using MarketData.Utils; + +namespace MarketData.MarketDataModel +{ + public class PortfolioTrade + { + private int tradeId=-1; + private String symbol; + private DateTime tradeDate; + private double shares; + private double price; + private double commission; + private String buySell; + private String account; + private String status; + private double sellPrice=double.NaN; + private DateTime sellDate=Utility.Epoch; + + public int TradeId + { + get {return tradeId ;} + set { tradeId = value; ;} + } + public String Symbol + { + get { return symbol; } + set { symbol = value; } + } + public DateTime TradeDate + { + get { return tradeDate; } + set { tradeDate = value; } + } + public double Shares + { + get { return shares; } + set { shares = value; } + } + public double Exposure() + { + return Price*Shares; + } + public String BuySell + { + get { return buySell; } + set { buySell = value; } + } + public String Status + { + get { return status; } + set { status = value; } + } + public bool IsOpen + { + get { return status.ToUpper().Equals("OPEN"); } + } + public bool IsClosed + { + get { return !IsOpen; } + } + public String Account + { + get { return account; } + set{account=value;} + } + public DateTime SellDate + { + get { return sellDate; } + set { sellDate = value; } + } + public double SellPrice + { + get { return sellPrice;} + set { sellPrice = value;} + } + public double Price + { + get { return price; } + set { price = value; } + } + public double Commission + { + get { return commission; } + set { commission = value; } + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/PortfolioTrades.cs b/eNavigator/MarketDataLib/MarketDataModel/PortfolioTrades.cs new file mode 100755 index 0000000..d72eda3 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/PortfolioTrades.cs @@ -0,0 +1,179 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using MarketData.Utils; + +namespace MarketData.MarketDataModel +{ + public class Position + { + public String Symbol { get; set; } + public double Shares{get;set;} + public double Exposure { get; set; } + public double MarketValue { get; set; } + } + public class PortfolioTrades : List + { + public PortfolioTrades() + { + } + public PortfolioTrades(List trades) + { + if(null==trades)return; + for (int index = 0; index < trades.Count; index++) Add(trades[index]); + } + public List Symbols + { + get + { + Dictionary uniqueSymbols = new Dictionary(); + List symbols = new List(); + foreach (PortfolioTrade portfolioTrade in this) + { + if (!uniqueSymbols.ContainsKey(portfolioTrade.Symbol)) uniqueSymbols.Add(portfolioTrade.Symbol, portfolioTrade.Symbol); + } + symbols = new List(uniqueSymbols.Values); + symbols.Sort(); + return symbols; + } + } + public List GetPositions(DateTime asOf) + { + List positions = new List(); + List symbols = Symbols; + foreach (String symbol in symbols) positions.Add(GetPosition(symbol, asOf)); + return positions; + } + public Position GetPosition(String symbol,DateTime asof) + { + List portfolioTrades = new List(); + for (int index = 0; index < Count; index++) + { + PortfolioTrade portfolioTrade = this[index]; + if (!portfolioTrade.Symbol.Equals(symbol)) continue; + if (portfolioTrade.IsOpen && portfolioTrade.TradeDate<=asof) { portfolioTrades.Add(portfolioTrade); continue; } + if (portfolioTrade.IsClosed && portfolioTrade.SellDate > asof) { portfolioTrades.Add(portfolioTrade); continue; } + } + if (0 == portfolioTrades.Count) return null; + Position position = new Position(); + position.Symbol = symbol; + position.Shares = portfolioTrades.Sum(x => x.Shares); + position.Exposure = portfolioTrades.Sum(x=>x.Shares*x.Price); + return position; + } + public double Exposure(){return this.Sum(x=>x.Exposure());} + public List Accounts + { + get + { + Dictionary uniqueAccounts = new Dictionary(); + List accounts = new List(); + foreach (PortfolioTrade portfolioTrade in this) + { + if (!uniqueAccounts.ContainsKey(portfolioTrade.Account)) uniqueAccounts.Add(portfolioTrade.Account, portfolioTrade.Account); + } + accounts = new List(uniqueAccounts.Values); + accounts.Sort(); + return accounts; + } + } + public DateTime GetMinTradeDate() + { + DateTime minDate = Utility.Epoch; + minDate = (from portfolioTrade in this select portfolioTrade.TradeDate).Min(); + return minDate; + } + public DateTime GetMinTradeDate(String symbol) + { + DateTime minDate=Utility.Epoch; + symbol=symbol.ToUpper(); + minDate = (from portfolioTrade in this where portfolioTrade.Symbol.Equals(symbol) select portfolioTrade.TradeDate).Min(); + return minDate; + } + +// We just want the trades (open or closed) on or before the specified date. This will be used to run a cumulative gain/loss and return + public PortfolioTrades GetTradesOnOrBefore(DateTime date) + { + PortfolioTrades tradesOnOrBefore = new PortfolioTrades(); + foreach (PortfolioTrade portfolioTrade in this) + { + if (date >= portfolioTrade.TradeDate) tradesOnOrBefore.Add(portfolioTrade); + } + return tradesOnOrBefore; + } +// This will remove trades that are status='CLOSED' and SELL_DATE=closingDate +// The user of this fucntion would be making the inference that a trade that closed on closingDate should not be seen as part of the holdings. +// For example. The assumption would be that trades that closed on closingDate would not be a part of the portfolio on closingDate + public PortfolioTrades RemoveClosedTradesWhereClosedOn(DateTime closingDate) + { + PortfolioTrades portfolioTrades; + List removeTrades = (from PortfolioTrade portfolioTrade in this where portfolioTrade.Status.Equals("CLOSED") && portfolioTrade.SellDate.Date.Equals(closingDate.Date) select portfolioTrade).ToList(); + if (null != removeTrades && 0 != removeTrades.Count) portfolioTrades = new PortfolioTrades(this.Except(removeTrades).ToList()); + else portfolioTrades = this; + return portfolioTrades; + } + public PortfolioTrades GetOpenTradesOn(DateTime date) + { + PortfolioTrades openTrades = new PortfolioTrades(); + foreach (PortfolioTrade portfolioTrade in this) + { + if (Utility.Epoch.Equals(portfolioTrade.SellDate)) // No sell date so trade is open + { + if (date >= portfolioTrade.TradeDate) openTrades.Add(portfolioTrade); + } + else // sell date is not epoch so see if date is in between tradedate and selldate + { + if (date >= portfolioTrade.TradeDate && date < portfolioTrade.SellDate) openTrades.Add(portfolioTrade); // assume that if the sell date is equal to date then the position is closed + } + } + return openTrades; + } + public bool HasOpenPositions(String symbol) + { + int openTrades=(from PortfolioTrade portfolioTrade in this where portfolioTrade.Symbol.Equals(symbol) && portfolioTrade.IsOpen select portfolioTrade).Count(); + return openTrades>0?true:false; + } + public bool HasOpenPositionsOn(String symbol,DateTime dateTime) + { + PortfolioTrades portfolioTrades=GetOpenTradesOn(dateTime); + int numTrades=(from PortfolioTrade portfolioTrade in portfolioTrades where portfolioTrade.Symbol.Equals(symbol) select portfolioTrade).Count(); + return numTrades>0?true:false; + } +// This method relies on the fact that BreakoutTrades method in PortfolioDA.GetTradesSymbol() creates pairs of BUY and SELL legs with paired legs sharing the same TradeId. +// The open trades will show up with count==1 when we group them by TradeId + public PortfolioTrades GetOpenTrades() + { + if(0==Count)return new PortfolioTrades(); + PortfolioTrades openTrades=new PortfolioTrades((from PortfolioTrade trade in this select trade).GroupBy(x=>x.TradeId).Where(grouping=>grouping.Count()==1).Select(grouping=>grouping.FirstOrDefault()).ToList()); + return openTrades; + } + public PortfolioTrades FilterAccount(String account) + { + PortfolioTrades portfolioTrades = new PortfolioTrades(); + foreach (PortfolioTrade portfolioTrade in this) + { + if (portfolioTrade.Account.Equals(account)) portfolioTrades.Add(portfolioTrade); + } + return portfolioTrades; + } + public PortfolioTrades FilterAccount(List accounts) + { + PortfolioTrades portfolioTrades = new PortfolioTrades(); + foreach (PortfolioTrade portfolioTrade in this) + { + if(accounts.Any(x=>x.Equals(portfolioTrade.Account)))portfolioTrades.Add(portfolioTrade); + } + return portfolioTrades; + } + public PortfolioTrades FilterSymbol(String symbol) + { + PortfolioTrades portfolioTrades = new PortfolioTrades(); + foreach (PortfolioTrade portfolioTrade in this) + { + if (portfolioTrade.Symbol.Equals(symbol)) portfolioTrades.Add(portfolioTrade); + } + return portfolioTrades; + } + } +} \ No newline at end of file diff --git a/eNavigator/MarketDataLib/MarketDataModel/PositionWithDescription.cs b/eNavigator/MarketDataLib/MarketDataModel/PositionWithDescription.cs new file mode 100755 index 0000000..c4d0c8b --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/PositionWithDescription.cs @@ -0,0 +1,23 @@ +using System; + +namespace MarketData.MarketDataModel +{ + public class PositionWithDescription : MarketDataModel.Position + { + public PositionWithDescription() + { + } + public PositionWithDescription(MarketDataModel.Position position, String companyName, String description) + { + if (null == position || null == description) return; + this.Symbol = position.Symbol; + this.Shares = position.Shares; + this.MarketValue = position.MarketValue; + this.Exposure = position.Exposure; + this.Description = description; + this.CompanyName = companyName; + } + public String Description { get; set; } + public String CompanyName { get; set; } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/PremarketElement.cs b/eNavigator/MarketDataLib/MarketDataModel/PremarketElement.cs new file mode 100755 index 0000000..bc1317f --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/PremarketElement.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +namespace MarketData.MarketDataModel +{ + public class PremarketElement + { + public String Market { get; set; } + public double ChangePercent { get; set; } + public double ChangeValue { get; set; } + public DateTime Timestamp { get; set; } + } + public class PremarketElements:List + { + public PremarketElements() + { + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/PriceIndex.cs b/eNavigator/MarketDataLib/MarketDataModel/PriceIndex.cs new file mode 100755 index 0000000..9198534 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/PriceIndex.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; + +namespace MarketData.MarketDataModel +{ + public class PriceIndex + { + public String Code{get;set;} + public String Name{get;set;} + public double Value{get;set;} + public DateTime AsOf{get;set;} + public String Source{get;set;} + } + + public class PriceIndices : List + { + public PriceIndices() + { + } + public PriceIndices(List priceIndices) + { + foreach(PriceIndex priceIndex in priceIndices) + { + Add(priceIndex); + } + } + } +} diff --git a/eNavigator/MarketDataLib/MarketDataModel/Prices.cs b/eNavigator/MarketDataLib/MarketDataModel/Prices.cs new file mode 100755 index 0000000..3daab73 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/Prices.cs @@ -0,0 +1,448 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Linq; +using MarketData.Utils; +using MarketData.Numerical; +//using MarketData.DataAccess; + +namespace MarketData.MarketDataModel +{ + public class PricesByDate : Dictionary + { + private DateTime maxDate=Utility.Epoch; + private DateTime minDate=Utility.Epoch; + public PricesByDate() + { + } + public new void Add(DateTime key,Price price) + { + base.Add(key,price); + if(key>maxDate)maxDate=key; + else if(Utility.IsEpoch(minDate))minDate=key; + else if(key + { + public int Compare(Price p1, Price p2) + { + if (p1.Date < p2.Date) return -1; + else if (p1.Date > p2.Date) return 1; + return 0; + } + } +// Throughout the application it is assumed that these collections, when populated, be be in descending date order. + public class Prices : List + { + public Prices() + { + } + public Prices(Price[] prices) + { + foreach (Price price in prices) Add(price); + } + public Prices(List prices) + { + foreach(Price price in prices)Add(price); + } + public Prices(String strCSV,String symbol) + { + String[] csvLines = strCSV.Split('\n'); + Clear(); + for (int index = 1; index < csvLines.Length; index++) + { + if (csvLines[index].Length < 1) continue; + String[] lineItems = csvLines[index].Split(','); + Price price = new Price(); + String[] dateParts = lineItems[0].Split('-'); + try { price.Date = new DateTime(int.Parse(dateParts[0]), int.Parse(dateParts[1]), int.Parse(dateParts[2])); } + catch (Exception /*exception*/) + { + MDTrace.WriteLine(LogLevel.DEBUG,String.Format("'{0}' does not contain a date", lineItems[0])); + continue; + } + price.Symbol = symbol; + price.Open = Double.Parse(lineItems[1]); + price.High = Double.Parse(lineItems[2]); + price.Low = Double.Parse(lineItems[3]); + price.Close = Double.Parse(lineItems[4]); + price.Volume = Int64.Parse(lineItems[5]); + if(lineItems.Length>6)price.AdjClose=Double.Parse(lineItems[6]); + Add(price); + } + } +// This Beta differs wildly with Yahoo Finance. Yahoo finance uses 36 buckets of monthly returns which was simulated when building this Investopedia-based routine. +// I have yet to discover the cause of the difference but I leave this routine in place as a matter of further study and to make comparisons. +// I tested the bucket methodology against just using a stream of returns and they produce the same result so this routine simply uses a stream of returns. +// At any rate, the beta produced by this method does not match to Yahoo finance. + //public double Beta(Prices bmkPrices) + //{ + // double beta=double.NaN; + // if(Count!=bmkPrices.Count)return beta; + // float[] cumReturnsPricesArray=GetReturns(); + // float[] cumReturnsPricesBenchmark=bmkPrices.GetReturns(); + // beta=Numerics.Beta(ref cumReturnsPricesArray,ref cumReturnsPricesBenchmark); + // return beta*10; + //} +// Assumes that the prices are stored lowest date first + public double MaxDrawdown() + { + return Numerics.MaxDrawdown(GetPrices()); + } + public double MaxUpside() + { + return Numerics.MaxUpside(GetPrices()); + } + public PricesByDate GetPricesByDate() + { + PricesByDate pricesByDate = new PricesByDate(); + for (int index = 0; index < Count; index++) pricesByDate.Add(this[index].Date, this[index]); + return pricesByDate; + } + public Prices Top(int count) + { + Prices prices = new Prices(); + for (int index = 0; index < count && index=0 && prices.Count Count) return null; + float[] pricesArray=new float[count]; + for (int index = startIndex,arrayIndex=0; index < startIndex + count; index++,arrayIndex++) + { + pricesArray[arrayIndex] = (float)this[index].Close; + } + return pricesArray; + } + public float[] GetPricesHigh(int startIndex, int count) + { + if (startIndex + count > Count) return null; + float[] pricesArray = new float[count]; + for (int index = startIndex, arrayIndex = 0; index < startIndex + count; index++, arrayIndex++) + { + pricesArray[arrayIndex] = (float)this[index].High; + } + return pricesArray; + } + public float[] GetPricesLow(int startIndex, int count) + { + if (startIndex + count > Count) return null; + float[] pricesArray = new float[count]; + for (int index = startIndex, arrayIndex = 0; index < startIndex + count; index++, arrayIndex++) + { + pricesArray[arrayIndex] = (float)this[index].Low; + } + return pricesArray; + } + public float[] GetReturns() + { + if(Count==0||1==Count)return null; + float[] returns = new float[Count - 1]; + for (int index = 0; index < Count - 1; index++) + { + Price currentPrice = this[index]; + Price prevPrice = this[index + 1]; + if (0.00 == prevPrice.Close) returns[index] = 0.00F; + else returns[index] = (float)((currentPrice.Close - prevPrice.Close) / Math.Abs(prevPrice.Close)); + } + return returns; + } + public double GetReturn1D() + { + if(Count<2)return double.NaN; + Prices pricesForReturn1D=new Prices(this.Take(2).ToList()); + return pricesForReturn1D.GetCumulativeReturn(); + } + public float[] GetReturns(int dayCount) + { + if(Count-dayCount<=0)return new float[0]; + float[] returns = new float[Count - dayCount]; + for (int index = 0; index < Count - dayCount; index++) + { + Price currentPrice = this[index]; + Price prevPrice = this[index + dayCount]; + if (0.00 == prevPrice.Close) returns[index] = 0.00F; + else returns[index] = (float)((currentPrice.Close - prevPrice.Close) / Math.Abs(prevPrice.Close)); + } + return returns; + } + public double GetCumulativeReturn() + { + float[] returns=GetReturns(); + if(null==returns)return double.NaN; + double itemReturn=0.00; + for(int index=0;index symbolPricesByDate = new Dictionary(); + // List historicalDates = new List(); + // while (historicalDates.Count < (months + 1)) + // { + // historicalDates.Add(startDate); + // startDate = dateGenerator.GetPrevMonthStart(startDate); + // } + // DateTime requestStartDate = dateGenerator.DaysAddActual(asof, 5); // advance 5 days to provide an error margin for holidays + // Prices symbolPrices = PricingDA.GetPrices(symbol, requestStartDate, historicalDates[historicalDates.Count - 1]); + // foreach (Price price in symbolPrices) symbolPricesByDate.Add(price.Date, price); + // startDate = dateGenerator.GetCurrMonthStart(asof); + // while (prices.Count < (months + 1)) + // { + // Price price = GetPrice(symbol, startDate, symbolPricesByDate); + // if (null == price) return null; + // prices.Add(price); + // startDate = dateGenerator.GetPrevMonthStart(startDate); + // if (startDate < minPricingDate) break; + // } + // return prices; + //} + private static Price GetPrice(String symbol,DateTime requestedDate, Dictionary symbolPricesByDate) + { + int maxAdvanceDays = 5; + Price symbolPrice = null; + for (int advanceDays = 0; advanceDays < maxAdvanceDays; advanceDays++) + { + if (!symbolPricesByDate.ContainsKey(requestedDate)) { requestedDate = requestedDate.AddDays(1); continue; } + symbolPrice = symbolPricesByDate[requestedDate]; + } + return symbolPrice; + } +// ********************************** + + + + + + + } + public class Price + { + private String symbol; + private DateTime date; + private double open; + private double high; + private double low; + private double close; + private long volume; + private double adjClose; + public Price() + { + } + public Price Clone() + { + Price clonePrice=new Price(); + clonePrice.Symbol=Symbol; + clonePrice.Date=Date; + clonePrice.Open=Open; + clonePrice.High=High; + clonePrice.Low=Low; + clonePrice.Close=Close; + clonePrice.Volume=Volume; + clonePrice.AdjClose=AdjClose; + return clonePrice; + } + public String Symbol + { + get { return symbol; } + set { symbol = value; } + } + public DateTime Date + { + get { return date; } + set { date = value; } + } + public double Open + { + get { return open; } + set { open = value; } + } + public double High + { + get { return high; } + set { high = value; } + } + public double Low + { + get { return low; } + set { low = value; } + } + public double Close + { + get { return close; } + set { close = value; } + } + public long Volume + { + get { return volume; } + set { volume = value; } + } + public double AdjClose + { + get { return adjClose; } + set { adjClose = value; } + } + public bool IsValid + { + get + { + if(null==symbol)return false; + if(Utility.IsEpoch(date))return false; + if(double.IsNaN(open))return false; + if(double.IsNaN(high))return false; + if(double.IsNaN(low))return false; + if(double.IsNaN(close))return false; + if(double.IsNaN(adjClose))return false; + return true; + } + } + public static String Header + { + get { return "Date,Symbol,Open,High,Low,Close,Volume,Adj Close"; } // ,M12,M26,MACD,Signal,Histogram + } + public override String ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append(symbol).Append(","); + sb.Append(Utility.DateTimeToStringMMSDDSYYYY(Date)).Append(","); + sb.Append(String.Format("{0:0.00}", Open)).Append(","); + sb.Append(String.Format("{0:0.00}", High)).Append(","); + sb.Append(String.Format("{0:0.00}", Low)).Append(","); + sb.Append(String.Format("{0:0.00}", Close)).Append(","); + sb.Append(Volume).Append(","); + sb.Append(String.Format("{0:0.00}", AdjClose)); + return sb.ToString(); + } + } +} \ No newline at end of file diff --git a/eNavigator/MarketDataLib/MarketDataModel/StopLimit.cs b/eNavigator/MarketDataLib/MarketDataModel/StopLimit.cs new file mode 100755 index 0000000..613d1c3 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/StopLimit.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; + +namespace MarketData.MarketDataModel +{ + public class StopLimit + { + public String Symbol{get;set;} + public double StopPrice{get;set;} + public double Shares{get;set;} + public String StopType{get;set;} + public int Active{get;set;} + } +} \ No newline at end of file diff --git a/eNavigator/MarketDataLib/MarketDataModel/TimeSeriesElement.cs b/eNavigator/MarketDataLib/MarketDataModel/TimeSeriesElement.cs new file mode 100755 index 0000000..81ba955 --- /dev/null +++ b/eNavigator/MarketDataLib/MarketDataModel/TimeSeriesElement.cs @@ -0,0 +1,144 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using MarketData.Numerical; + +namespace MarketData.MarketDataModel +{ + public class TimeSeriesCollection : List + { + public TimeSeriesCollection() + { + } + public TimeSeriesCollection(List elements) + { + if (null == elements) return; + foreach (TimeSeriesElement element in elements) Add(element); + } +// Returns the intersection of both sets on the common dates + public static AlignDatesResult AlignDates(TimeSeriesCollection tsA,TimeSeriesCollection tsB) + { + List tsADates=(from ts in tsA select ts.AsOf).ToList(); + List tsBDates=(from ts in tsB select ts.AsOf).ToList(); + + List tsIntersect=tsADates.Intersect(tsBDates).Distinct().ToList(); + tsA=new TimeSeriesCollection((from ts in tsA where tsIntersect.Any(x=>x.Equals(ts.AsOf)) select ts).ToList()); + tsB=new TimeSeriesCollection((from ts in tsB where tsIntersect.Any(x=>x.Equals(ts.AsOf)) select ts).ToList()); + return new AlignDatesResult(tsA,tsB); + } + + public float[] ToFloat() + { + float[] values = new float[Count]; + for (int index = 0; index < Count; index++) values[index] = (float)this[index].Value; + return values; + } + public bool ContainsNegativeValues() + { + int count= (from TimeSeriesElement element in this where element.Value < 0 select element).Count(); + return count > 0 ? true : false; + } + public TimeSeriesCollection RemoveNegativeValues() + { + return new TimeSeriesCollection((from TimeSeriesElement element in this where element.Value >= 0 select element).ToList()); + } +// Removes the outliers from the collection. If the resulting collection contains zero elements then returns the original collection. + //public TimeSeriesCollection RemoveOutliers(int standardDeviations=4) + //{ + // double[] values = (from TimeSeriesElement element in this select element.Value).ToArray(); + // double valuesStd=Numerics.Volatility(ref values)*standardDeviations; + // TimeSeriesCollection timeSeriesCollection=new TimeSeriesCollection((from TimeSeriesElement element in this where element.Value <=valuesStd select element).ToList()); + // if(0==timeSeriesCollection.Count)return this; + // else return timeSeriesCollection; + //} + } + public class TimeSeriesElement + { + public enum ElementType { INVALID, OTHER,BVPS, EPS, OperatingCashflow,FreeCashflow,Revenue,QuarterlyRevenue,Inventory,QuarterlyInventory,ROIC,OperatingIncome,WorkingCapital,ROA,NetIncomeAvailableToCommonShareholders,TaxRate,InterestExpense,COGS}; + private String symbol; + private DateTime asof; + private ElementType elementType; + private double value; + private String otherType; + + public TimeSeriesElement() + { + } + public String Symbol + { + get { return symbol; } + set { symbol = value; } + } + public DateTime AsOf + { + get { return asof; } + set { asof = value; } + } + public double Value + { + get { return value; } + set { this.value = value; } + } + public String OtherType + { + get{return otherType;} + set{otherType=value;} + } + public TimeSeriesElement.ElementType Type + { + get { return elementType; } + set { elementType = value; } + } + public static String StringForType(TimeSeriesElement.ElementType type) + { + switch (type) + { + case ElementType.INVALID : + return "???"; + case ElementType.BVPS: + return "bvps"; + case ElementType.EPS: + return "eps"; + case ElementType.OperatingCashflow : + return "operating_cashflow"; + case ElementType.FreeCashflow: + return "free_cashflow"; + case ElementType.Revenue: + return "revenue"; + case ElementType.QuarterlyRevenue: + return "quarterly_revenue"; + case ElementType.OperatingIncome: + return "operating_income"; + case ElementType.ROIC: + return "roic"; + case ElementType.WorkingCapital: + return "working_capital"; + case ElementType.ROA: + return "roa"; + case ElementType.TaxRate : + return "tax_rate"; + case ElementType.InterestExpense: + return "interest_expense"; + case ElementType.NetIncomeAvailableToCommonShareholders: + return "net_income_available_to_common_shareholders"; + case ElementType.COGS: + return "cogs"; + default: + return "???"; + } + } + } + public class AlignDatesResult + { + public AlignDatesResult() + { + } + public AlignDatesResult(TimeSeriesCollection collectionA,TimeSeriesCollection collectionB) + { + CollectionA=collectionA; + CollectionB=collectionB; + } + public TimeSeriesCollection CollectionA{get;set;} + public TimeSeriesCollection CollectionB{get;set;} + } +} diff --git a/eNavigator/MarketDataLib/Numerics/BetaGenerator.cs b/eNavigator/MarketDataLib/Numerics/BetaGenerator.cs new file mode 100755 index 0000000..61a45f7 --- /dev/null +++ b/eNavigator/MarketDataLib/Numerics/BetaGenerator.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using MarketData.DataAccess; +using MarketData.MarketDataModel; +using MarketData.Utils; + +// This Beta calculator is modelled after Yahoo Finance Beta calculator. It calculates Beta using 36 monthly prices start at beginning of previous month and going back 36 months +// While the calculator does not match exactly to Yahoo Finance I will use this as an alternative in the event that Yahoo Finance Beta is no longer available. +namespace MarketData.Numerical +{ + public class BetaPrices : List + { + public BetaPrices() + { + } +// assuming that the list is in descending date order + public double[] ReturnsBenchmark() + { + double[] returns=new double[Count-1]; + for(int index=Count-2;index>=0;index--) + { + if(this[index+1].PriceBenchmark.Close==0.00)returns[index]=0.00; + else returns[index]=(this[index].PriceBenchmark.Close-this[index+1].PriceBenchmark.Close)/this[index+1].PriceBenchmark.Close; + } + return returns; + } + public double[] ReturnsSymbol() + { + double[] returns=new double[Count-1]; + for(int index=Count-2;index>=0;index--) + { + if(this[index+1].PriceSymbol.Close==0.00)returns[index]=0.00; + else returns[index]=(this[index].PriceSymbol.Close-this[index+1].PriceSymbol.Close)/this[index+1].PriceSymbol.Close; + } + return returns; + } + } + public class BetaPrice + { + public BetaPrice(String symbol,String benchmark,Price symbolPrice,Price benchmarkPrice,DateTime pricingDate) + { + Symbol=symbol; + Benchmark=benchmark; + PricingDate=pricingDate; + PriceSymbol=symbolPrice; + PriceBenchmark=benchmarkPrice; + } + public DateTime PricingDate{get;set;} + public String Symbol{get;set;} + public String Benchmark{get;set;} + public Price PriceSymbol{get;set;} + public Price PriceBenchmark{get;set;} + } + + public class BetaGenerator + { + private BetaGenerator() + { + } + //public static double Beta(String symbol,int months = 36) + //{ + // return Beta(symbol, PricingDA.GetLatestDate(symbol), months); + //} + //public static double Beta(String symbol,DateTime asof,int months=36) + //{ + // try + // { + // String benchmark = "SPY"; + // DateGenerator dateGenerator = new DateGenerator(); + + // BetaPrices betaPrices = new BetaPrices(); + // DateTime startDate = dateGenerator.GetPrevMonthStart(asof); + // DateTime minPricingDate = PricingDA.GetEarliestDate(symbol); + // Dictionary symbolPricesByDate = new Dictionary(); + // Dictionary benchmarkPricesByDate = new Dictionary(); + // List historicalDates = new List(); + // while (historicalDates.Count < (months + 1)) + // { + // historicalDates.Add(startDate); + // startDate = dateGenerator.GetPrevMonthStart(startDate); + // } + // Prices symbolPrices = PricingDA.GetPrices(symbol, asof, historicalDates[historicalDates.Count - 1]); + // Prices benchmarkPrices = PricingDA.GetPrices(benchmark, asof, historicalDates[historicalDates.Count - 1]); + // foreach (Price price in symbolPrices) symbolPricesByDate.Add(price.Date, price); + // foreach (Price price in benchmarkPrices) benchmarkPricesByDate.Add(price.Date, price); + // startDate = dateGenerator.GetPrevMonthStart(asof); + // while (betaPrices.Count < (months + 1)) + // { + // BetaPrice betaPrice = GetPrice(symbol, benchmark, startDate, symbolPricesByDate, benchmarkPricesByDate); + // if (null == betaPrice) + // { + // return double.NaN; + // } + // betaPrices.Add(betaPrice); + // startDate = dateGenerator.GetPrevMonthStart(startDate); + // if (startDate < minPricingDate) break; + // } + // double[] returnsSymbol = betaPrices.ReturnsSymbol(); + // double[] returnsBenchmark = betaPrices.ReturnsBenchmark(); + // double beta = Numerics.Beta(ref returnsSymbol, ref returnsBenchmark); + // return beta; + // } + // catch (Exception exception) + // { + // MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Exception:{0}",exception.ToString())); + // return double.NaN; + // } + //} + private static BetaPrice GetPrice(String symbol, String benchmark, DateTime requestedDate, Dictionary symbolPricesByDate, Dictionary benchmarkPricesByDate) + { + try + { + int maxAdvanceDays = 10; + Price symbolPrice = null; + Price benchmarkPrice = null; + for (int advanceDays = 0; advanceDays < maxAdvanceDays; advanceDays++) + { + if (!symbolPricesByDate.ContainsKey(requestedDate)) { requestedDate = requestedDate.AddDays(1); continue; } + symbolPrice = symbolPricesByDate[requestedDate]; + if (!benchmarkPricesByDate.ContainsKey(requestedDate)) { requestedDate = requestedDate.AddDays(1); continue; } + benchmarkPrice = benchmarkPricesByDate[requestedDate]; + } + if (null == symbolPrice || null == benchmarkPrice) return null; + symbolPrice.Date = requestedDate.Date; + benchmarkPrice.Date = requestedDate.Date; + return new BetaPrice(symbol, benchmark, symbolPrice, benchmarkPrice, requestedDate); + } + catch (Exception exception) + { + MDTrace.WriteLine(LogLevel.DEBUG, String.Format("Exception:{0}", exception.ToString())); + return null; + } + } + } +} + diff --git a/eNavigator/MarketDataLib/Numerics/Bin.cs b/eNavigator/MarketDataLib/Numerics/Bin.cs new file mode 100755 index 0000000..0729b8a --- /dev/null +++ b/eNavigator/MarketDataLib/Numerics/Bin.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MarketData.Numerical +{ + public interface IBinValueExtractor + { + double BinValue(); + } + public class BinCollection : List> + { + } + public class BinItems : List + { + public BinItems() + { + } + public BinItems(List list) + { + foreach(T item in list)Add(item); + } + } + public class BinHelper where T : IBinValueExtractor + { + public static BinCollection CreateBins(BinItems items,int bins) + { + BinCollection binCollection=new BinCollection(); + if(null==items||0==items.Count) + { + for(int index=0;index()); + return binCollection; + } + items.Sort(); + T minItem=items[0]; + T maxItem=items[items.Count-1]; + double midPoint=(maxItem.BinValue()-minItem.BinValue())/(double)bins; + List borderValues=new List(); + for(int index=0;index()); + for(int index=0;index binItems=binCollection[binCollection.Count-1]; + lowerBound=borderValues[index]; + if(index==borderValues.Count-1)upperBound=maxItem.BinValue(); + else upperBound=borderValues[index+1]; + for(int itemIndex=0;itemIndex=lowerBound&&item.BinValue()()); + } + return binCollection; + } + } +} diff --git a/eNavigator/MarketDataLib/Numerics/BlackScholes.cs b/eNavigator/MarketDataLib/Numerics/BlackScholes.cs new file mode 100755 index 0000000..79bff96 --- /dev/null +++ b/eNavigator/MarketDataLib/Numerics/BlackScholes.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using MarketData.MarketDataModel; + +namespace MarketData.Numerical +{ + /// + /// Black Sholes Option Pricing Model for simplest scenario + /// + public class BlackScholesOptionPricingModel + { + private BlackScholesOptionPricingModel() + { + } + /// + /// Get Option price by applying BlackScholesOptionPricingModel + /// + /// Enum to indicate whether Call or Put + /// Price of underlying + /// Strike price + /// Time to expiration in years + /// Risk free interest rate + /// Volatility + /// + //public static double GetPrice(OptionTypeEnum optionType, double S, double X, double T, double r, double v) + //{ + // double d1 = 0.0; + // double d2 = 0.0; + // double optionValue = 0.0; + + // d1 = (Math.Log(S / X) + (r + v * v / 2.0) * T) / (v * Math.Sqrt(T)); + // d2 = d1 - v * Math.Sqrt(T); + // if (optionType == OptionTypeEnum.CallOption) + // { + // optionValue = S * CumulativeNormalDistributionFun(d1) - X * Math.Exp(-r * T) * CumulativeNormalDistributionFun(d2); + // } + // else if (optionType == OptionTypeEnum.PutOption) + // { + // optionValue = X * Math.Exp(-r * T) * CumulativeNormalDistributionFun(-d2) - S * CumulativeNormalDistributionFun(-d1); + // } + // return optionValue; + //} + /// + /// Cumulative normal distribution function + /// + /// + /// + private static double CumulativeNormalDistributionFun(double d) + { + double L = 0.0; + double K = 0.0; + double dCND = 0.0; + const double a1 = 0.31938153; + const double a2 = -0.356563782; + const double a3 = 1.781477937; + const double a4 = -1.821255978; + const double a5 = 1.330274429; + L = Math.Abs(d); + K = 1.0 / (1.0 + 0.2316419 * L); + + dCND = 1.0 - 1.0 / Math.Sqrt(2 * Convert.ToDouble(Math.PI)) * Math.Exp(-L * L / 2.0) * (a1 * K + a2 * K * K + a3 * Math.Pow(K, 3.0) + a4 * Math.Pow(K, 4.0) + a5 * Math.Pow(K, 5.0)); + + if (d < 0) + { + return 1.0 - dCND; + } + else + { + return dCND; + } + } + } +} diff --git a/eNavigator/MarketDataLib/Numerics/KStest.cs b/eNavigator/MarketDataLib/Numerics/KStest.cs new file mode 100755 index 0000000..8376084 --- /dev/null +++ b/eNavigator/MarketDataLib/Numerics/KStest.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections; +//using System.Data.SqlClient; +using System.Text; +using System.IO; + +// Filename: KSTest.cs +// Author:Yan Kvitko +// Date:01/2005 + +namespace MarketData.Numerical +{ + [Serializable] + public class KSTest + { + private int h; + private double pValue; + private double ksStat; + private double criticalValue; + + public KSTest() + { + } + public KSTest(int h, double pValue, double ksStat, double criticalValue) + { + this.h=h; + this.pValue=pValue; + this.ksStat=ksStat; + this.criticalValue=criticalValue; + } + public int H + { + get{return h;} + set{h=value;} + } + public double PValue + { + get{return pValue;} + set{pValue=value;} + } + public double KSStat + { + get{return ksStat;} + set{ksStat=value;} + } + public double CriticalValue + { + get{return criticalValue;} + set{criticalValue=value;} + } + } +} diff --git a/eNavigator/MarketDataLib/Numerics/LeastSquares.cs b/eNavigator/MarketDataLib/Numerics/LeastSquares.cs new file mode 100755 index 0000000..8772ded --- /dev/null +++ b/eNavigator/MarketDataLib/Numerics/LeastSquares.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MarketData.Utils; + +namespace MarketData.Numerical +{ + public class LeastSquaresResult + { + public double[] LeastSquares { get; set; } + public double YIntercept { get; set; } + public double XIntercept { get; set; } + public double Slope { get; set; } + public void Extend(int itemCount, double slope) // extend the result set by itemCount by applying the slope to subsequent values + { + if (null == LeastSquares || 0 == LeastSquares.Length) return; + double[] extendedItems = new double[itemCount + LeastSquares.Length]; + Array.Copy(LeastSquares, 0, extendedItems, itemCount, LeastSquares.Length); + for (int index = itemCount - 1; index >= 0; index--) + { + extendedItems[index] = extendedItems[index + 1] + slope; + } + LeastSquares = extendedItems; + } + } + public class LeastSquaresResultWithR2 : LeastSquaresResult + { + public double RSquared { get; set; } + } +// ********************************************************************************************************************************************** + public class LeastSquaresHelper + { + private LeastSquaresHelper() + { + } +// This version reverses the slope because the input data is in reverse order +// The input data should be in the following manner observations[count-1]=earliest data point, observations[0]=most recent data point +// This version should be retained as-is because it is being referenced in models etc., + public static LeastSquaresResult CalculateLeastSquares(double[] observations) + { + try + { + LeastSquaresResult leastSquaresResult = new LeastSquaresResult(); + double[] xSeries = new double[observations.Length]; + double[] xMinusXMean = new double[observations.Length]; + double[] yMinusYMean = new double[observations.Length]; + double[] meanProduct = new double[observations.Length]; + double[] xMinusXMeanSquared = new double[observations.Length]; + double[] leastSquares = new double[observations.Length]; + double xMean = double.NaN; + double yMean = double.NaN; + double slope = double.NaN; + double yIntercept = double.NaN; + for (int index = 0; index < xSeries.Length; index++) xSeries[index] = index + 1; + xMean = Numerics.Mean(ref xSeries); + yMean = Numerics.Mean(ref observations); + for (int index = 0; index < observations.Length; index++) + { + xMinusXMean[index] = xSeries[index] - xMean; + yMinusYMean[index] = observations[index] - yMean; + meanProduct[index] = xMinusXMean[index] * yMinusYMean[index]; + xMinusXMeanSquared[index] = xMinusXMean[index] * xMinusXMean[index]; + } + slope = Numerics.Sum(ref meanProduct) / Numerics.Sum(ref xMinusXMeanSquared); + yIntercept = Numerics.YIntercept(xMean, yMean, slope); + for (int index = 0; index < leastSquares.Length; index++) leastSquares[index] = slope * xSeries[index] + yIntercept; + leastSquaresResult.LeastSquares = leastSquares; + leastSquaresResult.YIntercept = yIntercept; + leastSquaresResult.XIntercept = xMean; + leastSquaresResult.Slope = slope * -1.00; + return leastSquaresResult; + } + catch (Exception exception) + { + MDTrace.WriteLine(LogLevel.DEBUG, exception.ToString()); + return null; + } + } +// This version uses the true slope whereas the version above reverses the slope due to the arrangement of the input data +// The input data should be in the following manner observations[0]=earliest data point, observations[count-1]=most recent data point + public static LeastSquaresResultWithR2 CalculateLeastSquaresWithR2(double[] observations) + { + try + { + LeastSquaresResultWithR2 leastSquaresResultWithR2 = new LeastSquaresResultWithR2(); + double[] xSeries = new double[observations.Length]; + double[] xMinusXMean = new double[observations.Length]; + double[] yMinusYMean = new double[observations.Length]; + double[] meanProduct = new double[observations.Length]; + double[] xMinusXMeanSquared = new double[observations.Length]; + double[] leastSquares = new double[observations.Length]; + double xMean = double.NaN; + double yMean = double.NaN; + double slope = double.NaN; + double yIntercept = double.NaN; + for (int index = 0; index < xSeries.Length; index++) xSeries[index] = index + 1; + xMean = Numerics.Mean(ref xSeries); + yMean = Numerics.Mean(ref observations); + for (int index = 0; index < observations.Length; index++) + { + xMinusXMean[index] = xSeries[index] - xMean; + yMinusYMean[index] = observations[index] - yMean; + meanProduct[index] = xMinusXMean[index] * yMinusYMean[index]; + xMinusXMeanSquared[index] = xMinusXMean[index] * xMinusXMean[index]; + } + slope = Numerics.Sum(ref meanProduct) / Numerics.Sum(ref xMinusXMeanSquared); + yIntercept = Numerics.YIntercept(xMean, yMean, slope); + for (int index = 0; index < leastSquares.Length; index++) leastSquares[index] = slope * xSeries[index] + yIntercept; + leastSquaresResultWithR2.LeastSquares = leastSquares; + leastSquaresResultWithR2.YIntercept = yIntercept; + leastSquaresResultWithR2.XIntercept = xMean; + leastSquaresResultWithR2.Slope = slope; + // calculate the R2 + double[] estimated = new double[observations.Length]; + double[] estimatedLessMeanSquared = new double[observations.Length]; + double sumOfEstimatedLessMeanSquared = 0.00; + double sumofsquares = 0.00; + foreach (double observation in observations) sumofsquares += Math.Pow(observation - yMean, 2); + for (int index = 0; index < observations.Length; index++) estimated[index] = yIntercept + (slope * (index + 1)); + for (int index = 0; index < observations.Length; index++) estimatedLessMeanSquared[index] = Math.Pow(estimated[index] - yMean, 2); + foreach (double value in estimatedLessMeanSquared) sumOfEstimatedLessMeanSquared += value; + leastSquaresResultWithR2.RSquared = sumOfEstimatedLessMeanSquared / sumofsquares; + return leastSquaresResultWithR2; + } + catch (Exception exception) + { + MDTrace.WriteLine(LogLevel.DEBUG, exception.ToString()); + return null; + } + } + } +} diff --git a/eNavigator/MarketDataLib/Numerics/Numerics.cs b/eNavigator/MarketDataLib/Numerics/Numerics.cs new file mode 100755 index 0000000..5c8c786 --- /dev/null +++ b/eNavigator/MarketDataLib/Numerics/Numerics.cs @@ -0,0 +1,1498 @@ +using System; +using System.Threading; +using System.Collections; +using System.Linq; +using System.Collections.Generic; +using MarketData.MarketDataModel; +using MarketData.Utils; + +// Filename: Numerics.cs +// Author:Sean Kessler / Werner Stanzl +// Date:07/2003 + +namespace MarketData.Numerical +{ + public class Numerics + { + public static double[] ToDouble(float[] floatArray) + { + double[] doubleArray=new double[floatArray.Length]; + for(int index=0;index-2*stddev select value).ToArray(); + double[] newObservations=(from double value in observations where value (deviations*-1)*stddev select value).ToArray(); + return newObservations; + } + public static LeastSquaresResult LeastSquares(double[] observations) + { + return LeastSquaresHelper.CalculateLeastSquares(observations); + } + public static LeastSquaresResultWithR2 LeastSquaresWithR2(double[] observations) + { + return LeastSquaresHelper.CalculateLeastSquaresWithR2(observations); + } + public static double RSquared(double[] observations) + { + try + { + double[] estimated = new double[observations.Length]; + double[] estimatedLessMeanSquared = new double[observations.Length]; + double sumOfEstimatedLessMeanSquared = 0.00; + double rSquared = 0.00; + LeastSquaresResult leastSquaresResult = null; + double mean = Numerics.Mean(ref observations); + double sumofsquares = 0.00; + foreach (double observation in observations) sumofsquares += Math.Pow(observation - mean, 2); + leastSquaresResult = LeastSquares(observations); + double slope = leastSquaresResult.Slope * -1.00; // LeastSquares generator reverses the slope. Because prices fed to it are in reverse order + double yIntercept = leastSquaresResult.YIntercept; + for (int index = 0; index < observations.Length; index++) estimated[index] = yIntercept + (slope * (index + 1)); + for (int index = 0; index < observations.Length; index++) estimatedLessMeanSquared[index] = Math.Pow(estimated[index] - mean, 2); + foreach (double value in estimatedLessMeanSquared) sumOfEstimatedLessMeanSquared += value; + rSquared = sumOfEstimatedLessMeanSquared / sumofsquares; + return rSquared; + } + catch (Exception) + { + return double.NaN; + } + } +/// LeastSquares - Calculates least squares fit. +/// y-Values +/// LeastSquares + //public static LeastSquaresResult LeastSquares(double[] observations) + //{ + // LeastSquaresResult leastSquaresResult=new LeastSquaresResult(); + // double[] xSeries=new double[observations.Length]; + // double[] xMinusXMean=new double[observations.Length]; + // double[] yMinusYMean=new double[observations.Length]; + // double[] meanProduct=new double[observations.Length]; + // double[] xMinusXMeanSquared=new double[observations.Length]; + // double[] leastSquares=new double[observations.Length]; + // double xMean=double.NaN; + // double yMean=double.NaN; + // double slope=double.NaN; + // double yIntercept=double.NaN; + // for(int index=0;indexYIntercept - Calculates slope of values. +/// YIntercept + public static double YIntercept(double xMean,double yMean,double slope) + { + return yMean-(slope*xMean); + } + public static double Slope(ref double[] x,ref double[] y) + { + double sumxy=0.00; + double sumx=0.00; + double sumy=0.00; + double sumx2=0.00; + + if(x.Length!=y.Length)return double.NaN; + for(int index=0;indexSlope - Calculates slope of values. +/// y-values x-values are assumed to be sequential +/// Slope + public static float Slope(float[] y) + { + float sum1 = 0.00F; + float sum2 = 0.00F; + float[] x=new float[y.Length]; + for (int index = 0; index < y.Length; index++) x[index] = index + 1; + float averageY = Mean(ref y); + float averageX = Mean(ref x); + for (int index = 0; index < y.Length; index++) + { + float currX = x[index]; + sum1+=(currX-averageX)*(y[index]-averageY); + sum2 += (float)Math.Pow(currX-averageX,2); + } + if (0 == sum2) return float.NaN; + return sum1 / sum2; + } +/// Slope - Calculates slope of values. +/// y-values x-values are assumed to be sequential +/// Slope + public static double Slope(ref double[] y) + { + double sum1 = 0.00F; + double sum2 = 0.00F; + double[] x=new double[y.Length]; + for (int index = 0; index < y.Length; index++) x[index] = index + 1; + double averageY = Mean(ref y); + double averageX = Mean(ref x); + for (int index = 0; index < y.Length; index++) + { + double currX = x[index]; + sum1+=(currX-averageX)*(y[index]-averageY); + sum2 += (float)Math.Pow(currX-averageX,2); + } + if (0 == sum2) return float.NaN; + return sum1 / sum2; + } + /// Slope - Calculates slope of values. + /// y-values x-values are assumed to be sequential + /// Slope + public static double Slope(double[] y) + { + double sum1 = 0.00F; + double sum2 = 0.00F; + double[] x = new double[y.Length]; + for (int index = 0; index < y.Length; index++) x[index] = index + 1; + double averageY = Mean(ref y); + double averageX = Mean(ref x); + for (int index = 0; index < y.Length; index++) + { + double currX = x[index]; + sum1 += (currX - averageX) * (y[index] - averageY); + sum2 += (float)Math.Pow(currX - averageX, 2); + } + if (0 == sum2) return float.NaN; + return sum1 / sum2; + } +/// Median - Calculates median of values. +/// values +/// Median + public static double Median(ref double[] values) + { + int length=values.Length; + if (length == 0)throw new Exception("Numerics::cannot calculate median of an empty array"); + if (length == 1 )return values[0]; + double [] sorted = new double[length]; + Array.Copy(values, 0, sorted, 0, length); + Array.Sort(sorted); + if( (length%2) == 0 ) return (sorted[length/2]+sorted[length/2-1])/2; + return sorted[(length-1)/2]; + } +/// Floor - Calculates floor of values. +/// values +/// floor + public static void Floor(ref double[] values) + { + for (int i=0; i< values.Length; i++) + { + values[i] = Math.Floor(values[i]); + } + } +/// Percentile - Calculates percentile of values. +/// values +/// Percentile + public static float Percentile(int perc,ref float[] values) + { + if(values.Length<5)return float.NaN; + int index; + Array.Sort(values); + index=(int)Math.Floor(perc*(values.Length)/100.00F)-1; + if(index<0)index=0; + else if(index>=values.Length)index=values.Length-1; + return values[index]; + } +/// Min - Calculates minimum of values. +/// values +/// minimum + public static float Min(ref float[] values) + { + if(0==values.Length)return 0; + float min=values[0]; + for(int index=1;indexMin - Calculates minimum of values. +/// values +/// minimum + public static double Min(ref double[] values) + { + if(0==values.Length)return 0; + double min=values[0]; + for(int index=1;indexMax - Calculates maximum of values. +/// values +/// maximum + public static float Max(ref float[] values) + { + if(0==values.Length)return 0; + float max=values[0]; + for(int index=1;indexmax)max=values[index]; + } + return max; + } +/// Max - Calculates maximum of values. +/// values +/// maximum + public static double Max(ref double[] values) + { + double max=values[0]; + for(int index=1;indexmax)max=values[index]; + } + return max; + } +/// Mean - Calculates mean of values. +/// values +/// Mean + public static float Mean(ref float[] values) + { + if (null == values) return float.NaN; + int length=values.Length; + float mean=0; + if(0==length)return float.NaN; + for(int index=0;indexMean - Calculates mean of values. +/// values +/// Mean + public static double Mean(ref double[] values) + { + if (null == values) return float.NaN; + int length=values.Length; + double mean=0; + if(0==values.Length)return double.NaN; + for(int index=0;indexMeanAbs - Calculates mean of abs(values). +/// values +/// Mean + public static float MeanAbs(ref float[] values) + { + int length=values.Length; + float mean=0; + if(0==length)return mean; + for(int index=0;indexGeometricMean - Calculates mean of values. +/// values +/// Mean + public static float GeometricMean(ref float[] values) + { + float geometricMean=1.00F; + int length=values.Length; + if(0==length)return geometricMean; + for(int index=0;indexSum - Calculates Sum. +/// float array x. +/// float Sum + public static float Sum(ref float[] x) + { + float sum=0; + int length=x.Length; + if(0==length)return sum; + for(int index=0;indexSum - Calculates Sum. + /// double array x. + /// double Sum + public static double Sum(ref double[] x) + { + double sum=0; + int length=x.Length; + if(0==length)return sum; + for(int index=0;indexAnnualizedVolatility - Calculates annualized volatility of values. can be any number of period +/// values +/// volatility + public static float AnnualizedVolatility(ref float[] values) + { + return (float)(Math.Sqrt(252.00)*StdDev(ref values)); // 252 is average number of trading days in a year + } +/// AnnualizedVolatility - Calculates annualized volatility of values. can be any number of periods +/// values +/// volatility + public static double AnnualizedVolatility(ref double[] values) + { + return Math.Sqrt(252)*StdDev(ref values); // 252 is average number of trading days in a year + } +/// Volatility - Calculates volatility of values. +/// values +/// volatility + public static float Volatility(ref float[] values) + { + return StdDev(ref values); + } +/// Volatility - Calculates volatility of values. +/// values +/// volatility + public static double Volatility(ref double[] values) + { + return StdDev(ref values); + } +/// Standardize - Standardizes the input. +/// values +/// volatility + public static float[] Standardize(ref float[] values) + { + float[] returnData=new float[values.Length]; + float valuesMean=Mean(ref values); + float valuesStd=Volatility(ref values); + + if(0==valuesStd)return values; + for(int index=0;indexDownStd - Returns downside standard deviation of values. +/// values +/// downside standard deviation + public static float DownStd(ref float[] values) + { + float average; + float downStd=0; + if(1>=values.Length)return downStd; + average=Mean(ref values); + foreach(float value in values) + { + if(valueBattingAverage - Returns batting average of values. +/// values +/// batting average + public static float BattingAverage(ref float[] values) + { + float battingAverage=0; + if(0==values.Length)return float.NaN; + foreach(float value in values) + { + if(value>0)battingAverage++; + } + return battingAverage/values.Length; + } +/// AverageReturnWithSpline -This is a collection of prices ordered highest date first. +/// values +/// AverageReturnWithSpline + public static double AverageReturnWithSpline(TimeSeriesCollection timeSeriesCollection) + { + List sourceElements = new List(); + List destElements = null; + List values = new List(); + + if (null == timeSeriesCollection || 0 == timeSeriesCollection.Count) return double.NaN; + for (int index = timeSeriesCollection.Count-1; index >=0; index--) + { + TimeSeriesElement timeSeriesElement=timeSeriesCollection[index]; + sourceElements.Add(new Element(Utility.DateToLong(timeSeriesElement.AsOf), timeSeriesElement.Value)); + } + DateTime startDate = timeSeriesCollection[timeSeriesCollection.Count - 1].AsOf; + DateTime endDate = timeSeriesCollection[0].AsOf; + DateTime valueDate = startDate; + + while (valueDate <= endDate) + { + destElements = new List(); + destElements.Add(new Element(Utility.DateToLong(valueDate), 0)); + CatmullRom.PerformSpline((Element[])sourceElements.ToArray(), (Element[])destElements.ToArray()); + double value = destElements[0].Row; + values.Add((float)value); + valueDate = new DateTime(valueDate.Year+1,valueDate.Month,valueDate.Day); + } + List inverseValues = new List(); + for (int index = values.Count - 1; index >= 0; index--) + { + inverseValues.Add(values[index]); + } + float[] fvalues = inverseValues.ToArray(); + double averageReturn = Numerics.AverageReturn(ref fvalues); + return averageReturn; + } + /// AverageReturnWithSpline -This is a collection of prices ordered highest date first. + /// values + /// AverageReturnWithSpline + //public static double AverageReturnWithSpline(TimeSeriesCollection timeSeriesCollection,ReturnItems returnItems) + //{ + // List sourceElements = new List(); + // List destElements = null; + + // returnItems.Clear(); + // if (null == timeSeriesCollection || 0 == timeSeriesCollection.Count) return double.NaN; + // for (int index = timeSeriesCollection.Count - 1; index >= 0; index--) + // { + // TimeSeriesElement timeSeriesElement = timeSeriesCollection[index]; + // sourceElements.Add(new Element(Utility.DateToLong(timeSeriesElement.AsOf), timeSeriesElement.Value)); + // } + // DateTime startDate = timeSeriesCollection[timeSeriesCollection.Count - 1].AsOf; + // DateTime endDate = timeSeriesCollection[0].AsOf; + // DateTime valueDate = startDate; + + // while (valueDate <= endDate) + // { + // destElements = new List(); + // destElements.Add(new Element(Utility.DateToLong(valueDate), 0)); + // CatmullRom.PerformSpline((Element[])sourceElements.ToArray(), (Element[])destElements.ToArray()); + // double value = destElements[0].Row; + // returnItems.Add(new ReturnItem(valueDate,value)); + // valueDate = new DateTime(valueDate.Year + 1, valueDate.Month, valueDate.Day); + // } + // returnItems.CalculateReturns(); + // float[] values = null; + // values = returnItems.ToFloat(); + // double averageReturn = Numerics.Mean(ref values); + // return averageReturn; + //} + /// AverageReturn -Assumes this is a collection of prices ordered highest date first. + /// timeSeriesCollection,if exclusionThreshold is provided then return values>than threshold will be thrown away + /// AverageReturn + public static double AverageReturn(TimeSeriesCollection timeSeriesCollection) + { + if(null==timeSeriesCollection || 0==timeSeriesCollection.Count)return double.NaN; + float[] values = timeSeriesCollection.ToFloat(); + return AverageReturn(ref values); + } + /// AverageReturn -Assumes this is a collection of prices ordered highest date first. + /// values,if exclusionThreshold is provided then return values>than threshold will be thrown away + /// AverageReturn + public static double AverageReturn(ref float[] values) + { + try + { + if (0 == values.Length) return double.NaN; + List returns = new List(); + for (int index = 0; index < values.Length - 1; index++) + { + float current = values[index]; + float prev = values[index + 1]; + if (0 == prev) returns.Add(0.00); + else + { + double currentReturn=double.NaN; + if (prev == 0.00) currentReturn = 0; + else currentReturn = (float)((current - prev) / Math.Abs(prev)); + returns.Add(currentReturn); + } + } + double[] returnsArray = returns.ToArray(); + return Mean(ref returnsArray); + } + catch (Exception) + { + return double.NaN; + } + } + /// AverageReturnTop -Assumes this is a collection of prices ordered highest date first. + /// values + /// AverageReturnTop - Calculates return of top n elements, count must be greater than 1 + public static double AverageReturnTop(ref float[] values,int top) + { + try + { + if (0 == values.Length || 1==values.Length || values.LengthPeriodicReturn -Assumes this is a collection of daily prices ordered highest date first. +/// values +/// PeriodicReturn - Calculates return of elements + public static double AnnualReturn(ref float[] values) + { + double periodicReturn = double.NaN; + double p0 = values[values.Length - 1]; + double p1 = values[0]; + double returnValue=(p1-p0)/Math.Abs(p0); + double n = values.Length / 365; + periodicReturn = Math.Pow(1 + returnValue, 1 / n) - 1; + return periodicReturn; + } +// most recent price is at lowest index + //public static float[] GetReturns(float[] prices) + //{ + // if(null==prices||1==prices.Length)return null; + // float[] returns = new float[prices.Length - 1]; + // for (int index = 0; index < prices.Length - 1; index++) + // { + // float currentPrice = prices[index]; + // float prevPrice = prices[index + 1]; + // if (0.00 == prevPrice) returns[index] = 0.00F; + // else returns[index] = (float)((currentPrice - prevPrice) / Math.Abs(prevPrice)); + // } + // return returns; + //} +/// PowerHit - Returns power hitting of vector x. +/// values +/// power hit + public static float PowerHitting(ref float[] values) + { + float win=0; + long winCount=0; + float lose=0; + long loseCount=0; + + if(0==values.Length)return float.NaN; + foreach(float value in values) + { + if(value>0) + { + win+=value; + winCount++; + } + else if(value<0) + { + lose+=(-value); + loseCount++; + } + } + return (loseCount*win/(winCount*lose)); + } +/// Product - Returns sum of products. +/// values +/// product + public static float Product(ref float[] values) + { + float product=1; + if(0==values.Length)return 0; + foreach(float value in values) + { + product*=value; + } + return product; + } +/// CumProduct - Returns cumulative product of values. +/// values +/// cumulative product + public static float[] CumProduct(ref float[] values) + { + if(0==values.Length)return new float[0]; + float[] cumProduct=new float[values.Length]; + cumProduct[0]=values[0]; + for(int index=1;indexStdDev - Calculates standard deviation of values. +/// values +/// standard deviation + public static float StdDev(ref float[] values) + { + long length = 0;// values.Length; + float value; + float sum=0; + float sqr=0; + + if(null==values || 1>=(length=values.Length))return float.NaN; + for(int index=0;indexStdDev - Calculates standard deviation of values. +/// values +/// standard deviation + public static double StdDev(ref double[] values) + { + long length = 0; ; + double value; + double sum=0; + double sqr=0; + + if(null==values || 1>=(length=values.Length))return float.NaN; + for(int index=0;indexStDevWithDecay - Calculates StDev with a Decay. +/// float array x. +/// float StDev + //public static float StdDevWithDecay(ref float[] x) + //{ + // if(1>=x.Length)return 0; + // return ApplyDecay(ref x); + //} +/// Covariance - Calculates covariance of x and y. +/// vector x +/// vector y. +/// covariance +///In probability theory and statistics, covariance is a measure of the joint variability of two random variables. +///[1] If the greater values of one variable mainly correspond with the greater values of the other variable, +///and the same holds for the lesser values, (i.e., the variables tend to show similar behavior), +///the covariance is positive.[2] In the opposite case, when the greater values of one variable mainly +///correspond to the lesser values of the other, (i.e., the variables tend to show opposite behavior), +///the covariance is negative. The sign of the covariance therefore shows the tendency in the linear +///relationship between the variables. The magnitude of the covariance is not easy to interpret because +///it is not normalized and hence depends on the magnitudes of the variables. The normalized version of the +///covariance, the correlation coefficient, however, shows by its magnitude the strength of the linear relation. + public static float Covariance(ref float[] x,ref float[] y) + { + float meanx; + float meany; + int length; + float product; + + if(0==x.Length && 0==y.Length)return 0; + if((length=x.Length)!=y.Length)return 0; + product=0; + meanx=Mean(ref x); + meany=Mean(ref y); + for(int index=0;indexCovariance - Calculates covariance of x and y. +/// vector x +/// vector y. +/// covariance + public static double Covariance(ref double[] x,ref double[] y) + { + double meanx; + double meany; + int length; + double product; + + if(0==x.Length && 0==y.Length)return 0; + if((length=x.Length)!=y.Length)return 0; + product=0; + meanx=Mean(ref x); + meany=Mean(ref y); + for(int index=0;indexVariance - Calculates variance of x (population). +/// vector x +/// variance + public static float Variance(ref float[] xarray) + { + return Covariance(ref xarray, ref xarray); + } +/// Variance - Calculates variance of x (population). +/// vector x +/// variance + public static double Variance(ref double[] xarray) + { + return Covariance(ref xarray, ref xarray); + } +/// Skewness - Calculates skewness of x (population). +/// vector x +/// skewness + public static float Skewness(ref float[] x) + { + float meanx; + float sd_x; + int length; + float product; + + if(0==x.Length)return float.NaN; + product=0; + meanx=Mean(ref x); + sd_x=StdDev(ref x); + if(float.NaN==sd_x)return float.NaN; + length=x.Length; + for(int index=0;indexKurtosis - Calculates kurtosis of x. +/// vector x +/// kurtosis + public static float Kurtosis(ref float[] x) + { + float meanx; + float sd_x; + int length; + float product; + + if(0==x.Length)return float.NaN; + product=0; + meanx=Mean(ref x); + sd_x=StdDev(ref x); + if(float.NaN==sd_x) return float.NaN; + length=x.Length; + for(int index=0;indexRemoveDuplicates +/// Removes duplicates from x and y and stores the rest of the values in result. +/// This is a helper function for KStest. +/// vector x +/// vector y +/// ArrayList result +/// x without duplicates + private static float[] RemoveDuplicates(float[] x,float[] y,ArrayList result) + { + ArrayList list= new ArrayList(); + int newLength=0; + for(int i=0; i Do not reject the null hypothesis at 0.05 significance level. + H = 1 => Reject the null hypothesis at 0.05 significance level. + (2) pValue: the asymptotic P-value P. + (3) KSstat: the K-S test statistic, T = max|S(x) - CDF|, where S(x) is the + empirical c.d.f. estimated from the sample vector X and CDF is the + standard normal. + (4) criticalValue: the critical value of the test, on which the decision + to reject the null hypothesis is based. + + NaN's are removed and a blank is returned if the length of the input array is 0. + + The implementation of this function is based on the Matlab function kstest.m +*/ + public static KSTest KSTest(ref float[]x) + { + float alpha=0.05f; + KSTest blank=new KSTest(0,Double.NaN,Double.NaN,Double.NaN); + + ArrayList xNoNaNs=new ArrayList(); + for(int i=0; icriticalValue?1:0; + double lambda=Math.Max((Math.Sqrt(n)+0.12+0.11/Math.Sqrt(n))*KSstatistic,0); + int[] j=new int[101]; + double sumP=0; + for(int i=0; i1)pValue=1; + + KSTest ret=new KSTest(H,pValue,KSstatistic,criticalValue); + return ret; + } + +/* ERFC Complementary error function for each element of x. + * The function is defined as: + * erfc(x) = 2/sqrt(pi) * integral from x to inf of exp(-t^2) dt. + * = 1 - erf(x). + * + * This is a helper function to KStest and is based on the Matlab function erfc.m + * / + */ + private static double[] ERFCore(double[] x, int jint) + { + double[] result = new double[x.Length]; + for(int i=0; i0) + { + double[] a=new double[] {3.16112374387056560e00, 1.13864154151050156e02, 3.77485237685302021e02, 3.20937758913846947e03,1.85777706184603153e-1}; + double[] b=new double[] {2.36012909523441209e01, 2.44024637934444173e02, 1.28261652607737228e03, 2.84423683343917062e03}; + + double[] y=new double[k.Length]; + double[] z=new double[k.Length]; + double[] xnum=new double[k.Length]; + double[] xden=new double[k.Length]; + for(int i=0; ixbreak && Math.Abs(x[i])<=4.0) + { + kList1.Add(i); + newLength1++; + } + + int[] k1=new int[newLength1]; + kList1.CopyTo(k1); + + + if(k1.Length>0) + { + double[] c=new double[] {5.64188496988670089e-1, 8.88314979438837594e00, 6.61191906371416295e01, 2.98635138197400131e02, 8.81952221241769090e02, 1.71204761263407058e03, 2.05107837782607147e03, 1.23033935479799725e03, 2.15311535474403846e-8}; + double[] d=new double[] {1.57449261107098347e01, 1.17693950891312499e02, 5.37181101862009858e02, 1.62138957456669019e03, 3.29079923573345963e03, 4.36261909014324716e03, 3.43936767414372164e03, 1.23033935480374942e03}; + + double[] y=new double[k1.Length]; + double[] z=new double[k1.Length]; + double[] xnum=new double[k1.Length]; + double[] xden=new double[k1.Length]; + double[] del=new double[k1.Length]; + for(int i=0; i0?Math.Floor(y[i]*16)/16:Math.Ceiling(y[i]*16)/16; + del[i]=(y[i]-z[i])*(y[i]+z[i]); + result[k1[i]]=Math.Exp(z[i]*z[i]*-1)*Math.Exp(del[i]*-1)*result[k1[i]]; + } + } + + ArrayList kList2 = new ArrayList(); + int newLength2=0; + for(int i=0; i4.0) + { + kList2.Add(i); + newLength2++; + } + + int[] k2=new int[newLength2]; + kList2.CopyTo(k2); + + if(k2.Length>0) + { + double[] p=new double[] {3.05326634961232344e-1, 3.60344899949804439e-1, 1.25781726111229246e-1, 1.60837851487422766e-2, 6.58749161529837803e-4, 1.63153871373020978e-2}; + double[] q=new double[] {2.56852019228982242e00, 1.87295284992346047e00, 5.27905102951428412e-1, 6.05183413124413191e-2, 2.33520497626869185e-3}; + + double[] y=new double[k2.Length]; + double[] z=new double[k2.Length]; + double[] xnum=new double[k2.Length]; + double[] xden=new double[k2.Length]; + double[] del=new double[k2.Length]; + for(int i=0; i0?Math.Floor(y[i]*16)/16:Math.Ceiling(y[i]*16)/16; + del[i]=(y[i]-z[i])*(y[i]+z[i]); + result[k2[i]]=Math.Exp(z[i]*z[i]*-1)*Math.Exp(del[i]*-1)*result[k2[i]]; + } + + + ArrayList kList3 = new ArrayList(); + int newLength3=0; + for(int i=0; iCorrelation - Calculates correlation coefficient from input vectors. +/// vector x +/// vector y. +/// correlation coefficient +/// Interpretation of results: +/// -1 : A perfect downhill (negative) linear relationship +/// -0.70 : A strong downhill (negative) linear relationship +/// –0.50. A moderate downhill (negative) relationship +/// –0.30. A weak downhill (negative) linear relationship +/// 0. No linear relationship +/// +0.30. A weak uphill (positive) linear relationship +/// +0.50. A moderate uphill (positive) relationship +/// +0.70. A strong uphill (positive) linear relationship +/// Exactly +1. A perfect uphill (positive) linear relationship +///In probability theory and statistics, covariance is a measure of the joint variability of two random variables. +///[1] If the greater values of one variable mainly correspond with the greater values of the other variable, +///and the same holds for the lesser values, (i.e., the variables tend to show similar behavior), +///the covariance is positive.[2] In the opposite case, when the greater values of one variable mainly +///correspond to the lesser values of the other, (i.e., the variables tend to show opposite behavior), +///the covariance is negative. The sign of the covariance therefore shows the tendency in the linear +///relationship between the variables. The magnitude of the covariance is not easy to interpret because +///it is not normalized and hence depends on the magnitudes of the variables. The normalized version of the +///covariance, the correlation coefficient, however, shows by its magnitude the strength of the linear relation. + public static float Correlation(ref float[] x, ref float[] y) + { + float sd_x = StdDev(ref x); + float sd_y = StdDev(ref y); + return Covariance(ref x, ref y)*x.Length/((sd_x * sd_y)*(x.Length-1)); + } +/// Correlation - Calculates correlation matrix from input matrix. +/// source matrix +/// number of columns in source. +/// number of columns in source. +/// tranposed array + public static float[,] Correlation(ref float[,] matrix,int rows,int cols) + { + float[,] result=new float[cols,cols]; + float[] x=new float[rows]; + float[] y=new float[rows]; + int col=0; + int row; + + for(int srcIndex=0;srcIndexCreateCorrelationMatrix - Creates correlation matrix from input matrix. +/// the input matrix. +/// indicates whether to transpose the input matrix. +/// float[,] correlation matrix + public static float[,] CreateCorrelationMatrix(ref float[,] values,bool transpose) + { + int columns=values.GetLength(1); + int rows=values.GetLength(0); + if(!transpose)return Correlation(ref values,rows,columns); + float[,] transposeMatrix=Transpose(ref values,ref rows,ref columns); + return Correlation(ref transposeMatrix,rows,columns); + } +/// Transpose - Convert horizontal range of cells to vertical. +/// number of rows in source +/// number of columns in source. +/// the source matrix. +/// tranposed array + public static float[] Transpose(ref int srcRows,ref int srcCols,ref float[] source) + { + float[] result=new float[srcRows*srcCols]; + long dstRow=0; + long dstCol=0; + + for(int srcRow=0;srcRowTranspose - Convert horizontal range of cells to vertical. +/// number of rows in source +/// number of columns in source. +/// the source matrix. +/// tranposed array + public static float[,] Transpose(ref float[,] source,ref int srcRows,ref int srcCols) + { + float[,] result=new float[srcCols,srcRows]; + long dstRow=0; + long dstCol=0; + + for(int srcRow=0;srcRowTransposeXAY - Transpose(x)*A*y. +/// row vector +/// matrix. +/// column vector. +/// number of elements in each dimension. +/// tranposed array + public static float TransposeXAY(ref float[] x,ref float[,] a,ref float[] y,int elements) + { + float[] acol=new float[elements]; + float[] intermediate=new float[elements]; + + for(int col=0;colMMult - Performs matrix multiplication of vectors. +/// the row vector +/// the column vector +/// Product + public static float MMult(ref float[] rowVector,ref float[] colVector) + { + float product=0; + int length; + + if((length=rowVector.Length)!=colVector.Length)return product; + for(int index=0;indexGetXY - Get vertical columns from matrix[,] into x and y. +/// column from matrix to copy to x array +/// column from matrix to copy to y array +/// source matrix +/// destination array x +/// destination array y +/// None + private static void GetXY(int xColumn,int yColumn,ref float[,] matrix,ref float[] x,ref float[] y,int rows) + { + for(int row=0;rowGetX - Get vertical column from matrix[,] into x. +/// column from matrix to copy +/// the source matrix. +/// the destination vector. +/// number of rows in matrix. +/// None + private static void GetX(int xColumn,ref float[,] matrix,ref float[] x,int rows) + { + for(int row=0;rowBeta - Calculates Beta. +/// ticker returns. +/// sector returns. +/// Beta value +/// A beta of 1.00 indicates that the security's price will move with the market +/// A beta of less than 1.00 indicates that the security will be less volatile than the market +/// A beta of more than 1.00 indicates that the security will be more volatile than the market +/// The revised code (i.e.) Beta=Covariance(x,y)/Variance(x) was taken from Investopedia + public static double Beta(ref double[] assetReturns, ref double[] benchmarkReturns) + { + return Covariance(ref assetReturns, ref benchmarkReturns) / Variance(ref benchmarkReturns); + } +/// ApplyDecay - Apply exponential weighting. +/// the samples to weight. +/// The weighted standard deviation + //private static float ApplyDecay(ref float[] samples) + //{ + // int numSamples=samples.Length; + // Decay decay=new Decay(numSamples); + // float average=0; + // float weightedVariance=0; + // float weightedError=0; + // float stddev=0; + // float error=0; + + // for(int item=0;itemRSquared - Calculate R2 statistic. +/// observations. +/// residual sum of squares. +/// includes mean. +/// The R2 statistic + //public static double RSquared(ref double[] y,double rss,bool includeMean) + //{ + // double mean=0; + // double tss=0; + // double intermediate=0; + + // if(includeMean) + // { + // mean=Numerics.Mean(ref y); + // for(int index=0;indexTStatistic - Calculate TStatistic. +/// The average for the samples. +/// Standard deviation of the samples. +/// The number of samples. +/// TStatistic + public static float TStatistic(float average,float stddev,int samples) + { + if(0==samples||0==stddev)return float.NaN; + return (float)((average/stddev)*Math.Sqrt(samples)); + } +/// TStatistic - Calculate TStatistic. +/// Least squares estimates. +/// Standard errors. +/// TStatistic + public static double[] TStatistic(ref double[] leastSquaresEstimates,ref double[] standardErrors) + { + double[] tStats; + int length; + if((length=leastSquaresEstimates.Length)!=standardErrors.Length)return new double[0]; + tStats=new double[length]; + for(int index=0;index maxPrice) maxPrice = prices[i]; + else if (prices[i] < maxPrice) maxDd = Math.Min(maxDd, prices[i] / maxPrice - 1); + } + return maxDd; + } +// a float version + public static float MaxDrawdown(float[] prices) + { + if (prices.Length <= 1) return 0; + float maxPrice = prices[0]; + float maxDd = 0; + for (int i = 1; i < prices.Length; i++) + { + if (prices[i] > maxPrice) maxPrice = prices[i]; + else if (prices[i] < maxPrice) maxDd = Math.Min(maxDd, prices[i] / maxPrice - 1); + } + return maxDd; + } +// float MaxUpside + public static float MaxUpside(float[] prices) + { + if (prices.Length <= 1) return 0; + float minPrice = prices[0]; + float maxUpside = 0; + for (int i = 1; i < prices.Length; i++) + { + if (prices[i] < minPrice) minPrice = prices[i]; + else if (prices[i] > minPrice) maxUpside = Math.Max(maxUpside, prices[i] / minPrice - 1); + } + return maxUpside; + } + } +} diff --git a/eNavigator/MarketDataLib/Numerics/Spline.cs b/eNavigator/MarketDataLib/Numerics/Spline.cs new file mode 100755 index 0000000..4fa2c8c --- /dev/null +++ b/eNavigator/MarketDataLib/Numerics/Spline.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections; + +namespace MarketData.Numerical +{ +// The column is the key, the row is the value. +// For Time series elements put the date in the column and the value in the row + public class Element + { + private double row; + private double column; + + public Element() + { + } + public Element(double column, double row) + { + this.column = column; + this.row = row; + } + public double Row + { + get { return row; } + set { row = value; } + } + public double Column + { + get { return column; } + set { column = value; } + } + } + public class CatmullRom + { + private CatmullRom() + { + } + public static bool PerformSpline(Element[] sourcePairs, Element[] destPairs) + { + double a0, a1, a2, a3; + double dx, dx1, dx2; + double dy, dy1, dy2; + double endPointOne; + double endPointTwo; + double resamplingPos; + double xPoint; + int clampOne, clampTwo; + int direction; + int destSize = destPairs.Length; + int sourceSize = sourcePairs.Length; + int inputIndex, index; + + a0 = a1 = a2 = a3 = endPointOne = 0; + if (sourceSize < 2 || destSize < 1) return false; + if (((Element)sourcePairs[0]).Column < ((Element)sourcePairs[1]).Column) + { + if (((Element)destPairs[0]).Column < ((Element)sourcePairs[0]).Column || + ((Element)destPairs[destSize - 1]).Column > ((Element)sourcePairs[sourceSize - 1]).Column) + direction = 0; + else direction = 1; + } + else + { + if (((Element)destPairs[0]).Column > ((Element)sourcePairs[0]).Column || + ((Element)destPairs[destSize - 1]).Column < ((Element)sourcePairs[sourceSize - 1]).Column) + direction = 0; + else direction = -1; + } + if (0 == direction) return false; + if (1 == direction) endPointTwo = ((Element)destPairs[0]).Column - 1; + else endPointTwo = ((Element)destPairs[0]).Column + 1; + for (index = 0; index < destSize; index++) + { + resamplingPos = ((Element)destPairs[index]).Column; + if ((1 == direction && resamplingPos > endPointTwo) || + (-1 == direction && resamplingPos < endPointTwo)) + { + for (inputIndex = 0; inputIndex < sourceSize && resamplingPos > ((Element)sourcePairs[inputIndex]).Column; inputIndex++) ; + if (resamplingPos < ((Element)sourcePairs[inputIndex]).Column) inputIndex--; + if (inputIndex < 0) inputIndex = 0; + else if (inputIndex == sourceSize-1) inputIndex--; + endPointOne = ((Element)sourcePairs[inputIndex]).Column; + endPointTwo = ((Element)sourcePairs[inputIndex + 1]).Column; + clampOne = Math.Max(inputIndex - 1, 0); + clampTwo = Math.Min(inputIndex + 2, sourceSize - 1); + double clampOneValue = ((Element)sourcePairs[clampOne]).Column; + double clampTwoValue = ((Element)sourcePairs[clampTwo]).Column; + dx = 1.0 / ((endPointTwo - endPointOne)==0?1:(endPointTwo-endPointOne)); + dx1 = 1.0 / ((endPointTwo - clampOneValue) == 0 ? 1 : (endPointTwo - clampOneValue)); + dx2 = 1.0 / (clampTwoValue-endPointOne == 0 ? 1 : (clampTwoValue - endPointOne)); + dy = (((Element)sourcePairs[inputIndex + 1]).Row - ((Element)sourcePairs[inputIndex]).Row) * dx; + dy1 = (((Element)sourcePairs[inputIndex + 1]).Row - ((Element)sourcePairs[clampOne]).Row) * dx1; + dy2 = (((Element)sourcePairs[clampTwo]).Row - ((Element)sourcePairs[inputIndex]).Row) * dx2; + a0 = ((Element)sourcePairs[inputIndex]).Row; + a1 = dy1; + a2 = dx * (3 * dy - 2 * dy1 - dy2); + a3 = dx * dx * (-2 * dy + dy1 + dy2); + } + xPoint = resamplingPos - endPointOne; + ((Element)destPairs[index]).Row = ((a3 * xPoint + a2) * xPoint + a1) * xPoint + a0; + } + return true; + } + public static Element[] CreateSplineSourceElements(double[] columns, double[] rows) + { + Element[] elements = new Element[columns.Length]; + if (columns.Length != rows.Length) return null; + for (int index = 0; index < columns.Length; index++) + { + elements[index] = new Element(columns[index], rows[index]); + } + return elements; + } + } +} // namespace diff --git a/eNavigator/MarketDataLib/Service/Authorization.cs b/eNavigator/MarketDataLib/Service/Authorization.cs new file mode 100755 index 0000000..6061780 --- /dev/null +++ b/eNavigator/MarketDataLib/Service/Authorization.cs @@ -0,0 +1,15 @@ +using System; +using System.Text; + +namespace MarketData.Service +{ + public class Authorizations + { + public static String Xor(String input, int magic=5) + { + StringBuilder sb = new StringBuilder(); + foreach (char ch in input) sb.Append((char)(ch ^ (char)magic)); + return sb.ToString(); + } + } +} diff --git a/eNavigator/MarketDataLib/Service/ServiceResult.cs b/eNavigator/MarketDataLib/Service/ServiceResult.cs new file mode 100755 index 0000000..098452b --- /dev/null +++ b/eNavigator/MarketDataLib/Service/ServiceResult.cs @@ -0,0 +1,33 @@ +using MarketData.MarketDataModel; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Net; +using System.Net.Http; +using System.Text; + +namespace MarketData.Service +{ + public class ServiceResult + { + public ServiceResult(bool success) + { + Success=success; + } + public ServiceResult(bool success,String message) + { + Success=success; + Message=message; + } + public ServiceResult(Object contextSpecificResult) + { + Success=true; + ContextSpecificResult=contextSpecificResult; + } + public bool Success{get;set;} + public Object ContextSpecificResult{get;set;} + public String Message{get; set; } + public long ElapsedTimeMS{ get; set; } + } +} \ No newline at end of file diff --git a/eNavigator/MarketDataLib/Utility/CSVLineHelper.cs b/eNavigator/MarketDataLib/Utility/CSVLineHelper.cs new file mode 100755 index 0000000..12d2176 --- /dev/null +++ b/eNavigator/MarketDataLib/Utility/CSVLineHelper.cs @@ -0,0 +1,57 @@ +using System; +using System.Text; +using System.Collections.Generic; + +namespace MarketData.Utils +{ + public class CSVLineHelper + { + public CSVLineHelper() + { + } + public static String[] ParseLine(String strLine) + { + try + { + List items = new List(); + int length = strLine.Length; + for (int index = 0; index < length; index++) + { + char ch = strLine[index]; + if (ch == '"') items.Add(GetQuotedItem(strLine, ref index, length)); + else items.Add(GetItem(strLine, ref index, length)); + } + return items.ToArray(); + } + catch (Exception exception) + { + MDTrace.WriteLine(LogLevel.DEBUG,exception.ToString()); + return null; + } + } + private static String GetQuotedItem(String strLine,ref int index,int length) + { + StringBuilder sb = new StringBuilder(); + char ch = '\0'; + while (indexDateGenerator - Generate Historical Dates + [Serializable] + public class DateGenerator + { + private Hashtable holidays=null; + public DateGenerator() + { + } + public DateTime GetPrevMonthStart(DateTime dateTime) + { + DateTime startDate = new DateTime(dateTime.Year, dateTime.Month, 1); + startDate = startDate.AddMonths(-1); + startDate = GetNextBusinessDay(startDate); + return startDate; + } + public DateTime GetCurrMonthStart(DateTime dateTime) + { + DateTime startDate = new DateTime(dateTime.Year, dateTime.Month, 1); + startDate = GetNextBusinessDay(startDate); + return startDate; + } + public DateGenerator(Hashtable holidays) + { + this.holidays=holidays; + } + public static int GetPrevMonth(int month) + { + if(1==month)return 12; + return month-1; + } +/// FindPrevBusinessDay - Finds previous business day +/// DateTime + public DateTime FindPrevBusinessDay(DateTime asOf) + { + TimeSpan oneDay=new TimeSpan(1,0,0,0); + asOf=asOf.Subtract(oneDay); + while(IsWeekend(asOf)||IsHoliday(asOf))asOf=asOf.Subtract(oneDay); + return asOf; + } + /// FindNextBusinessDays - Finds following business day + /// DateTime + public DateTime FindForwardBusinessDay(DateTime asOf,int daysForward) + { + for (int index = 0; index < daysForward; index++) + { + asOf = FindNextBusinessDay(asOf); + } + return asOf; + } +/// FindNextBusinessDay - Finds following business day +/// DateTime + public DateTime FindNextBusinessDay(DateTime asOf) + { + TimeSpan oneDay=new TimeSpan(1,0,0,0); + asOf=asOf.Add(oneDay); + while(IsWeekend(asOf)||IsHoliday(asOf))asOf=asOf.Add(oneDay); + return asOf; + } +/// GetPrevBusinessDay - Gets previous business day +/// If the given date is a business day then this method will return the given date +/// None + public DateTime GetPrevBusinessDay(DateTime asOf) + { + TimeSpan oneDay=new TimeSpan(1,0,0,0); + while(IsWeekend(asOf)||IsHoliday(asOf))asOf=asOf.Subtract(oneDay); + return asOf; + } +/// GetNextBusinessDay - Gets next business day +/// If the given date is a business day then this method will return the given date +/// None + public DateTime GetNextBusinessDay(DateTime asOf) + { + TimeSpan oneDay=new TimeSpan(1,0,0,0); + while(IsWeekend(asOf)||IsHoliday(asOf))asOf=asOf.Add(oneDay); + return asOf; + } +/// GetNextDay - Gets next business day +/// If the given date is a business day then this method will return the given date +/// None + public DateTime GetNextDay(DateTime asOf) + { + return asOf.Add(Utility.OneDay); + } +/// GetPrevFriday - Gets date of prior friday +/// Get the date of the previous friday - if previous Friday is holiday will seek previous business day +/// None + public DateTime GetPrevFriday(DateTime asOf) + { + TimeSpan oneDay=new TimeSpan(1,0,0,0); + List historicalDates=null; + int daysToFetch=7; + + if(DayOfWeek.Friday==asOf.DayOfWeek) + { + asOf=asOf.Subtract(oneDay); + daysToFetch--; + } + historicalDates=GenerateHistoricalDates(asOf,daysToFetch); + for(int index=0;index endDate) + { + TimeSpan timeSpan = startDate.Date - endDate.Date; + return (int)timeSpan.TotalDays; + } + else + { + TimeSpan timeSpan = endDate.Date - startDate.Date; + return (int)timeSpan.TotalDays; + } + } + public static List GenerateHistoricalYear(int startYear,int years) + { + List yearsList = new List(); + for (int index = 0; index < years; index++) + { + yearsList.Add(startYear); + startYear--; + } + return yearsList; + } + public List GenerateHistoricalDates(DateTime startDate, int dayCount) + { + List histDates=new List(); + DateTime histDate; + TimeSpan singleDay; + + startDate = startDate.Date; + histDate=startDate; + if(dayCount<0)singleDay=new TimeSpan(-1,0,0,0); + else singleDay=new TimeSpan(1,0,0,0); + dayCount=dayCount<0?-dayCount:dayCount; + while(histDates.Count GenerateHistoricalDates(DateTime startDate,DateTime endDate) + { + if (Utility.Epoch.Equals(startDate)||Utility.Epoch.Equals(endDate)) return null; + startDate = startDate.Date; + endDate = endDate.Date; + List histDates = new List(); + DateTime histDate; + TimeSpan singleDay; + + bool reverse = false; + if (endDate > startDate) + { + reverse = true; + DateTime swap = endDate; + endDate = startDate; + startDate = swap; + } + histDate=startDate; + singleDay=new TimeSpan(1,0,0,0); + while(histDate>=endDate) + { + if(IsMarketOpen(ref histDate))histDates.Add(histDate); + histDate=histDate.Subtract(singleDay); + } + if (reverse) histDates.Reverse(); + return histDates; + } +// The function will figure out which date is the most recent and which one is the historical date. +// Generally, make startDate the most recent and endDate the historical date. + public List GenerateHistoricalDatesActual(DateTime startDate, DateTime endDate) + { + if (Utility.Epoch.Equals(startDate) || Utility.Epoch.Equals(endDate)) return null; + startDate = startDate.Date; + endDate = endDate.Date; + List histDates = new List(); + DateTime histDate; + TimeSpan singleDay; + + bool reverse = false; + if (endDate > startDate) + { + reverse = true; + DateTime swap = endDate; + endDate = startDate; + startDate = swap; + } + histDate = startDate; + singleDay = new TimeSpan(1, 0, 0, 0); + while (histDate >= endDate) + { + histDates.Add(histDate); + histDate = histDate.Subtract(singleDay); + } + if (reverse) histDates.Reverse(); + return histDates; + } + private bool IsMarketOpen(ref DateTime dateTime) + { + if(IsWeekend(dateTime)||IsHoliday(dateTime))return false; + return true; + } + public bool IsWeekend(DateTime dateTime) + { + if(DayOfWeek.Sunday==dateTime.DayOfWeek || DayOfWeek.Saturday==dateTime.DayOfWeek)return true; + return false; + } + public bool IsHoliday(DateTime dateTime) + { + if(null==holidays)return false; + return holidays.Contains(dateTime.Date); + } + } +} + diff --git a/eNavigator/MarketDataLib/Utility/DateRange.cs b/eNavigator/MarketDataLib/Utility/DateRange.cs new file mode 100755 index 0000000..382f200 --- /dev/null +++ b/eNavigator/MarketDataLib/Utility/DateRange.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Collections; +using System.Text; + +namespace MarketData.Utils +{ + public class DateRange : List + { + public DateRange(DateTime startDate,DateTime endDate) + { + startDate = startDate.Date; + endDate=endDate.Date; + DateGenerator dateGenerator=new DateGenerator(); + List dates= dateGenerator.GenerateHistoricalDates(startDate, endDate); + foreach (DateTime date in dates) Add(date); + Sort(); // ensure that no matter how we set this up, the oldest date winds up being at the lowest index of the list + } + public DateTime StartDate + { + get { return this[0]; } + } + public DateTime EndDate + { + get { return this[Count-1]; } + } + } +} diff --git a/eNavigator/MarketDataLib/Utility/MDTrace.cs b/eNavigator/MarketDataLib/Utility/MDTrace.cs new file mode 100755 index 0000000..23b0d0c --- /dev/null +++ b/eNavigator/MarketDataLib/Utility/MDTrace.cs @@ -0,0 +1,159 @@ +using System; +using System.Diagnostics; +using System.Threading; +using System.Text; +using System.Reflection; +using System.Net; +//using System.Runtime.Remoting.Messaging; + +// Filename: MarketDataTrace.cs +// Author:Sean Kessler +// Date:11/2005 + +namespace MarketData.Utils +{ + public enum LogLevel : uint + { + NONE=0x0000, + INFO=0x0002, + DEBUG=0x0004, + VERBOSE=0x0008 + }; +/// MarketDataTrace - Utility for . + public class MDTrace + { + private static LogLevel logLevel=LogLevel.DEBUG; + +/// MarketDataTrace - Private constructor prevents instantiation. +/// none + private MDTrace() + { + } + +/// LogLevel - Get/Set Log level. +/// The log level. +/// LogLevel + public static LogLevel LogLevel + { + get{return logLevel;} + set{logLevel=value;} + } +/// WriteLine - Writes a line of text to trace log. +/// string content of message to write. +/// void +// [Conditional("TRACE")] + public static void Write(LogLevel logLevel,string message) + { + if(MDTrace.logLevelWriteLine - Writes a line of text to trace log. +/// string content of message to write. +/// void +// [Conditional("TRACE")] + public static void WriteLine(string message) + { + WriteLine(LogLevel.DEBUG,GetCallerIP()+GetThreadRep()+GetLogLevelRep()+"["+DateTime.Now.ToString()+"]"+" "+GetMethodInfo()+message); + Console.WriteLine(message); + } +/// WriteLine - Writes a line of text to trace log. +/// string content of message to write. +/// void +// [Conditional("TRACE")] + public static void WriteLine(LogLevel logLevel,Exception exception) + { + if(MDTrace.logLevelWriteLine - Writes a line of text to trace log. +/// string content of message to write. +/// void +// [Conditional("TRACE")] + public static void WriteLine(LogLevel logLevel,string message) + { + if(MDTrace.logLevelIndent - set trace log indentation. +/// void +// [Conditional("TRACE")] + public static void Indent() + { + Trace.Indent(); + } +/// Unindent - set trace log indentation back. +/// void +// [Conditional("TRACE")] + public static void Unindent() + { + Trace.Unindent(); + } +/// Flush - Flush trace log buffers to disk. +/// void +// [Conditional("TRACE")] + public static void Flush() + { + Trace.Flush(); + } +/// GetLogLevel - Return current log level. +/// LogLevel + public static LogLevel GetLogLevel(String strLogLevel) + { + if(strLogLevel.Equals("debug"))return LogLevel.DEBUG; + else if(strLogLevel.Equals("verbose"))return LogLevel.VERBOSE; + else if(strLogLevel.Equals("info"))return LogLevel.INFO; + else return LogLevel.NONE; + } + +/// GetLogLevel - Return current log level. +/// LogLevel + private static string GetLogLevelRep() + { + if (MDTrace.logLevel == LogLevel.DEBUG) return "[TRACE.DEBUG]"; + else if (MDTrace.logLevel == LogLevel.VERBOSE) return "[TRACE.VERBOSE]"; + else if (MDTrace.logLevel == LogLevel.INFO) return "[TRACE.INFO]"; + else return "[TRACE.NONE]"; + } +/// GetThreadRep - Return threading information. +/// LogLevel + private static string GetThreadRep() + { + return "[Thread="+Thread.CurrentThread.GetHashCode()+"]"; + } +/// GetMethodInfo - Returns information about the calling method 2 frames up. +/// String + private static String GetMethodInfo() + { + StringBuilder sb=new StringBuilder(); + StackFrame frame=new StackFrame(2,true); + MethodBase methodBase=frame.GetMethod(); + ParameterInfo[] parameters=methodBase.GetParameters(); + sb.Append("[").Append(methodBase.DeclaringType.FullName).Append("::").Append(methodBase.Name).Append("("); + for(int index=0;indexGetCallerIP - Returns the calling methods IP address. +/// String + private static String GetCallerIP() + { + String hostName = Dns.GetHostName(); + String hostAddress = Dns.GetHostAddresses(hostName).ToString(); + if(null!=hostName)hostName=hostName.Split('.')[0]; + if(null==hostName && null==hostAddress)return "[LOCAL]"; + return "["+hostAddress+"->"+hostName+"]"; + } + } +} diff --git a/eNavigator/MarketDataLib/Utility/NVP.cs b/eNavigator/MarketDataLib/Utility/NVP.cs new file mode 100755 index 0000000..e5a8408 --- /dev/null +++ b/eNavigator/MarketDataLib/Utility/NVP.cs @@ -0,0 +1,99 @@ +using System; +using System.Runtime.InteropServices; +using System.Collections; +using System.Text; +using System.Collections.Generic; + +namespace MarketData.Utils +{ + public class NVPDictionary : Dictionary + { + public NVPDictionary() + { + } + } + public class NVPCollections : List + { + public NVPCollections() + { + } + public NVPCollections(List nvpCollections) + { + foreach(String nvpCollectionString in nvpCollections)Add(new NVPCollection(nvpCollectionString)); + } + public List ToList() + { + List nvpCollections=new List(); + foreach(NVPCollection nvpCollection in this)nvpCollections.Add(nvpCollection.ToString()); + return nvpCollections; + } + } + public class NVPCollection : List + { + public NVPCollection() + { + } + public NVPCollection(String nvpCollectionString) + { + if(null==nvpCollectionString)return; + String[] nvpItems=nvpCollectionString.Split('|'); + if(null==nvpItems)return; + for(int index=0;index() + { + T result=default(T); + try {result = (T)Convert.ChangeType(Value, typeof(T));} + catch {result = default(T);} + return result; + } + public String Name{get;set;} + public String Value{get;set;} + public override String ToString() + { + StringBuilder sb=new StringBuilder(); + sb.Append(Name).Append("=").Append(Value); + return sb.ToString(); + } + } +} \ No newline at end of file diff --git a/eNavigator/MarketDataLib/Utility/Profiler.cs b/eNavigator/MarketDataLib/Utility/Profiler.cs new file mode 100755 index 0000000..04a94b7 --- /dev/null +++ b/eNavigator/MarketDataLib/Utility/Profiler.cs @@ -0,0 +1,36 @@ +using System.Diagnostics; + +// Filename: Profiler.cs +// Author:Sean Kessler + +namespace MarketData.Utils +{ + /// Profiler - Profiler utility class + public class Profiler + { + private Stopwatch watch = default; + + public Profiler() + { + watch = System.Diagnostics.Stopwatch.StartNew(); + } + public void Reset() + { + watch = System.Diagnostics.Stopwatch.StartNew(); + } + public void Start() + { + watch = System.Diagnostics.Stopwatch.StartNew(); + } + public long Stop() + { + return End(); + } + public long End() + { + watch.Stop(); + return watch.ElapsedMilliseconds; + } + } +} + diff --git a/eNavigator/MarketDataLib/Utility/SemaphoreLocker.cs b/eNavigator/MarketDataLib/Utility/SemaphoreLocker.cs new file mode 100644 index 0000000..2b1c7d1 --- /dev/null +++ b/eNavigator/MarketDataLib/Utility/SemaphoreLocker.cs @@ -0,0 +1,34 @@ +namespace MarketData.Utils +{ + public class SemaphoreLocker + { + private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); + + public async Task LockAsync(Func worker) + { + await _semaphore.WaitAsync(); + try + { + await worker(); + } + finally + { + _semaphore.Release(); + } + } + + // overloading variant for non-void methods with return type (generic T) + public async Task LockAsync(Func> worker) + { + await _semaphore.WaitAsync(); + try + { + return await worker(); + } + finally + { + _semaphore.Release(); + } + } + } +} \ No newline at end of file diff --git a/eNavigator/MarketDataLib/Utility/UpdateManager.cs b/eNavigator/MarketDataLib/Utility/UpdateManager.cs new file mode 100755 index 0000000..7827f57 --- /dev/null +++ b/eNavigator/MarketDataLib/Utility/UpdateManager.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.IO; + +namespace MarketData.Utils +{ + public class UpdateManager + { + private StreamWriter streamWriter=null; + private FileStream fileStream=null; + private Dictionary entries=new Dictionary(); + + public UpdateManager() + { + } + public bool Prepare(String strPathFileName) + { + try + { + String currentWorkingDirectory=Directory.GetCurrentDirectory(); + if(!File.Exists(strPathFileName)||IsExpired(strPathFileName)) + { + if(File.Exists(strPathFileName))File.Delete(strPathFileName); + fileStream=new FileStream(strPathFileName,FileMode.Create); + streamWriter=new StreamWriter(fileStream); + Console.WriteLine(String.Format("Creating session file:{0}",strPathFileName)); + } + else + { + FileStream fileStream=new FileStream(strPathFileName,FileMode.Open); + StreamReader streamReader=new StreamReader(fileStream); + String strLine=null; + while(null!=(strLine=streamReader.ReadLine())) + { + if(!entries.ContainsKey(strLine))entries.Add(strLine,strLine); + } + Console.WriteLine(String.Format("Loaded {0} entries from session file:{1}",entries.Count,strPathFileName)); + streamReader.Close(); + streamReader.Dispose(); + fileStream.Close(); + fileStream.Dispose(); + fileStream=new FileStream(strPathFileName,FileMode.Append); + streamWriter=new StreamWriter(fileStream); + } + return true; + } + catch(Exception exception) + { + Console.WriteLine(String.Format("Exception:{0}",exception)); + return false; + } + } + private bool IsExpired(String strPathFileName) + { + try + { + DateGenerator dateGenerator=new DateGenerator(); + DateTime creationTime=File.GetCreationTime(strPathFileName); + int daysElapsed=Math.Abs(dateGenerator.DaysBetweenActual(creationTime,DateTime.Now)); + if(daysElapsed>5) + { + Console.WriteLine(String.Format("{0} is expired. {1} days old.",strPathFileName,daysElapsed)); + return true; + } + return false; + } + catch(Exception exception) + { + Console.WriteLine(String.Format("Exception:{0}",exception)); + return true; + } + } + public List Entries + { + get{return new List(entries.Keys);} + } + public void Add(String entry) + { + if(null==streamWriter)return; + streamWriter.WriteLine(entry); + streamWriter.Flush(); + } + public void Dispose() + { + if(null!=streamWriter){streamWriter.Close();streamWriter.Dispose();} + if(null!=fileStream){fileStream.Close();fileStream.Dispose();} + } + } +} + diff --git a/eNavigator/MarketDataLib/Utility/Utility.cs b/eNavigator/MarketDataLib/Utility/Utility.cs new file mode 100755 index 0000000..453e4d9 --- /dev/null +++ b/eNavigator/MarketDataLib/Utility/Utility.cs @@ -0,0 +1,575 @@ +using System.Text; +using System.IO.Compression; +using System.Globalization; +using System.Diagnostics; +using MarketData.MarketDataModel; + +namespace MarketData.Utils +{ + public class Utility + { + private static DateTime epoch = DateTime.Parse("01-01-0001"); + private static TimeSpan oneDay=new TimeSpan(1,0,0,0); + + public static String ToUrl(String prefix, String ipAddress, String postfix) + { + return prefix + ipAddress + postfix; + } + + public static String Pad(string str, char filler, int length) + { + int stringLength = str.Length; + if (stringLength >= length) return str; + StringBuilder sb = new StringBuilder(); + while (stringLength < length) + { + sb.Append(filler); + stringLength++; + } + return sb.ToString() + str; + } + public static String RemoveHtml(String strItem) + { + String[] codes = { "'","»" }; + if(null==strItem)return strItem; + foreach (String code in codes) + { + strItem = strItem.Replace(code,"'"); + } + return strItem; +// String str=strItem.Replace("'","'"); + // return str; + } + public static String RemoveDivs(String strItem) + { + StringBuilder sb=new StringBuilder(); + bool inDiv=false; + if(null==strItem)return strItem; + for(int index=0;index'))inDiv=false; + else if(!inDiv)sb.Append(ch); + } + return sb.ToString(); + } + public static String BetweenString(String strItem, String strBegin, String strEnd) + { + if (null == strItem) return null; + int index=-1; + if(null==strBegin)index=0; + else index = strItem.IndexOf(strBegin); + if (-1 == index) return null; + String str = null; + if(null!=strBegin)str=strItem.Substring(index + strBegin.Length); + else str=strItem; + if(null==strEnd)return str; + index = str.IndexOf(strEnd); + if (-1 == index) return null; + StringBuilder sb = new StringBuilder(); + for (int strIndex = 0; strIndex < str.Length; strIndex++) + { + if (index == strIndex) break; + sb.Append(str[strIndex]); + } + return sb.ToString(); + } + public static String RemoveAfter(String strItem, char charItem) + { + StringBuilder sb = new StringBuilder(); + for (int index = 0; index < strItem.Length; index++) + { + char ch = strItem[index]; + if (ch.Equals(charItem)) break; + sb.Append(ch); + } + return sb.ToString(); + } + public static bool OutOfRange(double value) + { + return value > 100000000000000000000.00 || value< -99999999999999999999.99; + } + public static String RemoveControlChars(String strItem) + { + StringBuilder sb=new StringBuilder(); + for(int index=0;index=1000) + { + value/=1000; + strValue=Utility.FormatNumber(value,places,commas)+"K"; + } + else if(value>=1000000) + { + value/=1000000; + strValue=Utility.FormatNumber(value,places,commas)+"M"; + } + else if(value>=1000000000) + { + value/=1000000000; + strValue=Utility.FormatNumber(value,places,commas)+"B"; + } + else + { + strValue=Utility.FormatNumber(value,places,commas); + } + return strValue; + } + public static String FormatNumber(double number,int places,bool commas=false) + { + StringBuilder sb = new StringBuilder(); + + StringBuilder formatString=new StringBuilder(); + if (commas&&number>=1000.00) formatString.Append("{0:0,0."); + else formatString.Append("{0:0."); + for(int index=0;index list,char separator=',') + { + StringBuilder sb=new StringBuilder(); + if (null == list || 0 == list.Count) return null; + for(int index=0;index ToList(String items,char separator=',') + { + List list = items.Split(separator).ToList(); + list=(from String s in list select s.Trim()).ToList(); + return list; + } + public static String FromList(List items,String postFix=",") + { + StringBuilder sb=new StringBuilder(); + for(int index=0;index 0) outputStream.Write(decompressedBytesBuffer, 0, count); + else break; + } + decompressionStream.Close(); + compressedStream.Close(); + String strDecompressed = System.Text.Encoding.UTF8.GetString(outputStream.ToArray()); + outputStream.Close(); + outputStream = null; + compressedStream = null; + decompressionStream = null; + return strDecompressed; + } + catch (Exception exception) + { + MDTrace.WriteLine(LogLevel.DEBUG,exception); + return null; + } + finally + { + if (null != outputStream) + { + outputStream.Close(); + outputStream = null; + } + if (null != decompressionStream) + { + decompressionStream.Close(); + decompressionStream = null; + } + if (null != compressedStream) + { + compressedStream.Close(); + compressedStream = null; + } + } + } + public static void LaunchBrowserSearch(String searchTerm) + { + Process.Start("https://www.google.com/search?q="+Uri.EscapeDataString(searchTerm)+"/"); +// OpenWebCommand = new Command(async () => await Browser.OpenAsync("https://www.google.com")); + } + public static bool IsZeroOrNaN(double value) + { + return IsNaN(value)||IsZero(value); + } + private static bool IsZero(double value) + { + if(value==0.00)return true; + return false; + } + private static bool IsNaN(double value) + { + return double.IsNaN(value); + } + public static void DeleteFile(String pathFileName) + { + if(!File.Exists(pathFileName))return; + try{File.Delete(pathFileName);}catch(Exception){;} + } + private static DateTime GetRunDate(String strPathFileName) + { + DateTime runDate=DateTime.Now.Date; + DateGenerator dateGenerator=new DateGenerator(); + StreamWriter streamWriter=null; + StreamReader streamReader=null; + + try + { + if(!File.Exists(strPathFileName)) + { + streamWriter=File.CreateText(strPathFileName); + streamWriter.WriteLine(Utility.DateTimeToStringMMHDDHYYYY(runDate)); + streamWriter.Flush(); + streamWriter.Close(); + streamWriter=null; + return runDate; + } + streamReader=File.OpenText(strPathFileName); + String strLine=streamReader.ReadLine(); + streamReader.Close(); + streamReader=null; + runDate=Utility.ParseDate(strLine); + if(dateGenerator.DaysBetweenActual(runDate,DateTime.Now)>5) + { + File.Delete(strPathFileName); + runDate=DateTime.Now.Date; + streamWriter=File.CreateText(strPathFileName); + streamWriter.WriteLine(Utility.DateTimeToStringMMHDDHYYYY(runDate)); + streamWriter.Flush(); + streamWriter.Close(); + streamWriter=null; + return runDate; + } + return runDate; + } + catch(Exception exception) + { + MDTrace.WriteLine(LogLevel.DEBUG,String.Format("GetRunDate:{0}",exception.ToString())); + return runDate; + } + finally + { + if(null!=streamWriter)streamWriter.Close(); + if(null!=streamReader)streamReader.Close(); + } + } + } +} \ No newline at end of file diff --git a/eNavigator/eNavigator.sln b/eNavigator/eNavigator.sln new file mode 100644 index 0000000..3c01a0d --- /dev/null +++ b/eNavigator/eNavigator.sln @@ -0,0 +1,30 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.2.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eNavigator", "eNavigatorUI\eNavigator.csproj", "{761D4A8A-CC84-EDB8-3B37-A4566C635D5D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarketDataLib", "MarketDataLib\MarketDataLib.csproj", "{983D586E-D91F-4110-92C6-2643042F8356}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {761D4A8A-CC84-EDB8-3B37-A4566C635D5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {761D4A8A-CC84-EDB8-3B37-A4566C635D5D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {761D4A8A-CC84-EDB8-3B37-A4566C635D5D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {761D4A8A-CC84-EDB8-3B37-A4566C635D5D}.Release|Any CPU.Build.0 = Release|Any CPU + {983D586E-D91F-4110-92C6-2643042F8356}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {983D586E-D91F-4110-92C6-2643042F8356}.Debug|Any CPU.Build.0 = Debug|Any CPU + {983D586E-D91F-4110-92C6-2643042F8356}.Release|Any CPU.ActiveCfg = Release|Any CPU + {983D586E-D91F-4110-92C6-2643042F8356}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E2F0E253-B0AA-4D62-AC99-DE54428780BA} + EndGlobalSection +EndGlobal diff --git a/eNavigator/eNavigatorUI/.vscode/launch.json b/eNavigator/eNavigatorUI/.vscode/launch.json new file mode 100755 index 0000000..5bb46e0 --- /dev/null +++ b/eNavigator/eNavigatorUI/.vscode/launch.json @@ -0,0 +1,18 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "name": "Blazor WebAssembly Debug (Launch)", + "request": "launch", + "url": "http://localhost:7062", + "port": 7062, + "inspectUri": "{wsProtocol}://localhost:7062/_framework/debug/ws-proxy?browser={browserInspectUri}", + "runtimeExecutable": "/usr/bin/chromium-browser", + "runtimeArgs": [ + "--remote-debugging-port=9222", + "--user-data-dir=${workspaceFolder}/.vscode/chrome-debug" + ] + } + ] +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/.vscode/settings.json b/eNavigator/eNavigatorUI/.vscode/settings.json new file mode 100755 index 0000000..b4b8e2b --- /dev/null +++ b/eNavigator/eNavigatorUI/.vscode/settings.json @@ -0,0 +1,16 @@ + +{ + "github.copilot.editor.enableAutoCompletions": false, + "github.copilot.chat.agent.runTasks": false, + "github.copilot.chat.codeGeneration.useInstructionFiles": false, + "github.copilot.chat.fixTestFailure.enabled": false, + "github.copilot.chat.useProjectTemplates": false, + "github.copilot.editor.enableCodeActions": false, + "dotnet.completion.showCompletionItemsFromUnimportedNamespaces": true, + "dotnetAcquisitionExtension.existingDotnetPath": [ + { + "extensionId": "ms-dotnettools.csharp", + "path": "/usr/local/bin/dotnet" + } + ], +} diff --git a/eNavigator/eNavigatorUI/.vscode/tasks.json b/eNavigator/eNavigatorUI/.vscode/tasks.json new file mode 100755 index 0000000..31c0dd7 --- /dev/null +++ b/eNavigator/eNavigatorUI/.vscode/tasks.json @@ -0,0 +1,53 @@ +{ + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/eNavigator.csproj" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "runBlazorApp", + "command": "dotnet", + "type": "process", + "args": [ + "run", + "--configuration", + "Debug", + "--project", + "${workspaceFolder}/eNavigator.csproj" + ], + "problemMatcher": "$msCompile", + "dependsOn": "build" + }, + { + "label": "cleanup", + "command": "pkill", + "type": "process", + "args": [ + "-f", + "chromium-browser" + ], + "problemMatcher": [] + }, + { + "label": "delay", + "type": "shell", + "command": "sleep 5", + "problemMatcher": [] + }, + { + "label": "runBlazorAppWithDelay", + "dependsOn": ["runBlazorApp", "delay"], + "problemMatcher": [] + } + ] + } + + + + \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/App.razor b/eNavigator/eNavigatorUI/App.razor new file mode 100755 index 0000000..623580d --- /dev/null +++ b/eNavigator/eNavigatorUI/App.razor @@ -0,0 +1,12 @@ + + + + + + + Not found + + Sorry, there's nothing at this address. + + + diff --git a/eNavigator/eNavigatorUI/Authentication/NavigatorAuthenticationStateProvider.cs b/eNavigator/eNavigatorUI/Authentication/NavigatorAuthenticationStateProvider.cs new file mode 100644 index 0000000..f7d8f50 --- /dev/null +++ b/eNavigator/eNavigatorUI/Authentication/NavigatorAuthenticationStateProvider.cs @@ -0,0 +1,33 @@ +using System.Security.Claims; +using eNavigator.Interfaces; +using eNavigator.Models; +using Microsoft.AspNetCore.Components.Authorization; + +namespace eNavigator.Authentication +{ + public class NavigatorAuthenticationStateProvider : AuthenticationStateProvider + { + private readonly IStateContainer stateContainer; + + public NavigatorAuthenticationStateProvider(IStateContainer stateContainer) + { + this.stateContainer = stateContainer ?? throw new ArgumentNullException(nameof(stateContainer)); + } + + public override async Task GetAuthenticationStateAsync() + { + String accessToken = stateContainer.Coalesce(StateStrings.Token, default(String)); + bool authenticated = default == accessToken ? false : true; + + ClaimsIdentity identity = authenticated + ? new ClaimsIdentity(null, "Basic") + : new ClaimsIdentity(); + + ClaimsPrincipal principal = new ClaimsPrincipal(identity); + + AuthenticationState authenticationState = new AuthenticationState(principal); + + return await Task.FromResult(authenticationState); + } + } +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Components/Shared/BusyIndicator.razor b/eNavigator/eNavigatorUI/Components/Shared/BusyIndicator.razor new file mode 100644 index 0000000..0383947 --- /dev/null +++ b/eNavigator/eNavigatorUI/Components/Shared/BusyIndicator.razor @@ -0,0 +1,17 @@ + + + @if (!String.IsNullOrEmpty(Message)) + { + + + + @Message + + + + } + + + + + diff --git a/eNavigator/eNavigatorUI/Components/Shared/BusyIndicator.razor.cs b/eNavigator/eNavigatorUI/Components/Shared/BusyIndicator.razor.cs new file mode 100644 index 0000000..ac00069 --- /dev/null +++ b/eNavigator/eNavigatorUI/Components/Shared/BusyIndicator.razor.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.Components; +using System.Text; + +namespace eNavigator.Components.Shared +{ + public partial class BusyIndicator + { + [Parameter] + public bool IsBusy { get; set; } + + [Parameter] + public String Message { get; set; } + } +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Interfaces/IMarketDataServiceClient.cs b/eNavigator/eNavigatorUI/Interfaces/IMarketDataServiceClient.cs new file mode 100644 index 0000000..eb2ee37 --- /dev/null +++ b/eNavigator/eNavigatorUI/Interfaces/IMarketDataServiceClient.cs @@ -0,0 +1,31 @@ +using MarketData.Service; + +namespace eNavigator.Interfaces +{ + public interface IMarketDataServiceClient + { + public Task Ping(); + public Task Login(String user, String password); + public Task IsAuthorized(); + public Task GetDistinctConsumerPriceIndices(); + public Task GetGetConsumerPriceIndex(String indexCode); + public Task GetLatestPremarketData(String market,DateTime marketDate); + public Task GetAvailableMarkets(); + public Task GetAvailableMarketDates(String market); + public Task GetStopLimit(String symbol); + public Task GetPortfolioTradesWithParityPrice(String symbol); + public Task GetPositionsWithDescription(); + public Task GetWatchList(String watchList); + public Task GetHeadlines(DateTime headlineDate); + public Task GetHeadlineDates(); + public Task GetLatestHeadlines(); + public Task GetLatestPricingDate(); + public Task GetGainLossDetails(DateTime selectedDate,String account); + public Task GetGainLossDetails(DateTime selectedDate); + public Task GetCompoundGainLoss(int selectedDays); + public Task GetAccountsWithOpenTrades(); + public Task GetPrices(String symbol, int days); + public Task GetCompanyNameForSymbol(String symbol); + public Task GetBollingerBands(String symbol,int dayCount); + } +} diff --git a/eNavigator/eNavigatorUI/Interfaces/IStateContainer.cs b/eNavigator/eNavigatorUI/Interfaces/IStateContainer.cs new file mode 100644 index 0000000..bc58b7e --- /dev/null +++ b/eNavigator/eNavigatorUI/Interfaces/IStateContainer.cs @@ -0,0 +1,15 @@ +using System.Runtime.CompilerServices; + +namespace eNavigator.Interfaces +{ + public interface IStateContainer + { + public T Get(String name, [CallerMemberName] string callerMember = null); + public T Coalesce(String name, T defaultValue = default(T),[CallerMemberName] String callerMember = null); + public List GetNames(); + public void Clear(); + public IStateContainer InsertOrUpdate(String name, Object value, [CallerMemberName] String callerMember = null); + public void Remove(String name); + public bool Has(String name); + } +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Layout/MainLayout.razor b/eNavigator/eNavigatorUI/Layout/MainLayout.razor new file mode 100755 index 0000000..17b0745 --- /dev/null +++ b/eNavigator/eNavigatorUI/Layout/MainLayout.razor @@ -0,0 +1,53 @@ +@inherits LayoutComponentBase + +@* Required *@ +@* *@ + + + +@* Needed for dialogs *@ + + + + + + + + + + + + @Body + + + + +@* @code { + MudTheme CustomTheme = new MudTheme() + { + Typography = new Typography() + { + H6 = new H6Typography() + { + FontFamily = new[] { "Roboto", "Helvetica", "Arial", "sans-serif" }, + FontSize = "1.25rem", + FontWeight = "500", + LineHeight = "1.6", + LetterSpacing = ".0075em" + } + } + }; +} *@ + +@* @code { + MudTheme CustomTheme = new MudTheme() + { + Typography = new Typography() + { + Default = new DefaultTypography() + { + FontFamily = new[] { "Poppins", "Helvetica", "Arial", "sans-serif" },FontSize = ".625rem" + } + } + }; +} *@ diff --git a/eNavigator/eNavigatorUI/Layout/MainLayout.razor.css b/eNavigator/eNavigatorUI/Layout/MainLayout.razor.css new file mode 100755 index 0000000..baef3ee --- /dev/null +++ b/eNavigator/eNavigatorUI/Layout/MainLayout.razor.css @@ -0,0 +1,77 @@ +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row ::deep .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + text-decoration: none; + } + + .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { + text-decoration: underline; + } + + .top-row ::deep a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row { + justify-content: space-between; + } + + .top-row ::deep a, .top-row ::deep .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row.auth ::deep a:first-child { + flex: 1; + text-align: right; + width: 0; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} diff --git a/eNavigator/eNavigatorUI/Layout/NavMenu.razor b/eNavigator/eNavigatorUI/Layout/NavMenu.razor new file mode 100755 index 0000000..97b5c2d --- /dev/null +++ b/eNavigator/eNavigatorUI/Layout/NavMenu.razor @@ -0,0 +1,54 @@ + + + eNavigator + + + + + + + + + + + Home + + + + + Headlines + + + + + Bollinger Bands + + + + + Counter + + + + + Weather + + + + + Login + + + + + +@code { + private bool collapseNavMenu = true; + + private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null; + + private void ToggleNavMenu() + { + collapseNavMenu = !collapseNavMenu; + } +} diff --git a/eNavigator/eNavigatorUI/Layout/NavMenu.razor.css b/eNavigator/eNavigatorUI/Layout/NavMenu.razor.css new file mode 100755 index 0000000..07d4c0f --- /dev/null +++ b/eNavigator/eNavigatorUI/Layout/NavMenu.razor.css @@ -0,0 +1,83 @@ +.navbar-toggler { + background-color: rgba(255, 255, 255, 0.1); +} + +.top-row { + height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.bi { + display: inline-block; + position: relative; + width: 1.25rem; + height: 1.25rem; + margin-right: 0.75rem; + top: -1px; + background-size: cover; +} + +.bi-house-door-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); +} + +.bi-plus-square-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); +} + +.bi-list-nested-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } + +.nav-item ::deep a.active { + background-color: rgba(255,255,255,0.37); + color: white; +} + +.nav-item ::deep a:hover { + background-color: rgba(255,255,255,0.1); + color: white; +} + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .collapse { + /* Never collapse the sidebar for wide screens */ + display: block; + } + + .nav-scrollable { + /* Allow sidebar to scroll for tall menus */ + height: calc(100vh - 3.5rem); + overflow-y: auto; + } +} diff --git a/eNavigator/eNavigatorUI/Models/Selectable.cs b/eNavigator/eNavigatorUI/Models/Selectable.cs new file mode 100644 index 0000000..ebe8a91 --- /dev/null +++ b/eNavigator/eNavigatorUI/Models/Selectable.cs @@ -0,0 +1,34 @@ +namespace eNavigator.Models +{ + public interface ISelectable + { + public bool Equals(ISelectable item); + public int GetHashCode(); + public String ToString(); + public int GetIndex(); + } + + public class Selectable : ISelectable + { + public int Index { get; set; } + + public String Name { get; set; } + + public bool Equals(ISelectable item) + { + return item.GetIndex().Equals(GetIndex()); + } + + public override int GetHashCode() => Index.GetHashCode(); + + public int GetIndex() + { + return Index; + } + + public override String ToString() + { + return Name; + } + } +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Models/SelectableSymbol.cs b/eNavigator/eNavigatorUI/Models/SelectableSymbol.cs new file mode 100644 index 0000000..92ce4fc --- /dev/null +++ b/eNavigator/eNavigatorUI/Models/SelectableSymbol.cs @@ -0,0 +1,6 @@ +namespace eNavigator.Models +{ + public class SelectableSymbol : Selectable + { + } +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Models/StateContainer.cs b/eNavigator/eNavigatorUI/Models/StateContainer.cs new file mode 100644 index 0000000..c0f1ba9 --- /dev/null +++ b/eNavigator/eNavigatorUI/Models/StateContainer.cs @@ -0,0 +1,100 @@ +#pragma warning disable CS8601 // Possible null reference assignment. + +using System.Runtime.CompilerServices; +using eNavigator.Interfaces; +using MarketData.MarketDataModel; + +namespace eNavigator.Models +{ + public class StateContainer : IStateContainer + { + private Dictionary stateContainer = new Dictionary(); + + public StateContainer() + { + } + + public T Get(String name, [CallerMemberName] string callerMember = null) + { + T result = default(T); + + if(!Has(name)) + { + String message=$"Item {name}, referenced from {callerMember} does not exist in the state container"; + throw new ArgumentOutOfRangeException(message); + } + + StateItem stateItem = stateContainer[name]; + Object value = stateItem.StateObject; + + if(value is null)return result; + + String typeName = value.GetType().Name; + + if(value.GetType().Equals(typeof(T)) || !(value is IConvertible))result = (T)value; + else result = (T)Convert.ChangeType(stateContainer[name].StateObject,typeof(T)); + return result; + } + + public T Coalesce(String name, T defaultValue = default(T),[CallerMemberName] String callerMember = null) + { + T result = default(T); + + if(!Has(name))return defaultValue; + + StateItem stateItem = stateContainer[name]; + Object value = stateItem.StateObject; + + if(value is null)return result; + + String typeName = value.GetType().Name; + + if(value.GetType().Equals(typeof(T)) || !(value is IConvertible))result = (T)value; + else result = (T)Convert.ChangeType(stateContainer[name].StateObject,typeof(T)); + return result; + } + + public List GetNames() + { + List names = stateContainer.Keys.ToList(); + names.Sort(); + return names; + } + + public void Clear() + { + stateContainer = new Dictionary(); + } + + public IStateContainer InsertOrUpdate(String name, Object value, [CallerMemberName] String callerMember = null) + { + if(Has(name)) + { + StateItem stateItem = stateContainer[name]; + stateItem.CallerMember = callerMember; + stateItem.StateObject = value; + return this; + } + else + { + stateContainer.Add(name, new StateItem(){StateObject = value, CallerMember= callerMember}); + return this; + } + } + + public void Remove(String name) + { + if(!stateContainer.ContainsKey(name))return; + + Object o = Get(name); + if(0 != default && o is IDisposable)(o as IDisposable).Dispose(); + stateContainer.Remove(name); + } + + public bool Has(String name) + { + return stateContainer.ContainsKey(name); + } + } +} +#pragma warning restore CS8601 // Possible null reference assignment. diff --git a/eNavigator/eNavigatorUI/Models/StateItem.cs b/eNavigator/eNavigatorUI/Models/StateItem.cs new file mode 100644 index 0000000..3b92ee6 --- /dev/null +++ b/eNavigator/eNavigatorUI/Models/StateItem.cs @@ -0,0 +1,9 @@ +namespace eNavigator.Models +{ + public class StateItem + { + public Object StateObject { get; set; } + + public String CallerMember { get; set; } + } +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Models/StateStrings.cs b/eNavigator/eNavigatorUI/Models/StateStrings.cs new file mode 100644 index 0000000..8666333 --- /dev/null +++ b/eNavigator/eNavigatorUI/Models/StateStrings.cs @@ -0,0 +1,9 @@ +namespace eNavigator.Models +{ + public static class StateStrings + { + public const String Token = "Token"; + public const String User = "User"; + public const String Password = "Password"; + } +} \ No newline at end of file diff --git a/eNavigator/eNavigatorUI/Pages/BollingerBands.razor b/eNavigator/eNavigatorUI/Pages/BollingerBands.razor new file mode 100644 index 0000000..63a1cdb --- /dev/null +++ b/eNavigator/eNavigatorUI/Pages/BollingerBands.razor @@ -0,0 +1,56 @@ +@using System.Text.RegularExpressions +@using System.ComponentModel.DataAnnotations +@using MarketData.MarketDataModel +@using eNavigator.Interfaces +@using eNavigator.Models +@using eNavigator.Routes +@using eNavigator.Components.Shared +@using Microsoft.AspNetCore.Components.Web.Virtualization +@inject IMarketDataServiceClient marketDataServiceClient +@inject IStateContainer stateContainer +@inject ISnackbar snackbarService +@attribute [Route(PageRoute.BollingerBands)] + + + + + + + + + + + + @context.Name + + + + + + + + @dayCount + + + + + Refresh + + + + + + @Heading + + + + + + + + + + diff --git a/eNavigator/eNavigatorUI/Pages/BollingerBands.razor.cs b/eNavigator/eNavigatorUI/Pages/BollingerBands.razor.cs new file mode 100644 index 0000000..ee46776 --- /dev/null +++ b/eNavigator/eNavigatorUI/Pages/BollingerBands.razor.cs @@ -0,0 +1,285 @@ +using Microsoft.AspNetCore.Components; +using MudBlazor; +using MarketData.Service; +using Microsoft.AspNetCore.Components.Authorization; +using eNavigator.Routes; +using MarketData.Utils; +using MarketData.MarketDataModel; +using eNavigator.Models; +using System.Text; + +namespace eNavigator.Pages +{ + public partial class BollingerBands + { + [Inject] + private AuthenticationStateProvider authenticationStateProvider { get; set; } = default; + + [Inject] + private NavigationManager NavigationManager { get; set; } = default!; + + protected bool IsBusy { get; set; } = false; + protected String BusyMessage { get; set;} = ""; + + protected List AvailableSymbols { get; set;} = new List{new SelectableSymbol(){Index=0,Name="---"}}; + protected SelectableSymbol SelectedSymbol { get; set; } = new SelectableSymbol(){Index=0,Name="---"}; + + protected List BollingerBandElements { get; set; } = new List(); + + protected List AvailableDayCounts { get; set; } = new List{60,90,120,180,360,720,1440}; + protected int SelectedDayCount { get; set; } = 120; + + protected String Heading { get; set; } = ""; + + protected List ChartSeriesCollection { get; set; } = new List(); + protected ChartOptions ChartingOptions{ get; set; } = new ChartOptions(); + + protected String[] XAxisLabels { get; set; } = new String[]{""}; + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + AuthenticationState authenticationState = await authenticationStateProvider.GetAuthenticationStateAsync(); + if(!authenticationState.User.Identity.IsAuthenticated) + { + NavigationManager.NavigateTo(PageRoute.Login); + return; + } + await LoadSymbols(); + SelectedSymbol = AvailableSymbols.Count()>0 ? AvailableSymbols[0] : SelectedSymbol; + await LoadBollingerBands(SelectedSymbol.Name, SelectedDayCount); + StateHasChanged(); + Task.Run(async () => await Task.Yield()).GetAwaiter(); + } + + private async Task LoadSymbols() + { + BusyMessage = $"Loading symbols..."; + IsBusy = true; + ServiceResult serviceResult = await marketDataServiceClient.GetWatchList("Valuations"); + if(!serviceResult.Success) + { + DisplayToast("Error contacting server, could not load latest headlines."); + return; + } + List availableSymbolsList = (serviceResult.ContextSpecificResult as List); + List availableSymbols = new List(); + for(int index=0;index); + DisplayToast($"Loaded {AvailableSymbols.Count} symbols in {Utility.FormatNumber(serviceResult.ElapsedTimeMS,0,true)}(ms)."); + IsBusy = false; + } + + private async Task LoadBollingerBands(String symbol,int dayCount) + { + String companyName = ""; + BusyMessage = $"Loading {dayCount} day bollinger bands for {symbol} ..."; + IsBusy = true; + + ServiceResult serviceResult = await marketDataServiceClient.GetCompanyNameForSymbol(symbol); + if(serviceResult.Success) + { + companyName = (serviceResult.ContextSpecificResult as String); + } + + serviceResult = await marketDataServiceClient.GetBollingerBands(symbol,dayCount); + if(!serviceResult.Success) + { + DisplayToast("Error contacting server, could not load bollinger bands."); + return; + } + BollingerBandElements = (serviceResult.ContextSpecificResult as List); + // if(BollingerBandElements.Count()>0) + // { + // Heading = SelectedSymbol + " - " + companyName + "("+ BollingerBandElements[BollingerBandElements.Count()-1].Date.ToShortDateString() + " Thru " + BollingerBandElements[0].Date.ToShortDateString()+ ")"; + // } + DisplayToast($"Loaded {Utility.FormatNumber(BollingerBandElements.Count*13,0,true)} data points in {Utility.FormatNumber(serviceResult.ElapsedTimeMS,0,true)}(ms)."); + CreateHeading(companyName); + CreateChartSeries(); + CreateChartOptions(); + CreateXAxisLabels(); + + IsBusy = false; + } + + private void DisplayToast(String message) + { + snackbarService.Add(new MarkupString($"
Sorry, there's nothing at this address.