{"version":3,"file":"cryptofiscafacile-gui-6a970b9bc5eb56b4e229b241c96b529c.js","names":["App","Application","constructor","args","super","this","modulePrefix","config","podModulePrefix","Resolver","_exports","default","loadInitializers","Ac5ChartDataModifier","Modifier","owner","didSetup","named","setup","Error","update","modify","element","__","Ac5chart","_class","Component","_descriptor","dataModifier","setupChartTask","_asyncArrowRuntime","buildTask","context","generator","createChart","timeout","registerDestructor","destroyChart","setupChart","perform","root","Root","new","locale","am5locales_fr_FR","setupTheme","configure","setThemes","am5themes_Animated","am5themes_Material","dispose","regenerate","_applyDecoratedDescriptor","prototype","tracked","configurable","enumerable","writable","initializer","action","Object","getOwnPropertyDescriptor","__COLOCATED_TEMPLATE__","_templateFactory","createTemplateFactory","id","block","moduleName","isStrictMode","Ac5Column","_valueYcolor","_classPrivateFieldLooseKey","chart","series","xAxis","defineProperty","value","colorValue","target","valueY","dataItem","getRaw","color","container","children","push","XYChart","panX","panY","wheelX","wheelY","xRenderer","AxisRendererX","minGridDistance","labels","template","setAll","rotation","centerY","p50","centerX","p100","paddingRight","xAxes","CategoryAxis","maxDeviation","categoryField","renderer","tooltip","Tooltip","yAxis","yAxes","ValueAxis","AxisRendererY","ColumnSeries","name","valueYField","valueField","sequencedInterpolation","categoryXField","labelText","columns","adapters","add","_classPrivateFieldLooseBase","data","filter","slice","appear","_component","setComponentTemplate","Ac5Line","_createSeries","_createSeries2","legend","layout","verticalLayout","Legend","x","percent","fontSize","set","XYCursor","lineY","GaplessDateAxis","baseInterval","timeUnit","count","groupData","tooltipDateFormat","clear","valueFields","forEach","field","values","LineSeries","stacked","valueXField","dateField","pointerOrientation","paddingTop","paddingBottom","fills","fillOpacity","visible","Ac5Piechart","PieChart","startAngle","endAngle","innerRadius","radius","PieSeries","alignLabels","slices","cornerRadius","states","create","shiftRadius","scale","ticks","forceHidden","valuePercentTotalFilter","sliceTooltip","intl","SliceGrouper","clickBehavior","groupName","threshold","_value","_key","formatNumber","currency","style","maximumFractionDigits","percentValue","Number","service","ApiBlockchains","_initializerDefineProperty","_descriptor2","_descriptor3","_descriptor4","_descriptor5","_descriptor6","_descriptor7","_descriptor8","_descriptor9","progressBlock","wasm","toolsProgress","get","blockchain","progressError","translateError","toolsErrors","submitBc","getApi","address","pub","other","toStore","debug","isRunning","tasks","toolsTasks","setAddress","e","arg1","setPub","arg2","setCheckStore","checked","arg3","guidFor","ApiExchanges","progressWallet","wallet","submitExch","priv","setPriv","Api","_filterTools","_filterTools2","unprocessedTools","tools","apis","wallets","blockchains","isFecthingTools","getToolsTask","item","plateform","templateOnly","AppHeaderCalendrierFiscalModal","anneeRevenus","anneeDeclaration","dateOuverture","Date","dateFermeturePapier","dateFermetureZone1","dateFermetureZone2","dateFermetureZone3","close","onHidden","HeaderConfigurationModal","saveConfigTask","_proxy","saveConfigTaskSuccess","error","message","saveConfigTaskError","removeSaveConfigTaskIndicator","Ember","testing","activated","verboseActivated","production","environment","proxy","userInfos","undefined","proxyUpdated","defaultProxy","APP","proxyUrl","onImport","indexeddb","cleanDatabases","files","length","importDatabase","err","reloadIDBTask","getHistoryTask","getWalletsTask","getTransactionsTask","getReportsTask","application","hasIndexedDb","onShow","onSave","onSetDebug","setDebugTask","dropZoneEnabled","dropZoneDisabled","upload","zipper","JSZip","zip","loadAsync","dbs","async","file","dbName","AppHeaderEngineIndicator","status","toLowerCase","tooltipText","EngineStatus","HALTED","LOADING","RUNNING","Header","page","window","location","href","getUserInfosTask","confModal","onPage","includes","infos","setConfModal","setCalendarModal","calendarModal","setDonationModal","donationModal","hiddenDon","onSuccess","onError","AppIcon","icon","cffIcon","iconExists","MainSidebar","onExportConfig","exportDatabaseTask","generateAsync","type","then","blob","FileSaver","saveAs","AppNewVersionModal","AppPageNavigator","Math","min","maxPage","userPage","handlePageInputOnInput","inputEvent","onUserPageChanged","firstPage","lastPage","nextPage","previousPage","max","Calendar","onClose","selectedDates","onChange","unfilter","d","setDate","getDate","DocumentationScript","onTransmit","transmitModal","response","fetch","text","code","hidden","Download","_downloadObjectAsJson","_downloadObjectAsJson2","download","def","json","exportObj","exportName","dataStr","encodeURIComponent","JSON","stringify","downloadAnchorNode","document","createElement","setAttribute","body","appendChild","click","remove","Help","autoStart","newUser","firstTourDone","onIntroExit","updateApplicationEntryTask","key","version","Option","selected","ALL","Removal","deletingFile","deleteFileTask","deletingThisFile","deletingTask","delete","filename","CerfaBncChoice","isMade","made","radioCheck","res","indexOf","year","parseInt","substring","bnc","Bnc","res2","CerfaBnc","_sortCerfas","_sortCerfas2","saveChoiceBNCTask","selectedBnc","cashin","saveChoiceBNCPromises","Promise","all","map","success","saveChoiceBNCStatusIndicatorTask","sortedCerfas","cerfas","saveBnc","sort","y1","y2","Reporting","_Reporting","_descriptor10","saveAccountsTask","sortedReports","saveAccountsPromises","accounts","removeSaveAccountsStatusIndicatorTask","accItemReportsName","ACC_ITEM_REPORTS_NAME","unprocessedReports","reports","cerfa3916","notEmptyReports","hasTX","opened","firsttx","closed","lasttx","isClosed","Sorts","cerfa","reportsSortOrder","cerfas2086CashinChoice","cerfa2086","saveAccData","reloadReports","onAccordionItemChange","newValue","generateReports","get2086XlsxTask","get2086XlsxUpToTodayTask","get3916XlsxTask","getStocksXlsxTask","is2086Downloadable","errorMessage2086","is2086UpToTodayDownloadable","errorMessage2086UpToToday","cerfa2086UpToToday","is3916Downloadable","errorMessage3916","isStocksDownloadable","stocksXLSX","buildCerfaLink","content","buf","typedArrayToBuffer","Blob","today","dd","String","padStart","mm","getMonth","yyyy","getFullYear","fileURL","URL","createObjectURL","ficStock","array","buffer","byteOffset","byteLength","displayReportErrorModal","reportErrorModalType","reportErrorModalVisible","closeReportErrorModal","SortOrder","ASC","Person","saveUserDataTask","saveUserTask","surname","email","removeSaveUserStatusIndicatorTask","newName","newSurname","newEmail","nameUpdated","surnameUpdated","emailUpdated","updated","setName","setSurname","setEmail","saveUserData","ReportingReportErrorModal","ReportingUserDataAccount","toggleCheck","account","onChangeOpen","date","openDate","errorOpenDate","onChangeClose","closeDate","errorCloseDate","setAccount","UserData","addAccount","arr","obj","SynthesisTxBalances","defaultPageSize","pageSortedBalances","synthBalances","pageSize","ceil","setPageSize","SynthesisEvolution","getSynthEvolutionTask","aggregatedAssets","synthEvolution","keys","startDate","dates","endDate","tokenImported","some","hasWallets","Synthesis","defaultStartDate","defaultEndDate","selectDates","refreshSynthData","onWalletSelected","selectedWallet","getSynthBalancesTask","getSynthPortfolioTask","getSynthStatTotalValueTask","synthStatsGainsLosses","synthStatsGainsError","getSynthStatsGainsLossesTask","getSynthTxTypesTask","errorRange","SynthesisStats","portfolio","synthPorfolio","totalValue","synthStatTotalValue","total_value","unrealizedGainsLosses","unrealized","realizedGainsLosses","realized","statsError","SynthesisTypes","unprocessedSynthTx","synthTxTypes","SynthesisWallets","onSelect","onSelected","TxTableCategUpdateModal","_closeModal","_closeModal2","categories","transfertType","TransfertType","DEPOSIT","TxCategory","AIR_DROPS","CASH_IN","GIFTS","FORKS","INTERESTS","MINING","REFERRALS","COMMERCIAL_REBATES","DONT_CARE","WITHDRAWAL","CASH_OUT","ICO","categoryModified","txs","category","original_category","DEPOSITS","WITHDRAWALS","updateCateg","toConfirm","categToUpdate","modifyCateg","NONE","tx","setCategoryTask","revertCateg","revertCategoryTask","waitFor","TxTableCoinDetailModal","fetchCoinDetail","symbol","getCoinDetailTask","coin","coinsDetail","hasCurrentPriceBtc","marketData","currentPriceEur","hasCurrentPriceEur","hasCurrentPriceUsd","currentPriceUsd","priceChange24hEur","currentPriceChange24hEur","TxTable","_filterTransactionsOnSelectedCoins","_getCoins","_filterTransactionsOnSelectedCategory","_filterTransactionsOnSelectedDates","_filterTransactionsOnSelectedWallet","_filterTransactionsOnSearchItem","_filterTransactionsOnSearchItem2","_filterTransactionsOnSelectedWallet2","_filterTransactionsOnSelectedDates2","_filterTransactionsOnSelectedCategory2","_getCoins2","_filterTransactionsOnSelectedCoins2","selectedTxs","Set","pageSizeModifier","PageSizeModifier","allCategories","transactions","c1","c2","localeCompare","categoryOptions","c","selectedCategory","hasSelectedCategory","w","coins","allCoins","flatMap","to","from","fee","coinOptions","selectedCoins","hasSelectedCoin","allWallets","w1","w2","walletOptions","hasSelectedWallet","totalTx","sortedTransactions","filteredTransactions","isFecthingTransactions","catSortOrder","dateSortOrder","pfSortOrder","pageSortedTransactions","onPageSizeChanged","setDefaultPageSizeNumber","toggleAmountsHidden","amountsHidden","sortCat","currentOrder","onDateSortOrderChanged","onPfSortOrderChanged","onCatSortOrderChanged","DESC","sortDate","sortPf","selectCategory","onSelectedCategoryChanged","Array","selectedOptions","elt","selectCoin","onSelectedCoinsChanged","onSelectedDatesChanged","selectWallet","onSelectedWalletChanged","searchItem","onSearchedItemChanged","onShowCoinDetail","coinDetailModalSymbol","coinDetailModalVisible","onCoinDetailModalHidden","onUpdateCategory","updateCategoryTxs","updateCategoryModalVisible","onMultiUpdateCategory","visibleSelectedTxs","onUpdateCategoryModalHidden","isTxSelected","has","onTxSelected","allSelectionIndeterminate","Transactions","isUserCategorizable","allTxsSelected","categorizableTxs","find","transaction","fromDate","toDate","searchedItem","searchString","normalize","replace","PageSizeModifierModifier","clientWidth","TxTableTxItemChangeFiat","selectedValue","val","oldValue","fiatValue","v","isInvalid","modalVal","quantity","changeModal","modifyFiat","setValueTask","modifyFiatValid","TxTableTxItemChangeFiatInputFiat","updateValue","TxTableTxItem","onCopy","copyText","navigator","clipboard","writeText","event","checkableId","checkable","checkableDisabled","allowedCategoryForSelection","TxTableTxItemTxValues","txEmpty","TxTableTxItemUnmerged","unMerge","unMergeTransactionsTask","Validate","_descriptor11","_descriptor12","_descriptor13","_descriptor14","_descriptor15","_descriptor16","_descriptor17","_descriptor18","_descriptor19","_descriptor20","multiId","multiId2","time","dateMax","dateMin","index","index2","tabId","txMerged","firstid","secondid","setCheckConsistency","checkConsistencyCategVsToFromTask","consistencyState","consistencyAlmost","consistencyStateNegativeBalance","validState","icoState","consistencyCategVsToFrom","errors","unprocessedTx","setCheckConsistencyAlmost","checkConsistencyAlmostTransferTask","errorAlmostRelated","related","i","coinAlmostRelated","firstTx","timeAlmostRelated","addDays","days","result","selectAlmost","mergeAlmostBtn","consistencyAlmostTx","consistencyRelated","Map","toShow","el","selectAlmost2","mergeAlmost","srcIds","destId","mergeTransactionsTask","srcId","setCheckConsistencyNegativeBalance","checkConsistencyNegativeBalanceTask","consistencyNegativeBalance","showMergeable","selectNeg","mergeNegBtn","consistencyNegativeBalanceMergeable","selectNeg2","id2","mergeNeg","onValidation","TxIco","res1","concat","resultWithdrawal","a","findIndex","v2","isTabId","setIco","checkedWithdraw","resultDeposit","selectIds","idWith","idDep","tabMerge","id1","mergeBtn","merge","hidden1","hidden2","hidden3","hidden4","hidden5","UserWalletsAddModal","walletDefs","getWalletDefinitionsTask","reset","invalidSelection","walletNameFilter","custodialWallets","custodial","pageCustodialWallets","filterWallets","addWallet","addEmptyWalletTask","onWalletAdded","onHide","UserWalletsDownload","downloadingThisFile","downloadTask","mimeType","buildDownloadFile","downloadFileTask","fileContent","fileUrl","Wallets","len","inputFileElement","unprocessedHistory","history","sortedHistory","nameSortOrder","kind","isAddingFiles","digestFilesTask","progressValue","digestFilesTaskUseFileTasks","t","isFinished","digestFilesTaskFilesAmount","sortName","filesAsArray","didAddedFiles","UserWalletsTransmitContent","Transmit","pfOptions","nameRequired","request","UserWalletsWallet","toggle","addressesCollapsed","Controller","newVersionModalVisible","_newVersionModalVisible","newVersion","onNewVersionModalHidden","hhmmss","hour","minute","second","number","compact","notation","EUR","USD","appVersion","_","hash","versionOnly","hideSha","shaOnly","hideVersion","match","showExtended","versionExtendedRegExp","versionRegExp","shaRegExp","helper","initialize","initializerFactory","Config","load","ENV","registerLibrary","icons","flatColorIconsBearish","flatColorIconsBullish","flatColorIconsCandleSticks","flatColorIconsCurrencyExchange","flatColorIconsElectroDevices","flatColorIconsExport","flatColorIconsInternal","ionAlertCircle","ionArrowUndo","ionBarChartOutline","ionBuild","ionCalculator","ionCalendarOutline","ionChevronDown","ionChevronDownCircleOutline","ionChevronUpCircleOutline","ionClipboardOutline","ionDownloadOutline","ionExitOutline","ionEyeOffOutline","ionEyeOutline","ionFlowerSharp","ionFunnel","ionGiftOutline","ionHammerOutline","ionHelpCircle","ionHelpSharp","ionInformationCircleOutline","ionLibraryOutline","ionListOutline","ionPlayCircleOutline","ionPlayForwardCircleOutline","ionRemoveOutline","ionSearch","ionShieldCheckmark","ionSparklesOutline","ionTrashSharp","ionWalletOutline","mdiEngineOffOutline","mdiEngineOutline","addAPIProvider","resources","disableCache","addIcon","DownloadModifier","modifier","handler","evt","preventDefault","scrollLeft","deltaY","addEventListener","passive","removeEventListener","onExit","startIntro","introJs","setOption","onexit","start","later","positional","hide","offcanvas","getElementById","classList","contains","DefinitionsRoute","Route","model","origin","url","host","activate","helpTarget","beforeModel","Router","EmberRouter","locationType","rootURL","route","path","setLocale","detectFeaturesTask","performStartupChecks","updateDefinitonsTask","Service","browserDetected","checkHasIndexedDb","testBrowser","split","resolve","indexedDB","open","onerror","onsuccess","requestClose","deleteDatabase","isOpera","userAgent","isFirefox","isEdge","isBlink","CSS","appVersionEntry","getApplicationEntryTask","persistedVersion","ResponseBody","FetchService","abortableFetchArrayBufferTask","controller","AbortController","signal","arrayBuffer","abort","DbName","CFF","CONFS","FILES","TRANSACTIONS","RATES","databaseName","db","Dexie","options","prettyJson","exportDB","File","importDB","backendDB","cleanDbsTask","_cff2Wasm","_updateDefinitionDef","_updateDefinitions","_fetchManifest","_WasmService","_fetchManifest2","_updateDefinitions2","_updateDefinitionDef2","reg","errorMessageReg","RegExp","WeakMap","loadCff2WasmTask","loadCff2WasmProxy","_descriptor21","getSynthBalances","_descriptor22","end","getSynthEvolution","_descriptor23","getSynthPortfolio","_descriptor24","getSynthStatTotalValue","_descriptor25","_descriptor26","getSynthStatsGainsLosses","_descriptor27","getSynthTxTypes","getUserInfos","updateDefinitionTask","entry","useFile","Uint8Array","setDefinition","getDefinitonsTask","getDefinitions","setDebug","setFetchRates","fetchRates","setupFrontendTestTask","setupFrontendTest","names","cleanDbs","getTransactions","_descriptor28","_descriptor29","checkConsistencyCategVsToFrom","_descriptor30","_descriptor31","consistencyNegativeBalanceError","checkConsistencyNegativeBalance","consistencyNegativeBalanceErrorMessage","_descriptor32","_descriptor33","consistencyAlmostError","checkConsistencyAlmostTransfer","consistencyAlmostMessage","getHistory","reverse","_descriptor34","getWalletDefinitions","addEmptyWallet","_descriptor35","getWallets","getReports","newCateg","setCategory","srcID","dstID","mergeTransactions","unMergeTransactions","setValue","saveUser","saveAccounts","saveChoiceCashIn","getStocksXLSX","get3916XLSX","get2086ResultsTask","get2086Results","_descriptor36","_descriptor37","get2086Xlsx","_descriptor38","_descriptor39","get2086XlsxUpToToday","getAPITask","provider","remember","getApiProgressTask","progress","getApiProgress","reloadIDB","getTools","useFileTask","f","deleteFile","downloadFile","saveConfig","detail","getCoinDetail","createApplicationEntryTask","createApplicationEntry","getApplicationEntry","updateApplicationEntry","updateDefinitionCsvDef","csv","updateDefinitionWalletDef","consistencyCategVsToFromError","consistencyCategVsToFromErrorMessage","taskInstance","finally","errorIntl","test","opt","PREFIX","jsonDef","WasmService","manifest","alreadyDefinitions","newEntry","defsTasks","definitions","manifestEntry","link","respBody","endsWith","propertySupplier","order","b","timeA","getTime","timeB","propA","propB","define","metaName","prefix","rawConfig","querySelector","getAttribute","exports","parse","decodeURIComponent","runningTests","require"],"sources":["vendor/ember-cli/app-prefix.js","cryptofiscafacile-gui/app.ts","cryptofiscafacile-gui/components/ac5/chart-data.ts","cryptofiscafacile-gui/components/ac5/chart.ts","cryptofiscafacile-gui/components/ac5/column/index.ts","cryptofiscafacile-gui/components/ac5/line/index.ts","cryptofiscafacile-gui/components/ac5/piechart/index.ts","cryptofiscafacile-gui/components/api/blockchains.ts","cryptofiscafacile-gui/components/api/exchanges.ts","cryptofiscafacile-gui/components/api/index.ts","cryptofiscafacile-gui/components/app/external-link.js","cryptofiscafacile-gui/components/app/header/calendrier-fiscal-modal.ts","cryptofiscafacile-gui/components/app/header/configuration-modal.ts","cryptofiscafacile-gui/components/app/header/engine-indicator.ts","cryptofiscafacile-gui/components/app/header/index.ts","cryptofiscafacile-gui/components/app/icon.ts","cryptofiscafacile-gui/components/app/main-sidebar.ts","cryptofiscafacile-gui/components/app/new-version-modal.ts","cryptofiscafacile-gui/components/app/page-navigator.ts","cryptofiscafacile-gui/components/bs/offcanvas/body.js","cryptofiscafacile-gui/components/bs/offcanvas/header.js","cryptofiscafacile-gui/components/bs/offcanvas/index.js","cryptofiscafacile-gui/components/calendar/index.ts","cryptofiscafacile-gui/components/documentation/cff-comptes.js","cryptofiscafacile-gui/components/documentation/cff-revenus.js","cryptofiscafacile-gui/components/documentation/comptes.js","cryptofiscafacile-gui/components/documentation/couverture.js","cryptofiscafacile-gui/components/documentation/definitions.js","cryptofiscafacile-gui/components/documentation/faq.js","cryptofiscafacile-gui/components/documentation/index.js","cryptofiscafacile-gui/components/documentation/legis-comptes.js","cryptofiscafacile-gui/components/documentation/legis-revenus.js","cryptofiscafacile-gui/components/documentation/manuel-custom.js","cryptofiscafacile-gui/components/documentation/manuel-intro.js","cryptofiscafacile-gui/components/documentation/manuel-portefeuilles.js","cryptofiscafacile-gui/components/documentation/manuel-rapports.js","cryptofiscafacile-gui/components/documentation/manuel-transactions.js","cryptofiscafacile-gui/components/documentation/mentions.js","cryptofiscafacile-gui/components/documentation/nav-item.js","cryptofiscafacile-gui/components/documentation/plus-value.js","cryptofiscafacile-gui/components/documentation/revenus.js","cryptofiscafacile-gui/components/documentation/script.ts","cryptofiscafacile-gui/components/documentation/sources.js","cryptofiscafacile-gui/components/download/index.ts","cryptofiscafacile-gui/components/help/index.ts","cryptofiscafacile-gui/components/option.ts","cryptofiscafacile-gui/components/removal/index.ts","cryptofiscafacile-gui/components/reporting/cerfa-bnc/choice/index.ts","cryptofiscafacile-gui/components/reporting/cerfa-bnc/index.ts","cryptofiscafacile-gui/components/reporting/index.ts","cryptofiscafacile-gui/components/reporting/person/index.ts","cryptofiscafacile-gui/components/reporting/report-error-modal.ts","cryptofiscafacile-gui/components/reporting/user-data/account/index.ts","cryptofiscafacile-gui/components/reporting/user-data/index.ts","cryptofiscafacile-gui/components/synthesis/balances/index.ts","cryptofiscafacile-gui/components/synthesis/evolution/index.ts","cryptofiscafacile-gui/components/synthesis/index.ts","cryptofiscafacile-gui/components/synthesis/stats/index.ts","cryptofiscafacile-gui/components/synthesis/types/index.ts","cryptofiscafacile-gui/components/synthesis/wallets/index.ts","cryptofiscafacile-gui/components/tx-table/categ-update-modal/index.ts","cryptofiscafacile-gui/components/tx-table/coin-detail-modal/index.ts","cryptofiscafacile-gui/components/tx-table/index.ts","cryptofiscafacile-gui/components/tx-table/page-size-modifier.ts","cryptofiscafacile-gui/components/tx-table/tx-item/categ-update-button.js","cryptofiscafacile-gui/components/tx-table/tx-item/change-fiat/index.ts","cryptofiscafacile-gui/components/tx-table/tx-item/change-fiat/input-fiat.ts","cryptofiscafacile-gui/components/tx-table/tx-item/index.ts","cryptofiscafacile-gui/components/tx-table/tx-item/line-status/index.js","cryptofiscafacile-gui/components/tx-table/tx-item/tx-values/index.ts","cryptofiscafacile-gui/components/tx-table/tx-item/unmerged.ts","cryptofiscafacile-gui/components/tx-table/validate.ts","cryptofiscafacile-gui/components/user-wallets/add-modal.ts","cryptofiscafacile-gui/components/user-wallets/download.ts","cryptofiscafacile-gui/components/user-wallets/index.ts","cryptofiscafacile-gui/components/user-wallets/list/index.js","cryptofiscafacile-gui/components/user-wallets/transmit/content.ts","cryptofiscafacile-gui/components/user-wallets/transmit/index.ts","cryptofiscafacile-gui/components/user-wallets/wallet.ts","cryptofiscafacile-gui/controllers/application.ts","cryptofiscafacile-gui/enums/engine-status.ts","cryptofiscafacile-gui/enums/sort-order.ts","cryptofiscafacile-gui/enums/transfert-type.ts","cryptofiscafacile-gui/formats.js","cryptofiscafacile-gui/helpers/app-version.js","cryptofiscafacile-gui/initializers/app-version.js","cryptofiscafacile-gui/initializers/load-bootstrap-config.js","cryptofiscafacile-gui/initializers/offline-iconify-icons-loader.ts","cryptofiscafacile-gui/modifiers/download.ts","cryptofiscafacile-gui/modifiers/horizontal-mouse-scroll.ts","cryptofiscafacile-gui/modifiers/intro.ts","cryptofiscafacile-gui/modifiers/offcanvas-hider.ts","cryptofiscafacile-gui/modifiers/offcanvas-toggler.ts","cryptofiscafacile-gui/objects/bnc.ts","cryptofiscafacile-gui/objects/manifest-entry.ts","cryptofiscafacile-gui/objects/tx-ico.ts","cryptofiscafacile-gui/pods/definitions/route.ts","cryptofiscafacile-gui/pods/definitions/template.js","cryptofiscafacile-gui/pods/document/route.ts","cryptofiscafacile-gui/pods/document/template.js","cryptofiscafacile-gui/pods/index/route.ts","cryptofiscafacile-gui/pods/index/template.js","cryptofiscafacile-gui/pods/not-found/template.js","cryptofiscafacile-gui/pods/reports/route.ts","cryptofiscafacile-gui/pods/reports/template.js","cryptofiscafacile-gui/pods/tools/route.ts","cryptofiscafacile-gui/pods/tools/template.js","cryptofiscafacile-gui/pods/transactions/controller.ts","cryptofiscafacile-gui/pods/transactions/route.ts","cryptofiscafacile-gui/pods/transactions/template.js","cryptofiscafacile-gui/pods/wallets/route.ts","cryptofiscafacile-gui/pods/wallets/template.js","cryptofiscafacile-gui/router.js","cryptofiscafacile-gui/routes/application.ts","cryptofiscafacile-gui/services/application.ts","cryptofiscafacile-gui/services/fetch.ts","cryptofiscafacile-gui/services/indexeddb.ts","cryptofiscafacile-gui/services/wasm.ts","cryptofiscafacile-gui/templates/application.js","cryptofiscafacile-gui/utils/sorts.ts","cryptofiscafacile-gui/utils/transactions.ts","vendor/ember-cli/app-config.js","vendor/ember-cli/app-boot.js"],"sourcesContent":["'use strict';\n\n\n","import Application from '@ember/application';\n\nimport config from 'cryptofiscafacile-gui/config/environment';\nimport loadInitializers from 'ember-load-initializers';\nimport Resolver from 'ember-resolver';\n\nexport default class App extends Application {\n  modulePrefix = config.modulePrefix;\n  podModulePrefix = config.podModulePrefix;\n  Resolver = Resolver;\n}\n\nloadInitializers(App, config.modulePrefix);\n","import Modifier from 'ember-modifier';\n\nimport type { Root } from '@amcharts/amcharts5';\nimport type { Owner } from '@ember/test-helpers/build-owner';\nimport type { ArgsFor, NamedArgs } from 'ember-modifier';\n\ninterface Ac5ChartDataModifierSignature {\n  Element: Element;\n  Args: {\n    Positional: [data: unknown];\n    Named: {\n      setup(element: HTMLElement): Root;\n      update: () => void;\n    };\n  };\n}\n\nexport default class Ac5ChartDataModifier extends Modifier<Ac5ChartDataModifierSignature> {\n  didSetup = false;\n\n  constructor(owner: Owner, args: ArgsFor<Ac5ChartDataModifierSignature>) {\n    super(owner, args);\n\n    if (!args.named.setup) {\n      throw new Error('setup must be defined');\n    }\n\n    if (typeof args.named.setup !== 'function') {\n      throw new Error('setup must be a function');\n    }\n\n    if (!args.named.update) {\n      throw new Error('update must be defined');\n    }\n\n    if (typeof args.named.update !== 'function') {\n      throw new Error('update must be a function');\n    }\n  }\n\n  modify(element: HTMLElement, __: [data: unknown], args: NamedArgs<Ac5ChartDataModifierSignature>) {\n    if (!this.didSetup) {\n      // expensive setup\n      args.setup(element);\n      this.didSetup = true;\n\n      return;\n    }\n\n    args.update();\n  }\n}\n","import Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { registerDestructor } from '@ember/destroyable';\nimport { action } from '@ember/object';\n\nimport { Root } from '@amcharts/amcharts5';\nimport am5locales_fr_FR from '@amcharts/amcharts5/locales/fr_FR';\nimport am5themes_Animated from '@amcharts/amcharts5/themes/Animated';\nimport am5themes_Material from '@amcharts/amcharts5/themes/Material';\nimport { restartableTask, timeout } from 'ember-concurrency';\n\nimport Ac5ChartDataModifier from './chart-data';\n\nexport abstract class Ac5chart<T> extends Component<T> {\n  @tracked protected root?: Root;\n\n  dataModifier = Ac5ChartDataModifier;\n\n  setupChartTask = restartableTask(async (createChart: () => void) => {\n    await timeout(250);\n\n    createChart();\n    registerDestructor(this, () => this.destroyChart());\n  });\n\n  protected abstract configure(): void;\n\n  protected abstract setup(element: HTMLElement): void;\n\n  protected abstract update(): void;\n\n  protected setupChart(element: HTMLElement) {\n    this.setupChartTask.perform(() => {\n      this.root = Root.new(element);\n      this.root.locale = am5locales_fr_FR;\n\n      this.setupTheme(this.root);\n\n      this.configure();\n    });\n  }\n\n  protected setupTheme(root: Root): void {\n    root.setThemes([am5themes_Animated.new(root), am5themes_Material.new(root)]);\n  }\n\n  private destroyChart() {\n    this.root?.dispose();\n  }\n\n  @action\n  regenerate(element: HTMLElement): void {\n    if (this.root) {\n      this.destroyChart();\n      this.setup(element);\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"h-100\\\" {{this.dataModifier @data setup=this.setup update=this.update}}>\\n</div>\", {\"contents\":\"<div class=\\\"h-100\\\" {{this.dataModifier @data setup=this.setup update=this.update}}>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/ac5/column/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/ac5/column/index.hbs\"}});\nimport { action } from '@ember/object';\n\nimport { color, p50, p100, Tooltip } from '@amcharts/amcharts5';\nimport { AxisRendererX } from '@amcharts/amcharts5/.internal/charts/xy/axes/AxisRendererX';\nimport { AxisRendererY } from '@amcharts/amcharts5/.internal/charts/xy/axes/AxisRendererY';\nimport { CategoryAxis } from '@amcharts/amcharts5/.internal/charts/xy/axes/CategoryAxis';\nimport { ValueAxis } from '@amcharts/amcharts5/.internal/charts/xy/axes/ValueAxis';\nimport { ColumnSeries } from '@amcharts/amcharts5/.internal/charts/xy/series/ColumnSeries';\nimport { XYChart } from '@amcharts/amcharts5/.internal/charts/xy/XYChart';\n\nimport { Ac5chart } from '../chart';\n\nimport type { Color, DataItem, RoundedRectangle } from '@amcharts/amcharts5';\nimport type { AxisRenderer } from '@amcharts/amcharts5/.internal/charts/xy/axes/AxisRenderer';\nimport type { IColumnSeriesDataItem } from '@amcharts/amcharts5/.internal/charts/xy/series/ColumnSeries';\n\ninterface Ac5ColumnArgs {\n  categoryField: string;\n  categoryFieldMapper: (category: string) => string;\n  data: { [x: string]: number | string }[];\n  valueField: string;\n}\n\nexport default class Ac5Column extends Ac5chart<Ac5ColumnArgs> {\n  chart?: XYChart;\n  series?: ColumnSeries;\n  xAxis?: CategoryAxis<AxisRenderer>;\n\n  @action\n  setup(element: HTMLElement) {\n    super.setupChart(element);\n  }\n\n  protected configure() {\n    if (!this.root) {\n      return;\n    }\n\n    this.chart = this.root.container.children.push(\n      XYChart.new(this.root, {\n        panX: true,\n        panY: true,\n        wheelX: 'panX',\n        wheelY: 'zoomX',\n      }),\n    );\n\n    // Create axes\n    // https://www.amcharts.com/docs/v5/charts/xy-chart/axes/\n    const xRenderer = AxisRendererX.new(this.root, { minGridDistance: 30 });\n\n    xRenderer.labels.template.setAll({\n      rotation: -90,\n      centerY: p50,\n      centerX: p100,\n      paddingRight: 15,\n    });\n\n    this.xAxis = this.chart.xAxes.push(\n      CategoryAxis.new(this.root, {\n        maxDeviation: 0.3,\n        categoryField: 'country',\n        renderer: xRenderer,\n        tooltip: Tooltip.new(this.root, {}),\n      }),\n    );\n\n    const yAxis = this.chart.yAxes.push(\n      ValueAxis.new(this.root, {\n        maxDeviation: 0.3,\n        renderer: AxisRendererY.new(this.root, {}),\n      }),\n    );\n\n    // Create series\n    // https://www.amcharts.com/docs/v5/charts/xy-chart/series/\n    this.series = this.chart.series.push(\n      ColumnSeries.new(this.root, {\n        name: 'Visits',\n        xAxis: this.xAxis,\n        yAxis: yAxis,\n        valueYField: this.args.valueField,\n        sequencedInterpolation: true,\n        categoryXField: 'country',\n        tooltip: Tooltip.new(this.root, {\n          labelText: '{valueY}',\n        }),\n      }),\n    );\n\n    this.series.columns.template.adapters.add('fill', this.#valueYcolor);\n    this.series.columns.template.adapters.add('stroke', this.#valueYcolor);\n\n    this.update();\n  }\n\n  #valueYcolor = (colorValue: Color | undefined, target: RoundedRectangle) => {\n    if (target) {\n      const dataItem = target.dataItem as DataItem<IColumnSeriesDataItem>;\n\n      const valueY = dataItem.getRaw('valueY');\n\n      return valueY && valueY > 0 ? color('#439a86') : color('#bb4430');\n    }\n\n    return colorValue;\n  };\n\n  @action\n  update() {\n    if (this.chart) {\n      const data = this.args.data?.filter((slice) => slice[this.args.valueField]);\n\n      this.xAxis?.data.setAll(data);\n      this.series?.data.setAll(data);\n\n      this.series?.appear(1000);\n      this.chart.appear(1000, 100);\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"h-100\\\" {{this.dataModifier @data setup=this.setup update=this.update}}>\\n</div>\", {\"contents\":\"<div class=\\\"h-100\\\" {{this.dataModifier @data setup=this.setup update=this.update}}>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/ac5/line/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/ac5/line/index.hbs\"}});\nimport { action } from '@ember/object';\n\nimport { Legend, percent, Tooltip } from '@amcharts/amcharts5';\nimport { AxisRendererX } from '@amcharts/amcharts5/.internal/charts/xy/axes/AxisRendererX';\nimport { AxisRendererY } from '@amcharts/amcharts5/.internal/charts/xy/axes/AxisRendererY';\nimport { GaplessDateAxis } from '@amcharts/amcharts5/.internal/charts/xy/axes/GaplessDateAxis';\nimport { ValueAxis } from '@amcharts/amcharts5/.internal/charts/xy/axes/ValueAxis';\nimport { LineSeries } from '@amcharts/amcharts5/.internal/charts/xy/series/LineSeries';\nimport { XYChart } from '@amcharts/amcharts5/.internal/charts/xy/XYChart';\nimport { XYCursor } from '@amcharts/amcharts5/.internal/charts/xy/XYCursor';\n\nimport { Ac5chart } from '../chart';\n\nimport type { AxisRenderer } from '@amcharts/amcharts5/.internal/charts/xy/axes/AxisRenderer';\nimport type { DateAxis } from '@amcharts/amcharts5/.internal/charts/xy/axes/DateAxis';\nimport type { ColumnSeries } from '@amcharts/amcharts5/.internal/charts/xy/series/ColumnSeries';\n\ninterface Ac5LineArgs {\n  dateField: string;\n  data: { [x: string]: number }[];\n  valueFields: string[];\n}\n\nexport default class Ac5Line extends Ac5chart<Ac5LineArgs> {\n  chart?: XYChart;\n  legend?: Legend;\n  series?: ColumnSeries;\n  xAxis?: DateAxis<AxisRenderer>;\n  yAxis?: ValueAxis<AxisRenderer>;\n\n  @action\n  setup(element: HTMLElement) {\n    super.setupChart(element);\n  }\n\n  protected configure() {\n    if (!this.root) {\n      return;\n    }\n\n    this.chart = this.root.container.children.push(\n      XYChart.new(this.root, {\n        layout: this.root.verticalLayout,\n      }),\n    );\n\n    this.legend = this.chart.children.push(\n      Legend.new(this.root, {\n        x: percent(5),\n      }),\n    );\n\n    this.legend.labels.template.setAll({\n      fontSize: 12,\n      paddingRight: 0,\n    });\n\n    const cursor = this.chart.set(\n      'cursor',\n      XYCursor.new(this.root, {\n        xAxis: this.xAxis,\n      }),\n    );\n\n    cursor.lineY.set('visible', false);\n\n    this.xAxis = this.chart.xAxes.push(\n      GaplessDateAxis.new(this.root, {\n        baseInterval: { timeUnit: 'day', count: 1 },\n        groupData: false,\n        renderer: AxisRendererX.new(this.root, {}),\n        tooltip: Tooltip.new(this.root, {}),\n        tooltipDateFormat: 'dd/MM/yyyy',\n      }),\n    );\n\n    this.yAxis = this.chart.yAxes.push(\n      ValueAxis.new(this.root, {\n        renderer: AxisRendererY.new(this.root, {}),\n      }),\n    );\n\n    this.update();\n  }\n\n  #createSeries(name: string, field: string) {\n    if (!this.root || !this.chart || !this.xAxis || !this.yAxis) {\n      return;\n    }\n\n    const series = this.chart.series.push(\n      LineSeries.new(this.root, {\n        name: name,\n        xAxis: this.xAxis,\n        yAxis: this.yAxis,\n        stacked: true,\n        valueYField: field,\n        valueXField: this.args.dateField,\n        tooltip: Tooltip.new(this.root, {\n          pointerOrientation: 'left',\n          labelText: '[fontSize: 16px bold]{name}[/][fontSize: 14px]{dateX}: {valueY} €[/]',\n          paddingTop: 3,\n          paddingBottom: 3,\n        }),\n      }),\n    );\n\n    series.fills.template.setAll({\n      fillOpacity: 0.5,\n      visible: true,\n    });\n\n    series.data.setAll(this.args.data);\n    series.appear(1000);\n  }\n\n  @action\n  update(): void {\n    this.chart?.series.clear();\n    this.xAxis?.data.setAll(this.args.data);\n    this.args.valueFields.forEach((field) => this.#createSeries(field, field));\n\n    if (this.chart?.series?.values) {\n      this.legend?.data.setAll(this.chart.series.values);\n    }\n\n    this.chart?.appear(1000, 100);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div data-test-ac5-pie-chart class=\\\"h-100\\\" {{this.dataModifier @data setup=this.setup update=this.update}}>\\n</div>\", {\"contents\":\"<div data-test-ac5-pie-chart class=\\\"h-100\\\" {{this.dataModifier @data setup=this.setup update=this.update}}>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/ac5/piechart/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/ac5/piechart/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport { percent } from '@amcharts/amcharts5';\nimport { PieChart } from '@amcharts/amcharts5/.internal/charts/pie/PieChart';\nimport { PieSeries } from '@amcharts/amcharts5/.internal/charts/pie/PieSeries';\nimport { SliceGrouper } from '@amcharts/amcharts5/plugins/sliceGrouper';\n\nimport { Ac5chart } from '../chart';\n\nimport type { DataItem, RadialLabel, Slice } from '@amcharts/amcharts5';\nimport type { IPercentSeriesDataItem } from '@amcharts/amcharts5/.internal/charts/percent/PercentSeries';\nimport type IntlService from 'ember-intl/services/intl';\n\ninterface Ac5PiechartArgs {\n  categoryField: string;\n  data: { [x: string]: number | string }[];\n  valueField: string;\n}\n\nexport default class Ac5Piechart extends Ac5chart<Ac5PiechartArgs> {\n  @service declare intl: IntlService;\n\n  series?: PieSeries;\n\n  @action\n  setup(element: HTMLElement) {\n    super.setupChart(element);\n  }\n\n  protected configure() {\n    if (!this.root) {\n      return;\n    }\n\n    let chart = this.root?.container.children.push(\n      PieChart.new(this.root, {\n        startAngle: 180,\n        endAngle: 360,\n        layout: this.root?.verticalLayout,\n        innerRadius: percent(50),\n        radius: percent(60),\n      }),\n    );\n\n    // Create series\n    // https://www.amcharts.com/docs/v5/charts/percent-charts/pie-chart/#Series\n    // start and end angle must be set both for chart and series\n    this.series = chart.series.push(\n      PieSeries.new(this.root, {\n        startAngle: 180,\n        endAngle: 360,\n        valueField: this.args.valueField,\n        categoryField: this.args.categoryField,\n        alignLabels: false,\n      }),\n    );\n\n    this.series.slices.template.setAll({\n      cornerRadius: 5,\n    });\n\n    this.series.slices.template.states.create('active', { shiftRadius: 0, scale: 1 });\n\n    this.series.ticks.template.setAll({\n      forceHidden: true,\n    });\n\n    this.series.labels.template.setAll({\n      fontSize: 12,\n    });\n\n    this.series.labels.template.adapters.add('visible', this.valuePercentTotalFilter(5));\n\n    this.series.slices.template.adapters.add('visible', this.valuePercentTotalFilter(0.0001));\n\n    this.series.slices.template.adapters.add('tooltipText', this.sliceTooltip(this.intl));\n\n    SliceGrouper.new(this.root, {\n      clickBehavior: 'zoom',\n      groupName: 'Autres',\n      threshold: 5,\n      series: this.series,\n    });\n\n    this.update();\n  }\n\n  sliceTooltip(intl: IntlService) {\n    return (_value: string | undefined, target: Slice, _key: 'tooltipText') => {\n      const dataItem = target.dataItem as DataItem<IPercentSeriesDataItem>;\n\n      return `${dataItem.getRaw('category')}: ${intl.formatNumber(dataItem.getRaw('value') ?? 0, {\n        currency: 'EUR',\n        style: 'currency',\n        maximumFractionDigits: 0,\n      })}`;\n    };\n  }\n\n  valuePercentTotalFilter(percentValue: number) {\n    return (_value: boolean | undefined, target: RadialLabel | Slice) => {\n      if (target) {\n        const dataItem = target.dataItem as DataItem<IPercentSeriesDataItem>;\n\n        if (dataItem) {\n          return dataItem.getRaw('valuePercentTotal') > percentValue;\n        }\n      }\n\n      return false;\n    };\n  }\n\n  @action\n  update() {\n    if (this.root && this.series) {\n      // Set data\n      // https://www.amcharts.com/docs/v5/charts/percent-charts/pie-chart/#Setting_data\n      this.series.data.setAll(this.args.data?.filter((slice) => (Number(slice[this.args.valueField]) ?? 0) > 0));\n      this.series.appear(1000, 100);\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div data-test-api-blockchains class=\\\"m-4 w-100 pe-5\\\">\\n  <h5>Veuillez fournir vos données :</h5>\\n  <BsForm @formLayout=\\\"vertical\\\" @onSubmit={{this.submitBc}} as |form|>\\n    <label for={{this.idAddr}} class=\\\"text-tools mb-1\\\">Adresse de blockchain</label>\\n    <input\\n      data-test-api-blockchains-input-address\\n      class=\\\"form-control\\\"\\n      type=\\\"text\\\"\\n      id={{this.idAddr}}\\n      autocomplete=\\\"on\\\"\\n      placeholder={{this.address}}\\n      value={{this.address}}\\n      {{on \\\"change\\\" this.setAddress}}\\n      required\\n      data-title=\\\"Adresse\\\"\\n      data-intro=\\\"Veuillez tout d'abord ici rentrer votre (ou une de vos) adresse de blockchain. Ces adresses sont généralement visibles lorsque vous souhaitez faire un 'Dépôt' sur la crypto concernée...\\\"\\n    />\\n    {{#if @blockchain.key}}\\n      <label for={{this.idPub}} class=\\\"mt-2 mb-1 text-tools\\\">Clé API</label>\\n      <input\\n        class=\\\"form-control\\\"\\n        type=\\\"text\\\"\\n        id={{this.idPub}}\\n        value={{this.pub}}\\n        placeholder={{if this.pub this.pub \\\"Facultatif, mais recommandé\\\"}}\\n        {{on \\\"change\\\" this.setPub}}\\n      />\\n    {{/if}}\\n    <div\\n      class=\\\"d-flex mt-3\\\"\\n      data-title=\\\"Retenez vos clés\\\"\\n      data-intro=\\\"Pour ne pas rentrer à chaque fois vos informations, vous pouvez les sauvegarder en cochant ici la case!\\\"\\n    >\\n      {{#if this.toStore}}\\n        <input\\n          class=\\\"form-check-input ms-1 me-2\\\"\\n          type=\\\"checkbox\\\"\\n          id={{this.idstoreYes}}\\n          {{on \\\"change\\\" this.setCheckStore}}\\n          checked\\n        />\\n        <label for={{this.idstoreYes}}>Cocher pour sauvegarder vos informations</label>\\n      {{else}}\\n        <input\\n          class=\\\"form-check-input ms-1 me-2\\\"\\n          type=\\\"checkbox\\\"\\n          id={{this.idstoreBlockNo}}\\n          {{on \\\"change\\\" this.setCheckStore}}\\n        />\\n        <label for={{this.idstoreBlockNo}}>Cocher pour sauvegarder vos informations</label>\\n      {{/if}}\\n      <span class=\\\"d-inline-block ms-1\\\">\\n        <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n        <BsTooltip @placement=\\\"right\\\">Ceci implique le stockage des informations blockchain dans la base de votre\\n          navigateur, localement sur votre machine. En cochant cette case, vous autorisez explicitement ce stockage.\\n        </BsTooltip>\\n      </span>\\n    </div>\\n    <BsAlert\\n      data-test-api-blockchains-url\\n      class=\\\"mt-4\\\"\\n      @visible={{true}}\\n      @fade={{true}}\\n      @type=\\\"success\\\"\\n      @dismissible={{false}}\\n    >\\n      <strong>Note : </strong>\\n      Le rapatriement de vos transactions sur l'adresse entrée est effectué sur\\n      <App::ExternalLink href=\\\"{{@blockchain.url}}\\\">{{@blockchain.url}}</App::ExternalLink>\\n    </BsAlert>\\n    <div class=\\\"d-flex align-items-center w-75\\\">\\n      <form.submitButton\\n        data-test-api-blockchains-sync-button\\n        data-title=\\\"Synchroniser\\\"\\n        data-intro=\\\"Débuter la synchronisation en cliquant sur ce bouton. Cela peut prendre plusieurs minutes si vous avez beaucoup de transactions. Une barre de progression apparaitra afin de visualiser cet avancement.\\\"\\n        disabled={{this.isRunning}}\\n      >Synchroniser</form.submitButton>\\n      {{#if this.progressError}}\\n        <BsAlert\\n          class=\\\"m-0 mx-3 py-1 text-center\\\"\\n          @visible={{true}}\\n          @fade={{true}}\\n          @fadeDuration={{800}}\\n          @type=\\\"danger\\\"\\n          @dismissible={{false}}\\n        >\\n          {{this.progressError}}\\n        </BsAlert>\\n      {{else}}\\n        {{#if this.isRunning}}\\n          <BsProgress class=\\\"ms-2 spinner\\\" as |pg|>\\n            <pg.bar\\n              @value={{this.progressBlock}}\\n              @minValue={{0}}\\n              @maxValue={{100}}\\n              @showLabel={{true}}\\n              @type=\\\"success\\\"\\n            />\\n          </BsProgress>\\n        {{else if (eq this.progressBlock 100)}}\\n          <BsAlert\\n            class=\\\"m-0 mx-3 py-1 text-center\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @fadeDuration={{800}}\\n            @type=\\\"success\\\"\\n            @dismissible={{false}}\\n          >\\n            Chargé avec succès !\\n          </BsAlert>\\n        {{/if}}\\n      {{/if}}\\n    </div>\\n  </BsForm>\\n</div>\", {\"contents\":\"<div data-test-api-blockchains class=\\\"m-4 w-100 pe-5\\\">\\n  <h5>Veuillez fournir vos données :</h5>\\n  <BsForm @formLayout=\\\"vertical\\\" @onSubmit={{this.submitBc}} as |form|>\\n    <label for={{this.idAddr}} class=\\\"text-tools mb-1\\\">Adresse de blockchain</label>\\n    <input\\n      data-test-api-blockchains-input-address\\n      class=\\\"form-control\\\"\\n      type=\\\"text\\\"\\n      id={{this.idAddr}}\\n      autocomplete=\\\"on\\\"\\n      placeholder={{this.address}}\\n      value={{this.address}}\\n      {{on \\\"change\\\" this.setAddress}}\\n      required\\n      data-title=\\\"Adresse\\\"\\n      data-intro=\\\"Veuillez tout d'abord ici rentrer votre (ou une de vos) adresse de blockchain. Ces adresses sont généralement visibles lorsque vous souhaitez faire un 'Dépôt' sur la crypto concernée...\\\"\\n    />\\n    {{#if @blockchain.key}}\\n      <label for={{this.idPub}} class=\\\"mt-2 mb-1 text-tools\\\">Clé API</label>\\n      <input\\n        class=\\\"form-control\\\"\\n        type=\\\"text\\\"\\n        id={{this.idPub}}\\n        value={{this.pub}}\\n        placeholder={{if this.pub this.pub \\\"Facultatif, mais recommandé\\\"}}\\n        {{on \\\"change\\\" this.setPub}}\\n      />\\n    {{/if}}\\n    <div\\n      class=\\\"d-flex mt-3\\\"\\n      data-title=\\\"Retenez vos clés\\\"\\n      data-intro=\\\"Pour ne pas rentrer à chaque fois vos informations, vous pouvez les sauvegarder en cochant ici la case!\\\"\\n    >\\n      {{#if this.toStore}}\\n        <input\\n          class=\\\"form-check-input ms-1 me-2\\\"\\n          type=\\\"checkbox\\\"\\n          id={{this.idstoreYes}}\\n          {{on \\\"change\\\" this.setCheckStore}}\\n          checked\\n        />\\n        <label for={{this.idstoreYes}}>Cocher pour sauvegarder vos informations</label>\\n      {{else}}\\n        <input\\n          class=\\\"form-check-input ms-1 me-2\\\"\\n          type=\\\"checkbox\\\"\\n          id={{this.idstoreBlockNo}}\\n          {{on \\\"change\\\" this.setCheckStore}}\\n        />\\n        <label for={{this.idstoreBlockNo}}>Cocher pour sauvegarder vos informations</label>\\n      {{/if}}\\n      <span class=\\\"d-inline-block ms-1\\\">\\n        <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n        <BsTooltip @placement=\\\"right\\\">Ceci implique le stockage des informations blockchain dans la base de votre\\n          navigateur, localement sur votre machine. En cochant cette case, vous autorisez explicitement ce stockage.\\n        </BsTooltip>\\n      </span>\\n    </div>\\n    <BsAlert\\n      data-test-api-blockchains-url\\n      class=\\\"mt-4\\\"\\n      @visible={{true}}\\n      @fade={{true}}\\n      @type=\\\"success\\\"\\n      @dismissible={{false}}\\n    >\\n      <strong>Note : </strong>\\n      Le rapatriement de vos transactions sur l'adresse entrée est effectué sur\\n      <App::ExternalLink href=\\\"{{@blockchain.url}}\\\">{{@blockchain.url}}</App::ExternalLink>\\n    </BsAlert>\\n    <div class=\\\"d-flex align-items-center w-75\\\">\\n      <form.submitButton\\n        data-test-api-blockchains-sync-button\\n        data-title=\\\"Synchroniser\\\"\\n        data-intro=\\\"Débuter la synchronisation en cliquant sur ce bouton. Cela peut prendre plusieurs minutes si vous avez beaucoup de transactions. Une barre de progression apparaitra afin de visualiser cet avancement.\\\"\\n        disabled={{this.isRunning}}\\n      >Synchroniser</form.submitButton>\\n      {{#if this.progressError}}\\n        <BsAlert\\n          class=\\\"m-0 mx-3 py-1 text-center\\\"\\n          @visible={{true}}\\n          @fade={{true}}\\n          @fadeDuration={{800}}\\n          @type=\\\"danger\\\"\\n          @dismissible={{false}}\\n        >\\n          {{this.progressError}}\\n        </BsAlert>\\n      {{else}}\\n        {{#if this.isRunning}}\\n          <BsProgress class=\\\"ms-2 spinner\\\" as |pg|>\\n            <pg.bar\\n              @value={{this.progressBlock}}\\n              @minValue={{0}}\\n              @maxValue={{100}}\\n              @showLabel={{true}}\\n              @type=\\\"success\\\"\\n            />\\n          </BsProgress>\\n        {{else if (eq this.progressBlock 100)}}\\n          <BsAlert\\n            class=\\\"m-0 mx-3 py-1 text-center\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @fadeDuration={{800}}\\n            @type=\\\"success\\\"\\n            @dismissible={{false}}\\n          >\\n            Chargé avec succès !\\n          </BsAlert>\\n        {{/if}}\\n      {{/if}}\\n    </div>\\n  </BsForm>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/api/blockchains.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/api/blockchains.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { guidFor } from '@ember/object/internals';\nimport { inject as service } from '@ember/service';\n\nimport type Wasm from 'cryptofiscafacile-gui/services/wasm';\nimport type { ApiData } from 'cryptofiscafacile-wasm';\ninterface ApiBlockchainsArgs {\n  blockchain: ApiData;\n}\n\nexport default class ApiBlockchains extends Component<ApiBlockchainsArgs> {\n  @service declare wasm: Wasm;\n\n  @tracked address = this.args.blockchain.arg1;\n  @tracked pub = this.args.blockchain.arg2;\n  @tracked other = this.args.blockchain.arg3;\n  @tracked toStore = false;\n\n  @tracked idPriv = 'priv-' + guidFor(this);\n  @tracked idPub = 'pub-' + guidFor(this);\n  @tracked idstoreYes = 'store-' + guidFor(this);\n  @tracked idstoreBlockNo = 'nostore-' + guidFor(this);\n\n  get progressBlock() {\n    return this.wasm.toolsProgress.get(this.args.blockchain) ?? 0;\n  }\n\n  get progressError() {\n    return this.wasm.translateError(this.wasm.toolsErrors.get(this.args.blockchain) ?? '');\n  }\n\n  @action\n  submitBc() {\n    this.wasm.getApi(this.args.blockchain, this.address, this.pub, this.other, this.toStore);\n\n    debug(\n      'Call to GetAPI for blockchains: ' +\n        this.args.blockchain.name +\n        ' / ' +\n        this.address +\n        ' / ' +\n        this.pub +\n        ' / ' +\n        this.toStore,\n    );\n  }\n\n  get isRunning() {\n    const tasks = this.wasm.toolsTasks.get(this.args.blockchain);\n\n    return tasks ? tasks[0]?.isRunning : false;\n  }\n\n  @action\n  setAddress(e: { target: HTMLInputElement }) {\n    if (e.target.value !== '') {\n      this.address = e.target.value;\n    } else {\n      this.address = this.args.blockchain.arg1;\n    }\n  }\n  @action\n  setPub(e: { target: HTMLInputElement }) {\n    if (e.target.value !== '') {\n      this.pub = e.target.value;\n    } else {\n      this.pub = this.args.blockchain.arg2;\n    }\n  }\n\n  @action\n  setCheckStore(e: { target: HTMLInputElement }) {\n    this.toStore = e.target.checked;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div data-test-api-exchanges class=\\\"m-4\\\">\\n  <h5>Veuillez fournir vos données API:</h5>\\n  <BsForm @formLayout=\\\"vertical\\\" @onSubmit={{this.submitExch}} as |form|>\\n    <label for={{this.idPub}} class=\\\"text-tools mb-1\\\">Clé API (Public Key)</label>\\n    <input\\n      data-test-api-exchanges-input-pub\\n      class=\\\"form-control\\\"\\n      type=\\\"text\\\"\\n      id={{this.idPub}}\\n      name=\\\"publickey\\\"\\n      placeholder={{this.pub}}\\n      value={{this.pub}}\\n      {{on \\\"change\\\" this.setPub}}\\n      required\\n      data-title=\\\"API Key\\\"\\n      data-intro=\\\"Après avoir créé vos clés sur la plateforme, veuillez rentrer ici la clé 'public' ou API key...\\\"\\n    />\\n    <label for={{this.idPriv}} class=\\\"mt-2 mb-1 text-tools\\\">Clé Privée (Private ou Secret Key)</label>\\n    <input\\n      data-test-api-exchanges-input-priv\\n      class=\\\"form-control\\\"\\n      type=\\\"password\\\"\\n      id={{this.idPriv}}\\n      name=\\\"privatekey\\\"\\n      autocomplete=\\\"off\\\"\\n      value={{this.priv}}\\n      placeholder={{if\\n        this.priv\\n        \\\"&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;\\\"\\n        \\\"\\\"\\n      }}\\n      {{on \\\"change\\\" this.setPriv}}\\n      required\\n      data-title=\\\"Clé secrète\\\"\\n      data-intro=\\\"Puis rentrer ici la clé dite 'privée' ou Private Key...\\\"\\n    />\\n    <span class=\\\"text-tools-nota\\\"><strong>Important</strong>: pour votre sécurité, n'oubliez pas de donner les\\n      persmissions uniquement en lecture à l'API créée sur\\n      {{@wallet.name}}.</span>\\n\\n    <div\\n      class=\\\"d-flex mt-2 mb-4\\\"\\n      data-title=\\\"Retenez vos clés\\\"\\n      data-intro=\\\"Pour ne pas rentrer à chaque fois vos clés, vous pouvez les sauvegarder en cochant ici la case!\\\"\\n    >\\n      {{#if this.toStore}}\\n        <input\\n          class=\\\"form-check-input ms-1 me-2\\\"\\n          type=\\\"checkbox\\\"\\n          id={{this.idstoreYes}}\\n          {{on \\\"change\\\" this.setCheckStore}}\\n          checked\\n        />\\n        <label for={{this.idstoreYes}}>Cocher pour sauvegarder vos informations</label>\\n      {{else}}\\n        <input\\n          class=\\\"form-check-input ms-1 me-2\\\"\\n          type=\\\"checkbox\\\"\\n          id={{this.idstoreNo}}\\n          {{on \\\"change\\\" this.setCheckStore}}\\n        />\\n        <label for={{this.idstoreNo}}>Cocher pour sauvegarder vos informations</label>\\n      {{/if}}\\n      <span class=\\\"d-inline-block ms-1\\\">\\n        <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n        <BsTooltip @placement=\\\"right\\\">Ceci implique le stockage de vos clés dans la base de votre navigateur, localement\\n          sur votre machine. Pour information, ces clés seront stockées de manière à réduire leur exposition. Néanmoins\\n          cela n'empêche pas la divulgation si par ailleurs votre machine vient à être infectée ou compromise. En\\n          cochant cette case, vous autorisez explicitement ce stockage.\\n        </BsTooltip>\\n      </span>\\n    </div>\\n    <BsAlert data-test-api-exchanges-url @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n      <strong>Tips : </strong>\\n      Pour vous aider à créer vos clés API, rendez vous à cette adresse :\\n      <App::ExternalLink href=\\\"{{@wallet.url}}\\\">{{@wallet.url}}</App::ExternalLink>\\n    </BsAlert>\\n    <div class=\\\"d-flex\\\">\\n      <form.submitButton\\n        data-test-api-exchanges-sync-button\\n        data-title=\\\"Synchroniser\\\"\\n        data-intro=\\\"Débuter la synchronisation en cliquant sur ce bouton. Cela peut prendre plusieurs minutes si vous avez beaucoup de transactions. Une barre de progression apparaitra afin de visualiser cet avancement.\\\"\\n        disabled={{this.isRunning}}\\n      >Synchroniser</form.submitButton>\\n      <div class=\\\"d-flex align-items-center w-75\\\">\\n        {{#if this.progressError}}\\n          <BsAlert\\n            data-test-api-exchanges-progress-error\\n            class=\\\"m-0 mx-3 py-1 text-center\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @fadeDuration={{800}}\\n            @type=\\\"danger\\\"\\n            @dismissible={{false}}\\n          >\\n            {{this.progressError}}\\n          </BsAlert>\\n        {{else}}\\n          {{#if this.isRunning}}\\n            <BsProgress class=\\\"ms-2 spinner\\\" as |pg|>\\n              <pg.bar\\n                @value={{this.progressWallet}}\\n                @minValue={{0}}\\n                @maxValue={{100}}\\n                @showLabel={{true}}\\n                @type=\\\"success\\\"\\n              />\\n            </BsProgress>\\n          {{else if (eq this.progressWallet 100)}}\\n            <BsAlert\\n              class=\\\"m-0 mx-3 py-1 text-center\\\"\\n              @visible={{true}}\\n              @fade={{true}}\\n              @fadeDuration={{800}}\\n              @type=\\\"success\\\"\\n              @dismissible={{false}}\\n            >\\n              Chargé avec succès !\\n            </BsAlert>\\n          {{/if}}\\n        {{/if}}\\n      </div>\\n    </div>\\n  </BsForm>\\n</div>\", {\"contents\":\"<div data-test-api-exchanges class=\\\"m-4\\\">\\n  <h5>Veuillez fournir vos données API:</h5>\\n  <BsForm @formLayout=\\\"vertical\\\" @onSubmit={{this.submitExch}} as |form|>\\n    <label for={{this.idPub}} class=\\\"text-tools mb-1\\\">Clé API (Public Key)</label>\\n    <input\\n      data-test-api-exchanges-input-pub\\n      class=\\\"form-control\\\"\\n      type=\\\"text\\\"\\n      id={{this.idPub}}\\n      name=\\\"publickey\\\"\\n      placeholder={{this.pub}}\\n      value={{this.pub}}\\n      {{on \\\"change\\\" this.setPub}}\\n      required\\n      data-title=\\\"API Key\\\"\\n      data-intro=\\\"Après avoir créé vos clés sur la plateforme, veuillez rentrer ici la clé 'public' ou API key...\\\"\\n    />\\n    <label for={{this.idPriv}} class=\\\"mt-2 mb-1 text-tools\\\">Clé Privée (Private ou Secret Key)</label>\\n    <input\\n      data-test-api-exchanges-input-priv\\n      class=\\\"form-control\\\"\\n      type=\\\"password\\\"\\n      id={{this.idPriv}}\\n      name=\\\"privatekey\\\"\\n      autocomplete=\\\"off\\\"\\n      value={{this.priv}}\\n      placeholder={{if\\n        this.priv\\n        \\\"&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;\\\"\\n        \\\"\\\"\\n      }}\\n      {{on \\\"change\\\" this.setPriv}}\\n      required\\n      data-title=\\\"Clé secrète\\\"\\n      data-intro=\\\"Puis rentrer ici la clé dite 'privée' ou Private Key...\\\"\\n    />\\n    <span class=\\\"text-tools-nota\\\"><strong>Important</strong>: pour votre sécurité, n'oubliez pas de donner les\\n      persmissions uniquement en lecture à l'API créée sur\\n      {{@wallet.name}}.</span>\\n\\n    <div\\n      class=\\\"d-flex mt-2 mb-4\\\"\\n      data-title=\\\"Retenez vos clés\\\"\\n      data-intro=\\\"Pour ne pas rentrer à chaque fois vos clés, vous pouvez les sauvegarder en cochant ici la case!\\\"\\n    >\\n      {{#if this.toStore}}\\n        <input\\n          class=\\\"form-check-input ms-1 me-2\\\"\\n          type=\\\"checkbox\\\"\\n          id={{this.idstoreYes}}\\n          {{on \\\"change\\\" this.setCheckStore}}\\n          checked\\n        />\\n        <label for={{this.idstoreYes}}>Cocher pour sauvegarder vos informations</label>\\n      {{else}}\\n        <input\\n          class=\\\"form-check-input ms-1 me-2\\\"\\n          type=\\\"checkbox\\\"\\n          id={{this.idstoreNo}}\\n          {{on \\\"change\\\" this.setCheckStore}}\\n        />\\n        <label for={{this.idstoreNo}}>Cocher pour sauvegarder vos informations</label>\\n      {{/if}}\\n      <span class=\\\"d-inline-block ms-1\\\">\\n        <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n        <BsTooltip @placement=\\\"right\\\">Ceci implique le stockage de vos clés dans la base de votre navigateur, localement\\n          sur votre machine. Pour information, ces clés seront stockées de manière à réduire leur exposition. Néanmoins\\n          cela n'empêche pas la divulgation si par ailleurs votre machine vient à être infectée ou compromise. En\\n          cochant cette case, vous autorisez explicitement ce stockage.\\n        </BsTooltip>\\n      </span>\\n    </div>\\n    <BsAlert data-test-api-exchanges-url @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n      <strong>Tips : </strong>\\n      Pour vous aider à créer vos clés API, rendez vous à cette adresse :\\n      <App::ExternalLink href=\\\"{{@wallet.url}}\\\">{{@wallet.url}}</App::ExternalLink>\\n    </BsAlert>\\n    <div class=\\\"d-flex\\\">\\n      <form.submitButton\\n        data-test-api-exchanges-sync-button\\n        data-title=\\\"Synchroniser\\\"\\n        data-intro=\\\"Débuter la synchronisation en cliquant sur ce bouton. Cela peut prendre plusieurs minutes si vous avez beaucoup de transactions. Une barre de progression apparaitra afin de visualiser cet avancement.\\\"\\n        disabled={{this.isRunning}}\\n      >Synchroniser</form.submitButton>\\n      <div class=\\\"d-flex align-items-center w-75\\\">\\n        {{#if this.progressError}}\\n          <BsAlert\\n            data-test-api-exchanges-progress-error\\n            class=\\\"m-0 mx-3 py-1 text-center\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @fadeDuration={{800}}\\n            @type=\\\"danger\\\"\\n            @dismissible={{false}}\\n          >\\n            {{this.progressError}}\\n          </BsAlert>\\n        {{else}}\\n          {{#if this.isRunning}}\\n            <BsProgress class=\\\"ms-2 spinner\\\" as |pg|>\\n              <pg.bar\\n                @value={{this.progressWallet}}\\n                @minValue={{0}}\\n                @maxValue={{100}}\\n                @showLabel={{true}}\\n                @type=\\\"success\\\"\\n              />\\n            </BsProgress>\\n          {{else if (eq this.progressWallet 100)}}\\n            <BsAlert\\n              class=\\\"m-0 mx-3 py-1 text-center\\\"\\n              @visible={{true}}\\n              @fade={{true}}\\n              @fadeDuration={{800}}\\n              @type=\\\"success\\\"\\n              @dismissible={{false}}\\n            >\\n              Chargé avec succès !\\n            </BsAlert>\\n          {{/if}}\\n        {{/if}}\\n      </div>\\n    </div>\\n  </BsForm>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/api/exchanges.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/api/exchanges.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { guidFor } from '@ember/object/internals';\nimport { inject as service } from '@ember/service';\n\nimport type Wasm from 'cryptofiscafacile-gui/services/wasm';\nimport type { ApiData } from 'cryptofiscafacile-wasm';\n\ninterface ApiExchangesArgs {\n  wallet: ApiData;\n}\n\nexport default class ApiExchanges extends Component<ApiExchangesArgs> {\n  @service declare wasm: Wasm;\n\n  @tracked pub = this.args.wallet.arg1;\n  @tracked priv = this.args.wallet.arg2;\n  @tracked other = this.args.wallet.arg3;\n  @tracked toStore = false;\n\n  @tracked idPriv = 'priv-' + guidFor(this);\n  @tracked idPub = 'pub-' + guidFor(this);\n  @tracked idstoreYes = 'store-' + guidFor(this);\n  @tracked idstoreNo = 'nostore-' + guidFor(this);\n\n  get progressWallet() {\n    return this.wasm.toolsProgress.get(this.args.wallet) ?? 0;\n  }\n\n  get progressError() {\n    return this.wasm.toolsErrors.get(this.args.wallet) ?? '';\n  }\n\n  get isRunning() {\n    const tasks = this.wasm.toolsTasks.get(this.args.wallet);\n\n    return tasks ? tasks[0]?.isRunning : false;\n  }\n\n  @action\n  submitExch() {\n    this.wasm.getApi(this.args.wallet, this.pub, this.priv, this.other, this.toStore);\n\n    debug('Call to GetAPI: ' + this.args.wallet.name + ' / ' + this.pub + ' / ' + this.toStore);\n  }\n\n  @action\n  setPub(e: { target: HTMLInputElement }) {\n    if (e.target.value !== '') {\n      this.pub = e.target.value;\n    } else {\n      this.pub = this.args.wallet.arg1;\n    }\n  }\n  @action\n  setPriv(e: { target: HTMLInputElement }) {\n    if (e.target.value !== '') {\n      this.priv = e.target.value;\n    } else {\n      this.priv = this.args.wallet.arg2;\n    }\n  }\n\n  @action\n  setCheckStore(e: { target: HTMLInputElement }) {\n    this.toStore = e.target.checked;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{! template-lint-disable no-duplicate-id }}\\n<div class=\\\"p-0\\\" id=\\\"intro-tool\\\">\\n  <div\\n    class=\\\"row gx-1\\\"\\n    data-title=\\\"Outils\\\"\\n    data-intro=\\\"Bienvenue 👋 Sur cette page il vous sera possible d'ajouter des transactions automatiquement sans fichier à importer!\\\"\\n  >\\n    <div class=\\\"col-12 col-lg-6 pe-2 pb-3\\\">\\n      <div\\n        class=\\\"card custom-cardtool\\\"\\n        data-title=\\\"API Exchange\\\"\\n        data-intro=\\\"Cette carte vous permet d'utiliser vos clés API des plateformes d'échange afin de rapatrier automatiquement les transactions de cette plateforme...\\\"\\n      >\\n        <div class=\\\"card-body\\\">\\n          <h5 class=\\\"card-title font-weight-bold mb-3 mt-2 ms-3\\\">API (Pour les plateformes suivantes)</h5>\\n          <div class=\\\"card-text\\\">\\n            {{#if this.isFecthingTools}}\\n              <div class=\\\"h-100\\\">\\n                <ul class=\\\"nav nav-tabs placeholder-glow\\\">\\n                  <li class=\\\"nav-item placeholder\\\">\\n                    <p class=\\\"placeholder-glow\\\">\\n                    </p>\\n                  </li>\\n                </ul>\\n                <div class=\\\"tab-content\\\">\\n                  <div class=\\\"tab-pane show active fade\\\">\\n                    <div class=\\\"m-4\\\">\\n                      <ContentLoader>\\n                        <rect x=\\\"0\\\" y=\\\"0\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"250\\\" height=\\\"10\\\"></rect>\\n                        <rect x=\\\"10\\\" y=\\\"20\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"400\\\" height=\\\"20\\\"></rect>\\n                        <rect x=\\\"20\\\" y=\\\"50\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"170\\\" height=\\\"10\\\"></rect>\\n                        <rect x=\\\"0\\\" y=\\\"80\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"250\\\" height=\\\"10\\\"></rect>\\n                        <rect x=\\\"20\\\" y=\\\"100\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"400\\\" height=\\\"20\\\"></rect>\\n                        <rect x=\\\"10\\\" y=\\\"140\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"80\\\" height=\\\"10\\\"></rect>\\n                      </ContentLoader>\\n                      <p></p>\\n                      <ContentLoader />\\n                      <a\\n                        href=\\\"#\\\"\\n                        tabindex=\\\"-1\\\"\\n                        class=\\\"btn btn-primary disabled placeholder col-2 mt-4\\\"\\n                        aria-hidden=\\\"true\\\"\\n                      ></a>\\n                    </div>\\n                  </div>\\n                </div>\\n              </div>\\n            {{else}}\\n              {{#if (gt this.wallets.length 0)}}\\n                <BsTab as |tab|>\\n                  {{#each this.wallets as |wallet|}}\\n                    <tab.pane @title=\\\"{{wallet.name}}\\\">\\n                      <Api::Exchanges @wallet={{wallet}} />\\n                    </tab.pane>\\n                  {{/each}}\\n                </BsTab>\\n              {{else}}\\n                <div class=\\\"mt-5 line-height-tools none\\\">\\n                  <h4>Aucun portefeuille à afficher. Veuillez contacter le support</h4>\\n                </div>\\n              {{/if}}\\n            {{/if}}\\n          </div>\\n        </div>\\n      </div>\\n    </div>\\n    <div class=\\\"col-12 col-lg-6\\\">\\n      <div\\n        class=\\\"card custom-cardtool\\\"\\n        data-title=\\\"API Blockchains\\\"\\n        data-intro=\\\"Cette carte vous permet d'utiliser vos données blockchain (et API quand nécessaire) afin de rapatrier automatiquement les transactions des blockchains prises en compte par CryptoFiscaFacile. Il s'agit du même principe que pour les API d'échanges, hormis l'adresse à renseigner. Le cas échéant, vous pourrez rentrer une clé publique pour la blockchain concernée (par ex.: pour ETH, avoir une clé publique permettra de rapatrier plus rapidement vos transactions)...\\\"\\n      >\\n        <div class=\\\"card-body\\\">\\n          <h5 class=\\\"card-title font-weight-bold mb-3 mt-2 ms-3\\\">API (Blockchains suivantes)</h5>\\n          <div class=\\\"card-text\\\">\\n            {{#if this.isFecthingTools}}\\n              <div class=\\\"h-100\\\">\\n                <ul class=\\\"nav nav-tabs placeholder-glow\\\">\\n                  <li class=\\\"nav-item placeholder\\\">\\n                    <p class=\\\"placeholder-glow\\\">\\n                    </p>\\n                  </li>\\n                </ul>\\n                <div class=\\\"tab-content\\\">\\n                  <div class=\\\"tab-pane show active fade\\\">\\n                    <div class=\\\"m-4\\\">\\n                      <ContentLoader>\\n                        <rect x=\\\"0\\\" y=\\\"0\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"250\\\" height=\\\"10\\\"></rect>\\n                        <rect x=\\\"10\\\" y=\\\"20\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"400\\\" height=\\\"20\\\"></rect>\\n                        <rect x=\\\"20\\\" y=\\\"50\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"170\\\" height=\\\"10\\\"></rect>\\n                        <rect x=\\\"0\\\" y=\\\"80\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"250\\\" height=\\\"10\\\"></rect>\\n                        <rect x=\\\"20\\\" y=\\\"100\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"400\\\" height=\\\"20\\\"></rect>\\n                        <rect x=\\\"10\\\" y=\\\"140\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"80\\\" height=\\\"10\\\"></rect>\\n                      </ContentLoader>\\n                      <p></p>\\n                      <ContentLoader />\\n                      <a\\n                        href=\\\"#\\\"\\n                        tabindex=\\\"-1\\\"\\n                        class=\\\"btn btn-primary disabled placeholder col-2 mt-4\\\"\\n                        aria-hidden=\\\"true\\\"\\n                      ></a>\\n                    </div>\\n                  </div>\\n                </div>\\n              </div>\\n            {{else}}\\n              {{#if (gt this.blockchains.length 0)}}\\n                <BsTab as |tab|>\\n                  {{#each this.blockchains as |block|}}\\n                    <tab.pane @title=\\\"{{block.name}}\\\">\\n                      <Api::Blockchains @blockchain={{block}} />\\n                    </tab.pane>\\n                  {{/each}}\\n                </BsTab>\\n              {{else}}\\n                <div class=\\\"mt-5 line-height-tools none\\\">\\n                  <h4>Aucune Blockchain à afficher. Veuillez contacter le support.</h4>\\n                </div>\\n              {{/if}}\\n            {{/if}}\\n          </div>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\", {\"contents\":\"{{! template-lint-disable no-duplicate-id }}\\n<div class=\\\"p-0\\\" id=\\\"intro-tool\\\">\\n  <div\\n    class=\\\"row gx-1\\\"\\n    data-title=\\\"Outils\\\"\\n    data-intro=\\\"Bienvenue 👋 Sur cette page il vous sera possible d'ajouter des transactions automatiquement sans fichier à importer!\\\"\\n  >\\n    <div class=\\\"col-12 col-lg-6 pe-2 pb-3\\\">\\n      <div\\n        class=\\\"card custom-cardtool\\\"\\n        data-title=\\\"API Exchange\\\"\\n        data-intro=\\\"Cette carte vous permet d'utiliser vos clés API des plateformes d'échange afin de rapatrier automatiquement les transactions de cette plateforme...\\\"\\n      >\\n        <div class=\\\"card-body\\\">\\n          <h5 class=\\\"card-title font-weight-bold mb-3 mt-2 ms-3\\\">API (Pour les plateformes suivantes)</h5>\\n          <div class=\\\"card-text\\\">\\n            {{#if this.isFecthingTools}}\\n              <div class=\\\"h-100\\\">\\n                <ul class=\\\"nav nav-tabs placeholder-glow\\\">\\n                  <li class=\\\"nav-item placeholder\\\">\\n                    <p class=\\\"placeholder-glow\\\">\\n                    </p>\\n                  </li>\\n                </ul>\\n                <div class=\\\"tab-content\\\">\\n                  <div class=\\\"tab-pane show active fade\\\">\\n                    <div class=\\\"m-4\\\">\\n                      <ContentLoader>\\n                        <rect x=\\\"0\\\" y=\\\"0\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"250\\\" height=\\\"10\\\"></rect>\\n                        <rect x=\\\"10\\\" y=\\\"20\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"400\\\" height=\\\"20\\\"></rect>\\n                        <rect x=\\\"20\\\" y=\\\"50\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"170\\\" height=\\\"10\\\"></rect>\\n                        <rect x=\\\"0\\\" y=\\\"80\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"250\\\" height=\\\"10\\\"></rect>\\n                        <rect x=\\\"20\\\" y=\\\"100\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"400\\\" height=\\\"20\\\"></rect>\\n                        <rect x=\\\"10\\\" y=\\\"140\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"80\\\" height=\\\"10\\\"></rect>\\n                      </ContentLoader>\\n                      <p></p>\\n                      <ContentLoader />\\n                      <a\\n                        href=\\\"#\\\"\\n                        tabindex=\\\"-1\\\"\\n                        class=\\\"btn btn-primary disabled placeholder col-2 mt-4\\\"\\n                        aria-hidden=\\\"true\\\"\\n                      ></a>\\n                    </div>\\n                  </div>\\n                </div>\\n              </div>\\n            {{else}}\\n              {{#if (gt this.wallets.length 0)}}\\n                <BsTab as |tab|>\\n                  {{#each this.wallets as |wallet|}}\\n                    <tab.pane @title=\\\"{{wallet.name}}\\\">\\n                      <Api::Exchanges @wallet={{wallet}} />\\n                    </tab.pane>\\n                  {{/each}}\\n                </BsTab>\\n              {{else}}\\n                <div class=\\\"mt-5 line-height-tools none\\\">\\n                  <h4>Aucun portefeuille à afficher. Veuillez contacter le support</h4>\\n                </div>\\n              {{/if}}\\n            {{/if}}\\n          </div>\\n        </div>\\n      </div>\\n    </div>\\n    <div class=\\\"col-12 col-lg-6\\\">\\n      <div\\n        class=\\\"card custom-cardtool\\\"\\n        data-title=\\\"API Blockchains\\\"\\n        data-intro=\\\"Cette carte vous permet d'utiliser vos données blockchain (et API quand nécessaire) afin de rapatrier automatiquement les transactions des blockchains prises en compte par CryptoFiscaFacile. Il s'agit du même principe que pour les API d'échanges, hormis l'adresse à renseigner. Le cas échéant, vous pourrez rentrer une clé publique pour la blockchain concernée (par ex.: pour ETH, avoir une clé publique permettra de rapatrier plus rapidement vos transactions)...\\\"\\n      >\\n        <div class=\\\"card-body\\\">\\n          <h5 class=\\\"card-title font-weight-bold mb-3 mt-2 ms-3\\\">API (Blockchains suivantes)</h5>\\n          <div class=\\\"card-text\\\">\\n            {{#if this.isFecthingTools}}\\n              <div class=\\\"h-100\\\">\\n                <ul class=\\\"nav nav-tabs placeholder-glow\\\">\\n                  <li class=\\\"nav-item placeholder\\\">\\n                    <p class=\\\"placeholder-glow\\\">\\n                    </p>\\n                  </li>\\n                </ul>\\n                <div class=\\\"tab-content\\\">\\n                  <div class=\\\"tab-pane show active fade\\\">\\n                    <div class=\\\"m-4\\\">\\n                      <ContentLoader>\\n                        <rect x=\\\"0\\\" y=\\\"0\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"250\\\" height=\\\"10\\\"></rect>\\n                        <rect x=\\\"10\\\" y=\\\"20\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"400\\\" height=\\\"20\\\"></rect>\\n                        <rect x=\\\"20\\\" y=\\\"50\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"170\\\" height=\\\"10\\\"></rect>\\n                        <rect x=\\\"0\\\" y=\\\"80\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"250\\\" height=\\\"10\\\"></rect>\\n                        <rect x=\\\"20\\\" y=\\\"100\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"400\\\" height=\\\"20\\\"></rect>\\n                        <rect x=\\\"10\\\" y=\\\"140\\\" rx=\\\"3\\\" ry=\\\"3\\\" width=\\\"80\\\" height=\\\"10\\\"></rect>\\n                      </ContentLoader>\\n                      <p></p>\\n                      <ContentLoader />\\n                      <a\\n                        href=\\\"#\\\"\\n                        tabindex=\\\"-1\\\"\\n                        class=\\\"btn btn-primary disabled placeholder col-2 mt-4\\\"\\n                        aria-hidden=\\\"true\\\"\\n                      ></a>\\n                    </div>\\n                  </div>\\n                </div>\\n              </div>\\n            {{else}}\\n              {{#if (gt this.blockchains.length 0)}}\\n                <BsTab as |tab|>\\n                  {{#each this.blockchains as |block|}}\\n                    <tab.pane @title=\\\"{{block.name}}\\\">\\n                      <Api::Blockchains @blockchain={{block}} />\\n                    </tab.pane>\\n                  {{/each}}\\n                </BsTab>\\n              {{else}}\\n                <div class=\\\"mt-5 line-height-tools none\\\">\\n                  <h4>Aucune Blockchain à afficher. Veuillez contacter le support.</h4>\\n                </div>\\n              {{/if}}\\n            {{/if}}\\n          </div>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/api/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/api/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\n\nimport type Application from 'cryptofiscafacile-gui/services/application';\nimport type Wasm from 'cryptofiscafacile-gui/services/wasm';\nimport type { ApiData } from 'cryptofiscafacile-wasm';\n\nexport default class Api extends Component {\n  @service declare application: Application;\n  @service declare wasm: Wasm;\n\n  get unprocessedTools() {\n    return this.wasm.tools?.apis ?? [];\n  }\n\n  get wallets() {\n    return this.#filterTools(this.unprocessedTools, 'wallet');\n  }\n\n  get blockchains() {\n    return this.#filterTools(this.unprocessedTools, 'block');\n  }\n\n  #filterTools(tools: ApiData[], target: string) {\n    if (target === 'wallet') {\n      return tools.filter((item) => item.plateform);\n    } else if (target === 'block') {\n      return tools.filter((item) => !item.plateform);\n    }\n\n    return undefined;\n  }\n\n  get isFecthingTools() {\n    return this.wasm.getToolsTask.isRunning;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<a href=\\\"\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\" ...attributes>\\n  {{yield}}\\n</a>\", {\"contents\":\"<a href=\\\"\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\" ...attributes>\\n  {{yield}}\\n</a>\",\"moduleName\":\"cryptofiscafacile-gui/components/app/external-link.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/app/external-link.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsModal\\n  @open={{@open}}\\n  @onHidden={{@onHidden}}\\n  @backdropClose={{false}}\\n  @size=\\\"lg\\\"\\n  data-test-calendrier-fiscal-modal\\n  as |modal|\\n>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">Calendriers prévisionnels</h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        <BsTab @type=\\\"pills\\\" as |tab|>\\n          <tab.pane @title=\\\"Déclaration des revenus\\\" class=\\\"mt-3\\\">\\n            <div class=\\\"custom-modalbody\\\">\\n              <h6>Voici le calendrier prévisionnel de la période de déclaration des revenus de\\n                {{this.anneeRevenus}}\\n                :</h6>\\n              <div class=\\\"history-tl-container\\\">\\n                <ul class=\\\"tl\\\">\\n                  <li class=\\\"tl-item\\\" ng-repeat=\\\"item in retailer_history\\\">\\n                    <div class=\\\"timestamp\\\">\\n                      {{format-date this.dateOuverture}}<br />\\n                      {{format-time this.dateOuverture}}\\n                    </div>\\n                    <div class=\\\"item-title\\\">Ouverture de la saison d'imposition</div>\\n                    <div class=\\\"item-detail\\\">Ouverture du service de déclaration des revenus\\n                      {{this.anneeRevenus}}\\n                      par internet</div>\\n                  </li>\\n                  <li class=\\\"tl-item\\\" ng-repeat=\\\"item in retailer_history\\\">\\n                    <div class=\\\"timestamp\\\">\\n                      {{format-date this.dateFermeturePapier}}<br />\\n                      {{format-time this.dateFermeturePapier}}\\n                    </div>\\n                    <div class=\\\"item-title\\\">Déclaration Papier</div>\\n                    <div class=\\\"item-detail\\\">Date limite de déclaration\\n                      {{this.anneeDeclaration}}\\n                      sur les revenus\\n                      {{this.anneeRevenus}}\\n                      en version papier</div>\\n                  </li>\\n                  <li class=\\\"tl-item\\\" ng-repeat=\\\"item in retailer_history\\\">\\n                    <div class=\\\"timestamp\\\">\\n                      {{format-date this.dateFermetureZone1}}<br />\\n                      {{format-time this.dateFermetureZone1}}\\n                    </div>\\n                    <div class=\\\"item-title\\\">Déclaration En ligne zone 1</div>\\n                    <div class=\\\"item-detail\\\">Date limite de déclaration\\n                      {{this.anneeDeclaration}}\\n                      sur les revenus\\n                      {{this.anneeRevenus}}\\n                      par internet pour les départements 01 (Ain) à 19 (Corrèze)</div>\\n                  </li>\\n                  <li class=\\\"tl-item\\\" ng-repeat=\\\"item in retailer_history\\\">\\n                    <div class=\\\"timestamp\\\">\\n                      {{format-date this.dateFermetureZone2}}<br />\\n                      {{format-time this.dateFermetureZone2}}\\n                    </div>\\n                    <div class=\\\"item-title\\\">Déclaration En ligne zone 2</div>\\n                    <div class=\\\"item-detail\\\">Date limite de déclaration\\n                      {{this.anneeDeclaration}}\\n                      sur les revenus\\n                      {{this.anneeRevenus}}\\n                      par internet pour les départements 20 (Corse) à 54 (Meurthe et Moselle)</div>\\n                  </li>\\n                  <li class=\\\"tl-item\\\" ng-repeat=\\\"item in retailer_history\\\">\\n                    <div class=\\\"timestamp\\\">\\n                      {{format-date this.dateFermetureZone3}}<br />\\n                      {{format-time this.dateFermetureZone3}}\\n                    </div>\\n                    <div class=\\\"item-title\\\">Déclaration En ligne zone 3</div>\\n                    <div class=\\\"item-detail\\\">Date limite de déclaration\\n                      {{this.anneeDeclaration}}\\n                      sur les revenus\\n                      {{this.anneeRevenus}}\\n                      par internet pour les départements 55 (Meuse) à 976 (La Réunion)</div>\\n                  </li>\\n                  <li class=\\\"tl-item\\\" ng-repeat=\\\"item in retailer_history\\\">\\n                    <div class=\\\"timestamp\\\">\\n                      Entre le 25 juillet<br />\\n                      et le 1 août\\n                    </div>\\n                    <div class=\\\"item-title\\\">Avis d'imposition sur les revenus {{this.anneeRevenus}}</div>\\n                    <div class=\\\"item-detail\\\">Mise à disposition de votre avis d'imposition\\n                      {{this.anneeDeclaration}}\\n                      d'après votre déclaration sur les revenus\\n                      {{this.anneeRevenus}}</div>\\n                  </li>\\n                  <li class=\\\"tl-item\\\" ng-repeat=\\\"item in retailer_history\\\">\\n                    <div class=\\\"timestamp\\\">\\n                      A partir de<br />\\n                      Début août\\n                    </div>\\n                    <div class=\\\"item-title\\\">Correction de l'imposition</div>\\n                    <div class=\\\"item-detail\\\">Après la date limite de dépôt et une fois votre avis reçu ou mis à\\n                      disposition, vous pourrez encore, si besoin, modifier cette déclaration via le service de\\n                      correction en ligne</div>\\n                  </li>\\n                  <li class=\\\"tl-item\\\" ng-repeat=\\\"item in retailer_history\\\">\\n                    <div class=\\\"timestamp\\\">\\n                      Fermeture\\n                      <br />\\n                      mi-décembre\\n                      {{this.anneeDeclaration}}\\n                    </div>\\n                    <div class=\\\"item-title\\\">Fin de correction de l'imposition</div>\\n                    <div class=\\\"item-detail\\\">Après fermeture du service \\\"corriger ma déclaration\\\", vous ne pourrez plus\\n                      modifier votre déclaration du tout</div>\\n                  </li>\\n                </ul>\\n              </div>\\n              <h6><strong>A noter : c'est au moment de la déclaration de vos revenus\\n                  {{this.anneeRevenus}}\\n                  que vous connaîtrez le taux de prélèvement à la source qui s'appliquera à vos revenus à partir d'août\\n                  {{this.anneeDeclaration}}.</strong></h6>\\n            </div>\\n          </tab.pane>\\n          <tab.pane @title=\\\"Régularisation de l'impôt\\\" class=\\\"mt-3\\\">\\n            <div class=\\\"custom-modalbody\\\">\\n              <h6>La régularisation intervient l'année suivant le prélèvement de l'impôt à la source afin de corriger la\\n                situation dans le cas où vous auriez trop payé ou pas assez par rapport à l'impôt réellement dû.</h6>\\n              <p class=\\\"text\\\">La régularisation de l'impôt n'est possible qu'après la déclaration des revenus réellement\\n                perçus.</p>\\n              <h5>Vous avez trop versé d'impôt à la source ?</h5>\\n              <p class=\\\"text\\\">Vous allez bénéficier d'un remboursement : Celui-ci sera effectué par virement bancaire\\n                sur votre compte\\n                <strong class=\\\"yellow-text\\\">le 24 juillet ou le 31 juillet {{this.anneeDeclaration}}</strong>. Si vous\\n                n'avez pas communiqué de compte bancaire, vous recevrez votre remboursement par chèque.</p>\\n              <p class=\\\"text\\\"><strong>Important :</strong>\\n                vous avez jusqu'au 1er juillet inclus de l'année de déclaration pour mettre à jour votre compte bancaire\\n                utilisé pour le remboursement du trop perçu.</p>\\n              <h5>Vous devez verser un complément d'impôt ?</h5>\\n              <p class=\\\"text\\\">Si le montant qu'il vous reste à payer est inférieur ou égal à 300 euros, vous serez\\n                prélevé de cette somme en une fois\\n                <strong class=\\\"yellow-text\\\">en septembre {{this.anneeDeclaration}} </strong>\\n                (date prévisionnelle).</p>\\n              <p class=\\\"text\\\">Si le montant est supérieur à 300 €, vous serez prélevé en quatre mensualités :\\n                <strong class=\\\"yellow-text\\\">septembre, octobre, novembre et décembre\\n                  {{this.anneeDeclaration}}</strong>.</p>\\n              <h5>Une correction après fin de saison déclarative ?</h5>\\n              <p class=\\\"text\\\">Si vous devez porter correction à votre déclaration après la période de correction (après\\n                fermeture du service \\\"corriger ma déclaration\\\"), vous devrez présenter une réclamation. Vous avez alors\\n                jusqu'au\\n                <strong class=\\\"yellow-text\\\">31 décembre N + 2</strong>\\n                pour le faire en ligne depuis la messagerie sécurisée de votre espace Particulier, rubrique \\\"Je signale\\n                une erreur sur le calcul de mon impôt\\\" ou par courrier à votre centre des finances publiques.</p>\\n            </div>\\n          </tab.pane>\\n        </BsTab>\\n      </div>\\n    </modal.body>\\n    <modal.footer class=\\\"justify-content-between\\\">\\n      <div class=\\\"d-flex justify-content-end w-100\\\">\\n        <div>\\n          <BsButton {{on \\\"click\\\" this.close}} data-test-calendrier-fiscal-modal-close-button>\\n            Fermer</BsButton>\\n        </div>\\n      </div>\\n    </modal.footer>\\n  </div>\\n</BsModal>\", {\"contents\":\"<BsModal\\n  @open={{@open}}\\n  @onHidden={{@onHidden}}\\n  @backdropClose={{false}}\\n  @size=\\\"lg\\\"\\n  data-test-calendrier-fiscal-modal\\n  as |modal|\\n>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">Calendriers prévisionnels</h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        <BsTab @type=\\\"pills\\\" as |tab|>\\n          <tab.pane @title=\\\"Déclaration des revenus\\\" class=\\\"mt-3\\\">\\n            <div class=\\\"custom-modalbody\\\">\\n              <h6>Voici le calendrier prévisionnel de la période de déclaration des revenus de\\n                {{this.anneeRevenus}}\\n                :</h6>\\n              <div class=\\\"history-tl-container\\\">\\n                <ul class=\\\"tl\\\">\\n                  <li class=\\\"tl-item\\\" ng-repeat=\\\"item in retailer_history\\\">\\n                    <div class=\\\"timestamp\\\">\\n                      {{format-date this.dateOuverture}}<br />\\n                      {{format-time this.dateOuverture}}\\n                    </div>\\n                    <div class=\\\"item-title\\\">Ouverture de la saison d'imposition</div>\\n                    <div class=\\\"item-detail\\\">Ouverture du service de déclaration des revenus\\n                      {{this.anneeRevenus}}\\n                      par internet</div>\\n                  </li>\\n                  <li class=\\\"tl-item\\\" ng-repeat=\\\"item in retailer_history\\\">\\n                    <div class=\\\"timestamp\\\">\\n                      {{format-date this.dateFermeturePapier}}<br />\\n                      {{format-time this.dateFermeturePapier}}\\n                    </div>\\n                    <div class=\\\"item-title\\\">Déclaration Papier</div>\\n                    <div class=\\\"item-detail\\\">Date limite de déclaration\\n                      {{this.anneeDeclaration}}\\n                      sur les revenus\\n                      {{this.anneeRevenus}}\\n                      en version papier</div>\\n                  </li>\\n                  <li class=\\\"tl-item\\\" ng-repeat=\\\"item in retailer_history\\\">\\n                    <div class=\\\"timestamp\\\">\\n                      {{format-date this.dateFermetureZone1}}<br />\\n                      {{format-time this.dateFermetureZone1}}\\n                    </div>\\n                    <div class=\\\"item-title\\\">Déclaration En ligne zone 1</div>\\n                    <div class=\\\"item-detail\\\">Date limite de déclaration\\n                      {{this.anneeDeclaration}}\\n                      sur les revenus\\n                      {{this.anneeRevenus}}\\n                      par internet pour les départements 01 (Ain) à 19 (Corrèze)</div>\\n                  </li>\\n                  <li class=\\\"tl-item\\\" ng-repeat=\\\"item in retailer_history\\\">\\n                    <div class=\\\"timestamp\\\">\\n                      {{format-date this.dateFermetureZone2}}<br />\\n                      {{format-time this.dateFermetureZone2}}\\n                    </div>\\n                    <div class=\\\"item-title\\\">Déclaration En ligne zone 2</div>\\n                    <div class=\\\"item-detail\\\">Date limite de déclaration\\n                      {{this.anneeDeclaration}}\\n                      sur les revenus\\n                      {{this.anneeRevenus}}\\n                      par internet pour les départements 20 (Corse) à 54 (Meurthe et Moselle)</div>\\n                  </li>\\n                  <li class=\\\"tl-item\\\" ng-repeat=\\\"item in retailer_history\\\">\\n                    <div class=\\\"timestamp\\\">\\n                      {{format-date this.dateFermetureZone3}}<br />\\n                      {{format-time this.dateFermetureZone3}}\\n                    </div>\\n                    <div class=\\\"item-title\\\">Déclaration En ligne zone 3</div>\\n                    <div class=\\\"item-detail\\\">Date limite de déclaration\\n                      {{this.anneeDeclaration}}\\n                      sur les revenus\\n                      {{this.anneeRevenus}}\\n                      par internet pour les départements 55 (Meuse) à 976 (La Réunion)</div>\\n                  </li>\\n                  <li class=\\\"tl-item\\\" ng-repeat=\\\"item in retailer_history\\\">\\n                    <div class=\\\"timestamp\\\">\\n                      Entre le 25 juillet<br />\\n                      et le 1 août\\n                    </div>\\n                    <div class=\\\"item-title\\\">Avis d'imposition sur les revenus {{this.anneeRevenus}}</div>\\n                    <div class=\\\"item-detail\\\">Mise à disposition de votre avis d'imposition\\n                      {{this.anneeDeclaration}}\\n                      d'après votre déclaration sur les revenus\\n                      {{this.anneeRevenus}}</div>\\n                  </li>\\n                  <li class=\\\"tl-item\\\" ng-repeat=\\\"item in retailer_history\\\">\\n                    <div class=\\\"timestamp\\\">\\n                      A partir de<br />\\n                      Début août\\n                    </div>\\n                    <div class=\\\"item-title\\\">Correction de l'imposition</div>\\n                    <div class=\\\"item-detail\\\">Après la date limite de dépôt et une fois votre avis reçu ou mis à\\n                      disposition, vous pourrez encore, si besoin, modifier cette déclaration via le service de\\n                      correction en ligne</div>\\n                  </li>\\n                  <li class=\\\"tl-item\\\" ng-repeat=\\\"item in retailer_history\\\">\\n                    <div class=\\\"timestamp\\\">\\n                      Fermeture\\n                      <br />\\n                      mi-décembre\\n                      {{this.anneeDeclaration}}\\n                    </div>\\n                    <div class=\\\"item-title\\\">Fin de correction de l'imposition</div>\\n                    <div class=\\\"item-detail\\\">Après fermeture du service \\\"corriger ma déclaration\\\", vous ne pourrez plus\\n                      modifier votre déclaration du tout</div>\\n                  </li>\\n                </ul>\\n              </div>\\n              <h6><strong>A noter : c'est au moment de la déclaration de vos revenus\\n                  {{this.anneeRevenus}}\\n                  que vous connaîtrez le taux de prélèvement à la source qui s'appliquera à vos revenus à partir d'août\\n                  {{this.anneeDeclaration}}.</strong></h6>\\n            </div>\\n          </tab.pane>\\n          <tab.pane @title=\\\"Régularisation de l'impôt\\\" class=\\\"mt-3\\\">\\n            <div class=\\\"custom-modalbody\\\">\\n              <h6>La régularisation intervient l'année suivant le prélèvement de l'impôt à la source afin de corriger la\\n                situation dans le cas où vous auriez trop payé ou pas assez par rapport à l'impôt réellement dû.</h6>\\n              <p class=\\\"text\\\">La régularisation de l'impôt n'est possible qu'après la déclaration des revenus réellement\\n                perçus.</p>\\n              <h5>Vous avez trop versé d'impôt à la source ?</h5>\\n              <p class=\\\"text\\\">Vous allez bénéficier d'un remboursement : Celui-ci sera effectué par virement bancaire\\n                sur votre compte\\n                <strong class=\\\"yellow-text\\\">le 24 juillet ou le 31 juillet {{this.anneeDeclaration}}</strong>. Si vous\\n                n'avez pas communiqué de compte bancaire, vous recevrez votre remboursement par chèque.</p>\\n              <p class=\\\"text\\\"><strong>Important :</strong>\\n                vous avez jusqu'au 1er juillet inclus de l'année de déclaration pour mettre à jour votre compte bancaire\\n                utilisé pour le remboursement du trop perçu.</p>\\n              <h5>Vous devez verser un complément d'impôt ?</h5>\\n              <p class=\\\"text\\\">Si le montant qu'il vous reste à payer est inférieur ou égal à 300 euros, vous serez\\n                prélevé de cette somme en une fois\\n                <strong class=\\\"yellow-text\\\">en septembre {{this.anneeDeclaration}} </strong>\\n                (date prévisionnelle).</p>\\n              <p class=\\\"text\\\">Si le montant est supérieur à 300 €, vous serez prélevé en quatre mensualités :\\n                <strong class=\\\"yellow-text\\\">septembre, octobre, novembre et décembre\\n                  {{this.anneeDeclaration}}</strong>.</p>\\n              <h5>Une correction après fin de saison déclarative ?</h5>\\n              <p class=\\\"text\\\">Si vous devez porter correction à votre déclaration après la période de correction (après\\n                fermeture du service \\\"corriger ma déclaration\\\"), vous devrez présenter une réclamation. Vous avez alors\\n                jusqu'au\\n                <strong class=\\\"yellow-text\\\">31 décembre N + 2</strong>\\n                pour le faire en ligne depuis la messagerie sécurisée de votre espace Particulier, rubrique \\\"Je signale\\n                une erreur sur le calcul de mon impôt\\\" ou par courrier à votre centre des finances publiques.</p>\\n            </div>\\n          </tab.pane>\\n        </BsTab>\\n      </div>\\n    </modal.body>\\n    <modal.footer class=\\\"justify-content-between\\\">\\n      <div class=\\\"d-flex justify-content-end w-100\\\">\\n        <div>\\n          <BsButton {{on \\\"click\\\" this.close}} data-test-calendrier-fiscal-modal-close-button>\\n            Fermer</BsButton>\\n        </div>\\n      </div>\\n    </modal.footer>\\n  </div>\\n</BsModal>\",\"moduleName\":\"cryptofiscafacile-gui/components/app/header/calendrier-fiscal-modal.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/app/header/calendrier-fiscal-modal.hbs\"}});\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\n\ninterface AppHeaderCalendrierFiscalModalArgs {\n  open: boolean;\n  onHidden: () => void;\n}\n\nexport default class AppHeaderCalendrierFiscalModal extends Component<AppHeaderCalendrierFiscalModalArgs> {\n  anneeRevenus = 2025;\n  anneeDeclaration = this.anneeRevenus + 1;\n  dateOuverture = new Date(2026, 3, 9);\n  dateFermeturePapier = new Date(2026, 4, 19, 23, 59);\n  dateFermetureZone1 = new Date(2026, 4, 21, 23, 59);\n  dateFermetureZone2 = new Date(2026, 4, 28, 23, 59);\n  dateFermetureZone3 = new Date(2026, 5, 4, 23, 59);\n\n  @action\n  close() {\n    this.args.onHidden();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{! Edit modals Configuration HTML }}\\n<BsModal\\n  data-test-configuration-modal\\n  @open={{@open}}\\n  @onShow={{this.onShow}}\\n  @onHidden={{@onHidden}}\\n  @backdropClose={{false}}\\n  as |modal|\\n>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header @closeButton={{this.application.hasIndexedDb}}>\\n      <h4 class=\\\"modal-title\\\">Configuration</h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        <h6><strong>Fonctionnalités :</strong></h6>\\n        <table class=\\\"w-100\\\">\\n          <tbody>\\n            <tr>\\n              <td class=\\\"w-75\\\">\\n                <span class=\\\"ms-4\\\">Persistance des données</span>\\n              </td>\\n              <td class=\\\"text-center\\\">\\n                {{#if this.application.hasIndexedDb}}\\n                  <span class=\\\"badge rounded-pill bg-success\\\">Opérationnelle</span>\\n                {{else}}\\n                  <span class=\\\"badge rounded-pill bg-danger\\\">Désactivée</span>\\n                {{/if}}\\n              </td>\\n            </tr>\\n          </tbody>\\n        </table>\\n        {{#if this.application.hasIndexedDb}}\\n          <hr />\\n          <h6><strong>Import configuration :</strong></h6>\\n          <div class=\\\"form-check mb-3\\\">\\n            <label class=\\\"form-check-label\\\" for=\\\"dropzone-active-checkbox\\\">\\n              Voulez-vous importer votre configuration ?\\n            </label>\\n            <input\\n              class=\\\"me-1 form-check-input\\\"\\n              type=\\\"checkbox\\\"\\n              value={{this.dropZoneDisabled}}\\n              id=\\\"dropzone-active-checkbox\\\"\\n              checked={{readonly this.dropZoneDisabled}}\\n              {{on \\\"change\\\" this.dropZoneEnabled}}\\n            />\\n          </div>\\n          {{#if this.dropZoneDisabled}}\\n            <div class=\\\"w-100\\\">\\n              <div class=\\\"input-group justify-content-evenly\\\">\\n                {{! template-lint-disable require-input-label }}\\n                <input\\n                  type=\\\"file\\\"\\n                  class=\\\"form-control upload\\\"\\n                  id=\\\"fileConfsInput\\\"\\n                  aria-describedby=\\\"file-input\\\"\\n                  aria-label=\\\"Upload\\\"\\n                  {{on \\\"change\\\" this.upload}}\\n                />\\n                <BsButton @type=\\\"primary\\\" @onClick={{this.onImport}}>IMPORTER</BsButton>\\n              </div>\\n            </div>\\n          {{/if}}\\n          <hr />\\n          <h6><strong>Proxy :</strong></h6>\\n          <div class=\\\"form-check\\\">\\n            <Input @value={{this.proxy}} class=\\\"form-control mb-1\\\" id=\\\"proxy\\\" placeholder={{this.defaultProxy}} />\\n          </div>\\n          <div class=\\\"d-flex flex-row-reverse mb-3\\\">\\n            <BsButton\\n              @type=\\\"primary\\\"\\n              disabled={{or this.saveConfigTask.isRunning (not this.proxyUpdated)}}\\n              {{on \\\"click\\\" this.onSave}}\\n            >\\n              ENREGISTRER</BsButton>\\n            {{#if this.saveConfigTaskSuccess}}\\n              <BsAlert\\n                class=\\\"m-0 mx-3 py-1 text-center\\\"\\n                data-test-reports-person-success\\n                @visible={{true}}\\n                @fade={{true}}\\n                @fadeDuration={{800}}\\n                @type=\\\"success\\\"\\n                @dismissible={{false}}\\n              >\\n                Enregistré avec succès !\\n              </BsAlert>\\n            {{/if}}\\n            {{#if this.saveConfigTaskError}}\\n              <BsAlert\\n                class=\\\"m-0 mx-3 py-1 text-center\\\"\\n                @visible={{true}}\\n                @fade={{true}}\\n                @fadeDuration={{800}}\\n                @type=\\\"danger\\\"\\n                @dismissible={{false}}\\n              >\\n                Problème dans l'enregistrement !\\n              </BsAlert>\\n            {{/if}}\\n          </div>\\n          <hr />\\n          <div class=\\\"d-flex justify-content-between\\\">\\n            <div class=\\\"d-flex flex-row\\\">\\n              <h6><strong>Pour les développeurs :</strong></h6>\\n            </div>\\n            <div class=\\\"d-flex flex-row-reverse\\\">\\n              <BsButton @type=\\\"primary\\\" @onClick={{this.onSetDebug}}>\\n                {{this.activated}}\\n                VERBOSE\\n              </BsButton>\\n            </div>\\n          </div>\\n        {{else}}\\n          <BsAlert class=\\\"mt-3 py-1\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n            <strong>Attention :</strong>\\n            la persistance des données n'est pas assurée dans votre configuration actuelle. Veuillez utiliser un\\n            navigateur compatible et/ou éviter les modes incognito ou navigation privée !\\n          </BsAlert>\\n        {{/if}}\\n      </div>\\n    </modal.body>\\n    {{#if this.application.hasIndexedDb}}\\n      <modal.footer>\\n        <b data-test-configuration-modal-version class=\\\"me-auto\\\">Version:\\n          <App::ExternalLink\\n            href=\\\"https://gitlab.com/c1560/cryptofiscafacile/-/releases/v{{this.application.version}}\\\"\\n          >{{app-version versionOnly=this.production}}\\n          </App::ExternalLink></b>\\n        <BsButton {{on \\\"click\\\" this.close}}>Fermer</BsButton>\\n      </modal.footer>\\n    {{/if}}\\n  </div>\\n</BsModal>\", {\"contents\":\"{{! Edit modals Configuration HTML }}\\n<BsModal\\n  data-test-configuration-modal\\n  @open={{@open}}\\n  @onShow={{this.onShow}}\\n  @onHidden={{@onHidden}}\\n  @backdropClose={{false}}\\n  as |modal|\\n>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header @closeButton={{this.application.hasIndexedDb}}>\\n      <h4 class=\\\"modal-title\\\">Configuration</h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        <h6><strong>Fonctionnalités :</strong></h6>\\n        <table class=\\\"w-100\\\">\\n          <tbody>\\n            <tr>\\n              <td class=\\\"w-75\\\">\\n                <span class=\\\"ms-4\\\">Persistance des données</span>\\n              </td>\\n              <td class=\\\"text-center\\\">\\n                {{#if this.application.hasIndexedDb}}\\n                  <span class=\\\"badge rounded-pill bg-success\\\">Opérationnelle</span>\\n                {{else}}\\n                  <span class=\\\"badge rounded-pill bg-danger\\\">Désactivée</span>\\n                {{/if}}\\n              </td>\\n            </tr>\\n          </tbody>\\n        </table>\\n        {{#if this.application.hasIndexedDb}}\\n          <hr />\\n          <h6><strong>Import configuration :</strong></h6>\\n          <div class=\\\"form-check mb-3\\\">\\n            <label class=\\\"form-check-label\\\" for=\\\"dropzone-active-checkbox\\\">\\n              Voulez-vous importer votre configuration ?\\n            </label>\\n            <input\\n              class=\\\"me-1 form-check-input\\\"\\n              type=\\\"checkbox\\\"\\n              value={{this.dropZoneDisabled}}\\n              id=\\\"dropzone-active-checkbox\\\"\\n              checked={{readonly this.dropZoneDisabled}}\\n              {{on \\\"change\\\" this.dropZoneEnabled}}\\n            />\\n          </div>\\n          {{#if this.dropZoneDisabled}}\\n            <div class=\\\"w-100\\\">\\n              <div class=\\\"input-group justify-content-evenly\\\">\\n                {{! template-lint-disable require-input-label }}\\n                <input\\n                  type=\\\"file\\\"\\n                  class=\\\"form-control upload\\\"\\n                  id=\\\"fileConfsInput\\\"\\n                  aria-describedby=\\\"file-input\\\"\\n                  aria-label=\\\"Upload\\\"\\n                  {{on \\\"change\\\" this.upload}}\\n                />\\n                <BsButton @type=\\\"primary\\\" @onClick={{this.onImport}}>IMPORTER</BsButton>\\n              </div>\\n            </div>\\n          {{/if}}\\n          <hr />\\n          <h6><strong>Proxy :</strong></h6>\\n          <div class=\\\"form-check\\\">\\n            <Input @value={{this.proxy}} class=\\\"form-control mb-1\\\" id=\\\"proxy\\\" placeholder={{this.defaultProxy}} />\\n          </div>\\n          <div class=\\\"d-flex flex-row-reverse mb-3\\\">\\n            <BsButton\\n              @type=\\\"primary\\\"\\n              disabled={{or this.saveConfigTask.isRunning (not this.proxyUpdated)}}\\n              {{on \\\"click\\\" this.onSave}}\\n            >\\n              ENREGISTRER</BsButton>\\n            {{#if this.saveConfigTaskSuccess}}\\n              <BsAlert\\n                class=\\\"m-0 mx-3 py-1 text-center\\\"\\n                data-test-reports-person-success\\n                @visible={{true}}\\n                @fade={{true}}\\n                @fadeDuration={{800}}\\n                @type=\\\"success\\\"\\n                @dismissible={{false}}\\n              >\\n                Enregistré avec succès !\\n              </BsAlert>\\n            {{/if}}\\n            {{#if this.saveConfigTaskError}}\\n              <BsAlert\\n                class=\\\"m-0 mx-3 py-1 text-center\\\"\\n                @visible={{true}}\\n                @fade={{true}}\\n                @fadeDuration={{800}}\\n                @type=\\\"danger\\\"\\n                @dismissible={{false}}\\n              >\\n                Problème dans l'enregistrement !\\n              </BsAlert>\\n            {{/if}}\\n          </div>\\n          <hr />\\n          <div class=\\\"d-flex justify-content-between\\\">\\n            <div class=\\\"d-flex flex-row\\\">\\n              <h6><strong>Pour les développeurs :</strong></h6>\\n            </div>\\n            <div class=\\\"d-flex flex-row-reverse\\\">\\n              <BsButton @type=\\\"primary\\\" @onClick={{this.onSetDebug}}>\\n                {{this.activated}}\\n                VERBOSE\\n              </BsButton>\\n            </div>\\n          </div>\\n        {{else}}\\n          <BsAlert class=\\\"mt-3 py-1\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n            <strong>Attention :</strong>\\n            la persistance des données n'est pas assurée dans votre configuration actuelle. Veuillez utiliser un\\n            navigateur compatible et/ou éviter les modes incognito ou navigation privée !\\n          </BsAlert>\\n        {{/if}}\\n      </div>\\n    </modal.body>\\n    {{#if this.application.hasIndexedDb}}\\n      <modal.footer>\\n        <b data-test-configuration-modal-version class=\\\"me-auto\\\">Version:\\n          <App::ExternalLink\\n            href=\\\"https://gitlab.com/c1560/cryptofiscafacile/-/releases/v{{this.application.version}}\\\"\\n          >{{app-version versionOnly=this.production}}\\n          </App::ExternalLink></b>\\n        <BsButton {{on \\\"click\\\" this.close}}>Fermer</BsButton>\\n      </modal.footer>\\n    {{/if}}\\n  </div>\\n</BsModal>\",\"moduleName\":\"cryptofiscafacile-gui/components/app/header/configuration-modal.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/app/header/configuration-modal.hbs\"}});\nimport Ember from 'ember';\nimport Component from '@glimmer/component';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport config from 'cryptofiscafacile-gui/config/environment';\nimport { dropTask, restartableTask, timeout } from 'ember-concurrency';\nimport JSZip from 'jszip';\nimport { tracked } from 'tracked-built-ins';\n\nimport type ApplicationService from 'cryptofiscafacile-gui/services/application';\nimport type IndexeddbService from 'cryptofiscafacile-gui/services/indexeddb';\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\n\ninterface HeaderConfigurationModalArgs {\n  open: boolean;\n  onHidden: () => void;\n}\n\nexport default class HeaderConfigurationModal extends Component<HeaderConfigurationModalArgs> {\n  @service declare application: ApplicationService;\n  @service declare indexeddb: IndexeddbService;\n  @service declare wasm: WasmService;\n\n  @tracked _proxy?: string;\n  @tracked activated = '';\n  @tracked dropZoneDisabled = false;\n  @tracked files: Blob[] = [];\n  @tracked saveConfigTaskError = false;\n  @tracked saveConfigTaskSuccess = false;\n\n  constructor(owner: undefined, args: never) {\n    super(owner, args);\n    this.activated = this.wasm.verboseActivated === false ? 'ACTIVER' : 'DESACTIVER';\n  }\n\n  get production() {\n    return config.environment === 'production';\n  }\n\n  get proxy() {\n    if (this.wasm.userInfos) {\n      if (this._proxy !== undefined) {\n        return this._proxy;\n      } else {\n        return this.wasm.userInfos.proxy;\n      }\n    }\n\n    return this._proxy;\n  }\n\n  set proxy(value) {\n    this._proxy = value;\n  }\n\n  get proxyUpdated() {\n    return this._proxy !== undefined;\n  }\n\n  get defaultProxy() {\n    return config.APP.proxyUrl;\n  }\n\n  @action\n  async onImport() {\n    await this.indexeddb.cleanDatabases();\n\n    if (this.files.length > 0) {\n      for (const element of this.files) {\n        try {\n          await this.indexeddb.importDatabase(element);\n        } catch (err) {\n          debug('onImport() error : ' + (err as Error).message);\n        }\n      }\n    } else {\n      debug('File(s) not recognized or no file loaded.');\n    }\n\n    await this.wasm.reloadIDBTask.perform();\n    await this.wasm.getHistoryTask.perform();\n    await this.wasm.getWalletsTask.perform();\n    await this.wasm.getTransactionsTask.perform();\n    await this.wasm.getToolsTask.perform();\n    await this.wasm.getReportsTask.perform();\n    this.close();\n  }\n\n  @action\n  close() {\n    if (this.application.hasIndexedDb) {\n      this.files = [];\n      this.args.onHidden();\n    }\n  }\n\n  @action\n  onShow() {\n    this._proxy = undefined;\n  }\n\n  @action\n  async onSave() {\n    await this.saveConfigTask.perform();\n  }\n\n  @action\n  async onSetDebug() {\n    if (this.activated === 'ACTIVER') {\n      // default case or in \"TO ACTIVATE\" mode\n      debug('__Activation DEBUG WASM___');\n      this.wasm.setDebugTask.perform(true);\n      this.activated = 'DESACTIVER';\n    } else {\n      debug('__Désactivation DEBUG WASM___');\n      this.wasm.setDebugTask.perform(false);\n      this.activated = 'ACTIVER';\n    }\n  }\n\n  private saveConfigTask = dropTask(async () => {\n    try {\n      await this.wasm.saveConfigTask.perform(this._proxy ?? '');\n      this.saveConfigTaskSuccess = true;\n    } catch (error) {\n      debug((error as Error).message);\n      this.saveConfigTaskError = true;\n    }\n\n    this.removeSaveConfigTaskIndicator.perform();\n  });\n\n  private removeSaveConfigTaskIndicator = restartableTask(async () => {\n    if (!Ember.testing) {\n      await timeout(3000);\n    }\n\n    this.saveConfigTaskError = false;\n    this.saveConfigTaskSuccess = false;\n  });\n\n  @action\n  dropZoneEnabled() {\n    this.dropZoneDisabled = !this.dropZoneDisabled;\n  }\n\n  @action\n  async upload(e: { target: HTMLInputElement }) {\n    const zipper = new JSZip();\n    let files = e.target.files as FileList;\n\n    if (files[0]) {\n      const zip = await zipper.loadAsync(files[0]);\n\n      this.indexeddb.dbs.forEach(async (dbName) => {\n        const file = await zip?.file(dbName + '.json')?.async('blob');\n\n        if (file) {\n          this.files.push(file);\n        }\n      });\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<span\\n  data-title=\\\"Bienvenue\\\"\\n  data-intro=\\\"L'état du moteur de l'outil (la partie qui gère les données et les calculs de CFF). Celui ci peut-être:\\n  <ul>\\n    <li>Jaune: En cours de démarrage</li>\\n    <li>Vert: En cours de fonctionnement</li>\\n    <li>Rouge: ARRÊTÉ, la page doit être rechargée pour relancer le moteur</li>\\n  </ul>\\\"\\n  class=\\\"head-icon {{this.status}}\\\"\\n  {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n>\\n  {{#if (eq this.wasm.status \\\"HALTED\\\")}}\\n    <App::Icon @icon=\\\"mdi:engine-off-outline\\\" height=\\\"25\\\" />\\n  {{else}}\\n    <App::Icon @icon=\\\"mdi:engine-outline\\\" height=\\\"25\\\" />\\n  {{/if}}\\n  {{#if this.tooltipText}}\\n    <BsTooltip @title={{this.tooltipText}} />\\n  {{/if}}\\n</span>\", {\"contents\":\"<span\\n  data-title=\\\"Bienvenue\\\"\\n  data-intro=\\\"L'état du moteur de l'outil (la partie qui gère les données et les calculs de CFF). Celui ci peut-être:\\n  <ul>\\n    <li>Jaune: En cours de démarrage</li>\\n    <li>Vert: En cours de fonctionnement</li>\\n    <li>Rouge: ARRÊTÉ, la page doit être rechargée pour relancer le moteur</li>\\n  </ul>\\\"\\n  class=\\\"head-icon {{this.status}}\\\"\\n  {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n>\\n  {{#if (eq this.wasm.status \\\"HALTED\\\")}}\\n    <App::Icon @icon=\\\"mdi:engine-off-outline\\\" height=\\\"25\\\" />\\n  {{else}}\\n    <App::Icon @icon=\\\"mdi:engine-outline\\\" height=\\\"25\\\" />\\n  {{/if}}\\n  {{#if this.tooltipText}}\\n    <BsTooltip @title={{this.tooltipText}} />\\n  {{/if}}\\n</span>\",\"moduleName\":\"cryptofiscafacile-gui/components/app/header/engine-indicator.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/app/header/engine-indicator.hbs\"}});\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\n\nimport { EngineStatus } from 'cryptofiscafacile-gui/enums/engine-status';\n\nimport type Wasm from 'cryptofiscafacile-gui/services/wasm';\n\nexport default class AppHeaderEngineIndicator extends Component {\n  @service declare wasm: Wasm;\n\n  get status() {\n    return `engine-${this.wasm.status.toLowerCase()}`;\n  }\n\n  get tooltipText() {\n    switch (this.wasm.status) {\n      case EngineStatus.HALTED:\n        return 'Le moteur CFF est arrêté, merci de recharger la page';\n      case EngineStatus.LOADING:\n        return 'Le moteur CFF démarre';\n      case EngineStatus.RUNNING:\n        return 'Le moteur CFF tourne parfaitement';\n      default:\n        throw new Error('Unknown status');\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<nav class=\\\"justify-content-between slide-in-top header\\\">\\n  <div class=\\\"hstack gap-3 justify-content-around align-items-center\\\">\\n    <div class=\\\"d-flex flex-column justify-content-start ms-3 ms-md-1 my-2 my-md-2\\\">\\n      <h1 class=\\\"header-title mb-md-1\\\">{{@title}}</h1>\\n      <p class=\\\"header-subtitle d-none d-sm-inline\\\">{{@description}}</p>\\n    </div>\\n    <div class=\\\"hstack gap-4 ms-auto align-items-center\\\">\\n      {{! Icons block}}\\n      <div class=\\\"me-2 d-lg-flex align-items-center justify-content-center\\\">\\n        {{#if this.onPage}}\\n          <a\\n            data-title=\\\"Bienvenue\\\"\\n            data-intro=\\\"Un petit coup de pouce pour les développeurs ici !\\\"\\n            href=\\\"#\\\"\\n            {{on \\\"click\\\" this.setDonationModal}}\\n            class=\\\"head-icon me-3\\\"\\n            {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n          >\\n            <App::Icon @icon=\\\"ion:gift-outline\\\" />\\n          </a>\\n          <a\\n            data-title=\\\"Bienvenue\\\"\\n            data-intro=\\\"Vous trouverez grâce à cette icône un calendrier pour vous aider à planifier à temps votre déclaration. Ici, impossible d'être en retard !\\\"\\n            href=\\\"#\\\"\\n            {{on \\\"click\\\" this.setCalendarModal}}\\n            class=\\\"head-icon me-3\\\"\\n            {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n          >\\n            <App::Icon @icon=\\\"ion:calendar-outline\\\" />\\n          </a>\\n          <a\\n            data-title=\\\"Bienvenue\\\"\\n            data-intro=\\\"Ce bouton CONFIGURATION vous permettra, dans l'hypothèse où vous travaillez hors ligne, de vous prévenir en cas de mise à jour de l'application. Dans ce cas, une pastille rouge sera visible... Soyez attentif !\\\"\\n            href=\\\"#\\\"\\n            {{on \\\"click\\\" this.setConfModal}}\\n            class=\\\"head-icon\\\"\\n            {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n          >\\n            <App::Icon @icon=\\\"ion:flower-sharp\\\" />\\n          </a>\\n        {{else}}\\n          <a\\n            data-title=\\\"Bienvenue\\\"\\n            data-intro=\\\"Un petit coup de pouce pour les développeurs ici !\\\"\\n            href=\\\"#\\\"\\n            {{on \\\"click\\\" this.setDonationModal}}\\n            class=\\\"head-icon me-3\\\"\\n            {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n          >\\n            <App::Icon @icon=\\\"ion:gift-outline\\\" />\\n          </a>\\n          <a\\n            data-title=\\\"Bienvenue\\\"\\n            data-intro=\\\"Vous trouverez grâce à cette icône un calendrier pour vous aider à planifier à temps votre déclaration. Ici, impossible d'être en retard !\\\"\\n            href=\\\"#\\\"\\n            {{on \\\"click\\\" this.setCalendarModal}}\\n            class=\\\"head-icon me-3\\\"\\n            data-test-app-header-calendrier-fiscal-button\\n          >\\n            <App::Icon @icon=\\\"ion:calendar-outline\\\" />\\n          </a>\\n          <a\\n            data-title=\\\"Bienvenue\\\"\\n            data-intro=\\\"Ce bouton CONFIGURATION vous permettra d'obtenir un statut de la persistance de vos donénes, la possiblité d'importer un fichier de configuration et dans l'hypothèse où vous travailleriez hors ligne de vous prévenir en cas de mise à jour de l'application (Dans ce cas, une pastille rouge sera visible...)\\\"\\n            href=\\\"#\\\"\\n            {{on \\\"click\\\" this.setConfModal}}\\n            class=\\\"head-icon\\\"\\n          >\\n            <App::Icon @icon=\\\"ion:flower-sharp\\\" />\\n\\n            {{#unless this.application.hasIndexedDb}}\\n              <span\\n                class=\\\"position-absolute bottom-0 start-100 translate-middle p-1 bg-danger border border-light rounded-circle\\\"\\n              >\\n                <span class=\\\"visually-hidden\\\"></span>\\n              </span>\\n              <BsTooltip @placement=\\\"bottom\\\">Action requise</BsTooltip>\\n            {{/unless}}\\n          </a>\\n        {{/if}}\\n      </div>\\n      <div class=\\\"vr align-self-center d-none d-xl-block h-25\\\"></div>\\n      <App::Header::EngineIndicator />\\n      <div class=\\\"vr align-self-center d-none d-xl-block h-25\\\"></div>\\n      {{! Identity people's block}}\\n      <div class=\\\"user-panel mt-3 pb-3 me-4 d-none d-xl-flex align-items-center\\\">\\n        <LinkTo @route=\\\"reports\\\" class=\\\"no-underline\\\">\\n          <img src=\\\"/header/people.png\\\" alt=\\\"people\\\" class=\\\"me-3 gender-img\\\" />\\n        </LinkTo>\\n        <div class=\\\"people-text info\\\">\\n          <LinkTo @route=\\\"reports\\\" class=\\\"no-underline\\\"><div class=\\\"identity d-block\\\">{{this.infos.surname}}\\n              {{this.infos.name}}</div></LinkTo>\\n          <LinkTo @route=\\\"reports\\\" class=\\\"no-underline\\\"><div class=\\\"number d-block\\\">{{this.infos.email}}</div></LinkTo>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</nav>\\n\\n<App::Header::ConfigurationModal @open={{this.confModal}} @onHidden={{this.close}} />\\n<App::Header::CalendrierFiscalModal @open={{this.calendarModal}} @onHidden={{this.close}} />\\n\\n{{! Edit modals Donation HTML }}\\n<BsModal @open={{this.donationModal}} @backdropClose={{false}} @onHidden={{this.hiddenDon}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">Donation</h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        <BsAlert class=\\\"ms-2 me-4 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n          Si vous souhaitez faire un don à l'outil afin de soutenir l'initiative et d'encourager les développeurs (pour\\n          par exemple des achats de noms de domaine, de l'hébergement, etc.), voici les addresses de don en crypto :\\n        </BsAlert>\\n        <div class=\\\"d-flex flex-column align-items-center w-100\\\">\\n          <span class=\\\"donate mb-3\\\">\\n            <span class=\\\"donate-in-btc\\\">\\n              <span class=\\\"text\\\">&#3647;</span>\\n              <span>bc1qpeeg8pu7a692nqt8kpxg5py5f35wl30rq2dfwf</span>\\n            </span>\\n          </span>\\n          <span class=\\\"donate mb-3\\\">\\n            <span class=\\\"donate-in-btc-lightning\\\">\\n              <span class=\\\"text\\\">\\n                <img src=\\\"/doc/btc-lightning.svg\\\" alt=\\\"bitcoin-lightning\\\" />\\n              </span>\\n              vexedlan65@walletofsatoshi.com\\n            </span>\\n          </span>\\n        </div>\\n      </div>\\n    </modal.body>\\n    <modal.footer class=\\\"justify-content-between\\\">\\n      <div class=\\\"d-flex justify-content-end w-100\\\">\\n        <div>\\n          <BsButton {{on \\\"click\\\" this.close}}>\\n            Fermer</BsButton>\\n        </div>\\n      </div>\\n    </modal.footer>\\n  </div>\\n</BsModal>\", {\"contents\":\"<nav class=\\\"justify-content-between slide-in-top header\\\">\\n  <div class=\\\"hstack gap-3 justify-content-around align-items-center\\\">\\n    <div class=\\\"d-flex flex-column justify-content-start ms-3 ms-md-1 my-2 my-md-2\\\">\\n      <h1 class=\\\"header-title mb-md-1\\\">{{@title}}</h1>\\n      <p class=\\\"header-subtitle d-none d-sm-inline\\\">{{@description}}</p>\\n    </div>\\n    <div class=\\\"hstack gap-4 ms-auto align-items-center\\\">\\n      {{! Icons block}}\\n      <div class=\\\"me-2 d-lg-flex align-items-center justify-content-center\\\">\\n        {{#if this.onPage}}\\n          <a\\n            data-title=\\\"Bienvenue\\\"\\n            data-intro=\\\"Un petit coup de pouce pour les développeurs ici !\\\"\\n            href=\\\"#\\\"\\n            {{on \\\"click\\\" this.setDonationModal}}\\n            class=\\\"head-icon me-3\\\"\\n            {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n          >\\n            <App::Icon @icon=\\\"ion:gift-outline\\\" />\\n          </a>\\n          <a\\n            data-title=\\\"Bienvenue\\\"\\n            data-intro=\\\"Vous trouverez grâce à cette icône un calendrier pour vous aider à planifier à temps votre déclaration. Ici, impossible d'être en retard !\\\"\\n            href=\\\"#\\\"\\n            {{on \\\"click\\\" this.setCalendarModal}}\\n            class=\\\"head-icon me-3\\\"\\n            {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n          >\\n            <App::Icon @icon=\\\"ion:calendar-outline\\\" />\\n          </a>\\n          <a\\n            data-title=\\\"Bienvenue\\\"\\n            data-intro=\\\"Ce bouton CONFIGURATION vous permettra, dans l'hypothèse où vous travaillez hors ligne, de vous prévenir en cas de mise à jour de l'application. Dans ce cas, une pastille rouge sera visible... Soyez attentif !\\\"\\n            href=\\\"#\\\"\\n            {{on \\\"click\\\" this.setConfModal}}\\n            class=\\\"head-icon\\\"\\n            {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n          >\\n            <App::Icon @icon=\\\"ion:flower-sharp\\\" />\\n          </a>\\n        {{else}}\\n          <a\\n            data-title=\\\"Bienvenue\\\"\\n            data-intro=\\\"Un petit coup de pouce pour les développeurs ici !\\\"\\n            href=\\\"#\\\"\\n            {{on \\\"click\\\" this.setDonationModal}}\\n            class=\\\"head-icon me-3\\\"\\n            {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n          >\\n            <App::Icon @icon=\\\"ion:gift-outline\\\" />\\n          </a>\\n          <a\\n            data-title=\\\"Bienvenue\\\"\\n            data-intro=\\\"Vous trouverez grâce à cette icône un calendrier pour vous aider à planifier à temps votre déclaration. Ici, impossible d'être en retard !\\\"\\n            href=\\\"#\\\"\\n            {{on \\\"click\\\" this.setCalendarModal}}\\n            class=\\\"head-icon me-3\\\"\\n            data-test-app-header-calendrier-fiscal-button\\n          >\\n            <App::Icon @icon=\\\"ion:calendar-outline\\\" />\\n          </a>\\n          <a\\n            data-title=\\\"Bienvenue\\\"\\n            data-intro=\\\"Ce bouton CONFIGURATION vous permettra d'obtenir un statut de la persistance de vos donénes, la possiblité d'importer un fichier de configuration et dans l'hypothèse où vous travailleriez hors ligne de vous prévenir en cas de mise à jour de l'application (Dans ce cas, une pastille rouge sera visible...)\\\"\\n            href=\\\"#\\\"\\n            {{on \\\"click\\\" this.setConfModal}}\\n            class=\\\"head-icon\\\"\\n          >\\n            <App::Icon @icon=\\\"ion:flower-sharp\\\" />\\n\\n            {{#unless this.application.hasIndexedDb}}\\n              <span\\n                class=\\\"position-absolute bottom-0 start-100 translate-middle p-1 bg-danger border border-light rounded-circle\\\"\\n              >\\n                <span class=\\\"visually-hidden\\\"></span>\\n              </span>\\n              <BsTooltip @placement=\\\"bottom\\\">Action requise</BsTooltip>\\n            {{/unless}}\\n          </a>\\n        {{/if}}\\n      </div>\\n      <div class=\\\"vr align-self-center d-none d-xl-block h-25\\\"></div>\\n      <App::Header::EngineIndicator />\\n      <div class=\\\"vr align-self-center d-none d-xl-block h-25\\\"></div>\\n      {{! Identity people's block}}\\n      <div class=\\\"user-panel mt-3 pb-3 me-4 d-none d-xl-flex align-items-center\\\">\\n        <LinkTo @route=\\\"reports\\\" class=\\\"no-underline\\\">\\n          <img src=\\\"/header/people.png\\\" alt=\\\"people\\\" class=\\\"me-3 gender-img\\\" />\\n        </LinkTo>\\n        <div class=\\\"people-text info\\\">\\n          <LinkTo @route=\\\"reports\\\" class=\\\"no-underline\\\"><div class=\\\"identity d-block\\\">{{this.infos.surname}}\\n              {{this.infos.name}}</div></LinkTo>\\n          <LinkTo @route=\\\"reports\\\" class=\\\"no-underline\\\"><div class=\\\"number d-block\\\">{{this.infos.email}}</div></LinkTo>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</nav>\\n\\n<App::Header::ConfigurationModal @open={{this.confModal}} @onHidden={{this.close}} />\\n<App::Header::CalendrierFiscalModal @open={{this.calendarModal}} @onHidden={{this.close}} />\\n\\n{{! Edit modals Donation HTML }}\\n<BsModal @open={{this.donationModal}} @backdropClose={{false}} @onHidden={{this.hiddenDon}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">Donation</h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        <BsAlert class=\\\"ms-2 me-4 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n          Si vous souhaitez faire un don à l'outil afin de soutenir l'initiative et d'encourager les développeurs (pour\\n          par exemple des achats de noms de domaine, de l'hébergement, etc.), voici les addresses de don en crypto :\\n        </BsAlert>\\n        <div class=\\\"d-flex flex-column align-items-center w-100\\\">\\n          <span class=\\\"donate mb-3\\\">\\n            <span class=\\\"donate-in-btc\\\">\\n              <span class=\\\"text\\\">&#3647;</span>\\n              <span>bc1qpeeg8pu7a692nqt8kpxg5py5f35wl30rq2dfwf</span>\\n            </span>\\n          </span>\\n          <span class=\\\"donate mb-3\\\">\\n            <span class=\\\"donate-in-btc-lightning\\\">\\n              <span class=\\\"text\\\">\\n                <img src=\\\"/doc/btc-lightning.svg\\\" alt=\\\"bitcoin-lightning\\\" />\\n              </span>\\n              vexedlan65@walletofsatoshi.com\\n            </span>\\n          </span>\\n        </div>\\n      </div>\\n    </modal.body>\\n    <modal.footer class=\\\"justify-content-between\\\">\\n      <div class=\\\"d-flex justify-content-end w-100\\\">\\n        <div>\\n          <BsButton {{on \\\"click\\\" this.close}}>\\n            Fermer</BsButton>\\n        </div>\\n      </div>\\n    </modal.footer>\\n  </div>\\n</BsModal>\",\"moduleName\":\"cryptofiscafacile-gui/components/app/header/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/app/header/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport type ApplicationService from 'cryptofiscafacile-gui/services/application';\nimport type Indexeddb from 'cryptofiscafacile-gui/services/indexeddb';\nimport type Wasm from 'cryptofiscafacile-gui/services/wasm';\n\nexport default class Header extends Component {\n  @service declare application: ApplicationService;\n  @service declare wasm: Wasm;\n  @service declare indexeddb: Indexeddb;\n\n  @tracked page = '';\n\n  constructor(owner: undefined, args: never) {\n    super(owner, args);\n    this.page = window.location.href;\n    this.wasm.getUserInfosTask.perform();\n\n    if (!this.application.hasIndexedDb) {\n      this.confModal = true;\n    }\n  }\n\n  get onPage() {\n    return this.page.includes('transactions') ?? false;\n  }\n\n  get infos() {\n    return this.wasm.userInfos;\n  }\n\n  @tracked confModal = false;\n  @tracked calendarModal = false;\n  @tracked donationModal = false;\n  @action\n  setConfModal() {\n    this.confModal = true;\n  }\n  @action\n  setCalendarModal() {\n    this.calendarModal = true;\n  }\n  @action\n  setDonationModal() {\n    this.donationModal = true;\n  }\n\n  @action\n  hiddenDon() {\n    //Placeholder - Do nothing\n  }\n\n  @action\n  close() {\n    if (this.application.hasIndexedDb) {\n      this.confModal = false;\n      this.calendarModal = false;\n      this.donationModal = false;\n    }\n  }\n  @action\n  onSuccess() {\n    debug('Copy to clipboard success');\n  }\n  @action\n  onError() {\n    debug('Copy to clipboard error... Please try again');\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<iconify-icon\\n  class=\\\"align-middle\\\"\\n  icon={{this.icon}}\\n  style={{if @color (html-safe (concat \\\"color: \\\" @color))}}\\n  ...attributes\\n></iconify-icon>\", {\"contents\":\"<iconify-icon\\n  class=\\\"align-middle\\\"\\n  icon={{this.icon}}\\n  style={{if @color (html-safe (concat \\\"color: \\\" @color))}}\\n  ...attributes\\n></iconify-icon>\",\"moduleName\":\"cryptofiscafacile-gui/components/app/icon.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/app/icon.hbs\"}});\nimport Component from '@glimmer/component';\nimport { warn } from '@ember/debug';\n\nimport { iconExists } from 'iconify-icon';\n\ninterface AppIconArgs {\n  icon: string;\n}\n\nexport default class AppIcon extends Component<AppIconArgs> {\n  get icon() {\n    let cffIcon = `cff:${this.args.icon}`;\n\n    if (!iconExists(cffIcon)) {\n      warn(`icon ${this.args.icon} not found. please add ${cffIcon} to offline-iconify-icons-loader.ts`, {\n        id: 'icon-not-found',\n      });\n\n      return this.args.icon;\n    }\n\n    return cffIcon;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"d-flex flex-sm-column flex-row flex-grow-1 align-items-center align-items-sm-start px-2 pt-md-2 text-white slide-in-left custom-sidebar\\\"\\n>\\n  {{! Sidebar Logo }}\\n  <LinkTo\\n    class=\\\"d-flex align-items-center pb-sm-3 mb-md-0 me-md-auto mt-3 mb-3 mb-md-0 ms-1 link-dark text-decoration-none\\\"\\n    data-title=\\\"Bienvenue\\\"\\n    data-intro=\\\"Bienvenue sur l'application CryptoFiscaFacile 👋 Nous sommes ravis de vous aider dans votre déclaration de cryptomonnaies. Notre objectif est de rendre plus lisible les sommes engendrées par vos transactions et plus simple le calcul de leur imposition potentielle. Afin de vous guider dans toutes les étapes, suivez ce même logo sur toutes les pages de l'application. Prêt ? Allons-y ...\\\"\\n    @route=\\\"index\\\"\\n  >\\n    <span class=\\\"fs-5\\\">\\n      <img src=\\\"/sidebar/logo.png\\\" alt=\\\"Cryptofiscafacile\\\" class=\\\"logo-cff\\\" />\\n      <span class=\\\"d-none d-sm-inline font-weight-light logo-text\\\">CryptoFiscaFacile</span>\\n    </span>\\n  </LinkTo>\\n\\n  {{! Sidebar Menu }}\\n  <ul\\n    class=\\\"nav nav-pills flex-sm-column flex-row flex-nowrap flex-shrink-1 flex-sm-grow-0 flex-grow-1 mt-sm-3 mb-sm-auto mb-0 justify-content-center align-items-center align-items-sm-start\\\"\\n    id=\\\"menu\\\"\\n  >\\n    <li\\n      class=\\\"nav-item\\\"\\n      data-title=\\\"Bienvenue\\\"\\n      data-intro=\\\"Retrouvez ici la page sur laquelle nous sommes, qui vous présente un résumé de vos portefeuilles afin de suivre leurs évolutions...\\\"\\n    >\\n      <LinkTo class=\\\"nav-link px-sm-0 px-2 pe-0\\\" @route=\\\"index\\\">\\n        <App::Icon @icon=\\\"ion:bar-chart-outline\\\" class=\\\"nav-icon bi me-2\\\" />\\n        <p class=\\\"nav-font ms-1 d-none d-sm-inline\\\">Synthèse</p>\\n      </LinkTo>\\n    </li>\\n    <li\\n      class=\\\"nav-item\\\"\\n      data-title=\\\"Bienvenue\\\"\\n      data-intro=\\\"Cette page vous servira à importer manuellement vos fichiers, qu'ils soient de type CSV ou XLSX ou JSON ; lle vient en complément en synthèse de la page Outils qui fournit une importation via API, car nous imaginons bien que les API ne couvriront pas la totalité de vos portefeuilles 😉 c'est pourquoi nous avons prévu cet import dit 'manuel'. Page donc cruciale qui permettra de visualiser l'import de TOUTES vos transactions...\\\"\\n    >\\n      <LinkTo @route=\\\"wallets\\\" class=\\\"nav-link px-sm-0 px-2 pe-0\\\">\\n        <App::Icon @icon=\\\"ion:wallet-outline\\\" class=\\\"nav-icon bi me-2\\\" />\\n        <p class=\\\"nav-font ms-1 d-none d-sm-inline\\\">Portefeuilles</p>\\n      </LinkTo>\\n    </li>\\n    <li\\n      class=\\\"nav-item ps-1 ps-md-3\\\"\\n      data-title=\\\"Bienvenue\\\"\\n      data-intro=\\\"Afin de faciliter l'import de vos transactions, cette page vous permettra d'ajouter des données API afin d'extraire automatiquement des transactions...\\\"\\n    >\\n      <LinkTo @route=\\\"tools\\\" class=\\\"nav-link px-sm-0 px-2 pe-0\\\">\\n        <App::Icon @icon=\\\"ion:hammer-outline\\\" class=\\\"nav-icon bi me-2\\\" />\\n        <p class=\\\"nav-font ms-1 d-none d-sm-inline\\\">Outils (API)</p>\\n      </LinkTo>\\n    </li>\\n    <li\\n      class=\\\"nav-item\\\"\\n      data-title=\\\"Bienvenue\\\"\\n      data-intro=\\\"Seconde étape cruciale, l'observation et la catégorisation finale de vos transactions : le moteur CryptoFiscaFacile est capable de produire des rapprochements ou des fusions de transactions. Néanmoins lorsqu'il existe un doute, celui-ci vous proposera toujours de choisir parmi des options. Cette page vous permettra donc de valider la complétude de vos transactions...\\\"\\n    >\\n      <LinkTo @route=\\\"transactions\\\" class=\\\"nav-link px-sm-0 px-2 pe-0\\\">\\n        <App::Icon @icon=\\\"ion:list-outline\\\" class=\\\"nav-icon bi me-2\\\" />\\n        <p class=\\\"nav-font ms-1 d-none d-sm-inline\\\">Transactions</p>\\n      </LinkTo>\\n    </li>\\n    <li\\n      class=\\\"nav-item\\\"\\n      data-title=\\\"Bienvenue\\\"\\n      data-intro=\\\"Enfin, il vous sera possible de générer les données que vous devrez donner à l'administration grâce à cette page...\\\"\\n    >\\n      <LinkTo @route=\\\"reports\\\" class=\\\"nav-link px-sm-0 px-2 pe-0\\\">\\n        <App::Icon @icon=\\\"ion:clipboard-outline\\\" class=\\\"nav-icon bi me-2\\\" />\\n        <p class=\\\"nav-font ms-1 d-none d-sm-inline\\\">Rapports</p>\\n      </LinkTo>\\n    </li>\\n    <li\\n      class=\\\"nav-item\\\"\\n      data-title=\\\"Bienvenue\\\"\\n      data-intro=\\\"Nous avons ajouté bien entendu une documentation complète afin de vous donner les détails nécessaires à la compréhension des termes et usages liés à cette déclaration...\\\"\\n    >\\n      <LinkTo @route=\\\"document\\\" class=\\\"nav-link px-sm-0 px-2 pe-0\\\">\\n        <App::Icon @icon=\\\"ion:library-outline\\\" class=\\\"nav-icon bi me-2\\\" />\\n        <p class=\\\"nav-font ms-1 d-none d-sm-inline\\\">Documentation</p>\\n      </LinkTo>\\n    </li>\\n  </ul>\\n\\n  {{! Sidebar Leave Part }}\\n  <div class=\\\"dropdown py-sm-4 mt-sm-auto ms-auto ms-sm-0 flex-shrink-1\\\">\\n    <div class=\\\"w-100 d-flex flex-column leave\\\">\\n      <div class=\\\"leave-img d-none d-sm-inline mx-1\\\"><img alt=\\\"leave-img\\\" src=\\\"/sidebar/quit.png\\\" /></div>\\n      <div class=\\\"mb-2 mt-2 leave-comment d-none d-sm-inline mx-1\\\">\\n        <p class=\\\"mb-0\\\">N’hésitez pas à laisser un commentaire sur le Gitlab du projet:</p>\\n        <App::ExternalLink href=\\\"https://gitlab.com/c1560/cryptofiscafacile\\\"><span\\n          >https://gitlab.com/c1560/cryptofiscafacile</span></App::ExternalLink>\\n      </div>\\n      <div>\\n        <div\\n          class=\\\"d-flex align-items-center p-2\\\"\\n          data-title=\\\"Bienvenue\\\"\\n          data-intro=\\\"Afin de vous garantir la disponibilité de vos données mis en cache, et afin d'éviter de passer de nouveau du temps dans l'import et la catégorisation, ce bouton vous permet d'exporter dans un fichier toute votre configuration. Ainsi il vous sera possible de migrer sur un autre ordinateur, ou de changer de navigateur tout en retrouvant votre avancement !\\\"\\n        >\\n          <BsButton\\n            @type=\\\"primary\\\"\\n            @size=\\\"sm\\\"\\n            class=\\\"btn-sm btn-text-center btn-style p-2\\\"\\n            @onClick={{this.onExportConfig}}\\n          >\\n            <span class=\\\"quit-txt d-none d-sm-inline mx-1\\\">Exporter Configuration</span>\\n            <App::Icon class=\\\"ms-1 ms-md-0\\\" @icon=\\\"ion:exit-outline\\\" @width=\\\"14\\\" />\\n          </BsButton>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\", {\"contents\":\"<div\\n  class=\\\"d-flex flex-sm-column flex-row flex-grow-1 align-items-center align-items-sm-start px-2 pt-md-2 text-white slide-in-left custom-sidebar\\\"\\n>\\n  {{! Sidebar Logo }}\\n  <LinkTo\\n    class=\\\"d-flex align-items-center pb-sm-3 mb-md-0 me-md-auto mt-3 mb-3 mb-md-0 ms-1 link-dark text-decoration-none\\\"\\n    data-title=\\\"Bienvenue\\\"\\n    data-intro=\\\"Bienvenue sur l'application CryptoFiscaFacile 👋 Nous sommes ravis de vous aider dans votre déclaration de cryptomonnaies. Notre objectif est de rendre plus lisible les sommes engendrées par vos transactions et plus simple le calcul de leur imposition potentielle. Afin de vous guider dans toutes les étapes, suivez ce même logo sur toutes les pages de l'application. Prêt ? Allons-y ...\\\"\\n    @route=\\\"index\\\"\\n  >\\n    <span class=\\\"fs-5\\\">\\n      <img src=\\\"/sidebar/logo.png\\\" alt=\\\"Cryptofiscafacile\\\" class=\\\"logo-cff\\\" />\\n      <span class=\\\"d-none d-sm-inline font-weight-light logo-text\\\">CryptoFiscaFacile</span>\\n    </span>\\n  </LinkTo>\\n\\n  {{! Sidebar Menu }}\\n  <ul\\n    class=\\\"nav nav-pills flex-sm-column flex-row flex-nowrap flex-shrink-1 flex-sm-grow-0 flex-grow-1 mt-sm-3 mb-sm-auto mb-0 justify-content-center align-items-center align-items-sm-start\\\"\\n    id=\\\"menu\\\"\\n  >\\n    <li\\n      class=\\\"nav-item\\\"\\n      data-title=\\\"Bienvenue\\\"\\n      data-intro=\\\"Retrouvez ici la page sur laquelle nous sommes, qui vous présente un résumé de vos portefeuilles afin de suivre leurs évolutions...\\\"\\n    >\\n      <LinkTo class=\\\"nav-link px-sm-0 px-2 pe-0\\\" @route=\\\"index\\\">\\n        <App::Icon @icon=\\\"ion:bar-chart-outline\\\" class=\\\"nav-icon bi me-2\\\" />\\n        <p class=\\\"nav-font ms-1 d-none d-sm-inline\\\">Synthèse</p>\\n      </LinkTo>\\n    </li>\\n    <li\\n      class=\\\"nav-item\\\"\\n      data-title=\\\"Bienvenue\\\"\\n      data-intro=\\\"Cette page vous servira à importer manuellement vos fichiers, qu'ils soient de type CSV ou XLSX ou JSON ; lle vient en complément en synthèse de la page Outils qui fournit une importation via API, car nous imaginons bien que les API ne couvriront pas la totalité de vos portefeuilles 😉 c'est pourquoi nous avons prévu cet import dit 'manuel'. Page donc cruciale qui permettra de visualiser l'import de TOUTES vos transactions...\\\"\\n    >\\n      <LinkTo @route=\\\"wallets\\\" class=\\\"nav-link px-sm-0 px-2 pe-0\\\">\\n        <App::Icon @icon=\\\"ion:wallet-outline\\\" class=\\\"nav-icon bi me-2\\\" />\\n        <p class=\\\"nav-font ms-1 d-none d-sm-inline\\\">Portefeuilles</p>\\n      </LinkTo>\\n    </li>\\n    <li\\n      class=\\\"nav-item ps-1 ps-md-3\\\"\\n      data-title=\\\"Bienvenue\\\"\\n      data-intro=\\\"Afin de faciliter l'import de vos transactions, cette page vous permettra d'ajouter des données API afin d'extraire automatiquement des transactions...\\\"\\n    >\\n      <LinkTo @route=\\\"tools\\\" class=\\\"nav-link px-sm-0 px-2 pe-0\\\">\\n        <App::Icon @icon=\\\"ion:hammer-outline\\\" class=\\\"nav-icon bi me-2\\\" />\\n        <p class=\\\"nav-font ms-1 d-none d-sm-inline\\\">Outils (API)</p>\\n      </LinkTo>\\n    </li>\\n    <li\\n      class=\\\"nav-item\\\"\\n      data-title=\\\"Bienvenue\\\"\\n      data-intro=\\\"Seconde étape cruciale, l'observation et la catégorisation finale de vos transactions : le moteur CryptoFiscaFacile est capable de produire des rapprochements ou des fusions de transactions. Néanmoins lorsqu'il existe un doute, celui-ci vous proposera toujours de choisir parmi des options. Cette page vous permettra donc de valider la complétude de vos transactions...\\\"\\n    >\\n      <LinkTo @route=\\\"transactions\\\" class=\\\"nav-link px-sm-0 px-2 pe-0\\\">\\n        <App::Icon @icon=\\\"ion:list-outline\\\" class=\\\"nav-icon bi me-2\\\" />\\n        <p class=\\\"nav-font ms-1 d-none d-sm-inline\\\">Transactions</p>\\n      </LinkTo>\\n    </li>\\n    <li\\n      class=\\\"nav-item\\\"\\n      data-title=\\\"Bienvenue\\\"\\n      data-intro=\\\"Enfin, il vous sera possible de générer les données que vous devrez donner à l'administration grâce à cette page...\\\"\\n    >\\n      <LinkTo @route=\\\"reports\\\" class=\\\"nav-link px-sm-0 px-2 pe-0\\\">\\n        <App::Icon @icon=\\\"ion:clipboard-outline\\\" class=\\\"nav-icon bi me-2\\\" />\\n        <p class=\\\"nav-font ms-1 d-none d-sm-inline\\\">Rapports</p>\\n      </LinkTo>\\n    </li>\\n    <li\\n      class=\\\"nav-item\\\"\\n      data-title=\\\"Bienvenue\\\"\\n      data-intro=\\\"Nous avons ajouté bien entendu une documentation complète afin de vous donner les détails nécessaires à la compréhension des termes et usages liés à cette déclaration...\\\"\\n    >\\n      <LinkTo @route=\\\"document\\\" class=\\\"nav-link px-sm-0 px-2 pe-0\\\">\\n        <App::Icon @icon=\\\"ion:library-outline\\\" class=\\\"nav-icon bi me-2\\\" />\\n        <p class=\\\"nav-font ms-1 d-none d-sm-inline\\\">Documentation</p>\\n      </LinkTo>\\n    </li>\\n  </ul>\\n\\n  {{! Sidebar Leave Part }}\\n  <div class=\\\"dropdown py-sm-4 mt-sm-auto ms-auto ms-sm-0 flex-shrink-1\\\">\\n    <div class=\\\"w-100 d-flex flex-column leave\\\">\\n      <div class=\\\"leave-img d-none d-sm-inline mx-1\\\"><img alt=\\\"leave-img\\\" src=\\\"/sidebar/quit.png\\\" /></div>\\n      <div class=\\\"mb-2 mt-2 leave-comment d-none d-sm-inline mx-1\\\">\\n        <p class=\\\"mb-0\\\">N’hésitez pas à laisser un commentaire sur le Gitlab du projet:</p>\\n        <App::ExternalLink href=\\\"https://gitlab.com/c1560/cryptofiscafacile\\\"><span\\n          >https://gitlab.com/c1560/cryptofiscafacile</span></App::ExternalLink>\\n      </div>\\n      <div>\\n        <div\\n          class=\\\"d-flex align-items-center p-2\\\"\\n          data-title=\\\"Bienvenue\\\"\\n          data-intro=\\\"Afin de vous garantir la disponibilité de vos données mis en cache, et afin d'éviter de passer de nouveau du temps dans l'import et la catégorisation, ce bouton vous permet d'exporter dans un fichier toute votre configuration. Ainsi il vous sera possible de migrer sur un autre ordinateur, ou de changer de navigateur tout en retrouvant votre avancement !\\\"\\n        >\\n          <BsButton\\n            @type=\\\"primary\\\"\\n            @size=\\\"sm\\\"\\n            class=\\\"btn-sm btn-text-center btn-style p-2\\\"\\n            @onClick={{this.onExportConfig}}\\n          >\\n            <span class=\\\"quit-txt d-none d-sm-inline mx-1\\\">Exporter Configuration</span>\\n            <App::Icon class=\\\"ms-1 ms-md-0\\\" @icon=\\\"ion:exit-outline\\\" @width=\\\"14\\\" />\\n          </BsButton>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/app/main-sidebar.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/app/main-sidebar.hbs\"}});\nimport Component from '@glimmer/component';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport FileSaver from 'file-saver';\nimport JSZip from 'jszip';\n\nimport type Indexeddb from 'cryptofiscafacile-gui/services/indexeddb';\n\nexport default class MainSidebar extends Component {\n  @service declare indexeddb: Indexeddb;\n\n  @action\n  async onExportConfig() {\n    let zip = new JSZip();\n\n    try {\n      await this.indexeddb.exportDatabaseTask.perform('cff');\n      await this.indexeddb.exportDatabaseTask.perform('wasm-db-confs');\n      await this.indexeddb.exportDatabaseTask.perform('wasm-db-files');\n      await this.indexeddb.exportDatabaseTask.perform('wasm-db-rates');\n      await this.indexeddb.exportDatabaseTask.perform('wasm-db-txs');\n    } catch (err) {\n      debug('export : ' + (err as Error).message);\n    } finally {\n      let files = this.indexeddb.files;\n\n      if (files) {\n        files.forEach((file) => {\n          zip.file(file.name + '.json', file);\n        });\n      }\n\n      zip.generateAsync({ type: 'blob' }).then(function (blob) {\n        FileSaver.saveAs(blob, 'cff-dbs.cff');\n        debug('export-confs : ' + '__cff-dbs.cff__');\n      });\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsModal @open={{@open}} @backdropClose={{false}} @onHidden={{@onHidden}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">\\n        <App::Icon @icon=\\\"ion:sparkles-outline\\\" />\\n        Nouvelle version CFF\\n        {{this.application.version}}\\n        <App::Icon @icon=\\\"ion:sparkles-outline\\\" />\\n      </h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        <BsAlert @type=\\\"info\\\" @dismissible={{false}}>\\n          <p>Une nouvelle version de CFF est sortie.</p>\\n        </BsAlert>\\n        {{#if this.application.persistedVersion}}\\n          <p>Vos données sont actuellement en version {{this.application.persistedVersion}}.</p>\\n        {{/if}}\\n\\n        <p>Vous trouverez tous les détails de cette mise à jour ici:\\n          <App::ExternalLink\\n            href=\\\"https://gitlab.com/c1560/cryptofiscafacile/-/releases/v{{this.application.version}}\\\"\\n          >https://gitlab.com/c1560/cryptofiscafacile/-/releases/v{{this.application.version}}\\n          </App::ExternalLink>\\n        </p>\\n      </div>\\n    </modal.body>\\n    {{#if @onHidden}}\\n      <modal.footer class=\\\"justify-content-between\\\">\\n        <div class=\\\"d-flex justify-content-end w-100\\\">\\n          <div>\\n            <BsButton {{on \\\"click\\\" this.close}}>Fermer</BsButton>\\n          </div>\\n        </div>\\n      </modal.footer>\\n    {{/if}}\\n  </div>\\n</BsModal>\", {\"contents\":\"<BsModal @open={{@open}} @backdropClose={{false}} @onHidden={{@onHidden}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">\\n        <App::Icon @icon=\\\"ion:sparkles-outline\\\" />\\n        Nouvelle version CFF\\n        {{this.application.version}}\\n        <App::Icon @icon=\\\"ion:sparkles-outline\\\" />\\n      </h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        <BsAlert @type=\\\"info\\\" @dismissible={{false}}>\\n          <p>Une nouvelle version de CFF est sortie.</p>\\n        </BsAlert>\\n        {{#if this.application.persistedVersion}}\\n          <p>Vos données sont actuellement en version {{this.application.persistedVersion}}.</p>\\n        {{/if}}\\n\\n        <p>Vous trouverez tous les détails de cette mise à jour ici:\\n          <App::ExternalLink\\n            href=\\\"https://gitlab.com/c1560/cryptofiscafacile/-/releases/v{{this.application.version}}\\\"\\n          >https://gitlab.com/c1560/cryptofiscafacile/-/releases/v{{this.application.version}}\\n          </App::ExternalLink>\\n        </p>\\n      </div>\\n    </modal.body>\\n    {{#if @onHidden}}\\n      <modal.footer class=\\\"justify-content-between\\\">\\n        <div class=\\\"d-flex justify-content-end w-100\\\">\\n          <div>\\n            <BsButton {{on \\\"click\\\" this.close}}>Fermer</BsButton>\\n          </div>\\n        </div>\\n      </modal.footer>\\n    {{/if}}\\n  </div>\\n</BsModal>\",\"moduleName\":\"cryptofiscafacile-gui/components/app/new-version-modal.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/app/new-version-modal.hbs\"}});\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport type ApplicationService from 'cryptofiscafacile-gui/services/application';\n\ninterface AppNewVersionModalArgs {\n  open: boolean;\n  onHidden?: () => void;\n}\n\nexport default class AppNewVersionModal extends Component<AppNewVersionModalArgs> {\n  @service declare application: ApplicationService;\n\n  @action\n  close() {\n    if (this.args.onHidden) {\n      this.args.onHidden();\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"d-flex text-center py-1 w-md-25\\\" ...attributes>\\n  <BsButton @type=\\\"primary\\\" @size=\\\"sm\\\" class=\\\"color-btn\\\" {{on \\\"click\\\" this.firstPage}}>\\n    <App::Icon @icon=\\\"ion:play-forward-circle-outline\\\" width=\\\"20\\\" class=\\\"m-0 p-0\\\" rotate={{2}} />\\n  </BsButton>\\n  <BsButton @type=\\\"primary\\\" @size=\\\"sm\\\" class=\\\"color-btn\\\" {{on \\\"click\\\" this.previousPage}}>\\n    <App::Icon @icon=\\\"ion:play-circle-outline\\\" width=\\\"20\\\" class=\\\"m-0 p-0\\\" rotate={{2}} />\\n  </BsButton>\\n  <span class=\\\"d-flex font-small mx-3\\\">\\n    <Input\\n      @type=\\\"number\\\"\\n      @value={{this.page}}\\n      class=\\\"font-small form-control form-control-sm m-0 me-1\\\"\\n      id=\\\"userPage\\\"\\n      min=\\\"1\\\"\\n      max={{@maxPage}}\\n      {{on \\\"input\\\" this.handlePageInputOnInput}}\\n    />\\n    <p class=\\\"d-none d-xl-inline m-0 label-paddingtop\\\">\\n      /\\n      {{@maxPage}}\\n    </p>\\n  </span>\\n  <BsButton @type=\\\"primary\\\" @size=\\\"sm\\\" class=\\\"color-btn\\\" {{on \\\"click\\\" this.nextPage}}>\\n    <App::Icon @icon=\\\"ion:play-circle-outline\\\" width=\\\"20\\\" class=\\\"m-0 p-0\\\" />\\n  </BsButton>\\n  <BsButton @type=\\\"primary\\\" @size=\\\"sm\\\" class=\\\"color-btn\\\" {{on \\\"click\\\" this.lastPage}}>\\n    <App::Icon @icon=\\\"ion:play-forward-circle-outline\\\" width=\\\"20\\\" class=\\\"m-0 p-0\\\" />\\n  </BsButton>\\n</div>\", {\"contents\":\"<div class=\\\"d-flex text-center py-1 w-md-25\\\" ...attributes>\\n  <BsButton @type=\\\"primary\\\" @size=\\\"sm\\\" class=\\\"color-btn\\\" {{on \\\"click\\\" this.firstPage}}>\\n    <App::Icon @icon=\\\"ion:play-forward-circle-outline\\\" width=\\\"20\\\" class=\\\"m-0 p-0\\\" rotate={{2}} />\\n  </BsButton>\\n  <BsButton @type=\\\"primary\\\" @size=\\\"sm\\\" class=\\\"color-btn\\\" {{on \\\"click\\\" this.previousPage}}>\\n    <App::Icon @icon=\\\"ion:play-circle-outline\\\" width=\\\"20\\\" class=\\\"m-0 p-0\\\" rotate={{2}} />\\n  </BsButton>\\n  <span class=\\\"d-flex font-small mx-3\\\">\\n    <Input\\n      @type=\\\"number\\\"\\n      @value={{this.page}}\\n      class=\\\"font-small form-control form-control-sm m-0 me-1\\\"\\n      id=\\\"userPage\\\"\\n      min=\\\"1\\\"\\n      max={{@maxPage}}\\n      {{on \\\"input\\\" this.handlePageInputOnInput}}\\n    />\\n    <p class=\\\"d-none d-xl-inline m-0 label-paddingtop\\\">\\n      /\\n      {{@maxPage}}\\n    </p>\\n  </span>\\n  <BsButton @type=\\\"primary\\\" @size=\\\"sm\\\" class=\\\"color-btn\\\" {{on \\\"click\\\" this.nextPage}}>\\n    <App::Icon @icon=\\\"ion:play-circle-outline\\\" width=\\\"20\\\" class=\\\"m-0 p-0\\\" />\\n  </BsButton>\\n  <BsButton @type=\\\"primary\\\" @size=\\\"sm\\\" class=\\\"color-btn\\\" {{on \\\"click\\\" this.lastPage}}>\\n    <App::Icon @icon=\\\"ion:play-forward-circle-outline\\\" width=\\\"20\\\" class=\\\"m-0 p-0\\\" />\\n  </BsButton>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/app/page-navigator.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/app/page-navigator.hbs\"}});\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\n\ninterface AppPageNavigatorArgs {\n  userPage: number;\n  maxPage: number;\n  onUserPageChanged: (value: number) => void;\n}\n\nexport default class AppPageNavigator extends Component<AppPageNavigatorArgs> {\n  get page() {\n    return Math.min(this.args.maxPage, this.args.userPage);\n  }\n\n  @action\n  handlePageInputOnInput(inputEvent: Event): void {\n    const userPage = Number((inputEvent.target as HTMLInputElement).value);\n\n    this.args.onUserPageChanged(Math.min(userPage, this.args.maxPage));\n  }\n\n  @action\n  firstPage() {\n    this.args.onUserPageChanged(1);\n  }\n\n  @action\n  lastPage() {\n    this.args.onUserPageChanged(this.args.maxPage);\n  }\n\n  @action\n  nextPage() {\n    this.args.onUserPageChanged(Math.min(this.page + 1, this.args.maxPage));\n  }\n\n  @action\n  previousPage() {\n    this.args.onUserPageChanged(Math.max(1, this.page - 1));\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"offcanvas-body\\\">\\n  {{yield}}\\n</div>\", {\"contents\":\"<div class=\\\"offcanvas-body\\\">\\n  {{yield}}\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/bs/offcanvas/body.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/bs/offcanvas/body.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"offcanvas-header\\\">\\n  {{yield}}\\n</div>\", {\"contents\":\"<div class=\\\"offcanvas-header\\\">\\n  {{yield}}\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/bs/offcanvas/header.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/bs/offcanvas/header.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div id={{@id}} class=\\\"offcanvas offcanvas-start\\\" tabindex=\\\"-1\\\" data-bs-backdrop=\\\"false\\\">\\n  {{yield}}\\n</div>\", {\"contents\":\"<div id={{@id}} class=\\\"offcanvas offcanvas-start\\\" tabindex=\\\"-1\\\" data-bs-backdrop=\\\"false\\\">\\n  {{yield}}\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/bs/offcanvas/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/bs/offcanvas/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if @synth}}\\n  <EmberFlatpickr\\n    placeholder=\\\"Choisissez la période...\\\"\\n    @date={{@dates}}\\n    @locale=\\\"fr\\\"\\n    @onChange={{null}}\\n    @onClose={{this.onClose}}\\n    @maxDate={{this.max}}\\n    @minDate={{this.min}}\\n    @dateFormat=\\\"d M Y\\\"\\n    @mode=\\\"range\\\"\\n    class=\\\"form-select form-select-sm calendar-icon\\\"\\n    aria-label=\\\".form-select-sm\\\"\\n    data-test-calendar-input\\n  />\\n{{else}}\\n  <div class=\\\"d-flex justify-content-between\\\">\\n    <label for=\\\"datetimepickerBeg\\\">Dates</label>\\n    {{! template-lint-disable no-invalid-interactive }}\\n    <span class=\\\"clickable-filter\\\" {{on \\\"click\\\" this.unfilter}}>Effacer Filtre</span>\\n  </div>\\n  <EmberFlatpickr\\n    placeholder=\\\"Choisissez la période...\\\"\\n    @date={{@dates}}\\n    @locale=\\\"fr\\\"\\n    @onChange={{null}}\\n    @onClose={{this.onClose}}\\n    @mode=\\\"range\\\"\\n    class=\\\"form-select form-select-sm calendar-icon\\\"\\n    aria-label=\\\".form-select-sm\\\"\\n    data-test-calendar-input\\n  />\\n{{/if}}\", {\"contents\":\"{{#if @synth}}\\n  <EmberFlatpickr\\n    placeholder=\\\"Choisissez la période...\\\"\\n    @date={{@dates}}\\n    @locale=\\\"fr\\\"\\n    @onChange={{null}}\\n    @onClose={{this.onClose}}\\n    @maxDate={{this.max}}\\n    @minDate={{this.min}}\\n    @dateFormat=\\\"d M Y\\\"\\n    @mode=\\\"range\\\"\\n    class=\\\"form-select form-select-sm calendar-icon\\\"\\n    aria-label=\\\".form-select-sm\\\"\\n    data-test-calendar-input\\n  />\\n{{else}}\\n  <div class=\\\"d-flex justify-content-between\\\">\\n    <label for=\\\"datetimepickerBeg\\\">Dates</label>\\n    {{! template-lint-disable no-invalid-interactive }}\\n    <span class=\\\"clickable-filter\\\" {{on \\\"click\\\" this.unfilter}}>Effacer Filtre</span>\\n  </div>\\n  <EmberFlatpickr\\n    placeholder=\\\"Choisissez la période...\\\"\\n    @date={{@dates}}\\n    @locale=\\\"fr\\\"\\n    @onChange={{null}}\\n    @onClose={{this.onClose}}\\n    @mode=\\\"range\\\"\\n    class=\\\"form-select form-select-sm calendar-icon\\\"\\n    aria-label=\\\".form-select-sm\\\"\\n    data-test-calendar-input\\n  />\\n{{/if}}\",\"moduleName\":\"cryptofiscafacile-gui/components/calendar/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/calendar/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\n\ninterface CalendarArgs {\n  dates: Date[];\n  onChange: (dates: Date[]) => void;\n}\n\nexport default class Calendar extends Component<CalendarArgs> {\n  @tracked min = new Date(2013, 4, 30);\n  @tracked max: Date = ((d) => new Date(d.setDate(d.getDate() - 1)))(new Date());\n  @tracked step = new Date();\n\n  @action\n  onClose(selectedDates: Date[]) {\n    this.args.onChange(selectedDates);\n  }\n\n  /**\n   * Unfillter is only callable from FILTER\n   * feature\n   * @memberof Calendar\n   */\n  @action\n  unfilter() {\n    this.args.onChange([]);\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@glimmer/component' {\n  interface Registry {\n    'calendar-component': Calendar;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h4>Ce que propose CryptoFiscaFacile...</h4>\\n<p>Après avoir importé toutes vos transactions (<strong>n'hésitez pas à lire le manuel en section 5.</strong>), les\\n  portefeuilles d'actifs apparaitront...</p>\\n<h5>CERFA 3916 - Comptes à l’étranger</h5>\\n<p>Afin de pouvoir vous aider à générer rapidement ce formulaire, qui pour rappel consiste\\n  <strong>uniquement</strong>\\n  à déclarer vos comptes, CryptoFiscaFacile vous permet de donner toutes les informations nécessaires à ces\\n  déclarations, via la page\\n  <LinkTo @route=\\\"reports\\\">Rapports</LinkTo>\\n  et sa section \\\"Données de comptes utilisateurs (CERFA 3916)\\\" dédiée, à remplir avec soin :</p>\\n<p>1. Ici se retrouve la liste de <strong>TOUS</strong> vos portefeuilles 'Custodial' :</p>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/custodial.png\\\" alt=\\\"custodial\\\" class=\\\"w-100\\\" />\\n</div>\\n\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  Note: Attention, tous vos comptes '<strong>Non Custodial</strong>' n'apparaîtront pas ici. C’est donc normal que cette\\n  liste ne corresponde pas tout à fait à la liste de tous vos portefeuilles.\\n</BsAlert>\\n\\n<p class=\\\"list-step\\\">2. Pour chacun de ces portefeuilles 'Custodial' :\\n  <ol>\\n    <li>a. Vous devrez ajouter, le cas échéant, le nombre de 'COMPTES' détenus (il se peut que vous ayez plusieurs\\n      comptes sur un même portefeuille)</li>\\n    <li>b. Puis vous devrez vérifier attentivement la date d’ouverture. CryptoFiscaFacile vous propose une date, basée\\n      sur la toute première TX que le moteur aura détectée sur ce portefeuille. Cette méthode est empirique et nécessite\\n      un contrôle</li>\\n    <li>c. Si un compte a été clos durant l’exercice fiscal concerné (par exemple : pour 2022, si vous avez clôturé un\\n      compte en 2021, c’est ici que vous devrez le déclarer). Cochez la case et entrez la date de clôture effective</li>\\n    <li>d. Enfin, entrez l’identification de votre ou vos comptes sur ce portefeuille. Ce champ est obligatoire et peut\\n      autant être une adresse e-mail qu'un numéro bien précis</li>\\n  </ol>\\n</p>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/custodial_step.png\\\" alt=\\\"custodial-guide\\\" class=\\\"w-100\\\" />\\n</div>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  Note : afin de trouver les dates d’ouverture et de fermeture, il est souvent conseillé de retrouver les anciens\\n  e-mails échangés avec cette plateforme. Dans le cas où aucun e-mail n’a été gardé, il est possible de prendre contact\\n  avec la plateforme et d’en demander la date effective (bien que parfois il n’y ait pas de réponse).\\n</BsAlert>\", {\"contents\":\"<h4>Ce que propose CryptoFiscaFacile...</h4>\\n<p>Après avoir importé toutes vos transactions (<strong>n'hésitez pas à lire le manuel en section 5.</strong>), les\\n  portefeuilles d'actifs apparaitront...</p>\\n<h5>CERFA 3916 - Comptes à l’étranger</h5>\\n<p>Afin de pouvoir vous aider à générer rapidement ce formulaire, qui pour rappel consiste\\n  <strong>uniquement</strong>\\n  à déclarer vos comptes, CryptoFiscaFacile vous permet de donner toutes les informations nécessaires à ces\\n  déclarations, via la page\\n  <LinkTo @route=\\\"reports\\\">Rapports</LinkTo>\\n  et sa section \\\"Données de comptes utilisateurs (CERFA 3916)\\\" dédiée, à remplir avec soin :</p>\\n<p>1. Ici se retrouve la liste de <strong>TOUS</strong> vos portefeuilles 'Custodial' :</p>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/custodial.png\\\" alt=\\\"custodial\\\" class=\\\"w-100\\\" />\\n</div>\\n\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  Note: Attention, tous vos comptes '<strong>Non Custodial</strong>' n'apparaîtront pas ici. C’est donc normal que cette\\n  liste ne corresponde pas tout à fait à la liste de tous vos portefeuilles.\\n</BsAlert>\\n\\n<p class=\\\"list-step\\\">2. Pour chacun de ces portefeuilles 'Custodial' :\\n  <ol>\\n    <li>a. Vous devrez ajouter, le cas échéant, le nombre de 'COMPTES' détenus (il se peut que vous ayez plusieurs\\n      comptes sur un même portefeuille)</li>\\n    <li>b. Puis vous devrez vérifier attentivement la date d’ouverture. CryptoFiscaFacile vous propose une date, basée\\n      sur la toute première TX que le moteur aura détectée sur ce portefeuille. Cette méthode est empirique et nécessite\\n      un contrôle</li>\\n    <li>c. Si un compte a été clos durant l’exercice fiscal concerné (par exemple : pour 2022, si vous avez clôturé un\\n      compte en 2021, c’est ici que vous devrez le déclarer). Cochez la case et entrez la date de clôture effective</li>\\n    <li>d. Enfin, entrez l’identification de votre ou vos comptes sur ce portefeuille. Ce champ est obligatoire et peut\\n      autant être une adresse e-mail qu'un numéro bien précis</li>\\n  </ol>\\n</p>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/custodial_step.png\\\" alt=\\\"custodial-guide\\\" class=\\\"w-100\\\" />\\n</div>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  Note : afin de trouver les dates d’ouverture et de fermeture, il est souvent conseillé de retrouver les anciens\\n  e-mails échangés avec cette plateforme. Dans le cas où aucun e-mail n’a été gardé, il est possible de prendre contact\\n  avec la plateforme et d’en demander la date effective (bien que parfois il n’y ait pas de réponse).\\n</BsAlert>\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/cff-comptes.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/cff-comptes.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h4>Ce que propose CryptoFiscaFacile...</h4>\\n<h5>Bénéfices Non Commerciaux</h5>\\n<h6 class=\\\"red\\\">Pour le Minage/StaKing</h6>\\n<p>\\n  En conformité avec la législation, le minage et le staKing devraient être considérés comme imposables au titre des\\n  revenus non commerciaux non professionnels.\\n</p>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n  CryptoFiscaFacile le fera nativement pour vous.\\n</BsAlert>\\n<p>En revanche, cela requerra à ce titre de compléter le formulaire 2042C (5KU) applicable au régime BNC/Micro BNC.\\n</p>\\n\\n<h5>Choix utilisateur</h5>\\n<h6 class=\\\"red\\\">Intérêts/Parrainages/Airdrops</h6>\\n<p>\\n  Tout comme le proposent les applications de déclaration crypto actuelles, il est parfois admis pour les intérêts,\\n  parrainages et airdrops de ne pas déclarer les tokens obtenus au titre de l’année de perception, mais de les\\n  considérer comme acquis à titre \\\"gratuit\\\" (valeur 0) puis d’appliquer le régime des plus/moins values lors de leur\\n  cession (cf. section 4.).\\n</p>\\n\\n<p>Afin de coller au mieux à la législation et d'éviter de potentielles incompréhensions au niveau de l'administration,\\n  CryptoFiscaFacile propose aux contribuables les 2 choix suivants :</p>\\n<ul>\\n  <li>Soit opter pour une valeur d'acquisition à 0 : dans ce cas, sélectionner ce choix fera gonfler votre plus value\\n    latente, mais en contrepartie, simplifiera votre déclaration.</li>\\n  <li>Soit entrer au portefeuille avec valeur du jour : ici, sélectionner ce choix impliquera une déclaration au titre\\n    des revenus non commerciaux non professionnels donc potentiellement avantageux pour le Prix Total Acquisition, mais\\n    requerra à ce titre :\\n    <ul>\\n      <li>de déclarer dans le formulaire 2047 (2TR) pour les intérêts à l'étranger</li>\\n      <li>de déclarer dans le formulaire 2042C PRO (5KU/5LU/5MU) sous le régime BNC pour les Parrainages</li>\\n    </ul>\\n  </li>\\n</ul>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  Ce choix sera à faire dans la page\\n  <LinkTo @route=\\\"reports\\\">Rapports</LinkTo>, section dédiée aux formulaires 2086/2042/2047.\\n</BsAlert>\\n\\n<h5>Pour les Remises Commerciales</h5>\\n<p>Il faut donc considérer les sommes perçues comme des 'Cashin' et indiquer la valeur des actifs numériques au jour de\\n  réception comme prix d’acquisition</p>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n  CryptoFiscaFacile le fera nativement pour vous.\\n</BsAlert>\", {\"contents\":\"<h4>Ce que propose CryptoFiscaFacile...</h4>\\n<h5>Bénéfices Non Commerciaux</h5>\\n<h6 class=\\\"red\\\">Pour le Minage/StaKing</h6>\\n<p>\\n  En conformité avec la législation, le minage et le staKing devraient être considérés comme imposables au titre des\\n  revenus non commerciaux non professionnels.\\n</p>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n  CryptoFiscaFacile le fera nativement pour vous.\\n</BsAlert>\\n<p>En revanche, cela requerra à ce titre de compléter le formulaire 2042C (5KU) applicable au régime BNC/Micro BNC.\\n</p>\\n\\n<h5>Choix utilisateur</h5>\\n<h6 class=\\\"red\\\">Intérêts/Parrainages/Airdrops</h6>\\n<p>\\n  Tout comme le proposent les applications de déclaration crypto actuelles, il est parfois admis pour les intérêts,\\n  parrainages et airdrops de ne pas déclarer les tokens obtenus au titre de l’année de perception, mais de les\\n  considérer comme acquis à titre \\\"gratuit\\\" (valeur 0) puis d’appliquer le régime des plus/moins values lors de leur\\n  cession (cf. section 4.).\\n</p>\\n\\n<p>Afin de coller au mieux à la législation et d'éviter de potentielles incompréhensions au niveau de l'administration,\\n  CryptoFiscaFacile propose aux contribuables les 2 choix suivants :</p>\\n<ul>\\n  <li>Soit opter pour une valeur d'acquisition à 0 : dans ce cas, sélectionner ce choix fera gonfler votre plus value\\n    latente, mais en contrepartie, simplifiera votre déclaration.</li>\\n  <li>Soit entrer au portefeuille avec valeur du jour : ici, sélectionner ce choix impliquera une déclaration au titre\\n    des revenus non commerciaux non professionnels donc potentiellement avantageux pour le Prix Total Acquisition, mais\\n    requerra à ce titre :\\n    <ul>\\n      <li>de déclarer dans le formulaire 2047 (2TR) pour les intérêts à l'étranger</li>\\n      <li>de déclarer dans le formulaire 2042C PRO (5KU/5LU/5MU) sous le régime BNC pour les Parrainages</li>\\n    </ul>\\n  </li>\\n</ul>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  Ce choix sera à faire dans la page\\n  <LinkTo @route=\\\"reports\\\">Rapports</LinkTo>, section dédiée aux formulaires 2086/2042/2047.\\n</BsAlert>\\n\\n<h5>Pour les Remises Commerciales</h5>\\n<p>Il faut donc considérer les sommes perçues comme des 'Cashin' et indiquer la valeur des actifs numériques au jour de\\n  réception comme prix d’acquisition</p>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n  CryptoFiscaFacile le fera nativement pour vous.\\n</BsAlert>\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/cff-revenus.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/cff-revenus.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h4>Possession Comptes d’actifs numériques</h4>\\n<div>\\n  <p>\\n    En vertu de l'<strong>article 1649-bis C du Code général des impôts</strong>, toute personne physique domiciliée en\\n    France est tenue de déclarer tous ses comptes\\n    <strong>ouverts, utilisés</strong>\\n    et/ou\\n    <strong>clos</strong>\\n    à l'étranger.</p>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    En principe, il s'agira d'avertir l'administration fiscale de tout(s) compte(s) détenu(s) à l'extérieur de la\\n    France, en passant par les comptes \\\"bancaires\\\" classiques, jusqu'aux comptes d'actifs numériques : ce dernier sujet\\n    est\\n    <strong>couvert par CryptoFiscaFacile</strong>.\\n  </BsAlert>\\n  <h6 class=\\\"red\\\">Comptes entrant dans le champ d'application :</h6>\\n  <p>Tout compte d'actifs numériques \\\"Custodial\\\" détenu à l’étranger entre dans le champ d'application de la loi, et à\\n    ce titre doit être déclaré, qu’il y ait eu KYC ou non, qu’il y ait eu dépôt dessus ou non. Il s'agira par exemple\\n    (liste non exhaustive) des portefeuilles comme :\\n    <ul>\\n      <li>Binance</li>\\n      <li>Coinbase</li>\\n      <li>Revolut</li>\\n      <li>FTX</li>\\n      <li>Kraken</li>\\n      <li>Huobi</li>\\n    </ul>\\n  </p>\\n  <h6 class=\\\"red\\\">Comptes n'entrant pas dans le champ d'application :</h6>\\n  <p>– Tout compte d'actifs numériques \\\"Custodial\\\" ouvert en France n'entre pas dans le champ d'application de la loi.\\n    Il s'agira par exemple (liste non exhaustive) des portefeuilles comme :\\n    <ul>\\n      <li>Coinhouse</li>\\n      <li>Deskoin</li>\\n      <li>Zebitex</li>\\n    </ul>\\n  </p>\\n  <p>– Également tout autre compte d'actifs numériques \\\"non Custodial\\\" (un compte non Custodial n’a pas d’appartenance\\n    géographique par nature) n'entre pas dans le champ d'application de la loi. En effet, Il s'agira par exemple (liste\\n    non exhaustive) de :\\n    <ul>\\n      <li>Ledger</li>\\n      <li>Metamask</li>\\n      <li>Trustwallet</li>\\n      <li>Maiar</li>\\n    </ul>\\n  </p>\\n</div>\", {\"contents\":\"<h4>Possession Comptes d’actifs numériques</h4>\\n<div>\\n  <p>\\n    En vertu de l'<strong>article 1649-bis C du Code général des impôts</strong>, toute personne physique domiciliée en\\n    France est tenue de déclarer tous ses comptes\\n    <strong>ouverts, utilisés</strong>\\n    et/ou\\n    <strong>clos</strong>\\n    à l'étranger.</p>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    En principe, il s'agira d'avertir l'administration fiscale de tout(s) compte(s) détenu(s) à l'extérieur de la\\n    France, en passant par les comptes \\\"bancaires\\\" classiques, jusqu'aux comptes d'actifs numériques : ce dernier sujet\\n    est\\n    <strong>couvert par CryptoFiscaFacile</strong>.\\n  </BsAlert>\\n  <h6 class=\\\"red\\\">Comptes entrant dans le champ d'application :</h6>\\n  <p>Tout compte d'actifs numériques \\\"Custodial\\\" détenu à l’étranger entre dans le champ d'application de la loi, et à\\n    ce titre doit être déclaré, qu’il y ait eu KYC ou non, qu’il y ait eu dépôt dessus ou non. Il s'agira par exemple\\n    (liste non exhaustive) des portefeuilles comme :\\n    <ul>\\n      <li>Binance</li>\\n      <li>Coinbase</li>\\n      <li>Revolut</li>\\n      <li>FTX</li>\\n      <li>Kraken</li>\\n      <li>Huobi</li>\\n    </ul>\\n  </p>\\n  <h6 class=\\\"red\\\">Comptes n'entrant pas dans le champ d'application :</h6>\\n  <p>– Tout compte d'actifs numériques \\\"Custodial\\\" ouvert en France n'entre pas dans le champ d'application de la loi.\\n    Il s'agira par exemple (liste non exhaustive) des portefeuilles comme :\\n    <ul>\\n      <li>Coinhouse</li>\\n      <li>Deskoin</li>\\n      <li>Zebitex</li>\\n    </ul>\\n  </p>\\n  <p>– Également tout autre compte d'actifs numériques \\\"non Custodial\\\" (un compte non Custodial n’a pas d’appartenance\\n    géographique par nature) n'entre pas dans le champ d'application de la loi. En effet, Il s'agira par exemple (liste\\n    non exhaustive) de :\\n    <ul>\\n      <li>Ledger</li>\\n      <li>Metamask</li>\\n      <li>Trustwallet</li>\\n      <li>Maiar</li>\\n    </ul>\\n  </p>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/comptes.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/comptes.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h4>Couverture</h4>\\n<h5>Plateformes prises en charge par CryptoFiscaFacile Version 2</h5>\\n<p>Vous retrouverez la couverture des plateformes d'échange à cette URL :</p>\\n<p>\\n  <App::ExternalLink\\n    href=\\\"https://gitlab.com/c1560/cryptofiscafacile/-/wikis/Plateformes-support\\\"\\n  >https://gitlab.com/c1560/cryptofiscafacile/-/wikis/Plateformes-support</App::ExternalLink>\\n</p>\\n\\n<h5>Blockchains prises en charge par CryptoFiscaFacile Version 2</h5>\\n<p>Vous retrouverez la couverture des blockchains à cette URL :</p>\\n<p>\\n  <App::ExternalLink\\n    href=\\\"https://gitlab.com/c1560/cryptofiscafacile/-/wikis/Plateformes-support\\\"\\n  >https://gitlab.com/c1560/cryptofiscafacile/-/wikis/Plateformes-support</App::ExternalLink>\\n</p>\\n\\n<h5>Portefeuilles pris en charge par CryptoFiscaFacile Version 2</h5>\\n<p>Vous retrouverez la couverture des portefeuilles DEX à cette URL :</p>\\n<p>\\n  <App::ExternalLink\\n    href=\\\"https://gitlab.com/c1560/cryptofiscafacile/-/wikis/Plateformes-support\\\"\\n  >https://gitlab.com/c1560/cryptofiscafacile/-/wikis/Plateformes-support</App::ExternalLink>\\n</p>\", {\"contents\":\"<h4>Couverture</h4>\\n<h5>Plateformes prises en charge par CryptoFiscaFacile Version 2</h5>\\n<p>Vous retrouverez la couverture des plateformes d'échange à cette URL :</p>\\n<p>\\n  <App::ExternalLink\\n    href=\\\"https://gitlab.com/c1560/cryptofiscafacile/-/wikis/Plateformes-support\\\"\\n  >https://gitlab.com/c1560/cryptofiscafacile/-/wikis/Plateformes-support</App::ExternalLink>\\n</p>\\n\\n<h5>Blockchains prises en charge par CryptoFiscaFacile Version 2</h5>\\n<p>Vous retrouverez la couverture des blockchains à cette URL :</p>\\n<p>\\n  <App::ExternalLink\\n    href=\\\"https://gitlab.com/c1560/cryptofiscafacile/-/wikis/Plateformes-support\\\"\\n  >https://gitlab.com/c1560/cryptofiscafacile/-/wikis/Plateformes-support</App::ExternalLink>\\n</p>\\n\\n<h5>Portefeuilles pris en charge par CryptoFiscaFacile Version 2</h5>\\n<p>Vous retrouverez la couverture des portefeuilles DEX à cette URL :</p>\\n<p>\\n  <App::ExternalLink\\n    href=\\\"https://gitlab.com/c1560/cryptofiscafacile/-/wikis/Plateformes-support\\\"\\n  >https://gitlab.com/c1560/cryptofiscafacile/-/wikis/Plateformes-support</App::ExternalLink>\\n</p>\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/couverture.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/couverture.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h4>Présentation de CryptoFiscaFacile Version 2</h4>\\n<h5>Les différentes phases</h5>\\n<div>\\n  <p>CryptoFiscaFacile 2 a été créée en s'appuyant sur 3 phases :\\n  </p>\\n  <ul>\\n    <li class=\\\"pb-2\\\"><strong>Phase 1</strong> : Ajout de toutes vos transactions</li>\\n    <li class=\\\"pb-2\\\"><strong>Phase 2</strong> : Vérification de la complétude de vos transactions</li>\\n    <li class=\\\"pb-2\\\"><strong>Phase 3</strong> : Génération de vos données fiscales</li>\\n  </ul>\\n  <p>Dans toutes les parties suivantes, vous aurez la possibilité de rapidement appréhender la législation en vigueur,\\n    ainsi que ce que propose CryptoFiscaFacile dans ce cadre, avec toutes les actions à effectuer afin d'obtenir un\\n    résultat cohérent sur vos formulaires déclaratifs.</p>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    A tout moment vous aurez la possibilité de cliquer sur l'icône\\n    <App::Icon @icon=\\\"ion:help-sharp\\\" class=\\\"align-middle\\\" width=\\\"30\\\" />\\n    de l'aide interactive en bas à droite de l'application afin de vous aider dans toutes les étapes.\\n  </BsAlert>\\n</div>\\n<h4>Terminologie</h4>\\n<div>\\n  <ul>\\n    <li class=\\\"pb-2\\\"><strong>Actifs numériques</strong>\\n      : cryptomonnaies, comme par exemple BTC, ETH, XRP, USDC, etc</li>\\n    <li class=\\\"pb-2\\\"><strong>BNC (Bénéfices non commerciaux)</strong>\\n      : catégorie d'imposition sur le revenu, applicable aux personnes qui exercent une activité professionnelle non\\n      commerciale, à titre individuel ou comme associés.</li>\\n    <li class=\\\"pb-2\\\"><strong>BIC (Bénéfices Industriels et commerciaux)</strong>\\n      : bénéfices réalisés par des personnes physiques qui exercent une activité commerciale, industrielle ou\\n      artisanale.</li>\\n    <li class=\\\"pb-2\\\"><strong>Cashin</strong>\\n      : le cashin représente la somme investie, un achat d’actif numérique avec des FIAT.</li>\\n    <li class=\\\"pb-2\\\"><strong>Cashout</strong>\\n      : le cashout correspond au prix de cession valorisé en euro de tout ou partie de vos actifs numériques</li>\\n    <li class=\\\"pb-2\\\"><strong>Compte d’actifs numériques</strong>\\n      : tout compte permettant de stocker des actifs numériques qui peut être 'custodial' : vous ne possédez pas les\\n      clés privées (type compte exchange), à l’inverse d’un compte 'non custodial' : où vous possédez les clés privées\\n      (type hot ou cold wallet).</li>\\n    <li class=\\\"pb-2\\\"><strong>Cession à titre onéreux</strong>\\n      : toute cession d’actifs numériques contre une monnaie FIAT, un bien (achat d’une tesla en BTC par exemple) ou un\\n      service (achat d’un abonnement en crypto sur un marketplace en ligne).</li>\\n    <li class=\\\"pb-2\\\"><strong>CUMP</strong> : coût unitaire moyen pondéré.</li>\\n    <li class=\\\"pb-2\\\"><strong>Custodial (Portefeuille)</strong>\\n      : Se dit d’un portefeuille dont le tiers ‘possède‘ les clés privés des actifs numériques que détient\\n      l’utilisateur. Celui-ci en est tout de même le possesseur légal. Exemple : Binance détient les clés privées de vos\\n      actifs bien que vous en soyez possesseur au sens légal. A opposer à ‘Non Custodial’ (Wallets DeFi par exemple).</li>\\n    <li class=\\\"pb-2\\\"><strong>Earning</strong>\\n      : en français “épargner”, l’earning correspond à une épargne générant des intérêts. Souvent confondue avec le\\n      StaKing ou le lending.</li>\\n    <li class=\\\"pb-2\\\"><strong>FIAT (Monnaie)</strong>\\n      : toute monnaie ayant cours légal sur un territoire donné, euros EUR, dollars USD, etc.</li>\\n    <li class=\\\"pb-2\\\"><strong>Hold</strong>\\n      : action de conserver ses actifs numériques sans objectif de les vendre (aka HODL)</li>\\n    <li class=\\\"pb-2\\\"><strong>IR (Impôt sur le Revenu)</strong>\\n      : autre nom du bareme progressif. En France les revenus sont imposés par tranche en fonction de leur importance,\\n      de 0% (inférieur à un seuil annuel de revenu, ex.: 10 225€ annuel pour 2021) jusqu’à 45% (supérieur à un seuil\\n      annuel de revenu, comme 160 366€ annuel pour 2021).</li>\\n    <li class=\\\"pb-2\\\"><strong>Lending</strong>\\n      : le lending est une fonctionnalité de la finance décentralisée qui permet aux utilisateurs de prêter et\\n      d'emprunter des cryptos actifs, en général en fournissant des collatéraux.</li>\\n    <li class=\\\"pb-2\\\"><strong>PEPS</strong> : Premier Entrant Premier Sortant (FIFO).</li>\\n    <li class=\\\"pb-2\\\"><strong>PS (Prélèvement sociaux)</strong>: Prélèvements des revenus dit du patrimoine d’un total de\\n      17,2% (contribution sociale généralisée (CSG) 9,20 %, contribution au remboursement de la dette sociale (CRDS)\\n      0,50 % et prélèvement de solidarité 7,5 %).</li>\\n    <li class=\\\"pb-2\\\"><strong>Stacking</strong>\\n      : le stacking correspond au fait d’acquérir et d’accumuler des tokens suivant une stratégie long termiste. Le\\n      stacking est souvent confondu avec le staKing voire l’earning ou le lending.</li>\\n    <li class=\\\"pb-2\\\"><strong>Staking</strong>\\n      : le staking correspond au fait de déléguer ses tokens en vue de valider les transactions sur une blockchain Proof\\n      of Stake. En contrepartie des nouveaux tokens vous sont rétribués et ils viennent s’ajouter à ceux que vous\\n      possédez déjà.</li>\\n    <li class=\\\"pb-2\\\"><strong>Valeur du portefeuille</strong>\\n      : Total de l’ensemble de ses actifs numériques stockés sur les plateformes d'échanges, sur des portefeuilles non\\n      custodial, sur des plateformes de lending, etc.</li>\\n  </ul>\\n</div>\", {\"contents\":\"<h4>Présentation de CryptoFiscaFacile Version 2</h4>\\n<h5>Les différentes phases</h5>\\n<div>\\n  <p>CryptoFiscaFacile 2 a été créée en s'appuyant sur 3 phases :\\n  </p>\\n  <ul>\\n    <li class=\\\"pb-2\\\"><strong>Phase 1</strong> : Ajout de toutes vos transactions</li>\\n    <li class=\\\"pb-2\\\"><strong>Phase 2</strong> : Vérification de la complétude de vos transactions</li>\\n    <li class=\\\"pb-2\\\"><strong>Phase 3</strong> : Génération de vos données fiscales</li>\\n  </ul>\\n  <p>Dans toutes les parties suivantes, vous aurez la possibilité de rapidement appréhender la législation en vigueur,\\n    ainsi que ce que propose CryptoFiscaFacile dans ce cadre, avec toutes les actions à effectuer afin d'obtenir un\\n    résultat cohérent sur vos formulaires déclaratifs.</p>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    A tout moment vous aurez la possibilité de cliquer sur l'icône\\n    <App::Icon @icon=\\\"ion:help-sharp\\\" class=\\\"align-middle\\\" width=\\\"30\\\" />\\n    de l'aide interactive en bas à droite de l'application afin de vous aider dans toutes les étapes.\\n  </BsAlert>\\n</div>\\n<h4>Terminologie</h4>\\n<div>\\n  <ul>\\n    <li class=\\\"pb-2\\\"><strong>Actifs numériques</strong>\\n      : cryptomonnaies, comme par exemple BTC, ETH, XRP, USDC, etc</li>\\n    <li class=\\\"pb-2\\\"><strong>BNC (Bénéfices non commerciaux)</strong>\\n      : catégorie d'imposition sur le revenu, applicable aux personnes qui exercent une activité professionnelle non\\n      commerciale, à titre individuel ou comme associés.</li>\\n    <li class=\\\"pb-2\\\"><strong>BIC (Bénéfices Industriels et commerciaux)</strong>\\n      : bénéfices réalisés par des personnes physiques qui exercent une activité commerciale, industrielle ou\\n      artisanale.</li>\\n    <li class=\\\"pb-2\\\"><strong>Cashin</strong>\\n      : le cashin représente la somme investie, un achat d’actif numérique avec des FIAT.</li>\\n    <li class=\\\"pb-2\\\"><strong>Cashout</strong>\\n      : le cashout correspond au prix de cession valorisé en euro de tout ou partie de vos actifs numériques</li>\\n    <li class=\\\"pb-2\\\"><strong>Compte d’actifs numériques</strong>\\n      : tout compte permettant de stocker des actifs numériques qui peut être 'custodial' : vous ne possédez pas les\\n      clés privées (type compte exchange), à l’inverse d’un compte 'non custodial' : où vous possédez les clés privées\\n      (type hot ou cold wallet).</li>\\n    <li class=\\\"pb-2\\\"><strong>Cession à titre onéreux</strong>\\n      : toute cession d’actifs numériques contre une monnaie FIAT, un bien (achat d’une tesla en BTC par exemple) ou un\\n      service (achat d’un abonnement en crypto sur un marketplace en ligne).</li>\\n    <li class=\\\"pb-2\\\"><strong>CUMP</strong> : coût unitaire moyen pondéré.</li>\\n    <li class=\\\"pb-2\\\"><strong>Custodial (Portefeuille)</strong>\\n      : Se dit d’un portefeuille dont le tiers ‘possède‘ les clés privés des actifs numériques que détient\\n      l’utilisateur. Celui-ci en est tout de même le possesseur légal. Exemple : Binance détient les clés privées de vos\\n      actifs bien que vous en soyez possesseur au sens légal. A opposer à ‘Non Custodial’ (Wallets DeFi par exemple).</li>\\n    <li class=\\\"pb-2\\\"><strong>Earning</strong>\\n      : en français “épargner”, l’earning correspond à une épargne générant des intérêts. Souvent confondue avec le\\n      StaKing ou le lending.</li>\\n    <li class=\\\"pb-2\\\"><strong>FIAT (Monnaie)</strong>\\n      : toute monnaie ayant cours légal sur un territoire donné, euros EUR, dollars USD, etc.</li>\\n    <li class=\\\"pb-2\\\"><strong>Hold</strong>\\n      : action de conserver ses actifs numériques sans objectif de les vendre (aka HODL)</li>\\n    <li class=\\\"pb-2\\\"><strong>IR (Impôt sur le Revenu)</strong>\\n      : autre nom du bareme progressif. En France les revenus sont imposés par tranche en fonction de leur importance,\\n      de 0% (inférieur à un seuil annuel de revenu, ex.: 10 225€ annuel pour 2021) jusqu’à 45% (supérieur à un seuil\\n      annuel de revenu, comme 160 366€ annuel pour 2021).</li>\\n    <li class=\\\"pb-2\\\"><strong>Lending</strong>\\n      : le lending est une fonctionnalité de la finance décentralisée qui permet aux utilisateurs de prêter et\\n      d'emprunter des cryptos actifs, en général en fournissant des collatéraux.</li>\\n    <li class=\\\"pb-2\\\"><strong>PEPS</strong> : Premier Entrant Premier Sortant (FIFO).</li>\\n    <li class=\\\"pb-2\\\"><strong>PS (Prélèvement sociaux)</strong>: Prélèvements des revenus dit du patrimoine d’un total de\\n      17,2% (contribution sociale généralisée (CSG) 9,20 %, contribution au remboursement de la dette sociale (CRDS)\\n      0,50 % et prélèvement de solidarité 7,5 %).</li>\\n    <li class=\\\"pb-2\\\"><strong>Stacking</strong>\\n      : le stacking correspond au fait d’acquérir et d’accumuler des tokens suivant une stratégie long termiste. Le\\n      stacking est souvent confondu avec le staKing voire l’earning ou le lending.</li>\\n    <li class=\\\"pb-2\\\"><strong>Staking</strong>\\n      : le staking correspond au fait de déléguer ses tokens en vue de valider les transactions sur une blockchain Proof\\n      of Stake. En contrepartie des nouveaux tokens vous sont rétribués et ils viennent s’ajouter à ceux que vous\\n      possédez déjà.</li>\\n    <li class=\\\"pb-2\\\"><strong>Valeur du portefeuille</strong>\\n      : Total de l’ensemble de ses actifs numériques stockés sur les plateformes d'échanges, sur des portefeuilles non\\n      custodial, sur des plateformes de lending, etc.</li>\\n  </ul>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/definitions.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/definitions.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"w-100\\\">\\n  <h4>Foire aux questions</h4>\\n  <h5>Quelle plateforme dois-je déclarer et quand ?</h5>\\n  <p>Tout compte (plateforme d'échange, etc.) ouvert en année N-1 est à déclarer en année N.</p>\\n\\n  <h5>Si je retire simplement ma mise initiale, suis-je imposé ?</h5>\\n  <p>“Retirer sa mise initiale” n’éxonère pas d’une plus-value éventuelle.</p>\\n</div>\", {\"contents\":\"<div class=\\\"w-100\\\">\\n  <h4>Foire aux questions</h4>\\n  <h5>Quelle plateforme dois-je déclarer et quand ?</h5>\\n  <p>Tout compte (plateforme d'échange, etc.) ouvert en année N-1 est à déclarer en année N.</p>\\n\\n  <h5>Si je retire simplement ma mise initiale, suis-je imposé ?</h5>\\n  <p>“Retirer sa mise initiale” n’éxonère pas d’une plus-value éventuelle.</p>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/faq.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/faq.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsTab @customTabs={{true}} as |tab|>\\n  <div class=\\\"d-flex align-items-start h-100 pt-4 pe-4\\\">\\n    <BsNav @stacked={{true}} @type=\\\"pills\\\" aria-orientation=\\\"vertical\\\" class=\\\"me-lg-3\\\">\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"definitions\\\">\\n        1.<span class=\\\"d-none d-md-inline\\\">Généralités</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"comptes\\\">\\n        2.<span class=\\\"d-none d-md-inline\\\">Comptes</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"legislation-comptes\\\">\\n        2.1.<span class=\\\"d-none d-md-inline\\\">Législation</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"cff-comptes\\\">\\n        2.2.<span class=\\\"d-none d-md-inline\\\">Application</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"revenus\\\">\\n        3.<span class=\\\"d-none d-md-inline\\\">Revenus</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"legislation-revenus\\\">\\n        3.1.<span class=\\\"d-none d-md-inline\\\">Législation</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"cff-revenus\\\">\\n        3.2.<span class=\\\"d-none d-md-inline\\\">Application</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"plus-value\\\">\\n        4.<span class=\\\"d-none d-md-inline\\\">Plus-Value</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"manuel-intro\\\">\\n        5.<span class=\\\"d-none d-md-inline\\\">Manuel CFF</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"manuel-portefeuilles\\\">\\n        5.1.<span class=\\\"d-none d-md-inline\\\">Portefeuilles</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"manuel-transactions\\\">\\n        5.2.<span class=\\\"d-none d-md-inline\\\">Transactions</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"manuel-rapports\\\">\\n        5.3.<span class=\\\"d-none d-md-inline\\\">Rapports</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"manuel-csvcustom\\\">\\n        5.4.<span class=\\\"d-none d-md-inline\\\">Perso.</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"couverture\\\">\\n        6.<span class=\\\"d-none d-md-inline\\\">Couverture</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"sources\\\">\\n        7.<span class=\\\"d-none d-md-inline\\\">Sources</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"mentions\\\">\\n        8.<span class=\\\"d-none d-md-inline\\\">Mentions</span>\\n      </Documentation::NavItem>\\n    </BsNav>\\n    <div class=\\\"tab-content custom-doc px-lg-5\\\">\\n      <tab.pane @id=\\\"definitions\\\">\\n        <Documentation::Definitions />\\n      </tab.pane>\\n      <tab.pane @id=\\\"comptes\\\">\\n        <Documentation::Comptes />\\n      </tab.pane>\\n      <tab.pane @id=\\\"legislation-comptes\\\">\\n        <Documentation::LegisComptes />\\n      </tab.pane>\\n      <tab.pane @id=\\\"cff-comptes\\\">\\n        <Documentation::CffComptes />\\n      </tab.pane>\\n      <tab.pane @id=\\\"revenus\\\">\\n        <Documentation::Revenus />\\n      </tab.pane>\\n      <tab.pane @id=\\\"legislation-revenus\\\">\\n        <Documentation::LegisRevenus />\\n      </tab.pane>\\n      <tab.pane @id=\\\"cff-revenus\\\">\\n        <Documentation::CffRevenus />\\n      </tab.pane>\\n      <tab.pane @id=\\\"plus-value\\\">\\n        <Documentation::PlusValue />\\n      </tab.pane>\\n      <tab.pane @id=\\\"manuel-intro\\\">\\n        <Documentation::ManuelIntro />\\n      </tab.pane>\\n      <tab.pane @id=\\\"manuel-portefeuilles\\\">\\n        <Documentation::ManuelPortefeuilles />\\n      </tab.pane>\\n      <tab.pane @id=\\\"manuel-transactions\\\">\\n        <Documentation::ManuelTransactions />\\n      </tab.pane>\\n      <tab.pane @id=\\\"manuel-rapports\\\">\\n        <Documentation::ManuelRapports />\\n      </tab.pane>\\n      <tab.pane @id=\\\"manuel-csvcustom\\\">\\n        <Documentation::ManuelCustom />\\n      </tab.pane>\\n      <tab.pane @id=\\\"couverture\\\">\\n        <Documentation::Couverture />\\n      </tab.pane>\\n      <tab.pane @id=\\\"sources\\\">\\n        <Documentation::Sources />\\n      </tab.pane>\\n      <tab.pane @id=\\\"mentions\\\">\\n        <Documentation::Mentions />\\n      </tab.pane>\\n    </div>\\n  </div>\\n</BsTab>\", {\"contents\":\"<BsTab @customTabs={{true}} as |tab|>\\n  <div class=\\\"d-flex align-items-start h-100 pt-4 pe-4\\\">\\n    <BsNav @stacked={{true}} @type=\\\"pills\\\" aria-orientation=\\\"vertical\\\" class=\\\"me-lg-3\\\">\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"definitions\\\">\\n        1.<span class=\\\"d-none d-md-inline\\\">Généralités</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"comptes\\\">\\n        2.<span class=\\\"d-none d-md-inline\\\">Comptes</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"legislation-comptes\\\">\\n        2.1.<span class=\\\"d-none d-md-inline\\\">Législation</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"cff-comptes\\\">\\n        2.2.<span class=\\\"d-none d-md-inline\\\">Application</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"revenus\\\">\\n        3.<span class=\\\"d-none d-md-inline\\\">Revenus</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"legislation-revenus\\\">\\n        3.1.<span class=\\\"d-none d-md-inline\\\">Législation</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"cff-revenus\\\">\\n        3.2.<span class=\\\"d-none d-md-inline\\\">Application</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"plus-value\\\">\\n        4.<span class=\\\"d-none d-md-inline\\\">Plus-Value</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"manuel-intro\\\">\\n        5.<span class=\\\"d-none d-md-inline\\\">Manuel CFF</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"manuel-portefeuilles\\\">\\n        5.1.<span class=\\\"d-none d-md-inline\\\">Portefeuilles</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"manuel-transactions\\\">\\n        5.2.<span class=\\\"d-none d-md-inline\\\">Transactions</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"manuel-rapports\\\">\\n        5.3.<span class=\\\"d-none d-md-inline\\\">Rapports</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"manuel-csvcustom\\\">\\n        5.4.<span class=\\\"d-none d-md-inline\\\">Perso.</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"couverture\\\">\\n        6.<span class=\\\"d-none d-md-inline\\\">Couverture</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"sources\\\">\\n        7.<span class=\\\"d-none d-md-inline\\\">Sources</span>\\n      </Documentation::NavItem>\\n      <Documentation::NavItem @tab={{tab}} @tabId=\\\"mentions\\\">\\n        8.<span class=\\\"d-none d-md-inline\\\">Mentions</span>\\n      </Documentation::NavItem>\\n    </BsNav>\\n    <div class=\\\"tab-content custom-doc px-lg-5\\\">\\n      <tab.pane @id=\\\"definitions\\\">\\n        <Documentation::Definitions />\\n      </tab.pane>\\n      <tab.pane @id=\\\"comptes\\\">\\n        <Documentation::Comptes />\\n      </tab.pane>\\n      <tab.pane @id=\\\"legislation-comptes\\\">\\n        <Documentation::LegisComptes />\\n      </tab.pane>\\n      <tab.pane @id=\\\"cff-comptes\\\">\\n        <Documentation::CffComptes />\\n      </tab.pane>\\n      <tab.pane @id=\\\"revenus\\\">\\n        <Documentation::Revenus />\\n      </tab.pane>\\n      <tab.pane @id=\\\"legislation-revenus\\\">\\n        <Documentation::LegisRevenus />\\n      </tab.pane>\\n      <tab.pane @id=\\\"cff-revenus\\\">\\n        <Documentation::CffRevenus />\\n      </tab.pane>\\n      <tab.pane @id=\\\"plus-value\\\">\\n        <Documentation::PlusValue />\\n      </tab.pane>\\n      <tab.pane @id=\\\"manuel-intro\\\">\\n        <Documentation::ManuelIntro />\\n      </tab.pane>\\n      <tab.pane @id=\\\"manuel-portefeuilles\\\">\\n        <Documentation::ManuelPortefeuilles />\\n      </tab.pane>\\n      <tab.pane @id=\\\"manuel-transactions\\\">\\n        <Documentation::ManuelTransactions />\\n      </tab.pane>\\n      <tab.pane @id=\\\"manuel-rapports\\\">\\n        <Documentation::ManuelRapports />\\n      </tab.pane>\\n      <tab.pane @id=\\\"manuel-csvcustom\\\">\\n        <Documentation::ManuelCustom />\\n      </tab.pane>\\n      <tab.pane @id=\\\"couverture\\\">\\n        <Documentation::Couverture />\\n      </tab.pane>\\n      <tab.pane @id=\\\"sources\\\">\\n        <Documentation::Sources />\\n      </tab.pane>\\n      <tab.pane @id=\\\"mentions\\\">\\n        <Documentation::Mentions />\\n      </tab.pane>\\n    </div>\\n  </div>\\n</BsTab>\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h4>Ce que dit la loi...</h4>\\n<h5>Déclaration des plateformes d'échanges à l’étranger</h5>\\n<div>\\n  <p>\\n    Tout compte d’actifs numériques ou de fonds en FIAT, détenu, utilisé, ouvert et fermé à l’étranger doit être\\n    déclaré. Cela n’impacte pas votre fiscalité car les montants détenus ne sont pas à déclarer.\\n  </p>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n    Toute ouverture/clôture lors de l’année N est à déclarer en année N+1, puis tous les ans jusqu’à clôture (année N+1\\n    de la clôture également).\\n  </BsAlert>\\n  <p>\\n    <strong><em>Exemple</em></strong>\\n    : Vous avez ouvert votre compte Coinbase en 2021, il faudra donc le déclarer lors de la déclaration 2022.</p>\\n  <ul>\\n    <li class=\\\"mb-2\\\">\\n      Formulaire 3916 : sur la déclaration en ligne (si la plateforme étrangère propose des fonds en euro également). Si\\n      vous avez déjà déclaré vos comptes d’actifs numériques avant 2020 sur le formulaire 3916, il est automatiquement\\n      proposé à l’actualisation lors d’une nouvelle déclaration.\\n    </li>\\n    <li>\\n      Formulaire n°3916-BIS : depuis 2021, sur la déclaration en ligne, fusionné avec le 3916\\n    </li>\\n  </ul>\\n\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Si vous ne saviez pas qu’il fallait déclarer ces comptes, que vous souhaitez remédier à cette situation mais que\\n    vous vous demandez si vous risquez une amende pour non-déclaration les années passées : n’hésitez pas à ajouter une\\n    mention expresse (zone de texte à la fin de la déclaration) pour attester de votre bonne foi en expliquant que vous\\n    ne le saviez pas avant mais que c’est désormais corrigé. Vous pouvez également prendre contact avec votre SIP\\n    (centre des impôts dédié aux particuliers) si vous souhaitez vous mettre en règle mais que la période déclarative ne\\n    s’ouvre que plusieurs mois plus tard. Vous pourrez corriger votre déclaration, cf. le calendrier prévisionnel sur le\\n    bandeau haut.\\n  </BsAlert>\\n</div>\\n<hr />\\n<h5>Ressources utiles</h5>\\n<h6>Formulaires 3916 et 3916-bis unifiés</h6>\\n<div>\\n  <p>\\n    Depuis 2021, il est dorénavant possible de le faire en ligne en cochant la case 8UU (Divers - compte à l’étranger).\\n  </p>\\n  <p>\\n    Il est recommandé de mettre son numéro de compte, son identifiant ou toute référence unique. Dans le cas où\\n    l’information n’existe pas, il est conseillé d’indiquer son adresse e-mail de connexion. A noter que si les champs\\n    n’acceptent pas les caractères spéciaux, nous proposons de mettre\\n    <strong>xxx AROBASE domaine POINT com en toutes lettres</strong>. Il est conseillé d’utiliser le formulaire en ligne\\n    car il sera recopié d’année en année vous évitant de devoir recommencer chaque année, et il n'est pas sûr que votre\\n    SIP accepte encore les PDF 3916-bis via la messagerie sécurisée.\\n  </p>\\n  <p><strong>Exemple avec Binance (formulaire en ligne)</strong></p>\\n  <div class=\\\"d-flex justify-content-center mb-2\\\">\\n    <img src=\\\"/doc/3916.png\\\" alt=\\\"cerfa3916\\\" />\\n  </div>\\n</div>\\n<h6>Spécificités de déclaration multiple</h6>\\n<div>\\n  <p>Lorsque vous possédez/avez utilisé à la fois de la monnaire FIAT et des actifs numériques sur une plateforme\\n    d'échange, il y aura deux déclarations 3916/3916-bis à faire (formulaire en ligne fusionné en un seul) :\\n    <ul>\\n      <li>L’une pour les actifs numériques : 3916-bis</li>\\n      <li>L’autre pour le FIAT : 3916.\\n        <p>Si vous n’avez pas d’IBAN nominatif (Binance par exemple) alors il faut indiquer la même référence / n° de\\n          compte que pour le formulaire d’actifs numériques</p>\\n      </li>\\n    </ul>\\n  </p>\\n</div>\\n<h6>Aide pour le numéro de compte</h6>\\n<div>\\n  <ul>\\n    <li><strong><em>Crypto.com</em></strong>\\n      : L’exchange et l’application sont deux comptes différents. Plusieurs déclarations sont donc potentiellement à\\n      faire :\\n      <ul>\\n        <li>CdC App FIAT en Grande Bretagne (avant déménagement Brexit) : IBAN en GBXX fournis pour faire des dépôts\\n          FIAT</li>\\n        <li>CdC App Fiat en Lituanie (après déménagement Brexit) : IBAN en LTXX fournis pour faire des dépôts FIAT</li>\\n        <li>CdC App Visa Wirecard (avant scandale Wirecard) : N° de compte CdC App</li>\\n        <li>CdC App Visa Payrnet (après scandale Wirecard) : N° de compte CdC App</li>\\n        <li>CdC App Crypto : N° de compte CdC App</li>\\n        <li>CdC Exchange FIAT : N° de compte CdC App</li>\\n        <li>CdC Exchange Crypto : N° de compte CdC App</li>\\n      </ul>\\n    </li>\\n    <li><strong>Binance</strong> : N° de compte : user ID</li>\\n    <li><strong>Coinbase</strong> : N° de compte : référence disponible dans les rapports Excel ou PDF</li>\\n    <li><strong>Kraken</strong> : N° de compte : username dispo dans ses paramètres de compte</li>\\n    <li><strong>Bittrex</strong>\\n      : N° de compte : e-mail ou \\\"memo deposit code\\\" (info dans la rubrique SEPA transfer, ça a l’air de nous identifier\\n      de manière unique et pérenne)</li>\\n    <li><strong>Bitstamp</strong> : N° de compte : user ID</li>\\n  </ul>\\n</div>\", {\"contents\":\"<h4>Ce que dit la loi...</h4>\\n<h5>Déclaration des plateformes d'échanges à l’étranger</h5>\\n<div>\\n  <p>\\n    Tout compte d’actifs numériques ou de fonds en FIAT, détenu, utilisé, ouvert et fermé à l’étranger doit être\\n    déclaré. Cela n’impacte pas votre fiscalité car les montants détenus ne sont pas à déclarer.\\n  </p>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n    Toute ouverture/clôture lors de l’année N est à déclarer en année N+1, puis tous les ans jusqu’à clôture (année N+1\\n    de la clôture également).\\n  </BsAlert>\\n  <p>\\n    <strong><em>Exemple</em></strong>\\n    : Vous avez ouvert votre compte Coinbase en 2021, il faudra donc le déclarer lors de la déclaration 2022.</p>\\n  <ul>\\n    <li class=\\\"mb-2\\\">\\n      Formulaire 3916 : sur la déclaration en ligne (si la plateforme étrangère propose des fonds en euro également). Si\\n      vous avez déjà déclaré vos comptes d’actifs numériques avant 2020 sur le formulaire 3916, il est automatiquement\\n      proposé à l’actualisation lors d’une nouvelle déclaration.\\n    </li>\\n    <li>\\n      Formulaire n°3916-BIS : depuis 2021, sur la déclaration en ligne, fusionné avec le 3916\\n    </li>\\n  </ul>\\n\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Si vous ne saviez pas qu’il fallait déclarer ces comptes, que vous souhaitez remédier à cette situation mais que\\n    vous vous demandez si vous risquez une amende pour non-déclaration les années passées : n’hésitez pas à ajouter une\\n    mention expresse (zone de texte à la fin de la déclaration) pour attester de votre bonne foi en expliquant que vous\\n    ne le saviez pas avant mais que c’est désormais corrigé. Vous pouvez également prendre contact avec votre SIP\\n    (centre des impôts dédié aux particuliers) si vous souhaitez vous mettre en règle mais que la période déclarative ne\\n    s’ouvre que plusieurs mois plus tard. Vous pourrez corriger votre déclaration, cf. le calendrier prévisionnel sur le\\n    bandeau haut.\\n  </BsAlert>\\n</div>\\n<hr />\\n<h5>Ressources utiles</h5>\\n<h6>Formulaires 3916 et 3916-bis unifiés</h6>\\n<div>\\n  <p>\\n    Depuis 2021, il est dorénavant possible de le faire en ligne en cochant la case 8UU (Divers - compte à l’étranger).\\n  </p>\\n  <p>\\n    Il est recommandé de mettre son numéro de compte, son identifiant ou toute référence unique. Dans le cas où\\n    l’information n’existe pas, il est conseillé d’indiquer son adresse e-mail de connexion. A noter que si les champs\\n    n’acceptent pas les caractères spéciaux, nous proposons de mettre\\n    <strong>xxx AROBASE domaine POINT com en toutes lettres</strong>. Il est conseillé d’utiliser le formulaire en ligne\\n    car il sera recopié d’année en année vous évitant de devoir recommencer chaque année, et il n'est pas sûr que votre\\n    SIP accepte encore les PDF 3916-bis via la messagerie sécurisée.\\n  </p>\\n  <p><strong>Exemple avec Binance (formulaire en ligne)</strong></p>\\n  <div class=\\\"d-flex justify-content-center mb-2\\\">\\n    <img src=\\\"/doc/3916.png\\\" alt=\\\"cerfa3916\\\" />\\n  </div>\\n</div>\\n<h6>Spécificités de déclaration multiple</h6>\\n<div>\\n  <p>Lorsque vous possédez/avez utilisé à la fois de la monnaire FIAT et des actifs numériques sur une plateforme\\n    d'échange, il y aura deux déclarations 3916/3916-bis à faire (formulaire en ligne fusionné en un seul) :\\n    <ul>\\n      <li>L’une pour les actifs numériques : 3916-bis</li>\\n      <li>L’autre pour le FIAT : 3916.\\n        <p>Si vous n’avez pas d’IBAN nominatif (Binance par exemple) alors il faut indiquer la même référence / n° de\\n          compte que pour le formulaire d’actifs numériques</p>\\n      </li>\\n    </ul>\\n  </p>\\n</div>\\n<h6>Aide pour le numéro de compte</h6>\\n<div>\\n  <ul>\\n    <li><strong><em>Crypto.com</em></strong>\\n      : L’exchange et l’application sont deux comptes différents. Plusieurs déclarations sont donc potentiellement à\\n      faire :\\n      <ul>\\n        <li>CdC App FIAT en Grande Bretagne (avant déménagement Brexit) : IBAN en GBXX fournis pour faire des dépôts\\n          FIAT</li>\\n        <li>CdC App Fiat en Lituanie (après déménagement Brexit) : IBAN en LTXX fournis pour faire des dépôts FIAT</li>\\n        <li>CdC App Visa Wirecard (avant scandale Wirecard) : N° de compte CdC App</li>\\n        <li>CdC App Visa Payrnet (après scandale Wirecard) : N° de compte CdC App</li>\\n        <li>CdC App Crypto : N° de compte CdC App</li>\\n        <li>CdC Exchange FIAT : N° de compte CdC App</li>\\n        <li>CdC Exchange Crypto : N° de compte CdC App</li>\\n      </ul>\\n    </li>\\n    <li><strong>Binance</strong> : N° de compte : user ID</li>\\n    <li><strong>Coinbase</strong> : N° de compte : référence disponible dans les rapports Excel ou PDF</li>\\n    <li><strong>Kraken</strong> : N° de compte : username dispo dans ses paramètres de compte</li>\\n    <li><strong>Bittrex</strong>\\n      : N° de compte : e-mail ou \\\"memo deposit code\\\" (info dans la rubrique SEPA transfer, ça a l’air de nous identifier\\n      de manière unique et pérenne)</li>\\n    <li><strong>Bitstamp</strong> : N° de compte : user ID</li>\\n  </ul>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/legis-comptes.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/legis-comptes.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h4>Ce que dit la loi...</h4>\\n<h5>Catégories applicables</h5>\\n<h6 class=\\\"red\\\">Minage (Proof of Work, ou PoW)</h6>\\n<div>\\n  <p>Action de participer au consensus d'une blockchain, de type Proof of Work (PoW). En contrepartie, les mineurs\\n    reçoivent des frais de minage et des 'block rewards'. Ces items sont considérés par la législation française comme\\n    des benéfices non commerciaux (BNC).</p>\\n\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Si le chiffre d’affaires est inférieur à 83 600€, Le minage relèvera du Régime Micro BNC (case 5KU du formulaire\\n    2042C PRO). S’il est supérieur, celui-ci relèvera du régime BNC réel (formulaire 2053)\\n  </BsAlert>\\n</div>\\n\\n<h6 class=\\\"red\\\">StaKing (Proof of Stake, ou PoS)</h6>\\n<div>\\n  <p>Action de blocage d'un capital sur un nœud de réseau, pour participer à la validation des blocs. Cela revient à une\\n    participation au consensus de type Proof of Stake (PoS).</p>\\n\\n  <p>\\n    La législation fiscale n’évoque que le minage comme participation au réseau mais le staking pourrait rentrer dans\\n    cette définition vu que les actifs numériques ainsi obtenus “constituent la contrepartie de la participation du\\n    contribuable à la création ou au fonctionnement du système d’unité de compte virtuelle”. Ces actifs numériques\\n    suivraient alors le même mode d’imposition que le minage.</p>\\n\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Assimilé au minage.\\n  </BsAlert>\\n</div>\\n\\n<h6 class=\\\"red\\\">Parrainage (seulement si signicatif)</h6>\\n<p>Ce sont toutes les récompenses de type revenus pour avoir recommandé les services d'une plateforme à une tierce\\n  personne.</p>\\n\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n  Si la valeur des récompenses est réellement significative, comprenez ici à l’appréciation de votre SIP (ceci est très\\n  subjectif, mais en l’absence de rescrit fiscal à l'heure où nous écrivons ces lignes, il est important de le noter),\\n  le parrainage relèvera du Régime BNC, toute comme le minage...\\n</BsAlert>\\n\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  Si le chiffre d’affaires est inférieur à 83 600€, Le minage relève du Régime Micro BNC (case 5KU du formulaire 2042C\\n  PRO). S’il est supérieur, du régime BNC réel (formulaire 2053)\\n</BsAlert>\\n\\n<h6 class=\\\"red\\\">Earning / Lending / StaCKing</h6>\\n<div>\\n  <p>Ce sont toutes les réceptions d'intérêts à l'étaranger. Par exemple : les plateformes comme Nexo, Celsius,\\n    Crypto.com Earn, 'Staking CRO' (Exchange, Appli, nommé ainsi par Crypto.com même si assimilable à du staCKing), etc.\\n  </p>\\n\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    La loi demande de valoriser ces réceptions au taux du jour et d'en faire la somme afin de la déclarer dans la case\\n    2TR du formulaire 2047 et ce sera à reporter sur la déclaration principale.\\n  </BsAlert>\\n</div>\\n\\n<h6 class=\\\"red\\\">Cashback</h6>\\n<div>\\n  <p>Le cashback est considéré comme une remise commerciale. Il n’est donc pas fiscalisable (Cela n'exonère pas, par\\n    contre, d’une plus-value éventuelle lors de la cession des actifs numériques reçus en cashback).\\n  </p>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n    Il faut considérer les sommes perçues en cashback comme des 'cashin' et indiquer la valeur des actifs numériques au\\n    jour de réception comme prix d’acquisition.\\n  </BsAlert>\\n</div>\\n\\n<h6 class=\\\"red\\\">Airdrop (fortuit)</h6>\\n<div>\\n  <p>\\n    Un airdrop est une distribution 'gratuite' de tokens. Cette distribution est généralement réalisée par les créateurs\\n    de la monnaie en question. Alors que certains créateurs de cryptos privilégient les ICO, d'autres utilisent les\\n    airdops ou une combinaison des deux pour distribuer les jetons de leur monnaie.\\n  </p>\\n  <p><strong>Aucune action de l'utilisateur n'est possible pour qualifier les Airdrop de \\\"fortuits\\\". Ceux-ci sont non\\n      fiscalisables (fiscalité similaire aux Remises Commerciales et aux CashBack)</strong>\\n  </p>\\n</div>\\n<hr />\\n<h5>Formulaires déclaratifs</h5>\\n<h6>Formulaire 2042</h6>\\n<div>\\n  <div class=\\\"d-flex justify-content-center\\\">\\n    <img src=\\\"/doc/2042.png\\\" alt=\\\"cerfa2042\\\" />\\n  </div>\\n</div>\\n<h6>Formulaire 2047</h6>\\n<div>\\n  <div class=\\\"d-flex justify-content-center\\\">\\n    <img src=\\\"/doc/2047.png\\\" alt=\\\"cerfa2047\\\" />\\n  </div>\\n</div>\\n<h6>Formulaire 2778-SD (associé au 2047)</h6>\\n<div>\\n  <div class=\\\"d-flex justify-content-center\\\">\\n    <img src=\\\"/doc/2778sd.png\\\" alt=\\\"cerfa2778sd\\\" />\\n  </div>\\n</div>\", {\"contents\":\"<h4>Ce que dit la loi...</h4>\\n<h5>Catégories applicables</h5>\\n<h6 class=\\\"red\\\">Minage (Proof of Work, ou PoW)</h6>\\n<div>\\n  <p>Action de participer au consensus d'une blockchain, de type Proof of Work (PoW). En contrepartie, les mineurs\\n    reçoivent des frais de minage et des 'block rewards'. Ces items sont considérés par la législation française comme\\n    des benéfices non commerciaux (BNC).</p>\\n\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Si le chiffre d’affaires est inférieur à 83 600€, Le minage relèvera du Régime Micro BNC (case 5KU du formulaire\\n    2042C PRO). S’il est supérieur, celui-ci relèvera du régime BNC réel (formulaire 2053)\\n  </BsAlert>\\n</div>\\n\\n<h6 class=\\\"red\\\">StaKing (Proof of Stake, ou PoS)</h6>\\n<div>\\n  <p>Action de blocage d'un capital sur un nœud de réseau, pour participer à la validation des blocs. Cela revient à une\\n    participation au consensus de type Proof of Stake (PoS).</p>\\n\\n  <p>\\n    La législation fiscale n’évoque que le minage comme participation au réseau mais le staking pourrait rentrer dans\\n    cette définition vu que les actifs numériques ainsi obtenus “constituent la contrepartie de la participation du\\n    contribuable à la création ou au fonctionnement du système d’unité de compte virtuelle”. Ces actifs numériques\\n    suivraient alors le même mode d’imposition que le minage.</p>\\n\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Assimilé au minage.\\n  </BsAlert>\\n</div>\\n\\n<h6 class=\\\"red\\\">Parrainage (seulement si signicatif)</h6>\\n<p>Ce sont toutes les récompenses de type revenus pour avoir recommandé les services d'une plateforme à une tierce\\n  personne.</p>\\n\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n  Si la valeur des récompenses est réellement significative, comprenez ici à l’appréciation de votre SIP (ceci est très\\n  subjectif, mais en l’absence de rescrit fiscal à l'heure où nous écrivons ces lignes, il est important de le noter),\\n  le parrainage relèvera du Régime BNC, toute comme le minage...\\n</BsAlert>\\n\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  Si le chiffre d’affaires est inférieur à 83 600€, Le minage relève du Régime Micro BNC (case 5KU du formulaire 2042C\\n  PRO). S’il est supérieur, du régime BNC réel (formulaire 2053)\\n</BsAlert>\\n\\n<h6 class=\\\"red\\\">Earning / Lending / StaCKing</h6>\\n<div>\\n  <p>Ce sont toutes les réceptions d'intérêts à l'étaranger. Par exemple : les plateformes comme Nexo, Celsius,\\n    Crypto.com Earn, 'Staking CRO' (Exchange, Appli, nommé ainsi par Crypto.com même si assimilable à du staCKing), etc.\\n  </p>\\n\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    La loi demande de valoriser ces réceptions au taux du jour et d'en faire la somme afin de la déclarer dans la case\\n    2TR du formulaire 2047 et ce sera à reporter sur la déclaration principale.\\n  </BsAlert>\\n</div>\\n\\n<h6 class=\\\"red\\\">Cashback</h6>\\n<div>\\n  <p>Le cashback est considéré comme une remise commerciale. Il n’est donc pas fiscalisable (Cela n'exonère pas, par\\n    contre, d’une plus-value éventuelle lors de la cession des actifs numériques reçus en cashback).\\n  </p>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n    Il faut considérer les sommes perçues en cashback comme des 'cashin' et indiquer la valeur des actifs numériques au\\n    jour de réception comme prix d’acquisition.\\n  </BsAlert>\\n</div>\\n\\n<h6 class=\\\"red\\\">Airdrop (fortuit)</h6>\\n<div>\\n  <p>\\n    Un airdrop est une distribution 'gratuite' de tokens. Cette distribution est généralement réalisée par les créateurs\\n    de la monnaie en question. Alors que certains créateurs de cryptos privilégient les ICO, d'autres utilisent les\\n    airdops ou une combinaison des deux pour distribuer les jetons de leur monnaie.\\n  </p>\\n  <p><strong>Aucune action de l'utilisateur n'est possible pour qualifier les Airdrop de \\\"fortuits\\\". Ceux-ci sont non\\n      fiscalisables (fiscalité similaire aux Remises Commerciales et aux CashBack)</strong>\\n  </p>\\n</div>\\n<hr />\\n<h5>Formulaires déclaratifs</h5>\\n<h6>Formulaire 2042</h6>\\n<div>\\n  <div class=\\\"d-flex justify-content-center\\\">\\n    <img src=\\\"/doc/2042.png\\\" alt=\\\"cerfa2042\\\" />\\n  </div>\\n</div>\\n<h6>Formulaire 2047</h6>\\n<div>\\n  <div class=\\\"d-flex justify-content-center\\\">\\n    <img src=\\\"/doc/2047.png\\\" alt=\\\"cerfa2047\\\" />\\n  </div>\\n</div>\\n<h6>Formulaire 2778-SD (associé au 2047)</h6>\\n<div>\\n  <div class=\\\"d-flex justify-content-center\\\">\\n    <img src=\\\"/doc/2778sd.png\\\" alt=\\\"cerfa2778sd\\\" />\\n  </div>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/legis-revenus.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/legis-revenus.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h4>Ajout de fichiers Excel ou CSV personalisés</h4>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n  Si votre plateforme ne propose pas l'extraction de vos transactions, si votre plateforme n'existe plus ou si vous\\n  pensez avoir importé un maximum de transactions mais qu'il reste des erreurs (ex. : il vous reste des TX de catégorie\\n  RETRAIT sans aucun DEPOT en face), CryptoFiscaFacile accepte des fichiers de transactions personalisés à créer\\n  manuellement.\\n</BsAlert>\\n\\n<h5 class=\\\"red\\\">Catégories disponibles</h5>\\n<p>Les catégories suivantes permettant de catégoriser vos transactions sont les suivantes :</p>\\n<ul>\\n  <li>Achat Fiat-Crypto: <i>Cashin</i>, ceux-ci doivent être frais Fiat <b>inclus</b></li>\\n  <li>Cession Crypto-Fiat : <i>Cashout</i>, ceux-ci doivent être frais Fiat <b>exclus</b></li>\\n  <li>Dépôt : <i>Depot</i>, tout montant crypto déposé sur une plateforme</li>\\n  <li>Don : <i>Don</i>, toute donation reçue ou émise</li>\\n  <li>Échange : <i>Echange</i>, toute transaction crypto à crypto</li>\\n  <li>Frais : <i>Frais</i>, toute transaction uniquement de frais</li>\\n  <li>Intérêt : <i>Interets</i>, tout montant portant intérêts (stacking, earning...)</li>\\n  <li>Minage : <i>Minage</i>, tout montant portant intérêts de minage</li>\\n  <li>Parrainage : <i>Parrainage</i>, tout montant lié à du parrainage, émis ou reçu</li>\\n  <li>Remise Commerciale : <i>Remise Commerciale</i>, toute remise perçue</li>\\n  <li>Retrait : <i>Retrait</i>, tout montant crypto retiré d'une plateforme</li>\\n</ul>\\n\\n<h5 class=\\\"red\\\">Types de Fichiers</h5>\\n<p>Veuillez trouver ci-dessous les modèles pré-complétés :</p>\\n<ul>\\n  <li><a href=\\\"/CryptoFiscaFacile-Custom.csv\\\" download> Modèle CSV </a></li>\\n  <li><a href=\\\"/CryptoFiscaFacile-Custom.xlsx\\\" download> Modèle Excel </a></li>\\n</ul>\\n<br />\\n<p>Afin de compléter manuellement la liste des transactions, CryptoFiscaFacile vous met à disposition un fichier Excel\\n  (2007+, utilisable sur LibreOffice ou toute autre application bureautique également) qu'il vous suffira de remplir\\n  manuellement avec toutes les transactions manquantes :\\n</p>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/xls-custom.png\\\" alt=\\\"xlsx\\\" class=\\\"w-100\\\" />\\n</div>\\n<p>Sur le même principe que le fichier Excel ci-dessus, CryptoFiscaFacile vous propose un format plus classique, le CSV.\\n  Sans en-tête, il suffira de rentrer uniquement les valeurs pour chaque transactions.\\n</p>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/csv-custom.png\\\" alt=\\\"csv\\\" class=\\\"w-100\\\" />\\n</div>\\n<p>\\n  <ul>\\n    <li><strong>(A)</strong>\\n      : L'en-tête permet à l'application de déterminer la plateforme et de vous fournir les données nécessaires au\\n      formulaire CERFA 3916 (déclaration de comptes à l'étranger).</li>\\n    <li><strong>(B)</strong>\\n      : Le corps du tableau vous permet d'ajouter manuellement les transactions, de différentes catégories.\\n    </li>\\n  </ul>\\n</p>\\n<br />\\n<h5 class=\\\"red\\\">Formalisme</h5>\\n<br />\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  <strong>Attention de bien respecter globalement le formalisme fourni en exemple</strong>\\n</BsAlert>\\n\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n  <strong>Spécificités concernant les dates :\\n  </strong>\\n  <ul>\\n    <li>\\n      Veillez à bien respecter le format des dates dans chaque fichier. Pour le fichier Excel : il est important de\\n      garder les dates sous forme de texte. Pour ce faire, veillez à bien laisser le caracètre\\n      <em><strong> ' </strong></em>\\n      dans la cellule en début de chaine.</li>\\n    <li>Par ailleurs, celles-ci doivent correspondre à des dates avec une zone de temps 'Europe/Paris'. </li>\\n  </ul>\\n</BsAlert>\\n<br />\", {\"contents\":\"<h4>Ajout de fichiers Excel ou CSV personalisés</h4>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n  Si votre plateforme ne propose pas l'extraction de vos transactions, si votre plateforme n'existe plus ou si vous\\n  pensez avoir importé un maximum de transactions mais qu'il reste des erreurs (ex. : il vous reste des TX de catégorie\\n  RETRAIT sans aucun DEPOT en face), CryptoFiscaFacile accepte des fichiers de transactions personalisés à créer\\n  manuellement.\\n</BsAlert>\\n\\n<h5 class=\\\"red\\\">Catégories disponibles</h5>\\n<p>Les catégories suivantes permettant de catégoriser vos transactions sont les suivantes :</p>\\n<ul>\\n  <li>Achat Fiat-Crypto: <i>Cashin</i>, ceux-ci doivent être frais Fiat <b>inclus</b></li>\\n  <li>Cession Crypto-Fiat : <i>Cashout</i>, ceux-ci doivent être frais Fiat <b>exclus</b></li>\\n  <li>Dépôt : <i>Depot</i>, tout montant crypto déposé sur une plateforme</li>\\n  <li>Don : <i>Don</i>, toute donation reçue ou émise</li>\\n  <li>Échange : <i>Echange</i>, toute transaction crypto à crypto</li>\\n  <li>Frais : <i>Frais</i>, toute transaction uniquement de frais</li>\\n  <li>Intérêt : <i>Interets</i>, tout montant portant intérêts (stacking, earning...)</li>\\n  <li>Minage : <i>Minage</i>, tout montant portant intérêts de minage</li>\\n  <li>Parrainage : <i>Parrainage</i>, tout montant lié à du parrainage, émis ou reçu</li>\\n  <li>Remise Commerciale : <i>Remise Commerciale</i>, toute remise perçue</li>\\n  <li>Retrait : <i>Retrait</i>, tout montant crypto retiré d'une plateforme</li>\\n</ul>\\n\\n<h5 class=\\\"red\\\">Types de Fichiers</h5>\\n<p>Veuillez trouver ci-dessous les modèles pré-complétés :</p>\\n<ul>\\n  <li><a href=\\\"/CryptoFiscaFacile-Custom.csv\\\" download> Modèle CSV </a></li>\\n  <li><a href=\\\"/CryptoFiscaFacile-Custom.xlsx\\\" download> Modèle Excel </a></li>\\n</ul>\\n<br />\\n<p>Afin de compléter manuellement la liste des transactions, CryptoFiscaFacile vous met à disposition un fichier Excel\\n  (2007+, utilisable sur LibreOffice ou toute autre application bureautique également) qu'il vous suffira de remplir\\n  manuellement avec toutes les transactions manquantes :\\n</p>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/xls-custom.png\\\" alt=\\\"xlsx\\\" class=\\\"w-100\\\" />\\n</div>\\n<p>Sur le même principe que le fichier Excel ci-dessus, CryptoFiscaFacile vous propose un format plus classique, le CSV.\\n  Sans en-tête, il suffira de rentrer uniquement les valeurs pour chaque transactions.\\n</p>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/csv-custom.png\\\" alt=\\\"csv\\\" class=\\\"w-100\\\" />\\n</div>\\n<p>\\n  <ul>\\n    <li><strong>(A)</strong>\\n      : L'en-tête permet à l'application de déterminer la plateforme et de vous fournir les données nécessaires au\\n      formulaire CERFA 3916 (déclaration de comptes à l'étranger).</li>\\n    <li><strong>(B)</strong>\\n      : Le corps du tableau vous permet d'ajouter manuellement les transactions, de différentes catégories.\\n    </li>\\n  </ul>\\n</p>\\n<br />\\n<h5 class=\\\"red\\\">Formalisme</h5>\\n<br />\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  <strong>Attention de bien respecter globalement le formalisme fourni en exemple</strong>\\n</BsAlert>\\n\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n  <strong>Spécificités concernant les dates :\\n  </strong>\\n  <ul>\\n    <li>\\n      Veillez à bien respecter le format des dates dans chaque fichier. Pour le fichier Excel : il est important de\\n      garder les dates sous forme de texte. Pour ce faire, veillez à bien laisser le caracètre\\n      <em><strong> ' </strong></em>\\n      dans la cellule en début de chaine.</li>\\n    <li>Par ailleurs, celles-ci doivent correspondre à des dates avec une zone de temps 'Europe/Paris'. </li>\\n  </ul>\\n</BsAlert>\\n<br />\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/manuel-custom.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/manuel-custom.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h4>Manuel CryptoFiscaFacile Version 2</h4>\\n<h5>Les différentes phases</h5>\\n<div>\\n  <p>Pour rappel, CryptoFiscaFacile version 2 a été créée en s'appuyant sur 3 phases :\\n  </p>\\n  <ul>\\n    <li class=\\\"pb-2\\\"><strong>Phase 1</strong>\\n      - Portefeuilles : Ajout de toutes vos plateformes d'échange et de blockchains afin de rapatrier TOUTES vos\\n      transactions</li>\\n    <li class=\\\"pb-2\\\"><strong>Phase 2</strong>\\n      - Transactions : Vérification de la complétude de TOUTES vos transactions</li>\\n    <li class=\\\"pb-2\\\"><strong>Phase 3</strong> - Rapports : Génération de vos données fiscales à déclarer</li>\\n  </ul>\\n  <p>Dans les parties suivantes, vous aurez la possibilité de vous familiariser avec ce que propose CryptoFiscaFacile\\n    dans ce cadre.</p>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Il est important de\\n    <strong>respecter l'ordre de ces 3 phases</strong>\\n    afin que l'outil puisse correctement générer vos données fiscales. Le risque de ne pas suivre l'ordre des phases est\\n    d'obtenir des valeurs erronéés et de ce fait créer une déclaration caduque.\\n  </BsAlert>\\n  <br />\\n  <p>\\n    <strong>De plus, CryptoFiscaFacile vous permet de pallier au manque de transaction(s), menant potentiellement à des\\n      calculs erronés.</strong>\\n  </p>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Pour ce faire, l'application met à disposition des utilisateurs des fichiers de type\\n    <em>'Perso.'</em>\\n    (Personnalisé) à compléter manuellement des transactions manquantes.\\n  </BsAlert>\\n</div>\", {\"contents\":\"<h4>Manuel CryptoFiscaFacile Version 2</h4>\\n<h5>Les différentes phases</h5>\\n<div>\\n  <p>Pour rappel, CryptoFiscaFacile version 2 a été créée en s'appuyant sur 3 phases :\\n  </p>\\n  <ul>\\n    <li class=\\\"pb-2\\\"><strong>Phase 1</strong>\\n      - Portefeuilles : Ajout de toutes vos plateformes d'échange et de blockchains afin de rapatrier TOUTES vos\\n      transactions</li>\\n    <li class=\\\"pb-2\\\"><strong>Phase 2</strong>\\n      - Transactions : Vérification de la complétude de TOUTES vos transactions</li>\\n    <li class=\\\"pb-2\\\"><strong>Phase 3</strong> - Rapports : Génération de vos données fiscales à déclarer</li>\\n  </ul>\\n  <p>Dans les parties suivantes, vous aurez la possibilité de vous familiariser avec ce que propose CryptoFiscaFacile\\n    dans ce cadre.</p>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Il est important de\\n    <strong>respecter l'ordre de ces 3 phases</strong>\\n    afin que l'outil puisse correctement générer vos données fiscales. Le risque de ne pas suivre l'ordre des phases est\\n    d'obtenir des valeurs erronéés et de ce fait créer une déclaration caduque.\\n  </BsAlert>\\n  <br />\\n  <p>\\n    <strong>De plus, CryptoFiscaFacile vous permet de pallier au manque de transaction(s), menant potentiellement à des\\n      calculs erronés.</strong>\\n  </p>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Pour ce faire, l'application met à disposition des utilisateurs des fichiers de type\\n    <em>'Perso.'</em>\\n    (Personnalisé) à compléter manuellement des transactions manquantes.\\n  </BsAlert>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/manuel-intro.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/manuel-intro.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h4>Portefeuilles</h4>\\n<h5>Phase 1 : Ajout de toutes vos transactions</h5>\\n<p>Première étape cruciale dans votre déclaration, le rapatriement de toutes vos données de comptes d'actifs et de leurs\\n  transactions est nécessaire afin de lister toutes les transactions entrant dans le champ d'application de la loi.</p>\\n<p>\\n  Pour cette phase, il sera important de collecter ces données, via les moyens mis à votre disposition par\\n  l'application. Il s'agira de le permettre en utilisant l'un ou l'autre des moyens suivants :\\n  <ul>\\n    <li>Collecter ces données via des API</li>\\n    <li>Collecter les fichiers de type 'CSV' (sorte de tableur)</li>\\n    <li>Extraire des données via des fichiers JSON (fichier de structure de données)</li>\\n  </ul>\\n</p>\\n\\n<h6 class=\\\"red\\\">Ajout de TX via API (Vue Outils)</h6>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/wallet_api.png\\\" alt=\\\"api\\\" class=\\\"w-50\\\" />\\n</div>\\n<p>Une des possibilités offertes afin de rapatrier les transactions est l’utilisation d’API, si et seulement si la\\n  plateforme d’échange (Binance, Kraken…) concernée en fournit la capacité. Concrètement il s’agira de donner les droits\\n  à CryptoFiscaFacile sur la lecture de l’historique des transactions de la plateforme afin d’en importer le contenu\\n  dans votre base de données locale. Les procédures pour chaque plateforme d’échange afin de créer la connexion vous\\n  seront systématiquement données sur la page OUTILS.</p>\\n<p>Néanmoins, toutes les plateformes d’échanges ne fournissent pas de capacité d’API, c’est pourquoi d’autres méthodes\\n  vous sont fournies…</p>\\n\\n<h6 class=\\\"red\\\">Ajout de fichiers CSV</h6>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/csv_import.png\\\" alt=\\\"import\\\" class=\\\"w-75\\\" />\\n</div>\\n<p>La méthode la plus répandue consiste à extraire de la plateforme un fichier, généralement de type CSV, qui répertorie\\n  toutes les transactions survenues sur un laps de temps défini.</p>\\n<p>Il est possible qu’une plateforme d'échange vous propose uniquement l’extraction sur une courte période (ex. : cas de\\n  Binance avant 2022). Il sera donc nécessaire de réitérer l’opération autant de fois qu’il le faut afin d’en extraire\\n  les transactions sur la plage de temps souhaitée.</p>\\n<p>Chaque plateforme a sa façon propre d’extraire ces fichiers, c’est pourquoi il est impossible d’en répertorier leur\\n  intégralité. Néanmoins, sur chaque plateforme un centre d’aide est disponible et vous détaillera les manipulations.</p>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n  Évitez d’ouvrir vos fichiers CSV dans Excel ou toute suite bureautique, elles ont tendance à les modifier sans vous le\\n  dire et cela le rendrait inutilisable par CryptoFiscaFacile.\\n</BsAlert>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  <div class=\\\"d-flex justify-content-center mb-4\\\">\\n    <img src=\\\"/doc/support.png\\\" alt=\\\"support\\\" class=\\\"w-75\\\" />\\n  </div>\\n  Si lors de l’ajout de fichier CSV dans CryptoFiscaFacile, un bouton\\n  <strong>SUPPORT</strong>\\n  apparaît, cela veut dire qu'une ou plusieurs transactions à l’intérieur de ce fichier ne sont pas bien gérées par\\n  CryptoFiscaFacile. Dans ce cas veuillez suivre les instructions afin que nous puissions ajouter leur support dans les\\n  meilleurs délais.\\n</BsAlert>\\n\\n<h6 class=\\\"red\\\">Extractions particulières de fichiers sources</h6>\\n<p>CryptoFiscaFacile fournit également, via la même interface que pour les fichiers CSV, une autre manière de rapatrier\\n  ses transactions. Il s'agira d'extractions dans des cas particuliers où l’extraction via API ou par CSV s'avèrera être\\n  délicate ou indisponible.</p>\\n<p>Voici les procédures à suivre pour chaque plateforme couverte par l’application :</p>\\n<p><strong><em>Crypto.com Exchange</em></strong></p>\\n<ol>\\n  <li>S'identifier sur l'exchange dans son navigateur</li>\\n  <li>Clic droit puis choisir \\\"Inspecter\\\"</li>\\n  <li>Sélectionner l’onglet “Console”</li>\\n  <li>Copier le script suivant dans la console\\n    <Documentation::Script />\\n  </li>\\n  <li>Attendre quelques secondes et accepter (si nécessaire) le téléchargement du fichier JSON</li>\\n</ol>\\n<p>Vous vous retrouvez donc avec un fichier JSON, que l’application sera capable d’accepter via la page PORTEFEUILLES.</p>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  A ce stade, CryptoFiscaFacile n'identifie que la procédure spécifique ci-dessus. Si d'aventure d'autres méthodes\\n  étaient nécessaires, CryptoFiscaFacile produira une mise à jour de l'application ainsi que la documentation associée.\\n</BsAlert>\\n<p><strong><em>Xumm wallet</em></strong></p>\\n<ol>\\n  <li>Settings - Activer \\\"Show payments fees as separate transactions</li>\\n  <li>Export - Choisir les colonnes tx_type,direction,amount,date,currency,is_fee,fee,hash</li>\\n</ol>\\n\\n<h6 class=\\\"red\\\">Ajout de TX grâce aux extractions Blockchain</h6>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/bc_api.png\\\" alt=\\\"blockchain\\\" class=\\\"w-50\\\" />\\n</div>\\n<p>Une dernière méthode est fournie, capable de rapatrier des transactions sur les blockchains directement (BTC, ETH,\\n  Tezos…), grâce à vos adresses blockchain.</p>\\n<p>Ce principe sera principalement utilisé pour couvrir par exemple la DeFi (Finance Décentralisée) ou les portefeuilles\\n  ‘non custodial’, afin de traiter la complétude de toutes les transactions.</p>\\n<p>Important : n’entrez QUE les adresses des wallets non custodial que vous POSSEDEZ (dont vous détenez ou avez détenu\\n  les clés privées des actifs numériques) et aucun portefeuille avec lequel vous avez interagi (ex : si vous avez\\n  interagi avec un SmartContract, il ne faut pas en donner l'adresse à CryptoFiscaFacile, suivant le principe \\\"not your\\n  key, not your crypto, not to declare\\\" !).</p>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  Attention, ce n’est pas parce que vous entrez ces adresses et extrayez ces transactions que le portefeuille sera\\n  déclaré. Il est bien dit que la possession des portefeuilles non Custodial ne sont pas à déclarer ! D’ailleurs,\\n  CryptoFiscaFacile ne vous demandera jamais de date d’ouverture/fermeture ou ID pour ces portefeuilles.\\n</BsAlert>\\n<p><strong><em>Exemple</em></strong>: vous avez effectué un transfert depuis Crypto.com APP vers le portefeuille\\n  Crypto.com Wallet DeFi, en utilisant la mainnet crypto.org. l’injection du CSV Crypto.com APP fera apparaître une\\n  transaction de type “Retrait”, mais CryptoFiscaFacile ne sera pas capable de retrouver l’équivalent \\\"Dépôt\\\" afin d’en\\n  déduire la catégorie fiscale. Pour ce faire, il faudra interroger la blockchain crypto.org afin de voir une\\n  transaction de type “Dépôt” du même montant (modulo les frais). Ainsi CryptoFiscaFacile sera en mesure de déduire la\\n  réelle catégorie fiscale qui sera dans ce cas “Transfert” et de prendre en compte la balance du Wallet DeFi dans votre\\n  portefeuille global.</p>\\n<br />\", {\"contents\":\"<h4>Portefeuilles</h4>\\n<h5>Phase 1 : Ajout de toutes vos transactions</h5>\\n<p>Première étape cruciale dans votre déclaration, le rapatriement de toutes vos données de comptes d'actifs et de leurs\\n  transactions est nécessaire afin de lister toutes les transactions entrant dans le champ d'application de la loi.</p>\\n<p>\\n  Pour cette phase, il sera important de collecter ces données, via les moyens mis à votre disposition par\\n  l'application. Il s'agira de le permettre en utilisant l'un ou l'autre des moyens suivants :\\n  <ul>\\n    <li>Collecter ces données via des API</li>\\n    <li>Collecter les fichiers de type 'CSV' (sorte de tableur)</li>\\n    <li>Extraire des données via des fichiers JSON (fichier de structure de données)</li>\\n  </ul>\\n</p>\\n\\n<h6 class=\\\"red\\\">Ajout de TX via API (Vue Outils)</h6>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/wallet_api.png\\\" alt=\\\"api\\\" class=\\\"w-50\\\" />\\n</div>\\n<p>Une des possibilités offertes afin de rapatrier les transactions est l’utilisation d’API, si et seulement si la\\n  plateforme d’échange (Binance, Kraken…) concernée en fournit la capacité. Concrètement il s’agira de donner les droits\\n  à CryptoFiscaFacile sur la lecture de l’historique des transactions de la plateforme afin d’en importer le contenu\\n  dans votre base de données locale. Les procédures pour chaque plateforme d’échange afin de créer la connexion vous\\n  seront systématiquement données sur la page OUTILS.</p>\\n<p>Néanmoins, toutes les plateformes d’échanges ne fournissent pas de capacité d’API, c’est pourquoi d’autres méthodes\\n  vous sont fournies…</p>\\n\\n<h6 class=\\\"red\\\">Ajout de fichiers CSV</h6>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/csv_import.png\\\" alt=\\\"import\\\" class=\\\"w-75\\\" />\\n</div>\\n<p>La méthode la plus répandue consiste à extraire de la plateforme un fichier, généralement de type CSV, qui répertorie\\n  toutes les transactions survenues sur un laps de temps défini.</p>\\n<p>Il est possible qu’une plateforme d'échange vous propose uniquement l’extraction sur une courte période (ex. : cas de\\n  Binance avant 2022). Il sera donc nécessaire de réitérer l’opération autant de fois qu’il le faut afin d’en extraire\\n  les transactions sur la plage de temps souhaitée.</p>\\n<p>Chaque plateforme a sa façon propre d’extraire ces fichiers, c’est pourquoi il est impossible d’en répertorier leur\\n  intégralité. Néanmoins, sur chaque plateforme un centre d’aide est disponible et vous détaillera les manipulations.</p>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n  Évitez d’ouvrir vos fichiers CSV dans Excel ou toute suite bureautique, elles ont tendance à les modifier sans vous le\\n  dire et cela le rendrait inutilisable par CryptoFiscaFacile.\\n</BsAlert>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  <div class=\\\"d-flex justify-content-center mb-4\\\">\\n    <img src=\\\"/doc/support.png\\\" alt=\\\"support\\\" class=\\\"w-75\\\" />\\n  </div>\\n  Si lors de l’ajout de fichier CSV dans CryptoFiscaFacile, un bouton\\n  <strong>SUPPORT</strong>\\n  apparaît, cela veut dire qu'une ou plusieurs transactions à l’intérieur de ce fichier ne sont pas bien gérées par\\n  CryptoFiscaFacile. Dans ce cas veuillez suivre les instructions afin que nous puissions ajouter leur support dans les\\n  meilleurs délais.\\n</BsAlert>\\n\\n<h6 class=\\\"red\\\">Extractions particulières de fichiers sources</h6>\\n<p>CryptoFiscaFacile fournit également, via la même interface que pour les fichiers CSV, une autre manière de rapatrier\\n  ses transactions. Il s'agira d'extractions dans des cas particuliers où l’extraction via API ou par CSV s'avèrera être\\n  délicate ou indisponible.</p>\\n<p>Voici les procédures à suivre pour chaque plateforme couverte par l’application :</p>\\n<p><strong><em>Crypto.com Exchange</em></strong></p>\\n<ol>\\n  <li>S'identifier sur l'exchange dans son navigateur</li>\\n  <li>Clic droit puis choisir \\\"Inspecter\\\"</li>\\n  <li>Sélectionner l’onglet “Console”</li>\\n  <li>Copier le script suivant dans la console\\n    <Documentation::Script />\\n  </li>\\n  <li>Attendre quelques secondes et accepter (si nécessaire) le téléchargement du fichier JSON</li>\\n</ol>\\n<p>Vous vous retrouvez donc avec un fichier JSON, que l’application sera capable d’accepter via la page PORTEFEUILLES.</p>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  A ce stade, CryptoFiscaFacile n'identifie que la procédure spécifique ci-dessus. Si d'aventure d'autres méthodes\\n  étaient nécessaires, CryptoFiscaFacile produira une mise à jour de l'application ainsi que la documentation associée.\\n</BsAlert>\\n<p><strong><em>Xumm wallet</em></strong></p>\\n<ol>\\n  <li>Settings - Activer \\\"Show payments fees as separate transactions</li>\\n  <li>Export - Choisir les colonnes tx_type,direction,amount,date,currency,is_fee,fee,hash</li>\\n</ol>\\n\\n<h6 class=\\\"red\\\">Ajout de TX grâce aux extractions Blockchain</h6>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/bc_api.png\\\" alt=\\\"blockchain\\\" class=\\\"w-50\\\" />\\n</div>\\n<p>Une dernière méthode est fournie, capable de rapatrier des transactions sur les blockchains directement (BTC, ETH,\\n  Tezos…), grâce à vos adresses blockchain.</p>\\n<p>Ce principe sera principalement utilisé pour couvrir par exemple la DeFi (Finance Décentralisée) ou les portefeuilles\\n  ‘non custodial’, afin de traiter la complétude de toutes les transactions.</p>\\n<p>Important : n’entrez QUE les adresses des wallets non custodial que vous POSSEDEZ (dont vous détenez ou avez détenu\\n  les clés privées des actifs numériques) et aucun portefeuille avec lequel vous avez interagi (ex : si vous avez\\n  interagi avec un SmartContract, il ne faut pas en donner l'adresse à CryptoFiscaFacile, suivant le principe \\\"not your\\n  key, not your crypto, not to declare\\\" !).</p>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  Attention, ce n’est pas parce que vous entrez ces adresses et extrayez ces transactions que le portefeuille sera\\n  déclaré. Il est bien dit que la possession des portefeuilles non Custodial ne sont pas à déclarer ! D’ailleurs,\\n  CryptoFiscaFacile ne vous demandera jamais de date d’ouverture/fermeture ou ID pour ces portefeuilles.\\n</BsAlert>\\n<p><strong><em>Exemple</em></strong>: vous avez effectué un transfert depuis Crypto.com APP vers le portefeuille\\n  Crypto.com Wallet DeFi, en utilisant la mainnet crypto.org. l’injection du CSV Crypto.com APP fera apparaître une\\n  transaction de type “Retrait”, mais CryptoFiscaFacile ne sera pas capable de retrouver l’équivalent \\\"Dépôt\\\" afin d’en\\n  déduire la catégorie fiscale. Pour ce faire, il faudra interroger la blockchain crypto.org afin de voir une\\n  transaction de type “Dépôt” du même montant (modulo les frais). Ainsi CryptoFiscaFacile sera en mesure de déduire la\\n  réelle catégorie fiscale qui sera dans ce cas “Transfert” et de prendre en compte la balance du Wallet DeFi dans votre\\n  portefeuille global.</p>\\n<br />\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/manuel-portefeuilles.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/manuel-portefeuilles.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h4>Rapports</h4>\\n<h5>Phase 3 : Génération de vos données fiscales</h5>\\n<h6 class=\\\"red\\\">Contribuable</h6>\\n<p>Il s’agira ici uniquement de rentrer vos informations d'identification (nom, prénom et adresse e-mail), qui seront\\n  reportées sur les fichiers que vous génèrerez ci-après.</p>\\n\\n<h6 class=\\\"red\\\">3916 - Données de comptes utilisateurs</h6>\\n<p>Afin de vous appuyer dans la déclaration de tous vos comptes d'actifs numériques, cette section vous permettra de\\n  donner les informations.\\n</p>\\n<p>Reportez-vous à la section 2.2 pour les détails...\\n</p>\\n\\n<h6 class=\\\"red\\\">2086/2042/2047 - Spécificités Catégories</h6>\\n<p>Afin de générer le ou les rapports en question, il sera obligatoire de faire un choix pour l’exercice fiscal concerné\\n  sur les catégories suivantes :\\n  <ul>\\n    <li>Intérêt : Les Intérêts sont des 'intérêts' à l'étranger donc nécessitent le remplissage de la case 2TR du\\n      formulaire 2047,</li>\\n    <li>Parrainage : Les Parrainages vont s'additionner aux TX relatives au Minage, donc micro-BNC : case 5KU du\\n      formulaire 2042-C-PRO,</li>\\n    <li>AirDrop : Les Airdrops fortuits sont eux non imposables (pas besoin de les déclarer ailleurs),</li>\\n  </ul>\\n</p>\\n<p>Ces catégories doivent au choix être ajoutées au portefeuille avec valeur nulle, ou bien ajoutées au portefeuille\\n  avec une valorisation du jour de la transaction.</p>\\n\\n<h6 class=\\\"red\\\">Génération des rapports</h6>\\n<p>Dans le cas où toutes les précédentes étapes ont été remplies, il sera possible de générer vos documents :</p>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/gen.png\\\" alt=\\\"generation\\\" class=\\\"w-100\\\" />\\n</div>\\n<ul>\\n  <li class=\\\"mb-3\\\"><strong>Génération 3916</strong>\\n    : cette partie vous permettra de télécharger les informations relatives aux déclarations de vos comptes à\\n    l’étranger, donc liées aux CERFA 3916. Ces informations tiendront compte des données entrées en section\\n    <strong>3916 - Comptes à l’étranger</strong></li>\\n  <li class=\\\"mb-3\\\"><strong>Génération 2086</strong>\\n    : cette partie vous permettra de télécharger les informations relatives aux déclarations de vos plus values, donc\\n    liées CERFA 2086. Ces informations tiendront compte des données entrées en section\\n    <strong>2086/2042/2047 - Spécificités Catégories</strong></li>\\n  <li class=\\\"mb-3\\\"><strong>Fiche de Stock</strong>\\n    : CryptoFiscaFacile vous permet également à titre officieux de télécharger un tableur rassemblant par onglet chaque\\n    actif numérique détenu, ainsi que les transactions et la balance</li>\\n</ul>\\n<br />\", {\"contents\":\"<h4>Rapports</h4>\\n<h5>Phase 3 : Génération de vos données fiscales</h5>\\n<h6 class=\\\"red\\\">Contribuable</h6>\\n<p>Il s’agira ici uniquement de rentrer vos informations d'identification (nom, prénom et adresse e-mail), qui seront\\n  reportées sur les fichiers que vous génèrerez ci-après.</p>\\n\\n<h6 class=\\\"red\\\">3916 - Données de comptes utilisateurs</h6>\\n<p>Afin de vous appuyer dans la déclaration de tous vos comptes d'actifs numériques, cette section vous permettra de\\n  donner les informations.\\n</p>\\n<p>Reportez-vous à la section 2.2 pour les détails...\\n</p>\\n\\n<h6 class=\\\"red\\\">2086/2042/2047 - Spécificités Catégories</h6>\\n<p>Afin de générer le ou les rapports en question, il sera obligatoire de faire un choix pour l’exercice fiscal concerné\\n  sur les catégories suivantes :\\n  <ul>\\n    <li>Intérêt : Les Intérêts sont des 'intérêts' à l'étranger donc nécessitent le remplissage de la case 2TR du\\n      formulaire 2047,</li>\\n    <li>Parrainage : Les Parrainages vont s'additionner aux TX relatives au Minage, donc micro-BNC : case 5KU du\\n      formulaire 2042-C-PRO,</li>\\n    <li>AirDrop : Les Airdrops fortuits sont eux non imposables (pas besoin de les déclarer ailleurs),</li>\\n  </ul>\\n</p>\\n<p>Ces catégories doivent au choix être ajoutées au portefeuille avec valeur nulle, ou bien ajoutées au portefeuille\\n  avec une valorisation du jour de la transaction.</p>\\n\\n<h6 class=\\\"red\\\">Génération des rapports</h6>\\n<p>Dans le cas où toutes les précédentes étapes ont été remplies, il sera possible de générer vos documents :</p>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/gen.png\\\" alt=\\\"generation\\\" class=\\\"w-100\\\" />\\n</div>\\n<ul>\\n  <li class=\\\"mb-3\\\"><strong>Génération 3916</strong>\\n    : cette partie vous permettra de télécharger les informations relatives aux déclarations de vos comptes à\\n    l’étranger, donc liées aux CERFA 3916. Ces informations tiendront compte des données entrées en section\\n    <strong>3916 - Comptes à l’étranger</strong></li>\\n  <li class=\\\"mb-3\\\"><strong>Génération 2086</strong>\\n    : cette partie vous permettra de télécharger les informations relatives aux déclarations de vos plus values, donc\\n    liées CERFA 2086. Ces informations tiendront compte des données entrées en section\\n    <strong>2086/2042/2047 - Spécificités Catégories</strong></li>\\n  <li class=\\\"mb-3\\\"><strong>Fiche de Stock</strong>\\n    : CryptoFiscaFacile vous permet également à titre officieux de télécharger un tableur rassemblant par onglet chaque\\n    actif numérique détenu, ainsi que les transactions et la balance</li>\\n</ul>\\n<br />\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/manuel-rapports.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/manuel-rapports.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h4>Transactions</h4>\\n<h5>Phase 2 : Vérification de la complétude de vos transactions</h5>\\n<p>Cette page vous fournit une table qui regroupe\\n  <strong>TOUTES</strong>\\n  les transactions effectives de votre portefeuille. Celle-ci vous facilitera la tâche, car le moteur CryptoFiscaFacile\\n  aura permis d’éviter les doublons, de rapprocher les transactions inter-plateformes, et d'identifier les potentielles\\n  transactions en attente de catégorisation.</p>\\n\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n  Afin d’assurer une mise à disposition cohérente des informations, il est\\n  <strong>PLUS QUE RECOMMANDE</strong>\\n  d’avoir importé TOUTES vos transactions de TOUTES vos plateformes, pour ensuite commencer à catégoriser le restant.\\n  Sans quoi vous vous exposez à des calculs erronés pour les formulaires d’imposition.\\n</BsAlert>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n  Le ‘restant‘ s’entend par les transactions dont la catégorie est DEPOT ou RETRAIT et pour lesquelles une icône\\n  apparaît sur la droite du tableau. Pour ces transactions, il sera important de choisir la bonne ou la meilleure\\n  catégorie. A défaut, CryptoFiscaFacile appliquera la catégorie la moins avantageuse pour vous : Retrait = CashOut\\n  (sortie du PF et cession imposable), dépôt = Don reçu (60%).\\n</BsAlert>\\n<p>\\n  Pour ce faire et afin de rendre la tâche plus aisée, 3 types d’actions seront à votre disposition :\\n  <ol>\\n    <li>le bouton <em>FILTRER</em> afin de ne sélectionner que les transactions qui vous intéressent</li>\\n    <li>le bouton <em>VALIDER</em> afin de visualiser s’il reste des problèmes dans la complétude des calculs</li>\\n    <li>L'icône de <em>CATÉGORISATION</em> afin de donner la réelle catégorie de la transaction</li>\\n  </ol>\\n</p>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  Note : Actions 2 et 3 qui devront être répétées autant de fois que nécessaire.\\n</BsAlert>\\n\\n<h6 class=\\\"red\\\">Informations Table</h6>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/table.png\\\" alt=\\\"table\\\" class=\\\"w-100\\\" />\\n</div>\\n<p>\\n  Au sein de cette table, vous retrouverez les informations suivantes :\\n  <ul>\\n    <li><strong>Multi</strong>\\n      : Faire une sélection multiple des TX ‘RETRAIT’ ou 'DÉPÔT' afin de les catégoriser en groupe via l'icône\\n      <App::Icon @icon=\\\"ion:build\\\" width=\\\"15\\\" /></li>\\n    <li><strong>Date</strong> : date de la transaction dans le fuseau horaire Français (Paris)</li>\\n    <li><strong>Portefeuille</strong>\\n      : plateforme (portefeuille ou wallet, custodial ou non custodial) d’échange d’actifs numériques</li>\\n    <li><strong>Catégorie</strong>\\n      : catégorie fiscale induite par la transaction et déduite par le moteur CryptoFiscaFacile</li>\\n    <li><strong>De/Sortie</strong>\\n      : L'intitulé DE se réfère à tout échange de symboles (par ex. : DE 50 000 EUR (vers) 1 BTC), tandis que l'intitulé\\n      SORTIE se comprend comme le coin qui sortira du portefeuille dans le cas d'un retrait</li>\\n    <li><strong>Vers/Entrée</strong>\\n      : L'intitulé VERS se réfère à tout échange de symboles (par ex. : (de) 50 000 EUR VERS 1 BTC), tandis que\\n      l'intitulé ENTRÉE se comprend comme le coin qui entrera dans le portefeuille dans le cas d'un dépôt.</li>\\n    <li><strong>Frais</strong> : la colonne FRAIS vous donnera les frais éventuels de la transaction</li>\\n    <li><strong>Configuration/État</strong>\\n      : 2 types d’informations apparaîtront ici :\\n      <ul>\\n        <li>Un statut de chaque TX</li>\\n        <li>Une icône de CATÉGORISATION\\n          <App::Icon @icon=\\\"ion:build\\\" class=\\\"align-middle\\\" width=\\\"15\\\" />\\n          qui vous permettra de choisir une catégorie pour remplacer le type par défaut ‘RETRAIT’ ou 'DÉPÔT' (ex. : TX\\n          qui sera finalement relative à un AIRDROP...)</li>\\n        <li><em>(Optionnel)</em>\\n          Une icône\\n          <App::Icon @icon=\\\"ion:arrow-undo\\\" class=\\\"align-middle\\\" width=\\\"15\\\" />\\n          vous permettant de défaire une fusion.</li>\\n        <li><em>(Optionnel)</em>\\n          Une icône\\n          <App::Icon @icon=\\\"ion:calculator\\\" class=\\\"align-middle\\\" width=\\\"15\\\" />\\n          vous permettant de modifier la conversion en monnaie FIAT d'un cashOut.</li>\\n      </ul>\\n    </li>\\n  </ul>\\n</p>\\n\\n<h6 class=\\\"red\\\">Catégorisation</h6>\\n<p>Chaque transaction doit être catégorisée afin de subir le traitement fiscal adéquat.</p>\\n<p>En voici la logique :\\n</p>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/categ.png\\\" alt=\\\"categsflow\\\" class=\\\"w-75\\\" />\\n</div>\\n<p>La majorité des Transactions seront catégorisées automatiquement par CryptoFiscaFacile, mais pour les transactions\\n  restantes, de type RETRAIT ou DÉPÔT, vous devrez le faire manuellement grâce à l'icône de CATÉGORISATION.</p>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/line.png\\\" alt=\\\"table-circled\\\" class=\\\"w-100\\\" />\\n</div>\\n\\n<p>Dans ce cas, une boîte de dialogue vous proposera les catégories possibles :\\n  <ul>\\n    <li>Pour un\\n      <em>RETRAIT</em>\\n      <ul>\\n        <li>CashOut</li>\\n        <li>Don (émis)</li>\\n        <li>Ignorer (exclure la transaction de tous calculs)</li>\\n      </ul>\\n    </li>\\n    <li>Pour un\\n      <em>DEPOT</em>\\n      <ul>\\n        <li>Airdrop</li>\\n        <li>Cashin</li>\\n        <li>Don (reçu)</li>\\n        <li>Fork</li>\\n        <li>Intérêts</li>\\n        <li>Minage</li>\\n        <li>Parrainage</li>\\n        <li>Remise Commerciale</li>\\n        <li>Ignorer (exclure la transaction de tous calculs)</li>\\n      </ul>\\n    </li>\\n  </ul>\\n</p>\\n\\n<h6 class=\\\"red\\\">Validation</h6>\\n<p>Partie importante du processus en phase 2, les 4 étapes que CryptoFiscaFacile vous proposent via le bouton VALDER de\\n  la page\\n  <LinkTo @route=\\\"transactions\\\">Transactions</LinkTo>\\n  vous permettront de vérifier la complétude de\\n  <strong>tous vos imports</strong>, en calculant les balances de tokens, en détectant les dépôts et retraits\\n  incohérents ou manquants ainsi qu'en proposant des alternatives ou des choix de fusion :</p>\\n<ol>\\n  <li class=\\\"mb-3\\\"><strong>Step 1 / 4</strong>\\n    : vous permettra de vous avertir d'incohérences sur les types d'origine et de destination des transactions. Pour ce\\n    problème, il conviendra de contacter le support afin d'en déterminer la cause réelle.</li>\\n  <li class=\\\"mb-3\\\"><strong>Step 2 / 4</strong>\\n    : il se peut que le moteur CryptoFiscaFacile ne parviennent pas à rapprocher 2 transactions Dépôts et Retrait. Afin\\n    de manuellement et potentiellement rattraper ces erreurs, CryptoFiscaFacile vous présentera différentes possibilités\\n    afin de fusionner des transactions en Transfert (le cas échéant).</li>\\n  <li class=\\\"mb-3\\\"><strong>Step 3 / 4</strong>\\n    : il peut arriver lorsque tous les portefeuilles n'ont pas été importés, que l'outil détecte des balances négatives.\\n    Cette étape vous permettra de potentiellement choisir une fusion de transactions afin de régler le problème des\\n    balances négatives sur certains tokens.</li>\\n  <li class=\\\"mb-3\\\"><strong>Step 4 / 4</strong>\\n    : enfin si vous avez participé à des ICO de tokens, la dernière étape vous permettra d'en faire part à\\n    CryptoFiscaFacile. Il s'agira de sélectionner les transactions en lien, puis de fusionner les-dites transactions\\n    afin que CryptoFiscaFacile intègre au moteur le type \\\"ICO\\\". Les calculs fiscaux pouvant être impactés par cette\\n    détection, il est donc important de l'intégrer à l'outil.</li>\\n</ol>\\n<br />\", {\"contents\":\"<h4>Transactions</h4>\\n<h5>Phase 2 : Vérification de la complétude de vos transactions</h5>\\n<p>Cette page vous fournit une table qui regroupe\\n  <strong>TOUTES</strong>\\n  les transactions effectives de votre portefeuille. Celle-ci vous facilitera la tâche, car le moteur CryptoFiscaFacile\\n  aura permis d’éviter les doublons, de rapprocher les transactions inter-plateformes, et d'identifier les potentielles\\n  transactions en attente de catégorisation.</p>\\n\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n  Afin d’assurer une mise à disposition cohérente des informations, il est\\n  <strong>PLUS QUE RECOMMANDE</strong>\\n  d’avoir importé TOUTES vos transactions de TOUTES vos plateformes, pour ensuite commencer à catégoriser le restant.\\n  Sans quoi vous vous exposez à des calculs erronés pour les formulaires d’imposition.\\n</BsAlert>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n  Le ‘restant‘ s’entend par les transactions dont la catégorie est DEPOT ou RETRAIT et pour lesquelles une icône\\n  apparaît sur la droite du tableau. Pour ces transactions, il sera important de choisir la bonne ou la meilleure\\n  catégorie. A défaut, CryptoFiscaFacile appliquera la catégorie la moins avantageuse pour vous : Retrait = CashOut\\n  (sortie du PF et cession imposable), dépôt = Don reçu (60%).\\n</BsAlert>\\n<p>\\n  Pour ce faire et afin de rendre la tâche plus aisée, 3 types d’actions seront à votre disposition :\\n  <ol>\\n    <li>le bouton <em>FILTRER</em> afin de ne sélectionner que les transactions qui vous intéressent</li>\\n    <li>le bouton <em>VALIDER</em> afin de visualiser s’il reste des problèmes dans la complétude des calculs</li>\\n    <li>L'icône de <em>CATÉGORISATION</em> afin de donner la réelle catégorie de la transaction</li>\\n  </ol>\\n</p>\\n<BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n  Note : Actions 2 et 3 qui devront être répétées autant de fois que nécessaire.\\n</BsAlert>\\n\\n<h6 class=\\\"red\\\">Informations Table</h6>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/table.png\\\" alt=\\\"table\\\" class=\\\"w-100\\\" />\\n</div>\\n<p>\\n  Au sein de cette table, vous retrouverez les informations suivantes :\\n  <ul>\\n    <li><strong>Multi</strong>\\n      : Faire une sélection multiple des TX ‘RETRAIT’ ou 'DÉPÔT' afin de les catégoriser en groupe via l'icône\\n      <App::Icon @icon=\\\"ion:build\\\" width=\\\"15\\\" /></li>\\n    <li><strong>Date</strong> : date de la transaction dans le fuseau horaire Français (Paris)</li>\\n    <li><strong>Portefeuille</strong>\\n      : plateforme (portefeuille ou wallet, custodial ou non custodial) d’échange d’actifs numériques</li>\\n    <li><strong>Catégorie</strong>\\n      : catégorie fiscale induite par la transaction et déduite par le moteur CryptoFiscaFacile</li>\\n    <li><strong>De/Sortie</strong>\\n      : L'intitulé DE se réfère à tout échange de symboles (par ex. : DE 50 000 EUR (vers) 1 BTC), tandis que l'intitulé\\n      SORTIE se comprend comme le coin qui sortira du portefeuille dans le cas d'un retrait</li>\\n    <li><strong>Vers/Entrée</strong>\\n      : L'intitulé VERS se réfère à tout échange de symboles (par ex. : (de) 50 000 EUR VERS 1 BTC), tandis que\\n      l'intitulé ENTRÉE se comprend comme le coin qui entrera dans le portefeuille dans le cas d'un dépôt.</li>\\n    <li><strong>Frais</strong> : la colonne FRAIS vous donnera les frais éventuels de la transaction</li>\\n    <li><strong>Configuration/État</strong>\\n      : 2 types d’informations apparaîtront ici :\\n      <ul>\\n        <li>Un statut de chaque TX</li>\\n        <li>Une icône de CATÉGORISATION\\n          <App::Icon @icon=\\\"ion:build\\\" class=\\\"align-middle\\\" width=\\\"15\\\" />\\n          qui vous permettra de choisir une catégorie pour remplacer le type par défaut ‘RETRAIT’ ou 'DÉPÔT' (ex. : TX\\n          qui sera finalement relative à un AIRDROP...)</li>\\n        <li><em>(Optionnel)</em>\\n          Une icône\\n          <App::Icon @icon=\\\"ion:arrow-undo\\\" class=\\\"align-middle\\\" width=\\\"15\\\" />\\n          vous permettant de défaire une fusion.</li>\\n        <li><em>(Optionnel)</em>\\n          Une icône\\n          <App::Icon @icon=\\\"ion:calculator\\\" class=\\\"align-middle\\\" width=\\\"15\\\" />\\n          vous permettant de modifier la conversion en monnaie FIAT d'un cashOut.</li>\\n      </ul>\\n    </li>\\n  </ul>\\n</p>\\n\\n<h6 class=\\\"red\\\">Catégorisation</h6>\\n<p>Chaque transaction doit être catégorisée afin de subir le traitement fiscal adéquat.</p>\\n<p>En voici la logique :\\n</p>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/categ.png\\\" alt=\\\"categsflow\\\" class=\\\"w-75\\\" />\\n</div>\\n<p>La majorité des Transactions seront catégorisées automatiquement par CryptoFiscaFacile, mais pour les transactions\\n  restantes, de type RETRAIT ou DÉPÔT, vous devrez le faire manuellement grâce à l'icône de CATÉGORISATION.</p>\\n<div class=\\\"d-flex justify-content-center mb-4\\\">\\n  <img src=\\\"/doc/line.png\\\" alt=\\\"table-circled\\\" class=\\\"w-100\\\" />\\n</div>\\n\\n<p>Dans ce cas, une boîte de dialogue vous proposera les catégories possibles :\\n  <ul>\\n    <li>Pour un\\n      <em>RETRAIT</em>\\n      <ul>\\n        <li>CashOut</li>\\n        <li>Don (émis)</li>\\n        <li>Ignorer (exclure la transaction de tous calculs)</li>\\n      </ul>\\n    </li>\\n    <li>Pour un\\n      <em>DEPOT</em>\\n      <ul>\\n        <li>Airdrop</li>\\n        <li>Cashin</li>\\n        <li>Don (reçu)</li>\\n        <li>Fork</li>\\n        <li>Intérêts</li>\\n        <li>Minage</li>\\n        <li>Parrainage</li>\\n        <li>Remise Commerciale</li>\\n        <li>Ignorer (exclure la transaction de tous calculs)</li>\\n      </ul>\\n    </li>\\n  </ul>\\n</p>\\n\\n<h6 class=\\\"red\\\">Validation</h6>\\n<p>Partie importante du processus en phase 2, les 4 étapes que CryptoFiscaFacile vous proposent via le bouton VALDER de\\n  la page\\n  <LinkTo @route=\\\"transactions\\\">Transactions</LinkTo>\\n  vous permettront de vérifier la complétude de\\n  <strong>tous vos imports</strong>, en calculant les balances de tokens, en détectant les dépôts et retraits\\n  incohérents ou manquants ainsi qu'en proposant des alternatives ou des choix de fusion :</p>\\n<ol>\\n  <li class=\\\"mb-3\\\"><strong>Step 1 / 4</strong>\\n    : vous permettra de vous avertir d'incohérences sur les types d'origine et de destination des transactions. Pour ce\\n    problème, il conviendra de contacter le support afin d'en déterminer la cause réelle.</li>\\n  <li class=\\\"mb-3\\\"><strong>Step 2 / 4</strong>\\n    : il se peut que le moteur CryptoFiscaFacile ne parviennent pas à rapprocher 2 transactions Dépôts et Retrait. Afin\\n    de manuellement et potentiellement rattraper ces erreurs, CryptoFiscaFacile vous présentera différentes possibilités\\n    afin de fusionner des transactions en Transfert (le cas échéant).</li>\\n  <li class=\\\"mb-3\\\"><strong>Step 3 / 4</strong>\\n    : il peut arriver lorsque tous les portefeuilles n'ont pas été importés, que l'outil détecte des balances négatives.\\n    Cette étape vous permettra de potentiellement choisir une fusion de transactions afin de régler le problème des\\n    balances négatives sur certains tokens.</li>\\n  <li class=\\\"mb-3\\\"><strong>Step 4 / 4</strong>\\n    : enfin si vous avez participé à des ICO de tokens, la dernière étape vous permettra d'en faire part à\\n    CryptoFiscaFacile. Il s'agira de sélectionner les transactions en lien, puis de fusionner les-dites transactions\\n    afin que CryptoFiscaFacile intègre au moteur le type \\\"ICO\\\". Les calculs fiscaux pouvant être impactés par cette\\n    détection, il est donc important de l'intégrer à l'outil.</li>\\n</ol>\\n<br />\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/manuel-transactions.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/manuel-transactions.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h4>CGU et Mentions Légales</h4>\\n<h5 class=\\\"mt-4\\\">Identité</h5>\\n<div>\\n  <p class=\\\"m-0\\\"><em>Nom</em> : CryptoFiscaFacile </p>\\n  <p class=\\\"m-0\\\"><em>URL</em>\\n    :\\n    <a href=\\\"https://crypto.fiscafacile.com/\\\">https://crypto.fiscafacile.com</a>\\n  </p>\\n  <p class=\\\"m-0\\\"><em>Propriétaire</em> : CryptoFiscaFacile</p>\\n  <p class=\\\"mt-0\\\"><em>Responsable de publication</em> : CryptoFiscaFacile</p>\\n\\n  <p class=\\\"m-0\\\"><em>Conception et réalisation</em> : CryptoFiscaFacile</p>\\n  <p class=\\\"m-0\\\"><em>Hébergement</em>\\n    :\\n    <App::ExternalLink href=\\\"https://www.cloudflare.com/cdn/\\\">Cloudflare, Inc</App::ExternalLink></p>\\n  <p class=\\\"mt-0\\\"><em>Mesure d'audiences</em>\\n    :\\n    <App::ExternalLink href=\\\"https://www.cloudflare.com/web-analytics/\\\">Cloudflare, Inc</App::ExternalLink></p>\\n</div>\\n\\n<h5 class=\\\"mt-4\\\">Conditions d'utilisation</h5>\\n<div>\\n  <p>L’utilisation de la présente application implique l’acceptation pleine et entière des conditions générales\\n    d’utilisation décrites ci-après. Ces conditions d’utilisation sont susceptibles d’être modifiées ou complétées à\\n    tout moment.</p>\\n</div>\\n\\n<h5 class=\\\"mt-4\\\">Informations</h5>\\n<div>\\n  <p>Les informations, calculs et documents du site sont présentés à titre indicatif, n’ont pas de caractère exhaustif,\\n    et ne peuvent engager la responsabilité du propriétaire.</p>\\n\\n  <p>Le propriétaire de l'application ne peut être tenu responsable des dommages directs et indirects consécutifs à\\n    l’accès ou l'obtention de la dite l'application.</p>\\n</div>\\n\\n<h5 class=\\\"mt-4\\\">Propriété intellectuelle</h5>\\n<div>\\n  <p class=\\\"m-0\\\">Application sous licence\\n    <em>MIT</em>. Voir\\n    <App::ExternalLink href=\\\"https://choosealicense.com/licenses/mit/\\\">cette page</App::ExternalLink>\\n    pour tout détail.</p>\\n</div>\\n\\n<h5 class=\\\"mt-4\\\">Liens</h5>\\n<div>\\n  <p><strong><em>Liens sortants : </em></strong>\\n    Le propriétaire de l'application décline toute responsabilité et n’est pas engagé par le référencement via des liens\\n    hypertextes, de ressources tierces présentes sur le réseau Internet, tant en ce qui concerne leur contenu que leur\\n    pertinence.</p>\\n\\n  <p><strong><em>Liens entrants : </em></strong>\\n    Le propriétaire de l'application se réserve le droit de demander la suppression d’un lien s’il estime que le site\\n    source ne respecte pas les règles ainsi définies.</p>\\n</div>\\n\\n<h5 class=\\\"mt-4\\\">Confidentialité</h5>\\n<div>\\n  <p>L'application ne recueille pas d’informations personnelles, ni ne les stocke sur des infrastructures de réseau, et\\n    n’est pas assujettie à déclaration auprès de la CNIL.</p>\\n</div>\\n\\n<h5 class=\\\"mt-4\\\">Copyright</h5>\\n<div>\\n  <p class=\\\"m-0\\\">Copyright © 2021-present</p>\\n</div>\", {\"contents\":\"<h4>CGU et Mentions Légales</h4>\\n<h5 class=\\\"mt-4\\\">Identité</h5>\\n<div>\\n  <p class=\\\"m-0\\\"><em>Nom</em> : CryptoFiscaFacile </p>\\n  <p class=\\\"m-0\\\"><em>URL</em>\\n    :\\n    <a href=\\\"https://crypto.fiscafacile.com/\\\">https://crypto.fiscafacile.com</a>\\n  </p>\\n  <p class=\\\"m-0\\\"><em>Propriétaire</em> : CryptoFiscaFacile</p>\\n  <p class=\\\"mt-0\\\"><em>Responsable de publication</em> : CryptoFiscaFacile</p>\\n\\n  <p class=\\\"m-0\\\"><em>Conception et réalisation</em> : CryptoFiscaFacile</p>\\n  <p class=\\\"m-0\\\"><em>Hébergement</em>\\n    :\\n    <App::ExternalLink href=\\\"https://www.cloudflare.com/cdn/\\\">Cloudflare, Inc</App::ExternalLink></p>\\n  <p class=\\\"mt-0\\\"><em>Mesure d'audiences</em>\\n    :\\n    <App::ExternalLink href=\\\"https://www.cloudflare.com/web-analytics/\\\">Cloudflare, Inc</App::ExternalLink></p>\\n</div>\\n\\n<h5 class=\\\"mt-4\\\">Conditions d'utilisation</h5>\\n<div>\\n  <p>L’utilisation de la présente application implique l’acceptation pleine et entière des conditions générales\\n    d’utilisation décrites ci-après. Ces conditions d’utilisation sont susceptibles d’être modifiées ou complétées à\\n    tout moment.</p>\\n</div>\\n\\n<h5 class=\\\"mt-4\\\">Informations</h5>\\n<div>\\n  <p>Les informations, calculs et documents du site sont présentés à titre indicatif, n’ont pas de caractère exhaustif,\\n    et ne peuvent engager la responsabilité du propriétaire.</p>\\n\\n  <p>Le propriétaire de l'application ne peut être tenu responsable des dommages directs et indirects consécutifs à\\n    l’accès ou l'obtention de la dite l'application.</p>\\n</div>\\n\\n<h5 class=\\\"mt-4\\\">Propriété intellectuelle</h5>\\n<div>\\n  <p class=\\\"m-0\\\">Application sous licence\\n    <em>MIT</em>. Voir\\n    <App::ExternalLink href=\\\"https://choosealicense.com/licenses/mit/\\\">cette page</App::ExternalLink>\\n    pour tout détail.</p>\\n</div>\\n\\n<h5 class=\\\"mt-4\\\">Liens</h5>\\n<div>\\n  <p><strong><em>Liens sortants : </em></strong>\\n    Le propriétaire de l'application décline toute responsabilité et n’est pas engagé par le référencement via des liens\\n    hypertextes, de ressources tierces présentes sur le réseau Internet, tant en ce qui concerne leur contenu que leur\\n    pertinence.</p>\\n\\n  <p><strong><em>Liens entrants : </em></strong>\\n    Le propriétaire de l'application se réserve le droit de demander la suppression d’un lien s’il estime que le site\\n    source ne respecte pas les règles ainsi définies.</p>\\n</div>\\n\\n<h5 class=\\\"mt-4\\\">Confidentialité</h5>\\n<div>\\n  <p>L'application ne recueille pas d’informations personnelles, ni ne les stocke sur des infrastructures de réseau, et\\n    n’est pas assujettie à déclaration auprès de la CNIL.</p>\\n</div>\\n\\n<h5 class=\\\"mt-4\\\">Copyright</h5>\\n<div>\\n  <p class=\\\"m-0\\\">Copyright © 2021-present</p>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/mentions.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/mentions.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<button\\n  class=\\\"nav-link ms-0 ms-xl-2 {{if (eq @tab.activeId @tabId) 'active'}}\\\"\\n  type=\\\"button\\\"\\n  role=\\\"tab\\\"\\n  aria-selected=\\\"{{eq @tab.activeId @tabId}}\\\"\\n  onclick={{fn @tab.select @tabId}}\\n>\\n  {{yield}}\\n</button>\", {\"contents\":\"<button\\n  class=\\\"nav-link ms-0 ms-xl-2 {{if (eq @tab.activeId @tabId) 'active'}}\\\"\\n  type=\\\"button\\\"\\n  role=\\\"tab\\\"\\n  aria-selected=\\\"{{eq @tab.activeId @tabId}}\\\"\\n  onclick={{fn @tab.select @tabId}}\\n>\\n  {{yield}}\\n</button>\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/nav-item.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/nav-item.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h4>Déclarations liées aux Plus/Moins Values</h4>\\n<h5>Différence entre occasionnel et habituel (professionnel)</h5>\\n<div>\\n  <p>\\n    La nuance est sujet à interprétation par l'administration fiscale. Cela dépend du nombre de trades, de leur\\n    fréquence, du volume tradé, si la personne est salariée en parellèle, du montant et des gains, de la répartition\\n    entre ses revenus salariaux et de cryptomonnaies.\\n  </p>\\n  <p>\\n    <strong>Extrait du BOFIP détaillant cette caractérisation :</strong>\\n    “Les critères d'exercice habituel ou occasionnel de l'activité résultent de l'examen, au cas par cas, des\\n    circonstances de fait dans lesquelles les opérations d'achat et de revente sont réalisées (les délais séparant les\\n    dates d'achat et de revente, le nombre d'actifs numériques vendus, les conditions de leur acquisition, etc.)”.\\n  </p>\\n  <p>Un seul critère ne fait pas basculer en habituel, c’est un ensemble de faisceaux d’indices qui peut pousser\\n    l’administration fiscale à vous requalifier mais ces requalifications sont rares car ce sont des procédures longues\\n    qui finissent souvent devant la justice.\\n  </p>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n    <strong>CryptoFiscaFacile ne traite que de l'occasionnel...</strong>\\n  </BsAlert>\\n</div>\\n<hr />\\n\\n<h5 class=\\\"red\\\">Plus/Moins value lors d’une cession</h5>\\n<p>Chaque contribuable possède un patrimoine, en l'occurrence un portefeuille 'global'. Ce portefeuille évolue avec le\\n  temps, avec des rentrées de liquidités (que l'on nomme CashIn), et des sorties de capital (CashOut). Ces sorties de\\n  portefeuille s'appellent des cessions, et sont à ce titre assujetties au régime des Plus/Moins Values.</p>\\n\\n<div>\\n  <p>\\n    Pour ces cessions, contre monnaies FIAT, biens ou services, il conviendra de s'assurer :\\n    <ul>\\n      <li>Qu'un formulaire CERFA 2086 soit rempli de manière cohérente</li>\\n      <li>De manière vulgarisée, pour calculer la plus value :\\n        <ul>\\n          <li><em>Plus ou moins-value brute = Prix de cession – [Prix Total d'Acquisition x Prix de cession / Valeur\\n              globale du portefeuille]</em></li>\\n        </ul>\\n      </li>\\n    </ul>\\n  </p>\\n  <p>\\n    <strong>Dans tous ces cas, le régime de la Flat-tax s'appliquera : 30% | 12,8% IR + 17,2% PS.</strong>\\n  </p>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n    <strong>Ces informations sont données à titre indicatif. CryptoFiscaFacile fera les calculs pour vous..</strong>\\n  </BsAlert>\\n\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Note 1 : les 'stablecoins' ne sont pas assimilés à du FIAT mais bien à des actifs numériques donc les cessions\\n    crypto-crypto bénéficient pour l'instant d’un sursis d’imposition. C'est-à-dire que ces transactions génèrent une\\n    plus value latente qui sera imposée seulement lors d’une cession à titre onéreux contre du FIAT ou lors de l’achat\\n    d’un bien et service.\\n  </BsAlert>\\n\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Note 2 : les moins values ne sont pas reportables d’une année sur l’autre.\\n  </BsAlert>\\n\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Note 3 : les dépenses avec une carte bancaire crypto de type Binance ou Ledger sont fiscalisables (chaque dépense =\\n    une cession) si vous avez rechargé votre carte avec des cryptos. Si vous avez rechargé cette carte en FIAT (euros,\\n    dollars, etc) et dépensé directement en FIAT alors les dépenses ne sont pas assimilables à des cessions d'actifs\\n    numériques.\\n  </BsAlert>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Note 4 : l’utilisation d’une carte bancaire Crypto.com fonctionne suivant les principes suivants :\\n    <ul>\\n      <li>la carte peut être rechargée en FIAT directement depuis le portefeuille FIAT Crypto.com (euros, GBP), dans ce\\n        cas les dépenses sont directement en FIAT.\\n        <strong>Ces dépenses ne sont donc pas assimilables à des cessions.</strong></li>\\n      <li>la carte peut aussi être rechargée depuis le portefeuille crypto. Dans ce cas, une cession Crypto vers FIAT\\n        est effectuée lors du chargement de la carte.<strong>\\n          Il y aura dans cette situation des cessions imposables à chaque chargement de la carte.</strong></li>\\n    </ul>\\n  </BsAlert>\\n</div>\", {\"contents\":\"<h4>Déclarations liées aux Plus/Moins Values</h4>\\n<h5>Différence entre occasionnel et habituel (professionnel)</h5>\\n<div>\\n  <p>\\n    La nuance est sujet à interprétation par l'administration fiscale. Cela dépend du nombre de trades, de leur\\n    fréquence, du volume tradé, si la personne est salariée en parellèle, du montant et des gains, de la répartition\\n    entre ses revenus salariaux et de cryptomonnaies.\\n  </p>\\n  <p>\\n    <strong>Extrait du BOFIP détaillant cette caractérisation :</strong>\\n    “Les critères d'exercice habituel ou occasionnel de l'activité résultent de l'examen, au cas par cas, des\\n    circonstances de fait dans lesquelles les opérations d'achat et de revente sont réalisées (les délais séparant les\\n    dates d'achat et de revente, le nombre d'actifs numériques vendus, les conditions de leur acquisition, etc.)”.\\n  </p>\\n  <p>Un seul critère ne fait pas basculer en habituel, c’est un ensemble de faisceaux d’indices qui peut pousser\\n    l’administration fiscale à vous requalifier mais ces requalifications sont rares car ce sont des procédures longues\\n    qui finissent souvent devant la justice.\\n  </p>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n    <strong>CryptoFiscaFacile ne traite que de l'occasionnel...</strong>\\n  </BsAlert>\\n</div>\\n<hr />\\n\\n<h5 class=\\\"red\\\">Plus/Moins value lors d’une cession</h5>\\n<p>Chaque contribuable possède un patrimoine, en l'occurrence un portefeuille 'global'. Ce portefeuille évolue avec le\\n  temps, avec des rentrées de liquidités (que l'on nomme CashIn), et des sorties de capital (CashOut). Ces sorties de\\n  portefeuille s'appellent des cessions, et sont à ce titre assujetties au régime des Plus/Moins Values.</p>\\n\\n<div>\\n  <p>\\n    Pour ces cessions, contre monnaies FIAT, biens ou services, il conviendra de s'assurer :\\n    <ul>\\n      <li>Qu'un formulaire CERFA 2086 soit rempli de manière cohérente</li>\\n      <li>De manière vulgarisée, pour calculer la plus value :\\n        <ul>\\n          <li><em>Plus ou moins-value brute = Prix de cession – [Prix Total d'Acquisition x Prix de cession / Valeur\\n              globale du portefeuille]</em></li>\\n        </ul>\\n      </li>\\n    </ul>\\n  </p>\\n  <p>\\n    <strong>Dans tous ces cas, le régime de la Flat-tax s'appliquera : 30% | 12,8% IR + 17,2% PS.</strong>\\n  </p>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n    <strong>Ces informations sont données à titre indicatif. CryptoFiscaFacile fera les calculs pour vous..</strong>\\n  </BsAlert>\\n\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Note 1 : les 'stablecoins' ne sont pas assimilés à du FIAT mais bien à des actifs numériques donc les cessions\\n    crypto-crypto bénéficient pour l'instant d’un sursis d’imposition. C'est-à-dire que ces transactions génèrent une\\n    plus value latente qui sera imposée seulement lors d’une cession à titre onéreux contre du FIAT ou lors de l’achat\\n    d’un bien et service.\\n  </BsAlert>\\n\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Note 2 : les moins values ne sont pas reportables d’une année sur l’autre.\\n  </BsAlert>\\n\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Note 3 : les dépenses avec une carte bancaire crypto de type Binance ou Ledger sont fiscalisables (chaque dépense =\\n    une cession) si vous avez rechargé votre carte avec des cryptos. Si vous avez rechargé cette carte en FIAT (euros,\\n    dollars, etc) et dépensé directement en FIAT alors les dépenses ne sont pas assimilables à des cessions d'actifs\\n    numériques.\\n  </BsAlert>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Note 4 : l’utilisation d’une carte bancaire Crypto.com fonctionne suivant les principes suivants :\\n    <ul>\\n      <li>la carte peut être rechargée en FIAT directement depuis le portefeuille FIAT Crypto.com (euros, GBP), dans ce\\n        cas les dépenses sont directement en FIAT.\\n        <strong>Ces dépenses ne sont donc pas assimilables à des cessions.</strong></li>\\n      <li>la carte peut aussi être rechargée depuis le portefeuille crypto. Dans ce cas, une cession Crypto vers FIAT\\n        est effectuée lors du chargement de la carte.<strong>\\n          Il y aura dans cette situation des cessions imposables à chaque chargement de la carte.</strong></li>\\n    </ul>\\n  </BsAlert>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/plus-value.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/plus-value.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h4>Déclarations liées aux Revenus</h4>\\n<h5>Séparation Revenus et Plus/moins Values</h5>\\n<div>\\n  <p>\\n    Dans tous les cas de figure, il faut séparer les revenus de la plus/moins value.\\n    <ul>\\n      <li><strong>Un revenu</strong>\\n        : un revenu perçu en crypto peut être un salaire, des intérêts de earning, des récompenses de stacking, des\\n        récompenses de minage. Même si vous 'holdez' et que vous ne souhaitez pas faire de cashout.</li>\\n      <li><strong>Une plus/moins value</strong> : c’est une cession contre monnaies FIAT, biens ou services.</li>\\n    </ul>\\n  </p>\\n\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Fausse idée reçue sur une double imposition éventuelle :\\n    <ul>\\n      <li>Lorsque l’on mine 1 BTC (disons 10 000€ pour simplifier le calcul) : on est imposé sur ce revenu de 10 000€</li>\\n      <li>On souhaite hold ce 1 BTC pendant 6 mois</li>\\n      <li>Au bout de 6 mois, on souhaite faire une cession de ce BTC vers des euros (cession FIAT). Le cours actuel est\\n        de 50 000€ disons pour simplifier le calcul</li>\\n      <li>La plus-value entre le moment de perception du revenu et la cession est de 50 000 - 10 000 = 40 000€. La\\n        plus-value est donc de 40 000€. On est imposé sur ces 40 000€ (et non 50 000€) de plus-value au régime de la\\n        flat-tax soit 30%</li>\\n      <li>La première “assiette” est donc de 10 000€ et la seconde de 40 000€.</li>\\n    </ul>\\n    Une double imposition insinuerait que l’on soit taxé une première fois sur 10 000€ puis une deuxième fois sur la\\n    globalité des 50 000€ ce qui est faux, ce n’est pas ça, la deuxième fois on n'est taxé que sur la différence soit 40\\n    000€\\n    <strong>Il n’y a donc pas de double imposition.</strong>\\n  </BsAlert>\\n</div>\\n<hr />\\n<h5>Exemple complet sur la différence revenus vs plus-value</h5>\\n<div>\\n  <p>On partira du principe que votre portefeuille contient 0 crypto initialement pour simplifier le calcul. Les %\\n    utilisés sont élevés mais sont pris pour simplifier les calculs.</p>\\n  <p>\\n    <ul>\\n      <li class=\\\"mb-2\\\">Le 1er janvier, j’achète 2 BTC ayant chacun une valeur de 10 000€ à la date d'achat soit un\\n        portefeuille de 20 000€</li>\\n      <li class=\\\"mb-2\\\">Je stack 1 BTC sur une plateforme X qui me rapporte 10% APY (taux annuel) versé mensuellement.\\n        Cela fait une récompense de staking de 0.1 BTC sur l'année (0,008 versé mensuellement)</li>\\n      <li class=\\\"mb-2\\\">Je place en lending/earn l'autre 1 BTC sur une plateforme Y qui rapporte 20% APY (taux annuel),\\n        versé hebdomadairement. Cela fait des intérêts de 0.2 BTC sur l'année (0,0038 versé hebdomadairement)</li>\\n      <li class=\\\"mb-2\\\">A la fin de l'année j’ai donc un portefeuille total de 2.3 BTC (2+0.1+0.2). Dans toutes les\\n        situations A/B/C, j’ai donc 0.1 BTC de stacking à déclarer + 0.2 BTC d'intérêts à déclarer. Que je revende ou\\n        pas. Les valeurs en euros sont à prendre au jour de la réception mensuelle. Ensuite pour la méthodologie, voir\\n        rubrique “Déclaration par catégorie”\\n        <ul>\\n          <li class=\\\"mb-1\\\"><strong>Situation A</strong>\\n            : Je suis un holder et ne revends rien. J’ai donc 0€ de plus ou moins value à déclarer en plus de la\\n            déclaration stacking/lending</li>\\n          <li class=\\\"mb-1\\\"><strong>Situation B</strong>\\n            : Je souhaite TOUT revendre le 31déc pour m'acheter le cadeau de mes rêves. Le BTC vaut 20 000€ désormais.\\n            J’ai toujours 0.1 BTC de stacking à déclarer + 0.2 BTC d'intérêts à déclarer. Mais en plus de ça j’ai la\\n            plus-value globale sur les 2.3 BTC à déclarer vu que le BTC est passé de 10 000 à 20 000€</li>\\n          <li class=\\\"mb-1\\\">\\n            <strong>Situation C</strong>\\n            : Je souhaite TOUT revendre le 31déc car je veux me débarrasser de mes cryptos. Le BTC vaut 5 000€\\n            désormais, dommage... J’ai toujours 0.1 BTC de stacking à déclarer + 0.2 BTC d'intérêts à déclarer. Mais en\\n            plus de ça j’ai la moins-value sur les 2.3 BTC à déclarer vu que le BTC est passé de 10 000 à 5 000€\\n          </li>\\n        </ul>\\n      </li>\\n    </ul>\\n  </p>\\n</div>\", {\"contents\":\"<h4>Déclarations liées aux Revenus</h4>\\n<h5>Séparation Revenus et Plus/moins Values</h5>\\n<div>\\n  <p>\\n    Dans tous les cas de figure, il faut séparer les revenus de la plus/moins value.\\n    <ul>\\n      <li><strong>Un revenu</strong>\\n        : un revenu perçu en crypto peut être un salaire, des intérêts de earning, des récompenses de stacking, des\\n        récompenses de minage. Même si vous 'holdez' et que vous ne souhaitez pas faire de cashout.</li>\\n      <li><strong>Une plus/moins value</strong> : c’est une cession contre monnaies FIAT, biens ou services.</li>\\n    </ul>\\n  </p>\\n\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    Fausse idée reçue sur une double imposition éventuelle :\\n    <ul>\\n      <li>Lorsque l’on mine 1 BTC (disons 10 000€ pour simplifier le calcul) : on est imposé sur ce revenu de 10 000€</li>\\n      <li>On souhaite hold ce 1 BTC pendant 6 mois</li>\\n      <li>Au bout de 6 mois, on souhaite faire une cession de ce BTC vers des euros (cession FIAT). Le cours actuel est\\n        de 50 000€ disons pour simplifier le calcul</li>\\n      <li>La plus-value entre le moment de perception du revenu et la cession est de 50 000 - 10 000 = 40 000€. La\\n        plus-value est donc de 40 000€. On est imposé sur ces 40 000€ (et non 50 000€) de plus-value au régime de la\\n        flat-tax soit 30%</li>\\n      <li>La première “assiette” est donc de 10 000€ et la seconde de 40 000€.</li>\\n    </ul>\\n    Une double imposition insinuerait que l’on soit taxé une première fois sur 10 000€ puis une deuxième fois sur la\\n    globalité des 50 000€ ce qui est faux, ce n’est pas ça, la deuxième fois on n'est taxé que sur la différence soit 40\\n    000€\\n    <strong>Il n’y a donc pas de double imposition.</strong>\\n  </BsAlert>\\n</div>\\n<hr />\\n<h5>Exemple complet sur la différence revenus vs plus-value</h5>\\n<div>\\n  <p>On partira du principe que votre portefeuille contient 0 crypto initialement pour simplifier le calcul. Les %\\n    utilisés sont élevés mais sont pris pour simplifier les calculs.</p>\\n  <p>\\n    <ul>\\n      <li class=\\\"mb-2\\\">Le 1er janvier, j’achète 2 BTC ayant chacun une valeur de 10 000€ à la date d'achat soit un\\n        portefeuille de 20 000€</li>\\n      <li class=\\\"mb-2\\\">Je stack 1 BTC sur une plateforme X qui me rapporte 10% APY (taux annuel) versé mensuellement.\\n        Cela fait une récompense de staking de 0.1 BTC sur l'année (0,008 versé mensuellement)</li>\\n      <li class=\\\"mb-2\\\">Je place en lending/earn l'autre 1 BTC sur une plateforme Y qui rapporte 20% APY (taux annuel),\\n        versé hebdomadairement. Cela fait des intérêts de 0.2 BTC sur l'année (0,0038 versé hebdomadairement)</li>\\n      <li class=\\\"mb-2\\\">A la fin de l'année j’ai donc un portefeuille total de 2.3 BTC (2+0.1+0.2). Dans toutes les\\n        situations A/B/C, j’ai donc 0.1 BTC de stacking à déclarer + 0.2 BTC d'intérêts à déclarer. Que je revende ou\\n        pas. Les valeurs en euros sont à prendre au jour de la réception mensuelle. Ensuite pour la méthodologie, voir\\n        rubrique “Déclaration par catégorie”\\n        <ul>\\n          <li class=\\\"mb-1\\\"><strong>Situation A</strong>\\n            : Je suis un holder et ne revends rien. J’ai donc 0€ de plus ou moins value à déclarer en plus de la\\n            déclaration stacking/lending</li>\\n          <li class=\\\"mb-1\\\"><strong>Situation B</strong>\\n            : Je souhaite TOUT revendre le 31déc pour m'acheter le cadeau de mes rêves. Le BTC vaut 20 000€ désormais.\\n            J’ai toujours 0.1 BTC de stacking à déclarer + 0.2 BTC d'intérêts à déclarer. Mais en plus de ça j’ai la\\n            plus-value globale sur les 2.3 BTC à déclarer vu que le BTC est passé de 10 000 à 20 000€</li>\\n          <li class=\\\"mb-1\\\">\\n            <strong>Situation C</strong>\\n            : Je souhaite TOUT revendre le 31déc car je veux me débarrasser de mes cryptos. Le BTC vaut 5 000€\\n            désormais, dommage... J’ai toujours 0.1 BTC de stacking à déclarer + 0.2 BTC d'intérêts à déclarer. Mais en\\n            plus de ça j’ai la moins-value sur les 2.3 BTC à déclarer vu que le BTC est passé de 10 000 à 5 000€\\n          </li>\\n        </ul>\\n      </li>\\n    </ul>\\n  </p>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/revenus.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/revenus.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsButton {{on \\\"click\\\" this.onTransmit}} class=\\\"btn btn-primary btn-sm\\\">\\n  SCRIPT\\n</BsButton>\\n\\n{{! Modal for TX VALIDATION PROCESS HTML }}\\n<BsModal @open={{this.transmitModal}} @backdropClose={{false}} @onHidden={{this.hidden}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">Script</h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        <BsAlert class=\\\"m-0 py-1 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n          <strong>Voici le script à coller dans la console de votre navigateur :</strong>\\n        </BsAlert>\\n        <div class=\\\"mx-2 my-3 corps\\\">\\n          <label for=\\\"unknowns\\\" class=\\\"form-label\\\"></label>\\n          <div class=\\\"d-flex\\\">\\n            <textarea class=\\\"form-control textsm\\\" id=\\\"unknowns\\\" rows=\\\"20\\\" readonly>{{this.code}}</textarea>\\n            <CopyButton\\n              class=\\\"btn btn-primary color\\\"\\n              @target=\\\"#unknowns\\\"\\n              @onSuccess={{this.onSuccess}}\\n              @onError={{this.onError}}\\n            >\\n              <App::Icon @icon=\\\"ion:clipboard-outline\\\" />\\n              <BsTooltip @placement=\\\"right\\\">Copier texte\\n              </BsTooltip>\\n            </CopyButton>\\n          </div>\\n        </div>\\n      </div>\\n    </modal.body>\\n    <modal.footer>\\n      <BsButton {{on \\\"click\\\" this.close}}>Fermer</BsButton>\\n    </modal.footer>\\n  </div>\\n</BsModal>\", {\"contents\":\"<BsButton {{on \\\"click\\\" this.onTransmit}} class=\\\"btn btn-primary btn-sm\\\">\\n  SCRIPT\\n</BsButton>\\n\\n{{! Modal for TX VALIDATION PROCESS HTML }}\\n<BsModal @open={{this.transmitModal}} @backdropClose={{false}} @onHidden={{this.hidden}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">Script</h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        <BsAlert class=\\\"m-0 py-1 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n          <strong>Voici le script à coller dans la console de votre navigateur :</strong>\\n        </BsAlert>\\n        <div class=\\\"mx-2 my-3 corps\\\">\\n          <label for=\\\"unknowns\\\" class=\\\"form-label\\\"></label>\\n          <div class=\\\"d-flex\\\">\\n            <textarea class=\\\"form-control textsm\\\" id=\\\"unknowns\\\" rows=\\\"20\\\" readonly>{{this.code}}</textarea>\\n            <CopyButton\\n              class=\\\"btn btn-primary color\\\"\\n              @target=\\\"#unknowns\\\"\\n              @onSuccess={{this.onSuccess}}\\n              @onError={{this.onError}}\\n            >\\n              <App::Icon @icon=\\\"ion:clipboard-outline\\\" />\\n              <BsTooltip @placement=\\\"right\\\">Copier texte\\n              </BsTooltip>\\n            </CopyButton>\\n          </div>\\n        </div>\\n      </div>\\n    </modal.body>\\n    <modal.footer>\\n      <BsButton {{on \\\"click\\\" this.close}}>Fermer</BsButton>\\n    </modal.footer>\\n  </div>\\n</BsModal>\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/script.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/script.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\n\nexport default class DocumentationScript extends Component {\n  @tracked transmitModal = false;\n  @tracked code = '';\n\n  @action\n  async onTransmit() {\n    //Launch the modal\n    this.transmitModal = true;\n\n    let response = await (await fetch('/json_cdc_ex_exporter')).text();\n\n    this.code = response;\n  }\n\n  @action\n  hidden() {\n    this.transmitModal = false;\n  }\n  @action\n  close() {\n    this.transmitModal = false;\n  }\n\n  @action\n  onSuccess() {\n    debug('Copy to clipboard success');\n  }\n  @action\n  onError() {\n    debug('Copy to clipboard error... Please try again');\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@glimmer/component' {\n  interface Registry {\n    'documentation-script': DocumentationScript;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h4>Sources</h4>\\n<h5>Sources - Textes de lois et réglementation</h5>\\n<div>\\n  <ul>\\n    <li>\\n      <App::ExternalLink\\n        href=\\\"https://bofip.impots.gouv.fr/bofip/11967-PGP.html/identifiant=BOI-RPPM-PVBMC-30-10-20190902\\\"\\n      >https://bofip.impots.gouv.fr/bofip/11967-PGP.html/identifiant=BOI-RPPM-PVBMC-30-10-20190902</App::ExternalLink>\\n    </li>\\n    <li>\\n      <App::ExternalLink\\n        href=\\\"https://bofip.impots.gouv.fr/bofip/11968-PGP.html/identifiant=BOI-RPPM-PVBMC-30-20-20190902\\\"\\n      >https://bofip.impots.gouv.fr/bofip/11968-PGP.html/identifiant=BOI-RPPM-PVBMC-30-20-20190902</App::ExternalLink>\\n    </li>\\n    <li>\\n      <App::ExternalLink\\n        href=\\\"https://bofip.impots.gouv.fr/bofip/11969-PGP.html/identifiant=BOI-RPPM-PVBMC-30-30-20190902\\\"\\n      >https://bofip.impots.gouv.fr/bofip/11969-PGP.html/identifiant=BOI-RPPM-PVBMC-30-30-20190902</App::ExternalLink>\\n    </li>\\n    <li>\\n      <App::ExternalLink\\n        href=\\\"https://bofip.impots.gouv.fr/bofip/2824-PGP.html/identifiant=BOI-BNC-CHAMP-10-10-20-40-20190902#1080_0304\\\"\\n      >https://bofip.impots.gouv.fr/bofip/2824-PGP.html/identifiant=BOI-BNC-CHAMP-10-10-20-40-20190902#1080_0304</App::ExternalLink>\\n    </li>\\n    <li>\\n      <App::ExternalLink\\n        href=\\\"https://www.legifrance.gouv.fr/codes/id/LEGIARTI000038612228/2019-05-24/\\\"\\n      >https://www.legifrance.gouv.fr/codes/id/LEGIARTI000038612228/2019-05-24/</App::ExternalLink>\\n    </li>\\n    <li>\\n      <App::ExternalLink\\n        href=\\\"https://bofip.impots.gouv.fr/bofip/11978-PGP.html/identifiant=ACTU-2019-00174\\\"\\n      >https://bofip.impots.gouv.fr/bofip/11978-PGP.html/identifiant=ACTU-2019-00174</App::ExternalLink>\\n    </li>\\n  </ul>\\n</div>\\n\\n<h5 class=\\\"mt-3\\\">Remerciements</h5>\\n<div>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n    <App::ExternalLink href=\\\"https://t.me/fiscalitecryptofr\\\">\\n      <img\\n        src=\\\"https://img.shields.io/badge/Telegram-Fiscalit%C3%A9%20crypto%20FR-32AFED?style=for-the-badge&logo=telegram\\\"\\n        alt=\\\"telegram-fisca\\\"\\n      /></App::ExternalLink>\\n    Merci au groupe\\n    <strong>Fiscalité Crypto FR</strong>\\n    pour leur aide précieuse.\\n  </BsAlert>\\n</div>\\n\\n<h5 class=\\\"mt-3\\\">Support</h5>\\n<div>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n    <App::ExternalLink href=\\\"https://t.me/cryptofiscafacile\\\">\\n      <img\\n        src=\\\"https://camo.githubusercontent.com/9cc612b51632747b453e8a14b5764032481dd0111b68fd859019da324a3ec504/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f54656c656772616d2d43727970746f4669736361466163696c652d3332414645443f7374796c653d666f722d7468652d6261646765266c6f676f3d74656c656772616d266c6f676f436f6c6f723d7768697465\\\"\\n        alt=\\\"telegram-fisca\\\"\\n      /></App::ExternalLink>\\n    Pour tout Support à l'utilisation de l'application, merci de venir nous voir sur notre canal Telegram.\\n  </BsAlert>\\n</div>\\n\\n<h5 class=\\\"mt-3\\\">Contribution</h5>\\n<div>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    <App::ExternalLink href=\\\"https://discord.gg/PndJKReU9E\\\">\\n      <img\\n        src=\\\"https://img.shields.io/badge/Discord-CryptoFiscaFacile-5865f2?style=for-the-badge&logo=discord&logoColor=white\\\"\\n        alt=\\\"discord-fisca\\\"\\n      />\\n    </App::ExternalLink>\\n    N'hésitez pas à nous solliciter sur le\\n    <strong>discord CryptoFiscaFacile</strong>.\\n  </BsAlert>\\n</div>\\n\\n<h5 class=\\\"mt-4\\\">Disclaimer</h5>\\n<div>\\n  <BsAlert class=\\\"ms-2 me-4 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n    <strong>CryptoFiscaFacile ne fournit ni conseil en fiscalité, ni conseil en investissement !</strong>\\n  </BsAlert>\\n</div>\", {\"contents\":\"<h4>Sources</h4>\\n<h5>Sources - Textes de lois et réglementation</h5>\\n<div>\\n  <ul>\\n    <li>\\n      <App::ExternalLink\\n        href=\\\"https://bofip.impots.gouv.fr/bofip/11967-PGP.html/identifiant=BOI-RPPM-PVBMC-30-10-20190902\\\"\\n      >https://bofip.impots.gouv.fr/bofip/11967-PGP.html/identifiant=BOI-RPPM-PVBMC-30-10-20190902</App::ExternalLink>\\n    </li>\\n    <li>\\n      <App::ExternalLink\\n        href=\\\"https://bofip.impots.gouv.fr/bofip/11968-PGP.html/identifiant=BOI-RPPM-PVBMC-30-20-20190902\\\"\\n      >https://bofip.impots.gouv.fr/bofip/11968-PGP.html/identifiant=BOI-RPPM-PVBMC-30-20-20190902</App::ExternalLink>\\n    </li>\\n    <li>\\n      <App::ExternalLink\\n        href=\\\"https://bofip.impots.gouv.fr/bofip/11969-PGP.html/identifiant=BOI-RPPM-PVBMC-30-30-20190902\\\"\\n      >https://bofip.impots.gouv.fr/bofip/11969-PGP.html/identifiant=BOI-RPPM-PVBMC-30-30-20190902</App::ExternalLink>\\n    </li>\\n    <li>\\n      <App::ExternalLink\\n        href=\\\"https://bofip.impots.gouv.fr/bofip/2824-PGP.html/identifiant=BOI-BNC-CHAMP-10-10-20-40-20190902#1080_0304\\\"\\n      >https://bofip.impots.gouv.fr/bofip/2824-PGP.html/identifiant=BOI-BNC-CHAMP-10-10-20-40-20190902#1080_0304</App::ExternalLink>\\n    </li>\\n    <li>\\n      <App::ExternalLink\\n        href=\\\"https://www.legifrance.gouv.fr/codes/id/LEGIARTI000038612228/2019-05-24/\\\"\\n      >https://www.legifrance.gouv.fr/codes/id/LEGIARTI000038612228/2019-05-24/</App::ExternalLink>\\n    </li>\\n    <li>\\n      <App::ExternalLink\\n        href=\\\"https://bofip.impots.gouv.fr/bofip/11978-PGP.html/identifiant=ACTU-2019-00174\\\"\\n      >https://bofip.impots.gouv.fr/bofip/11978-PGP.html/identifiant=ACTU-2019-00174</App::ExternalLink>\\n    </li>\\n  </ul>\\n</div>\\n\\n<h5 class=\\\"mt-3\\\">Remerciements</h5>\\n<div>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n    <App::ExternalLink href=\\\"https://t.me/fiscalitecryptofr\\\">\\n      <img\\n        src=\\\"https://img.shields.io/badge/Telegram-Fiscalit%C3%A9%20crypto%20FR-32AFED?style=for-the-badge&logo=telegram\\\"\\n        alt=\\\"telegram-fisca\\\"\\n      /></App::ExternalLink>\\n    Merci au groupe\\n    <strong>Fiscalité Crypto FR</strong>\\n    pour leur aide précieuse.\\n  </BsAlert>\\n</div>\\n\\n<h5 class=\\\"mt-3\\\">Support</h5>\\n<div>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n    <App::ExternalLink href=\\\"https://t.me/cryptofiscafacile\\\">\\n      <img\\n        src=\\\"https://camo.githubusercontent.com/9cc612b51632747b453e8a14b5764032481dd0111b68fd859019da324a3ec504/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f54656c656772616d2d43727970746f4669736361466163696c652d3332414645443f7374796c653d666f722d7468652d6261646765266c6f676f3d74656c656772616d266c6f676f436f6c6f723d7768697465\\\"\\n        alt=\\\"telegram-fisca\\\"\\n      /></App::ExternalLink>\\n    Pour tout Support à l'utilisation de l'application, merci de venir nous voir sur notre canal Telegram.\\n  </BsAlert>\\n</div>\\n\\n<h5 class=\\\"mt-3\\\">Contribution</h5>\\n<div>\\n  <BsAlert class=\\\"ms-2 me-4\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n    <App::ExternalLink href=\\\"https://discord.gg/PndJKReU9E\\\">\\n      <img\\n        src=\\\"https://img.shields.io/badge/Discord-CryptoFiscaFacile-5865f2?style=for-the-badge&logo=discord&logoColor=white\\\"\\n        alt=\\\"discord-fisca\\\"\\n      />\\n    </App::ExternalLink>\\n    N'hésitez pas à nous solliciter sur le\\n    <strong>discord CryptoFiscaFacile</strong>.\\n  </BsAlert>\\n</div>\\n\\n<h5 class=\\\"mt-4\\\">Disclaimer</h5>\\n<div>\\n  <BsAlert class=\\\"ms-2 me-4 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n    <strong>CryptoFiscaFacile ne fournit ni conseil en fiscalité, ni conseil en investissement !</strong>\\n  </BsAlert>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/documentation/sources.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/documentation/sources.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsButton {{on \\\"click\\\" this.download}} class=\\\"btn btn-primary btn-sm\\\">\\n  Télécharger\\n</BsButton>\", {\"contents\":\"<BsButton {{on \\\"click\\\" this.download}} class=\\\"btn btn-primary btn-sm\\\">\\n  Télécharger\\n</BsButton>\",\"moduleName\":\"cryptofiscafacile-gui/components/download/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/download/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\n\ninterface DownloadArgs {\n  def: string;\n}\n\nexport default class Download extends Component<DownloadArgs> {\n  @tracked filename = '';\n  @tracked fileURL = '';\n\n  @action\n  async download() {\n    debug('Downloading...' + this.args.def + '...');\n\n    let response = await fetch('/definitions/' + this.args.def);\n    let data = await response.json();\n\n    this.#downloadObjectAsJson(data, this.args.def);\n  }\n\n  #downloadObjectAsJson(exportObj: Response, exportName: string) {\n    let dataStr = 'data:text/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(exportObj));\n    let downloadAnchorNode = document.createElement('a');\n\n    downloadAnchorNode.setAttribute('href', dataStr);\n    downloadAnchorNode.setAttribute('download', exportName);\n    document.body.appendChild(downloadAnchorNode); // required for firefox\n    downloadAnchorNode.click();\n    downloadAnchorNode.remove();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"help mb-4 me-4 pulsate-fwd\\\"\\n  data-title=\\\"Bienvenue\\\"\\n  data-intro=\\\"N'oubliez pas, si vous êtes bloqué, vous pouvez cliquer à tout moment sur l'aide interactive en bas à droite de chaque page, de vous rendre du la page Documentation, voire de contacter l'équipe qui sera là pour vous aider... Bonne déclaration !\\\"\\n>\\n  <button class=\\\"help-button\\\" type=\\\"button\\\" {{intro @target autoStart=this.autoStart onExit=this.onIntroExit}}>\\n    <App::Icon @icon=\\\"ion:help-circle\\\" width=\\\"50\\\" />\\n    <BsTooltip class=\\\"zindex\\\" @placement=\\\"left\\\">Cliquez ici pour ouvrir l'aide interactive</BsTooltip>\\n  </button>\\n</div>\", {\"contents\":\"<div\\n  class=\\\"help mb-4 me-4 pulsate-fwd\\\"\\n  data-title=\\\"Bienvenue\\\"\\n  data-intro=\\\"N'oubliez pas, si vous êtes bloqué, vous pouvez cliquer à tout moment sur l'aide interactive en bas à droite de chaque page, de vous rendre du la page Documentation, voire de contacter l'équipe qui sera là pour vous aider... Bonne déclaration !\\\"\\n>\\n  <button class=\\\"help-button\\\" type=\\\"button\\\" {{intro @target autoStart=this.autoStart onExit=this.onIntroExit}}>\\n    <App::Icon @icon=\\\"ion:help-circle\\\" width=\\\"50\\\" />\\n    <BsTooltip class=\\\"zindex\\\" @placement=\\\"left\\\">Cliquez ici pour ouvrir l'aide interactive</BsTooltip>\\n  </button>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/help/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/help/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport type ApplicationService from 'cryptofiscafacile-gui/services/application';\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\n\nexport default class Help extends Component {\n  @service declare application: ApplicationService;\n  @service declare wasm: WasmService;\n\n  get autoStart() {\n    return this.application.hasIndexedDb && this.application.newUser && !this.application.firstTourDone;\n  }\n\n  @action\n  onIntroExit() {\n    if (this.autoStart) {\n      this.wasm.updateApplicationEntryTask.perform({\n        key: 'application.version',\n        value: this.application.version,\n      });\n\n      this.application.firstTourDone = true;\n    }\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@glimmer/component' {\n  interface Registry {\n    help: Help;\n  }\n}\n","export default class Option {\n  public static readonly ALL = 'all';\n\n  constructor(\n    readonly name: string,\n    readonly selected: boolean,\n  ) {}\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsButton\\n  @type={{\\\"none\\\"}}\\n  class=\\\"wallet-action-icon {{if (eq this.deletingFile (not this.deletingThisFile)) 'wallet-action-icon-locked'}}\\\"\\n  disabled={{this.deletingFile}}\\n  {{on \\\"click\\\" this.delete}}\\n>\\n  {{#if this.deletingThisFile}}\\n    <span class=\\\"spinner-border spinner-border-sm\\\" role=\\\"status\\\" aria-hidden=\\\"true\\\"></span>\\n  {{else}}\\n    <App::Icon @icon=\\\"ion:trash-sharp\\\" width=\\\"18\\\" />\\n    <BsTooltip @placement=\\\"right\\\">Supprimer fichier</BsTooltip>\\n  {{/if}}\\n</BsButton>\", {\"contents\":\"<BsButton\\n  @type={{\\\"none\\\"}}\\n  class=\\\"wallet-action-icon {{if (eq this.deletingFile (not this.deletingThisFile)) 'wallet-action-icon-locked'}}\\\"\\n  disabled={{this.deletingFile}}\\n  {{on \\\"click\\\" this.delete}}\\n>\\n  {{#if this.deletingThisFile}}\\n    <span class=\\\"spinner-border spinner-border-sm\\\" role=\\\"status\\\" aria-hidden=\\\"true\\\"></span>\\n  {{else}}\\n    <App::Icon @icon=\\\"ion:trash-sharp\\\" width=\\\"18\\\" />\\n    <BsTooltip @placement=\\\"right\\\">Supprimer fichier</BsTooltip>\\n  {{/if}}\\n</BsButton>\",\"moduleName\":\"cryptofiscafacile-gui/components/removal/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/removal/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport type Wasm from 'cryptofiscafacile-gui/services/wasm';\nimport type { TaskInstance } from 'ember-concurrency';\n\ninterface RemovalArgs {\n  filename: string;\n}\n\nexport default class Removal extends Component<RemovalArgs> {\n  @service declare wasm: Wasm;\n\n  @tracked deletingTask?: TaskInstance<void>;\n\n  get deletingFile() {\n    return this.wasm.deleteFileTask.isRunning;\n  }\n\n  get deletingThisFile() {\n    return this.deletingTask?.isRunning;\n  }\n\n  @action\n  async delete() {\n    debug('Removal of file: ' + this.args.filename);\n    this.deletingTask = this.wasm.deleteFileTask.perform(this.args.filename);\n    await this.deletingTask;\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@glimmer/component' {\n  interface Registry {\n    removal: Removal;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if @locked}}\\n  {{#if @choice}}\\n    <div class=\\\"d-flex w-75\\\">\\n      <h5><strong>Les ajouter au portefeuille avec leur valeur du jour en EUR</strong></h5>\\n    </div>\\n    <div class=\\\"d-flex w-25 align-items-center\\\">\\n      <span class=\\\"d-inline-block ms-1\\\">\\n        <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n        <BsTooltip @placement=\\\"right\\\">Sélectionner le 2è choix, çad \\\"ajouter au portefeuille avec leur valeur du jour en\\n          EUR\\\" signifie que cela va accroitre votre Prix Total d'Acquisition et faire baisser votre Plus-Value.\\n        </BsTooltip>\\n      </span>\\n    </div>\\n  {{else}}\\n    <div class=\\\"d-flex w-75\\\">\\n      <h5><strong>Les ajouter au portefeuille avec une valeur de 0€</strong></h5>\\n    </div>\\n    <div class=\\\"d-flex w-25 align-items-center\\\">\\n    </div>\\n  {{/if}}\\n{{else}}\\n  {{#if @choice}}\\n    <div class=\\\"d-flex w-75 justify-content-center align-items-center\\\">\\n      <select name=\\\"bncSelected\\\" id=\\\"bncSelect\\\" class=\\\"form-select form-select mt-2\\\" {{on \\\"change\\\" this.radioCheck}}>\\n        {{#if this.isMade}}\\n          <option value=\\\"default\\\" selected>--- Faites votre choix ---</option>\\n          <option value=\\\"{{@year}}zero\\\">Les ajouter au portefeuille avec une valeur de 0€</option>\\n          <option value=\\\"{{@year}}bnc\\\">Les ajouter au portefeuille avec leur valeur du jour en EUR</option>\\n        {{else}}\\n          <option value=\\\"{{@year}}zero\\\">Les ajouter au portefeuille avec une valeur de 0€</option>\\n          <option value=\\\"{{@year}}bnc\\\" selected>Les ajouter au portefeuille avec leur valeur du jour en EUR</option>\\n        {{/if}}\\n      </select>\\n    </div>\\n    <div class=\\\"d-flex w-25 align-items-center\\\">\\n      <span class=\\\"d-inline-block ms-1\\\">\\n        <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n        <BsTooltip @placement=\\\"right\\\">Sélectionner le 2è choix, çad \\\"ajouter au portefeuille avec leur valeur du jour en\\n          EUR\\\" signifie que cela va accroitre votre Prix Total d'Acquisition et faire baisser votre Plus-Value.\\n        </BsTooltip>\\n      </span>\\n    </div>\\n  {{else}}\\n    <div class=\\\"d-flex w-75 justify-content-center align-items-center\\\">\\n      <select name=\\\"bncSelected\\\" id=\\\"bncSelect\\\" class=\\\"form-select form-select mt-2\\\" {{on \\\"change\\\" this.radioCheck}}>\\n        {{#if this.isMade}}\\n          <option value=\\\"default\\\" selected>--- Faites votre choix ---</option>\\n          <option value=\\\"{{@year}}zero\\\">Les ajouter au portefeuille avec une valeur de 0€</option>\\n          <option value=\\\"{{@year}}bnc\\\">Les ajouter au portefeuille avec leur valeur du jour en EUR</option>\\n        {{else}}\\n          <option value=\\\"{{@year}}zero\\\" selected>Les ajouter au portefeuille avec une valeur de 0€</option>\\n          <option value=\\\"{{@year}}bnc\\\">Les ajouter au portefeuille avec leur valeur du jour en EUR</option>\\n        {{/if}}\\n      </select>\\n    </div>\\n    <div class=\\\"d-flex w-25 align-items-center\\\">\\n      <span class=\\\"d-inline-block ms-1\\\">\\n        <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n        <BsTooltip @placement=\\\"right\\\">Sélectionner le 2è choix, çad \\\"ajouter au portefeuille avec leur valeur du jour en\\n          EUR\\\" signifie que cela va accroitre votre Prix Total d'Acquisition et faire baisser votre Plus-Value.\\n        </BsTooltip>\\n      </span>\\n    </div>\\n  {{/if}}\\n{{/if}}\", {\"contents\":\"{{#if @locked}}\\n  {{#if @choice}}\\n    <div class=\\\"d-flex w-75\\\">\\n      <h5><strong>Les ajouter au portefeuille avec leur valeur du jour en EUR</strong></h5>\\n    </div>\\n    <div class=\\\"d-flex w-25 align-items-center\\\">\\n      <span class=\\\"d-inline-block ms-1\\\">\\n        <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n        <BsTooltip @placement=\\\"right\\\">Sélectionner le 2è choix, çad \\\"ajouter au portefeuille avec leur valeur du jour en\\n          EUR\\\" signifie que cela va accroitre votre Prix Total d'Acquisition et faire baisser votre Plus-Value.\\n        </BsTooltip>\\n      </span>\\n    </div>\\n  {{else}}\\n    <div class=\\\"d-flex w-75\\\">\\n      <h5><strong>Les ajouter au portefeuille avec une valeur de 0€</strong></h5>\\n    </div>\\n    <div class=\\\"d-flex w-25 align-items-center\\\">\\n    </div>\\n  {{/if}}\\n{{else}}\\n  {{#if @choice}}\\n    <div class=\\\"d-flex w-75 justify-content-center align-items-center\\\">\\n      <select name=\\\"bncSelected\\\" id=\\\"bncSelect\\\" class=\\\"form-select form-select mt-2\\\" {{on \\\"change\\\" this.radioCheck}}>\\n        {{#if this.isMade}}\\n          <option value=\\\"default\\\" selected>--- Faites votre choix ---</option>\\n          <option value=\\\"{{@year}}zero\\\">Les ajouter au portefeuille avec une valeur de 0€</option>\\n          <option value=\\\"{{@year}}bnc\\\">Les ajouter au portefeuille avec leur valeur du jour en EUR</option>\\n        {{else}}\\n          <option value=\\\"{{@year}}zero\\\">Les ajouter au portefeuille avec une valeur de 0€</option>\\n          <option value=\\\"{{@year}}bnc\\\" selected>Les ajouter au portefeuille avec leur valeur du jour en EUR</option>\\n        {{/if}}\\n      </select>\\n    </div>\\n    <div class=\\\"d-flex w-25 align-items-center\\\">\\n      <span class=\\\"d-inline-block ms-1\\\">\\n        <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n        <BsTooltip @placement=\\\"right\\\">Sélectionner le 2è choix, çad \\\"ajouter au portefeuille avec leur valeur du jour en\\n          EUR\\\" signifie que cela va accroitre votre Prix Total d'Acquisition et faire baisser votre Plus-Value.\\n        </BsTooltip>\\n      </span>\\n    </div>\\n  {{else}}\\n    <div class=\\\"d-flex w-75 justify-content-center align-items-center\\\">\\n      <select name=\\\"bncSelected\\\" id=\\\"bncSelect\\\" class=\\\"form-select form-select mt-2\\\" {{on \\\"change\\\" this.radioCheck}}>\\n        {{#if this.isMade}}\\n          <option value=\\\"default\\\" selected>--- Faites votre choix ---</option>\\n          <option value=\\\"{{@year}}zero\\\">Les ajouter au portefeuille avec une valeur de 0€</option>\\n          <option value=\\\"{{@year}}bnc\\\">Les ajouter au portefeuille avec leur valeur du jour en EUR</option>\\n        {{else}}\\n          <option value=\\\"{{@year}}zero\\\" selected>Les ajouter au portefeuille avec une valeur de 0€</option>\\n          <option value=\\\"{{@year}}bnc\\\">Les ajouter au portefeuille avec leur valeur du jour en EUR</option>\\n        {{/if}}\\n      </select>\\n    </div>\\n    <div class=\\\"d-flex w-25 align-items-center\\\">\\n      <span class=\\\"d-inline-block ms-1\\\">\\n        <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n        <BsTooltip @placement=\\\"right\\\">Sélectionner le 2è choix, çad \\\"ajouter au portefeuille avec leur valeur du jour en\\n          EUR\\\" signifie que cela va accroitre votre Prix Total d'Acquisition et faire baisser votre Plus-Value.\\n        </BsTooltip>\\n      </span>\\n    </div>\\n  {{/if}}\\n{{/if}}\",\"moduleName\":\"cryptofiscafacile-gui/components/reporting/cerfa-bnc/choice/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/reporting/cerfa-bnc/choice/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport Bnc from 'cryptofiscafacile-gui/objects/bnc';\n\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\n\ninterface CerfaBncChoiceArgs {\n  year: number;\n  choice: boolean;\n  made: boolean;\n  locked: boolean;\n  bnc: Bnc[];\n}\n\nexport default class CerfaBncChoice extends Component<CerfaBncChoiceArgs> {\n  @service declare wasm: WasmService;\n\n  get isMade() {\n    return !this.args.made;\n  }\n\n  @action\n  radioCheck(e: { target: HTMLSelectElement }) {\n    const id = e.target.value;\n    const res = id.indexOf('zero');\n\n    if (res > -1) {\n      const year = parseInt(id.substring(0, res));\n\n      this.args.bnc.push(new Bnc(year, false));\n    } else {\n      const res2 = id.indexOf('bnc');\n      const year = parseInt(id.substring(0, res2));\n\n      this.args.bnc.push(new Bnc(year, true));\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsTab\\n  data-title=\\\"CERFA 2086\\\"\\n  data-position=\\\"top\\\"\\n  data-intro=\\\"Pour chaque année à partir de 2019 (le cas échéant), il vous sera proposé de faire un choix concerant certaines TX rentrant dans les catégories énoncées ci-dessous, afin de les prendre en compte 'valorisées' (à valeur du jour) ou non. L'avantage est l'augmentation du PRIX TOTAL d'ACQUISITION du portefeuille qui réduit donc la PLUS VALUE latente... En contre partie, il y aura plus de choses à déclarer (plus de formulaires). Suivez les indications données via les bulles d'information et/ou consultez la documentation pour de plus amples informations\\\"\\n  as |tab|\\n>\\n  {{#each this.sortedCerfas as |cerfa|}}\\n    <tab.pane @title={{cerfa.year}}>\\n      <strong></strong>\\n      L'application vous donne 2 choix pour l'intégration des catégories suivantes au portefeuille :\\n      <ul>\\n        <li>Intérêt\\n          <span class=\\\"d-inline-block mx-1\\\">\\n            <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n            <BsTooltip @placement=\\\"right\\\">Ici, sélectionner le 2è choix signifiera que ces TX seront considérées comme\\n              intérêts à l'étranger et à ce titre à déclarer case 2TR du formulaire 2047.\\n            </BsTooltip>\\n          </span>\\n        </li>\\n        {{#if (lt cerfa.year 2021)}}\\n          <li>Remise Commerciale\\n            <span class=\\\"d-inline-block mx-1\\\">\\n              <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n              <BsTooltip @placement=\\\"right\\\">Ici, sélectionner le 2è choix signifiera que ces TX seront valorisées dans\\n                le portefeuille à valeur du jour. NOTE: Cela n'engendrera pas de déclaration supplémentaire.\\n              </BsTooltip>\\n            </span>\\n          </li>\\n        {{/if}}\\n        <li>Parrainage\\n          <span class=\\\"d-inline-block mx-1\\\">\\n            <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n            <BsTooltip @placement=\\\"right\\\">Ici, sélectionner le 2è choix impliquera une déclaration au titre des revenus\\n              non commerciaux non professionnels (régime déclaratif spécial ou micro BNC) dans les cases 5KU/5LU/5MU de\\n              votre 2042-C-PRO.\\n            </BsTooltip>\\n          </span>\\n        </li>\\n        <li>AirDrop\\n          <span class=\\\"d-inline-block mx-1\\\">\\n            <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n            <BsTooltip @placement=\\\"right\\\">Ici, sélectionner le 2è choix signifiera que ces TX seront valorisées dans le\\n              portefeuille à valeur du jour. NOTE: Cela n'engendrera pas de déclaration supplémentaire.\\n            </BsTooltip>\\n          </span>\\n        </li>\\n      </ul>\\n      <div class=\\\"d-flex\\\">\\n        <strong>Pour cette année fiscale, souhaitez vous :</strong>\\n        <span class=\\\"d-inline-block ms-2\\\">\\n          <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n          <BsTooltip @placement=\\\"right\\\">Faites votre choix pour chaque année fiscales passées (2019, 2020, etc.) et en\\n            cours (année fiscale actuelle)... Attention: Vous avez le droit de changer de choix pour deux années\\n            différentes, mais une fois que le choix est fait et la déclaration transmise, vous ne pourrez plus revenir\\n            sur ce choix. Veillez donc à choisir correctement l'intégration.</BsTooltip>\\n        </span>\\n      </div>\\n      <div class=\\\"d-flex\\\">\\n        <Reporting::CerfaBnc::Choice\\n          @year={{cerfa.year}}\\n          @choice={{cerfa.choice}}\\n          @made={{cerfa.isMade}}\\n          @locked={{cerfa.isLocked}}\\n          @bnc={{this.selectedBnc}}\\n        />\\n      </div>\\n    </tab.pane>\\n  {{/each}}\\n</BsTab>\\n<hr />\\n<div class=\\\"d-flex\\\">\\n  <BsButton\\n    data-title=\\\"CERFA 2086\\\"\\n    data-intro=\\\"Après toute modification, cliquez sur le bouton Enregistrer afin de retenir les informations.\\\"\\n    @type=\\\"primary\\\"\\n    @onClick={{this.saveBnc}}\\n  >Enregistrer</BsButton>\\n  {{#if this.success}}\\n    <BsAlert\\n      class=\\\"m-0 mx-3 py-1 text-center\\\"\\n      @visible={{true}}\\n      @fade={{true}}\\n      @fadeDuration={{800}}\\n      @type=\\\"success\\\"\\n      @dismissible={{false}}\\n    >\\n      Enregistré avec succès !\\n    </BsAlert>\\n  {{/if}}\\n  {{#if this.error}}\\n    <BsAlert\\n      class=\\\"m-0 mx-3 py-1 text-center\\\"\\n      @visible={{true}}\\n      @fade={{true}}\\n      @fadeDuration={{800}}\\n      @type=\\\"danger\\\"\\n      @dismissible={{false}}\\n    >\\n      Problème dans l'enregistrement !\\n    </BsAlert>\\n  {{/if}}\\n</div>\", {\"contents\":\"<BsTab\\n  data-title=\\\"CERFA 2086\\\"\\n  data-position=\\\"top\\\"\\n  data-intro=\\\"Pour chaque année à partir de 2019 (le cas échéant), il vous sera proposé de faire un choix concerant certaines TX rentrant dans les catégories énoncées ci-dessous, afin de les prendre en compte 'valorisées' (à valeur du jour) ou non. L'avantage est l'augmentation du PRIX TOTAL d'ACQUISITION du portefeuille qui réduit donc la PLUS VALUE latente... En contre partie, il y aura plus de choses à déclarer (plus de formulaires). Suivez les indications données via les bulles d'information et/ou consultez la documentation pour de plus amples informations\\\"\\n  as |tab|\\n>\\n  {{#each this.sortedCerfas as |cerfa|}}\\n    <tab.pane @title={{cerfa.year}}>\\n      <strong></strong>\\n      L'application vous donne 2 choix pour l'intégration des catégories suivantes au portefeuille :\\n      <ul>\\n        <li>Intérêt\\n          <span class=\\\"d-inline-block mx-1\\\">\\n            <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n            <BsTooltip @placement=\\\"right\\\">Ici, sélectionner le 2è choix signifiera que ces TX seront considérées comme\\n              intérêts à l'étranger et à ce titre à déclarer case 2TR du formulaire 2047.\\n            </BsTooltip>\\n          </span>\\n        </li>\\n        {{#if (lt cerfa.year 2021)}}\\n          <li>Remise Commerciale\\n            <span class=\\\"d-inline-block mx-1\\\">\\n              <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n              <BsTooltip @placement=\\\"right\\\">Ici, sélectionner le 2è choix signifiera que ces TX seront valorisées dans\\n                le portefeuille à valeur du jour. NOTE: Cela n'engendrera pas de déclaration supplémentaire.\\n              </BsTooltip>\\n            </span>\\n          </li>\\n        {{/if}}\\n        <li>Parrainage\\n          <span class=\\\"d-inline-block mx-1\\\">\\n            <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n            <BsTooltip @placement=\\\"right\\\">Ici, sélectionner le 2è choix impliquera une déclaration au titre des revenus\\n              non commerciaux non professionnels (régime déclaratif spécial ou micro BNC) dans les cases 5KU/5LU/5MU de\\n              votre 2042-C-PRO.\\n            </BsTooltip>\\n          </span>\\n        </li>\\n        <li>AirDrop\\n          <span class=\\\"d-inline-block mx-1\\\">\\n            <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n            <BsTooltip @placement=\\\"right\\\">Ici, sélectionner le 2è choix signifiera que ces TX seront valorisées dans le\\n              portefeuille à valeur du jour. NOTE: Cela n'engendrera pas de déclaration supplémentaire.\\n            </BsTooltip>\\n          </span>\\n        </li>\\n      </ul>\\n      <div class=\\\"d-flex\\\">\\n        <strong>Pour cette année fiscale, souhaitez vous :</strong>\\n        <span class=\\\"d-inline-block ms-2\\\">\\n          <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n          <BsTooltip @placement=\\\"right\\\">Faites votre choix pour chaque année fiscales passées (2019, 2020, etc.) et en\\n            cours (année fiscale actuelle)... Attention: Vous avez le droit de changer de choix pour deux années\\n            différentes, mais une fois que le choix est fait et la déclaration transmise, vous ne pourrez plus revenir\\n            sur ce choix. Veillez donc à choisir correctement l'intégration.</BsTooltip>\\n        </span>\\n      </div>\\n      <div class=\\\"d-flex\\\">\\n        <Reporting::CerfaBnc::Choice\\n          @year={{cerfa.year}}\\n          @choice={{cerfa.choice}}\\n          @made={{cerfa.isMade}}\\n          @locked={{cerfa.isLocked}}\\n          @bnc={{this.selectedBnc}}\\n        />\\n      </div>\\n    </tab.pane>\\n  {{/each}}\\n</BsTab>\\n<hr />\\n<div class=\\\"d-flex\\\">\\n  <BsButton\\n    data-title=\\\"CERFA 2086\\\"\\n    data-intro=\\\"Après toute modification, cliquez sur le bouton Enregistrer afin de retenir les informations.\\\"\\n    @type=\\\"primary\\\"\\n    @onClick={{this.saveBnc}}\\n  >Enregistrer</BsButton>\\n  {{#if this.success}}\\n    <BsAlert\\n      class=\\\"m-0 mx-3 py-1 text-center\\\"\\n      @visible={{true}}\\n      @fade={{true}}\\n      @fadeDuration={{800}}\\n      @type=\\\"success\\\"\\n      @dismissible={{false}}\\n    >\\n      Enregistré avec succès !\\n    </BsAlert>\\n  {{/if}}\\n  {{#if this.error}}\\n    <BsAlert\\n      class=\\\"m-0 mx-3 py-1 text-center\\\"\\n      @visible={{true}}\\n      @fade={{true}}\\n      @fadeDuration={{800}}\\n      @type=\\\"danger\\\"\\n      @dismissible={{false}}\\n    >\\n      Problème dans l'enregistrement !\\n    </BsAlert>\\n  {{/if}}\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/reporting/cerfa-bnc/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/reporting/cerfa-bnc/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport { dropTask, restartableTask, timeout } from 'ember-concurrency';\n\nimport type Bnc from 'cryptofiscafacile-gui/objects/bnc';\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\nimport type { Cerfa2086BNC } from 'cryptofiscafacile-wasm';\n\ninterface CerfaBncArgs {\n  cerfas: Cerfa2086BNC[];\n}\n\nexport default class CerfaBnc extends Component<CerfaBncArgs> {\n  @service declare wasm: WasmService;\n\n  @tracked selectedBnc: Bnc[] = [];\n\n  get sortedCerfas() {\n    let sortedCerfas: Cerfa2086BNC[] = this.args.cerfas;\n\n    sortedCerfas = this.#sortCerfas(sortedCerfas);\n\n    return sortedCerfas;\n  }\n  #sortCerfas(cerfas: Cerfa2086BNC[]): Cerfa2086BNC[] {\n    return cerfas.sort((y1: Cerfa2086BNC, y2: Cerfa2086BNC) => y1.year - y2.year);\n  }\n\n  @tracked success = false;\n  @tracked error = false;\n  @action\n  saveBnc() {\n    this.saveChoiceBNCTask.perform();\n  }\n\n  private saveChoiceBNCTask = dropTask(async () => {\n    this.selectedBnc.forEach((element) =>\n      debug(`Call to saveChoiceCashIn: For ${element.year} / Choice : ${element.cashin}`),\n    );\n\n    const saveChoiceBNCPromises = Promise.all(\n      this.selectedBnc.map((element) => this.wasm.saveChoiceBNCTask.perform(element.year, element.cashin)),\n    );\n\n    try {\n      await saveChoiceBNCPromises;\n      this.success = true;\n    } catch (error) {\n      debug((error as Error).message);\n      this.error = true;\n    }\n\n    this.saveChoiceBNCStatusIndicatorTask.perform();\n  });\n\n  private saveChoiceBNCStatusIndicatorTask = restartableTask(async () => {\n    await timeout(5000);\n    this.success = false;\n    this.error = false;\n  });\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div id=\\\"intro-report\\\" class=\\\"px-2 p-md-3 px-md-5\\\">\\n  <div\\n    data-title=\\\"Rapports\\\"\\n    data-intro=\\\"Bienvenue 👋 Sur cette page, vous aurez la possibilité de générer les rapports afin de vous aider dans le remplissage de vos formulaires d'imposition : CERFA-3916(bis), CERFA-2086...\\\"\\n  >\\n    <BsAccordion @selected=\\\"taxpayer\\\" @onChange={{this.onAccordionItemChange}} as |acc|>\\n      <acc.item @value=\\\"taxpayer\\\" as |aitem|>\\n        <aitem.title\\n          data-title=\\\"Contribuable\\\"\\n          data-intro=\\\"Via cette section 1, vous pourrez rentrer ici vos nom, prénom et adresse email...\\\"\\n        >\\n          <strong>Données du contribuable</strong>\\n        </aitem.title>\\n        <aitem.body>\\n          <Reporting::Person />\\n        </aitem.body>\\n      </acc.item>\\n      <acc.item @value=\\\"accounts\\\" as |aitem|>\\n        <aitem.title\\n          data-title=\\\"CERFA 3916\\\"\\n          data-intro=\\\"Cliquez sur cette zone... Au clique, une section apparait. Via cette section 2, vous pourrez rentrer toutes les informations nécessaires pour le formulaire 3916 (consulter la documentation pour savoir ce qu'est un formulaire 3916).\\\"\\n        >\\n          <strong>Données de comptes utilisateurs (CERFA 3916)</strong>\\n        </aitem.title>\\n        <aitem.body>\\n          {{#if this.reports}}\\n            <BsTab\\n              data-title=\\\"CERFA 3916\\\"\\n              data-position=\\\"left\\\"\\n              data-intro=\\\"Pour chaque portefeuille 'custodial' détecté, CryptoFiscaFacile vous proposera...\\\"\\n              as |tab|\\n            >\\n              {{#each this.sortedReports as |wallet|}}\\n                <tab.pane @title={{wallet.name}}>\\n                  <Reporting::UserData @wallet={{wallet}} />\\n                </tab.pane>\\n              {{/each}}\\n            </BsTab>\\n            <hr />\\n            <div class=\\\"d-flex me-auto\\\">\\n              <BsButton @type=\\\"primary\\\" {{on \\\"click\\\" (fn (mut this.addWalletModalVisible) true)}} class=\\\"mx-3\\\">\\n                Ajouter Portefeuille\\n              </BsButton>\\n              <BsButton\\n                data-title=\\\"CERFA 3916\\\"\\n                data-intro=\\\"Après toute modification, cliquez sur le bouton Enregistrer afin de retenir les informations.\\\"\\n                disabled={{this.saveAccountsTask.isRunning}}\\n                @type=\\\"primary\\\"\\n                @onClick={{this.saveAccData}}\\n              >Enregistrer</BsButton>\\n              {{#if this.success}}\\n                <BsAlert\\n                  class=\\\"m-0 mx-3 py-1 text-center\\\"\\n                  @visible={{true}}\\n                  @fade={{true}}\\n                  @fadeDuration={{800}}\\n                  @type=\\\"success\\\"\\n                  @dismissible={{false}}\\n                >\\n                  Enregistré avec succès !\\n                </BsAlert>\\n              {{/if}}\\n              {{#if this.error}}\\n                <BsAlert\\n                  class=\\\"m-0 mx-3 py-1 text-center\\\"\\n                  @visible={{true}}\\n                  @fade={{true}}\\n                  @fadeDuration={{800}}\\n                  @type=\\\"danger\\\"\\n                  @dismissible={{false}}\\n                >\\n                  Problème dans l'enregistrement !\\n                </BsAlert>\\n              {{/if}}\\n            </div>\\n          {{else}}\\n            <div class=\\\"d-flex justify-content-center\\\">\\n              <h5>Aucun Portefeuille à l'étranger détecté.</h5>\\n            </div>\\n            <div class=\\\"d-flex justify-content-center\\\">\\n              <BsButton @type=\\\"primary\\\" {{on \\\"click\\\" (fn (mut this.addWalletModalVisible) true)}}>Ajouter portefeuille</BsButton>\\n            </div>\\n          {{/if}}\\n        </aitem.body>\\n      </acc.item>\\n      <acc.item @value=\\\"cashin-choice\\\" as |aitem|>\\n        <aitem.title\\n          data-title=\\\"CERFA 2086\\\"\\n          data-position=\\\"top\\\"\\n          data-intro=\\\"Cliquez sur cette zone... Au clique, une section apparait. Via cette section 3, vous pourrez rentrer toutes les informations nécessaires pour le formulaire 2086 (consulter la documentation pour savoir ce qu'est un formulaire 2086).\\\"\\n        >\\n          <strong>Intégration catégories spécifiques (CERFA 2086/2042/2047)</strong>\\n        </aitem.title>\\n        <aitem.body class=\\\"mb-2\\\">\\n          {{#if this.cerfas2086CashinChoice}}\\n            <Reporting::CerfaBnc @cerfas={{this.cerfas2086CashinChoice}} />\\n          {{else}}\\n            <div class=\\\"d-flex justify-content-center\\\">\\n              <h5>Aucune modification à apporter dans cette section.</h5>\\n            </div>\\n          {{/if}}\\n        </aitem.body>\\n      </acc.item>\\n      <acc.item @value={{this.accItemReportsName}} as |aitem|>\\n        <aitem.title\\n          data-title=\\\"Génération des rapports\\\"\\n          data-position=\\\"top\\\"\\n          data-intro=\\\"Cliquez sur cette zone... Au clique, une section apparait. Via cette dernière section, vous pourrez générer vos aides à déclaration pour différents formulaires...\\\"\\n        >\\n          <strong>Génération des rapports fiscaux</strong>\\n        </aitem.title>\\n        <aitem.body>\\n          {{#if this.notEmptyReports}}\\n            <div class=\\\"px-1 container-fluid\\\">\\n              <div class=\\\"row flex-column flex-lg-row align-items-center my-2 my-md-3 my-lg-5\\\">\\n                <div\\n                  class=\\\"col-lg-3 mb-4 mb-lg-2 text-center\\\"\\n                  data-title=\\\"Génération des rapports\\\"\\n                  data-position=\\\"top\\\"\\n                  data-intro=\\\"Ici, vous pourrez générer les informations à rentrer dans le formulaire 3916. Un fichier sera généré afin de vous indiquer toutes les données de compte d'actifs numériques utiles pour votre déclaration.\\\"\\n                >\\n                  <div class=\\\"card-modal mt-1\\\">\\n                    <div class=\\\"set-image\\\">\\n                      <img src=\\\"reports/logo-impots-gouv-180x180.png\\\" alt=\\\"gouv\\\" />\\n                    </div>\\n                    <div class=\\\"ribbon-wrapper-2\\\">\\n                      <div class=\\\"ribbon-2\\\">\\n                        3916\\n                      </div>\\n                    </div>\\n                    {{#if this.wasm.get3916XlsxTask.isRunning}}\\n                      <BsButton @type=\\\"secondary\\\" class=\\\"mt-3\\\" disabled={{true}}>\\n                        <span class=\\\"spinner-border spinner-border-sm\\\" role=\\\"status\\\" aria-hidden=\\\"true\\\"></span>\\n                        Génération\\n                      </BsButton>\\n                    {{else if this.is3916Downloadable}}\\n                      <a\\n                        class=\\\"btn btn-primary mt-3\\\"\\n                        download={{this.filename}}\\n                        href={{this.fileURL}}\\n                        {{on \\\"click\\\" (fn this.buildCerfaLink \\\"3916\\\" this.wasm.cerfa3916)}}\\n                      >\\n                        <BsTooltip @placement=\\\"top\\\">Assurez-vous d'avoir au préalable bien fourni ci-dessus les dates\\n                          correctes ainsi que tous vos identifiants, avant de télécharger ce document.</BsTooltip>\\n                        Télécharger\\n                      </a>\\n                    {{else}}\\n                      <BsButton @type=\\\"secondary\\\" class=\\\"mt-3\\\" {{on \\\"click\\\" (fn this.displayReportErrorModal 3916)}}>\\n                        <BsTooltip @placement=\\\"top\\\">Le fichier ne peut être généré. Cliquez pour vérifier l'erreur.</BsTooltip>\\n                        Télécharger\\n                      </BsButton>\\n                    {{/if}}\\n                  </div>\\n                </div>\\n                <div\\n                  class=\\\"col-lg-3 mb-4 mb-lg-2 text-center\\\"\\n                  data-title=\\\"Génération des rapports\\\"\\n                  data-position=\\\"top\\\"\\n                  data-intro=\\\"Ici, vous pourrez générer les informations à rentrer dans le formulaire 2086. Un fichier sera généré afin de vous indiquer les montants et les mentions reportables dans le dit formulaire pour votre déclaration.\\\"\\n                >\\n                  <div class=\\\"card-modal mt-1\\\">\\n                    <div class=\\\"set-image\\\">\\n                      <img src=\\\"reports/logo-impots-gouv-180x180.png\\\" alt=\\\"gouv\\\" />\\n                    </div>\\n                    <div class=\\\"ribbon-wrapper-2\\\">\\n                      <div class=\\\"ribbon-2\\\">\\n                        2086\\n                      </div>\\n                    </div>\\n                    {{#if this.wasm.get2086XlsxTask.isRunning}}\\n                      <BsButton @type=\\\"secondary\\\" class=\\\"mt-3\\\" disabled={{true}}>\\n                        <span class=\\\"spinner-border spinner-border-sm\\\" role=\\\"status\\\" aria-hidden=\\\"true\\\"></span>\\n                        Génération\\n                      </BsButton>\\n                    {{else if this.is2086Downloadable}}\\n                      <a\\n                        class=\\\"btn btn-primary mt-3\\\"\\n                        download={{this.filename}}\\n                        href={{this.fileURL}}\\n                        {{on \\\"click\\\" (fn this.buildCerfaLink \\\"2086\\\" this.wasm.cerfa2086)}}\\n                      >\\n                        <BsTooltip @placement=\\\"top\\\">Assurez-vous d'avoir au préalable bien sélectionné l'option adéquate\\n                          ci-dessus, avant de télécharger ce document.</BsTooltip>\\n                        Télécharger\\n                      </a>\\n                    {{else}}\\n                      <BsButton @type=\\\"secondary\\\" class=\\\"mt-3\\\" {{on \\\"click\\\" (fn this.displayReportErrorModal 2086)}}>\\n                        <BsTooltip @placement=\\\"top\\\">Cliquez pour vérifier les erreurs.</BsTooltip>\\n                        Télécharger\\n                      </BsButton>\\n                    {{/if}}\\n                  </div>\\n                </div>\\n                <div\\n                  class=\\\"col-lg-3 mb-4 mb-lg-2 text-center\\\"\\n                  data-title=\\\"Génération des rapports\\\"\\n                  data-position=\\\"top\\\"\\n                  data-intro=\\\"Ici, vous pourrez générer les informations sur la fiscalité de l'année en cours à déclarer l'an prochain. Un fichier sera généré afin de vous indiquer les montants et les mentions reportables de l'année en cours.\\\"\\n                >\\n                  <div class=\\\"card-modal mt-1\\\">\\n                    <div class=\\\"set-image\\\">\\n                      <div class=\\\"stock pb-4 ps-4\\\">\\n                        <img src=\\\"reports/Logo_new.png\\\" alt=\\\"CFF\\\" width=\\\"100px\\\" height=\\\"100px\\\" />\\n                      </div>\\n                    </div>\\n                    <div class=\\\"ribbon-wrapper-2\\\">\\n                      <div class=\\\"ribbon-2\\\">\\n                        2086 previsio.\\n                      </div>\\n                    </div>\\n                    {{#if this.wasm.get2086XlsxUpToTodayTask.isRunning}}\\n                      <BsButton @type=\\\"secondary\\\" class=\\\"mt-3\\\" disabled={{true}}>\\n                        <span class=\\\"spinner-border spinner-border-sm\\\" role=\\\"status\\\" aria-hidden=\\\"true\\\"></span>\\n                        Génération\\n                      </BsButton>\\n                    {{else if this.is2086UpToTodayDownloadable}}\\n                      <a\\n                        class=\\\"btn btn-primary mt-3\\\"\\n                        download={{this.filename}}\\n                        href={{this.fileURL}}\\n                        {{on \\\"click\\\" (fn this.buildCerfaLink \\\"2086_PREV\\\" this.wasm.cerfa2086UpToToday)}}\\n                      >\\n                        <BsTooltip @placement=\\\"top\\\">Assurez-vous d'avoir au préalable bien sélectionné l'option adéquate\\n                          ci-dessus, avant de télécharger ce document.</BsTooltip>\\n                        Télécharger\\n                      </a>\\n                    {{else}}\\n                      <BsButton @type=\\\"secondary\\\" class=\\\"mt-3\\\" {{on \\\"click\\\" (fn this.displayReportErrorModal 2086)}}>\\n                        <BsTooltip @placement=\\\"top\\\">Cliquez pour vérifier les erreurs.</BsTooltip>\\n                        Télécharger\\n                      </BsButton>\\n                    {{/if}}\\n                  </div>\\n                </div>\\n                <div\\n                  class=\\\"col-lg-3 mb-4 mb-lg-2 text-center\\\"\\n                  data-title=\\\"Génération des rapports\\\"\\n                  data-position=\\\"top\\\"\\n                  data-intro=\\\"Enfin, CryptoFiscaFacile vous permettra enfin de télécharger un tableau qui répertorie les TX et les balances de tous vos actifs.\\\"\\n                >\\n                  <div class=\\\"card-modal mt-1\\\">\\n                    <div class=\\\"set-image\\\">\\n                      <div class=\\\"stock pb-4 ps-4\\\">\\n                        <img src=\\\"reports/Logo_new.png\\\" alt=\\\"CFF\\\" width=\\\"100px\\\" height=\\\"100px\\\" />\\n                      </div>\\n                    </div>\\n                    <div class=\\\"ribbon-wrapper-2\\\">\\n                      <div class=\\\"ribbon-2\\\">\\n                        Fiche Stock\\n                      </div>\\n                    </div>\\n                    {{#if this.wasm.getStocksXlsxTask.isRunning}}\\n                      <BsButton @type=\\\"secondary\\\" class=\\\"mt-3\\\" disabled={{true}}>\\n                        <span class=\\\"spinner-border spinner-border-sm\\\" role=\\\"status\\\" aria-hidden=\\\"true\\\"></span>\\n                        Génération\\n                      </BsButton>\\n                    {{else if this.isStocksDownloadable}}\\n                      <a\\n                        class=\\\"btn btn-primary mt-3\\\"\\n                        download={{this.filename}}\\n                        href={{this.fileURL}}\\n                        {{on \\\"click\\\" this.ficStock}}\\n                      >\\n                        Télécharger\\n                      </a>\\n                    {{else}}\\n                      <BsButton @type=\\\"secondary\\\" class=\\\"mt-3\\\" disabled=\\\"true\\\">\\n                        <BsTooltip @placement=\\\"top\\\">Le fichier ne peut être généré. Veuillez contacter le support.</BsTooltip>\\n                        Télécharger\\n                      </BsButton>\\n                    {{/if}}\\n                  </div>\\n                </div>\\n              </div>\\n            </div>\\n          {{else}}\\n            <div class=\\\"d-flex justify-content-center\\\">\\n              <h5>Aucune donnée - Veuillez d'abord importer vos transactions.</h5>\\n            </div>\\n          {{/if}}\\n        </aitem.body>\\n      </acc.item>\\n    </BsAccordion>\\n  </div>\\n</div>\\n\\n<UserWallets::AddModal\\n  @open={{this.addWalletModalVisible}}\\n  @onHide={{fn (mut this.addWalletModalVisible) false}}\\n  @onWalletAdded={{this.reloadReports}}\\n/>\\n\\n<Reporting::ReportErrorModal\\n  @open={{this.reportErrorModalVisible}}\\n  @type={{this.reportErrorModalType}}\\n  @onHidden={{this.closeReportErrorModal}}\\n/>\", {\"contents\":\"<div id=\\\"intro-report\\\" class=\\\"px-2 p-md-3 px-md-5\\\">\\n  <div\\n    data-title=\\\"Rapports\\\"\\n    data-intro=\\\"Bienvenue 👋 Sur cette page, vous aurez la possibilité de générer les rapports afin de vous aider dans le remplissage de vos formulaires d'imposition : CERFA-3916(bis), CERFA-2086...\\\"\\n  >\\n    <BsAccordion @selected=\\\"taxpayer\\\" @onChange={{this.onAccordionItemChange}} as |acc|>\\n      <acc.item @value=\\\"taxpayer\\\" as |aitem|>\\n        <aitem.title\\n          data-title=\\\"Contribuable\\\"\\n          data-intro=\\\"Via cette section 1, vous pourrez rentrer ici vos nom, prénom et adresse email...\\\"\\n        >\\n          <strong>Données du contribuable</strong>\\n        </aitem.title>\\n        <aitem.body>\\n          <Reporting::Person />\\n        </aitem.body>\\n      </acc.item>\\n      <acc.item @value=\\\"accounts\\\" as |aitem|>\\n        <aitem.title\\n          data-title=\\\"CERFA 3916\\\"\\n          data-intro=\\\"Cliquez sur cette zone... Au clique, une section apparait. Via cette section 2, vous pourrez rentrer toutes les informations nécessaires pour le formulaire 3916 (consulter la documentation pour savoir ce qu'est un formulaire 3916).\\\"\\n        >\\n          <strong>Données de comptes utilisateurs (CERFA 3916)</strong>\\n        </aitem.title>\\n        <aitem.body>\\n          {{#if this.reports}}\\n            <BsTab\\n              data-title=\\\"CERFA 3916\\\"\\n              data-position=\\\"left\\\"\\n              data-intro=\\\"Pour chaque portefeuille 'custodial' détecté, CryptoFiscaFacile vous proposera...\\\"\\n              as |tab|\\n            >\\n              {{#each this.sortedReports as |wallet|}}\\n                <tab.pane @title={{wallet.name}}>\\n                  <Reporting::UserData @wallet={{wallet}} />\\n                </tab.pane>\\n              {{/each}}\\n            </BsTab>\\n            <hr />\\n            <div class=\\\"d-flex me-auto\\\">\\n              <BsButton @type=\\\"primary\\\" {{on \\\"click\\\" (fn (mut this.addWalletModalVisible) true)}} class=\\\"mx-3\\\">\\n                Ajouter Portefeuille\\n              </BsButton>\\n              <BsButton\\n                data-title=\\\"CERFA 3916\\\"\\n                data-intro=\\\"Après toute modification, cliquez sur le bouton Enregistrer afin de retenir les informations.\\\"\\n                disabled={{this.saveAccountsTask.isRunning}}\\n                @type=\\\"primary\\\"\\n                @onClick={{this.saveAccData}}\\n              >Enregistrer</BsButton>\\n              {{#if this.success}}\\n                <BsAlert\\n                  class=\\\"m-0 mx-3 py-1 text-center\\\"\\n                  @visible={{true}}\\n                  @fade={{true}}\\n                  @fadeDuration={{800}}\\n                  @type=\\\"success\\\"\\n                  @dismissible={{false}}\\n                >\\n                  Enregistré avec succès !\\n                </BsAlert>\\n              {{/if}}\\n              {{#if this.error}}\\n                <BsAlert\\n                  class=\\\"m-0 mx-3 py-1 text-center\\\"\\n                  @visible={{true}}\\n                  @fade={{true}}\\n                  @fadeDuration={{800}}\\n                  @type=\\\"danger\\\"\\n                  @dismissible={{false}}\\n                >\\n                  Problème dans l'enregistrement !\\n                </BsAlert>\\n              {{/if}}\\n            </div>\\n          {{else}}\\n            <div class=\\\"d-flex justify-content-center\\\">\\n              <h5>Aucun Portefeuille à l'étranger détecté.</h5>\\n            </div>\\n            <div class=\\\"d-flex justify-content-center\\\">\\n              <BsButton @type=\\\"primary\\\" {{on \\\"click\\\" (fn (mut this.addWalletModalVisible) true)}}>Ajouter portefeuille</BsButton>\\n            </div>\\n          {{/if}}\\n        </aitem.body>\\n      </acc.item>\\n      <acc.item @value=\\\"cashin-choice\\\" as |aitem|>\\n        <aitem.title\\n          data-title=\\\"CERFA 2086\\\"\\n          data-position=\\\"top\\\"\\n          data-intro=\\\"Cliquez sur cette zone... Au clique, une section apparait. Via cette section 3, vous pourrez rentrer toutes les informations nécessaires pour le formulaire 2086 (consulter la documentation pour savoir ce qu'est un formulaire 2086).\\\"\\n        >\\n          <strong>Intégration catégories spécifiques (CERFA 2086/2042/2047)</strong>\\n        </aitem.title>\\n        <aitem.body class=\\\"mb-2\\\">\\n          {{#if this.cerfas2086CashinChoice}}\\n            <Reporting::CerfaBnc @cerfas={{this.cerfas2086CashinChoice}} />\\n          {{else}}\\n            <div class=\\\"d-flex justify-content-center\\\">\\n              <h5>Aucune modification à apporter dans cette section.</h5>\\n            </div>\\n          {{/if}}\\n        </aitem.body>\\n      </acc.item>\\n      <acc.item @value={{this.accItemReportsName}} as |aitem|>\\n        <aitem.title\\n          data-title=\\\"Génération des rapports\\\"\\n          data-position=\\\"top\\\"\\n          data-intro=\\\"Cliquez sur cette zone... Au clique, une section apparait. Via cette dernière section, vous pourrez générer vos aides à déclaration pour différents formulaires...\\\"\\n        >\\n          <strong>Génération des rapports fiscaux</strong>\\n        </aitem.title>\\n        <aitem.body>\\n          {{#if this.notEmptyReports}}\\n            <div class=\\\"px-1 container-fluid\\\">\\n              <div class=\\\"row flex-column flex-lg-row align-items-center my-2 my-md-3 my-lg-5\\\">\\n                <div\\n                  class=\\\"col-lg-3 mb-4 mb-lg-2 text-center\\\"\\n                  data-title=\\\"Génération des rapports\\\"\\n                  data-position=\\\"top\\\"\\n                  data-intro=\\\"Ici, vous pourrez générer les informations à rentrer dans le formulaire 3916. Un fichier sera généré afin de vous indiquer toutes les données de compte d'actifs numériques utiles pour votre déclaration.\\\"\\n                >\\n                  <div class=\\\"card-modal mt-1\\\">\\n                    <div class=\\\"set-image\\\">\\n                      <img src=\\\"reports/logo-impots-gouv-180x180.png\\\" alt=\\\"gouv\\\" />\\n                    </div>\\n                    <div class=\\\"ribbon-wrapper-2\\\">\\n                      <div class=\\\"ribbon-2\\\">\\n                        3916\\n                      </div>\\n                    </div>\\n                    {{#if this.wasm.get3916XlsxTask.isRunning}}\\n                      <BsButton @type=\\\"secondary\\\" class=\\\"mt-3\\\" disabled={{true}}>\\n                        <span class=\\\"spinner-border spinner-border-sm\\\" role=\\\"status\\\" aria-hidden=\\\"true\\\"></span>\\n                        Génération\\n                      </BsButton>\\n                    {{else if this.is3916Downloadable}}\\n                      <a\\n                        class=\\\"btn btn-primary mt-3\\\"\\n                        download={{this.filename}}\\n                        href={{this.fileURL}}\\n                        {{on \\\"click\\\" (fn this.buildCerfaLink \\\"3916\\\" this.wasm.cerfa3916)}}\\n                      >\\n                        <BsTooltip @placement=\\\"top\\\">Assurez-vous d'avoir au préalable bien fourni ci-dessus les dates\\n                          correctes ainsi que tous vos identifiants, avant de télécharger ce document.</BsTooltip>\\n                        Télécharger\\n                      </a>\\n                    {{else}}\\n                      <BsButton @type=\\\"secondary\\\" class=\\\"mt-3\\\" {{on \\\"click\\\" (fn this.displayReportErrorModal 3916)}}>\\n                        <BsTooltip @placement=\\\"top\\\">Le fichier ne peut être généré. Cliquez pour vérifier l'erreur.</BsTooltip>\\n                        Télécharger\\n                      </BsButton>\\n                    {{/if}}\\n                  </div>\\n                </div>\\n                <div\\n                  class=\\\"col-lg-3 mb-4 mb-lg-2 text-center\\\"\\n                  data-title=\\\"Génération des rapports\\\"\\n                  data-position=\\\"top\\\"\\n                  data-intro=\\\"Ici, vous pourrez générer les informations à rentrer dans le formulaire 2086. Un fichier sera généré afin de vous indiquer les montants et les mentions reportables dans le dit formulaire pour votre déclaration.\\\"\\n                >\\n                  <div class=\\\"card-modal mt-1\\\">\\n                    <div class=\\\"set-image\\\">\\n                      <img src=\\\"reports/logo-impots-gouv-180x180.png\\\" alt=\\\"gouv\\\" />\\n                    </div>\\n                    <div class=\\\"ribbon-wrapper-2\\\">\\n                      <div class=\\\"ribbon-2\\\">\\n                        2086\\n                      </div>\\n                    </div>\\n                    {{#if this.wasm.get2086XlsxTask.isRunning}}\\n                      <BsButton @type=\\\"secondary\\\" class=\\\"mt-3\\\" disabled={{true}}>\\n                        <span class=\\\"spinner-border spinner-border-sm\\\" role=\\\"status\\\" aria-hidden=\\\"true\\\"></span>\\n                        Génération\\n                      </BsButton>\\n                    {{else if this.is2086Downloadable}}\\n                      <a\\n                        class=\\\"btn btn-primary mt-3\\\"\\n                        download={{this.filename}}\\n                        href={{this.fileURL}}\\n                        {{on \\\"click\\\" (fn this.buildCerfaLink \\\"2086\\\" this.wasm.cerfa2086)}}\\n                      >\\n                        <BsTooltip @placement=\\\"top\\\">Assurez-vous d'avoir au préalable bien sélectionné l'option adéquate\\n                          ci-dessus, avant de télécharger ce document.</BsTooltip>\\n                        Télécharger\\n                      </a>\\n                    {{else}}\\n                      <BsButton @type=\\\"secondary\\\" class=\\\"mt-3\\\" {{on \\\"click\\\" (fn this.displayReportErrorModal 2086)}}>\\n                        <BsTooltip @placement=\\\"top\\\">Cliquez pour vérifier les erreurs.</BsTooltip>\\n                        Télécharger\\n                      </BsButton>\\n                    {{/if}}\\n                  </div>\\n                </div>\\n                <div\\n                  class=\\\"col-lg-3 mb-4 mb-lg-2 text-center\\\"\\n                  data-title=\\\"Génération des rapports\\\"\\n                  data-position=\\\"top\\\"\\n                  data-intro=\\\"Ici, vous pourrez générer les informations sur la fiscalité de l'année en cours à déclarer l'an prochain. Un fichier sera généré afin de vous indiquer les montants et les mentions reportables de l'année en cours.\\\"\\n                >\\n                  <div class=\\\"card-modal mt-1\\\">\\n                    <div class=\\\"set-image\\\">\\n                      <div class=\\\"stock pb-4 ps-4\\\">\\n                        <img src=\\\"reports/Logo_new.png\\\" alt=\\\"CFF\\\" width=\\\"100px\\\" height=\\\"100px\\\" />\\n                      </div>\\n                    </div>\\n                    <div class=\\\"ribbon-wrapper-2\\\">\\n                      <div class=\\\"ribbon-2\\\">\\n                        2086 previsio.\\n                      </div>\\n                    </div>\\n                    {{#if this.wasm.get2086XlsxUpToTodayTask.isRunning}}\\n                      <BsButton @type=\\\"secondary\\\" class=\\\"mt-3\\\" disabled={{true}}>\\n                        <span class=\\\"spinner-border spinner-border-sm\\\" role=\\\"status\\\" aria-hidden=\\\"true\\\"></span>\\n                        Génération\\n                      </BsButton>\\n                    {{else if this.is2086UpToTodayDownloadable}}\\n                      <a\\n                        class=\\\"btn btn-primary mt-3\\\"\\n                        download={{this.filename}}\\n                        href={{this.fileURL}}\\n                        {{on \\\"click\\\" (fn this.buildCerfaLink \\\"2086_PREV\\\" this.wasm.cerfa2086UpToToday)}}\\n                      >\\n                        <BsTooltip @placement=\\\"top\\\">Assurez-vous d'avoir au préalable bien sélectionné l'option adéquate\\n                          ci-dessus, avant de télécharger ce document.</BsTooltip>\\n                        Télécharger\\n                      </a>\\n                    {{else}}\\n                      <BsButton @type=\\\"secondary\\\" class=\\\"mt-3\\\" {{on \\\"click\\\" (fn this.displayReportErrorModal 2086)}}>\\n                        <BsTooltip @placement=\\\"top\\\">Cliquez pour vérifier les erreurs.</BsTooltip>\\n                        Télécharger\\n                      </BsButton>\\n                    {{/if}}\\n                  </div>\\n                </div>\\n                <div\\n                  class=\\\"col-lg-3 mb-4 mb-lg-2 text-center\\\"\\n                  data-title=\\\"Génération des rapports\\\"\\n                  data-position=\\\"top\\\"\\n                  data-intro=\\\"Enfin, CryptoFiscaFacile vous permettra enfin de télécharger un tableau qui répertorie les TX et les balances de tous vos actifs.\\\"\\n                >\\n                  <div class=\\\"card-modal mt-1\\\">\\n                    <div class=\\\"set-image\\\">\\n                      <div class=\\\"stock pb-4 ps-4\\\">\\n                        <img src=\\\"reports/Logo_new.png\\\" alt=\\\"CFF\\\" width=\\\"100px\\\" height=\\\"100px\\\" />\\n                      </div>\\n                    </div>\\n                    <div class=\\\"ribbon-wrapper-2\\\">\\n                      <div class=\\\"ribbon-2\\\">\\n                        Fiche Stock\\n                      </div>\\n                    </div>\\n                    {{#if this.wasm.getStocksXlsxTask.isRunning}}\\n                      <BsButton @type=\\\"secondary\\\" class=\\\"mt-3\\\" disabled={{true}}>\\n                        <span class=\\\"spinner-border spinner-border-sm\\\" role=\\\"status\\\" aria-hidden=\\\"true\\\"></span>\\n                        Génération\\n                      </BsButton>\\n                    {{else if this.isStocksDownloadable}}\\n                      <a\\n                        class=\\\"btn btn-primary mt-3\\\"\\n                        download={{this.filename}}\\n                        href={{this.fileURL}}\\n                        {{on \\\"click\\\" this.ficStock}}\\n                      >\\n                        Télécharger\\n                      </a>\\n                    {{else}}\\n                      <BsButton @type=\\\"secondary\\\" class=\\\"mt-3\\\" disabled=\\\"true\\\">\\n                        <BsTooltip @placement=\\\"top\\\">Le fichier ne peut être généré. Veuillez contacter le support.</BsTooltip>\\n                        Télécharger\\n                      </BsButton>\\n                    {{/if}}\\n                  </div>\\n                </div>\\n              </div>\\n            </div>\\n          {{else}}\\n            <div class=\\\"d-flex justify-content-center\\\">\\n              <h5>Aucune donnée - Veuillez d'abord importer vos transactions.</h5>\\n            </div>\\n          {{/if}}\\n        </aitem.body>\\n      </acc.item>\\n    </BsAccordion>\\n  </div>\\n</div>\\n\\n<UserWallets::AddModal\\n  @open={{this.addWalletModalVisible}}\\n  @onHide={{fn (mut this.addWalletModalVisible) false}}\\n  @onWalletAdded={{this.reloadReports}}\\n/>\\n\\n<Reporting::ReportErrorModal\\n  @open={{this.reportErrorModalVisible}}\\n  @type={{this.reportErrorModalType}}\\n  @onHidden={{this.closeReportErrorModal}}\\n/>\",\"moduleName\":\"cryptofiscafacile-gui/components/reporting/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/reporting/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport { SortOrder } from 'cryptofiscafacile-gui/enums/sort-order';\nimport Sorts from 'cryptofiscafacile-gui/utils/sorts';\nimport { dropTask, restartableTask, timeout } from 'ember-concurrency';\n\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\nimport type { Cerfa3916Wallet } from 'cryptofiscafacile-wasm';\n\nexport default class Reporting extends Component {\n  private static readonly ACC_ITEM_REPORTS_NAME = 'reports';\n\n  @service declare wasm: WasmService;\n\n  @tracked filename = '';\n  @tracked fileURL = '';\n\n  @tracked isDownloadable = false;\n\n  @tracked reportsSortOrder = SortOrder.ASC;\n\n  @tracked reportErrorModalVisible = false;\n  @tracked reportErrorModalType?: number;\n\n  @tracked addWalletModalVisible = false;\n\n  get accItemReportsName() {\n    return Reporting.ACC_ITEM_REPORTS_NAME;\n  }\n\n  /**\n   * List of getter methods for CERFA 3916\n   *\n   * @readonly\n   * @memberof Reporting\n   */\n  get unprocessedReports() {\n    return this.wasm.reports?.cerfa3916.wallets ?? [];\n  }\n  get notEmptyReports() {\n    return this.wasm.reports?.hasTX || this.reports;\n  }\n\n  get reports() {\n    this.unprocessedReports.forEach((element) => {\n      if (element.accounts.length === 0) {\n        element.accounts.push({ id: '-', opened: element.firsttx, closed: element.lasttx, isClosed: false });\n      }\n    });\n\n    return this.unprocessedReports;\n  }\n  get sortedReports() {\n    // This is for value to use in HBS = sorted wallets\n    return this.reports.slice().sort(Sorts.text((cerfa: Cerfa3916Wallet) => cerfa.name, this.reportsSortOrder));\n  }\n\n  get cerfas2086CashinChoice() {\n    return this.wasm.reports?.cerfa2086.cashin ?? [];\n  }\n\n  @tracked success = false;\n  @tracked error = false;\n  @action\n  saveAccData() {\n    this.saveAccountsTask.perform();\n  }\n\n  @action\n  reloadReports() {\n    this.wasm.getReportsTask.perform();\n  }\n\n  private saveAccountsTask = dropTask(async () => {\n    this.sortedReports.forEach((element) => debug(`Call to saveAccounts for ${element.name}`));\n\n    const saveAccountsPromises = Promise.all(\n      this.sortedReports.map((element) => this.wasm.saveAccountsTask.perform(element.name, element.accounts)),\n    );\n\n    try {\n      await saveAccountsPromises;\n      this.success = true;\n    } catch (error) {\n      debug((error as Error).message);\n      this.error = true;\n    }\n\n    this.removeSaveAccountsStatusIndicatorTask.perform();\n  });\n\n  private removeSaveAccountsStatusIndicatorTask = restartableTask(async () => {\n    await timeout(3000);\n    this.success = false;\n    this.error = false;\n  });\n\n  @action\n  onAccordionItemChange(newValue: string) {\n    if (newValue === Reporting.ACC_ITEM_REPORTS_NAME) {\n      this.generateReports();\n    }\n  }\n\n  generateReports() {\n    debug('reports generating');\n    this.wasm.get2086XlsxTask.perform();\n    this.wasm.get2086XlsxUpToTodayTask.perform();\n    this.wasm.get3916XlsxTask.perform();\n    this.wasm.getStocksXlsxTask.perform();\n  }\n\n  get is2086Downloadable() {\n    return !this.wasm.errorMessage2086 && this.wasm.cerfa2086;\n  }\n\n  get is2086UpToTodayDownloadable() {\n    return !this.wasm.errorMessage2086UpToToday && this.wasm.cerfa2086UpToToday;\n  }\n\n  get is3916Downloadable() {\n    return !this.wasm.errorMessage3916 && this.wasm.cerfa3916;\n  }\n\n  get isStocksDownloadable() {\n    return this.wasm.stocksXLSX;\n  }\n\n  @action\n  buildCerfaLink(id: string, content: Uint8Array | undefined) {\n    debug(`Call to CERFA ${id}...`);\n\n    if (content) {\n      debug('XLSX generated!');\n\n      // Convert Uint8Array to ArrayBuffer\n      let buf = this.typedArrayToBuffer(content);\n      //Create blob from the ArrayBuffer\n      let blob = new Blob([buf], {\n        type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;',\n      });\n\n      let today = new Date();\n      let dd = String(today.getDate()).padStart(2, '0');\n      let mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0!\n      let yyyy = String(today.getFullYear());\n\n      this.filename = `CERFA_${id}_${yyyy}${mm}${dd}.xlsx`;\n      // Then create the URI, for file download\n      this.fileURL = window.URL.createObjectURL(blob);\n    } else {\n      debug(`ERROR - CERFA ${id} not generated!`);\n    }\n  }\n\n  @action\n  ficStock() {\n    debug('Call to ficStock...');\n\n    if (this.wasm.stocksXLSX) {\n      debug('XLSX generated!');\n\n      // Convert Uint8Array to ArrayBuffer\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      let buf = this.typedArrayToBuffer(this.wasm.stocksXLSX);\n      //Create blob from the ArrayBuffer\n      let blob = new Blob([buf], {\n        type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;',\n      });\n\n      let today = new Date();\n      let dd = String(today.getDate()).padStart(2, '0');\n      let mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0!\n      let yyyy = String(today.getFullYear());\n\n      this.filename = 'FicheStocks_' + yyyy + mm + dd + '.xlsx';\n      // Then create the URI, for file download\n      this.fileURL = window.URL.createObjectURL(blob);\n    } else {\n      debug('ERROR - XLSX not generated!');\n    }\n  }\n\n  typedArrayToBuffer(array: Uint8Array): ArrayBuffer {\n    return array.buffer.slice(array.byteOffset, array.byteLength + array.byteOffset);\n  }\n\n  @action\n  displayReportErrorModal(type: number) {\n    this.reportErrorModalType = type;\n    this.reportErrorModalVisible = true;\n  }\n\n  @action\n  closeReportErrorModal() {\n    this.reportErrorModalType = undefined;\n    this.reportErrorModalVisible = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div data-test-reports-person class=\\\"px-md-5\\\">\\n  <BsForm @onSubmit={{this.saveUserData}} as |form|>\\n    {{! Do not change for ember-bootstrap component !}}\\n    <label for=\\\"name\\\" class=\\\"form-label\\\">Nom</label>\\n    <input\\n      type=\\\"text\\\"\\n      class=\\\"form-control report-input mb-3\\\"\\n      {{on \\\"input\\\" this.setName}}\\n      id=\\\"name\\\"\\n      value={{this.name}}\\n      required\\n    />\\n    {{! Do not change for ember-bootstrap component !}}\\n    <label for=\\\"surname\\\" class=\\\"form-label\\\">Prénom</label>\\n    <input\\n      type=\\\"text\\\"\\n      class=\\\"form-control report-input mb-3\\\"\\n      id=\\\"surname\\\"\\n      value={{this.surname}}\\n      {{on \\\"input\\\" this.setSurname}}\\n      required\\n    />\\n    {{! Do not change for ember-bootstrap component !}}\\n    <label for=\\\"email\\\" class=\\\"form-label\\\">Email</label>\\n    <input\\n      type=\\\"text\\\"\\n      class=\\\"form-control report-input mb-3\\\"\\n      id=\\\"email\\\"\\n      value={{this.email}}\\n      {{on \\\"input\\\" this.setEmail}}\\n      required\\n    />\\n    <div class=\\\"d-flex\\\">\\n      <form.submitButton\\n        data-test-reports-person-button\\n        disabled={{not this.updated}}\\n        class=\\\"h-38\\\"\\n      >Enregistrer</form.submitButton>\\n      {{#if this.success}}\\n        <BsAlert\\n          class=\\\"m-0 mx-3 py-1 text-center\\\"\\n          data-test-reports-person-success\\n          @visible={{true}}\\n          @fade={{true}}\\n          @fadeDuration={{800}}\\n          @type=\\\"success\\\"\\n          @dismissible={{false}}\\n        >\\n          Enregistré avec succès !\\n        </BsAlert>\\n      {{/if}}\\n      {{#if this.error}}\\n        <BsAlert\\n          class=\\\"m-0 mx-3 py-1 text-center\\\"\\n          @visible={{true}}\\n          @fade={{true}}\\n          @fadeDuration={{800}}\\n          @type=\\\"danger\\\"\\n          @dismissible={{false}}\\n        >\\n          Problème dans l'enregistrement !\\n        </BsAlert>\\n      {{/if}}\\n    </div>\\n  </BsForm>\\n</div>\", {\"contents\":\"<div data-test-reports-person class=\\\"px-md-5\\\">\\n  <BsForm @onSubmit={{this.saveUserData}} as |form|>\\n    {{! Do not change for ember-bootstrap component !}}\\n    <label for=\\\"name\\\" class=\\\"form-label\\\">Nom</label>\\n    <input\\n      type=\\\"text\\\"\\n      class=\\\"form-control report-input mb-3\\\"\\n      {{on \\\"input\\\" this.setName}}\\n      id=\\\"name\\\"\\n      value={{this.name}}\\n      required\\n    />\\n    {{! Do not change for ember-bootstrap component !}}\\n    <label for=\\\"surname\\\" class=\\\"form-label\\\">Prénom</label>\\n    <input\\n      type=\\\"text\\\"\\n      class=\\\"form-control report-input mb-3\\\"\\n      id=\\\"surname\\\"\\n      value={{this.surname}}\\n      {{on \\\"input\\\" this.setSurname}}\\n      required\\n    />\\n    {{! Do not change for ember-bootstrap component !}}\\n    <label for=\\\"email\\\" class=\\\"form-label\\\">Email</label>\\n    <input\\n      type=\\\"text\\\"\\n      class=\\\"form-control report-input mb-3\\\"\\n      id=\\\"email\\\"\\n      value={{this.email}}\\n      {{on \\\"input\\\" this.setEmail}}\\n      required\\n    />\\n    <div class=\\\"d-flex\\\">\\n      <form.submitButton\\n        data-test-reports-person-button\\n        disabled={{not this.updated}}\\n        class=\\\"h-38\\\"\\n      >Enregistrer</form.submitButton>\\n      {{#if this.success}}\\n        <BsAlert\\n          class=\\\"m-0 mx-3 py-1 text-center\\\"\\n          data-test-reports-person-success\\n          @visible={{true}}\\n          @fade={{true}}\\n          @fadeDuration={{800}}\\n          @type=\\\"success\\\"\\n          @dismissible={{false}}\\n        >\\n          Enregistré avec succès !\\n        </BsAlert>\\n      {{/if}}\\n      {{#if this.error}}\\n        <BsAlert\\n          class=\\\"m-0 mx-3 py-1 text-center\\\"\\n          @visible={{true}}\\n          @fade={{true}}\\n          @fadeDuration={{800}}\\n          @type=\\\"danger\\\"\\n          @dismissible={{false}}\\n        >\\n          Problème dans l'enregistrement !\\n        </BsAlert>\\n      {{/if}}\\n    </div>\\n  </BsForm>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/reporting/person/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/reporting/person/index.hbs\"}});\nimport Ember from 'ember';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport { dropTask, restartableTask, timeout } from 'ember-concurrency';\n\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\n\nexport default class Person extends Component {\n  @service declare wasm: WasmService;\n\n  @tracked newName?: string;\n  @tracked newSurname?: string;\n  @tracked newEmail?: string;\n\n  @tracked success = false;\n  @tracked error = false;\n\n  get name() {\n    return this.newName || (this.wasm.userInfos?.name ?? '');\n  }\n  get surname() {\n    return this.newSurname || (this.wasm.userInfos?.surname ?? '');\n  }\n  get email() {\n    return this.newEmail || (this.wasm.userInfos?.email ?? '');\n  }\n\n  get nameUpdated() {\n    return this.newName && this.wasm.userInfos?.name !== this.newName;\n  }\n\n  get surnameUpdated() {\n    return this.newSurname && this.wasm.userInfos?.surname !== this.newSurname;\n  }\n\n  get emailUpdated() {\n    return this.newEmail && this.wasm.userInfos?.email !== this.newEmail;\n  }\n\n  get updated() {\n    return this.nameUpdated || this.surnameUpdated || this.emailUpdated;\n  }\n\n  @action\n  setName(e: { target: HTMLInputElement }) {\n    this.newName = e.target.value;\n  }\n\n  @action\n  setSurname(e: { target: HTMLInputElement }) {\n    this.newSurname = e.target.value;\n  }\n\n  @action\n  setEmail(e: { target: HTMLInputElement }) {\n    this.newEmail = e.target.value;\n  }\n\n  @action\n  saveUserData() {\n    if (this.nameUpdated || this.surnameUpdated || this.emailUpdated) {\n      this.saveUserDataTask.perform();\n    } else {\n      debug('No update of user data. No task loaded!');\n    }\n  }\n\n  private saveUserDataTask = dropTask(async () => {\n    try {\n      await this.wasm.saveUserTask.perform(this.name, this.surname, this.email);\n      this.success = true;\n      await this.wasm.getUserInfosTask.perform();\n    } catch (error) {\n      debug((error as Error).message);\n      this.error = true;\n    }\n\n    this.removeSaveUserStatusIndicatorTask.perform();\n  });\n\n  private removeSaveUserStatusIndicatorTask = restartableTask(async () => {\n    if (!Ember.testing) {\n      await timeout(5000);\n    }\n\n    this.success = false;\n    this.error = false;\n  });\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsModal @open={{@open}} @onHidden={{@onHidden}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">\\n        Erreur\\n      </h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        {{#if (eq @type 3916)}}\\n          <BsAlert class=\\\"m-0 py-1\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n            {{this.wasm.errorMessage3916}}\\n          </BsAlert>\\n          <p class=\\\"mt-4\\\"><strong>Vous ne possédez pas de portefeuille de type Custodial hors de France, il n'est donc\\n              pas utile de fournir à l'administration un formulaire CERFA 3916.</strong>\\n          </p>\\n        {{else if (eq @type 2086)}}\\n          <BsAlert class=\\\"m-0 py-1\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n            {{this.errorMessage2086}}\\n          </BsAlert>\\n          <p class=\\\"mt-4\\\"><strong>Veuillez vérifier la complétude des transactions sur la page Transactions, ou à défaut\\n              vous rapprocher du support pour toute aide complémentaire.</strong>\\n          </p>\\n        {{/if}}\\n      </div>\\n    </modal.body>\\n    <modal.footer>\\n      <BsButton {{on \\\"click\\\" @onHidden}}>OK</BsButton>\\n    </modal.footer>\\n  </div>\\n</BsModal>\", {\"contents\":\"<BsModal @open={{@open}} @onHidden={{@onHidden}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">\\n        Erreur\\n      </h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        {{#if (eq @type 3916)}}\\n          <BsAlert class=\\\"m-0 py-1\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n            {{this.wasm.errorMessage3916}}\\n          </BsAlert>\\n          <p class=\\\"mt-4\\\"><strong>Vous ne possédez pas de portefeuille de type Custodial hors de France, il n'est donc\\n              pas utile de fournir à l'administration un formulaire CERFA 3916.</strong>\\n          </p>\\n        {{else if (eq @type 2086)}}\\n          <BsAlert class=\\\"m-0 py-1\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n            {{this.errorMessage2086}}\\n          </BsAlert>\\n          <p class=\\\"mt-4\\\"><strong>Veuillez vérifier la complétude des transactions sur la page Transactions, ou à défaut\\n              vous rapprocher du support pour toute aide complémentaire.</strong>\\n          </p>\\n        {{/if}}\\n      </div>\\n    </modal.body>\\n    <modal.footer>\\n      <BsButton {{on \\\"click\\\" @onHidden}}>OK</BsButton>\\n    </modal.footer>\\n  </div>\\n</BsModal>\",\"moduleName\":\"cryptofiscafacile-gui/components/reporting/report-error-modal.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/reporting/report-error-modal.hbs\"}});\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\n\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\nimport type IntlService from 'ember-intl/services/intl';\n\ninterface ReportingReportErrorModalArgs {\n  onHidden: () => void;\n  type: 2086 | 3916;\n}\n\nexport default class ReportingReportErrorModal extends Component<ReportingReportErrorModalArgs> {\n  @service declare intl: IntlService;\n  @service declare wasm: WasmService;\n\n  get errorMessage2086() {\n    return this.wasm.translateError(this.wasm.errorMessage2086);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"px-0 px-xl-5\\\">\\n  <div class=\\\"row g-5 pt-3\\\">\\n    <div\\n      class=\\\"col pe-0 pe-xl-2\\\"\\n      data-title=\\\"CERFA 3916\\\"\\n      data-position=\\\"top\\\"\\n      data-intro=\\\"...une date d'ouverture; Si celle-ci correspond vous pourrez laisser cette date, sinon vous devrez la modifier en recherchant par exemple dans vos emails...\\\"\\n    >\\n      <label for=\\\"inputOpenDate\\\" class=\\\"form-label text-label\\\">Date d'ouverture\\n        <span class=\\\"d-none d-md-inline\\\">:</span></label>\\n      <EmberFlatpickr\\n        placeholder=\\\"Modifier la date d'ouverture\\\"\\n        @date={{this.openDate}}\\n        @locale=\\\"fr\\\"\\n        @onChange={{null}}\\n        @onClose={{this.onChangeOpen}}\\n        @mode=\\\"single\\\"\\n        class=\\\"form-select form-select-sm calendar-icon\\\"\\n        aria-label=\\\"opening date\\\"\\n        id=\\\"picker1\\\"\\n      />\\n\\n      {{#if this.errorOpenDate}}\\n        <p class=\\\"text-warning m-0 p-0 mt-1\\\">Veuillez choisir une autre date, non postérieure à la première TX\\n          {{format-date @firsttx}}</p>\\n      {{/if}}\\n    </div>\\n    <div\\n      class=\\\"col ps-2 ps-xl-3 pe-0 pe-xl-2\\\"\\n      data-title=\\\"CERFA 3916\\\"\\n      data-position=\\\"top\\\"\\n      data-intro=\\\"...Ensuite si le compte a été clos, veuillez le signaler ici et entrer la date de clôture...\\\"\\n    >\\n      <label for=\\\"inputCloseDate\\\" class=\\\"form-label text-label\\\">\\n        Date de fermeture\\n        <span class=\\\"d-none d-md-inline\\\">(<strong>si compte clos</strong>\\n          ) :</span>\\n        <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n        <BsTooltip @placement=\\\"right\\\">La date proposée est uniquement à titre indicatif: il s'agit de la date détectée\\n          de votre dernière transaction sur ce compte.\\n          <strong>Cette date apparaitra si vous cochez la case 'Compte Clôturé ?'. Vous pourrez ensuite la valider ou la\\n            modifier...</strong>\\n        </BsTooltip>\\n      </label>\\n      {{#if this.closed}}\\n        <EmberFlatpickr\\n          placeholder=\\\"Modifier la date de clôture\\\"\\n          @date={{this.closeDate}}\\n          @locale=\\\"fr\\\"\\n          @onChange={{null}}\\n          @onClose={{this.onChangeClose}}\\n          @mode=\\\"single\\\"\\n          class=\\\"form-select form-select-sm calendar-icon\\\"\\n          aria-label=\\\"closing date\\\"\\n          id=\\\"picker2\\\"\\n        />\\n\\n        <input\\n          class=\\\"form-check-input ms-1 me-2\\\"\\n          type=\\\"checkbox\\\"\\n          id=\\\"AccountClosed\\\"\\n          {{on \\\"change\\\" this.toggleCheck}}\\n          checked\\n        />\\n        <label for=\\\"AccountClosed\\\"><span class=\\\"d-none d-md-inline\\\">Compte </span>clôturé ?</label>\\n      {{else}}\\n        <input class=\\\"form-check-input ms-1 me-2\\\" type=\\\"checkbox\\\" id=\\\"AccountClosed\\\" {{on \\\"change\\\" this.toggleCheck}} />\\n        <label for=\\\"AccountClosed\\\"><span class=\\\"d-none d-md-inline\\\">Compte </span>clôturé ?</label>\\n      {{/if}}\\n\\n      {{#if this.errorCloseDate}}\\n        <p class=\\\"text-warning m-0 p-0 mt-1\\\">Veuillez choisir une autre date, non antérieure à la dernière TX\\n          {{format-date @lasttx}}</p>\\n      {{/if}}\\n    </div>\\n    <div\\n      class=\\\"col\\\"\\n      data-title=\\\"CERFA 3916\\\"\\n      data-intro=\\\"...Enfin, un identifiant de compte vous sera demandé (consultez la documentation pour remplir ce champ si nécessaire).\\\"\\n    >\\n      <label for=\\\"inputAccount\\\" class=\\\"form-label text-label\\\">ID associé\\n        <span class=\\\"d-none d-md-inline\\\">(N° de compte, email, N° Id...) :</span></label>\\n      {{! template-lint-disable require-input-label }}\\n      <input\\n        type=\\\"text\\\"\\n        id=\\\"inputAccount\\\"\\n        class=\\\"form-control calendar-item\\\"\\n        placeholder={{@account.id}}\\n        aria-label=\\\"account\\\"\\n        required\\n        {{on \\\"change\\\" this.setAccount}}\\n      />\\n    </div>\\n  </div>\\n</div>\", {\"contents\":\"<div class=\\\"px-0 px-xl-5\\\">\\n  <div class=\\\"row g-5 pt-3\\\">\\n    <div\\n      class=\\\"col pe-0 pe-xl-2\\\"\\n      data-title=\\\"CERFA 3916\\\"\\n      data-position=\\\"top\\\"\\n      data-intro=\\\"...une date d'ouverture; Si celle-ci correspond vous pourrez laisser cette date, sinon vous devrez la modifier en recherchant par exemple dans vos emails...\\\"\\n    >\\n      <label for=\\\"inputOpenDate\\\" class=\\\"form-label text-label\\\">Date d'ouverture\\n        <span class=\\\"d-none d-md-inline\\\">:</span></label>\\n      <EmberFlatpickr\\n        placeholder=\\\"Modifier la date d'ouverture\\\"\\n        @date={{this.openDate}}\\n        @locale=\\\"fr\\\"\\n        @onChange={{null}}\\n        @onClose={{this.onChangeOpen}}\\n        @mode=\\\"single\\\"\\n        class=\\\"form-select form-select-sm calendar-icon\\\"\\n        aria-label=\\\"opening date\\\"\\n        id=\\\"picker1\\\"\\n      />\\n\\n      {{#if this.errorOpenDate}}\\n        <p class=\\\"text-warning m-0 p-0 mt-1\\\">Veuillez choisir une autre date, non postérieure à la première TX\\n          {{format-date @firsttx}}</p>\\n      {{/if}}\\n    </div>\\n    <div\\n      class=\\\"col ps-2 ps-xl-3 pe-0 pe-xl-2\\\"\\n      data-title=\\\"CERFA 3916\\\"\\n      data-position=\\\"top\\\"\\n      data-intro=\\\"...Ensuite si le compte a été clos, veuillez le signaler ici et entrer la date de clôture...\\\"\\n    >\\n      <label for=\\\"inputCloseDate\\\" class=\\\"form-label text-label\\\">\\n        Date de fermeture\\n        <span class=\\\"d-none d-md-inline\\\">(<strong>si compte clos</strong>\\n          ) :</span>\\n        <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"20\\\" />\\n        <BsTooltip @placement=\\\"right\\\">La date proposée est uniquement à titre indicatif: il s'agit de la date détectée\\n          de votre dernière transaction sur ce compte.\\n          <strong>Cette date apparaitra si vous cochez la case 'Compte Clôturé ?'. Vous pourrez ensuite la valider ou la\\n            modifier...</strong>\\n        </BsTooltip>\\n      </label>\\n      {{#if this.closed}}\\n        <EmberFlatpickr\\n          placeholder=\\\"Modifier la date de clôture\\\"\\n          @date={{this.closeDate}}\\n          @locale=\\\"fr\\\"\\n          @onChange={{null}}\\n          @onClose={{this.onChangeClose}}\\n          @mode=\\\"single\\\"\\n          class=\\\"form-select form-select-sm calendar-icon\\\"\\n          aria-label=\\\"closing date\\\"\\n          id=\\\"picker2\\\"\\n        />\\n\\n        <input\\n          class=\\\"form-check-input ms-1 me-2\\\"\\n          type=\\\"checkbox\\\"\\n          id=\\\"AccountClosed\\\"\\n          {{on \\\"change\\\" this.toggleCheck}}\\n          checked\\n        />\\n        <label for=\\\"AccountClosed\\\"><span class=\\\"d-none d-md-inline\\\">Compte </span>clôturé ?</label>\\n      {{else}}\\n        <input class=\\\"form-check-input ms-1 me-2\\\" type=\\\"checkbox\\\" id=\\\"AccountClosed\\\" {{on \\\"change\\\" this.toggleCheck}} />\\n        <label for=\\\"AccountClosed\\\"><span class=\\\"d-none d-md-inline\\\">Compte </span>clôturé ?</label>\\n      {{/if}}\\n\\n      {{#if this.errorCloseDate}}\\n        <p class=\\\"text-warning m-0 p-0 mt-1\\\">Veuillez choisir une autre date, non antérieure à la dernière TX\\n          {{format-date @lasttx}}</p>\\n      {{/if}}\\n    </div>\\n    <div\\n      class=\\\"col\\\"\\n      data-title=\\\"CERFA 3916\\\"\\n      data-intro=\\\"...Enfin, un identifiant de compte vous sera demandé (consultez la documentation pour remplir ce champ si nécessaire).\\\"\\n    >\\n      <label for=\\\"inputAccount\\\" class=\\\"form-label text-label\\\">ID associé\\n        <span class=\\\"d-none d-md-inline\\\">(N° de compte, email, N° Id...) :</span></label>\\n      {{! template-lint-disable require-input-label }}\\n      <input\\n        type=\\\"text\\\"\\n        id=\\\"inputAccount\\\"\\n        class=\\\"form-control calendar-item\\\"\\n        placeholder={{@account.id}}\\n        aria-label=\\\"account\\\"\\n        required\\n        {{on \\\"change\\\" this.setAccount}}\\n      />\\n    </div>\\n  </div>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/reporting/user-data/account/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/reporting/user-data/account/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\n\nimport type { Cerfa3916Account } from 'cryptofiscafacile-wasm';\n\ninterface ReportingUserDataAccountArgs {\n  account: Cerfa3916Account;\n  firsttx: Date;\n  lasttx: Date;\n}\n\nexport default class ReportingUserDataAccount extends Component<ReportingUserDataAccountArgs> {\n  @tracked errorOpenDate = false;\n  @tracked errorCloseDate = false;\n\n  @tracked openDate: Date = this.args.account.opened;\n  @tracked closeDate: Date = this.args.account.closed;\n\n  @tracked closed = this.args.account.isClosed;\n\n  @action\n  toggleCheck(e: { target: HTMLInputElement }) {\n    this.closed = e.target.checked;\n\n    this.args.account.isClosed = e.target.checked;\n  }\n\n  @action\n  onChangeOpen(date: Date[]) {\n    if (date[0]) {\n      this.openDate = date[0];\n    }\n\n    if (this.openDate > this.args.firsttx) {\n      debug('Chosen date is upper than first TX!');\n      this.errorOpenDate = true;\n    } else {\n      this.errorOpenDate = false;\n      this.args.account.opened = this.openDate;\n    }\n  }\n  @action\n  onChangeClose(date: Date[]) {\n    if (date[0]) {\n      this.closeDate = date[0];\n    }\n\n    if (this.closed === true) {\n      if (this.closeDate < this.args.lasttx) {\n        debug('Chosen date is lower than last TX!');\n        this.errorCloseDate = true;\n      } else {\n        this.errorCloseDate = false;\n        this.args.account.closed = this.closeDate;\n      }\n    } else {\n      debug('Checkbox account closed not checked!');\n    }\n  }\n  @action\n  setAccount(e: { target: HTMLInputElement }) {\n    this.args.account.id = e.target.value;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"d-flex flex-column m-1 m-lg-3 mb-0\\\">\\n  <div class=\\\"d-flex mb-lg-3\\\">\\n    <div class=\\\"mx-4\\\">\\n      <img src=\\\"{{@wallet.logo}}\\\" alt=\\\"{{@wallet.name}}\\\" width=\\\"50px\\\" height=\\\"50px\\\" />\\n    </div>\\n    <div class=\\\"mx-2 mx-lg-4\\\">\\n      <div class=\\\"links\\\">\\n        <App::ExternalLink href=\\\"{{@wallet.url}}\\\">{{@wallet.url}}</App::ExternalLink>\\n      </div>\\n    </div>\\n    <div class=\\\"me-2 d-none d-lg-flex flex-column mx-1\\\">\\n      <p class=\\\"text-address m-0\\\"><strong>{{@wallet.legal}}</strong></p>\\n      <p class=\\\"text-address m-0\\\">{{@wallet.address}}</p>\\n    </div>\\n    <div\\n      class=\\\"mx-1 mx-lg-3\\\"\\n      data-title=\\\"CERFA 3916\\\"\\n      data-intro=\\\"...En plus d'un compte standard, d'ajouter un compte au portefeuille : il arrive parfois que vous ayez du créer plusieurs comptes pour un même portefeuille; il sera donc important de les déclarer...\\\"\\n    >\\n      <BsButton @type=\\\"primary\\\" @onClick={{this.addAccount}} class=\\\"add-icon\\\">Ajouter Compte</BsButton>\\n    </div>\\n  </div>\\n  <div\\n    class=\\\"container px-2 px-lg-5\\\"\\n    data-title=\\\"CERFA 3916\\\"\\n    data-position=\\\"top\\\"\\n    data-intro=\\\"...le compte ou les comptes, avec :...\\\"\\n  >\\n    <BsTab as |tab|>\\n      {{#each this.buffer as |account|}}\\n        <tab.pane @title=\\\"Compte {{account.id}}\\\">\\n          <Reporting::UserData::Account @account={{account}} @firsttx={{@wallet.firsttx}} @lasttx={{@wallet.lasttx}} />\\n        </tab.pane>\\n      {{/each}}\\n    </BsTab>\\n  </div>\\n</div>\", {\"contents\":\"<div class=\\\"d-flex flex-column m-1 m-lg-3 mb-0\\\">\\n  <div class=\\\"d-flex mb-lg-3\\\">\\n    <div class=\\\"mx-4\\\">\\n      <img src=\\\"{{@wallet.logo}}\\\" alt=\\\"{{@wallet.name}}\\\" width=\\\"50px\\\" height=\\\"50px\\\" />\\n    </div>\\n    <div class=\\\"mx-2 mx-lg-4\\\">\\n      <div class=\\\"links\\\">\\n        <App::ExternalLink href=\\\"{{@wallet.url}}\\\">{{@wallet.url}}</App::ExternalLink>\\n      </div>\\n    </div>\\n    <div class=\\\"me-2 d-none d-lg-flex flex-column mx-1\\\">\\n      <p class=\\\"text-address m-0\\\"><strong>{{@wallet.legal}}</strong></p>\\n      <p class=\\\"text-address m-0\\\">{{@wallet.address}}</p>\\n    </div>\\n    <div\\n      class=\\\"mx-1 mx-lg-3\\\"\\n      data-title=\\\"CERFA 3916\\\"\\n      data-intro=\\\"...En plus d'un compte standard, d'ajouter un compte au portefeuille : il arrive parfois que vous ayez du créer plusieurs comptes pour un même portefeuille; il sera donc important de les déclarer...\\\"\\n    >\\n      <BsButton @type=\\\"primary\\\" @onClick={{this.addAccount}} class=\\\"add-icon\\\">Ajouter Compte</BsButton>\\n    </div>\\n  </div>\\n  <div\\n    class=\\\"container px-2 px-lg-5\\\"\\n    data-title=\\\"CERFA 3916\\\"\\n    data-position=\\\"top\\\"\\n    data-intro=\\\"...le compte ou les comptes, avec :...\\\"\\n  >\\n    <BsTab as |tab|>\\n      {{#each this.buffer as |account|}}\\n        <tab.pane @title=\\\"Compte {{account.id}}\\\">\\n          <Reporting::UserData::Account @account={{account}} @firsttx={{@wallet.firsttx}} @lasttx={{@wallet.lasttx}} />\\n        </tab.pane>\\n      {{/each}}\\n    </BsTab>\\n  </div>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/reporting/user-data/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/reporting/user-data/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\n\nimport type { Cerfa3916Account } from 'cryptofiscafacile-wasm';\nimport type { Cerfa3916Wallet } from 'cryptofiscafacile-wasm';\n\ninterface UserDataArgs {\n  wallet: Cerfa3916Wallet;\n}\n\nexport default class UserData extends Component<UserDataArgs> {\n  @tracked index = 1;\n  @tracked buffer: Cerfa3916Account[] = this.args.wallet.accounts;\n\n  @action\n  addAccount() {\n    let arr: Cerfa3916Account[] = this.args.wallet.accounts;\n    const obj: Cerfa3916Account = {\n      id: '-',\n      opened: new Date('January 01, 2007 03:24:00'),\n      closed: new Date(),\n      isClosed: false,\n    };\n\n    arr.push(obj);\n\n    this.args.wallet.accounts = arr;\n    this.buffer = arr;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"card custom-cardstyle-balances pb-2 h-40\\\">\\n  <div class=\\\"card-body\\\">\\n    <h3 class=\\\"card-title font-weight-bold\\\">Balances\\n      <span class=\\\"small-text\\\">au {{format-date @date}}</span>\\n    </h3>\\n    <App::PageNavigator\\n      @userPage={{this.page}}\\n      @maxPage={{this.maxPage}}\\n      @onUserPageChanged={{this.onUserPageChanged}}\\n      class=\\\"justify-content-center mb-1\\\"\\n    />\\n    <div class=\\\"container table-balances\\\">\\n      <div class=\\\"row head\\\">\\n        <div class=\\\"col-4 col-xxl-6\\\">Actif</div>\\n        <div class=\\\"col-8 col-xxl-6\\\">Balance</div>\\n      </div>\\n      <div class=\\\"body\\\">\\n        {{#if this.wasm.getSynthBalancesTask.isRunning}}\\n          <div class=\\\"row none p-1 text-center align-items-center\\\">\\n            <div class=\\\"col-12\\\">\\n              <div class=\\\"spinner-border\\\" role=\\\"status\\\">\\n                <span class=\\\"visually-hidden\\\"></span>\\n              </div></div>\\n          </div>\\n        {{else}}\\n          {{#if this.pageSortedBalances}}\\n            {{#each this.pageSortedBalances as |balance|}}\\n              <div class=\\\"row line-balance {{if (lt balance.amount 0) 'negative-amount'}}\\\">\\n                <div class=\\\"col-4 col-xxl-6\\\">{{balance.coin}}</div>\\n                <div class=\\\"col-8 col-xxl-6\\\">{{format-number balance.amount maximumFractionDigits=\\\"16\\\"}}</div>\\n                {{#if (lt balance.amount 0)}}\\n                  <BsTooltip\\n                    @title=\\\"Attention, vous avez une balance négative de {{balance.coin}} le \\n                    {{(format-date @date)}}. Veuillez vérifier vos transactions pour corriger cette balance\\\"\\n                  />\\n                {{/if}}\\n              </div>\\n            {{/each}}\\n          {{else}}\\n            <div class=\\\"row none text-center align-items-center\\\">\\n              <div class=\\\"col-12\\\">Aucun actif</div>\\n            </div>\\n          {{/if}}\\n        {{/if}}\\n      </div>\\n    </div>\\n  </div>\\n</div>\", {\"contents\":\"<div class=\\\"card custom-cardstyle-balances pb-2 h-40\\\">\\n  <div class=\\\"card-body\\\">\\n    <h3 class=\\\"card-title font-weight-bold\\\">Balances\\n      <span class=\\\"small-text\\\">au {{format-date @date}}</span>\\n    </h3>\\n    <App::PageNavigator\\n      @userPage={{this.page}}\\n      @maxPage={{this.maxPage}}\\n      @onUserPageChanged={{this.onUserPageChanged}}\\n      class=\\\"justify-content-center mb-1\\\"\\n    />\\n    <div class=\\\"container table-balances\\\">\\n      <div class=\\\"row head\\\">\\n        <div class=\\\"col-4 col-xxl-6\\\">Actif</div>\\n        <div class=\\\"col-8 col-xxl-6\\\">Balance</div>\\n      </div>\\n      <div class=\\\"body\\\">\\n        {{#if this.wasm.getSynthBalancesTask.isRunning}}\\n          <div class=\\\"row none p-1 text-center align-items-center\\\">\\n            <div class=\\\"col-12\\\">\\n              <div class=\\\"spinner-border\\\" role=\\\"status\\\">\\n                <span class=\\\"visually-hidden\\\"></span>\\n              </div></div>\\n          </div>\\n        {{else}}\\n          {{#if this.pageSortedBalances}}\\n            {{#each this.pageSortedBalances as |balance|}}\\n              <div class=\\\"row line-balance {{if (lt balance.amount 0) 'negative-amount'}}\\\">\\n                <div class=\\\"col-4 col-xxl-6\\\">{{balance.coin}}</div>\\n                <div class=\\\"col-8 col-xxl-6\\\">{{format-number balance.amount maximumFractionDigits=\\\"16\\\"}}</div>\\n                {{#if (lt balance.amount 0)}}\\n                  <BsTooltip\\n                    @title=\\\"Attention, vous avez une balance négative de {{balance.coin}} le \\n                    {{(format-date @date)}}. Veuillez vérifier vos transactions pour corriger cette balance\\\"\\n                  />\\n                {{/if}}\\n              </div>\\n            {{/each}}\\n          {{else}}\\n            <div class=\\\"row none text-center align-items-center\\\">\\n              <div class=\\\"col-12\\\">Aucun actif</div>\\n            </div>\\n          {{/if}}\\n        {{/if}}\\n      </div>\\n    </div>\\n  </div>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/synthesis/balances/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/synthesis/balances/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport { tracked } from 'tracked-built-ins';\n\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\n\nexport default class SynthesisTxBalances extends Component {\n  @service declare wasm: WasmService;\n\n  @tracked userPage = 1;\n  defaultPageSize = 7;\n\n  get pageSortedBalances() {\n    return this.wasm.synthBalances\n      ? this.wasm.synthBalances.slice((this.page - 1) * this.pageSize, this.page * this.pageSize)\n      : [];\n  }\n\n  get page() {\n    return Math.min(this.userPage, this.maxPage);\n  }\n\n  get maxPage() {\n    return Math.max(1, Math.ceil(this.wasm.synthBalances.length / this.pageSize));\n  }\n\n  get pageSize() {\n    return this.defaultPageSize;\n  }\n\n  @action\n  onUserPageChanged(page: number): void {\n    this.userPage = page;\n  }\n\n  @action\n  setPageSize(pageSize: number) {\n    this.defaultPageSize = pageSize;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h3 class=\\\"card-title font-weight-bold mt-2 mb-0 ms-3\\\">Évolution\\n  <span class=\\\"small-text\\\">du {{format-date this.startDate}} au {{format-date this.endDate}}</span></h3>\\n<div class=\\\"card-body py-0 px-1\\\">\\n  {{#if this.isRunning}}\\n    <div class=\\\"d-flex justify-content-center align-items-center h-100\\\">\\n      <div class=\\\"spinner-border mt-5\\\" role=\\\"status\\\">\\n        <span class=\\\"visually-hidden\\\"></span>\\n      </div>\\n    </div>\\n  {{else}}\\n    {{#if this.tokenImported}}\\n      {{#if @error}}\\n        <div class=\\\"row align-items-center custom-slide h-100\\\">\\n          <div class=\\\"col d-flex flex-column\\\">\\n            <p class=\\\"m-1\\\">\\n              <strong>Dates sélectionnées trop rapprochées...</strong>\\n            </p>\\n            <p class=\\\"m-1\\\">\\n              <strong>Veuillez sélectionner un range sup. à 7 jours</strong>\\n            </p>\\n          </div>\\n        </div>\\n      {{else}}\\n        <div id=\\\"chartdiv\\\" class=\\\"h-100\\\">\\n          <Ac5::Line @data={{this.aggregatedAssets}} @dateField=\\\"date\\\" @valueFields={{this.valueFields}} />\\n        </div>\\n      {{/if}}\\n    {{else}}\\n      <div class=\\\"row align-items-center h-100\\\">\\n        <div class=\\\"col text-center\\\">\\n          <p class=\\\"m-1\\\">\\n            {{#if this.hasWallets}}\\n              <strong>Aucun actif</strong>\\n            {{else}}\\n              <strong>Aucun actif importé...</strong>\\n              <LinkTo class=\\\"links\\\" @route=\\\"wallets\\\">Ajouter ?</LinkTo>\\n            {{/if}}\\n          </p>\\n        </div>\\n      </div>\\n    {{/if}}\\n  {{/if}}\\n</div>\", {\"contents\":\"<h3 class=\\\"card-title font-weight-bold mt-2 mb-0 ms-3\\\">Évolution\\n  <span class=\\\"small-text\\\">du {{format-date this.startDate}} au {{format-date this.endDate}}</span></h3>\\n<div class=\\\"card-body py-0 px-1\\\">\\n  {{#if this.isRunning}}\\n    <div class=\\\"d-flex justify-content-center align-items-center h-100\\\">\\n      <div class=\\\"spinner-border mt-5\\\" role=\\\"status\\\">\\n        <span class=\\\"visually-hidden\\\"></span>\\n      </div>\\n    </div>\\n  {{else}}\\n    {{#if this.tokenImported}}\\n      {{#if @error}}\\n        <div class=\\\"row align-items-center custom-slide h-100\\\">\\n          <div class=\\\"col d-flex flex-column\\\">\\n            <p class=\\\"m-1\\\">\\n              <strong>Dates sélectionnées trop rapprochées...</strong>\\n            </p>\\n            <p class=\\\"m-1\\\">\\n              <strong>Veuillez sélectionner un range sup. à 7 jours</strong>\\n            </p>\\n          </div>\\n        </div>\\n      {{else}}\\n        <div id=\\\"chartdiv\\\" class=\\\"h-100\\\">\\n          <Ac5::Line @data={{this.aggregatedAssets}} @dateField=\\\"date\\\" @valueFields={{this.valueFields}} />\\n        </div>\\n      {{/if}}\\n    {{else}}\\n      <div class=\\\"row align-items-center h-100\\\">\\n        <div class=\\\"col text-center\\\">\\n          <p class=\\\"m-1\\\">\\n            {{#if this.hasWallets}}\\n              <strong>Aucun actif</strong>\\n            {{else}}\\n              <strong>Aucun actif importé...</strong>\\n              <LinkTo class=\\\"links\\\" @route=\\\"wallets\\\">Ajouter ?</LinkTo>\\n            {{/if}}\\n          </p>\\n        </div>\\n      </div>\\n    {{/if}}\\n  {{/if}}\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/synthesis/evolution/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/synthesis/evolution/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\n\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\ninterface SynthesisEvolutionArgs {\n  error: boolean;\n  dates: Date[];\n}\n\nexport default class SynthesisEvolution extends Component<SynthesisEvolutionArgs> {\n  @service declare wasm: WasmService;\n\n  get isRunning() {\n    return (\n      this.wasm.getSynthEvolutionTask.isRunning ||\n      (this.aggregatedAssets.length == 0 && this.wasm.getWalletsTask.isRunning)\n    );\n  }\n\n  get aggregatedAssets() {\n    return this.wasm.synthEvolution;\n  }\n\n  get valueFields() {\n    if (this.aggregatedAssets[0]) {\n      return Object.keys(this.aggregatedAssets[0]).filter((element) => element !== 'date');\n    } else {\n      return [];\n    }\n  }\n\n  get startDate() {\n    return this.args.dates[0];\n  }\n  get endDate() {\n    return this.args.dates[1];\n  }\n  /**\n   * This method is mandatory to state if we should display the\n   * evolution graph.\n   * Return empty if there is no key in the array of getSynth\n   *\n   * @readonly\n   */\n  get tokenImported() {\n    return this.aggregatedAssets.length > 0 && this.aggregatedAssets[0]\n      ? Object.keys(this.aggregatedAssets[0]).some((element) => element !== 'date')\n      : false;\n  }\n\n  get hasWallets() {\n    return this.wasm.wallets.length > 0;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"row flex-resp\\\">\\n  <div class=\\\"col col-lg-7 px-1 mb-4\\\">\\n    <div class=\\\"card position-relative custom-cardstyle-stats\\\">\\n      <Synthesis::Stats @dates={{this.selectedDates}} />\\n    </div>\\n    <div class=\\\"card custom-cardstyle-evolution mt-2 h-60\\\">\\n      <Synthesis::Evolution @dates={{this.selectedDates}} @error={{this.errorRange}} />\\n    </div>\\n  </div>\\n  <div class=\\\"col col-lg-5 px-1 mb-3 mb-md-0\\\">\\n    <Synthesis::Types @dates={{this.selectedDates}} @onChange={{this.selectDates}} />\\n    <Synthesis::Balances @date={{this.endDate}} />\\n    <div class=\\\"row gx-2 flex-grow-1 pt-2\\\">\\n      <div class=\\\"col-9\\\">\\n        <Synthesis::Wallets @onSelected={{this.onWalletSelected}} />\\n      </div>\\n      <div class=\\\"col-3\\\">\\n        <div class=\\\"card custom-cardstyle-doc\\\">\\n          <LinkTo @route=\\\"document\\\" class=\\\"custom-card-2\\\">\\n            <img src=\\\"/synthese/Synth-Doc.jpg\\\" alt=\\\"doc-img\\\" />\\n            <div class=\\\"custom-card-doc px-1 px-md-3 pt-2\\\">\\n              <p>Allez voir la doc...</p>\\n            </div>\\n          </LinkTo>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\", {\"contents\":\"<div class=\\\"row flex-resp\\\">\\n  <div class=\\\"col col-lg-7 px-1 mb-4\\\">\\n    <div class=\\\"card position-relative custom-cardstyle-stats\\\">\\n      <Synthesis::Stats @dates={{this.selectedDates}} />\\n    </div>\\n    <div class=\\\"card custom-cardstyle-evolution mt-2 h-60\\\">\\n      <Synthesis::Evolution @dates={{this.selectedDates}} @error={{this.errorRange}} />\\n    </div>\\n  </div>\\n  <div class=\\\"col col-lg-5 px-1 mb-3 mb-md-0\\\">\\n    <Synthesis::Types @dates={{this.selectedDates}} @onChange={{this.selectDates}} />\\n    <Synthesis::Balances @date={{this.endDate}} />\\n    <div class=\\\"row gx-2 flex-grow-1 pt-2\\\">\\n      <div class=\\\"col-9\\\">\\n        <Synthesis::Wallets @onSelected={{this.onWalletSelected}} />\\n      </div>\\n      <div class=\\\"col-3\\\">\\n        <div class=\\\"card custom-cardstyle-doc\\\">\\n          <LinkTo @route=\\\"document\\\" class=\\\"custom-card-2\\\">\\n            <img src=\\\"/synthese/Synth-Doc.jpg\\\" alt=\\\"doc-img\\\" />\\n            <div class=\\\"custom-card-doc px-1 px-md-3 pt-2\\\">\\n              <p>Allez voir la doc...</p>\\n            </div>\\n          </LinkTo>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/synthesis/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/synthesis/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\nimport type { Wallet } from 'cryptofiscafacile-wasm';\n\nexport default class Synthesis extends Component {\n  @service declare wasm: WasmService;\n\n  @tracked selectedDates: Date[] = [];\n  @tracked selectedWallet?: Wallet;\n  @tracked errorRange = false;\n\n  constructor(owner: Component, args: never) {\n    super(owner, args);\n    this.selectedDates = [this.wasm.defaultStartDate, this.wasm.defaultEndDate];\n  }\n\n  get endDate() {\n    return this.selectedDates[1];\n  }\n\n  @action\n  selectDates(dates: Date[]) {\n    this.selectedDates = dates;\n    this.refreshSynthData();\n  }\n\n  @action\n  onWalletSelected(wallet: Wallet) {\n    this.selectedWallet = wallet;\n    this.refreshSynthData();\n  }\n\n  refreshSynthData() {\n    if (this.selectedDates[0] && this.selectedDates[1]) {\n      try {\n        this.wasm.getSynthBalancesTask.perform(this.selectedDates[1], this.selectedWallet);\n        this.wasm.getSynthEvolutionTask.perform(this.selectedDates[0], this.selectedDates[1], this.selectedWallet);\n        this.wasm.getSynthPortfolioTask.perform(this.selectedDates[1], this.selectedWallet);\n        this.wasm.getSynthStatTotalValueTask.perform(this.selectedDates[1], this.selectedWallet);\n\n        if (!this.selectedWallet) {\n          this.wasm.getSynthStatsGainsLossesTask.perform(this.selectedDates[1]);\n        } else {\n          this.wasm.synthStatsGainsLosses = undefined;\n          this.wasm.synthStatsGainsError = undefined;\n        }\n\n        this.wasm.getSynthTxTypesTask.perform(this.selectedDates[0], this.selectedDates[1], this.selectedWallet);\n      } catch (error) {\n        this.errorRange = true;\n        debug(\n          'error in get custom synth with custom dates. Range too short: avoid using 7 days, choose instead more than 1 week !',\n        );\n      }\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h3 class=\\\"card-title font-weight-bold mt-2 ms-3 mb-0\\\">Statistiques\\n  <span class=\\\"small-text\\\">au {{format-date this.endDate}}</span></h3>\\n<div class=\\\"card-body px-1 d-flex justify-content-between\\\">\\n  <div id=\\\"chartdiv\\\" class=\\\"w-65\\\">\\n    {{#if this.isRunning}}\\n      <div class=\\\"d-flex justify-content-center align-items-center h-100\\\">\\n        <div class=\\\"spinner-border\\\" role=\\\"status\\\">\\n          <span class=\\\"visually-hidden\\\"></span>\\n        </div>\\n      </div>\\n    {{else}}\\n      {{#if this.portfolio}}\\n        <Ac5::Piechart @data={{this.portfolio}} @categoryField=\\\"coin\\\" @valueField=\\\"value\\\" />\\n      {{else}}\\n        <div class=\\\"row align-items-center h-100\\\">\\n          <div class=\\\"col text-center\\\">\\n            <p class=\\\"m-1\\\">\\n              {{#if this.hasWallets}}\\n                <strong>Aucun actif</strong>\\n              {{else}}\\n                <strong>Aucun actif importé...</strong>\\n                <LinkTo class=\\\"links\\\" @route=\\\"wallets\\\">Ajouter ?</LinkTo>\\n              {{/if}}\\n            </p>\\n          </div>\\n        </div>\\n      {{/if}}\\n    {{/if}}\\n  </div>\\n  <div class=\\\"d-flex flex-column w-35 pe-3 totals\\\">\\n    <div class=\\\"subtotals {{if this.bnc 'mb-2' 'mb-4'}}\\\">\\n      <div class=\\\"subtotals-two\\\">\\n        <span>Valeur Portefeuille</span>\\n      </div>\\n      <div class=\\\"subtotals-one\\\">\\n        {{#if this.totalValue}}\\n          <span>{{format-number this.totalValue maximumFractionDigits=\\\"0\\\"}} €</span>\\n        {{else}}\\n          <span>- €</span>\\n        {{/if}}\\n      </div>\\n    </div>\\n    <div class=\\\"subtotals {{if this.bnc 'mb-3' 'mb-4'}}\\\">\\n      <div class=\\\"subtotals-two\\\">\\n        <span>PV/MV Latente</span>\\n        {{#if this.statsError}}\\n          <span>\\n            <App::Icon @icon=\\\"ion:alert-circle\\\" @color=\\\"red\\\" width=\\\"20\\\" />\\n            <BsTooltip>{{this.statsError}}</BsTooltip>\\n          </span>\\n        {{/if}}\\n      </div>\\n      <div class=\\\"subtotals-three\\\">\\n        {{#if this.unrealizedGainsLosses}}\\n          <span\\n            class=\\\"{{if (gte this.unrealizedGainsLosses 0) 'subtotals-positive' 'subtotals-negative'}}\\\"\\n          >{{format-number this.unrealizedGainsLosses maximumFractionDigits=\\\"0\\\" style=\\\"currency\\\" currency=\\\"eur\\\"}}</span>\\n        {{else}}\\n          <span>- €</span>\\n        {{/if}}\\n      </div>\\n    </div>\\n    <div class=\\\"subtotals mb-2\\\">\\n      <div class=\\\"subtotals-two\\\">\\n        <span>PV/MV Réalisée depuis 01/01/{{this.year}}</span>\\n        {{#if this.statsError}}\\n          <span>\\n            <App::Icon @icon=\\\"ion:alert-circle\\\" @color=\\\"red\\\" width=\\\"20\\\" />\\n            <BsTooltip>{{this.statsError}}</BsTooltip>\\n          </span>\\n        {{/if}}\\n      </div>\\n      <div class=\\\"subtotals-four\\\">\\n        {{#if this.realizedGainsLosses}}\\n          <span\\n            class=\\\"{{if (gte this.realizedGainsLosses 0) 'subtotals-positive' 'subtotals-negative'}}\\\"\\n          >{{format-number this.realizedGainsLosses maximumFractionDigits=\\\"0\\\" style=\\\"currency\\\" currency=\\\"eur\\\"}}</span>\\n        {{else}}\\n          <span>- €</span>\\n        {{/if}}\\n      </div>\\n    </div>\\n    {{#if this.bnc}}\\n      <div class=\\\"subtotals\\\">\\n        <div class=\\\"subtotals-two\\\">\\n          <span>Intérêts Réalisés (BNC)</span>\\n        </div>\\n        <div class=\\\"subtotals-four\\\">\\n          <span class=\\\"{{if (gte this.bnc 0) 'subtotals-positive' 'subtotals-negative'}}\\\">{{format-number\\n              this.bnc\\n              maximumFractionDigits=\\\"0\\\"\\n              style=\\\"currency\\\"\\n              currency=\\\"eur\\\"\\n            }}</span>\\n        </div>\\n      </div>\\n    {{/if}}\\n  </div>\\n</div>\", {\"contents\":\"<h3 class=\\\"card-title font-weight-bold mt-2 ms-3 mb-0\\\">Statistiques\\n  <span class=\\\"small-text\\\">au {{format-date this.endDate}}</span></h3>\\n<div class=\\\"card-body px-1 d-flex justify-content-between\\\">\\n  <div id=\\\"chartdiv\\\" class=\\\"w-65\\\">\\n    {{#if this.isRunning}}\\n      <div class=\\\"d-flex justify-content-center align-items-center h-100\\\">\\n        <div class=\\\"spinner-border\\\" role=\\\"status\\\">\\n          <span class=\\\"visually-hidden\\\"></span>\\n        </div>\\n      </div>\\n    {{else}}\\n      {{#if this.portfolio}}\\n        <Ac5::Piechart @data={{this.portfolio}} @categoryField=\\\"coin\\\" @valueField=\\\"value\\\" />\\n      {{else}}\\n        <div class=\\\"row align-items-center h-100\\\">\\n          <div class=\\\"col text-center\\\">\\n            <p class=\\\"m-1\\\">\\n              {{#if this.hasWallets}}\\n                <strong>Aucun actif</strong>\\n              {{else}}\\n                <strong>Aucun actif importé...</strong>\\n                <LinkTo class=\\\"links\\\" @route=\\\"wallets\\\">Ajouter ?</LinkTo>\\n              {{/if}}\\n            </p>\\n          </div>\\n        </div>\\n      {{/if}}\\n    {{/if}}\\n  </div>\\n  <div class=\\\"d-flex flex-column w-35 pe-3 totals\\\">\\n    <div class=\\\"subtotals {{if this.bnc 'mb-2' 'mb-4'}}\\\">\\n      <div class=\\\"subtotals-two\\\">\\n        <span>Valeur Portefeuille</span>\\n      </div>\\n      <div class=\\\"subtotals-one\\\">\\n        {{#if this.totalValue}}\\n          <span>{{format-number this.totalValue maximumFractionDigits=\\\"0\\\"}} €</span>\\n        {{else}}\\n          <span>- €</span>\\n        {{/if}}\\n      </div>\\n    </div>\\n    <div class=\\\"subtotals {{if this.bnc 'mb-3' 'mb-4'}}\\\">\\n      <div class=\\\"subtotals-two\\\">\\n        <span>PV/MV Latente</span>\\n        {{#if this.statsError}}\\n          <span>\\n            <App::Icon @icon=\\\"ion:alert-circle\\\" @color=\\\"red\\\" width=\\\"20\\\" />\\n            <BsTooltip>{{this.statsError}}</BsTooltip>\\n          </span>\\n        {{/if}}\\n      </div>\\n      <div class=\\\"subtotals-three\\\">\\n        {{#if this.unrealizedGainsLosses}}\\n          <span\\n            class=\\\"{{if (gte this.unrealizedGainsLosses 0) 'subtotals-positive' 'subtotals-negative'}}\\\"\\n          >{{format-number this.unrealizedGainsLosses maximumFractionDigits=\\\"0\\\" style=\\\"currency\\\" currency=\\\"eur\\\"}}</span>\\n        {{else}}\\n          <span>- €</span>\\n        {{/if}}\\n      </div>\\n    </div>\\n    <div class=\\\"subtotals mb-2\\\">\\n      <div class=\\\"subtotals-two\\\">\\n        <span>PV/MV Réalisée depuis 01/01/{{this.year}}</span>\\n        {{#if this.statsError}}\\n          <span>\\n            <App::Icon @icon=\\\"ion:alert-circle\\\" @color=\\\"red\\\" width=\\\"20\\\" />\\n            <BsTooltip>{{this.statsError}}</BsTooltip>\\n          </span>\\n        {{/if}}\\n      </div>\\n      <div class=\\\"subtotals-four\\\">\\n        {{#if this.realizedGainsLosses}}\\n          <span\\n            class=\\\"{{if (gte this.realizedGainsLosses 0) 'subtotals-positive' 'subtotals-negative'}}\\\"\\n          >{{format-number this.realizedGainsLosses maximumFractionDigits=\\\"0\\\" style=\\\"currency\\\" currency=\\\"eur\\\"}}</span>\\n        {{else}}\\n          <span>- €</span>\\n        {{/if}}\\n      </div>\\n    </div>\\n    {{#if this.bnc}}\\n      <div class=\\\"subtotals\\\">\\n        <div class=\\\"subtotals-two\\\">\\n          <span>Intérêts Réalisés (BNC)</span>\\n        </div>\\n        <div class=\\\"subtotals-four\\\">\\n          <span class=\\\"{{if (gte this.bnc 0) 'subtotals-positive' 'subtotals-negative'}}\\\">{{format-number\\n              this.bnc\\n              maximumFractionDigits=\\\"0\\\"\\n              style=\\\"currency\\\"\\n              currency=\\\"eur\\\"\\n            }}</span>\\n        </div>\\n      </div>\\n    {{/if}}\\n  </div>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/synthesis/stats/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/synthesis/stats/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\n\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\n\ninterface SynthesisStatsArgs {\n  dates: Date[];\n}\n\nexport default class SynthesisStats extends Component<SynthesisStatsArgs> {\n  @service declare wasm: WasmService;\n\n  get isRunning() {\n    return (\n      this.wasm.getSynthPortfolioTask.isRunning || (this.portfolio.length == 0 && this.wasm.getWalletsTask.isRunning)\n    );\n  }\n\n  get portfolio() {\n    return this.wasm.synthPorfolio;\n  }\n\n  get totalValue() {\n    return this.wasm.synthStatTotalValue?.total_value ?? 0;\n  }\n\n  get unrealizedGainsLosses() {\n    return this.wasm.synthStatsGainsLosses?.unrealized;\n  }\n\n  get realizedGainsLosses() {\n    return this.wasm.synthStatsGainsLosses?.realized;\n  }\n\n  get bnc() {\n    return this.wasm.synthStatsGainsLosses?.bnc;\n  }\n\n  get statsError() {\n    return this.wasm.synthStatsGainsError;\n  }\n\n  get endDate() {\n    return this.args.dates[1];\n  }\n\n  get year() {\n    return this.args.dates[1]?.getFullYear();\n  }\n\n  get hasWallets() {\n    return this.wasm.wallets.length > 0;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"card custom-cardstyle-types mb-2\\\">\\n  <div class=\\\"col-12\\\">\\n    <div class=\\\"card-body d-flex flex-column pt-1 pb-2\\\">\\n      <div class=\\\"form-group d-flex justify-content-between w-100 mb-3\\\">\\n        <h3 class=\\\"card-title font-weight-bold mt-1 ms-2\\\">Types</h3>\\n        <div class=\\\"input-group w-75 my-1 ms-2\\\">\\n          <Calendar @dates={{@dates}} @onChange={{@onChange}} @synth=\\\"true\\\" />\\n        </div>\\n      </div>\\n      <div class=\\\"d-flex cards custom-cardsynth-parent\\\" {{horizontal-mouse-scroll}}>\\n        <div class=\\\"d-flex card-deck custom-cardsynth-fils mb-1\\\">\\n          <div class=\\\"card card-primary card-outline custom-cardsynth\\\">\\n            <div class=\\\"card-body\\\">\\n              <h4 class=\\\"card-title\\\"><App::Icon @icon=\\\"flat-color-icons:bullish\\\" height=\\\"25\\\" />&ensp;Cashin</h4>\\n              <h1>{{this.unprocessedSynthTx.txCntCashIn}}</h1>\\n            </div>\\n          </div>\\n          <div class=\\\"card card-primary card-outline custom-cardsynth\\\">\\n            <div class=\\\"card-body\\\">\\n              <h4 class=\\\"card-title\\\"><App::Icon @icon=\\\"flat-color-icons:bearish\\\" height=\\\"25\\\" />&ensp;Cashout</h4>\\n              <h1>{{this.unprocessedSynthTx.txCntCashOut}}</h1>\\n            </div>\\n          </div>\\n          <div class=\\\"card card-primary card-outline custom-cardsynth\\\">\\n            <div class=\\\"card-body\\\">\\n              <h4 class=\\\"card-title\\\"><App::Icon @icon=\\\"flat-color-icons:candle-sticks\\\" height=\\\"25\\\" />&ensp;Echange</h4>\\n              <h1>{{this.unprocessedSynthTx.txCntExchanges}}</h1>\\n            </div>\\n          </div>\\n          <div class=\\\"card card-primary card-outline custom-cardsynth\\\">\\n            <div class=\\\"card-body\\\">\\n              <h4 class=\\\"card-title\\\"><App::Icon @icon=\\\"flat-color-icons:electro-devices\\\" height=\\\"25\\\" />&ensp;Minage</h4>\\n              <h1>{{this.unprocessedSynthTx.txCntMinings}}</h1>\\n            </div>\\n          </div>\\n          <div class=\\\"card card-primary card-outline custom-cardsynth\\\">\\n            <div class=\\\"card-body\\\">\\n              <h4 class=\\\"card-title\\\"><App::Icon @icon=\\\"flat-color-icons:export\\\" height=\\\"25\\\" />&ensp;Intérêts</h4>\\n              <h1>{{this.unprocessedSynthTx.txCntInterests}}</h1>\\n            </div>\\n          </div>\\n          <div class=\\\"card card-primary card-outline custom-cardsynth\\\">\\n            <div class=\\\"card-body\\\">\\n              <h4 class=\\\"card-title\\\"><App::Icon @icon=\\\"flat-color-icons:internal\\\" height=\\\"25\\\" />&ensp;Remises</h4>\\n              <h1>{{this.unprocessedSynthTx.txCntCommercialRebates}}</h1>\\n            </div>\\n          </div>\\n          <div class=\\\"card card-primary card-outline custom-cardsynth\\\">\\n            <div class=\\\"card-body\\\">\\n              <h4 class=\\\"card-title\\\"><App::Icon\\n                  @icon=\\\"flat-color-icons:currency-exchange\\\"\\n                  height=\\\"25\\\"\\n                />&ensp;AirDrops</h4>\\n              <h1>{{this.unprocessedSynthTx.txCntAirDrops}}</h1>\\n            </div>\\n          </div>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\", {\"contents\":\"<div class=\\\"card custom-cardstyle-types mb-2\\\">\\n  <div class=\\\"col-12\\\">\\n    <div class=\\\"card-body d-flex flex-column pt-1 pb-2\\\">\\n      <div class=\\\"form-group d-flex justify-content-between w-100 mb-3\\\">\\n        <h3 class=\\\"card-title font-weight-bold mt-1 ms-2\\\">Types</h3>\\n        <div class=\\\"input-group w-75 my-1 ms-2\\\">\\n          <Calendar @dates={{@dates}} @onChange={{@onChange}} @synth=\\\"true\\\" />\\n        </div>\\n      </div>\\n      <div class=\\\"d-flex cards custom-cardsynth-parent\\\" {{horizontal-mouse-scroll}}>\\n        <div class=\\\"d-flex card-deck custom-cardsynth-fils mb-1\\\">\\n          <div class=\\\"card card-primary card-outline custom-cardsynth\\\">\\n            <div class=\\\"card-body\\\">\\n              <h4 class=\\\"card-title\\\"><App::Icon @icon=\\\"flat-color-icons:bullish\\\" height=\\\"25\\\" />&ensp;Cashin</h4>\\n              <h1>{{this.unprocessedSynthTx.txCntCashIn}}</h1>\\n            </div>\\n          </div>\\n          <div class=\\\"card card-primary card-outline custom-cardsynth\\\">\\n            <div class=\\\"card-body\\\">\\n              <h4 class=\\\"card-title\\\"><App::Icon @icon=\\\"flat-color-icons:bearish\\\" height=\\\"25\\\" />&ensp;Cashout</h4>\\n              <h1>{{this.unprocessedSynthTx.txCntCashOut}}</h1>\\n            </div>\\n          </div>\\n          <div class=\\\"card card-primary card-outline custom-cardsynth\\\">\\n            <div class=\\\"card-body\\\">\\n              <h4 class=\\\"card-title\\\"><App::Icon @icon=\\\"flat-color-icons:candle-sticks\\\" height=\\\"25\\\" />&ensp;Echange</h4>\\n              <h1>{{this.unprocessedSynthTx.txCntExchanges}}</h1>\\n            </div>\\n          </div>\\n          <div class=\\\"card card-primary card-outline custom-cardsynth\\\">\\n            <div class=\\\"card-body\\\">\\n              <h4 class=\\\"card-title\\\"><App::Icon @icon=\\\"flat-color-icons:electro-devices\\\" height=\\\"25\\\" />&ensp;Minage</h4>\\n              <h1>{{this.unprocessedSynthTx.txCntMinings}}</h1>\\n            </div>\\n          </div>\\n          <div class=\\\"card card-primary card-outline custom-cardsynth\\\">\\n            <div class=\\\"card-body\\\">\\n              <h4 class=\\\"card-title\\\"><App::Icon @icon=\\\"flat-color-icons:export\\\" height=\\\"25\\\" />&ensp;Intérêts</h4>\\n              <h1>{{this.unprocessedSynthTx.txCntInterests}}</h1>\\n            </div>\\n          </div>\\n          <div class=\\\"card card-primary card-outline custom-cardsynth\\\">\\n            <div class=\\\"card-body\\\">\\n              <h4 class=\\\"card-title\\\"><App::Icon @icon=\\\"flat-color-icons:internal\\\" height=\\\"25\\\" />&ensp;Remises</h4>\\n              <h1>{{this.unprocessedSynthTx.txCntCommercialRebates}}</h1>\\n            </div>\\n          </div>\\n          <div class=\\\"card card-primary card-outline custom-cardsynth\\\">\\n            <div class=\\\"card-body\\\">\\n              <h4 class=\\\"card-title\\\"><App::Icon\\n                  @icon=\\\"flat-color-icons:currency-exchange\\\"\\n                  height=\\\"25\\\"\\n                />&ensp;AirDrops</h4>\\n              <h1>{{this.unprocessedSynthTx.txCntAirDrops}}</h1>\\n            </div>\\n          </div>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/synthesis/types/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/synthesis/types/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\n\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\nexport default class SynthesisTypes extends Component {\n  @service declare wasm: WasmService;\n\n  get unprocessedSynthTx() {\n    return this.wasm.synthTxTypes;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"card custom-walletlist h-100 m-0\\\">\\n  <h3 class=\\\"card-title font-weight-bold mt-2 ms-3\\\">Portefeuilles</h3>\\n  <div class=\\\"card-body rad ms-1 me-2\\\">\\n    {{#if this.wasm.getWalletsTask.isRunning}}\\n      <div class=\\\"d-flex justify-content-center align-items-center h-100\\\">\\n        <div class=\\\"spinner-border\\\" role=\\\"status\\\">\\n          <span class=\\\"visually-hidden\\\"></span>\\n        </div>\\n      </div>\\n    {{else}}\\n      {{#if this.wallets}}\\n        <div class=\\\"row custom-slide h-100\\\" {{horizontal-mouse-scroll}}>\\n          {{#each this.wallets as |wallet|}}\\n            <button\\n              class=\\\"col-3 {{if (eq this.selected wallet) 'selected'}}\\\"\\n              type=\\\"button\\\"\\n              {{on \\\"click\\\" (fn this.onSelect wallet)}}\\n            >\\n              <img src=\\\"{{wallet.icon}}\\\" alt=\\\"{{wallet.name}}\\\" width=\\\"40px\\\" height=\\\"40px\\\" />\\n              <span>{{wallet.name}}</span>\\n            </button>\\n          {{/each}}\\n        </div>\\n      {{else}}\\n        <div class=\\\"row align-items-center custom-slide h-100\\\">\\n          <div class=\\\"col\\\">\\n            <p class=\\\"m-1\\\">\\n              <strong>Aucun portefeuille...</strong>\\n              <LinkTo class=\\\"links\\\" @route=\\\"wallets\\\">Ajouter ?</LinkTo>\\n            </p>\\n          </div>\\n        </div>\\n      {{/if}}\\n    {{/if}}\\n  </div>\\n</div>\", {\"contents\":\"<div class=\\\"card custom-walletlist h-100 m-0\\\">\\n  <h3 class=\\\"card-title font-weight-bold mt-2 ms-3\\\">Portefeuilles</h3>\\n  <div class=\\\"card-body rad ms-1 me-2\\\">\\n    {{#if this.wasm.getWalletsTask.isRunning}}\\n      <div class=\\\"d-flex justify-content-center align-items-center h-100\\\">\\n        <div class=\\\"spinner-border\\\" role=\\\"status\\\">\\n          <span class=\\\"visually-hidden\\\"></span>\\n        </div>\\n      </div>\\n    {{else}}\\n      {{#if this.wallets}}\\n        <div class=\\\"row custom-slide h-100\\\" {{horizontal-mouse-scroll}}>\\n          {{#each this.wallets as |wallet|}}\\n            <button\\n              class=\\\"col-3 {{if (eq this.selected wallet) 'selected'}}\\\"\\n              type=\\\"button\\\"\\n              {{on \\\"click\\\" (fn this.onSelect wallet)}}\\n            >\\n              <img src=\\\"{{wallet.icon}}\\\" alt=\\\"{{wallet.name}}\\\" width=\\\"40px\\\" height=\\\"40px\\\" />\\n              <span>{{wallet.name}}</span>\\n            </button>\\n          {{/each}}\\n        </div>\\n      {{else}}\\n        <div class=\\\"row align-items-center custom-slide h-100\\\">\\n          <div class=\\\"col\\\">\\n            <p class=\\\"m-1\\\">\\n              <strong>Aucun portefeuille...</strong>\\n              <LinkTo class=\\\"links\\\" @route=\\\"wallets\\\">Ajouter ?</LinkTo>\\n            </p>\\n          </div>\\n        </div>\\n      {{/if}}\\n    {{/if}}\\n  </div>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/synthesis/wallets/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/synthesis/wallets/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport { tracked } from 'tracked-built-ins';\n\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\nimport type { Wallet } from 'cryptofiscafacile-wasm';\n\ninterface SynthesisWalletsArgs {\n  onSelected: (wallet?: Wallet) => void;\n  dates: Date[];\n}\n\nexport default class SynthesisWallets extends Component<SynthesisWalletsArgs> {\n  @service declare wasm: WasmService;\n\n  @tracked selected?: Wallet;\n\n  get wallets() {\n    return this.wasm.wallets;\n  }\n\n  @action\n  onSelect(wallet: Wallet) {\n    this.selected = this.selected === wallet ? undefined : wallet;\n\n    if (this.args.onSelected) {\n      this.args.onSelected(this.selected);\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsModal @open={{@open}} @backdropClose={{false}} @onHide={{@onHidden}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">\\n        {{#if (eq this.transfertType \\\"DEPOSIT\\\")}}\\n          Identifier la Catégorie pour 'Dépôt'\\n        {{else}}\\n          Identifier la Catégorie pour 'Retrait'\\n        {{/if}}\\n      </h4>\\n    </modal.header>\\n    <modal.body>\\n      <BsAlert @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{true}}>\\n        <strong>Disclaimer : </strong>\\n        la catégorisation des TX ne devrait avoir lieu\\n        <strong>QUE</strong>\\n        lorsque tous vos portefeuilles sont importés (via CSV, JSON ou autres moyen). Si vous êtes sûr de vouloir\\n        continuer, sélectionner la nouvelle catégorie. Sinon veuillez importer tous vos portefeuilles...\\n      </BsAlert>\\n      <label for=\\\"categ-select\\\">\\n        <h5>Nouvelle catégorie :</h5>\\n      </label>\\n      <select name=\\\"categ\\\" id=\\\"categ-select\\\" class=\\\"form-select form-select-sm\\\" {{on \\\"change\\\" this.updateCateg}}>\\n        <option value=\\\"\\\" selected>---------------</option>\\n        {{#each this.categories as |item|}}\\n          <option value={{item}}>{{t (concat \\\"components.tx-table.categ-update-modal.categories.\\\" item)}}</option>\\n        {{/each}}\\n      </select>\\n    </modal.body>\\n    <modal.footer>\\n      {{#if this.categoryModified}}\\n        <div class=\\\"d-flex justify-content-between w-100\\\">\\n          <div class=\\\"d-flex\\\">\\n            <BsButton class=\\\"btn\\\" @type=\\\"primary\\\" {{on \\\"click\\\" this.revertCateg}}>Annuler Catégorisation</BsButton>\\n          </div>\\n          <div class=\\\"d-flex\\\">\\n            {{#if this.toConfirm}}\\n              <BsButton class=\\\"btn btn-primary\\\" @onClick={{this.modifyCateg}}>Confirmer</BsButton>\\n            {{else}}\\n              <div>\\n                <BsTooltip @placement=\\\"right\\\">Vous devez sélectionner une catégorie avant de pouvoir confirmer...</BsTooltip>\\n                <BsButton class=\\\"btn btn-secondary\\\" @disabled={{true}} @onClick={{null}}>Confirmer</BsButton>\\n              </div>\\n            {{/if}}\\n            <BsButton class=\\\"ms-2\\\" @onClick={{@onHidden}}>Annuler</BsButton>\\n          </div>\\n        </div>\\n      {{else}}\\n        {{#if this.toConfirm}}\\n          <BsButton\\n            data-test-categ-update-modal-confirm-button\\n            class=\\\"btn btn-primary\\\"\\n            @onClick={{this.modifyCateg}}\\n          >Confirmer</BsButton>\\n        {{else}}\\n          <div>\\n            <BsTooltip @placement=\\\"right\\\">Vous devez sélectionner une categorie avant de pouvoir confirmer </BsTooltip>\\n            <BsButton class=\\\"btn btn-secondary\\\" @disabled={{true}} @onClick={{null}}>Confirmer</BsButton>\\n          </div>\\n        {{/if}}\\n        <BsButton @onClick={{@onHidden}}>Annuler</BsButton>\\n      {{/if}}\\n    </modal.footer>\\n  </div>\\n</BsModal>\", {\"contents\":\"<BsModal @open={{@open}} @backdropClose={{false}} @onHide={{@onHidden}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">\\n        {{#if (eq this.transfertType \\\"DEPOSIT\\\")}}\\n          Identifier la Catégorie pour 'Dépôt'\\n        {{else}}\\n          Identifier la Catégorie pour 'Retrait'\\n        {{/if}}\\n      </h4>\\n    </modal.header>\\n    <modal.body>\\n      <BsAlert @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{true}}>\\n        <strong>Disclaimer : </strong>\\n        la catégorisation des TX ne devrait avoir lieu\\n        <strong>QUE</strong>\\n        lorsque tous vos portefeuilles sont importés (via CSV, JSON ou autres moyen). Si vous êtes sûr de vouloir\\n        continuer, sélectionner la nouvelle catégorie. Sinon veuillez importer tous vos portefeuilles...\\n      </BsAlert>\\n      <label for=\\\"categ-select\\\">\\n        <h5>Nouvelle catégorie :</h5>\\n      </label>\\n      <select name=\\\"categ\\\" id=\\\"categ-select\\\" class=\\\"form-select form-select-sm\\\" {{on \\\"change\\\" this.updateCateg}}>\\n        <option value=\\\"\\\" selected>---------------</option>\\n        {{#each this.categories as |item|}}\\n          <option value={{item}}>{{t (concat \\\"components.tx-table.categ-update-modal.categories.\\\" item)}}</option>\\n        {{/each}}\\n      </select>\\n    </modal.body>\\n    <modal.footer>\\n      {{#if this.categoryModified}}\\n        <div class=\\\"d-flex justify-content-between w-100\\\">\\n          <div class=\\\"d-flex\\\">\\n            <BsButton class=\\\"btn\\\" @type=\\\"primary\\\" {{on \\\"click\\\" this.revertCateg}}>Annuler Catégorisation</BsButton>\\n          </div>\\n          <div class=\\\"d-flex\\\">\\n            {{#if this.toConfirm}}\\n              <BsButton class=\\\"btn btn-primary\\\" @onClick={{this.modifyCateg}}>Confirmer</BsButton>\\n            {{else}}\\n              <div>\\n                <BsTooltip @placement=\\\"right\\\">Vous devez sélectionner une catégorie avant de pouvoir confirmer...</BsTooltip>\\n                <BsButton class=\\\"btn btn-secondary\\\" @disabled={{true}} @onClick={{null}}>Confirmer</BsButton>\\n              </div>\\n            {{/if}}\\n            <BsButton class=\\\"ms-2\\\" @onClick={{@onHidden}}>Annuler</BsButton>\\n          </div>\\n        </div>\\n      {{else}}\\n        {{#if this.toConfirm}}\\n          <BsButton\\n            data-test-categ-update-modal-confirm-button\\n            class=\\\"btn btn-primary\\\"\\n            @onClick={{this.modifyCateg}}\\n          >Confirmer</BsButton>\\n        {{else}}\\n          <div>\\n            <BsTooltip @placement=\\\"right\\\">Vous devez sélectionner une categorie avant de pouvoir confirmer </BsTooltip>\\n            <BsButton class=\\\"btn btn-secondary\\\" @disabled={{true}} @onClick={{null}}>Confirmer</BsButton>\\n          </div>\\n        {{/if}}\\n        <BsButton @onClick={{@onHidden}}>Annuler</BsButton>\\n      {{/if}}\\n    </modal.footer>\\n  </div>\\n</BsModal>\",\"moduleName\":\"cryptofiscafacile-gui/components/tx-table/categ-update-modal/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/tx-table/categ-update-modal/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { waitFor } from '@ember/test-waiters';\n\nimport { TransfertType } from 'cryptofiscafacile-gui/enums/transfert-type';\nimport { TxCategory } from 'cryptofiscafacile-wasm';\n\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\nimport type { Transaction } from 'cryptofiscafacile-wasm';\n\ninterface TxTableCategUpdateModalArgs {\n  onHidden: () => void;\n  open: boolean;\n  txs: Transaction[];\n}\n\nexport default class TxTableCategUpdateModal extends Component<TxTableCategUpdateModalArgs> {\n  @service declare wasm: WasmService;\n\n  @tracked toConfirm = false;\n  @tracked categToUpdate = TxCategory.NONE;\n\n  get categories() {\n    if (this.transfertType === TransfertType.DEPOSIT) {\n      return [\n        TxCategory.AIR_DROPS,\n        TxCategory.CASH_IN,\n        TxCategory.GIFTS,\n        TxCategory.FORKS,\n        TxCategory.INTERESTS,\n        TxCategory.MINING,\n        TxCategory.REFERRALS,\n        TxCategory.COMMERCIAL_REBATES,\n        TxCategory.DONT_CARE,\n      ];\n    }\n\n    if (this.transfertType === TransfertType.WITHDRAWAL) {\n      return [TxCategory.CASH_OUT, TxCategory.GIFTS, TxCategory.ICO, TxCategory.DONT_CARE];\n    }\n\n    return [];\n  }\n\n  get categoryModified() {\n    return this.args.txs[0]?.category !== this.args.txs[0]?.original_category;\n  }\n\n  get transfertType() {\n    if (this.args.txs.length === 0) {\n      return undefined;\n    } else {\n      if (this.args.txs[0]?.category === TxCategory.DEPOSITS) {\n        return TransfertType.DEPOSIT;\n      } else if (this.args.txs[0]?.category === TxCategory.WITHDRAWALS) {\n        return TransfertType.WITHDRAWAL;\n      } else {\n        if (this.args.txs[0]?.original_category === TxCategory.DEPOSITS) {\n          return TransfertType.DEPOSIT;\n        } else if (this.args.txs[0]?.original_category === TxCategory.WITHDRAWALS) {\n          return TransfertType.WITHDRAWAL;\n        }\n      }\n    }\n\n    return undefined;\n  }\n\n  @action\n  updateCateg(e: { target: HTMLSelectElement }) {\n    this.toConfirm = true;\n    this.categToUpdate = e.target.value as TxCategory;\n  }\n\n  @action\n  @waitFor\n  async modifyCateg() {\n    if (this.args.txs.length > 0 && this.categToUpdate !== TxCategory.NONE) {\n      for (let tx of this.args.txs) {\n        await this.wasm.setCategoryTask.perform(tx.id, this.categToUpdate);\n      }\n\n      await this.wasm.getTransactionsTask.perform();\n    } else {\n      debug('Error in modifyCateg - category not updated...');\n    }\n\n    this.#closeModal();\n  }\n\n  @action\n  async revertCateg() {\n    if (this.args.txs.length > 0 && this.categoryModified) {\n      for (let tx of this.args.txs) {\n        await this.wasm.revertCategoryTask.perform(tx.id);\n      }\n\n      await this.wasm.getTransactionsTask.perform();\n    } else {\n      debug('Error in revertCateg - category not reverted...');\n    }\n\n    this.#closeModal();\n  }\n\n  #closeModal() {\n    this.toConfirm = false;\n    this.args.onHidden();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsModal @open={{@open}} @onShow={{this.fetchCoinDetail}} @backdropClose={{false}} @onHide={{@onHidden}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">\\n        {{#if this.wasm.getCoinDetailTask.isRunning}}\\n          <span class=\\\"spinner-border spinner-border-sm\\\" role=\\\"status\\\" aria-hidden=\\\"true\\\"></span>\\n          Récupération des informations\\n        {{else}}\\n          {{#if this.coin.name}}\\n            <img class=\\\"mr-1\\\" src={{this.coin.image}} alt=\\\"coin\\\" />\\n            <span data-test-coin-detail-modal-coin-name>{{this.coin.name}}</span>\\n            <span class=\\\"badge bg-secondary\\\">{{uppercase this.coin.symbol}}</span>\\n          {{else}}\\n            <span data-test-coin-detail-modal-coin-name>Jeton inconnu</span>\\n          {{/if}}\\n        {{/if}}\\n      </h4>\\n    </modal.header>\\n\\n    {{#if this.wasm.getCoinDetailTask.isIdle}}\\n      <modal.body>\\n        {{#if this.coin.name}}\\n          <dl class=\\\"row\\\">\\n            <dt>Prix</dt>\\n            <dd>\\n              {{#if this.hasCurrentPriceEur}}\\n                <span data-test-coin-detail-modal-coin-price-eur class=\\\"display-6\\\">{{format-number\\n                    this.coin.marketData.currentPriceEur\\n                    style=\\\"currency\\\"\\n                    currency=\\\"EUR\\\"\\n                  }}</span>\\n                {{! Commented now because price change result from coingecko is wrong }}\\n                {{!-- {{#if this.priceChange24hEur}}\\n                  <span\\n                    class=\\\"badge rounded-pill bg-{{if (gt this.priceChange24hEur 0) 'success' 'danger'}}\\\"\\n                  >{{format-number this.priceChange24hEur minimumFractionDigits=2 style=\\\"percent\\\"}}</span>\\n                {{/if}} --}}\\n              {{/if}}\\n              <br />\\n              {{#if this.hasCurrentPriceUsd}}\\n                {{format-number this.coin.marketData.currentPriceUsd style=\\\"currency\\\" currency=\\\"USD\\\"}}<br />\\n              {{/if}}\\n              {{#if this.hasCurrentPriceUsd}}\\n                {{format-number\\n                  this.coin.marketData.currentPriceBtc\\n                  style=\\\"currency\\\"\\n                  minimumFractionDigits=8\\n                  currency=\\\"BTC\\\"\\n                }}<br />\\n              {{/if}}\\n            </dd>\\n            <hr class=\\\"offset-1 col-10\\\" />\\n            {{#if this.coin.marketData.marketCapEur}}\\n              <dt class=\\\"col-4\\\">Market cap</dt>\\n              <dd class=\\\"col-8\\\">{{format-number\\n                  this.coin.marketData.marketCapEur\\n                  style=\\\"currency\\\"\\n                  maximumFractionDigits=0\\n                  currency=\\\"EUR\\\"\\n                }}</dd>\\n            {{/if}}\\n            {{#if this.coin.marketData.circulatingSupply}}\\n              <dt class=\\\"col-4\\\">Circulating Supply</dt>\\n              <dd class=\\\"col-8\\\">{{format-number this.coin.marketData.circulatingSupply maximumFractionDigits=0}}</dd>\\n            {{/if}}\\n            {{#if this.coin.marketData.totalSupply}}\\n              <dt class=\\\"col-4\\\">Total Supply</dt>\\n              <dd class=\\\"col-8\\\">{{format-number this.coin.marketData.totalSupply maximumFractionDigits=0}}</dd>\\n            {{/if}}\\n            {{#if this.coin.marketData.maxSupply}}\\n              <dt class=\\\"col-4\\\">Max Supply</dt>\\n              <dd class=\\\"col-8\\\">{{format-number this.coin.marketData.maxSupply maximumFractionDigits=0}}</dd>\\n            {{/if}}\\n          </dl>\\n        {{else}}\\n          <BsAlert\\n            data-test-api-blockchains-url\\n            class=\\\"mt-4\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @type=\\\"warning\\\"\\n            @dismissible={{false}}\\n          >\\n            <strong>Note : </strong>\\n            Le jeton n'a pas été trouvé sur coingecko\\n          </BsAlert>\\n        {{/if}}\\n      </modal.body>\\n    {{/if}}\\n    <modal.footer>\\n      <BsButton @onClick={{@onHidden}}>Fermer</BsButton>\\n    </modal.footer>\\n  </div>\\n</BsModal>\", {\"contents\":\"<BsModal @open={{@open}} @onShow={{this.fetchCoinDetail}} @backdropClose={{false}} @onHide={{@onHidden}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">\\n        {{#if this.wasm.getCoinDetailTask.isRunning}}\\n          <span class=\\\"spinner-border spinner-border-sm\\\" role=\\\"status\\\" aria-hidden=\\\"true\\\"></span>\\n          Récupération des informations\\n        {{else}}\\n          {{#if this.coin.name}}\\n            <img class=\\\"mr-1\\\" src={{this.coin.image}} alt=\\\"coin\\\" />\\n            <span data-test-coin-detail-modal-coin-name>{{this.coin.name}}</span>\\n            <span class=\\\"badge bg-secondary\\\">{{uppercase this.coin.symbol}}</span>\\n          {{else}}\\n            <span data-test-coin-detail-modal-coin-name>Jeton inconnu</span>\\n          {{/if}}\\n        {{/if}}\\n      </h4>\\n    </modal.header>\\n\\n    {{#if this.wasm.getCoinDetailTask.isIdle}}\\n      <modal.body>\\n        {{#if this.coin.name}}\\n          <dl class=\\\"row\\\">\\n            <dt>Prix</dt>\\n            <dd>\\n              {{#if this.hasCurrentPriceEur}}\\n                <span data-test-coin-detail-modal-coin-price-eur class=\\\"display-6\\\">{{format-number\\n                    this.coin.marketData.currentPriceEur\\n                    style=\\\"currency\\\"\\n                    currency=\\\"EUR\\\"\\n                  }}</span>\\n                {{! Commented now because price change result from coingecko is wrong }}\\n                {{!-- {{#if this.priceChange24hEur}}\\n                  <span\\n                    class=\\\"badge rounded-pill bg-{{if (gt this.priceChange24hEur 0) 'success' 'danger'}}\\\"\\n                  >{{format-number this.priceChange24hEur minimumFractionDigits=2 style=\\\"percent\\\"}}</span>\\n                {{/if}} --}}\\n              {{/if}}\\n              <br />\\n              {{#if this.hasCurrentPriceUsd}}\\n                {{format-number this.coin.marketData.currentPriceUsd style=\\\"currency\\\" currency=\\\"USD\\\"}}<br />\\n              {{/if}}\\n              {{#if this.hasCurrentPriceUsd}}\\n                {{format-number\\n                  this.coin.marketData.currentPriceBtc\\n                  style=\\\"currency\\\"\\n                  minimumFractionDigits=8\\n                  currency=\\\"BTC\\\"\\n                }}<br />\\n              {{/if}}\\n            </dd>\\n            <hr class=\\\"offset-1 col-10\\\" />\\n            {{#if this.coin.marketData.marketCapEur}}\\n              <dt class=\\\"col-4\\\">Market cap</dt>\\n              <dd class=\\\"col-8\\\">{{format-number\\n                  this.coin.marketData.marketCapEur\\n                  style=\\\"currency\\\"\\n                  maximumFractionDigits=0\\n                  currency=\\\"EUR\\\"\\n                }}</dd>\\n            {{/if}}\\n            {{#if this.coin.marketData.circulatingSupply}}\\n              <dt class=\\\"col-4\\\">Circulating Supply</dt>\\n              <dd class=\\\"col-8\\\">{{format-number this.coin.marketData.circulatingSupply maximumFractionDigits=0}}</dd>\\n            {{/if}}\\n            {{#if this.coin.marketData.totalSupply}}\\n              <dt class=\\\"col-4\\\">Total Supply</dt>\\n              <dd class=\\\"col-8\\\">{{format-number this.coin.marketData.totalSupply maximumFractionDigits=0}}</dd>\\n            {{/if}}\\n            {{#if this.coin.marketData.maxSupply}}\\n              <dt class=\\\"col-4\\\">Max Supply</dt>\\n              <dd class=\\\"col-8\\\">{{format-number this.coin.marketData.maxSupply maximumFractionDigits=0}}</dd>\\n            {{/if}}\\n          </dl>\\n        {{else}}\\n          <BsAlert\\n            data-test-api-blockchains-url\\n            class=\\\"mt-4\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @type=\\\"warning\\\"\\n            @dismissible={{false}}\\n          >\\n            <strong>Note : </strong>\\n            Le jeton n'a pas été trouvé sur coingecko\\n          </BsAlert>\\n        {{/if}}\\n      </modal.body>\\n    {{/if}}\\n    <modal.footer>\\n      <BsButton @onClick={{@onHidden}}>Fermer</BsButton>\\n    </modal.footer>\\n  </div>\\n</BsModal>\",\"moduleName\":\"cryptofiscafacile-gui/components/tx-table/coin-detail-modal/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/tx-table/coin-detail-modal/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\n\ninterface TxTableCoinDetailModalArgs {\n  symbol: string;\n}\n\nexport default class TxTableCoinDetailModal extends Component<TxTableCoinDetailModalArgs> {\n  @service declare wasm: WasmService;\n\n  @action\n  async fetchCoinDetail() {\n    if (this.args.symbol) {\n      this.wasm.getCoinDetailTask.perform(this.args.symbol);\n    }\n  }\n\n  get coin() {\n    return this.wasm.coinsDetail.get(this.args.symbol);\n  }\n\n  get hasCurrentPriceBtc() {\n    return this.coin?.marketData.currentPriceEur !== undefined;\n  }\n\n  get hasCurrentPriceEur() {\n    return this.coin?.marketData.currentPriceEur !== undefined;\n  }\n\n  get hasCurrentPriceUsd() {\n    return this.coin?.marketData.currentPriceUsd !== undefined;\n  }\n\n  get priceChange24hEur() {\n    return this.coin?.marketData.currentPriceChange24hEur\n      ? this.coin.marketData.currentPriceChange24hEur / 100\n      : undefined;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{! template-lint-disable no-duplicate-id }}\\n<div id=\\\"intro-tx\\\" class=\\\"h-100\\\">\\n  <div\\n    class=\\\"d-flex flex-column mx-1 mx-sm-3 h-100\\\"\\n    data-title=\\\"Transactions\\\"\\n    data-intro=\\\"Bienvenue 👋 Ici se retrouvera l'ensemble de vos transactions (ou TX) extraites de tous les fichiers importés ainsi que de toutes les APIs utilisées. Cette page est primordiale afin d'effectuer la catégorisation des TX qui n'ont pas pu l'être automatiquement via le moteur CryptoFiscaFacile. Laissez vous guider...\\\"\\n  >\\n    <div\\n      class=\\\"d-flex justify-content-between align-items-center my-3\\\"\\n      data-title=\\\"Barre de validation\\\"\\n      data-intro=\\\"Cette barre vous permettra de vous aider dans la catégorisation de vos transactions :\\\"\\n    >\\n      {{! FILTER button - open a window to select filter option(s) }}\\n      <button\\n        type=\\\"button\\\"\\n        class=\\\"btn btn-primary d-flex justify-content-evenly align-items-center align-content-center color\\\"\\n        data-test-tx-table-filter-button\\n        data-title=\\\"Filtrer\\\"\\n        data-intro=\\\"Appuyez sur ce bouton. Une fenêtre glissante apparaitra sur la gauche. Dans cette fenêtre il vous sera possible de filtrer sur vos transactions : par date, par nom de portefeuille, par catégorie ou ensemble de catégories ainsi que par type(s) de coin. Très utile lorsque vous devez traiter beaucoup de TX... Cliquer de nouveau pour faire disparaitre la fenêtre de gauche.\\\"\\n        {{offcanvas-toggler \\\"offcanvas-filter\\\"}}\\n      >\\n        <App::Icon @icon=\\\"ion:funnel\\\" width=\\\"15\\\" />\\n        <p class=\\\"m-0 ms-1\\\">FILTRER</p>\\n      </button>\\n      <div class=\\\"d-flex flex-column mx-2 mx-lg-0 w-50 align-items-center\\\">\\n        <div\\n          class=\\\"d-flex input-group filter-search\\\"\\n          data-title=\\\"Rechercher\\\"\\n          data-intro=\\\"Il est également possible de rechercher 🔎 n'importe quel mot clé dans vos TX. Hormis les dates et les montants, toutes les colonnes sont activées avec la recherche...\\\"\\n        >\\n          <span class=\\\"input-group-text\\\" id=\\\"input-search\\\">\\n            <App::Icon @icon=\\\"ion:search\\\" width=\\\"15\\\" height=\\\"15\\\" class=\\\"bi bi-search\\\" />\\n          </span>\\n          <Input\\n            @type=\\\"text\\\"\\n            @value={{@searchedItem}}\\n            class=\\\"form-control input-search\\\"\\n            placeholder=\\\"Rechercher...\\\"\\n            tabindex=\\\"-1\\\"\\n            aria-label=\\\"Rechercher...\\\"\\n            aria-describedby=\\\"input-search\\\"\\n            {{on \\\"input\\\" this.searchItem}}\\n            {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n          />\\n        </div>\\n        {{! Display the total of TX }}\\n        <h5\\n          class=\\\"total mb-0 mt-2\\\"\\n          data-title=\\\"Total\\\"\\n          data-intro=\\\"Afin de bien identifier le nombre réel total de TX, ce champ vous montrera cette information...\\\"\\n        ><strong>TOTAL TX : {{this.totalTx}}</strong></h5>\\n      </div>\\n      <TxTable::Validate />\\n    </div>\\n\\n    {{! Beg of full TX table}}\\n    <div class=\\\"d-flex justify-content-around my-1\\\">\\n      <div class=\\\"row my-1 w-25\\\">\\n        <label class=\\\"ms-1 d-none d-xl-inline col-md-7 col-form-label text-end label-paddingtop font-small p-0 me-1\\\">Nb\\n          lignes à afficher :</label>\\n        <div class=\\\"col-9 col-md-4 p-0\\\">\\n          <select\\n            class=\\\"form-select form-select-sm\\\"\\n            id=\\\"pageSizeSelect\\\"\\n            {{on \\\"change\\\" this.setPageSize}}\\n            {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n          >\\n            {{#each (array 10 20 30 40 50 100 200 500) as |size|}}\\n              {{#if (eq this.pageSize size)}}\\n                <option value={{size}} selected>{{size}}</option>\\n              {{else}}\\n                <option value={{size}}>{{size}}</option>\\n              {{/if}}\\n            {{/each}}\\n          </select>\\n        </div>\\n      </div>\\n\\n      <App::PageNavigator\\n        @userPage={{this.page}}\\n        @maxPage={{this.maxPage}}\\n        @onUserPageChanged={{this.onUserPageChanged}}\\n      />\\n    </div>\\n\\n    <div class=\\\"table-responsive card-body p-0 h-100\\\" {{this.pageSizeModifier this.setDefaultPageSizeNumber}}>\\n      <table class=\\\"table tx-table table-head-fixed text-nowrap m-0 p-0 mb-md-0\\\" id=\\\"txTable\\\">\\n        <thead\\n          data-title=\\\"Table des TX\\\"\\n          data-intro=\\\"Grâce à ce tableau, vous pourrez manipuler les TX qui doivent l'être (catégorisation) et observer n'importe quelle transaction passée sur tous les portefeuilles que vous détenez...\\\"\\n        >\\n          <tr>\\n            {{! template-lint-disable no-invalid-interactive }}\\n            <th>\\n              <Input\\n                @type=\\\"checkbox\\\"\\n                @checked={{this.allTxsSelected}}\\n                class=\\\"align-middle form-check-input mt-0\\\"\\n                id=\\\"multiple-categorization-checkbox\\\"\\n                indeterminate={{this.allSelectionIndeterminate}}\\n              />\\n              <TxTable::TxItem::CategUpdateButton @onClick={{this.onMultiUpdateCategory}} />\\n            </th>\\n            <th\\n              {{on \\\"click\\\" (fn this.sortDate @dateSortOrder)}}\\n              data-title=\\\"Date des TX\\\"\\n              data-intro=\\\"Vous retrouverez ici les dates de vos TX aux secondes près ⏲. Un appui sur le libellé de cette colonne vous permettra de trier les TX par ordre chronologique croissant ou décroissant...\\\"\\n            >\\n              <div class=\\\"d-flex justify-content-between\\\">\\n                <div>DATE</div>\\n                {{#if (eq @dateSortOrder \\\"DESC\\\")}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-down-circle-outline\\\" /></div>\\n                {{else if (eq @dateSortOrder \\\"ASC\\\")}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-up-circle-outline\\\" /></div>\\n                {{else}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:remove-outline\\\" /></div>\\n                {{/if}}\\n              </div>\\n            </th>\\n            {{! template-lint-disable no-invalid-interactive }}\\n            <th\\n              {{on \\\"click\\\" (fn this.sortPf @pfSortOrder)}}\\n              data-title=\\\"Vos Portefeuilles\\\"\\n              data-intro=\\\"Cette colonne vous donnera les noms des portefeuilles que vous détenez. Un appui sur le libellé de cette colonne vous permettra de trier ces portefeuilles par ordre alphabétique croissant ou décroissant...\\\"\\n            >\\n              <div class=\\\"d-flex justify-content-between\\\">\\n                <div>PORTEFEUILLE</div>\\n                {{#if (eq @pfSortOrder \\\"DESC\\\")}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-down-circle-outline\\\" /></div>\\n                {{else if (eq @pfSortOrder \\\"ASC\\\")}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-up-circle-outline\\\" /></div>\\n                {{else}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:remove-outline\\\" /></div>\\n                {{/if}}\\n              </div>\\n            </th>\\n            {{! template-lint-disable no-invalid-interactive }}\\n            <th\\n              {{on \\\"click\\\" (fn this.sortCat @catSortOrder)}}\\n              data-title=\\\"Catégorie des TX\\\"\\n              data-intro=\\\"Cette colonne vous donnera les catégories des TX détectées. Un appui sur le libellé de cette colonne vous permettra de trier ces catégories par ordre alphabétique croissant ou décroissant...\\\"\\n            >\\n              <div class=\\\"d-flex justify-content-between\\\">\\n                <div>CATEGORIE</div>\\n                {{#if (eq @catSortOrder \\\"DESC\\\")}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-down-circle-outline\\\" /></div>\\n                {{else if (eq @catSortOrder \\\"ASC\\\")}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-up-circle-outline\\\" /></div>\\n                {{else}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:remove-outline\\\" /></div>\\n                {{/if}}\\n              </div>\\n            </th>\\n            <th\\n              colspan=\\\"2\\\"\\n              data-title=\\\"La TX\\\"\\n              data-intro=\\\"Vous pourrez visualiser les TX via ces 3 colonnes DE ou Sortie - VERS ou Entrée, et FRAIS. L'intitulé DE se réfèrera à tout échange de symboles (par ex.: DE 50000 EUR vers 1 BTC), tandis que l'intitulé SORTIE se comprendra comme le coin qui sortira du portefeuille dans le cas d'un retrait.\\\"\\n            >DE/SORTIE</th>\\n            <th\\n              colspan=\\\"2\\\"\\n              data-title=\\\"La TX\\\"\\n              data-intro=\\\"L'intitulé VERS se réfèrera à tout échange de symboles (par ex.: de 50000 EUR VERS 1 BTC), tandis que l'intitulé ENTREE se comprendra comme le coin qui entrera dans le portefeuille, dans le cas d'un dépôt.\\\"\\n            >VERS/ENTREE</th>\\n            <th\\n              colspan=\\\"2\\\"\\n              data-title=\\\"La TX\\\"\\n              data-intro=\\\"La colonne FRAIS vous donnera les frais éventuels de la transaction...\\\"\\n            >FRAIS</th>\\n            <th\\n              data-title=\\\"Boite à outils\\\"\\n              data-intro=\\\"Dans cette colonne apparaitra un statut pour chaque TX, et le cas échéant, une CLE A MOLETTE 🔧 qui vous permettra de CATEGORISER la dite TX (Une fenêtre apparaitra et vous demandera d'ajouter la bonne catégorisation pour la transaction, ex.: TX qui sera finalement relative à un AIRDROP...); une icone qui vous permettra de supprimer la dernière catégoriation et une icôné vous permettant de rentrer un montant fiat si celui ci est erroné.\\\"\\n              {{on \\\"click\\\" this.toggleAmountsHidden}}\\n            ><App::Icon @icon={{if this.amountsHidden \\\"ion:eye-off-outline\\\" \\\"ion:eye-outline\\\"}} width=\\\"20\\\" />\\n              <BsTooltip>Masquer les montants</BsTooltip></th>\\n          </tr>\\n        </thead>\\n        <tbody class=\\\"tx-body\\\">\\n          {{#if this.isFecthingTransactions}}\\n            <tr class=\\\"line-height-tx none\\\">\\n              <td colspan=\\\"11\\\">\\n                <div class=\\\"d-flex justify-content-center align-items-center\\\">\\n                  <div class=\\\"spinner-border\\\" role=\\\"status\\\">\\n                    <span class=\\\"visually-hidden\\\"></span>\\n                  </div>\\n                </div>\\n              </td>\\n            </tr>\\n          {{else}}\\n            {{#if this.pageSortedTransactions}}\\n              <TxTable::CategUpdateModal\\n                @onHidden={{this.onUpdateCategoryModalHidden}}\\n                @open={{this.updateCategoryModalVisible}}\\n                @txs={{this.updateCategoryTxs}}\\n              />\\n              <TxTable::CoinDetailModal\\n                @onHidden={{this.onCoinDetailModalHidden}}\\n                @open={{this.coinDetailModalVisible}}\\n                @symbol={{this.coinDetailModalSymbol}}\\n              />\\n              {{#each this.pageSortedTransactions as |tx|}}\\n                <tr class=\\\"line-height-tx\\\">\\n                  <TxTable::TxItem\\n                    @allowedCategoryForSelection={{this.selectedCategory}}\\n                    @onUpdateCategory={{this.onUpdateCategory}}\\n                    @onShowCoinDetail={{this.onShowCoinDetail}}\\n                    @onSelected={{this.onTxSelected}}\\n                    @secretMode={{this.amountsHidden}}\\n                    @selected={{call (fn this.isTxSelected tx)}}\\n                    @tx={{tx}}\\n                  />\\n                </tr>\\n              {{/each}}\\n            {{else}}\\n              {{! data is empty, so display empty line }}\\n              <tr class=\\\"line-height-tx none\\\">\\n                <td colspan=\\\"11\\\">\\n                  AUCUNE TRANSACTION\\n                </td>\\n              </tr>\\n            {{/if}}\\n          {{/if}}\\n        </tbody>\\n      </table>\\n    </div>\\n  </div>\\n</div>\\n\\n{{! OFFCANVAS for Filters HTML }}\\n<Bs::Offcanvas @id=\\\"offcanvas-filter\\\" @open={{this.offcanvasFilterVisible}}>\\n  <Bs::Offcanvas::Header>\\n    <h5 class=\\\"offcanvas-title\\\" id=\\\"offcanvasFilterLabel\\\">FILTRER PAR :</h5>\\n    <button\\n      type=\\\"button\\\"\\n      class=\\\"btn-close text-reset\\\"\\n      aria-label=\\\"Close\\\"\\n      {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n    ></button>\\n  </Bs::Offcanvas::Header>\\n  <Bs::Offcanvas::Body>\\n    <div class=\\\"d-flex m-2 flex-column justify-content-center mb-4\\\">\\n      <Calendar @dates={{@selectedDates}} @onChange={{this.selectDates}} />\\n    </div>\\n    <div class=\\\"d-flex flex-column m-2 mt-4 mb-4\\\">\\n      <label for=\\\"wallet-select\\\">Portefeuilles</label>\\n      {{! template-lint-disable require-input-label }}\\n      <select\\n        name=\\\"wallets\\\"\\n        id=\\\"wallet-select\\\"\\n        class=\\\"form-select\\\"\\n        aria-label=\\\"multiple select wallets\\\"\\n        multiple\\n        size=\\\"4\\\"\\n        {{on \\\"change\\\" this.selectWallet}}\\n      >\\n        {{#if this.hasSelectedWallet}}\\n          <option value=\\\"all\\\">--Tout--</option>\\n        {{else}}\\n          <option value=\\\"all\\\" selected>--Tout--</option>\\n        {{/if}}\\n        {{#each this.walletOptions as |walletOption|}}\\n          {{#if walletOption.selected}}\\n            <option selected value={{walletOption.name}}>{{walletOption.name}}</option>\\n          {{else}}\\n            <option value={{walletOption.name}}>{{walletOption.name}}</option>\\n          {{/if}}\\n        {{/each}}\\n      </select>\\n    </div>\\n    <div class=\\\"d-flex flex-column m-2 mt-4 mb-4\\\">\\n      <div class=\\\"d-flex flex-column\\\">\\n        <label for=\\\"categ-select\\\">Catégories</label>\\n        {{! template-lint-disable require-input-label }}\\n        <select\\n          name=\\\"categ\\\"\\n          multiple\\n          size=\\\"5\\\"\\n          id=\\\"categ-select\\\"\\n          class=\\\"form-select\\\"\\n          aria-label=\\\"multiple select categ\\\"\\n          {{on \\\"change\\\" this.selectCategory}}\\n        >\\n          {{#if this.hasSelectedCategory}}\\n            <option value=\\\"all\\\">--Toutes--</option>\\n          {{else}}\\n            <option value=\\\"all\\\" selected>--Toutes--</option>\\n          {{/if}}\\n          {{#each this.categoryOptions as |categoryOption|}}\\n            {{#if categoryOption.selected}}\\n              <option selected value={{categoryOption.name}}>{{categoryOption.name}}</option>\\n            {{else}}\\n              <option value={{categoryOption.name}}>{{categoryOption.name}}</option>\\n            {{/if}}\\n          {{/each}}\\n        </select>\\n      </div>\\n    </div>\\n    <div class=\\\"d-flex flex-column m-2\\\">\\n      <div class=\\\"d-flex flex-column\\\">\\n        <label for=\\\"coin-select\\\">Coins</label>\\n        {{! template-lint-disable require-input-label }}\\n        <select\\n          name=\\\"coin\\\"\\n          multiple\\n          size=\\\"6\\\"\\n          id=\\\"coin-select\\\"\\n          class=\\\"form-select\\\"\\n          aria-label=\\\"multiple select coins\\\"\\n          {{on \\\"change\\\" this.selectCoin}}\\n        >\\n          {{#if this.hasSelectedCoin}}\\n            <option value=\\\"all\\\">--Tout--</option>\\n          {{else}}\\n            <option value=\\\"all\\\" selected>--Tout--</option>\\n          {{/if}}\\n          {{#each this.coinOptions as |coinOption|}}\\n            {{#if coinOption.selected}}\\n              <option selected value={{coinOption.name}}>{{coinOption.name}}</option>\\n            {{else}}\\n              <option value={{coinOption.name}}>{{coinOption.name}}</option>\\n            {{/if}}\\n          {{/each}}\\n        </select>\\n      </div>\\n    </div>\\n  </Bs::Offcanvas::Body>\\n</Bs::Offcanvas>\", {\"contents\":\"{{! template-lint-disable no-duplicate-id }}\\n<div id=\\\"intro-tx\\\" class=\\\"h-100\\\">\\n  <div\\n    class=\\\"d-flex flex-column mx-1 mx-sm-3 h-100\\\"\\n    data-title=\\\"Transactions\\\"\\n    data-intro=\\\"Bienvenue 👋 Ici se retrouvera l'ensemble de vos transactions (ou TX) extraites de tous les fichiers importés ainsi que de toutes les APIs utilisées. Cette page est primordiale afin d'effectuer la catégorisation des TX qui n'ont pas pu l'être automatiquement via le moteur CryptoFiscaFacile. Laissez vous guider...\\\"\\n  >\\n    <div\\n      class=\\\"d-flex justify-content-between align-items-center my-3\\\"\\n      data-title=\\\"Barre de validation\\\"\\n      data-intro=\\\"Cette barre vous permettra de vous aider dans la catégorisation de vos transactions :\\\"\\n    >\\n      {{! FILTER button - open a window to select filter option(s) }}\\n      <button\\n        type=\\\"button\\\"\\n        class=\\\"btn btn-primary d-flex justify-content-evenly align-items-center align-content-center color\\\"\\n        data-test-tx-table-filter-button\\n        data-title=\\\"Filtrer\\\"\\n        data-intro=\\\"Appuyez sur ce bouton. Une fenêtre glissante apparaitra sur la gauche. Dans cette fenêtre il vous sera possible de filtrer sur vos transactions : par date, par nom de portefeuille, par catégorie ou ensemble de catégories ainsi que par type(s) de coin. Très utile lorsque vous devez traiter beaucoup de TX... Cliquer de nouveau pour faire disparaitre la fenêtre de gauche.\\\"\\n        {{offcanvas-toggler \\\"offcanvas-filter\\\"}}\\n      >\\n        <App::Icon @icon=\\\"ion:funnel\\\" width=\\\"15\\\" />\\n        <p class=\\\"m-0 ms-1\\\">FILTRER</p>\\n      </button>\\n      <div class=\\\"d-flex flex-column mx-2 mx-lg-0 w-50 align-items-center\\\">\\n        <div\\n          class=\\\"d-flex input-group filter-search\\\"\\n          data-title=\\\"Rechercher\\\"\\n          data-intro=\\\"Il est également possible de rechercher 🔎 n'importe quel mot clé dans vos TX. Hormis les dates et les montants, toutes les colonnes sont activées avec la recherche...\\\"\\n        >\\n          <span class=\\\"input-group-text\\\" id=\\\"input-search\\\">\\n            <App::Icon @icon=\\\"ion:search\\\" width=\\\"15\\\" height=\\\"15\\\" class=\\\"bi bi-search\\\" />\\n          </span>\\n          <Input\\n            @type=\\\"text\\\"\\n            @value={{@searchedItem}}\\n            class=\\\"form-control input-search\\\"\\n            placeholder=\\\"Rechercher...\\\"\\n            tabindex=\\\"-1\\\"\\n            aria-label=\\\"Rechercher...\\\"\\n            aria-describedby=\\\"input-search\\\"\\n            {{on \\\"input\\\" this.searchItem}}\\n            {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n          />\\n        </div>\\n        {{! Display the total of TX }}\\n        <h5\\n          class=\\\"total mb-0 mt-2\\\"\\n          data-title=\\\"Total\\\"\\n          data-intro=\\\"Afin de bien identifier le nombre réel total de TX, ce champ vous montrera cette information...\\\"\\n        ><strong>TOTAL TX : {{this.totalTx}}</strong></h5>\\n      </div>\\n      <TxTable::Validate />\\n    </div>\\n\\n    {{! Beg of full TX table}}\\n    <div class=\\\"d-flex justify-content-around my-1\\\">\\n      <div class=\\\"row my-1 w-25\\\">\\n        <label class=\\\"ms-1 d-none d-xl-inline col-md-7 col-form-label text-end label-paddingtop font-small p-0 me-1\\\">Nb\\n          lignes à afficher :</label>\\n        <div class=\\\"col-9 col-md-4 p-0\\\">\\n          <select\\n            class=\\\"form-select form-select-sm\\\"\\n            id=\\\"pageSizeSelect\\\"\\n            {{on \\\"change\\\" this.setPageSize}}\\n            {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n          >\\n            {{#each (array 10 20 30 40 50 100 200 500) as |size|}}\\n              {{#if (eq this.pageSize size)}}\\n                <option value={{size}} selected>{{size}}</option>\\n              {{else}}\\n                <option value={{size}}>{{size}}</option>\\n              {{/if}}\\n            {{/each}}\\n          </select>\\n        </div>\\n      </div>\\n\\n      <App::PageNavigator\\n        @userPage={{this.page}}\\n        @maxPage={{this.maxPage}}\\n        @onUserPageChanged={{this.onUserPageChanged}}\\n      />\\n    </div>\\n\\n    <div class=\\\"table-responsive card-body p-0 h-100\\\" {{this.pageSizeModifier this.setDefaultPageSizeNumber}}>\\n      <table class=\\\"table tx-table table-head-fixed text-nowrap m-0 p-0 mb-md-0\\\" id=\\\"txTable\\\">\\n        <thead\\n          data-title=\\\"Table des TX\\\"\\n          data-intro=\\\"Grâce à ce tableau, vous pourrez manipuler les TX qui doivent l'être (catégorisation) et observer n'importe quelle transaction passée sur tous les portefeuilles que vous détenez...\\\"\\n        >\\n          <tr>\\n            {{! template-lint-disable no-invalid-interactive }}\\n            <th>\\n              <Input\\n                @type=\\\"checkbox\\\"\\n                @checked={{this.allTxsSelected}}\\n                class=\\\"align-middle form-check-input mt-0\\\"\\n                id=\\\"multiple-categorization-checkbox\\\"\\n                indeterminate={{this.allSelectionIndeterminate}}\\n              />\\n              <TxTable::TxItem::CategUpdateButton @onClick={{this.onMultiUpdateCategory}} />\\n            </th>\\n            <th\\n              {{on \\\"click\\\" (fn this.sortDate @dateSortOrder)}}\\n              data-title=\\\"Date des TX\\\"\\n              data-intro=\\\"Vous retrouverez ici les dates de vos TX aux secondes près ⏲. Un appui sur le libellé de cette colonne vous permettra de trier les TX par ordre chronologique croissant ou décroissant...\\\"\\n            >\\n              <div class=\\\"d-flex justify-content-between\\\">\\n                <div>DATE</div>\\n                {{#if (eq @dateSortOrder \\\"DESC\\\")}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-down-circle-outline\\\" /></div>\\n                {{else if (eq @dateSortOrder \\\"ASC\\\")}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-up-circle-outline\\\" /></div>\\n                {{else}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:remove-outline\\\" /></div>\\n                {{/if}}\\n              </div>\\n            </th>\\n            {{! template-lint-disable no-invalid-interactive }}\\n            <th\\n              {{on \\\"click\\\" (fn this.sortPf @pfSortOrder)}}\\n              data-title=\\\"Vos Portefeuilles\\\"\\n              data-intro=\\\"Cette colonne vous donnera les noms des portefeuilles que vous détenez. Un appui sur le libellé de cette colonne vous permettra de trier ces portefeuilles par ordre alphabétique croissant ou décroissant...\\\"\\n            >\\n              <div class=\\\"d-flex justify-content-between\\\">\\n                <div>PORTEFEUILLE</div>\\n                {{#if (eq @pfSortOrder \\\"DESC\\\")}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-down-circle-outline\\\" /></div>\\n                {{else if (eq @pfSortOrder \\\"ASC\\\")}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-up-circle-outline\\\" /></div>\\n                {{else}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:remove-outline\\\" /></div>\\n                {{/if}}\\n              </div>\\n            </th>\\n            {{! template-lint-disable no-invalid-interactive }}\\n            <th\\n              {{on \\\"click\\\" (fn this.sortCat @catSortOrder)}}\\n              data-title=\\\"Catégorie des TX\\\"\\n              data-intro=\\\"Cette colonne vous donnera les catégories des TX détectées. Un appui sur le libellé de cette colonne vous permettra de trier ces catégories par ordre alphabétique croissant ou décroissant...\\\"\\n            >\\n              <div class=\\\"d-flex justify-content-between\\\">\\n                <div>CATEGORIE</div>\\n                {{#if (eq @catSortOrder \\\"DESC\\\")}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-down-circle-outline\\\" /></div>\\n                {{else if (eq @catSortOrder \\\"ASC\\\")}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-up-circle-outline\\\" /></div>\\n                {{else}}\\n                  <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:remove-outline\\\" /></div>\\n                {{/if}}\\n              </div>\\n            </th>\\n            <th\\n              colspan=\\\"2\\\"\\n              data-title=\\\"La TX\\\"\\n              data-intro=\\\"Vous pourrez visualiser les TX via ces 3 colonnes DE ou Sortie - VERS ou Entrée, et FRAIS. L'intitulé DE se réfèrera à tout échange de symboles (par ex.: DE 50000 EUR vers 1 BTC), tandis que l'intitulé SORTIE se comprendra comme le coin qui sortira du portefeuille dans le cas d'un retrait.\\\"\\n            >DE/SORTIE</th>\\n            <th\\n              colspan=\\\"2\\\"\\n              data-title=\\\"La TX\\\"\\n              data-intro=\\\"L'intitulé VERS se réfèrera à tout échange de symboles (par ex.: de 50000 EUR VERS 1 BTC), tandis que l'intitulé ENTREE se comprendra comme le coin qui entrera dans le portefeuille, dans le cas d'un dépôt.\\\"\\n            >VERS/ENTREE</th>\\n            <th\\n              colspan=\\\"2\\\"\\n              data-title=\\\"La TX\\\"\\n              data-intro=\\\"La colonne FRAIS vous donnera les frais éventuels de la transaction...\\\"\\n            >FRAIS</th>\\n            <th\\n              data-title=\\\"Boite à outils\\\"\\n              data-intro=\\\"Dans cette colonne apparaitra un statut pour chaque TX, et le cas échéant, une CLE A MOLETTE 🔧 qui vous permettra de CATEGORISER la dite TX (Une fenêtre apparaitra et vous demandera d'ajouter la bonne catégorisation pour la transaction, ex.: TX qui sera finalement relative à un AIRDROP...); une icone qui vous permettra de supprimer la dernière catégoriation et une icôné vous permettant de rentrer un montant fiat si celui ci est erroné.\\\"\\n              {{on \\\"click\\\" this.toggleAmountsHidden}}\\n            ><App::Icon @icon={{if this.amountsHidden \\\"ion:eye-off-outline\\\" \\\"ion:eye-outline\\\"}} width=\\\"20\\\" />\\n              <BsTooltip>Masquer les montants</BsTooltip></th>\\n          </tr>\\n        </thead>\\n        <tbody class=\\\"tx-body\\\">\\n          {{#if this.isFecthingTransactions}}\\n            <tr class=\\\"line-height-tx none\\\">\\n              <td colspan=\\\"11\\\">\\n                <div class=\\\"d-flex justify-content-center align-items-center\\\">\\n                  <div class=\\\"spinner-border\\\" role=\\\"status\\\">\\n                    <span class=\\\"visually-hidden\\\"></span>\\n                  </div>\\n                </div>\\n              </td>\\n            </tr>\\n          {{else}}\\n            {{#if this.pageSortedTransactions}}\\n              <TxTable::CategUpdateModal\\n                @onHidden={{this.onUpdateCategoryModalHidden}}\\n                @open={{this.updateCategoryModalVisible}}\\n                @txs={{this.updateCategoryTxs}}\\n              />\\n              <TxTable::CoinDetailModal\\n                @onHidden={{this.onCoinDetailModalHidden}}\\n                @open={{this.coinDetailModalVisible}}\\n                @symbol={{this.coinDetailModalSymbol}}\\n              />\\n              {{#each this.pageSortedTransactions as |tx|}}\\n                <tr class=\\\"line-height-tx\\\">\\n                  <TxTable::TxItem\\n                    @allowedCategoryForSelection={{this.selectedCategory}}\\n                    @onUpdateCategory={{this.onUpdateCategory}}\\n                    @onShowCoinDetail={{this.onShowCoinDetail}}\\n                    @onSelected={{this.onTxSelected}}\\n                    @secretMode={{this.amountsHidden}}\\n                    @selected={{call (fn this.isTxSelected tx)}}\\n                    @tx={{tx}}\\n                  />\\n                </tr>\\n              {{/each}}\\n            {{else}}\\n              {{! data is empty, so display empty line }}\\n              <tr class=\\\"line-height-tx none\\\">\\n                <td colspan=\\\"11\\\">\\n                  AUCUNE TRANSACTION\\n                </td>\\n              </tr>\\n            {{/if}}\\n          {{/if}}\\n        </tbody>\\n      </table>\\n    </div>\\n  </div>\\n</div>\\n\\n{{! OFFCANVAS for Filters HTML }}\\n<Bs::Offcanvas @id=\\\"offcanvas-filter\\\" @open={{this.offcanvasFilterVisible}}>\\n  <Bs::Offcanvas::Header>\\n    <h5 class=\\\"offcanvas-title\\\" id=\\\"offcanvasFilterLabel\\\">FILTRER PAR :</h5>\\n    <button\\n      type=\\\"button\\\"\\n      class=\\\"btn-close text-reset\\\"\\n      aria-label=\\\"Close\\\"\\n      {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n    ></button>\\n  </Bs::Offcanvas::Header>\\n  <Bs::Offcanvas::Body>\\n    <div class=\\\"d-flex m-2 flex-column justify-content-center mb-4\\\">\\n      <Calendar @dates={{@selectedDates}} @onChange={{this.selectDates}} />\\n    </div>\\n    <div class=\\\"d-flex flex-column m-2 mt-4 mb-4\\\">\\n      <label for=\\\"wallet-select\\\">Portefeuilles</label>\\n      {{! template-lint-disable require-input-label }}\\n      <select\\n        name=\\\"wallets\\\"\\n        id=\\\"wallet-select\\\"\\n        class=\\\"form-select\\\"\\n        aria-label=\\\"multiple select wallets\\\"\\n        multiple\\n        size=\\\"4\\\"\\n        {{on \\\"change\\\" this.selectWallet}}\\n      >\\n        {{#if this.hasSelectedWallet}}\\n          <option value=\\\"all\\\">--Tout--</option>\\n        {{else}}\\n          <option value=\\\"all\\\" selected>--Tout--</option>\\n        {{/if}}\\n        {{#each this.walletOptions as |walletOption|}}\\n          {{#if walletOption.selected}}\\n            <option selected value={{walletOption.name}}>{{walletOption.name}}</option>\\n          {{else}}\\n            <option value={{walletOption.name}}>{{walletOption.name}}</option>\\n          {{/if}}\\n        {{/each}}\\n      </select>\\n    </div>\\n    <div class=\\\"d-flex flex-column m-2 mt-4 mb-4\\\">\\n      <div class=\\\"d-flex flex-column\\\">\\n        <label for=\\\"categ-select\\\">Catégories</label>\\n        {{! template-lint-disable require-input-label }}\\n        <select\\n          name=\\\"categ\\\"\\n          multiple\\n          size=\\\"5\\\"\\n          id=\\\"categ-select\\\"\\n          class=\\\"form-select\\\"\\n          aria-label=\\\"multiple select categ\\\"\\n          {{on \\\"change\\\" this.selectCategory}}\\n        >\\n          {{#if this.hasSelectedCategory}}\\n            <option value=\\\"all\\\">--Toutes--</option>\\n          {{else}}\\n            <option value=\\\"all\\\" selected>--Toutes--</option>\\n          {{/if}}\\n          {{#each this.categoryOptions as |categoryOption|}}\\n            {{#if categoryOption.selected}}\\n              <option selected value={{categoryOption.name}}>{{categoryOption.name}}</option>\\n            {{else}}\\n              <option value={{categoryOption.name}}>{{categoryOption.name}}</option>\\n            {{/if}}\\n          {{/each}}\\n        </select>\\n      </div>\\n    </div>\\n    <div class=\\\"d-flex flex-column m-2\\\">\\n      <div class=\\\"d-flex flex-column\\\">\\n        <label for=\\\"coin-select\\\">Coins</label>\\n        {{! template-lint-disable require-input-label }}\\n        <select\\n          name=\\\"coin\\\"\\n          multiple\\n          size=\\\"6\\\"\\n          id=\\\"coin-select\\\"\\n          class=\\\"form-select\\\"\\n          aria-label=\\\"multiple select coins\\\"\\n          {{on \\\"change\\\" this.selectCoin}}\\n        >\\n          {{#if this.hasSelectedCoin}}\\n            <option value=\\\"all\\\">--Tout--</option>\\n          {{else}}\\n            <option value=\\\"all\\\" selected>--Tout--</option>\\n          {{/if}}\\n          {{#each this.coinOptions as |coinOption|}}\\n            {{#if coinOption.selected}}\\n              <option selected value={{coinOption.name}}>{{coinOption.name}}</option>\\n            {{else}}\\n              <option value={{coinOption.name}}>{{coinOption.name}}</option>\\n            {{/if}}\\n          {{/each}}\\n        </select>\\n      </div>\\n    </div>\\n  </Bs::Offcanvas::Body>\\n</Bs::Offcanvas>\",\"moduleName\":\"cryptofiscafacile-gui/components/tx-table/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/tx-table/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport { SortOrder } from 'cryptofiscafacile-gui/enums/sort-order';\nimport Sorts from 'cryptofiscafacile-gui/utils/sorts';\nimport Transactions from 'cryptofiscafacile-gui/utils/transactions';\nimport { tracked } from 'tracked-built-ins';\n\nimport Option from '../option';\nimport PageSizeModifier from './page-size-modifier';\n\nimport type WasmService from 'cryptofiscafacile-gui/app/services/wasm';\nimport type { Transaction } from 'cryptofiscafacile-wasm';\n\ninterface TxTableArgs {\n  catSortOrder: SortOrder;\n  dateSortOrder: SortOrder;\n  pfSortOrder: SortOrder;\n  userPage: number;\n  pageSize?: number;\n  searchedItem: string;\n  selectedCategory: string[];\n  selectedCoins: string[];\n  selectedDates: Date[];\n  selectedWallet: string[];\n  onCatSortOrderChanged: (value: SortOrder) => void;\n  onDateSortOrderChanged: (value: SortOrder) => void;\n  onPfSortOrderChanged: (value: SortOrder) => void;\n  onUserPageChanged: (value: number) => void;\n  onPageSizeChanged: (value: number) => void;\n  onSelectedCategoryChanged: (values: string[]) => void;\n  onSelectedCoinsChanged: (values: string[]) => void;\n  onSelectedDatesChanged: (values: Date[]) => void;\n  onSelectedWalletChanged: (values: string[]) => void;\n  onSearchedItemChanged: (value: string) => void;\n}\n\nexport default class TxTable extends Component<TxTableArgs> {\n  @service declare wasm: WasmService;\n\n  @tracked defaultPageSize = 10;\n\n  @tracked amountsHidden = false;\n\n  @tracked coinDetailModalSymbol = '';\n  @tracked coinDetailModalVisible = false;\n\n  selectedTxs: Set<Transaction> = tracked(new Set<Transaction>());\n\n  pageSizeModifier = PageSizeModifier;\n\n  get categories() {\n    const allCategories = this.wasm.transactions.map((tx) => tx.category);\n\n    return [...new Set(allCategories)].sort((c1, c2) => c1.localeCompare(c2));\n  }\n\n  get categoryOptions() {\n    return this.categories.map((c) => new Option(c, this.args.selectedCategory.includes(c)));\n  }\n\n  get hasSelectedCategory() {\n    return this.categoryOptions.some((w) => w.selected);\n  }\n\n  get coins() {\n    const allCoins = [\n      ...this.wasm.transactions.flatMap((tx) => tx.to),\n      ...this.wasm.transactions.flatMap((tx) => tx.from),\n      ...this.wasm.transactions.flatMap((tx) => tx.fee),\n    ].map((value) => value.currency);\n\n    return [...new Set(allCoins)].sort((c1, c2) => c1.localeCompare(c2));\n  }\n\n  get coinOptions() {\n    return this.coins.map((c) => new Option(c, this.args.selectedCoins.includes(c)));\n  }\n\n  get hasSelectedCoin() {\n    return this.coinOptions.some((w) => w.selected);\n  }\n\n  get wallets() {\n    const allWallets = this.wasm.transactions.map((tx) => tx.wallet);\n\n    return [...new Set(allWallets)].sort((w1, w2) => w1.localeCompare(w2));\n  }\n\n  get walletOptions() {\n    return this.wallets.map((w) => new Option(w, this.args.selectedWallet.includes(w)));\n  }\n\n  get hasSelectedWallet() {\n    return this.walletOptions.some((w) => w.selected);\n  }\n\n  get totalTx() {\n    return this.sortedTransactions.length;\n  }\n\n  get filteredTransactions() {\n    let filteredTransactions = this.#filterTransactionsOnSelectedCategory(this.wasm.transactions);\n\n    filteredTransactions = this.#filterTransactionsOnSelectedCoins(filteredTransactions);\n\n    filteredTransactions = this.#filterTransactionsOnSelectedDates(filteredTransactions);\n\n    filteredTransactions = this.#filterTransactionsOnSelectedWallet(filteredTransactions);\n\n    //SEARCHING PARTS\n    filteredTransactions = this.#filterTransactionsOnSearchItem(filteredTransactions);\n\n    return filteredTransactions;\n  }\n\n  get isFecthingTransactions() {\n    return this.wasm.getTransactionsTask.isRunning;\n  }\n\n  #filterTransactionsOnSelectedCoins(transactions: Transaction[]) {\n    if (this.args.selectedCoins.includes(Option.ALL)) {\n      return transactions;\n    } else {\n      return transactions.filter((tx) => this.#getCoins(tx).find((c) => this.args.selectedCoins.includes(c)));\n    }\n  }\n\n  #getCoins(transaction: Transaction) {\n    return [\n      ...new Set([\n        ...transaction.fee.flatMap((value) => value.currency),\n        ...transaction.from.flatMap((value) => value.currency),\n        ...transaction.to.flatMap((value) => value.currency),\n      ]),\n    ];\n  }\n\n  #filterTransactionsOnSelectedCategory(transactions: Transaction[]) {\n    if (this.args.selectedCategory.includes(Option.ALL)) {\n      return transactions;\n    } else {\n      return transactions.filter((tx) => this.args.selectedCategory.includes(tx.category));\n    }\n  }\n\n  #filterTransactionsOnSelectedDates(transactions: Transaction[]) {\n    const fromDate = this.args.selectedDates[0];\n    const toDate = this.args.selectedDates[1];\n\n    if (this.args.selectedDates.length === 0 || !fromDate || !toDate) {\n      return transactions;\n    } else {\n      return transactions.filter((tx) => tx.date >= fromDate && tx.date <= toDate);\n    }\n  }\n\n  #filterTransactionsOnSelectedWallet(transactions: Transaction[]) {\n    if (this.args.selectedWallet.includes(Option.ALL)) {\n      return transactions;\n    } else {\n      return transactions.filter((tx) => this.args.selectedWallet.includes(tx.wallet));\n    }\n  }\n\n  get sortedTransactions() {\n    if (this.args.catSortOrder !== SortOrder.NONE) {\n      return this.filteredTransactions\n        .slice()\n        .sort(Sorts.text((tx: Transaction) => tx.category, this.args.catSortOrder));\n    }\n\n    if (this.args.dateSortOrder !== SortOrder.NONE) {\n      return this.filteredTransactions.slice().sort(Sorts.date((tx: Transaction) => tx.date, this.args.dateSortOrder));\n    }\n\n    if (this.args.pfSortOrder !== SortOrder.NONE) {\n      return this.filteredTransactions.slice().sort(Sorts.text((tx: Transaction) => tx.wallet, this.args.pfSortOrder));\n    }\n\n    return this.filteredTransactions;\n  }\n\n  get pageSortedTransactions() {\n    return this.sortedTransactions\n      ? this.sortedTransactions.slice((this.page - 1) * this.pageSize, this.page * this.pageSize)\n      : [];\n  }\n\n  get maxPage() {\n    return Math.max(1, Math.ceil(this.sortedTransactions.length / this.pageSize));\n  }\n\n  get page() {\n    return Math.min(this.maxPage, this.args.userPage);\n  }\n\n  get pageSize() {\n    return this.args.pageSize ?? this.defaultPageSize;\n  }\n\n  @action\n  onUserPageChanged(page: number): void {\n    this.args.onUserPageChanged(page);\n    this.selectedTxs.clear();\n  }\n\n  @action\n  setPageSize(e: { target: HTMLSelectElement }) {\n    this.args.onPageSizeChanged(Number(e.target.value));\n  }\n\n  @action\n  setDefaultPageSizeNumber(pageSize: number) {\n    this.defaultPageSize = pageSize;\n  }\n\n  @action\n  toggleAmountsHidden() {\n    this.amountsHidden = !this.amountsHidden;\n  }\n\n  @action\n  sortCat(currentOrder: SortOrder) {\n    this.args.onDateSortOrderChanged(SortOrder.NONE);\n    this.args.onPfSortOrderChanged(SortOrder.NONE);\n    this.args.onCatSortOrderChanged(currentOrder === SortOrder.DESC ? SortOrder.ASC : SortOrder.DESC);\n  }\n\n  @action\n  sortDate(currentOrder: SortOrder) {\n    this.args.onPfSortOrderChanged(SortOrder.NONE);\n    this.args.onCatSortOrderChanged(SortOrder.NONE);\n    this.args.onDateSortOrderChanged(currentOrder === SortOrder.DESC ? SortOrder.ASC : SortOrder.DESC);\n  }\n\n  @action\n  sortPf(currentOrder: SortOrder) {\n    this.args.onDateSortOrderChanged(SortOrder.NONE);\n    this.args.onCatSortOrderChanged(SortOrder.NONE);\n    this.args.onPfSortOrderChanged(currentOrder === SortOrder.DESC ? SortOrder.ASC : SortOrder.DESC);\n  }\n\n  @action\n  selectCategory(e: { target: HTMLSelectElement }) {\n    this.args.onSelectedCategoryChanged(Array.from(e.target.selectedOptions).map((elt) => elt.value));\n    this.onUserPageChanged(1);\n  }\n\n  @action\n  selectCoin(e: { target: HTMLSelectElement }) {\n    this.args.onSelectedCoinsChanged(Array.from(e.target.selectedOptions).map((elt) => elt.value));\n    this.onUserPageChanged(1);\n  }\n\n  @action\n  selectDates(dates: Date[]) {\n    this.args.onSelectedDatesChanged(dates);\n    this.onUserPageChanged(1);\n  }\n\n  @action\n  selectWallet(e: { target: HTMLSelectElement }) {\n    this.args.onSelectedWalletChanged(Array.from(e.target.selectedOptions).map((elt) => elt.value));\n    this.onUserPageChanged(1);\n  }\n\n  /**\n   * SEARCHING PART\n   */\n  #filterTransactionsOnSearchItem(transactions: Transaction[]) {\n    if (this.args.searchedItem.length === 0) {\n      return transactions;\n    } else {\n      const searchString = this.args.searchedItem\n        .toLowerCase()\n        .normalize('NFD')\n        .replace(/\\p{Diacritic}/gu, '');\n\n      return transactions.filter(\n        (tx) =>\n          this.#getCoins(tx).find((c) =>\n            c\n              .toLowerCase()\n              .normalize('NFD')\n              .replace(/\\p{Diacritic}/gu, '')\n              .includes(searchString),\n          ) ||\n          tx['category']\n            .toLowerCase()\n            .normalize('NFD')\n            .replace(/\\p{Diacritic}/gu, '')\n            .includes(searchString) ||\n          tx['wallet']\n            .toLowerCase()\n            .normalize('NFD')\n            .replace(/\\p{Diacritic}/gu, '')\n            .includes(searchString),\n      );\n    }\n  }\n\n  @action\n  searchItem(e: { target: HTMLSelectElement }) {\n    this.args.onSearchedItemChanged(e.target.value);\n    this.onUserPageChanged(1);\n  }\n\n  /**\n   * Coin detail modal\n   */\n  @action\n  onShowCoinDetail(symbol: string) {\n    this.coinDetailModalSymbol = symbol;\n    this.coinDetailModalVisible = true;\n  }\n\n  @action\n  onCoinDetailModalHidden() {\n    this.coinDetailModalSymbol = '';\n    this.coinDetailModalVisible = false;\n  }\n\n  /**\n   * UPDATE CATEG PART\n   */\n  @tracked updateCategoryModalVisible = false;\n  @tracked updateCategoryTxs: Transaction[] = [];\n\n  @action\n  onUpdateCategory(tx: Transaction) {\n    this.updateCategoryTxs = [tx];\n    this.updateCategoryModalVisible = true;\n  }\n\n  @action\n  onMultiUpdateCategory() {\n    this.updateCategoryTxs = this.visibleSelectedTxs;\n    this.updateCategoryModalVisible = true;\n  }\n\n  @action\n  onUpdateCategoryModalHidden() {\n    this.updateCategoryModalVisible = false;\n    this.updateCategoryTxs = [];\n  }\n\n  // Multi selection\n  get visibleSelectedTxs() {\n    return [...this.selectedTxs.keys()].filter((tx) => this.pageSortedTransactions.includes(tx));\n  }\n\n  get selectedCategory() {\n    return this.visibleSelectedTxs[0]?.category;\n  }\n\n  @action\n  isTxSelected(tx: Transaction) {\n    return this.selectedTxs.has(tx);\n  }\n\n  @action\n  onTxSelected(tx: Transaction, checked: boolean) {\n    if (checked) {\n      this.selectedTxs.add(tx);\n    } else {\n      this.selectedTxs.delete(tx);\n    }\n  }\n\n  get allSelectionIndeterminate() {\n    const selectedCategory = this.selectedCategory;\n\n    if (selectedCategory) {\n      const sameCategoryCategorizableTxs = this.pageSortedTransactions.filter(\n        (tx) => Transactions.isUserCategorizable(tx) && tx.category === selectedCategory,\n      );\n\n      return sameCategoryCategorizableTxs.length !== this.visibleSelectedTxs.length;\n    }\n\n    return false;\n  }\n\n  get allTxsSelected() {\n    const selectedCategory = this.selectedCategory;\n\n    if (selectedCategory) {\n      const sameCategoryCategorizableTxs = this.pageSortedTransactions.filter(\n        (tx) => Transactions.isUserCategorizable(tx) && tx.category === selectedCategory,\n      );\n\n      return sameCategoryCategorizableTxs.length === this.visibleSelectedTxs.length;\n    }\n\n    return false;\n  }\n\n  set allTxsSelected(checked: boolean) {\n    if (checked) {\n      const categorizableTxs = this.pageSortedTransactions.filter((tx) => Transactions.isUserCategorizable(tx));\n\n      if (categorizableTxs.length > 0) {\n        if (!this.selectedCategory && categorizableTxs[0]) {\n          this.selectedTxs.add(categorizableTxs[0]);\n        }\n\n        const selectedCategory = this.selectedCategory;\n\n        if (selectedCategory) {\n          categorizableTxs.filter((tx) => tx.category === selectedCategory).forEach((tx) => this.selectedTxs.add(tx));\n        }\n      }\n    } else {\n      this.selectedTxs.clear();\n    }\n  }\n}\n","import Modifier from 'ember-modifier';\n\nimport type { PositionalArgs } from 'ember-modifier';\n\ninterface DefaultPageSizeModifierSignature {\n  Args: {\n    Positional: [(pageSize: number) => void];\n  };\n}\n\nexport default class PageSizeModifierModifier extends Modifier<DefaultPageSizeModifierSignature> {\n  didSetup = false;\n\n  modify(element: Element, [setPageSize]: PositionalArgs<DefaultPageSizeModifierSignature>) {\n    if (!this.didSetup) {\n      if (element.clientWidth >= 992 && element.clientWidth < 1920) {\n        setPageSize(10);\n      } else if (element.clientWidth >= 1920 && element.clientWidth < 2560) {\n        setPageSize(20);\n      } else if (element.clientWidth >= 2560 && element.clientWidth < 3840) {\n        setPageSize(30);\n      } else if (element.clientWidth >= 3840) {\n        setPageSize(40);\n      }\n\n      this.didSetup = true;\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsButton\\n  data-test-categ-update-button\\n  @type=\\\"none\\\"\\n  class=\\\"p-0 pb-1 mx-1 shadow-none\\\"\\n  {{on \\\"click\\\" @onClick}}\\n  {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n>\\n  <App::Icon @icon=\\\"ion:build\\\" @color=\\\"rgba(230, 193, 110, 0.75)\\\" width=\\\"20\\\" />\\n  <BsTooltip @placement=\\\"right\\\" @triggerEvents=\\\"hover\\\">Modifier la catégorie</BsTooltip>\\n</BsButton>\", {\"contents\":\"<BsButton\\n  data-test-categ-update-button\\n  @type=\\\"none\\\"\\n  class=\\\"p-0 pb-1 mx-1 shadow-none\\\"\\n  {{on \\\"click\\\" @onClick}}\\n  {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n>\\n  <App::Icon @icon=\\\"ion:build\\\" @color=\\\"rgba(230, 193, 110, 0.75)\\\" width=\\\"20\\\" />\\n  <BsTooltip @placement=\\\"right\\\" @triggerEvents=\\\"hover\\\">Modifier la catégorie</BsTooltip>\\n</BsButton>\",\"moduleName\":\"cryptofiscafacile-gui/components/tx-table/tx-item/categ-update-button.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/tx-table/tx-item/categ-update-button.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsButton\\n  data-test-change-fiat-button\\n  @type=\\\"none\\\"\\n  class=\\\"p-0 pb-1 mx-1 shadow-none\\\"\\n  {{on \\\"click\\\" this.modalVal}}\\n  {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n>\\n  <App::Icon @icon=\\\"ion:calculator\\\" @color=\\\"rgba(230, 193, 110, 0.75)\\\" width=\\\"20\\\" />\\n  <BsTooltip @placement=\\\"top\\\" @triggerEvents=\\\"hover\\\">Modifier contre-valeur FIAT</BsTooltip>\\n</BsButton>\\n\\n{{! NEW MODALS}}\\n<BsModal\\n  @open={{this.changeModal}}\\n  @backdropClose={{false}}\\n  @onSubmit={{this.modifyFiat}}\\n  @onHidden={{this.close}}\\n  as |modal|\\n>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">Modifier Contre-valeur FIAT</h4>\\n    </modal.header>\\n    <modal.body>\\n      <label for=\\\"modifyFiat\\\" class=\\\"form-label\\\">Nouvelle(s) valeur(s) :</label>\\n      {{#each @values as |value|}}\\n        <TxTable::TxItem::ChangeFiat::InputFiat\\n          @value={{value}}\\n          @onChange={{this.selectedValue}}\\n          @invalid={{this.isInvalid}}\\n        />\\n      {{/each}}\\n    </modal.body>\\n    <modal.footer>\\n      {{#if this.toConfirm}}\\n        <BsButton class=\\\"btn btn-primary\\\" @onClick={{this.modifyFiat}}>Modifier</BsButton>\\n      {{else}}\\n        <div>\\n          <BsTooltip @placement=\\\"left\\\">Vous devez modifier la valeur avant de confirmer...</BsTooltip>\\n          <BsButton class=\\\"btn btn-secondary\\\" @disabled={{true}} @onClick={{this.modifyFiatValid}}>Modifier</BsButton>\\n        </div>\\n      {{/if}}\\n      <BsButton @onClick={{this.close}}>Annuler</BsButton>\\n    </modal.footer>\\n  </div>\\n</BsModal>\", {\"contents\":\"<BsButton\\n  data-test-change-fiat-button\\n  @type=\\\"none\\\"\\n  class=\\\"p-0 pb-1 mx-1 shadow-none\\\"\\n  {{on \\\"click\\\" this.modalVal}}\\n  {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n>\\n  <App::Icon @icon=\\\"ion:calculator\\\" @color=\\\"rgba(230, 193, 110, 0.75)\\\" width=\\\"20\\\" />\\n  <BsTooltip @placement=\\\"top\\\" @triggerEvents=\\\"hover\\\">Modifier contre-valeur FIAT</BsTooltip>\\n</BsButton>\\n\\n{{! NEW MODALS}}\\n<BsModal\\n  @open={{this.changeModal}}\\n  @backdropClose={{false}}\\n  @onSubmit={{this.modifyFiat}}\\n  @onHidden={{this.close}}\\n  as |modal|\\n>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">Modifier Contre-valeur FIAT</h4>\\n    </modal.header>\\n    <modal.body>\\n      <label for=\\\"modifyFiat\\\" class=\\\"form-label\\\">Nouvelle(s) valeur(s) :</label>\\n      {{#each @values as |value|}}\\n        <TxTable::TxItem::ChangeFiat::InputFiat\\n          @value={{value}}\\n          @onChange={{this.selectedValue}}\\n          @invalid={{this.isInvalid}}\\n        />\\n      {{/each}}\\n    </modal.body>\\n    <modal.footer>\\n      {{#if this.toConfirm}}\\n        <BsButton class=\\\"btn btn-primary\\\" @onClick={{this.modifyFiat}}>Modifier</BsButton>\\n      {{else}}\\n        <div>\\n          <BsTooltip @placement=\\\"left\\\">Vous devez modifier la valeur avant de confirmer...</BsTooltip>\\n          <BsButton class=\\\"btn btn-secondary\\\" @disabled={{true}} @onClick={{this.modifyFiatValid}}>Modifier</BsButton>\\n        </div>\\n      {{/if}}\\n      <BsButton @onClick={{this.close}}>Annuler</BsButton>\\n    </modal.footer>\\n  </div>\\n</BsModal>\",\"moduleName\":\"cryptofiscafacile-gui/components/tx-table/tx-item/change-fiat/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/tx-table/tx-item/change-fiat/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\nimport type { TxValue } from 'cryptofiscafacile-wasm';\n\ninterface TxTableTxItemChangeFiatArgs {\n  id: string;\n  values: TxValue[];\n  type: string;\n}\n\nexport default class TxTableTxItemChangeFiat extends Component<TxTableTxItemChangeFiatArgs> {\n  @service declare wasm: WasmService;\n\n  @tracked fiatValue: number[] = [];\n  @tracked changeModal = false;\n  @tracked toConfirm = false;\n\n  @tracked isInvalid = '';\n\n  @action\n  selectedValue(val: number, oldValue: number) {\n    if (val !== 0 && oldValue !== 0) {\n      this.fiatValue = this.fiatValue.map((v) => {\n        if (oldValue === v) {\n          return val;\n        } else {\n          return v;\n        }\n      });\n      this.toConfirm = true;\n      this.isInvalid = '';\n    } else {\n      this.toConfirm = false;\n    }\n  }\n\n  @action\n  modalVal() {\n    this.args.values.forEach((element) => {\n      this.fiatValue.push(element.quantity);\n    });\n\n    this.changeModal = true;\n  }\n\n  @action\n  async modifyFiat() {\n    this.changeModal = false;\n    debug('Modify fiat for transaction with id : ' + this.args.id + ' with value : ' + this.fiatValue);\n\n    try {\n      await this.wasm.setValueTask.perform(this.args.id, this.fiatValue);\n      await this.wasm.getTransactionsTask.perform();\n    } catch (error) {\n      debug('Modification of fiat : ' + (error as Error).message);\n    }\n  }\n  @action\n  modifyFiatValid() {\n    this.isInvalid = 'is-invalid';\n  }\n\n  @action\n  close() {\n    this.changeModal = false;\n    this.fiatValue = [];\n    this.toConfirm = false;\n    this.isInvalid = '';\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"input-group mb-3 w-50\\\">\\n  {{! template-lint-disable require-input-label }}\\n  <input\\n    type=\\\"number\\\"\\n    id=\\\"modifyFiat\\\"\\n    name=\\\"modifyFiat\\\"\\n    class=\\\"form-control ps-2 {{@invalid}}\\\"\\n    step=\\\"0.01\\\"\\n    placeholder={{format-number @value.quantity maximumFractionDigits=\\\"2\\\"}}\\n    aria-label=\\\"Amount (to the nearest)\\\"\\n    {{on \\\"change\\\" this.updateValue}}\\n  />\\n  <span class=\\\"input-group-text\\\">\\n    {{@value.currency}}\\n  </span>\\n</div>\", {\"contents\":\"<div class=\\\"input-group mb-3 w-50\\\">\\n  {{! template-lint-disable require-input-label }}\\n  <input\\n    type=\\\"number\\\"\\n    id=\\\"modifyFiat\\\"\\n    name=\\\"modifyFiat\\\"\\n    class=\\\"form-control ps-2 {{@invalid}}\\\"\\n    step=\\\"0.01\\\"\\n    placeholder={{format-number @value.quantity maximumFractionDigits=\\\"2\\\"}}\\n    aria-label=\\\"Amount (to the nearest)\\\"\\n    {{on \\\"change\\\" this.updateValue}}\\n  />\\n  <span class=\\\"input-group-text\\\">\\n    {{@value.currency}}\\n  </span>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/tx-table/tx-item/change-fiat/input-fiat.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/tx-table/tx-item/change-fiat/input-fiat.hbs\"}});\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\n\nimport type { TxValue } from 'cryptofiscafacile-wasm';\n\ninterface TxTableTxItemChangeFiatInputFiatArgs {\n  value: TxValue;\n  onChange: (values: number, old: number) => void;\n}\n\nexport default class TxTableTxItemChangeFiatInputFiat extends Component<TxTableTxItemChangeFiatInputFiatArgs> {\n  @action\n  updateValue(e: { target: HTMLInputElement }) {\n    if (e.target.value) {\n      this.args.onChange(Number(e.target.value), this.args.value.quantity);\n    } else {\n      this.args.onChange(0, 0);\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<td>\\n  {{#if this.checkable}}\\n    {{#if this.checkableDisabled}}\\n      <Input\\n        @type=\\\"checkbox\\\"\\n        @checked={{@selected}}\\n        class=\\\"form-check-input mt-0\\\"\\n        disabled={{this.checkableDisabled}}\\n        id={{this.checkableId}}\\n        {{on \\\"change\\\" this.onSelect}}\\n      />\\n    {{else}}\\n      <Input\\n        @type=\\\"checkbox\\\"\\n        @checked={{@selected}}\\n        class=\\\"form-check-input mt-0\\\"\\n        id={{this.checkableId}}\\n        {{on \\\"change\\\" this.onSelect}}\\n      />\\n    {{/if}}\\n  {{/if}}\\n</td>\\n<td>{{format-date @tx.date}} {{format-time @tx.date format=\\\"hhmmss\\\"}}</td>\\n<td>\\n  <div class=\\\"flex\\\">\\n    {{@tx.wallet}}\\n    {{#if @tx.note}}\\n      <span class=\\\"d-inline-block ms-1\\\">\\n        <App::Icon {{on \\\"click\\\" this.onCopy}} @icon=\\\"ion:information-circle-outline\\\" width=\\\"15\\\" />\\n        <BsTooltip @placement=\\\"top\\\" @viewportSelector=\\\"table\\\">{{@tx.note}}</BsTooltip>\\n      </span>\\n    {{/if}}\\n  </div>\\n</td>\\n<td>\\n  <div class=\\\"d-flex\\\">\\n    {{#if (eq @tx.category \\\"Ignoré\\\")}}\\n      <div class=\\\"categ-layout-ignored\\\">\\n        {{@tx.category}}\\n      </div>\\n    {{else if (eq @tx.category \\\"Dépôt\\\")}}\\n      <div class=\\\"categ-layout-depwith\\\">\\n        {{@tx.category}}\\n      </div>\\n    {{else if (eq @tx.category \\\"Retrait\\\")}}\\n      <div class=\\\"categ-layout-depwith\\\">\\n        {{@tx.category}}\\n      </div>\\n    {{else if (eq @tx.category \\\"Inconnu\\\")}}\\n      <div class=\\\"categ-layout-unknown\\\">\\n        {{@tx.category}}\\n      </div>\\n    {{else if (eq @tx.category \\\"ICO\\\")}}\\n      <div class=\\\"categ-layout-ico\\\">\\n        {{@tx.category}}\\n      </div>\\n    {{else}}\\n      <div class=\\\"categ-layout\\\">\\n        {{@tx.category}}\\n      </div>\\n    {{/if}}\\n  </div>\\n</td>\\n<TxTable::TxItem::TxValues @values={{@tx.from}} @onShowCoinDetail={{@onShowCoinDetail}} @secretMode={{@secretMode}} />\\n<TxTable::TxItem::TxValues @values={{@tx.to}} @onShowCoinDetail={{@onShowCoinDetail}} @secretMode={{@secretMode}} />\\n<TxTable::TxItem::TxValues @values={{@tx.fee}} @onShowCoinDetail={{@onShowCoinDetail}} @secretMode={{@secretMode}} />\\n<td>\\n  <div class=\\\"d-flex\\\">\\n    {{! template-lint-disable no-duplicate-id }}\\n    {{#if (eq @tx.category \\\"Retrait\\\")}}\\n      <TxTable::TxItem::CategUpdateButton @onClick={{this.onUpdateCategory}} />\\n    {{else if (eq @tx.category \\\"Dépôt\\\")}}\\n      <TxTable::TxItem::CategUpdateButton @onClick={{this.onUpdateCategory}} />\\n    {{else if (eq @tx.category \\\"Ignoré\\\")}}\\n      <div>\\n        <TxTable::TxItem::LineStatus\\n          @id={{@tx.id}}\\n          @status={{\\\"secondary\\\"}}\\n          @title={{\\\"Transaction qui ne sera pas prise en compte dans les calculs d'imposition\\\"}}\\n          @text={{\\\"Dés.\\\"}}\\n        />\\n      </div>\\n      <div>\\n        {{#if (eq @tx.original_category \\\"Dépôt\\\")}}\\n          <TxTable::TxItem::CategUpdateButton @onClick={{this.onUpdateCategory}} />\\n        {{else if (eq @tx.original_category \\\"Retrait\\\")}}\\n          <TxTable::TxItem::CategUpdateButton @onClick={{this.onUpdateCategory}} />\\n        {{/if}}\\n      </div>\\n    {{else if (eq @tx.category \\\"Inconnu\\\")}}\\n      <TxTable::TxItem::LineStatus\\n        @id={{@tx.id}}\\n        @status={{\\\"danger\\\"}}\\n        @title={{\\\"Transaction à valider avant tout calcul pour votre imposition\\\"}}\\n        @text={{\\\"X\\\"}}\\n      />\\n    {{else}}\\n      {{#if (eq @tx.original_category \\\"Dépôt\\\")}}\\n        <div>\\n          <TxTable::TxItem::LineStatus\\n            @id={{@tx.id}}\\n            @status={{\\\"success\\\"}}\\n            @title={{\\\"Transaction acceptée\\\"}}\\n            @text={{\\\"OK\\\"}}\\n          />\\n        </div>\\n        {{#if (eq @tx.category \\\"CashIn\\\")}}\\n          <div>\\n            <TxTable::TxItem::ChangeFiat @id={{@tx.id}} @values={{@tx.from}} />\\n          </div>\\n        {{else if (eq @tx.category \\\"CashOut\\\")}}\\n          <div>\\n            <TxTable::TxItem::ChangeFiat @id={{@tx.id}} @values={{@tx.to}} />\\n          </div>\\n        {{/if}}\\n        <div>\\n          <TxTable::TxItem::CategUpdateButton @onClick={{this.onUpdateCategory}} />\\n        </div>\\n      {{else if (eq @tx.original_category \\\"Retrait\\\")}}\\n        <div>\\n          <TxTable::TxItem::LineStatus\\n            @id={{@tx.id}}\\n            @status={{\\\"success\\\"}}\\n            @title={{\\\"Transaction acceptée\\\"}}\\n            @text={{\\\"OK\\\"}}\\n          />\\n        </div>\\n        {{#if (eq @tx.category \\\"CashIn\\\")}}\\n          <div>\\n            <TxTable::TxItem::ChangeFiat @id={{@tx.id}} @values={{@tx.from}} />\\n          </div>\\n        {{else if (eq @tx.category \\\"CashOut\\\")}}\\n          <div>\\n            <TxTable::TxItem::ChangeFiat @id={{@tx.id}} @values={{@tx.to}} />\\n          </div>\\n        {{/if}}\\n        <div>\\n          <TxTable::TxItem::CategUpdateButton @onClick={{this.onUpdateCategory}} />\\n        </div>\\n      {{else}}\\n        <div>\\n          <TxTable::TxItem::LineStatus\\n            @id={{@tx.id}}\\n            @status={{\\\"success\\\"}}\\n            @title={{\\\"Transaction acceptée\\\"}}\\n            @text={{\\\"OK\\\"}}\\n          />\\n        </div>\\n        {{#if (eq @tx.category \\\"CashIn\\\")}}\\n          <div>\\n            <TxTable::TxItem::ChangeFiat @id={{@tx.id}} @values={{@tx.from}} />\\n          </div>\\n        {{else if (eq @tx.category \\\"CashOut\\\")}}\\n          <div>\\n            <TxTable::TxItem::ChangeFiat @id={{@tx.id}} @values={{@tx.to}} />\\n          </div>\\n        {{/if}}\\n      {{/if}}\\n    {{/if}}\\n\\n    {{#if @tx.merged}}\\n      <TxTable::TxItem::Unmerged @id={{@tx.id}} />\\n    {{/if}}\\n\\n    {{#if (eq @tx.category \\\"Retrait\\\")}}\\n      <span class=\\\"d-inline-block ms-1\\\">\\n        <App::Icon @icon=\\\"ion:alert-circle\\\" @color=\\\"red\\\" width=\\\"30\\\" />\\n        <BsTooltip @placement=\\\"top\\\" @viewportSelector=\\\"table\\\">TX RETRAIT :Transaction à identifier pour ne pas la\\n          traiter en Cashout dans les calculs d'imposition</BsTooltip>\\n      </span>\\n    {{else if (eq @tx.category \\\"Dépôt\\\")}}\\n      <span class=\\\"d-inline-block ms-1\\\">\\n        <App::Icon @icon=\\\"ion:alert-circle\\\" @color=\\\"red\\\" width=\\\"30\\\" />\\n        <BsTooltip @placement=\\\"top\\\" @viewportSelector=\\\"table\\\">TX DEPOT : Transaction à identifier pour ne pas la traiter\\n          en Don dans les calculs d'imposition</BsTooltip>\\n      </span>\\n    {{/if}}\\n  </div>\\n</td>\", {\"contents\":\"<td>\\n  {{#if this.checkable}}\\n    {{#if this.checkableDisabled}}\\n      <Input\\n        @type=\\\"checkbox\\\"\\n        @checked={{@selected}}\\n        class=\\\"form-check-input mt-0\\\"\\n        disabled={{this.checkableDisabled}}\\n        id={{this.checkableId}}\\n        {{on \\\"change\\\" this.onSelect}}\\n      />\\n    {{else}}\\n      <Input\\n        @type=\\\"checkbox\\\"\\n        @checked={{@selected}}\\n        class=\\\"form-check-input mt-0\\\"\\n        id={{this.checkableId}}\\n        {{on \\\"change\\\" this.onSelect}}\\n      />\\n    {{/if}}\\n  {{/if}}\\n</td>\\n<td>{{format-date @tx.date}} {{format-time @tx.date format=\\\"hhmmss\\\"}}</td>\\n<td>\\n  <div class=\\\"flex\\\">\\n    {{@tx.wallet}}\\n    {{#if @tx.note}}\\n      <span class=\\\"d-inline-block ms-1\\\">\\n        <App::Icon {{on \\\"click\\\" this.onCopy}} @icon=\\\"ion:information-circle-outline\\\" width=\\\"15\\\" />\\n        <BsTooltip @placement=\\\"top\\\" @viewportSelector=\\\"table\\\">{{@tx.note}}</BsTooltip>\\n      </span>\\n    {{/if}}\\n  </div>\\n</td>\\n<td>\\n  <div class=\\\"d-flex\\\">\\n    {{#if (eq @tx.category \\\"Ignoré\\\")}}\\n      <div class=\\\"categ-layout-ignored\\\">\\n        {{@tx.category}}\\n      </div>\\n    {{else if (eq @tx.category \\\"Dépôt\\\")}}\\n      <div class=\\\"categ-layout-depwith\\\">\\n        {{@tx.category}}\\n      </div>\\n    {{else if (eq @tx.category \\\"Retrait\\\")}}\\n      <div class=\\\"categ-layout-depwith\\\">\\n        {{@tx.category}}\\n      </div>\\n    {{else if (eq @tx.category \\\"Inconnu\\\")}}\\n      <div class=\\\"categ-layout-unknown\\\">\\n        {{@tx.category}}\\n      </div>\\n    {{else if (eq @tx.category \\\"ICO\\\")}}\\n      <div class=\\\"categ-layout-ico\\\">\\n        {{@tx.category}}\\n      </div>\\n    {{else}}\\n      <div class=\\\"categ-layout\\\">\\n        {{@tx.category}}\\n      </div>\\n    {{/if}}\\n  </div>\\n</td>\\n<TxTable::TxItem::TxValues @values={{@tx.from}} @onShowCoinDetail={{@onShowCoinDetail}} @secretMode={{@secretMode}} />\\n<TxTable::TxItem::TxValues @values={{@tx.to}} @onShowCoinDetail={{@onShowCoinDetail}} @secretMode={{@secretMode}} />\\n<TxTable::TxItem::TxValues @values={{@tx.fee}} @onShowCoinDetail={{@onShowCoinDetail}} @secretMode={{@secretMode}} />\\n<td>\\n  <div class=\\\"d-flex\\\">\\n    {{! template-lint-disable no-duplicate-id }}\\n    {{#if (eq @tx.category \\\"Retrait\\\")}}\\n      <TxTable::TxItem::CategUpdateButton @onClick={{this.onUpdateCategory}} />\\n    {{else if (eq @tx.category \\\"Dépôt\\\")}}\\n      <TxTable::TxItem::CategUpdateButton @onClick={{this.onUpdateCategory}} />\\n    {{else if (eq @tx.category \\\"Ignoré\\\")}}\\n      <div>\\n        <TxTable::TxItem::LineStatus\\n          @id={{@tx.id}}\\n          @status={{\\\"secondary\\\"}}\\n          @title={{\\\"Transaction qui ne sera pas prise en compte dans les calculs d'imposition\\\"}}\\n          @text={{\\\"Dés.\\\"}}\\n        />\\n      </div>\\n      <div>\\n        {{#if (eq @tx.original_category \\\"Dépôt\\\")}}\\n          <TxTable::TxItem::CategUpdateButton @onClick={{this.onUpdateCategory}} />\\n        {{else if (eq @tx.original_category \\\"Retrait\\\")}}\\n          <TxTable::TxItem::CategUpdateButton @onClick={{this.onUpdateCategory}} />\\n        {{/if}}\\n      </div>\\n    {{else if (eq @tx.category \\\"Inconnu\\\")}}\\n      <TxTable::TxItem::LineStatus\\n        @id={{@tx.id}}\\n        @status={{\\\"danger\\\"}}\\n        @title={{\\\"Transaction à valider avant tout calcul pour votre imposition\\\"}}\\n        @text={{\\\"X\\\"}}\\n      />\\n    {{else}}\\n      {{#if (eq @tx.original_category \\\"Dépôt\\\")}}\\n        <div>\\n          <TxTable::TxItem::LineStatus\\n            @id={{@tx.id}}\\n            @status={{\\\"success\\\"}}\\n            @title={{\\\"Transaction acceptée\\\"}}\\n            @text={{\\\"OK\\\"}}\\n          />\\n        </div>\\n        {{#if (eq @tx.category \\\"CashIn\\\")}}\\n          <div>\\n            <TxTable::TxItem::ChangeFiat @id={{@tx.id}} @values={{@tx.from}} />\\n          </div>\\n        {{else if (eq @tx.category \\\"CashOut\\\")}}\\n          <div>\\n            <TxTable::TxItem::ChangeFiat @id={{@tx.id}} @values={{@tx.to}} />\\n          </div>\\n        {{/if}}\\n        <div>\\n          <TxTable::TxItem::CategUpdateButton @onClick={{this.onUpdateCategory}} />\\n        </div>\\n      {{else if (eq @tx.original_category \\\"Retrait\\\")}}\\n        <div>\\n          <TxTable::TxItem::LineStatus\\n            @id={{@tx.id}}\\n            @status={{\\\"success\\\"}}\\n            @title={{\\\"Transaction acceptée\\\"}}\\n            @text={{\\\"OK\\\"}}\\n          />\\n        </div>\\n        {{#if (eq @tx.category \\\"CashIn\\\")}}\\n          <div>\\n            <TxTable::TxItem::ChangeFiat @id={{@tx.id}} @values={{@tx.from}} />\\n          </div>\\n        {{else if (eq @tx.category \\\"CashOut\\\")}}\\n          <div>\\n            <TxTable::TxItem::ChangeFiat @id={{@tx.id}} @values={{@tx.to}} />\\n          </div>\\n        {{/if}}\\n        <div>\\n          <TxTable::TxItem::CategUpdateButton @onClick={{this.onUpdateCategory}} />\\n        </div>\\n      {{else}}\\n        <div>\\n          <TxTable::TxItem::LineStatus\\n            @id={{@tx.id}}\\n            @status={{\\\"success\\\"}}\\n            @title={{\\\"Transaction acceptée\\\"}}\\n            @text={{\\\"OK\\\"}}\\n          />\\n        </div>\\n        {{#if (eq @tx.category \\\"CashIn\\\")}}\\n          <div>\\n            <TxTable::TxItem::ChangeFiat @id={{@tx.id}} @values={{@tx.from}} />\\n          </div>\\n        {{else if (eq @tx.category \\\"CashOut\\\")}}\\n          <div>\\n            <TxTable::TxItem::ChangeFiat @id={{@tx.id}} @values={{@tx.to}} />\\n          </div>\\n        {{/if}}\\n      {{/if}}\\n    {{/if}}\\n\\n    {{#if @tx.merged}}\\n      <TxTable::TxItem::Unmerged @id={{@tx.id}} />\\n    {{/if}}\\n\\n    {{#if (eq @tx.category \\\"Retrait\\\")}}\\n      <span class=\\\"d-inline-block ms-1\\\">\\n        <App::Icon @icon=\\\"ion:alert-circle\\\" @color=\\\"red\\\" width=\\\"30\\\" />\\n        <BsTooltip @placement=\\\"top\\\" @viewportSelector=\\\"table\\\">TX RETRAIT :Transaction à identifier pour ne pas la\\n          traiter en Cashout dans les calculs d'imposition</BsTooltip>\\n      </span>\\n    {{else if (eq @tx.category \\\"Dépôt\\\")}}\\n      <span class=\\\"d-inline-block ms-1\\\">\\n        <App::Icon @icon=\\\"ion:alert-circle\\\" @color=\\\"red\\\" width=\\\"30\\\" />\\n        <BsTooltip @placement=\\\"top\\\" @viewportSelector=\\\"table\\\">TX DEPOT : Transaction à identifier pour ne pas la traiter\\n          en Don dans les calculs d'imposition</BsTooltip>\\n      </span>\\n    {{/if}}\\n  </div>\\n</td>\",\"moduleName\":\"cryptofiscafacile-gui/components/tx-table/tx-item/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/tx-table/tx-item/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { guidFor } from '@ember/object/internals';\n\nimport Transactions from 'cryptofiscafacile-gui/utils/transactions';\n\nimport type { Transaction, TxCategory } from 'cryptofiscafacile-wasm';\ninterface TxTableTxItemArgs {\n  onUpdateCategory: (tx: Transaction) => void;\n  onSelected: (tx: Transaction, value: boolean) => void;\n  allowedCategoryForSelection?: TxCategory;\n  secretMode?: boolean;\n  selected: boolean;\n  tx: Transaction;\n}\n\nexport default class TxTableTxItem extends Component<TxTableTxItemArgs> {\n  @action\n  onCopy() {\n    let copyText = this.args.tx.id;\n\n    navigator.clipboard.writeText(copyText);\n\n    debug('Copied the text: ' + copyText);\n  }\n\n  @action\n  onUpdateCategory() {\n    this.args.onUpdateCategory(this.args.tx);\n  }\n\n  @action\n  onSelect(event: Event) {\n    this.args.onSelected(this.args.tx, (event.target as HTMLInputElement).checked);\n  }\n\n  get checkableId() {\n    return guidFor(this);\n  }\n\n  get checkable() {\n    return Transactions.isUserCategorizable(this.args.tx);\n  }\n\n  get checkableDisabled() {\n    return (\n      this.args.allowedCategoryForSelection !== undefined &&\n      this.args.tx.category !== this.args.allowedCategoryForSelection\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<span class=\\\"badge rounded-pill bg-{{@status}}\\\">\\n  {{@text}}\\n  <BsTooltip @placement=\\\"top\\\">{{@title}}</BsTooltip>\\n</span>\", {\"contents\":\"<span class=\\\"badge rounded-pill bg-{{@status}}\\\">\\n  {{@text}}\\n  <BsTooltip @placement=\\\"top\\\">{{@title}}</BsTooltip>\\n</span>\",\"moduleName\":\"cryptofiscafacile-gui/components/tx-table/tx-item/line-status/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/tx-table/tx-item/line-status/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if this.txEmpty}}\\n  <td>\\n    <p class=\\\"text-center mb-0\\\">-</p>\\n  </td>\\n  <td></td>\\n{{else}}\\n  <td>\\n    {{#each @values as |value|}}\\n      <div class=\\\"d-flex\\\">\\n        <div class=\\\"w-75\\\">\\n          <span class=\\\"tx-table-quantity\\\">\\n            {{#if @secretMode}}\\n              *******\\n            {{else}}\\n              {{format-number value.quantity maximumFractionDigits=\\\"5\\\"}}\\n              <BsTooltip @placement=\\\"left\\\" @title={{format-number value.quantity maximumFractionDigits=\\\"20\\\"}} />\\n            {{/if}}\\n          </span>\\n        </div>\\n        <div class=\\\"w-25 ms-2\\\">\\n          <p class=\\\"tx-table-currency\\\">\\n            <BsButton\\n              @type=\\\"link\\\"\\n              class=\\\"stylebtn p-0 text-decoration-none\\\"\\n              @onClick={{(fn @onShowCoinDetail value.currency)}}\\n            >{{value.currency}}</BsButton>\\n            <BsTooltip @placement=\\\"top\\\" @title={{value.currency}} />\\n          </p>\\n        </div>\\n      </div>\\n    {{/each}}\\n  </td>\\n  <td> </td>\\n{{/if}}\", {\"contents\":\"{{#if this.txEmpty}}\\n  <td>\\n    <p class=\\\"text-center mb-0\\\">-</p>\\n  </td>\\n  <td></td>\\n{{else}}\\n  <td>\\n    {{#each @values as |value|}}\\n      <div class=\\\"d-flex\\\">\\n        <div class=\\\"w-75\\\">\\n          <span class=\\\"tx-table-quantity\\\">\\n            {{#if @secretMode}}\\n              *******\\n            {{else}}\\n              {{format-number value.quantity maximumFractionDigits=\\\"5\\\"}}\\n              <BsTooltip @placement=\\\"left\\\" @title={{format-number value.quantity maximumFractionDigits=\\\"20\\\"}} />\\n            {{/if}}\\n          </span>\\n        </div>\\n        <div class=\\\"w-25 ms-2\\\">\\n          <p class=\\\"tx-table-currency\\\">\\n            <BsButton\\n              @type=\\\"link\\\"\\n              class=\\\"stylebtn p-0 text-decoration-none\\\"\\n              @onClick={{(fn @onShowCoinDetail value.currency)}}\\n            >{{value.currency}}</BsButton>\\n            <BsTooltip @placement=\\\"top\\\" @title={{value.currency}} />\\n          </p>\\n        </div>\\n      </div>\\n    {{/each}}\\n  </td>\\n  <td> </td>\\n{{/if}}\",\"moduleName\":\"cryptofiscafacile-gui/components/tx-table/tx-item/tx-values/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/tx-table/tx-item/tx-values/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nimport type { TxValue } from 'cryptofiscafacile-wasm';\n\ninterface TxValuesArgs {\n  values: TxValue[];\n  onShowCoinDetail: (symbol: string) => void;\n  secretMode?: boolean;\n}\n\nexport default class TxTableTxItemTxValues extends Component<TxValuesArgs> {\n  get txEmpty(): boolean {\n    return this.args.values.length === 0;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsButton\\n  data-bs-dismiss=\\\"offcanvas\\\"\\n  data-bs-target=\\\"#offcanvasFilter\\\"\\n  aria-label=\\\"Close\\\"\\n  @type=\\\"light\\\"\\n  @onClick={{this.unMerge}}\\n  class=\\\"d-flex justify-content-evenly align-items-center align-content-center custom-filter-flex p-0 pe-1 pb-1 bg-white\\\"\\n>\\n  <span class=\\\"categ-icon\\\">\\n    <App::Icon @icon=\\\"ion:arrow-undo\\\" width=\\\"20\\\" />\\n    <BsTooltip @placement=\\\"top\\\">Transaction à dé-fusionner</BsTooltip>\\n  </span>\\n</BsButton>\", {\"contents\":\"<BsButton\\n  data-bs-dismiss=\\\"offcanvas\\\"\\n  data-bs-target=\\\"#offcanvasFilter\\\"\\n  aria-label=\\\"Close\\\"\\n  @type=\\\"light\\\"\\n  @onClick={{this.unMerge}}\\n  class=\\\"d-flex justify-content-evenly align-items-center align-content-center custom-filter-flex p-0 pe-1 pb-1 bg-white\\\"\\n>\\n  <span class=\\\"categ-icon\\\">\\n    <App::Icon @icon=\\\"ion:arrow-undo\\\" width=\\\"20\\\" />\\n    <BsTooltip @placement=\\\"top\\\">Transaction à dé-fusionner</BsTooltip>\\n  </span>\\n</BsButton>\",\"moduleName\":\"cryptofiscafacile-gui/components/tx-table/tx-item/unmerged.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/tx-table/tx-item/unmerged.hbs\"}});\nimport Component from '@glimmer/component';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\n\ninterface TxTableTxItemUnmergedArgs {\n  id: string;\n}\n\nexport default class TxTableTxItemUnmerged extends Component<TxTableTxItemUnmergedArgs> {\n  @service declare wasm: WasmService;\n\n  @action\n  async unMerge() {\n    debug('Unmerge transactions with id : ' + this.args.id);\n    await this.wasm.unMergeTransactionsTask.perform(this.args.id);\n    await this.wasm.getTransactionsTask.perform();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsButton\\n  @type={{if this.wasm.transactions \\\"primary\\\" \\\"secondary\\\"}}\\n  data-test-tx-table-validate-button\\n  aria-label=\\\"Close\\\"\\n  {{on \\\"click\\\" this.setCheckConsistency}}\\n  class=\\\"d-flex justify-content-evenly align-items-center align-content-center color\\n    {{if this.wasm.transactions '' 'disabled'}}\\\"\\n  data-title=\\\"Validation\\\"\\n  data-intro=\\\"Ce bouton vous servira à terminer la catégorisation afin d'éviter toute erreur de calcul. L'appui sur ce BOUTON ne devra se faire qu'au moment où vous aurez catégorisé TOUTES les TX qui devaient l'être HORMIS celles relatives aux ICO ainsi que celles que vous n'avez pas pu catégoriser. Une fenêtre apparaitra alors afin de vous guider dans la suite des opérations...\\\"\\n  {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n>\\n  <p class=\\\"m-0 me-1\\\">VALIDER</p>\\n  <App::Icon @icon=\\\"ion:shield-checkmark\\\" width=\\\"15\\\" />\\n  <BsTooltip @placement=\\\"top\\\" @viewportSelector=\\\"table\\\">Veuillez d'abord importer vos transactions...</BsTooltip>\\n</BsButton>\\n\\n{{! Modal for TX VALIDATION PROCESS HTML }}\\n<BsModal @open={{this.consistencyState}} @backdropClose={{false}} @onHidden={{this.hidden1}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      {{! template-lint-disable no-whitespace-within-word }}\\n      <h4 class=\\\"modal-title\\\">Validation des TX\\n        <span class=\\\"badge bg-secondary\\\">1</span>\\n      </h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        {{#if this.consistencyCategVsToFrom}}\\n          <BsAlert class=\\\"m-0 py-1 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n            <strong>Attention !</strong>\\n            Certaines TX contiennent des erreurs dans leur(s) tag(s) \\\"DE/SORTIE\\\" ou \\\"VERS/ENTREE\\\". Veuillez contacter le\\n            support en vous appuyant sur les champs suivants :\\n          </BsAlert>\\n          <div class=\\\"mx-2 my-3 destinataire\\\">\\n            <label for=\\\"dest\\\" class=\\\"form-label\\\">Email de destination :\\n            </label>\\n            <div class=\\\"d-flex\\\">\\n              {{! template-lint-disable require-input-label }}\\n              <input\\n                class=\\\"form-control textsm\\\"\\n                type=\\\"text\\\"\\n                id=\\\"dest\\\"\\n                value=\\\"contact-project+c1560-cryptofiscafacile-29728701-issue-@incoming.gitlab.com\\\"\\n                aria-label=\\\"readonly input\\\"\\n                readonly\\n              />\\n              <CopyButton\\n                class=\\\"btn btn-primary color\\\"\\n                @target=\\\"#dest\\\"\\n                @onSuccess={{this.onSuccess}}\\n                @onError={{this.onError}}\\n              >\\n                <App::Icon @icon=\\\"ion:clipboard-outline\\\" />\\n                <BsTooltip @placement=\\\"right\\\">Copier texte\\n                </BsTooltip>\\n              </CopyButton>\\n            </div>\\n          </div>\\n          <div class=\\\"mx-2 my-3 objet\\\">\\n            <label for=\\\"object\\\" class=\\\"form-label\\\">Objet de l'email :\\n            </label>\\n            <div class=\\\"d-flex\\\">\\n              {{! template-lint-disable require-input-label }}\\n              <input\\n                class=\\\"form-control textsm\\\"\\n                type=\\\"text\\\"\\n                id=\\\"object\\\"\\n                value=\\\"[CONSIST_TOFROM] STEP 1 - Erreurs dans tag(s) DE/SORTIE ou VERS/ENTREE\\\"\\n                aria-label=\\\"readonly input\\\"\\n                readonly\\n              />\\n              <CopyButton\\n                class=\\\"btn btn-primary color\\\"\\n                @target=\\\"#object\\\"\\n                @onSuccess={{this.onSuccess}}\\n                @onError={{this.onError}}\\n              >\\n                <App::Icon @icon=\\\"ion:clipboard-outline\\\" />\\n                <BsTooltip @placement=\\\"right\\\">Copier texte\\n                </BsTooltip>\\n              </CopyButton>\\n            </div>\\n          </div>\\n          <div class=\\\"mx-2 my-3 corps\\\">\\n            <div class=\\\"d-flex flex-column my-1\\\">\\n              <label for=\\\"unknowns\\\" class=\\\"form-label\\\">Corps du mail :\\n              </label>\\n              <span>\\n                <strong>Veuillez fournir au support le texte ainsi que les lignes de vos transactions contenant les\\n                  informations ci-dessous :</strong>\\n              </span>\\n            </div>\\n            <div class=\\\"d-flex\\\">\\n              <textarea class=\\\"form-control textsm\\\" id=\\\"unknowns\\\" rows=\\\"9\\\" wrap=\\\"off\\\" readonly>\\n                {{#each\\n                  this.consistencyCategVsToFrom\\n                  as |data|\\n                }}[{{data.wallet}}]:{{data.date}}-{{data.id}};{{data.error}}<br />{{/each}}\\n              </textarea>\\n              <CopyButton\\n                class=\\\"btn btn-primary color\\\"\\n                @target=\\\"#unknowns\\\"\\n                @onSuccess={{this.onSuccess}}\\n                @onError={{this.onError}}\\n              >\\n                <App::Icon @icon=\\\"ion:clipboard-outline\\\" />\\n                <BsTooltip @placement=\\\"right\\\">Copier texte\\n                </BsTooltip>\\n              </CopyButton>\\n            </div>\\n          </div>\\n        {{else}}\\n          <BsAlert class=\\\"m-0 py-1 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n            <strong>Bravo !</strong>\\n            Aucune erreur concernant les entrées/sorties dans votre table des transactions n'a été trouvée. Vous pouvez\\n            maintenant passer à la suite en cliquant sur Suivant...\\n          </BsAlert>\\n        {{/if}}\\n      </div>\\n    </modal.body>\\n    <modal.footer class=\\\"justify-content-between\\\">\\n      <div class=\\\"d-flex justify-content-end w-100\\\">\\n        <div>\\n          <BsButton {{on \\\"click\\\" this.close}}>\\n            Annuler</BsButton>\\n          <BsButton\\n            data-test-validate-next-button-1\\n            class=\\\"btn btn-primary\\\"\\n            {{on \\\"click\\\" this.setCheckConsistencyAlmost}}\\n          >Suivant</BsButton>\\n        </div>\\n      </div>\\n    </modal.footer>\\n  </div>\\n</BsModal>\\n\\n<BsModal @open={{this.consistencyAlmost}} @backdropClose={{false}} @onHidden={{this.hidden2}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      {{! template-lint-disable no-whitespace-within-word }}\\n      <h4 class=\\\"modal-title\\\">Validation des TX\\n        <span class=\\\"badge bg-secondary\\\">2</span>\\n      </h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        {{#if this.unprocessedTx}}\\n          <BsAlert\\n            class=\\\"m-0 py-1 mb-2 text-center\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @type=\\\"warning\\\"\\n            @dismissible={{false}}\\n          >\\n            <strong>Attention !</strong>\\n            Nous détectons des transactions potentiellement en lien...\\n          </BsAlert>\\n          <div class=\\\"d-flex\\\">\\n            <div class=\\\"list-group w-100\\\">\\n              {{#if this.unprocessedTx}}\\n                <p class=\\\"mb-1 font-small text-center\\\"><strong>Veuillez sélectionner ci-dessous une transaction :</strong></p>\\n                <div class=\\\"neg-scroll\\\">\\n                  <table class=\\\"table table-sm table-borderless table-hover scroll\\\">\\n                    <thead>\\n                      <tr>\\n                        <th>Port.</th>\\n                        <th>Montants</th>\\n                        <th>Cat.</th>\\n                        <th>Date</th>\\n                        <th>\\n                        </th>\\n                      </tr>\\n                    </thead>\\n                    <tbody>\\n                      {{#if this.consistencyAlmostTx}}\\n                        {{#each this.consistencyAlmostTx as |item|}}\\n                          <tr>\\n                            <td class=\\\"neg-width1\\\">{{item.tx.wallet}}</td>\\n                            <td class=\\\"neg-width2\\\">{{item.tx.amounts}}</td>\\n                            <td class=\\\"neg-width3\\\">{{item.tx.category}}\\n                              <span class=\\\"d-inline-block\\\">\\n                                <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"13\\\" />\\n                                <BsTooltip @placement=\\\"left\\\" @delayHide={{100}}>{{item.error}}\\n                                </BsTooltip>\\n                              </span></td>\\n                            <td class=\\\"neg-width4\\\">{{format-date item.tx.date}}</td>\\n                            <td class=\\\"neg-width5\\\">\\n                              <div class=\\\"form-check p-0\\\">\\n                                {{#if (eq item.tx.id this.firstTx)}}\\n                                  <input\\n                                    class=\\\"form-check-input ms-1\\\"\\n                                    type=\\\"checkbox\\\"\\n                                    id={{item.tx.id}}\\n                                    checked\\n                                    {{on \\\"change\\\" this.selectAlmost}}\\n                                  />\\n                                {{else}}\\n                                  <input\\n                                    class=\\\"form-check-input ms-1\\\"\\n                                    type=\\\"checkbox\\\"\\n                                    id={{item.tx.id}}\\n                                    {{on \\\"change\\\" this.selectAlmost}}\\n                                  />\\n                                {{/if}}\\n                              </div>\\n                            </td>\\n                          </tr>\\n                        {{/each}}\\n                      {{else}}\\n                        {{#each this.unprocessedTx as |item|}}\\n                          <tr>\\n                            <td class=\\\"neg-width1\\\">{{item.tx.wallet}}</td>\\n                            <td class=\\\"neg-width2\\\">{{item.tx.amounts}}</td>\\n                            <td class=\\\"neg-width3\\\">{{item.tx.category}}\\n                              <span class=\\\"d-inline-block\\\">\\n                                <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"13\\\" />\\n                                <BsTooltip @placement=\\\"left\\\" @delayHide={{100}}>{{item.error}}\\n                                </BsTooltip>\\n                              </span></td>\\n                            <td class=\\\"neg-width4\\\">{{format-date item.tx.date}}</td>\\n                            <td class=\\\"neg-width5\\\">\\n                              <div class=\\\"form-check p-0\\\">\\n                                <input\\n                                  class=\\\"form-check-input ms-1\\\"\\n                                  type=\\\"checkbox\\\"\\n                                  id={{item.tx.id}}\\n                                  {{on \\\"change\\\" this.selectAlmost}}\\n                                />\\n                              </div>\\n                            </td>\\n                          </tr>\\n                        {{/each}}\\n                      {{/if}}\\n                    </tbody>\\n                  </table>\\n                </div>\\n                <hr class=\\\"my-2\\\" />\\n                {{#if this.toShow}}\\n                  <p class=\\\"mb-1 font-small text-center\\\"><strong>Puis une transaction dont le montant (+frais)\\n                      permettrait d'en déduire un Transfert :</strong></p>\\n                  <div class=\\\"neg-scroll\\\">\\n                    <table class=\\\"table table-sm table-borderless table-hover scroll\\\">\\n                      <thead>\\n                        <tr>\\n                          <th>Port.</th>\\n                          <th>Montants</th>\\n                          <th>Cat.</th>\\n                          <th>Date</th>\\n                          <th></th>\\n                        </tr>\\n                      </thead>\\n                      <tbody>\\n                        {{#if this.consistencyRelated}}\\n                          {{#each this.consistencyRelated as |related|}}\\n                            {{#each related as |item|}}\\n                              <tr>\\n                                <td class=\\\"neg-width1\\\">{{item.wallet}}</td>\\n                                <td class=\\\"neg-width2\\\">{{item.amounts}}</td>\\n                                <td class=\\\"neg-width3\\\">{{item.category}}</td>\\n                                <td class=\\\"neg-width4\\\">{{format-date item.date}}</td>\\n                                <td class=\\\"neg-width5\\\">\\n                                  <div class=\\\"form-check p-0\\\">\\n                                    <input\\n                                      class=\\\"form-check-input ms-1\\\"\\n                                      type=\\\"checkbox\\\"\\n                                      id={{item.id}}\\n                                      {{on \\\"change\\\" this.selectAlmost2}}\\n                                    />\\n                                  </div>\\n                                </td>\\n                              </tr>\\n                            {{/each}}\\n                          {{/each}}\\n                        {{else}}\\n                          <tr>\\n                            <td colspan=\\\"6\\\" class=\\\"text-center\\\">Aucune TX en lien. Avez-vous importé toutes vos\\n                              transactions ?</td>\\n                          </tr>\\n                        {{/if}}\\n                      </tbody>\\n                    </table>\\n                  </div>\\n                {{/if}}\\n              {{else}}\\n                <div class=\\\"d-flex flex-column\\\">\\n                  <div class=\\\"text-center list-group-item list-group-item-action list-group-item-light\\\">\\n                    <div class=\\\"d-flex justify-content-center\\\">\\n                      <div>Aucune erreur associée ! Veuillez contacter le support.</div>\\n                    </div>\\n                  </div>\\n                </div>\\n                <hr />\\n              {{/if}}\\n            </div>\\n          </div>\\n          <BsAlert\\n            class=\\\"m-0 py-1 font-small text-center\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @type=\\\"danger\\\"\\n            @dismissible={{false}}\\n          >\\n            Veillez tout d'abord à bien importer TOUTES vos transactions ; si le problème persiste, contactez le\\n            support... Vous pouvez néanmoins cliquer sur Suivant mais vous ne pourrez générer vos rapports !\\n          </BsAlert>\\n        {{else}}\\n          <BsAlert class=\\\"m-0 py-1 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n            <strong>Bravo !</strong>\\n            Aucune détection d'anomalie de transfert(s) potentiel(s) n'a été remontée par le moteur. Vous pouvez\\n            maintenant passer à la suite en cliquant sur Suivant...\\n          </BsAlert>\\n        {{/if}}\\n      </div>\\n    </modal.body>\\n    <modal.footer class=\\\"justify-content-between\\\">\\n      {{#if this.mergeAlmostBtn}}\\n        <div class=\\\"d-flex w-25\\\">\\n          <BsButton\\n            data-test-merge-almost-fusion-button\\n            class=\\\"btn btn-primary\\\"\\n            {{on \\\"click\\\" this.mergeAlmost}}\\n          >Fusion</BsButton>\\n        </div>\\n        <div class=\\\"d-flex justify-content-end w-50\\\">\\n          <div>\\n            <BsButton {{on \\\"click\\\" this.close}}>Annuler</BsButton>\\n          </div>\\n        </div>\\n      {{else}}\\n        <div class=\\\"d-flex justify-content-end w-100\\\">\\n          <div>\\n            <BsButton {{on \\\"click\\\" this.close}}>\\n              Annuler</BsButton>\\n            <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.setCheckConsistency}}>\\n              Retour</BsButton>\\n            <BsButton\\n              data-test-validate-next-button-2\\n              class=\\\"btn btn-primary\\\"\\n              {{on \\\"click\\\" this.setCheckConsistencyNegativeBalance}}\\n            >Suivant</BsButton>\\n          </div>\\n        </div>\\n      {{/if}}\\n    </modal.footer>\\n  </div>\\n</BsModal>\\n\\n<BsModal @open={{this.consistencyStateNegativeBalance}} @backdropClose={{false}} @onHidden={{this.hidden3}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      {{! template-lint-disable no-whitespace-within-word }}\\n      <h4 class=\\\"modal-title\\\">Validation des TX\\n        <span class=\\\"badge bg-secondary\\\">3</span>\\n      </h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        {{#if this.consistencyNegativeBalance}}\\n          <BsAlert\\n            class=\\\"m-0 py-1 mb-2 text-center\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @type=\\\"danger\\\"\\n            @dismissible={{false}}\\n          >\\n            <strong>Attention !</strong>\\n            Nous détectons des balances d'actifs négatives.\\n          </BsAlert>\\n          <div class=\\\"d-flex\\\">\\n            <div class=\\\"list-group w-100\\\">\\n              {{#if this.consistencyNegativeBalance}}\\n                <p class=\\\"mb-1 font-small text-center\\\"><strong>Veuillez sélectionner ci-dessous une transaction :</strong></p>\\n                <div class=\\\"neg-scroll\\\">\\n                  <table class=\\\"table table-sm table-borderless table-hover scroll\\\">\\n                    <thead>\\n                      <tr>\\n                        <th>Port.</th>\\n                        <th>Montants</th>\\n                        <th>Cat.</th>\\n                        <th>Date</th>\\n                        <th>\\n                        </th>\\n                      </tr>\\n                    </thead>\\n                    <tbody>\\n                      {{#each this.consistencyNegativeBalance as |item|}}\\n                        <tr>\\n                          <td class=\\\"neg-width1\\\">{{item.tx.wallet}}</td>\\n                          <td class=\\\"neg-width2\\\">{{item.tx.amounts}}</td>\\n                          <td class=\\\"neg-width3\\\">{{item.tx.category}}\\n                            <span class=\\\"d-inline-block\\\">\\n                              <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"13\\\" />\\n                              <BsTooltip @placement=\\\"left\\\" @delayHide={{1000}}>{{item.error}}\\n                              </BsTooltip>\\n                            </span></td>\\n                          <td class=\\\"neg-width4\\\">{{format-date item.tx.date}}</td>\\n                          <td class=\\\"neg-width5\\\">\\n                            <div class=\\\"form-check p-0\\\">\\n                              <input\\n                                class=\\\"form-check-input ms-1\\\"\\n                                type=\\\"radio\\\"\\n                                name=\\\"flexRadioNeg\\\"\\n                                id={{item.tx.id}}\\n                                {{on \\\"change\\\" this.selectNeg}}\\n                              />\\n                            </div>\\n                          </td>\\n                        </tr>\\n                      {{/each}}\\n                    </tbody>\\n                  </table>\\n                </div>\\n                <hr class=\\\"my-2\\\" />\\n                {{#if this.toShow}}\\n                  <p class=\\\"mb-1 font-small text-center\\\"><strong>Puis une transaction dont le montant permettrait de\\n                      résoudre la balance negative :</strong></p>\\n                  <div class=\\\"neg-scroll\\\">\\n                    <table class=\\\"table table-sm table-borderless table-hover scroll\\\">\\n                      <thead>\\n                        <tr>\\n                          <th>Port.</th>\\n                          <th>Montants</th>\\n                          <th>Cat.</th>\\n                          <th>Date</th>\\n                          <th>\\n                          </th>\\n                        </tr>\\n                      </thead>\\n                      <tbody>\\n                        {{#if this.consistencyNegativeBalanceMergeable}}\\n                          {{#each this.consistencyNegativeBalanceMergeable as |item|}}\\n                            <tr>\\n                              <td class=\\\"neg-width1\\\">{{item.wallet}}</td>\\n                              <td class=\\\"neg-width2\\\">{{item.amounts}}</td>\\n                              <td class=\\\"neg-width3\\\">{{item.category}}</td>\\n                              <td class=\\\"neg-width4\\\">{{format-date item.date}}</td>\\n                              <td class=\\\"neg-width5\\\">\\n                                <div class=\\\"form-check p-0\\\">\\n                                  <input\\n                                    class=\\\"form-check-input ms-1\\\"\\n                                    type=\\\"radio\\\"\\n                                    name=\\\"flexRadioNeg2\\\"\\n                                    id={{item.id}}\\n                                    {{on \\\"change\\\" this.selectNeg2}}\\n                                  />\\n                                </div>\\n                              </td>\\n                            </tr>\\n                          {{/each}}\\n                        {{else}}\\n                          <tr>\\n                            <td colspan=\\\"6\\\" class=\\\"text-center\\\">Aucune TX en lien. Avez-vous importé toutes vos\\n                              transactions ?</td>\\n                          </tr>\\n                        {{/if}}\\n                      </tbody>\\n                    </table>\\n                  </div>\\n                {{/if}}\\n              {{else}}\\n                <div class=\\\"d-flex flex-column\\\">\\n                  <div class=\\\"text-center list-group-item list-group-item-action list-group-item-light\\\">\\n                    <div class=\\\"d-flex justify-content-center\\\">\\n                      <div>Aucune erreur associée ! Veuillez contacter le support.</div>\\n                    </div>\\n                  </div>\\n                </div>\\n                <hr />\\n              {{/if}}\\n            </div>\\n          </div>\\n          <BsAlert\\n            class=\\\"m-0 py-1 font-small text-center\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @type=\\\"danger\\\"\\n            @dismissible={{false}}\\n          >\\n            Veillez tout d'abord à bien importer TOUTES vos transactions ; si le problème persiste, contactez le\\n            support. Vous pouvez néanmoins cliquer sur Suivant mais vous ne pourrez générer vos rapports...\\n          </BsAlert>\\n        {{else}}\\n          <BsAlert class=\\\"m-0 py-1 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n            <strong>Bravo !</strong>\\n            Aucune erreur de balance négative n'a été trouvée. Vous pouvez maintenant passer à la suite en cliquant sur\\n            Suivant...\\n          </BsAlert>\\n        {{/if}}\\n      </div>\\n    </modal.body>\\n    <modal.footer class=\\\"justify-content-between\\\">\\n      {{#if this.mergeNegBtn}}\\n        <div class=\\\"d-flex w-25\\\">\\n          <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.mergeNeg}}>Fusion</BsButton>\\n        </div>\\n        <div class=\\\"d-flex justify-content-end w-50\\\">\\n          <div>\\n            <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.setCheckConsistencyAlmost}}>\\n              Retour</BsButton>\\n            <BsButton {{on \\\"click\\\" this.close}}>Annuler</BsButton>\\n          </div>\\n        </div>\\n      {{else}}\\n        <div class=\\\"d-flex justify-content-end w-100\\\">\\n          <div>\\n            <BsButton {{on \\\"click\\\" this.close}}>\\n              Annuler</BsButton>\\n            <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.setCheckConsistencyAlmost}}>\\n              Retour</BsButton>\\n            <BsButton data-test-validate-next-button-3 class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.onValidation}}>\\n              Suivant</BsButton>\\n          </div>\\n        </div>\\n      {{/if}}\\n    </modal.footer>\\n  </div>\\n</BsModal>\\n\\n<BsModal @open={{this.validState}} @backdropClose={{false}} @onHidden={{this.hidden4}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">Validation des TX\\n        <span class=\\\"badge bg-secondary\\\">4</span>\\n      </h4>\\n    </modal.header>\\n    {{#if this.resultWithdrawal}}\\n      <modal.body>\\n        <div class=\\\"container\\\">\\n          <BsAlert\\n            class=\\\"m-0 mb-1 py-1 text-center\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @type=\\\"success\\\"\\n            @dismissible={{false}}\\n          >\\n            Vous venez de caractériser la majorité des transactions\\n            <strong>'Retrait'</strong>\\n            et\\n            <strong>'Dépôt'</strong>...\\n          </BsAlert>\\n          <BsAlert\\n            class=\\\"m-0 my-1 py-1 text-center\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @type=\\\"warning\\\"\\n            @dismissible={{false}}\\n          >\\n            Cela dit nous détectons encore des Retraits non identifiés. Voici la liste de ces transactions restantes\\n            dans votre portefeuille... Veuillez cocher les potentielles transactions liées à des ICO ou cliquer sur\\n            Suivant si vous ne reconnaissez aucune transaction de type ICO :\\n          </BsAlert>\\n          <div class=\\\"d-flex custom-ico\\\">\\n            {{! Liste de tous les RETRAITS }}\\n            <ul class=\\\"list-group list-group-flush w-100\\\">\\n              {{#each this.resultWithdrawal as |item|}}\\n                <li class=\\\"d-flex list-group-item pe-0\\\">\\n                  <div class=\\\"d-flex justify-content-between w-90\\\">\\n                    <div class=\\\"with-width1\\\">{{item.wallet}}</div>\\n                    <div class=\\\"with-width2\\\">{{item.quantity}} {{item.currency}}</div>\\n                    <div class=\\\"with-width3\\\">{{format-date item.date}}</div>\\n                  </div>\\n                  <div class=\\\"ps-3 w-10\\\">\\n                    <input\\n                      class=\\\"form-check-input ms-1\\\"\\n                      type=\\\"checkbox\\\"\\n                      id={{item.id}}\\n                      {{on \\\"change\\\" this.toggleCheck}}\\n                    />\\n                  </div>\\n                </li>\\n              {{/each}}\\n            </ul>\\n          </div>\\n        </div>\\n      </modal.body>\\n      <modal.footer>\\n        <BsButton {{on \\\"click\\\" this.close}}>Annuler</BsButton>\\n        <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.setCheckConsistencyNegativeBalance}}>\\n          Retour</BsButton>\\n\\n        {{#if this.isTabId}}\\n          <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.setIco}}>Suivant</BsButton>\\n        {{else}}\\n          <LinkTo @route=\\\"reports\\\">\\n            <BsButton data-test-validate-next-button-4 class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.close}}>\\n              Suivant</BsButton>\\n          </LinkTo>\\n        {{/if}}\\n      </modal.footer>\\n    {{else}}\\n      <modal.body>\\n        <div class=\\\"container\\\">\\n          <h6>Vous venez de caractériser les transactions\\n            <strong>'Retrait'</strong>\\n            et\\n            <strong>'Dépôt'</strong>. Nous ne détectons aucune transaction de type\\n            <strong>'Retrait'</strong>\\n            restant...\\n          </h6>\\n          <BsAlert class=\\\"m-0 py-1\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n            <strong>Bravo !</strong>\\n            Vous pouvez maintenant passer à la génération des rapports en cliquant sur Suivant...\\n          </BsAlert>\\n        </div>\\n      </modal.body>\\n      <modal.footer>\\n        <BsButton {{on \\\"click\\\" this.close}}>Annuler</BsButton>\\n        <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.setCheckConsistencyNegativeBalance}}>\\n          Retour</BsButton>\\n        <LinkTo @route=\\\"reports\\\">\\n          <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.close}}>\\n            Suivant</BsButton>\\n        </LinkTo>\\n      </modal.footer>\\n    {{/if}}\\n  </div>\\n</BsModal>\\n\\n<BsModal @open={{this.icoState}} @backdropClose={{false}} @onHidden={{this.hidden5}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">Validation des TX\\n        <span class=\\\"badge bg-secondary\\\">4</span>\\n      </h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        <BsAlert\\n          class=\\\"m-0 mb-1 py-1 text-center\\\"\\n          @visible={{true}}\\n          @fade={{true}}\\n          @type=\\\"warning\\\"\\n          @dismissible={{false}}\\n        >\\n          Voici une liste des transactions de type\\n          <strong>'Dépôt'</strong>\\n          qui correspondent potentiellement à/aux transactions\\n          <strong>'Retrait'</strong>\\n          identifiées précédement\\n          <span class=\\\"red\\\">pour des ICO</span>...\\n        </BsAlert>\\n        <BsAlert\\n          class=\\\"m-0 my-1 py-1 text-center\\\"\\n          @visible={{true}}\\n          @fade={{true}}\\n          @type=\\\"danger\\\"\\n          @dismissible={{false}}\\n        >Veuillez fusionner les transactions liées (le cas échéant) puis cliquer sur suivant pour la génération de vos\\n          rapports :\\n        </BsAlert>\\n        <div class=\\\"d-flex\\\">\\n          <div class=\\\"list-group w-100\\\">\\n            {{#if this.checkedWithdraw}}\\n              <div class=\\\"d-flex flex-column custom-ico2\\\">\\n                <ul class=\\\"list-group list-group-flush w-100\\\">\\n                  {{#each this.checkedWithdraw as |item|}}\\n                    <li class=\\\"d-flex list-group-item pe-0\\\">\\n                      <div class=\\\"d-flex justify-content-between w-90\\\">\\n                        <div class=\\\"with-width1\\\">{{item.wallet}}</div>\\n                        <div class=\\\"with-width2\\\">{{item.quantity}} {{item.currency}}</div>\\n                        <div class=\\\"with-width3\\\">{{format-date item.date}}</div>\\n                      </div>\\n                      <div class=\\\"ps-3 w-10\\\">\\n                        <div class=\\\"form-check\\\">\\n                          <input\\n                            class=\\\"form-check-input\\\"\\n                            type=\\\"radio\\\"\\n                            name=\\\"flexRadioWith\\\"\\n                            id=\\\"flexRadioWith1\\\"\\n                            {{on \\\"click\\\" (fn this.selectIds item.id \\\"\\\")}}\\n                          />\\n                        </div>\\n                      </div>\\n                    </li>\\n                  {{/each}}\\n                </ul>\\n              </div>\\n              <hr />\\n              <div class=\\\"d-flex flex-column custom-ico2\\\">\\n                <ul class=\\\"list-group list-group-flush w-100\\\">\\n                  {{#each this.resultDeposit as |deposit|}}\\n                    <li class=\\\"d-flex list-group-item pe-0\\\">\\n                      <div class=\\\"d-flex justify-content-between w-90\\\">\\n                        <div class=\\\"with-width1\\\">{{deposit.wallet}}</div>\\n                        <div class=\\\"with-width2\\\">{{deposit.quantity}} {{deposit.currency}}</div>\\n                        <div class=\\\"with-width3\\\">{{format-date deposit.date}}</div>\\n                      </div>\\n                      <div class=\\\"ps-3 w-10\\\">\\n                        <div class=\\\"form-check\\\">\\n                          <input\\n                            class=\\\"form-check-input\\\"\\n                            type=\\\"radio\\\"\\n                            name=\\\"flexRadioDep\\\"\\n                            id=\\\"flexRadioDep1\\\"\\n                            {{on \\\"click\\\" (fn this.selectIds \\\"\\\" deposit.id)}}\\n                          />\\n                        </div>\\n                      </div>\\n                    </li>\\n                  {{/each}}\\n                </ul>\\n              </div>\\n            {{else}}\\n              <div class=\\\"d-flex flex-column\\\">\\n                <div class=\\\"text-center list-group-item list-group-item-action list-group-item-light\\\">\\n                  <div class=\\\"d-flex justify-content-center\\\">\\n                    <div>Aucune transaction 'Retrait'.</div>\\n                  </div>\\n                </div>\\n              </div>\\n              <hr />\\n            {{/if}}\\n          </div>\\n        </div>\\n      </div>\\n    </modal.body>\\n    <modal.footer class=\\\"justify-content-between\\\">\\n      {{#if this.mergeBtn}}\\n        <div class=\\\"d-flex w-25\\\">\\n          <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.merge}}>Fusion</BsButton>\\n        </div>\\n        <div class=\\\"d-flex justify-content-end w-50\\\">\\n          <div>\\n            {{#if this.isTabId}}\\n              <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.setIco}}>Retour</BsButton>\\n            {{/if}}\\n            <BsButton {{on \\\"click\\\" this.close}}>Annuler</BsButton>\\n          </div>\\n        </div>\\n      {{else}}\\n        <div class=\\\"d-flex justify-content-end w-100\\\">\\n          <div>\\n            <BsButton {{on \\\"click\\\" this.close}}>\\n              Annuler</BsButton>\\n            {{#if this.isTabId}}\\n              <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.setIco}}>Retour</BsButton>\\n            {{/if}}\\n            <LinkTo @route=\\\"reports\\\">\\n              <BsButton data-test-validate-next-button-4 class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.close}}>\\n                Suivant</BsButton>\\n            </LinkTo>\\n          </div>\\n        </div>\\n      {{/if}}\\n    </modal.footer>\\n  </div>\\n</BsModal>\", {\"contents\":\"<BsButton\\n  @type={{if this.wasm.transactions \\\"primary\\\" \\\"secondary\\\"}}\\n  data-test-tx-table-validate-button\\n  aria-label=\\\"Close\\\"\\n  {{on \\\"click\\\" this.setCheckConsistency}}\\n  class=\\\"d-flex justify-content-evenly align-items-center align-content-center color\\n    {{if this.wasm.transactions '' 'disabled'}}\\\"\\n  data-title=\\\"Validation\\\"\\n  data-intro=\\\"Ce bouton vous servira à terminer la catégorisation afin d'éviter toute erreur de calcul. L'appui sur ce BOUTON ne devra se faire qu'au moment où vous aurez catégorisé TOUTES les TX qui devaient l'être HORMIS celles relatives aux ICO ainsi que celles que vous n'avez pas pu catégoriser. Une fenêtre apparaitra alors afin de vous guider dans la suite des opérations...\\\"\\n  {{offcanvas-hider \\\"offcanvas-filter\\\"}}\\n>\\n  <p class=\\\"m-0 me-1\\\">VALIDER</p>\\n  <App::Icon @icon=\\\"ion:shield-checkmark\\\" width=\\\"15\\\" />\\n  <BsTooltip @placement=\\\"top\\\" @viewportSelector=\\\"table\\\">Veuillez d'abord importer vos transactions...</BsTooltip>\\n</BsButton>\\n\\n{{! Modal for TX VALIDATION PROCESS HTML }}\\n<BsModal @open={{this.consistencyState}} @backdropClose={{false}} @onHidden={{this.hidden1}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      {{! template-lint-disable no-whitespace-within-word }}\\n      <h4 class=\\\"modal-title\\\">Validation des TX\\n        <span class=\\\"badge bg-secondary\\\">1</span>\\n      </h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        {{#if this.consistencyCategVsToFrom}}\\n          <BsAlert class=\\\"m-0 py-1 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n            <strong>Attention !</strong>\\n            Certaines TX contiennent des erreurs dans leur(s) tag(s) \\\"DE/SORTIE\\\" ou \\\"VERS/ENTREE\\\". Veuillez contacter le\\n            support en vous appuyant sur les champs suivants :\\n          </BsAlert>\\n          <div class=\\\"mx-2 my-3 destinataire\\\">\\n            <label for=\\\"dest\\\" class=\\\"form-label\\\">Email de destination :\\n            </label>\\n            <div class=\\\"d-flex\\\">\\n              {{! template-lint-disable require-input-label }}\\n              <input\\n                class=\\\"form-control textsm\\\"\\n                type=\\\"text\\\"\\n                id=\\\"dest\\\"\\n                value=\\\"contact-project+c1560-cryptofiscafacile-29728701-issue-@incoming.gitlab.com\\\"\\n                aria-label=\\\"readonly input\\\"\\n                readonly\\n              />\\n              <CopyButton\\n                class=\\\"btn btn-primary color\\\"\\n                @target=\\\"#dest\\\"\\n                @onSuccess={{this.onSuccess}}\\n                @onError={{this.onError}}\\n              >\\n                <App::Icon @icon=\\\"ion:clipboard-outline\\\" />\\n                <BsTooltip @placement=\\\"right\\\">Copier texte\\n                </BsTooltip>\\n              </CopyButton>\\n            </div>\\n          </div>\\n          <div class=\\\"mx-2 my-3 objet\\\">\\n            <label for=\\\"object\\\" class=\\\"form-label\\\">Objet de l'email :\\n            </label>\\n            <div class=\\\"d-flex\\\">\\n              {{! template-lint-disable require-input-label }}\\n              <input\\n                class=\\\"form-control textsm\\\"\\n                type=\\\"text\\\"\\n                id=\\\"object\\\"\\n                value=\\\"[CONSIST_TOFROM] STEP 1 - Erreurs dans tag(s) DE/SORTIE ou VERS/ENTREE\\\"\\n                aria-label=\\\"readonly input\\\"\\n                readonly\\n              />\\n              <CopyButton\\n                class=\\\"btn btn-primary color\\\"\\n                @target=\\\"#object\\\"\\n                @onSuccess={{this.onSuccess}}\\n                @onError={{this.onError}}\\n              >\\n                <App::Icon @icon=\\\"ion:clipboard-outline\\\" />\\n                <BsTooltip @placement=\\\"right\\\">Copier texte\\n                </BsTooltip>\\n              </CopyButton>\\n            </div>\\n          </div>\\n          <div class=\\\"mx-2 my-3 corps\\\">\\n            <div class=\\\"d-flex flex-column my-1\\\">\\n              <label for=\\\"unknowns\\\" class=\\\"form-label\\\">Corps du mail :\\n              </label>\\n              <span>\\n                <strong>Veuillez fournir au support le texte ainsi que les lignes de vos transactions contenant les\\n                  informations ci-dessous :</strong>\\n              </span>\\n            </div>\\n            <div class=\\\"d-flex\\\">\\n              <textarea class=\\\"form-control textsm\\\" id=\\\"unknowns\\\" rows=\\\"9\\\" wrap=\\\"off\\\" readonly>\\n                {{#each\\n                  this.consistencyCategVsToFrom\\n                  as |data|\\n                }}[{{data.wallet}}]:{{data.date}}-{{data.id}};{{data.error}}<br />{{/each}}\\n              </textarea>\\n              <CopyButton\\n                class=\\\"btn btn-primary color\\\"\\n                @target=\\\"#unknowns\\\"\\n                @onSuccess={{this.onSuccess}}\\n                @onError={{this.onError}}\\n              >\\n                <App::Icon @icon=\\\"ion:clipboard-outline\\\" />\\n                <BsTooltip @placement=\\\"right\\\">Copier texte\\n                </BsTooltip>\\n              </CopyButton>\\n            </div>\\n          </div>\\n        {{else}}\\n          <BsAlert class=\\\"m-0 py-1 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n            <strong>Bravo !</strong>\\n            Aucune erreur concernant les entrées/sorties dans votre table des transactions n'a été trouvée. Vous pouvez\\n            maintenant passer à la suite en cliquant sur Suivant...\\n          </BsAlert>\\n        {{/if}}\\n      </div>\\n    </modal.body>\\n    <modal.footer class=\\\"justify-content-between\\\">\\n      <div class=\\\"d-flex justify-content-end w-100\\\">\\n        <div>\\n          <BsButton {{on \\\"click\\\" this.close}}>\\n            Annuler</BsButton>\\n          <BsButton\\n            data-test-validate-next-button-1\\n            class=\\\"btn btn-primary\\\"\\n            {{on \\\"click\\\" this.setCheckConsistencyAlmost}}\\n          >Suivant</BsButton>\\n        </div>\\n      </div>\\n    </modal.footer>\\n  </div>\\n</BsModal>\\n\\n<BsModal @open={{this.consistencyAlmost}} @backdropClose={{false}} @onHidden={{this.hidden2}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      {{! template-lint-disable no-whitespace-within-word }}\\n      <h4 class=\\\"modal-title\\\">Validation des TX\\n        <span class=\\\"badge bg-secondary\\\">2</span>\\n      </h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        {{#if this.unprocessedTx}}\\n          <BsAlert\\n            class=\\\"m-0 py-1 mb-2 text-center\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @type=\\\"warning\\\"\\n            @dismissible={{false}}\\n          >\\n            <strong>Attention !</strong>\\n            Nous détectons des transactions potentiellement en lien...\\n          </BsAlert>\\n          <div class=\\\"d-flex\\\">\\n            <div class=\\\"list-group w-100\\\">\\n              {{#if this.unprocessedTx}}\\n                <p class=\\\"mb-1 font-small text-center\\\"><strong>Veuillez sélectionner ci-dessous une transaction :</strong></p>\\n                <div class=\\\"neg-scroll\\\">\\n                  <table class=\\\"table table-sm table-borderless table-hover scroll\\\">\\n                    <thead>\\n                      <tr>\\n                        <th>Port.</th>\\n                        <th>Montants</th>\\n                        <th>Cat.</th>\\n                        <th>Date</th>\\n                        <th>\\n                        </th>\\n                      </tr>\\n                    </thead>\\n                    <tbody>\\n                      {{#if this.consistencyAlmostTx}}\\n                        {{#each this.consistencyAlmostTx as |item|}}\\n                          <tr>\\n                            <td class=\\\"neg-width1\\\">{{item.tx.wallet}}</td>\\n                            <td class=\\\"neg-width2\\\">{{item.tx.amounts}}</td>\\n                            <td class=\\\"neg-width3\\\">{{item.tx.category}}\\n                              <span class=\\\"d-inline-block\\\">\\n                                <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"13\\\" />\\n                                <BsTooltip @placement=\\\"left\\\" @delayHide={{100}}>{{item.error}}\\n                                </BsTooltip>\\n                              </span></td>\\n                            <td class=\\\"neg-width4\\\">{{format-date item.tx.date}}</td>\\n                            <td class=\\\"neg-width5\\\">\\n                              <div class=\\\"form-check p-0\\\">\\n                                {{#if (eq item.tx.id this.firstTx)}}\\n                                  <input\\n                                    class=\\\"form-check-input ms-1\\\"\\n                                    type=\\\"checkbox\\\"\\n                                    id={{item.tx.id}}\\n                                    checked\\n                                    {{on \\\"change\\\" this.selectAlmost}}\\n                                  />\\n                                {{else}}\\n                                  <input\\n                                    class=\\\"form-check-input ms-1\\\"\\n                                    type=\\\"checkbox\\\"\\n                                    id={{item.tx.id}}\\n                                    {{on \\\"change\\\" this.selectAlmost}}\\n                                  />\\n                                {{/if}}\\n                              </div>\\n                            </td>\\n                          </tr>\\n                        {{/each}}\\n                      {{else}}\\n                        {{#each this.unprocessedTx as |item|}}\\n                          <tr>\\n                            <td class=\\\"neg-width1\\\">{{item.tx.wallet}}</td>\\n                            <td class=\\\"neg-width2\\\">{{item.tx.amounts}}</td>\\n                            <td class=\\\"neg-width3\\\">{{item.tx.category}}\\n                              <span class=\\\"d-inline-block\\\">\\n                                <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"13\\\" />\\n                                <BsTooltip @placement=\\\"left\\\" @delayHide={{100}}>{{item.error}}\\n                                </BsTooltip>\\n                              </span></td>\\n                            <td class=\\\"neg-width4\\\">{{format-date item.tx.date}}</td>\\n                            <td class=\\\"neg-width5\\\">\\n                              <div class=\\\"form-check p-0\\\">\\n                                <input\\n                                  class=\\\"form-check-input ms-1\\\"\\n                                  type=\\\"checkbox\\\"\\n                                  id={{item.tx.id}}\\n                                  {{on \\\"change\\\" this.selectAlmost}}\\n                                />\\n                              </div>\\n                            </td>\\n                          </tr>\\n                        {{/each}}\\n                      {{/if}}\\n                    </tbody>\\n                  </table>\\n                </div>\\n                <hr class=\\\"my-2\\\" />\\n                {{#if this.toShow}}\\n                  <p class=\\\"mb-1 font-small text-center\\\"><strong>Puis une transaction dont le montant (+frais)\\n                      permettrait d'en déduire un Transfert :</strong></p>\\n                  <div class=\\\"neg-scroll\\\">\\n                    <table class=\\\"table table-sm table-borderless table-hover scroll\\\">\\n                      <thead>\\n                        <tr>\\n                          <th>Port.</th>\\n                          <th>Montants</th>\\n                          <th>Cat.</th>\\n                          <th>Date</th>\\n                          <th></th>\\n                        </tr>\\n                      </thead>\\n                      <tbody>\\n                        {{#if this.consistencyRelated}}\\n                          {{#each this.consistencyRelated as |related|}}\\n                            {{#each related as |item|}}\\n                              <tr>\\n                                <td class=\\\"neg-width1\\\">{{item.wallet}}</td>\\n                                <td class=\\\"neg-width2\\\">{{item.amounts}}</td>\\n                                <td class=\\\"neg-width3\\\">{{item.category}}</td>\\n                                <td class=\\\"neg-width4\\\">{{format-date item.date}}</td>\\n                                <td class=\\\"neg-width5\\\">\\n                                  <div class=\\\"form-check p-0\\\">\\n                                    <input\\n                                      class=\\\"form-check-input ms-1\\\"\\n                                      type=\\\"checkbox\\\"\\n                                      id={{item.id}}\\n                                      {{on \\\"change\\\" this.selectAlmost2}}\\n                                    />\\n                                  </div>\\n                                </td>\\n                              </tr>\\n                            {{/each}}\\n                          {{/each}}\\n                        {{else}}\\n                          <tr>\\n                            <td colspan=\\\"6\\\" class=\\\"text-center\\\">Aucune TX en lien. Avez-vous importé toutes vos\\n                              transactions ?</td>\\n                          </tr>\\n                        {{/if}}\\n                      </tbody>\\n                    </table>\\n                  </div>\\n                {{/if}}\\n              {{else}}\\n                <div class=\\\"d-flex flex-column\\\">\\n                  <div class=\\\"text-center list-group-item list-group-item-action list-group-item-light\\\">\\n                    <div class=\\\"d-flex justify-content-center\\\">\\n                      <div>Aucune erreur associée ! Veuillez contacter le support.</div>\\n                    </div>\\n                  </div>\\n                </div>\\n                <hr />\\n              {{/if}}\\n            </div>\\n          </div>\\n          <BsAlert\\n            class=\\\"m-0 py-1 font-small text-center\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @type=\\\"danger\\\"\\n            @dismissible={{false}}\\n          >\\n            Veillez tout d'abord à bien importer TOUTES vos transactions ; si le problème persiste, contactez le\\n            support... Vous pouvez néanmoins cliquer sur Suivant mais vous ne pourrez générer vos rapports !\\n          </BsAlert>\\n        {{else}}\\n          <BsAlert class=\\\"m-0 py-1 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n            <strong>Bravo !</strong>\\n            Aucune détection d'anomalie de transfert(s) potentiel(s) n'a été remontée par le moteur. Vous pouvez\\n            maintenant passer à la suite en cliquant sur Suivant...\\n          </BsAlert>\\n        {{/if}}\\n      </div>\\n    </modal.body>\\n    <modal.footer class=\\\"justify-content-between\\\">\\n      {{#if this.mergeAlmostBtn}}\\n        <div class=\\\"d-flex w-25\\\">\\n          <BsButton\\n            data-test-merge-almost-fusion-button\\n            class=\\\"btn btn-primary\\\"\\n            {{on \\\"click\\\" this.mergeAlmost}}\\n          >Fusion</BsButton>\\n        </div>\\n        <div class=\\\"d-flex justify-content-end w-50\\\">\\n          <div>\\n            <BsButton {{on \\\"click\\\" this.close}}>Annuler</BsButton>\\n          </div>\\n        </div>\\n      {{else}}\\n        <div class=\\\"d-flex justify-content-end w-100\\\">\\n          <div>\\n            <BsButton {{on \\\"click\\\" this.close}}>\\n              Annuler</BsButton>\\n            <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.setCheckConsistency}}>\\n              Retour</BsButton>\\n            <BsButton\\n              data-test-validate-next-button-2\\n              class=\\\"btn btn-primary\\\"\\n              {{on \\\"click\\\" this.setCheckConsistencyNegativeBalance}}\\n            >Suivant</BsButton>\\n          </div>\\n        </div>\\n      {{/if}}\\n    </modal.footer>\\n  </div>\\n</BsModal>\\n\\n<BsModal @open={{this.consistencyStateNegativeBalance}} @backdropClose={{false}} @onHidden={{this.hidden3}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      {{! template-lint-disable no-whitespace-within-word }}\\n      <h4 class=\\\"modal-title\\\">Validation des TX\\n        <span class=\\\"badge bg-secondary\\\">3</span>\\n      </h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        {{#if this.consistencyNegativeBalance}}\\n          <BsAlert\\n            class=\\\"m-0 py-1 mb-2 text-center\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @type=\\\"danger\\\"\\n            @dismissible={{false}}\\n          >\\n            <strong>Attention !</strong>\\n            Nous détectons des balances d'actifs négatives.\\n          </BsAlert>\\n          <div class=\\\"d-flex\\\">\\n            <div class=\\\"list-group w-100\\\">\\n              {{#if this.consistencyNegativeBalance}}\\n                <p class=\\\"mb-1 font-small text-center\\\"><strong>Veuillez sélectionner ci-dessous une transaction :</strong></p>\\n                <div class=\\\"neg-scroll\\\">\\n                  <table class=\\\"table table-sm table-borderless table-hover scroll\\\">\\n                    <thead>\\n                      <tr>\\n                        <th>Port.</th>\\n                        <th>Montants</th>\\n                        <th>Cat.</th>\\n                        <th>Date</th>\\n                        <th>\\n                        </th>\\n                      </tr>\\n                    </thead>\\n                    <tbody>\\n                      {{#each this.consistencyNegativeBalance as |item|}}\\n                        <tr>\\n                          <td class=\\\"neg-width1\\\">{{item.tx.wallet}}</td>\\n                          <td class=\\\"neg-width2\\\">{{item.tx.amounts}}</td>\\n                          <td class=\\\"neg-width3\\\">{{item.tx.category}}\\n                            <span class=\\\"d-inline-block\\\">\\n                              <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"13\\\" />\\n                              <BsTooltip @placement=\\\"left\\\" @delayHide={{1000}}>{{item.error}}\\n                              </BsTooltip>\\n                            </span></td>\\n                          <td class=\\\"neg-width4\\\">{{format-date item.tx.date}}</td>\\n                          <td class=\\\"neg-width5\\\">\\n                            <div class=\\\"form-check p-0\\\">\\n                              <input\\n                                class=\\\"form-check-input ms-1\\\"\\n                                type=\\\"radio\\\"\\n                                name=\\\"flexRadioNeg\\\"\\n                                id={{item.tx.id}}\\n                                {{on \\\"change\\\" this.selectNeg}}\\n                              />\\n                            </div>\\n                          </td>\\n                        </tr>\\n                      {{/each}}\\n                    </tbody>\\n                  </table>\\n                </div>\\n                <hr class=\\\"my-2\\\" />\\n                {{#if this.toShow}}\\n                  <p class=\\\"mb-1 font-small text-center\\\"><strong>Puis une transaction dont le montant permettrait de\\n                      résoudre la balance negative :</strong></p>\\n                  <div class=\\\"neg-scroll\\\">\\n                    <table class=\\\"table table-sm table-borderless table-hover scroll\\\">\\n                      <thead>\\n                        <tr>\\n                          <th>Port.</th>\\n                          <th>Montants</th>\\n                          <th>Cat.</th>\\n                          <th>Date</th>\\n                          <th>\\n                          </th>\\n                        </tr>\\n                      </thead>\\n                      <tbody>\\n                        {{#if this.consistencyNegativeBalanceMergeable}}\\n                          {{#each this.consistencyNegativeBalanceMergeable as |item|}}\\n                            <tr>\\n                              <td class=\\\"neg-width1\\\">{{item.wallet}}</td>\\n                              <td class=\\\"neg-width2\\\">{{item.amounts}}</td>\\n                              <td class=\\\"neg-width3\\\">{{item.category}}</td>\\n                              <td class=\\\"neg-width4\\\">{{format-date item.date}}</td>\\n                              <td class=\\\"neg-width5\\\">\\n                                <div class=\\\"form-check p-0\\\">\\n                                  <input\\n                                    class=\\\"form-check-input ms-1\\\"\\n                                    type=\\\"radio\\\"\\n                                    name=\\\"flexRadioNeg2\\\"\\n                                    id={{item.id}}\\n                                    {{on \\\"change\\\" this.selectNeg2}}\\n                                  />\\n                                </div>\\n                              </td>\\n                            </tr>\\n                          {{/each}}\\n                        {{else}}\\n                          <tr>\\n                            <td colspan=\\\"6\\\" class=\\\"text-center\\\">Aucune TX en lien. Avez-vous importé toutes vos\\n                              transactions ?</td>\\n                          </tr>\\n                        {{/if}}\\n                      </tbody>\\n                    </table>\\n                  </div>\\n                {{/if}}\\n              {{else}}\\n                <div class=\\\"d-flex flex-column\\\">\\n                  <div class=\\\"text-center list-group-item list-group-item-action list-group-item-light\\\">\\n                    <div class=\\\"d-flex justify-content-center\\\">\\n                      <div>Aucune erreur associée ! Veuillez contacter le support.</div>\\n                    </div>\\n                  </div>\\n                </div>\\n                <hr />\\n              {{/if}}\\n            </div>\\n          </div>\\n          <BsAlert\\n            class=\\\"m-0 py-1 font-small text-center\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @type=\\\"danger\\\"\\n            @dismissible={{false}}\\n          >\\n            Veillez tout d'abord à bien importer TOUTES vos transactions ; si le problème persiste, contactez le\\n            support. Vous pouvez néanmoins cliquer sur Suivant mais vous ne pourrez générer vos rapports...\\n          </BsAlert>\\n        {{else}}\\n          <BsAlert class=\\\"m-0 py-1 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n            <strong>Bravo !</strong>\\n            Aucune erreur de balance négative n'a été trouvée. Vous pouvez maintenant passer à la suite en cliquant sur\\n            Suivant...\\n          </BsAlert>\\n        {{/if}}\\n      </div>\\n    </modal.body>\\n    <modal.footer class=\\\"justify-content-between\\\">\\n      {{#if this.mergeNegBtn}}\\n        <div class=\\\"d-flex w-25\\\">\\n          <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.mergeNeg}}>Fusion</BsButton>\\n        </div>\\n        <div class=\\\"d-flex justify-content-end w-50\\\">\\n          <div>\\n            <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.setCheckConsistencyAlmost}}>\\n              Retour</BsButton>\\n            <BsButton {{on \\\"click\\\" this.close}}>Annuler</BsButton>\\n          </div>\\n        </div>\\n      {{else}}\\n        <div class=\\\"d-flex justify-content-end w-100\\\">\\n          <div>\\n            <BsButton {{on \\\"click\\\" this.close}}>\\n              Annuler</BsButton>\\n            <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.setCheckConsistencyAlmost}}>\\n              Retour</BsButton>\\n            <BsButton data-test-validate-next-button-3 class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.onValidation}}>\\n              Suivant</BsButton>\\n          </div>\\n        </div>\\n      {{/if}}\\n    </modal.footer>\\n  </div>\\n</BsModal>\\n\\n<BsModal @open={{this.validState}} @backdropClose={{false}} @onHidden={{this.hidden4}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">Validation des TX\\n        <span class=\\\"badge bg-secondary\\\">4</span>\\n      </h4>\\n    </modal.header>\\n    {{#if this.resultWithdrawal}}\\n      <modal.body>\\n        <div class=\\\"container\\\">\\n          <BsAlert\\n            class=\\\"m-0 mb-1 py-1 text-center\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @type=\\\"success\\\"\\n            @dismissible={{false}}\\n          >\\n            Vous venez de caractériser la majorité des transactions\\n            <strong>'Retrait'</strong>\\n            et\\n            <strong>'Dépôt'</strong>...\\n          </BsAlert>\\n          <BsAlert\\n            class=\\\"m-0 my-1 py-1 text-center\\\"\\n            @visible={{true}}\\n            @fade={{true}}\\n            @type=\\\"warning\\\"\\n            @dismissible={{false}}\\n          >\\n            Cela dit nous détectons encore des Retraits non identifiés. Voici la liste de ces transactions restantes\\n            dans votre portefeuille... Veuillez cocher les potentielles transactions liées à des ICO ou cliquer sur\\n            Suivant si vous ne reconnaissez aucune transaction de type ICO :\\n          </BsAlert>\\n          <div class=\\\"d-flex custom-ico\\\">\\n            {{! Liste de tous les RETRAITS }}\\n            <ul class=\\\"list-group list-group-flush w-100\\\">\\n              {{#each this.resultWithdrawal as |item|}}\\n                <li class=\\\"d-flex list-group-item pe-0\\\">\\n                  <div class=\\\"d-flex justify-content-between w-90\\\">\\n                    <div class=\\\"with-width1\\\">{{item.wallet}}</div>\\n                    <div class=\\\"with-width2\\\">{{item.quantity}} {{item.currency}}</div>\\n                    <div class=\\\"with-width3\\\">{{format-date item.date}}</div>\\n                  </div>\\n                  <div class=\\\"ps-3 w-10\\\">\\n                    <input\\n                      class=\\\"form-check-input ms-1\\\"\\n                      type=\\\"checkbox\\\"\\n                      id={{item.id}}\\n                      {{on \\\"change\\\" this.toggleCheck}}\\n                    />\\n                  </div>\\n                </li>\\n              {{/each}}\\n            </ul>\\n          </div>\\n        </div>\\n      </modal.body>\\n      <modal.footer>\\n        <BsButton {{on \\\"click\\\" this.close}}>Annuler</BsButton>\\n        <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.setCheckConsistencyNegativeBalance}}>\\n          Retour</BsButton>\\n\\n        {{#if this.isTabId}}\\n          <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.setIco}}>Suivant</BsButton>\\n        {{else}}\\n          <LinkTo @route=\\\"reports\\\">\\n            <BsButton data-test-validate-next-button-4 class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.close}}>\\n              Suivant</BsButton>\\n          </LinkTo>\\n        {{/if}}\\n      </modal.footer>\\n    {{else}}\\n      <modal.body>\\n        <div class=\\\"container\\\">\\n          <h6>Vous venez de caractériser les transactions\\n            <strong>'Retrait'</strong>\\n            et\\n            <strong>'Dépôt'</strong>. Nous ne détectons aucune transaction de type\\n            <strong>'Retrait'</strong>\\n            restant...\\n          </h6>\\n          <BsAlert class=\\\"m-0 py-1\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n            <strong>Bravo !</strong>\\n            Vous pouvez maintenant passer à la génération des rapports en cliquant sur Suivant...\\n          </BsAlert>\\n        </div>\\n      </modal.body>\\n      <modal.footer>\\n        <BsButton {{on \\\"click\\\" this.close}}>Annuler</BsButton>\\n        <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.setCheckConsistencyNegativeBalance}}>\\n          Retour</BsButton>\\n        <LinkTo @route=\\\"reports\\\">\\n          <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.close}}>\\n            Suivant</BsButton>\\n        </LinkTo>\\n      </modal.footer>\\n    {{/if}}\\n  </div>\\n</BsModal>\\n\\n<BsModal @open={{this.icoState}} @backdropClose={{false}} @onHidden={{this.hidden5}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">Validation des TX\\n        <span class=\\\"badge bg-secondary\\\">4</span>\\n      </h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        <BsAlert\\n          class=\\\"m-0 mb-1 py-1 text-center\\\"\\n          @visible={{true}}\\n          @fade={{true}}\\n          @type=\\\"warning\\\"\\n          @dismissible={{false}}\\n        >\\n          Voici une liste des transactions de type\\n          <strong>'Dépôt'</strong>\\n          qui correspondent potentiellement à/aux transactions\\n          <strong>'Retrait'</strong>\\n          identifiées précédement\\n          <span class=\\\"red\\\">pour des ICO</span>...\\n        </BsAlert>\\n        <BsAlert\\n          class=\\\"m-0 my-1 py-1 text-center\\\"\\n          @visible={{true}}\\n          @fade={{true}}\\n          @type=\\\"danger\\\"\\n          @dismissible={{false}}\\n        >Veuillez fusionner les transactions liées (le cas échéant) puis cliquer sur suivant pour la génération de vos\\n          rapports :\\n        </BsAlert>\\n        <div class=\\\"d-flex\\\">\\n          <div class=\\\"list-group w-100\\\">\\n            {{#if this.checkedWithdraw}}\\n              <div class=\\\"d-flex flex-column custom-ico2\\\">\\n                <ul class=\\\"list-group list-group-flush w-100\\\">\\n                  {{#each this.checkedWithdraw as |item|}}\\n                    <li class=\\\"d-flex list-group-item pe-0\\\">\\n                      <div class=\\\"d-flex justify-content-between w-90\\\">\\n                        <div class=\\\"with-width1\\\">{{item.wallet}}</div>\\n                        <div class=\\\"with-width2\\\">{{item.quantity}} {{item.currency}}</div>\\n                        <div class=\\\"with-width3\\\">{{format-date item.date}}</div>\\n                      </div>\\n                      <div class=\\\"ps-3 w-10\\\">\\n                        <div class=\\\"form-check\\\">\\n                          <input\\n                            class=\\\"form-check-input\\\"\\n                            type=\\\"radio\\\"\\n                            name=\\\"flexRadioWith\\\"\\n                            id=\\\"flexRadioWith1\\\"\\n                            {{on \\\"click\\\" (fn this.selectIds item.id \\\"\\\")}}\\n                          />\\n                        </div>\\n                      </div>\\n                    </li>\\n                  {{/each}}\\n                </ul>\\n              </div>\\n              <hr />\\n              <div class=\\\"d-flex flex-column custom-ico2\\\">\\n                <ul class=\\\"list-group list-group-flush w-100\\\">\\n                  {{#each this.resultDeposit as |deposit|}}\\n                    <li class=\\\"d-flex list-group-item pe-0\\\">\\n                      <div class=\\\"d-flex justify-content-between w-90\\\">\\n                        <div class=\\\"with-width1\\\">{{deposit.wallet}}</div>\\n                        <div class=\\\"with-width2\\\">{{deposit.quantity}} {{deposit.currency}}</div>\\n                        <div class=\\\"with-width3\\\">{{format-date deposit.date}}</div>\\n                      </div>\\n                      <div class=\\\"ps-3 w-10\\\">\\n                        <div class=\\\"form-check\\\">\\n                          <input\\n                            class=\\\"form-check-input\\\"\\n                            type=\\\"radio\\\"\\n                            name=\\\"flexRadioDep\\\"\\n                            id=\\\"flexRadioDep1\\\"\\n                            {{on \\\"click\\\" (fn this.selectIds \\\"\\\" deposit.id)}}\\n                          />\\n                        </div>\\n                      </div>\\n                    </li>\\n                  {{/each}}\\n                </ul>\\n              </div>\\n            {{else}}\\n              <div class=\\\"d-flex flex-column\\\">\\n                <div class=\\\"text-center list-group-item list-group-item-action list-group-item-light\\\">\\n                  <div class=\\\"d-flex justify-content-center\\\">\\n                    <div>Aucune transaction 'Retrait'.</div>\\n                  </div>\\n                </div>\\n              </div>\\n              <hr />\\n            {{/if}}\\n          </div>\\n        </div>\\n      </div>\\n    </modal.body>\\n    <modal.footer class=\\\"justify-content-between\\\">\\n      {{#if this.mergeBtn}}\\n        <div class=\\\"d-flex w-25\\\">\\n          <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.merge}}>Fusion</BsButton>\\n        </div>\\n        <div class=\\\"d-flex justify-content-end w-50\\\">\\n          <div>\\n            {{#if this.isTabId}}\\n              <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.setIco}}>Retour</BsButton>\\n            {{/if}}\\n            <BsButton {{on \\\"click\\\" this.close}}>Annuler</BsButton>\\n          </div>\\n        </div>\\n      {{else}}\\n        <div class=\\\"d-flex justify-content-end w-100\\\">\\n          <div>\\n            <BsButton {{on \\\"click\\\" this.close}}>\\n              Annuler</BsButton>\\n            {{#if this.isTabId}}\\n              <BsButton class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.setIco}}>Retour</BsButton>\\n            {{/if}}\\n            <LinkTo @route=\\\"reports\\\">\\n              <BsButton data-test-validate-next-button-4 class=\\\"btn btn-primary\\\" {{on \\\"click\\\" this.close}}>\\n                Suivant</BsButton>\\n            </LinkTo>\\n          </div>\\n        </div>\\n      {{/if}}\\n    </modal.footer>\\n  </div>\\n</BsModal>\",\"moduleName\":\"cryptofiscafacile-gui/components/tx-table/validate.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/tx-table/validate.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport TxIco from 'cryptofiscafacile-gui/objects/tx-ico';\nimport { TxCategory } from 'cryptofiscafacile-wasm';\n\nimport type Application from 'cryptofiscafacile-gui/services/application';\nimport type Wasm from 'cryptofiscafacile-gui/services/wasm';\nimport type { ConsistencyError, ConsistencyTx } from 'cryptofiscafacile-wasm';\n\ninterface ValidateArgs {\n  modalSt: boolean;\n}\n\nexport default class Validate extends Component<ValidateArgs> {\n  @service declare wasm: Wasm;\n  @service declare application: Application;\n\n  @tracked validState = false;\n  @tracked icoState = false;\n  @tracked consistencyState = false;\n  @tracked consistencyStateNegativeBalance = false;\n  @tracked resultWithdrawal: TxIco[] = [];\n\n  @tracked resultDeposit: TxIco[] = [];\n  @tracked checkedWithdraw: TxIco[] = [];\n\n  @tracked consistencyRelated: ConsistencyTx[][] = [];\n  @tracked consistencyAlmostTx: ConsistencyError[] = [];\n  @tracked firstTx = '';\n\n  @tracked consistencyAlmost = false;\n  @tracked mergeAlmostBtn = false;\n\n  @tracked tabMerge: { id1: string; id2: string } = { id1: '', id2: '' };\n\n  @tracked mergeBtn = false;\n  @tracked isTabId = false;\n\n  @tracked mergeNegBtn = false;\n  @tracked toShow = false;\n  @tracked consistencyNegativeBalanceMergeable: ConsistencyTx[] = [];\n\n  multiId: string[] = [];\n  multiId2: string[] = [];\n  coin = '';\n  time: Date = new Date();\n  dateMax = new Date();\n  dateMin = new Date();\n  index = 0;\n  index2 = 0;\n  tabId: string[] = [];\n  txMerged = false;\n  firstid = '';\n  secondid = '';\n\n  /**\n   * STEP 1 - TO/FROM consistency\n   */\n  @action\n  setCheckConsistency() {\n    this.wasm.checkConsistencyCategVsToFromTask.perform();\n    this.consistencyState = true;\n\n    this.consistencyAlmost = false;\n    this.consistencyStateNegativeBalance = false;\n    this.validState = false;\n    this.icoState = false;\n  }\n\n  get consistencyCategVsToFrom() {\n    return this.wasm.consistencyCategVsToFrom?.errors;\n  }\n\n  /**\n   * STEP 2 - TX to merge\n   */\n  get unprocessedTx() {\n    return this.wasm.consistencyAlmost?.errors ?? [];\n  }\n\n  @action\n  setCheckConsistencyAlmost() {\n    this.consistencyState = false;\n    this.wasm.checkConsistencyAlmostTransferTask.perform();\n    this.consistencyAlmost = true;\n\n    this.consistencyStateNegativeBalance = false;\n    this.validState = false;\n    this.icoState = false;\n  }\n\n  get errorAlmostRelated() {\n    let related: ConsistencyTx[][] = [];\n\n    this.unprocessedTx.forEach((element) => {\n      for (let i = 0; i < this.multiId.length; i++) {\n        if (element.tx.id === this.multiId[i]) {\n          related.push(element.related);\n        }\n      }\n    });\n\n    return related;\n  }\n\n  get coinAlmostRelated() {\n    let coin = '';\n\n    this.unprocessedTx.forEach((element) => {\n      if (element.tx.id === this.firstTx) {\n        coin = element.tx.coin;\n      }\n    });\n\n    return coin;\n  }\n\n  get timeAlmostRelated() {\n    let time: Date = new Date();\n\n    this.unprocessedTx.forEach((element) => {\n      if (element.tx.id === this.firstTx) {\n        time = element.tx.date;\n      }\n    });\n\n    return time;\n  }\n\n  addDays(days: number, date: Date) {\n    let result = new Date(date);\n\n    result.setDate(result.getDate() + days);\n\n    return result;\n  }\n\n  @action\n  selectAlmost(e: { target: HTMLInputElement }) {\n    if (e.target.checked) {\n      this.index += 1;\n      this.mergeAlmostBtn = false;\n\n      // Condition to store the first datas for tx checked, for which we should retain the coin && to filter by Coin/Datemax/Datemin\n      if (this.index === 1) {\n        this.firstTx = e.target.id;\n        this.coin = this.coinAlmostRelated;\n        this.time = this.timeAlmostRelated;\n        this.dateMax = this.addDays(1, this.time);\n        this.dateMin = this.addDays(-1, this.time);\n        // Load a new filter on TX in error\n        this.consistencyAlmostTx = this.unprocessedTx.filter(\n          (tx) => tx.tx.coin === this.coin && (tx.tx.date <= this.dateMax || tx.tx.date >= this.dateMin),\n        );\n      }\n\n      // Work on TX in error related TX(s)\n      this.multiId.push(e.target.id);\n      this.consistencyRelated = this.errorAlmostRelated;\n      // Remove potential duplicabtes in consistencyRelated\n      this.consistencyRelated = [...new Map(this.consistencyRelated.map((v) => [v[0]?.id, v])).values()];\n      // Allow displaying the second part of the modal\n      this.toShow = true;\n    } else if (e.target.checked === false) {\n      this.index -= 1;\n      this.multiId = this.multiId.filter((el) => el !== e.target.id);\n      this.consistencyRelated = this.errorAlmostRelated;\n\n      if (this.index === 0) {\n        this.coin = '';\n        this.firstTx = '';\n        this.time = new Date();\n        this.dateMax = new Date();\n        this.dateMin = new Date();\n        this.toShow = false;\n        this.consistencyAlmostTx = [];\n      }\n    }\n  }\n  @action\n  selectAlmost2(e: { target: HTMLInputElement }) {\n    if (e.target.checked) {\n      this.index2 += 1;\n      this.multiId2.push(e.target.id);\n      this.mergeAlmostBtn = true;\n    } else if (e.target.checked === false) {\n      this.index2 -= 1;\n      this.multiId2 = this.multiId2.filter((el) => el !== e.target.id);\n\n      if (this.index2 === 0) {\n        this.mergeAlmostBtn = false;\n      }\n    }\n  }\n\n  @action\n  async mergeAlmost() {\n    this.toShow = false;\n\n    if (!this.multiId && !this.multiId2) {\n      debug('Try to merge without TX selected !');\n\n      return;\n    }\n\n    if (this.multiId.length > 1 && this.multiId2.length > 1) {\n      debug('Error in multiId or multiId2 array!');\n\n      return;\n    }\n\n    let srcIds = this.multiId.length > 1 ? this.multiId : this.multiId2;\n    let destIds = this.multiId.length > 1 ? this.multiId2 : this.multiId;\n\n    const destId = destIds[0];\n\n    if (destId) {\n      srcIds.forEach(async (srcId) => {\n        await this.wasm.mergeTransactionsTask.perform(srcId, destId);\n        await this.wasm.checkConsistencyAlmostTransferTask.perform();\n        await this.wasm.getTransactionsTask.perform();\n        debug(`merge transactions with src id [${srcId}] to dest id [${destId}]`);\n      });\n    } else {\n      debug('dest id is empty');\n    }\n\n    this.index = 0;\n    this.index2 = 0;\n    this.mergeAlmostBtn = false;\n    this.firstTx = '';\n    this.coin = '';\n    this.time = new Date();\n    this.dateMax = new Date();\n    this.dateMin = new Date();\n    this.multiId = [];\n    this.multiId2 = [];\n    this.consistencyRelated = [];\n    this.consistencyAlmostTx = [];\n  }\n\n  /**\n   * STEP 3 - Negative Balances\n   */\n  @action\n  setCheckConsistencyNegativeBalance() {\n    this.consistencyState = false;\n    this.consistencyAlmost = false;\n    this.wasm.checkConsistencyNegativeBalanceTask.perform();\n    this.consistencyStateNegativeBalance = true;\n\n    this.validState = false;\n    this.icoState = false;\n  }\n\n  get consistencyNegativeBalance() {\n    return this.wasm.consistencyNegativeBalance?.errors ?? [];\n  }\n\n  get showMergeable() {\n    let related: ConsistencyTx[] = [];\n\n    this.consistencyNegativeBalance.forEach((element) => {\n      if (element.tx.id === this.firstid) {\n        related = element.related;\n      }\n    });\n\n    return related;\n  }\n  @action\n  selectNeg(e: { target: HTMLInputElement }) {\n    let id = e.target.id;\n\n    if (e.target.checked) {\n      this.mergeNegBtn = false;\n      this.firstid = id;\n      this.consistencyNegativeBalanceMergeable = this.showMergeable;\n      this.toShow = true;\n    } else {\n      this.toShow = false;\n    }\n  }\n  @action\n  selectNeg2(e: { target: HTMLInputElement }) {\n    let id2 = e.target.id;\n\n    if (e.target.checked) {\n      this.toShow = true;\n      this.secondid = id2;\n\n      this.mergeNegBtn = true;\n    } else {\n      this.toShow = false;\n      this.mergeNegBtn = false;\n    }\n  }\n\n  @action\n  async mergeNeg() {\n    this.toShow = false;\n\n    if (this.firstid && this.secondid) {\n      await this.wasm.mergeTransactionsTask.perform(this.firstid, this.secondid);\n      await this.wasm.checkConsistencyNegativeBalanceTask.perform();\n      await this.wasm.getTransactionsTask.perform();\n      debug('Merge transactions with id1 : ' + this.firstid + ', and id2 : ' + this.secondid);\n    } else {\n      debug('Try to merge without TX selected !');\n    }\n\n    this.mergeNegBtn = false;\n  }\n\n  /**\n   * STEP 4 - ICO\n   */\n  @action\n  onValidation() {\n    let to: TxIco = new TxIco();\n\n    this.consistencyState = false;\n    this.consistencyAlmost = false;\n    this.consistencyStateNegativeBalance = false;\n    this.validState = true;\n    this.icoState = false;\n\n    //1st - List all WITHDRAWALS TXs\n    let res1 = this.wasm.transactions.filter((tx) => 'Retrait' === tx.category || 'ICO' === tx.category);\n    let res2 = this.wasm.transactions.filter((tx) => 'ICO' === tx.category);\n    let res = res1.concat(res2);\n\n    for (const from of res) {\n      to = new TxIco();\n\n      to.id = from.id;\n      to.wallet = from.wallet;\n      to.date = from.date;\n\n      from.from.forEach((element) => {\n        to.quantity = element.quantity;\n        to.currency = element.currency;\n      });\n\n      this.resultWithdrawal.push(to);\n    }\n\n    // Remove potential duplicabtes in resultWithdrawal\n    this.resultWithdrawal = this.resultWithdrawal.filter((v, i, a) => a.findIndex((v2) => v2.id === v.id) === i);\n  }\n\n  @action\n  toggleCheck(e: { target: HTMLInputElement }) {\n    if (e.target.checked) {\n      this.tabId.push(e.target.id);\n      this.isTabId = true;\n    } else if (e.target.checked === false) {\n      this.tabId = this.tabId.filter((el) => el !== e.target.id);\n      this.isTabId = false;\n    }\n  }\n  @action\n  setIco() {\n    this.consistencyState = false;\n    this.consistencyAlmost = false;\n    this.consistencyStateNegativeBalance = false;\n    this.validState = false;\n    this.tabId.forEach((id) => {\n      this.resultWithdrawal.forEach((element) => {\n        if (element.id === id) {\n          this.checkedWithdraw.push(element);\n        }\n      });\n    });\n\n    //2nd - List all DEPOSITS TXs\n    let tx: TxIco = new TxIco();\n    let res = this.wasm.transactions.filter((tx) => 'Dépôt' === tx.category);\n\n    for (const from of res) {\n      tx = new TxIco();\n\n      tx.id = from.id;\n      tx.wallet = from.wallet;\n      tx.date = from.date;\n\n      from.to.forEach((element) => {\n        tx.quantity = element.quantity;\n        tx.currency = element.currency;\n      });\n\n      this.resultDeposit.push(tx);\n    }\n\n    // Remove potential duplicabtes in resultDeposit\n    this.resultDeposit = this.resultDeposit.filter((v, i, a) => a.findIndex((v2) => v2.id === v.id) === i);\n\n    this.icoState = true;\n\n    this.tabId = [];\n    this.resultWithdrawal = [];\n  }\n\n  @action\n  selectIds(idWith: string, idDep: string) {\n    if (idWith) {\n      this.tabMerge.id1 = idWith;\n    }\n\n    if (idDep) {\n      this.tabMerge.id2 = idDep;\n    }\n\n    if (this.tabMerge.id1 && this.tabMerge.id2) {\n      this.mergeBtn = true;\n    } else {\n      this.mergeBtn = false;\n    }\n  }\n  @action\n  async merge() {\n    if (this.tabMerge.id1 && this.tabMerge.id2) {\n      await this.wasm.setCategoryTask.perform(this.tabMerge.id1, TxCategory.ICO);\n      await this.wasm.mergeTransactionsTask.perform(this.tabMerge.id1, this.tabMerge.id2);\n      await this.wasm.getTransactionsTask.perform();\n\n      this.checkedWithdraw = this.checkedWithdraw.filter((e) => e.id !== this.tabMerge.id1);\n\n      this.resultDeposit = this.resultDeposit.filter((e) => e.id !== this.tabMerge.id2);\n    } else {\n      debug('Try to merge without TX selected !');\n    }\n\n    this.mergeBtn = false;\n    this.txMerged = true;\n  }\n\n  @action\n  hidden1() {\n    this.toShow = false;\n  }\n  @action\n  hidden2() {\n    this.mergeAlmostBtn = false;\n    this.toShow = false;\n\n    this.coin = '';\n    this.index = 0;\n    this.index2 = 0;\n    this.firstTx = '';\n    this.time = new Date();\n    this.dateMax = new Date();\n    this.dateMin = new Date();\n    this.multiId = [];\n    this.multiId2 = [];\n    this.consistencyRelated = [];\n    this.toShow = false;\n    this.consistencyAlmostTx = [];\n  }\n  @action\n  hidden3() {\n    this.mergeAlmostBtn = false;\n    this.mergeNegBtn = false;\n    this.toShow = false;\n  }\n  @action\n  hidden4() {\n    this.mergeAlmostBtn = false;\n    this.mergeNegBtn = false;\n    this.toShow = false;\n\n    if (this.icoState) {\n      this.resultWithdrawal = [];\n    } else {\n      this.resultWithdrawal = [];\n      this.checkedWithdraw = [];\n    }\n\n    this.isTabId = false;\n  }\n  @action\n  hidden5() {\n    this.mergeAlmostBtn = false;\n    this.mergeNegBtn = false;\n    this.toShow = false;\n    this.resultWithdrawal = [];\n    this.resultDeposit = [];\n    this.checkedWithdraw = [];\n    this.tabId = [];\n    this.tabMerge = { id1: '', id2: '' };\n    this.isTabId = false;\n    this.mergeBtn = false;\n  }\n\n  @action\n  close() {\n    this.consistencyState = false;\n    this.consistencyAlmost = false;\n    this.consistencyStateNegativeBalance = false;\n    this.validState = false;\n    this.icoState = false;\n\n    this.mergeBtn = false;\n    this.mergeNegBtn = false;\n    this.mergeAlmostBtn = false;\n    this.toShow = false;\n\n    this.coin = '';\n    this.index = 0;\n    this.index2 = 0;\n    this.firstTx = '';\n    this.time = new Date();\n    this.dateMax = new Date();\n    this.dateMin = new Date();\n    this.multiId = [];\n    this.multiId2 = [];\n    this.consistencyRelated = [];\n    this.toShow = false;\n    this.consistencyAlmostTx = [];\n  }\n\n  /**\n   * COPY TO CLIPBOARD PART\n   */\n  @action\n  onSuccess() {\n    debug('Copy to clipboard success');\n  }\n  @action\n  onError() {\n    debug('Copy to clipboard error... Please try again');\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@glimmer/component' {\n  interface Registry {\n    validate: Validate;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsModal @open={{@open}} @backdropClose={{false}} @onShow={{this.reset}} @onHide={{@onHide}} @size=\\\"xl\\\" as |modal|>\\n  <modal.header>\\n    <h4 class=\\\"modal-title\\\">\\n      Ajouter un nouveau portefeuille\\n    </h4>\\n  </modal.header>\\n  <modal.body>\\n    <div class=\\\"row mb-2\\\">\\n      <div class=\\\"col-md-6\\\">\\n        <div class=\\\"d-flex me-auto input-group filter-search\\\">\\n          <span class=\\\"input-group-text\\\" id=\\\"input-search\\\">\\n            <App::Icon @icon=\\\"ion:search\\\" width=\\\"15\\\" height=\\\"15\\\" class=\\\"bi bi-search\\\" />\\n          </span>\\n          <Input\\n            @type=\\\"text\\\"\\n            @value={{@searchedItem}}\\n            class=\\\"form-control input-search\\\"\\n            placeholder=\\\"Rechercher...\\\"\\n            tabindex=\\\"-1\\\"\\n            aria-label=\\\"Rechercher...\\\"\\n            aria-describedby=\\\"input-search\\\"\\n            {{on \\\"input\\\" this.filterWallets}}\\n          />\\n        </div>\\n      </div>\\n      <div class=\\\"col-md-6\\\">\\n        <App::PageNavigator\\n          @userPage={{this.page}}\\n          @maxPage={{this.maxPage}}\\n          @onUserPageChanged={{this.onUserPageChanged}}\\n          class=\\\"float-end\\\"\\n        />\\n      </div>\\n    </div>\\n    <div class=\\\"row\\\">\\n      {{#each this.pageCustodialWallets as |wallet|}}\\n        <div class=\\\"col-xl-3 col-lg-4 col-md-6 mb-2\\\">\\n          <div\\n            class=\\\"card selectable-wallet {{if (eq this.selected wallet.name) 'selected'}}\\\"\\n            role=\\\"button\\\"\\n            {{on \\\"click\\\" (fn this.selectWallet wallet.name)}}\\n          >\\n            <div class=\\\"card-body\\\">\\n              <div class=\\\"d-flex align-items-center\\\">\\n                <div class=\\\"flex-grow-1 ms-3\\\">\\n                  {{wallet.name}}\\n                </div>\\n                <div class=\\\"flex-shrink-0\\\">\\n                  {{! template-lint-disable require-valid-alt-text no-redundant-role }}\\n                  <img role=\\\"presentation\\\" src={{wallet.logo}} />\\n                </div>\\n              </div>\\n            </div>\\n          </div>\\n        </div>\\n      {{/each}}\\n    </div>\\n  </modal.body>\\n  <modal.footer>\\n    {{#if this.invalidSelection}}\\n      <div class=\\\"me-auto text-danger\\\">\\n        Veuillez sélectionner un portefeuille\\n      </div>\\n    {{/if}}\\n    <BsButton @type=\\\"primary\\\" {{on \\\"click\\\" this.addWallet}} disabled={{this.wasm.addEmptyWalletTask.isRunning}}>\\n      Ajouter\\n      {{#if (eq this.selected \\\"\\\")}}\\n        <BsTooltip @title=\\\"Veuillez d'abord sélectionner un portefeuille\\\" />\\n      {{/if}}\\n    </BsButton>\\n    <BsButton {{on \\\"click\\\" modal.close}}>Annuler</BsButton>\\n  </modal.footer>\\n</BsModal>\", {\"contents\":\"<BsModal @open={{@open}} @backdropClose={{false}} @onShow={{this.reset}} @onHide={{@onHide}} @size=\\\"xl\\\" as |modal|>\\n  <modal.header>\\n    <h4 class=\\\"modal-title\\\">\\n      Ajouter un nouveau portefeuille\\n    </h4>\\n  </modal.header>\\n  <modal.body>\\n    <div class=\\\"row mb-2\\\">\\n      <div class=\\\"col-md-6\\\">\\n        <div class=\\\"d-flex me-auto input-group filter-search\\\">\\n          <span class=\\\"input-group-text\\\" id=\\\"input-search\\\">\\n            <App::Icon @icon=\\\"ion:search\\\" width=\\\"15\\\" height=\\\"15\\\" class=\\\"bi bi-search\\\" />\\n          </span>\\n          <Input\\n            @type=\\\"text\\\"\\n            @value={{@searchedItem}}\\n            class=\\\"form-control input-search\\\"\\n            placeholder=\\\"Rechercher...\\\"\\n            tabindex=\\\"-1\\\"\\n            aria-label=\\\"Rechercher...\\\"\\n            aria-describedby=\\\"input-search\\\"\\n            {{on \\\"input\\\" this.filterWallets}}\\n          />\\n        </div>\\n      </div>\\n      <div class=\\\"col-md-6\\\">\\n        <App::PageNavigator\\n          @userPage={{this.page}}\\n          @maxPage={{this.maxPage}}\\n          @onUserPageChanged={{this.onUserPageChanged}}\\n          class=\\\"float-end\\\"\\n        />\\n      </div>\\n    </div>\\n    <div class=\\\"row\\\">\\n      {{#each this.pageCustodialWallets as |wallet|}}\\n        <div class=\\\"col-xl-3 col-lg-4 col-md-6 mb-2\\\">\\n          <div\\n            class=\\\"card selectable-wallet {{if (eq this.selected wallet.name) 'selected'}}\\\"\\n            role=\\\"button\\\"\\n            {{on \\\"click\\\" (fn this.selectWallet wallet.name)}}\\n          >\\n            <div class=\\\"card-body\\\">\\n              <div class=\\\"d-flex align-items-center\\\">\\n                <div class=\\\"flex-grow-1 ms-3\\\">\\n                  {{wallet.name}}\\n                </div>\\n                <div class=\\\"flex-shrink-0\\\">\\n                  {{! template-lint-disable require-valid-alt-text no-redundant-role }}\\n                  <img role=\\\"presentation\\\" src={{wallet.logo}} />\\n                </div>\\n              </div>\\n            </div>\\n          </div>\\n        </div>\\n      {{/each}}\\n    </div>\\n  </modal.body>\\n  <modal.footer>\\n    {{#if this.invalidSelection}}\\n      <div class=\\\"me-auto text-danger\\\">\\n        Veuillez sélectionner un portefeuille\\n      </div>\\n    {{/if}}\\n    <BsButton @type=\\\"primary\\\" {{on \\\"click\\\" this.addWallet}} disabled={{this.wasm.addEmptyWalletTask.isRunning}}>\\n      Ajouter\\n      {{#if (eq this.selected \\\"\\\")}}\\n        <BsTooltip @title=\\\"Veuillez d'abord sélectionner un portefeuille\\\" />\\n      {{/if}}\\n    </BsButton>\\n    <BsButton {{on \\\"click\\\" modal.close}}>Annuler</BsButton>\\n  </modal.footer>\\n</BsModal>\",\"moduleName\":\"cryptofiscafacile-gui/components/user-wallets/add-modal.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/user-wallets/add-modal.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport { SortOrder } from 'cryptofiscafacile-gui/enums/sort-order';\nimport Sorts from 'cryptofiscafacile-gui/utils/sorts';\n\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\nimport type { Transaction } from 'cryptofiscafacile-wasm';\n\ninterface ReportingAddWalletModalArgs {\n  onHide: () => void;\n  onWalletAdded: () => void;\n  open: boolean;\n  txs: Transaction[];\n}\n\nexport default class UserWalletsAddModal extends Component<ReportingAddWalletModalArgs> {\n  @service declare wasm: WasmService;\n\n  @tracked userPage = 1;\n\n  pageSize = 12;\n\n  constructor(owner: unknown, args: ReportingAddWalletModalArgs) {\n    super(owner, args);\n\n    if (!this.wasm.walletDefs) {\n      this.wasm.getWalletDefinitionsTask.perform();\n    }\n  }\n\n  @action\n  reset() {\n    this.invalidSelection = false;\n    this.selected = '';\n    this.walletNameFilter = '';\n  }\n\n  get custodialWallets() {\n    const searchString = this.walletNameFilter\n      .toLowerCase()\n      .normalize('NFD')\n      .replace(/\\p{Diacritic}/gu, '');\n\n    return (\n      (this.wasm.walletDefs ?? [])\n        .filter((w) => w.custodial)\n        .filter((w) =>\n          w.name\n            .toLowerCase()\n            .normalize('NFD')\n            .replace(/\\p{Diacritic}/gu, '')\n            .includes(searchString),\n        )\n        .sort(Sorts.text((w) => w.name, SortOrder.ASC)) ?? []\n    );\n  }\n\n  get pageCustodialWallets() {\n    return this.custodialWallets.slice((this.page - 1) * this.pageSize, this.page * this.pageSize);\n  }\n\n  get page() {\n    return Math.min(this.maxPage, this.userPage);\n  }\n\n  get maxPage() {\n    return Math.max(1, Math.ceil(this.custodialWallets.length / this.pageSize));\n  }\n\n  @action\n  onUserPageChanged(page: number): void {\n    this.userPage = page;\n  }\n\n  @tracked walletNameFilter = '';\n\n  @action\n  filterWallets(e: { target: HTMLSelectElement }) {\n    this.walletNameFilter = e.target.value;\n    this.userPage = 1;\n  }\n\n  @tracked selected = '';\n\n  @action\n  selectWallet(wallet: string) {\n    this.invalidSelection = false;\n    this.selected = wallet;\n  }\n\n  @tracked invalidSelection = false;\n\n  @action\n  async addWallet() {\n    if (!this.selected) {\n      this.invalidSelection = true;\n\n      return;\n    }\n\n    await this.wasm.addEmptyWalletTask.perform(this.selected);\n    this.args.onWalletAdded();\n    this.args.onHide();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsButton\\n  {{download filename=@filename fileUrl=this.fileUrl}}\\n  @type={{\\\"none\\\"}}\\n  class=\\\"wallet-action-icon\\\"\\n  disabled={{this.downloadingThisFile}}\\n  {{on \\\"click\\\" this.buildDownloadFile}}\\n>\\n  {{#if this.downloadingThisFile}}\\n    <span class=\\\"spinner-border spinner-border-sm\\\" role=\\\"status\\\" aria-hidden=\\\"true\\\"></span>\\n  {{else}}\\n    <App::Icon @icon=\\\"ion:download-outline\\\" width=\\\"18\\\" />\\n    <BsTooltip @placement=\\\"right\\\">Télécharger fichier</BsTooltip>\\n  {{/if}}\\n</BsButton>\", {\"contents\":\"<BsButton\\n  {{download filename=@filename fileUrl=this.fileUrl}}\\n  @type={{\\\"none\\\"}}\\n  class=\\\"wallet-action-icon\\\"\\n  disabled={{this.downloadingThisFile}}\\n  {{on \\\"click\\\" this.buildDownloadFile}}\\n>\\n  {{#if this.downloadingThisFile}}\\n    <span class=\\\"spinner-border spinner-border-sm\\\" role=\\\"status\\\" aria-hidden=\\\"true\\\"></span>\\n  {{else}}\\n    <App::Icon @icon=\\\"ion:download-outline\\\" width=\\\"18\\\" />\\n    <BsTooltip @placement=\\\"right\\\">Télécharger fichier</BsTooltip>\\n  {{/if}}\\n</BsButton>\",\"moduleName\":\"cryptofiscafacile-gui/components/user-wallets/download.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/user-wallets/download.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport type Wasm from 'cryptofiscafacile-gui/services/wasm';\nimport type { TaskInstance } from 'ember-concurrency';\n\ninterface UserWalletsDownloadArgs {\n  filename: string;\n  type: string;\n}\n\nexport default class UserWalletsDownload extends Component<UserWalletsDownloadArgs> {\n  @service declare wasm: Wasm;\n\n  @tracked downloadTask?: TaskInstance<void>;\n\n  @tracked fileUrl = '';\n\n  get downloadingThisFile() {\n    return this.downloadTask?.isRunning;\n  }\n\n  get mimeType() {\n    switch (this.args.type) {\n      case 'CSV': {\n        return 'text/csv';\n      }\n      case 'JSON': {\n        return 'application/json';\n      }\n      case 'XLSX': {\n        return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n      }\n    }\n\n    return undefined;\n  }\n\n  @action\n  async buildDownloadFile() {\n    debug('Download file: ' + this.args.filename);\n    this.downloadTask = this.wasm.downloadFileTask.perform(this.args.filename);\n    await this.downloadTask;\n\n    if (this.wasm.fileContent) {\n      // Convert Uint8Array to ArrayBuffer\n      let buf = this.wasm.fileContent.buffer.slice(\n        this.wasm.fileContent.byteOffset,\n        this.wasm.fileContent.byteLength + this.wasm.fileContent.byteOffset,\n      );\n\n      //Create blob from the ArrayBuffer\n\n      let blob = new Blob([buf], { type: this.mimeType });\n\n      // Then create the URI, for file download\n      this.fileUrl = window.URL.createObjectURL(blob);\n    }\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@glimmer/component' {\n  interface Registry {\n    'user-wallets-download': UserWalletsDownload;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{! template-lint-disable no-duplicate-id }}\\n<div id=\\\"intro-wallet\\\" class=\\\"d-flex flex-column\\\">\\n  <div\\n    class=\\\"row pt-1 pb-3 border-bottom\\\"\\n    data-title=\\\"Portefeuilles\\\"\\n    data-intro=\\\"Bienvenue 👋 Vous allez pouvoir manuellement ajouter tous vos comptes d'actifs numériques via cette partie de page!\\\"\\n  >\\n    <div class=\\\"col-lg-12 d-flex flex-md-column\\\">\\n      <div class=\\\"add-import\\\">\\n        <div class=\\\"title\\\">\\n          <label for=\\\"inputFile\\\" class=\\\"text-center add-import-title\\\">Importer un ou plusieurs nouveau(x) fichier(s)</label>\\n          <p class=\\\"add-import-fichier\\\" id=\\\"inputFile\\\">Format(s) de fichier admis: JSON, CSV, XLSX</p>\\n        </div>\\n        <div class=\\\"width-media\\\">\\n          <div class=\\\"input-group justify-content-evenly\\\">\\n            {{! template-lint-disable require-input-label }}\\n            <input\\n              type=\\\"file\\\"\\n              class=\\\"form-control upload\\\"\\n              id=\\\"file-input\\\"\\n              multiple\\n              aria-describedby=\\\"file-input\\\"\\n              aria-label=\\\"Upload\\\"\\n              data-title=\\\"Première étape\\\"\\n              data-intro=\\\"Un clique sur cette zone vous permettra de choisir UN fichier voire même PLUSIEURS fichiers (Tips: appuyer sur la touche shift puis sélectionner plusieurs fichiers pour cela) dans la fenêtre qui s'affichera...\\\"\\n              {{on \\\"change\\\" this.upload}}\\n            />\\n            <BsButton @disabled={{this.isAddingFiles}} @type=\\\"primary\\\" id=\\\"addFilesButton\\\" {{on \\\"click\\\" this.add}}>\\n              {{#if this.isAddingFiles}}\\n                <span class=\\\"spinner-border spinner-border-sm\\\" role=\\\"status\\\" aria-hidden=\\\"true\\\"></span>\\n                En cours\\n              {{else}}\\n                Ajouter\\n              {{/if}}\\n            </BsButton>\\n          </div>\\n        </div>\\n        {{#if this.didAddedFiles}}\\n          <div class=\\\"width-media\\\">\\n            <BsProgress as |pg|>\\n              <pg.bar @value={{this.progressValue}} @minValue={{10}} @showLabel={{true}} @type=\\\"success\\\" />\\n            </BsProgress>\\n          </div>\\n        {{else}}\\n          <div class=\\\"width-media\\\">\\n            <BsProgress as |pg|>\\n              <pg.bar @value={{0}} @showLabel={{true}} @type=\\\"success\\\" />\\n            </BsProgress>\\n          </div>\\n        {{/if}}\\n      </div>\\n    </div>\\n  </div>\\n  {{! Table }}\\n  <div class=\\\"row mt-3\\\">\\n    <div class=\\\"col-lg-9 d-flex\\\">\\n      <div class=\\\"d-flex flex-column w-100\\\">\\n        <p class=\\\"add-import-title mb-2\\\">Historique des fichiers importés</p>\\n        <div\\n          class=\\\"wallets\\\"\\n          data-title=\\\"Récapitulatif\\\"\\n          data-intro=\\\"Ce tableau vous permettra de voir un récapitulatif de tous les fichiers que vous aurez importés, qu'ils soient de types CSV ou JSON, ainsi que les transactions rapatriées depuis la page Outils et l'utilisation des API. En outre ce tableau vous montrera les transactions ajoutées après calculs du moteur CryptoFiscaFacile...\\\"\\n        >\\n          <table class=\\\"table wallet-table scroll-behaviour-smooth\\\" data-test-table-wallets>\\n            <thead>\\n              <tr class=\\\"line-height-head\\\">\\n                <th scope=\\\"col\\\">Type</th>\\n                {{! template-lint-disable no-invalid-interactive }}\\n                <th scope=\\\"col\\\" {{on \\\"click\\\" (fn this.sortPf this.pfSortOrder)}}>\\n                  <div class=\\\"d-flex justify-content-between\\\">\\n                    <div>Portefeuille</div>\\n                    {{#if (eq this.pfSortOrder \\\"DESC\\\")}}\\n                      <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-down-circle-outline\\\" /></div>\\n                    {{else if (eq this.pfSortOrder \\\"ASC\\\")}}\\n                      <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-up-circle-outline\\\" /></div>\\n                    {{else}}\\n                      <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:remove-outline\\\" /></div>\\n                    {{/if}}\\n                  </div>\\n                </th>\\n                <th\\n                  scope=\\\"col\\\"\\n                  data-title=\\\"Transactions\\\"\\n                  data-intro=\\\"...Il se peut que nous ayons AJOUTE moins de transactions que le nombre de transactions TROUVEES! C'est tout à fait normal, le moteur CryptoFiscaFacile détermine les associations de transactions et détecte même les potentiels doublons. Il sera donc tout à fait normal de retrouver un résultat du type [X transactions trouvées (Y ajoutées)] avec X plus grand que Y.\\\"\\n                >Résultats</th>\\n                {{! template-lint-disable no-invalid-interactive }}\\n                <th scope=\\\"col\\\" {{on \\\"click\\\" (fn this.sortName this.nameSortOrder)}}>\\n                  <div class=\\\"d-flex justify-content-between\\\">\\n                    <div>Fichier</div>\\n                    {{#if (eq this.nameSortOrder \\\"DESC\\\")}}\\n                      <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-down-circle-outline\\\" /></div>\\n                    {{else if (eq this.nameSortOrder \\\"ASC\\\")}}\\n                      <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-up-circle-outline\\\" /></div>\\n                    {{else}}\\n                      <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:remove-outline\\\" /></div>\\n                    {{/if}}\\n                  </div>\\n                </th>\\n                <th\\n                  scope=\\\"col\\\"\\n                  data-title=\\\"Transactions\\\"\\n                  data-intro=\\\"Il se peut également que le moteur CryptoFiscaFacile rencontre des transactions qu'il ne connait pas. Afin de mettre à jour l'application, nous vous proposons de transmettre les informations utiles (et complètement anonymes) pour que le moteur évolue...\\\"\\n                >Erreur(s)</th>\\n                <th\\n                  scope=\\\"col\\\"\\n                  data-title=\\\"Transactions\\\"\\n                  data-intro=\\\"Vous aurez également la possibilité de supprimer un fichier et ses transactions...\\\"\\n                ></th>\\n              </tr>\\n            </thead>\\n            {{#if this.wasm.getWalletsTask.isRunning}}\\n              <tbody>\\n                <tr class=\\\"line-height-tx none\\\">\\n                  <td colspan=\\\"6\\\">\\n                    <div class=\\\"d-flex justify-content-center align-items-center\\\">\\n                      <div class=\\\"spinner-border\\\" role=\\\"status\\\">\\n                        <span class=\\\"visually-hidden\\\"></span>\\n                      </div>\\n                    </div>\\n                  </td>\\n                </tr>\\n              </tbody>\\n            {{else}}\\n              {{#if this.sortedHistory}}\\n                <tbody>\\n                  {{#each this.sortedHistory as |data|}}\\n                    <UserWallets::Wallet @wallet={{data}} />\\n                  {{/each}}\\n                </tbody>\\n              {{else}}\\n                <tbody>\\n                  {{! data is empty, so display empty line }}\\n                  <tr class=\\\"line-height-wallets none\\\">\\n                    <td colspan=\\\"6\\\">\\n                      AUCUN IMPORT\\n                    </td>\\n                  </tr>\\n                </tbody>\\n              {{/if}}\\n            {{/if}}\\n          </table>\\n        </div>\\n      </div>\\n    </div>\\n    <div class=\\\"col-lg-3 d-flex car\\\">\\n      {{#if this.wasm.getWalletsTask.isRunning}}\\n        <div class=\\\"d-flex justify-content-center align-items-start mt-5 pt-4\\\">\\n          <div class=\\\"spinner-border\\\" role=\\\"status\\\">\\n            <span class=\\\"visually-hidden\\\"></span>\\n          </div>\\n        </div>\\n      {{else}}\\n        <UserWallets::List @wallets={{this.wasm.wallets}} />\\n      {{/if}}\\n    </div>\\n  </div>\\n</div>\", {\"contents\":\"{{! template-lint-disable no-duplicate-id }}\\n<div id=\\\"intro-wallet\\\" class=\\\"d-flex flex-column\\\">\\n  <div\\n    class=\\\"row pt-1 pb-3 border-bottom\\\"\\n    data-title=\\\"Portefeuilles\\\"\\n    data-intro=\\\"Bienvenue 👋 Vous allez pouvoir manuellement ajouter tous vos comptes d'actifs numériques via cette partie de page!\\\"\\n  >\\n    <div class=\\\"col-lg-12 d-flex flex-md-column\\\">\\n      <div class=\\\"add-import\\\">\\n        <div class=\\\"title\\\">\\n          <label for=\\\"inputFile\\\" class=\\\"text-center add-import-title\\\">Importer un ou plusieurs nouveau(x) fichier(s)</label>\\n          <p class=\\\"add-import-fichier\\\" id=\\\"inputFile\\\">Format(s) de fichier admis: JSON, CSV, XLSX</p>\\n        </div>\\n        <div class=\\\"width-media\\\">\\n          <div class=\\\"input-group justify-content-evenly\\\">\\n            {{! template-lint-disable require-input-label }}\\n            <input\\n              type=\\\"file\\\"\\n              class=\\\"form-control upload\\\"\\n              id=\\\"file-input\\\"\\n              multiple\\n              aria-describedby=\\\"file-input\\\"\\n              aria-label=\\\"Upload\\\"\\n              data-title=\\\"Première étape\\\"\\n              data-intro=\\\"Un clique sur cette zone vous permettra de choisir UN fichier voire même PLUSIEURS fichiers (Tips: appuyer sur la touche shift puis sélectionner plusieurs fichiers pour cela) dans la fenêtre qui s'affichera...\\\"\\n              {{on \\\"change\\\" this.upload}}\\n            />\\n            <BsButton @disabled={{this.isAddingFiles}} @type=\\\"primary\\\" id=\\\"addFilesButton\\\" {{on \\\"click\\\" this.add}}>\\n              {{#if this.isAddingFiles}}\\n                <span class=\\\"spinner-border spinner-border-sm\\\" role=\\\"status\\\" aria-hidden=\\\"true\\\"></span>\\n                En cours\\n              {{else}}\\n                Ajouter\\n              {{/if}}\\n            </BsButton>\\n          </div>\\n        </div>\\n        {{#if this.didAddedFiles}}\\n          <div class=\\\"width-media\\\">\\n            <BsProgress as |pg|>\\n              <pg.bar @value={{this.progressValue}} @minValue={{10}} @showLabel={{true}} @type=\\\"success\\\" />\\n            </BsProgress>\\n          </div>\\n        {{else}}\\n          <div class=\\\"width-media\\\">\\n            <BsProgress as |pg|>\\n              <pg.bar @value={{0}} @showLabel={{true}} @type=\\\"success\\\" />\\n            </BsProgress>\\n          </div>\\n        {{/if}}\\n      </div>\\n    </div>\\n  </div>\\n  {{! Table }}\\n  <div class=\\\"row mt-3\\\">\\n    <div class=\\\"col-lg-9 d-flex\\\">\\n      <div class=\\\"d-flex flex-column w-100\\\">\\n        <p class=\\\"add-import-title mb-2\\\">Historique des fichiers importés</p>\\n        <div\\n          class=\\\"wallets\\\"\\n          data-title=\\\"Récapitulatif\\\"\\n          data-intro=\\\"Ce tableau vous permettra de voir un récapitulatif de tous les fichiers que vous aurez importés, qu'ils soient de types CSV ou JSON, ainsi que les transactions rapatriées depuis la page Outils et l'utilisation des API. En outre ce tableau vous montrera les transactions ajoutées après calculs du moteur CryptoFiscaFacile...\\\"\\n        >\\n          <table class=\\\"table wallet-table scroll-behaviour-smooth\\\" data-test-table-wallets>\\n            <thead>\\n              <tr class=\\\"line-height-head\\\">\\n                <th scope=\\\"col\\\">Type</th>\\n                {{! template-lint-disable no-invalid-interactive }}\\n                <th scope=\\\"col\\\" {{on \\\"click\\\" (fn this.sortPf this.pfSortOrder)}}>\\n                  <div class=\\\"d-flex justify-content-between\\\">\\n                    <div>Portefeuille</div>\\n                    {{#if (eq this.pfSortOrder \\\"DESC\\\")}}\\n                      <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-down-circle-outline\\\" /></div>\\n                    {{else if (eq this.pfSortOrder \\\"ASC\\\")}}\\n                      <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-up-circle-outline\\\" /></div>\\n                    {{else}}\\n                      <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:remove-outline\\\" /></div>\\n                    {{/if}}\\n                  </div>\\n                </th>\\n                <th\\n                  scope=\\\"col\\\"\\n                  data-title=\\\"Transactions\\\"\\n                  data-intro=\\\"...Il se peut que nous ayons AJOUTE moins de transactions que le nombre de transactions TROUVEES! C'est tout à fait normal, le moteur CryptoFiscaFacile détermine les associations de transactions et détecte même les potentiels doublons. Il sera donc tout à fait normal de retrouver un résultat du type [X transactions trouvées (Y ajoutées)] avec X plus grand que Y.\\\"\\n                >Résultats</th>\\n                {{! template-lint-disable no-invalid-interactive }}\\n                <th scope=\\\"col\\\" {{on \\\"click\\\" (fn this.sortName this.nameSortOrder)}}>\\n                  <div class=\\\"d-flex justify-content-between\\\">\\n                    <div>Fichier</div>\\n                    {{#if (eq this.nameSortOrder \\\"DESC\\\")}}\\n                      <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-down-circle-outline\\\" /></div>\\n                    {{else if (eq this.nameSortOrder \\\"ASC\\\")}}\\n                      <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:chevron-up-circle-outline\\\" /></div>\\n                    {{else}}\\n                      <div class=\\\"sort-icon me-3\\\"><App::Icon @icon=\\\"ion:remove-outline\\\" /></div>\\n                    {{/if}}\\n                  </div>\\n                </th>\\n                <th\\n                  scope=\\\"col\\\"\\n                  data-title=\\\"Transactions\\\"\\n                  data-intro=\\\"Il se peut également que le moteur CryptoFiscaFacile rencontre des transactions qu'il ne connait pas. Afin de mettre à jour l'application, nous vous proposons de transmettre les informations utiles (et complètement anonymes) pour que le moteur évolue...\\\"\\n                >Erreur(s)</th>\\n                <th\\n                  scope=\\\"col\\\"\\n                  data-title=\\\"Transactions\\\"\\n                  data-intro=\\\"Vous aurez également la possibilité de supprimer un fichier et ses transactions...\\\"\\n                ></th>\\n              </tr>\\n            </thead>\\n            {{#if this.wasm.getWalletsTask.isRunning}}\\n              <tbody>\\n                <tr class=\\\"line-height-tx none\\\">\\n                  <td colspan=\\\"6\\\">\\n                    <div class=\\\"d-flex justify-content-center align-items-center\\\">\\n                      <div class=\\\"spinner-border\\\" role=\\\"status\\\">\\n                        <span class=\\\"visually-hidden\\\"></span>\\n                      </div>\\n                    </div>\\n                  </td>\\n                </tr>\\n              </tbody>\\n            {{else}}\\n              {{#if this.sortedHistory}}\\n                <tbody>\\n                  {{#each this.sortedHistory as |data|}}\\n                    <UserWallets::Wallet @wallet={{data}} />\\n                  {{/each}}\\n                </tbody>\\n              {{else}}\\n                <tbody>\\n                  {{! data is empty, so display empty line }}\\n                  <tr class=\\\"line-height-wallets none\\\">\\n                    <td colspan=\\\"6\\\">\\n                      AUCUN IMPORT\\n                    </td>\\n                  </tr>\\n                </tbody>\\n              {{/if}}\\n            {{/if}}\\n          </table>\\n        </div>\\n      </div>\\n    </div>\\n    <div class=\\\"col-lg-3 d-flex car\\\">\\n      {{#if this.wasm.getWalletsTask.isRunning}}\\n        <div class=\\\"d-flex justify-content-center align-items-start mt-5 pt-4\\\">\\n          <div class=\\\"spinner-border\\\" role=\\\"status\\\">\\n            <span class=\\\"visually-hidden\\\"></span>\\n          </div>\\n        </div>\\n      {{else}}\\n        <UserWallets::List @wallets={{this.wasm.wallets}} />\\n      {{/if}}\\n    </div>\\n  </div>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/user-wallets/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/user-wallets/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport { SortOrder } from 'cryptofiscafacile-gui/enums/sort-order';\nimport Sorts from 'cryptofiscafacile-gui/utils/sorts';\n\nimport Option from '../option';\n\nimport type Wasm from 'cryptofiscafacile-gui/services/wasm';\nimport type { FileUsageStatus } from 'cryptofiscafacile-wasm';\n\nexport default class Wallets extends Component {\n  @service declare wasm: Wasm;\n\n  files!: FileList;\n  len = 0;\n\n  @tracked calculs = '';\n  @tracked selectedWallet = [Option.ALL];\n  @tracked pfSortOrder = SortOrder.NONE;\n  @tracked nameSortOrder = SortOrder.NONE;\n\n  inputFileElement: HTMLInputElement | undefined;\n  @tracked didAddedFiles = false;\n\n  get unprocessedHistory() {\n    return this.wasm.history;\n  }\n\n  get sortedHistory() {\n    if (this.nameSortOrder !== SortOrder.NONE) {\n      return this.unprocessedHistory.slice().sort(Sorts.text((file: FileUsageStatus) => file.name, this.nameSortOrder));\n    }\n\n    if (this.pfSortOrder !== SortOrder.NONE) {\n      return this.unprocessedHistory.slice().sort(Sorts.text((file: FileUsageStatus) => file.kind, this.pfSortOrder));\n    }\n\n    return this.unprocessedHistory;\n  }\n\n  get isAddingFiles() {\n    return this.wasm.digestFilesTask.isRunning;\n  }\n\n  get progressValue() {\n    return (\n      (this.wasm.digestFilesTaskUseFileTasks.filter((t) => t.isFinished).length * 100) /\n      this.wasm.digestFilesTaskFilesAmount\n    );\n  }\n\n  @action\n  sortPf(currentOrder: SortOrder) {\n    this.nameSortOrder = SortOrder.NONE;\n    this.pfSortOrder = currentOrder === SortOrder.DESC ? SortOrder.ASC : SortOrder.DESC;\n  }\n  @action\n  sortName(currentOrder: SortOrder) {\n    this.pfSortOrder = SortOrder.NONE;\n    this.nameSortOrder = currentOrder === SortOrder.DESC ? SortOrder.ASC : SortOrder.DESC;\n  }\n\n  @action\n  async upload(e: { target: HTMLInputElement }) {\n    this.inputFileElement = e.target;\n\n    this.files = this.inputFileElement.files as FileList;\n    this.len = this.files.length;\n  }\n\n  @action\n  async add() {\n    if (this.files) {\n      const filesAsArray = Array.from(this.files);\n\n      this.didAddedFiles = true;\n      await this.wasm.digestFilesTask.perform(filesAsArray);\n\n      if (this.inputFileElement) {\n        this.inputFileElement.value = '';\n      }\n    } else {\n      debug('File(s) not recognized or no file loaded.');\n    }\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@glimmer/component' {\n  interface Registry {\n    wallets: Wallets;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<ul\\n  class=\\\"car-items\\\"\\n  data-title=\\\"Vos portefeuilles\\\"\\n  data-intro=\\\"Enfin, l'application en déduit la liste de tous vos 'portefeuilles' d'actifs numériques. Vous pouvez cliquer sur un compte et visualiser rapidement le récapitulatif des transactions globales de ce portefeuille!\\\"\\n>\\n  {{#if @wallets}}\\n    {{#each @wallets as |wallet|}}\\n      <li class=\\\"car-item\\\">\\n        <div class=\\\"car-item-cards\\\">\\n          <p class=\\\"car-item-cards-title\\\">{{wallet.name}}</p>\\n          <img src=\\\"{{wallet.icon}}\\\" alt=\\\"{{wallet.name}}\\\" />\\n        </div>\\n      </li>\\n    {{/each}}\\n  {{else}}\\n    <li class=\\\"car-item\\\">\\n      <div class=\\\"car-item-cards\\\">\\n        <p class=\\\"car-item-cards-title\\\">Aucun Wallet</p>\\n        <img src=\\\"crypto/default.png\\\" alt=\\\"default\\\" />\\n      </div>\\n    </li>\\n  {{/if}}\\n</ul>\", {\"contents\":\"<ul\\n  class=\\\"car-items\\\"\\n  data-title=\\\"Vos portefeuilles\\\"\\n  data-intro=\\\"Enfin, l'application en déduit la liste de tous vos 'portefeuilles' d'actifs numériques. Vous pouvez cliquer sur un compte et visualiser rapidement le récapitulatif des transactions globales de ce portefeuille!\\\"\\n>\\n  {{#if @wallets}}\\n    {{#each @wallets as |wallet|}}\\n      <li class=\\\"car-item\\\">\\n        <div class=\\\"car-item-cards\\\">\\n          <p class=\\\"car-item-cards-title\\\">{{wallet.name}}</p>\\n          <img src=\\\"{{wallet.icon}}\\\" alt=\\\"{{wallet.name}}\\\" />\\n        </div>\\n      </li>\\n    {{/each}}\\n  {{else}}\\n    <li class=\\\"car-item\\\">\\n      <div class=\\\"car-item-cards\\\">\\n        <p class=\\\"car-item-cards-title\\\">Aucun Wallet</p>\\n        <img src=\\\"crypto/default.png\\\" alt=\\\"default\\\" />\\n      </div>\\n    </li>\\n  {{/if}}\\n</ul>\",\"moduleName\":\"cryptofiscafacile-gui/components/user-wallets/list/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/user-wallets/list/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"mx-2 my-3 {{@id}}\\\">\\n  <label for={{@id}} class=\\\"form-label\\\">{{@label}}</label>\\n  <div class=\\\"d-flex\\\">\\n    {{yield}}\\n    <CopyButton\\n      class=\\\"btn btn-primary color\\\"\\n      @target=\\\"#{{@id}}\\\"\\n      @onSuccess={{this.onSuccess}}\\n      @onError={{this.onError}}\\n    >\\n      <App::Icon @icon=\\\"ion:clipboard-outline\\\" />\\n      <BsTooltip @placement=\\\"right\\\">Copier texte</BsTooltip>\\n    </CopyButton>\\n  </div>\\n</div>\", {\"contents\":\"<div class=\\\"mx-2 my-3 {{@id}}\\\">\\n  <label for={{@id}} class=\\\"form-label\\\">{{@label}}</label>\\n  <div class=\\\"d-flex\\\">\\n    {{yield}}\\n    <CopyButton\\n      class=\\\"btn btn-primary color\\\"\\n      @target=\\\"#{{@id}}\\\"\\n      @onSuccess={{this.onSuccess}}\\n      @onError={{this.onError}}\\n    >\\n      <App::Icon @icon=\\\"ion:clipboard-outline\\\" />\\n      <BsTooltip @placement=\\\"right\\\">Copier texte</BsTooltip>\\n    </CopyButton>\\n  </div>\\n</div>\",\"moduleName\":\"cryptofiscafacile-gui/components/user-wallets/transmit/content.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/user-wallets/transmit/content.hbs\"}});\nimport Component from '@glimmer/component';\nimport { debug } from '@ember/debug';\nimport { action } from '@ember/object';\n\ninterface UserWalletsTransmitContentArgs {\n  id: string;\n  label: string;\n}\n\nexport default class UserWalletsTransmitContent extends Component<UserWalletsTransmitContentArgs> {\n  @action\n  onSuccess() {\n    debug('Copy to clipboard success');\n  }\n  @action\n  onError() {\n    debug('Copy to clipboard error... Please try again');\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@glimmer/component' {\n  interface Registry {\n    'user-wallets-transmit-content': UserWalletsTransmitContent;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<BsButton {{on \\\"click\\\" this.onTransmit}} class=\\\"btn btn-primary btn-sm\\\">\\n  SUPPORT\\n  <BsTooltip @placement=\\\"right\\\">Une erreur a été détectée... Il s'agit peut être d'une catégorie de transaction inconnue\\n    du moteur ou un fichier qui aurait été modifié par la plateforme. Veuillez cliquer pour en savoir plus !\\n  </BsTooltip>\\n</BsButton>\\n\\n{{! Modal for TX VALIDATION PROCESS HTML }}\\n<BsModal @open={{this.transmitModal}} @backdropClose={{false}} @onHidden={{this.hidden}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">Contact Support</h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        <BsAlert class=\\\"m-0 py-1 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n          <strong>Ce fichier contient des transactions \\\"inconnues\\\" du moteur CryptoFiscaFacile.</strong>\\n        </BsAlert>\\n        <BsAlert class=\\\"my-2 py-1 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n          Veuillez donc nous transmettre les informations ci-dessous par e-mail\\n        </BsAlert>\\n        {{#if this.nameRequired}}\\n          <div class=\\\"mx-2 my-3\\\">\\n            <label for=\\\"name\\\" class=\\\"form-label\\\">Afin de l'ajouter, veuillez sélectionner le portefeuille lié à votre\\n              fichier :\\n              <span class=\\\"d-inline-block ms-1\\\">\\n                <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"15\\\" />\\n                <BsTooltip @placement=\\\"right\\\">Le nom du portefeuille (ou plus généralement de la plateforme) nous sera\\n                  utile afin de déterminer tous les champs nécessaires à une transaction sur cette-dite plateforme.\\n                </BsTooltip>\\n              </span>\\n            </label>\\n            {{! template-lint-disable require-input-label }}\\n            <select name=\\\"categ\\\" id=\\\"name\\\" class=\\\"form-select\\\" aria-label=\\\"select wallet\\\" {{on \\\"change\\\" this.request}}>\\n              <option value=\\\"all\\\" selected>--Toutes--</option>\\n              {{#each this.pfOptions as |pfOption|}}\\n                <option value={{pfOption}}>{{pfOption}}</option>\\n              {{/each}}\\n            </select>\\n          </div>\\n        {{else}}\\n          <UserWallets::Transmit::Content @id=\\\"destinataire\\\" @label=\\\"Email de destination :\\\">\\n            {{! template-lint-disable no-duplicate-id }}\\n            <input\\n              id=\\\"destinataire\\\"\\n              class=\\\"form-control textsm\\\"\\n              type=\\\"text\\\"\\n              value=\\\"contact-project+c1560-cryptofiscafacile-29728701-issue-@incoming.gitlab.com\\\"\\n              readonly\\n            />\\n          </UserWallets::Transmit::Content>\\n          <UserWallets::Transmit::Content @id=\\\"objet\\\" @label=\\\"Objet de l'email :\\\">\\n            {{! template-lint-disable no-duplicate-id }}\\n            <input\\n              id=\\\"objet\\\"\\n              class=\\\"form-control textsm\\\"\\n              type=\\\"text\\\"\\n              value=\\\"[UNKNOWNS_OBJECT] Nouvelle(s) transaction(s) dans un fichier CSV/JSON\\\"\\n              readonly\\n            />\\n          </UserWallets::Transmit::Content>\\n          <UserWallets::Transmit::Content @id=\\\"corps\\\" @label=\\\"Corps du mail :\\\">\\n            {{! template-lint-disable no-duplicate-id }}\\n            <textarea\\n              class=\\\"form-control textsm\\\"\\n              id=\\\"corps\\\"\\n              rows=\\\"6\\\"\\n              readonly\\n            >{{this.name}};{{@data.unknowns}}</textarea>\\n          </UserWallets::Transmit::Content>\\n        {{/if}}\\n      </div>\\n    </modal.body>\\n    <modal.footer>\\n      <BsButton {{on \\\"click\\\" this.close}}>Fermer</BsButton>\\n    </modal.footer>\\n  </div>\\n</BsModal>\", {\"contents\":\"<BsButton {{on \\\"click\\\" this.onTransmit}} class=\\\"btn btn-primary btn-sm\\\">\\n  SUPPORT\\n  <BsTooltip @placement=\\\"right\\\">Une erreur a été détectée... Il s'agit peut être d'une catégorie de transaction inconnue\\n    du moteur ou un fichier qui aurait été modifié par la plateforme. Veuillez cliquer pour en savoir plus !\\n  </BsTooltip>\\n</BsButton>\\n\\n{{! Modal for TX VALIDATION PROCESS HTML }}\\n<BsModal @open={{this.transmitModal}} @backdropClose={{false}} @onHidden={{this.hidden}} as |modal|>\\n  <div class=\\\"modal-fullscreen-sm-down\\\">\\n    <modal.header>\\n      <h4 class=\\\"modal-title\\\">Contact Support</h4>\\n    </modal.header>\\n    <modal.body>\\n      <div class=\\\"container\\\">\\n        <BsAlert class=\\\"m-0 py-1 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n          <strong>Ce fichier contient des transactions \\\"inconnues\\\" du moteur CryptoFiscaFacile.</strong>\\n        </BsAlert>\\n        <BsAlert class=\\\"my-2 py-1 text-center\\\" @visible={{true}} @fade={{true}} @type=\\\"success\\\" @dismissible={{false}}>\\n          Veuillez donc nous transmettre les informations ci-dessous par e-mail\\n        </BsAlert>\\n        {{#if this.nameRequired}}\\n          <div class=\\\"mx-2 my-3\\\">\\n            <label for=\\\"name\\\" class=\\\"form-label\\\">Afin de l'ajouter, veuillez sélectionner le portefeuille lié à votre\\n              fichier :\\n              <span class=\\\"d-inline-block ms-1\\\">\\n                <App::Icon @icon=\\\"ion:information-circle-outline\\\" width=\\\"15\\\" />\\n                <BsTooltip @placement=\\\"right\\\">Le nom du portefeuille (ou plus généralement de la plateforme) nous sera\\n                  utile afin de déterminer tous les champs nécessaires à une transaction sur cette-dite plateforme.\\n                </BsTooltip>\\n              </span>\\n            </label>\\n            {{! template-lint-disable require-input-label }}\\n            <select name=\\\"categ\\\" id=\\\"name\\\" class=\\\"form-select\\\" aria-label=\\\"select wallet\\\" {{on \\\"change\\\" this.request}}>\\n              <option value=\\\"all\\\" selected>--Toutes--</option>\\n              {{#each this.pfOptions as |pfOption|}}\\n                <option value={{pfOption}}>{{pfOption}}</option>\\n              {{/each}}\\n            </select>\\n          </div>\\n        {{else}}\\n          <UserWallets::Transmit::Content @id=\\\"destinataire\\\" @label=\\\"Email de destination :\\\">\\n            {{! template-lint-disable no-duplicate-id }}\\n            <input\\n              id=\\\"destinataire\\\"\\n              class=\\\"form-control textsm\\\"\\n              type=\\\"text\\\"\\n              value=\\\"contact-project+c1560-cryptofiscafacile-29728701-issue-@incoming.gitlab.com\\\"\\n              readonly\\n            />\\n          </UserWallets::Transmit::Content>\\n          <UserWallets::Transmit::Content @id=\\\"objet\\\" @label=\\\"Objet de l'email :\\\">\\n            {{! template-lint-disable no-duplicate-id }}\\n            <input\\n              id=\\\"objet\\\"\\n              class=\\\"form-control textsm\\\"\\n              type=\\\"text\\\"\\n              value=\\\"[UNKNOWNS_OBJECT] Nouvelle(s) transaction(s) dans un fichier CSV/JSON\\\"\\n              readonly\\n            />\\n          </UserWallets::Transmit::Content>\\n          <UserWallets::Transmit::Content @id=\\\"corps\\\" @label=\\\"Corps du mail :\\\">\\n            {{! template-lint-disable no-duplicate-id }}\\n            <textarea\\n              class=\\\"form-control textsm\\\"\\n              id=\\\"corps\\\"\\n              rows=\\\"6\\\"\\n              readonly\\n            >{{this.name}};{{@data.unknowns}}</textarea>\\n          </UserWallets::Transmit::Content>\\n        {{/if}}\\n      </div>\\n    </modal.body>\\n    <modal.footer>\\n      <BsButton {{on \\\"click\\\" this.close}}>Fermer</BsButton>\\n    </modal.footer>\\n  </div>\\n</BsModal>\",\"moduleName\":\"cryptofiscafacile-gui/components/user-wallets/transmit/index.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/user-wallets/transmit/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport type Application from 'cryptofiscafacile-gui/services/application';\nimport type Wasm from 'cryptofiscafacile-gui/services/wasm';\nimport type { FileUsageStatus } from 'cryptofiscafacile-wasm';\n\ninterface TransmitArgs {\n  data: FileUsageStatus;\n  modalState: boolean;\n}\n\nexport default class Transmit extends Component<TransmitArgs> {\n  @service declare wasm: Wasm;\n  @service declare application: Application;\n\n  pfOptions: string[] = [\n    'AUTRE',\n    'Aave',\n    'AAX',\n    'ABCC',\n    'ACDX',\n    'ACE',\n    'AEX',\n    'Altcoin Trader',\n    'Alterdice',\n    'ApolloX',\n    'APROBIT',\n    'Artis Turba',\n    'Aryana',\n    'AscendEX (Bitmax)',\n    'ATAIX',\n    'Azbit',\n    'B2BX',\n    'BankCEX',\n    'BaseFEX',\n    'Beaxy',\n    'Bgogo',\n    'BHEX (BlueHelix Exchange)',\n    'Bibox',\n    'Biconomy Exchange',\n    'BigONE',\n    'Bilaxy',\n    'Binance',\n    'Binance JEX',\n    'Binance TR',\n    'Binance.US',\n    'BingX',\n    'BiONE',\n    'Bit.com',\n    'bit4you',\n    'Bitay',\n    'Bitazza',\n    'Bitbank',\n    'Bitbns',\n    'Bitbuy',\n    'Bitci',\n    'BitClude',\n    'BitcoinTrade',\n    'BitCoke',\n    'Bitex.la',\n    'BITEXBOOK',\n    'Bitexen',\n    'BITEXLIVE',\n    'Bitfinex',\n    'bitFlyer',\n    'BitForex',\n    'Bitfront',\n    'Bitget',\n    'Bitglobal',\n    'Bithesap',\n    'Bithumb',\n    'Bithumb Singapore',\n    'Bitkub',\n    'BitMart',\n    'BitMEX',\n    'Bitonic',\n    'BitoPro',\n    'Bitpanda',\n    'Bitpanda Pro',\n    'Bitribe',\n    'Bitrue',\n    'Bits Blockchain',\n    'Bitso',\n    'Bitstamp',\n    'Bitsten',\n    'BITStorage',\n    'Bittrex',\n    'BitTurk',\n    'Bittylicious',\n    'BitUBU',\n    'Bitvast',\n    'Bitvavo',\n    'BitWell',\n    'BKEX',\n    'Bleutrade',\n    'Blockchain.com',\n    'BlueWallet.io',\n    'BQT',\n    'BTC Markets',\n    'BTC Trade UA',\n    'BTC-Alpha',\n    'BTCBOX',\n    'BTCEX',\n    'BTC-exchange',\n    'BtcTurk Pro',\n    'BTSE',\n    'Buda',\n    'Bvnex',\n    'BW.com',\n    'Bybit',\n    'Capital DEX',\n    'Cat.Ex',\n    'CBX',\n    'CEX.IO',\n    'ChainX',\n    'Changelly PRO',\n    'Chiliz',\n    'CITEX',\n    'Coinbase Exchange',\n    'CoinBene',\n    'Coinbit',\n    'CoinCasso',\n    'Coincheck',\n    'CoinCorner',\n    'CoinDCX',\n    'Coindeal',\n    'Coineal',\n    'CoinEx',\n    'CoinFalcon',\n    'CoinField',\n    'CoinFLEX',\n    'Coingi',\n    'CoinJar',\n    'Coinlist Pro',\n    'CoinMate',\n    'CoinMetro',\n    'Coinone',\n    'Coinsbit',\n    'Coinsuper',\n    'CoinTiger',\n    'Coinut',\n    'CoinW',\n    'Coinzo',\n    'CoinZoom',\n    'Compound',\n    'COSS',\n    'C-Patex',\n    'Crex24',\n    'CROSS exchange',\n    'CrossTower',\n    'CRXzone',\n    'Crypterum',\n    'Crypto.com APP',\n    'Crypto.com Exchange',\n    'Cryptology',\n    'CryptoMarket',\n    'Cryptonex',\n    'Currency.com',\n    'Dcoin',\n    'Decoin',\n    'Deepcoin',\n    'Delta Exchange',\n    'Deribit',\n    'Dex-Trade',\n    'DigiFinex',\n    'digitalexchange.id',\n    'Dove Wallet',\n    'DragonEX',\n    'Dsdaq',\n    'Ecxx',\n    'Emirex',\n    'EQONEX',\n    'eToroX',\n    'EXIR',\n    'ExMarkets',\n    'EXMO',\n    'Exnomy',\n    'Exrates',\n    'EXX',\n    'FarhadMarket',\n    'Fatbtc',\n    'Felixo',\n    'Finexbox',\n    'Flybit',\n    'FMFW.io',\n    'FOBLGATE',\n    'Folgory',\n    'FreiExchange',\n    'FTX',\n    'FTX US',\n    'Gate.io',\n    'Gatehub',\n    'GDAC',\n    'Gemini',\n    'Giottus',\n    'Globe Derivative Exchange',\n    'Globitex',\n    'GokuMarket',\n    'GOPAX',\n    'Graviex',\n    'Hanbitco',\n    'Heat Wallet',\n    'HitBTC',\n    'Hoo',\n    'Hotbit',\n    'HOTBIT KOREA',\n    'Hotcoin Global',\n    'Huobi Global',\n    'Huobi Japan',\n    'Huobi Korea',\n    'IDCM',\n    'Indodax',\n    'IndoEx',\n    'itBit',\n    'Jswap',\n    'KickEX',\n    'Koinbazar',\n    'Koinim',\n    'Korbit',\n    'Kraken',\n    'KuCoin',\n    'KULAP',\n    'Kuna',\n    'KuSwap',\n    'Kwikswap',\n    'KyberSwap (Avalanche)',\n    'KyberSwap (BSC)',\n    'KyberSwap (Polygon)',\n    'Ledger',\n    'LATOKEN',\n    'LBank',\n    'LCX Exchange',\n    'Liquid',\n    'LiteBit.eu',\n    'LocalTrade',\n    'LOEx',\n    'Luno',\n    'Lykke Exchange',\n    'Mandala Exchange',\n    'MAX Exchange',\n    'Mercado Bitcoin',\n    'Mercatox',\n    'MEXC',\n    'Mexo Exchange',\n    'MoonSwap(Moonriver)',\n    'Namebase',\n    'Narkasa',\n    'Nexo',\n    'NiceHash',\n    'Nominex',\n    'NovaDAX',\n    'OceanEx',\n    'Okcoin',\n    'OKEx',\n    'Omgfin',\n    'OTCBTC',\n    'P2PB2B',\n    'Paraswap',\n    'Paribu',\n    'Paritex',\n    'PayBito',\n    'Paymium',\n    'Phemex',\n    'Pionex',\n    'Poloniex',\n    'Polyx',\n    'Prizmbit',\n    'ProBit',\n    'ProBit Global',\n    'qTrade',\n    'Rekeningku.com',\n    'Resfinex',\n    'Ripio',\n    'RippleFox',\n    'RuDEX',\n    'SafeTrade',\n    'Satang Pro',\n    'SecondBTC',\n    'Serenity',\n    'SINEGY Marketplace',\n    'SouthXchange',\n    'StakeCube',\n    'STEX',\n    'StormGain',\n    'Sushiswap(Celo)',\n    'Sushiswap(Harmony)',\n    'The Rock Trading',\n    'Tidebit',\n    'Tidex',\n    'TimeX',\n    'TOKENCAN',\n    'Tokenize Xchange',\n    'Tokenomy',\n    'Tokocrypto',\n    'TOKOK',\n    'TOPBTC',\n    'TradeOgre',\n    'Triv Pro',\n    'Txbit',\n    'Ubeswap',\n    'Unocoin',\n    'Upbit',\n    'VALR',\n    'Valuex',\n    'VCC Exchange',\n    'VELIC',\n    'Venus',\n    'VinDAX',\n    'Virtuse Exchange',\n    'WazirX',\n    'WBF Exchange',\n    'WhiteBIT',\n    'WOO Network',\n    'Xcalibra',\n    'XT.COM',\n    'YoBit',\n    'YunEx',\n    'Zaif',\n    'ZB.COM',\n    'ZBG',\n    'ZebPay',\n    'ZG.com',\n    'Zipmex',\n    'Zonda (BitBay)',\n    'ZT',\n  ];\n\n  /**\n   * UNKNOWNS HANDLING PART\n   */\n  @tracked transmitModal = false;\n  @tracked nameRequired = true;\n  name = '';\n\n  @action\n  onTransmit() {\n    if (this.args.data.kind) {\n      this.nameRequired = false;\n      this.name = this.args.data.kind;\n    }\n\n    //Launch the modal\n    this.transmitModal = true;\n  }\n\n  @action\n  close() {\n    this.transmitModal = false;\n    this.nameRequired = true;\n  }\n\n  @action\n  async request(e: { target: HTMLSelectElement }) {\n    this.nameRequired = false;\n\n    this.name = e.target.value;\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@glimmer/component' {\n  interface Registry {\n    transmit: Transmit;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<tr class=\\\"line-height-wallets {{unless this.addressesCollapsed 'expanded'}}\\\">\\n  <td>{{@wallet.ext}}</td>\\n  {{#if @wallet.kind}}\\n    <td>{{@wallet.kind}}</td>\\n    <td>{{@wallet.result}}</td>\\n    <td>{{@wallet.name}}</td>\\n    {{#if @wallet.unknowns}}\\n      <td>\\n        <UserWallets::Transmit @data={{@wallet}} />\\n      </td>\\n    {{else}}\\n      <td>-</td>\\n    {{/if}}\\n    <td>\\n      <UserWallets::Download @filename={{@wallet.name}} />\\n      <Removal @filename={{@wallet.name}} />\\n      {{#if @wallet.bcAddresses}}\\n        <div class=\\\"float-end\\\">\\n          <BsButton\\n            @type={{\\\"none\\\"}}\\n            class=\\\"collapse-icon {{if this.addressesCollapsed 'collapsed'}}\\\"\\n            {{on \\\"click\\\" this.toggle}}\\n          >\\n            <App::Icon @icon=\\\"ion:chevron-down\\\" width=\\\"18\\\" />\\n          </BsButton>\\n        </div>\\n      {{/if}}\\n    </td>\\n  {{else if @wallet.error}}\\n    <td class=\\\"text-danger\\\"><strong>**ERREUR**</strong></td>\\n    <td>{{@wallet.error}}</td>\\n    <td>{{@wallet.name}}</td>\\n    <td>-</td>\\n    <td></td>\\n  {{else}}\\n    <td>-</td>\\n    <td class=\\\"text-warning\\\"><strong>**NOUVEAU**</strong></td>\\n    <td>-</td>\\n    {{#if @wallet.unknowns}}\\n      <td>\\n        <UserWallets::Transmit @data={{@wallet}} />\\n      </td>\\n    {{else}}\\n      <td>-</td>\\n    {{/if}}\\n    <td>\\n      <Removal @filename={{@wallet.name}} />\\n    </td>\\n  {{/if}}\\n</tr>\\n{{#if @wallet.bcAddresses}}\\n  <tr>\\n    <td class=\\\"border-0 p-0\\\" colspan=\\\"6\\\">\\n      <BsCollapse @collapsed={{this.addressesCollapsed}}>\\n        <table class=\\\"table m-0 p-0\\\">\\n          <tbody>\\n            {{#each @wallet.bcAddresses as |addr|}}\\n              <tr>\\n                <td></td>\\n                <td colspan=\\\"3\\\">{{addr}}</td>\\n                <td></td>\\n                <td></td>\\n              </tr>\\n            {{/each}}\\n          </tbody>\\n        </table>\\n      </BsCollapse>\\n    </td>\\n  </tr>\\n{{/if}}\", {\"contents\":\"<tr class=\\\"line-height-wallets {{unless this.addressesCollapsed 'expanded'}}\\\">\\n  <td>{{@wallet.ext}}</td>\\n  {{#if @wallet.kind}}\\n    <td>{{@wallet.kind}}</td>\\n    <td>{{@wallet.result}}</td>\\n    <td>{{@wallet.name}}</td>\\n    {{#if @wallet.unknowns}}\\n      <td>\\n        <UserWallets::Transmit @data={{@wallet}} />\\n      </td>\\n    {{else}}\\n      <td>-</td>\\n    {{/if}}\\n    <td>\\n      <UserWallets::Download @filename={{@wallet.name}} />\\n      <Removal @filename={{@wallet.name}} />\\n      {{#if @wallet.bcAddresses}}\\n        <div class=\\\"float-end\\\">\\n          <BsButton\\n            @type={{\\\"none\\\"}}\\n            class=\\\"collapse-icon {{if this.addressesCollapsed 'collapsed'}}\\\"\\n            {{on \\\"click\\\" this.toggle}}\\n          >\\n            <App::Icon @icon=\\\"ion:chevron-down\\\" width=\\\"18\\\" />\\n          </BsButton>\\n        </div>\\n      {{/if}}\\n    </td>\\n  {{else if @wallet.error}}\\n    <td class=\\\"text-danger\\\"><strong>**ERREUR**</strong></td>\\n    <td>{{@wallet.error}}</td>\\n    <td>{{@wallet.name}}</td>\\n    <td>-</td>\\n    <td></td>\\n  {{else}}\\n    <td>-</td>\\n    <td class=\\\"text-warning\\\"><strong>**NOUVEAU**</strong></td>\\n    <td>-</td>\\n    {{#if @wallet.unknowns}}\\n      <td>\\n        <UserWallets::Transmit @data={{@wallet}} />\\n      </td>\\n    {{else}}\\n      <td>-</td>\\n    {{/if}}\\n    <td>\\n      <Removal @filename={{@wallet.name}} />\\n    </td>\\n  {{/if}}\\n</tr>\\n{{#if @wallet.bcAddresses}}\\n  <tr>\\n    <td class=\\\"border-0 p-0\\\" colspan=\\\"6\\\">\\n      <BsCollapse @collapsed={{this.addressesCollapsed}}>\\n        <table class=\\\"table m-0 p-0\\\">\\n          <tbody>\\n            {{#each @wallet.bcAddresses as |addr|}}\\n              <tr>\\n                <td></td>\\n                <td colspan=\\\"3\\\">{{addr}}</td>\\n                <td></td>\\n                <td></td>\\n              </tr>\\n            {{/each}}\\n          </tbody>\\n        </table>\\n      </BsCollapse>\\n    </td>\\n  </tr>\\n{{/if}}\",\"moduleName\":\"cryptofiscafacile-gui/components/user-wallets/wallet.hbs\",\"parseOptions\":{\"srcName\":\"cryptofiscafacile-gui/components/user-wallets/wallet.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\n\nimport type { FileUsageStatus } from 'cryptofiscafacile-wasm';\n\ninterface UserWalletsWalletArgs {\n  wallet: FileUsageStatus;\n}\n\nexport default class UserWalletsWallet extends Component<UserWalletsWalletArgs> {\n  @tracked addressesCollapsed = true;\n\n  @action\n  toggle() {\n    this.addressesCollapsed = !this.addressesCollapsed;\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@glimmer/component' {\n  interface Registry {\n    'user-wallets-wallet': UserWalletsWallet;\n  }\n}\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nimport { tracked } from 'tracked-built-ins';\n\nimport type ApplicationService from 'cryptofiscafacile-gui/services/application';\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\n\nexport default class ApplicationController extends Controller {\n  @service declare application: ApplicationService;\n  @service declare wasm: WasmService;\n\n  @tracked _newVersionModalVisible = false;\n\n  get newVersionModalVisible() {\n    return this._newVersionModalVisible || this.application.newVersion;\n  }\n\n  @action\n  onNewVersionModalHidden() {\n    this._newVersionModalVisible = false;\n\n    this.wasm.updateApplicationEntryTask.perform({\n      key: 'application.version',\n      value: this.application.version,\n    });\n    this.application.newVersion = false;\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n  interface Registry {\n    'application-controller': ApplicationController;\n  }\n}\n","export enum EngineStatus {\n  LOADING = 'LOADING',\n  RUNNING = 'RUNNING',\n  HALTED = 'HALTED',\n}\n","export enum SortOrder {\n  ASC = 'ASC',\n  DESC = 'DESC',\n  NONE = 'NONE',\n}\n","export enum TransfertType {\n  DEPOSIT = 'DEPOSIT',\n  WITHDRAWAL = 'WITHDRAWAL',\n}\n","export default {\n  time: {\n    hhmmss: {\n      hour: 'numeric',\n      minute: 'numeric',\n      second: 'numeric',\n    },\n  },\n  date: {\n    hhmmss: {\n      hour: 'numeric',\n      minute: 'numeric',\n      second: 'numeric',\n    },\n  },\n  number: {\n    compact: { notation: 'compact' },\n    EUR: {\n      style: 'currency',\n      currency: 'EUR',\n    },\n    USD: {\n      style: 'currency',\n      currency: 'USD',\n    },\n  },\n};\n","import { helper } from '@ember/component/helper';\nimport config from '../config/environment';\nimport {\n  shaRegExp,\n  versionRegExp,\n  versionExtendedRegExp,\n} from 'ember-cli-app-version/utils/regexp';\n\nexport function appVersion(_, hash = {}) {\n  const version = config.APP.version;\n  // e.g. 1.0.0-alpha.1+4jds75hf\n\n  // Allow use of 'hideSha' and 'hideVersion' For backwards compatibility\n  let versionOnly = hash.versionOnly || hash.hideSha;\n  let shaOnly = hash.shaOnly || hash.hideVersion;\n\n  let match = null;\n\n  if (versionOnly) {\n    if (hash.showExtended) {\n      match = version.match(versionExtendedRegExp); // 1.0.0-alpha.1\n    }\n    // Fallback to just version\n    if (!match) {\n      match = version.match(versionRegExp); // 1.0.0\n    }\n  }\n\n  if (shaOnly) {\n    match = version.match(shaRegExp); // 4jds75hf\n  }\n\n  return match ? match[0] : version;\n}\n\nexport default helper(appVersion);\n","import initializerFactory from 'ember-cli-app-version/initializer-factory';\nimport config from '../config/environment';\n\nlet name, version;\nif (config.APP) {\n  name = config.APP.name;\n  version = config.APP.version;\n}\n\nexport default {\n  name: 'App Version',\n  initialize: initializerFactory(name, version),\n};\n","import ENV from '../config/environment';\nimport Config from 'ember-bootstrap/config';\nimport { registerLibrary } from 'ember-bootstrap/version';\n\nexport function initialize(/* container, application */) {\n  Config.load(ENV['ember-bootstrap'] || {});\n  registerLibrary();\n}\n\nexport default {\n  name: 'load-bootstrap-config',\n  initialize,\n};\n","import flatColorIconsBearish from '@iconify/icons-flat-color-icons/bearish';\nimport flatColorIconsBullish from '@iconify/icons-flat-color-icons/bullish';\nimport flatColorIconsCandleSticks from '@iconify/icons-flat-color-icons/candle-sticks';\nimport flatColorIconsCurrencyExchange from '@iconify/icons-flat-color-icons/currency-exchange';\nimport flatColorIconsElectroDevices from '@iconify/icons-flat-color-icons/electro-devices';\nimport flatColorIconsExport from '@iconify/icons-flat-color-icons/export';\nimport flatColorIconsInternal from '@iconify/icons-flat-color-icons/internal';\nimport ionAlertCircle from '@iconify-icons/ion/alert-circle';\nimport ionArrowUndo from '@iconify-icons/ion/arrow-undo';\nimport ionBarChartOutline from '@iconify-icons/ion/bar-chart-outline';\nimport ionBuild from '@iconify-icons/ion/build';\nimport ionCalculator from '@iconify-icons/ion/calculator';\nimport ionCalendarOutline from '@iconify-icons/ion/calendar-outline';\nimport ionChevronDown from '@iconify-icons/ion/chevron-down';\nimport ionChevronDownCircleOutline from '@iconify-icons/ion/chevron-down-circle-outline';\nimport ionChevronUpCircleOutline from '@iconify-icons/ion/chevron-up-circle-outline';\nimport ionClipboardOutline from '@iconify-icons/ion/clipboard-outline';\nimport ionDownloadOutline from '@iconify-icons/ion/download-outline';\nimport ionExitOutline from '@iconify-icons/ion/exit-outline';\nimport ionEyeOffOutline from '@iconify-icons/ion/eye-off-outline';\nimport ionEyeOutline from '@iconify-icons/ion/eye-outline';\nimport ionFlowerSharp from '@iconify-icons/ion/flower-sharp';\nimport ionFunnel from '@iconify-icons/ion/funnel';\nimport ionGiftOutline from '@iconify-icons/ion/gift-outline';\nimport ionHammerOutline from '@iconify-icons/ion/hammer-outline';\nimport ionHelpCircle from '@iconify-icons/ion/help-circle';\nimport ionHelpSharp from '@iconify-icons/ion/help-sharp';\nimport ionInformationCircleOutline from '@iconify-icons/ion/information-circle-outline';\nimport ionLibraryOutline from '@iconify-icons/ion/library-outline';\nimport ionListOutline from '@iconify-icons/ion/list-outline';\nimport ionPlayCircleOutline from '@iconify-icons/ion/play-circle-outline';\nimport ionPlayForwardCircleOutline from '@iconify-icons/ion/play-forward-circle-outline';\nimport ionRemoveOutline from '@iconify-icons/ion/remove-outline';\nimport ionSearch from '@iconify-icons/ion/search';\nimport ionShieldCheckmark from '@iconify-icons/ion/shield-checkmark';\nimport ionSparklesOutline from '@iconify-icons/ion/sparkles-outline';\nimport ionTrashSharp from '@iconify-icons/ion/trash-sharp';\nimport ionWalletOutline from '@iconify-icons/ion/wallet-outline';\nimport mdiEngineOffOutline from '@iconify-icons/mdi/engine-off-outline';\nimport mdiEngineOutline from '@iconify-icons/mdi/engine-outline';\nimport { addAPIProvider, addIcon, disableCache } from 'iconify-icon';\n\nimport type { IconifyIcon } from 'iconify-icon';\n\n// Do not forget to remove unused icons to reduce build assets size\nexport const icons = new Map<string, IconifyIcon>()\n  .set('cff:flat-color-icons:bearish', flatColorIconsBearish)\n  .set('cff:flat-color-icons:bullish', flatColorIconsBullish)\n  .set('cff:flat-color-icons:candle-sticks', flatColorIconsCandleSticks)\n  .set('cff:flat-color-icons:currency-exchange', flatColorIconsCurrencyExchange)\n  .set('cff:flat-color-icons:electro-devices', flatColorIconsElectroDevices)\n  .set('cff:flat-color-icons:export', flatColorIconsExport)\n  .set('cff:flat-color-icons:internal', flatColorIconsInternal)\n\n  .set('cff:ion:alert-circle', ionAlertCircle)\n  .set('cff:ion:arrow-undo', ionArrowUndo)\n  .set('cff:ion:bar-chart-outline', ionBarChartOutline)\n  .set('cff:ion:build', ionBuild)\n  .set('cff:ion:calculator', ionCalculator)\n  .set('cff:ion:calendar-outline', ionCalendarOutline)\n  .set('cff:ion:chevron-down', ionChevronDown)\n  .set('cff:ion:chevron-down-circle-outline', ionChevronDownCircleOutline)\n  .set('cff:ion:chevron-up-circle-outline', ionChevronUpCircleOutline)\n  .set('cff:ion:clipboard-outline', ionClipboardOutline)\n  .set('cff:ion:download-outline', ionDownloadOutline)\n  .set('cff:ion:exit-outline', ionExitOutline)\n  .set('cff:ion:eye-off-outline', ionEyeOffOutline)\n  .set('cff:ion:eye-outline', ionEyeOutline)\n  .set('cff:ion:flower-sharp', ionFlowerSharp)\n  .set('cff:ion:funnel', ionFunnel)\n  .set('cff:ion:gift-outline', ionGiftOutline)\n  .set('cff:ion:hammer-outline', ionHammerOutline)\n  .set('cff:ion:help-circle', ionHelpCircle)\n  .set('cff:ion:help-sharp', ionHelpSharp)\n  .set('cff:ion:information-circle-outline', ionInformationCircleOutline)\n  .set('cff:ion:library-outline', ionLibraryOutline)\n  .set('cff:ion:list-outline', ionListOutline)\n  .set('cff:ion:play-circle-outline', ionPlayCircleOutline)\n  .set('cff:ion:play-forward-circle-outline', ionPlayForwardCircleOutline)\n  .set('cff:ion:remove-outline', ionRemoveOutline)\n  .set('cff:ion:search', ionSearch)\n  .set('cff:ion:shield-checkmark', ionShieldCheckmark)\n  .set('cff:ion:sparkles-outline', ionSparklesOutline)\n  .set('cff:ion:trash-sharp', ionTrashSharp)\n  .set('cff:ion:wallet-outline', ionWalletOutline)\n\n  .set('cff:mdi:engine-off-outline', mdiEngineOffOutline)\n  .set('cff:mdi:engine-outline', mdiEngineOutline);\n\nexport function initialize(/*application: Application*/): void {\n  // override default api to not reach iconify api\n  addAPIProvider('', { resources: [''] });\n  // disable iconify cache because now all icons are included in the ember bundle\n  disableCache('all');\n\n  icons.forEach((data, name) => addIcon(name, data));\n}\n\nexport default {\n  initialize,\n};\n","import Modifier from 'ember-modifier';\n\nimport type { NamedArgs } from 'ember-modifier';\n\ninterface DownloadModifierSignature {\n  Args: {\n    Named: {\n      filename: string;\n      fileUrl: string;\n    };\n    Positional: [];\n  };\n}\n\nexport default class DownloadModifier extends Modifier<DownloadModifierSignature> {\n  modify(_: Element, __: [], args: NamedArgs<DownloadModifierSignature>) {\n    if (args.filename && args.fileUrl) {\n      let downloadAnchorNode = document.createElement('a');\n\n      downloadAnchorNode.setAttribute('href', args.fileUrl);\n      downloadAnchorNode.setAttribute('download', args.filename);\n      document.body.appendChild(downloadAnchorNode); // required for firefox\n      downloadAnchorNode.click();\n      downloadAnchorNode.remove();\n    }\n  }\n}\n","import { modifier } from 'ember-modifier';\n\nexport default modifier((element: HTMLElement /*, positional, named*/) => {\n  const handler = (evt: WheelEvent) => {\n    evt.preventDefault();\n    element.scrollLeft += evt.deltaY;\n  };\n\n  element.addEventListener(\n    'wheel',\n    (evt) => {\n      element.scrollLeft += evt.deltaY;\n    },\n    { passive: true },\n  );\n\n  return () => {\n    element.removeEventListener('wheel', handler);\n  };\n});\n","import { later } from '@ember/runloop';\n\nimport { modifier } from 'ember-modifier';\nimport introJs from 'intro.js';\n\nexport default modifier(\n  (element, [target]: [string], { autoStart, onExit }: { autoStart?: boolean; onExit?: VoidFunction }) => {\n    const startIntro = () =>\n      introJs(target)\n        .setOption('nextLabel', 'Suivant')\n        .setOption('prevLabel', 'Retour')\n        .setOption('doneLabel', 'Quitter')\n        .setOption('tooltipClass', 'customDefault')\n        .onexit(() => {\n          if (onExit) {\n            onExit();\n          }\n        })\n        .start();\n\n    element.addEventListener('click', startIntro);\n\n    if (autoStart) {\n      later(startIntro, 1000);\n    }\n\n    return () => {\n      element.removeEventListener('click', startIntro);\n    };\n  },\n);\n","import { later } from '@ember/runloop';\n\nimport { modifier } from 'ember-modifier';\n\nexport default modifier((element: HTMLElement, positional: [string] /* named*/) => {\n  const hide = () => {\n    const id = positional[0];\n    const offcanvas = document.getElementById(id);\n\n    if (offcanvas) {\n      offcanvas.classList.add('hiding');\n      later(() => {\n        if (offcanvas) {\n          offcanvas.classList.remove('hiding');\n          offcanvas.classList.remove('show');\n        }\n      }, 250);\n    }\n  };\n\n  element.addEventListener('click', hide);\n\n  return () => {\n    element.removeEventListener('click', hide);\n  };\n});\n","import { later } from '@ember/runloop';\n\nimport { modifier } from 'ember-modifier';\n\nexport default modifier((element: HTMLElement, positional: [string] /* named*/) => {\n  const toggle = () => {\n    const id = positional[0];\n    const offcanvas = document.getElementById(id);\n\n    if (offcanvas) {\n      if (offcanvas.classList.contains('show')) {\n        offcanvas.classList.add('hiding');\n        later(() => {\n          if (offcanvas) {\n            offcanvas.classList.remove('hiding');\n            offcanvas.classList.remove('show');\n          }\n        }, 250);\n      } else {\n        offcanvas.classList.add('show');\n        offcanvas.classList.add('showing');\n        later(() => {\n          if (offcanvas) {\n            offcanvas.classList.remove('showing');\n          }\n        }, 250);\n      }\n    }\n  };\n\n  element.addEventListener('click', toggle);\n\n  return () => {\n    element.removeEventListener('click', toggle);\n  };\n});\n","export default class Bnc {\n  constructor(\n    readonly year: number,\n    readonly cashin: boolean,\n  ) {}\n}\n","export default class ManifestEntry {\n  name = '';\n  version = 0;\n}\n","export default class TxIco {\n  currency = '';\n  date = new Date();\n  id = '';\n  quantity = 0;\n  wallet = '';\n}\n","import { debug } from '@ember/debug';\nimport Route from '@ember/routing/route';\n\nexport default class DefinitionsRoute extends Route {\n  async model() {\n    const location = window.location.origin;\n    const url = 'crypto.fiscafacile.com';\n\n    // This condition is only here to ensure list of csv-defs are displayed only on Production server. As a user which is OFFLINe shall connect to this server to retrieve the csv-defs\n    if (window.location.host === url) {\n      debug('On : ' + location);\n\n      let response = await fetch('/definitions/manifest.json');\n      let data = await response.json();\n\n      return data;\n    } else {\n      debug('In route of Definitions : not on ' + url + ', but location : ' + location);\n\n      let data = 'ONLINE';\n\n      return data;\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<App::Header\\n  @title=\\\"Définitions\\\"\\n  @description=\\\"Vous retrouvez ici tous les fichiers de définition de toutes les plateformes gérées par CFF\\\"\\n  @def=\\\"true\\\"\\n/>\\n<section>\\n  <div class=\\\"row h-100\\\">\\n    {{#if (not-eq @model \\\"ONLINE\\\")}}\\n      <div class=\\\"d-flex w-75 h-100\\\">\\n        <div class=\\\"wallets w-100 h-100\\\">\\n          <table class=\\\"table def-table scroll\\\">\\n            <thead>\\n              <tr class=\\\"line-height-head\\\">\\n                <th scope=\\\"col\\\">Fichier de définition</th>\\n                <th scope=\\\"col\\\" class=\\\"text-center\\\">Version</th>\\n                <th scope=\\\"col\\\" class=\\\"text-center\\\">Télécharger</th>\\n              </tr>\\n            </thead>\\n            {{#if @model}}\\n              <tbody>\\n                {{#each @model as |model|}}\\n                  <tr class=\\\"line-height-wallets\\\">\\n                    <td>{{model.name}}</td>\\n                    <td class=\\\"text-center\\\">{{model.version}}</td>\\n                    <td class=\\\"text-center\\\">\\n                      <Download @def={{model.name}} />\\n                    </td>\\n                  </tr>\\n                {{/each}}\\n              </tbody>\\n            {{else}}\\n              <tbody>\\n                <tr class=\\\"line-height-wallets none\\\">\\n                  <td colspan=\\\"3\\\">\\n                    AUCUN FICHIER\\n                  </td>\\n                </tr>\\n              </tbody>\\n            {{/if}}\\n          </table>\\n        </div>\\n      </div>\\n      <div class=\\\"d-flex w-25 h-100\\\">\\n        <div class=\\\"d-flex flex-column h-50\\\">\\n          <BsAlert @visible={{true}} @fade={{true}} @type=\\\"danger\\\" @dismissible={{false}}>\\n            <strong>Information : </strong>\\n            Cette page n\\'est utile que pour les utilisateurs du mode OFFLINE de l\\'application CryptoFiscaFacile. Pour\\n            les autres utilisateurs, l\\'application elle-même se chargera de ces mises à jour.\\n          </BsAlert>\\n          <hr />\\n          <BsAlert @visible={{true}} @fade={{true}} @type=\\\"warning\\\" @dismissible={{false}}>\\n            <strong>Notice : </strong>\\n            Vous pouvez télécharger un ou plusieurs fichiers de définition. Après quoi, vous devrez les importer\\n            manuellement dans votre application OFFLINE, via la page Portefeuilles (tout comme un import de CSV !) afin\\n            de mettre à jour votre base de définitions.\\n          </BsAlert>\\n        </div>\\n      </div>\\n    {{else}}\\n      <h4 class=\\\"ps-5 pt-3\\\">Aucune donnée à afficher</h4>\\n    {{/if}}\\n  </div>\\n</section>', { moduleName: 'cryptofiscafacile-gui/pods/definitions/template.hbs' });\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nimport type ApplicationService from 'cryptofiscafacile-gui/services/application';\n\nexport default class DocumentationRoute extends Route {\n  @service declare application: ApplicationService;\n\n  activate() {\n    this.application.helpTarget = '#intro-synth';\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<App::Header @title=\\\"Documentation\\\" @description=\\\"Toute la documentation nécessaire afin d’utiliser l’application\\\" />\\n<section>\\n  <Documentation />\\n</section>', { moduleName: 'cryptofiscafacile-gui/pods/document/template.hbs' });\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nimport type ApplicationService from 'cryptofiscafacile-gui/services/application';\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\n\nexport default class IndexRoute extends Route {\n  @service declare application: ApplicationService;\n  @service declare wasm: WasmService;\n\n  beforeModel() {\n    this.wasm.getSynthBalancesTask.perform(this.wasm.defaultEndDate);\n    this.wasm.getSynthStatTotalValueTask.perform(this.wasm.defaultEndDate);\n    this.wasm.getSynthStatsGainsLossesTask.perform(this.wasm.defaultEndDate);\n    this.wasm.getSynthPortfolioTask.perform(this.wasm.defaultEndDate);\n    this.wasm.getSynthEvolutionTask.perform(this.wasm.defaultStartDate, this.wasm.defaultEndDate);\n    this.wasm.getSynthTxTypesTask.perform(this.wasm.defaultStartDate, this.wasm.defaultEndDate);\n    this.wasm.getWalletsTask.perform();\n  }\n\n  activate() {\n    this.application.helpTarget = '#intro-synth';\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<App::Header\\n  @title=\\\"Tableau de bord\\\"\\n  @description=\\\"Présentation des divers éléments de synthèse de vos portefeuilles\\\"\\n/>\\n<section class=\\\"ps-3 ps-sm-1 container-fluid pe-2 h-min\\\">\\n  <Synthesis />\\n</section>', { moduleName: 'cryptofiscafacile-gui/pods/index/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<App::Header @title=\\\"Problèmes de page\\\" @description=\\\"-------------------------------------------------\\\" />\\n<section>\\n  <div class=\\\"container-fluid\\\">\\n    <h5>Erreur 404 : Page not trouvée</h5>\\n  </div>\\n</section>', { moduleName: 'cryptofiscafacile-gui/pods/not-found/template.hbs' });\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nimport type ApplicationService from 'cryptofiscafacile-gui/services/application';\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\n\nexport default class ReportsRoute extends Route {\n  @service declare application: ApplicationService;\n  @service declare wasm: WasmService;\n\n  model() {\n    this.wasm.getReportsTask.perform();\n  }\n\n  activate() {\n    this.application.helpTarget = '#intro-report';\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<App::Header @title=\\\"Rapports\\\" @description=\\\"Génération des rapports pour votre imposition\\\" />\\n<section>\\n  {{#if this.wasm.getReportsTask.isRunning}}\\n    <div class=\\\"d-flex justify-content-center align-items-center\\\">\\n      <div class=\\\"spinner-border mt-5\\\" role=\\\"status\\\">\\n        <span class=\\\"visually-hidden\\\"></span>\\n      </div>\\n    </div>\\n  {{else}}\\n    <Reporting />\\n  {{/if}}\\n</section>', { moduleName: 'cryptofiscafacile-gui/pods/reports/template.hbs' });\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nimport type ApplicationService from 'cryptofiscafacile-gui/services/application';\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\n\nexport default class ToolsRoute extends Route {\n  @service declare application: ApplicationService;\n  @service declare wasm: WasmService;\n\n  model() {\n    this.wasm.getToolsTask.perform();\n  }\n\n  activate() {\n    this.application.helpTarget = '#intro-tool';\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<App::Header\\n  @title=\\\"Outils\\\"\\n  @description=\\\"Les outils mis à disposition afin d’améliorer le processus de collecte des TX\\\"\\n/>\\n<section class=\\\"ps-3 ps-sm-1 container-fluid pe-2\\\">\\n  {{#if this.wasm.getToolsTask.isRunning}}\\n    <div class=\\\"d-flex justify-content-center align-items-center\\\">\\n      <div class=\\\"spinner-border mt-5\\\" role=\\\"status\\\">\\n        <span class=\\\"visually-hidden\\\"></span>\\n      </div>\\n    </div>\\n  {{else}}\\n    <Api />\\n  {{/if}}\\n</section>', { moduleName: 'cryptofiscafacile-gui/pods/tools/template.hbs' });\n","import { tracked } from '@glimmer/tracking';\nimport Controller from '@ember/controller';\n\nimport Option from 'cryptofiscafacile-gui/components/option';\nimport { SortOrder } from 'cryptofiscafacile-gui/enums/sort-order';\nexport default class TransactionsController extends Controller {\n  @tracked userPage = 1;\n\n  @tracked pageSize?: number;\n\n  @tracked selectedCategory = [Option.ALL];\n  @tracked selectedDates: Date[] = [];\n  @tracked selectedCoins = [Option.ALL];\n  @tracked selectedWallet = [Option.ALL];\n\n  @tracked dateSortOrder = SortOrder.DESC;\n  @tracked pfSortOrder = SortOrder.NONE;\n  @tracked catSortOrder = SortOrder.NONE;\n\n  @tracked searchedItem = '';\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your controllers.\ndeclare module '@ember/controller' {\n  interface Registry {\n    'transactions-controller': TransactionsController;\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nimport type ApplicationService from 'cryptofiscafacile-gui/services/application';\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\nexport default class TransactionsRoute extends Route {\n  @service declare application: ApplicationService;\n  @service declare wasm: WasmService;\n\n  model() {\n    this.wasm.getTransactionsTask.perform();\n  }\n\n  activate() {\n    this.application.helpTarget = '#intro-tx';\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<App::Header @title=\\\"Transactions\\\" @description=\\\"Présentation de toutes vos transactions (TX)\\\" />\\n<section class=\\\"transa-height\\\">\\n  {{#if this.wasm.getTransactionsTask.isRunning}}\\n    <div class=\\\"d-flex justify-content-center align-items-center\\\">\\n      <div class=\\\"spinner-border mt-5\\\" role=\\\"status\\\">\\n        <span class=\\\"visually-hidden\\\"></span>\\n      </div>\\n    </div>\\n  {{else}}\\n    <TxTable\\n      @catSortOrder={{this.catSortOrder}}\\n      @dateSortOrder={{this.dateSortOrder}}\\n      @pfSortOrder={{this.pfSortOrder}}\\n      @pageSize={{this.pageSize}}\\n      @userPage={{this.userPage}}\\n      @selectedCategory={{this.selectedCategory}}\\n      @selectedCoins={{this.selectedCoins}}\\n      @selectedDates={{this.selectedDates}}\\n      @selectedWallet={{this.selectedWallet}}\\n      @searchedItem={{this.searchedItem}}\\n      @onUserPageChanged={{fn (mut this.userPage)}}\\n      @onPageSizeChanged={{fn (mut this.pageSize)}}\\n      @onSelectedCategoryChanged={{fn (mut this.selectedCategory)}}\\n      @onSelectedCoinsChanged={{fn (mut this.selectedCoins)}}\\n      @onSelectedDatesChanged={{fn (mut this.selectedDates)}}\\n      @onSelectedWalletChanged={{fn (mut this.selectedWallet)}}\\n      @onCatSortOrderChanged={{fn (mut this.catSortOrder)}}\\n      @onDateSortOrderChanged={{fn (mut this.dateSortOrder)}}\\n      @onPfSortOrderChanged={{fn (mut this.pfSortOrder)}}\\n      @onSearchedItemChanged={{fn (mut this.searchedItem)}}\\n    />\\n  {{/if}}\\n</section>', { moduleName: 'cryptofiscafacile-gui/pods/transactions/template.hbs' });\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nimport type ApplicationService from 'cryptofiscafacile-gui/services/application';\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\n\nexport default class WalletsRoute extends Route {\n  @service declare application: ApplicationService;\n  @service declare wasm: WasmService;\n\n  model() {\n    this.wasm.getHistoryTask.perform();\n    this.wasm.getWalletsTask.perform();\n  }\n\n  activate() {\n    this.application.helpTarget = '#intro-wallet';\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<App::Header @title=\\\"Portefeuilles\\\" @description=\\\"Liste de tous vos portefeuilles importés\\\" />\\n<section class=\\\"container-fluid\\\">\\n  <UserWallets />\\n</section>', { moduleName: 'cryptofiscafacile-gui/pods/wallets/template.hbs' });\n","import EmberRouter from '@ember/routing/router';\n\nimport config from 'cryptofiscafacile-gui/config/environment';\n\nexport default class Router extends EmberRouter {\n  location = config.locationType;\n  rootURL = config.rootURL;\n}\n\nRouter.map(function () {\n  this.route('document', { path: 'documentation' });\n  this.route('wallets');\n  this.route('not-found', { path: '/*/' });\n  this.route('transactions');\n  this.route('tools');\n  this.route('reports');\n  this.route('definitions');\n});\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nimport type ApplicationService from 'cryptofiscafacile-gui/services/application';\nimport type WasmService from 'cryptofiscafacile-gui/services/wasm';\nimport type IntlService from 'ember-intl/services/intl';\nexport default class ApplicationRoute extends Route {\n  @service declare application: ApplicationService;\n  @service declare intl: IntlService;\n  @service declare wasm: WasmService;\n\n  async beforeModel() {\n    this.intl.setLocale(['fr']);\n\n    await this.application.detectFeaturesTask.perform();\n    this.application.performStartupChecks();\n    this.wasm.updateDefinitonsTask.perform();\n  }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport Service, { inject as service } from '@ember/service';\nimport { waitFor } from '@ember/test-waiters';\n\nimport config from 'cryptofiscafacile-gui/config/environment';\nimport { dropTask } from 'ember-concurrency';\n\nimport type WasmService from './wasm';\nimport type { Owner } from '@ember/test-helpers/build-owner';\n\nexport default class ApplicationService extends Service {\n  @service declare wasm: WasmService;\n\n  browserDetected = '';\n\n  @tracked hasIndexedDb = false;\n\n  @tracked helpTarget = '#intro-synth';\n\n  @tracked newUser = false;\n  @tracked newVersion = false;\n  @tracked firstTourDone = false;\n\n  @tracked persistedVersion?: string;\n\n  constructor(owner: Owner) {\n    super(owner);\n    this.testBrowser();\n  }\n\n  get version() {\n    return config.APP.version.split('+')[0] ?? '';\n  }\n\n  checkHasIndexedDb(): Promise<boolean> {\n    return new Promise((resolve /* , reject */) => {\n      const hasIDb = 'indexedDB' in window;\n\n      if (!hasIDb) resolve(false);\n\n      let request = window.indexedDB.open('MyTestDatabase');\n\n      request.onerror = function () {\n        resolve(false);\n      };\n\n      request.onsuccess = function () {\n        resolve(true);\n      };\n\n      let requestClose = window.indexedDB.deleteDatabase('MyTestDatabase');\n\n      requestClose.onerror = function () {\n        debug('Error on MyTestDatabase removal (Test for idb)');\n      };\n\n      requestClose.onsuccess = function () {\n        debug('MyTestDatabase removed (Test for idb)');\n      };\n    });\n  }\n\n  detectFeaturesTask = dropTask(async () => {\n    this.hasIndexedDb = await this.checkHasIndexedDb();\n  });\n\n  private testBrowser() {\n    // Opera 8.0+\n    //Example: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36 OPR/82.0.4227.33\n    // TODO Improve detection of Opera\n    let isOpera = navigator.userAgent.indexOf(' OPR/') >= 0;\n\n    // Firefox 1.0+\n    //Example: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0\n    let isFirefox = navigator.userAgent.indexOf(' Firefox/') != -1;\n\n    // Internet Explorer 6-11\n    //TODO find a solution to detect IE\n\n    // Edge 20+\n    //Example: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36 Edg/96.0.1054.53\n    let isEdge = navigator.userAgent.indexOf(' Edg/') != -1;\n\n    // Chrome 1 - 79\n    //Example: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36\n    // let isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);\n\n    // Blink engine detection\n    let isBlink = isOpera && !!window.CSS;\n\n    // Safari 3.0+ \"[object HTMLElementConstructor]\"\n    // TODO: Add detection for Safari\n\n    if (isOpera) {\n      this.browserDetected = 'Opera';\n    } else if (isFirefox) {\n      this.browserDetected = 'Firefox';\n    } else if (isEdge) {\n      this.browserDetected = 'Edge';\n    } else if (isBlink) {\n      this.browserDetected = 'Blink';\n    } else {\n      this.browserDetected = 'Chrome';\n    }\n  }\n\n  @waitFor\n  async performStartupChecks() {\n    const appVersionEntry = await this.wasm.getApplicationEntryTask.perform('application.version');\n\n    if (appVersionEntry?.value) {\n      this.persistedVersion = appVersionEntry?.value;\n    }\n\n    await this.wasm.getHistoryTask.perform();\n\n    if (!this.persistedVersion && this.wasm.history?.length === 0) {\n      this.newUser = true;\n    } else if (!this.persistedVersion || this.persistedVersion !== this.version) {\n      this.newVersion = true;\n    }\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your services.\ndeclare module '@ember/service' {\n  interface Registry {\n    'application-service': ApplicationService;\n  }\n}\n","import Service from '@ember/service';\n\nimport { task } from 'ember-concurrency';\n\nexport class ResponseBody<T> {\n  constructor(\n    readonly response: Response,\n    readonly body: T,\n  ) {}\n}\n\nexport default class FetchService extends Service {\n  abortableFetchArrayBufferTask = task(async (url: string) => {\n    const controller = new AbortController();\n    const signal = controller.signal;\n\n    try {\n      let response;\n\n      response = await fetch(url, { signal });\n\n      return new ResponseBody(response, await response.arrayBuffer());\n    } finally {\n      if (signal) {\n        controller.abort();\n      }\n    }\n  });\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your services.\ndeclare module '@ember/service' {\n  interface Registry {\n    'fetch-service': FetchService;\n  }\n}\n","import { tracked } from '@glimmer/tracking';\nimport { debug } from '@ember/debug';\nimport Service, { inject as service } from '@ember/service';\n\nimport { DbName } from 'cryptofiscafacile-wasm';\nimport { Dexie } from 'dexie';\nimport { exportDB, importDB } from 'dexie-export-import';\nimport { task } from 'ember-concurrency';\n\nimport type WasmService from './wasm';\n\nexport default class IndexeddbService extends Service {\n  @service declare wasm: WasmService;\n\n  @tracked files: File[] = [];\n  dbs = [DbName.CFF, DbName.CONFS, DbName.FILES, DbName.TRANSACTIONS, DbName.RATES];\n\n  exportDatabaseTask = task(async (databaseName: string) => {\n    const db = await new Dexie(databaseName).open();\n\n    let options = { prettyJson: true };\n\n    try {\n      const blob = await exportDB(db, options);\n      let file = new File([blob], databaseName);\n\n      this.files.push(file);\n    } catch (err) {\n      debug('export-database() task failed : ' + (err as Error).message);\n    }\n  });\n\n  async importDatabase(file: Blob): Promise<IDBDatabase> {\n    let db;\n\n    db = await importDB(file);\n\n    return db.backendDB();\n  }\n\n  async cleanDatabases() {\n    await this.wasm.cleanDbsTask.perform(this.dbs);\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your services.\ndeclare module '@ember/service' {\n  interface Registry {\n    'indexeddb-service': IndexeddbService;\n  }\n}\n","import Ember from 'ember';\nimport { debug } from '@ember/debug';\nimport Service, { inject as service } from '@ember/service';\n\nimport config from 'cryptofiscafacile-gui/config/environment';\nimport { EngineStatus } from 'cryptofiscafacile-gui/enums/engine-status';\nimport { loadCff2WasmProxy } from 'cryptofiscafacile-wasm';\nimport { all, dropTask, enqueueTask, restartableTask, task, timeout } from 'ember-concurrency';\nimport { tracked } from 'tracked-built-ins';\n\nimport type ApplicationService from './application';\nimport type FetchService from './fetch';\nimport type ManifestEntry from 'cryptofiscafacile-gui/objects/manifest-entry';\nimport type {\n  ApiData,\n  ApplicationEntry,\n  Cerfa3916Account,\n  Cff2Wasm,\n  CoinDetailData,\n  ConsistencyErrors,\n  DbName,\n  Definition,\n  FileUsageStatus,\n  ReportsData,\n  SynthBalance,\n  SynthCoin,\n  SynthEvolution,\n  SynthStatsGainsLosses,\n  SynthStatTotalValue,\n  SynthTxTypes,\n  ToolsData,\n  Transaction,\n  TxCategory,\n  UserData,\n  Wallet,\n  WalletDefinition,\n} from 'cryptofiscafacile-wasm';\nimport type { TaskInstance } from 'ember-concurrency';\nimport type IntlService from 'ember-intl/services/intl';\n\nexport default class WasmService extends Service {\n  private static readonly PREFIX = '/definitions/';\n\n  @service declare application: ApplicationService;\n  @service declare intl: IntlService;\n  @service declare fetch: FetchService;\n\n  reg = /(\\r\\n|\\n|\\r)/gm;\n\n  errorMessageReg = new RegExp('^[a-zA-Z]+\\\\.{1}[a-zA-Z\\\\.]+$');\n\n  @tracked verboseActivated = false;\n\n  @tracked transactions: Transaction[] = [];\n  @tracked userInfos?: UserData;\n\n  @tracked consistencyCategVsToFrom?: ConsistencyErrors;\n  @tracked consistencyNegativeBalance?: ConsistencyErrors;\n  @tracked consistencyAlmost?: ConsistencyErrors;\n\n  @tracked history: FileUsageStatus[] = [];\n\n  @tracked reports?: ReportsData;\n\n  @tracked stocksXLSX?: Uint8Array;\n  @tracked cerfa3916?: Uint8Array;\n  @tracked errorMessage3916 = '';\n\n  @tracked fileContent?: Uint8Array;\n\n  @tracked tools?: ToolsData;\n\n  toolsErrors: WeakMap<ApiData, string> = tracked(new WeakMap());\n  toolsProgress: WeakMap<ApiData, number> = tracked(new WeakMap());\n  toolsTasks: WeakMap<ApiData, TaskInstance<void>[]> = tracked(new WeakMap());\n\n  coinsDetail: Map<string, CoinDetailData> = tracked(new Map());\n\n  @tracked alreadyDefinitions?: Definition[];\n\n  @tracked digestFilesTaskFilesAmount = 0;\n\n  @tracked digestFilesTaskUseFileTasks: TaskInstance<void>[] = [];\n\n  #cff2Wasm?: Cff2Wasm;\n  @tracked status = EngineStatus.HALTED;\n  loadCff2WasmTask = enqueueTask(async () => {\n    if (!this.#cff2Wasm && this.application.hasIndexedDb) {\n      this.status = EngineStatus.LOADING;\n      this.#cff2Wasm = await loadCff2WasmProxy('/cff2.wasm', () => (this.status = EngineStatus.HALTED), !Ember.testing);\n      this.status = EngineStatus.RUNNING;\n    }\n  });\n\n  // synth dates\n  defaultEndDate: Date = ((d) => new Date(d.setDate(d.getDate() - 1)))(new Date());\n  defaultStartDate: Date = ((d) => new Date(d.setDate(d.getDate() - 366)))(new Date());\n\n  @tracked synthBalances: SynthBalance[] = [];\n  getSynthBalancesTask = restartableTask(async (date: Date, wallet?: Wallet) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.synthBalances = await this.#cff2Wasm.getSynthBalances(date, wallet?.name);\n    }\n  });\n\n  @tracked synthEvolution: SynthEvolution[] = [];\n  getSynthEvolutionTask = restartableTask(async (start: Date, end: Date, wallet?: Wallet) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.synthEvolution = await this.#cff2Wasm.getSynthEvolution(start, end, wallet?.name);\n    }\n  });\n\n  @tracked synthPorfolio: SynthCoin[] = [];\n  getSynthPortfolioTask = restartableTask(async (date: Date, wallet?: Wallet) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.synthPorfolio = await this.#cff2Wasm.getSynthPortfolio(date, wallet?.name);\n    }\n  });\n\n  @tracked synthStatTotalValue?: SynthStatTotalValue;\n  getSynthStatTotalValueTask = restartableTask(async (date: Date, wallet?: Wallet) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.synthStatTotalValue = await this.#cff2Wasm.getSynthStatTotalValue(date, wallet?.name);\n    }\n  });\n\n  @tracked synthStatsGainsLosses?: SynthStatsGainsLosses;\n  @tracked synthStatsGainsError?: Error;\n  getSynthStatsGainsLossesTask = restartableTask(async (date: Date) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      try {\n        this.synthStatsGainsLosses = await this.#cff2Wasm.getSynthStatsGainsLosses(date);\n        this.synthStatsGainsError = undefined;\n      } catch (error) {\n        this.synthStatsGainsLosses = undefined;\n        this.synthStatsGainsError = error as Error;\n      }\n    }\n  });\n\n  @tracked synthTxTypes?: SynthTxTypes;\n  getSynthTxTypesTask = restartableTask(async (start: Date, end: Date, wallet?: Wallet) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.synthTxTypes = await this.#cff2Wasm.getSynthTxTypes(start, end, wallet?.name);\n    }\n  });\n\n  getUserInfosTask = task(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.userInfos = await this.#cff2Wasm.getUserInfos();\n\n      if (!this.userInfos?.proxy) {\n        await this.saveConfigTask.perform(config.APP.proxyUrl);\n      }\n    }\n  });\n\n  async updateDefinitionCsvDef(csv: string) {\n    await this.#updateDefinitionDef(`CSV_Def_${csv}.json`);\n  }\n\n  async updateDefinitionWalletDef(csv: string) {\n    await this.#updateDefinitionDef(`Wallet_Def_${csv}.json`);\n  }\n\n  async #updateDefinitionDef(filename: string) {\n    const manifest = await this.#fetchManifest();\n\n    const entry = manifest.find((e) => e.name === filename);\n\n    if (entry) {\n      const jsonDef = await fetch(WasmService.PREFIX + entry.name);\n      const arrayBuffer = await jsonDef.arrayBuffer();\n\n      if (arrayBuffer) {\n        await this.updateDefinitionTask.perform(entry, arrayBuffer);\n      }\n    }\n  }\n\n  updateDefinitonsTask = task(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      await this.#updateDefinitions();\n    }\n  });\n\n  async #updateDefinitions() {\n    //1. Fetch manifest.json and check if OFFLINE or ONLINE\n    const manifest = await this.#fetchManifest();\n\n    //2. Get already installed definitions\n    this.alreadyDefinitions = await this.#cff2Wasm?.getDefinitions();\n\n    //3. For each file, if alreadyDefinitions version < manifest version, perfor a fetch of each remote csv-def\n    const newEntry = manifest.filter(\n      (entry) => (this.alreadyDefinitions?.find((def) => def.name === entry.name)?.version ?? 0) < entry.version,\n    );\n\n    const defsTasks = newEntry.map((entry) =>\n      this.fetch.abortableFetchArrayBufferTask.perform(WasmService.PREFIX + entry.name),\n    );\n\n    const definitions = await all(defsTasks);\n\n    for (const manifestEntry of newEntry) {\n      const link = WasmService.PREFIX + manifestEntry.name;\n\n      //4. Then transform it to Uint8Array via arrayBuffer!\n      const arrayBuffer = definitions.find((respBody) => respBody.response.url.endsWith(link))?.body;\n\n      //5. Perform a useFile to update local BDD IDB, following by a setDefinition()\n      if (arrayBuffer) {\n        await this.updateDefinitionTask.perform(manifestEntry, arrayBuffer);\n      }\n    }\n  }\n\n  private updateDefinitionTask = enqueueTask(async (entry: ManifestEntry, arrayBuffer: ArrayBuffer) => {\n    await this.loadCff2WasmTask.perform();\n\n    //5. Perform a useFile to update local BDD IDB, following by a setDefinition()\n    try {\n      if (this.#cff2Wasm) {\n        await this.#cff2Wasm.useFile(entry.name, new Uint8Array(arrayBuffer));\n        await this.#cff2Wasm.setDefinition(entry.name, entry.version);\n      }\n    } catch (error) {\n      debug('Error in useFile for updateDefinitons: ' + (error as Error).message);\n    }\n  });\n\n  async #fetchManifest() {\n    try {\n      let response = await fetch(WasmService.PREFIX + 'manifest.json');\n\n      return (await response.json()) as ManifestEntry[];\n    } catch (error) {\n      debug('Error in fetch(): User is OFFLINE - ' + (error as Error).message);\n    }\n\n    return [];\n  }\n\n  getDefinitonsTask = task(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      return await this.#cff2Wasm.getDefinitions();\n    } else {\n      return [];\n    }\n  });\n\n  setDebugTask = task(async (activate: boolean) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.verboseActivated = await this.#cff2Wasm.setDebug(activate);\n    }\n  });\n\n  setFetchRates = task(async (fetchRates: boolean) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      await this.#cff2Wasm.setFetchRates(fetchRates);\n    }\n  });\n\n  setupFrontendTestTask = task(async (fetchRates: boolean) => {\n    if (!Ember.testing) {\n      throw new Error('this task is only callable in tests');\n    }\n\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      await this.#cff2Wasm.setupFrontendTest(fetchRates);\n    }\n  });\n\n  cleanDbsTask = task(async (names: DbName[]) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      await this.#cff2Wasm.cleanDbs(names);\n    }\n  });\n\n  getTransactionsTask = task(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.transactions = await this.#cff2Wasm.getTransactions();\n    }\n  });\n\n  @tracked consistencyCategVsToFromError = false;\n  @tracked consistencyCategVsToFromErrorMessage = '';\n\n  checkConsistencyCategVsToFromTask = task(async () => {\n    await this.checkConsistencyCategVsToFrom();\n  });\n\n  async checkConsistencyCategVsToFrom() {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      try {\n        this.consistencyCategVsToFromError = false;\n        this.consistencyCategVsToFrom = await this.#cff2Wasm.checkConsistencyCategVsToFrom();\n      } catch (error) {\n        this.consistencyCategVsToFromErrorMessage = (error as Error).message;\n        this.consistencyCategVsToFromError = true;\n        debug('Error in consistency Categ vs To/From: ' + (error as Error).message);\n      }\n    }\n  }\n\n  @tracked consistencyNegativeBalanceError = false;\n  @tracked consistencyNegativeBalanceErrorMessage = '';\n  checkConsistencyNegativeBalanceTask = task(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      try {\n        this.consistencyNegativeBalanceError = false;\n        this.consistencyNegativeBalance = await this.#cff2Wasm.checkConsistencyNegativeBalance();\n      } catch (error) {\n        this.consistencyNegativeBalanceErrorMessage = (error as Error).message;\n        this.consistencyNegativeBalanceError = true;\n        debug('Error in consistency Negative Balance: ' + (error as Error).message);\n      }\n    }\n  });\n\n  @tracked consistencyAlmostError = false;\n  @tracked consistencyAlmostMessage = '';\n\n  checkConsistencyAlmostTransferTask = task(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      try {\n        this.consistencyAlmostError = false;\n        this.consistencyAlmost = await this.#cff2Wasm.checkConsistencyAlmostTransfer();\n      } catch (error) {\n        this.consistencyAlmostMessage = (error as Error).message;\n        this.consistencyAlmostError = true;\n        debug('Error in consistency Almost transfer: ' + (error as Error).message);\n      }\n    }\n  });\n\n  getHistoryTask = dropTask(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.history = (await this.#cff2Wasm.getHistory(false)).reverse();\n    }\n  });\n\n  @tracked walletDefs?: WalletDefinition[];\n\n  getWalletDefinitionsTask = task(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.walletDefs = await this.#cff2Wasm.getWalletDefinitions();\n    }\n  });\n\n  addEmptyWalletTask = task(async (wallet: string) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      await this.#cff2Wasm.addEmptyWallet(wallet);\n    }\n  });\n\n  @tracked wallets: Wallet[] = [];\n  getWalletsTask = task(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.wallets = await this.#cff2Wasm.getWallets();\n    }\n  });\n\n  getReportsTask = task(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.reports = await this.#cff2Wasm.getReports();\n    }\n  });\n\n  setCategoryTask = task(async (id: string, newCateg: TxCategory) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      await this.#cff2Wasm.setCategory(id, newCateg);\n    }\n  });\n\n  revertCategoryTask = task(async (id: string) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      await this.#cff2Wasm.revertCateg(id);\n    }\n  });\n\n  mergeTransactionsTask = task(async (srcID: string, dstID: string) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      try {\n        await this.#cff2Wasm.mergeTransactions(srcID, dstID);\n      } catch (error) {\n        debug('Error in merge transactions : ' + (error as Error).message);\n      }\n    }\n  });\n\n  unMergeTransactionsTask = task(async (srcID: string) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      await this.#cff2Wasm.unMergeTransactions(srcID);\n    }\n  });\n\n  setValueTask = task(async (srcID: string, value: number[]) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      await this.#cff2Wasm.setValue(srcID, value);\n    }\n  });\n\n  saveUserTask = task(\n    async (name: string | undefined, surname: string | undefined, email: string | undefined): Promise<void> => {\n      await this.loadCff2WasmTask.perform();\n\n      if (this.#cff2Wasm) {\n        await this.#cff2Wasm.saveUser(name, surname, email);\n      }\n    },\n  );\n\n  saveAccountsTask = task(async (wallet: string, accounts: Cerfa3916Account[]): Promise<void> => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      await this.#cff2Wasm.saveAccounts(wallet, accounts);\n    }\n  });\n\n  saveChoiceBNCTask = task(async (year: number, cashin: boolean): Promise<void> => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      await this.#cff2Wasm.saveChoiceCashIn(year, cashin);\n    }\n  });\n\n  getStocksXlsxTask = task(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.stocksXLSX = await this.#cff2Wasm.getStocksXLSX();\n    }\n  });\n\n  get3916XlsxTask = task(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.cerfa3916 = undefined;\n      this.errorMessage3916 = '';\n\n      try {\n        this.cerfa3916 = await this.#cff2Wasm.get3916XLSX();\n      } catch (error) {\n        this.errorMessage3916 = (error as Error).message;\n        debug('CERFA 3916 unable to generate: ' + (error as Error).message);\n      }\n    }\n  });\n\n  get2086ResultsTask = task(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      try {\n        return await this.#cff2Wasm.get2086Results();\n      } catch (error) {\n        this.errorMessage2086 = (error as Error).message;\n        debug('CERFA 2086 unable to generate: ' + (error as Error).message);\n      }\n    }\n\n    return undefined;\n  });\n\n  @tracked cerfa2086?: Uint8Array;\n  @tracked errorMessage2086 = '';\n  get2086XlsxTask = task(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.cerfa2086 = undefined;\n      this.errorMessage2086 = '';\n\n      try {\n        this.cerfa2086 = await this.#cff2Wasm.get2086Xlsx();\n      } catch (error) {\n        this.errorMessage2086 = (error as Error).message;\n        debug('CERFA 2086 unable to generate: ' + (error as Error).message);\n      }\n    }\n  });\n\n  @tracked cerfa2086UpToToday?: Uint8Array;\n  @tracked errorMessage2086UpToToday = '';\n  get2086XlsxUpToTodayTask = task(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.cerfa2086UpToToday = undefined;\n      this.errorMessage2086UpToToday = '';\n\n      try {\n        this.cerfa2086UpToToday = await this.#cff2Wasm.get2086XlsxUpToToday();\n      } catch (error) {\n        this.errorMessage2086UpToToday = (error as Error).message;\n        debug('CERFA 2086 up to today unable to generate: ' + (error as Error).message);\n      }\n    }\n  });\n\n  getApi(provider: ApiData, arg1: string, arg2: string, arg3: string, remember: boolean) {\n    const taskInstance = this.getAPITask.perform(provider, arg1, arg2, arg3, remember);\n\n    const tasks = this.toolsTasks.get(provider) ?? [];\n\n    tasks.push(taskInstance);\n    this.toolsTasks.set(provider, tasks);\n\n    taskInstance.finally(() => {\n      this.toolsTasks.set(provider, this.toolsTasks.get(provider)?.filter((t) => t !== taskInstance) ?? []);\n    });\n  }\n\n  private getAPITask = task(async (provider: ApiData, arg1: string, arg2: string, arg3: string, remember: boolean) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      this.toolsErrors.delete(provider);\n      this.getApiProgressTask.perform(provider);\n\n      try {\n        await this.#cff2Wasm.getApi(provider.name, arg1, arg2, arg3, remember);\n      } catch (error) {\n        debug('Error in getApi:' + (error as Error).message);\n        this.toolsErrors.set(provider, (error as Error).message);\n      }\n    }\n  });\n\n  getApiProgressTask = task(async (provider: ApiData) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      let progress = 0;\n\n      do {\n        progress = await this.#cff2Wasm.getApiProgress(provider.name);\n\n        this.toolsProgress.set(provider, progress);\n\n        if (Ember.testing) {\n          break;\n        }\n\n        timeout(1000);\n      } while (progress < 100);\n    }\n  });\n\n  reloadIDBTask = task(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      await this.#cff2Wasm.reloadIDB();\n    }\n  });\n\n  getToolsTask = task(async () => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm && !this.tools) {\n      this.tools = await this.#cff2Wasm.getTools();\n    }\n  });\n\n  // for now useFileTask is enqueued because wasm useFile does not permit concurrency yet\n  useFileTask = enqueueTask(async (file: File) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      const arrayBuffer = await file.arrayBuffer();\n\n      try {\n        this.history = await this.#cff2Wasm.useFile(file.name, new Uint8Array(arrayBuffer));\n      } catch (error) {\n        debug('Error in useFile: Empty file or ' + (error as Error).message);\n      }\n    }\n  });\n\n  digestFilesTask = dropTask(async (files: File[]) => {\n    this.digestFilesTaskFilesAmount = files.length;\n\n    const tasks = files.map((f) => this.useFileTask.perform(f));\n\n    this.digestFilesTaskUseFileTasks = tasks;\n    tasks.forEach((t) => t.then(() => (this.digestFilesTaskUseFileTasks = tasks)));\n    await Promise.all(this.digestFilesTaskUseFileTasks);\n    await this.getWalletsTask.perform();\n  });\n\n  deleteFileTask = task(async (filename: string) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      try {\n        this.history = await this.#cff2Wasm.deleteFile(filename);\n      } catch (error) {\n        debug('Error in useFile: Empty file or ' + (error as Error).message);\n      }\n\n      await this.getWalletsTask.perform();\n    }\n  });\n\n  downloadFileTask = task(async (filename: string) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      try {\n        this.fileContent = await this.#cff2Wasm.downloadFile(filename);\n      } catch (error) {\n        debug('Error in downloadFile: ' + (error as Error).message);\n      }\n    }\n  });\n\n  saveConfigTask = task(async (proxyUrl: string) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      if (this.userInfos) {\n        const userInfos = this.userInfos;\n\n        userInfos.proxy = proxyUrl;\n        this.userInfos = userInfos;\n      }\n\n      await this.#cff2Wasm.saveConfig(proxyUrl);\n    }\n  });\n\n  getCoinDetailTask = task(async (symbol: string) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      const detail = await this.#cff2Wasm.getCoinDetail(symbol);\n\n      this.coinsDetail.set(symbol, detail);\n    }\n\n    return undefined;\n  });\n\n  // Application entries\n  createApplicationEntryTask = task(async (entry: ApplicationEntry) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      await this.#cff2Wasm.createApplicationEntry(entry);\n    }\n  });\n\n  getApplicationEntryTask = task(async (key: string) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      return await this.#cff2Wasm.getApplicationEntry(key);\n    }\n\n    return undefined;\n  });\n\n  updateApplicationEntryTask = task(async (entry: ApplicationEntry) => {\n    await this.loadCff2WasmTask.perform();\n\n    if (this.#cff2Wasm) {\n      await this.#cff2Wasm.updateApplicationEntry(entry);\n    }\n  });\n\n  translateError(error: string) {\n    const errorIntl = error.split('|');\n\n    if (errorIntl.length > 1 || (errorIntl[0] !== undefined && this.errorMessageReg.test(errorIntl[0]))) {\n      const options: Record<string, string> = {};\n\n      errorIntl\n        .map((opt) => opt.split('='))\n        .filter((opt) => opt.length === 2)\n        .forEach((opt) => {\n          if (opt[0] && opt[1]) {\n            options[opt[0]] = opt[1];\n          }\n        });\n\n      return this.intl.t(errorIntl[0] ? 'wasm.error.' + errorIntl[0] : '', options);\n    }\n\n    return error;\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your services.\ndeclare module '@ember/service' {\n  interface Registry {\n    'wasm-service': WasmService;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title \\\"CryptoFiscaFacile\\\"}}\\n<div id=\\\"ember-bootstrap-wormhole\\\"></div>\\n<div class=\\\"container-fluid overflow-hidden\\\" id=\\\"intro-synth\\\">\\n  <div class=\\\"row vh100 overflow-auto flex-sm-nowrap\\\">\\n    <div class=\\\"col-12 col-sm-3 col-xl-2 col-md-2 col-lg-2 px-sm-2 px-0 bg-white d-flex sticky-top max-width\\\">\\n      <App::MainSidebar />\\n    </div>\\n    <div class=\\\"visually-hidden\\\">\\n    </div>\\n    <div class=\\\"col d-flex flex-column h-sm-100\\\">\\n      <main class=\\\"row overflow-auto mainframe h-100\\\">\\n        <div class=\\\"col px-1 h-100\\\">\\n          {{outlet}}\\n        </div>\\n      </main>\\n    </div>\\n    <Help @target={{this.application.helpTarget}} />\\n  </div>\\n</div>\\n<App::NewVersionModal @open={{this.newVersionModalVisible}} @onHidden={{this.onNewVersionModalHidden}} />', { moduleName: 'cryptofiscafacile-gui/templates/application.hbs' });\n","import { SortOrder } from 'cryptofiscafacile-gui/enums/sort-order';\n\nexport default class Sorts {\n  private constructor() {\n    // Utility class\n  }\n\n  public static date<T>(propertySupplier: (object: T) => Date, order: SortOrder) {\n    return (a: T, b: T) => {\n      const timeA = propertySupplier(a)?.getTime();\n      const timeB = propertySupplier(b)?.getTime();\n\n      switch (order) {\n        case SortOrder.ASC:\n          return timeA - timeB;\n        case SortOrder.DESC:\n          return timeB - timeA;\n        case SortOrder.NONE:\n          return 0;\n      }\n    };\n  }\n\n  public static text<T>(propertySupplier: (object: T) => string, order: SortOrder) {\n    return (a: T, b: T) => {\n      const propA = propertySupplier(a) ?? '';\n      const propB = propertySupplier(b) ?? '';\n\n      switch (order) {\n        case SortOrder.ASC:\n          return propA.localeCompare(propB);\n        case SortOrder.DESC:\n          return propB.localeCompare(propA);\n        case SortOrder.NONE:\n          return 0;\n      }\n    };\n  }\n}\n","import { TxCategory } from 'cryptofiscafacile-wasm';\n\nimport type { Transaction } from 'cryptofiscafacile-wasm';\n\nexport default class Transactions {\n  private constructor() {\n    // Utility class\n  }\n\n  static isUserCategorizable(tx: Transaction) {\n    return (\n      tx.category === TxCategory.DEPOSITS ||\n      tx.category === TxCategory.WITHDRAWALS ||\n      tx.original_category === TxCategory.DEPOSITS ||\n      tx.original_category === TxCategory.WITHDRAWALS\n    );\n  }\n}\n","define('cryptofiscafacile-gui/config/environment', [], function() {\n  var prefix = 'cryptofiscafacile-gui';\ntry {\n  var metaName = prefix + '/config/environment';\n  var rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n  var config = JSON.parse(decodeURIComponent(rawConfig));\n\n  var exports = { 'default': config };\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n  return exports;\n}\ncatch(err) {\n  throw new Error('Could not read config from meta tag with name \"' + metaName + '\".');\n}\n\n});\n","\n          if (!runningTests) {\n            require(\"cryptofiscafacile-gui/app\")[\"default\"].create({\"proxyUrl\":\"https://pc.fiscafacile.com\",\"name\":\"cryptofiscafacile-gui\",\"version\":\"2.5.1+8857c7f3\"});\n          }\n        \n"],"mappings":"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A,SACA,UACA,SACA,UACA,UACA,WACA,eACA,UACA,SACA,kBACA,QACA,WACA,UACA,aACA,UACA,UACA,eACA,SACA,UACA,UACA,UACA,OACA,YACA,iBACA,gBACA,MACA,cACA,eACA,YACA,SACA,QACA,eACA,cACA,OACA,OACA,QACA,SACA,QACA,cACA,SACA,MACA,SACA,SACA,gBACA,SACA,QACA,oBACA,WACA,UACA,YACA,YACA,aACA,UACA,WACA,UACA,SACA,aACA,YACA,WACA,SACA,UACA,eACA,WACA,YACA,UACA,WACA,YACA,YACA,SACA,QACA,SACA,WACA,WACA,OACA,UACA,SACA,iBACA,aACA,UACA,YACA,iBACA,sBACA,aACA,eACA,YACA,eACA,QACA,SACA,WACA,iBACA,UACA,YACA,YACA,qBACA,cACA,WACA,QACA,OACA,SACA,SACA,SACA,OACA,YACA,OACA,SACA,UACA,MACA,eACA,SACA,SACA,WACA,SACA,UACA,WACA,UACA,eACA,MACA,SACA,UACA,UACA,OACA,SACA,UACA,4BACA,WACA,aACA,QACA,UACA,WACA,cACA,SACA,MACA,SACA,eACA,iBACA,eACA,cACA,cACA,OACA,UACA,SACA,QACA,QACA,SACA,YACA,SACA,SACA,SACA,SACA,QACA,OACA,SACA,WACA,wBACA,kBACA,sBACA,SACA,UACA,QACA,eACA,SACA,aACA,aACA,OACA,OACA,iBACA,mBACA,eACA,kBACA,WACA,OACA,gBACA,sBACA,WACA,UACA,OACA,WACA,UACA,UACA,UACA,SACA,OACA,SACA,SACA,SACA,WACA,SACA,UACA,UACA,UACA,SACA,SACA,WACA,QACA,WACA,SACA,gBACA,SACA,iBACA,WACA,QACA,YACA,QACA,YACA,aACA,YACA,WACA,qBACA,eACA,YACA,OACA,YACA,kBACA,qBACA,mBACA,UACA,QACA,QACA,WACA,mBACA,WACA,aACA,QACA,SACA,YACA,WACA,QACA,UACA,UACA,QACA,OACA,SACA,eACA,QACA,Q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","ignoreList":[]}